@muxima-ui/core 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -4
- package/fesm2022/muxima-ui-core-chips.mjs +349 -0
- package/fesm2022/muxima-ui-core-chips.mjs.map +1 -0
- package/fesm2022/muxima-ui-core-clipboard.mjs +110 -0
- package/fesm2022/muxima-ui-core-clipboard.mjs.map +1 -0
- package/fesm2022/muxima-ui-core-date-picker.mjs +494 -12
- package/fesm2022/muxima-ui-core-date-picker.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-file-upload.mjs +392 -0
- package/fesm2022/muxima-ui-core-file-upload.mjs.map +1 -0
- package/fesm2022/muxima-ui-core-rating.mjs +212 -0
- package/fesm2022/muxima-ui-core-rating.mjs.map +1 -0
- package/fesm2022/muxima-ui-core-slider.mjs +211 -3
- package/fesm2022/muxima-ui-core-slider.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-time-picker.mjs +389 -0
- package/fesm2022/muxima-ui-core-time-picker.mjs.map +1 -0
- package/fesm2022/muxima-ui-core.mjs +1 -1
- package/fesm2022/muxima-ui-core.mjs.map +1 -1
- package/package.json +21 -1
- package/styles/base.css +9 -1
- package/styles/components/chips.css +170 -0
- package/styles/components/clipboard.css +52 -0
- package/styles/components/date-picker.css +135 -0
- package/styles/components/file-upload.css +164 -0
- package/styles/components/rating.css +89 -0
- package/styles/components/slider.css +111 -0
- package/styles/components/time-picker.css +39 -0
- package/styles/muxima.css +5 -0
- package/types/muxima-ui-core-chips.d.ts +120 -0
- package/types/muxima-ui-core-clipboard.d.ts +42 -0
- package/types/muxima-ui-core-date-picker.d.ts +130 -2
- package/types/muxima-ui-core-file-upload.d.ts +96 -0
- package/types/muxima-ui-core-rating.d.ts +64 -0
- package/types/muxima-ui-core-slider.d.ts +68 -6
- package/types/muxima-ui-core-time-picker.d.ts +83 -0
- package/types/muxima-ui-core.d.ts +1 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/* ---------- Time picker ---------- */
|
|
2
|
+
|
|
3
|
+
.mx-time-picker {
|
|
4
|
+
display: block;
|
|
5
|
+
width: 100%;
|
|
6
|
+
font-family: var(--mx-font-sans);
|
|
7
|
+
}
|
|
8
|
+
.mx-time-picker-field {
|
|
9
|
+
position: relative;
|
|
10
|
+
}
|
|
11
|
+
.mx-time-picker-input.mx-input {
|
|
12
|
+
padding-right: 36px;
|
|
13
|
+
font-variant-numeric: tabular-nums;
|
|
14
|
+
}
|
|
15
|
+
.mx-time-picker-icon {
|
|
16
|
+
position: absolute;
|
|
17
|
+
right: 11px;
|
|
18
|
+
top: 50%;
|
|
19
|
+
width: 16px;
|
|
20
|
+
height: 16px;
|
|
21
|
+
color: var(--mx-muted);
|
|
22
|
+
transform: translateY(-50%);
|
|
23
|
+
pointer-events: none;
|
|
24
|
+
}
|
|
25
|
+
.mx-time-picker-panel {
|
|
26
|
+
max-height: 240px;
|
|
27
|
+
font-variant-numeric: tabular-nums;
|
|
28
|
+
}
|
|
29
|
+
ul.mx-time-picker-panel {
|
|
30
|
+
list-style: none;
|
|
31
|
+
}
|
|
32
|
+
.mx-time-picker[data-mx-state='hover'] .mx-input:not(:disabled) {
|
|
33
|
+
border-color: var(--mx-muted);
|
|
34
|
+
}
|
|
35
|
+
.mx-time-picker[data-mx-state='focus'] .mx-input {
|
|
36
|
+
border-color: var(--mx-accent);
|
|
37
|
+
outline: var(--mx-focus-width) solid var(--mx-accent);
|
|
38
|
+
outline-offset: var(--mx-focus-offset);
|
|
39
|
+
}
|
package/styles/muxima.css
CHANGED
|
@@ -25,9 +25,12 @@
|
|
|
25
25
|
@import './components/tabs.css';
|
|
26
26
|
@import './components/table.css';
|
|
27
27
|
@import './components/badge.css';
|
|
28
|
+
@import './components/chips.css';
|
|
28
29
|
@import './components/card.css';
|
|
29
30
|
@import './components/alert.css';
|
|
30
31
|
@import './components/separator.css';
|
|
32
|
+
@import './components/rating.css';
|
|
33
|
+
@import './components/clipboard.css';
|
|
31
34
|
@import './components/avatar.css';
|
|
32
35
|
@import './components/skeleton.css';
|
|
33
36
|
@import './components/progress.css';
|
|
@@ -41,7 +44,9 @@
|
|
|
41
44
|
@import './components/pagination.css';
|
|
42
45
|
@import './components/combobox.css';
|
|
43
46
|
@import './components/date-picker.css';
|
|
47
|
+
@import './components/time-picker.css';
|
|
44
48
|
@import './components/otp.css';
|
|
49
|
+
@import './components/file-upload.css';
|
|
45
50
|
@import './components/stepper.css';
|
|
46
51
|
@import './components/command.css';
|
|
47
52
|
@import './motion.css';
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { ControlValueAccessor } from '@angular/forms';
|
|
3
|
+
import { MxFormFieldControl, MxFormField } from '@muxima-ui/core/form-field';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Etiqueta curta, opcionalmente com botão para remover.
|
|
7
|
+
*
|
|
8
|
+
* ```html
|
|
9
|
+
* <mx-chip>Luanda</mx-chip>
|
|
10
|
+
* <mx-chip removable (removed)="tirar('Luanda')">Luanda</mx-chip>
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* O botão de remover chama-se "Remover Luanda" (o texto do chip). Em listas, põe os chips num
|
|
14
|
+
* `<ul>` com `<li>`, para o leitor de ecrã dizer quantos são.
|
|
15
|
+
*/
|
|
16
|
+
declare class MxChip {
|
|
17
|
+
readonly removable: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
18
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
19
|
+
readonly variant: _angular_core.InputSignal<"default" | "outline" | "accent">;
|
|
20
|
+
readonly size: _angular_core.InputSignal<"sm" | "md">;
|
|
21
|
+
/** Verbo do botão de remover, seguido do texto do chip. */
|
|
22
|
+
readonly removeLabel: _angular_core.InputSignal<string>;
|
|
23
|
+
readonly removed: _angular_core.OutputEmitterRef<void>;
|
|
24
|
+
private readonly label;
|
|
25
|
+
protected readonly text: _angular_core.WritableSignal<string>;
|
|
26
|
+
constructor();
|
|
27
|
+
/** Põe o foco no botão de remover (usado pelo MxTagInput). */
|
|
28
|
+
focusRemove(): void;
|
|
29
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxChip, never>;
|
|
30
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MxChip, "mx-chip", ["mxChip"], { "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; }, { "removed": "removed"; }, never, ["*"], true, never>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Chip que liga e desliga, para filtros. É um `<button>` com aria-pressed.
|
|
34
|
+
*
|
|
35
|
+
* ```html
|
|
36
|
+
* <div role="group" aria-label="Estado">
|
|
37
|
+
* <button mxChipToggle [(selected)]="soPagas">Pagas</button>
|
|
38
|
+
* </div>
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
declare class MxChipToggle {
|
|
42
|
+
readonly selected: _angular_core.ModelSignal<boolean>;
|
|
43
|
+
readonly size: _angular_core.InputSignal<"sm" | "md">;
|
|
44
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxChipToggle, never>;
|
|
45
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MxChipToggle, "button[mxChipToggle]", ["mxChipToggle"], { "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; }, never, never, true, never>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Campo de etiquetas: escreve-se e Enter (ou vírgula) acrescenta; Backspace no campo vazio
|
|
49
|
+
* vai para a última etiqueta. O valor é `string[]`.
|
|
50
|
+
*
|
|
51
|
+
* ```html
|
|
52
|
+
* <mx-form-field>
|
|
53
|
+
* <label mxLabel>Destinatários</label>
|
|
54
|
+
* <mx-tag-input formControlName="emails" placeholder="Escreve e carrega Enter" />
|
|
55
|
+
* </mx-form-field>
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* Cada etiqueta acrescentada ou removida é anunciada pelo leitor de ecrã.
|
|
59
|
+
*/
|
|
60
|
+
declare class MxTagInput implements ControlValueAccessor, MxFormFieldControl {
|
|
61
|
+
readonly value: _angular_core.ModelSignal<string[]>;
|
|
62
|
+
readonly placeholder: _angular_core.InputSignal<string>;
|
|
63
|
+
/** Teclas que acrescentam a etiqueta, além de Enter. */
|
|
64
|
+
readonly separators: _angular_core.InputSignal<string[]>;
|
|
65
|
+
readonly maxTags: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
66
|
+
readonly allowDuplicates: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
67
|
+
/** Valida cada etiqueta antes de a acrescentar (ex.: email). Devolve a mensagem de erro ou null. */
|
|
68
|
+
readonly validate: _angular_core.InputSignal<(tag: string) => string | null>;
|
|
69
|
+
/** Nome da lista para o leitor de ecrã. */
|
|
70
|
+
readonly listLabel: _angular_core.InputSignal<string>;
|
|
71
|
+
readonly helpText: _angular_core.InputSignal<string>;
|
|
72
|
+
readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
|
|
73
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
74
|
+
readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
75
|
+
readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
76
|
+
readonly id: _angular_core.InputSignal<string | undefined>;
|
|
77
|
+
readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
|
|
78
|
+
/** Emite a etiqueta rejeitada por `validate`, duplicada ou acima do máximo. */
|
|
79
|
+
readonly rejected: _angular_core.OutputEmitterRef<{
|
|
80
|
+
tag: string;
|
|
81
|
+
reason: string;
|
|
82
|
+
}>;
|
|
83
|
+
protected readonly field: MxFormField | null;
|
|
84
|
+
private readonly ngControl;
|
|
85
|
+
private readonly announcer;
|
|
86
|
+
private readonly host;
|
|
87
|
+
private readonly input;
|
|
88
|
+
private readonly injector;
|
|
89
|
+
private readonly generatedId;
|
|
90
|
+
readonly controlId: _angular_core.Signal<string>;
|
|
91
|
+
protected readonly helpId: string;
|
|
92
|
+
protected readonly draft: _angular_core.WritableSignal<string>;
|
|
93
|
+
protected readonly tags: _angular_core.Signal<string[]>;
|
|
94
|
+
private readonly formDisabled;
|
|
95
|
+
protected readonly isDisabled: _angular_core.Signal<boolean>;
|
|
96
|
+
protected readonly describedBy: _angular_core.Signal<string>;
|
|
97
|
+
private onChange;
|
|
98
|
+
private onTouched;
|
|
99
|
+
constructor();
|
|
100
|
+
/** Acrescenta uma etiqueta. Devolve false se foi rejeitada. */
|
|
101
|
+
add(raw: string): boolean;
|
|
102
|
+
remove(index: number): void;
|
|
103
|
+
private update;
|
|
104
|
+
protected onKeydown(event: KeyboardEvent): void;
|
|
105
|
+
private clearDraft;
|
|
106
|
+
protected onChipKey(event: KeyboardEvent, index: number): void;
|
|
107
|
+
protected onPaste(event: ClipboardEvent): void;
|
|
108
|
+
protected onBlur(): void;
|
|
109
|
+
protected focusInput(event: MouseEvent): void;
|
|
110
|
+
errorState(): boolean;
|
|
111
|
+
isRequired(): boolean;
|
|
112
|
+
writeValue(value: string[] | null): void;
|
|
113
|
+
registerOnChange(fn: (value: string[]) => void): void;
|
|
114
|
+
registerOnTouched(fn: () => void): void;
|
|
115
|
+
setDisabledState(isDisabled: boolean): void;
|
|
116
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxTagInput, never>;
|
|
117
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MxTagInput, "mx-tag-input", ["mxTagInput"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "separators": { "alias": "separators"; "required": false; "isSignal": true; }; "maxTags": { "alias": "maxTags"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "validate": { "alias": "validate"; "required": false; "isSignal": true; }; "listLabel": { "alias": "listLabel"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "rejected": "rejected"; }, never, never, true, never>;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { MxChip, MxChipToggle, MxTagInput };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Copia texto para a área de transferência quando o elemento é clicado.
|
|
5
|
+
* Durante 2 s o elemento fica com data-copied, e "Copiado" é anunciado ao leitor de ecrã.
|
|
6
|
+
*
|
|
7
|
+
* ```html
|
|
8
|
+
* <button mxButton variant="outline" [mxCopy]="iban">Copiar IBAN</button>
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
declare class MxCopy {
|
|
12
|
+
readonly text: _angular_core.InputSignal<string>;
|
|
13
|
+
/** Mensagem anunciada ao copiar. */
|
|
14
|
+
readonly copiedMessage: _angular_core.InputSignal<string>;
|
|
15
|
+
readonly copiedChange: _angular_core.OutputEmitterRef<boolean>;
|
|
16
|
+
private readonly clipboard;
|
|
17
|
+
private readonly announcer;
|
|
18
|
+
readonly copied: _angular_core.WritableSignal<boolean>;
|
|
19
|
+
private timer?;
|
|
20
|
+
constructor();
|
|
21
|
+
/** Copia; devolve false se o navegador recusar. */
|
|
22
|
+
copy(): boolean;
|
|
23
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxCopy, never>;
|
|
24
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MxCopy, "[mxCopy]", ["mxCopy"], { "text": { "alias": "mxCopy"; "required": true; "isSignal": true; }; "copiedMessage": { "alias": "mxCopyMessage"; "required": false; "isSignal": true; }; }, { "copiedChange": "mxCopied"; }, never, never, true, never>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Botão de ícone que copia um valor. O nome acessível muda para "Copiado" durante 2 s.
|
|
28
|
+
*
|
|
29
|
+
* ```html
|
|
30
|
+
* <button mxCopyButton [value]="chave" label="Copiar chave da API"></button>
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
declare class MxCopyButton {
|
|
34
|
+
protected readonly copy: MxCopy;
|
|
35
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
36
|
+
readonly copiedLabel: _angular_core.InputSignal<string>;
|
|
37
|
+
readonly size: _angular_core.InputSignal<"sm" | "md">;
|
|
38
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxCopyButton, never>;
|
|
39
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MxCopyButton, "button[mxCopyButton]", ["mxCopyButton"], { "label": { "alias": "label"; "required": false; "isSignal": true; }; "copiedLabel": { "alias": "copiedLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof MxCopy; inputs: { "mxCopy": "value"; }; outputs: { "mxCopied": "mxCopied"; }; }]>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { MxCopy, MxCopyButton };
|
|
@@ -6,13 +6,22 @@ import { MxFormFieldControl, MxFormField } from '@muxima-ui/core/form-field';
|
|
|
6
6
|
/** Data sem horas, para comparar dias. */
|
|
7
7
|
declare function mxStartOfDay(d: Date): Date;
|
|
8
8
|
declare function mxSameDay(a: Date | null | undefined, b: Date | null | undefined): boolean;
|
|
9
|
+
/** Intervalo de datas. Enquanto se escolhe, `end` fica null. */
|
|
10
|
+
interface MxDateRange {
|
|
11
|
+
start: Date | null;
|
|
12
|
+
end: Date | null;
|
|
13
|
+
}
|
|
9
14
|
/**
|
|
10
15
|
* Calendário mensal acessível (grelha WAI-ARIA). Pode ser usado sozinho ou dentro do MxDatePicker.
|
|
11
16
|
*
|
|
12
17
|
* ```html
|
|
13
18
|
* <mx-calendar [(value)]="data" [min]="hoje" />
|
|
19
|
+
* <mx-calendar mode="range" [(range)]="periodo" />
|
|
14
20
|
* ```
|
|
15
21
|
*
|
|
22
|
+
* Em `mode="range"` o primeiro clique marca o início e o segundo o fim (se for anterior,
|
|
23
|
+
* os dois trocam). Entre os dois cliques o intervalo é pré-visualizado com o rato ou o teclado.
|
|
24
|
+
*
|
|
16
25
|
* Teclas: setas (dia e semana), Home/End (início e fim da semana), Page Up/Down (mês),
|
|
17
26
|
* Shift + Page Up/Down (ano), Enter ou Espaço para escolher.
|
|
18
27
|
*/
|
|
@@ -26,12 +35,26 @@ declare class MxCalendar {
|
|
|
26
35
|
/** Primeiro dia da semana: 1 = segunda-feira. */
|
|
27
36
|
readonly firstDayOfWeek: _angular_core.InputSignal<number>;
|
|
28
37
|
readonly selected: _angular_core.OutputEmitterRef<Date>;
|
|
38
|
+
/** `single` escolhe um dia; `range` escolhe um intervalo em [(range)]. */
|
|
39
|
+
readonly mode: _angular_core.InputSignal<"single" | "range">;
|
|
40
|
+
readonly range: _angular_core.ModelSignal<MxDateRange | null>;
|
|
41
|
+
/** Emite quando o intervalo fica completo (início e fim). */
|
|
42
|
+
readonly rangeSelected: _angular_core.OutputEmitterRef<{
|
|
43
|
+
start: Date;
|
|
44
|
+
end: Date;
|
|
45
|
+
}>;
|
|
29
46
|
private readonly host;
|
|
30
47
|
private readonly injector;
|
|
31
48
|
protected readonly titleId: string;
|
|
32
49
|
/** Dia com foco na grelha. */
|
|
33
50
|
readonly focusDate: _angular_core.WritableSignal<Date>;
|
|
34
51
|
private initialised;
|
|
52
|
+
/** Dia sob o rato ou o foco enquanto falta o fim do intervalo. */
|
|
53
|
+
private readonly preview;
|
|
54
|
+
private readonly awaitingEnd;
|
|
55
|
+
protected readonly rangeHint: _angular_core.Signal<string>;
|
|
56
|
+
/** Início e fim efectivos (com pré-visualização), ordenados. */
|
|
57
|
+
private readonly bounds;
|
|
35
58
|
protected readonly weekdays: _angular_core.Signal<{
|
|
36
59
|
short: string;
|
|
37
60
|
long: string;
|
|
@@ -42,6 +65,9 @@ declare class MxCalendar {
|
|
|
42
65
|
label: string;
|
|
43
66
|
outside: boolean;
|
|
44
67
|
today: boolean;
|
|
68
|
+
rangeStart: boolean;
|
|
69
|
+
rangeEnd: boolean;
|
|
70
|
+
inRange: boolean;
|
|
45
71
|
selected: boolean;
|
|
46
72
|
focus: boolean;
|
|
47
73
|
disabled: boolean;
|
|
@@ -51,13 +77,14 @@ declare class MxCalendar {
|
|
|
51
77
|
focus(): void;
|
|
52
78
|
protected monthLabel(delta: number): string;
|
|
53
79
|
protected moveMonth(delta: number): void;
|
|
80
|
+
protected hover(date: Date): void;
|
|
54
81
|
protected select(date: Date): void;
|
|
55
82
|
protected onKeydown(event: KeyboardEvent): void;
|
|
56
83
|
private clamp;
|
|
57
84
|
private isDisabled;
|
|
58
85
|
private focusActiveDay;
|
|
59
86
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxCalendar, never>;
|
|
60
|
-
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; }; }, { "value": "valueChange"; "selected": "selected"; }, never, never, true, never>;
|
|
87
|
+
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>;
|
|
61
88
|
}
|
|
62
89
|
|
|
63
90
|
/** Converte "dd/mm/aaaa" numa data. Aceita também "-" e "." como separadores. */
|
|
@@ -130,4 +157,105 @@ declare class MxDatePicker implements ControlValueAccessor, MxFormFieldControl {
|
|
|
130
157
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MxDatePicker, "mx-date-picker", ["mxDatePicker"], { "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; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
|
|
131
158
|
}
|
|
132
159
|
|
|
133
|
-
|
|
160
|
+
/** Atalho de intervalo mostrado ao lado do calendário. */
|
|
161
|
+
interface MxDateRangePreset {
|
|
162
|
+
label: string;
|
|
163
|
+
/** Função, para que "hoje" seja calculado no momento do clique. */
|
|
164
|
+
range: () => {
|
|
165
|
+
start: Date;
|
|
166
|
+
end: Date;
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/** Atalhos comuns: últimos 7 e 30 dias, este mês e o mês passado. */
|
|
170
|
+
declare function mxDefaultRangePresets(): MxDateRangePreset[];
|
|
171
|
+
/**
|
|
172
|
+
* Campo de intervalo de datas: dois campos (início e fim) que se escrevem em "dd/mm/aaaa"
|
|
173
|
+
* ou se escolhem num calendário, com atalhos opcionais.
|
|
174
|
+
*
|
|
175
|
+
* ```html
|
|
176
|
+
* <mx-form-field>
|
|
177
|
+
* <label mxLabel>Período</label>
|
|
178
|
+
* <mx-date-range-picker formControlName="periodo" [presets]="atalhos" />
|
|
179
|
+
* </mx-form-field>
|
|
180
|
+
* ```
|
|
181
|
+
*
|
|
182
|
+
* O valor é `{ start, end }` (datas sem horas) ou null. Cada campo é anunciado com o rótulo
|
|
183
|
+
* do campo e "início" ou "fim". Fim anterior ao início deixa o campo com erro.
|
|
184
|
+
*/
|
|
185
|
+
declare class MxDateRangePicker implements ControlValueAccessor, MxFormFieldControl {
|
|
186
|
+
readonly value: _angular_core.ModelSignal<MxDateRange | null>;
|
|
187
|
+
readonly min: _angular_core.InputSignal<Date | null>;
|
|
188
|
+
readonly max: _angular_core.InputSignal<Date | null>;
|
|
189
|
+
readonly dateDisabled: _angular_core.InputSignal<(d: Date) => boolean>;
|
|
190
|
+
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>;
|
|
195
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
196
|
+
readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
197
|
+
readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
198
|
+
readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
|
|
199
|
+
readonly id: _angular_core.InputSignal<string | undefined>;
|
|
200
|
+
/** Nome do campo quando não há mxLabel. */
|
|
201
|
+
readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
|
|
202
|
+
protected readonly field: MxFormField | null;
|
|
203
|
+
private readonly ngControl;
|
|
204
|
+
private readonly host;
|
|
205
|
+
private readonly calendar;
|
|
206
|
+
private readonly toggleButton;
|
|
207
|
+
protected readonly positions: ConnectedPosition[];
|
|
208
|
+
private readonly generatedId;
|
|
209
|
+
readonly controlId: _angular_core.Signal<string>;
|
|
210
|
+
protected readonly startLabelId: string;
|
|
211
|
+
protected readonly endLabelId: string;
|
|
212
|
+
protected readonly nameId: string;
|
|
213
|
+
protected readonly isOpen: _angular_core.WritableSignal<boolean>;
|
|
214
|
+
/** Intervalo a ser escolhido no calendário aberto. */
|
|
215
|
+
protected readonly draftRange: _angular_core.WritableSignal<MxDateRange | null>;
|
|
216
|
+
/** Texto escrito que ainda não é uma data válida, por campo. */
|
|
217
|
+
private readonly draftText;
|
|
218
|
+
private readonly formDisabled;
|
|
219
|
+
protected readonly isDisabled: _angular_core.Signal<boolean>;
|
|
220
|
+
protected readonly startText: _angular_core.Signal<string>;
|
|
221
|
+
protected readonly endText: _angular_core.Signal<string>;
|
|
222
|
+
/** true quando há texto que não é data, ou o fim é anterior ao início. */
|
|
223
|
+
readonly badFormat: _angular_core.Signal<boolean>;
|
|
224
|
+
protected readonly toggleLabel: _angular_core.Signal<string>;
|
|
225
|
+
private onChange;
|
|
226
|
+
protected onTouched: () => void;
|
|
227
|
+
constructor();
|
|
228
|
+
/** aria-labelledby: rótulo do form field (ou aria-label) + "início"/"fim". */
|
|
229
|
+
protected labelledBy(partId: string): string;
|
|
230
|
+
protected readonly nameText: _angular_core.Signal<string>;
|
|
231
|
+
open(): void;
|
|
232
|
+
toggle(): void;
|
|
233
|
+
close(restoreFocus?: boolean): void;
|
|
234
|
+
protected onAttach(): void;
|
|
235
|
+
protected onOverlayKey(event: KeyboardEvent): void;
|
|
236
|
+
protected onOutside(event: MouseEvent): void;
|
|
237
|
+
protected choose(range: {
|
|
238
|
+
start: Date;
|
|
239
|
+
end: Date;
|
|
240
|
+
}): void;
|
|
241
|
+
protected applyPreset(p: MxDateRangePreset): void;
|
|
242
|
+
protected onInput(part: 'start' | 'end', event: Event): void;
|
|
243
|
+
private setValue;
|
|
244
|
+
errorState(): boolean;
|
|
245
|
+
isRequired(): boolean;
|
|
246
|
+
writeValue(value: MxDateRange | null): void;
|
|
247
|
+
registerOnChange(fn: (value: MxDateRange | null) => void): void;
|
|
248
|
+
registerOnTouched(fn: () => void): void;
|
|
249
|
+
setDisabledState(isDisabled: boolean): void;
|
|
250
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxDateRangePicker, never>;
|
|
251
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MxDateRangePicker, "mx-date-range-picker", ["mxDateRangePicker"], { "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; }; "presets": { "alias": "presets"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "startLabel": { "alias": "startLabel"; "required": false; "isSignal": true; }; "endLabel": { "alias": "endLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
|
|
252
|
+
}
|
|
253
|
+
/** Validador: exige início e fim. Usa com `Validators.required` não chega, porque {start, end: null} não é vazio. */
|
|
254
|
+
declare function mxDateRangeComplete(control: {
|
|
255
|
+
value: MxDateRange | null;
|
|
256
|
+
}): {
|
|
257
|
+
rangeIncomplete: true;
|
|
258
|
+
} | null;
|
|
259
|
+
|
|
260
|
+
export { MxCalendar, MxDatePicker, MxDateRangePicker, mxDateRangeComplete, mxDefaultRangePresets, mxFormatDate, mxParseDate, mxSameDay, mxStartOfDay };
|
|
261
|
+
export type { MxDateRange, MxDateRangePreset };
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { ControlValueAccessor } from '@angular/forms';
|
|
3
|
+
import { MxFormFieldControl, MxFormField } from '@muxima-ui/core/form-field';
|
|
4
|
+
|
|
5
|
+
interface MxFileRejection {
|
|
6
|
+
file: File;
|
|
7
|
+
reason: 'type' | 'size' | 'count';
|
|
8
|
+
message: string;
|
|
9
|
+
}
|
|
10
|
+
/** "1,2 MB", "340 kB". */
|
|
11
|
+
declare function mxFormatBytes(bytes: number, locale?: string): string;
|
|
12
|
+
/** true se o ficheiro corresponde a `accept` (".pdf,image/*"). */
|
|
13
|
+
declare function mxFileMatches(file: File, accept: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Envio de ficheiros: arrastar para a área ou carregar no botão (que abre o seletor nativo).
|
|
16
|
+
* Valida tipo, tamanho e número, mostra a lista com tamanho, progresso e botão de remover.
|
|
17
|
+
*
|
|
18
|
+
* ```html
|
|
19
|
+
* <mx-form-field>
|
|
20
|
+
* <label mxLabel>Comprovativos</label>
|
|
21
|
+
* <mx-file-upload formControlName="ficheiros" accept=".pdf,image/*" [maxSize]="5_000_000" multiple />
|
|
22
|
+
* <mx-hint>PDF ou imagem, até 5 MB cada.</mx-hint>
|
|
23
|
+
* </mx-form-field>
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* O valor é `File[]`. O envio para o servidor fica do teu lado: passa a percentagem de cada
|
|
27
|
+
* ficheiro em `[progress]` (pelo nome) e os erros em `[errors]`.
|
|
28
|
+
*/
|
|
29
|
+
declare class MxFileUpload implements ControlValueAccessor, MxFormFieldControl {
|
|
30
|
+
readonly value: _angular_core.ModelSignal<File[]>;
|
|
31
|
+
/** Tipos aceites, como no input nativo: ".pdf,image/*". */
|
|
32
|
+
readonly accept: _angular_core.InputSignal<string>;
|
|
33
|
+
readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
34
|
+
/** Tamanho máximo de cada ficheiro, em bytes. */
|
|
35
|
+
readonly maxSize: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
36
|
+
readonly maxFiles: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
37
|
+
/** Percentagem de envio por nome de ficheiro. */
|
|
38
|
+
readonly progress: _angular_core.InputSignal<Record<string, number>>;
|
|
39
|
+
/** Erro de envio por nome de ficheiro. */
|
|
40
|
+
readonly errors: _angular_core.InputSignal<Record<string, string>>;
|
|
41
|
+
readonly dropText: _angular_core.InputSignal<string>;
|
|
42
|
+
readonly buttonText: _angular_core.InputSignal<string>;
|
|
43
|
+
/** Linha de ajuda dentro da área (ex.: "PDF até 5 MB"). */
|
|
44
|
+
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>;
|
|
49
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
50
|
+
readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
51
|
+
readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
52
|
+
readonly id: _angular_core.InputSignal<string | undefined>;
|
|
53
|
+
readonly rejected: _angular_core.OutputEmitterRef<MxFileRejection[]>;
|
|
54
|
+
protected readonly field: MxFormField | null;
|
|
55
|
+
private readonly ngControl;
|
|
56
|
+
private readonly announcer;
|
|
57
|
+
private readonly host;
|
|
58
|
+
private readonly input;
|
|
59
|
+
private readonly injector;
|
|
60
|
+
private readonly generatedId;
|
|
61
|
+
readonly controlId: _angular_core.Signal<string>;
|
|
62
|
+
protected readonly descId: string;
|
|
63
|
+
protected readonly files: _angular_core.Signal<File[]>;
|
|
64
|
+
protected readonly dragging: _angular_core.WritableSignal<boolean>;
|
|
65
|
+
protected readonly rejections: _angular_core.WritableSignal<MxFileRejection[]>;
|
|
66
|
+
private readonly formDisabled;
|
|
67
|
+
protected readonly isDisabled: _angular_core.Signal<boolean>;
|
|
68
|
+
protected readonly describedBy: _angular_core.Signal<string | null>;
|
|
69
|
+
private dragDepth;
|
|
70
|
+
private onChange;
|
|
71
|
+
private onTouched;
|
|
72
|
+
constructor();
|
|
73
|
+
protected size(bytes: number): string;
|
|
74
|
+
/** Abre o seletor de ficheiros do sistema. */
|
|
75
|
+
browse(): void;
|
|
76
|
+
/** Acrescenta ficheiros, com as mesmas validações do arrastar e do seletor. */
|
|
77
|
+
addFiles(list: Iterable<File> | ArrayLike<File>): void;
|
|
78
|
+
remove(index: number): void;
|
|
79
|
+
private update;
|
|
80
|
+
protected onPick(event: Event): void;
|
|
81
|
+
protected onDragEnter(event: DragEvent): void;
|
|
82
|
+
protected onDragOver(event: DragEvent): void;
|
|
83
|
+
protected onDragLeave(event: DragEvent): void;
|
|
84
|
+
protected onDrop(event: DragEvent): void;
|
|
85
|
+
errorState(): boolean;
|
|
86
|
+
isRequired(): boolean;
|
|
87
|
+
writeValue(value: File[] | null): void;
|
|
88
|
+
registerOnChange(fn: (value: File[]) => void): void;
|
|
89
|
+
registerOnTouched(fn: () => void): void;
|
|
90
|
+
setDisabledState(isDisabled: boolean): void;
|
|
91
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxFileUpload, never>;
|
|
92
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MxFileUpload, "mx-file-upload", ["mxFileUpload"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxSize": { "alias": "maxSize"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "progress": { "alias": "progress"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "dropText": { "alias": "dropText"; "required": false; "isSignal": true; }; "buttonText": { "alias": "buttonText"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "listLabel": { "alias": "listLabel"; "required": false; "isSignal": true; }; "removeText": { "alias": "removeText"; "required": false; "isSignal": true; }; "doneText": { "alias": "doneText"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "rejected": "rejected"; }, never, never, true, never>;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export { MxFileUpload, mxFileMatches, mxFormatBytes };
|
|
96
|
+
export type { MxFileRejection };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { ControlValueAccessor } from '@angular/forms';
|
|
3
|
+
import { MxFormFieldControl, MxFormField } from '@muxima-ui/core/form-field';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Avaliação com estrelas. Para escolher, são botões de rádio nativos (setas mudam a nota,
|
|
7
|
+
* Tab sai do grupo); em `readonly` é uma imagem com o texto "4 de 5 estrelas".
|
|
8
|
+
*
|
|
9
|
+
* ```html
|
|
10
|
+
* <mx-form-field>
|
|
11
|
+
* <label mxLabel>Como correu o atendimento?</label>
|
|
12
|
+
* <mx-rating formControlName="nota" />
|
|
13
|
+
* </mx-form-field>
|
|
14
|
+
* <mx-rating [value]="4.5" readonly />
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
declare class MxRating implements ControlValueAccessor, MxFormFieldControl {
|
|
18
|
+
readonly value: _angular_core.ModelSignal<number | null>;
|
|
19
|
+
readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
20
|
+
/** Só mostra a nota (aceita meias estrelas, ex.: 4,5). */
|
|
21
|
+
readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
22
|
+
/** Carregar outra vez na nota escolhida limpa a avaliação. */
|
|
23
|
+
readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
24
|
+
/** Mostra o número ao lado ("4,5"). */
|
|
25
|
+
readonly showValue: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
26
|
+
readonly starLabel: _angular_core.InputSignal<(n: number) => string>;
|
|
27
|
+
readonly locale: _angular_core.InputSignal<string>;
|
|
28
|
+
readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
|
|
29
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
30
|
+
readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
31
|
+
readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
32
|
+
readonly id: _angular_core.InputSignal<string | undefined>;
|
|
33
|
+
readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
|
|
34
|
+
protected readonly field: MxFormField | null;
|
|
35
|
+
private readonly ngControl;
|
|
36
|
+
protected readonly star = "M12 3.2l2.7 5.6 6.1.8-4.5 4.2 1.1 6.1L12 17l-5.4 2.9 1.1-6.1-4.5-4.2 6.1-.8z";
|
|
37
|
+
protected readonly name: string;
|
|
38
|
+
private readonly generatedId;
|
|
39
|
+
readonly controlId: _angular_core.Signal<string>;
|
|
40
|
+
protected readonly hover: _angular_core.WritableSignal<number>;
|
|
41
|
+
private readonly formDisabled;
|
|
42
|
+
protected readonly isDisabled: _angular_core.Signal<boolean>;
|
|
43
|
+
protected readonly stars: _angular_core.Signal<number[]>;
|
|
44
|
+
protected readonly shown: _angular_core.Signal<number>;
|
|
45
|
+
protected readonly valueText: _angular_core.Signal<string>;
|
|
46
|
+
protected readonly readonlyLabel: _angular_core.Signal<string>;
|
|
47
|
+
private onChange;
|
|
48
|
+
protected onTouched: () => void;
|
|
49
|
+
constructor();
|
|
50
|
+
protected fillPct(s: number): number;
|
|
51
|
+
protected choose(s: number): void;
|
|
52
|
+
protected onClick(s: number): void;
|
|
53
|
+
private set;
|
|
54
|
+
errorState(): boolean;
|
|
55
|
+
isRequired(): boolean;
|
|
56
|
+
writeValue(value: number | null): void;
|
|
57
|
+
registerOnChange(fn: (value: number | null) => void): void;
|
|
58
|
+
registerOnTouched(fn: () => void): void;
|
|
59
|
+
setDisabledState(isDisabled: boolean): void;
|
|
60
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxRating, never>;
|
|
61
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MxRating, "mx-rating", ["mxRating"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "starLabel": { "alias": "starLabel"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { MxRating };
|