@muxima-ui/core 1.0.0 → 1.2.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 +12 -4
- package/fesm2022/muxima-ui-core-carousel.mjs +377 -0
- package/fesm2022/muxima-ui-core-carousel.mjs.map +1 -0
- 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-color-picker.mjs +755 -0
- package/fesm2022/muxima-ui-core-color-picker.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-notification-center.mjs +487 -0
- package/fesm2022/muxima-ui-core-notification-center.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-sidebar.mjs +333 -0
- package/fesm2022/muxima-ui-core-sidebar.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-timeline.mjs +117 -0
- package/fesm2022/muxima-ui-core-timeline.mjs.map +1 -0
- package/fesm2022/muxima-ui-core.mjs +1 -1
- package/fesm2022/muxima-ui-core.mjs.map +1 -1
- package/package.json +41 -1
- package/styles/base.css +21 -1
- package/styles/components/carousel.css +113 -0
- package/styles/components/chips.css +170 -0
- package/styles/components/clipboard.css +52 -0
- package/styles/components/color-picker.css +207 -0
- package/styles/components/date-picker.css +135 -0
- package/styles/components/file-upload.css +164 -0
- package/styles/components/notification-center.css +220 -0
- package/styles/components/rating.css +89 -0
- package/styles/components/sidebar.css +211 -0
- package/styles/components/slider.css +111 -0
- package/styles/components/time-picker.css +39 -0
- package/styles/components/timeline.css +180 -0
- package/styles/muxima.css +10 -0
- package/types/muxima-ui-core-carousel.d.ts +72 -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-color-picker.d.ts +153 -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-notification-center.d.ts +91 -0
- package/types/muxima-ui-core-rating.d.ts +64 -0
- package/types/muxima-ui-core-sidebar.d.ts +115 -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-timeline.d.ts +59 -0
- package/types/muxima-ui-core.d.ts +1 -1
|
@@ -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 };
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { ConnectedPosition } from '@angular/cdk/overlay';
|
|
3
|
+
import { ControlValueAccessor } from '@angular/forms';
|
|
4
|
+
import { MxFormFieldControl, MxFormField } from '@muxima-ui/core/form-field';
|
|
5
|
+
|
|
6
|
+
/** Cor em HSV (h 0–360, s e v 0–1) com opacidade a 0–1. */
|
|
7
|
+
interface MxHsva {
|
|
8
|
+
h: number;
|
|
9
|
+
s: number;
|
|
10
|
+
v: number;
|
|
11
|
+
a: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Lê uma cor escrita: "#1f6f78", "1f6f78", "#1f6", "#1f6f7880" ou "rgb(31, 111, 120)" / "rgba(...)".
|
|
15
|
+
* Devolve o hex normalizado ("#1F6F78" ou "#1F6F7880" com opacidade) ou null.
|
|
16
|
+
*/
|
|
17
|
+
declare function mxParseColor(text: string): string | null;
|
|
18
|
+
declare function mxHexToRgba(hex: string): {
|
|
19
|
+
r: number;
|
|
20
|
+
g: number;
|
|
21
|
+
b: number;
|
|
22
|
+
a: number;
|
|
23
|
+
};
|
|
24
|
+
declare function mxHexToHsva(hex: string): MxHsva;
|
|
25
|
+
declare function mxHsvaToHex({ h, s, v, a }: MxHsva): string;
|
|
26
|
+
/** Contraste WCAG entre duas cores (1 a 21). */
|
|
27
|
+
declare function mxContrast(a: string, b: string): number;
|
|
28
|
+
/** Nome aproximado da cor em português, para o leitor de ecrã: "azul escuro", "cinzento claro". */
|
|
29
|
+
declare function mxColorName(hex: string): string;
|
|
30
|
+
|
|
31
|
+
/** Amostra pronta: só a cor, ou cor e nome. */
|
|
32
|
+
type MxColorSwatch = string | {
|
|
33
|
+
color: string;
|
|
34
|
+
label: string;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Editor de cor: área de saturação e brilho, matiz, opacidade opcional, campo hex,
|
|
38
|
+
* amostras e conta-gotas (quando o navegador o tem). O valor é um hex ("#1F6F78",
|
|
39
|
+
* ou "#1F6F7880" com opacidade).
|
|
40
|
+
*
|
|
41
|
+
* ```html
|
|
42
|
+
* <mx-color-panel [(value)]="cor" [swatches]="marca" />
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* Teclado na área: ← → mudam a saturação, ↑ ↓ o brilho (Shift para passos de 10).
|
|
46
|
+
* A matiz e a opacidade são input range nativos.
|
|
47
|
+
*/
|
|
48
|
+
declare class MxColorPanel {
|
|
49
|
+
readonly value: _angular_core.ModelSignal<string | null>;
|
|
50
|
+
/** Mostra o controlo de opacidade e devolve hex de 8 dígitos quando < 100%. */
|
|
51
|
+
readonly alpha: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
52
|
+
readonly swatches: _angular_core.InputSignal<MxColorSwatch[]>;
|
|
53
|
+
readonly showInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
54
|
+
/** Só as amostras: uma paleta fechada, sem área nem matiz. */
|
|
55
|
+
readonly swatchesOnly: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
56
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
57
|
+
readonly areaLabel: _angular_core.InputSignal<string>;
|
|
58
|
+
readonly hueLabel: _angular_core.InputSignal<string>;
|
|
59
|
+
readonly alphaLabel: _angular_core.InputSignal<string>;
|
|
60
|
+
readonly swatchesLabel: _angular_core.InputSignal<string>;
|
|
61
|
+
/** Emite ao largar o rato, escolher amostra ou terminar de escrever (para guardar). */
|
|
62
|
+
readonly committed: _angular_core.OutputEmitterRef<string>;
|
|
63
|
+
private readonly area;
|
|
64
|
+
protected readonly inputId: string;
|
|
65
|
+
protected readonly eyeDropper: boolean;
|
|
66
|
+
/** HSVA interno: guarda a matiz quando a cor é cinzenta (o hex não a tem). */
|
|
67
|
+
protected readonly hsva: _angular_core.WritableSignal<MxHsva>;
|
|
68
|
+
protected readonly hex: _angular_core.Signal<string>;
|
|
69
|
+
protected readonly opaque: _angular_core.Signal<string>;
|
|
70
|
+
protected readonly draft: _angular_core.WritableSignal<string | null>;
|
|
71
|
+
protected readonly draftInvalid: _angular_core.Signal<boolean>;
|
|
72
|
+
protected readonly hueName: _angular_core.Signal<string>;
|
|
73
|
+
protected readonly areaText: _angular_core.Signal<string>;
|
|
74
|
+
protected readonly swatchList: _angular_core.Signal<{
|
|
75
|
+
color: string;
|
|
76
|
+
label: string;
|
|
77
|
+
}[]>;
|
|
78
|
+
constructor();
|
|
79
|
+
protected round(n: number): number;
|
|
80
|
+
protected pct(n: number): number;
|
|
81
|
+
private update;
|
|
82
|
+
setHex(hex: string): void;
|
|
83
|
+
protected setHue(e: Event): void;
|
|
84
|
+
protected setAlpha(e: Event): void;
|
|
85
|
+
protected onHexInput(e: Event): void;
|
|
86
|
+
protected onAreaKey(e: KeyboardEvent): void;
|
|
87
|
+
protected onAreaDown(e: PointerEvent): void;
|
|
88
|
+
protected pickFromScreen(): Promise<void>;
|
|
89
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxColorPanel, never>;
|
|
90
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MxColorPanel, "mx-color-panel", ["mxColorPanel"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "alpha": { "alias": "alpha"; "required": false; "isSignal": true; }; "swatches": { "alias": "swatches"; "required": false; "isSignal": true; }; "showInput": { "alias": "showInput"; "required": false; "isSignal": true; }; "swatchesOnly": { "alias": "swatchesOnly"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "areaLabel": { "alias": "areaLabel"; "required": false; "isSignal": true; }; "hueLabel": { "alias": "hueLabel"; "required": false; "isSignal": true; }; "alphaLabel": { "alias": "alphaLabel"; "required": false; "isSignal": true; }; "swatchesLabel": { "alias": "swatchesLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "committed": "committed"; }, never, never, true, never>;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Campo de cor: escreve-se o hex (ou rgb()) ou escolhe-se no painel que abre no botão
|
|
95
|
+
* da amostra. Funciona com ngModel e Reactive Forms; o valor é um hex ou null.
|
|
96
|
+
*
|
|
97
|
+
* ```html
|
|
98
|
+
* <mx-form-field>
|
|
99
|
+
* <label mxLabel>Cor da marca</label>
|
|
100
|
+
* <mx-color-picker formControlName="cor" [swatches]="sugestoes" />
|
|
101
|
+
* </mx-form-field>
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
declare class MxColorPicker implements ControlValueAccessor, MxFormFieldControl {
|
|
105
|
+
readonly value: _angular_core.ModelSignal<string | null>;
|
|
106
|
+
readonly alpha: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
107
|
+
readonly swatches: _angular_core.InputSignal<MxColorSwatch[]>;
|
|
108
|
+
readonly placeholder: _angular_core.InputSignal<string>;
|
|
109
|
+
readonly dialogLabel: _angular_core.InputSignal<string>;
|
|
110
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
111
|
+
readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
112
|
+
readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
113
|
+
readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
|
|
114
|
+
readonly id: _angular_core.InputSignal<string | undefined>;
|
|
115
|
+
readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
|
|
116
|
+
protected readonly field: MxFormField | null;
|
|
117
|
+
private readonly ngControl;
|
|
118
|
+
private readonly host;
|
|
119
|
+
private readonly toggleButton;
|
|
120
|
+
private readonly panel;
|
|
121
|
+
protected readonly positions: ConnectedPosition[];
|
|
122
|
+
private readonly generatedId;
|
|
123
|
+
readonly controlId: _angular_core.Signal<string>;
|
|
124
|
+
protected readonly isOpen: _angular_core.WritableSignal<boolean>;
|
|
125
|
+
protected readonly draft: _angular_core.WritableSignal<string | null>;
|
|
126
|
+
private readonly formDisabled;
|
|
127
|
+
protected readonly isDisabled: _angular_core.Signal<boolean>;
|
|
128
|
+
readonly badFormat: _angular_core.Signal<boolean>;
|
|
129
|
+
protected readonly toggleLabel: _angular_core.Signal<string>;
|
|
130
|
+
private onChange;
|
|
131
|
+
private onTouched;
|
|
132
|
+
constructor();
|
|
133
|
+
open(): void;
|
|
134
|
+
toggle(): void;
|
|
135
|
+
close(restoreFocus?: boolean): void;
|
|
136
|
+
protected onAttach(): void;
|
|
137
|
+
protected onOverlayKey(e: KeyboardEvent): void;
|
|
138
|
+
protected onOutside(e: MouseEvent): void;
|
|
139
|
+
protected setValue(v: string | null): void;
|
|
140
|
+
protected onInput(e: Event): void;
|
|
141
|
+
protected onBlur(): void;
|
|
142
|
+
errorState(): boolean;
|
|
143
|
+
isRequired(): boolean;
|
|
144
|
+
writeValue(value: string | null): void;
|
|
145
|
+
registerOnChange(fn: (value: string | null) => void): void;
|
|
146
|
+
registerOnTouched(fn: () => void): void;
|
|
147
|
+
setDisabledState(isDisabled: boolean): void;
|
|
148
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MxColorPicker, never>;
|
|
149
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MxColorPicker, "mx-color-picker", ["mxColorPicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "alpha": { "alias": "alpha"; "required": false; "isSignal": true; }; "swatches": { "alias": "swatches"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "dialogLabel": { "alias": "dialogLabel"; "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>;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export { MxColorPanel, MxColorPicker, mxColorName, mxContrast, mxHexToHsva, mxHexToRgba, mxHsvaToHex, mxParseColor };
|
|
153
|
+
export type { MxColorSwatch, MxHsva };
|
|
@@ -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 };
|