@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
|
@@ -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
|
-
*
|
|
13
|
+
* Componente de decoración de onda (ripple) puramente visual.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
-
* **
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
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
|
-
*
|
|
26
|
-
* `position: relative`
|
|
25
|
+
* El elemento padre NO debe tener `position: static` (la onda aplica
|
|
26
|
+
* `position: relative` automáticamente en `connectedCallback`).
|
|
27
27
|
*
|
|
28
|
-
* **
|
|
29
|
-
*
|
|
30
|
-
* 1. `active = false`
|
|
31
|
-
* 2.
|
|
32
|
-
* 3. `active = true`
|
|
33
|
-
* 4.
|
|
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
|
-
*
|
|
36
|
-
*
|
|
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`
|
|
40
|
-
*
|
|
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
|
-
* <!--
|
|
44
|
+
* <!-- Onda en un elemento personalizado -->
|
|
45
45
|
* <div class="my-button" style="position: relative; overflow: hidden;">
|
|
46
|
-
*
|
|
46
|
+
* Haz clic
|
|
47
47
|
* <moni-ripple color="primary"></moni-ripple>
|
|
48
48
|
* </div>
|
|
49
49
|
* ```
|
|
50
50
|
*
|
|
51
|
-
* @csspart ripple -
|
|
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
|
-
*
|
|
56
|
+
* Origen horizontal de la onda como porcentaje del ancho del padre.
|
|
57
57
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
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
|
-
*
|
|
66
|
+
* Origen vertical de la onda como porcentaje de la altura del padre.
|
|
67
67
|
*
|
|
68
|
-
*
|
|
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
|
-
*
|
|
75
|
+
* Cuando es `true`, la onda es visible y se está animando.
|
|
76
76
|
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
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
|
-
*
|
|
85
|
+
* Velocidad de animación de la secuencia de expansión y desvanecimiento de la onda.
|
|
86
86
|
*
|
|
87
|
-
*
|
|
87
|
+
* Se asigna a la propiedad personalizada CSS `--_dur`:
|
|
88
88
|
* - `'fast'` — 300ms
|
|
89
|
-
* - `'normal'` — 600ms (
|
|
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
|
-
*
|
|
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
|
*/
|
|
@@ -110,25 +110,25 @@ export class MoniRipple extends MoniElement {
|
|
|
110
110
|
color: 'primary' | 'secondary' | 'surface' = 'primary';
|
|
111
111
|
|
|
112
112
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
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
|
|
120
|
-
*
|
|
121
|
-
*
|
|
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
|
-
*
|
|
126
|
+
* Adjunta la onda a su elemento padre.
|
|
127
127
|
*
|
|
128
|
-
* -
|
|
129
|
-
* -
|
|
130
|
-
*
|
|
131
|
-
* -
|
|
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
|
-
*
|
|
146
|
+
* Desvincula la onda de su elemento padre.
|
|
147
147
|
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
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
|
-
*
|
|
162
|
+
* Maneja los eventos de puntero (pointer-down) en el elemento padre.
|
|
163
163
|
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
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 -
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
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
|
|
14
|
+
* Componente Material Design 3 Segmented Button (Botón Segmentado) (Heredado).
|
|
15
15
|
*
|
|
16
|
-
*
|
|
16
|
+
* Un grupo de botones segmentados seleccionables asociado a formularios.
|
|
17
17
|
*
|
|
18
|
-
* **Deprecation Notice:**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
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
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
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
|
|
27
|
+
* @deprecated Usa `<moni-button-group variant="connected">` en su lugar.
|
|
28
28
|
*
|
|
29
29
|
* @example
|
|
30
30
|
* ```html
|
|
31
|
-
* <!--
|
|
31
|
+
* <!-- Uso heredado (no recomendado) -->
|
|
32
32
|
* <moni-segmented-button name="view" multi>
|
|
33
|
-
* <moni-button-segment value="day">
|
|
34
|
-
* <moni-button-segment value="week">
|
|
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
|
-
* <!--
|
|
37
|
+
* <!-- Equivalente M3 moderno -->
|
|
38
38
|
* <moni-button-group variant="connected">
|
|
39
|
-
* <moni-button>
|
|
40
|
-
* <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
|
|
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
|
|
13
|
+
* Componente Material Design 3 Select Option (Opción de Selección).
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
* `<moni-select
|
|
15
|
+
* Un elemento individual seleccionable diseñado para colocarse dentro de un
|
|
16
|
+
* menú desplegable `<moni-select>`.
|
|
17
17
|
*
|
|
18
|
-
* **
|
|
19
|
-
*
|
|
20
|
-
* `<moni-menu-item>`.
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
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
|
-
* **
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
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="
|
|
33
|
-
* <!--
|
|
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
|
-
* <!--
|
|
37
|
-
* <moni-select-option value="react" disabled>React (
|
|
36
|
+
* <!-- Opción deshabilitada -->
|
|
37
|
+
* <moni-select-option value="react" disabled>React (no permitido)</moni-select-option>
|
|
38
38
|
*
|
|
39
|
-
* <!--
|
|
40
|
-
* <moni-select-option value="vue" group="
|
|
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 -
|
|
45
|
-
*
|
|
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 -
|
|
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"
|