@moni-labs/moni-ui 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +5181 -1043
- 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 +471 -53
- package/dist/components/moni-carousel.d.ts.map +1 -1
- package/dist/components/moni-carousel.js +862 -264
- 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 +953 -290
- 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
|
@@ -16,74 +16,123 @@ import { MoniElement, sharedStyles } from './_base/index.js';
|
|
|
16
16
|
import './moni-icon.js';
|
|
17
17
|
import './moni-progress.js';
|
|
18
18
|
/**
|
|
19
|
-
* Material Design 3 Chip
|
|
19
|
+
* Componente Material Design 3 Chip.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
21
|
+
* Los chips (fichas) son elementos compactos e interactivos que representan acciones, filtros,
|
|
22
|
+
* atributos o entradas de usuario. Son contenedores solo visuales — el consumidor
|
|
23
|
+
* es dueño de todo el manejo del estado (selección, eliminación, estado de filtro activo).
|
|
24
24
|
*
|
|
25
|
-
* **
|
|
25
|
+
* **Referencia de la especificación M3:** `m3-docs/components/chips/specs.md`
|
|
26
26
|
*
|
|
27
|
-
* **
|
|
28
|
-
* - `assist` (
|
|
29
|
-
*
|
|
30
|
-
* - `filter` —
|
|
31
|
-
* `selected`. Alias: `fill`.
|
|
32
|
-
* - `input` —
|
|
33
|
-
*
|
|
34
|
-
* - `suggestion` —
|
|
27
|
+
* **Variantes:**
|
|
28
|
+
* - `assist` (por defecto) — Acciones inteligentes o sugeridas. Usa borde `var(--outline)`
|
|
29
|
+
* para asegurar un contraste de 3:1 según la especificación de accesibilidad de M3. Alias: `outlined`.
|
|
30
|
+
* - `filter` — Filtros para una colección de contenido. Muestra una marca de verificación al principio cuando
|
|
31
|
+
* está `selected`. Alias: `fill`.
|
|
32
|
+
* - `input` — Representa una entrada de usuario discreta (etiquetas, tokens). Añade un icono de
|
|
33
|
+
* eliminación al final cuando es `removable`.
|
|
34
|
+
* - `suggestion` — Sugerencias generadas por el producto. Con contorno, sin iconos.
|
|
35
35
|
*
|
|
36
|
-
* **M3
|
|
37
|
-
* -
|
|
38
|
-
* -
|
|
39
|
-
* -
|
|
40
|
-
* - `medium`
|
|
36
|
+
* **Medidas M3:**
|
|
37
|
+
* - Altura por defecto: 32dp (tamaño `small` = línea base de la especificación M3).
|
|
38
|
+
* - Radio de esquina: 8dp.
|
|
39
|
+
* - Tamaño de icono: 18dp.
|
|
40
|
+
* - Los tamaños `medium` y `large` son extensiones de Moni con áreas táctiles más grandes.
|
|
41
41
|
*
|
|
42
|
-
* **
|
|
43
|
-
* `assist`
|
|
44
|
-
*
|
|
45
|
-
* `filter`
|
|
46
|
-
*
|
|
42
|
+
* **Accesibilidad:**
|
|
43
|
+
* Los chips `assist` y `suggestion` usan `var(--outline)` para su trazo para
|
|
44
|
+
* garantizar un contraste de 3:1 contra el fondo de la superficie en reposo.
|
|
45
|
+
* `filter` e `input` usan `outline-variant` en reposo pero logran contraste
|
|
46
|
+
* a través del relleno `secondary-container` cuando se seleccionan.
|
|
47
47
|
*
|
|
48
|
-
* @fires remove -
|
|
49
|
-
*
|
|
48
|
+
* @fires remove - Burbujea y está compuesto. Se dispara cuando el icono de eliminación
|
|
49
|
+
* final se hace clic en un chip `input` con `removable`.
|
|
50
50
|
*
|
|
51
51
|
* @example
|
|
52
52
|
* ```html
|
|
53
|
-
* <!--
|
|
53
|
+
* <!-- Chip de filtro con estado seleccionado -->
|
|
54
54
|
* <moni-chip variant="filter" selected>Technology</moni-chip>
|
|
55
55
|
*
|
|
56
|
-
* <!--
|
|
56
|
+
* <!-- Chip de entrada (etiqueta/token) -->
|
|
57
57
|
* <moni-chip variant="input" removable icon="label">TypeScript</moni-chip>
|
|
58
58
|
*
|
|
59
|
-
* <!--
|
|
59
|
+
* <!-- Chip de asistencia con icono -->
|
|
60
60
|
* <moni-chip icon="directions_car">Get directions</moni-chip>
|
|
61
61
|
* ```
|
|
62
62
|
*
|
|
63
|
-
* @slot default -
|
|
64
|
-
* @slot icon -
|
|
63
|
+
* @slot default - El texto de la etiqueta del chip.
|
|
64
|
+
* @slot icon - Anula el icono inicial (alternativa al atributo `icon`).
|
|
65
65
|
*
|
|
66
|
-
* @csspart chip -
|
|
67
|
-
* @csspart label -
|
|
66
|
+
* @csspart chip - El elemento interno `<button>`.
|
|
67
|
+
* @csspart label - El elemento `<span>` de la etiqueta.
|
|
68
68
|
*/
|
|
69
69
|
let MoniChip = class MoniChip extends MoniElement {
|
|
70
70
|
constructor() {
|
|
71
71
|
super(...arguments);
|
|
72
|
+
/**
|
|
73
|
+
* Variante visual del chip.
|
|
74
|
+
* @type {'assist' | 'filter' | 'input' | 'suggestion' | 'outlined' | 'fill'}
|
|
75
|
+
* @default 'assist'
|
|
76
|
+
*/
|
|
72
77
|
this.variant = 'assist';
|
|
78
|
+
/**
|
|
79
|
+
* Define las dimensiones del chip.
|
|
80
|
+
* @type {'small' | 'medium' | 'large'}
|
|
81
|
+
* @default 'small'
|
|
82
|
+
*/
|
|
73
83
|
this.size = 'small';
|
|
84
|
+
/**
|
|
85
|
+
* Forma del radio del borde del chip.
|
|
86
|
+
* @type {'round' | 'no-round' | 'square' | 'circle' | 'left-round' | 'right-round' | 'top-round' | 'bottom-round'}
|
|
87
|
+
* @default 'round'
|
|
88
|
+
*/
|
|
74
89
|
this.shape = 'round';
|
|
90
|
+
/**
|
|
91
|
+
* Si es true, marca el chip como seleccionado (útil para chips de filtro).
|
|
92
|
+
* @type {boolean}
|
|
93
|
+
*/
|
|
75
94
|
this.selected = false;
|
|
95
|
+
/**
|
|
96
|
+
* Si es true, muestra un icono de cierre al final para permitir la eliminación.
|
|
97
|
+
* @type {boolean}
|
|
98
|
+
*/
|
|
76
99
|
this.removable = false;
|
|
100
|
+
/**
|
|
101
|
+
* Deshabilita el chip.
|
|
102
|
+
* @type {boolean}
|
|
103
|
+
*/
|
|
77
104
|
this.disabled = false;
|
|
105
|
+
/**
|
|
106
|
+
* Si es true, muestra un indicador de carga dentro del chip.
|
|
107
|
+
* @type {boolean}
|
|
108
|
+
*/
|
|
78
109
|
this.loading = false;
|
|
110
|
+
/**
|
|
111
|
+
* Nombre del icono inicial (Material Symbols).
|
|
112
|
+
* @type {string}
|
|
113
|
+
*/
|
|
79
114
|
this.icon = '';
|
|
80
115
|
this._hasSlottedIcon = false;
|
|
81
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Manejador del slot interno de icono (Slot Change).
|
|
119
|
+
* Determina si el desarrollador proporcionó un icono dinámicamente vía Light DOM
|
|
120
|
+
* (`<moni-icon slot="icon">`), permitiendo que el componente ajuste
|
|
121
|
+
* sus márgenes internos (`padding`) y espaciados dinámicamente.
|
|
122
|
+
*/
|
|
82
123
|
_handleSlotChange(e) {
|
|
83
124
|
const slot = e.target;
|
|
84
125
|
this._hasSlottedIcon = slot.assignedNodes({ flatten: true }).length > 0;
|
|
85
126
|
}
|
|
86
|
-
/**
|
|
127
|
+
/**
|
|
128
|
+
* Manejador de clics en el icono de remover.
|
|
129
|
+
* Detiene la propagación para no disparar el clic del chip y emite un evento custom 'remove'.
|
|
130
|
+
*/
|
|
131
|
+
_handleRemoveClick(e) {
|
|
132
|
+
e.stopPropagation();
|
|
133
|
+
this.dispatchEvent(new CustomEvent('remove', { bubbles: true, composed: true }));
|
|
134
|
+
}
|
|
135
|
+
/** Normaliza los nombres de variantes heredadas a la especificación M3. */
|
|
87
136
|
get _variant() {
|
|
88
137
|
if (this.variant === 'outlined')
|
|
89
138
|
return 'assist';
|
|
@@ -273,6 +322,27 @@ let MoniChip = class MoniChip extends MoniElement {
|
|
|
273
322
|
}
|
|
274
323
|
`
|
|
275
324
|
]; }
|
|
325
|
+
/**
|
|
326
|
+
* Renderiza el elemento `<button>` del chip con su lista de clases calculada.
|
|
327
|
+
*
|
|
328
|
+
* **Normalización de variantes:**
|
|
329
|
+
* `_variant` mapea nombres de alias heredados (`'outlined'` → `'assist'`, `'fill'` → `'filter'`)
|
|
330
|
+
* a nombres de variantes canónicas de M3 antes de inyectarlos como clases CSS.
|
|
331
|
+
*
|
|
332
|
+
* **Ruta rápida de carga:**
|
|
333
|
+
* Cuando `loading=true`, se devuelve temprano un botón mínimo con solo un indicador de carga
|
|
334
|
+
* (sin slot de icono, sin etiqueta, sin botón de eliminación) con `aria-busy="true"`.
|
|
335
|
+
*
|
|
336
|
+
* **Lógica del botón de eliminación:**
|
|
337
|
+
* `showRemove` es `true` cuando:
|
|
338
|
+
* - `variant='input'` (Especificación M3: los chips de entrada siempre tienen un icono de cierre al final), o
|
|
339
|
+
* - `removable=true` se establece explícitamente.
|
|
340
|
+
*
|
|
341
|
+
* **Resolución de icono:**
|
|
342
|
+
* Si se establece el atributo `icon`, se renderiza un `<moni-icon>`. De lo contrario, se usa el
|
|
343
|
+
* slot nombrado `icon`, con `_hasSlottedIcon` rastreando si se proyectó contenido en el slot
|
|
344
|
+
* (usado para añadir condicionalmente los ajustes de relleno `has-icon`).
|
|
345
|
+
*/
|
|
276
346
|
render() {
|
|
277
347
|
const variant = this._variant;
|
|
278
348
|
const hasIcon = Boolean(this.icon) || this._hasSlottedIcon;
|
|
@@ -316,7 +386,7 @@ let MoniChip = class MoniChip extends MoniElement {
|
|
|
316
386
|
@slotchange=${this._handleSlotChange}
|
|
317
387
|
></slot>`;
|
|
318
388
|
const removeEl = showRemove
|
|
319
|
-
? html `<span class="remove" part="remove" aria-hidden="true"
|
|
389
|
+
? html `<span class="remove" part="remove" aria-hidden="true" @click=${this._handleRemoveClick}
|
|
320
390
|
><moni-icon name="close"></moni-icon
|
|
321
391
|
></span>`
|
|
322
392
|
: nothing;
|
|
@@ -6,60 +6,135 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { MoniElement } from './_base/index.js';
|
|
8
8
|
/**
|
|
9
|
-
* Material Design 3 Color Field
|
|
9
|
+
* Componente Material Design 3 Color Field (Campo de Color).
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
* `<input type="color">`
|
|
13
|
-
*
|
|
11
|
+
* Un campo de texto especializado para la entrada de color que combina un
|
|
12
|
+
* `<input type="color">` nativo con una visualización de texto de solo lectura del
|
|
13
|
+
* valor hexadecimal seleccionado, envuelto en la carcasa estándar de campo M3.
|
|
14
14
|
*
|
|
15
|
-
* **
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
15
|
+
* **Arquitectura visual:**
|
|
16
|
+
* Extiende el patrón de estilo de campo usado por `<moni-text-field>`. El
|
|
17
|
+
* slot de icono inicial se reemplaza por una muestra de color circular (`.swatch`)
|
|
18
|
+
* que se posiciona absolutamente sobre una entrada de color nativa invisible.
|
|
19
|
+
* Al hacer clic en la muestra se abre el selector de color del sistema. La parte de entrada de texto
|
|
20
|
+
* muestra el código hexadecimal seleccionado y es estrictamente `readOnly`.
|
|
21
21
|
*
|
|
22
|
-
* **
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
22
|
+
* **Sincronización de estado:**
|
|
23
|
+
* El componente escucha el evento nativo `change` en la entrada de color,
|
|
24
|
+
* actualiza la propiedad `value`, y re-despacha un evento compuesto `'change'`.
|
|
25
|
+
* No escucha `input` (arrastre continuo en el selector de color) para evitar
|
|
26
|
+
* el disparo excesivo de eventos, pero los consumidores pueden adjuntar sus propios
|
|
27
|
+
* escuchas de `input` directamente al elemento si se necesita una vista previa en vivo.
|
|
28
28
|
*
|
|
29
|
-
* @fires change -
|
|
30
|
-
*
|
|
29
|
+
* @fires change - Burbujea y está compuesto. Se dispara cuando el selector de color se cierra
|
|
30
|
+
* y el valor se confirma. Leer `element.value`.
|
|
31
31
|
*
|
|
32
32
|
* @example
|
|
33
33
|
* ```html
|
|
34
34
|
* <moni-color-field
|
|
35
|
-
* label="
|
|
35
|
+
* label="Color del Tema"
|
|
36
36
|
* name="primaryColor"
|
|
37
37
|
* value="#6750a4"
|
|
38
38
|
* variant="outlined"
|
|
39
39
|
* ></moni-color-field>
|
|
40
40
|
* ```
|
|
41
41
|
*
|
|
42
|
-
* @csspart field -
|
|
43
|
-
* @csspart swatch -
|
|
44
|
-
* @csspart input-color -
|
|
45
|
-
* @csspart input-text -
|
|
46
|
-
* @csspart label -
|
|
42
|
+
* @csspart field - El contenedor div exterior `.field`.
|
|
43
|
+
* @csspart swatch - El elemento de vista previa de color circular.
|
|
44
|
+
* @csspart input-color - El `<input type="color">` nativo, visualmente oculto.
|
|
45
|
+
* @csspart input-text - El `<input type="text">` nativo que muestra el código hexadecimal.
|
|
46
|
+
* @csspart label - El elemento flotante `<label>`.
|
|
47
47
|
*/
|
|
48
48
|
export declare class MoniColorField extends MoniElement {
|
|
49
|
+
/**
|
|
50
|
+
* El nombre del input, enviado con los datos del formulario.
|
|
51
|
+
* @type {string}
|
|
52
|
+
*/
|
|
49
53
|
name: string;
|
|
54
|
+
/**
|
|
55
|
+
* El texto de la etiqueta flotante.
|
|
56
|
+
* @type {string}
|
|
57
|
+
*/
|
|
50
58
|
label: string;
|
|
59
|
+
/**
|
|
60
|
+
* Variante visual del campo de texto.
|
|
61
|
+
* @type {'filled' | 'outlined'}
|
|
62
|
+
* @default 'outlined'
|
|
63
|
+
*/
|
|
51
64
|
variant: 'filled' | 'outlined';
|
|
65
|
+
/**
|
|
66
|
+
* Define las dimensiones del campo de texto.
|
|
67
|
+
* @type {'small' | 'medium' | 'large' | 'extra'}
|
|
68
|
+
* @default 'medium'
|
|
69
|
+
*/
|
|
52
70
|
size: 'small' | 'medium' | 'large' | 'extra';
|
|
71
|
+
/**
|
|
72
|
+
* Forma del radio del borde del campo.
|
|
73
|
+
* @type {'round' | 'square' | 'no-round'}
|
|
74
|
+
* @default 'no-round'
|
|
75
|
+
*/
|
|
53
76
|
shape: 'round' | 'square' | 'no-round';
|
|
77
|
+
/**
|
|
78
|
+
* Deshabilita el campo de color.
|
|
79
|
+
* @type {boolean}
|
|
80
|
+
*/
|
|
54
81
|
disabled: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Texto de ayuda mostrado debajo del campo.
|
|
84
|
+
* @type {string}
|
|
85
|
+
*/
|
|
55
86
|
helper: string;
|
|
87
|
+
/**
|
|
88
|
+
* Texto de error mostrado debajo del campo cuando `error` es true.
|
|
89
|
+
* Sobrescribe el texto de ayuda.
|
|
90
|
+
* @type {string}
|
|
91
|
+
*/
|
|
56
92
|
errorText: string;
|
|
93
|
+
/**
|
|
94
|
+
* Si es true, establece el campo en un estado de error.
|
|
95
|
+
* @type {boolean}
|
|
96
|
+
*/
|
|
57
97
|
error: boolean;
|
|
98
|
+
/**
|
|
99
|
+
* El valor actual del color hexadecimal.
|
|
100
|
+
* @type {string}
|
|
101
|
+
* @default '#6750a4'
|
|
102
|
+
*/
|
|
58
103
|
value: string;
|
|
59
104
|
private _colorInput;
|
|
60
105
|
private _textInput;
|
|
106
|
+
/**
|
|
107
|
+
* Hook de ciclo de vida de Lit.
|
|
108
|
+
* Sincroniza manualmente el estado reactivo (`value`, `disabled`) con los
|
|
109
|
+
* elementos nativos del DOM subyacente. Se hace manualmente porque el input
|
|
110
|
+
* de tipo color no despacha eventos de forma natural si mutamos sus atributos.
|
|
111
|
+
*/
|
|
61
112
|
updated(changed: Map<string, unknown>): void;
|
|
62
113
|
static styles: import("lit").CSSResult[];
|
|
114
|
+
/**
|
|
115
|
+
* Ensambla la estructura del Shadow DOM del campo de color.
|
|
116
|
+
*
|
|
117
|
+
* **Estrategia de input en capas:**
|
|
118
|
+
* Dos elementos `<input>` se apilan absolutamente:
|
|
119
|
+
* 1. `<input type="color">` (z-index: 2, opacidad: 0) — invisible pero
|
|
120
|
+
* clicable, abre el selector de color nativo del sistema operativo.
|
|
121
|
+
* 2. `<input type="text" readonly>` (z-index: 0) — visible, muestra el
|
|
122
|
+
* valor hexadecimal. `tabindex="-1"` en el input de color significa que
|
|
123
|
+
* solo el input de texto es alcanzable por teclado.
|
|
124
|
+
*
|
|
125
|
+
* El círculo `.swatch` (z-index: 1) está posicionado absolutamente en el
|
|
126
|
+
* borde inicial del input de texto y estilizado a través de `--_swatch: ${this.value}`,
|
|
127
|
+
* lo cual establece su `background-color` mediante CSS `var(--_swatch)`.
|
|
128
|
+
*
|
|
129
|
+
* **Composición de `fieldClasses`:**
|
|
130
|
+
* El mapa de clases sigue la convención de nomenclatura field-styles de BeerCSS:
|
|
131
|
+
* `field`, `label`, `fill`/`border` (variante), `small`/`large`/`extra` (tamaño),
|
|
132
|
+
* `prefix` (activa el cambio de padding inicial para la muestra), `invalid`, forma.
|
|
133
|
+
*
|
|
134
|
+
* **Renderizado condicional de etiqueta / ayuda:**
|
|
135
|
+
* Usa el centinela `nothing` de Lit para evitar renderizar nodos DOM vacíos cuando
|
|
136
|
+
* `label` o `helper` son cadenas vacías, previniendo saltos de diseño.
|
|
137
|
+
*/
|
|
63
138
|
render(): import("lit").TemplateResult<1>;
|
|
64
139
|
}
|
|
65
140
|
declare global {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moni-color-field.d.ts","sourceRoot":"","sources":["../../src/components/moni-color-field.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAA6B,MAAM,kBAAkB,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBACa,cAAe,SAAQ,WAAW;
|
|
1
|
+
{"version":3,"file":"moni-color-field.d.ts","sourceRoot":"","sources":["../../src/components/moni-color-field.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAA6B,MAAM,kBAAkB,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBACa,cAAe,SAAQ,WAAW;IAC9C;;;OAGG;IAC0B,IAAI,SAAM;IAEvC;;;OAGG;IAC0B,KAAK,SAAM;IAExC;;;;OAIG;IAC0B,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAc;IAEzE;;;;OAIG;IAEH,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAY;IAExD;;;;OAIG;IAEH,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAc;IAEpD;;;OAGG;IACyC,QAAQ,UAAS;IAE7D;;;OAGG;IAC0B,MAAM,SAAM;IAEzC;;;;OAIG;IACmD,SAAS,SAAM;IAErE;;;OAGG;IACyC,KAAK,UAAS;IAE1D;;;;OAIG;IAC0B,KAAK,SAAa;IAEjB,OAAO,CAAC,WAAW,CAAoB;IACxC,OAAO,CAAC,UAAU,CAAoB;IAEnE;;;;;OAKG;IACM,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAW9C,OAAgB,MAAM,4BA0BpB;IAEF;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACM,MAAM;CAuDf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,kBAAkB,EAAE,cAAc,CAAC;KACnC;CACD;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -16,59 +16,110 @@ import { ifDefined } from 'lit/directives/if-defined.js';
|
|
|
16
16
|
import { classMap } from 'lit/directives/class-map.js';
|
|
17
17
|
import { MoniElement, sharedStyles, fieldStyles } from './_base/index.js';
|
|
18
18
|
/**
|
|
19
|
-
* Material Design 3 Color Field
|
|
19
|
+
* Componente Material Design 3 Color Field (Campo de Color).
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
* `<input type="color">`
|
|
23
|
-
*
|
|
21
|
+
* Un campo de texto especializado para la entrada de color que combina un
|
|
22
|
+
* `<input type="color">` nativo con una visualización de texto de solo lectura del
|
|
23
|
+
* valor hexadecimal seleccionado, envuelto en la carcasa estándar de campo M3.
|
|
24
24
|
*
|
|
25
|
-
* **
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
25
|
+
* **Arquitectura visual:**
|
|
26
|
+
* Extiende el patrón de estilo de campo usado por `<moni-text-field>`. El
|
|
27
|
+
* slot de icono inicial se reemplaza por una muestra de color circular (`.swatch`)
|
|
28
|
+
* que se posiciona absolutamente sobre una entrada de color nativa invisible.
|
|
29
|
+
* Al hacer clic en la muestra se abre el selector de color del sistema. La parte de entrada de texto
|
|
30
|
+
* muestra el código hexadecimal seleccionado y es estrictamente `readOnly`.
|
|
31
31
|
*
|
|
32
|
-
* **
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
32
|
+
* **Sincronización de estado:**
|
|
33
|
+
* El componente escucha el evento nativo `change` en la entrada de color,
|
|
34
|
+
* actualiza la propiedad `value`, y re-despacha un evento compuesto `'change'`.
|
|
35
|
+
* No escucha `input` (arrastre continuo en el selector de color) para evitar
|
|
36
|
+
* el disparo excesivo de eventos, pero los consumidores pueden adjuntar sus propios
|
|
37
|
+
* escuchas de `input` directamente al elemento si se necesita una vista previa en vivo.
|
|
38
38
|
*
|
|
39
|
-
* @fires change -
|
|
40
|
-
*
|
|
39
|
+
* @fires change - Burbujea y está compuesto. Se dispara cuando el selector de color se cierra
|
|
40
|
+
* y el valor se confirma. Leer `element.value`.
|
|
41
41
|
*
|
|
42
42
|
* @example
|
|
43
43
|
* ```html
|
|
44
44
|
* <moni-color-field
|
|
45
|
-
* label="
|
|
45
|
+
* label="Color del Tema"
|
|
46
46
|
* name="primaryColor"
|
|
47
47
|
* value="#6750a4"
|
|
48
48
|
* variant="outlined"
|
|
49
49
|
* ></moni-color-field>
|
|
50
50
|
* ```
|
|
51
51
|
*
|
|
52
|
-
* @csspart field -
|
|
53
|
-
* @csspart swatch -
|
|
54
|
-
* @csspart input-color -
|
|
55
|
-
* @csspart input-text -
|
|
56
|
-
* @csspart label -
|
|
52
|
+
* @csspart field - El contenedor div exterior `.field`.
|
|
53
|
+
* @csspart swatch - El elemento de vista previa de color circular.
|
|
54
|
+
* @csspart input-color - El `<input type="color">` nativo, visualmente oculto.
|
|
55
|
+
* @csspart input-text - El `<input type="text">` nativo que muestra el código hexadecimal.
|
|
56
|
+
* @csspart label - El elemento flotante `<label>`.
|
|
57
57
|
*/
|
|
58
58
|
let MoniColorField = class MoniColorField extends MoniElement {
|
|
59
59
|
constructor() {
|
|
60
60
|
super(...arguments);
|
|
61
|
+
/**
|
|
62
|
+
* El nombre del input, enviado con los datos del formulario.
|
|
63
|
+
* @type {string}
|
|
64
|
+
*/
|
|
61
65
|
this.name = '';
|
|
66
|
+
/**
|
|
67
|
+
* El texto de la etiqueta flotante.
|
|
68
|
+
* @type {string}
|
|
69
|
+
*/
|
|
62
70
|
this.label = '';
|
|
71
|
+
/**
|
|
72
|
+
* Variante visual del campo de texto.
|
|
73
|
+
* @type {'filled' | 'outlined'}
|
|
74
|
+
* @default 'outlined'
|
|
75
|
+
*/
|
|
63
76
|
this.variant = 'outlined';
|
|
77
|
+
/**
|
|
78
|
+
* Define las dimensiones del campo de texto.
|
|
79
|
+
* @type {'small' | 'medium' | 'large' | 'extra'}
|
|
80
|
+
* @default 'medium'
|
|
81
|
+
*/
|
|
64
82
|
this.size = 'medium';
|
|
83
|
+
/**
|
|
84
|
+
* Forma del radio del borde del campo.
|
|
85
|
+
* @type {'round' | 'square' | 'no-round'}
|
|
86
|
+
* @default 'no-round'
|
|
87
|
+
*/
|
|
65
88
|
this.shape = 'no-round';
|
|
89
|
+
/**
|
|
90
|
+
* Deshabilita el campo de color.
|
|
91
|
+
* @type {boolean}
|
|
92
|
+
*/
|
|
66
93
|
this.disabled = false;
|
|
94
|
+
/**
|
|
95
|
+
* Texto de ayuda mostrado debajo del campo.
|
|
96
|
+
* @type {string}
|
|
97
|
+
*/
|
|
67
98
|
this.helper = '';
|
|
99
|
+
/**
|
|
100
|
+
* Texto de error mostrado debajo del campo cuando `error` es true.
|
|
101
|
+
* Sobrescribe el texto de ayuda.
|
|
102
|
+
* @type {string}
|
|
103
|
+
*/
|
|
68
104
|
this.errorText = '';
|
|
105
|
+
/**
|
|
106
|
+
* Si es true, establece el campo en un estado de error.
|
|
107
|
+
* @type {boolean}
|
|
108
|
+
*/
|
|
69
109
|
this.error = false;
|
|
110
|
+
/**
|
|
111
|
+
* El valor actual del color hexadecimal.
|
|
112
|
+
* @type {string}
|
|
113
|
+
* @default '#6750a4'
|
|
114
|
+
*/
|
|
70
115
|
this.value = '#6750a4';
|
|
71
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Hook de ciclo de vida de Lit.
|
|
119
|
+
* Sincroniza manualmente el estado reactivo (`value`, `disabled`) con los
|
|
120
|
+
* elementos nativos del DOM subyacente. Se hace manualmente porque el input
|
|
121
|
+
* de tipo color no despacha eventos de forma natural si mutamos sus atributos.
|
|
122
|
+
*/
|
|
72
123
|
updated(changed) {
|
|
73
124
|
if (changed.has('value')) {
|
|
74
125
|
if (this._colorInput)
|
|
@@ -110,6 +161,30 @@ let MoniColorField = class MoniColorField extends MoniElement {
|
|
|
110
161
|
}
|
|
111
162
|
`
|
|
112
163
|
]; }
|
|
164
|
+
/**
|
|
165
|
+
* Ensambla la estructura del Shadow DOM del campo de color.
|
|
166
|
+
*
|
|
167
|
+
* **Estrategia de input en capas:**
|
|
168
|
+
* Dos elementos `<input>` se apilan absolutamente:
|
|
169
|
+
* 1. `<input type="color">` (z-index: 2, opacidad: 0) — invisible pero
|
|
170
|
+
* clicable, abre el selector de color nativo del sistema operativo.
|
|
171
|
+
* 2. `<input type="text" readonly>` (z-index: 0) — visible, muestra el
|
|
172
|
+
* valor hexadecimal. `tabindex="-1"` en el input de color significa que
|
|
173
|
+
* solo el input de texto es alcanzable por teclado.
|
|
174
|
+
*
|
|
175
|
+
* El círculo `.swatch` (z-index: 1) está posicionado absolutamente en el
|
|
176
|
+
* borde inicial del input de texto y estilizado a través de `--_swatch: ${this.value}`,
|
|
177
|
+
* lo cual establece su `background-color` mediante CSS `var(--_swatch)`.
|
|
178
|
+
*
|
|
179
|
+
* **Composición de `fieldClasses`:**
|
|
180
|
+
* El mapa de clases sigue la convención de nomenclatura field-styles de BeerCSS:
|
|
181
|
+
* `field`, `label`, `fill`/`border` (variante), `small`/`large`/`extra` (tamaño),
|
|
182
|
+
* `prefix` (activa el cambio de padding inicial para la muestra), `invalid`, forma.
|
|
183
|
+
*
|
|
184
|
+
* **Renderizado condicional de etiqueta / ayuda:**
|
|
185
|
+
* Usa el centinela `nothing` de Lit para evitar renderizar nodos DOM vacíos cuando
|
|
186
|
+
* `label` o `helper` son cadenas vacías, previniendo saltos de diseño.
|
|
187
|
+
*/
|
|
113
188
|
render() {
|
|
114
189
|
const isActive = Boolean(this.value);
|
|
115
190
|
const fieldClasses = {
|