@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.
- package/custom-elements.json +5230 -1007
- package/dist/components/_base/moni-element.d.ts +16 -9
- package/dist/components/_base/moni-element.d.ts.map +1 -1
- package/dist/components/_base/moni-element.js +63 -9
- package/dist/components/index.js +2 -2
- package/dist/components/loading-shapes.d.ts +19 -0
- package/dist/components/loading-shapes.d.ts.map +1 -1
- package/dist/components/loading-shapes.js +19 -0
- package/dist/components/moni-app-bar.d.ts +72 -62
- package/dist/components/moni-app-bar.d.ts.map +1 -1
- package/dist/components/moni-app-bar.js +72 -62
- package/dist/components/moni-badge.d.ts +64 -65
- package/dist/components/moni-badge.d.ts.map +1 -1
- package/dist/components/moni-badge.js +64 -66
- package/dist/components/moni-bottom-sheet.d.ts +129 -61
- package/dist/components/moni-bottom-sheet.d.ts.map +1 -1
- package/dist/components/moni-bottom-sheet.js +217 -131
- package/dist/components/moni-button-group.d.ts +107 -29
- package/dist/components/moni-button-group.d.ts.map +1 -1
- package/dist/components/moni-button-group.js +107 -29
- package/dist/components/moni-button-segment.d.ts +53 -12
- package/dist/components/moni-button-segment.d.ts.map +1 -1
- package/dist/components/moni-button-segment.js +53 -12
- package/dist/components/moni-button.d.ts +116 -38
- package/dist/components/moni-button.d.ts.map +1 -1
- package/dist/components/moni-button.js +128 -38
- package/dist/components/moni-card.d.ts +68 -50
- package/dist/components/moni-card.d.ts.map +1 -1
- package/dist/components/moni-card.js +68 -50
- package/dist/components/moni-carousel.d.ts +484 -53
- package/dist/components/moni-carousel.d.ts.map +1 -1
- package/dist/components/moni-carousel.js +1024 -245
- package/dist/components/moni-checkbox.d.ts +49 -46
- package/dist/components/moni-checkbox.d.ts.map +1 -1
- package/dist/components/moni-checkbox.js +55 -48
- package/dist/components/moni-chip.d.ts +100 -33
- package/dist/components/moni-chip.d.ts.map +1 -1
- package/dist/components/moni-chip.js +104 -34
- package/dist/components/moni-color-field.d.ts +99 -24
- package/dist/components/moni-color-field.d.ts.map +1 -1
- package/dist/components/moni-color-field.js +99 -24
- package/dist/components/moni-context-menu.d.ts +72 -26
- package/dist/components/moni-context-menu.d.ts.map +1 -1
- package/dist/components/moni-context-menu.js +76 -30
- package/dist/components/moni-dialog.d.ts +84 -59
- package/dist/components/moni-dialog.d.ts.map +1 -1
- package/dist/components/moni-dialog.js +105 -58
- package/dist/components/moni-divider.d.ts +39 -27
- package/dist/components/moni-divider.d.ts.map +1 -1
- package/dist/components/moni-divider.js +42 -30
- package/dist/components/moni-expansion.d.ts +32 -22
- package/dist/components/moni-expansion.d.ts.map +1 -1
- package/dist/components/moni-expansion.js +32 -22
- package/dist/components/moni-fab-menu.d.ts +61 -23
- package/dist/components/moni-fab-menu.d.ts.map +1 -1
- package/dist/components/moni-fab-menu.js +69 -31
- package/dist/components/moni-fab.d.ts +86 -28
- package/dist/components/moni-fab.d.ts.map +1 -1
- package/dist/components/moni-fab.js +92 -34
- package/dist/components/moni-file-field.d.ts +118 -30
- package/dist/components/moni-file-field.d.ts.map +1 -1
- package/dist/components/moni-file-field.js +118 -30
- package/dist/components/moni-icon.d.ts +40 -35
- package/dist/components/moni-icon.d.ts.map +1 -1
- package/dist/components/moni-icon.js +43 -38
- package/dist/components/moni-list-item.d.ts +46 -33
- package/dist/components/moni-list-item.d.ts.map +1 -1
- package/dist/components/moni-list-item.js +61 -41
- package/dist/components/moni-list.d.ts +30 -20
- package/dist/components/moni-list.d.ts.map +1 -1
- package/dist/components/moni-list.js +36 -21
- package/dist/components/moni-loading-indicator.d.ts +54 -22
- package/dist/components/moni-loading-indicator.d.ts.map +1 -1
- package/dist/components/moni-loading-indicator.js +54 -22
- package/dist/components/moni-menu-item.d.ts +23 -16
- package/dist/components/moni-menu-item.d.ts.map +1 -1
- package/dist/components/moni-menu-item.js +23 -16
- package/dist/components/moni-menu.d.ts +81 -28
- package/dist/components/moni-menu.d.ts.map +1 -1
- package/dist/components/moni-menu.js +81 -30
- package/dist/components/moni-morph-modal.d.ts +141 -0
- package/dist/components/moni-morph-modal.d.ts.map +1 -1
- package/dist/components/moni-morph-modal.js +295 -58
- package/dist/components/moni-nav-item.d.ts +59 -29
- package/dist/components/moni-nav-item.d.ts.map +1 -1
- package/dist/components/moni-nav-item.js +59 -29
- package/dist/components/moni-nav.d.ts +94 -35
- package/dist/components/moni-nav.d.ts.map +1 -1
- package/dist/components/moni-nav.js +94 -35
- package/dist/components/moni-progress.d.ts +99 -55
- package/dist/components/moni-progress.d.ts.map +1 -1
- package/dist/components/moni-progress.js +99 -55
- package/dist/components/moni-radio.d.ts +62 -50
- package/dist/components/moni-radio.d.ts.map +1 -1
- package/dist/components/moni-radio.js +65 -52
- package/dist/components/moni-ripple.d.ts +74 -59
- package/dist/components/moni-ripple.d.ts.map +1 -1
- package/dist/components/moni-ripple.js +74 -59
- package/dist/components/moni-segmented-button.d.ts +91 -16
- package/dist/components/moni-segmented-button.d.ts.map +1 -1
- package/dist/components/moni-segmented-button.js +94 -17
- package/dist/components/moni-select-option.d.ts +30 -23
- package/dist/components/moni-select-option.d.ts.map +1 -1
- package/dist/components/moni-select-option.js +30 -23
- package/dist/components/moni-select.d.ts +300 -35
- package/dist/components/moni-select.d.ts.map +1 -1
- package/dist/components/moni-select.js +323 -39
- package/dist/components/moni-side-sheet.d.ts +94 -32
- package/dist/components/moni-side-sheet.d.ts.map +1 -1
- package/dist/components/moni-side-sheet.js +94 -32
- package/dist/components/moni-slider.d.ts +152 -41
- package/dist/components/moni-slider.d.ts.map +1 -1
- package/dist/components/moni-slider.js +154 -42
- package/dist/components/moni-snackbar.d.ts +53 -43
- package/dist/components/moni-snackbar.d.ts.map +1 -1
- package/dist/components/moni-snackbar.js +53 -43
- package/dist/components/moni-split-button.d.ts +63 -18
- package/dist/components/moni-split-button.d.ts.map +1 -1
- package/dist/components/moni-split-button.js +63 -18
- package/dist/components/moni-step.d.ts +36 -24
- package/dist/components/moni-step.d.ts.map +1 -1
- package/dist/components/moni-step.js +41 -29
- package/dist/components/moni-stepper.d.ts +64 -27
- package/dist/components/moni-stepper.d.ts.map +1 -1
- package/dist/components/moni-stepper.js +72 -34
- package/dist/components/moni-switch.d.ts +57 -46
- package/dist/components/moni-switch.d.ts.map +1 -1
- package/dist/components/moni-switch.js +59 -47
- package/dist/components/moni-tab.d.ts +26 -18
- package/dist/components/moni-tab.d.ts.map +1 -1
- package/dist/components/moni-tab.js +29 -21
- package/dist/components/moni-tabs.d.ts +34 -28
- package/dist/components/moni-tabs.d.ts.map +1 -1
- package/dist/components/moni-tabs.js +34 -28
- package/dist/components/moni-text-field.d.ts +139 -29
- package/dist/components/moni-text-field.d.ts.map +1 -1
- package/dist/components/moni-text-field.js +157 -31
- package/dist/components/moni-textarea.d.ts +127 -29
- package/dist/components/moni-textarea.d.ts.map +1 -1
- package/dist/components/moni-textarea.js +131 -32
- package/dist/components/moni-time-picker.d.ts +114 -24
- package/dist/components/moni-time-picker.d.ts.map +1 -1
- package/dist/components/moni-time-picker.js +127 -33
- package/dist/components/moni-toolbar.d.ts +37 -23
- package/dist/components/moni-toolbar.d.ts.map +1 -1
- package/dist/components/moni-toolbar.js +37 -23
- package/dist/components/moni-tooltip.d.ts +100 -36
- package/dist/components/moni-tooltip.d.ts.map +1 -1
- package/dist/components/moni-tooltip.js +104 -40
- package/dist/components/moni-typography.d.ts +68 -30
- package/dist/components/moni-typography.d.ts.map +1 -1
- package/dist/components/moni-typography.js +70 -32
- package/dist/styles/tokens.css +7 -7
- package/dist/types/events.d.ts +17 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +1 -0
- package/dist/utils/event-emitter.d.ts +13 -0
- package/dist/utils/event-emitter.d.ts.map +1 -0
- package/dist/utils/event-emitter.js +13 -0
- package/package.json +2 -1
- package/src/components/_base/moni-element.ts +73 -9
- package/src/components/index.ts +2 -2
- package/src/components/loading-shapes.ts +19 -0
- package/src/components/moni-app-bar.test.ts +10 -10
- package/src/components/moni-app-bar.ts +72 -62
- package/src/components/moni-badge.ts +64 -66
- package/src/components/moni-bottom-sheet.test.ts +39 -45
- package/src/components/moni-bottom-sheet.ts +222 -131
- package/src/components/moni-button-group.test.ts +14 -14
- package/src/components/moni-button-group.ts +107 -29
- package/src/components/moni-button-segment.ts +53 -12
- package/src/components/moni-button.test.ts +28 -26
- package/src/components/moni-button.ts +139 -39
- package/src/components/moni-card.test.ts +6 -6
- package/src/components/moni-card.ts +70 -50
- package/src/components/moni-carousel.test.ts +12 -12
- package/src/components/moni-carousel.ts +1129 -269
- package/src/components/moni-checkbox.test.ts +7 -7
- package/src/components/moni-checkbox.ts +62 -48
- package/src/components/moni-chip.test.ts +17 -17
- package/src/components/moni-chip.ts +112 -34
- package/src/components/moni-color-field.test.ts +5 -5
- package/src/components/moni-color-field.ts +108 -24
- package/src/components/moni-context-menu.test.ts +11 -11
- package/src/components/moni-context-menu.ts +76 -30
- package/src/components/moni-dialog.ts +108 -59
- package/src/components/moni-divider.test.ts +4 -4
- package/src/components/moni-divider.ts +42 -30
- package/src/components/moni-expansion.ts +32 -22
- package/src/components/moni-fab-menu.test.ts +11 -11
- package/src/components/moni-fab-menu.ts +69 -31
- package/src/components/moni-fab.test.ts +16 -16
- package/src/components/moni-fab.ts +100 -34
- package/src/components/moni-file-field.test.ts +8 -8
- package/src/components/moni-file-field.ts +132 -30
- package/src/components/moni-icon.test.ts +11 -11
- package/src/components/moni-icon.ts +43 -38
- package/src/components/moni-list-item.test.ts +10 -10
- package/src/components/moni-list-item.ts +61 -41
- package/src/components/moni-list.ts +37 -21
- package/src/components/moni-loading-indicator.test.ts +3 -3
- package/src/components/moni-loading-indicator.ts +54 -22
- package/src/components/moni-menu-item.ts +23 -16
- package/src/components/moni-menu.test.ts +7 -7
- package/src/components/moni-menu.ts +87 -30
- package/src/components/moni-morph-modal.test.ts +18 -17
- package/src/components/moni-morph-modal.ts +327 -60
- package/src/components/moni-nav-item.ts +59 -29
- package/src/components/moni-nav.test.ts +11 -11
- package/src/components/moni-nav.ts +94 -35
- package/src/components/moni-progress.test.ts +9 -9
- package/src/components/moni-progress.ts +100 -56
- package/src/components/moni-radio.test.ts +8 -8
- package/src/components/moni-radio.ts +71 -51
- package/src/components/moni-ripple.ts +74 -59
- package/src/components/moni-segmented-button.test.ts +4 -4
- package/src/components/moni-segmented-button.ts +94 -17
- package/src/components/moni-select-option.ts +30 -23
- package/src/components/moni-select.test.ts +11 -11
- package/src/components/moni-select.ts +361 -50
- package/src/components/moni-side-sheet.test.ts +7 -7
- package/src/components/moni-side-sheet.ts +94 -32
- package/src/components/moni-slider.test.ts +7 -7
- package/src/components/moni-slider.ts +165 -42
- package/src/components/moni-snackbar.test.ts +8 -8
- package/src/components/moni-snackbar.ts +53 -43
- package/src/components/moni-split-button.ts +63 -18
- package/src/components/moni-step.test.ts +7 -7
- package/src/components/moni-step.ts +41 -29
- package/src/components/moni-stepper.test.ts +7 -7
- package/src/components/moni-stepper.ts +72 -34
- package/src/components/moni-switch.test.ts +12 -12
- package/src/components/moni-switch.ts +66 -47
- package/src/components/moni-tab.test.ts +5 -5
- package/src/components/moni-tab.ts +29 -21
- package/src/components/moni-tabs.ts +34 -28
- package/src/components/moni-text-field.test.ts +13 -13
- package/src/components/moni-text-field.ts +181 -30
- package/src/components/moni-textarea.test.ts +17 -17
- package/src/components/moni-textarea.ts +155 -31
- package/src/components/moni-time-picker.test.ts +5 -5
- package/src/components/moni-time-picker.ts +128 -33
- package/src/components/moni-toolbar.test.ts +8 -8
- package/src/components/moni-toolbar.ts +37 -23
- package/src/components/moni-tooltip.test.ts +15 -15
- package/src/components/moni-tooltip.ts +107 -40
- package/src/components/moni-typography.test.ts +10 -10
- package/src/components/moni-typography.ts +73 -32
- package/src/styles/tokens.css +7 -7
- package/src/types/events.ts +17 -0
- package/src/utils/event-emitter.ts +26 -0
|
@@ -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
|
-
*
|
|
17
|
+
* Componente de decoración de onda (ripple) puramente visual.
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
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
|
-
* **
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
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
|
-
*
|
|
30
|
-
* `position: relative`
|
|
29
|
+
* El elemento padre NO debe tener `position: static` (la onda aplica
|
|
30
|
+
* `position: relative` automáticamente en `connectedCallback`).
|
|
31
31
|
*
|
|
32
|
-
* **
|
|
33
|
-
*
|
|
34
|
-
* 1. `active = false`
|
|
35
|
-
* 2.
|
|
36
|
-
* 3. `active = true`
|
|
37
|
-
* 4.
|
|
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
|
-
*
|
|
40
|
-
*
|
|
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`
|
|
44
|
-
*
|
|
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
|
-
* <!--
|
|
48
|
+
* <!-- Onda en un elemento personalizado -->
|
|
49
49
|
* <div class="my-button" style="position: relative; overflow: hidden;">
|
|
50
|
-
*
|
|
50
|
+
* Haz clic
|
|
51
51
|
* <moni-ripple color="primary"></moni-ripple>
|
|
52
52
|
* </div>
|
|
53
53
|
* ```
|
|
54
54
|
*
|
|
55
|
-
* @csspart ripple -
|
|
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
|
-
*
|
|
61
|
+
* Origen horizontal de la onda como porcentaje del ancho del padre.
|
|
62
62
|
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
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
|
-
*
|
|
70
|
+
* Origen vertical de la onda como porcentaje de la altura del padre.
|
|
71
71
|
*
|
|
72
|
-
*
|
|
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
|
-
*
|
|
78
|
+
* Cuando es `true`, la onda es visible y se está animando.
|
|
79
79
|
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
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
|
-
*
|
|
87
|
+
* Velocidad de animación de la secuencia de expansión y desvanecimiento de la onda.
|
|
88
88
|
*
|
|
89
|
-
*
|
|
89
|
+
* Se asigna a la propiedad personalizada CSS `--_dur`:
|
|
90
90
|
* - `'fast'` — 300ms
|
|
91
|
-
* - `'normal'` — 600ms (
|
|
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
|
-
*
|
|
98
|
+
* Token de color para la superposición de la onda.
|
|
99
99
|
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
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` (
|
|
103
|
+
* - `'primary'` — `--primary` (por defecto)
|
|
104
104
|
* - `'secondary'` — `--secondary`
|
|
105
|
-
* - `'surface'` — `--surface-variant` (
|
|
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
|
-
*
|
|
112
|
-
*
|
|
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
|
|
117
|
-
*
|
|
118
|
-
*
|
|
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
|
-
*
|
|
122
|
+
* Maneja los eventos de puntero (pointer-down) en el elemento padre.
|
|
123
123
|
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
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 -
|
|
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
|
-
*
|
|
153
|
+
* Adjunta la onda a su elemento padre.
|
|
154
154
|
*
|
|
155
|
-
* -
|
|
156
|
-
* -
|
|
157
|
-
*
|
|
158
|
-
* -
|
|
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
|
-
*
|
|
172
|
+
* Desvincula la onda de su elemento padre.
|
|
173
173
|
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
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
|
|
9
|
+
* Componente Material Design 3 Segmented Button (Botón Segmentado) (Heredado).
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* Un grupo de botones segmentados seleccionables asociado a formularios.
|
|
12
12
|
*
|
|
13
|
-
* **Deprecation Notice:**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
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
|
|
22
|
+
* @deprecated Usa `<moni-button-group variant="connected">` en su lugar.
|
|
23
23
|
*
|
|
24
24
|
* @example
|
|
25
25
|
* ```html
|
|
26
|
-
* <!--
|
|
26
|
+
* <!-- Uso heredado (no recomendado) -->
|
|
27
27
|
* <moni-segmented-button name="view" multi>
|
|
28
|
-
* <moni-button-segment value="day">
|
|
29
|
-
* <moni-button-segment value="week">
|
|
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
|
-
* <!--
|
|
32
|
+
* <!-- Equivalente M3 moderno -->
|
|
33
33
|
* <moni-button-group variant="connected">
|
|
34
|
-
* <moni-button>
|
|
35
|
-
* <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
|
|
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;
|
|
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
|
|
18
|
+
* Componente Material Design 3 Segmented Button (Botón Segmentado) (Heredado).
|
|
19
19
|
*
|
|
20
|
-
*
|
|
20
|
+
* Un grupo de botones segmentados seleccionables asociado a formularios.
|
|
21
21
|
*
|
|
22
|
-
* **Deprecation Notice:**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
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
|
|
31
|
+
* @deprecated Usa `<moni-button-group variant="connected">` en su lugar.
|
|
32
32
|
*
|
|
33
33
|
* @example
|
|
34
34
|
* ```html
|
|
35
|
-
* <!--
|
|
35
|
+
* <!-- Uso heredado (no recomendado) -->
|
|
36
36
|
* <moni-segmented-button name="view" multi>
|
|
37
|
-
* <moni-button-segment value="day">
|
|
38
|
-
* <moni-button-segment value="week">
|
|
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
|
-
* <!--
|
|
41
|
+
* <!-- Equivalente M3 moderno -->
|
|
42
42
|
* <moni-button-group variant="connected">
|
|
43
|
-
* <moni-button>
|
|
44
|
-
* <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
|
|
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
|