@moni-labs/moni-ui 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/custom-elements.json +5230 -1007
  2. package/dist/components/_base/moni-element.d.ts +16 -9
  3. package/dist/components/_base/moni-element.d.ts.map +1 -1
  4. package/dist/components/_base/moni-element.js +63 -9
  5. package/dist/components/index.js +2 -2
  6. package/dist/components/loading-shapes.d.ts +19 -0
  7. package/dist/components/loading-shapes.d.ts.map +1 -1
  8. package/dist/components/loading-shapes.js +19 -0
  9. package/dist/components/moni-app-bar.d.ts +72 -62
  10. package/dist/components/moni-app-bar.d.ts.map +1 -1
  11. package/dist/components/moni-app-bar.js +72 -62
  12. package/dist/components/moni-badge.d.ts +64 -65
  13. package/dist/components/moni-badge.d.ts.map +1 -1
  14. package/dist/components/moni-badge.js +64 -66
  15. package/dist/components/moni-bottom-sheet.d.ts +129 -61
  16. package/dist/components/moni-bottom-sheet.d.ts.map +1 -1
  17. package/dist/components/moni-bottom-sheet.js +217 -131
  18. package/dist/components/moni-button-group.d.ts +107 -29
  19. package/dist/components/moni-button-group.d.ts.map +1 -1
  20. package/dist/components/moni-button-group.js +107 -29
  21. package/dist/components/moni-button-segment.d.ts +53 -12
  22. package/dist/components/moni-button-segment.d.ts.map +1 -1
  23. package/dist/components/moni-button-segment.js +53 -12
  24. package/dist/components/moni-button.d.ts +116 -38
  25. package/dist/components/moni-button.d.ts.map +1 -1
  26. package/dist/components/moni-button.js +128 -38
  27. package/dist/components/moni-card.d.ts +68 -50
  28. package/dist/components/moni-card.d.ts.map +1 -1
  29. package/dist/components/moni-card.js +68 -50
  30. package/dist/components/moni-carousel.d.ts +484 -53
  31. package/dist/components/moni-carousel.d.ts.map +1 -1
  32. package/dist/components/moni-carousel.js +1024 -245
  33. package/dist/components/moni-checkbox.d.ts +49 -46
  34. package/dist/components/moni-checkbox.d.ts.map +1 -1
  35. package/dist/components/moni-checkbox.js +55 -48
  36. package/dist/components/moni-chip.d.ts +100 -33
  37. package/dist/components/moni-chip.d.ts.map +1 -1
  38. package/dist/components/moni-chip.js +104 -34
  39. package/dist/components/moni-color-field.d.ts +99 -24
  40. package/dist/components/moni-color-field.d.ts.map +1 -1
  41. package/dist/components/moni-color-field.js +99 -24
  42. package/dist/components/moni-context-menu.d.ts +72 -26
  43. package/dist/components/moni-context-menu.d.ts.map +1 -1
  44. package/dist/components/moni-context-menu.js +76 -30
  45. package/dist/components/moni-dialog.d.ts +84 -59
  46. package/dist/components/moni-dialog.d.ts.map +1 -1
  47. package/dist/components/moni-dialog.js +105 -58
  48. package/dist/components/moni-divider.d.ts +39 -27
  49. package/dist/components/moni-divider.d.ts.map +1 -1
  50. package/dist/components/moni-divider.js +42 -30
  51. package/dist/components/moni-expansion.d.ts +32 -22
  52. package/dist/components/moni-expansion.d.ts.map +1 -1
  53. package/dist/components/moni-expansion.js +32 -22
  54. package/dist/components/moni-fab-menu.d.ts +61 -23
  55. package/dist/components/moni-fab-menu.d.ts.map +1 -1
  56. package/dist/components/moni-fab-menu.js +69 -31
  57. package/dist/components/moni-fab.d.ts +86 -28
  58. package/dist/components/moni-fab.d.ts.map +1 -1
  59. package/dist/components/moni-fab.js +92 -34
  60. package/dist/components/moni-file-field.d.ts +118 -30
  61. package/dist/components/moni-file-field.d.ts.map +1 -1
  62. package/dist/components/moni-file-field.js +118 -30
  63. package/dist/components/moni-icon.d.ts +40 -35
  64. package/dist/components/moni-icon.d.ts.map +1 -1
  65. package/dist/components/moni-icon.js +43 -38
  66. package/dist/components/moni-list-item.d.ts +46 -33
  67. package/dist/components/moni-list-item.d.ts.map +1 -1
  68. package/dist/components/moni-list-item.js +61 -41
  69. package/dist/components/moni-list.d.ts +30 -20
  70. package/dist/components/moni-list.d.ts.map +1 -1
  71. package/dist/components/moni-list.js +36 -21
  72. package/dist/components/moni-loading-indicator.d.ts +54 -22
  73. package/dist/components/moni-loading-indicator.d.ts.map +1 -1
  74. package/dist/components/moni-loading-indicator.js +54 -22
  75. package/dist/components/moni-menu-item.d.ts +23 -16
  76. package/dist/components/moni-menu-item.d.ts.map +1 -1
  77. package/dist/components/moni-menu-item.js +23 -16
  78. package/dist/components/moni-menu.d.ts +81 -28
  79. package/dist/components/moni-menu.d.ts.map +1 -1
  80. package/dist/components/moni-menu.js +81 -30
  81. package/dist/components/moni-morph-modal.d.ts +141 -0
  82. package/dist/components/moni-morph-modal.d.ts.map +1 -1
  83. package/dist/components/moni-morph-modal.js +295 -58
  84. package/dist/components/moni-nav-item.d.ts +59 -29
  85. package/dist/components/moni-nav-item.d.ts.map +1 -1
  86. package/dist/components/moni-nav-item.js +59 -29
  87. package/dist/components/moni-nav.d.ts +94 -35
  88. package/dist/components/moni-nav.d.ts.map +1 -1
  89. package/dist/components/moni-nav.js +94 -35
  90. package/dist/components/moni-progress.d.ts +99 -55
  91. package/dist/components/moni-progress.d.ts.map +1 -1
  92. package/dist/components/moni-progress.js +99 -55
  93. package/dist/components/moni-radio.d.ts +62 -50
  94. package/dist/components/moni-radio.d.ts.map +1 -1
  95. package/dist/components/moni-radio.js +65 -52
  96. package/dist/components/moni-ripple.d.ts +74 -59
  97. package/dist/components/moni-ripple.d.ts.map +1 -1
  98. package/dist/components/moni-ripple.js +74 -59
  99. package/dist/components/moni-segmented-button.d.ts +91 -16
  100. package/dist/components/moni-segmented-button.d.ts.map +1 -1
  101. package/dist/components/moni-segmented-button.js +94 -17
  102. package/dist/components/moni-select-option.d.ts +30 -23
  103. package/dist/components/moni-select-option.d.ts.map +1 -1
  104. package/dist/components/moni-select-option.js +30 -23
  105. package/dist/components/moni-select.d.ts +300 -35
  106. package/dist/components/moni-select.d.ts.map +1 -1
  107. package/dist/components/moni-select.js +323 -39
  108. package/dist/components/moni-side-sheet.d.ts +94 -32
  109. package/dist/components/moni-side-sheet.d.ts.map +1 -1
  110. package/dist/components/moni-side-sheet.js +94 -32
  111. package/dist/components/moni-slider.d.ts +152 -41
  112. package/dist/components/moni-slider.d.ts.map +1 -1
  113. package/dist/components/moni-slider.js +154 -42
  114. package/dist/components/moni-snackbar.d.ts +53 -43
  115. package/dist/components/moni-snackbar.d.ts.map +1 -1
  116. package/dist/components/moni-snackbar.js +53 -43
  117. package/dist/components/moni-split-button.d.ts +63 -18
  118. package/dist/components/moni-split-button.d.ts.map +1 -1
  119. package/dist/components/moni-split-button.js +63 -18
  120. package/dist/components/moni-step.d.ts +36 -24
  121. package/dist/components/moni-step.d.ts.map +1 -1
  122. package/dist/components/moni-step.js +41 -29
  123. package/dist/components/moni-stepper.d.ts +64 -27
  124. package/dist/components/moni-stepper.d.ts.map +1 -1
  125. package/dist/components/moni-stepper.js +72 -34
  126. package/dist/components/moni-switch.d.ts +57 -46
  127. package/dist/components/moni-switch.d.ts.map +1 -1
  128. package/dist/components/moni-switch.js +59 -47
  129. package/dist/components/moni-tab.d.ts +26 -18
  130. package/dist/components/moni-tab.d.ts.map +1 -1
  131. package/dist/components/moni-tab.js +29 -21
  132. package/dist/components/moni-tabs.d.ts +34 -28
  133. package/dist/components/moni-tabs.d.ts.map +1 -1
  134. package/dist/components/moni-tabs.js +34 -28
  135. package/dist/components/moni-text-field.d.ts +139 -29
  136. package/dist/components/moni-text-field.d.ts.map +1 -1
  137. package/dist/components/moni-text-field.js +157 -31
  138. package/dist/components/moni-textarea.d.ts +127 -29
  139. package/dist/components/moni-textarea.d.ts.map +1 -1
  140. package/dist/components/moni-textarea.js +131 -32
  141. package/dist/components/moni-time-picker.d.ts +114 -24
  142. package/dist/components/moni-time-picker.d.ts.map +1 -1
  143. package/dist/components/moni-time-picker.js +127 -33
  144. package/dist/components/moni-toolbar.d.ts +37 -23
  145. package/dist/components/moni-toolbar.d.ts.map +1 -1
  146. package/dist/components/moni-toolbar.js +37 -23
  147. package/dist/components/moni-tooltip.d.ts +100 -36
  148. package/dist/components/moni-tooltip.d.ts.map +1 -1
  149. package/dist/components/moni-tooltip.js +104 -40
  150. package/dist/components/moni-typography.d.ts +68 -30
  151. package/dist/components/moni-typography.d.ts.map +1 -1
  152. package/dist/components/moni-typography.js +70 -32
  153. package/dist/styles/tokens.css +7 -7
  154. package/dist/types/events.d.ts +17 -0
  155. package/dist/types/events.d.ts.map +1 -0
  156. package/dist/types/events.js +1 -0
  157. package/dist/utils/event-emitter.d.ts +13 -0
  158. package/dist/utils/event-emitter.d.ts.map +1 -0
  159. package/dist/utils/event-emitter.js +13 -0
  160. package/package.json +2 -1
  161. package/src/components/_base/moni-element.ts +73 -9
  162. package/src/components/index.ts +2 -2
  163. package/src/components/loading-shapes.ts +19 -0
  164. package/src/components/moni-app-bar.test.ts +10 -10
  165. package/src/components/moni-app-bar.ts +72 -62
  166. package/src/components/moni-badge.ts +64 -66
  167. package/src/components/moni-bottom-sheet.test.ts +39 -45
  168. package/src/components/moni-bottom-sheet.ts +222 -131
  169. package/src/components/moni-button-group.test.ts +14 -14
  170. package/src/components/moni-button-group.ts +107 -29
  171. package/src/components/moni-button-segment.ts +53 -12
  172. package/src/components/moni-button.test.ts +28 -26
  173. package/src/components/moni-button.ts +139 -39
  174. package/src/components/moni-card.test.ts +6 -6
  175. package/src/components/moni-card.ts +70 -50
  176. package/src/components/moni-carousel.test.ts +12 -12
  177. package/src/components/moni-carousel.ts +1129 -269
  178. package/src/components/moni-checkbox.test.ts +7 -7
  179. package/src/components/moni-checkbox.ts +62 -48
  180. package/src/components/moni-chip.test.ts +17 -17
  181. package/src/components/moni-chip.ts +112 -34
  182. package/src/components/moni-color-field.test.ts +5 -5
  183. package/src/components/moni-color-field.ts +108 -24
  184. package/src/components/moni-context-menu.test.ts +11 -11
  185. package/src/components/moni-context-menu.ts +76 -30
  186. package/src/components/moni-dialog.ts +108 -59
  187. package/src/components/moni-divider.test.ts +4 -4
  188. package/src/components/moni-divider.ts +42 -30
  189. package/src/components/moni-expansion.ts +32 -22
  190. package/src/components/moni-fab-menu.test.ts +11 -11
  191. package/src/components/moni-fab-menu.ts +69 -31
  192. package/src/components/moni-fab.test.ts +16 -16
  193. package/src/components/moni-fab.ts +100 -34
  194. package/src/components/moni-file-field.test.ts +8 -8
  195. package/src/components/moni-file-field.ts +132 -30
  196. package/src/components/moni-icon.test.ts +11 -11
  197. package/src/components/moni-icon.ts +43 -38
  198. package/src/components/moni-list-item.test.ts +10 -10
  199. package/src/components/moni-list-item.ts +61 -41
  200. package/src/components/moni-list.ts +37 -21
  201. package/src/components/moni-loading-indicator.test.ts +3 -3
  202. package/src/components/moni-loading-indicator.ts +54 -22
  203. package/src/components/moni-menu-item.ts +23 -16
  204. package/src/components/moni-menu.test.ts +7 -7
  205. package/src/components/moni-menu.ts +87 -30
  206. package/src/components/moni-morph-modal.test.ts +18 -17
  207. package/src/components/moni-morph-modal.ts +327 -60
  208. package/src/components/moni-nav-item.ts +59 -29
  209. package/src/components/moni-nav.test.ts +11 -11
  210. package/src/components/moni-nav.ts +94 -35
  211. package/src/components/moni-progress.test.ts +9 -9
  212. package/src/components/moni-progress.ts +100 -56
  213. package/src/components/moni-radio.test.ts +8 -8
  214. package/src/components/moni-radio.ts +71 -51
  215. package/src/components/moni-ripple.ts +74 -59
  216. package/src/components/moni-segmented-button.test.ts +4 -4
  217. package/src/components/moni-segmented-button.ts +94 -17
  218. package/src/components/moni-select-option.ts +30 -23
  219. package/src/components/moni-select.test.ts +11 -11
  220. package/src/components/moni-select.ts +361 -50
  221. package/src/components/moni-side-sheet.test.ts +7 -7
  222. package/src/components/moni-side-sheet.ts +94 -32
  223. package/src/components/moni-slider.test.ts +7 -7
  224. package/src/components/moni-slider.ts +165 -42
  225. package/src/components/moni-snackbar.test.ts +8 -8
  226. package/src/components/moni-snackbar.ts +53 -43
  227. package/src/components/moni-split-button.ts +63 -18
  228. package/src/components/moni-step.test.ts +7 -7
  229. package/src/components/moni-step.ts +41 -29
  230. package/src/components/moni-stepper.test.ts +7 -7
  231. package/src/components/moni-stepper.ts +72 -34
  232. package/src/components/moni-switch.test.ts +12 -12
  233. package/src/components/moni-switch.ts +66 -47
  234. package/src/components/moni-tab.test.ts +5 -5
  235. package/src/components/moni-tab.ts +29 -21
  236. package/src/components/moni-tabs.ts +34 -28
  237. package/src/components/moni-text-field.test.ts +13 -13
  238. package/src/components/moni-text-field.ts +181 -30
  239. package/src/components/moni-textarea.test.ts +17 -17
  240. package/src/components/moni-textarea.ts +155 -31
  241. package/src/components/moni-time-picker.test.ts +5 -5
  242. package/src/components/moni-time-picker.ts +128 -33
  243. package/src/components/moni-toolbar.test.ts +8 -8
  244. package/src/components/moni-toolbar.ts +37 -23
  245. package/src/components/moni-tooltip.test.ts +15 -15
  246. package/src/components/moni-tooltip.ts +107 -40
  247. package/src/components/moni-typography.test.ts +10 -10
  248. package/src/components/moni-typography.ts +73 -32
  249. package/src/styles/tokens.css +7 -7
  250. package/src/types/events.ts +17 -0
  251. package/src/utils/event-emitter.ts +26 -0
@@ -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 component.
19
+ * Componente Material Design 3 Typography (Tipografía).
20
20
  *
21
- * A specialized text component that enforces the M3 type scale. It ensures
22
- * typography is consistent, accessible, and correctly styled across the
23
- * application without requiring manual CSS classes.
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
- * **M3 spec reference:** `m3-docs/components/typography/specs.md`
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
- * **Type Scale Categories:**
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
- * Each category supports three sizes: `large`, `medium`, and `small`.
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
- * **Semantic Tags:**
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
- * <!-- Renders an <h1> with display-large styles -->
50
- * <moni-typography variant="display" size="large">Hero Text</moni-typography>
49
+ * <!-- Renderiza un <h1> con estilos display-large -->
50
+ * <moni-typography variant="display" size="large">Texto Héroe</moni-typography>
51
51
  *
52
- * <!-- Renders a <p> with body-medium styles -->
53
- * <moni-typography variant="body">Standard paragraph text.</moni-typography>
52
+ * <!-- Renderiza un <p> con estilos body-medium -->
53
+ * <moni-typography variant="body">Texto de párrafo estándar.</moni-typography>
54
54
  *
55
- * <!-- Overriding the semantic tag -->
56
- * <moni-typography variant="title" as="span">Inline title</moni-typography>
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 - The text content to display.
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
- /** Default semantic tag for each variant per M3 spec. */
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
- // Render the dynamic tag with `unsafeStatic` so we don't hit the
89
- // "Bindings in tag names are not supported" error from lit 3.
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}
@@ -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, var(--radius-md, 0.75rem));
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: 0px 1px 2px 0px rgba(0, 0, 0, 0.3), 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
125
- --shadow-2: 0px 1px 2px 0px rgba(0, 0, 0, 0.3), 0px 2px 6px 2px rgba(0, 0, 0, 0.15);
126
- --shadow-3: 0px 1px 3px 0px rgba(0, 0, 0, 0.3), 0px 4px 8px 3px rgba(0, 0, 0, 0.15);
127
- --shadow-4: 0px 2px 3px 0px rgba(0, 0, 0, 0.3), 0px 6px 10px 4px rgba(0, 0, 0, 0.15);
128
- --shadow-5: 0px 4px 4px 0px rgba(0, 0, 0, 0.3), 0px 8px 12px 6px rgba(0, 0, 0, 0.15);
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.0",
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;
@@ -5,8 +5,8 @@
5
5
  * @contributors Moni Labs & Contributors
6
6
  */
7
7
 
8
- // Auto-register all Moni UI Web Components.
9
- // Importing this file defines every <moni-*> custom element.
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('defaults to placement=top, variant=standard, size=default', async () => {
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('reflects the title attribute', async () => {
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('reflects the subtitle (visible only with size=prominent)', async () => {
32
+ it('refleja el subtitle (visible solo con size=prominent)', async () => {
33
33
  el.subtitle = 'Subtitle here';
34
34
  await el.updateComplete;
35
- // Without prominent size, subtitle is hidden.
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('switches between top and bottom placement', async () => {
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('switches between standard and floating variant', async () => {
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('reflects elevated attribute (used when content scrolls under it)', async () => {
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('renders leading, trailing, fab, and actions slots', async () => {
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('renders a default slot for extra content (e.g. tabs)', async () => {
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(); // No default slot currently
84
+ expect(defaultSlot).toBeFalsy(); // Actualmente no hay slot por defecto
85
85
  });
86
86
  });