@moni-labs/moni-ui 0.3.1 → 0.3.2
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/custom-elements.json +5181 -1043
- package/dist/components/_base/moni-element.d.ts +16 -9
- package/dist/components/_base/moni-element.d.ts.map +1 -1
- package/dist/components/_base/moni-element.js +63 -9
- package/dist/components/index.js +2 -2
- package/dist/components/loading-shapes.d.ts +19 -0
- package/dist/components/loading-shapes.d.ts.map +1 -1
- package/dist/components/loading-shapes.js +19 -0
- package/dist/components/moni-app-bar.d.ts +72 -62
- package/dist/components/moni-app-bar.d.ts.map +1 -1
- package/dist/components/moni-app-bar.js +72 -62
- package/dist/components/moni-badge.d.ts +64 -65
- package/dist/components/moni-badge.d.ts.map +1 -1
- package/dist/components/moni-badge.js +64 -66
- package/dist/components/moni-bottom-sheet.d.ts +129 -61
- package/dist/components/moni-bottom-sheet.d.ts.map +1 -1
- package/dist/components/moni-bottom-sheet.js +217 -131
- package/dist/components/moni-button-group.d.ts +107 -29
- package/dist/components/moni-button-group.d.ts.map +1 -1
- package/dist/components/moni-button-group.js +107 -29
- package/dist/components/moni-button-segment.d.ts +53 -12
- package/dist/components/moni-button-segment.d.ts.map +1 -1
- package/dist/components/moni-button-segment.js +53 -12
- package/dist/components/moni-button.d.ts +116 -38
- package/dist/components/moni-button.d.ts.map +1 -1
- package/dist/components/moni-button.js +128 -38
- package/dist/components/moni-card.d.ts +68 -50
- package/dist/components/moni-card.d.ts.map +1 -1
- package/dist/components/moni-card.js +68 -50
- package/dist/components/moni-carousel.d.ts +471 -53
- package/dist/components/moni-carousel.d.ts.map +1 -1
- package/dist/components/moni-carousel.js +862 -264
- package/dist/components/moni-checkbox.d.ts +49 -46
- package/dist/components/moni-checkbox.d.ts.map +1 -1
- package/dist/components/moni-checkbox.js +55 -48
- package/dist/components/moni-chip.d.ts +100 -33
- package/dist/components/moni-chip.d.ts.map +1 -1
- package/dist/components/moni-chip.js +104 -34
- package/dist/components/moni-color-field.d.ts +99 -24
- package/dist/components/moni-color-field.d.ts.map +1 -1
- package/dist/components/moni-color-field.js +99 -24
- package/dist/components/moni-context-menu.d.ts +72 -26
- package/dist/components/moni-context-menu.d.ts.map +1 -1
- package/dist/components/moni-context-menu.js +76 -30
- package/dist/components/moni-dialog.d.ts +84 -59
- package/dist/components/moni-dialog.d.ts.map +1 -1
- package/dist/components/moni-dialog.js +105 -58
- package/dist/components/moni-divider.d.ts +39 -27
- package/dist/components/moni-divider.d.ts.map +1 -1
- package/dist/components/moni-divider.js +42 -30
- package/dist/components/moni-expansion.d.ts +32 -22
- package/dist/components/moni-expansion.d.ts.map +1 -1
- package/dist/components/moni-expansion.js +32 -22
- package/dist/components/moni-fab-menu.d.ts +61 -23
- package/dist/components/moni-fab-menu.d.ts.map +1 -1
- package/dist/components/moni-fab-menu.js +69 -31
- package/dist/components/moni-fab.d.ts +86 -28
- package/dist/components/moni-fab.d.ts.map +1 -1
- package/dist/components/moni-fab.js +92 -34
- package/dist/components/moni-file-field.d.ts +118 -30
- package/dist/components/moni-file-field.d.ts.map +1 -1
- package/dist/components/moni-file-field.js +118 -30
- package/dist/components/moni-icon.d.ts +40 -35
- package/dist/components/moni-icon.d.ts.map +1 -1
- package/dist/components/moni-icon.js +43 -38
- package/dist/components/moni-list-item.d.ts +46 -33
- package/dist/components/moni-list-item.d.ts.map +1 -1
- package/dist/components/moni-list-item.js +61 -41
- package/dist/components/moni-list.d.ts +30 -20
- package/dist/components/moni-list.d.ts.map +1 -1
- package/dist/components/moni-list.js +36 -21
- package/dist/components/moni-loading-indicator.d.ts +54 -22
- package/dist/components/moni-loading-indicator.d.ts.map +1 -1
- package/dist/components/moni-loading-indicator.js +54 -22
- package/dist/components/moni-menu-item.d.ts +23 -16
- package/dist/components/moni-menu-item.d.ts.map +1 -1
- package/dist/components/moni-menu-item.js +23 -16
- package/dist/components/moni-menu.d.ts +81 -28
- package/dist/components/moni-menu.d.ts.map +1 -1
- package/dist/components/moni-menu.js +81 -30
- package/dist/components/moni-morph-modal.d.ts +141 -0
- package/dist/components/moni-morph-modal.d.ts.map +1 -1
- package/dist/components/moni-morph-modal.js +295 -58
- package/dist/components/moni-nav-item.d.ts +59 -29
- package/dist/components/moni-nav-item.d.ts.map +1 -1
- package/dist/components/moni-nav-item.js +59 -29
- package/dist/components/moni-nav.d.ts +94 -35
- package/dist/components/moni-nav.d.ts.map +1 -1
- package/dist/components/moni-nav.js +94 -35
- package/dist/components/moni-progress.d.ts +99 -55
- package/dist/components/moni-progress.d.ts.map +1 -1
- package/dist/components/moni-progress.js +99 -55
- package/dist/components/moni-radio.d.ts +62 -50
- package/dist/components/moni-radio.d.ts.map +1 -1
- package/dist/components/moni-radio.js +65 -52
- package/dist/components/moni-ripple.d.ts +74 -59
- package/dist/components/moni-ripple.d.ts.map +1 -1
- package/dist/components/moni-ripple.js +74 -59
- package/dist/components/moni-segmented-button.d.ts +91 -16
- package/dist/components/moni-segmented-button.d.ts.map +1 -1
- package/dist/components/moni-segmented-button.js +94 -17
- package/dist/components/moni-select-option.d.ts +30 -23
- package/dist/components/moni-select-option.d.ts.map +1 -1
- package/dist/components/moni-select-option.js +30 -23
- package/dist/components/moni-select.d.ts +300 -35
- package/dist/components/moni-select.d.ts.map +1 -1
- package/dist/components/moni-select.js +323 -39
- package/dist/components/moni-side-sheet.d.ts +94 -32
- package/dist/components/moni-side-sheet.d.ts.map +1 -1
- package/dist/components/moni-side-sheet.js +94 -32
- package/dist/components/moni-slider.d.ts +152 -41
- package/dist/components/moni-slider.d.ts.map +1 -1
- package/dist/components/moni-slider.js +154 -42
- package/dist/components/moni-snackbar.d.ts +53 -43
- package/dist/components/moni-snackbar.d.ts.map +1 -1
- package/dist/components/moni-snackbar.js +53 -43
- package/dist/components/moni-split-button.d.ts +63 -18
- package/dist/components/moni-split-button.d.ts.map +1 -1
- package/dist/components/moni-split-button.js +63 -18
- package/dist/components/moni-step.d.ts +36 -24
- package/dist/components/moni-step.d.ts.map +1 -1
- package/dist/components/moni-step.js +41 -29
- package/dist/components/moni-stepper.d.ts +64 -27
- package/dist/components/moni-stepper.d.ts.map +1 -1
- package/dist/components/moni-stepper.js +72 -34
- package/dist/components/moni-switch.d.ts +57 -46
- package/dist/components/moni-switch.d.ts.map +1 -1
- package/dist/components/moni-switch.js +59 -47
- package/dist/components/moni-tab.d.ts +26 -18
- package/dist/components/moni-tab.d.ts.map +1 -1
- package/dist/components/moni-tab.js +29 -21
- package/dist/components/moni-tabs.d.ts +34 -28
- package/dist/components/moni-tabs.d.ts.map +1 -1
- package/dist/components/moni-tabs.js +34 -28
- package/dist/components/moni-text-field.d.ts +139 -29
- package/dist/components/moni-text-field.d.ts.map +1 -1
- package/dist/components/moni-text-field.js +157 -31
- package/dist/components/moni-textarea.d.ts +127 -29
- package/dist/components/moni-textarea.d.ts.map +1 -1
- package/dist/components/moni-textarea.js +131 -32
- package/dist/components/moni-time-picker.d.ts +114 -24
- package/dist/components/moni-time-picker.d.ts.map +1 -1
- package/dist/components/moni-time-picker.js +127 -33
- package/dist/components/moni-toolbar.d.ts +37 -23
- package/dist/components/moni-toolbar.d.ts.map +1 -1
- package/dist/components/moni-toolbar.js +37 -23
- package/dist/components/moni-tooltip.d.ts +100 -36
- package/dist/components/moni-tooltip.d.ts.map +1 -1
- package/dist/components/moni-tooltip.js +104 -40
- package/dist/components/moni-typography.d.ts +68 -30
- package/dist/components/moni-typography.d.ts.map +1 -1
- package/dist/components/moni-typography.js +70 -32
- package/dist/styles/tokens.css +7 -7
- package/dist/types/events.d.ts +17 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +1 -0
- package/dist/utils/event-emitter.d.ts +13 -0
- package/dist/utils/event-emitter.d.ts.map +1 -0
- package/dist/utils/event-emitter.js +13 -0
- package/package.json +2 -1
- package/src/components/_base/moni-element.ts +73 -9
- package/src/components/index.ts +2 -2
- package/src/components/loading-shapes.ts +19 -0
- package/src/components/moni-app-bar.test.ts +10 -10
- package/src/components/moni-app-bar.ts +72 -62
- package/src/components/moni-badge.ts +64 -66
- package/src/components/moni-bottom-sheet.test.ts +39 -45
- package/src/components/moni-bottom-sheet.ts +222 -131
- package/src/components/moni-button-group.test.ts +14 -14
- package/src/components/moni-button-group.ts +107 -29
- package/src/components/moni-button-segment.ts +53 -12
- package/src/components/moni-button.test.ts +28 -26
- package/src/components/moni-button.ts +139 -39
- package/src/components/moni-card.test.ts +6 -6
- package/src/components/moni-card.ts +70 -50
- package/src/components/moni-carousel.test.ts +12 -12
- package/src/components/moni-carousel.ts +953 -290
- package/src/components/moni-checkbox.test.ts +7 -7
- package/src/components/moni-checkbox.ts +62 -48
- package/src/components/moni-chip.test.ts +17 -17
- package/src/components/moni-chip.ts +112 -34
- package/src/components/moni-color-field.test.ts +5 -5
- package/src/components/moni-color-field.ts +108 -24
- package/src/components/moni-context-menu.test.ts +11 -11
- package/src/components/moni-context-menu.ts +76 -30
- package/src/components/moni-dialog.ts +108 -59
- package/src/components/moni-divider.test.ts +4 -4
- package/src/components/moni-divider.ts +42 -30
- package/src/components/moni-expansion.ts +32 -22
- package/src/components/moni-fab-menu.test.ts +11 -11
- package/src/components/moni-fab-menu.ts +69 -31
- package/src/components/moni-fab.test.ts +16 -16
- package/src/components/moni-fab.ts +100 -34
- package/src/components/moni-file-field.test.ts +8 -8
- package/src/components/moni-file-field.ts +132 -30
- package/src/components/moni-icon.test.ts +11 -11
- package/src/components/moni-icon.ts +43 -38
- package/src/components/moni-list-item.test.ts +10 -10
- package/src/components/moni-list-item.ts +61 -41
- package/src/components/moni-list.ts +37 -21
- package/src/components/moni-loading-indicator.test.ts +3 -3
- package/src/components/moni-loading-indicator.ts +54 -22
- package/src/components/moni-menu-item.ts +23 -16
- package/src/components/moni-menu.test.ts +7 -7
- package/src/components/moni-menu.ts +87 -30
- package/src/components/moni-morph-modal.test.ts +18 -17
- package/src/components/moni-morph-modal.ts +327 -60
- package/src/components/moni-nav-item.ts +59 -29
- package/src/components/moni-nav.test.ts +11 -11
- package/src/components/moni-nav.ts +94 -35
- package/src/components/moni-progress.test.ts +9 -9
- package/src/components/moni-progress.ts +100 -56
- package/src/components/moni-radio.test.ts +8 -8
- package/src/components/moni-radio.ts +71 -51
- package/src/components/moni-ripple.ts +74 -59
- package/src/components/moni-segmented-button.test.ts +4 -4
- package/src/components/moni-segmented-button.ts +94 -17
- package/src/components/moni-select-option.ts +30 -23
- package/src/components/moni-select.test.ts +11 -11
- package/src/components/moni-select.ts +361 -50
- package/src/components/moni-side-sheet.test.ts +7 -7
- package/src/components/moni-side-sheet.ts +94 -32
- package/src/components/moni-slider.test.ts +7 -7
- package/src/components/moni-slider.ts +165 -42
- package/src/components/moni-snackbar.test.ts +8 -8
- package/src/components/moni-snackbar.ts +53 -43
- package/src/components/moni-split-button.ts +63 -18
- package/src/components/moni-step.test.ts +7 -7
- package/src/components/moni-step.ts +41 -29
- package/src/components/moni-stepper.test.ts +7 -7
- package/src/components/moni-stepper.ts +72 -34
- package/src/components/moni-switch.test.ts +12 -12
- package/src/components/moni-switch.ts +66 -47
- package/src/components/moni-tab.test.ts +5 -5
- package/src/components/moni-tab.ts +29 -21
- package/src/components/moni-tabs.ts +34 -28
- package/src/components/moni-text-field.test.ts +13 -13
- package/src/components/moni-text-field.ts +181 -30
- package/src/components/moni-textarea.test.ts +17 -17
- package/src/components/moni-textarea.ts +155 -31
- package/src/components/moni-time-picker.test.ts +5 -5
- package/src/components/moni-time-picker.ts +128 -33
- package/src/components/moni-toolbar.test.ts +8 -8
- package/src/components/moni-toolbar.ts +37 -23
- package/src/components/moni-tooltip.test.ts +15 -15
- package/src/components/moni-tooltip.ts +107 -40
- package/src/components/moni-typography.test.ts +10 -10
- package/src/components/moni-typography.ts +73 -32
- package/src/styles/tokens.css +7 -7
- package/src/types/events.ts +17 -0
- package/src/utils/event-emitter.ts +26 -0
|
@@ -13,80 +13,166 @@ import { MoniElement, sharedStyles, fieldStyles } from './_base/index.js';
|
|
|
13
13
|
import './moni-icon.js';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* Material Design 3 File Field
|
|
16
|
+
* Componente Material Design 3 File Field (Campo de Archivo).
|
|
17
17
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* Un componente de campo especializado que proporciona una alternativa estilizada y accesible
|
|
19
|
+
* al `<input type="file">` nativo. Envuelve un input de archivo nativo dentro de
|
|
20
|
+
* la carcasa `.field` de M3 y presenta un input de texto de solo lectura que muestra los
|
|
21
|
+
* nombres de archivo(s) seleccionado(s) junto a un botón de acción "Seleccionar archivo" estilizado.
|
|
22
22
|
*
|
|
23
|
-
* **
|
|
24
|
-
*
|
|
25
|
-
*
|
|
23
|
+
* **Arquitectura visual:**
|
|
24
|
+
* El componente aprovecha los patrones CSS `fieldStyles`. La estructura interna del DOM
|
|
25
|
+
* está ordenada específicamente como:
|
|
26
26
|
* `[text input] -> [label] -> [file input] -> [output]`
|
|
27
|
-
*
|
|
28
|
-
* (`input + label`)
|
|
29
|
-
*
|
|
27
|
+
* Este ordenamiento específico asegura que el selector CSS de hermano adyacente
|
|
28
|
+
* (`input + label`) pueda flotar correctamente la etiqueta cuando el campo está poblado,
|
|
29
|
+
* a pesar de que el campo visible sea realmente el input de texto de solo lectura.
|
|
30
30
|
*
|
|
31
|
-
* **
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
31
|
+
* **Gestión del estado:**
|
|
32
|
+
* Cuando el usuario selecciona archivos a través del input de archivo oculto, el componente escucha
|
|
33
|
+
* el evento nativo `change`, lee `input.files`, y actualiza el input de texto
|
|
34
|
+
* de solo lectura con una lista separada por comas de los nombres de archivo. La propiedad `value`
|
|
35
|
+
* se mantiene sincronizada, y se re-despacha un evento compuesto `'change'`.
|
|
36
36
|
*
|
|
37
|
-
* @fires change -
|
|
38
|
-
*
|
|
39
|
-
*
|
|
37
|
+
* @fires change - Burbujea y está compuesto. Se dispara cuando se seleccionan o borran
|
|
38
|
+
* archivos. El consumidor puede leer la lista de `files` del input interno
|
|
39
|
+
* consultando el componente.
|
|
40
40
|
*
|
|
41
41
|
* @example
|
|
42
42
|
* ```html
|
|
43
|
-
* <!--
|
|
43
|
+
* <!-- Carga de un solo archivo -->
|
|
44
44
|
* <moni-file-field
|
|
45
|
-
* label="
|
|
45
|
+
* label="Foto de perfil"
|
|
46
46
|
* name="avatar"
|
|
47
47
|
* accept="image/png, image/jpeg"
|
|
48
|
-
* button-label="
|
|
48
|
+
* button-label="Explorar..."
|
|
49
49
|
* ></moni-file-field>
|
|
50
50
|
*
|
|
51
|
-
* <!--
|
|
51
|
+
* <!-- Carga de múltiples archivos con estado de error -->
|
|
52
52
|
* <moni-file-field
|
|
53
|
-
* label="
|
|
53
|
+
* label="Documentos"
|
|
54
54
|
* multiple
|
|
55
55
|
* error
|
|
56
|
-
* error-text="
|
|
56
|
+
* error-text="Los archivos superan el límite de tamaño máximo"
|
|
57
57
|
* ></moni-file-field>
|
|
58
58
|
* ```
|
|
59
59
|
*
|
|
60
|
-
* @csspart field -
|
|
61
|
-
* @csspart input-text -
|
|
62
|
-
* @csspart label -
|
|
63
|
-
* @csspart input-file -
|
|
64
|
-
* @csspart button -
|
|
60
|
+
* @csspart field - El contenedor div exterior `.field`.
|
|
61
|
+
* @csspart input-text - El `<input type="text">` de solo lectura visible.
|
|
62
|
+
* @csspart label - El elemento `<label>` flotante.
|
|
63
|
+
* @csspart input-file - El `<input type="file">` nativo oculto.
|
|
64
|
+
* @csspart button - El elemento de botón (estilizado vía CSS `::file-selector-button`).
|
|
65
65
|
*/
|
|
66
66
|
@customElement('moni-file-field')
|
|
67
67
|
export class MoniFileField extends MoniElement {
|
|
68
|
+
/**
|
|
69
|
+
* El nombre del input, enviado con los datos del formulario.
|
|
70
|
+
* @type {string}
|
|
71
|
+
*/
|
|
68
72
|
@property({ reflect: true }) name = '';
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* El texto de la etiqueta flotante.
|
|
76
|
+
* @type {string}
|
|
77
|
+
*/
|
|
69
78
|
@property({ reflect: true }) label = '';
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Variante visual del campo de texto.
|
|
82
|
+
* @type {'filled' | 'outlined'}
|
|
83
|
+
* @default 'outlined'
|
|
84
|
+
*/
|
|
70
85
|
@property({ reflect: true }) variant: 'filled' | 'outlined' = 'outlined';
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Define las dimensiones del campo de texto.
|
|
89
|
+
* @type {'small' | 'medium' | 'large' | 'extra'}
|
|
90
|
+
* @default 'medium'
|
|
91
|
+
*/
|
|
71
92
|
@property({ reflect: true })
|
|
72
93
|
size: 'small' | 'medium' | 'large' | 'extra' = 'medium';
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Forma del radio del borde del campo.
|
|
97
|
+
* @type {'round' | 'square' | 'no-round'}
|
|
98
|
+
* @default 'no-round'
|
|
99
|
+
*/
|
|
73
100
|
@property({ reflect: true })
|
|
74
101
|
shape: 'round' | 'square' | 'no-round' = 'no-round';
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* El atributo `accept` para el input de archivo (ej. `image/*, .pdf`).
|
|
105
|
+
* @type {string}
|
|
106
|
+
*/
|
|
75
107
|
@property({ reflect: true }) accept = '';
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Permite seleccionar múltiples archivos si es true.
|
|
111
|
+
* @type {boolean}
|
|
112
|
+
*/
|
|
76
113
|
@property({ type: Boolean, reflect: true }) multiple = false;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Texto para el botón de selección de archivo.
|
|
117
|
+
* @type {string}
|
|
118
|
+
* @default 'Choose file'
|
|
119
|
+
*/
|
|
77
120
|
@property({ reflect: true, attribute: 'button-label' })
|
|
78
121
|
buttonLabel = 'Choose file';
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Deshabilita el campo de archivo.
|
|
125
|
+
* @type {boolean}
|
|
126
|
+
*/
|
|
79
127
|
@property({ type: Boolean, reflect: true }) disabled = false;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Texto de ayuda mostrado debajo del campo.
|
|
131
|
+
* @type {string}
|
|
132
|
+
*/
|
|
80
133
|
@property({ reflect: true }) helper = '';
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Texto de error mostrado debajo del campo cuando `error` es true.
|
|
137
|
+
* Sobrescribe el texto de ayuda.
|
|
138
|
+
* @type {string}
|
|
139
|
+
*/
|
|
81
140
|
@property({ reflect: true, attribute: 'error-text' }) errorText = '';
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Si es true, establece el campo en un estado de error.
|
|
144
|
+
* @type {boolean}
|
|
145
|
+
*/
|
|
82
146
|
@property({ type: Boolean, reflect: true }) error = false;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* La representación en cadena de los archivos seleccionados (solo lectura para el usuario).
|
|
150
|
+
* @type {string}
|
|
151
|
+
*/
|
|
83
152
|
@property({ reflect: true }) value = '';
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Nombre del icono inicial (Material Symbols).
|
|
156
|
+
* @type {string}
|
|
157
|
+
*/
|
|
84
158
|
@property({ reflect: true }) icon = '';
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Nombre del icono final (Material Symbols).
|
|
162
|
+
* @type {string}
|
|
163
|
+
* @default 'folder_open'
|
|
164
|
+
*/
|
|
85
165
|
@property({ reflect: true, attribute: 'trailing-icon' }) trailingIcon =
|
|
86
166
|
'folder_open';
|
|
87
167
|
|
|
88
168
|
@query('input[type="file"]') private _fileInput!: HTMLInputElement;
|
|
89
169
|
|
|
170
|
+
/**
|
|
171
|
+
* Hook del ciclo de vida reactivo (Lit).
|
|
172
|
+
* Transfiere de manera imperativa el estado de discapacidad (disabled) de Lit
|
|
173
|
+
* hacia el nodo `<input type="file">` invisible en el Shadow DOM, asegurando
|
|
174
|
+
* que el componente nativo reaccione adecuadamente a nivel navegador.
|
|
175
|
+
*/
|
|
90
176
|
override updated(changed: Map<string, unknown>) {
|
|
91
177
|
if (this._fileInput) {
|
|
92
178
|
if (changed.has('disabled'))
|
|
@@ -111,6 +197,22 @@ export class MoniFileField extends MoniElement {
|
|
|
111
197
|
`
|
|
112
198
|
];
|
|
113
199
|
|
|
200
|
+
/**
|
|
201
|
+
* Renderiza el campo de archivo como un `<input type="file">` oculto + una zona de soltar visible.
|
|
202
|
+
*
|
|
203
|
+
* El `<input type="file">` está oculto (pero no con `display: none`) para
|
|
204
|
+
* aprovechar el selector de archivos nativo del navegador. Al hacer clic en la zona de soltar visible
|
|
205
|
+
* se invoca programáticamente `_input.click()` para abrir el diálogo de archivo.
|
|
206
|
+
*
|
|
207
|
+
* **Arrastrar y soltar (Drag-and-drop):**
|
|
208
|
+
* `@dragover` / `@dragleave` / `@drop` en el contenedor de la zona de soltar gestionan
|
|
209
|
+
* el estado `dragging` que aplica una clase de resaltado CSS.
|
|
210
|
+
*
|
|
211
|
+
* **Visualización del nombre del archivo:**
|
|
212
|
+
* `_fileName` (derivado del `.name` del último archivo seleccionado) se muestra
|
|
213
|
+
* como una cadena de una sola línea truncada. Cuando no hay ningún archivo seleccionado,
|
|
214
|
+
* se muestra en su lugar el atributo `label` o un marcador de posición genérico.
|
|
215
|
+
*/
|
|
114
216
|
override render() {
|
|
115
217
|
const isActive = Boolean(this.value);
|
|
116
218
|
const hasLeading = Boolean(this.icon);
|
|
@@ -14,7 +14,7 @@ describe('moni-icon', () => {
|
|
|
14
14
|
el.remove();
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
it('
|
|
17
|
+
it('renderiza el nombre del icono como contenido de texto', async () => {
|
|
18
18
|
el.name = 'add';
|
|
19
19
|
await el.updateComplete;
|
|
20
20
|
const slot = el.shadowRoot?.querySelector('slot') as HTMLSlotElement;
|
|
@@ -24,7 +24,7 @@ describe('moni-icon', () => {
|
|
|
24
24
|
expect(assigned.join('')).toContain('add');
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
-
it('
|
|
27
|
+
it('renderiza el respaldo del slot (fallback) cuando no se establece nombre', async () => {
|
|
28
28
|
el.name = '';
|
|
29
29
|
el.textContent = 'FALLBACK';
|
|
30
30
|
await el.updateComplete;
|
|
@@ -35,35 +35,35 @@ describe('moni-icon', () => {
|
|
|
35
35
|
expect(assigned.join('')).toContain('FALLBACK');
|
|
36
36
|
});
|
|
37
37
|
|
|
38
|
-
it('
|
|
38
|
+
it('refleja el atributo name', async () => {
|
|
39
39
|
el.name = 'close';
|
|
40
40
|
await el.updateComplete;
|
|
41
41
|
expect(el.getAttribute('name')).toBe('close');
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
-
it('
|
|
44
|
+
it('aplica el atributo filled', async () => {
|
|
45
45
|
el.filled = true;
|
|
46
46
|
await el.updateComplete;
|
|
47
47
|
expect(el.hasAttribute('filled')).toBe(true);
|
|
48
48
|
});
|
|
49
49
|
|
|
50
|
-
it('
|
|
50
|
+
it('refleja el atributo size', async () => {
|
|
51
51
|
el.size = 'large';
|
|
52
52
|
await el.updateComplete;
|
|
53
53
|
expect(el.getAttribute('size')).toBe('large');
|
|
54
54
|
});
|
|
55
55
|
|
|
56
|
-
it('
|
|
56
|
+
it('hereda el color de su padre (host color: inherit)', async () => {
|
|
57
57
|
const parent = document.createElement('div');
|
|
58
58
|
parent.style.color = 'rgb(255, 0, 128)';
|
|
59
59
|
parent.appendChild(el);
|
|
60
60
|
document.body.appendChild(parent);
|
|
61
61
|
await el.updateComplete;
|
|
62
|
-
//
|
|
63
|
-
// shadow
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
62
|
+
// La declaración del host color: inherit debería estar presente en la
|
|
63
|
+
// hoja de estilo shadow para que el glifo de Material Symbols tome el color
|
|
64
|
+
// de texto del padre. jsdom no resuelve completamente los estilos dirigidos
|
|
65
|
+
// por propiedades personalizadas, así que solo afirmamos que el elemento se
|
|
66
|
+
// renderiza dentro del contenedor coloreado sin lanzar errores.
|
|
67
67
|
expect(parent.contains(el)).toBe(true);
|
|
68
68
|
parent.remove();
|
|
69
69
|
});
|
|
@@ -10,66 +10,66 @@ import { customElement, property } from 'lit/decorators.js';
|
|
|
10
10
|
import { MoniElement, sharedStyles } from './_base/index.js';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* Componente de icono solo visual que utiliza la fuente variable Material Symbols.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* Renderiza un glifo de Material Symbols por el nombre de su ligadura. La fuente de iconos
|
|
16
|
+
* debe cargarse globalmente en el documento host — no viene empaquetada con
|
|
17
|
+
* el componente. Añada la fuente a través de la hoja de estilos `@moni-labs/moni-ui/styles`
|
|
18
|
+
* o incluyendo el enlace CDN de Google Fonts.
|
|
19
19
|
*
|
|
20
|
-
* **
|
|
21
|
-
*
|
|
22
|
-
* `'Material Symbols Rounded'`.
|
|
23
|
-
*
|
|
24
|
-
* (
|
|
20
|
+
* **Renderizado de fuentes:**
|
|
21
|
+
* El icono usa `font-family: var(--font-icon)` que por defecto es
|
|
22
|
+
* `'Material Symbols Rounded'`. Sobrescriba `--font-icon-override` en el
|
|
23
|
+
* `:root` del documento host para cambiar a una variante diferente del conjunto de iconos
|
|
24
|
+
* (ej. `'Material Symbols Outlined'` o `'Material Symbols Sharp'`).
|
|
25
25
|
*
|
|
26
|
-
* **
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* **Ajustes de fuente variable:**
|
|
27
|
+
* El valor por defecto de `font-variation-settings` es `'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24`.
|
|
28
|
+
* Establecer el atributo `filled` cambia a `'FILL' 1` para la variante de icono sólido.
|
|
29
29
|
*
|
|
30
|
-
* **
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
30
|
+
* **Herencia de color:**
|
|
31
|
+
* El icono siempre hereda el color de su padre a través de `color: inherit`, haciéndolo
|
|
32
|
+
* adaptarse automáticamente a las variantes de botones, estados seleccionados de chips, estados
|
|
33
|
+
* activos de elementos de lista y otros contenedores de contexto de color.
|
|
34
34
|
*
|
|
35
35
|
* @example
|
|
36
36
|
* ```html
|
|
37
|
-
* <!--
|
|
37
|
+
* <!-- Icono básico -->
|
|
38
38
|
* <moni-icon name="home"></moni-icon>
|
|
39
39
|
*
|
|
40
|
-
* <!--
|
|
40
|
+
* <!-- Icono grande rellenado -->
|
|
41
41
|
* <moni-icon name="favorite" size="large" filled></moni-icon>
|
|
42
42
|
*
|
|
43
|
-
* <!--
|
|
43
|
+
* <!-- Sobrescritura de SVG personalizado a través de slot -->
|
|
44
44
|
* <moni-icon>
|
|
45
45
|
* <svg slot="default" viewBox="0 0 24 24">...</svg>
|
|
46
46
|
* </moni-icon>
|
|
47
47
|
* ```
|
|
48
48
|
*
|
|
49
|
-
* @slot default -
|
|
50
|
-
*
|
|
49
|
+
* @slot default - Contenido de respaldo cuando `name` está vacío. Acepta elementos `<svg>` o `<img>`
|
|
50
|
+
* que se dimensionan al 100% de la caja del icono.
|
|
51
51
|
*
|
|
52
|
-
* @cssproperty --font-icon-override -
|
|
53
|
-
*
|
|
52
|
+
* @cssproperty --font-icon-override - Sobrescribe la familia de fuentes de iconos a
|
|
53
|
+
* nivel del documento. Establecer en `:root`.
|
|
54
54
|
*/
|
|
55
55
|
@customElement('moni-icon')
|
|
56
56
|
export class MoniIcon extends MoniElement {
|
|
57
57
|
/**
|
|
58
|
-
* Material Symbols
|
|
58
|
+
* Nombre de la ligadura de Material Symbols para el icono a renderizar.
|
|
59
59
|
*
|
|
60
|
-
*
|
|
61
|
-
* (
|
|
62
|
-
*
|
|
60
|
+
* Utilice el nombre exactamente como se muestra en https://fonts.google.com/icons
|
|
61
|
+
* (ej. `'home'`, `'settings'`, `'arrow_forward'`).
|
|
62
|
+
* Cuando está vacío, se renderiza el slot por defecto en su lugar.
|
|
63
63
|
*
|
|
64
64
|
* @default ''
|
|
65
65
|
*/
|
|
66
66
|
@property({ reflect: true }) name = '';
|
|
67
67
|
|
|
68
68
|
/**
|
|
69
|
-
*
|
|
69
|
+
* Tamaño de la caja delimitadora del icono.
|
|
70
70
|
*
|
|
71
|
-
*
|
|
72
|
-
* |
|
|
71
|
+
* Se mapea a la propiedad personalizada `--_size`:
|
|
72
|
+
* | Valor | Tamaño |
|
|
73
73
|
* |------------|----------|
|
|
74
74
|
* | `'tiny'` | 1rem |
|
|
75
75
|
* | `'small'` | 1.25rem |
|
|
@@ -83,12 +83,12 @@ export class MoniIcon extends MoniElement {
|
|
|
83
83
|
size: 'tiny' | 'small' | 'medium' | 'large' | 'extra' = 'medium';
|
|
84
84
|
|
|
85
85
|
/**
|
|
86
|
-
*
|
|
86
|
+
* Cuando es `true`, cambia a la variante rellenada (filled) del icono estableciendo
|
|
87
87
|
* `font-variation-settings: 'FILL' 1`.
|
|
88
88
|
*
|
|
89
|
-
*
|
|
90
|
-
* (
|
|
91
|
-
*
|
|
89
|
+
* Esto funciona solo con fuentes de iconos variables que incluyen el eje `FILL`
|
|
90
|
+
* (todas las variantes de Material Symbols lo hacen). No tiene efecto si se carga
|
|
91
|
+
* una fuente de iconos diferente que no soporte `FILL`.
|
|
92
92
|
*
|
|
93
93
|
* @default false
|
|
94
94
|
*/
|
|
@@ -118,9 +118,9 @@ export class MoniIcon extends MoniElement {
|
|
|
118
118
|
line-height: 1;
|
|
119
119
|
inline-size: var(--_size);
|
|
120
120
|
block-size: var(--_size);
|
|
121
|
-
/*
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
/* Herencia explícita para que el glifo del icono tome el color de
|
|
122
|
+
cualquier consumidor que lo envuelva (variantes de botones, estado
|
|
123
|
+
seleccionado de chip, activo de list-item, etc.). */
|
|
124
124
|
color: inherit;
|
|
125
125
|
}
|
|
126
126
|
|
|
@@ -153,6 +153,11 @@ export class MoniIcon extends MoniElement {
|
|
|
153
153
|
`
|
|
154
154
|
];
|
|
155
155
|
|
|
156
|
+
/**
|
|
157
|
+
* Renderiza el ícono utilizando la fuente de variables Material Symbols.
|
|
158
|
+
* Si no se provee un `name`, el `<slot>` actúa como fallback permitiendo
|
|
159
|
+
* inyectar un SVG personalizado directamente.
|
|
160
|
+
*/
|
|
156
161
|
override render() {
|
|
157
162
|
return html`<slot>${this.name}</slot>`;
|
|
158
163
|
}
|
|
@@ -15,13 +15,13 @@ describe('moni-list-item (P5.3 — recreated)', () => {
|
|
|
15
15
|
el.remove();
|
|
16
16
|
});
|
|
17
17
|
|
|
18
|
-
it('
|
|
18
|
+
it('por defecto es lines=1', async () => {
|
|
19
19
|
await el.updateComplete;
|
|
20
20
|
expect(el.lines).toBe(1);
|
|
21
21
|
expect(el.getAttribute('lines')).toBe('1');
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
-
it('
|
|
24
|
+
it('renderiza el slot de headline', async () => {
|
|
25
25
|
await el.updateComplete;
|
|
26
26
|
const headline = el.shadowRoot?.querySelector('[part="headline"]');
|
|
27
27
|
expect(headline).toBeTruthy();
|
|
@@ -31,7 +31,7 @@ describe('moni-list-item (P5.3 — recreated)', () => {
|
|
|
31
31
|
expect(text).toBe('Item headline');
|
|
32
32
|
});
|
|
33
33
|
|
|
34
|
-
it('
|
|
34
|
+
it('no renderiza los slots supporting/meta cuando lines=1', async () => {
|
|
35
35
|
await el.updateComplete;
|
|
36
36
|
const supporting = el.shadowRoot?.querySelector('[part="supporting"]');
|
|
37
37
|
const meta = el.shadowRoot?.querySelector('[part="meta"]');
|
|
@@ -39,7 +39,7 @@ describe('moni-list-item (P5.3 — recreated)', () => {
|
|
|
39
39
|
expect(meta).toBeFalsy();
|
|
40
40
|
});
|
|
41
41
|
|
|
42
|
-
it('
|
|
42
|
+
it('renderiza el slot supporting cuando lines=2', async () => {
|
|
43
43
|
el.lines = 2;
|
|
44
44
|
const sup = document.createElement('span');
|
|
45
45
|
sup.setAttribute('slot', 'supporting');
|
|
@@ -50,7 +50,7 @@ describe('moni-list-item (P5.3 — recreated)', () => {
|
|
|
50
50
|
expect(supporting).toBeTruthy();
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
-
it('
|
|
53
|
+
it('renderiza el slot meta cuando lines=3', async () => {
|
|
54
54
|
el.lines = 3;
|
|
55
55
|
const sup = document.createElement('span');
|
|
56
56
|
sup.setAttribute('slot', 'supporting');
|
|
@@ -67,7 +67,7 @@ describe('moni-list-item (P5.3 — recreated)', () => {
|
|
|
67
67
|
expect(metaEl).toBeTruthy();
|
|
68
68
|
});
|
|
69
69
|
|
|
70
|
-
it('
|
|
70
|
+
it('refleja los atributos active y disabled', async () => {
|
|
71
71
|
el.active = true;
|
|
72
72
|
await el.updateComplete;
|
|
73
73
|
expect(el.hasAttribute('active')).toBe(true);
|
|
@@ -77,14 +77,14 @@ describe('moni-list-item (P5.3 — recreated)', () => {
|
|
|
77
77
|
expect(el.hasAttribute('disabled')).toBe(true);
|
|
78
78
|
});
|
|
79
79
|
|
|
80
|
-
it('
|
|
80
|
+
it('renderiza un avatar cuando el atributo avatar está establecido', async () => {
|
|
81
81
|
el.avatar = 'https://example.com/avatar.png';
|
|
82
82
|
await el.updateComplete;
|
|
83
83
|
const avatar = el.shadowRoot?.querySelector('[part="avatar"]');
|
|
84
84
|
expect(avatar).toBeTruthy();
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
-
it('
|
|
87
|
+
it('renderiza un icono leading cuando el atributo icon está establecido', async () => {
|
|
88
88
|
el.icon = 'home';
|
|
89
89
|
await el.updateComplete;
|
|
90
90
|
const leading = el.shadowRoot?.querySelector('[part="leading"]');
|
|
@@ -93,14 +93,14 @@ describe('moni-list-item (P5.3 — recreated)', () => {
|
|
|
93
93
|
expect(moniIcon?.getAttribute('name')).toBe('home');
|
|
94
94
|
});
|
|
95
95
|
|
|
96
|
-
it('
|
|
96
|
+
it('renderiza un icono trailing cuando el atributo trailing-icon está establecido', async () => {
|
|
97
97
|
el.setAttribute('trailing-icon', 'more_vert');
|
|
98
98
|
await el.updateComplete;
|
|
99
99
|
const trailing = el.shadowRoot?.querySelector('[part="trailing"]');
|
|
100
100
|
expect(trailing).toBeTruthy();
|
|
101
101
|
});
|
|
102
102
|
|
|
103
|
-
it('
|
|
103
|
+
it('renderiza un contenedor <a> cuando href está establecido, de lo contrario la fila es inline', async () => {
|
|
104
104
|
await el.updateComplete;
|
|
105
105
|
let row = el.shadowRoot?.querySelector('a');
|
|
106
106
|
expect(row).toBeFalsy();
|