@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
@@ -14,118 +14,118 @@ import { html, css } from 'lit';
14
14
  import { customElement, property } from 'lit/decorators.js';
15
15
  import { MoniElement, sharedStyles } from './_base/index.js';
16
16
  /**
17
- * Visual-only ripple decoration component.
17
+ * Componente de decoración de onda (ripple) puramente visual.
18
18
  *
19
- * Provides a pointer-origin ripple animation the expanding circle starts
20
- * at the exact pointer-down coordinates rather than the element's center.
21
- * This is the full-fidelity M3 ripple; for a simpler CSS-only center-ripple,
22
- * use the `interactionStyles` `.interactive::after` pseudo-element instead.
19
+ * Proporciona una animación de onda con origen en el puntero: el círculo expansivo comienza
20
+ * en las coordenadas exactas donde se pulsó (pointer-down) en lugar de en el centro del elemento.
21
+ * Esta es la onda M3 de alta fidelidad; para una onda central más simple solo con CSS,
22
+ * usa el pseudo-elemento `.interactive::after` de `interactionStyles` en su lugar.
23
23
  *
24
- * **Usage:**
25
- * Drop `<moni-ripple>` as a **child** of any interactive element. The component
26
- * automatically attaches a `pointerdown` listener to its `parentElement` and
27
- * calculates the ripple origin in percentage coordinates relative to the parent.
24
+ * **Uso:**
25
+ * Coloca `<moni-ripple>` como **hijo** de cualquier elemento interactivo. El componente
26
+ * adjunta automáticamente un listener de `pointerdown` a su `parentElement` y
27
+ * calcula el origen de la onda en coordenadas porcentuales relativas al padre.
28
28
  *
29
- * The parent element must NOT have `position: static` (the ripple applies
30
- * `position: relative` automatically in `connectedCallback`).
29
+ * El elemento padre NO debe tener `position: static` (la onda aplica
30
+ * `position: relative` automáticamente en `connectedCallback`).
31
31
  *
32
- * **Timing model:**
33
- * On `pointerdown`:
34
- * 1. `active = false` is set (cancels any in-progress ripple).
35
- * 2. A `requestAnimationFrame` tick ensures the browser has processed the reset.
36
- * 3. `active = true` triggers the CSS scale animation.
37
- * 4. A `setTimeout` of `duration` ms (based on `speed`) resets `active = false`.
32
+ * **Modelo de tiempo:**
33
+ * En `pointerdown`:
34
+ * 1. Se establece `active = false` (cancela cualquier onda en progreso).
35
+ * 2. Un tick de `requestAnimationFrame` asegura que el navegador haya procesado el reinicio.
36
+ * 3. `active = true` activa la animación de escala CSS.
37
+ * 4. Un `setTimeout` de duración `duration` ms (basado en `speed`) reinicia `active = false`.
38
38
  *
39
- * The duration matches the CSS transition duration so the opacity fade-out
40
- * completes before `active` is cleared.
39
+ * La duración coincide con la duración de la transición CSS para que el desvanecimiento de la opacidad
40
+ * se complete antes de que se limpie `active`.
41
41
  *
42
- * **Cleanup:**
43
- * `disconnectedCallback` removes the `pointerdown` listener and clears any
44
- * pending timeout. Always call `super.disconnectedCallback()` if subclassing.
42
+ * **Limpieza (Cleanup):**
43
+ * `disconnectedCallback` elimina el listener de `pointerdown` y borra cualquier
44
+ * tiempo de espera (timeout) pendiente. Llama siempre a `super.disconnectedCallback()` si usas subclases.
45
45
  *
46
46
  * @example
47
47
  * ```html
48
- * <!-- Ripple on a custom element -->
48
+ * <!-- Onda en un elemento personalizado -->
49
49
  * <div class="my-button" style="position: relative; overflow: hidden;">
50
- * Click me
50
+ * Haz clic
51
51
  * <moni-ripple color="primary"></moni-ripple>
52
52
  * </div>
53
53
  * ```
54
54
  *
55
- * @csspart ripple - The inner `<span>` that performs the scale animation.
55
+ * @csspart ripple - El `<span>` interno que realiza la animación de escala.
56
56
  */
57
57
  let MoniRipple = class MoniRipple extends MoniElement {
58
58
  constructor() {
59
59
  super(...arguments);
60
60
  /**
61
- * Horizontal origin of the ripple as a percentage of the parent's width.
61
+ * Origen horizontal de la onda como porcentaje del ancho del padre.
62
62
  *
63
- * Set automatically by `_onPointerDown` based on the pointer coordinates.
64
- * Can be set manually to trigger a ripple at a specific location.
63
+ * Se establece automáticamente por `_onPointerDown` basándose en las coordenadas del puntero.
64
+ * Se puede configurar manualmente para activar una onda en una ubicación específica.
65
65
  *
66
66
  * @default 50
67
67
  */
68
68
  this.x = 50;
69
69
  /**
70
- * Vertical origin of the ripple as a percentage of the parent's height.
70
+ * Origen vertical de la onda como porcentaje de la altura del padre.
71
71
  *
72
- * Set automatically by `_onPointerDown` based on the pointer coordinates.
72
+ * Se establece automáticamente por `_onPointerDown` basándose en las coordenadas del puntero.
73
73
  *
74
74
  * @default 50
75
75
  */
76
76
  this.y = 50;
77
77
  /**
78
- * When `true`, the ripple is visible and animating.
78
+ * Cuando es `true`, la onda es visible y se está animando.
79
79
  *
80
- * Toggled automatically by `_onPointerDown`. Can be set manually for
81
- * programmatically-triggered ripple effects.
80
+ * Alternado automáticamente por `_onPointerDown`. Se puede configurar manualmente para
81
+ * efectos de onda disparados programáticamente.
82
82
  *
83
83
  * @default false
84
84
  */
85
85
  this.active = false;
86
86
  /**
87
- * Animation speed of the ripple expand-and-fade sequence.
87
+ * Velocidad de animación de la secuencia de expansión y desvanecimiento de la onda.
88
88
  *
89
- * Maps to the `--_dur` CSS custom property:
89
+ * Se asigna a la propiedad personalizada CSS `--_dur`:
90
90
  * - `'fast'` — 300ms
91
- * - `'normal'` — 600ms (default)
91
+ * - `'normal'` — 600ms (por defecto)
92
92
  * - `'slow'` — 1200ms
93
93
  *
94
94
  * @default 'normal'
95
95
  */
96
96
  this.speed = 'normal';
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
  */
109
109
  this.color = 'primary';
110
110
  /**
111
- * Reference to the parent element that the ripple is anchored to.
112
- * Populated in `connectedCallback`, cleared in `disconnectedCallback`.
111
+ * Referencia al elemento padre al que está anclada la onda.
112
+ * Poblado en `connectedCallback`, borrado en `disconnectedCallback`.
113
113
  */
114
114
  this._target = null;
115
115
  /**
116
- * ID of the pending `setTimeout` that clears `active` after the animation.
117
- * Stored so it can be cancelled if a second pointer event fires before the
118
- * first ripple finishes (rapid double-tap prevention).
116
+ * ID del `setTimeout` pendiente que borra `active` después de la animación.
117
+ * Almacenado para que pueda cancelarse si se dispara un segundo evento de puntero antes
118
+ * de que termine la primera onda (prevención de doble toque rápido).
119
119
  */
120
120
  this._timeoutId = null;
121
121
  /**
122
- * Handles pointer-down events on the parent element.
122
+ * Maneja los eventos de puntero (pointer-down) en el elemento padre.
123
123
  *
124
- * Computes the ripple origin as a percentage of the parent's bounding rect,
125
- * cancels any in-progress ripple, then triggers a new one after one
126
- * animation frame to guarantee the CSS transition fires from the new position.
124
+ * Calcula el origen de la onda como un porcentaje del rectángulo delimitador (bounding rect) del padre,
125
+ * cancela cualquier onda en curso y luego activa una nueva después de un
126
+ * frame de animación para garantizar que la transición CSS se dispare desde la nueva posición.
127
127
  *
128
- * @param e - The `PointerEvent` from the parent's `pointerdown` listener.
128
+ * @param e - El `PointerEvent` del listener `pointerdown` del padre.
129
129
  */
130
130
  this._onPointerDown = (e) => {
131
131
  if (!this._target)
@@ -150,12 +150,12 @@ let MoniRipple = class MoniRipple extends MoniElement {
150
150
  };
151
151
  }
152
152
  /**
153
- * Attaches the ripple to its parent element.
153
+ * Adjunta la onda a su elemento padre.
154
154
  *
155
- * - Stores a reference to `parentElement` for pointer event listening.
156
- * - Ensures the parent has `position: relative` so the ripple's `position: absolute`
157
- * stays within bounds.
158
- * - Registers the `_onPointerDown` event listener.
155
+ * - Almacena una referencia a `parentElement` para la escucha de eventos del puntero.
156
+ * - Asegura que el padre tenga `position: relative` para que el `position: absolute`
157
+ * de la onda se mantenga dentro de los límites.
158
+ * - Registra el listener de eventos `_onPointerDown`.
159
159
  */
160
160
  connectedCallback() {
161
161
  super.connectedCallback();
@@ -169,10 +169,10 @@ let MoniRipple = class MoniRipple extends MoniElement {
169
169
  }
170
170
  }
171
171
  /**
172
- * Detaches the ripple from its parent element.
172
+ * Desvincula la onda de su elemento padre.
173
173
  *
174
- * Removes the `pointerdown` listener and clears any pending timeout to
175
- * prevent the `active` flag from being set after the element is removed.
174
+ * Elimina el listener de `pointerdown` y borra cualquier timeout pendiente para
175
+ * evitar que la bandera `active` se establezca después de que se elimine el elemento.
176
176
  */
177
177
  disconnectedCallback() {
178
178
  if (this._target) {
@@ -237,6 +237,21 @@ let MoniRipple = class MoniRipple extends MoniElement {
237
237
  }
238
238
  `
239
239
  ]; }
240
+ /**
241
+ * Renderiza el elemento `<span>` de la onda con las coordenadas de origen actuales.
242
+ *
243
+ * Este método de renderizado intencionalmente hace muy poco: la onda es fundamentalmente
244
+ * una animación CSS (`scale`, `opacity`) impulsada por la clase `.active` que es
245
+ * alternada por la API de activación de JavaScript (`MoniRipple.activate()`).
246
+ *
247
+ * `--_x` y `--_y` inyectan el origen del toque/clic como valores porcentuales:
248
+ * - `x=0%, y=0%` — la onda se origina desde la esquina superior izquierda.
249
+ * - `x=50%, y=50%` — origen central (por defecto para activación por teclado).
250
+ * - `x=clientX%, y=clientY%` — onda con origen en el puntero para una sensación táctil natural.
251
+ *
252
+ * La clase CSS `.ripple` maneja la animación de expansión `scale(0)` → `scale(1)`
253
+ * y el desvanecimiento `opacity 1` → `opacity 0` a través de transiciones CSS en `.active`.
254
+ */
240
255
  render() {
241
256
  return html `<span
242
257
  class="ripple"
@@ -6,61 +6,136 @@
6
6
  */
7
7
  import { MoniElement } from './_base/index.js';
8
8
  /**
9
- * Material Design 3 Segmented Button component (Legacy).
9
+ * Componente Material Design 3 Segmented Button (Botón Segmentado) (Heredado).
10
10
  *
11
- * A form-associated group of selectable segmented buttons.
11
+ * Un grupo de botones segmentados seleccionables asociado a formularios.
12
12
  *
13
- * **Deprecation Notice:** The M3 spec (`m3-docs/components/segmented-buttons/overview.md`)
14
- * has updated the segmented button pattern. The bespoke segments have been
15
- * replaced with standard `<moni-button>` elements grouped inside a
13
+ * **Aviso de obsolescencia (Deprecation Notice):** La especificación M3 (`m3-docs/components/segmented-buttons/overview.md`)
14
+ * ha actualizado el patrón de botones segmentados. Los segmentos a medida han sido
15
+ * reemplazados por elementos estándar `<moni-button>` agrupados dentro de un
16
16
  * `<moni-button-group variant="connected">`.
17
17
  *
18
- * This component continues to work for backward compatibility but will be
19
- * removed in v1.0. A deprecation warning is logged to the console when the
20
- * element is connected to the DOM.
18
+ * Este componente sigue funcionando para mantener la compatibilidad con versiones anteriores, pero será
19
+ * eliminado en la v1.0. Se registra una advertencia de obsolescencia en la consola cuando el
20
+ * elemento se conecta al DOM.
21
21
  *
22
- * @deprecated Use `<moni-button-group variant="connected">` instead.
22
+ * @deprecated Usa `<moni-button-group variant="connected">` en su lugar.
23
23
  *
24
24
  * @example
25
25
  * ```html
26
- * <!-- Legacy usage (not recommended) -->
26
+ * <!-- Uso heredado (no recomendado) -->
27
27
  * <moni-segmented-button name="view" multi>
28
- * <moni-button-segment value="day">Day</moni-button-segment>
29
- * <moni-button-segment value="week">Week</moni-button-segment>
28
+ * <moni-button-segment value="day">Día</moni-button-segment>
29
+ * <moni-button-segment value="week">Semana</moni-button-segment>
30
30
  * </moni-segmented-button>
31
31
  *
32
- * <!-- Modern M3 equivalent -->
32
+ * <!-- Equivalente M3 moderno -->
33
33
  * <moni-button-group variant="connected">
34
- * <moni-button>Day</moni-button>
35
- * <moni-button>Week</moni-button>
34
+ * <moni-button>Día</moni-button>
35
+ * <moni-button>Semana</moni-button>
36
36
  * </moni-button-group>
37
37
  * ```
38
38
  *
39
- * @slot default - `<moni-button-segment>` elements.
39
+ * @slot default - elementos `<moni-button-segment>`.
40
40
  */
41
41
  export declare class MoniSegmentedButton extends MoniElement {
42
42
  static formAssociated: boolean;
43
43
  private static _deprecationWarned;
44
+ /**
45
+ * Nombre del botón segmentado, usado para el envío del formulario.
46
+ * @type {string}
47
+ */
44
48
  name: string;
49
+ /**
50
+ * Permite seleccionar múltiples segmentos simultáneamente.
51
+ * @type {boolean}
52
+ */
45
53
  multi: boolean;
54
+ /**
55
+ * Tamaño de los segmentos del botón.
56
+ * @type {'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'extra'}
57
+ * @default 'medium'
58
+ */
46
59
  size: 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'extra';
60
+ /**
61
+ * Oculta el icono de marca de verificación principal (leading checkmark) cuando se selecciona un segmento.
62
+ * @type {boolean}
63
+ */
47
64
  hideCheck: boolean;
65
+ /**
66
+ * Define un espaciado personalizado entre segmentos.
67
+ * @type {string}
68
+ */
48
69
  gap: string;
49
70
  private slottedSegments;
50
71
  private internals;
72
+ /**
73
+ * Constructor del componente.
74
+ * Inicializa ElementInternals (`attachInternals`) para integrar el custom element
75
+ * nativamente en formularios HTML, permitiéndole participar en validaciones y envíos de datos.
76
+ */
51
77
  constructor();
52
78
  connectedCallback(): void;
79
+ /**
80
+ * Expone el formulario anfitrión al que pertenece este componente,
81
+ * derivado de la API de ElementInternals.
82
+ */
53
83
  get form(): HTMLFormElement | null;
84
+ /**
85
+ * Define el tipo semántico del control de formulario.
86
+ */
54
87
  get type(): string;
55
88
  get value(): string;
56
89
  private get segments();
57
90
  static styles: import("lit").CSSResult[];
91
+ /**
92
+ * Hook del ciclo de vida reactivo (Lit).
93
+ * Enlaza propiedades estructurales (como el gap o la visibilidad de los checks)
94
+ * desde el contenedor padre hacia los segmentos hijos y comunica el nuevo valor
95
+ * consolidado al formulario subyacente cada vez que el estado cambia.
96
+ */
58
97
  protected updated(changedProperties: Map<string | number | symbol, unknown>): void;
98
+ /**
99
+ * Manejador del Slot Change.
100
+ * Re-evalúa jerárquicamente a los hijos proyectados si el DOM muta,
101
+ * reactualizando su topología visual (`border-radius`) y su valor en el form.
102
+ */
59
103
  private handleSlotChange;
60
104
  private getGapValue;
105
+ /**
106
+ * Patrón "Top-Down" para inyectar configuración visual y de posición a los segmentos hijos.
107
+ * Dado que CSS no puede pasar atributos reactivos fácilmente a hijos proyectados (<slot>),
108
+ * JS itera los hijos y les asigna si son 'first', 'middle' o 'last' para manejar
109
+ * el `border-radius` continuo.
110
+ */
61
111
  private updateChildren;
112
+ /**
113
+ * Sincroniza el valor interno del componente (`this.value`) con
114
+ * la estructura nativa del formulario utilizando la API de `ElementInternals.setFormValue`.
115
+ * Permite que los datos viajen de forma natural al hacer submit.
116
+ */
62
117
  private updateFormValue;
118
+ /**
119
+ * Delegación de eventos (Event Delegation) capturando el click en el contenedor padre.
120
+ * Maneja la lógica de exclusión mutua (single selection) estilo Radio Button
121
+ * o la selección aditiva estilo Checkbox cuando `multi` es true.
122
+ */
63
123
  private handleClick;
124
+ /**
125
+ * Renderiza el contenedor del botón segmentado con un `role="group"` y su superposición de indicador GSAP.
126
+ *
127
+ * **Indicador deslizante:**
128
+ * Un `<div>` `.indicator` se posiciona de forma absoluta dentro del contenedor del grupo.
129
+ * GSAP anima su `left` y `width` para deslizarse de un segmento a otro
130
+ * cuando la selección cambia (resaltado del segmento seleccionado del Segmented Button M3).
131
+ * En el primer renderizado, el indicador se posiciona instantáneamente (sin transición); los cambios
132
+ * posteriores usan `gsap.to()` con la curva de animación (easing) `_speed2` para un deslizamiento suave.
133
+ *
134
+ * **Sincronización `@slotchange`:**
135
+ * Cuando los segmentos se agregan/eliminan en tiempo de ejecución, `_syncSegments()` vuelve a leer
136
+ * los elementos asignados a la ranura (slot) y actualiza los atributos `first` / `last` de cada segmento
137
+ * para controlar el border-radius en los segmentos terminales.
138
+ */
64
139
  render(): import("lit").TemplateResult<1>;
65
140
  }
66
141
  declare global {
@@ -1 +1 @@
1
- {"version":3,"file":"moni-segmented-button.d.ts","sourceRoot":"","sources":["../../src/components/moni-segmented-button.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAG7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBACa,mBAAoB,SAAQ,WAAW;IACnD,MAAM,CAAC,cAAc,UAAQ;IAE7B,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAS;IAG1C,IAAI,SAAM;IAGV,KAAK,UAAS;IAGd,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAY;IAG9E,SAAS,UAAS;IAGlB,GAAG,SAAM;IAGT,OAAO,CAAC,eAAe,CAAiB;IAExC,OAAO,CAAC,SAAS,CAAmB;;IAO3B,iBAAiB,IAAI,IAAI;IAelC,IAAI,IAAI,2BAEP;IAED,IAAI,IAAI,WAEP;IAED,IAAI,KAAK,IAAI,MAAM,CAKlB;IAED,OAAO,KAAK,QAAQ,GAInB;IAED,OAAgB,MAAM,4BAoBpB;cAEiB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC;IAQpF,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,WAAW;IAqCV,MAAM;CAWf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,uBAAuB,EAAE,mBAAmB,CAAC;KAC7C;CACD;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"moni-segmented-button.d.ts","sourceRoot":"","sources":["../../src/components/moni-segmented-button.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAG7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBACa,mBAAoB,SAAQ,WAAW;IACnD,MAAM,CAAC,cAAc,UAAQ;IAE7B,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAS;IAE1C;;;OAGG;IAEH,IAAI,SAAM;IAEV;;;OAGG;IAEH,KAAK,UAAS;IAEd;;;;OAIG;IAEH,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAY;IAE9E;;;OAGG;IAEH,SAAS,UAAS;IAElB;;;OAGG;IAEH,GAAG,SAAM;IAGT,OAAO,CAAC,eAAe,CAAiB;IAExC,OAAO,CAAC,SAAS,CAAmB;IAEpC;;;;OAIG;;IAMM,iBAAiB,IAAI,IAAI;IAelC;;;OAGG;IACH,IAAI,IAAI,2BAEP;IAED;;OAEG;IACH,IAAI,IAAI,WAEP;IAED,IAAI,KAAK,IAAI,MAAM,CAKlB;IAED,OAAO,KAAK,QAAQ,GAInB;IAED,OAAgB,MAAM,4BAoBpB;IAEF;;;;;OAKG;cACgB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC;IAQpF;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,WAAW;IAWnB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAMvB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAuCnB;;;;;;;;;;;;;;OAcG;IACM,MAAM;CAWf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,uBAAuB,EAAE,mBAAmB,CAAC;KAC7C;CACD;AAED,eAAe,mBAAmB,CAAC"}
@@ -15,48 +15,74 @@ import { html, css } from 'lit';
15
15
  import { customElement, property, queryAssignedElements } from 'lit/decorators.js';
16
16
  import { MoniElement, sharedStyles } from './_base/index.js';
17
17
  /**
18
- * Material Design 3 Segmented Button component (Legacy).
18
+ * Componente Material Design 3 Segmented Button (Botón Segmentado) (Heredado).
19
19
  *
20
- * A form-associated group of selectable segmented buttons.
20
+ * Un grupo de botones segmentados seleccionables asociado a formularios.
21
21
  *
22
- * **Deprecation Notice:** The M3 spec (`m3-docs/components/segmented-buttons/overview.md`)
23
- * has updated the segmented button pattern. The bespoke segments have been
24
- * replaced with standard `<moni-button>` elements grouped inside a
22
+ * **Aviso de obsolescencia (Deprecation Notice):** La especificación M3 (`m3-docs/components/segmented-buttons/overview.md`)
23
+ * ha actualizado el patrón de botones segmentados. Los segmentos a medida han sido
24
+ * reemplazados por elementos estándar `<moni-button>` agrupados dentro de un
25
25
  * `<moni-button-group variant="connected">`.
26
26
  *
27
- * This component continues to work for backward compatibility but will be
28
- * removed in v1.0. A deprecation warning is logged to the console when the
29
- * element is connected to the DOM.
27
+ * Este componente sigue funcionando para mantener la compatibilidad con versiones anteriores, pero será
28
+ * eliminado en la v1.0. Se registra una advertencia de obsolescencia en la consola cuando el
29
+ * elemento se conecta al DOM.
30
30
  *
31
- * @deprecated Use `<moni-button-group variant="connected">` instead.
31
+ * @deprecated Usa `<moni-button-group variant="connected">` en su lugar.
32
32
  *
33
33
  * @example
34
34
  * ```html
35
- * <!-- Legacy usage (not recommended) -->
35
+ * <!-- Uso heredado (no recomendado) -->
36
36
  * <moni-segmented-button name="view" multi>
37
- * <moni-button-segment value="day">Day</moni-button-segment>
38
- * <moni-button-segment value="week">Week</moni-button-segment>
37
+ * <moni-button-segment value="day">Día</moni-button-segment>
38
+ * <moni-button-segment value="week">Semana</moni-button-segment>
39
39
  * </moni-segmented-button>
40
40
  *
41
- * <!-- Modern M3 equivalent -->
41
+ * <!-- Equivalente M3 moderno -->
42
42
  * <moni-button-group variant="connected">
43
- * <moni-button>Day</moni-button>
44
- * <moni-button>Week</moni-button>
43
+ * <moni-button>Día</moni-button>
44
+ * <moni-button>Semana</moni-button>
45
45
  * </moni-button-group>
46
46
  * ```
47
47
  *
48
- * @slot default - `<moni-button-segment>` elements.
48
+ * @slot default - elementos `<moni-button-segment>`.
49
49
  */
50
50
  let MoniSegmentedButton = class MoniSegmentedButton extends MoniElement {
51
51
  static { MoniSegmentedButton_1 = this; }
52
52
  static { this.formAssociated = true; }
53
53
  static { this._deprecationWarned = false; }
54
+ /**
55
+ * Constructor del componente.
56
+ * Inicializa ElementInternals (`attachInternals`) para integrar el custom element
57
+ * nativamente en formularios HTML, permitiéndole participar en validaciones y envíos de datos.
58
+ */
54
59
  constructor() {
55
60
  super();
61
+ /**
62
+ * Nombre del botón segmentado, usado para el envío del formulario.
63
+ * @type {string}
64
+ */
56
65
  this.name = '';
66
+ /**
67
+ * Permite seleccionar múltiples segmentos simultáneamente.
68
+ * @type {boolean}
69
+ */
57
70
  this.multi = false;
71
+ /**
72
+ * Tamaño de los segmentos del botón.
73
+ * @type {'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'extra'}
74
+ * @default 'medium'
75
+ */
58
76
  this.size = 'medium';
77
+ /**
78
+ * Oculta el icono de marca de verificación principal (leading checkmark) cuando se selecciona un segmento.
79
+ * @type {boolean}
80
+ */
59
81
  this.hideCheck = false;
82
+ /**
83
+ * Define un espaciado personalizado entre segmentos.
84
+ * @type {string}
85
+ */
60
86
  this.gap = '';
61
87
  this.internals = this.attachInternals();
62
88
  }
@@ -72,9 +98,16 @@ let MoniSegmentedButton = class MoniSegmentedButton extends MoniElement {
72
98
  'See m3-docs/components/segmented-buttons/overview.md § M3 Expressive update.');
73
99
  }
74
100
  }
101
+ /**
102
+ * Expone el formulario anfitrión al que pertenece este componente,
103
+ * derivado de la API de ElementInternals.
104
+ */
75
105
  get form() {
76
106
  return this.internals.form;
77
107
  }
108
+ /**
109
+ * Define el tipo semántico del control de formulario.
110
+ */
78
111
  get type() {
79
112
  return 'segmented-button';
80
113
  }
@@ -108,6 +141,12 @@ let MoniSegmentedButton = class MoniSegmentedButton extends MoniElement {
108
141
  }
109
142
  `
110
143
  ]; }
144
+ /**
145
+ * Hook del ciclo de vida reactivo (Lit).
146
+ * Enlaza propiedades estructurales (como el gap o la visibilidad de los checks)
147
+ * desde el contenedor padre hacia los segmentos hijos y comunica el nuevo valor
148
+ * consolidado al formulario subyacente cada vez que el estado cambia.
149
+ */
111
150
  updated(changedProperties) {
112
151
  super.updated(changedProperties);
113
152
  if (changedProperties.has('hideCheck') || changedProperties.has('size') || changedProperties.has('gap')) {
@@ -115,6 +154,11 @@ let MoniSegmentedButton = class MoniSegmentedButton extends MoniElement {
115
154
  }
116
155
  this.updateFormValue();
117
156
  }
157
+ /**
158
+ * Manejador del Slot Change.
159
+ * Re-evalúa jerárquicamente a los hijos proyectados si el DOM muta,
160
+ * reactualizando su topología visual (`border-radius`) y su valor en el form.
161
+ */
118
162
  handleSlotChange() {
119
163
  this.updateChildren();
120
164
  this.updateFormValue();
@@ -135,6 +179,12 @@ let MoniSegmentedButton = class MoniSegmentedButton extends MoniElement {
135
179
  return '0.5rem';
136
180
  return gap;
137
181
  }
182
+ /**
183
+ * Patrón "Top-Down" para inyectar configuración visual y de posición a los segmentos hijos.
184
+ * Dado que CSS no puede pasar atributos reactivos fácilmente a hijos proyectados (<slot>),
185
+ * JS itera los hijos y les asigna si son 'first', 'middle' o 'last' para manejar
186
+ * el `border-radius` continuo.
187
+ */
138
188
  updateChildren() {
139
189
  const segments = this.segments;
140
190
  const len = segments.length;
@@ -155,11 +205,21 @@ let MoniSegmentedButton = class MoniSegmentedButton extends MoniElement {
155
205
  }
156
206
  });
157
207
  }
208
+ /**
209
+ * Sincroniza el valor interno del componente (`this.value`) con
210
+ * la estructura nativa del formulario utilizando la API de `ElementInternals.setFormValue`.
211
+ * Permite que los datos viajen de forma natural al hacer submit.
212
+ */
158
213
  updateFormValue() {
159
214
  if (typeof this.internals.setFormValue === 'function') {
160
215
  this.internals.setFormValue(this.value);
161
216
  }
162
217
  }
218
+ /**
219
+ * Delegación de eventos (Event Delegation) capturando el click en el contenedor padre.
220
+ * Maneja la lógica de exclusión mutua (single selection) estilo Radio Button
221
+ * o la selección aditiva estilo Checkbox cuando `multi` es true.
222
+ */
163
223
  handleClick(e) {
164
224
  const target = e.target;
165
225
  const clickedSegment = target.closest('moni-button-segment');
@@ -168,12 +228,14 @@ let MoniSegmentedButton = class MoniSegmentedButton extends MoniElement {
168
228
  }
169
229
  const segments = this.segments;
170
230
  if (this.multi) {
231
+ // Toggle independiente
171
232
  clickedSegment.checked = !clickedSegment.checked;
172
233
  }
173
234
  else {
235
+ // Comportamiento de grupo radio: deseleccionar hermanos
174
236
  segments.forEach((seg) => {
175
237
  if (seg === clickedSegment) {
176
- seg.checked = !seg.checked;
238
+ seg.checked = !seg.checked; // Permite toggle off incluso en single mode (comportamiento M3)
177
239
  }
178
240
  else {
179
241
  seg.checked = false;
@@ -191,6 +253,21 @@ let MoniSegmentedButton = class MoniSegmentedButton extends MoniElement {
191
253
  }
192
254
  }));
193
255
  }
256
+ /**
257
+ * Renderiza el contenedor del botón segmentado con un `role="group"` y su superposición de indicador GSAP.
258
+ *
259
+ * **Indicador deslizante:**
260
+ * Un `<div>` `.indicator` se posiciona de forma absoluta dentro del contenedor del grupo.
261
+ * GSAP anima su `left` y `width` para deslizarse de un segmento a otro
262
+ * cuando la selección cambia (resaltado del segmento seleccionado del Segmented Button M3).
263
+ * En el primer renderizado, el indicador se posiciona instantáneamente (sin transición); los cambios
264
+ * posteriores usan `gsap.to()` con la curva de animación (easing) `_speed2` para un deslizamiento suave.
265
+ *
266
+ * **Sincronización `@slotchange`:**
267
+ * Cuando los segmentos se agregan/eliminan en tiempo de ejecución, `_syncSegments()` vuelve a leer
268
+ * los elementos asignados a la ranura (slot) y actualiza los atributos `first` / `last` de cada segmento
269
+ * para controlar el border-radius en los segmentos terminales.
270
+ */
194
271
  render() {
195
272
  const resolvedGap = this.getGapValue(this.gap);
196
273
  const inlineStyles = resolvedGap