@govbr-ds/webcomponents 2.0.0-next.46 → 2.0.0-next.47
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/dist/cjs/br-avatar.cjs.entry.js +1 -1
- package/dist/cjs/br-avatar.cjs.entry.js.map +1 -1
- package/dist/cjs/br-avatar.entry.cjs.js.map +1 -1
- package/dist/cjs/br-button.br-icon.entry.cjs.js.map +1 -1
- package/dist/cjs/br-button_2.cjs.entry.js +1 -1
- package/dist/cjs/br-button_2.cjs.entry.js.map +1 -1
- package/dist/cjs/br-switch.cjs.entry.js +28 -2
- package/dist/cjs/br-switch.cjs.entry.js.map +1 -1
- package/dist/cjs/br-switch.entry.cjs.js.map +1 -1
- package/dist/cjs/br-tag.cjs.entry.js +151 -13
- package/dist/cjs/br-tag.cjs.entry.js.map +1 -1
- package/dist/cjs/br-tag.entry.cjs.js.map +1 -1
- package/dist/cjs/br-textarea.cjs.entry.js +32 -5
- package/dist/cjs/br-textarea.cjs.entry.js.map +1 -1
- package/dist/cjs/br-textarea.entry.cjs.js.map +1 -1
- package/dist/cjs/br-tooltip.cjs.entry.js +1 -1
- package/dist/cjs/br-upload.cjs.entry.js +15 -23
- package/dist/cjs/br-upload.cjs.entry.js.map +1 -1
- package/dist/cjs/br-upload.entry.cjs.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/webcomponents.cjs.js +1 -1
- package/dist/collection/components/avatar/avatar.js +1 -1
- package/dist/collection/components/avatar/avatar.js.map +1 -1
- package/dist/collection/components/button/button.js +1 -1
- package/dist/collection/components/button/button.js.map +1 -1
- package/dist/collection/components/switch/switch.css +1 -1
- package/dist/collection/components/switch/switch.js +27 -1
- package/dist/collection/components/switch/switch.js.map +1 -1
- package/dist/collection/components/tag/tag.css +1 -1
- package/dist/collection/components/tag/tag.js +192 -14
- package/dist/collection/components/tag/tag.js.map +1 -1
- package/dist/collection/components/textarea/textarea.js +51 -5
- package/dist/collection/components/textarea/textarea.js.map +1 -1
- package/dist/collection/components/tooltip/tooltip.js +1 -1
- package/dist/collection/components/upload/upload.js +46 -30
- package/dist/collection/components/upload/upload.js.map +1 -1
- package/dist/components/br-avatar.js +3 -2
- package/dist/components/br-avatar.js.map +1 -1
- package/dist/components/br-breadcrumb.js +1 -1
- package/dist/components/br-button.js +4 -4
- package/dist/components/br-footer-social.js +1 -1
- package/dist/components/br-input.js +3 -3
- package/dist/components/br-message.js +1 -1
- package/dist/components/br-select.js +2 -2
- package/dist/components/br-step-item.js +1 -1
- package/dist/components/br-switch.js +35 -11
- package/dist/components/br-switch.js.map +1 -1
- package/dist/components/br-tag.js +166 -51
- package/dist/components/br-tag.js.map +1 -1
- package/dist/components/br-textarea.js +42 -15
- package/dist/components/br-textarea.js.map +1 -1
- package/dist/components/br-tooltip.js +15 -15
- package/dist/components/br-upload.js +56 -58
- package/dist/components/br-upload.js.map +1 -1
- package/dist/components/{p-DZhiQXGc.js → p-Bjt1OWm8.js} +3 -3
- package/dist/components/{p-ssSt5UuQ.js → p-Brhs7qAd.js} +6 -7
- package/dist/components/p-Brhs7qAd.js.map +1 -0
- package/dist/custom-elements.json +273 -9
- package/dist/esm/br-avatar.entry.js +1 -1
- package/dist/esm/br-avatar.entry.js.map +1 -1
- package/dist/esm/br-button.br-icon.entry.js.map +1 -1
- package/dist/esm/br-button_2.entry.js +1 -1
- package/dist/esm/br-button_2.entry.js.map +1 -1
- package/dist/esm/br-switch.entry.js +28 -2
- package/dist/esm/br-switch.entry.js.map +1 -1
- package/dist/esm/br-tag.entry.js +151 -13
- package/dist/esm/br-tag.entry.js.map +1 -1
- package/dist/esm/br-textarea.entry.js +32 -5
- package/dist/esm/br-textarea.entry.js.map +1 -1
- package/dist/esm/br-tooltip.entry.js +1 -1
- package/dist/esm/br-upload.entry.js +15 -23
- package/dist/esm/br-upload.entry.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/webcomponents.js +1 -1
- package/dist/hydrate/index.js +239 -50
- package/dist/hydrate/index.mjs +239 -50
- package/dist/types/components/switch/switch.d.ts +8 -3
- package/dist/types/components/tag/tag.d.ts +45 -3
- package/dist/types/components/textarea/textarea.d.ts +18 -0
- package/dist/types/components/upload/upload.d.ts +14 -4
- package/dist/types/components.d.ts +40 -6
- package/dist/webcomponents/br-avatar.entry.esm.js.map +1 -1
- package/dist/webcomponents/br-button.br-icon.entry.esm.js.map +1 -1
- package/dist/webcomponents/br-switch.entry.esm.js.map +1 -1
- package/dist/webcomponents/br-tag.entry.esm.js.map +1 -1
- package/dist/webcomponents/br-textarea.entry.esm.js.map +1 -1
- package/dist/webcomponents/br-upload.entry.esm.js.map +1 -1
- package/dist/webcomponents/{p-fa0aeb0f.entry.js → p-3f18e20a.entry.js} +5 -6
- package/dist/webcomponents/p-3f18e20a.entry.js.map +1 -0
- package/dist/webcomponents/{p-8b15dfc8.entry.js → p-6dba4bb1.entry.js} +10 -10
- package/dist/webcomponents/{p-df6e707a.entry.js → p-7251c80f.entry.js} +4 -3
- package/dist/webcomponents/p-7251c80f.entry.js.map +1 -0
- package/dist/webcomponents/{p-24f6adad.entry.js → p-73794ac8.entry.js} +42 -16
- package/dist/webcomponents/p-73794ac8.entry.js.map +1 -0
- package/dist/webcomponents/{p-abf81334.entry.js → p-82dec3b6.entry.js} +36 -12
- package/dist/webcomponents/p-82dec3b6.entry.js.map +1 -0
- package/dist/webcomponents/{p-a802ca08.entry.js → p-861b8ebf.entry.js} +55 -58
- package/dist/webcomponents/p-861b8ebf.entry.js.map +1 -0
- package/dist/webcomponents/{p-761f7798.entry.js → p-d3463d4a.entry.js} +161 -48
- package/dist/webcomponents/p-d3463d4a.entry.js.map +1 -0
- package/dist/webcomponents/webcomponents.esm.js +1 -1
- package/dist/webcomponents.html-custom-data.json +15 -3
- package/package.json +1 -1
- package/dist/components/p-ssSt5UuQ.js.map +0 -1
- package/dist/webcomponents/p-24f6adad.entry.js.map +0 -1
- package/dist/webcomponents/p-761f7798.entry.js.map +0 -1
- package/dist/webcomponents/p-a802ca08.entry.js.map +0 -1
- package/dist/webcomponents/p-abf81334.entry.js.map +0 -1
- package/dist/webcomponents/p-df6e707a.entry.js.map +0 -1
- package/dist/webcomponents/p-fa0aeb0f.entry.js.map +0 -1
- /package/dist/components/{p-DZhiQXGc.js.map → p-Bjt1OWm8.js.map} +0 -0
- /package/dist/webcomponents/{p-8b15dfc8.entry.js.map → p-6dba4bb1.entry.js.map} +0 -0
|
@@ -3,28 +3,31 @@
|
|
|
3
3
|
* © https://serpro.gov.br/ - MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { h, Host } from "@stencil/core";
|
|
6
|
-
var UploadState;
|
|
7
|
-
(function (UploadState) {
|
|
8
|
-
UploadState["INFO"] = "info";
|
|
9
|
-
UploadState["WARNING"] = "warning";
|
|
10
|
-
UploadState["DANGER"] = "danger";
|
|
11
|
-
UploadState["SUCCESS"] = "success";
|
|
12
|
-
})(UploadState || (UploadState = {}));
|
|
13
6
|
/**
|
|
14
7
|
* Para uma descrição detalhada, consulte a [documentação do GovBR-DS](https://www.gov.br/ds/components/upload?tab=designer).
|
|
15
8
|
*
|
|
16
|
-
* @slot default -
|
|
9
|
+
* @slot default - Texto personalizado para o botão de upload. Se não fornecido, será exibido "Selecione o arquivo" como texto padrão.
|
|
10
|
+
* Use este slot para personalizar o texto do botão de acordo com o contexto do upload, por exemplo: "Anexar documentos",
|
|
11
|
+
* "Enviar imagens", etc.
|
|
17
12
|
*/
|
|
18
13
|
export class Upload {
|
|
19
14
|
constructor() {
|
|
15
|
+
/**
|
|
16
|
+
* Identificador único.
|
|
17
|
+
* Caso não seja fornecido, um ID gerado automaticamente será usado.
|
|
18
|
+
*/
|
|
19
|
+
this.customId = `br-upload-${uploadId++}`;
|
|
20
20
|
/**
|
|
21
21
|
* Tipos de arquivo permitidos (ex: 'image/*').
|
|
22
22
|
* Esta propriedade define quais tipos de arquivos podem ser selecionados para upload.
|
|
23
23
|
*/
|
|
24
24
|
this.accept = '';
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
27
|
-
* Este
|
|
26
|
+
* Rótulo principal do campo de upload.
|
|
27
|
+
* Este texto ajuda usuários de leitores de tela a identificarem o propósito do upload.
|
|
28
|
+
* Exemplos: "Anexar comprovante", "Enviar foto do documento".
|
|
29
|
+
*
|
|
30
|
+
* @default "Envio de arquivo"
|
|
28
31
|
*/
|
|
29
32
|
this.label = 'Envio de arquivo';
|
|
30
33
|
/**
|
|
@@ -45,16 +48,6 @@ export class Upload {
|
|
|
45
48
|
* como durante o carregamento de dados ou quando o formulário está em um estado inválido.
|
|
46
49
|
*/
|
|
47
50
|
this.disabled = false;
|
|
48
|
-
/**
|
|
49
|
-
* Define o estado visual da mensagem.
|
|
50
|
-
* Os possíveis valores são:
|
|
51
|
-
* - 'info': Mensagem informativa.
|
|
52
|
-
* - 'warning': Mensagem de aviso.
|
|
53
|
-
* - 'danger': Mensagem de erro ou alerta.
|
|
54
|
-
* - 'success': Mensagem de sucesso.
|
|
55
|
-
* O valor padrão é 'info'.
|
|
56
|
-
*/
|
|
57
|
-
this.state = UploadState.INFO;
|
|
58
51
|
/**
|
|
59
52
|
* Indica se o componente permite a seleção de múltiplos arquivos.
|
|
60
53
|
* Quando definido como `true`, o usuário pode selecionar mais de um arquivo para upload.
|
|
@@ -74,13 +67,13 @@ export class Upload {
|
|
|
74
67
|
handleRemoveFileSelection(file) {
|
|
75
68
|
const newArrayFilter = Array.from(this.filesSelected).filter((f) => f !== file);
|
|
76
69
|
this.filesSelected = newArrayFilter;
|
|
77
|
-
const fileInput = this.el.shadowRoot.getElementById(
|
|
70
|
+
const fileInput = this.el.shadowRoot.getElementById(`single-file-${this.customId}`);
|
|
78
71
|
fileInput.value = '';
|
|
79
72
|
}
|
|
80
73
|
renderFilesUploaded() {
|
|
81
74
|
const fileSizes = this._calculateFileSize(this.filesSelected);
|
|
82
75
|
return fileSizes.map(({ file, size }) => {
|
|
83
|
-
return (h("div", { class: "br-item d-flex", key: file.name }, h("div", { class: "content text-primary-default mr-auto" }, file.name), h("div", { class: "support mr-n2" }, h("span", { class: "" }, size), h("br-button", { shape: "circle", type: "button", "aria-label":
|
|
76
|
+
return (h("div", { class: "br-item d-flex", key: file.name, role: "listitem" }, h("div", { class: "content text-primary-default mr-auto" }, file.name), h("div", { class: "support mr-n2" }, h("span", { class: "" }, size), h("br-button", { shape: "circle", type: "button", "aria-label": `Remover arquivo ${file.name}`, onClick: () => this.handleRemoveFileSelection(file) }, h("br-icon", { "icon-name": "fa-solid:trash", "aria-hidden": "true" })))));
|
|
84
77
|
});
|
|
85
78
|
}
|
|
86
79
|
onInputChange(files) {
|
|
@@ -125,11 +118,11 @@ export class Upload {
|
|
|
125
118
|
event.preventDefault();
|
|
126
119
|
}
|
|
127
120
|
handleFileSelection() {
|
|
128
|
-
const fileInput = this.el.shadowRoot.getElementById(
|
|
121
|
+
const fileInput = this.el.shadowRoot.getElementById(`single-file-${this.customId}`);
|
|
129
122
|
fileInput.click();
|
|
130
123
|
}
|
|
131
124
|
render() {
|
|
132
|
-
return (h(Host, { key: '
|
|
125
|
+
return (h(Host, { key: '04f5ddee05c4f97819d81ac74b73ae201bff0efb' }, h("div", { key: 'dc1351bde473c392633fea3420a3a14307af6634', class: this.getCssClassMap(), id: this.customId }, h("label", { key: 'c401e4566f70aeb5fedc39bd2ee59957fc12f8c6', id: `label-${this.customId}`, class: "upload-label", htmlFor: `single-file-${this.customId}` }, h("span", { key: 'e6d03cbcdf6e0a9e908e1cfb0bb169c00eb93aae' }, this.label)), h("input", { key: 'a265b289688132438a8bc74cfe3d93af5e3bc3c7', class: "upload-input", id: `single-file-${this.customId}`, type: "file", onChange: this.handleInputChange, multiple: this.multiple, disabled: this.disabled, accept: this.accept, "aria-labelledby": `label-${this.customId}` }), h("button", { key: '0aa326ad742da664ad17d4f98f988615c6f40e73', class: "upload-button", type: "button", disabled: this.disabled, onClick: () => this.handleFileSelection(), onDrop: (event) => this.handleDrop(event), onDragOver: (event) => this.handleDragOver(event), "aria-describedby": `label-${this.customId}` }, h("br-icon", { key: '1986c81deb151328a98380e48e2cacc07b63fb57', "icon-name": "fa-solid:upload", height: "16", "aria-hidden": "true" }), h("slot", { key: '7743c3121776b6cb67cabcfb5cc933aa27686b54' }, h("span", { key: 'a62f67fb94e453d54ad11303969bdab73021f3ff' }, "Selecione o arquivo"))), this.filesSelected && (h("div", { key: '56949da99192812fb6d3cffc9940878db0737359', id: `${this.customId}-list-files`, class: "upload-list", role: "list" }, this.renderFilesUploaded())))));
|
|
133
126
|
}
|
|
134
127
|
static get is() { return "br-upload"; }
|
|
135
128
|
static get encapsulation() { return "shadow"; }
|
|
@@ -146,6 +139,26 @@ export class Upload {
|
|
|
146
139
|
}
|
|
147
140
|
static get properties() {
|
|
148
141
|
return {
|
|
142
|
+
"customId": {
|
|
143
|
+
"type": "string",
|
|
144
|
+
"mutable": false,
|
|
145
|
+
"complexType": {
|
|
146
|
+
"original": "string",
|
|
147
|
+
"resolved": "string",
|
|
148
|
+
"references": {}
|
|
149
|
+
},
|
|
150
|
+
"required": false,
|
|
151
|
+
"optional": false,
|
|
152
|
+
"docs": {
|
|
153
|
+
"tags": [],
|
|
154
|
+
"text": "Identificador \u00FAnico.\nCaso n\u00E3o seja fornecido, um ID gerado automaticamente ser\u00E1 usado."
|
|
155
|
+
},
|
|
156
|
+
"getter": false,
|
|
157
|
+
"setter": false,
|
|
158
|
+
"attribute": "custom-id",
|
|
159
|
+
"reflect": true,
|
|
160
|
+
"defaultValue": "`br-upload-${uploadId++}`"
|
|
161
|
+
},
|
|
149
162
|
"accept": {
|
|
150
163
|
"type": "string",
|
|
151
164
|
"mutable": false,
|
|
@@ -177,8 +190,11 @@ export class Upload {
|
|
|
177
190
|
"required": false,
|
|
178
191
|
"optional": false,
|
|
179
192
|
"docs": {
|
|
180
|
-
"tags": [
|
|
181
|
-
|
|
193
|
+
"tags": [{
|
|
194
|
+
"name": "default",
|
|
195
|
+
"text": "\"Envio de arquivo\""
|
|
196
|
+
}],
|
|
197
|
+
"text": "R\u00F3tulo principal do campo de upload.\nEste texto ajuda usu\u00E1rios de leitores de tela a identificarem o prop\u00F3sito do upload.\nExemplos: \"Anexar comprovante\", \"Enviar foto do documento\"."
|
|
182
198
|
},
|
|
183
199
|
"getter": false,
|
|
184
200
|
"setter": false,
|
|
@@ -210,8 +226,8 @@ export class Upload {
|
|
|
210
226
|
"type": "string",
|
|
211
227
|
"mutable": false,
|
|
212
228
|
"complexType": {
|
|
213
|
-
"original": "
|
|
214
|
-
"resolved": "
|
|
229
|
+
"original": "'info' | 'warning' | 'danger' | 'success'",
|
|
230
|
+
"resolved": "\"danger\" | \"info\" | \"success\" | \"warning\"",
|
|
215
231
|
"references": {}
|
|
216
232
|
},
|
|
217
233
|
"required": false,
|
|
@@ -223,8 +239,7 @@ export class Upload {
|
|
|
223
239
|
"getter": false,
|
|
224
240
|
"setter": false,
|
|
225
241
|
"attribute": "state",
|
|
226
|
-
"reflect": true
|
|
227
|
-
"defaultValue": "UploadState.INFO"
|
|
242
|
+
"reflect": true
|
|
228
243
|
},
|
|
229
244
|
"multiple": {
|
|
230
245
|
"type": "boolean",
|
|
@@ -257,4 +272,5 @@ export class Upload {
|
|
|
257
272
|
static get elementRef() { return "el"; }
|
|
258
273
|
static get attachInternalsMemberName() { return "elementInternals"; }
|
|
259
274
|
}
|
|
275
|
+
let uploadId = 0;
|
|
260
276
|
//# sourceMappingURL=upload.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../../../../packages/webcomponents/src/components/upload/upload.tsx"],"names":[],"mappings":"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","sourcesContent":["import { AttachInternals, Component, Element, h, Host, Prop, State } from '@stencil/core'\n\nimport { CssClassMap } from '../../utils/interfaces'\n\nenum UploadState {\n INFO = 'info',\n WARNING = 'warning',\n DANGER = 'danger',\n SUCCESS = 'success',\n}\n\n/**\n * Para uma descrição detalhada, consulte a [documentação do GovBR-DS](https://www.gov.br/ds/components/upload?tab=designer).\n *\n * @slot default - Descrição do slot\n */\n@Component({\n tag: 'br-upload',\n styleUrl: 'upload.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class Upload {\n /**\n * Referência ao elemento host do componente.\n * Utilize esta propriedade para acessar e manipular o elemento do DOM associado ao componente.\n */\n @Element() el!: HTMLBrUploadElement\n\n /**\n * Tipos de arquivo permitidos (ex: 'image/*').\n * Esta propriedade define quais tipos de arquivos podem ser selecionados para upload.\n */\n @Prop() accept: string = ''\n\n /**\n * Texto descritivo do campo de upload.\n * Este é o texto que é mostrado no label do textarea.\n */\n @Prop() label: string = 'Envio de arquivo'\n\n /**\n * Evento emitido quando um arquivo é selecionado.\n * Este estado armazena os arquivos que foram selecionados pelo usuário.\n */\n @State() filesSelected: FileList | null = null\n\n /**\n * Referência ao elemento de arquivo selecionado.\n * Este estado armazena o arquivo que foi selecionado para upload.\n */\n @State() file: File | null = null\n\n /**\n * Indica se o componente está desativado.\n * Quando definido como `true`, o campo de upload se torna não interativo,\n * impedindo que o usuário selecione ou envie arquivos.\n * Isso é útil para controlar a interação do usuário em situações específicas,\n * como durante o carregamento de dados ou quando o formulário está em um estado inválido.\n */\n @Prop({ reflect: true }) disabled: boolean = false\n\n /**\n * Define o estado visual da mensagem.\n * Os possíveis valores são:\n * - 'info': Mensagem informativa.\n * - 'warning': Mensagem de aviso.\n * - 'danger': Mensagem de erro ou alerta.\n * - 'success': Mensagem de sucesso.\n * O valor padrão é 'info'.\n */\n @Prop({ reflect: true }) state: string = UploadState.INFO\n\n /**\n * Indica se o componente permite a seleção de múltiplos arquivos.\n * Quando definido como `true`, o usuário pode selecionar mais de um arquivo para upload.\n */\n @Prop() multiple: boolean = false\n\n @AttachInternals() elementInternals: ElementInternals\n\n private getCssClassMap(): CssClassMap {\n return {\n 'br-upload': true,\n [this.state]: true,\n }\n }\n\n private handleRemoveFileSelection(file: File) {\n const newArrayFilter = Array.from(this.filesSelected).filter((f) => f !== file)\n this.filesSelected = newArrayFilter as unknown as FileList\n const fileInput = this.el.shadowRoot.getElementById('single-file') as HTMLInputElement\n fileInput.value = ''\n }\n\n private renderFilesUploaded() {\n const fileSizes = this._calculateFileSize(this.filesSelected)\n\n return fileSizes.map(({ file, size }) => {\n return (\n <div class=\"br-item d-flex\" key={file.name}>\n <div class=\"content text-primary-default mr-auto\">{file.name}</div>\n <div class=\"support mr-n2\">\n <span class=\"\">{size}</span>\n <br-button\n shape=\"circle\"\n type=\"button\"\n aria-label=\"Remover arquivo\"\n onClick={() => this.handleRemoveFileSelection(file)}\n >\n <br-icon icon-name=\"fa-solid:trash\" aria-hidden=\"true\"></br-icon>\n </br-button>\n </div>\n </div>\n )\n })\n }\n\n private onInputChange(files: FileList) {\n if (files.length === 1) {\n this.filesSelected = files\n } else if (files.length > 0) {\n this.filesSelected = files\n } else {\n console.error(files.length === 0 ? 'NENHUM ARQUIVO ENVIADO' : 'VOCÊ SÓ PODE ENVIAR UM ARQUIVO POR VEZ')\n\n return false\n }\n }\n\n private _calculateFileSize(files: FileList) {\n return Array.from(files).map((file) => {\n let sOutput = ''\n const aMultiples = ['KB', 'MB', 'GB', 'TB']\n let nMultiple = 0\n let nApprox = file.size / 1024\n\n if (nApprox < 1) {\n sOutput = `${file.size} bytes`\n } else {\n while (nApprox > 1 && nMultiple < aMultiples.length) {\n sOutput = `${nApprox.toFixed(2)} ${aMultiples[nMultiple]}`\n nApprox /= 1024\n nMultiple++\n }\n }\n\n return { file: file, size: sOutput || 0 }\n })\n }\n\n private handleDrop(event: DragEvent) {\n event.preventDefault()\n const files = event.dataTransfer?.files\n if (files && files.length > 0) {\n this.onInputChange(files)\n }\n }\n\n private handleDragOver(event: DragEvent) {\n event.preventDefault()\n }\n\n private handleFileSelection() {\n const fileInput = this.el.shadowRoot.getElementById('single-file') as HTMLInputElement\n fileInput.click()\n }\n\n private readonly handleInputChange = (event: Event) => {\n const target = event.target as HTMLInputElement\n this.onInputChange(target.files)\n }\n\n render() {\n return (\n <Host>\n <div class={this.getCssClassMap()}>\n <label class=\"upload-label\" form=\"single-file\">\n <span>{this.label}</span>\n </label>\n <button\n class=\"upload-button\"\n type=\"button\"\n tabIndex={this.disabled ? -1 : 0}\n disabled={this.disabled}\n aria-label=\"Selecionar arquivo para upload\"\n onClick={() => this.handleFileSelection()}\n onDrop={(event) => this.handleDrop(event)}\n onDragOver={(event) => this.handleDragOver(event)}\n >\n <br-icon icon-name=\"fa-solid:upload\" height=\"16\" aria-hidden=\"true\"></br-icon>\n <span>Selecione o arquivo</span>\n </button>\n\n <input\n class=\"upload-input\"\n id=\"single-file\"\n type=\"file\"\n aria-label=\"enviar arquivo\"\n onChange={this.handleInputChange}\n multiple={this.multiple}\n disabled={this.disabled}\n accept={this.accept}\n />\n <div id=\"list-files\" class=\"upload-list\">\n {this.filesSelected ? this.renderFilesUploaded() : null}\n </div>\n </div>\n </Host>\n )\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../../../../packages/webcomponents/src/components/upload/upload.tsx"],"names":[],"mappings":"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","sourcesContent":["import { AttachInternals, Component, Element, h, Host, Prop, State } from '@stencil/core'\n\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * Para uma descrição detalhada, consulte a [documentação do GovBR-DS](https://www.gov.br/ds/components/upload?tab=designer).\n *\n * @slot default - Texto personalizado para o botão de upload. Se não fornecido, será exibido \"Selecione o arquivo\" como texto padrão.\n * Use este slot para personalizar o texto do botão de acordo com o contexto do upload, por exemplo: \"Anexar documentos\",\n * \"Enviar imagens\", etc.\n */\n@Component({\n tag: 'br-upload',\n styleUrl: 'upload.scss',\n shadow: true,\n formAssociated: true,\n})\nexport class Upload {\n /**\n * Identificador único.\n * Caso não seja fornecido, um ID gerado automaticamente será usado.\n */\n @Prop({ reflect: true }) readonly customId: string = `br-upload-${uploadId++}`\n /**\n * Referência ao elemento host do componente.\n * Utilize esta propriedade para acessar e manipular o elemento do DOM associado ao componente.\n */\n @Element() el!: HTMLBrUploadElement\n\n /**\n * Tipos de arquivo permitidos (ex: 'image/*').\n * Esta propriedade define quais tipos de arquivos podem ser selecionados para upload.\n */\n @Prop() accept: string = ''\n\n /**\n * Rótulo principal do campo de upload.\n * Este texto ajuda usuários de leitores de tela a identificarem o propósito do upload.\n * Exemplos: \"Anexar comprovante\", \"Enviar foto do documento\".\n *\n * @default \"Envio de arquivo\"\n */\n @Prop() label: string = 'Envio de arquivo'\n\n /**\n * Evento emitido quando um arquivo é selecionado.\n * Este estado armazena os arquivos que foram selecionados pelo usuário.\n */\n @State() filesSelected: FileList | null = null\n\n /**\n * Referência ao elemento de arquivo selecionado.\n * Este estado armazena o arquivo que foi selecionado para upload.\n */\n @State() file: File | null = null\n\n /**\n * Indica se o componente está desativado.\n * Quando definido como `true`, o campo de upload se torna não interativo,\n * impedindo que o usuário selecione ou envie arquivos.\n * Isso é útil para controlar a interação do usuário em situações específicas,\n * como durante o carregamento de dados ou quando o formulário está em um estado inválido.\n */\n @Prop({ reflect: true }) disabled: boolean = false\n\n /**\n * Define o estado visual da mensagem.\n * Os possíveis valores são:\n * - 'info': Mensagem informativa.\n * - 'warning': Mensagem de aviso.\n * - 'danger': Mensagem de erro ou alerta.\n * - 'success': Mensagem de sucesso.\n * O valor padrão é 'info'.\n */\n @Prop({ reflect: true }) state: 'info' | 'warning' | 'danger' | 'success'\n\n /**\n * Indica se o componente permite a seleção de múltiplos arquivos.\n * Quando definido como `true`, o usuário pode selecionar mais de um arquivo para upload.\n */\n @Prop() multiple: boolean = false\n\n @AttachInternals() elementInternals: ElementInternals\n\n private getCssClassMap(): CssClassMap {\n return {\n 'br-upload': true,\n [this.state]: true,\n }\n }\n\n private handleRemoveFileSelection(file: File) {\n const newArrayFilter = Array.from(this.filesSelected).filter((f) => f !== file)\n this.filesSelected = newArrayFilter as unknown as FileList\n const fileInput = this.el.shadowRoot.getElementById(`single-file-${this.customId}`) as HTMLInputElement\n fileInput.value = ''\n }\n\n private renderFilesUploaded() {\n const fileSizes = this._calculateFileSize(this.filesSelected)\n return fileSizes.map(({ file, size }) => {\n return (\n <div class=\"br-item d-flex\" key={file.name} role=\"listitem\">\n <div class=\"content text-primary-default mr-auto\">{file.name}</div>\n <div class=\"support mr-n2\">\n <span class=\"\">{size}</span>\n <br-button\n shape=\"circle\"\n type=\"button\"\n aria-label={`Remover arquivo ${file.name}`}\n onClick={() => this.handleRemoveFileSelection(file)}\n >\n <br-icon icon-name=\"fa-solid:trash\" aria-hidden=\"true\"></br-icon>\n </br-button>\n </div>\n </div>\n )\n })\n }\n\n private onInputChange(files: FileList) {\n if (files.length === 1) {\n this.filesSelected = files\n } else if (files.length > 0) {\n this.filesSelected = files\n } else {\n console.error(files.length === 0 ? 'NENHUM ARQUIVO ENVIADO' : 'VOCÊ SÓ PODE ENVIAR UM ARQUIVO POR VEZ')\n\n return false\n }\n }\n\n private _calculateFileSize(files: FileList) {\n return Array.from(files).map((file) => {\n let sOutput = ''\n const aMultiples = ['KB', 'MB', 'GB', 'TB']\n let nMultiple = 0\n let nApprox = file.size / 1024\n\n if (nApprox < 1) {\n sOutput = `${file.size} bytes`\n } else {\n while (nApprox > 1 && nMultiple < aMultiples.length) {\n sOutput = `${nApprox.toFixed(2)} ${aMultiples[nMultiple]}`\n nApprox /= 1024\n nMultiple++\n }\n }\n\n return { file: file, size: sOutput || 0 }\n })\n }\n\n private handleDrop(event: DragEvent) {\n event.preventDefault()\n const files = event.dataTransfer?.files\n if (files && files.length > 0) {\n this.onInputChange(files)\n }\n }\n\n private handleDragOver(event: DragEvent) {\n event.preventDefault()\n }\n\n private handleFileSelection() {\n const fileInput = this.el.shadowRoot.getElementById(`single-file-${this.customId}`) as HTMLInputElement\n fileInput.click()\n }\n\n private readonly handleInputChange = (event: Event) => {\n const target = event.target as HTMLInputElement\n this.onInputChange(target.files)\n }\n\n render() {\n return (\n <Host>\n <div class={this.getCssClassMap()} id={this.customId}>\n <label id={`label-${this.customId}`} class=\"upload-label\" htmlFor={`single-file-${this.customId}`}>\n <span>{this.label}</span>\n </label>\n <input\n class=\"upload-input\"\n id={`single-file-${this.customId}`}\n type=\"file\"\n onChange={this.handleInputChange}\n multiple={this.multiple}\n disabled={this.disabled}\n accept={this.accept}\n aria-labelledby={`label-${this.customId}`}\n />\n <button\n class=\"upload-button\"\n type=\"button\"\n disabled={this.disabled}\n onClick={() => this.handleFileSelection()}\n onDrop={(event) => this.handleDrop(event)}\n onDragOver={(event) => this.handleDragOver(event)}\n aria-describedby={`label-${this.customId}`}\n >\n <br-icon icon-name=\"fa-solid:upload\" height=\"16\" aria-hidden=\"true\"></br-icon>\n <slot>\n <span>Selecione o arquivo</span>\n </slot>\n </button>\n {this.filesSelected && (\n <div id={`${this.customId}-list-files`} class=\"upload-list\" role=\"list\">\n {this.renderFilesUploaded()}\n </div>\n )}\n </div>\n </Host>\n )\n }\n}\nlet uploadId = 0\n"]}
|
|
@@ -166,12 +166,13 @@ const g = r(class r extends a {
|
|
|
166
166
|
return o(i, {
|
|
167
167
|
key: "3d8b630477fdf515967af256d99e8f73ac4e89b3"
|
|
168
168
|
}, o("span", {
|
|
169
|
-
key: "
|
|
169
|
+
key: "3e4ee93b9587e90bd4b04e33f04f565129c1fbb5",
|
|
170
170
|
id: this.customId,
|
|
171
171
|
class: this.getCssClassMap(),
|
|
172
|
+
role: "img",
|
|
172
173
|
"aria-label": this.getAriaLabel()
|
|
173
174
|
}, o("span", {
|
|
174
|
-
key: "
|
|
175
|
+
key: "33f6cb765e0b1ec7880085c4f268c94fdc6bb3d5",
|
|
175
176
|
class: this.getContentClasses()
|
|
176
177
|
}, this.renderAvatar())));
|
|
177
178
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["avatarCss","Avatar","__stencil_proxyCustomElement","HTMLElement","constructor","this","density","customId","avatarId","alt","isIconic","disabled","hasError","handleImageError","console","error","src","handleDensityChange","newValue","includes","warn","el","setAttribute","componentWillLoad","setCustomBackgroundColor","componentDidUpdate","getCssClassMap","hasContent","value","trim","length","getContentClasses","text","textBackgroundColor","style","setProperty","getAriaLabel","hostAriaLabel","getAttribute","getIconSize","tokenName","getComputedStyle","getPropertyValue","getIconWidth","baseSize","numericValue","parseInt","replace","renderTextAvatar","toUpperCase","renderImageAvatar","h","loading","onError","renderIconAvatar","height","width","class","renderAvatar","render","Host","key","id"],"sources":["../../packages/webcomponents/src/components/avatar/avatar.scss?tag=br-avatar&encapsulation=shadow","../../packages/webcomponents/src/components/avatar/avatar.tsx"],"sourcesContent":["@import \"~@govbr-ds/core/src/components/avatar/avatar\";\n\n:host {\n display: inline-block;\n --avatar-text-background-color: var(--blue-10);\n}\n\n.br-avatar .content.text-pure-0 {\n background-color: var(--avatar-text-background-color) !important;\n}\n\n.avatar-icon {\n margin-top: 0.39em;\n}\n","import { Component, Element, h, Host, Prop, State, Watch } from '@stencil/core'\n\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * Para uma descrição detalhada, consulte a [documentação do GovBR-DS](https://www.gov.br/ds/components/avatar?tab=designer).\n */\n@Component({\n tag: 'br-avatar',\n styleUrl: 'avatar.scss',\n shadow: true,\n})\nexport class Avatar {\n /**\n * Referência ao elemento host do componente.\n * Utilize esta propriedade para acessar e manipular o elemento do DOM associado ao componente.\n */\n @Element() el: HTMLBrAvatarElement\n\n /**\n * Ajusta a densidade, alterando o espaçamento interno para um visual mais compacto ou mais expandido.\n */\n @Prop({ mutable: true }) density: 'small' | 'medium' | 'large' = 'medium'\n\n /**\n * Identificador único.\n * Caso não seja fornecido, um ID gerado automaticamente será usado.\n */\n @Prop({ reflect: true }) readonly customId: string = `br-avatar-${avatarId++}`\n\n /**\n * URL da imagem a ser exibida no avatar do tipo 'fotográfico'.\n * Deve ser uma URL válida que aponta para a imagem desejada.\n */\n @Prop() readonly src: string\n\n /**\n * Texto alternativo (alt) associado à imagem do avatar. Essencial para acessibilidade.\n * Deve descrever de forma clara e concisa o conteúdo da imagem, por exemplo: \"Foto de perfil de João Silva\".\n */\n @Prop() readonly alt = 'Foto de perfil do usuário'\n\n /**\n * Força a exibição do ícone padrão, sobrescreve outras opções (texto ou imagem).\n * Útil para manter consistência visual ou quando se deseja um avatar neutro independente do conteúdo disponível.\n */\n @Prop() readonly isIconic: boolean = false\n\n /**\n * Conteúdo textual do avatar.\n * Apenas o primeiro caractere será exibido em maiúscula.\n */\n @Prop() readonly text: string\n\n /**\n * Define se o avatar está desabilitado\n */\n @Prop() readonly disabled = false\n\n /**\n * Cor de fundo personalizada para o avatar do tipo texto\n */\n @Prop() readonly textBackgroundColor: string\n\n @State() private hasError = false\n\n /**\n * Observa mudanças na propriedade density para validação e sincronização com atributo DOM.\n * Garante que apenas valores válidos sejam aceitos e atualiza o atributo no elemento host.\n */\n @Watch('density')\n handleDensityChange(newValue: 'small' | 'medium' | 'large') {\n if (!['small', 'medium', 'large'].includes(newValue)) {\n console.warn(`Valor inválido para density: ${newValue}. Usando 'medium'.`)\n this.density = 'medium'\n }\n this.el.setAttribute('density', this.density)\n }\n\n componentWillLoad() {\n this.handleDensityChange(this.density)\n this.setCustomBackgroundColor()\n }\n\n componentDidUpdate() {\n this.setCustomBackgroundColor()\n }\n\n /**\n * Gera um mapa de classes CSS com base nas propriedades do componente.\n * @returns {CssClassMap} Objeto contendo as classes CSS aplicadas.\n */\n private getCssClassMap(): CssClassMap {\n return {\n 'br-avatar': true,\n [this.density]: true,\n error: this.hasError,\n disabled: this.disabled,\n }\n }\n\n /**\n * Verifica se uma string possui conteúdo válido (não vazia após remover espaços em branco).\n * @param value - String a ser verificada\n * @returns {boolean} true se a string possui conteúdo\n */\n private hasContent(value: string): boolean {\n return value?.trim().length > 0\n }\n\n private readonly handleImageError = () => {\n this.hasError = true\n console.error(`Erro ao carregar imagem do avatar: ${this.src}`)\n }\n\n /**\n * Obtém as classes CSS para o elemento content.\n * @returns {string} Classes CSS do content\n */\n private getContentClasses(): string {\n if (this.hasContent(this.text) && !this.isIconic) {\n return 'content text-pure-0'\n }\n return 'content'\n }\n\n /**\n * Define a variável CSS para cor de fundo personalizada para o avatar texto.\n */\n private setCustomBackgroundColor() {\n if (this.hasContent(this.textBackgroundColor)) {\n this.el.style.setProperty('--avatar-text-background-color', this.textBackgroundColor)\n }\n }\n\n /**\n * Gera aria-label apropriado baseado no tipo de avatar\n * Prioriza aria-label do host, senão gera automaticamente\n */\n private getAriaLabel(): string {\n const hostAriaLabel = this.el.getAttribute('aria-label')\n if (this.hasContent(hostAriaLabel)) {\n return hostAriaLabel\n }\n\n if (this.hasContent(this.text) && !this.isIconic) {\n return `Avatar de ${this.text}`\n }\n\n if (this.hasContent(this.src) && !this.hasError) {\n return this.alt\n }\n\n return 'Avatar com ícone padrão de usuário'\n }\n\n /**\n * Obtém o valor do token do DS para altura do ícone\n */\n private getIconSize(): string {\n const tokenName = `--icon-size-${this.density === 'small' ? '2x' : this.density === 'medium' ? '5x' : '8x'}`\n return getComputedStyle(this.el).getPropertyValue(tokenName).trim()\n }\n\n /**\n * Obtém o valor do token do DS para largura do ícone (altura + 8px)\n */\n private getIconWidth(): string {\n const baseSize = this.getIconSize()\n const numericValue = parseInt(baseSize.replace('px', ''))\n return `${numericValue + 8}px`\n }\n\n /**\n * Renderiza o avatar do tipo 'letra/texto'.\n * Exibe a primeira letra do texto em maiúscula.\n */\n private renderTextAvatar() {\n return this.text[0].toUpperCase()\n }\n\n /**\n * Renderiza o avatar do tipo 'fotográfico/imagem'.\n * Exibe uma imagem carregada via URL.\n */\n private renderImageAvatar() {\n return <img src={this.src} alt={this.alt} loading=\"lazy\" onError={this.handleImageError} />\n }\n\n /**\n * Renderiza o avatar do tipo 'icônico'.\n * Exibe um ícone padrão (fa-solid:user) posicionado na base do avatar.\n */\n private renderIconAvatar() {\n return (\n <br-icon\n icon-name=\"fa-solid:user\"\n height={this.getIconSize()}\n width={this.getIconWidth()}\n aria-hidden=\"true\"\n class=\"avatar-icon\"\n ></br-icon>\n )\n }\n\n /**\n * Método principal de renderização do avatar.\n * Prioridade: isIconic > texto > imagem > ícone (padrão)\n */\n private renderAvatar() {\n if (this.isIconic) {\n return this.renderIconAvatar()\n }\n\n if (this.hasContent(this.text)) {\n return this.renderTextAvatar()\n }\n\n if (this.hasContent(this.src) && !this.hasError) {\n return this.renderImageAvatar()\n }\n\n return this.renderIconAvatar()\n }\n\n render() {\n return (\n <Host>\n <span id={this.customId} class={this.getCssClassMap()} aria-label={this.getAriaLabel()}>\n <span class={this.getContentClasses()}>{this.renderAvatar()}</span>\n </span>\n </Host>\n )\n }\n}\n\nlet avatarId = 0\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["avatarCss","Avatar","__stencil_proxyCustomElement","HTMLElement","constructor","this","density","customId","avatarId","alt","isIconic","disabled","hasError","handleImageError","console","error","src","handleDensityChange","newValue","includes","warn","el","setAttribute","componentWillLoad","setCustomBackgroundColor","componentDidUpdate","getCssClassMap","hasContent","value","trim","length","getContentClasses","text","textBackgroundColor","style","setProperty","getAriaLabel","hostAriaLabel","getAttribute","getIconSize","tokenName","getComputedStyle","getPropertyValue","getIconWidth","baseSize","numericValue","parseInt","replace","renderTextAvatar","toUpperCase","renderImageAvatar","h","loading","onError","renderIconAvatar","height","width","class","renderAvatar","render","Host","key","id","role"],"sources":["../../packages/webcomponents/src/components/avatar/avatar.scss?tag=br-avatar&encapsulation=shadow","../../packages/webcomponents/src/components/avatar/avatar.tsx"],"sourcesContent":["@import \"~@govbr-ds/core/src/components/avatar/avatar\";\n\n:host {\n display: inline-block;\n --avatar-text-background-color: var(--blue-10);\n}\n\n.br-avatar .content.text-pure-0 {\n background-color: var(--avatar-text-background-color) !important;\n}\n\n.avatar-icon {\n margin-top: 0.39em;\n}\n","import { Component, Element, h, Host, Prop, State, Watch } from '@stencil/core'\n\nimport { CssClassMap } from '../../utils/interfaces'\n\n/**\n * Para uma descrição detalhada, consulte a [documentação do GovBR-DS](https://www.gov.br/ds/components/avatar?tab=designer).\n */\n@Component({\n tag: 'br-avatar',\n styleUrl: 'avatar.scss',\n shadow: true,\n})\nexport class Avatar {\n /**\n * Referência ao elemento host do componente.\n * Utilize esta propriedade para acessar e manipular o elemento do DOM associado ao componente.\n */\n @Element() el: HTMLBrAvatarElement\n\n /**\n * Ajusta a densidade, alterando o espaçamento interno para um visual mais compacto ou mais expandido.\n */\n @Prop({ mutable: true }) density: 'small' | 'medium' | 'large' = 'medium'\n\n /**\n * Identificador único.\n * Caso não seja fornecido, um ID gerado automaticamente será usado.\n */\n @Prop({ reflect: true }) readonly customId: string = `br-avatar-${avatarId++}`\n\n /**\n * URL da imagem a ser exibida no avatar do tipo 'fotográfico'.\n * Deve ser uma URL válida que aponta para a imagem desejada.\n */\n @Prop() readonly src: string\n\n /**\n * Texto alternativo (alt) associado à imagem do avatar. Essencial para acessibilidade.\n * Deve descrever de forma clara e concisa o conteúdo da imagem, por exemplo: \"Foto de perfil de João Silva\".\n */\n @Prop() readonly alt = 'Foto de perfil do usuário'\n\n /**\n * Força a exibição do ícone padrão, sobrescreve outras opções (texto ou imagem).\n * Útil para manter consistência visual ou quando se deseja um avatar neutro independente do conteúdo disponível.\n */\n @Prop() readonly isIconic: boolean = false\n\n /**\n * Conteúdo textual do avatar.\n * Apenas o primeiro caractere será exibido em maiúscula.\n */\n @Prop() readonly text: string\n\n /**\n * Define se o avatar está desabilitado\n */\n @Prop() readonly disabled = false\n\n /**\n * Cor de fundo personalizada para o avatar do tipo texto\n */\n @Prop() readonly textBackgroundColor: string\n\n @State() private hasError = false\n\n /**\n * Observa mudanças na propriedade density para validação e sincronização com atributo DOM.\n * Garante que apenas valores válidos sejam aceitos e atualiza o atributo no elemento host.\n */\n @Watch('density')\n handleDensityChange(newValue: 'small' | 'medium' | 'large') {\n if (!['small', 'medium', 'large'].includes(newValue)) {\n console.warn(`Valor inválido para density: ${newValue}. Usando 'medium'.`)\n this.density = 'medium'\n }\n this.el.setAttribute('density', this.density)\n }\n\n componentWillLoad() {\n this.handleDensityChange(this.density)\n this.setCustomBackgroundColor()\n }\n\n componentDidUpdate() {\n this.setCustomBackgroundColor()\n }\n\n /**\n * Gera um mapa de classes CSS com base nas propriedades do componente.\n * @returns {CssClassMap} Objeto contendo as classes CSS aplicadas.\n */\n private getCssClassMap(): CssClassMap {\n return {\n 'br-avatar': true,\n [this.density]: true,\n error: this.hasError,\n disabled: this.disabled,\n }\n }\n\n /**\n * Verifica se uma string possui conteúdo válido (não vazia após remover espaços em branco).\n * @param value - String a ser verificada\n * @returns {boolean} true se a string possui conteúdo\n */\n private hasContent(value: string): boolean {\n return value?.trim().length > 0\n }\n\n private readonly handleImageError = () => {\n this.hasError = true\n console.error(`Erro ao carregar imagem do avatar: ${this.src}`)\n }\n\n /**\n * Obtém as classes CSS para o elemento content.\n * @returns {string} Classes CSS do content\n */\n private getContentClasses(): string {\n if (this.hasContent(this.text) && !this.isIconic) {\n return 'content text-pure-0'\n }\n return 'content'\n }\n\n /**\n * Define a variável CSS para cor de fundo personalizada para o avatar texto.\n */\n private setCustomBackgroundColor() {\n if (this.hasContent(this.textBackgroundColor)) {\n this.el.style.setProperty('--avatar-text-background-color', this.textBackgroundColor)\n }\n }\n\n /**\n * Gera aria-label apropriado baseado no tipo de avatar\n * Prioriza aria-label do host, senão gera automaticamente\n */\n private getAriaLabel(): string {\n const hostAriaLabel = this.el.getAttribute('aria-label')\n if (this.hasContent(hostAriaLabel)) {\n return hostAriaLabel\n }\n\n if (this.hasContent(this.text) && !this.isIconic) {\n return `Avatar de ${this.text}`\n }\n\n if (this.hasContent(this.src) && !this.hasError) {\n return this.alt\n }\n\n return 'Avatar com ícone padrão de usuário'\n }\n\n /**\n * Obtém o valor do token do DS para altura do ícone\n */\n private getIconSize(): string {\n const tokenName = `--icon-size-${this.density === 'small' ? '2x' : this.density === 'medium' ? '5x' : '8x'}`\n return getComputedStyle(this.el).getPropertyValue(tokenName).trim()\n }\n\n /**\n * Obtém o valor do token do DS para largura do ícone (altura + 8px)\n */\n private getIconWidth(): string {\n const baseSize = this.getIconSize()\n const numericValue = parseInt(baseSize.replace('px', ''))\n return `${numericValue + 8}px`\n }\n\n /**\n * Renderiza o avatar do tipo 'letra/texto'.\n * Exibe a primeira letra do texto em maiúscula.\n */\n private renderTextAvatar() {\n return this.text[0].toUpperCase()\n }\n\n /**\n * Renderiza o avatar do tipo 'fotográfico/imagem'.\n * Exibe uma imagem carregada via URL.\n */\n private renderImageAvatar() {\n return <img src={this.src} alt={this.alt} loading=\"lazy\" onError={this.handleImageError} />\n }\n\n /**\n * Renderiza o avatar do tipo 'icônico'.\n * Exibe um ícone padrão (fa-solid:user) posicionado na base do avatar.\n */\n private renderIconAvatar() {\n return (\n <br-icon\n icon-name=\"fa-solid:user\"\n height={this.getIconSize()}\n width={this.getIconWidth()}\n aria-hidden=\"true\"\n class=\"avatar-icon\"\n ></br-icon>\n )\n }\n\n /**\n * Método principal de renderização do avatar.\n * Prioridade: isIconic > texto > imagem > ícone (padrão)\n */\n private renderAvatar() {\n if (this.isIconic) {\n return this.renderIconAvatar()\n }\n\n if (this.hasContent(this.text)) {\n return this.renderTextAvatar()\n }\n\n if (this.hasContent(this.src) && !this.hasError) {\n return this.renderImageAvatar()\n }\n\n return this.renderIconAvatar()\n }\n\n render() {\n return (\n <Host>\n <span id={this.customId} class={this.getCssClassMap()} role=\"img\" aria-label={this.getAriaLabel()}>\n <span class={this.getContentClasses()}>{this.renderAvatar()}</span>\n </span>\n </Host>\n )\n }\n}\n\nlet avatarId = 0\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* Construído por SERPRO
|
|
3
3
|
* © https://serpro.gov.br/ - MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { B as s, d as o } from "./p-
|
|
5
|
+
import { B as s, d as o } from "./p-Brhs7qAd.js";
|
|
6
6
|
|
|
7
|
-
const
|
|
7
|
+
const r = s;
|
|
8
8
|
|
|
9
|
-
const
|
|
9
|
+
const t = o;
|
|
10
10
|
|
|
11
|
-
export {
|
|
11
|
+
export { r as BrButton, t as defineCustomElement };
|
|
12
12
|
//# sourceMappingURL=br-button.js.map
|
|
13
13
|
//# sourceMappingURL=br-button.js.map
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* Construído por SERPRO
|
|
3
3
|
* © https://serpro.gov.br/ - MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { I as o, d as s } from "./p-
|
|
5
|
+
import { I as o, d as s } from "./p-Bjt1OWm8.js";
|
|
6
6
|
|
|
7
7
|
const t = o;
|
|
8
8
|
|
|
9
|
-
const
|
|
9
|
+
const m = s;
|
|
10
10
|
|
|
11
|
-
export { t as BrInput,
|
|
11
|
+
export { t as BrInput, m as defineCustomElement };
|
|
12
12
|
//# sourceMappingURL=br-input.js.map
|
|
13
13
|
//# sourceMappingURL=br-input.js.map
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { p as r, H as a, d as o, h as i } from "./p-CTDrYKxV.js";
|
|
6
6
|
|
|
7
|
-
import { d as t } from "./p-
|
|
7
|
+
import { d as t } from "./p-Brhs7qAd.js";
|
|
8
8
|
|
|
9
9
|
import { d as n } from "./p-DvuyuK9Y.js";
|
|
10
10
|
|
|
@@ -12,7 +12,7 @@ import { d as e } from "./p-BUfNFi9N.js";
|
|
|
12
12
|
|
|
13
13
|
import { d as v } from "./p-CYtPDYp6.js";
|
|
14
14
|
|
|
15
|
-
import { d as g } from "./p-
|
|
15
|
+
import { d as g } from "./p-Bjt1OWm8.js";
|
|
16
16
|
|
|
17
17
|
import { d } from "./p-D0wwETCp.js";
|
|
18
18
|
|