xonecode 0.1.0

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 (187) hide show
  1. package/README.md +167 -0
  2. package/dist/agent/authEnDisco.js +56 -0
  3. package/dist/agent/authEnDisco.js.map +1 -0
  4. package/dist/agent/configEnDisco.js +109 -0
  5. package/dist/agent/configEnDisco.js.map +1 -0
  6. package/dist/agent/crearProyecto.js +34 -0
  7. package/dist/agent/crearProyecto.js.map +1 -0
  8. package/dist/agent/entorno.js +124 -0
  9. package/dist/agent/entorno.js.map +1 -0
  10. package/dist/agent/guionizado.js +53 -0
  11. package/dist/agent/guionizado.js.map +1 -0
  12. package/dist/agent/instantanea.js +129 -0
  13. package/dist/agent/instantanea.js.map +1 -0
  14. package/dist/agent/interrupts.js +83 -0
  15. package/dist/agent/interrupts.js.map +1 -0
  16. package/dist/agent/mensajes.js +24 -0
  17. package/dist/agent/mensajes.js.map +1 -0
  18. package/dist/agent/modelos.js +42 -0
  19. package/dist/agent/modelos.js.map +1 -0
  20. package/dist/agent/normalizar.js +20 -0
  21. package/dist/agent/normalizar.js.map +1 -0
  22. package/dist/agent/perfiles.js +103 -0
  23. package/dist/agent/perfiles.js.map +1 -0
  24. package/dist/agent/proyecto.js +107 -0
  25. package/dist/agent/proyecto.js.map +1 -0
  26. package/dist/agent/puente.js +142 -0
  27. package/dist/agent/puente.js.map +1 -0
  28. package/dist/agent/resumenDeTool.js +48 -0
  29. package/dist/agent/resumenDeTool.js.map +1 -0
  30. package/dist/agent/skills.js +65 -0
  31. package/dist/agent/skills.js.map +1 -0
  32. package/dist/agent/textoDeTool.js +113 -0
  33. package/dist/agent/textoDeTool.js.map +1 -0
  34. package/dist/agent/turnoReal.js +173 -0
  35. package/dist/agent/turnoReal.js.map +1 -0
  36. package/dist/agent/verificador.js +65 -0
  37. package/dist/agent/verificador.js.map +1 -0
  38. package/dist/agent/xoneAgent.js +106 -0
  39. package/dist/agent/xoneAgent.js.map +1 -0
  40. package/dist/bin.js +9 -0
  41. package/dist/bin.js.map +1 -0
  42. package/dist/cli/aprobar.js +82 -0
  43. package/dist/cli/aprobar.js.map +1 -0
  44. package/dist/cli/config.js +133 -0
  45. package/dist/cli/config.js.map +1 -0
  46. package/dist/cli/consola.js +346 -0
  47. package/dist/cli/consola.js.map +1 -0
  48. package/dist/cli/describe.js +53 -0
  49. package/dist/cli/describe.js.map +1 -0
  50. package/dist/cli/doctor.js +45 -0
  51. package/dist/cli/doctor.js.map +1 -0
  52. package/dist/cli/main.js +520 -0
  53. package/dist/cli/main.js.map +1 -0
  54. package/dist/cli/markdown.js +90 -0
  55. package/dist/cli/markdown.js.map +1 -0
  56. package/dist/cli/run.js +164 -0
  57. package/dist/cli/run.js.map +1 -0
  58. package/dist/cli/spinner.js +89 -0
  59. package/dist/cli/spinner.js.map +1 -0
  60. package/dist/cli/stdio.js +193 -0
  61. package/dist/cli/stdio.js.map +1 -0
  62. package/dist/cli/tema.js +40 -0
  63. package/dist/cli/tema.js.map +1 -0
  64. package/dist/cli/verify.js +62 -0
  65. package/dist/cli/verify.js.map +1 -0
  66. package/dist/core/bitacora.js +30 -0
  67. package/dist/core/bitacora.js.map +1 -0
  68. package/dist/core/config.js +236 -0
  69. package/dist/core/config.js.map +1 -0
  70. package/dist/core/contextos.js +56 -0
  71. package/dist/core/contextos.js.map +1 -0
  72. package/dist/core/deps.js +51 -0
  73. package/dist/core/deps.js.map +1 -0
  74. package/dist/core/diff.js +79 -0
  75. package/dist/core/diff.js.map +1 -0
  76. package/dist/core/esqueleto.js +366 -0
  77. package/dist/core/esqueleto.js.map +1 -0
  78. package/dist/core/events.js +2 -0
  79. package/dist/core/events.js.map +1 -0
  80. package/dist/core/modelos.js +85 -0
  81. package/dist/core/modelos.js.map +1 -0
  82. package/dist/core/notify.js +106 -0
  83. package/dist/core/notify.js.map +1 -0
  84. package/dist/core/ports.js +114 -0
  85. package/dist/core/ports.js.map +1 -0
  86. package/dist/core/turno.js +127 -0
  87. package/dist/core/turno.js.map +1 -0
  88. package/dist/vendor/hitl.js +103 -0
  89. package/dist/vendor/hitl.js.map +1 -0
  90. package/dist/vendor/skillLoaders/catalog.js +74 -0
  91. package/dist/vendor/skillLoaders/catalog.js.map +1 -0
  92. package/dist/vendor/tokenTracking.js +58 -0
  93. package/dist/vendor/tokenTracking.js.map +1 -0
  94. package/package.json +41 -0
  95. package/skills/xone-debugging/SKILL.md +52 -0
  96. package/skills/xone-debugging/references/faq.md +561 -0
  97. package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
  98. package/skills/xone-development/SKILL.md +105 -0
  99. package/skills/xone-development/references/anti-patrones.md +94 -0
  100. package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
  101. package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
  102. package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
  103. package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
  104. package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
  105. package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
  106. package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
  107. package/skills/xone-development/references/datos/appdata.md +611 -0
  108. package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
  109. package/skills/xone-development/references/datos/http.md +366 -0
  110. package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
  111. package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
  112. package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
  113. package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
  114. package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
  115. package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
  116. package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
  117. package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
  118. package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
  119. package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
  120. package/skills/xone-development/references/indice-completo.md +77 -0
  121. package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
  122. package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
  123. package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
  124. package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
  125. package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
  126. package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
  127. package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
  128. package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
  129. package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
  130. package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
  131. package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
  132. package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
  133. package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
  134. package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
  135. package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
  136. package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
  137. package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
  138. package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
  139. package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
  140. package/skills/xone-development/references/tipos-de-prop.md +28 -0
  141. package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
  142. package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
  143. package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
  144. package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
  145. package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
  146. package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
  147. package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
  148. package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
  149. package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
  150. package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
  151. package/skills/xone-development/references/xml-ui/mapas.md +685 -0
  152. package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
  153. package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
  154. package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
  155. package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
  156. package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
  157. package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
  158. package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
  159. package/skills/xone-plan-builder/SKILL.md +183 -0
  160. package/skills/xone-plan-builder/agents/openai.yaml +5 -0
  161. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
  162. package/skills/xone-project-generator/SKILL.md +111 -0
  163. package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
  164. package/skills/xone-project-generator/references/colecciones-base.md +16 -0
  165. package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
  166. package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
  167. package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
  168. package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
  169. package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
  170. package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
  171. package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
  172. package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
  173. package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
  174. package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
  175. package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
  176. package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
  177. package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
  178. package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
  179. package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
  180. package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
  181. package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
  182. package/skills/xone-review/SKILL.md +189 -0
  183. package/skills/xone-spec-builder/SKILL.md +235 -0
  184. package/skills/xone-spec-builder/agents/openai.yaml +5 -0
  185. package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
  186. package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
  187. package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
@@ -0,0 +1,885 @@
1
+ # XOne CSS — Propiedades disponibles y herencia extends
2
+
3
+ > Fuente: `xone/v2/xone-help-docs/topics/04-css-styling-guide.md` §5–§6. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
4
+
5
+ Contenido: §5 propiedades por categoría (dimensiones, márgenes, padding, fuentes, texto, fondo, bordes, sombras, visibilidad, Material) · §6 sistema de herencia extends con patrones y cadenas
6
+
7
+ ---
8
+
9
+ ## 5. Propiedades CSS Disponibles
10
+
11
+ ### 5.1 Dimensiones
12
+
13
+ | Atributo | Valores | Descripción |
14
+ |----------|---------|-------------|
15
+ | `width` | `Np` / `N%` | Ancho del elemento |
16
+ | `height` | `Np` / `N%` | Alto del elemento |
17
+ | `size` | Número | Tamaño de la columna en BD (en caracteres). Con `fixed-text="true"` también limita la entrada en UI |
18
+ | `fieldsize` | Número | Ancho visual de la caja del campo (ancho de carácter x valor). Usar `width` en proyectos nuevos — tiene prioridad sobre `fieldsize` |
19
+
20
+ **Ejemplo correcto vs incorrecto:**
21
+
22
+ ```css
23
+ /* INCORRECTO */
24
+ .error {
25
+ width: 100px; /* MAL: px */
26
+ height: 56rem; /* MAL: rem */
27
+ min-width: 200px; /* MAL: atributo web no soportado */
28
+ max-height: 500px; /* MAL: atributo web no soportado */
29
+ }
30
+
31
+ /* CORRECTO */
32
+ .correcto {
33
+ width: 100%;
34
+ height: 56p;
35
+ }
36
+ ```
37
+
38
+ **Ejemplo real - Dimensiones de frames (proyecto UseCars):**
39
+
40
+ ```css
41
+ .frameHeader {
42
+ width: 100%;
43
+ height: 140p;
44
+ }
45
+
46
+ .frameBody {
47
+ width: 100%;
48
+ height: 100%;
49
+ }
50
+
51
+ .frameFooter {
52
+ width: 100%;
53
+ height: 120p;
54
+ }
55
+ ```
56
+
57
+ **Ejemplo real - Dimensiones de botones:**
58
+
59
+ ```css
60
+ .btnPrimario {
61
+ width: 90%;
62
+ height: 56p;
63
+ }
64
+
65
+ .btnFlotante {
66
+ width: 64p;
67
+ height: 64p;
68
+ }
69
+ ```
70
+
71
+ ### 5.2 Margenes
72
+
73
+ XOne usa atributos individuales para cada lado del margen. **NO existe** un atributo abreviado `margin`.
74
+
75
+ | Atributo | Valores | Descripción |
76
+ |----------|---------|-------------|
77
+ | `tmargin` | `Np` / `N%` | Margen superior (top) |
78
+ | `bmargin` | `Np` / `N%` | Margen inferior (bottom) |
79
+ | `lmargin` | `Np` / `N%` | Margen izquierdo (left) |
80
+ | `rmargin` | `Np` / `N%` | Margen derecho (right) |
81
+
82
+ **Ejemplo correcto vs incorrecto:**
83
+
84
+ ```css
85
+ /* INCORRECTO */
86
+ .error {
87
+ margin: 10p; /* MAL: atributo abreviado no existe */
88
+ margin-top: 10p; /* MAL: nombre CSS web */
89
+ margin-left: 20px; /* MAL: nombre y unidad incorrectos */
90
+ }
91
+
92
+ /* CORRECTO */
93
+ .correcto {
94
+ tmargin: 10p;
95
+ bmargin: 10p;
96
+ lmargin: 20p;
97
+ rmargin: 20p;
98
+ }
99
+ ```
100
+
101
+ **Ejemplo real - Tarjeta con margenes (proyecto UseCars):**
102
+
103
+ ```css
104
+ .tarjeta {
105
+ width: 95%;
106
+ bgcolor: #FFFFFF;
107
+ border-corner-radius: 12;
108
+ tmargin: 10p;
109
+ bmargin: 5p;
110
+ lmargin: 10p;
111
+ rmargin: 10p;
112
+ }
113
+ ```
114
+
115
+ ### 5.3 Padding
116
+
117
+ Similar a los margenes, el padding usa atributos individuales. **NO existe** un atributo abreviado `padding`.
118
+
119
+ | Atributo | Valores | Descripción |
120
+ |----------|---------|-------------|
121
+ | `tpadding` | `Np` | Padding superior (top) |
122
+ | `bpadding` | `Np` | Padding inferior (bottom) |
123
+ | `lpadding` | `Np` | Padding izquierdo (left) |
124
+ | `rpadding` | `Np` | Padding derecho (right) |
125
+
126
+ **Ejemplo correcto vs incorrecto:**
127
+
128
+ ```css
129
+ /* INCORRECTO */
130
+ .error {
131
+ padding: 10p; /* MAL: atributo abreviado no garantizado */
132
+ padding-top: 10px; /* MAL: nombre y unidad CSS web */
133
+ }
134
+
135
+ /* CORRECTO */
136
+ .correcto {
137
+ tpadding: 10p;
138
+ bpadding: 10p;
139
+ lpadding: 15p;
140
+ rpadding: 15p;
141
+ }
142
+ ```
143
+
144
+ **Ejemplo real - Card con padding (proyecto SocialNetwork):**
145
+
146
+ ```css
147
+ .framePost {
148
+ width: 100%;
149
+ bgcolor: #FFFFFF;
150
+ tmargin: 2p;
151
+ tpadding: 15p;
152
+ bpadding: 15p;
153
+ lpadding: 15p;
154
+ rpadding: 15p;
155
+ }
156
+ ```
157
+
158
+ ### 5.4 Fuentes
159
+
160
+ | Atributo | Valores | Descripción |
161
+ |----------|---------|-------------|
162
+ | `fontname` | `NombreFuente.ttf` | Fuente personalizada (archivo .ttf en carpeta `fonts/`) |
163
+ | `fontsize` | Número, **escala 1-12** (el parser acepta 1-50) | Tamaño de fuente (sin unidad) |
164
+ | `fontbold` | `true`/`false` | Texto en negrita |
165
+ | `fontitalic` | `true`/`false` | Texto en cursiva |
166
+ | `text-fontsize` | Número | Tamaño de fuente del texto editable |
167
+ | `labelfont-size` / `labelfontsize` | Número | Tamaño de fuente de la etiqueta |
168
+ | `textfont-size` / `textfontsize` / `text-font-size` | Número | Tamaño de fuente del texto editable (alternativa) |
169
+ | `labelfont-bold` | `true`/`false` | Etiqueta en negrita |
170
+ | `textfont-bold` | `true`/`false` | Texto editable en negrita |
171
+ | `textfont-italic` | `true`/`false` | Texto editable en cursiva |
172
+ | `labelshadow` | `true`/`false` | Sombra en etiqueta |
173
+
174
+ > **`fontsize` no está en puntos ni en `dp`: es una escala pequeña a la que el runtime SUMA el
175
+ > factor de la plataforma.** El cálculo, leído en el runtime iOS
176
+ > (`XoneApp::calculateSizeFont`): en iPhone `puntos = fontsize + factor` (y `fontsize + factor/2`
177
+ > si `fontsize <= 2`); en iPad, `fontsize + 4 + factor`. El factor sale de `app.xml` —
178
+ > `ios-font-factor` y `android-font-factor`, **uno por plataforma**. Los valores del proyecto:
179
+ > **`android-font-factor="7"` e `ios-font-factor="8"`**.
180
+ >
181
+ > De ahí que los valores útiles vivan en **1-12** (texto `5`, título de sección `7`, topbar
182
+ > `10`-`11`): con factor 8, un `fontsize="5"` son 13 pt. El `1-50` de la tabla es lo que el
183
+ > parser ACEPTA, no lo que tiene sentido escribir — un `fontsize: 14` no da error, da 22 pt.
184
+ > **Los ejemplos de este fichero anteriores a esta nota usan valores tipo Material (`14`, `16`)
185
+ > heredados del corpus original: cópiales la forma, no el número.**
186
+ >
187
+ > Y el corolario que importa al portar entre proyectos: **los dos factores se afinan por
188
+ > separado** y en un proyecto real pueden diferir mucho (`android-font-factor="13"` con
189
+ > `ios-font-factor="5"`), así que un `fontsize` copiado de otro proyecto sin mirar su `app.xml`
190
+ > no significa nada.
191
+
192
+
193
+ **Ejemplo correcto vs incorrecto:**
194
+
195
+ ```css
196
+ /* INCORRECTO */
197
+ .error {
198
+ font-size: 14px; /* MAL: nombre y unidad CSS web */
199
+ font-family: 'Roboto'; /* MAL: nombre CSS web */
200
+ font-weight: bold; /* MAL: nombre CSS web */
201
+ font-style: italic; /* MAL: nombre CSS web */
202
+ }
203
+
204
+ /* CORRECTO */
205
+ .correcto {
206
+ fontsize: 14;
207
+ fontname: Roboto-Regular.ttf;
208
+ fontbold: true;
209
+ fontitalic: true;
210
+ }
211
+ ```
212
+
213
+ **Ejemplo real - Diferentes estilos de fuente (proyecto UseCars):**
214
+
215
+ ```css
216
+ /* Titulo grande */
217
+ .textoTituloGrande {
218
+ fontsize: 28;
219
+ fontname: Roboto-Bold.ttf;
220
+ forecolor: #FFFFFF;
221
+ text-align: center;
222
+ }
223
+
224
+ /* Texto normal */
225
+ .textoNormal {
226
+ fontsize: 14;
227
+ forecolor: #212121;
228
+ }
229
+
230
+ /* Texto secundario */
231
+ .textoSecundario {
232
+ fontsize: 14;
233
+ forecolor: #9E9E9E;
234
+ }
235
+
236
+ /* Texto pequeno */
237
+ .textoPequeno {
238
+ fontsize: 12;
239
+ forecolor: #9E9E9E;
240
+ }
241
+ ```
242
+
243
+ > **Referencia cruzada:** Las fuentes personalizadas deben colocarse en la carpeta `fonts/` del proyecto. Consultar el tópico 01 - Fundamentos.
244
+
245
+ ### 5.5 Texto
246
+
247
+ | Atributo | Valores | Descripción |
248
+ |----------|---------|-------------|
249
+ | `forecolor` | `#RRGGBB` / `#AARRGGBB` | Color del texto principal y etiqueta |
250
+ | `forecolor-disabled` | `#RRGGBB` | Color de la fuente cuando deshabilitado |
251
+ | `text-forecolor` | `#RRGGBB` | Color del texto editable |
252
+ | `text-forecolor-disabled` | `#RRGGBB` | Color del texto editable cuando deshabilitado |
253
+ | `text-align` | `left`/`center`/`right` | Alineacion horizontal del texto |
254
+ | `align` | Combinacion con `\|` | Alineacion combinada del contenedor |
255
+ | `lines` | Número | Número de lineas visibles |
256
+ | `fixed-lines` | `true`/`false` | Altura fija basada en lineas |
257
+ | `locked` | `true`/`false` | Campo de solo lectura |
258
+ | `locking` | `true`/`false` | Comportamiento de bloqueo |
259
+ | `mask` | `"formato"` | Mascara de formato |
260
+
261
+ **Combinaciones de `align`:**
262
+
263
+ ```css
264
+ .centradoTotal {
265
+ align: center; /* Centro horizontal y vertical */
266
+ }
267
+
268
+ .arribaIzquierda {
269
+ align: top|left; /* Esquina superior izquierda */
270
+ }
271
+
272
+ .abajoCentro {
273
+ align: bottom|center; /* Abajo centrado horizontalmente */
274
+ }
275
+
276
+ .derechaCentro {
277
+ align: right|center; /* Derecha centrado verticalmente */
278
+ }
279
+ ```
280
+
281
+ **Ejemplo real - Diferentes alineaciones:**
282
+
283
+ ```css
284
+ /* Header centrado (proyecto UseCars) */
285
+ .frameHeader {
286
+ width: 100%;
287
+ height: 140p;
288
+ bgcolor: #0D47A1;
289
+ align: center;
290
+ }
291
+
292
+ /* Header alineado a izquierda (proyecto MiMensajeria) */
293
+ .frameHeader {
294
+ width: 100%;
295
+ height: 56p;
296
+ bgcolor: #1565C0;
297
+ align: left;
298
+ }
299
+ ```
300
+
301
+ ### 5.6 Fondo
302
+
303
+ | Atributo | Valores | Descripción |
304
+ |----------|---------|-------------|
305
+ | `bgcolor` | `#RRGGBB` / `#AARRGGBB` | Color de fondo del elemento |
306
+ | `bgcolor-disabled` | `#RRGGBB` | Color de fondo cuando deshabilitado |
307
+ | `bgcolor-focus` | `#RRGGBB` | Color de fondo al recibir foco |
308
+ | `text-bgcolor` | `#RRGGBB` | Color de fondo del texto editable |
309
+ | `text-bgcolor-focus` | `#RRGGBB` | Color de fondo del texto al recibir foco |
310
+ | `text-bgcolor-disabled` | `#RRGGBB` | Color de fondo del texto cuando deshabilitado |
311
+ | `imgbk` | `nombre.png` / `nombre.svg` | Imagen de fondo del elemento. Acepta PNG, JPG y SVG (el SVG se renderiza nativo, no requiere WebView ni conversion) |
312
+
313
+ **Ejemplo correcto vs incorrecto:**
314
+
315
+ ```css
316
+ /* INCORRECTO */
317
+ .error {
318
+ background-color: #FFF; /* MAL: nombre CSS web */
319
+ background: url(fondo.png); /* MAL: sintaxis CSS web */
320
+ background-image: linear-gradient(...); /* MAL: gradientes no soportados */
321
+ }
322
+
323
+ /* CORRECTO */
324
+ .correcto {
325
+ bgcolor: #FFFFFF;
326
+ imgbk: fondo.png;
327
+ }
328
+ ```
329
+
330
+ **Ejemplo real - Fondos con transparencia (proyecto UseCars):**
331
+
332
+ ```css
333
+ /* Header transparente para mapas */
334
+ .frameHeaderTransparente {
335
+ width: 100%;
336
+ height: 100p;
337
+ bgcolor: #00FFFFFF; /* Completamente transparente */
338
+ align: center;
339
+ }
340
+ ```
341
+
342
+ ### 5.7 Bordes
343
+
344
+ XOne distingue entre **bordes de texto** (área editable del campo) y **bordes de contenedor** (frame o prop completo).
345
+
346
+ #### Bordes de texto
347
+
348
+ | Atributo | Valores | Descripción |
349
+ |----------|---------|-------------|
350
+ | `text-border` | `true`/`false` | Mostrar borde alrededor del texto |
351
+ | `text-border-left` | `true`/`false` | Borde izquierdo del texto |
352
+ | `text-border-right` | `true`/`false` | Borde derecho del texto |
353
+ | `text-border-top` | `true`/`false` | Borde superior del texto |
354
+ | `text-border-bottom` | `true`/`false` | Borde inferior del texto |
355
+ | `text-border-color` | `#RRGGBB` | Color del borde de texto |
356
+ | `text-border-width` | `Np` | Grosor del borde de texto |
357
+
358
+ #### Bordes de contenedor
359
+
360
+ | Atributo | Valores | Descripción |
361
+ |----------|---------|-------------|
362
+ | `border` | `true`/`false` | Borde general del contenedor |
363
+ | `border-width` | Número (sin unidad) | Grosor del borde |
364
+ | `border-color` | `#RRGGBB` | Color del borde |
365
+ | `border-corner-radius` | Número (sin unidad) | Radio de todas las esquinas redondeadas |
366
+ | `border-corner-radius-top-left` | Número | Radio esquina superior izquierda |
367
+ | `border-corner-radius-top-right` | Número | Radio esquina superior derecha |
368
+ | `border-corner-radius-bottom-left` | Número | Radio esquina inferior izquierda |
369
+ | `border-corner-radius-bottom-right` | Número | Radio esquina inferior derecha |
370
+ | `border-top` | `true`/`false` | Borde superior |
371
+ | `border-top-color` | `#RRGGBB` | Color borde superior |
372
+ | `border-bottom` | `true`/`false` | Borde inferior |
373
+ | `border-bottom-color` | `#RRGGBB` | Color borde inferior |
374
+ | `framebox` | `true`/`false` | Estilo de caja del frame (muestra un borde/contenedor alrededor del frame) |
375
+ | `grid-framebox` | `true`/`false` | Borde de frame en modo grid/lista |
376
+ | `grid-text-border` | `true`/`false` | Borde de texto en modo grid/lista |
377
+
378
+ **Patron Material Design - Solo borde inferior:**
379
+
380
+ Este es el patron más común para campos de texto en aplicaciones Material Design. Se usa extensivamente en todos los proyectos de ejemplo:
381
+
382
+ ```css
383
+ .inputMaterial {
384
+ text-border: true;
385
+ text-border-left: false;
386
+ text-border-right: false;
387
+ text-border-top: false;
388
+ text-border-bottom: true;
389
+ text-border-color: #BDBDBD;
390
+ }
391
+ ```
392
+
393
+ **Patron - Panel con esquinas superiores redondeadas:**
394
+
395
+ Usado para paneles inferiores deslizables que tapan parte del contenido:
396
+
397
+ ```css
398
+ .panelInferior {
399
+ width: 100%;
400
+ bgcolor: #FFFFFF;
401
+ border-corner-radius-top-left: 24;
402
+ border-corner-radius-top-right: 24;
403
+ }
404
+ ```
405
+
406
+ **Ejemplo correcto vs incorrecto:**
407
+
408
+ ```css
409
+ /* INCORRECTO */
410
+ .error {
411
+ border-radius: 8px; /* MAL: nombre y unidad CSS web */
412
+ border: 1px solid #ccc; /* MAL: sintaxis abreviada CSS web */
413
+ box-shadow: 0 2px 4px #000; /* MAL: box-shadow no soportado */
414
+ }
415
+
416
+ /* CORRECTO */
417
+ .correcto {
418
+ border-corner-radius: 8;
419
+ border: true;
420
+ border-width: 1;
421
+ border-color: #CCCCCC;
422
+ }
423
+ ```
424
+
425
+ ### 5.8 Sombras y Elevacion
426
+
427
+ XOne no soporta `box-shadow` ni `text-shadow` de CSS web. Sin embargo, algunos atributos de elevacion están disponibles:
428
+
429
+ | Atributo | Valores | Descripción |
430
+ |----------|---------|-------------|
431
+ | `elevation` | Número | Elevacion del elemento (sombra en Android) |
432
+ | `shadow-color` | `#RRGGBB` | Color de la sombra |
433
+
434
+ > **NOTA:** La elevacion funciona principalmente en Android. En iOS el efecto puede variar. No todos los proyectos la usan; la alternativa más común es usar bordes sutiles (`border: true; border-color: #E0E0E0;`) para dar sensacion de profundidad.
435
+
436
+ ### 5.9 Visibilidad
437
+
438
+ | Atributo | Valores | Descripción |
439
+ |----------|---------|-------------|
440
+ | `visible` | Número (bitmask 0-7) | Mascara de visibilidad |
441
+ | `labelbox` | `true`/`false` | Mostrar caja contenedora de etiqueta |
442
+
443
+ **Sistema de visibilidad por bitmask:**
444
+
445
+ El atributo `visible` usa un sistema de mascara de bits que controla en que modos de visualizacion aparece el campo:
446
+
447
+ | Valor | Edición | Lista | Contents | Descripción |
448
+ |:-----:|:-------:|:-----:|:--------:|-------------|
449
+ | `0` | Oculto | Oculto | Oculto | Campo completamente oculto |
450
+ | `1` | Visible | Oculto | Oculto | Solo en modo edición |
451
+ | `2` | Oculto | Visible | Oculto | Solo en modo lista |
452
+ | `3` | Visible | Visible | Oculto | En edición y lista |
453
+ | `4` | Oculto | Oculto | Visible | Solo en contents (listas embebidas) |
454
+ | `5` | Visible | Oculto | Visible | En edición y contents |
455
+ | `6` | Oculto | Visible | Visible | En lista y contents |
456
+ | `7` | Visible | Visible | Visible | Visible en todos los modos |
457
+
458
+ > **Referencia cruzada:** Para comprender los modos de visualizacion (edición, lista, contents), consultar el tópico 02 - Estructura XML.
459
+
460
+ ### 5.10 Otros
461
+
462
+ | Atributo | Valores | Descripción |
463
+ |----------|---------|-------------|
464
+ | `newline` | `true`/`false` | Forzar nueva linea (salto de linea) |
465
+ | `scroll` | `true`/`false` | Habilitar scroll en el contenedor |
466
+ | `fixed` | `true`/`false` | Elemento fijo (no se desplaza con scroll) |
467
+ | `orientation` | `top`/`bottom` | Posición del elemento fijo |
468
+ | `floating` | `true`/`false` | Frame flotante |
469
+ | `top` | `Np` | Posición vertical de frame flotante |
470
+ | `left` | `Np` | Posición horizontal de frame flotante |
471
+ | `ripple-effect` | `true`/`false` | Efecto ripple Material Design al pulsar (solo Android) |
472
+ | `elevation` | Número | Elevacion/sombra Material Design (principalmente Android) |
473
+ | `imgbk` | `nombre.png` | Imagen de fondo del elemento |
474
+ | `undo-button` | `true`/`false` | Mostrar botón deshacer |
475
+ | `apply-css` | `true`/`false` | Aplicar estilos CSS al componente |
476
+ | `locked` | `true`/`false` | Campo de solo lectura |
477
+ | `zoom-controls` | `true`/`false` | Controles de zoom en webviews |
478
+ | `img` | `nombre.png` | Imagen del botón/control |
479
+ | `imgsel` | `nombre_sel.png` | Imagen al seleccionar/pulsar |
480
+ | `img-width` | Número | Ancho de iconos del sistema |
481
+ | `img-height` | Número | Alto de iconos del sistema |
482
+
483
+ ### 5.11 Propiedades Material Design y Componentes Especiales
484
+
485
+ | Atributo | Valores | Descripción |
486
+ |----------|---------|-------------|
487
+ | `ripple-effect` | `true`/`false` | Efecto de onda al tocar (Material Design, solo Android) |
488
+ | `elevation` | Número (0-24) | Nivel de elevacion que genera sombra bajo el elemento |
489
+ | `shadow-color` | `#RRGGBB` | Color de la sombra generada por elevation |
490
+ | `track-color` | `#RRGGBB` | Color de la pista para controles tipo slider o switch |
491
+ | `thumb-color` | `#RRGGBB` | Color del pulgar/indicador para controles tipo slider o switch |
492
+ | `check-color-checked` | `#RRGGBB` | Color del checkbox cuando esta marcado/activo |
493
+
494
+ **Ejemplo - Botón con efecto ripple y elevacion:**
495
+
496
+ ```css
497
+ .btnMaterial {
498
+ width: 90%;
499
+ height: 56p;
500
+ bgcolor: #1565C0;
501
+ forecolor: #FFFFFF;
502
+ border-corner-radius: 28;
503
+ ripple-effect: true;
504
+ elevation: 4;
505
+ }
506
+ ```
507
+
508
+ **Ejemplo - Switch/Slider personalizado:**
509
+
510
+ ```css
511
+ .switchPersonalizado {
512
+ track-color: #BBDEFB;
513
+ thumb-color: #1565C0;
514
+ check-color-checked: #4CAF50;
515
+ }
516
+ ```
517
+
518
+ > **NOTA:** La propiedad `elevation` funciona principalmente en Android, donde genera una sombra real bajo el elemento. En iOS, el efecto puede variar o no ser visible. Como alternativa multiplataforma, se pueden usar bordes sutiles (`border: true; border-color: #E0E0E0;`) para dar sensacion de profundidad.
519
+
520
+ **Ejemplo - Footer fijo en la parte inferior (proyecto SocialNetwork):**
521
+
522
+ ```css
523
+ .frameFooter {
524
+ width: 100%;
525
+ height: 120p;
526
+ bgcolor: #FFFFFF;
527
+ align: center;
528
+ fixed: true;
529
+ orientation: bottom;
530
+ }
531
+ ```
532
+
533
+ **Ejemplo - FAB flotante (proyecto SocialNetwork):**
534
+
535
+ ```css
536
+ .btnFAB {
537
+ width: 112p;
538
+ height: 112p;
539
+ bgcolor: #FFC107;
540
+ border-corner-radius: 56;
541
+ labelwidth: 0;
542
+ img-width: 48p;
543
+ img-height: 48p;
544
+ floating: true;
545
+ }
546
+ ```
547
+
548
+ ---
549
+
550
+ ## 6. Sistema de Herencia `extends:`
551
+
552
+ ### 6.1 Sintaxis: extends:.claseBase
553
+
554
+ El atributo `extends` permite que una clase CSS herede todos los atributos de otra clase base. La clase referenciada debe incluir el prefijo de punto (`.`).
555
+
556
+ ```css
557
+ .claseHija {
558
+ extends: .claseBase;
559
+ /* Solo sobreescribir lo que cambia */
560
+ }
561
+ ```
562
+
563
+ ### 6.2 Herencia simple
564
+
565
+ El caso más común: una clase hereda de otra y sobreescribe algunos atributos.
566
+
567
+ ```css
568
+ /* Clase base */
569
+ .btnPrimario {
570
+ width: 90%;
571
+ height: 56p;
572
+ bgcolor: #1565C0;
573
+ forecolor: #FFFFFF;
574
+ border-corner-radius: 28;
575
+ text-align: center;
576
+ fontsize: 16;
577
+ fontname: Roboto-Bold.ttf;
578
+ }
579
+
580
+ /* Clase hija - Solo cambia el color de fondo */
581
+ .btnPeligro {
582
+ extends: .btnPrimario;
583
+ bgcolor: #F44336;
584
+ }
585
+ ```
586
+
587
+ La clase `.btnPeligro` tendra TODOS los atributos de `.btnPrimario` (width, height, forecolor, border-corner-radius, text-align, fontsize, fontname) pero con `bgcolor: #F44336` en lugar de `#1565C0`.
588
+
589
+ ### 6.3 Herencia multiple (en cadena)
590
+
591
+ Se puede crear una cadena de herencia donde A extiende B, que a su vez extiende C.
592
+
593
+ ```css
594
+ /* Nivel 1: Base generica */
595
+ .badgeEstado {
596
+ height: 28p;
597
+ fontsize: 12;
598
+ fontname: Roboto-Bold.ttf;
599
+ forecolor: #FFFFFF;
600
+ text-align: center;
601
+ border-corner-radius: 14;
602
+ lmargin: 10p;
603
+ rmargin: 10p;
604
+ }
605
+
606
+ /* Nivel 2: Variantes que heredan de la base */
607
+ .badgePendiente {
608
+ extends: .badgeEstado;
609
+ bgcolor: #FFC107;
610
+ forecolor: #212121;
611
+ }
612
+
613
+ .badgeAsignado {
614
+ extends: .badgeEstado;
615
+ bgcolor: #2196F3;
616
+ }
617
+
618
+ .badgeEntregado {
619
+ extends: .badgeEstado;
620
+ bgcolor: #4CAF50;
621
+ }
622
+
623
+ .badgeCancelado {
624
+ extends: .badgeEstado;
625
+ bgcolor: #9E9E9E;
626
+ }
627
+ ```
628
+
629
+ ### 6.4 Sobreescritura de propiedades
630
+
631
+ Los atributos definidos en la clase hija siempre **sobreescriben** los heredados de la clase base:
632
+
633
+ ```css
634
+ .botonBase {
635
+ width: 90%;
636
+ height: 56p;
637
+ bgcolor: #0066CC;
638
+ forecolor: #FFFFFF;
639
+ }
640
+
641
+ .botonSecundario {
642
+ extends: .botonBase;
643
+ bgcolor: #FFFFFF; /* Sobreescribe bgcolor */
644
+ forecolor: #0066CC; /* Sobreescribe forecolor */
645
+ border: true; /* Anade nuevo atributo */
646
+ border-color: #0066CC; /* Anade nuevo atributo */
647
+ }
648
+ ```
649
+
650
+ Resultado de `.botonSecundario`:
651
+ - `width: 90%` (heredado)
652
+ - `height: 56p` (heredado)
653
+ - `bgcolor: #FFFFFF` (sobreescrito)
654
+ - `forecolor: #0066CC` (sobreescrito)
655
+ - `border: true` (nuevo)
656
+ - `border-color: #0066CC` (nuevo)
657
+
658
+ ### 6.5 Herencia desde selectores globales y de tipo
659
+
660
+ Es posible usar `extends` para heredar no solo de clases (`.nombreClase`) sino también de selectores globales (`prop`, `coll`) y selectores de tipo (`prop:T`, `prop:B`, etc.).
661
+
662
+ **Extends desde `prop` (selector global):**
663
+
664
+ ```css
665
+ .classprop {
666
+ extends: prop;
667
+ lmargin: 2%;
668
+ tmargin: 0p;
669
+ text-border: true;
670
+ text-border-width: 1p;
671
+ }
672
+ ```
673
+
674
+ La clase `.classprop` hereda todos los atributos definidos en el selector global `prop` (fontname, fontsize, forecolor, etc.) y anade o sobreescribe los indicados.
675
+
676
+ **Extends desde `prop:B` (selector de tipo):**
677
+
678
+ ```css
679
+ .btnButton {
680
+ extends: prop:B;
681
+ visible: 1;
682
+ align: center;
683
+ width: 300p;
684
+ height: 100p;
685
+ fontsize: 9;
686
+ labelwidth: 1;
687
+ fontbold: true;
688
+ label-wrap: true;
689
+ tmargin: 20p;
690
+ lmargin: 30p;
691
+ }
692
+ ```
693
+
694
+ La clase `.btnButton` hereda los estilos base definidos para todos los botones (`prop:B`) y los extiende con posicionamiento y tamaño especificos.
695
+
696
+ **Extends desde `prop:T` (crear un input personalizado basado en campos de texto):**
697
+
698
+ ```css
699
+ .myInputCustom {
700
+ extends: prop:T;
701
+ text-border: true;
702
+ text-border-bottom: true;
703
+ text-border-left: false;
704
+ text-border-right: false;
705
+ text-border-top: false;
706
+ text-border-color: #1565C0;
707
+ fontsize: 16;
708
+ }
709
+ ```
710
+
711
+ ### 6.6 Herencia encadenada (multiples niveles)
712
+
713
+ Se puede crear una cadena de herencia de multiples niveles donde A extiende B, y B extiende C. XOne resuelve toda la cadena de herencia, de modo que A recibe los atributos de C + B + los suyos propios.
714
+
715
+ ```css
716
+ /* Nivel 1: Hereda del selector global prop */
717
+ .classprop {
718
+ extends: prop;
719
+ lmargin: 2%;
720
+ text-border: true;
721
+ }
722
+
723
+ /* Nivel 2: Hereda de .classprop (que a su vez hereda de prop) */
724
+ .classtl {
725
+ extends: .classprop;
726
+ labelbox: true;
727
+ width: 96%;
728
+ align: center;
729
+ bgcolor: #00000000;
730
+ border: true;
731
+ border-color: DarkBlue;
732
+ border-width: 1p;
733
+ elevation: 7;
734
+ }
735
+
736
+ /* Nivel 3: Hereda de .classtl */
737
+ .classtlResaltado {
738
+ extends: .classtl;
739
+ bgcolor: #E3F2FD;
740
+ border-color: #1565C0;
741
+ }
742
+ ```
743
+
744
+ En este ejemplo, `.classtlResaltado` recibe:
745
+ - De `prop`: fontname, fontsize, forecolor, etc.
746
+ - De `.classprop`: lmargin, text-border
747
+ - De `.classtl`: labelbox, width, align, border, elevation
748
+ - Propios: bgcolor y border-color sobreescritos
749
+
750
+ > **IMPORTANTE:** No hay limite técnico para la cantidad de niveles de herencia encadenada, pero se recomienda no superar 3-4 niveles para mantener la legibilidad y facilidad de depuracion. Además, **no se permite la herencia circular** (A extends B extends A), ya que provocaria un bucle infinito.
751
+
752
+ ### 6.7 Patrones de herencia recomendados
753
+
754
+ **Patron 1: Variantes de botón (el más común):**
755
+
756
+ ```css
757
+ /* Base */
758
+ .btnBase {
759
+ width: 90%;
760
+ height: 56p;
761
+ border-corner-radius: 28;
762
+ text-align: center;
763
+ fontsize: 16;
764
+ fontname: Roboto-Bold.ttf;
765
+ }
766
+
767
+ /* Variantes */
768
+ .btnPrimario {
769
+ extends: .btnBase;
770
+ bgcolor: #1565C0;
771
+ forecolor: #FFFFFF;
772
+ }
773
+
774
+ .btnSecundario {
775
+ extends: .btnBase;
776
+ bgcolor: #FFFFFF;
777
+ forecolor: #1565C0;
778
+ border: true;
779
+ border-color: #1565C0;
780
+ }
781
+
782
+ .btnPeligro {
783
+ extends: .btnBase;
784
+ bgcolor: #F44336;
785
+ forecolor: #FFFFFF;
786
+ }
787
+
788
+ .btnExito {
789
+ extends: .btnBase;
790
+ bgcolor: #4CAF50;
791
+ forecolor: #FFFFFF;
792
+ }
793
+ ```
794
+
795
+ **Patron 2: Variantes de input:**
796
+
797
+ ```css
798
+ .inputBase {
799
+ width: 95%;
800
+ height: 56p;
801
+ text-border: true;
802
+ text-border-bottom: true;
803
+ text-border-left: false;
804
+ text-border-right: false;
805
+ text-border-top: false;
806
+ text-border-color: #BDBDBD;
807
+ fontsize: 14;
808
+ }
809
+
810
+ .inputEnfocado {
811
+ extends: .inputBase;
812
+ text-border-color: #1565C0;
813
+ }
814
+
815
+ .inputError {
816
+ extends: .inputBase;
817
+ text-border-color: #F44336;
818
+ }
819
+ ```
820
+
821
+ **Patron 3: Variantes de texto:**
822
+
823
+ ```css
824
+ .textoBase {
825
+ fontname: Roboto-Regular.ttf;
826
+ labelwidth: 0;
827
+ }
828
+
829
+ .textoTitulo {
830
+ extends: .textoBase;
831
+ fontsize: 20;
832
+ fontname: Roboto-Bold.ttf;
833
+ forecolor: #212121;
834
+ }
835
+
836
+ .textoSubtitulo {
837
+ extends: .textoBase;
838
+ fontsize: 16;
839
+ forecolor: #616161;
840
+ }
841
+
842
+ .textoSecundario {
843
+ extends: .textoBase;
844
+ fontsize: 14;
845
+ forecolor: #9E9E9E;
846
+ }
847
+ ```
848
+
849
+ **Patron 4: Herencia desde selector global con `extends: prop`:**
850
+
851
+ ```css
852
+ .xnCheckbox {
853
+ extends: prop;
854
+ apply-css: true;
855
+ labelwidth: 1;
856
+ img-width: 50p;
857
+ text-bgcolor: #00000000;
858
+ }
859
+ ```
860
+
861
+ ### 6.8 Cuando usar extends vs clases multiples
862
+
863
+ | Situación | Usar `extends` | Usar multiples clases |
864
+ |-----------|:--------------:|:---------------------:|
865
+ | Variantes de color de un mismo componente | SI | No |
866
+ | Combinar layout con color | No | SI |
867
+ | Badges de estado (misma forma, distinto color) | SI | No |
868
+ | Frame con animación | No | SI |
869
+ | Botones con diferente acción (mismo estilo base) | SI | No |
870
+
871
+ **Ejemplo - Multiples clases en XML:**
872
+
873
+ ```xml
874
+ <frame name="frmEncabezado" class="frameHeader animSlideRight">
875
+ ```
876
+
877
+ **Ejemplo - Extends en CSS:**
878
+
879
+ ```css
880
+ .btnDanger {
881
+ extends: .btnPrimary;
882
+ bgcolor: #F44336;
883
+ }
884
+ ```
885
+