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,556 @@
1
+ # XOne JavaScript — Métodos que expone cada control
2
+
3
+ > Fuente: `xone/v2/xone-help-docs/topics/03f-js-controles-metodos.md` §Cómo se accede a un control–§8. Referencia de la skill; el índice está en [../../SKILL.md](../../SKILL.md).
4
+
5
+ Contenido: cómo se accede a un control · §1 campos de entrada y visualización · §2 controles numéricos con viewmode · §3 multimedia y especiales (webview, vídeo, cámara, dibujo, pdf) · §4 listas y contenidos type=Z · §5 mapas · §6 gráficas · §7 realidad aumentada · §8 frames
6
+
7
+ ---
8
+
9
+ ## Cómo se accede a un control
10
+
11
+ Un control se obtiene **por el nombre de su `<prop>`**, sobre la ventana de edición:
12
+
13
+ ```javascript
14
+ let window = ui.getView(self); // ventana del objeto actual (o ui.getView() = ventana activa)
15
+ let control = window["MAP_MI_PROP"];
16
+
17
+ // Equivalente, función global nativa (recomendada):
18
+ let control = getControl("MAP_MI_PROP");
19
+ // getControl(name, dataObject) → resuelve el control en la ventana de ese dataObject
20
+ ```
21
+
22
+ Luego se invoca el método correspondiente:
23
+
24
+ ```javascript
25
+ getControl("MAP_FOTO").setImage("logo.png");
26
+ getControl("MAP_LISTA").addItem(nuevoObjeto, 0);
27
+ ```
28
+
29
+ **Reglas y notas:**
30
+
31
+ - El conjunto de métodos depende del **tipo de control** con el que se declaró la `<prop>` (`type`, `viewmode` o `classid`). Los tienes agrupados por control más abajo.
32
+ - **Casi todos** los controles exponen además `getWidthPixels()` y `getHeightPixels()` (tamaño real en píxeles). Para no repetirlos, **se omiten** en las tablas; asume que están salvo que se indique lo contrario.
33
+ - Para **refrescar** un control o su valor desde fuera, usa `ui.refresh(...)` / `ui.refreshValue(...)` o la ventana (`window.refresh(...)`), descrito en §3.3. Esta página documenta la API **propia** de cada control.
34
+ - Convención de firmas en este documento: `[parametro]` = parámetro **opcional**; `...lista` = admite varios.
35
+
36
+ ---
37
+
38
+ ## 1. Campos de entrada y visualización
39
+
40
+ ### Texto / número / contraseña (`type="T"`, `"N"`, `"X"`, `"TN"`, `"THTML"`…)
41
+
42
+ | Método | Qué hace |
43
+ |---|---|
44
+ | `setText(texto)` | Fija el texto del campo. |
45
+ | `getText()` | Devuelve el texto actual (cadena vacía si no hay vista). |
46
+ | `setHint(texto)` | Fija el hint/placeholder. |
47
+ | `setTextForecolor(color)` | Color del texto (string `"#RRGGBB"` o número). |
48
+ | `setBackgroundColor(color)` | Color de fondo (string parseable por color). |
49
+ | `setBorder(obj)` | Aplica borde desde un objeto: `{color, colorFocus, width, cornerRadius, textBorder, textBorderTop/Bottom/Left/Right}`. |
50
+ | `setInputType(tipo)` | Cambia el tipo de entrada (admite `"password"`). |
51
+ | `getInputType()` | Devuelve el tipo de entrada (`"password"` si lo es). |
52
+ | `setAutocompleteSuggestions(...sugerencias)` | Refresca la lista de sugerencias de autocompletado. |
53
+ | `requestFocus()` | Pide el foco para el campo (devuelve si lo obtuvo). |
54
+ | `startChronometer([obj])` | Arranca un cronómetro sobre el campo. `obj`: `{fromDate, toDate, dateFormat (def. "mm:ss"), reverse}`. |
55
+ | `stopChronometer()` | Detiene el cronómetro. |
56
+ | `pauseChronometer()` / `resumeChronometer()` | Pausa / reanuda el cronómetro. |
57
+
58
+ ### Edición vinculada inline y adjunto (`linked-to`+`linked-field` con `showinline="true"`; `type="AT"`)
59
+
60
+ Subconjunto del campo de texto:
61
+
62
+ | Método | Qué hace |
63
+ |---|---|
64
+ | `setText(texto)` | Fija el texto. |
65
+ | `setTextForecolor(color)` | Color del texto. |
66
+ | `setHint(texto)` | Placeholder. |
67
+ | `setInputType(tipo)` / `getInputType()` | Cambia / devuelve el tipo de entrada. |
68
+
69
+ ### Selector de colección (`linked-to`+`linked-field`, sin inline) y spinner (`viewmode="spinner"`)
70
+
71
+ Solo exponen `getWidthPixels()` / `getHeightPixels()`. Se gobiernan por su valor y eventos.
72
+
73
+ ### Etiqueta (`type="L"` / `"TL"`)
74
+
75
+ Solo `getWidthPixels()` / `getHeightPixels()`.
76
+
77
+ ### Botón (`type="B"`)
78
+
79
+ Todos devuelven el propio botón (encadenables):
80
+
81
+ | Método | Qué hace |
82
+ |---|---|
83
+ | `click()` | Dispara el click del botón por código. |
84
+ | `setText(texto)` | Fija el texto del botón. |
85
+ | `setTextForecolor(color)` | Color del texto (string o número). |
86
+ | `setButtonEnabled(bool)` | Habilita/deshabilita el botón. |
87
+ | `setBadge(obj)` | Muestra/configura un badge: `{visible, value, align, textColor, backgroundColor, maxCharacters}`. |
88
+
89
+ ### Checkbox (`type="NC"`)
90
+
91
+ | Método | Qué hace |
92
+ |---|---|
93
+ | `setChecked(bool)` | Marca/desmarca el control. |
94
+ | `setText(texto)` | Fija la etiqueta. |
95
+ | `setTextForecolor(color)` | Color de la etiqueta. |
96
+
97
+ ### Fecha / hora (`type="D"`, `"DT"`, `"TT"`)
98
+
99
+ | Método | Qué hace |
100
+ |---|---|
101
+ | `startChronometer([obj])` | Cronómetro. `obj`: `{fromDate, toDate, dateFormat, reverse}`. |
102
+ | `stopChronometer()` / `pauseChronometer()` / `resumeChronometer()` | Control del cronómetro. |
103
+
104
+ ### Imagen (`type="IMG"`)
105
+
106
+ **Imagen normal** (solo lectura, sin zoom):
107
+
108
+ | Método | Qué hace |
109
+ |---|---|
110
+ | `setImage(ruta)` | Carga y muestra una imagen (busca en los directorios de la app). |
111
+ | `clearImage()` | Limpia la imagen/fondo. |
112
+ | `playAnimation([obj])` | Reproduce una animación Lottie. `obj`: `{reverse, speed, repeatCount, repeatMode, fromFrame, toFrame}`. |
113
+ | `pauseAnimation()` / `resumeAnimation()` / `stopAnimation()` | Control de la animación Lottie. `stopAnimation()` además rebobina al primer frame. |
114
+ | `setAnimationFrame(frame)` | Posiciona la animación en un frame. |
115
+ | `getMaxFrameCount()` | Frame final de la composición Lottie (0 si no hay). |
116
+
117
+ Detalles de `playAnimation(obj)`, que conviene tener claros porque la animación **ya se está reproduciendo sola en bucle infinito** desde que se pinta el control:
118
+
119
+ | Clave | Default | Notas |
120
+ |---|---|---|
121
+ | `reverse` | `false` | Reproduce hacia atrás. |
122
+ | `speed` | `1` | Multiplicador. Debe ser **positivo**: `0` o negativo lanzan error. |
123
+ | `repeatCount` | `0` | `0` = **una sola pasada**, así que llamar a `playAnimation({...})` corta el bucle infinito con el que arrancó. Para mantenerlo, `repeatCount: -1`. |
124
+ | `repeatMode` | `"restart"` | `"restart"` o `"reverse"` (ida y vuelta). |
125
+ | `fromFrame` / `toFrame` | `0` | `0` en `toFrame` significa "hasta el final". |
126
+
127
+ ```javascript
128
+ // Reproducir una vez, al doble de velocidad
129
+ getControl("MAP_LOADER").playAnimation({ speed: 2 });
130
+
131
+ // Volver a dejarla en bucle infinito, ida y vuelta
132
+ getControl("MAP_LOADER").playAnimation({ repeatCount: -1, repeatMode: "reverse" });
133
+
134
+ // Reproducir solo un tramo (por ejemplo el "tick" final de un check animado)
135
+ getControl("MAP_CHECK").playAnimation({ fromFrame: 30, toFrame: 60 });
136
+ ```
137
+
138
+ Sin argumentos, `playAnimation()` reproduce una pasada con la velocidad que ya tenga la animación.
139
+
140
+ **Imagen con zoom** (`zoom="true"`): `setImage(ruta)`, `clearImage()`.
141
+
142
+ **Captura de firma** (imagen con `readonly="false"`): `setImage(ruta)` (fondo), `clearImage()` (borra la firma).
143
+
144
+ ### Foto (`type="PH"`)
145
+
146
+ Solo `getWidthPixels()` / `getHeightPixels()`.
147
+
148
+ ### Objeto de datos embebido (`type="O"`)
149
+
150
+ Incrusta otra ficha dentro de la actual:
151
+
152
+ | Método | Qué hace |
153
+ |---|---|
154
+ | `showGroup(id [, ...])` | Muestra/navega a un grupo (pestaña) por su ID. |
155
+ | `getCurrentGroup()` | ID del grupo visible. |
156
+ | `refresh(...props)` | Refresca propiedades del objeto incrustado. |
157
+ | `refreshContentSelectedRow(content)` | Refresca la fila seleccionada de un content interno. |
158
+ | `refreshContentRow(content, indice)` | Refresca una fila concreta de un content interno. |
159
+ | `getParentObject()` | Objeto de datos contenedor. |
160
+ | `getParentView()` | Vista/pantalla contenedora. |
161
+
162
+ ---
163
+
164
+ ## 2. Controles numéricos con `viewmode`
165
+
166
+ Se declaran sobre `type="T"`/`"N"` con el `viewmode` indicado.
167
+
168
+ ### Slider (`viewmode="slider"`, `"rounded-slider"`, `"range-slider"`, `"rating-bar"`)
169
+
170
+ | Método | Qué hace |
171
+ |---|---|
172
+ | `setMax(valor)` | Fija el valor máximo del slider. |
173
+
174
+ ### Barra de progreso (`viewmode="progress-bar"` / `"circular-progress-bar"`)
175
+
176
+ | Método | Qué hace |
177
+ |---|---|
178
+ | `setValue(valor)` | Fija el progreso actual (animado). |
179
+ | `isIndeterminate()` | Indica si está en modo indeterminado. |
180
+ | `setIndeterminate(bool)` | Activa/desactiva el modo indeterminado. |
181
+ | `toggleIndeterminate()` | Alterna el modo indeterminado. |
182
+
183
+ ### Stepper (`viewmode="stepper"`)
184
+
185
+ | Método | Qué hace |
186
+ |---|---|
187
+ | `getValue()` | Valor actual. |
188
+ | `setValue(n)` | Fija el valor (acotado a `[min, max]`). |
189
+ | `setMin(n)` / `setMax(n)` | Fija el mínimo / máximo. |
190
+ | `setStepSize(n)` | Incremento por pulsación (debe ser > 0). |
191
+
192
+ ### OTP (`viewmode="otp"`)
193
+
194
+ | Método | Qué hace |
195
+ |---|---|
196
+ | `getOtpValue()` | Código combinado de todas las cajas. |
197
+ | `clearOtp()` | Limpia las cajas y enfoca la primera. |
198
+ | `focusOtp()` | Enfoca la primera caja vacía. |
199
+
200
+ ### Barra de navegación (`viewmode="navbar"`)
201
+
202
+ | Método | Qué hace |
203
+ |---|---|
204
+ | `getValue()` | Índice del ítem (pill) seleccionado. |
205
+ | `setValue(n)` | Selecciona el ítem `n` (anima y persiste). |
206
+ | `getItemCount()` | Número de ítems. |
207
+
208
+ ---
209
+
210
+ ## 3. Multimedia y especiales
211
+
212
+ ### WebView (`type="WEB"`)
213
+
214
+ | Método | Qué hace |
215
+ |---|---|
216
+ | `load(urlOrHtml)` | Carga una URL o HTML directo. |
217
+ | `loadFile(ruta)` | Carga un fichero local (HTML, o `.js` inyectado). |
218
+ | `reload()` | Recarga la página. |
219
+ | `lockReload()` / `unlockReload()` | Bloquea / desbloquea la recarga. |
220
+ | `stopLoading()` | Detiene la carga en curso. |
221
+ | `clearCache()` / `clearNavigationHistory()` | Limpia caché / historial. |
222
+ | `canGoBack()` / `canGoForward()` | Indica si hay página previa / siguiente. |
223
+ | `canGoBackOrForward(pasos)` | Si se puede ir N pasos atrás/adelante. |
224
+ | `goBack([pasos])` / `goForward([pasos])` | Navega N pasos (def. 1). |
225
+ | `getUrl()` / `getTitle()` / `getProgress()` | URL / título / progreso (0-100). |
226
+ | `getHistory()` / `getCurrentHistoryIndex()` | Array de URLs del historial / índice actual. |
227
+ | `getFavicon([nombre])` | Guarda el favicon a PNG y devuelve su ruta. |
228
+ | `zoomIn()` / `zoomOut()` / `zoomBy(factor)` | Zoom. |
229
+ | `pageUp([alTope])` / `pageDown([alFinal])` | Desplaza la página. |
230
+ | `saveCapture([nombre])` | Guarda una captura PNG del WebView. |
231
+ | `runScript(js)` | Ejecuta JavaScript en la página. |
232
+ | `setUserAgent(ua)` | Fija el User-Agent. |
233
+ | `setOnPageLoadedCallback(fn)` | Registra el callback `onpageloaded`. |
234
+ | `setOnClientCertificateRequest(fn)` / `clearClientCertificates()` | Certificado cliente. |
235
+ | `addPrintJob([nombre])` / `getPrintJobStatus(nombre)` / `restartPrintJob(nombre)` | Impresión de la página. |
236
+
237
+ ### Vídeo (`type="VD"`)
238
+
239
+ | Método | Qué hace |
240
+ |---|---|
241
+ | `start()` / `stop()` / `pause()` / `resume()` | Control de reproducción. |
242
+ | `seek(ms)` | Salta a una posición (milisegundos). |
243
+ | `isPlaying()` | Si se está reproduciendo. |
244
+ | `getDuration()` / `getCurrentPosition()` | Duración / posición actual (ms). |
245
+ | `suspend()` | Suspende el reproductor (libera recursos). |
246
+ | `enterPipMode()` | Entra en Picture-in-Picture. |
247
+
248
+ ### Cámara (`type="VD"` con `viewmode="camerapreview"`, o `classid="vaxtorocr"`)
249
+
250
+ | Método | Qué hace |
251
+ |---|---|
252
+ | `startPreview()` / `stopPreview()` | Arranca / detiene la previsualización. |
253
+ | `takePicture([obj])` | Toma una foto. `obj`: `{filename, onFinished, width, height}`. |
254
+ | `record([obj])` | Graba vídeo. `obj`: `{file, quality, maxDuration, maxFileSize, withMicAudio, onFinished}`. |
255
+ | `stopRecording()` / `isRecording()` | Detiene / consulta la grabación. |
256
+ | `setCamera("front"\|"back")` / `toggleCamera()` / `getCamera()` | Selección de cámara. |
257
+ | `isOpen()` | Si la cámara está abierta. |
258
+ | `setFlashMode(modo)` / `getFlashMode()` | Flash (`on`/`off`/`auto`/`torch`). |
259
+ | `setZoom(0-100)` / `getMaxZoom()` | Zoom. |
260
+ | `setExposureCompensation(0-100)` | Compensación de exposición. |
261
+ | `isAutoFocus()` / `setAutoFocusArea(x, y)` | Enfoque. |
262
+ | `getSupportedAspectRatios()` / `getSupportedVideoProfiles()` / `isVideoProfileSupported(perfil)` | Capacidades. |
263
+ | `setOnCodeScanned(fn)` / `setOnRawCodeScanned(fn)` | Callbacks de escaneo de códigos. |
264
+ | `setUseMlKit(bool)` | Usa ML Kit para escanear. |
265
+ | `getScannedCodes()` / `clearScannedCodes()` | Códigos escaneados. |
266
+ | `setOnLicensePlateScanned(fn)` | Callback de OCR de matrículas (Vaxtor). |
267
+ | `loadMlModel(rutaOrObj)` / `setMlFilter(obj)` | Detección con modelo ML. `setMlFilter`: `{filterIndexes, minConfidence}`. |
268
+ | `getDniVds(buffer)` | Verifica un Sello Digital Visible (VDS) del DNI y devuelve sus campos. |
269
+
270
+ ### Dibujo (`type="DR"`)
271
+
272
+ **Versión 2** (`viewmode="v2"` o `version="v2"`) — completa:
273
+
274
+ | Método | Qué hace |
275
+ |---|---|
276
+ | `saveDrawing([nombre])` | Guarda el dibujo a fichero y persiste el valor. |
277
+ | `clearDrawing()` / `hasDrawing()` | Borra / consulta si hay trazos. |
278
+ | `undo()` / `redo()` | Deshacer / rehacer. |
279
+ | `setTool("brush"\|"eraser")` / `enableBrush()` / `enableEraser()` | Herramienta activa. |
280
+ | `setBrushColor(color)` / `setBrushSize(n)` / `getBrushSize()` | Pincel. |
281
+ | `setEraserSize(n)` / `getEraserSize()` | Borrador. |
282
+ | `setOpacity(0-100)` / `getOpacity()` | Opacidad. |
283
+ | `addText(textoOrObj)` | Añade texto. `obj`: `{text, textColor, textSize, font, gravity, background, editable}`. |
284
+ | `addImage(ruta)` / `addLine(obj)` | Añade imagen / línea (`{color, width}`). |
285
+ | `setFilterEffect(nombre)` | Aplica un filtro de imagen. |
286
+
287
+ **Versión 1** (`type="DR"` por defecto): solo `saveDrawing([nombre])`, `clearDrawing()`, `hasDrawing()`. Para pincel/borrador/texto/filtros usa la versión 2.
288
+
289
+ ### Visor PDF
290
+
291
+ **`viewmode="pdfview"`**: `loadPdf(ruta)` (encadenable), `getPageCount()`, `nextPage()`, `previousPage()`.
292
+
293
+ **`viewmode="pdfview2"`**: `loadPdf(ruta)`, `getPageCount()`, `setPage(n)`, `nextPage()`, `previousPage()`.
294
+
295
+ ### Skeleton (`classid="skeleton"`)
296
+
297
+ | Método | Qué hace |
298
+ |---|---|
299
+ | `show()` / `hide()` / `toggle()` | Muestra / oculta / alterna el shimmer. |
300
+ | `isShowing()` | Si está visible. |
301
+ | `setBaseColor(color)` / `setShimmerColor(color)` | Colores en runtime. |
302
+ | `setShimmerDuration(ms)` | Duración del ciclo del shimmer. |
303
+
304
+ ---
305
+
306
+ ## 4. Listas y contenidos (`type="Z"`)
307
+
308
+ ### Lista (`viewmode="recyclerview"` / `"wearable"`, o `type="Z"` sin `viewmode`)
309
+
310
+ | Método | Qué hace |
311
+ |---|---|
312
+ | `addItem(objeto [, indice])` | Inserta el objeto en la **colección de datos y** en la lista. Sin índice, al final; con índice, en esa posición (acotada al rango válido). Devuelve la vista de la fila insertada. |
313
+ | `addToDataset(objeto)` | Añade el objeto **solo a la lista visible** (no a la colección de datos). |
314
+ | `removeItem(objeto\|indice\|id)` | Quita el ítem de la **colección y** de la lista. |
315
+ | `removeFromDataset(objeto\|indice\|id)` | Quita el ítem **solo de la lista visible**. |
316
+ | `deleteItem(objeto\|indice\|id)` | Borra el ítem de la colección (baja real) y de la lista. |
317
+ | `setSelectedItem(indice)` / `clearSelectedItem()` | Marca / quita la selección. |
318
+ | `scrollTo(indice)` | Desplaza (suave) a la posición. |
319
+ | `scrollToTop()` / `scrollToBottom()` | Desplaza al primer / último ítem. |
320
+ | `scrollBy(x, y)` | Desplaza por (x, y) píxeles. |
321
+ | `getView(indice)` | Devuelve la vista de la fila en esa posición (si está visible). |
322
+
323
+ > **`addItem` vs `addToDataset`:** `addItem` toca el modelo de datos (la colección); `addToDataset` solo pinta en la lista. Análogamente `removeItem`/`deleteItem` (modelo + lista) frente a `removeFromDataset` (solo lista).
324
+
325
+ ### Slider de contenido (`viewmode="slideview"` / `"coverflow"`)
326
+
327
+ | Método | Qué hace |
328
+ |---|---|
329
+ | `addItem(objeto)` | Inserta en la colección y en el pager (al final). |
330
+ | `addToDataset(objeto)` | Añade solo al pager. |
331
+ | `setSelectedItem(indice)` | Selecciona y refresca la página. |
332
+ | `scrollTo(pagina)` | Desplaza el pager a la página (animado). |
333
+ | `getView(indice)` | Vista de la página indicada. |
334
+
335
+ ### Grid (`viewmode="gridview"`)
336
+
337
+ | Método | Qué hace |
338
+ |---|---|
339
+ | `addItem(objeto)` / `addToDataset(objeto)` | Inserta en colección+grid / solo grid. |
340
+ | `setSelectedItem(indice)` | Selecciona y refresca. |
341
+ | `getView(indice)` | Hijo en ese índice. |
342
+
343
+ ### Acordeón expandible (`viewmode="expanview"` / `"expandview"`)
344
+
345
+ | Método | Qué hace |
346
+ |---|---|
347
+ | `expand(grupo [, animar])` | Expande el grupo. |
348
+ | `collapse(grupo)` | Colapsa el grupo. |
349
+ | `refreshGroupView(grupo)` | Refresca la vista de un grupo. |
350
+ | `refreshChildView(grupo, hijo)` | Refresca la vista de un hijo. |
351
+
352
+ ### Expandible multinivel (`viewmode="multilevelexpanview"`)
353
+
354
+ Las rutas se indican con un índice por nivel del árbol:
355
+
356
+ | Método | Qué hace |
357
+ |---|---|
358
+ | `expand(...ruta)` | Expande el nodo de la ruta (admite también `{positions, reloadData}`). |
359
+ | `collapse(...ruta)` | Colapsa el nodo de la ruta. |
360
+ | `expandSelected([reload])` / `collapseSelected()` / `toggleSelected([reload])` | Sobre el nodo seleccionado. |
361
+ | `isSelectedItemExpanded()` | Si el nodo seleccionado está expandido. |
362
+ | `refreshItem(...ruta)` | Refresca el ítem de la ruta (acepta también un array de rutas). |
363
+ | `refreshAllItems()` | Refresca todos los ítems del árbol. |
364
+
365
+ ### Chips (`viewmode="chipsview"`)
366
+
367
+ | Método | Qué hace |
368
+ |---|---|
369
+ | `getCheckedValues()` | Chips marcados, como array de `{id, value}`. |
370
+
371
+ ### Calendario (`viewmode="calendarview"`)
372
+
373
+ | Método | Qué hace |
374
+ |---|---|
375
+ | `moveNext([n])` / `movePrevious([n])` | Avanza / retrocede N páginas; devuelve el mes resultante. |
376
+ | `getMode()` / `changeMode("day"\|"week"\|"month")` | Modo actual / cambio de modo. |
377
+ | `getMonth()` / `getPreviousMonth()` / `getNextMonth()` | Índices de mes (0-11). |
378
+ | `getStringMonth([idioma])` / `getStringPreviousMonth([idioma])` / `getStringNextMonth([idioma])` | Nombre localizado del mes. |
379
+
380
+ ### Otros contents
381
+
382
+ - **Picturemap** (`viewmode="picturemap"`) y **Kanban** (`viewmode="kanban"`): sin métodos de script propios; se manejan por interacción (toque / drag&drop) y configuración XML.
383
+
384
+ ---
385
+
386
+ ## 5. Mapas (`viewmode="mapview"`, `"maplibre"`, `"openstreetmap"`)
387
+
388
+ Los tres proveedores comparten una **API común de mapa** (interfaz única). Las firmas de abajo son las de **referencia** (Google Maps, el proveedor más completo). **No todos los proveedores implementan todos los métodos**; los no implementados no tienen efecto: MapLibre no implementa rutas/medidor/`setFollowUserLocation`/`removeMarker`. Cada proveedor añade además métodos propios (al final).
389
+
390
+ Muchos métodos aceptan un **objeto JS** con campos (`{campo: valor}`) o, en algunos casos, **argumentos sueltos**. `[campo]` = opcional.
391
+
392
+ ### Cámara y zoom (común)
393
+
394
+ | Firma | Qué hace |
395
+ |---|---|
396
+ | `setZoom(zoom)` | Anima la cámara al nivel de zoom (ignora `-1`). |
397
+ | `getZoom()` | Nivel de zoom actual. |
398
+ | `setMinZoom(n)` / `setMaxZoom(n)` | Fija el zoom mínimo / máximo (y reajusta si procede). |
399
+ | `resetMinMaxZoom()` | Quita los límites de zoom. |
400
+ | `moveTo(lat, lng)` | Mueve la cámara (sin cambiar el zoom). |
401
+ | `zoomTo(lat, lng, [nivel=14], [withMeters=false])` | Centra y hace zoom; `withMeters` interpreta el nivel como metros. |
402
+ | `zoomToBounds(...locations)` | Ajusta la cámara para abarcar todas las coordenadas. |
403
+ | `zoomToEncodeData(encode \| [encodes])` | Ajusta la cámara a uno o varios polylines codificados. |
404
+ | `restrictMapToBounds(...locations)` | Limita el desplazamiento de la cámara a esos límites. |
405
+ | `getMapBounds()` | Límites visibles (array de esquinas). |
406
+ | `getMapCenter()` | Centro visible `{latitude, longitude, altitude, accuracy, bearing, speed, time}`. |
407
+ | `setMapType(tipo)` / `getMapType()` | Tipo de mapa (`normal`/`satellite`/`hybrid`/`terrain`). |
408
+
409
+ ### Ubicación del usuario (común)
410
+
411
+ | Firma | Qué hace |
412
+ |---|---|
413
+ | `getUserLocation()` | Última ubicación `{latitude, longitude, altitude, speed, accuracy, bearing, time, provider}` o `null`. |
414
+ | `zoomToMyLocation([nivel=14], [withMeters=false])` | Centra/zoom en la ubicación; devuelve `{latitude, longitude}`. |
415
+ | `isUserLocationEnabled()` | Si la capa de ubicación está activa. |
416
+ | `enableUserLocation()` / `disableUserLocation()` | Activa / desactiva el punto azul de ubicación. |
417
+ | `setFollowUserLocation(bool)` | Seguimiento continuo de la ubicación. |
418
+
419
+ ### Marcadores (común)
420
+
421
+ | Firma | Qué hace |
422
+ |---|---|
423
+ | `addMarker({latitude, longitude, [title], [icon], [width], [height], [draggable], [persist], [visible], [alpha], [rotation], [flat], [anchor], [tag], [onClick]})` | Añade un marcador (`anchor`: `center`/`top`/`bottom`; `persist=true` para poder borrarlo luego; `width`/`height` redimensionan el icono); devuelve el marcador. |
424
+ | `addMarker(lat, lng)` | Variante posicional simple. |
425
+ | `addMarker([{...}, ...])` | Varios marcadores desde un array; devuelve array de marcadores. |
426
+ | `removeMarker(id \| marcador)` | Elimina un marcador persistido por su ID o su objeto. |
427
+
428
+ ### Dibujo: líneas, círculos, áreas, medidor (común)
429
+
430
+ | Firma | Qué hace |
431
+ |---|---|
432
+ | `drawLine({[line], strokeColor, [strokeWidth=5], [mode="normal"], data \| locations})` | Polilínea desde polyline codificado (`data`) o array `locations`; `mode`: `normal`/`dashed`/`dotted`/`mixed`. Variante posicional: `drawLine(line, strokeColor, mode, lat1, lng1, ...)`. |
433
+ | `drawCircle({location:{latitude,longitude}, [radius=0], [fillColor], [strokeColor], [strokeWidth=1], [pattern], [visible=true]})` | Círculo (radio en metros); devuelve el círculo. |
434
+ | `drawArea({data, [id], [color], [fillColor="#339966"], [pattern], [width=2], [onClick]})` | Polígono desde coordenadas (`data`); devuelve el id del área. `fillColor` es la clave preferida (`fillcolor` en minúsculas sigue aceptándose, obsoleta). |
435
+ | `drawEncode({data, [id], [color="#000000"], [pattern]})` | Polilínea desde polyline codificado; devuelve el id. |
436
+ | `drawEncodeArea({data, [id], [color], [fillColor="#339966"], [pattern], [width=2], [onClick]})` | Polígono desde polyline codificado; devuelve el id. |
437
+ | `clearLine(...ids)` / `clearAllLines()` | Borra líneas por id / todas. |
438
+ | `removePolylines(id)` / `clearAllPolylines()` | Borra polilíneas de `drawEncode`. |
439
+ | `removeArea(id)` / `clearAllAreas()` | Borra áreas. |
440
+ | `startDistanceMeter([{[latitude], [longitude], [startMarkerIcon], [endMarkerIcon]}])` / `stopDistanceMeter()` | Medidor de distancia con marcadores arrastrables (sin args usa el centro). |
441
+
442
+ ### Rutas (común)
443
+
444
+ | Firma | Qué hace |
445
+ |---|---|
446
+ | `drawRoute({[route], (waypoints \| sourceLatitude+sourceLongitude+destinationLatitude+destinationLongitude), [mode="driving"], [strokeColor="#0000FF"], [strokeWidth=5], [accurate=false], [linePattern]})` | Dibuja una ruta; `mode`: `driving`/`walking`/`bicycling`/`transit`. Variante posicional: `drawRoute(route, destLat, destLng, srcLat, srcLng, [mode], [strokeColor])`. |
447
+ | `routeTo({[source="internal"], destinationLatitude, destinationLongitude, [address], [mode="driving"], [waypoints]})` | Traza la ruta internamente o lanza app externa (`external`/`google_maps`/`osmand`/`osmand_plus`/`<packageName>`). |
448
+ | `clearRoute(...claves)` / `clearAllRoutes()` | Borra rutas por clave / todas. |
449
+
450
+ ### Capas: GeoJSON / KML / WMS (común)
451
+
452
+ | Firma | Qué hace |
453
+ |---|---|
454
+ | `addGeoJson({id, data \| dataFile, [strokeColor], [strokeWidth], [fillColor]}, ...)` | Añade capa(s) GeoJSON (`data`=objeto/JSON/string, `dataFile`=fichero); estiliza sus polígonos/líneas. Los atributos no declarados conservan el estilo por defecto del motor. |
455
+ | `removeGeoJson(id \| [ids])` / `removeAllGeoJson()` / `getGeoJsonLayerIds()` | Gestión de capas GeoJSON. |
456
+ | `addKml({id, data \| dataFile}, ...)` | Añade capa(s) KML (`data`=string KML, `dataFile`=fichero). |
457
+ | `removeKml(id \| [ids])` / `removeAllKml()` / `getKmlLayerIds()` | Gestión de capas KML. |
458
+ | `addWmsTileOverlay({[name], urlDomain, [version], [request], [cqlFilter], [layers], [boundingBox], [format], [width], [height], [transparent=true], [debug=false]})` | Añade una capa de teselas WMS (reemplaza la anterior); devuelve el mapa. |
459
+ | `removeWmsTileOverlay(clearTileCache)` | Quita la capa WMS (`clearTileCache` vacía la caché). |
460
+ | `clearMap()` | Borra rutas, líneas, áreas, polilíneas, GeoJSON y KML (no los POIs). |
461
+
462
+ ### POIs y utilidades (común)
463
+
464
+ | Firma | Qué hace |
465
+ |---|---|
466
+ | `showPoisMenu()` / `hidePoisMenu()` / `togglePoisMenu()` | Cajón lateral de POIs. |
467
+ | `getContentCollection()` | Colección de datos que alimenta los POIs. |
468
+ | `captureImage([nombre])` | Snapshot del mapa a PNG; devuelve el nombre de fichero. |
469
+
470
+ ### Solo Google Maps (`mapview`)
471
+
472
+ | Firma | Qué hace |
473
+ |---|---|
474
+ | `addClusteredMarker({clusterId, latitude, longitude, [clusterIcon], [icon], [title], [snippet], [itemCounter], [tag], [textSize=14], [textColor], [onClick], [onClusterClick]})` | Marcador agrupable en un cluster (acepta también un array). |
475
+ | `getClusterManager(clusterId)` | Gestor del cluster indicado. |
476
+ | `encodePolyline()` | Codifica como polyline las posiciones de todos los POIs. |
477
+ | `showStreetView(location, [radius=0])` / `removeStreetView()` | Muestra / cierra Street View. |
478
+ | `showMap()` | (Re)inicializa y muestra el mapa. |
479
+ | `setMapStyle(styleJsonOrFile)` | Aplica un estilo JSON de Google (en línea o nombre de fichero de la app); vacío/nulo restablece el estilo por defecto. |
480
+ | `setTrafficEnabled(bool)` | Activa/desactiva la capa de tráfico. |
481
+ | `setMapPadding(left, top, right, bottom)` | Padding del mapa en píxeles (reserva espacio para controles superpuestos). |
482
+
483
+ > En Google Maps, `addGeoJson` estiliza **polígonos, líneas y puntos** (no solo polígonos):
484
+ > - **Genéricos** (todas las geometrías): `strokeColor`, `strokeWidth`, `strokePattern` (`dashed`/`dotted`/`mixed`), `zIndex`, `visible`, `clickable`.
485
+ > - **Override por tipo** (prevalece sobre el genérico): `polygon*` y `line*` — p. ej. `polygonStrokeWidth`, `lineStrokeWidth`, `lineStrokeColor` — más `pointZIndex`/`pointVisible`.
486
+ > - **Solo polígono**: `fillColor`, `strokeJointType`, `geodesic`.
487
+ > - **Solo punto**: `icon` (+`iconWidth`/`iconHeight`), `alpha`, `rotation`, `draggable`, `title`, `snippet`, `anchorU`/`anchorV`.
488
+
489
+ ### Solo MapLibre (`maplibre`)
490
+
491
+ | Firma | Qué hace |
492
+ |---|---|
493
+ | `loadStyle(style)` | Cambia el estilo (URL, `"default"` o ruta a JSON). |
494
+ | `getFeatures({location \| locationScreenRect \| locationScreenPoint, [distanceMeters], [layerIds], [uniqueKey]})` | Features renderizadas en un punto/rect/coordenada; devuelve `{id, type, ...bounds..., properties}`. |
495
+ | `selectFeature({location, layerIdBeginsWith, [filterKey], [filterValue], [distanceMeters], [lineWidth], [opacity], [minZoom], [maxZoom], [animate]})` | Resalta features bajo una ubicación, filtradas por `filterKey`/`filterValue`. |
496
+ | `getLayerIds([{onlyVisibleLayers}])` | IDs de capas del estilo. |
497
+ | `setLayerVisible(id, visible)` / `toggleLayerVisibility(id)` / `isLayerVisible(id)` | Visibilidad de capa(s) (`id` String o array). |
498
+ | `addSource({sourceId, [databaseFile], [url], [tileSize=256]})` / `removeSource(id)` | Fuente MBTiles/DB local (vector) o raster por URL. |
499
+ | `addLayer({layerId, sourceId, type})` / `removeLayer(id)` | Capa `raster`/`background` sobre una fuente. |
500
+ | `startDrawSelection({onAreaSelected, [shape], [lineColor], [fillColor], [lineSize], [oneShot]})` / `cancelDrawSelection()` | Dibujo interactivo de selección (`shape`: `rectangle`/`circle`); llama a `onAreaSelected(xIni, yIni, x, y, metros)`. |
501
+
502
+ ### Solo OpenStreetMap (`openstreetmap`)
503
+
504
+ | Firma | Qué hace |
505
+ |---|---|
506
+ | `downloadTiles({coordinates, [onCompleted], [onProgressUpdated], [onDownloadStarted]})` | Descarga/cachea tiles offline del área entre el zoom min/max; devuelve un Future. |
507
+ | `showMinimap()` / `hideMinimap()` | Minimapa en miniatura. |
508
+ | `showScale()` / `hideScale()` | Barra de escala. |
509
+ | `showCompass()` / `hideCompass()` / `toggleCompass()` | Brújula. |
510
+ | `enableRotation()` / `disableRotation()` | Gesto de rotación del mapa. |
511
+
512
+ > En OSM, `drawRoute` admite además `urlType` (`default`/`osrm`/`osm2po`) y `url`; `addMarker` admite `anchor`, `persist`, `alpha`, `rotation`.
513
+
514
+ ---
515
+
516
+ ## 6. Gráficas (`classid="xonecharts"`)
517
+
518
+ Las gráficas se configuran por XML/datos y exponen principalmente `getWidthPixels()` / `getHeightPixels()`. Las gráficas de **barras** añaden:
519
+
520
+ | Método | Qué hace |
521
+ |---|---|
522
+ | `load(config)` | Carga manualmente el dataset desde un objeto JS (`{title, categories, data, ...}`). |
523
+
524
+ ---
525
+
526
+ ## 7. Realidad Aumentada (`viewmode="arview"`)
527
+
528
+ | Método | Qué hace |
529
+ |---|---|
530
+ | `isArCompatible()` | Comprueba compatibilidad AR del dispositivo. |
531
+ | `showViewFinder()` / `hideViewFinder()` | Muestra / oculta el viewfinder. |
532
+ | `setOnPlaneTappedListener(fn)` | Callback al tocar un plano detectado. |
533
+ | `loadObject(obj)` | Carga un modelo 3D (clave + fichero en `models/` o URL). |
534
+ | `isObjectLoaded(clave)` | Si el modelo está cargado. |
535
+ | `addObject(obj)` | Coloca un modelo cargado donde se tocó (`{model, onPlaneTappedObject, minScale, maxScale}`). |
536
+ | `takePicture(obj)` | Captura una foto de la escena (`{filename, width, height, onFinished}`). |
537
+
538
+ ---
539
+
540
+ ## 8. Frames (contenedores)
541
+
542
+ Un `<frame>` también se obtiene por su nombre y permite desplazarlo:
543
+
544
+ ```javascript
545
+ let frame = ui.getView(self)["frmScroll"];
546
+ frame.scrollToTop(true); // true = animado
547
+ frame.scrollToBottom(true);
548
+ ```
549
+
550
+ Más utilidades de frames/grupos (`refreshAll`, `showGroup`, drawers, bottom-sheet) en §3.3.
551
+
552
+ > **Frontera de capa.** Todo lo de este fichero es API de XOne. Además de esto, la **vista
553
+ > nativa** de Android/iOS que hay bajo el frame o el control expone métodos propios —`setBlur`,
554
+ > `setSaturation`—, que no son de XOne y no tienen contrato de compatibilidad. Viven en
555
+ > [métodos nativos de la vista](metodos-nativos-de-la-vista.md).
556
+
@@ -0,0 +1,114 @@
1
+ # XOne JavaScript — Métodos nativos de la vista (Android/iOS)
2
+
3
+ Contenido: el mecanismo · qué garantías hay · regla de admisión · tabla de métodos · cómo se envuelve
4
+
5
+ ---
6
+
7
+ ## El mecanismo
8
+
9
+ `ui.getView(self)` devuelve la **ventana** del objeto actual. Indexarla por nombre devuelve un
10
+ frame o un control, igual que `getControl`:
11
+
12
+ ```javascript
13
+ let window = ui.getView(self); // ventana
14
+ let frame = window["mi_frame"]; // frame
15
+ let ctrl = window["MAP_MI_PROP"]; // control (equivale a getControl("MAP_MI_PROP"))
16
+ ```
17
+
18
+ Esos tres objetos son **envoltorios sobre la vista nativa** de la plataforma: `View` en Android,
19
+ `UIView` en iOS. Los métodos de esta página actúan sobre esa vista, y por eso valen igual para
20
+ un frame que para un control: lo que hay debajo es una vista en ambos casos.
21
+
22
+ La API que XOne garantiza por cada **tipo** de control —campos, listas, mapas, cámara…— es otra
23
+ cosa, y vive en [métodos de los controles](metodos-de-los-controles.md).
24
+
25
+ ## Qué garantías hay
26
+
27
+ Cada método se implementa sobre la vista nativa de cada plataforma, así que **la disponibilidad
28
+ y el comportamiento se confirman por plataforma, no en general**. La columna «Confirmado en» es
29
+ la que manda, y hay casos que además exigen una versión mínima del sistema — `setBlur` y
30
+ `setSaturation` necesitan **iOS 17+**.
31
+
32
+ Que un método funcione en una plataforma no implica que exista en la otra. Lo que no aparece en
33
+ la tabla no está confirmado en ninguna.
34
+
35
+ ## Regla de admisión
36
+
37
+ > **Una entrada entra en la tabla solo si se ha confirmado funcionando, anotando en qué
38
+ > plataforma. Lo no confirmado no se escribe.**
39
+
40
+ No es burocracia: si esta página se llena de métodos plausibles pero no comprobados, deja de
41
+ valer para nada. Una lista corta y cierta es útil; una larga y verosímil es un pasivo.
42
+
43
+ Esta página **no enumera la API de vistas de Android ni de iOS**. Esa lista no pertenece a este
44
+ repositorio.
45
+
46
+ ## Métodos
47
+
48
+ | Método | Qué hace | Confirmado en |
49
+ |---|---|---|
50
+ | `setBlur(radius)` | Desenfoque. `0` = sin efecto; mayor, más desenfoque | Android · **iOS 17+** |
51
+ | `setSaturation(value)` | Saturación. `0` = grises; `1` = normal; `>1` = saturado | Android · **iOS 17+** |
52
+ | `setOpacity(0-100)` | Opacidad. `0` = transparente; `100` = opaca | Android · iOS |
53
+ | `setTintColor(color)` | Color de tinte. Color hex | Android · iOS |
54
+ | `setShadow(opacity, radius, offsetX, offsetY, color)` | Sombra. Opacidad `0–1`, radio, desplazamiento y color hex. **No se ve si la vista recorta su contenido**, porque la sombra cae fuera del borde | Android · iOS |
55
+ | `setScale(sx[, sy])` | Escala. `sy` opcional: si falta, se usa `sx`. **Acumula** | Android · iOS |
56
+ | `setRotation(grados)` | Rotación en **grados**, no radianes. **Acumula** | Android · iOS |
57
+ | `setTranslate(dx, dy)` | Desplazamiento, en puntos. **Acumula** | Android · iOS |
58
+ | `resetTransform()` | Deshace todas las transformaciones acumuladas | Android · iOS |
59
+ | `setZIndex(z)` | Posición en el eje Z | Android · iOS |
60
+ | `bringToFront()` | Trae al frente **dentro de su contenedor**, no de la pantalla | Android · iOS |
61
+ | `sendToBack()` | Manda al fondo **dentro de su contenedor**, no de la pantalla | Android · iOS |
62
+
63
+ **Las transformaciones acumulan.** `setScale`, `setRotation` y `setTranslate` se concatenan
64
+ sobre la transformación actual en vez de reemplazarla: llamar dos veces a `setScale(2)` deja la
65
+ vista a escala 4. Para volver al punto de partida se usa `resetTransform()`, no una
66
+ transformación inversa.
67
+
68
+ ## Cómo se envuelve
69
+
70
+ No se llaman sueltos: se envuelven en `functions.js`. El envoltorio resuelve la ventana una vez
71
+ y comprueba el nulo, que es lo que evita el error cuando el evento salta sin vista montada.
72
+
73
+ ```javascript
74
+ // Desenfoque sobre un frame
75
+ function doBlurEffect(sFrame, nValue) {
76
+ let window = ui.getView(self);
77
+ if (!window) return;
78
+ window[sFrame].setBlur(nValue);
79
+ }
80
+
81
+ // Saturacion sobre un frame
82
+ function doSaturationEffect(sFrame, nValue) {
83
+ let window = ui.getView(self);
84
+ if (!window) return;
85
+ window[sFrame].setSaturation(nValue);
86
+ }
87
+ ```
88
+
89
+ El patrón típico es un slider que llama al envoltorio desde su `onchange`. El rango del ejemplo
90
+ —`min="0" max="32"`— es el del slider, no un límite del método:
91
+
92
+ ```xml
93
+ <prop name="MAP_BLUR_SLIDER" type="N"
94
+ updates="MAP_BLUR_SLIDER"
95
+ min="0" max="32"
96
+ viewmode="slider" orientation="horizontal"
97
+ notify-only-when-dropped="false"
98
+ width="800p" height="100p" />
99
+ ```
100
+
101
+ ```xml
102
+ <onchange>
103
+ <field name="MAP_BLUR_SLIDER">
104
+ <action name="runscript">
105
+ <script>
106
+ doBlurEffect("mi_frame", self.MAP_BLUR_SLIDER);
107
+ </script>
108
+ </action>
109
+ </field>
110
+ </onchange>
111
+ ```
112
+
113
+ **No existe `ui.setBlur` ni `ui.setSaturation`.** Se llaman sobre el frame o el control, nunca
114
+ sobre `ui`.