@acvl/mobile-components 0.0.0-stage → 0.0.1

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 (297) hide show
  1. package/README.md +146 -2
  2. package/assets/fonts/Inter_400Regular.ttf +0 -0
  3. package/assets/fonts/Inter_500Medium.ttf +0 -0
  4. package/assets/fonts/Inter_600SemiBold.ttf +0 -0
  5. package/assets/fonts/Inter_700Bold.ttf +0 -0
  6. package/assets/fonts/Inter_800ExtraBold.ttf +0 -0
  7. package/assets/fonts/Inter_900Black.ttf +0 -0
  8. package/assets/fonts/OFL.txt +93 -0
  9. package/lib/module/componentes/AccionesDelEncabezado.js +212 -0
  10. package/lib/module/componentes/AccionesDelEncabezado.js.map +1 -0
  11. package/lib/module/componentes/BotonDeAvatar.js +55 -0
  12. package/lib/module/componentes/BotonDeAvatar.js.map +1 -0
  13. package/lib/module/componentes/BotonGrande.js +105 -0
  14. package/lib/module/componentes/BotonGrande.js.map +1 -0
  15. package/lib/module/componentes/CabeceraEmpujada.js +101 -0
  16. package/lib/module/componentes/CabeceraEmpujada.js.map +1 -0
  17. package/lib/module/componentes/Chip.js +77 -0
  18. package/lib/module/componentes/Chip.js.map +1 -0
  19. package/lib/module/componentes/ContenidoDePantalla.js +56 -0
  20. package/lib/module/componentes/ContenidoDePantalla.js.map +1 -0
  21. package/lib/module/componentes/EstadoVacio.js +65 -0
  22. package/lib/module/componentes/EstadoVacio.js.map +1 -0
  23. package/lib/module/componentes/Foto.js +106 -0
  24. package/lib/module/componentes/Foto.js.map +1 -0
  25. package/lib/module/componentes/IconoDeRenglon.js +44 -0
  26. package/lib/module/componentes/IconoDeRenglon.js.map +1 -0
  27. package/lib/module/componentes/Logo.js +44 -0
  28. package/lib/module/componentes/Logo.js.map +1 -0
  29. package/lib/module/componentes/Nota.js +51 -0
  30. package/lib/module/componentes/Nota.js.map +1 -0
  31. package/lib/module/componentes/OpcionesExcluyentes.js +69 -0
  32. package/lib/module/componentes/OpcionesExcluyentes.js.map +1 -0
  33. package/lib/module/componentes/PantallaDeError.js +84 -0
  34. package/lib/module/componentes/PantallaDeError.js.map +1 -0
  35. package/lib/module/componentes/Pestanas.js +87 -0
  36. package/lib/module/componentes/Pestanas.js.map +1 -0
  37. package/lib/module/componentes/Rotulo.js +28 -0
  38. package/lib/module/componentes/Rotulo.js.map +1 -0
  39. package/lib/module/componentes/RotuloDeSeccion.js +87 -0
  40. package/lib/module/componentes/RotuloDeSeccion.js.map +1 -0
  41. package/lib/module/componentes/Tarjeta.js +47 -0
  42. package/lib/module/componentes/Tarjeta.js.map +1 -0
  43. package/lib/module/componentes/TarjetaDeDatos.js +79 -0
  44. package/lib/module/componentes/TarjetaDeDatos.js.map +1 -0
  45. package/lib/module/componentes/TiraDeFotos.js +184 -0
  46. package/lib/module/componentes/TiraDeFotos.js.map +1 -0
  47. package/lib/module/componentes/VisorDeFoto.js +171 -0
  48. package/lib/module/componentes/VisorDeFoto.js.map +1 -0
  49. package/lib/module/componentes/logos/bola-blanca.png +0 -0
  50. package/lib/module/componentes/logos/bola.png +0 -0
  51. package/lib/module/componentes/logos/logo-blanco.png +0 -0
  52. package/lib/module/componentes/logos/logo.png +0 -0
  53. package/lib/module/dialogos/HostDeDialogos.js +170 -0
  54. package/lib/module/dialogos/HostDeDialogos.js.map +1 -0
  55. package/lib/module/dialogos/dialogos.js +112 -0
  56. package/lib/module/dialogos/dialogos.js.map +1 -0
  57. package/lib/module/formularios/CampoDeSeleccion.js +47 -0
  58. package/lib/module/formularios/CampoDeSeleccion.js.map +1 -0
  59. package/lib/module/formularios/SelectorDeOpcion.js +406 -0
  60. package/lib/module/formularios/SelectorDeOpcion.js.map +1 -0
  61. package/lib/module/formularios/TextoDeAccesoControlado.js +73 -0
  62. package/lib/module/formularios/TextoDeAccesoControlado.js.map +1 -0
  63. package/lib/module/formularios/campos.js +493 -0
  64. package/lib/module/formularios/campos.js.map +1 -0
  65. package/lib/module/formularios/controlados.js +197 -0
  66. package/lib/module/formularios/controlados.js.map +1 -0
  67. package/lib/module/formularios/errores.js +91 -0
  68. package/lib/module/formularios/errores.js.map +1 -0
  69. package/lib/module/formularios/guardado.js +78 -0
  70. package/lib/module/formularios/guardado.js.map +1 -0
  71. package/lib/module/formularios/useBusqueda.js +22 -0
  72. package/lib/module/formularios/useBusqueda.js.map +1 -0
  73. package/lib/module/fotos/elegir.js +178 -0
  74. package/lib/module/fotos/elegir.js.map +1 -0
  75. package/lib/module/fotos/index.js +8 -0
  76. package/lib/module/fotos/index.js.map +1 -0
  77. package/lib/module/fotos/reducir.js +93 -0
  78. package/lib/module/fotos/reducir.js.map +1 -0
  79. package/lib/module/hoja/HojaInferior.js +108 -0
  80. package/lib/module/hoja/HojaInferior.js.map +1 -0
  81. package/lib/module/hoja/index.js +7 -0
  82. package/lib/module/hoja/index.js.map +1 -0
  83. package/lib/module/hoja/useMasDeLaFicha.js +48 -0
  84. package/lib/module/hoja/useMasDeLaFicha.js.map +1 -0
  85. package/lib/module/index.js +66 -0
  86. package/lib/module/index.js.map +1 -0
  87. package/lib/module/listas/HojaDeFiltros.js +260 -0
  88. package/lib/module/listas/HojaDeFiltros.js.map +1 -0
  89. package/lib/module/listas/ListaPaginada.js +103 -0
  90. package/lib/module/listas/ListaPaginada.js.map +1 -0
  91. package/lib/module/listas/TarjetaDeslizable.js +118 -0
  92. package/lib/module/listas/TarjetaDeslizable.js.map +1 -0
  93. package/lib/module/listas/paginado.js +11 -0
  94. package/lib/module/listas/paginado.js.map +1 -0
  95. package/lib/module/listas/piezas.js +603 -0
  96. package/lib/module/listas/piezas.js.map +1 -0
  97. package/lib/module/navegacion/BarraDePestanas.js +162 -0
  98. package/lib/module/navegacion/BarraDePestanas.js.map +1 -0
  99. package/lib/module/navegacion/BotonDeBarra.js +58 -0
  100. package/lib/module/navegacion/BotonDeBarra.js.map +1 -0
  101. package/lib/module/navegacion/encabezado.js +103 -0
  102. package/lib/module/navegacion/encabezado.js.map +1 -0
  103. package/lib/module/pantallas/PantallaDeAcceso.js +195 -0
  104. package/lib/module/pantallas/PantallaDeAcceso.js.map +1 -0
  105. package/lib/module/pantallas/PantallaDeEdicion.js +121 -0
  106. package/lib/module/pantallas/PantallaDeEdicion.js.map +1 -0
  107. package/lib/module/pantallas/PantallaDeFicha.js +94 -0
  108. package/lib/module/pantallas/PantallaDeFicha.js.map +1 -0
  109. package/lib/module/pantallas/PantallaDePerfil.js +137 -0
  110. package/lib/module/pantallas/PantallaDePerfil.js.map +1 -0
  111. package/lib/module/tema/ProveedorDeTema.js +122 -0
  112. package/lib/module/tema/ProveedorDeTema.js.map +1 -0
  113. package/lib/module/tema/estilos.js +54 -0
  114. package/lib/module/tema/estilos.js.map +1 -0
  115. package/lib/module/tema/fuentes.js +28 -0
  116. package/lib/module/tema/fuentes.js.map +1 -0
  117. package/lib/module/tema/index.js +8 -0
  118. package/lib/module/tema/index.js.map +1 -0
  119. package/lib/module/tema/paleta.js +107 -0
  120. package/lib/module/tema/paleta.js.map +1 -0
  121. package/lib/module/tema/tipografia.js +32 -0
  122. package/lib/module/tema/tipografia.js.map +1 -0
  123. package/lib/module/texto.js +48 -0
  124. package/lib/module/texto.js.map +1 -0
  125. package/lib/typescript/src/componentes/AccionesDelEncabezado.d.ts +34 -0
  126. package/lib/typescript/src/componentes/AccionesDelEncabezado.d.ts.map +1 -0
  127. package/lib/typescript/src/componentes/BotonDeAvatar.d.ts +17 -0
  128. package/lib/typescript/src/componentes/BotonDeAvatar.d.ts.map +1 -0
  129. package/lib/typescript/src/componentes/BotonGrande.d.ts +26 -0
  130. package/lib/typescript/src/componentes/BotonGrande.d.ts.map +1 -0
  131. package/lib/typescript/src/componentes/CabeceraEmpujada.d.ts +18 -0
  132. package/lib/typescript/src/componentes/CabeceraEmpujada.d.ts.map +1 -0
  133. package/lib/typescript/src/componentes/Chip.d.ts +14 -0
  134. package/lib/typescript/src/componentes/Chip.d.ts.map +1 -0
  135. package/lib/typescript/src/componentes/ContenidoDePantalla.d.ts +17 -0
  136. package/lib/typescript/src/componentes/ContenidoDePantalla.d.ts.map +1 -0
  137. package/lib/typescript/src/componentes/EstadoVacio.d.ts +17 -0
  138. package/lib/typescript/src/componentes/EstadoVacio.d.ts.map +1 -0
  139. package/lib/typescript/src/componentes/Foto.d.ts +41 -0
  140. package/lib/typescript/src/componentes/Foto.d.ts.map +1 -0
  141. package/lib/typescript/src/componentes/IconoDeRenglon.d.ts +25 -0
  142. package/lib/typescript/src/componentes/IconoDeRenglon.d.ts.map +1 -0
  143. package/lib/typescript/src/componentes/Logo.d.ts +13 -0
  144. package/lib/typescript/src/componentes/Logo.d.ts.map +1 -0
  145. package/lib/typescript/src/componentes/Nota.d.ts +7 -0
  146. package/lib/typescript/src/componentes/Nota.d.ts.map +1 -0
  147. package/lib/typescript/src/componentes/OpcionesExcluyentes.d.ts +14 -0
  148. package/lib/typescript/src/componentes/OpcionesExcluyentes.d.ts.map +1 -0
  149. package/lib/typescript/src/componentes/PantallaDeError.d.ts +23 -0
  150. package/lib/typescript/src/componentes/PantallaDeError.d.ts.map +1 -0
  151. package/lib/typescript/src/componentes/Pestanas.d.ts +28 -0
  152. package/lib/typescript/src/componentes/Pestanas.d.ts.map +1 -0
  153. package/lib/typescript/src/componentes/Rotulo.d.ts +6 -0
  154. package/lib/typescript/src/componentes/Rotulo.d.ts.map +1 -0
  155. package/lib/typescript/src/componentes/RotuloDeSeccion.d.ts +20 -0
  156. package/lib/typescript/src/componentes/RotuloDeSeccion.d.ts.map +1 -0
  157. package/lib/typescript/src/componentes/Tarjeta.d.ts +15 -0
  158. package/lib/typescript/src/componentes/Tarjeta.d.ts.map +1 -0
  159. package/lib/typescript/src/componentes/TarjetaDeDatos.d.ts +13 -0
  160. package/lib/typescript/src/componentes/TarjetaDeDatos.d.ts.map +1 -0
  161. package/lib/typescript/src/componentes/TiraDeFotos.d.ts +36 -0
  162. package/lib/typescript/src/componentes/TiraDeFotos.d.ts.map +1 -0
  163. package/lib/typescript/src/componentes/VisorDeFoto.d.ts +23 -0
  164. package/lib/typescript/src/componentes/VisorDeFoto.d.ts.map +1 -0
  165. package/lib/typescript/src/dialogos/HostDeDialogos.d.ts +14 -0
  166. package/lib/typescript/src/dialogos/HostDeDialogos.d.ts.map +1 -0
  167. package/lib/typescript/src/dialogos/dialogos.d.ts +65 -0
  168. package/lib/typescript/src/dialogos/dialogos.d.ts.map +1 -0
  169. package/lib/typescript/src/formularios/CampoDeSeleccion.d.ts +22 -0
  170. package/lib/typescript/src/formularios/CampoDeSeleccion.d.ts.map +1 -0
  171. package/lib/typescript/src/formularios/SelectorDeOpcion.d.ts +59 -0
  172. package/lib/typescript/src/formularios/SelectorDeOpcion.d.ts.map +1 -0
  173. package/lib/typescript/src/formularios/TextoDeAccesoControlado.d.ts +18 -0
  174. package/lib/typescript/src/formularios/TextoDeAccesoControlado.d.ts.map +1 -0
  175. package/lib/typescript/src/formularios/campos.d.ts +107 -0
  176. package/lib/typescript/src/formularios/campos.d.ts.map +1 -0
  177. package/lib/typescript/src/formularios/controlados.d.ts +29 -0
  178. package/lib/typescript/src/formularios/controlados.d.ts.map +1 -0
  179. package/lib/typescript/src/formularios/errores.d.ts +36 -0
  180. package/lib/typescript/src/formularios/errores.d.ts.map +1 -0
  181. package/lib/typescript/src/formularios/guardado.d.ts +36 -0
  182. package/lib/typescript/src/formularios/guardado.d.ts.map +1 -0
  183. package/lib/typescript/src/formularios/useBusqueda.d.ts +7 -0
  184. package/lib/typescript/src/formularios/useBusqueda.d.ts.map +1 -0
  185. package/lib/typescript/src/fotos/elegir.d.ts +58 -0
  186. package/lib/typescript/src/fotos/elegir.d.ts.map +1 -0
  187. package/lib/typescript/src/fotos/index.d.ts +3 -0
  188. package/lib/typescript/src/fotos/index.d.ts.map +1 -0
  189. package/lib/typescript/src/fotos/reducir.d.ts +32 -0
  190. package/lib/typescript/src/fotos/reducir.d.ts.map +1 -0
  191. package/lib/typescript/src/hoja/HojaInferior.d.ts +21 -0
  192. package/lib/typescript/src/hoja/HojaInferior.d.ts.map +1 -0
  193. package/lib/typescript/src/hoja/index.d.ts +3 -0
  194. package/lib/typescript/src/hoja/index.d.ts.map +1 -0
  195. package/lib/typescript/src/hoja/useMasDeLaFicha.d.ts +27 -0
  196. package/lib/typescript/src/hoja/useMasDeLaFicha.d.ts.map +1 -0
  197. package/lib/typescript/src/index.d.ts +45 -0
  198. package/lib/typescript/src/index.d.ts.map +1 -0
  199. package/lib/typescript/src/listas/HojaDeFiltros.d.ts +60 -0
  200. package/lib/typescript/src/listas/HojaDeFiltros.d.ts.map +1 -0
  201. package/lib/typescript/src/listas/ListaPaginada.d.ts +39 -0
  202. package/lib/typescript/src/listas/ListaPaginada.d.ts.map +1 -0
  203. package/lib/typescript/src/listas/TarjetaDeslizable.d.ts +33 -0
  204. package/lib/typescript/src/listas/TarjetaDeslizable.d.ts.map +1 -0
  205. package/lib/typescript/src/listas/paginado.d.ts +16 -0
  206. package/lib/typescript/src/listas/paginado.d.ts.map +1 -0
  207. package/lib/typescript/src/listas/piezas.d.ts +135 -0
  208. package/lib/typescript/src/listas/piezas.d.ts.map +1 -0
  209. package/lib/typescript/src/navegacion/BarraDePestanas.d.ts +57 -0
  210. package/lib/typescript/src/navegacion/BarraDePestanas.d.ts.map +1 -0
  211. package/lib/typescript/src/navegacion/BotonDeBarra.d.ts +15 -0
  212. package/lib/typescript/src/navegacion/BotonDeBarra.d.ts.map +1 -0
  213. package/lib/typescript/src/navegacion/encabezado.d.ts +44 -0
  214. package/lib/typescript/src/navegacion/encabezado.d.ts.map +1 -0
  215. package/lib/typescript/src/pantallas/PantallaDeAcceso.d.ts +32 -0
  216. package/lib/typescript/src/pantallas/PantallaDeAcceso.d.ts.map +1 -0
  217. package/lib/typescript/src/pantallas/PantallaDeEdicion.d.ts +38 -0
  218. package/lib/typescript/src/pantallas/PantallaDeEdicion.d.ts.map +1 -0
  219. package/lib/typescript/src/pantallas/PantallaDeFicha.d.ts +35 -0
  220. package/lib/typescript/src/pantallas/PantallaDeFicha.d.ts.map +1 -0
  221. package/lib/typescript/src/pantallas/PantallaDePerfil.d.ts +19 -0
  222. package/lib/typescript/src/pantallas/PantallaDePerfil.d.ts.map +1 -0
  223. package/lib/typescript/src/tema/ProveedorDeTema.d.ts +32 -0
  224. package/lib/typescript/src/tema/ProveedorDeTema.d.ts.map +1 -0
  225. package/lib/typescript/src/tema/estilos.d.ts +31 -0
  226. package/lib/typescript/src/tema/estilos.d.ts.map +1 -0
  227. package/lib/typescript/src/tema/fuentes.d.ts +20 -0
  228. package/lib/typescript/src/tema/fuentes.d.ts.map +1 -0
  229. package/lib/typescript/src/tema/index.d.ts +6 -0
  230. package/lib/typescript/src/tema/index.d.ts.map +1 -0
  231. package/lib/typescript/src/tema/paleta.d.ts +86 -0
  232. package/lib/typescript/src/tema/paleta.d.ts.map +1 -0
  233. package/lib/typescript/src/tema/tipografia.d.ts +29 -0
  234. package/lib/typescript/src/tema/tipografia.d.ts.map +1 -0
  235. package/lib/typescript/src/texto.d.ts +16 -0
  236. package/lib/typescript/src/texto.d.ts.map +1 -0
  237. package/package.json +135 -5
  238. package/src/componentes/AccionesDelEncabezado.tsx +247 -0
  239. package/src/componentes/BotonDeAvatar.tsx +59 -0
  240. package/src/componentes/BotonGrande.tsx +100 -0
  241. package/src/componentes/CabeceraEmpujada.tsx +69 -0
  242. package/src/componentes/Chip.tsx +60 -0
  243. package/src/componentes/ContenidoDePantalla.tsx +53 -0
  244. package/src/componentes/EstadoVacio.tsx +45 -0
  245. package/src/componentes/Foto.tsx +92 -0
  246. package/src/componentes/IconoDeRenglon.tsx +42 -0
  247. package/src/componentes/Logo.tsx +34 -0
  248. package/src/componentes/Nota.tsx +37 -0
  249. package/src/componentes/OpcionesExcluyentes.tsx +62 -0
  250. package/src/componentes/PantallaDeError.tsx +76 -0
  251. package/src/componentes/Pestanas.tsx +86 -0
  252. package/src/componentes/Rotulo.tsx +21 -0
  253. package/src/componentes/RotuloDeSeccion.tsx +71 -0
  254. package/src/componentes/Tarjeta.tsx +44 -0
  255. package/src/componentes/TarjetaDeDatos.tsx +62 -0
  256. package/src/componentes/TiraDeFotos.tsx +189 -0
  257. package/src/componentes/VisorDeFoto.tsx +181 -0
  258. package/src/componentes/logos/bola-blanca.png +0 -0
  259. package/src/componentes/logos/bola.png +0 -0
  260. package/src/componentes/logos/logo-blanco.png +0 -0
  261. package/src/componentes/logos/logo.png +0 -0
  262. package/src/dialogos/HostDeDialogos.tsx +172 -0
  263. package/src/dialogos/dialogos.ts +148 -0
  264. package/src/formularios/CampoDeSeleccion.tsx +46 -0
  265. package/src/formularios/SelectorDeOpcion.tsx +407 -0
  266. package/src/formularios/TextoDeAccesoControlado.tsx +72 -0
  267. package/src/formularios/campos.tsx +483 -0
  268. package/src/formularios/controlados.tsx +198 -0
  269. package/src/formularios/errores.ts +105 -0
  270. package/src/formularios/guardado.ts +76 -0
  271. package/src/formularios/useBusqueda.ts +19 -0
  272. package/src/fotos/elegir.ts +194 -0
  273. package/src/fotos/index.ts +15 -0
  274. package/src/fotos/reducir.ts +87 -0
  275. package/src/hoja/HojaInferior.tsx +102 -0
  276. package/src/hoja/index.ts +4 -0
  277. package/src/hoja/useMasDeLaFicha.tsx +63 -0
  278. package/src/index.ts +143 -0
  279. package/src/listas/HojaDeFiltros.tsx +261 -0
  280. package/src/listas/ListaPaginada.tsx +117 -0
  281. package/src/listas/TarjetaDeslizable.tsx +126 -0
  282. package/src/listas/paginado.ts +15 -0
  283. package/src/listas/piezas.tsx +594 -0
  284. package/src/navegacion/BarraDePestanas.tsx +198 -0
  285. package/src/navegacion/BotonDeBarra.tsx +61 -0
  286. package/src/navegacion/encabezado.tsx +88 -0
  287. package/src/pantallas/PantallaDeAcceso.tsx +184 -0
  288. package/src/pantallas/PantallaDeEdicion.tsx +116 -0
  289. package/src/pantallas/PantallaDeFicha.tsx +115 -0
  290. package/src/pantallas/PantallaDePerfil.tsx +126 -0
  291. package/src/tema/ProveedorDeTema.tsx +150 -0
  292. package/src/tema/estilos.ts +51 -0
  293. package/src/tema/fuentes.ts +20 -0
  294. package/src/tema/index.ts +10 -0
  295. package/src/tema/paleta.ts +147 -0
  296. package/src/tema/tipografia.ts +29 -0
  297. package/src/texto.tsx +44 -0
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+
3
+ import * as Haptics from "expo-haptics";
4
+ import { useEffect, useState } from "react";
5
+ import { useWindowDimensions, View } from "react-native";
6
+ import Animated, { useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated";
7
+ import { crearEstilos, usePaleta } from "../tema";
8
+ import BotonDeBarra from "./BotonDeBarra";
9
+
10
+ /**
11
+ * Lo que una lista deja libre abajo para que su último renglón no quede debajo de la barra, que
12
+ * flota encima del contenido: lo que se separa del borde, lo que mide y un margen.
13
+ */
14
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
+ export const HUECO_DE_LA_BARRA = 140;
16
+
17
+ // La barra se ajusta al número de pestañas: con una sola no queda un pastillón vacío
18
+ // alrededor del icono, y con cuatro no se sale de la pantalla. Cada pestaña mide lo que
19
+ // pueda hasta `TAB_WIDTH_MAX`, repartiendo el ancho disponible.
20
+ const TAB_WIDTH_MAX = 115;
21
+ const SCREEN_MARGIN = 24;
22
+ const INDICATOR_INSET = 25;
23
+
24
+ /**
25
+ * Lo que la barra lee de las props del `tabBar` de `Tabs` (`BottomTabBarProps`). Escrito a mano y
26
+ * no importado: cada versión de expo-router lo exporta desde otro lado.
27
+ */
28
+
29
+ /**
30
+ * La barra de pestañas de abajo: una pastilla flotante con un icono por pestaña y la elegida
31
+ * resaltada en rojo. Va en el `tabBar` de `Tabs`:
32
+ *
33
+ * ```tsx
34
+ * <Tabs tabBar={(props) => <BarraDePestanas {...props} iconos={ICONOS} />}>
35
+ * ```
36
+ *
37
+ * Flota encima del contenido: las listas dejan `HUECO_DE_LA_BARRA` abajo.
38
+ */
39
+ const BarraDePestanas = ({
40
+ state,
41
+ navigation,
42
+ descriptors,
43
+ iconos,
44
+ visibles
45
+ }) => {
46
+ const c = usePaleta();
47
+ const styles = useStyles();
48
+ // Sólo el alto se mide; el ancho lo fija el número de pestañas.
49
+ const [height, setHeight] = useState(0);
50
+ const {
51
+ width: screenWidth
52
+ } = useWindowDimensions();
53
+ const routes = visibles ? state.routes.filter(route => visibles.includes(route.name)) : state.routes;
54
+ const tabWidth = Math.min(TAB_WIDTH_MAX, (screenWidth - SCREEN_MARGIN * 2) / routes.length);
55
+ const indicatorWidth = Math.max(0, tabWidth - INDICATOR_INSET);
56
+ const indicatorX = index => tabWidth * index + (tabWidth - indicatorWidth) / 2;
57
+
58
+ // `state.index` cuenta sobre todas las rutas, incluidas las ocultas. Si la activa no
59
+ // está en la barra —sólo pasa navegando a mano a una ruta sin permiso— la pastilla se
60
+ // queda en la primera.
61
+ const activeIndex = Math.max(0, routes.findIndex(route => route.key === state.routes[state.index]?.key));
62
+ const onTabbarLayout = e => setHeight(e.nativeEvent.layout.height);
63
+ const tabPositionX = useSharedValue(indicatorX(activeIndex));
64
+
65
+ // La pastilla sigue a la pestaña activa (no al toque): así queda en su sitio cuando
66
+ // el grupo arranca en una ruta distinta de la primera, o cuando se navega sin tocar
67
+ // la barra.
68
+ useEffect(() => {
69
+ tabPositionX.value = withSpring(indicatorX(activeIndex), {
70
+ duration: 350
71
+ });
72
+ // eslint-disable-next-line react-hooks/exhaustive-deps
73
+ }, [activeIndex, tabWidth, indicatorWidth, tabPositionX]);
74
+ const animatedStyle = useAnimatedStyle(() => {
75
+ return {
76
+ transform: [{
77
+ translateX: tabPositionX.value
78
+ }]
79
+ };
80
+ });
81
+ return /*#__PURE__*/_jsx(View, {
82
+ style: styles.wrapper,
83
+ children: /*#__PURE__*/_jsxs(View, {
84
+ onLayout: onTabbarLayout,
85
+ style: [styles.tabbar, {
86
+ width: tabWidth * routes.length
87
+ }],
88
+ children: [/*#__PURE__*/_jsx(Animated.View, {
89
+ style: [animatedStyle, {
90
+ position: "absolute",
91
+ borderRadius: 30,
92
+ backgroundColor: c.primary,
93
+ // Nada que pintar hasta la primera medición del alto.
94
+ height: Math.max(0, height - 15),
95
+ width: indicatorWidth
96
+ }]
97
+ }), routes.map((route, index) => {
98
+ const isFocused = index === activeIndex;
99
+ const onPress = () => {
100
+ const event = navigation.emit({
101
+ type: "tabPress",
102
+ target: route.key,
103
+ canPreventDefault: true
104
+ });
105
+
106
+ // Sólo el de `tabPress` (`canPreventDefault`) trae `defaultPrevented`.
107
+ const prevenido = "defaultPrevented" in event && event.defaultPrevented;
108
+ if (!isFocused && !prevenido) {
109
+ Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
110
+ navigation.navigate(route.name, route.params);
111
+ }
112
+ };
113
+ const onLongPress = () => {
114
+ navigation.emit({
115
+ type: "tabLongPress",
116
+ target: route.key
117
+ });
118
+ };
119
+ return /*#__PURE__*/_jsx(BotonDeBarra, {
120
+ onPress: onPress,
121
+ onLongPress: onLongPress,
122
+ isFocused: isFocused,
123
+ icono: iconos[route.name],
124
+ etiqueta: descriptors?.[route.key]?.options.title ?? route.name,
125
+ color: isFocused ? c.sobrePrimario : c.primary
126
+ }, route.key);
127
+ })]
128
+ })
129
+ });
130
+ };
131
+ const useStyles = crearEstilos(c => ({
132
+ wrapper: {
133
+ position: "absolute",
134
+ bottom: 30,
135
+ left: 0,
136
+ right: 0,
137
+ alignItems: "center"
138
+ },
139
+ tabbar: {
140
+ flexDirection: "row",
141
+ justifyContent: "space-between",
142
+ alignItems: "center",
143
+ backgroundColor: c.superficie,
144
+ paddingVertical: 22,
145
+ borderRadius: 35,
146
+ // android
147
+ elevation: 3,
148
+ // ios
149
+ shadowColor: c.sombra,
150
+ shadowOffset: {
151
+ width: 0,
152
+ height: 10
153
+ },
154
+ shadowRadius: 10,
155
+ shadowOpacity: 0.1,
156
+ // En oscuro la sombra no se ve: el borde separa la barra del mapa o la lista de abajo.
157
+ borderWidth: c.esOscuro ? 1 : 0,
158
+ borderColor: c.secondaryLighter
159
+ }
160
+ }));
161
+ export default BarraDePestanas;
162
+ //# sourceMappingURL=BarraDePestanas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Haptics","useEffect","useState","useWindowDimensions","View","Animated","useAnimatedStyle","useSharedValue","withSpring","crearEstilos","usePaleta","BotonDeBarra","jsx","_jsx","jsxs","_jsxs","HUECO_DE_LA_BARRA","TAB_WIDTH_MAX","SCREEN_MARGIN","INDICATOR_INSET","BarraDePestanas","state","navigation","descriptors","iconos","visibles","c","styles","useStyles","height","setHeight","width","screenWidth","routes","filter","route","includes","name","tabWidth","Math","min","length","indicatorWidth","max","indicatorX","index","activeIndex","findIndex","key","onTabbarLayout","e","nativeEvent","layout","tabPositionX","value","duration","animatedStyle","transform","translateX","style","wrapper","children","onLayout","tabbar","position","borderRadius","backgroundColor","primary","map","isFocused","onPress","event","emit","type","target","canPreventDefault","prevenido","defaultPrevented","impactAsync","ImpactFeedbackStyle","Light","navigate","params","onLongPress","icono","etiqueta","options","title","color","sobrePrimario","bottom","left","right","alignItems","flexDirection","justifyContent","superficie","paddingVertical","elevation","shadowColor","sombra","shadowOffset","shadowRadius","shadowOpacity","borderWidth","esOscuro","borderColor","secondaryLighter"],"sourceRoot":"../../../src","sources":["navegacion/BarraDePestanas.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ import MaterialIcons from "@expo/vector-icons/MaterialIcons";
4
+ import React, { useEffect } from "react";
5
+ import { Pressable, StyleSheet } from "react-native";
6
+ import Animated, { interpolate, useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated";
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ /** Una pestaña de `BarraDePestanas`: su icono, que crece un poco al elegirla. */
9
+ const BotonDeBarra = ({
10
+ onPress,
11
+ onLongPress,
12
+ isFocused,
13
+ icono,
14
+ etiqueta,
15
+ color
16
+ }) => {
17
+ const scale = useSharedValue(0);
18
+ useEffect(() => {
19
+ scale.value = withSpring(isFocused ? 1 : 0, {
20
+ duration: 350
21
+ });
22
+ }, [scale, isFocused]);
23
+ const animatedIconStyle = useAnimatedStyle(() => {
24
+ const scaleValue = interpolate(scale.value, [0, 1], [1, 1.2]);
25
+ return {
26
+ transform: [{
27
+ scale: scaleValue
28
+ }]
29
+ };
30
+ });
31
+ return /*#__PURE__*/_jsx(Pressable, {
32
+ onPress: onPress,
33
+ onLongPress: onLongPress,
34
+ accessibilityRole: "tab",
35
+ accessibilityLabel: etiqueta,
36
+ accessibilityState: {
37
+ selected: isFocused
38
+ },
39
+ style: styles.tabbarItem,
40
+ children: /*#__PURE__*/_jsx(Animated.View, {
41
+ style: animatedIconStyle,
42
+ children: icono ? /*#__PURE__*/_jsx(MaterialIcons, {
43
+ name: icono,
44
+ size: 24,
45
+ color: color
46
+ }) : null
47
+ })
48
+ });
49
+ };
50
+ const styles = StyleSheet.create({
51
+ tabbarItem: {
52
+ flex: 1,
53
+ justifyContent: "center",
54
+ alignItems: "center"
55
+ }
56
+ });
57
+ export default BotonDeBarra;
58
+ //# sourceMappingURL=BotonDeBarra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MaterialIcons","React","useEffect","Pressable","StyleSheet","Animated","interpolate","useAnimatedStyle","useSharedValue","withSpring","jsx","_jsx","BotonDeBarra","onPress","onLongPress","isFocused","icono","etiqueta","color","scale","value","duration","animatedIconStyle","scaleValue","transform","accessibilityRole","accessibilityLabel","accessibilityState","selected","style","styles","tabbarItem","children","View","name","size","create","flex","justifyContent","alignItems"],"sourceRoot":"../../../src","sources":["navegacion/BotonDeBarra.tsx"],"mappings":";;AAAA,OAAOA,aAAa,MAAM,kCAAkC;AAC5D,OAAOC,KAAK,IAAIC,SAAS,QAAQ,OAAO;AACxC,SAASC,SAAS,EAAEC,UAAU,QAAQ,cAAc;AACpD,OAAOC,QAAQ,IACXC,WAAW,EACXC,gBAAgB,EAChBC,cAAc,EACdC,UAAU,QACP,yBAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAajC;AACA,MAAMC,YAAY,GAAGA,CAAC;EAAEC,OAAO;EAAEC,WAAW;EAAEC,SAAS;EAAEC,KAAK;EAAEC,QAAQ;EAAEC;AAAa,CAAC,KAAK;EACzF,MAAMC,KAAK,GAAGX,cAAc,CAAC,CAAC,CAAC;EAE/BN,SAAS,CAAC,MAAM;IACZiB,KAAK,CAACC,KAAK,GAAGX,UAAU,CAACM,SAAS,GAAG,CAAC,GAAG,CAAC,EAAE;MAAEM,QAAQ,EAAE;IAAI,CAAC,CAAC;EAClE,CAAC,EAAE,CAACF,KAAK,EAAEJ,SAAS,CAAC,CAAC;EAEtB,MAAMO,iBAAiB,GAAGf,gBAAgB,CAAC,MAAM;IAC7C,MAAMgB,UAAU,GAAGjB,WAAW,CAACa,KAAK,CAACC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO;MACHI,SAAS,EAAE,CAAC;QAAEL,KAAK,EAAEI;MAAW,CAAC;IACrC,CAAC;EACL,CAAC,CAAC;EAEF,oBACIZ,IAAA,CAACR,SAAS;IACNU,OAAO,EAAEA,OAAQ;IACjBC,WAAW,EAAEA,WAAY;IACzBW,iBAAiB,EAAC,KAAK;IACvBC,kBAAkB,EAAET,QAAS;IAC7BU,kBAAkB,EAAE;MAAEC,QAAQ,EAAEb;IAAU,CAAE;IAC5Cc,KAAK,EAAEC,MAAM,CAACC,UAAW;IAAAC,QAAA,eAEzBrB,IAAA,CAACN,QAAQ,CAAC4B,IAAI;MAACJ,KAAK,EAAEP,iBAAkB;MAAAU,QAAA,EACnChB,KAAK,gBAAGL,IAAA,CAACX,aAAa;QAACkC,IAAI,EAAElB,KAAM;QAACmB,IAAI,EAAE,EAAG;QAACjB,KAAK,EAAEA;MAAM,CAAE,CAAC,GAAG;IAAI,CAC3D;EAAC,CACT,CAAC;AAEpB,CAAC;AAED,MAAMY,MAAM,GAAG1B,UAAU,CAACgC,MAAM,CAAC;EAC7BL,UAAU,EAAE;IACRM,IAAI,EAAE,CAAC;IACPC,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE;EAChB;AACJ,CAAC,CAAC;AAEF,eAAe3B,YAAY","ignoreList":[]}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ import React from "react";
4
+ import { View } from "react-native";
5
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
6
+ import { Logo } from "../componentes/Logo";
7
+ import { Text } from "../texto";
8
+ import { crearEstilos, renglon, tipografia, usePaleta } from "../tema";
9
+
10
+ /**
11
+ * Alto del header por debajo de la barra de estado. Iguala el de `CabeceraEmpujada` (10 de
12
+ * padding + la fila de 45 del botón de atrás + 13), y se suma al inset porque `headerStyle.height`
13
+ * de React Navigation incluye la franja de la barra de estado: un alto fijo salía bien en iOS
14
+ * —inset grande— y desproporcionado en Android.
15
+ */
16
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
17
+ export const ALTO_DEL_ENCABEZADO = 76;
18
+
19
+ /**
20
+ * El título del header de las pestañas: un rótulo arriba (quién entró, la yarda, el nombre de la
21
+ * app) y el de la pestaña en rojo.
22
+ */
23
+ export function TituloDelEncabezado({
24
+ eyebrow,
25
+ children
26
+ }) {
27
+ const styles = useStyles();
28
+ return /*#__PURE__*/_jsxs(View, {
29
+ children: [/*#__PURE__*/_jsx(Text, {
30
+ style: styles.eyebrow,
31
+ children: eyebrow.toUpperCase()
32
+ }), /*#__PURE__*/_jsx(Text, {
33
+ numberOfLines: 1,
34
+ adjustsFontSizeToFit: true,
35
+ style: styles.titulo,
36
+ children: children
37
+ })]
38
+ });
39
+ }
40
+
41
+ /**
42
+ * El header de las pestañas de una app, igual en todas: la bola a la izquierda, el rótulo y el
43
+ * título, y a la derecha lo que la app ponga (sus pendientes, el avatar). Va en el `screenOptions`
44
+ * de `Tabs`:
45
+ *
46
+ * ```tsx
47
+ * const encabezado = useOpcionesDelEncabezado({ eyebrow: "Operador", derecha: <BotonDeAvatar … /> });
48
+ * <Tabs screenOptions={encabezado} tabBar={…}>
49
+ * ```
50
+ */
51
+ export function useOpcionesDelEncabezado({
52
+ eyebrow,
53
+ derecha
54
+ }) {
55
+ const c = usePaleta();
56
+ const styles = useStyles();
57
+ const insets = useSafeAreaInsets();
58
+ return {
59
+ headerShadowVisible: false,
60
+ headerStyle: {
61
+ height: insets.top + ALTO_DEL_ENCABEZADO,
62
+ backgroundColor: c.superficie
63
+ },
64
+ headerTitleAlign: "left",
65
+ headerTitle: props => /*#__PURE__*/_jsx(TituloDelEncabezado, {
66
+ eyebrow: eyebrow,
67
+ children: props.children
68
+ }),
69
+ headerLeft: () => /*#__PURE__*/_jsx(View, {
70
+ style: styles.izquierda,
71
+ children: /*#__PURE__*/_jsx(Logo, {})
72
+ }),
73
+ headerRight: derecha ? () => /*#__PURE__*/_jsx(View, {
74
+ style: styles.derecha,
75
+ children: derecha
76
+ }) : undefined,
77
+ tabBarHideOnKeyboard: true
78
+ };
79
+ }
80
+ const useStyles = crearEstilos(c => ({
81
+ // Con la letra mínima (`etiqueta`): a 11 el nombre no se leía.
82
+ eyebrow: {
83
+ ...renglon(tipografia.etiqueta),
84
+ fontWeight: "700",
85
+ letterSpacing: 1.4,
86
+ color: c.eyebrow
87
+ },
88
+ titulo: {
89
+ fontSize: 30,
90
+ fontWeight: "800",
91
+ color: c.primary
92
+ },
93
+ izquierda: {
94
+ marginLeft: 20
95
+ },
96
+ derecha: {
97
+ flexDirection: "row",
98
+ alignItems: "center",
99
+ gap: 6,
100
+ marginRight: 20
101
+ }
102
+ }));
103
+ //# sourceMappingURL=encabezado.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","View","useSafeAreaInsets","Logo","Text","crearEstilos","renglon","tipografia","usePaleta","jsx","_jsx","jsxs","_jsxs","ALTO_DEL_ENCABEZADO","TituloDelEncabezado","eyebrow","children","styles","useStyles","style","toUpperCase","numberOfLines","adjustsFontSizeToFit","titulo","useOpcionesDelEncabezado","derecha","c","insets","headerShadowVisible","headerStyle","height","top","backgroundColor","superficie","headerTitleAlign","headerTitle","props","headerLeft","izquierda","headerRight","undefined","tabBarHideOnKeyboard","etiqueta","fontWeight","letterSpacing","color","fontSize","primary","marginLeft","flexDirection","alignItems","gap","marginRight"],"sourceRoot":"../../../src","sources":["navegacion/encabezado.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+
3
+ import * as Haptics from "expo-haptics";
4
+ import { useState } from "react";
5
+ import { useForm } from "react-hook-form";
6
+ import { useWindowDimensions, View } from "react-native";
7
+ import { KeyboardAvoidingView } from "react-native-keyboard-controller";
8
+ import { Button, Card, Chip, Snackbar } from "react-native-paper";
9
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
10
+ import { LogoCompleto } from "../componentes/Logo";
11
+ import { setErrors } from "../formularios/errores";
12
+ import TextoDeAccesoControlado from "../formularios/TextoDeAccesoControlado";
13
+ import { crearEstilos, usePaleta } from "../tema";
14
+ import { Text } from "../texto";
15
+
16
+ // Mismo corte que ContenidoDePantalla: de aquí para abajo es teléfono.
17
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
18
+ const ANCHO_DE_TABLETA = 700;
19
+
20
+ /** Lo que se escribe, con los nombres del servidor: así `setErrors` lo cuelga de su campo. */
21
+
22
+ /**
23
+ * Lo que pasó al intentar entrar: `null` si entró (la app ya guardó la sesión y su layout la
24
+ * lleva adentro), o lo que se le dice a quien escribe.
25
+ */
26
+
27
+ /**
28
+ * La pantalla de entrada de las apps: el logo con el nombre de la app, usuario, contraseña e
29
+ * «Iniciar Sesión», y la versión abajo. En una tableta va en una tarjeta centrada; en un teléfono,
30
+ * directo sobre el fondo.
31
+ *
32
+ * Lo de cada app es `onEntrar`: llama a su login y dice qué contestar a cada respuesta (una cuenta
33
+ * deshabilitada, una que no tiene acceso a esta app). El aviso sale **arriba**, porque el teclado
34
+ * tapa uno anclado abajo, y dura lo que tarda en leerse.
35
+ */
36
+ export default function PantallaDeAcceso({
37
+ nombre,
38
+ version,
39
+ onEntrar
40
+ }) {
41
+ const c = usePaleta();
42
+ const styles = useStyles();
43
+ const insets = useSafeAreaInsets();
44
+ const {
45
+ width
46
+ } = useWindowDimensions();
47
+ const form = useForm({
48
+ defaultValues: {
49
+ username: "",
50
+ password: ""
51
+ }
52
+ });
53
+ const [entrando, setEntrando] = useState(false);
54
+ const [aviso, setAviso] = useState(null);
55
+ const entrar = form.handleSubmit(async datos => {
56
+ setEntrando(true);
57
+ try {
58
+ const resultado = await onEntrar(datos);
59
+ if (!resultado) {
60
+ Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);
61
+ return;
62
+ }
63
+ Haptics.notificationAsync(resultado.tono === "aviso" ? Haptics.NotificationFeedbackType.Warning : Haptics.NotificationFeedbackType.Error);
64
+ if (resultado.errorDelServidor) setErrors(form, resultado.errorDelServidor);
65
+ setAviso(resultado.mensaje);
66
+ } catch {
67
+ // `onEntrar` contesta lo que conoce; lo que se le escape no deja el botón cargando.
68
+ Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error);
69
+ setAviso("No se pudo iniciar sesión. Intente de nuevo.");
70
+ } finally {
71
+ setEntrando(false);
72
+ }
73
+ });
74
+ const contenido = /*#__PURE__*/_jsxs(_Fragment, {
75
+ children: [/*#__PURE__*/_jsxs(View, {
76
+ style: styles.marca,
77
+ children: [/*#__PURE__*/_jsx(LogoCompleto, {}), /*#__PURE__*/_jsx(Text, {
78
+ style: styles.nombre,
79
+ children: nombre
80
+ })]
81
+ }), /*#__PURE__*/_jsxs(View, {
82
+ style: styles.campos,
83
+ children: [/*#__PURE__*/_jsx(TextoDeAccesoControlado, {
84
+ name: "username",
85
+ control: form.control,
86
+ etiqueta: "Usuario",
87
+ entrada: {
88
+ autoCapitalize: "none"
89
+ }
90
+ }), /*#__PURE__*/_jsx(TextoDeAccesoControlado, {
91
+ name: "password",
92
+ control: form.control,
93
+ etiqueta: "Contrase\xF1a",
94
+ contrasena: true,
95
+ entrada: {
96
+ autoCapitalize: "none"
97
+ }
98
+ })]
99
+ }), /*#__PURE__*/_jsx(Button, {
100
+ mode: "contained",
101
+ loading: entrando,
102
+ disabled: entrando,
103
+ onPress: entrar,
104
+ style: styles.boton,
105
+ children: "Iniciar Sesi\xF3n"
106
+ })]
107
+ });
108
+ return /*#__PURE__*/_jsxs(View, {
109
+ style: styles.root,
110
+ children: [/*#__PURE__*/_jsx(KeyboardAvoidingView, {
111
+ style: styles.centro,
112
+ behavior: "padding",
113
+ children: /*#__PURE__*/_jsx(View, {
114
+ style: styles.columna,
115
+ children: width > ANCHO_DE_TABLETA ? /*#__PURE__*/_jsx(Card, {
116
+ style: styles.card,
117
+ children: /*#__PURE__*/_jsx(Card.Content, {
118
+ children: contenido
119
+ })
120
+ }) : contenido
121
+ })
122
+ }), version ? /*#__PURE__*/_jsx(View, {
123
+ style: styles.version,
124
+ children: /*#__PURE__*/_jsxs(Chip, {
125
+ compact: true,
126
+ textStyle: {
127
+ color: c.secondary,
128
+ fontSize: 11
129
+ },
130
+ style: {
131
+ backgroundColor: c.superficieTenue
132
+ },
133
+ children: ["v ", version]
134
+ })
135
+ }) : null, /*#__PURE__*/_jsx(Snackbar, {
136
+ visible: aviso !== null,
137
+ onDismiss: () => setAviso(null)
138
+ // Un aviso largo se queda lo que tarda en leerse.
139
+ ,
140
+ duration: Math.max(2400, (aviso?.length ?? 0) * 60),
141
+ wrapperStyle: {
142
+ top: insets.top + 12,
143
+ bottom: undefined
144
+ },
145
+ children: aviso
146
+ })]
147
+ });
148
+ }
149
+ const useStyles = crearEstilos(c => ({
150
+ root: {
151
+ flex: 1,
152
+ backgroundColor: c.fondo
153
+ },
154
+ centro: {
155
+ flex: 1,
156
+ justifyContent: "center",
157
+ padding: 24,
158
+ backgroundColor: c.fondo
159
+ },
160
+ columna: {
161
+ width: "100%",
162
+ maxWidth: 400,
163
+ alignSelf: "center"
164
+ },
165
+ card: {
166
+ backgroundColor: c.superficie
167
+ },
168
+ marca: {
169
+ alignItems: "center",
170
+ marginBottom: 20
171
+ },
172
+ nombre: {
173
+ fontSize: 15,
174
+ color: c.primary,
175
+ fontWeight: "bold",
176
+ fontStyle: "italic",
177
+ paddingHorizontal: 3
178
+ },
179
+ campos: {
180
+ gap: 15,
181
+ paddingBottom: 20
182
+ },
183
+ boton: {
184
+ marginTop: 10,
185
+ borderRadius: 15
186
+ },
187
+ version: {
188
+ position: "absolute",
189
+ bottom: 50,
190
+ left: 0,
191
+ right: 0,
192
+ alignItems: "center"
193
+ }
194
+ }));
195
+ //# sourceMappingURL=PantallaDeAcceso.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Haptics","useState","useForm","useWindowDimensions","View","KeyboardAvoidingView","Button","Card","Chip","Snackbar","useSafeAreaInsets","LogoCompleto","setErrors","TextoDeAccesoControlado","crearEstilos","usePaleta","Text","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","ANCHO_DE_TABLETA","PantallaDeAcceso","nombre","version","onEntrar","c","styles","useStyles","insets","width","form","defaultValues","username","password","entrando","setEntrando","aviso","setAviso","entrar","handleSubmit","datos","resultado","notificationAsync","NotificationFeedbackType","Success","tono","Warning","Error","errorDelServidor","mensaje","contenido","children","style","marca","campos","name","control","etiqueta","entrada","autoCapitalize","contrasena","mode","loading","disabled","onPress","boton","root","centro","behavior","columna","card","Content","compact","textStyle","color","secondary","fontSize","backgroundColor","superficieTenue","visible","onDismiss","duration","Math","max","length","wrapperStyle","top","bottom","undefined","flex","fondo","justifyContent","padding","maxWidth","alignSelf","superficie","alignItems","marginBottom","primary","fontWeight","fontStyle","paddingHorizontal","gap","paddingBottom","marginTop","borderRadius","position","left","right"],"sourceRoot":"../../../src","sources":["pantallas/PantallaDeAcceso.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+
3
+ import React from "react";
4
+ import { ActivityIndicator, ScrollView, View } from "react-native";
5
+ import { KeyboardAvoidingView } from "react-native-keyboard-controller";
6
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
7
+ import BotonGrande from "../componentes/BotonGrande";
8
+ import CabeceraEmpujada from "../componentes/CabeceraEmpujada";
9
+ import EstadoVacio from "../componentes/EstadoVacio";
10
+ import Nota from "../componentes/Nota";
11
+ import { mensajeDeError } from "../formularios/errores";
12
+ import { crearEstilos, usePaleta } from "../tema";
13
+
14
+ /**
15
+ * El armazón de una pantalla que edita algo (un viaje, un tracto, una caja, un operador). Dos
16
+ * partes, porque el formulario nace cuando ya llegó lo que edita (sus valores iniciales salen de
17
+ * ahí):
18
+ *
19
+ * - `EsperaDeEdicion`: lo que se ve antes: sin permiso, cargando o si falló, con «Reintentar».
20
+ * - `FormularioDeEdicion`: la cabecera, los campos en un scroll que esquiva el teclado, el error
21
+ * del último intento y «Guardar» abajo, fijo.
22
+ */
23
+
24
+ /** Lo que la espera lee de un `use…Query` de RTK Query. */
25
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
26
+ export function EsperaDeEdicion({
27
+ eyebrow,
28
+ puede,
29
+ sinPermiso,
30
+ consulta,
31
+ queEs
32
+ }) {
33
+ const c = usePaleta();
34
+ const styles = useStyles();
35
+ return /*#__PURE__*/_jsxs(View, {
36
+ style: styles.root,
37
+ children: [/*#__PURE__*/_jsx(CabeceraEmpujada, {
38
+ eyebrow: eyebrow,
39
+ titulo: "\u2026"
40
+ }), !puede ? /*#__PURE__*/_jsx(EstadoVacio, {
41
+ icono: "lock-outline",
42
+ titulo: "No tienes permiso",
43
+ texto: sinPermiso
44
+ }) : consulta.isError ? /*#__PURE__*/_jsx(EstadoVacio, {
45
+ icono: "cloud-alert",
46
+ titulo: `No se pudo cargar ${queEs}`,
47
+ texto: mensajeDeError(consulta.error, "Revisa la señal e intenta de nuevo."),
48
+ children: /*#__PURE__*/_jsx(BotonGrande, {
49
+ icono: "refresh",
50
+ modo: "contorno",
51
+ onPress: consulta.refetch,
52
+ children: "Reintentar"
53
+ })
54
+ }) : /*#__PURE__*/_jsx(ActivityIndicator, {
55
+ color: c.primary,
56
+ style: styles.cargando
57
+ })]
58
+ });
59
+ }
60
+ export function FormularioDeEdicion({
61
+ eyebrow,
62
+ titulo,
63
+ error,
64
+ guardando,
65
+ onGuardar,
66
+ textoDeGuardar = "Guardar",
67
+ children
68
+ }) {
69
+ const styles = useStyles();
70
+ const insets = useSafeAreaInsets();
71
+ return /*#__PURE__*/_jsxs(View, {
72
+ style: styles.root,
73
+ children: [/*#__PURE__*/_jsx(CabeceraEmpujada, {
74
+ eyebrow: eyebrow,
75
+ titulo: titulo
76
+ }), /*#__PURE__*/_jsxs(KeyboardAvoidingView, {
77
+ behavior: "padding",
78
+ style: styles.flex,
79
+ children: [/*#__PURE__*/_jsxs(ScrollView, {
80
+ contentContainerStyle: styles.contenido,
81
+ keyboardShouldPersistTaps: "handled",
82
+ children: [children, error ? /*#__PURE__*/_jsx(Nota, {
83
+ tono: "aviso",
84
+ texto: error
85
+ }) : null]
86
+ }), /*#__PURE__*/_jsx(View, {
87
+ style: [styles.pie, {
88
+ paddingBottom: insets.bottom + 16
89
+ }],
90
+ children: /*#__PURE__*/_jsx(BotonGrande, {
91
+ icono: "check",
92
+ onPress: onGuardar,
93
+ cargando: guardando,
94
+ children: guardando ? "Guardando…" : textoDeGuardar
95
+ })
96
+ })]
97
+ })]
98
+ });
99
+ }
100
+ const useStyles = crearEstilos(c => ({
101
+ root: {
102
+ flex: 1,
103
+ backgroundColor: c.fondo
104
+ },
105
+ flex: {
106
+ flex: 1
107
+ },
108
+ cargando: {
109
+ marginTop: 24
110
+ },
111
+ contenido: {
112
+ padding: 20,
113
+ gap: 12
114
+ },
115
+ pie: {
116
+ paddingHorizontal: 20,
117
+ paddingTop: 12,
118
+ backgroundColor: c.superficie
119
+ }
120
+ }));
121
+ //# sourceMappingURL=PantallaDeEdicion.js.map