@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
@@ -10,83 +10,83 @@ import { customElement, property } from 'lit/decorators.js';
10
10
  import { MoniElement, sharedStyles } from './_base/index.js';
11
11
 
12
12
  /**
13
- * Visual-only ripple decoration component.
13
+ * Componente de decoración de onda (ripple) puramente visual.
14
14
  *
15
- * Provides a pointer-origin ripple animation the expanding circle starts
16
- * at the exact pointer-down coordinates rather than the element's center.
17
- * This is the full-fidelity M3 ripple; for a simpler CSS-only center-ripple,
18
- * use the `interactionStyles` `.interactive::after` pseudo-element instead.
15
+ * Proporciona una animación de onda con origen en el puntero: el círculo expansivo comienza
16
+ * en las coordenadas exactas donde se pulsó (pointer-down) en lugar de en el centro del elemento.
17
+ * Esta es la onda M3 de alta fidelidad; para una onda central más simple solo con CSS,
18
+ * usa el pseudo-elemento `.interactive::after` de `interactionStyles` en su lugar.
19
19
  *
20
- * **Usage:**
21
- * Drop `<moni-ripple>` as a **child** of any interactive element. The component
22
- * automatically attaches a `pointerdown` listener to its `parentElement` and
23
- * calculates the ripple origin in percentage coordinates relative to the parent.
20
+ * **Uso:**
21
+ * Coloca `<moni-ripple>` como **hijo** de cualquier elemento interactivo. El componente
22
+ * adjunta automáticamente un listener de `pointerdown` a su `parentElement` y
23
+ * calcula el origen de la onda en coordenadas porcentuales relativas al padre.
24
24
  *
25
- * The parent element must NOT have `position: static` (the ripple applies
26
- * `position: relative` automatically in `connectedCallback`).
25
+ * El elemento padre NO debe tener `position: static` (la onda aplica
26
+ * `position: relative` automáticamente en `connectedCallback`).
27
27
  *
28
- * **Timing model:**
29
- * On `pointerdown`:
30
- * 1. `active = false` is set (cancels any in-progress ripple).
31
- * 2. A `requestAnimationFrame` tick ensures the browser has processed the reset.
32
- * 3. `active = true` triggers the CSS scale animation.
33
- * 4. A `setTimeout` of `duration` ms (based on `speed`) resets `active = false`.
28
+ * **Modelo de tiempo:**
29
+ * En `pointerdown`:
30
+ * 1. Se establece `active = false` (cancela cualquier onda en progreso).
31
+ * 2. Un tick de `requestAnimationFrame` asegura que el navegador haya procesado el reinicio.
32
+ * 3. `active = true` activa la animación de escala CSS.
33
+ * 4. Un `setTimeout` de duración `duration` ms (basado en `speed`) reinicia `active = false`.
34
34
  *
35
- * The duration matches the CSS transition duration so the opacity fade-out
36
- * completes before `active` is cleared.
35
+ * La duración coincide con la duración de la transición CSS para que el desvanecimiento de la opacidad
36
+ * se complete antes de que se limpie `active`.
37
37
  *
38
- * **Cleanup:**
39
- * `disconnectedCallback` removes the `pointerdown` listener and clears any
40
- * pending timeout. Always call `super.disconnectedCallback()` if subclassing.
38
+ * **Limpieza (Cleanup):**
39
+ * `disconnectedCallback` elimina el listener de `pointerdown` y borra cualquier
40
+ * tiempo de espera (timeout) pendiente. Llama siempre a `super.disconnectedCallback()` si usas subclases.
41
41
  *
42
42
  * @example
43
43
  * ```html
44
- * <!-- Ripple on a custom element -->
44
+ * <!-- Onda en un elemento personalizado -->
45
45
  * <div class="my-button" style="position: relative; overflow: hidden;">
46
- * Click me
46
+ * Haz clic
47
47
  * <moni-ripple color="primary"></moni-ripple>
48
48
  * </div>
49
49
  * ```
50
50
  *
51
- * @csspart ripple - The inner `<span>` that performs the scale animation.
51
+ * @csspart ripple - El `<span>` interno que realiza la animación de escala.
52
52
  */
53
53
  @customElement('moni-ripple')
54
54
  export class MoniRipple extends MoniElement {
55
55
  /**
56
- * Horizontal origin of the ripple as a percentage of the parent's width.
56
+ * Origen horizontal de la onda como porcentaje del ancho del padre.
57
57
  *
58
- * Set automatically by `_onPointerDown` based on the pointer coordinates.
59
- * Can be set manually to trigger a ripple at a specific location.
58
+ * Se establece automáticamente por `_onPointerDown` basándose en las coordenadas del puntero.
59
+ * Se puede configurar manualmente para activar una onda en una ubicación específica.
60
60
  *
61
61
  * @default 50
62
62
  */
63
63
  @property({ type: Number, reflect: true }) x = 50;
64
64
 
65
65
  /**
66
- * Vertical origin of the ripple as a percentage of the parent's height.
66
+ * Origen vertical de la onda como porcentaje de la altura del padre.
67
67
  *
68
- * Set automatically by `_onPointerDown` based on the pointer coordinates.
68
+ * Se establece automáticamente por `_onPointerDown` basándose en las coordenadas del puntero.
69
69
  *
70
70
  * @default 50
71
71
  */
72
72
  @property({ type: Number, reflect: true }) y = 50;
73
73
 
74
74
  /**
75
- * When `true`, the ripple is visible and animating.
75
+ * Cuando es `true`, la onda es visible y se está animando.
76
76
  *
77
- * Toggled automatically by `_onPointerDown`. Can be set manually for
78
- * programmatically-triggered ripple effects.
77
+ * Alternado automáticamente por `_onPointerDown`. Se puede configurar manualmente para
78
+ * efectos de onda disparados programáticamente.
79
79
  *
80
80
  * @default false
81
81
  */
82
82
  @property({ type: Boolean, reflect: true }) active = false;
83
83
 
84
84
  /**
85
- * Animation speed of the ripple expand-and-fade sequence.
85
+ * Velocidad de animación de la secuencia de expansión y desvanecimiento de la onda.
86
86
  *
87
- * Maps to the `--_dur` CSS custom property:
87
+ * Se asigna a la propiedad personalizada CSS `--_dur`:
88
88
  * - `'fast'` — 300ms
89
- * - `'normal'` — 600ms (default)
89
+ * - `'normal'` — 600ms (por defecto)
90
90
  * - `'slow'` — 1200ms
91
91
  *
92
92
  * @default 'normal'
@@ -95,14 +95,14 @@ export class MoniRipple extends MoniElement {
95
95
  speed: 'fast' | 'normal' | 'slow' = 'normal';
96
96
 
97
97
  /**
98
- * Color token for the ripple overlay.
98
+ * Token de color para la superposición de la onda.
99
99
  *
100
- * Sets the `color` CSS property on `:host`, which the `.ripple` span
101
- * inherits via `background-color: currentColor`.
100
+ * Establece la propiedad CSS `color` en `:host`, que el span `.ripple`
101
+ * hereda a través de `background-color: currentColor`.
102
102
  *
103
- * - `'primary'` — `--primary` (default)
103
+ * - `'primary'` — `--primary` (por defecto)
104
104
  * - `'secondary'` — `--secondary`
105
- * - `'surface'` — `--surface-variant` (subtle, for surface containers)
105
+ * - `'surface'` — `--surface-variant` (sutil, para contenedores de superficie)
106
106
  *
107
107
  * @default 'primary'
108
108
  */
@@ -110,25 +110,25 @@ export class MoniRipple extends MoniElement {
110
110
  color: 'primary' | 'secondary' | 'surface' = 'primary';
111
111
 
112
112
  /**
113
- * Reference to the parent element that the ripple is anchored to.
114
- * Populated in `connectedCallback`, cleared in `disconnectedCallback`.
113
+ * Referencia al elemento padre al que está anclada la onda.
114
+ * Poblado en `connectedCallback`, borrado en `disconnectedCallback`.
115
115
  */
116
116
  private _target: HTMLElement | null = null;
117
117
 
118
118
  /**
119
- * ID of the pending `setTimeout` that clears `active` after the animation.
120
- * Stored so it can be cancelled if a second pointer event fires before the
121
- * first ripple finishes (rapid double-tap prevention).
119
+ * ID del `setTimeout` pendiente que borra `active` después de la animación.
120
+ * Almacenado para que pueda cancelarse si se dispara un segundo evento de puntero antes
121
+ * de que termine la primera onda (prevención de doble toque rápido).
122
122
  */
123
123
  private _timeoutId: any = null;
124
124
 
125
125
  /**
126
- * Attaches the ripple to its parent element.
126
+ * Adjunta la onda a su elemento padre.
127
127
  *
128
- * - Stores a reference to `parentElement` for pointer event listening.
129
- * - Ensures the parent has `position: relative` so the ripple's `position: absolute`
130
- * stays within bounds.
131
- * - Registers the `_onPointerDown` event listener.
128
+ * - Almacena una referencia a `parentElement` para la escucha de eventos del puntero.
129
+ * - Asegura que el padre tenga `position: relative` para que el `position: absolute`
130
+ * de la onda se mantenga dentro de los límites.
131
+ * - Registra el listener de eventos `_onPointerDown`.
132
132
  */
133
133
  override connectedCallback() {
134
134
  super.connectedCallback();
@@ -143,10 +143,10 @@ export class MoniRipple extends MoniElement {
143
143
  }
144
144
 
145
145
  /**
146
- * Detaches the ripple from its parent element.
146
+ * Desvincula la onda de su elemento padre.
147
147
  *
148
- * Removes the `pointerdown` listener and clears any pending timeout to
149
- * prevent the `active` flag from being set after the element is removed.
148
+ * Elimina el listener de `pointerdown` y borra cualquier timeout pendiente para
149
+ * evitar que la bandera `active` se establezca después de que se elimine el elemento.
150
150
  */
151
151
  override disconnectedCallback() {
152
152
  if (this._target) {
@@ -159,13 +159,13 @@ export class MoniRipple extends MoniElement {
159
159
  }
160
160
 
161
161
  /**
162
- * Handles pointer-down events on the parent element.
162
+ * Maneja los eventos de puntero (pointer-down) en el elemento padre.
163
163
  *
164
- * Computes the ripple origin as a percentage of the parent's bounding rect,
165
- * cancels any in-progress ripple, then triggers a new one after one
166
- * animation frame to guarantee the CSS transition fires from the new position.
164
+ * Calcula el origen de la onda como un porcentaje del rectángulo delimitador (bounding rect) del padre,
165
+ * cancela cualquier onda en curso y luego activa una nueva después de un
166
+ * frame de animación para garantizar que la transición CSS se dispare desde la nueva posición.
167
167
  *
168
- * @param e - The `PointerEvent` from the parent's `pointerdown` listener.
168
+ * @param e - El `PointerEvent` del listener `pointerdown` del padre.
169
169
  */
170
170
  private _onPointerDown = (e: PointerEvent) => {
171
171
  if (!this._target) return;
@@ -245,6 +245,21 @@ export class MoniRipple extends MoniElement {
245
245
  `
246
246
  ];
247
247
 
248
+ /**
249
+ * Renderiza el elemento `<span>` de la onda con las coordenadas de origen actuales.
250
+ *
251
+ * Este método de renderizado intencionalmente hace muy poco: la onda es fundamentalmente
252
+ * una animación CSS (`scale`, `opacity`) impulsada por la clase `.active` que es
253
+ * alternada por la API de activación de JavaScript (`MoniRipple.activate()`).
254
+ *
255
+ * `--_x` y `--_y` inyectan el origen del toque/clic como valores porcentuales:
256
+ * - `x=0%, y=0%` — la onda se origina desde la esquina superior izquierda.
257
+ * - `x=50%, y=50%` — origen central (por defecto para activación por teclado).
258
+ * - `x=clientX%, y=clientY%` — onda con origen en el puntero para una sensación táctil natural.
259
+ *
260
+ * La clase CSS `.ripple` maneja la animación de expansión `scale(0)` → `scale(1)`
261
+ * y el desvanecimiento `opacity 1` → `opacity 0` a través de transiciones CSS en `.active`.
262
+ */
248
263
  override render() {
249
264
  return html`<span
250
265
  class="ripple"
@@ -16,7 +16,7 @@ describe('moni-segmented-button', () => {
16
16
  group.remove();
17
17
  });
18
18
 
19
- it('sets positioning shape properties on child segments', async () => {
19
+ it('establece propiedades de forma de posicionamiento en los segmentos hijos', async () => {
20
20
  const seg1 = document.createElement('moni-button-segment') as MoniButtonSegment;
21
21
  const seg2 = document.createElement('moni-button-segment') as MoniButtonSegment;
22
22
  const seg3 = document.createElement('moni-button-segment') as MoniButtonSegment;
@@ -34,7 +34,7 @@ describe('moni-segmented-button', () => {
34
34
  expect(seg3.position).toBe('last');
35
35
  });
36
36
 
37
- it('preserves positioning first/last when gap is set', async () => {
37
+ it('preserva el posicionamiento first/last cuando se establece gap', async () => {
38
38
  group.gap = 'small';
39
39
  const seg1 = document.createElement('moni-button-segment') as MoniButtonSegment;
40
40
  const seg2 = document.createElement('moni-button-segment') as MoniButtonSegment;
@@ -49,7 +49,7 @@ describe('moni-segmented-button', () => {
49
49
  expect(seg2.position).toBe('last');
50
50
  });
51
51
 
52
- it('manages checked state when clicked in single select mode', async () => {
52
+ it('maneja el estado checked al hacer clic en modo de selección única', async () => {
53
53
  const seg1 = document.createElement('moni-button-segment') as MoniButtonSegment;
54
54
  seg1.value = 'one';
55
55
  const seg2 = document.createElement('moni-button-segment') as MoniButtonSegment;
@@ -74,7 +74,7 @@ describe('moni-segmented-button', () => {
74
74
  expect(group.value).toBe('two');
75
75
  });
76
76
 
77
- it('manages checked state when clicked in multi select mode', async () => {
77
+ it('maneja el estado checked al hacer clic en modo de selección múltiple', async () => {
78
78
  group.multi = true;
79
79
  const seg1 = document.createElement('moni-button-segment') as MoniButtonSegment;
80
80
  seg1.value = 'one';
@@ -11,37 +11,37 @@ import { MoniElement, sharedStyles } from './_base/index.js';
11
11
  import { MoniButtonSegment } from './moni-button-segment.js';
12
12
 
13
13
  /**
14
- * Material Design 3 Segmented Button component (Legacy).
14
+ * Componente Material Design 3 Segmented Button (Botón Segmentado) (Heredado).
15
15
  *
16
- * A form-associated group of selectable segmented buttons.
16
+ * Un grupo de botones segmentados seleccionables asociado a formularios.
17
17
  *
18
- * **Deprecation Notice:** The M3 spec (`m3-docs/components/segmented-buttons/overview.md`)
19
- * has updated the segmented button pattern. The bespoke segments have been
20
- * replaced with standard `<moni-button>` elements grouped inside a
18
+ * **Aviso de obsolescencia (Deprecation Notice):** La especificación M3 (`m3-docs/components/segmented-buttons/overview.md`)
19
+ * ha actualizado el patrón de botones segmentados. Los segmentos a medida han sido
20
+ * reemplazados por elementos estándar `<moni-button>` agrupados dentro de un
21
21
  * `<moni-button-group variant="connected">`.
22
22
  *
23
- * This component continues to work for backward compatibility but will be
24
- * removed in v1.0. A deprecation warning is logged to the console when the
25
- * element is connected to the DOM.
23
+ * Este componente sigue funcionando para mantener la compatibilidad con versiones anteriores, pero será
24
+ * eliminado en la v1.0. Se registra una advertencia de obsolescencia en la consola cuando el
25
+ * elemento se conecta al DOM.
26
26
  *
27
- * @deprecated Use `<moni-button-group variant="connected">` instead.
27
+ * @deprecated Usa `<moni-button-group variant="connected">` en su lugar.
28
28
  *
29
29
  * @example
30
30
  * ```html
31
- * <!-- Legacy usage (not recommended) -->
31
+ * <!-- Uso heredado (no recomendado) -->
32
32
  * <moni-segmented-button name="view" multi>
33
- * <moni-button-segment value="day">Day</moni-button-segment>
34
- * <moni-button-segment value="week">Week</moni-button-segment>
33
+ * <moni-button-segment value="day">Día</moni-button-segment>
34
+ * <moni-button-segment value="week">Semana</moni-button-segment>
35
35
  * </moni-segmented-button>
36
36
  *
37
- * <!-- Modern M3 equivalent -->
37
+ * <!-- Equivalente M3 moderno -->
38
38
  * <moni-button-group variant="connected">
39
- * <moni-button>Day</moni-button>
40
- * <moni-button>Week</moni-button>
39
+ * <moni-button>Día</moni-button>
40
+ * <moni-button>Semana</moni-button>
41
41
  * </moni-button-group>
42
42
  * ```
43
43
  *
44
- * @slot default - `<moni-button-segment>` elements.
44
+ * @slot default - elementos `<moni-button-segment>`.
45
45
  */
46
46
  @customElement('moni-segmented-button')
47
47
  export class MoniSegmentedButton extends MoniElement {
@@ -49,18 +49,39 @@ export class MoniSegmentedButton extends MoniElement {
49
49
 
50
50
  private static _deprecationWarned = false;
51
51
 
52
+ /**
53
+ * Nombre del botón segmentado, usado para el envío del formulario.
54
+ * @type {string}
55
+ */
52
56
  @property({ reflect: true })
53
57
  name = '';
54
58
 
59
+ /**
60
+ * Permite seleccionar múltiples segmentos simultáneamente.
61
+ * @type {boolean}
62
+ */
55
63
  @property({ type: Boolean, reflect: true })
56
64
  multi = false;
57
65
 
66
+ /**
67
+ * Tamaño de los segmentos del botón.
68
+ * @type {'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'extra'}
69
+ * @default 'medium'
70
+ */
58
71
  @property({ reflect: true })
59
72
  size: 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'extra' = 'medium';
60
73
 
74
+ /**
75
+ * Oculta el icono de marca de verificación principal (leading checkmark) cuando se selecciona un segmento.
76
+ * @type {boolean}
77
+ */
61
78
  @property({ type: Boolean, reflect: true, attribute: 'hide-check' })
62
79
  hideCheck = false;
63
80
 
81
+ /**
82
+ * Define un espaciado personalizado entre segmentos.
83
+ * @type {string}
84
+ */
64
85
  @property()
65
86
  gap = '';
66
87
 
@@ -69,6 +90,11 @@ export class MoniSegmentedButton extends MoniElement {
69
90
 
70
91
  private internals: ElementInternals;
71
92
 
93
+ /**
94
+ * Constructor del componente.
95
+ * Inicializa ElementInternals (`attachInternals`) para integrar el custom element
96
+ * nativamente en formularios HTML, permitiéndole participar en validaciones y envíos de datos.
97
+ */
72
98
  constructor() {
73
99
  super();
74
100
  this.internals = this.attachInternals();
@@ -89,10 +115,17 @@ export class MoniSegmentedButton extends MoniElement {
89
115
  }
90
116
  }
91
117
 
118
+ /**
119
+ * Expone el formulario anfitrión al que pertenece este componente,
120
+ * derivado de la API de ElementInternals.
121
+ */
92
122
  get form() {
93
123
  return this.internals.form;
94
124
  }
95
125
 
126
+ /**
127
+ * Define el tipo semántico del control de formulario.
128
+ */
96
129
  get type() {
97
130
  return 'segmented-button';
98
131
  }
@@ -132,6 +165,12 @@ export class MoniSegmentedButton extends MoniElement {
132
165
  `
133
166
  ];
134
167
 
168
+ /**
169
+ * Hook del ciclo de vida reactivo (Lit).
170
+ * Enlaza propiedades estructurales (como el gap o la visibilidad de los checks)
171
+ * desde el contenedor padre hacia los segmentos hijos y comunica el nuevo valor
172
+ * consolidado al formulario subyacente cada vez que el estado cambia.
173
+ */
135
174
  protected override updated(changedProperties: Map<string | number | symbol, unknown>) {
136
175
  super.updated(changedProperties);
137
176
  if (changedProperties.has('hideCheck') || changedProperties.has('size') || changedProperties.has('gap')) {
@@ -140,6 +179,11 @@ export class MoniSegmentedButton extends MoniElement {
140
179
  this.updateFormValue();
141
180
  }
142
181
 
182
+ /**
183
+ * Manejador del Slot Change.
184
+ * Re-evalúa jerárquicamente a los hijos proyectados si el DOM muta,
185
+ * reactualizando su topología visual (`border-radius`) y su valor en el form.
186
+ */
143
187
  private handleSlotChange() {
144
188
  this.updateChildren();
145
189
  this.updateFormValue();
@@ -156,6 +200,12 @@ export class MoniSegmentedButton extends MoniElement {
156
200
  return gap;
157
201
  }
158
202
 
203
+ /**
204
+ * Patrón "Top-Down" para inyectar configuración visual y de posición a los segmentos hijos.
205
+ * Dado que CSS no puede pasar atributos reactivos fácilmente a hijos proyectados (<slot>),
206
+ * JS itera los hijos y les asigna si son 'first', 'middle' o 'last' para manejar
207
+ * el `border-radius` continuo.
208
+ */
159
209
  private updateChildren() {
160
210
  const segments = this.segments;
161
211
  const len = segments.length;
@@ -176,12 +226,22 @@ export class MoniSegmentedButton extends MoniElement {
176
226
  });
177
227
  }
178
228
 
229
+ /**
230
+ * Sincroniza el valor interno del componente (`this.value`) con
231
+ * la estructura nativa del formulario utilizando la API de `ElementInternals.setFormValue`.
232
+ * Permite que los datos viajen de forma natural al hacer submit.
233
+ */
179
234
  private updateFormValue() {
180
235
  if (typeof this.internals.setFormValue === 'function') {
181
236
  this.internals.setFormValue(this.value);
182
237
  }
183
238
  }
184
239
 
240
+ /**
241
+ * Delegación de eventos (Event Delegation) capturando el click en el contenedor padre.
242
+ * Maneja la lógica de exclusión mutua (single selection) estilo Radio Button
243
+ * o la selección aditiva estilo Checkbox cuando `multi` es true.
244
+ */
185
245
  private handleClick(e: Event) {
186
246
  const target = e.target as HTMLElement;
187
247
  const clickedSegment = target.closest('moni-button-segment') as MoniButtonSegment | null;
@@ -193,11 +253,13 @@ export class MoniSegmentedButton extends MoniElement {
193
253
  const segments = this.segments;
194
254
 
195
255
  if (this.multi) {
256
+ // Toggle independiente
196
257
  clickedSegment.checked = !clickedSegment.checked;
197
258
  } else {
259
+ // Comportamiento de grupo radio: deseleccionar hermanos
198
260
  segments.forEach((seg) => {
199
261
  if (seg === clickedSegment) {
200
- seg.checked = !seg.checked;
262
+ seg.checked = !seg.checked; // Permite toggle off incluso en single mode (comportamiento M3)
201
263
  } else {
202
264
  seg.checked = false;
203
265
  }
@@ -219,6 +281,21 @@ export class MoniSegmentedButton extends MoniElement {
219
281
  );
220
282
  }
221
283
 
284
+ /**
285
+ * Renderiza el contenedor del botón segmentado con un `role="group"` y su superposición de indicador GSAP.
286
+ *
287
+ * **Indicador deslizante:**
288
+ * Un `<div>` `.indicator` se posiciona de forma absoluta dentro del contenedor del grupo.
289
+ * GSAP anima su `left` y `width` para deslizarse de un segmento a otro
290
+ * cuando la selección cambia (resaltado del segmento seleccionado del Segmented Button M3).
291
+ * En el primer renderizado, el indicador se posiciona instantáneamente (sin transición); los cambios
292
+ * posteriores usan `gsap.to()` con la curva de animación (easing) `_speed2` para un deslizamiento suave.
293
+ *
294
+ * **Sincronización `@slotchange`:**
295
+ * Cuando los segmentos se agregan/eliminan en tiempo de ejecución, `_syncSegments()` vuelve a leer
296
+ * los elementos asignados a la ranura (slot) y actualiza los atributos `first` / `last` de cada segmento
297
+ * para controlar el border-radius en los segmentos terminales.
298
+ */
222
299
  override render() {
223
300
  const resolvedGap = this.getGapValue(this.gap);
224
301
  const inlineStyles = resolvedGap
@@ -10,42 +10,41 @@ import { customElement, property } from 'lit/decorators.js';
10
10
  import { MoniElement, sharedStyles } from './_base/index.js';
11
11
 
12
12
  /**
13
- * Material Design 3 Select Option component.
13
+ * Componente Material Design 3 Select Option (Opción de Selección).
14
14
  *
15
- * An individual selectable item designed to be placed inside a
16
- * `<moni-select>` dropdown.
15
+ * Un elemento individual seleccionable diseñado para colocarse dentro de un
16
+ * menú desplegable `<moni-select>`.
17
17
  *
18
- * **Interaction and layout:**
19
- * Options are rendered as accessible `<li>` elements styled identically to
20
- * `<moni-menu-item>`. When slotted into a `<moni-select>`, the parent
21
- * component extracts their `value`, `label`, and `group` attributes to build
22
- * its internal data model and handles the actual selection logic, keyboard
23
- * navigation, and rendering within the dropdown popup.
18
+ * **Interacción y diseño (layout):**
19
+ * Las opciones se renderizan como elementos `<li>` accesibles estilizados de forma idéntica a
20
+ * `<moni-menu-item>`. Cuando se insertan en un `<moni-select>`, el componente
21
+ * padre extrae sus atributos `value`, `label` y `group` para construir
22
+ * su modelo de datos interno y maneja la lógica de selección real, la navegación
23
+ * por teclado y el renderizado dentro del popup desplegable.
24
24
  *
25
- * **Grouping:**
26
- * Options can be categorized into subcategories by providing a `group`
27
- * attribute. The parent `<moni-select>` uses this to automatically generate
28
- * group headers (`<moni-select-group>`) in the dropdown list.
25
+ * **Agrupación:**
26
+ * Las opciones se pueden clasificar en subcategorías proporcionando un atributo
27
+ * `group`. El `<moni-select>` padre usa esto para generar automáticamente
28
+ * encabezados de grupo (`<moni-select-group>`) en la lista desplegable.
29
29
  *
30
30
  * @example
31
31
  * ```html
32
- * <moni-select label="Favorite framework">
33
- * <!-- Standard option -->
32
+ * <moni-select label="Framework favorito">
33
+ * <!-- Opción estándar -->
34
34
  * <moni-select-option value="lit">Lit Element</moni-select-option>
35
35
  *
36
- * <!-- Disabled option -->
37
- * <moni-select-option value="react" disabled>React (not allowed)</moni-select-option>
36
+ * <!-- Opción deshabilitada -->
37
+ * <moni-select-option value="react" disabled>React (no permitido)</moni-select-option>
38
38
  *
39
- * <!-- Grouped option -->
40
- * <moni-select-option value="vue" group="Other">Vue.js</moni-select-option>
39
+ * <!-- Opción agrupada -->
40
+ * <moni-select-option value="vue" group="Otros">Vue.js</moni-select-option>
41
41
  * </moni-select>
42
42
  * ```
43
43
  *
44
- * @slot default - The text label for the option. If the `label` attribute is
45
- * omitted, the parent `<moni-select>` will read this slot's
46
- * `textContent`.
44
+ * @slot default - La etiqueta de texto para la opción. Si se omite el atributo `label`,
45
+ * el `<moni-select>` padre leerá el `textContent` de esta ranura (slot).
47
46
  *
48
- * @csspart item - The outer `<li>` element.
47
+ * @csspart item - El elemento `<li>` exterior.
49
48
  */
50
49
  @customElement('moni-select-option')
51
50
  export class MoniSelectOption extends MoniElement {
@@ -101,6 +100,14 @@ export class MoniSelectOption extends MoniElement {
101
100
  `
102
101
  ];
103
102
 
103
+ /**
104
+ * Renderiza la fila de la opción como un elemento de lista accesible con `role="option"`.
105
+ *
106
+ * `aria-selected=${this.selected}` permite a los lectores de pantalla anunciar el estado
107
+ * de selección actual cuando el usuario navega por el cuadro de lista con las teclas de flecha.
108
+ * Cuando `selected=true`, se renderiza un icono de marca de verificación principal (leading checkmark) a través de `<moni-icon name="check">`
109
+ * en lugar del slot del icono principal, según la especificación de opciones de Select de M3.
110
+ */
104
111
  override render() {
105
112
  return html`<li
106
113
  part="option"