@moni-labs/moni-ui 0.3.0 → 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.
Files changed (251) hide show
  1. package/custom-elements.json +5230 -1007
  2. package/dist/components/_base/moni-element.d.ts +16 -9
  3. package/dist/components/_base/moni-element.d.ts.map +1 -1
  4. package/dist/components/_base/moni-element.js +63 -9
  5. package/dist/components/index.js +2 -2
  6. package/dist/components/loading-shapes.d.ts +19 -0
  7. package/dist/components/loading-shapes.d.ts.map +1 -1
  8. package/dist/components/loading-shapes.js +19 -0
  9. package/dist/components/moni-app-bar.d.ts +72 -62
  10. package/dist/components/moni-app-bar.d.ts.map +1 -1
  11. package/dist/components/moni-app-bar.js +72 -62
  12. package/dist/components/moni-badge.d.ts +64 -65
  13. package/dist/components/moni-badge.d.ts.map +1 -1
  14. package/dist/components/moni-badge.js +64 -66
  15. package/dist/components/moni-bottom-sheet.d.ts +129 -61
  16. package/dist/components/moni-bottom-sheet.d.ts.map +1 -1
  17. package/dist/components/moni-bottom-sheet.js +217 -131
  18. package/dist/components/moni-button-group.d.ts +107 -29
  19. package/dist/components/moni-button-group.d.ts.map +1 -1
  20. package/dist/components/moni-button-group.js +107 -29
  21. package/dist/components/moni-button-segment.d.ts +53 -12
  22. package/dist/components/moni-button-segment.d.ts.map +1 -1
  23. package/dist/components/moni-button-segment.js +53 -12
  24. package/dist/components/moni-button.d.ts +116 -38
  25. package/dist/components/moni-button.d.ts.map +1 -1
  26. package/dist/components/moni-button.js +128 -38
  27. package/dist/components/moni-card.d.ts +68 -50
  28. package/dist/components/moni-card.d.ts.map +1 -1
  29. package/dist/components/moni-card.js +68 -50
  30. package/dist/components/moni-carousel.d.ts +484 -53
  31. package/dist/components/moni-carousel.d.ts.map +1 -1
  32. package/dist/components/moni-carousel.js +1024 -245
  33. package/dist/components/moni-checkbox.d.ts +49 -46
  34. package/dist/components/moni-checkbox.d.ts.map +1 -1
  35. package/dist/components/moni-checkbox.js +55 -48
  36. package/dist/components/moni-chip.d.ts +100 -33
  37. package/dist/components/moni-chip.d.ts.map +1 -1
  38. package/dist/components/moni-chip.js +104 -34
  39. package/dist/components/moni-color-field.d.ts +99 -24
  40. package/dist/components/moni-color-field.d.ts.map +1 -1
  41. package/dist/components/moni-color-field.js +99 -24
  42. package/dist/components/moni-context-menu.d.ts +72 -26
  43. package/dist/components/moni-context-menu.d.ts.map +1 -1
  44. package/dist/components/moni-context-menu.js +76 -30
  45. package/dist/components/moni-dialog.d.ts +84 -59
  46. package/dist/components/moni-dialog.d.ts.map +1 -1
  47. package/dist/components/moni-dialog.js +105 -58
  48. package/dist/components/moni-divider.d.ts +39 -27
  49. package/dist/components/moni-divider.d.ts.map +1 -1
  50. package/dist/components/moni-divider.js +42 -30
  51. package/dist/components/moni-expansion.d.ts +32 -22
  52. package/dist/components/moni-expansion.d.ts.map +1 -1
  53. package/dist/components/moni-expansion.js +32 -22
  54. package/dist/components/moni-fab-menu.d.ts +61 -23
  55. package/dist/components/moni-fab-menu.d.ts.map +1 -1
  56. package/dist/components/moni-fab-menu.js +69 -31
  57. package/dist/components/moni-fab.d.ts +86 -28
  58. package/dist/components/moni-fab.d.ts.map +1 -1
  59. package/dist/components/moni-fab.js +92 -34
  60. package/dist/components/moni-file-field.d.ts +118 -30
  61. package/dist/components/moni-file-field.d.ts.map +1 -1
  62. package/dist/components/moni-file-field.js +118 -30
  63. package/dist/components/moni-icon.d.ts +40 -35
  64. package/dist/components/moni-icon.d.ts.map +1 -1
  65. package/dist/components/moni-icon.js +43 -38
  66. package/dist/components/moni-list-item.d.ts +46 -33
  67. package/dist/components/moni-list-item.d.ts.map +1 -1
  68. package/dist/components/moni-list-item.js +61 -41
  69. package/dist/components/moni-list.d.ts +30 -20
  70. package/dist/components/moni-list.d.ts.map +1 -1
  71. package/dist/components/moni-list.js +36 -21
  72. package/dist/components/moni-loading-indicator.d.ts +54 -22
  73. package/dist/components/moni-loading-indicator.d.ts.map +1 -1
  74. package/dist/components/moni-loading-indicator.js +54 -22
  75. package/dist/components/moni-menu-item.d.ts +23 -16
  76. package/dist/components/moni-menu-item.d.ts.map +1 -1
  77. package/dist/components/moni-menu-item.js +23 -16
  78. package/dist/components/moni-menu.d.ts +81 -28
  79. package/dist/components/moni-menu.d.ts.map +1 -1
  80. package/dist/components/moni-menu.js +81 -30
  81. package/dist/components/moni-morph-modal.d.ts +141 -0
  82. package/dist/components/moni-morph-modal.d.ts.map +1 -1
  83. package/dist/components/moni-morph-modal.js +295 -58
  84. package/dist/components/moni-nav-item.d.ts +59 -29
  85. package/dist/components/moni-nav-item.d.ts.map +1 -1
  86. package/dist/components/moni-nav-item.js +59 -29
  87. package/dist/components/moni-nav.d.ts +94 -35
  88. package/dist/components/moni-nav.d.ts.map +1 -1
  89. package/dist/components/moni-nav.js +94 -35
  90. package/dist/components/moni-progress.d.ts +99 -55
  91. package/dist/components/moni-progress.d.ts.map +1 -1
  92. package/dist/components/moni-progress.js +99 -55
  93. package/dist/components/moni-radio.d.ts +62 -50
  94. package/dist/components/moni-radio.d.ts.map +1 -1
  95. package/dist/components/moni-radio.js +65 -52
  96. package/dist/components/moni-ripple.d.ts +74 -59
  97. package/dist/components/moni-ripple.d.ts.map +1 -1
  98. package/dist/components/moni-ripple.js +74 -59
  99. package/dist/components/moni-segmented-button.d.ts +91 -16
  100. package/dist/components/moni-segmented-button.d.ts.map +1 -1
  101. package/dist/components/moni-segmented-button.js +94 -17
  102. package/dist/components/moni-select-option.d.ts +30 -23
  103. package/dist/components/moni-select-option.d.ts.map +1 -1
  104. package/dist/components/moni-select-option.js +30 -23
  105. package/dist/components/moni-select.d.ts +300 -35
  106. package/dist/components/moni-select.d.ts.map +1 -1
  107. package/dist/components/moni-select.js +323 -39
  108. package/dist/components/moni-side-sheet.d.ts +94 -32
  109. package/dist/components/moni-side-sheet.d.ts.map +1 -1
  110. package/dist/components/moni-side-sheet.js +94 -32
  111. package/dist/components/moni-slider.d.ts +152 -41
  112. package/dist/components/moni-slider.d.ts.map +1 -1
  113. package/dist/components/moni-slider.js +154 -42
  114. package/dist/components/moni-snackbar.d.ts +53 -43
  115. package/dist/components/moni-snackbar.d.ts.map +1 -1
  116. package/dist/components/moni-snackbar.js +53 -43
  117. package/dist/components/moni-split-button.d.ts +63 -18
  118. package/dist/components/moni-split-button.d.ts.map +1 -1
  119. package/dist/components/moni-split-button.js +63 -18
  120. package/dist/components/moni-step.d.ts +36 -24
  121. package/dist/components/moni-step.d.ts.map +1 -1
  122. package/dist/components/moni-step.js +41 -29
  123. package/dist/components/moni-stepper.d.ts +64 -27
  124. package/dist/components/moni-stepper.d.ts.map +1 -1
  125. package/dist/components/moni-stepper.js +72 -34
  126. package/dist/components/moni-switch.d.ts +57 -46
  127. package/dist/components/moni-switch.d.ts.map +1 -1
  128. package/dist/components/moni-switch.js +59 -47
  129. package/dist/components/moni-tab.d.ts +26 -18
  130. package/dist/components/moni-tab.d.ts.map +1 -1
  131. package/dist/components/moni-tab.js +29 -21
  132. package/dist/components/moni-tabs.d.ts +34 -28
  133. package/dist/components/moni-tabs.d.ts.map +1 -1
  134. package/dist/components/moni-tabs.js +34 -28
  135. package/dist/components/moni-text-field.d.ts +139 -29
  136. package/dist/components/moni-text-field.d.ts.map +1 -1
  137. package/dist/components/moni-text-field.js +157 -31
  138. package/dist/components/moni-textarea.d.ts +127 -29
  139. package/dist/components/moni-textarea.d.ts.map +1 -1
  140. package/dist/components/moni-textarea.js +131 -32
  141. package/dist/components/moni-time-picker.d.ts +114 -24
  142. package/dist/components/moni-time-picker.d.ts.map +1 -1
  143. package/dist/components/moni-time-picker.js +127 -33
  144. package/dist/components/moni-toolbar.d.ts +37 -23
  145. package/dist/components/moni-toolbar.d.ts.map +1 -1
  146. package/dist/components/moni-toolbar.js +37 -23
  147. package/dist/components/moni-tooltip.d.ts +100 -36
  148. package/dist/components/moni-tooltip.d.ts.map +1 -1
  149. package/dist/components/moni-tooltip.js +104 -40
  150. package/dist/components/moni-typography.d.ts +68 -30
  151. package/dist/components/moni-typography.d.ts.map +1 -1
  152. package/dist/components/moni-typography.js +70 -32
  153. package/dist/styles/tokens.css +7 -7
  154. package/dist/types/events.d.ts +17 -0
  155. package/dist/types/events.d.ts.map +1 -0
  156. package/dist/types/events.js +1 -0
  157. package/dist/utils/event-emitter.d.ts +13 -0
  158. package/dist/utils/event-emitter.d.ts.map +1 -0
  159. package/dist/utils/event-emitter.js +13 -0
  160. package/package.json +2 -1
  161. package/src/components/_base/moni-element.ts +73 -9
  162. package/src/components/index.ts +2 -2
  163. package/src/components/loading-shapes.ts +19 -0
  164. package/src/components/moni-app-bar.test.ts +10 -10
  165. package/src/components/moni-app-bar.ts +72 -62
  166. package/src/components/moni-badge.ts +64 -66
  167. package/src/components/moni-bottom-sheet.test.ts +39 -45
  168. package/src/components/moni-bottom-sheet.ts +222 -131
  169. package/src/components/moni-button-group.test.ts +14 -14
  170. package/src/components/moni-button-group.ts +107 -29
  171. package/src/components/moni-button-segment.ts +53 -12
  172. package/src/components/moni-button.test.ts +28 -26
  173. package/src/components/moni-button.ts +139 -39
  174. package/src/components/moni-card.test.ts +6 -6
  175. package/src/components/moni-card.ts +70 -50
  176. package/src/components/moni-carousel.test.ts +12 -12
  177. package/src/components/moni-carousel.ts +1129 -269
  178. package/src/components/moni-checkbox.test.ts +7 -7
  179. package/src/components/moni-checkbox.ts +62 -48
  180. package/src/components/moni-chip.test.ts +17 -17
  181. package/src/components/moni-chip.ts +112 -34
  182. package/src/components/moni-color-field.test.ts +5 -5
  183. package/src/components/moni-color-field.ts +108 -24
  184. package/src/components/moni-context-menu.test.ts +11 -11
  185. package/src/components/moni-context-menu.ts +76 -30
  186. package/src/components/moni-dialog.ts +108 -59
  187. package/src/components/moni-divider.test.ts +4 -4
  188. package/src/components/moni-divider.ts +42 -30
  189. package/src/components/moni-expansion.ts +32 -22
  190. package/src/components/moni-fab-menu.test.ts +11 -11
  191. package/src/components/moni-fab-menu.ts +69 -31
  192. package/src/components/moni-fab.test.ts +16 -16
  193. package/src/components/moni-fab.ts +100 -34
  194. package/src/components/moni-file-field.test.ts +8 -8
  195. package/src/components/moni-file-field.ts +132 -30
  196. package/src/components/moni-icon.test.ts +11 -11
  197. package/src/components/moni-icon.ts +43 -38
  198. package/src/components/moni-list-item.test.ts +10 -10
  199. package/src/components/moni-list-item.ts +61 -41
  200. package/src/components/moni-list.ts +37 -21
  201. package/src/components/moni-loading-indicator.test.ts +3 -3
  202. package/src/components/moni-loading-indicator.ts +54 -22
  203. package/src/components/moni-menu-item.ts +23 -16
  204. package/src/components/moni-menu.test.ts +7 -7
  205. package/src/components/moni-menu.ts +87 -30
  206. package/src/components/moni-morph-modal.test.ts +18 -17
  207. package/src/components/moni-morph-modal.ts +327 -60
  208. package/src/components/moni-nav-item.ts +59 -29
  209. package/src/components/moni-nav.test.ts +11 -11
  210. package/src/components/moni-nav.ts +94 -35
  211. package/src/components/moni-progress.test.ts +9 -9
  212. package/src/components/moni-progress.ts +100 -56
  213. package/src/components/moni-radio.test.ts +8 -8
  214. package/src/components/moni-radio.ts +71 -51
  215. package/src/components/moni-ripple.ts +74 -59
  216. package/src/components/moni-segmented-button.test.ts +4 -4
  217. package/src/components/moni-segmented-button.ts +94 -17
  218. package/src/components/moni-select-option.ts +30 -23
  219. package/src/components/moni-select.test.ts +11 -11
  220. package/src/components/moni-select.ts +361 -50
  221. package/src/components/moni-side-sheet.test.ts +7 -7
  222. package/src/components/moni-side-sheet.ts +94 -32
  223. package/src/components/moni-slider.test.ts +7 -7
  224. package/src/components/moni-slider.ts +165 -42
  225. package/src/components/moni-snackbar.test.ts +8 -8
  226. package/src/components/moni-snackbar.ts +53 -43
  227. package/src/components/moni-split-button.ts +63 -18
  228. package/src/components/moni-step.test.ts +7 -7
  229. package/src/components/moni-step.ts +41 -29
  230. package/src/components/moni-stepper.test.ts +7 -7
  231. package/src/components/moni-stepper.ts +72 -34
  232. package/src/components/moni-switch.test.ts +12 -12
  233. package/src/components/moni-switch.ts +66 -47
  234. package/src/components/moni-tab.test.ts +5 -5
  235. package/src/components/moni-tab.ts +29 -21
  236. package/src/components/moni-tabs.ts +34 -28
  237. package/src/components/moni-text-field.test.ts +13 -13
  238. package/src/components/moni-text-field.ts +181 -30
  239. package/src/components/moni-textarea.test.ts +17 -17
  240. package/src/components/moni-textarea.ts +155 -31
  241. package/src/components/moni-time-picker.test.ts +5 -5
  242. package/src/components/moni-time-picker.ts +128 -33
  243. package/src/components/moni-toolbar.test.ts +8 -8
  244. package/src/components/moni-toolbar.ts +37 -23
  245. package/src/components/moni-tooltip.test.ts +15 -15
  246. package/src/components/moni-tooltip.ts +107 -40
  247. package/src/components/moni-typography.test.ts +10 -10
  248. package/src/components/moni-typography.ts +73 -32
  249. package/src/styles/tokens.css +7 -7
  250. package/src/types/events.ts +17 -0
  251. 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 component.
14
+ * Componente Material Design 3 List Item (Elemento de Lista).
15
15
  *
16
- * A single row within a `<moni-list>`. List items display a headline and
17
- * optional supporting text, metadata, icons, or avatars.
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
- * **M3 spec reference:** `m3-docs/components/lists/specs.md`
19
+ * **Referencia de la especificación M3:** `m3-docs/components/lists/specs.md`
20
20
  *
21
- * **Line configurations:**
22
- * The `lines` attribute configures the layout and minimum height of the item:
23
- * - `lines="1"` (default) — 56dp min height. Only the headline slot is shown.
24
- * - `lines="2"` — 72dp min height. Shows headline and supporting text.
25
- * - `lines="3"` — 88dp min height. Shows headline, supporting text, and meta text.
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
- * **Interactive behavior:**
28
- * By default, items render as `<button>` elements, gaining the M3 state layer
29
- * (hover, focus, and press ripple effects).
30
- * If the `href` attribute is provided, the item internally renders as an `<a>`
31
- * element, allowing native link routing and interactions while preserving the
32
- * list item styling.
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
- * **Visual elements:**
35
- * - `icon` (attribute) — Material Symbol name for the leading icon (24dp).
36
- * - `avatar` (attribute) — URL for a leading circular image (40dp).
37
- * - `trailing-icon` (attribute) — Material Symbol name for the 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-line item with icon -->
41
+ * <!-- Elemento de 1 línea con icono -->
42
42
  * <moni-list-item icon="inbox">
43
- * Inbox
43
+ * Bandeja de entrada
44
44
  * </moni-list-item>
45
45
  *
46
- * <!-- 2-line item with avatar and trailing meta -->
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">Brunch this weekend?</span>
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
- * <!-- Link item -->
53
+ * <!-- Elemento de enlace -->
54
54
  * <moni-list-item href="/settings" icon="settings">
55
- * Settings
55
+ * Ajustes
56
56
  * </moni-list-item>
57
57
  * ```
58
58
  *
59
- * @slot default - Headline text (Line 1).
60
- * @slot supporting - Supporting text (Line 2, requires `lines>=2`).
61
- * @slot meta - Additional meta text (Line 3, requires `lines=3`).
62
- * @slot trailing-meta - Small text displayed on the far right edge.
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 - The outer `<button>` or `<a>` container.
65
- * @csspart leading-icon - Container for the leading icon/avatar.
66
- * @csspart text - Container for the multi-line text block.
67
- * @csspart trailing-icon - Container for the 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
- color: var(--on-surface);
91
- background-color: transparent;
99
+ box-sizing: border-box;
100
+ color: inherit;
92
101
  text-decoration: none;
93
102
  cursor: pointer;
94
- position: relative;
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 component.
14
+ * Componente Material Design 3 List (Lista).
14
15
  *
15
- * Lists are continuous, vertical indexes of text or images. They are
16
- * container elements that provide structural grouping and optional
17
- * divider lines for `<moni-list-item>` children.
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
- * **M3 spec reference:** `m3-docs/components/lists/specs.md`
20
+ * **Referencia de la especificación M3:** `m3-docs/components/lists/specs.md`
20
21
  *
21
- * **Container role:**
22
- * The list itself does not apply padding or margins to its children. Spacing
23
- * and internal padding are controlled entirely by the `<moni-list-item>`
24
- * elements themselves to ensure proper hit targets and alignment.
22
+ * **Rol de contenedor:**
23
+ * La lista en 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
- * **Variants:**
27
- * - `default` (empty string) — A clean, borderless list container.
28
- * - `border` — Adds a bottom border to the list and displays horizontal
29
- * dividers (`outline-variant` color) between list items.
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
- * <!-- Standard list -->
34
+ * <!-- Lista estándar -->
34
35
  * <moni-list>
35
- * <moni-list-item headline="Item 1"></moni-list-item>
36
- * <moni-list-item headline="Item 2"></moni-list-item>
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
- * <!-- List with dividers and rounded items -->
40
+ * <!-- Lista con divisores y elementos redondeados -->
40
41
  * <moni-list variant="border" rounded>
41
- * <moni-list-item icon="inbox" headline="Inbox"></moni-list-item>
42
- * <moni-list-item icon="send" headline="Sent"></moni-list-item>
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>` elements.
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('renders a container with active indicator', async () => {
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('reflects and respects the variant attribute', async () => {
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('has progressbar role and min/max values set', () => {
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 component.
14
+ * Componente Material Design 3 Loading Indicator (Indicador de carga).
15
15
  *
16
- * An indeterminate loading indicator that visually represents an unspecified
17
- * wait time. Unlike standard circular spinners, this component uses a morphing
18
- * polygon animation that shifts between shapes (circle, rounded square, etc.)
19
- * in accordance with the high-fidelity M3 Expressive motion specifications.
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
- * **Variants:**
22
- * - `uncontained` (default) — A standalone morphing shape that inherits color
23
- * from its text context (or defaults to `primary`).
24
- * - `contained` — The morphing shape is placed inside a circular container
25
- * with a distinct background color, useful for high-contrast loading states
26
- * or overlaying imagery.
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
- * **Animation & Accessibility:**
29
- * The component manages its own SVG `<animate>` tags. The animation is
30
- * automatically started/stopped via `connectedCallback`/`disconnectedCallback`
31
- * to save CPU cycles when the element is off-screen. It applies standard ARIA
32
- * roles (`role="progressbar"`) and value attributes to ensure screen readers
33
- * identify it correctly as an indeterminate loading state.
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
- * <!-- Uncontained indicator -->
37
+ * <!-- Indicador no contenido -->
38
38
  * <moni-loading-indicator></moni-loading-indicator>
39
39
  *
40
- * <!-- Contained indicator (default container is secondary-container) -->
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 - The outer `.container` wrapper.
45
- * @csspart svg - The inner `<svg>` element.
46
- * @csspart shape - The `<path>` element that morphs.
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 component.
14
+ * Componente Material Design 3 Menu Item (Elemento de Menú).
15
15
  *
16
- * A single interactive item within a `<moni-menu>` or `<moni-context-menu>`.
17
- * It provides standard M3 menu item styling, hover states, and optional
18
- * leading icons.
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
- * **M3 spec reference:** `m3-docs/components/menus/specs.md`
20
+ * **Referencia de la especificación M3:** `m3-docs/components/menus/specs.md`
21
21
  *
22
- * **Interaction states:**
23
- * - Hover: applies an opacity layer.
24
- * - Active (`active=true`): applies a `tertiary-container` background highlight,
25
- * useful for indicating the currently selected option in a list.
26
- * - Disabled (`disabled=true`): reduces opacity and disables pointer events.
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">Edit text</moni-menu-item>
31
- * <moni-menu-item icon="content_copy" disabled>Copy</moni-menu-item>
32
- * <moni-menu-item active>Currently selected</moni-menu-item>
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 - The text label for the menu item.
35
+ * @slot default - La etiqueta de texto para el elemento de menú.
36
36
  *
37
- * @csspart item - The outer `<li>` element.
38
- * @csspart icon - The container for the leading 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('defaults to placement=bottom and flip=false', async () => {
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('reflects flip attribute on the host', async () => {
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('renders the placement class on the inner <menu>', async () => {
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('reflects active as a class on the <menu>', async () => {
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('reflects all 6 placements (bottom/top/left/right/min/max)', async () => {
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('space variants (no-space/space/small-space/medium-space/large-space/extra-space) apply a gap class', async () => {
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 attribute forwards to a no-wrap class', async () => {
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');