@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
|
@@ -11,60 +11,60 @@ import { MoniElement, sharedStyles } from './_base/index.js';
|
|
|
11
11
|
import './moni-icon.js';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* Material Design 3 List Item
|
|
14
|
+
* Componente Material Design 3 List Item (Elemento de Lista).
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* Una sola fila dentro de un `<moni-list>`. Los elementos de lista muestran un titular y
|
|
17
|
+
* opcionalmente texto de soporte, metadatos, iconos o avatares.
|
|
18
18
|
*
|
|
19
|
-
* **
|
|
19
|
+
* **Referencia de la especificación M3:** `m3-docs/components/lists/specs.md`
|
|
20
20
|
*
|
|
21
|
-
* **
|
|
22
|
-
*
|
|
23
|
-
* - `lines="1"` (
|
|
24
|
-
* - `lines="2"` —
|
|
25
|
-
* - `lines="3"` —
|
|
21
|
+
* **Configuraciones de línea:**
|
|
22
|
+
* El atributo `lines` configura el diseño y la altura mínima del elemento:
|
|
23
|
+
* - `lines="1"` (por defecto) — altura mínima de 56dp. Solo se muestra el slot del titular.
|
|
24
|
+
* - `lines="2"` — altura mínima de 72dp. Muestra el titular y el texto de soporte.
|
|
25
|
+
* - `lines="3"` — altura mínima de 88dp. Muestra el titular, el texto de soporte y el texto meta.
|
|
26
26
|
*
|
|
27
|
-
* **
|
|
28
|
-
*
|
|
29
|
-
* (hover, focus
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
27
|
+
* **Comportamiento interactivo:**
|
|
28
|
+
* Por defecto, los elementos se renderizan como elementos `<button>`, adquiriendo la capa de estado de M3
|
|
29
|
+
* (efectos de ondulación de hover, focus y press).
|
|
30
|
+
* Si se proporciona el atributo `href`, el elemento se renderiza internamente como un elemento `<a>`,
|
|
31
|
+
* permitiendo enrutamiento de enlaces nativos e interacciones mientras se preserva el
|
|
32
|
+
* estilo del elemento de lista.
|
|
33
33
|
*
|
|
34
|
-
* **
|
|
35
|
-
* - `icon` (
|
|
36
|
-
* - `avatar` (
|
|
37
|
-
* - `trailing-icon` (
|
|
34
|
+
* **Elementos visuales:**
|
|
35
|
+
* - `icon` (atributo) — Nombre de Material Symbol para el icono inicial (24dp).
|
|
36
|
+
* - `avatar` (atributo) — URL para una imagen circular inicial (40dp).
|
|
37
|
+
* - `trailing-icon` (atributo) — Nombre de Material Symbol para el icono final.
|
|
38
38
|
*
|
|
39
39
|
* @example
|
|
40
40
|
* ```html
|
|
41
|
-
* <!-- 1
|
|
41
|
+
* <!-- Elemento de 1 línea con icono -->
|
|
42
42
|
* <moni-list-item icon="inbox">
|
|
43
|
-
*
|
|
43
|
+
* Bandeja de entrada
|
|
44
44
|
* </moni-list-item>
|
|
45
45
|
*
|
|
46
|
-
* <!-- 2
|
|
46
|
+
* <!-- Elemento de 2 líneas con avatar y meta final -->
|
|
47
47
|
* <moni-list-item lines="2" avatar="/user.jpg">
|
|
48
48
|
* Ali Connors
|
|
49
|
-
* <span slot="supporting"
|
|
49
|
+
* <span slot="supporting">¿Brunch este fin de semana?</span>
|
|
50
50
|
* <span slot="trailing-meta">10 min</span>
|
|
51
51
|
* </moni-list-item>
|
|
52
52
|
*
|
|
53
|
-
* <!--
|
|
53
|
+
* <!-- Elemento de enlace -->
|
|
54
54
|
* <moni-list-item href="/settings" icon="settings">
|
|
55
|
-
*
|
|
55
|
+
* Ajustes
|
|
56
56
|
* </moni-list-item>
|
|
57
57
|
* ```
|
|
58
58
|
*
|
|
59
|
-
* @slot default -
|
|
60
|
-
* @slot supporting -
|
|
61
|
-
* @slot meta -
|
|
62
|
-
* @slot trailing-meta -
|
|
59
|
+
* @slot default - Texto del titular (Línea 1).
|
|
60
|
+
* @slot supporting - Texto de soporte (Línea 2, requiere `lines>=2`).
|
|
61
|
+
* @slot meta - Texto meta adicional (Línea 3, requiere `lines=3`).
|
|
62
|
+
* @slot trailing-meta - Texto pequeño mostrado en el borde derecho lejano.
|
|
63
63
|
*
|
|
64
|
-
* @csspart item -
|
|
65
|
-
* @csspart leading-icon -
|
|
66
|
-
* @csspart text -
|
|
67
|
-
* @csspart trailing-icon -
|
|
64
|
+
* @csspart item - El contenedor externo `<button>` o `<a>`.
|
|
65
|
+
* @csspart leading-icon - Contenedor para el icono/avatar inicial.
|
|
66
|
+
* @csspart text - Contenedor para el bloque de texto multilínea.
|
|
67
|
+
* @csspart trailing-icon - Contenedor para el icono final.
|
|
68
68
|
*/
|
|
69
69
|
@customElement('moni-list-item')
|
|
70
70
|
export class MoniListItem extends MoniElement {
|
|
@@ -82,18 +82,25 @@ export class MoniListItem extends MoniElement {
|
|
|
82
82
|
sharedStyles,
|
|
83
83
|
css`
|
|
84
84
|
:host {
|
|
85
|
+
display: block;
|
|
86
|
+
color: var(--on-surface);
|
|
87
|
+
background-color: transparent;
|
|
88
|
+
position: relative;
|
|
89
|
+
font-family: var(--font);
|
|
90
|
+
transition: background-color var(--speed2);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.row {
|
|
85
94
|
display: flex;
|
|
86
95
|
align-items: center;
|
|
87
96
|
gap: 1rem;
|
|
88
97
|
padding: 0.5rem 1rem;
|
|
89
98
|
min-block-size: 3.5rem;
|
|
90
|
-
|
|
91
|
-
|
|
99
|
+
box-sizing: border-box;
|
|
100
|
+
color: inherit;
|
|
92
101
|
text-decoration: none;
|
|
93
102
|
cursor: pointer;
|
|
94
|
-
|
|
95
|
-
font-family: var(--font);
|
|
96
|
-
transition: background-color var(--speed2);
|
|
103
|
+
width: 100%;
|
|
97
104
|
}
|
|
98
105
|
|
|
99
106
|
:host([active]) {
|
|
@@ -111,10 +118,10 @@ export class MoniListItem extends MoniElement {
|
|
|
111
118
|
border-block-end: 0.0625rem solid var(--outline-variant);
|
|
112
119
|
}
|
|
113
120
|
|
|
114
|
-
:host([lines='2']) {
|
|
121
|
+
:host([lines='2']) .row {
|
|
115
122
|
min-block-size: 4.5rem;
|
|
116
123
|
}
|
|
117
|
-
:host([lines='3']) {
|
|
124
|
+
:host([lines='3']) .row {
|
|
118
125
|
min-block-size: 5.5rem;
|
|
119
126
|
}
|
|
120
127
|
|
|
@@ -196,6 +203,19 @@ export class MoniListItem extends MoniElement {
|
|
|
196
203
|
`
|
|
197
204
|
];
|
|
198
205
|
|
|
206
|
+
/**
|
|
207
|
+
* Renderiza el diseño de 3 zonas del elemento de lista: medios iniciales, contenido y elemento final.
|
|
208
|
+
*
|
|
209
|
+
* **Anatomía del elemento de lista M3:**
|
|
210
|
+
* - Zona inicial: avatar, icono o miniatura (`[slot="leading"]`).
|
|
211
|
+
* - Zona de contenido: `overline` opcional (etiqueta pequeña en mayúsculas), `title` (texto primario),
|
|
212
|
+
* y `description` (texto secundario/de soporte). Cada uno se renderiza condicionalmente
|
|
213
|
+
* solo cuando el atributo correspondiente no está vacío para evitar nodos DOM vacíos.
|
|
214
|
+
* - Zona final: metadatos, botón de icono, o radio/checkbox (`[slot="trailing"]`).
|
|
215
|
+
*
|
|
216
|
+
* Un `<slot>` vacío se renderiza en la zona de contenido como respaldo para que los consumidores
|
|
217
|
+
* puedan proyectar texto sin formato o marcado complejo directamente en el elemento.
|
|
218
|
+
*/
|
|
199
219
|
override render() {
|
|
200
220
|
const leading = this.avatar
|
|
201
221
|
? html`<span
|
|
@@ -241,7 +261,7 @@ export class MoniListItem extends MoniElement {
|
|
|
241
261
|
href=${this.href}
|
|
242
262
|
>${inner}</a
|
|
243
263
|
>`
|
|
244
|
-
: inner
|
|
264
|
+
: html`<div class="row" part="row">${inner}</div>`;
|
|
245
265
|
}
|
|
246
266
|
}
|
|
247
267
|
|
|
@@ -8,42 +8,43 @@
|
|
|
8
8
|
import { html, css } from 'lit';
|
|
9
9
|
import { customElement, property } from 'lit/decorators.js';
|
|
10
10
|
import { MoniElement, sharedStyles } from './_base/index.js';
|
|
11
|
+
import { emitMoniEvent } from '../utils/event-emitter.js';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
|
-
* Material Design 3 List
|
|
14
|
+
* Componente Material Design 3 List (Lista).
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* Las listas son índices continuos y verticales de texto o imágenes. Son
|
|
17
|
+
* elementos contenedores que proporcionan agrupación estructural y opcionalmente
|
|
18
|
+
* líneas divisorias para los hijos `<moni-list-item>`.
|
|
18
19
|
*
|
|
19
|
-
* **
|
|
20
|
+
* **Referencia de la especificación M3:** `m3-docs/components/lists/specs.md`
|
|
20
21
|
*
|
|
21
|
-
* **
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
22
|
+
* **Rol de contenedor:**
|
|
23
|
+
* La lista en sí no aplica relleno (padding) ni márgenes a sus hijos. El espaciado
|
|
24
|
+
* y el relleno interno están controlados enteramente por los propios elementos `<moni-list-item>`
|
|
25
|
+
* para asegurar áreas táctiles (hit targets) y alineación correctas.
|
|
25
26
|
*
|
|
26
|
-
* **
|
|
27
|
-
* - `default` (
|
|
28
|
-
* - `border` —
|
|
29
|
-
*
|
|
27
|
+
* **Variantes:**
|
|
28
|
+
* - `default` (cadena vacía) — Un contenedor de lista limpio y sin bordes.
|
|
29
|
+
* - `border` — Añade un borde inferior a la lista y muestra divisores
|
|
30
|
+
* horizontales (color `outline-variant`) entre los elementos de la lista.
|
|
30
31
|
*
|
|
31
32
|
* @example
|
|
32
33
|
* ```html
|
|
33
|
-
* <!--
|
|
34
|
+
* <!-- Lista estándar -->
|
|
34
35
|
* <moni-list>
|
|
35
|
-
* <moni-list-item headline="
|
|
36
|
-
* <moni-list-item headline="
|
|
36
|
+
* <moni-list-item headline="Elemento 1"></moni-list-item>
|
|
37
|
+
* <moni-list-item headline="Elemento 2"></moni-list-item>
|
|
37
38
|
* </moni-list>
|
|
38
39
|
*
|
|
39
|
-
* <!--
|
|
40
|
+
* <!-- Lista con divisores y elementos redondeados -->
|
|
40
41
|
* <moni-list variant="border" rounded>
|
|
41
|
-
* <moni-list-item icon="inbox" headline="
|
|
42
|
-
* <moni-list-item icon="send" headline="
|
|
42
|
+
* <moni-list-item icon="inbox" headline="Bandeja de entrada"></moni-list-item>
|
|
43
|
+
* <moni-list-item icon="send" headline="Enviados"></moni-list-item>
|
|
43
44
|
* </moni-list>
|
|
44
45
|
* ```
|
|
45
46
|
*
|
|
46
|
-
* @slot default - `<moni-list-item
|
|
47
|
+
* @slot default - Elementos `<moni-list-item>`.
|
|
47
48
|
*/
|
|
48
49
|
@customElement('moni-list')
|
|
49
50
|
export class MoniList extends MoniElement {
|
|
@@ -70,8 +71,23 @@ export class MoniList extends MoniElement {
|
|
|
70
71
|
`
|
|
71
72
|
];
|
|
72
73
|
|
|
74
|
+
/**
|
|
75
|
+
* Renderiza el contenedor de la lista como un elemento semánticamente apropiado.
|
|
76
|
+
*
|
|
77
|
+
* El elemento raíz por defecto es `<ul>` (lista desordenada). Cuando `ordered=true`,
|
|
78
|
+
* cambia a `<ol>` para secuencias numeradas. Para listas de navegación, el
|
|
79
|
+
* consumidor debe usar `role="navigation"` en el elemento host o establecer `as="nav"`.
|
|
80
|
+
* Los hijos `<moni-list-item>` en el slot reciben su `tabindex` y rol ARIA
|
|
81
|
+
* de la implementación de su propio componente.
|
|
82
|
+
*/
|
|
83
|
+
private _handleSlotChange(e: Event) {
|
|
84
|
+
const slot = e.target as HTMLSlotElement;
|
|
85
|
+
const nodes = slot.assignedNodes({ flatten: true }).filter(n => n.nodeType === Node.ELEMENT_NODE);
|
|
86
|
+
emitMoniEvent(this, 'moni-slot-items-changed', { detail: { nodes } });
|
|
87
|
+
}
|
|
88
|
+
|
|
73
89
|
override render() {
|
|
74
|
-
return html`<slot></slot>`;
|
|
90
|
+
return html`<slot @slotchange=${this._handleSlotChange}></slot>`;
|
|
75
91
|
}
|
|
76
92
|
}
|
|
77
93
|
|
|
@@ -14,7 +14,7 @@ describe('moni-loading-indicator', () => {
|
|
|
14
14
|
el.remove();
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
it('
|
|
17
|
+
it('renderiza un contenedor con indicador activo', async () => {
|
|
18
18
|
await el.updateComplete;
|
|
19
19
|
const container = el.shadowRoot?.querySelector('.container');
|
|
20
20
|
const activeIndicator = el.shadowRoot?.querySelector('.active-indicator');
|
|
@@ -22,7 +22,7 @@ describe('moni-loading-indicator', () => {
|
|
|
22
22
|
expect(activeIndicator).toBeTruthy();
|
|
23
23
|
});
|
|
24
24
|
|
|
25
|
-
it('
|
|
25
|
+
it('refleja y respeta el atributo variant', async () => {
|
|
26
26
|
expect(el.variant).toBe('uncontained');
|
|
27
27
|
el.variant = 'contained';
|
|
28
28
|
await el.updateComplete;
|
|
@@ -33,7 +33,7 @@ describe('moni-loading-indicator', () => {
|
|
|
33
33
|
expect(el.getAttribute('variant')).toBe('uncontained');
|
|
34
34
|
});
|
|
35
35
|
|
|
36
|
-
it('
|
|
36
|
+
it('tiene el rol progressbar y valores min/max establecidos', () => {
|
|
37
37
|
expect(el.getAttribute('role')).toBe('progressbar');
|
|
38
38
|
expect(el.ariaValueMin).toBe('0');
|
|
39
39
|
expect(el.ariaValueMax).toBe('100');
|
|
@@ -11,39 +11,39 @@ import { MoniElement, sharedStyles } from './_base/index.js';
|
|
|
11
11
|
import { loadingIndicatorPolygons } from './loading-shapes.js';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* Material Design 3 Loading Indicator
|
|
14
|
+
* Componente Material Design 3 Loading Indicator (Indicador de carga).
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
* Un indicador de carga indeterminado que representa visualmente un tiempo de espera
|
|
17
|
+
* no especificado. A diferencia de los spinners circulares estándar, este componente usa una animación
|
|
18
|
+
* de polígono cambiante que cambia entre formas (círculo, cuadrado redondeado, etc.)
|
|
19
|
+
* de acuerdo con las especificaciones de movimiento de alta fidelidad M3 Expressive.
|
|
20
20
|
*
|
|
21
|
-
* **
|
|
22
|
-
* - `uncontained` (
|
|
23
|
-
*
|
|
24
|
-
* - `contained` —
|
|
25
|
-
*
|
|
26
|
-
*
|
|
21
|
+
* **Variantes:**
|
|
22
|
+
* - `uncontained` (por defecto) — Una forma cambiante independiente que hereda el color
|
|
23
|
+
* de su contexto de texto (o por defecto es `primary`).
|
|
24
|
+
* - `contained` — La forma cambiante se coloca dentro de un contenedor circular
|
|
25
|
+
* con un color de fondo distinto, útil para estados de carga de alto contraste
|
|
26
|
+
* o superposición de imágenes.
|
|
27
27
|
*
|
|
28
|
-
* **
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* roles (`role="progressbar"`)
|
|
33
|
-
*
|
|
28
|
+
* **Animación y Accesibilidad:**
|
|
29
|
+
* El componente gestiona sus propias etiquetas `<animate>` SVG. La animación se
|
|
30
|
+
* inicia/detiene automáticamente a través de `connectedCallback`/`disconnectedCallback`
|
|
31
|
+
* para ahorrar ciclos de CPU cuando el elemento está fuera de la pantalla. Aplica los atributos de valor
|
|
32
|
+
* y roles ARIA estándar (`role="progressbar"`) para asegurar que los lectores de pantalla
|
|
33
|
+
* lo identifiquen correctamente como un estado de carga indeterminado.
|
|
34
34
|
*
|
|
35
35
|
* @example
|
|
36
36
|
* ```html
|
|
37
|
-
* <!--
|
|
37
|
+
* <!-- Indicador no contenido -->
|
|
38
38
|
* <moni-loading-indicator></moni-loading-indicator>
|
|
39
39
|
*
|
|
40
|
-
* <!--
|
|
40
|
+
* <!-- Indicador contenido (el contenedor por defecto es secondary-container) -->
|
|
41
41
|
* <moni-loading-indicator variant="contained"></moni-loading-indicator>
|
|
42
42
|
* ```
|
|
43
43
|
*
|
|
44
|
-
* @csspart container -
|
|
45
|
-
* @csspart svg -
|
|
46
|
-
* @csspart shape -
|
|
44
|
+
* @csspart container - El envoltorio exterior `.container`.
|
|
45
|
+
* @csspart svg - El elemento `<svg>` interior.
|
|
46
|
+
* @csspart shape - El elemento `<path>` que se transforma.
|
|
47
47
|
*/
|
|
48
48
|
@customElement('moni-loading-indicator')
|
|
49
49
|
export class MoniLoadingIndicator extends MoniElement {
|
|
@@ -52,6 +52,11 @@ export class MoniLoadingIndicator extends MoniElement {
|
|
|
52
52
|
|
|
53
53
|
@query('.container') private _container?: HTMLElement;
|
|
54
54
|
|
|
55
|
+
/**
|
|
56
|
+
* Hook de inicialización (Lit).
|
|
57
|
+
* Configura roles ARIA (progressbar) por defecto y asegura
|
|
58
|
+
* el encendido inicial de la animación infinita en el Shadow DOM.
|
|
59
|
+
*/
|
|
55
60
|
override connectedCallback() {
|
|
56
61
|
super.connectedCallback();
|
|
57
62
|
this.ariaValueMin = this.ariaValueMin || '0';
|
|
@@ -60,15 +65,30 @@ export class MoniLoadingIndicator extends MoniElement {
|
|
|
60
65
|
this._toggleAnimation(true);
|
|
61
66
|
}
|
|
62
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Hook de destrucción (Lit).
|
|
70
|
+
* Apaga formalmente la animación CSS (`.animate`) para frenar el GPU repaint
|
|
71
|
+
* cuando el componente es destruido, reduciendo el consumo de batería.
|
|
72
|
+
*/
|
|
63
73
|
override disconnectedCallback() {
|
|
64
74
|
super.disconnectedCallback();
|
|
65
75
|
this._toggleAnimation(false);
|
|
66
76
|
}
|
|
67
77
|
|
|
78
|
+
/**
|
|
79
|
+
* Hook de primera actualización (Lit).
|
|
80
|
+
* Dispara explícitamente el estado de animación una vez que el DOM
|
|
81
|
+
* interno (`this._container`) ha sido montado y es seleccionable.
|
|
82
|
+
*/
|
|
68
83
|
protected override firstUpdated() {
|
|
69
84
|
this._toggleAnimation(true);
|
|
70
85
|
}
|
|
71
86
|
|
|
87
|
+
/**
|
|
88
|
+
* Controlador imperativo de las clases de animación.
|
|
89
|
+
* Permite pausar/reanudar el loader mediante CSS, muy útil cuando se integra
|
|
90
|
+
* con observadores de visibilidad (IntersectionObserver) para mejorar el rendimiento.
|
|
91
|
+
*/
|
|
72
92
|
private _toggleAnimation(enable: boolean) {
|
|
73
93
|
if (this._container) {
|
|
74
94
|
this._container.classList.toggle('animate', enable);
|
|
@@ -196,6 +216,18 @@ export class MoniLoadingIndicator extends MoniElement {
|
|
|
196
216
|
`
|
|
197
217
|
];
|
|
198
218
|
|
|
219
|
+
/**
|
|
220
|
+
* Renderiza la superposición de carga de pantalla completa con un spinner centrado y una etiqueta opcional.
|
|
221
|
+
*
|
|
222
|
+
* La superposición utiliza `position: fixed; inset: 0` para cubrir toda la ventana gráfica,
|
|
223
|
+
* y `z-index` para aparecer por encima del resto del contenido. El spinner `<moni-progress>`
|
|
224
|
+
* se centra mediante CSS flexbox en el elemento `:host`.
|
|
225
|
+
*
|
|
226
|
+
* **Región ARIA en vivo:**
|
|
227
|
+
* `aria-live="polite"` y `aria-label` en el contenedor anuncian los cambios de estado
|
|
228
|
+
* de carga a los lectores de pantalla sin interrumpir el flujo de lectura del usuario.
|
|
229
|
+
* El `role="status"` da a los lectores de pantalla un punto de referencia implícito similar a una alerta.
|
|
230
|
+
*/
|
|
199
231
|
override render() {
|
|
200
232
|
return html`
|
|
201
233
|
<div class="container animate" aria-hidden="true">
|
|
@@ -11,31 +11,31 @@ import { MoniElement, sharedStyles } from './_base/index.js';
|
|
|
11
11
|
import './moni-icon.js';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* Material Design 3 Menu Item
|
|
14
|
+
* Componente Material Design 3 Menu Item (Elemento de Menú).
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* Un elemento interactivo individual dentro de un `<moni-menu>` o `<moni-context-menu>`.
|
|
17
|
+
* Proporciona el estilo estándar de elemento de menú M3, estados hover, e iconos
|
|
18
|
+
* iniciales opcionales.
|
|
19
19
|
*
|
|
20
|
-
* **
|
|
20
|
+
* **Referencia de la especificación M3:** `m3-docs/components/menus/specs.md`
|
|
21
21
|
*
|
|
22
|
-
* **
|
|
23
|
-
* - Hover:
|
|
24
|
-
* -
|
|
25
|
-
*
|
|
26
|
-
* -
|
|
22
|
+
* **Estados de interacción:**
|
|
23
|
+
* - Hover: aplica una capa de opacidad.
|
|
24
|
+
* - Activo (`active=true`): aplica un fondo resaltado `tertiary-container`,
|
|
25
|
+
* útil para indicar la opción actualmente seleccionada en una lista.
|
|
26
|
+
* - Deshabilitado (`disabled=true`): reduce la opacidad y deshabilita los eventos del puntero.
|
|
27
27
|
*
|
|
28
28
|
* @example
|
|
29
29
|
* ```html
|
|
30
|
-
* <moni-menu-item icon="edit">
|
|
31
|
-
* <moni-menu-item icon="content_copy" disabled>
|
|
32
|
-
* <moni-menu-item active>
|
|
30
|
+
* <moni-menu-item icon="edit">Editar texto</moni-menu-item>
|
|
31
|
+
* <moni-menu-item icon="content_copy" disabled>Copiar</moni-menu-item>
|
|
32
|
+
* <moni-menu-item active>Actualmente seleccionado</moni-menu-item>
|
|
33
33
|
* ```
|
|
34
34
|
*
|
|
35
|
-
* @slot default -
|
|
35
|
+
* @slot default - La etiqueta de texto para el elemento de menú.
|
|
36
36
|
*
|
|
37
|
-
* @csspart item -
|
|
38
|
-
* @csspart icon -
|
|
37
|
+
* @csspart item - El elemento exterior `<li>`.
|
|
38
|
+
* @csspart icon - El contenedor para el icono inicial.
|
|
39
39
|
*/
|
|
40
40
|
@customElement('moni-menu-item')
|
|
41
41
|
export class MoniMenuItem extends MoniElement {
|
|
@@ -90,6 +90,13 @@ export class MoniMenuItem extends MoniElement {
|
|
|
90
90
|
`
|
|
91
91
|
];
|
|
92
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Renderiza el elemento de menú como un `<li>` con un icono inicial opcional y un atajo final.
|
|
95
|
+
*
|
|
96
|
+
* El `<moni-icon>` inicial solo se renderiza cuando se establece `icon` (evita nodos DOM vacíos).
|
|
97
|
+
* `shortcut` se muestra como texto silenciado alineado a la derecha (ej. `Ctrl+K`) usando el estilo
|
|
98
|
+
* de tipografía `body-small` de M3. El slot proyecta contenido personalizado junto a la etiqueta.
|
|
99
|
+
*/
|
|
93
100
|
override render() {
|
|
94
101
|
return html`<li part="item">
|
|
95
102
|
${this.icon
|
|
@@ -14,26 +14,26 @@ describe('moni-menu (P3.2 — flip attribute)', () => {
|
|
|
14
14
|
el.remove();
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
it('
|
|
17
|
+
it('por defecto es placement=bottom y flip=false', async () => {
|
|
18
18
|
await el.updateComplete;
|
|
19
19
|
expect(el.placement).toBe('bottom');
|
|
20
20
|
expect(el.flip).toBe(false);
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
-
it('
|
|
23
|
+
it('refleja el atributo flip en el host', async () => {
|
|
24
24
|
el.flip = true;
|
|
25
25
|
await el.updateComplete;
|
|
26
26
|
expect(el.hasAttribute('flip')).toBe(true);
|
|
27
27
|
});
|
|
28
28
|
|
|
29
|
-
it('
|
|
29
|
+
it('renderiza la clase de placement en el <menu> interno', async () => {
|
|
30
30
|
el.placement = 'top';
|
|
31
31
|
await el.updateComplete;
|
|
32
32
|
const menu = el.shadowRoot?.querySelector('menu');
|
|
33
33
|
expect(menu?.classList.contains('top')).toBe(true);
|
|
34
34
|
});
|
|
35
35
|
|
|
36
|
-
it('
|
|
36
|
+
it('refleja active como una clase en el <menu>', async () => {
|
|
37
37
|
el.active = true;
|
|
38
38
|
await el.updateComplete;
|
|
39
39
|
const menu = el.shadowRoot?.querySelector('menu');
|
|
@@ -44,7 +44,7 @@ describe('moni-menu (P3.2 — flip attribute)', () => {
|
|
|
44
44
|
expect(menu?.classList.contains('active')).toBe(false);
|
|
45
45
|
});
|
|
46
46
|
|
|
47
|
-
it('
|
|
47
|
+
it('refleja todos los 6 placements (bottom/top/left/right/min/max)', async () => {
|
|
48
48
|
const placements: Array<'bottom' | 'top' | 'left' | 'right' | 'min' | 'max'> = [
|
|
49
49
|
'bottom',
|
|
50
50
|
'top',
|
|
@@ -61,7 +61,7 @@ describe('moni-menu (P3.2 — flip attribute)', () => {
|
|
|
61
61
|
}
|
|
62
62
|
});
|
|
63
63
|
|
|
64
|
-
it('
|
|
64
|
+
it('las variantes de espacio (no-space/space/small-space/medium-space/large-space/extra-space) aplican una clase de gap', async () => {
|
|
65
65
|
const spaces = [
|
|
66
66
|
'no-space',
|
|
67
67
|
'space',
|
|
@@ -78,7 +78,7 @@ describe('moni-menu (P3.2 — flip attribute)', () => {
|
|
|
78
78
|
}
|
|
79
79
|
});
|
|
80
80
|
|
|
81
|
-
it('no-wrap
|
|
81
|
+
it('el atributo no-wrap se reenvía a una clase no-wrap', async () => {
|
|
82
82
|
el.noWrap = true;
|
|
83
83
|
await el.updateComplete;
|
|
84
84
|
const menu = el.shadowRoot?.querySelector('menu');
|