@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
|
@@ -16,58 +16,77 @@ import { customElement, property } from 'lit/decorators.js';
|
|
|
16
16
|
import { unsafeStatic, html as staticHtml } from 'lit/static-html.js';
|
|
17
17
|
import { MoniElement, sharedStyles } from './_base/index.js';
|
|
18
18
|
/**
|
|
19
|
-
* Material Design 3 Typography
|
|
19
|
+
* Componente Material Design 3 Typography (Tipografía).
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
21
|
+
* Un componente de texto especializado que aplica la escala tipográfica M3. Asegura
|
|
22
|
+
* que la tipografía sea consistente, accesible y correctamente estilizada en toda la
|
|
23
|
+
* aplicación sin requerir clases CSS manuales.
|
|
24
24
|
*
|
|
25
|
-
* **
|
|
25
|
+
* **Categorías de Escala Tipográfica:**
|
|
26
|
+
* - `display`: El texto más grande en la pantalla, reservado para texto corto e importante
|
|
27
|
+
* o números. Funciona mejor en pantallas grandes. (Renderiza `<h1>` por defecto).
|
|
28
|
+
* - `headline`: Texto de alto énfasis para encabezados primarios de página/sección.
|
|
29
|
+
* (Renderiza `<h2>` por defecto).
|
|
30
|
+
* - `title`: Texto de énfasis medio utilizado para encabezados de diálogos o títulos
|
|
31
|
+
* de sección más pequeños. (Renderiza `<h3>` por defecto).
|
|
32
|
+
* - `body`: Texto de párrafo estándar utilizado para contenido largo.
|
|
33
|
+
* (Renderiza `<p>` por defecto).
|
|
34
|
+
* - `label`: Texto pequeño y utilitario usado para botones, leyendas y elementos
|
|
35
|
+
* de formulario. (Renderiza `<label>` por defecto).
|
|
26
36
|
*
|
|
27
|
-
*
|
|
28
|
-
* - `display`: The largest text on the screen, reserved for short, important
|
|
29
|
-
* text or numerals. Works best on large screens. (Renders `<h1>` by default).
|
|
30
|
-
* - `headline`: High-emphasis text for primary page/section headers.
|
|
31
|
-
* (Renders `<h2>` by default).
|
|
32
|
-
* - `title`: Medium-emphasis text used for dialog headers or smaller section
|
|
33
|
-
* titles. (Renders `<h3>` by default).
|
|
34
|
-
* - `body`: Standard paragraph text used for long-form content.
|
|
35
|
-
* (Renders `<p>` by default).
|
|
36
|
-
* - `label`: Small, utilitarian text used for buttons, captions, and form
|
|
37
|
-
* elements. (Renders `<label>` by default).
|
|
37
|
+
* Cada categoría soporta tres tamaños: `large`, `medium` y `small`.
|
|
38
38
|
*
|
|
39
|
-
*
|
|
39
|
+
* **Etiquetas Semánticas:**
|
|
40
|
+
* El componente selecciona automáticamente una etiqueta semántica HTML apropiada basada en
|
|
41
|
+
* la variante. Puedes sobrescribir esto explícitamente configurando el atributo `as`
|
|
42
|
+
* (ej., para renderizar un estilo `headline` pero usando una etiqueta `<span>` por razones
|
|
43
|
+
* de SEO o estructurales).
|
|
40
44
|
*
|
|
41
|
-
*
|
|
42
|
-
* The component automatically selects an appropriate HTML semantic tag based on
|
|
43
|
-
* the variant. You can explicitly override this by setting the `as` attribute
|
|
44
|
-
* (e.g., to render a `headline` style but using a `<span>` tag for SEO or
|
|
45
|
-
* structural reasons).
|
|
45
|
+
* @element moni-typography
|
|
46
46
|
*
|
|
47
47
|
* @example
|
|
48
48
|
* ```html
|
|
49
|
-
* <!--
|
|
50
|
-
* <moni-typography variant="display" size="large">
|
|
49
|
+
* <!-- Renderiza un <h1> con estilos display-large -->
|
|
50
|
+
* <moni-typography variant="display" size="large">Texto Héroe</moni-typography>
|
|
51
51
|
*
|
|
52
|
-
* <!--
|
|
53
|
-
* <moni-typography variant="body">
|
|
52
|
+
* <!-- Renderiza un <p> con estilos body-medium -->
|
|
53
|
+
* <moni-typography variant="body">Texto de párrafo estándar.</moni-typography>
|
|
54
54
|
*
|
|
55
|
-
* <!--
|
|
56
|
-
* <moni-typography variant="title" as="span">
|
|
55
|
+
* <!-- Sobrescribiendo la etiqueta semántica -->
|
|
56
|
+
* <moni-typography variant="title" as="span">Título en línea</moni-typography>
|
|
57
57
|
* ```
|
|
58
58
|
*
|
|
59
|
-
* @slot default -
|
|
59
|
+
* @slot default - El contenido de texto a mostrar.
|
|
60
|
+
* @csspart text - El elemento semántico interno (ej., h1, p, span) que envuelve el texto.
|
|
60
61
|
*/
|
|
61
62
|
let MoniTypography = class MoniTypography extends MoniElement {
|
|
62
63
|
constructor() {
|
|
63
64
|
super(...arguments);
|
|
65
|
+
/**
|
|
66
|
+
* La categoría de la escala tipográfica M3 a aplicar.
|
|
67
|
+
* Dicta la lógica base de font-family, line-height, weight, y letter-spacing.
|
|
68
|
+
* @type {'display' | 'headline' | 'title' | 'body' | 'label'}
|
|
69
|
+
*/
|
|
64
70
|
this.variant = 'body';
|
|
71
|
+
/**
|
|
72
|
+
* El tamaño dentro de la categoría de variante elegida.
|
|
73
|
+
* @type {'large' | 'medium' | 'small'}
|
|
74
|
+
*/
|
|
65
75
|
this.size = 'medium';
|
|
76
|
+
/**
|
|
77
|
+
* Sobrescribe la etiqueta semántica HTML por defecto (ej. 'h1', 'p', 'span')
|
|
78
|
+
* que se asigna automáticamente basándose en la variante (`variant`).
|
|
79
|
+
* @type {string | null}
|
|
80
|
+
*/
|
|
66
81
|
this.as = null;
|
|
82
|
+
/**
|
|
83
|
+
* Contenido de texto simple opcional. Típicamente usarías el slot por defecto en su lugar.
|
|
84
|
+
* @type {string}
|
|
85
|
+
*/
|
|
67
86
|
this.text = '';
|
|
68
87
|
}
|
|
69
88
|
static { MoniTypography_1 = this; }
|
|
70
|
-
/**
|
|
89
|
+
/** Etiqueta semántica por defecto para cada variante según la especificación M3. */
|
|
71
90
|
static _tagFor(variant) {
|
|
72
91
|
switch (variant) {
|
|
73
92
|
case 'display':
|
|
@@ -82,11 +101,30 @@ let MoniTypography = class MoniTypography extends MoniElement {
|
|
|
82
101
|
return 'label';
|
|
83
102
|
}
|
|
84
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Renderiza el elemento tipográfico con una etiqueta HTML seleccionada dinámicamente.
|
|
106
|
+
*
|
|
107
|
+
* **Selección dinámica de etiquetas:**
|
|
108
|
+
* `_tagFor(variant)` infiere el elemento HTML semántico de la variante de tipografía
|
|
109
|
+
* (ej. `'display-large'` → `<h1>`, `'body-medium'` → `<p>`).
|
|
110
|
+
* El atributo `as` sobrescribe esta inferencia para contextos semánticos personalizados
|
|
111
|
+
* (ej. usar `as="div"` cuando la tipografía está dentro de un `<dl>`).
|
|
112
|
+
*
|
|
113
|
+
* **¿Por qué `staticHtml` + `unsafeStatic`?**
|
|
114
|
+
* Lit 3 no permite expresiones dinámicas en posiciones de nombres de etiquetas
|
|
115
|
+
* (`<${tag}>` lanzaría un error de plantilla). `staticHtml` es un template tag
|
|
116
|
+
* provisto por Lit que sí permite la interpolación estática de etiquetas, y `unsafeStatic`
|
|
117
|
+
* envuelve el string para marcarlo como de confianza (sin riesgo XSS ya que `tag` proviene de
|
|
118
|
+
* un enum controlado vía `_tagFor()`).
|
|
119
|
+
*
|
|
120
|
+
* El string `cls` (`variant + size`) mapea directamente a clases de utilidad
|
|
121
|
+
* de tipografía (ej. `'display large'`).
|
|
122
|
+
*/
|
|
85
123
|
render() {
|
|
86
124
|
const cls = `${this.variant} ${this.size}`;
|
|
87
125
|
const tag = this.as ?? MoniTypography_1._tagFor(this.variant);
|
|
88
|
-
//
|
|
89
|
-
// "Bindings in tag names are not supported"
|
|
126
|
+
// Renderiza la etiqueta dinámica con `unsafeStatic` para evitar el error
|
|
127
|
+
// "Bindings in tag names are not supported" de lit 3.
|
|
90
128
|
const tagStatic = unsafeStatic(tag);
|
|
91
129
|
return staticHtml `<${tagStatic}
|
|
92
130
|
class=${cls}
|
package/dist/styles/tokens.css
CHANGED
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
--radius-full: 9999px;
|
|
95
95
|
|
|
96
96
|
/* ─── Card radius (overridable per card via --moni-radius-card) ─── */
|
|
97
|
-
--radius-card: var(--moni-radius-card,
|
|
97
|
+
--radius-card: var(--moni-radius-card, 1.5rem);
|
|
98
98
|
|
|
99
99
|
/* ─── List dividers (overridable per list via --moni-list-divider) ─── */
|
|
100
100
|
--moni-list-divider: var(--moni-list-divider-fallback, 0);
|
|
@@ -120,12 +120,12 @@
|
|
|
120
120
|
--duration-emphasized: 500ms;
|
|
121
121
|
--duration-long: 800ms;
|
|
122
122
|
|
|
123
|
-
/* ─── Elevación / sombras M3 ─── */
|
|
124
|
-
--shadow-1:
|
|
125
|
-
--shadow-2:
|
|
126
|
-
--shadow-3:
|
|
127
|
-
--shadow-4:
|
|
128
|
-
--shadow-5:
|
|
123
|
+
/* ─── Elevación / sombras M3 & Minimalist ─── */
|
|
124
|
+
--shadow-1: 0 1px 2px 0 rgba(0, 0, 0, 0.04);
|
|
125
|
+
--shadow-2: 0 2px 4px -1px rgba(0, 0, 0, 0.04), 0 1px 2px -1px rgba(0, 0, 0, 0.02);
|
|
126
|
+
--shadow-3: 0 4px 8px -2px rgba(0, 0, 0, 0.04), 0 2px 4px -2px rgba(0, 0, 0, 0.02);
|
|
127
|
+
--shadow-4: 0 8px 16px -4px rgba(0, 0, 0, 0.04), 0 4px 8px -4px rgba(0, 0, 0, 0.02);
|
|
128
|
+
--shadow-5: 0 12px 24px -8px rgba(0, 0, 0, 0.05), 0 8px 16px -8px rgba(0, 0, 0, 0.03);
|
|
129
129
|
|
|
130
130
|
/* ─── Grain opacity ─── */
|
|
131
131
|
--moni-grain-opacity: var(--moni-grain-opacity, 0.03);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface MoniEventDetail<T = unknown> {
|
|
2
|
+
value?: T;
|
|
3
|
+
/** Índice del elemento (para listas/colecciones) */
|
|
4
|
+
index?: number;
|
|
5
|
+
/** Elementos múltiples (para slots o selecciones múltiples) */
|
|
6
|
+
items?: any[];
|
|
7
|
+
/** Nodos del DOM asociados (para slots) */
|
|
8
|
+
nodes?: Node[];
|
|
9
|
+
/** Evento nativo original que disparó la acción */
|
|
10
|
+
originalEvent?: Event;
|
|
11
|
+
/** El elemento asociado al evento */
|
|
12
|
+
item?: T;
|
|
13
|
+
/** Referencia física al DOM node */
|
|
14
|
+
card?: HTMLElement | null;
|
|
15
|
+
}
|
|
16
|
+
export type MoniEvent<T = unknown> = CustomEvent<MoniEventDetail<T>>;
|
|
17
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,2CAA2C;IAC3C,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,mDAAmD;IACnD,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,qCAAqC;IACrC,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,oCAAoC;IACpC,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,OAAO,IAAI,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MoniEventDetail } from '../types/events';
|
|
2
|
+
export interface EventEmitterOptions<T> {
|
|
3
|
+
detail?: MoniEventDetail<T>;
|
|
4
|
+
bubbles?: boolean;
|
|
5
|
+
composed?: boolean;
|
|
6
|
+
cancelable?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Helper para emitir Custom Events estandarizados en la librería moni-ui.
|
|
10
|
+
* Asegura que los eventos crucen el Shadow DOM por defecto y unifican el `detail`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function emitMoniEvent<T>(element: HTMLElement, eventName: string, options?: EventEmitterOptions<T>): boolean;
|
|
13
|
+
//# sourceMappingURL=event-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/utils/event-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAQT"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper para emitir Custom Events estandarizados en la librería moni-ui.
|
|
3
|
+
* Asegura que los eventos crucen el Shadow DOM por defecto y unifican el `detail`.
|
|
4
|
+
*/
|
|
5
|
+
export function emitMoniEvent(element, eventName, options) {
|
|
6
|
+
const event = new CustomEvent(eventName, {
|
|
7
|
+
bubbles: options?.bubbles ?? true,
|
|
8
|
+
composed: options?.composed ?? true,
|
|
9
|
+
cancelable: options?.cancelable ?? false,
|
|
10
|
+
detail: options?.detail ?? {},
|
|
11
|
+
});
|
|
12
|
+
return element.dispatchEvent(event);
|
|
13
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moni-labs/moni-ui",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Design system unificado para Moni — Material Design 3 Expressive, mobile-first.",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"import": "./dist/web-components.js"
|
|
18
18
|
},
|
|
19
19
|
"./styles": "./dist/styles/index.css",
|
|
20
|
+
"./styles/*": "./dist/styles/*",
|
|
20
21
|
"./components/*.ts": "./src/components/*.ts",
|
|
21
22
|
"./components/*": {
|
|
22
23
|
"types": "./dist/components/*.d.ts",
|
|
@@ -23,19 +23,25 @@ import { LitElement } from 'lit';
|
|
|
23
23
|
* internal CSS class names (`.button`, `.field`, `.slider`, etc.) do not leak
|
|
24
24
|
* into or collide with the consumer's global stylesheet.
|
|
25
25
|
*
|
|
26
|
+
* **Global Events Architecture:**
|
|
27
|
+
* Provides base events to all components automatically:
|
|
28
|
+
* - \`moni-enter-viewport\` / \`moni-leave-viewport\` via IntersectionObserver
|
|
29
|
+
* - \`moni-resize\` via ResizeObserver
|
|
30
|
+
* - \`slot-click\` via delegated event listener on the host
|
|
31
|
+
*
|
|
26
32
|
* **Extension contract:**
|
|
27
33
|
* Every subclass must:
|
|
28
34
|
* 1. Be decorated with `@customElement('moni-<name>')`.
|
|
29
|
-
* 2. Define `static override styles = [sharedStyles, css
|
|
35
|
+
* 2. Define `static override styles = [sharedStyles, css\`...\`]`.
|
|
30
36
|
* 3. Implement `override render(): TemplateResult`.
|
|
31
37
|
*
|
|
32
|
-
* Subclasses MUST NOT add behavior (event handling, timers, fetch calls) that
|
|
33
|
-
* is not directly related to rendering the shadow DOM. See CONTRIBUTING.md
|
|
34
|
-
* for the full component authoring guide.
|
|
35
|
-
*
|
|
36
38
|
* @see {@link https://lit.dev/docs/components/overview/ Lit component overview}
|
|
37
39
|
*/
|
|
38
40
|
export class MoniElement extends LitElement {
|
|
41
|
+
private _globalIntersectionObserver?: IntersectionObserver;
|
|
42
|
+
private _globalResizeObserver?: ResizeObserver;
|
|
43
|
+
private _isBaseInViewport = false;
|
|
44
|
+
|
|
39
45
|
/**
|
|
40
46
|
* Returns the component's render root.
|
|
41
47
|
*
|
|
@@ -43,15 +49,73 @@ export class MoniElement extends LitElement {
|
|
|
43
49
|
* shadow root (`{ mode: 'open' }`). Open mode allows external tools (browser
|
|
44
50
|
* devtools, testing frameworks) to traverse the shadow tree.
|
|
45
51
|
*
|
|
46
|
-
* This override exists explicitly to document the shadow root mode and to
|
|
47
|
-
* provide a hook for subclasses that may need to change the root in the future
|
|
48
|
-
* (e.g. to support `adoptedStyleSheets` in a specific environment).
|
|
49
|
-
*
|
|
50
52
|
* @returns The shadow root that Lit will render templates into.
|
|
51
53
|
*/
|
|
52
54
|
protected override createRenderRoot() {
|
|
53
55
|
return super.createRenderRoot();
|
|
54
56
|
}
|
|
57
|
+
|
|
58
|
+
override connectedCallback() {
|
|
59
|
+
super.connectedCallback();
|
|
60
|
+
|
|
61
|
+
// 1. Intersection Observer for all components (Visibility Events)
|
|
62
|
+
if (typeof IntersectionObserver !== 'undefined') {
|
|
63
|
+
this._globalIntersectionObserver = new IntersectionObserver((entries) => {
|
|
64
|
+
entries.forEach((entry) => {
|
|
65
|
+
if (entry.isIntersecting !== this._isBaseInViewport) {
|
|
66
|
+
this._isBaseInViewport = entry.isIntersecting;
|
|
67
|
+
this.dispatchEvent(new CustomEvent(
|
|
68
|
+
this._isBaseInViewport ? 'moni-enter-viewport' : 'moni-leave-viewport',
|
|
69
|
+
{ bubbles: true, composed: true, detail: { element: this } }
|
|
70
|
+
));
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}, { threshold: [0, 1] });
|
|
74
|
+
this._globalIntersectionObserver.observe(this);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// 2. Resize Observer for all components (Layout Events)
|
|
78
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
79
|
+
this._globalResizeObserver = new ResizeObserver((entries) => {
|
|
80
|
+
entries.forEach((entry) => {
|
|
81
|
+
this.dispatchEvent(new CustomEvent('moni-resize', {
|
|
82
|
+
bubbles: true,
|
|
83
|
+
composed: true,
|
|
84
|
+
detail: { contentRect: entry.contentRect, element: this }
|
|
85
|
+
}));
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
this._globalResizeObserver.observe(this);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// 3. Global Slot Click Delegation
|
|
92
|
+
this.addEventListener('click', this._handleGlobalSlotClick);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
override disconnectedCallback() {
|
|
96
|
+
super.disconnectedCallback();
|
|
97
|
+
// Rigorous memory leak prevention
|
|
98
|
+
this._globalIntersectionObserver?.disconnect();
|
|
99
|
+
this._globalResizeObserver?.disconnect();
|
|
100
|
+
this.removeEventListener('click', this._handleGlobalSlotClick);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Manejador global para detectar clicks provenientes de cualquier slot de la librería
|
|
105
|
+
*/
|
|
106
|
+
private _handleGlobalSlotClick = (e: Event) => {
|
|
107
|
+
const path = e.composedPath();
|
|
108
|
+
const slotEl = path.find(node => node instanceof HTMLSlotElement) as HTMLSlotElement | undefined;
|
|
109
|
+
|
|
110
|
+
if (slotEl) {
|
|
111
|
+
const slotName = slotEl.name || 'default';
|
|
112
|
+
this.dispatchEvent(new CustomEvent('slot-click', {
|
|
113
|
+
bubbles: true,
|
|
114
|
+
composed: true,
|
|
115
|
+
detail: { originalEvent: e, slotName, originalTarget: e.target }
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
55
119
|
}
|
|
56
120
|
|
|
57
121
|
export default MoniElement;
|
package/src/components/index.ts
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* @contributors Moni Labs & Contributors
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
// Auto-
|
|
9
|
-
//
|
|
8
|
+
// Auto-registra todos los Web Components de Moni UI.
|
|
9
|
+
// Importar este archivo define cada elemento personalizado <moni-*>.
|
|
10
10
|
|
|
11
11
|
export { MoniBadge } from './moni-badge.js';
|
|
12
12
|
export { MoniBottomSheet } from './moni-bottom-sheet.js';
|
|
@@ -5,6 +5,25 @@
|
|
|
5
5
|
* @contributors Moni Labs & Contributors
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Una colección de formas poligonales utilizadas para animaciones de indicadores de carga.
|
|
10
|
+
*
|
|
11
|
+
* Cada forma se define mediante una serie de coordenadas basadas en porcentajes que crean
|
|
12
|
+
* trazados complejos (ej., '4-sided-cookie', 'oval', 'pentagon', 'pill', 'soft-burst', 'sunny').
|
|
13
|
+
* Estos polígonos se utilizan principalmente junto con `clip-path` de CSS y GSAP
|
|
14
|
+
* (o librerías de animación similares) para transformarse suavemente entre diferentes estados.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { loadingIndicatorPolygons } from './loading-shapes';
|
|
19
|
+
*
|
|
20
|
+
* const path = loadingIndicatorPolygons['soft-burst'];
|
|
21
|
+
* element.style.clipPath = `polygon(${path})`;
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @constant
|
|
25
|
+
* @type {Record<string, string>}
|
|
26
|
+
*/
|
|
8
27
|
export const loadingIndicatorPolygons = {
|
|
9
28
|
'4-sided-cookie': '63.83% 2.22%, 65.10% 1.70%, 66.36% 1.26%, 67.62% 0.89%, 68.88% 0.58%, 70.14% 0.34%, 71.39% 0.16%, 72.63% 0.05%, 73.86% 0.00%, 75.08% 0.01%, 76.28% 0.08%, 77.48% 0.21%, 78.66% 0.40%, 79.82% 0.63%, 80.97% 0.93%, 82.09% 1.27%, 83.20% 1.67%, 84.28% 2.11%, 85.34% 2.60%, 86.37% 3.14%, 87.38% 3.72%, 88.36% 4.35%, 89.31% 5.02%, 90.23% 5.73%, 91.12% 6.48%, 91.98% 7.26%, 92.80% 8.09%, 93.58% 8.94%, 94.32% 9.83%, 95.03% 10.76%, 95.70% 11.71%, 96.32% 12.69%, 96.90% 13.70%, 97.43% 14.74%, 97.92% 15.80%, 98.36% 16.88%, 98.76% 17.99%, 99.10% 19.12%, 99.38% 20.26%, 99.62% 21.43%, 99.80% 22.61%, 99.92% 23.80%, 99.99% 25.01%, 100.00% 26.23%, 99.94% 27.47%, 99.83% 28.71%, 99.65% 29.95%, 99.40% 31.21%, 99.09% 32.47%, 98.71% 33.73%, 98.26% 35.00%, 97.75% 36.25%, 97.26% 37.36%, 96.78% 38.47%, 96.30% 39.59%, 95.83% 40.72%, 95.42% 41.87%, 95.06% 43.03%, 94.76% 44.21%, 94.52% 45.40%, 94.33% 46.59%, 94.20% 47.79%, 94.12% 48.99%, 94.11% 50.19%, 94.14% 51.40%, 94.24% 52.60%, 94.39% 53.80%, 94.59% 54.99%, 94.85% 56.17%, 95.17% 57.34%, 95.55% 58.50%, 95.98% 59.65%, 96.45% 60.77%, 96.94% 61.89%, 97.42% 63.00%, 97.92% 64.15%, 98.41% 65.41%, 98.84% 66.68%, 99.20% 67.94%, 99.49% 69.20%, 99.71% 70.45%, 99.87% 71.70%, 99.97% 72.93%, 100.00% 74.16%, 99.97% 75.38%, 99.89% 76.58%, 99.75% 77.78%, 99.55% 78.95%, 99.30% 80.11%, 98.99% 81.25%, 98.63% 82.37%, 98.23% 83.47%, 97.77% 84.55%, 97.27% 85.60%, 96.72% 86.63%, 96.12% 87.63%, 95.49% 88.60%, 94.81% 89.55%, 94.09% 90.46%, 93.33% 91.34%, 92.54% 92.19%, 91.70% 93.00%, 90.84% 93.77%, 89.94% 94.51%, 89.01% 95.20%, 88.05% 95.86%, 87.06% 96.47%, 86.04% 97.04%, 85.00% 97.56%, 83.93% 98.04%, 82.84% 98.47%, 81.73% 98.85%, 80.60% 99.17%, 79.45% 99.45%, 78.28% 99.67%, 77.09% 99.84%, 75.89% 99.95%, 74.68% 100.00%, 73.46% 99.99%, 72.23% 99.92%, 70.98% 99.79%, 69.73% 99.59%, 68.48% 99.33%, 67.22% 99.00%, 65.95% 98.60%, 64.69% 98.14%, 63.47% 97.63%, 62.36% 97.14%, 61.25% 96.66%, 60.13% 96.18%, 58.99% 95.72%, 57.84% 95.32%, 56.67% 94.98%, 55.49% 94.70%, 54.31% 94.47%, 53.11% 94.29%, 51.91% 94.18%, 50.71% 94.11%, 49.50% 94.11%, 48.30% 94.16%, 47.10% 94.27%, 45.90% 94.43%, 44.71% 94.65%, 43.53% 94.93%, 42.36% 95.26%, 41.21% 95.65%, 40.07% 96.09%, 38.95% 96.58%, 37.84% 97.06%, 36.72% 97.54%, 35.54% 98.05%, 34.27% 98.53%, 33.01% 98.94%, 31.74% 99.28%, 30.49% 99.55%, 29.24% 99.76%, 27.99% 99.90%, 26.76% 99.98%, 25.53% 100.00%, 24.32% 99.96%, 23.12% 99.86%, 21.93% 99.70%, 20.76% 99.49%, 19.60% 99.23%, 18.47% 98.91%, 17.35% 98.54%, 16.26% 98.12%, 15.19% 97.65%, 14.14% 97.13%, 13.12% 96.57%, 12.12% 95.97%, 11.16% 95.32%, 10.22% 94.63%, 9.32% 93.90%, 8.45% 93.14%, 7.61% 92.33%, 6.81% 91.49%, 6.04% 90.62%, 5.32% 89.71%, 4.63% 88.77%, 3.99% 87.80%, 3.38% 86.81%, 2.83% 85.78%, 2.31% 84.74%, 1.85% 83.66%, 1.43% 82.57%, 1.07% 81.45%, 0.75% 80.31%, 0.49% 79.16%, 0.28% 77.98%, 0.13% 76.80%, 0.04% 75.59%, 0.00% 74.38%, 0.02% 73.15%, 0.11% 71.92%, 0.26% 70.67%, 0.47% 69.42%, 0.75% 68.16%, 1.09% 66.90%, 1.51% 65.64%, 1.99% 64.37%, 2.49% 63.19%, 2.98% 62.08%, 3.46% 60.97%, 3.94% 59.85%, 4.38% 58.71%, 4.77% 57.55%, 5.09% 56.38%, 5.37% 55.20%, 5.58% 54.01%, 5.74% 52.81%, 5.84% 51.61%, 5.89% 50.41%, 5.88% 49.20%, 5.82% 48.00%, 5.70% 46.80%, 5.52% 45.61%, 5.28% 44.42%, 4.99% 43.24%, 4.65% 42.07%, 4.25% 40.92%, 3.79% 39.78%, 3.30% 38.67%, 2.82% 37.56%, 2.34% 36.45%, 1.82% 35.22%, 1.36% 33.95%, 0.97% 32.69%, 0.65% 31.43%, 0.39% 30.18%, 0.20% 28.93%, 0.07% 27.68%, 0.01% 26.45%, 0.01% 25.23%, 0.06% 24.02%, 0.17% 22.82%, 0.34% 21.64%, 0.57% 20.47%, 0.85% 19.32%, 1.18% 18.19%, 1.56% 17.08%, 2.00% 15.99%, 2.48% 14.92%, 3.00% 13.88%, 3.57% 12.87%, 4.19% 11.88%, 4.85% 10.92%, 5.55% 9.99%, 6.29% 9.10%, 7.06% 8.23%, 7.88% 7.41%, 8.72% 6.61%, 9.61% 5.86%, 10.52% 5.14%, 11.47% 4.47%, 12.44% 3.83%, 13.45% 3.24%, 14.48% 2.69%, 15.53% 2.19%, 16.61% 1.74%, 17.71% 1.34%, 18.83% 0.98%, 19.98% 0.68%, 21.14% 0.43%, 22.31% 0.24%, 23.50% 0.10%, 24.71% 0.02%, 25.93% 0.00%, 27.16% 0.04%, 28.39% 0.14%, 29.64% 0.30%, 30.89% 0.53%, 32.15% 0.83%, 33.41% 1.19%, 34.68% 1.62%, 35.94% 2.12%, 37.08% 2.61%, 38.20% 3.10%, 39.31% 3.58%, 40.43% 4.06%, 41.58% 4.48%, 42.74% 4.85%, 43.91% 5.17%, 45.10% 5.43%, 46.29% 5.63%, 47.49% 5.77%, 48.69% 5.86%, 49.89% 5.90%, 51.10% 5.87%, 52.30% 5.79%, 53.50% 5.66%, 54.69% 5.47%, 55.88% 5.22%, 57.05% 4.91%, 58.21% 4.55%, 59.36% 4.14%, 60.49% 3.67%, 61.61% 3.18%, 62.72% 2.70%, 63.83% 2.22%',
|
|
10
29
|
'9-sided-cookie': '61.39% 5.18%, 62.25% 5.81%, 63.15% 6.37%, 64.08% 6.88%, 65.04% 7.33%, 66.03% 7.71%, 67.04% 8.02%, 68.07% 8.27%, 69.11% 8.45%, 70.17% 8.57%, 71.18% 8.61%, 72.43% 8.63%, 73.38% 8.68%, 74.46% 8.80%, 75.52% 9.00%, 76.56% 9.26%, 77.57% 9.59%, 78.55% 9.98%, 79.50% 10.44%, 80.42% 10.95%, 81.30% 11.52%, 82.14% 12.14%, 82.93% 12.81%, 83.69% 13.54%, 84.39% 14.31%, 85.05% 15.13%, 85.65% 15.99%, 86.20% 16.89%, 86.69% 17.84%, 87.12% 18.81%, 87.49% 19.83%, 87.79% 20.87%, 87.99% 21.78%, 88.22% 23.01%, 88.46% 24.01%, 88.76% 25.02%, 89.14% 26.02%, 89.57% 26.98%, 90.07% 27.91%, 90.63% 28.81%, 91.24% 29.67%, 91.91% 30.49%, 92.64% 31.27%, 93.40% 31.98%, 94.34% 32.79%, 95.02% 33.41%, 95.78% 34.19%, 96.48% 35.02%, 97.12% 35.88%, 97.70% 36.77%, 98.21% 37.69%, 98.66% 38.65%, 99.05% 39.62%, 99.37% 40.62%, 99.63% 41.63%, 99.82% 42.66%, 99.94% 43.70%, 100.00% 44.74%, 99.99% 45.79%, 99.91% 46.84%, 99.76% 47.88%, 99.54% 48.92%, 99.26% 49.95%, 98.90% 50.97%, 98.47% 51.97%, 98.04% 52.81%, 97.43% 53.91%, 96.96% 54.80%, 96.53% 55.77%, 96.16% 56.77%, 95.86% 57.78%, 95.63% 58.81%, 95.46% 59.86%, 95.36% 60.91%, 95.34% 61.97%, 95.38% 63.03%, 95.49% 64.09%, 95.68% 65.27%, 95.82% 66.19%, 95.91% 67.28%, 95.93% 68.36%, 95.88% 69.43%, 95.76% 70.49%, 95.57% 71.53%, 95.32% 72.55%, 95.00% 73.55%, 94.61% 74.53%, 94.17% 75.47%, 93.66% 76.39%, 93.10% 77.27%, 92.48% 78.11%, 91.81% 78.92%, 91.09% 79.68%, 90.31% 80.39%, 89.48% 81.06%, 88.61% 81.68%, 87.69% 82.23%, 86.73% 82.74%, 85.81% 83.14%, 84.74% 83.55%, 83.75% 83.94%, 82.78% 84.40%, 81.85% 84.91%, 80.96% 85.49%, 80.11% 86.11%, 79.30% 86.80%, 78.54% 87.53%, 77.83% 88.31%, 77.17% 89.14%, 76.56% 90.02%, 75.97% 90.98%, 75.43% 91.87%, 74.84% 92.73%, 74.17% 93.59%, 73.45% 94.38%, 72.69% 95.13%, 71.89% 95.82%, 71.04% 96.45%, 70.16% 97.02%, 69.25% 97.53%, 68.30% 97.99%, 67.34% 98.38%, 66.34% 98.71%, 65.33% 98.97%, 64.30% 99.17%, 63.26% 99.30%, 62.21% 99.37%, 61.15% 99.37%, 60.08% 99.29%, 59.02% 99.15%, 57.96% 98.93%, 56.92% 98.65%, 55.99% 98.34%, 54.89% 97.96%, 53.86% 97.67%, 52.82% 97.46%, 51.77% 97.31%, 50.72% 97.23%, 49.66% 97.21%, 48.61% 97.27%, 47.55% 97.39%, 46.51% 97.59%, 45.48% 97.85%, 44.51% 98.16%, 43.35% 98.56%, 42.42% 98.84%, 41.36% 99.08%, 40.30% 99.25%, 39.24% 99.35%, 38.18% 99.38%, 37.12% 99.34%, 36.07% 99.23%, 35.04% 99.05%, 34.02% 98.81%, 33.02% 98.50%, 32.04% 98.13%, 31.09% 97.70%, 30.17% 97.21%, 29.27% 96.66%, 28.42% 96.05%, 27.60% 95.38%, 26.82% 94.66%, 26.08% 93.88%, 25.40% 93.04%, 24.76% 92.16%, 24.27% 91.38%, 23.64% 90.33%, 23.06% 89.45%, 22.42% 88.60%, 21.72% 87.80%, 20.98% 87.05%, 20.19% 86.35%, 19.35% 85.70%, 18.47% 85.11%, 17.56% 84.58%, 16.60% 84.10%, 15.67% 83.70%, 14.49% 83.26%, 13.63% 82.90%, 12.65% 82.42%, 11.72% 81.88%, 10.83% 81.29%, 9.98% 80.64%, 9.19% 79.94%, 8.45% 79.20%, 7.75% 78.41%, 7.12% 77.58%, 6.53% 76.71%, 6.01% 75.81%, 5.54% 74.87%, 5.14% 73.91%, 4.80% 72.92%, 4.52% 71.90%, 4.30% 70.87%, 4.16% 69.82%, 4.08% 68.75%, 4.08% 67.67%, 4.15% 66.59%, 4.26% 65.66%, 4.47% 64.41%, 4.59% 63.41%, 4.66% 62.35%, 4.66% 61.29%, 4.59% 60.23%, 4.44% 59.18%, 4.24% 58.15%, 3.96% 57.13%, 3.62% 56.12%, 3.21% 55.14%, 2.73% 54.19%, 2.14% 53.14%, 1.71% 52.32%, 1.25% 51.33%, 0.87% 50.32%, 0.55% 49.29%, 0.31% 48.25%, 0.14% 47.21%, 0.04% 46.16%, 0.00% 45.11%, 0.03% 44.07%, 0.13% 43.03%, 0.30% 42.00%, 0.53% 40.98%, 0.83% 39.98%, 1.19% 38.99%, 1.62% 38.03%, 2.11% 37.10%, 2.67% 36.19%, 3.28% 35.32%, 3.96% 34.48%, 4.70% 33.69%, 5.41% 33.02%, 6.33% 32.22%, 7.09% 31.54%, 7.84% 30.78%, 8.53% 29.97%, 9.16% 29.12%, 9.74% 28.24%, 10.26% 27.32%, 10.72% 26.37%, 11.11% 25.38%, 11.45% 24.37%, 11.71% 23.34%, 11.94% 22.20%, 12.13% 21.24%, 12.40% 20.20%, 12.75% 19.17%, 13.15% 18.18%, 13.62% 17.23%, 14.15% 16.31%, 14.73% 15.43%, 15.37% 14.60%, 16.06% 13.81%, 16.80% 13.07%, 17.58% 12.37%, 18.40% 11.73%, 19.27% 11.14%, 20.17% 10.61%, 21.11% 10.14%, 22.08% 9.72%, 23.08% 9.37%, 24.11% 9.09%, 25.16% 8.87%, 26.24% 8.72%, 27.27% 8.64%, 28.33% 8.62%, 29.45% 8.59%, 30.51% 8.50%, 31.56% 8.34%, 32.60% 8.12%, 33.62% 7.83%, 34.61% 7.47%, 35.58% 7.05%, 36.52% 6.56%, 37.43% 6.02%, 38.31% 5.41%, 39.15% 4.75%, 39.15% 4.75%, 40.04% 4.03%, 40.85% 3.44%, 41.76% 2.86%, 42.71% 2.35%, 43.68% 1.90%, 44.67% 1.52%, 45.68% 1.21%, 46.70% 0.96%, 47.73% 0.78%, 48.77% 0.67%, 49.81% 0.62%, 50.86% 0.65%, 51.90% 0.73%, 52.94% 0.89%, 53.96% 1.11%, 54.98% 1.40%, 55.97% 1.76%, 56.95% 2.18%, 57.90% 2.67%, 58.83% 3.23%, 59.73% 3.85%, 60.46% 4.43%',
|
|
@@ -14,14 +14,14 @@ describe('moni-app-bar (P4.5 — recreated)', () => {
|
|
|
14
14
|
el.remove();
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
it('
|
|
17
|
+
it('por defecto es placement=top, variant=standard, size=default', async () => {
|
|
18
18
|
await el.updateComplete;
|
|
19
19
|
expect(el.placement).toBe('top');
|
|
20
20
|
expect(el.variant).toBe('standard');
|
|
21
21
|
expect(el.size).toBe('default');
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
-
it('
|
|
24
|
+
it('refleja el atributo title', async () => {
|
|
25
25
|
el.title = 'My App';
|
|
26
26
|
await el.updateComplete;
|
|
27
27
|
expect(el.title).toBe('My App');
|
|
@@ -29,10 +29,10 @@ describe('moni-app-bar (P4.5 — recreated)', () => {
|
|
|
29
29
|
expect(title?.textContent?.trim()).toBe('My App');
|
|
30
30
|
});
|
|
31
31
|
|
|
32
|
-
it('
|
|
32
|
+
it('refleja el subtitle (visible solo con size=prominent)', async () => {
|
|
33
33
|
el.subtitle = 'Subtitle here';
|
|
34
34
|
await el.updateComplete;
|
|
35
|
-
//
|
|
35
|
+
// Sin el tamaño prominent, el subtítulo está oculto.
|
|
36
36
|
let subtitle = el.shadowRoot?.querySelector('[part="subtitle"]');
|
|
37
37
|
expect(subtitle).toBeFalsy();
|
|
38
38
|
|
|
@@ -42,25 +42,25 @@ describe('moni-app-bar (P4.5 — recreated)', () => {
|
|
|
42
42
|
expect(subtitle?.textContent?.trim()).toBe('Subtitle here');
|
|
43
43
|
});
|
|
44
44
|
|
|
45
|
-
it('
|
|
45
|
+
it('cambia entre la ubicación top y bottom', async () => {
|
|
46
46
|
el.placement = 'bottom';
|
|
47
47
|
await el.updateComplete;
|
|
48
48
|
expect(el.getAttribute('placement')).toBe('bottom');
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
-
it('
|
|
51
|
+
it('cambia entre la variante standard y floating', async () => {
|
|
52
52
|
el.variant = 'floating';
|
|
53
53
|
await el.updateComplete;
|
|
54
54
|
expect(el.getAttribute('variant')).toBe('floating');
|
|
55
55
|
});
|
|
56
56
|
|
|
57
|
-
it('
|
|
57
|
+
it('refleja el atributo elevated (usado cuando el contenido se desplaza debajo)', async () => {
|
|
58
58
|
el.elevated = true;
|
|
59
59
|
await el.updateComplete;
|
|
60
60
|
expect(el.hasAttribute('elevated')).toBe(true);
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
-
it('
|
|
63
|
+
it('renderiza los slots leading, trailing, fab y actions', async () => {
|
|
64
64
|
await el.updateComplete;
|
|
65
65
|
const leadingSlot = el.shadowRoot?.querySelector(
|
|
66
66
|
'slot[name="leading"]'
|
|
@@ -76,11 +76,11 @@ describe('moni-app-bar (P4.5 — recreated)', () => {
|
|
|
76
76
|
expect(fabSlot).toBeTruthy();
|
|
77
77
|
});
|
|
78
78
|
|
|
79
|
-
it('
|
|
79
|
+
it('renderiza un slot por defecto para contenido extra (ej. tabs)', async () => {
|
|
80
80
|
await el.updateComplete;
|
|
81
81
|
const defaultSlot = el.shadowRoot?.querySelector(
|
|
82
82
|
'slot:not([name])'
|
|
83
83
|
) as HTMLSlotElement | null;
|
|
84
|
-
expect(defaultSlot).toBeFalsy(); //
|
|
84
|
+
expect(defaultSlot).toBeFalsy(); // Actualmente no hay slot por defecto
|
|
85
85
|
});
|
|
86
86
|
});
|