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.
- package/README.md +167 -0
- package/dist/agent/authEnDisco.js +56 -0
- package/dist/agent/authEnDisco.js.map +1 -0
- package/dist/agent/configEnDisco.js +109 -0
- package/dist/agent/configEnDisco.js.map +1 -0
- package/dist/agent/crearProyecto.js +34 -0
- package/dist/agent/crearProyecto.js.map +1 -0
- package/dist/agent/entorno.js +124 -0
- package/dist/agent/entorno.js.map +1 -0
- package/dist/agent/guionizado.js +53 -0
- package/dist/agent/guionizado.js.map +1 -0
- package/dist/agent/instantanea.js +129 -0
- package/dist/agent/instantanea.js.map +1 -0
- package/dist/agent/interrupts.js +83 -0
- package/dist/agent/interrupts.js.map +1 -0
- package/dist/agent/mensajes.js +24 -0
- package/dist/agent/mensajes.js.map +1 -0
- package/dist/agent/modelos.js +42 -0
- package/dist/agent/modelos.js.map +1 -0
- package/dist/agent/normalizar.js +20 -0
- package/dist/agent/normalizar.js.map +1 -0
- package/dist/agent/perfiles.js +103 -0
- package/dist/agent/perfiles.js.map +1 -0
- package/dist/agent/proyecto.js +107 -0
- package/dist/agent/proyecto.js.map +1 -0
- package/dist/agent/puente.js +142 -0
- package/dist/agent/puente.js.map +1 -0
- package/dist/agent/resumenDeTool.js +48 -0
- package/dist/agent/resumenDeTool.js.map +1 -0
- package/dist/agent/skills.js +65 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/textoDeTool.js +113 -0
- package/dist/agent/textoDeTool.js.map +1 -0
- package/dist/agent/turnoReal.js +173 -0
- package/dist/agent/turnoReal.js.map +1 -0
- package/dist/agent/verificador.js +65 -0
- package/dist/agent/verificador.js.map +1 -0
- package/dist/agent/xoneAgent.js +106 -0
- package/dist/agent/xoneAgent.js.map +1 -0
- package/dist/bin.js +9 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/aprobar.js +82 -0
- package/dist/cli/aprobar.js.map +1 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/consola.js +346 -0
- package/dist/cli/consola.js.map +1 -0
- package/dist/cli/describe.js +53 -0
- package/dist/cli/describe.js.map +1 -0
- package/dist/cli/doctor.js +45 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/main.js +520 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/markdown.js +90 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/run.js +164 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/spinner.js +89 -0
- package/dist/cli/spinner.js.map +1 -0
- package/dist/cli/stdio.js +193 -0
- package/dist/cli/stdio.js.map +1 -0
- package/dist/cli/tema.js +40 -0
- package/dist/cli/tema.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/core/bitacora.js +30 -0
- package/dist/core/bitacora.js.map +1 -0
- package/dist/core/config.js +236 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contextos.js +56 -0
- package/dist/core/contextos.js.map +1 -0
- package/dist/core/deps.js +51 -0
- package/dist/core/deps.js.map +1 -0
- package/dist/core/diff.js +79 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/esqueleto.js +366 -0
- package/dist/core/esqueleto.js.map +1 -0
- package/dist/core/events.js +2 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/modelos.js +85 -0
- package/dist/core/modelos.js.map +1 -0
- package/dist/core/notify.js +106 -0
- package/dist/core/notify.js.map +1 -0
- package/dist/core/ports.js +114 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/turno.js +127 -0
- package/dist/core/turno.js.map +1 -0
- package/dist/vendor/hitl.js +103 -0
- package/dist/vendor/hitl.js.map +1 -0
- package/dist/vendor/skillLoaders/catalog.js +74 -0
- package/dist/vendor/skillLoaders/catalog.js.map +1 -0
- package/dist/vendor/tokenTracking.js +58 -0
- package/dist/vendor/tokenTracking.js.map +1 -0
- package/package.json +41 -0
- package/skills/xone-debugging/SKILL.md +52 -0
- package/skills/xone-debugging/references/faq.md +561 -0
- package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
- package/skills/xone-development/SKILL.md +105 -0
- package/skills/xone-development/references/anti-patrones.md +94 -0
- package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
- package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
- package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
- package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
- package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
- package/skills/xone-development/references/datos/appdata.md +611 -0
- package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
- package/skills/xone-development/references/datos/http.md +366 -0
- package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
- package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
- package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
- package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
- package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
- package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
- package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
- package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
- package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
- package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
- package/skills/xone-development/references/indice-completo.md +77 -0
- package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
- package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
- package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
- package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
- package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
- package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
- package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
- package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
- package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
- package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
- package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
- package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
- package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
- package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
- package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
- package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
- package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
- package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
- package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
- package/skills/xone-development/references/tipos-de-prop.md +28 -0
- package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
- package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
- package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
- package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
- package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
- package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
- package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
- package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
- package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
- package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
- package/skills/xone-development/references/xml-ui/mapas.md +685 -0
- package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
- package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
- package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
- package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
- package/skills/xone-plan-builder/SKILL.md +183 -0
- package/skills/xone-plan-builder/agents/openai.yaml +5 -0
- package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
- package/skills/xone-project-generator/SKILL.md +111 -0
- package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
- package/skills/xone-project-generator/references/colecciones-base.md +16 -0
- package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
- package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
- package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
- package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
- package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
- package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
- package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
- package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
- package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
- package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
- package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
- package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
- package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
- package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
- package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
- package/skills/xone-review/SKILL.md +189 -0
- package/skills/xone-spec-builder/SKILL.md +235 -0
- package/skills/xone-spec-builder/agents/openai.yaml +5 -0
- package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
- package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
- 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
|
+
|