@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.
Files changed (251) hide show
  1. package/custom-elements.json +5181 -1043
  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 +471 -53
  31. package/dist/components/moni-carousel.d.ts.map +1 -1
  32. package/dist/components/moni-carousel.js +862 -264
  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 +953 -290
  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
@@ -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 component.
16
+ * Componente Material Design 3 File Field (Campo de Archivo).
17
17
  *
18
- * A specialized field component that provides a styled, accessible alternative
19
- * to the native `<input type="file">`. It wraps a native file input inside
20
- * the M3 `.field` shell and presents a read-only text input showing the
21
- * selected file name(s) alongside a stylized "Choose file" action button.
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
- * **Visual architecture:**
24
- * The component leverages the `fieldStyles` CSS patterns. The internal DOM
25
- * structure is specifically ordered as:
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
- * This specific ordering ensures that the CSS adjacent sibling selector
28
- * (`input + label`) can correctly float the label when the field is populated,
29
- * even though the visible field is actually the read-only text input.
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
- * **State management:**
32
- * When the user selects files via the hidden file input, the component listens
33
- * for the native `change` event, reads `input.files`, and updates the read-only
34
- * text input with a comma-separated list of file names. The `value` property
35
- * is kept in sync, and a composed `'change'` event is re-dispatched.
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 - Bubbles and is composed. Fired when files are selected or
38
- * cleared. The consumer can read the internal input's `files`
39
- * list by querying the component.
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
- * <!-- Single file upload -->
43
+ * <!-- Carga de un solo archivo -->
44
44
  * <moni-file-field
45
- * label="Profile picture"
45
+ * label="Foto de perfil"
46
46
  * name="avatar"
47
47
  * accept="image/png, image/jpeg"
48
- * button-label="Browse..."
48
+ * button-label="Explorar..."
49
49
  * ></moni-file-field>
50
50
  *
51
- * <!-- Multiple file upload with error state -->
51
+ * <!-- Carga de múltiples archivos con estado de error -->
52
52
  * <moni-file-field
53
- * label="Documents"
53
+ * label="Documentos"
54
54
  * multiple
55
55
  * error
56
- * error-text="Files exceed maximum size limit"
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 - The outer `.field` div container.
61
- * @csspart input-text - The visible read-only `<input type="text">`.
62
- * @csspart label - The floating `<label>` element.
63
- * @csspart input-file - The hidden native `<input type="file">`.
64
- * @csspart button - The button element (styled via CSS `::file-selector-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('renders the icon name as text content', async () => {
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('renders slot fallback when no name is set', async () => {
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('reflects the name attribute', async () => {
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('applies the filled attribute', async () => {
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('reflects the size attribute', async () => {
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('inherits color from its parent (host color: inherit)', async () => {
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
- // The host declaration `color: inherit` should be present in the
63
- // shadow stylesheet so the Material Symbols glyph takes the parent
64
- // text color. jsdom does not fully resolve custom-property-driven
65
- // styles, so we just assert that the element renders inside the
66
- // colored wrapper without throwing.
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
- * Visual-only icon component using Material Symbols variable font.
13
+ * Componente de icono solo visual que utiliza la fuente variable Material Symbols.
14
14
  *
15
- * Renders a Material Symbols glyph by its ligature name. The icon font
16
- * must be loaded globally by the host document it is not bundled with
17
- * the component. Add the font via the `@moni-labs/moni-ui/styles` stylesheet
18
- * or by including the Google Fonts CDN link.
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
- * **Font rendering:**
21
- * The icon uses `font-family: var(--font-icon)` which defaults to
22
- * `'Material Symbols Rounded'`. Override `--font-icon-override` in the
23
- * host document's `:root` to switch to a different icon set variant
24
- * (e.g. `'Material Symbols Outlined'` or `'Material Symbols Sharp'`).
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
- * **Variable font settings:**
27
- * The default `font-variation-settings` is `'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24`.
28
- * Setting the `filled` attribute switches to `'FILL' 1` for the solid icon variant.
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
- * **Color inheritance:**
31
- * The icon always inherits color from its parent via `color: inherit`, making it
32
- * automatically adapt to button variants, chip selected states, list item active
33
- * states, and other color-context containers.
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
- * <!-- Basic icon -->
37
+ * <!-- Icono básico -->
38
38
  * <moni-icon name="home"></moni-icon>
39
39
  *
40
- * <!-- Filled large icon -->
40
+ * <!-- Icono grande rellenado -->
41
41
  * <moni-icon name="favorite" size="large" filled></moni-icon>
42
42
  *
43
- * <!-- Custom SVG override via slot -->
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 - Fallback content when `name` is empty. Accepts `<svg>` or `<img>`
50
- * elements which are sized to 100% of the icon box.
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 - Overrides the icon font family at the
53
- * document level. Set on `:root`.
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 ligature name for the icon to render.
58
+ * Nombre de la ligadura de Material Symbols para el icono a renderizar.
59
59
  *
60
- * Use the name exactly as shown on https://fonts.google.com/icons
61
- * (e.g. `'home'`, `'settings'`, `'arrow_forward'`).
62
- * When empty, the default slot is rendered instead.
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
- * Size of the icon bounding box.
69
+ * Tamaño de la caja delimitadora del icono.
70
70
  *
71
- * Maps to the `--_size` custom property:
72
- * | Value | Size |
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
- * When `true`, switches to the filled variant of the icon by setting
86
+ * Cuando es `true`, cambia a la variante rellenada (filled) del icono estableciendo
87
87
  * `font-variation-settings: 'FILL' 1`.
88
88
  *
89
- * This works only with variable icon fonts that include the `FILL` axis
90
- * (all Material Symbols variants do). It has no effect if a different
91
- * icon font is loaded that does not support `FILL`.
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
- /* Explicit inherit so the icon glyph picks up color from
122
- whatever consumer wraps it (button variants, chip selected
123
- state, list-item active, etc.). */
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('defaults to lines=1', async () => {
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('renders the headline slot', async () => {
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('does not render supporting/meta slots when lines=1', async () => {
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('renders supporting slot when lines=2', async () => {
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('renders meta slot when lines=3', async () => {
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('reflects active and disabled attributes', async () => {
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('renders an avatar when the avatar attribute is set', async () => {
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('renders a leading icon when the icon attribute is set', async () => {
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('renders a trailing icon when the trailing-icon attribute is set', async () => {
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('renders an <a> wrapper when href is set, otherwise the row is inline', async () => {
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();