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,618 @@
1
+ # XOne XML — Layouts avanzados, herencia y buenas prácticas
2
+
3
+ > Fuente: `xone/v2/xone-help-docs/topics/02d-xml-layouts-herencia.md` §9–§11. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
4
+
5
+ Contenido: §9 layouts: responsive con porcentajes, modales flotantes, FAB · §10 herencia entre colecciones con inherits y composición con include-layout · §11 best practices, checklist de validación XML y unicidad de nombres de nodos
6
+
7
+ ---
8
+
9
+ ## 9. Layouts Avanzados
10
+
11
+ ### 9.1 Responsive con porcentajes
12
+
13
+ XOne no tiene media queries como CSS web, pero puedes hacer layouts adaptables usando porcentajes:
14
+
15
+ ```xml
16
+ <!-- Dos columnas que se adaptan -->
17
+ <frame name="frmRow" width="100%" height="-2">
18
+ <frame name="frmCol1" width="48%" lmargin="1%" newline="false">
19
+ <prop name="CAMPO1" type="T" title="Campo 1" width="100%" />
20
+ </frame>
21
+ <frame name="frmCol2" width="48%" lmargin="2%" newline="false">
22
+ <prop name="CAMPO2" type="T" title="Campo 2" width="100%" />
23
+ </frame>
24
+ </frame>
25
+
26
+ <!-- Tres columnas -->
27
+ <frame name="frmRow3" width="100%" height="-2">
28
+ <frame name="col1" width="32%" lmargin="1%" newline="false">
29
+ <prop name="C1" type="T" title="Col 1" />
30
+ </frame>
31
+ <frame name="col2" width="32%" lmargin="1%" newline="false">
32
+ <prop name="C2" type="T" title="Col 2" />
33
+ </frame>
34
+ <frame name="col3" width="32%" lmargin="1%" newline="false">
35
+ <prop name="C3" type="T" title="Col 3" />
36
+ </frame>
37
+ </frame>
38
+ ```
39
+
40
+ ### 9.2 Overlays y modales flotantes
41
+
42
+ Patron para mostrar un modal sobre el contenido:
43
+
44
+ ```xml
45
+ <!-- Contenido principal -->
46
+ <group name="Contenido" id="1">
47
+ <!-- ... contenido normal ... -->
48
+ <prop name="MAP_MOSTRAR_MODAL" type="N" visible="0" />
49
+ </group>
50
+
51
+ <!-- Modal flotante -->
52
+ <group name="Modal" id="50"
53
+ floating="true"
54
+ top="0" left="0"
55
+ width="100%" height="100%"
56
+ bgcolor="#77000000"
57
+ disablevisible="MAP_MOSTRAR_MODAL=0">
58
+ <frame name="frmModalContent"
59
+ width="80%" height="300p"
60
+ lmargin="10%" tmargin="200p"
61
+ bgcolor="#FFFFFF"
62
+ border-corner-radius="16"
63
+ elevation="10">
64
+ <prop name="lblModalTitulo" type="L" visible="1"
65
+ title="Título del Modal"
66
+ fontbold="true" fontsize="18"
67
+ tmargin="20p" lmargin="20p" />
68
+ <prop name="lblModalTexto" type="L" visible="1"
69
+ title="Contenido del modal aquí"
70
+ fontsize="14" forecolor="#666666"
71
+ tmargin="10p" lmargin="20p" />
72
+ <prop name="btnCerrarModal" type="B" visible="1"
73
+ title="Cerrar" width="80%" lmargin="10%"
74
+ tmargin="30p"
75
+ onclick="self.MAP_MOSTRAR_MODAL = 0; ui.refresh('MAP_MOSTRAR_MODAL');" />
76
+ </frame>
77
+ </group>
78
+ ```
79
+
80
+ También se puede lograr con un frame flotante animado (patron del wiki, EspecialChat.xne):
81
+
82
+ ```xml
83
+ <frame name="frmnuevochat"
84
+ animation-in-delay="250"
85
+ animation-out-delay="250"
86
+ animation-in="##RIGHT_IN##"
87
+ animation-out="##LEFT_OUT##"
88
+ disablevisible="MAP_VERFLOTANTE=0"
89
+ bgcolor="#ffffff"
90
+ modal="true"
91
+ floating="true"
92
+ top="0" left="0"
93
+ width="100%" height="100%">
94
+ <!-- Contenido del modal animado -->
95
+ </frame>
96
+ ```
97
+
98
+ ### 9.3 Sticky headers y footers
99
+
100
+ El patron Header + Content + Footer con grupos fijos:
101
+
102
+ ```xml
103
+ <coll name="PantallaCompleta" special="true" notab="true">
104
+ <!-- Header STICKY -->
105
+ <group name="Header" id="10"
106
+ fixed="true" orientation="top"
107
+ width="100%" height="120p">
108
+ <frame name="frmHeader" bgcolor="#1565C0"
109
+ width="100%" height="120p" align="center|center">
110
+ <prop name="TITULO" type="L" visible="1"
111
+ forecolor="#FFFFFF" fontsize="20" fontbold="true"
112
+ title="Mi App" />
113
+ </frame>
114
+ </group>
115
+
116
+ <!-- Contenido scrollable -->
117
+ <group name="Body" id="1">
118
+ <frame name="frmBody" width="100%" height="100%"
119
+ scroll="true" align="left|top">
120
+ <!-- Todo el contenido scrollable aquí -->
121
+ </frame>
122
+ </group>
123
+
124
+ <!-- Footer STICKY -->
125
+ <group name="Footer" id="0"
126
+ fixed="true" orientation="bottom"
127
+ width="100%" height="80p">
128
+ <frame name="frmFooter" bgcolor="#FFFFFF"
129
+ width="100%" height="80p" elevation="8">
130
+ <prop name="BTN_GUARDAR" type="B" visible="1"
131
+ title="Guardar" width="90%" height="56p"
132
+ lmargin="5%" tmargin="12p"
133
+ bgcolor="#4CAF50" forecolor="#FFFFFF"
134
+ border-corner-radius="28" />
135
+ </frame>
136
+ </group>
137
+ </coll>
138
+ ```
139
+
140
+ ### 9.4 FAB (Floating Action Button)
141
+
142
+ Botón flotante estilo Material Design:
143
+
144
+ ```xml
145
+ <!-- FAB usando prop flotante -->
146
+ <prop name="MAP_FAB" type="B" visible="1"
147
+ floating="true"
148
+ top="1550p"
149
+ left="850p"
150
+ behavior="move"
151
+ img="ic_fab.png"
152
+ width="192p"
153
+ height="192p" />
154
+
155
+ <!-- FAB simplificado -->
156
+ <prop name="btnNuevo" type="B" visible="7"
157
+ class="btnFAB"
158
+ src="./icons/ic_add.png"
159
+ dock="bottom" align="right"
160
+ rmargin="16p" bmargin="16p"
161
+ onclick="crearNuevo();" />
162
+ ```
163
+
164
+ El FAB también se puede crear con un frame flotante:
165
+
166
+ ```xml
167
+ <frame name="floatadd1"
168
+ top="920p" left="510p"
169
+ width="290p" height="90p"
170
+ floating="true">
171
+ <prop name="BTADD1" type="B" visible="1"
172
+ labelwidth="0"
173
+ method="ExecuteNode(nuevo)"
174
+ width="75p"
175
+ img="add.png"
176
+ imgsel="add_click.png" />
177
+ </frame>
178
+ ```
179
+
180
+ ### 9.5 Recycler view optimizado
181
+
182
+ Para listas con muchos registros, `recyclerview` es esencial:
183
+
184
+ ```xml
185
+ <prop name="LISTA" type="Z" visible="1"
186
+ contents="@MiLista"
187
+ viewmode="recyclerview"
188
+ width="100%" height="80%"
189
+ edit-inrow="true"
190
+ show-no-data="true"
191
+ show-loading="true" />
192
+ ```
193
+
194
+ **Tips de rendimiento**:
195
+ - Siempre usar `viewmode="recyclerview"` para listas largas.
196
+ - Limitar el número de props visibles en cada fila del content.
197
+ - Usar `loadall="true"` solo si la tabla tiene pocos registros (menos de 500).
198
+ - Usar filtros SQL eficientes con índices.
199
+ - Evitar imágenes pesadas en filas de lista.
200
+
201
+ ---
202
+
203
+ ## 10. Herencia entre Colecciones y Composición XML
204
+
205
+ XOne ofrece dos mecanismos **independientes del CSS** para reutilizar definiciones XML entre colecciones: herencia de coll con `inherits` y composición por inclusión de fragmentos XML con `<include-layout>`. Son distintos del sistema CSS `extends` — operan sobre la estructura XML (groups, frames, props, eventos), no sobre estilos.
206
+
207
+ ### 10.1 Herencia entre colecciones con `inherits`
208
+
209
+ El atributo `inherits` en el nodo `<coll>` permite que una coleccion herede **grupos, frames, props y nodos de evento** de otra coleccion. La coleccion resultante en ejecución se comporta como una **mezcla entre la PADRE y la HIJA**.
210
+
211
+ **Sintaxis:**
212
+
213
+ ```xml
214
+ <coll name="EspecialHerencia" inherits="groupsFixed" special="true" notab="false" ...>
215
+ ...
216
+ </coll>
217
+ ```
218
+
219
+ El valor de `inherits` es el `name` de otra `<coll>` del proyecto (sin extensión `.xne`).
220
+
221
+ **Regla de precedencia (importante):**
222
+
223
+ > En caso de duplicidad (mismo `name`) de `<group>`, `<frame>`, `<prop>` o nodo de evento (`<onback>`, `<before-edit>`, `<create>`, etc.), **prevalece la definición de la HIJA**. Los elementos no duplicados de la PADRE se conservan tal cual.
224
+
225
+ La hija puede además **añadir** grupos, frames, props o eventos que no existen en la padre.
226
+
227
+ **Caso de uso típico:** scaffolding visual compartido — un header fijo, un footer de paginación, botones de navegación. Se define una coll `special="true"` con toda la maquinaria común, y cada pantalla concreta la hereda.
228
+
229
+ #### Ejemplo: header y footer fijos compartidos
230
+
231
+ **Coleccion PADRE** (maquinaria reutilizable):
232
+
233
+ ```xml
234
+ <coll name="groupsFixed" title="" special="true">
235
+ <group name="HEADER" id="999" class="groupfixed_header">
236
+ <frame name="frmtitulo" class="frmsuperior">
237
+ <prop name="SALIR" type="B" class="btvolversuper" />
238
+ <prop name="MENU" type="L" class="tlsuper" title="Herencia" />
239
+ <prop name="MAP_COLORACTIVO" type="T" visible="0" />
240
+ </frame>
241
+ </group>
242
+ <group name="FOOTER" id="0" class="groupfixed_footer">
243
+ <prop name="MAP_GROUP" type="N" visible="0" />
244
+ <prop name="MAP_TOTAL_PAGES" type="N" visible="0" />
245
+ <frame name="FLOAT_FOOTER_FRAME" class="frmsuperior">
246
+ <prop name="MAP_LAST" type="B" img="last.png" title="Anterior"
247
+ onclick="javascript:prev(self,'ir'); ui.refresh('MAP_LAST', 'MAP_NEXT', 'MAP_LAST_EMPTY');"
248
+ width="45%" height="80%" labelwidth="1"
249
+ disablevisible="MAP_GROUP=1" />
250
+ <prop name="MAP_NEXT" type="B" img="next.png" title="Siguiente"
251
+ onclick="javascript:next(self,'ir'); ui.refresh('MAP_LAST', 'MAP_NEXT', 'MAP_LAST_EMPTY');"
252
+ width="45%" height="80%" labelwidth="1" newline="false"
253
+ disablevisible="MAP_GROUP=MAP_TOTAL_PAGES" />
254
+ </frame>
255
+ </group>
256
+ <group name="Group1" id="1">
257
+ <prop name="MENU2" type="L" class="classtl"
258
+ title="Grupo heredado de la coll padre." label-wrap="true" />
259
+ </group>
260
+ <onback show-wait-dialog="false">
261
+ <action name="runscript">
262
+ <script language="javascript">
263
+ ui.getView(self).exit();
264
+ </script>
265
+ </action>
266
+ </onback>
267
+ </coll>
268
+ ```
269
+
270
+ **Coleccion HIJA** (pantalla concreta que hereda la estructura):
271
+
272
+ ```xml
273
+ <coll name="EspecialHerencia" inherits="groupsFixed"
274
+ special="true" notab="false" group-swipe="true">
275
+
276
+ <!-- Override: solo redefine MENU en el HEADER.
277
+ SALIR y MAP_COLORACTIVO se conservan del padre. -->
278
+ <group name="HEADER" id="999">
279
+ <frame name="frmtitulo" class="frmsuperior">
280
+ <prop name="MENU" type="L" class="tlsuper" title="Mi Pantalla" />
281
+ </frame>
282
+ </group>
283
+
284
+ <!-- Override: Group1 queda vacio en la hija (pero se hereda el ID).
285
+ NOTA: esto sobreescribe el MENU2 del padre al declarar el grupo. -->
286
+ <group name="Group1" id="1">
287
+ </group>
288
+
289
+ <!-- Nuevo grupo: no existe en el padre, se anade -->
290
+ <group name="Group2" id="2">
291
+ <include-layout file="EjemploIncludeLayout.xml" group="2" />
292
+ </group>
293
+
294
+ <!-- Evento propio de la hija (no conflicta con el padre) -->
295
+ <before-edit>
296
+ <action name="runscript">
297
+ <script language="javascript">
298
+ self.MAP_GROUP = 1;
299
+ self.MAP_TOTAL_PAGES = 2;
300
+ </script>
301
+ </action>
302
+ </before-edit>
303
+ </coll>
304
+ ```
305
+
306
+ #### Cadenas de herencia (A → B → C)
307
+
308
+ `inherits` soporta **cadenas**: una coll B puede heredar de A, y una C puede heredar de B. La resolución recorre toda la cadena hacia arriba y aplica la regla hijo-gana en cada nivel.
309
+
310
+ ```xml
311
+ <coll name="BaseLayout" special="true"> ... </coll>
312
+ <coll name="LayoutConMenu" inherits="BaseLayout" special="true"> ... </coll>
313
+ <coll name="PantallaFinal" inherits="LayoutConMenu"> ... </coll>
314
+ ```
315
+
316
+ `PantallaFinal` recibe: definiciones de `BaseLayout` + lo que `LayoutConMenu` sobreescriba o añada + lo que `PantallaFinal` sobreescriba o añada.
317
+
318
+ #### Herencia multiple: NO soportada
319
+
320
+ Solo se admite **un padre** por coll. No existe la sintaxis `inherits="A,B"` ni similares. Si necesitas combinar piezas de varias fuentes, usa `<include-layout>` (sección 10.2) para factorizar fragmentos.
321
+
322
+ #### Eventos heredados
323
+
324
+ Los nodos de evento a nivel de coll (`<onback>`, `<before-edit>`, `<create>`, `<after-edit>`, `<onchange>`, custom nodes, etc.) también se heredan. Aplica la misma regla:
325
+ - Si el evento no esta en la hija, se ejecuta el del padre.
326
+ - Si la hija define el mismo evento, se ejecuta el de la hija (sobreescribe completamente; **no hay concepto de `super()`** que llame al del padre).
327
+
328
+ #### Cuando usar `inherits`
329
+
330
+ | Escenario | Recomendacion |
331
+ |-----------|---------------|
332
+ | Varias pantallas comparten header/footer/navegación | SI usar `inherits` con coll padre `special="true"` |
333
+ | Dos pantallas muy parecidas pero con lógica distinta | Normalmente SI — override de eventos en la hija |
334
+ | Pantallas totalmente distintas | NO — la herencia no aporta |
335
+ | Colecciones de datos (con `objname`) | Raro. `inherits` es útil sobre todo en colecciones de UI (`special="true"`) |
336
+
337
+ ### 10.2 Composición con `<include-layout>`
338
+
339
+ `<include-layout>` es un nodo que **inyecta el contenido de un fichero XML externo** en el punto donde aparece. Se usa para factorizar fragmentos reutilizables (botoneras, bloques de props, eventos compartidos).
340
+
341
+ **Sintaxis:**
342
+
343
+ ```xml
344
+ <include-layout file="MisBotones.xml" group="1" frame="todo" />
345
+ ```
346
+
347
+ | Atributo | Obligatorio | Descripción |
348
+ |----------|-------------|-------------|
349
+ | `file` | Si | Ruta al fichero XML a incluir. **Relativa a la raiz del proyecto**. |
350
+ | `group` | No | ID de grupo por defecto para los `<prop>` del fichero incluido que NO declaren `group`. |
351
+ | `frame` | No | Nombre de frame por defecto para los `<prop>` del fichero incluido que NO declaren `frame`. |
352
+
353
+ #### Formato del fichero incluido
354
+
355
+ El fichero referenciado por `file=` debe cumplir una estructura especifica:
356
+
357
+ - **Cabecera XML** con encoding `utf-8`: `<?xml versión="1.0" encoding="utf-8"?>`
358
+ - **Raiz `<xml>`** (NO `<coll>`).
359
+ - **Estructura plana (no jerárquica)** al nivel de la raiz: los nodos (`<prop>`, `<group>`, `<frame>`, eventos custom) van todos al mismo nivel dentro de `<xml>`.
360
+
361
+ Puede contener `<prop>`, `<group>`, `<frame>` y nodos de evento (incluyendo eventos custom como `<salir>`, `<guardar>`, etc., invocables con `method="ExecuteNode(nombre)"`).
362
+
363
+ **Ejemplo de fichero incluido — `MisBotones.xml`:**
364
+
365
+ ```xml
366
+ <?xml version="1.0" encoding="utf-8"?>
367
+ <xml>
368
+ <prop name="MAP_SALIR" type="B" title="Salir" visible="1"
369
+ method="ExecuteNode(salir)"
370
+ width="100%" height="20%" labelwidth="10" tmargin="0" />
371
+
372
+ <salir refresh="false">
373
+ <action name="runscript" type="runscript">
374
+ <script language="javascript">
375
+ appData.exit();
376
+ </script>
377
+ </action>
378
+ </salir>
379
+ </xml>
380
+ ```
381
+
382
+ #### Ejemplo de uso en una coll
383
+
384
+ ```xml
385
+ <coll name="MenuEntrada" special="true" notab="true">
386
+ <group name="General" id="1" />
387
+ <frame name="todo" width="100%" height="100%" scroll="true" />
388
+
389
+ <prop group="1" frame="todo" name="MAP_TEXTO_01" type="T" title="Texto #1"
390
+ visible="1" labelwidth="10" width="100%" />
391
+ <prop group="1" frame="todo" name="MAP_TEXTO_02" type="T" title="Texto #2"
392
+ visible="1" labelwidth="10" width="100%" />
393
+ <prop group="1" frame="todo" name="MAP_TEXTO_03" type="T" title="Texto #3"
394
+ visible="1" labelwidth="10" width="100%" />
395
+
396
+ <!-- Se inyecta aquí el contenido de MisBotones.xml.
397
+ Los props del fichero sin group/frame tomaran group="1" frame="todo" -->
398
+ <include-layout file="MisBotones.xml" group="1" frame="todo" />
399
+
400
+ <prop group="1" frame="todo" name="MAP_TEXTO_04" type="T" title="Texto #4"
401
+ visible="1" labelwidth="10" width="100%" />
402
+ <prop group="1" frame="todo" name="MAP_TEXTO_05" type="T" title="Texto #5"
403
+ visible="1" labelwidth="10" width="100%" />
404
+ </coll>
405
+ ```
406
+
407
+ #### Semantica de `group` y `frame` en `<include-layout>`
408
+
409
+ Los atributos `group` y `frame` del nodo `<include-layout>` **solo actuan como valores por defecto** para los props del fichero incluido que NO declaren explicitamente `group` o `frame`. Si un prop del fichero incluido ya declara esos atributos, prevalece lo declarado.
410
+
411
+ Esto permite que el mismo fichero `MisBotones.xml` se incluya desde distintas colls y se ubique automáticamente en el grupo/frame correctos.
412
+
413
+ #### Limitaciones
414
+
415
+ - **No se pueden anidar `<include-layout>`**: el fichero incluido NO puede contener a su vez otro `<include-layout>`. La inclusión es un solo nivel.
416
+ - **No sustituye a `inherits`**: `<include-layout>` es **composición** (pegar fragmentos), no herencia. No hay concepto de override — si el fichero incluido define un `name` que ya existe en la coll, es error de modelo del desarrollador (duplicidad de nombres prohibida dentro de la misma coll).
417
+ - **Ruta relativa a la raiz del proyecto**, no a la carpeta de la coll.
418
+
419
+ ### 10.3 Combinar `inherits` + `<include-layout>`
420
+
421
+ Los dos mecanismos se combinan con normalidad. El patron más potente es:
422
+
423
+ 1. Una coll padre `special="true"` que defina la estructura visual base (headers, footers, navegación) — reutilizada via `inherits`.
424
+ 2. Ficheros XML factorizados (botoneras, fragmentos de formulario) reutilizados via `<include-layout>` dentro de cada pantalla concreta.
425
+
426
+ ```xml
427
+ <coll name="PantallaA" inherits="groupsFixed" special="true">
428
+ <group name="Group2" id="2">
429
+ <include-layout file="ControlesGpsComunes.xml" group="2" frame="frmMapa" />
430
+ </group>
431
+ </coll>
432
+ ```
433
+
434
+ ### 10.4 Diferencia con el CSS `extends`
435
+
436
+ No confundir estos mecanismos con la herencia CSS (`extends:` dentro de `.css`). Actuan en niveles distintos:
437
+
438
+ | Aspecto | `extends` (CSS) | `inherits` (coll XML) | `<include-layout>` (nodo XML) |
439
+ |---------|-----------------|------------------------|-------------------------------|
440
+ | Nivel | Estilos | Estructura de coll | Fragmento XML |
441
+ | Que aporta | Atributos visuales | groups, frames, props y eventos completos | Nodos predefinidos en fichero externo |
442
+ | Duplicidad | Hija sobrescribe atributos | Hija sobrescribe nodos con mismo `name` | No aplica (no hay resolución de duplicados) |
443
+ | Cadenas | Si (A→B→C) | Si (A→B→C) | No (un solo nivel) |
444
+ | Multiple | No | No | — |
445
+ | Sintaxis | `extends: .base;` | `inherits="ColPadre"` | `<include-layout file="..." />` |
446
+ | Donde vive | `.css` | Atributo en `<coll>` | Nodo XML dentro de `<coll>` |
447
+
448
+ ### 10.5 Anti-patrones
449
+
450
+ | Error | Consecuencia |
451
+ |-------|--------------|
452
+ | Usar `inherits` entre colecciones de datos con `objname` distintos sin planificarlo | Confusion de modelo: la hija puede heredar eventos o campos que no aplican a su tabla |
453
+ | Cadenas de `inherits` muy largas (>3-4 niveles) | Difícil de depurar: para saber que tiene realmente una coll hay que recorrer toda la cadena |
454
+ | Crear una padre gigante que todo el mundo hereda «por si acaso» | Se arrastran nodos innecesarios a cada pantalla. Mejor varias padres pequeñas y especificas |
455
+ | Usar `<include-layout>` con ficheros anidados | No soportado: el fichero incluido no puede contener otro `<include-layout>` |
456
+ | Poner encoding `iso-8859-1` o `iso-8859-15` en el fichero de `<include-layout>` | Limita los caracteres admitidos. Usar **`utf-8`** en los ficheros incluidos (los `.xne` pueden ir en UTF-8 o iso-8859-15) |
457
+ | Declarar `<coll>` como raiz en el fichero de `<include-layout>` | Formato incorrecto: la raiz debe ser `<xml>`, no `<coll>` |
458
+ | Repetir un `name` entre coll y fichero incluido | Los nombres de props/groups/frames deben ser únicos en el ambito final tras la composición |
459
+
460
+ ---
461
+
462
+ ## 11. Best Practices y Anti-patrones
463
+
464
+ ### 11.1 Top 15 buenas prácticas XML
465
+
466
+ 1. **Nombres en PascalCase para colecciones**: `MenuPrincipal`, `DetalleCliente`.
467
+ 2. **Nombres en camelCase para props de UI**: `btnGuardar`, `lblTitulo`, `txtNombre`.
468
+ 3. **MAYUSCULAS para campos de BD**: `NOMBRE`, `DIRECCION`, `FECHA_CREACION`.
469
+ 4. **Prefijo `MAP_` para campos temporales**: `MAP_FILTRO`, `MAP_SELECCIONADO`.
470
+ 5. **Prefijo `frm` para frames**: `frmHeader`, `frmBody`, `frmCard`.
471
+ 6. **`##PREF##` en todas las consultas SQL**: Nunca hardcodear el nombre de tabla.
472
+ 7. **`visible="0"` para campos internos**: Campos de control que no se muestran.
473
+ 8. **`visible="7"` por defecto**: Para campos que deben verse en todos los contextos.
474
+ 9. **Un archivo `.xne` por coleccion**: Salvo `mappings.xne` (ver Tópico 01 - Estructura).
475
+ 10. **Comentarios XML explicativos**: Documentar cada sección importante.
476
+ 11. **Usar clases CSS en lugar de estilos inline**: Para reutilización (ver Tópico 04).
477
+ 12. **Event handlers con nombres descriptivos**: `guardar`, `buscar`, `irAlDetalle`.
478
+ 13. **`method="executenode()"` para lógica compleja**: No poner código extenso en `onclick`.
479
+ 14. **Porcentajes para anchos**: Mejor adaptacion a diferentes pantallas.
480
+ 15. **`height="-2"` para contenido dinámico**: Evita alturas fijas innecesarias.
481
+
482
+ ### 11.2 Top 10 anti-patrones a evitar
483
+
484
+ 1. **Inventar atributos XML**: Si no esta en la documentación, no existe. XOne los ignora silenciosamente.
485
+ 2. **Usar `px` como unidad**: XOne usa `p` (puntos) y `%`, no `px`, `em`, `rem`.
486
+ 3. **Mezclar `onclick` y `method`**: Usar uno u otro en el mismo prop, nunca ambos.
487
+ 4. **Poner lógica compleja en `onclick`**: Mejor usar `method="executenode(nombre)"` y un nodo aparte.
488
+ 5. **Olvidar `newline="false"`**: Los elementos son `newline="true"` por defecto. Si quieres columnas, debes especificarlo.
489
+ 6. **Exceso de anidamiento**: Más de 4-5 niveles de frames anidados degrada el rendimiento.
490
+ 7. **`loadall="true"` en tablas grandes**: Puede bloquear la aplicación al cargar miles de registros.
491
+ 8. **Contents sin prefijo `@`**: El content no se vincula correctamente al prop.
492
+ 9. **Combinar `special="true"` con consultas SQL**: Son mutuamente excluyentes.
493
+ 10. **Usar CSS web estándar**: XOne tiene su propio CSS propietario. Ver Tópico 04.
494
+ 11. **Usar APIs del DOM**: XOne no es HTML y no tiene navegador. Las funciones `document`, `document.getElementById`, `document.querySelector`, `window`, `localStorage`, `sessionStorage`, `XMLHttpRequest`, `navigator`, `history` NO existen en XOne. Para HTTP idiomático usar `$http`; para navegación `ui.*`; para datos `self.*` y `appData.*`. (SÍ existen, vía implementación custom: `fetch`, `Promise` ES2024, `setTimeout`/`setInterval`, `URL`, `Headers`, `AbortController`, `EventTarget`, `console`, `performance.now()`.)
495
+ 12. **Repetir nombres de nodos dentro de la misma coleccion**: Ver sección 11.4 abajo — es una restricción crítica de la plataforma.
496
+ 13. **Crear un evento como nodo XML cuando es atributo**: Los eventos de control (`onclick`, `ontextchanged`, `onfocuschanged`, `oneditoraction`, `onlongpress`, `onlongpressitem`, `onscroll`, `onconsolemessage`, `oncodescanned`, `ondateselected`, `onpageselected`, `ondraweropened`, `ondrawerclosed`, etc.) se declaran SIEMPRE como atributos del `<prop>`/`<frame>`/`<coll>` y su valor es JS inline. NO existen como nodos XML hijos: `<onconsolemessage>...</onconsolemessage>` o `<onclick>...</onclick>` son XML invalidos que XOne ignora silenciosamente. Excepción documentada: `onchange` admite ambas formas (ver §3.2 del Tópico 05) — es la unica. Los nodos hijos de `<coll>` que SI existen son eventos de objeto/coleccion (`<create>`, `<load>`, `<before-edit>`, `<after-edit>`, `<onback>`, `<onrefresh>`, `<login-ok>`, `<login-fail>`, etc.), no eventos de control.
497
+
498
+ ### 11.3 Checklist de validación XML
499
+
500
+ Antes de entregar código XML, verifica:
501
+
502
+ **Estructura general:**
503
+ - [ ] Declaración XML con encoding coherente (UTF-8 o iso-8859-15): `<?xml version="1.0" encoding="utf-8"?>`
504
+ - [ ] Nodo raiz `<coll>` con atributo `name`
505
+ - [ ] Al menos un `<group>` con `name` e `id`
506
+ - [ ] Todos los IDs de grupo son únicos
507
+ - [ ] No hay dos nodos del mismo tipo con el mismo `name` dentro de la misma `<coll>` (ver 11.4)
508
+ - [ ] No hay dos `<coll>` con el mismo `name` en el proyecto
509
+
510
+ **Nodo coll:**
511
+ - [ ] `name` en PascalCase
512
+ - [ ] Si tiene datos: `sql`, `objname`, `updateobj` definidos
513
+ - [ ] Si es pantalla: `special="true"` y sin `sql`
514
+ - [ ] SQL usa `##PREF##`
515
+ - [ ] `notab="true"` si solo hay un grupo visible
516
+
517
+ **Nodos prop:**
518
+ - [ ] Todos tienen `name` y `type`
519
+ - [ ] `type` es un valor valido de la tabla de tipos
520
+ - [ ] `visible` usa el bitmask correcto (0-7)
521
+ - [ ] Los botones usan `method` O `onclick`, no ambos
522
+ - [ ] Los combos tienen `mapcol`/`mapfld` en el prop oculto y `linkedto`/`linkedfield` en el visible
523
+ - [ ] Los `type="Z"` tienen un `<contents>` correspondiente
524
+
525
+ **Nodos frame:**
526
+ - [ ] Todos tienen `name`
527
+ - [ ] Los frames horizontales usan `newline="false"`
528
+ - [ ] Las dimensiones usan `p` o `%`, nunca `px`
529
+ - [ ] Los frames flotantes tienen `floating="true"` con `top`/`left`
530
+
531
+ **Event handlers:**
532
+ - [ ] `<create>`, `<load>`, `<onback>` son hijos de `<coll>`
533
+ - [ ] Los nodos custom tienen la estructura: `<action name="runscript"><script>...</script></action>`
534
+ - [ ] Los parámetros se declaran con `<param name="..." />`
535
+ - [ ] Las condiciones XML usan `&gt;` para `>` y `&lt;` para `<`
536
+
537
+ **Contents:**
538
+ - [ ] Los `<contents>` tienen `name` (con `@`) y `src`
539
+ - [ ] Los filtros usan `##FLD_CAMPO##` para valores dinámicos
540
+ - [ ] Cada content esta vinculado a un `<prop type="Z">`
541
+ - [ ] Todos los nodos con `name` tienen nombres únicos en su ambito (ver 11.4)
542
+
543
+ ### 11.4 Restricción crítica: unicidad de nombres de nodos
544
+
545
+ **Esta es una restricción de la plataforma XOne, no una sugerencia.**
546
+
547
+ Dentro de una `<coll>`, todos los nodos que tengan atributo `name` deben tener nombres únicos. **El ambito de unicidad es la `<coll>` ENTERA**, no el `<group>` o `<frame>` que contiene al nodo: dos elementos del mismo tipo no pueden tener el mismo `name` en ningun lugar de la misma coll, **ni siquiera si están en `<group>` o `<frame>` distintos**.
548
+
549
+ Casos prohibidos:
550
+
551
+ - **Dos `<group>` con el mismo `name`** dentro de la misma `<coll>` — prohibido
552
+ - **Dos `<frame>` con el mismo `name`** dentro de la misma `<coll>` — prohibido (incluso aunque estén en `<group>` distintos)
553
+ - **Dos `<prop>` con el mismo `name`** dentro de la misma `<coll>` — prohibido (incluso aunque estén en `<group>` o `<frame>` distintos)
554
+ - **Dos eventos del mismo tipo** (ej. dos `<before-edit>`) dentro de la misma `<coll>` — prohibido
555
+ - **Dos `<coll>` con el mismo `name`** en el mismo proyecto — prohibido
556
+
557
+ **Razón técnica:** el `name` de cada nodo se publica a nivel de la propia `<coll>` (los `collprops`), por lo que actuaria como identificador único ambiguo si se repitiera. La unicidad se evalua sobre la coll completa, no sobre el padre inmediato.
558
+
559
+ **Lo que SI es valido:** dos `<coll>` distintas (distinto `name`) con el contenido exactamente igual — incluso con los mismos `name` internos de prop/group/frame. Cada coll es un ambito independiente. La unicidad aplica al nombre del nodo dentro de su coll, no al contenido en si.
560
+
561
+ ```xml
562
+ <!-- INCORRECTO: dos group con el mismo name -->
563
+ <coll name="MiPantalla" special="true">
564
+ <group name="grpPrincipal" id="1">...</group>
565
+ <group name="grpPrincipal" id="2">...</group> <!-- ERROR: nombre duplicado -->
566
+ </coll>
567
+
568
+ <!-- INCORRECTO: dos prop con el mismo name -->
569
+ <group name="grpDatos" id="1">
570
+ <prop name="NOMBRE" type="T" visible="7"/>
571
+ <prop name="NOMBRE" type="L" visible="2"/> <!-- ERROR: nombre duplicado -->
572
+ </group>
573
+
574
+ <!-- INCORRECTO: dos before-edit en la misma coll -->
575
+ <coll name="MiPantalla" special="true">
576
+ <before-edit>...</before-edit>
577
+ <before-edit>...</before-edit> <!-- ERROR: evento duplicado -->
578
+ </coll>
579
+
580
+ <!-- CORRECTO: nombres distintos en todos los nodos -->
581
+ <coll name="MiPantalla" special="true">
582
+ <before-edit>...</before-edit>
583
+ <group name="grpPrincipal" id="1">
584
+ <frame name="frmHeader" width="100%" height="100p"/>
585
+ <frame name="frmBody" width="100%" height="-2"/> <!-- nombres distintos -->
586
+ <prop name="MAP_TITULO" type="L" visible="7"/>
587
+ <prop name="MAP_SUBTITULO" type="L" visible="7"/> <!-- nombres distintos -->
588
+ </group>
589
+ <group name="grpSecundario" id="2">...</group> <!-- nombre distinto -->
590
+ </coll>
591
+
592
+ <!-- CORRECTO: dos coll distintas con contenido identico -->
593
+ <coll name="ColeccionA" progid="ASData.CASBasicDataObj" ...>
594
+ <group name="General" id="1">
595
+ <prop name="NOMBRE" type="T" visible="7"/>
596
+ </group>
597
+ </coll>
598
+ <coll name="ColeccionB" progid="ASData.CASBasicDataObj" ...> <!-- distinto name: valido -->
599
+ <group name="General" id="1">
600
+ <prop name="NOMBRE" type="T" visible="7"/>
601
+ </group>
602
+ </coll>
603
+ ```
604
+
605
+ **Estrategia para evitar colisiones al generar código:** usa prefijos que incluyan el contexto funcional del elemento:
606
+
607
+ ```xml
608
+ <!-- En lugar de nombres genericos reutilizables en varias pantallas: -->
609
+ <frame name="frmContenido"> <!-- RIESGO de colision si otro grupo tiene el mismo nombre -->
610
+
611
+ <!-- Usa nombres especificos que describan su funcion: -->
612
+ <frame name="frmClienteHeader">
613
+ <frame name="frmClienteBody">
614
+ <frame name="frmClienteFooter">
615
+ ```
616
+
617
+ > **Referencia cruzada**: Para más información sobre estructura de proyecto consulta el Tópico 01 - Estructura del Proyecto. Para estilos CSS, consulta el Tópico 04 - CSS. Para la API JavaScript, consulta el Tópico 03 - JavaScript. Para crear un proyecto desde cero, consulta el Tópico 01 - Fundamentos.
618
+