@acvl/mobile-components 0.0.0-stage → 0.0.2

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 (322) hide show
  1. package/README.md +147 -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/camara/CampoDeFotos.js +124 -0
  10. package/lib/module/camara/CampoDeFotos.js.map +1 -0
  11. package/lib/module/camara/elegir.js +104 -0
  12. package/lib/module/camara/elegir.js.map +1 -0
  13. package/lib/module/camara/index.js +10 -0
  14. package/lib/module/camara/index.js.map +1 -0
  15. package/lib/module/camara/reducir.js +93 -0
  16. package/lib/module/camara/reducir.js.map +1 -0
  17. package/lib/module/componentes/AccionesDelEncabezado.js +212 -0
  18. package/lib/module/componentes/AccionesDelEncabezado.js.map +1 -0
  19. package/lib/module/componentes/BotonDeAvatar.js +55 -0
  20. package/lib/module/componentes/BotonDeAvatar.js.map +1 -0
  21. package/lib/module/componentes/BotonGrande.js +105 -0
  22. package/lib/module/componentes/BotonGrande.js.map +1 -0
  23. package/lib/module/componentes/CabeceraEmpujada.js +101 -0
  24. package/lib/module/componentes/CabeceraEmpujada.js.map +1 -0
  25. package/lib/module/componentes/Chip.js +77 -0
  26. package/lib/module/componentes/Chip.js.map +1 -0
  27. package/lib/module/componentes/ContenidoDePantalla.js +56 -0
  28. package/lib/module/componentes/ContenidoDePantalla.js.map +1 -0
  29. package/lib/module/componentes/EstadoVacio.js +65 -0
  30. package/lib/module/componentes/EstadoVacio.js.map +1 -0
  31. package/lib/module/componentes/Foto.js +106 -0
  32. package/lib/module/componentes/Foto.js.map +1 -0
  33. package/lib/module/componentes/IconoDeRenglon.js +44 -0
  34. package/lib/module/componentes/IconoDeRenglon.js.map +1 -0
  35. package/lib/module/componentes/Logo.js +44 -0
  36. package/lib/module/componentes/Logo.js.map +1 -0
  37. package/lib/module/componentes/Nota.js +51 -0
  38. package/lib/module/componentes/Nota.js.map +1 -0
  39. package/lib/module/componentes/OpcionesExcluyentes.js +69 -0
  40. package/lib/module/componentes/OpcionesExcluyentes.js.map +1 -0
  41. package/lib/module/componentes/PantallaDeError.js +84 -0
  42. package/lib/module/componentes/PantallaDeError.js.map +1 -0
  43. package/lib/module/componentes/Pestanas.js +87 -0
  44. package/lib/module/componentes/Pestanas.js.map +1 -0
  45. package/lib/module/componentes/Rotulo.js +28 -0
  46. package/lib/module/componentes/Rotulo.js.map +1 -0
  47. package/lib/module/componentes/RotuloDeSeccion.js +87 -0
  48. package/lib/module/componentes/RotuloDeSeccion.js.map +1 -0
  49. package/lib/module/componentes/Tarjeta.js +63 -0
  50. package/lib/module/componentes/Tarjeta.js.map +1 -0
  51. package/lib/module/componentes/TarjetaDeDatos.js +79 -0
  52. package/lib/module/componentes/TarjetaDeDatos.js.map +1 -0
  53. package/lib/module/componentes/TiraDeFotos.js +184 -0
  54. package/lib/module/componentes/TiraDeFotos.js.map +1 -0
  55. package/lib/module/componentes/VisorDeFoto.js +171 -0
  56. package/lib/module/componentes/VisorDeFoto.js.map +1 -0
  57. package/lib/module/componentes/logos/bola-blanca.png +0 -0
  58. package/lib/module/componentes/logos/bola.png +0 -0
  59. package/lib/module/componentes/logos/logo-blanco.png +0 -0
  60. package/lib/module/componentes/logos/logo.png +0 -0
  61. package/lib/module/dialogos/HostDeDialogos.js +170 -0
  62. package/lib/module/dialogos/HostDeDialogos.js.map +1 -0
  63. package/lib/module/dialogos/dialogos.js +112 -0
  64. package/lib/module/dialogos/dialogos.js.map +1 -0
  65. package/lib/module/formularios/CampoDeSeleccion.js +72 -0
  66. package/lib/module/formularios/CampoDeSeleccion.js.map +1 -0
  67. package/lib/module/formularios/SelectorDeOpcion.js +406 -0
  68. package/lib/module/formularios/SelectorDeOpcion.js.map +1 -0
  69. package/lib/module/formularios/TextoDeAccesoControlado.js +73 -0
  70. package/lib/module/formularios/TextoDeAccesoControlado.js.map +1 -0
  71. package/lib/module/formularios/campos.js +501 -0
  72. package/lib/module/formularios/campos.js.map +1 -0
  73. package/lib/module/formularios/controlados.js +199 -0
  74. package/lib/module/formularios/controlados.js.map +1 -0
  75. package/lib/module/formularios/errores.js +91 -0
  76. package/lib/module/formularios/errores.js.map +1 -0
  77. package/lib/module/formularios/guardado.js +78 -0
  78. package/lib/module/formularios/guardado.js.map +1 -0
  79. package/lib/module/formularios/useBusqueda.js +22 -0
  80. package/lib/module/formularios/useBusqueda.js.map +1 -0
  81. package/lib/module/fotos/elegir.js +105 -0
  82. package/lib/module/fotos/elegir.js.map +1 -0
  83. package/lib/module/fotos/index.js +9 -0
  84. package/lib/module/fotos/index.js.map +1 -0
  85. package/lib/module/hoja/HojaDeLista.js +211 -0
  86. package/lib/module/hoja/HojaDeLista.js.map +1 -0
  87. package/lib/module/hoja/HojaInferior.js +112 -0
  88. package/lib/module/hoja/HojaInferior.js.map +1 -0
  89. package/lib/module/hoja/index.js +8 -0
  90. package/lib/module/hoja/index.js.map +1 -0
  91. package/lib/module/hoja/useMasDeLaFicha.js +48 -0
  92. package/lib/module/hoja/useMasDeLaFicha.js.map +1 -0
  93. package/lib/module/index.js +67 -0
  94. package/lib/module/index.js.map +1 -0
  95. package/lib/module/listas/HojaDeFiltros.js +270 -0
  96. package/lib/module/listas/HojaDeFiltros.js.map +1 -0
  97. package/lib/module/listas/ListaPaginada.js +103 -0
  98. package/lib/module/listas/ListaPaginada.js.map +1 -0
  99. package/lib/module/listas/TarjetaDeslizable.js +118 -0
  100. package/lib/module/listas/TarjetaDeslizable.js.map +1 -0
  101. package/lib/module/listas/paginado.js +11 -0
  102. package/lib/module/listas/paginado.js.map +1 -0
  103. package/lib/module/listas/piezas.js +666 -0
  104. package/lib/module/listas/piezas.js.map +1 -0
  105. package/lib/module/navegacion/BarraDePestanas.js +162 -0
  106. package/lib/module/navegacion/BarraDePestanas.js.map +1 -0
  107. package/lib/module/navegacion/BotonDeBarra.js +58 -0
  108. package/lib/module/navegacion/BotonDeBarra.js.map +1 -0
  109. package/lib/module/navegacion/encabezado.js +103 -0
  110. package/lib/module/navegacion/encabezado.js.map +1 -0
  111. package/lib/module/pantallas/PantallaDeAcceso.js +195 -0
  112. package/lib/module/pantallas/PantallaDeAcceso.js.map +1 -0
  113. package/lib/module/pantallas/PantallaDeEdicion.js +121 -0
  114. package/lib/module/pantallas/PantallaDeEdicion.js.map +1 -0
  115. package/lib/module/pantallas/PantallaDeFicha.js +94 -0
  116. package/lib/module/pantallas/PantallaDeFicha.js.map +1 -0
  117. package/lib/module/pantallas/PantallaDeHistorial.js +328 -0
  118. package/lib/module/pantallas/PantallaDeHistorial.js.map +1 -0
  119. package/lib/module/pantallas/PantallaDePerfil.js +137 -0
  120. package/lib/module/pantallas/PantallaDePerfil.js.map +1 -0
  121. package/lib/module/tema/ProveedorDeTema.js +122 -0
  122. package/lib/module/tema/ProveedorDeTema.js.map +1 -0
  123. package/lib/module/tema/estilos.js +54 -0
  124. package/lib/module/tema/estilos.js.map +1 -0
  125. package/lib/module/tema/fuentes.js +28 -0
  126. package/lib/module/tema/fuentes.js.map +1 -0
  127. package/lib/module/tema/index.js +8 -0
  128. package/lib/module/tema/index.js.map +1 -0
  129. package/lib/module/tema/paleta.js +107 -0
  130. package/lib/module/tema/paleta.js.map +1 -0
  131. package/lib/module/tema/tipografia.js +32 -0
  132. package/lib/module/tema/tipografia.js.map +1 -0
  133. package/lib/module/texto.js +48 -0
  134. package/lib/module/texto.js.map +1 -0
  135. package/lib/typescript/src/camara/CampoDeFotos.d.ts +30 -0
  136. package/lib/typescript/src/camara/CampoDeFotos.d.ts.map +1 -0
  137. package/lib/typescript/src/camara/elegir.d.ts +47 -0
  138. package/lib/typescript/src/camara/elegir.d.ts.map +1 -0
  139. package/lib/typescript/src/camara/index.d.ts +4 -0
  140. package/lib/typescript/src/camara/index.d.ts.map +1 -0
  141. package/lib/typescript/src/camara/reducir.d.ts +32 -0
  142. package/lib/typescript/src/camara/reducir.d.ts.map +1 -0
  143. package/lib/typescript/src/componentes/AccionesDelEncabezado.d.ts +34 -0
  144. package/lib/typescript/src/componentes/AccionesDelEncabezado.d.ts.map +1 -0
  145. package/lib/typescript/src/componentes/BotonDeAvatar.d.ts +17 -0
  146. package/lib/typescript/src/componentes/BotonDeAvatar.d.ts.map +1 -0
  147. package/lib/typescript/src/componentes/BotonGrande.d.ts +26 -0
  148. package/lib/typescript/src/componentes/BotonGrande.d.ts.map +1 -0
  149. package/lib/typescript/src/componentes/CabeceraEmpujada.d.ts +18 -0
  150. package/lib/typescript/src/componentes/CabeceraEmpujada.d.ts.map +1 -0
  151. package/lib/typescript/src/componentes/Chip.d.ts +14 -0
  152. package/lib/typescript/src/componentes/Chip.d.ts.map +1 -0
  153. package/lib/typescript/src/componentes/ContenidoDePantalla.d.ts +17 -0
  154. package/lib/typescript/src/componentes/ContenidoDePantalla.d.ts.map +1 -0
  155. package/lib/typescript/src/componentes/EstadoVacio.d.ts +17 -0
  156. package/lib/typescript/src/componentes/EstadoVacio.d.ts.map +1 -0
  157. package/lib/typescript/src/componentes/Foto.d.ts +41 -0
  158. package/lib/typescript/src/componentes/Foto.d.ts.map +1 -0
  159. package/lib/typescript/src/componentes/IconoDeRenglon.d.ts +25 -0
  160. package/lib/typescript/src/componentes/IconoDeRenglon.d.ts.map +1 -0
  161. package/lib/typescript/src/componentes/Logo.d.ts +13 -0
  162. package/lib/typescript/src/componentes/Logo.d.ts.map +1 -0
  163. package/lib/typescript/src/componentes/Nota.d.ts +7 -0
  164. package/lib/typescript/src/componentes/Nota.d.ts.map +1 -0
  165. package/lib/typescript/src/componentes/OpcionesExcluyentes.d.ts +14 -0
  166. package/lib/typescript/src/componentes/OpcionesExcluyentes.d.ts.map +1 -0
  167. package/lib/typescript/src/componentes/PantallaDeError.d.ts +23 -0
  168. package/lib/typescript/src/componentes/PantallaDeError.d.ts.map +1 -0
  169. package/lib/typescript/src/componentes/Pestanas.d.ts +28 -0
  170. package/lib/typescript/src/componentes/Pestanas.d.ts.map +1 -0
  171. package/lib/typescript/src/componentes/Rotulo.d.ts +6 -0
  172. package/lib/typescript/src/componentes/Rotulo.d.ts.map +1 -0
  173. package/lib/typescript/src/componentes/RotuloDeSeccion.d.ts +20 -0
  174. package/lib/typescript/src/componentes/RotuloDeSeccion.d.ts.map +1 -0
  175. package/lib/typescript/src/componentes/Tarjeta.d.ts +25 -0
  176. package/lib/typescript/src/componentes/Tarjeta.d.ts.map +1 -0
  177. package/lib/typescript/src/componentes/TarjetaDeDatos.d.ts +13 -0
  178. package/lib/typescript/src/componentes/TarjetaDeDatos.d.ts.map +1 -0
  179. package/lib/typescript/src/componentes/TiraDeFotos.d.ts +36 -0
  180. package/lib/typescript/src/componentes/TiraDeFotos.d.ts.map +1 -0
  181. package/lib/typescript/src/componentes/VisorDeFoto.d.ts +23 -0
  182. package/lib/typescript/src/componentes/VisorDeFoto.d.ts.map +1 -0
  183. package/lib/typescript/src/dialogos/HostDeDialogos.d.ts +14 -0
  184. package/lib/typescript/src/dialogos/HostDeDialogos.d.ts.map +1 -0
  185. package/lib/typescript/src/dialogos/dialogos.d.ts +65 -0
  186. package/lib/typescript/src/dialogos/dialogos.d.ts.map +1 -0
  187. package/lib/typescript/src/formularios/CampoDeSeleccion.d.ts +24 -0
  188. package/lib/typescript/src/formularios/CampoDeSeleccion.d.ts.map +1 -0
  189. package/lib/typescript/src/formularios/SelectorDeOpcion.d.ts +59 -0
  190. package/lib/typescript/src/formularios/SelectorDeOpcion.d.ts.map +1 -0
  191. package/lib/typescript/src/formularios/TextoDeAccesoControlado.d.ts +18 -0
  192. package/lib/typescript/src/formularios/TextoDeAccesoControlado.d.ts.map +1 -0
  193. package/lib/typescript/src/formularios/campos.d.ts +113 -0
  194. package/lib/typescript/src/formularios/campos.d.ts.map +1 -0
  195. package/lib/typescript/src/formularios/controlados.d.ts +29 -0
  196. package/lib/typescript/src/formularios/controlados.d.ts.map +1 -0
  197. package/lib/typescript/src/formularios/errores.d.ts +36 -0
  198. package/lib/typescript/src/formularios/errores.d.ts.map +1 -0
  199. package/lib/typescript/src/formularios/guardado.d.ts +36 -0
  200. package/lib/typescript/src/formularios/guardado.d.ts.map +1 -0
  201. package/lib/typescript/src/formularios/useBusqueda.d.ts +7 -0
  202. package/lib/typescript/src/formularios/useBusqueda.d.ts.map +1 -0
  203. package/lib/typescript/src/fotos/elegir.d.ts +28 -0
  204. package/lib/typescript/src/fotos/elegir.d.ts.map +1 -0
  205. package/lib/typescript/src/fotos/index.d.ts +3 -0
  206. package/lib/typescript/src/fotos/index.d.ts.map +1 -0
  207. package/lib/typescript/src/hoja/HojaDeLista.d.ts +50 -0
  208. package/lib/typescript/src/hoja/HojaDeLista.d.ts.map +1 -0
  209. package/lib/typescript/src/hoja/HojaInferior.d.ts +21 -0
  210. package/lib/typescript/src/hoja/HojaInferior.d.ts.map +1 -0
  211. package/lib/typescript/src/hoja/index.d.ts +4 -0
  212. package/lib/typescript/src/hoja/index.d.ts.map +1 -0
  213. package/lib/typescript/src/hoja/useMasDeLaFicha.d.ts +27 -0
  214. package/lib/typescript/src/hoja/useMasDeLaFicha.d.ts.map +1 -0
  215. package/lib/typescript/src/index.d.ts +46 -0
  216. package/lib/typescript/src/index.d.ts.map +1 -0
  217. package/lib/typescript/src/listas/HojaDeFiltros.d.ts +76 -0
  218. package/lib/typescript/src/listas/HojaDeFiltros.d.ts.map +1 -0
  219. package/lib/typescript/src/listas/ListaPaginada.d.ts +39 -0
  220. package/lib/typescript/src/listas/ListaPaginada.d.ts.map +1 -0
  221. package/lib/typescript/src/listas/TarjetaDeslizable.d.ts +33 -0
  222. package/lib/typescript/src/listas/TarjetaDeslizable.d.ts.map +1 -0
  223. package/lib/typescript/src/listas/paginado.d.ts +16 -0
  224. package/lib/typescript/src/listas/paginado.d.ts.map +1 -0
  225. package/lib/typescript/src/listas/piezas.d.ts +157 -0
  226. package/lib/typescript/src/listas/piezas.d.ts.map +1 -0
  227. package/lib/typescript/src/navegacion/BarraDePestanas.d.ts +57 -0
  228. package/lib/typescript/src/navegacion/BarraDePestanas.d.ts.map +1 -0
  229. package/lib/typescript/src/navegacion/BotonDeBarra.d.ts +15 -0
  230. package/lib/typescript/src/navegacion/BotonDeBarra.d.ts.map +1 -0
  231. package/lib/typescript/src/navegacion/encabezado.d.ts +44 -0
  232. package/lib/typescript/src/navegacion/encabezado.d.ts.map +1 -0
  233. package/lib/typescript/src/pantallas/PantallaDeAcceso.d.ts +32 -0
  234. package/lib/typescript/src/pantallas/PantallaDeAcceso.d.ts.map +1 -0
  235. package/lib/typescript/src/pantallas/PantallaDeEdicion.d.ts +38 -0
  236. package/lib/typescript/src/pantallas/PantallaDeEdicion.d.ts.map +1 -0
  237. package/lib/typescript/src/pantallas/PantallaDeFicha.d.ts +35 -0
  238. package/lib/typescript/src/pantallas/PantallaDeFicha.d.ts.map +1 -0
  239. package/lib/typescript/src/pantallas/PantallaDeHistorial.d.ts +65 -0
  240. package/lib/typescript/src/pantallas/PantallaDeHistorial.d.ts.map +1 -0
  241. package/lib/typescript/src/pantallas/PantallaDePerfil.d.ts +19 -0
  242. package/lib/typescript/src/pantallas/PantallaDePerfil.d.ts.map +1 -0
  243. package/lib/typescript/src/tema/ProveedorDeTema.d.ts +32 -0
  244. package/lib/typescript/src/tema/ProveedorDeTema.d.ts.map +1 -0
  245. package/lib/typescript/src/tema/estilos.d.ts +31 -0
  246. package/lib/typescript/src/tema/estilos.d.ts.map +1 -0
  247. package/lib/typescript/src/tema/fuentes.d.ts +20 -0
  248. package/lib/typescript/src/tema/fuentes.d.ts.map +1 -0
  249. package/lib/typescript/src/tema/index.d.ts +6 -0
  250. package/lib/typescript/src/tema/index.d.ts.map +1 -0
  251. package/lib/typescript/src/tema/paleta.d.ts +86 -0
  252. package/lib/typescript/src/tema/paleta.d.ts.map +1 -0
  253. package/lib/typescript/src/tema/tipografia.d.ts +29 -0
  254. package/lib/typescript/src/tema/tipografia.d.ts.map +1 -0
  255. package/lib/typescript/src/texto.d.ts +16 -0
  256. package/lib/typescript/src/texto.d.ts.map +1 -0
  257. package/package.json +140 -5
  258. package/src/camara/CampoDeFotos.tsx +132 -0
  259. package/src/camara/elegir.ts +113 -0
  260. package/src/camara/index.ts +15 -0
  261. package/src/camara/reducir.ts +87 -0
  262. package/src/componentes/AccionesDelEncabezado.tsx +247 -0
  263. package/src/componentes/BotonDeAvatar.tsx +59 -0
  264. package/src/componentes/BotonGrande.tsx +100 -0
  265. package/src/componentes/CabeceraEmpujada.tsx +69 -0
  266. package/src/componentes/Chip.tsx +60 -0
  267. package/src/componentes/ContenidoDePantalla.tsx +53 -0
  268. package/src/componentes/EstadoVacio.tsx +45 -0
  269. package/src/componentes/Foto.tsx +92 -0
  270. package/src/componentes/IconoDeRenglon.tsx +42 -0
  271. package/src/componentes/Logo.tsx +34 -0
  272. package/src/componentes/Nota.tsx +37 -0
  273. package/src/componentes/OpcionesExcluyentes.tsx +62 -0
  274. package/src/componentes/PantallaDeError.tsx +76 -0
  275. package/src/componentes/Pestanas.tsx +86 -0
  276. package/src/componentes/Rotulo.tsx +21 -0
  277. package/src/componentes/RotuloDeSeccion.tsx +71 -0
  278. package/src/componentes/Tarjeta.tsx +58 -0
  279. package/src/componentes/TarjetaDeDatos.tsx +62 -0
  280. package/src/componentes/TiraDeFotos.tsx +189 -0
  281. package/src/componentes/VisorDeFoto.tsx +181 -0
  282. package/src/componentes/logos/bola-blanca.png +0 -0
  283. package/src/componentes/logos/bola.png +0 -0
  284. package/src/componentes/logos/logo-blanco.png +0 -0
  285. package/src/componentes/logos/logo.png +0 -0
  286. package/src/dialogos/HostDeDialogos.tsx +172 -0
  287. package/src/dialogos/dialogos.ts +148 -0
  288. package/src/formularios/CampoDeSeleccion.tsx +60 -0
  289. package/src/formularios/SelectorDeOpcion.tsx +407 -0
  290. package/src/formularios/TextoDeAccesoControlado.tsx +72 -0
  291. package/src/formularios/campos.tsx +497 -0
  292. package/src/formularios/controlados.tsx +200 -0
  293. package/src/formularios/errores.ts +105 -0
  294. package/src/formularios/guardado.ts +76 -0
  295. package/src/formularios/useBusqueda.ts +19 -0
  296. package/src/fotos/elegir.ts +116 -0
  297. package/src/fotos/index.ts +6 -0
  298. package/src/hoja/HojaDeLista.tsx +214 -0
  299. package/src/hoja/HojaInferior.tsx +103 -0
  300. package/src/hoja/index.ts +5 -0
  301. package/src/hoja/useMasDeLaFicha.tsx +63 -0
  302. package/src/index.ts +151 -0
  303. package/src/listas/HojaDeFiltros.tsx +286 -0
  304. package/src/listas/ListaPaginada.tsx +117 -0
  305. package/src/listas/TarjetaDeslizable.tsx +126 -0
  306. package/src/listas/paginado.ts +15 -0
  307. package/src/listas/piezas.tsx +670 -0
  308. package/src/navegacion/BarraDePestanas.tsx +198 -0
  309. package/src/navegacion/BotonDeBarra.tsx +61 -0
  310. package/src/navegacion/encabezado.tsx +88 -0
  311. package/src/pantallas/PantallaDeAcceso.tsx +184 -0
  312. package/src/pantallas/PantallaDeEdicion.tsx +116 -0
  313. package/src/pantallas/PantallaDeFicha.tsx +115 -0
  314. package/src/pantallas/PantallaDeHistorial.tsx +293 -0
  315. package/src/pantallas/PantallaDePerfil.tsx +126 -0
  316. package/src/tema/ProveedorDeTema.tsx +150 -0
  317. package/src/tema/estilos.ts +51 -0
  318. package/src/tema/fuentes.ts +20 -0
  319. package/src/tema/index.ts +10 -0
  320. package/src/tema/paleta.ts +147 -0
  321. package/src/tema/tipografia.ts +29 -0
  322. package/src/texto.tsx +44 -0
@@ -0,0 +1,670 @@
1
+ import Chip from "../componentes/Chip";
2
+ import IconoDeRenglon from "../componentes/IconoDeRenglon";
3
+ import Pestanas from "../componentes/Pestanas";
4
+ import Tarjeta from "../componentes/Tarjeta";
5
+ import { crearEstilos, fuenteBase, renglon, tipografia, usePaleta } from "../tema";
6
+ import { type Pestana } from "../componentes/Pestanas";
7
+ import { Text, TextInput } from "../texto";
8
+ import { type TonoDeChip } from "../componentes/Chip";
9
+ import MaterialCommunityIcons from "@expo/vector-icons/MaterialCommunityIcons";
10
+ import type { Href } from "expo-router";
11
+ import { router } from "expo-router";
12
+ import React from "react";
13
+ import {
14
+ ActivityIndicator,
15
+ Linking,
16
+ Platform,
17
+ Pressable,
18
+ View,
19
+ type StyleProp,
20
+ type TextInputProps,
21
+ type ViewStyle,
22
+ } from "react-native";
23
+
24
+ /**
25
+ * Las piezas de las listas y las fichas: la cabecera de una lista (buscador y pestañas), la
26
+ * tarjeta de un renglón y, en las fichas, las secciones, las ligas a otra ficha y los contactos.
27
+ * Todo es de lectura.
28
+ */
29
+
30
+ /**
31
+ * El buscador de una lista y del mapa. Lo escrito se le pasa a la consulta con pausa
32
+ * (`useBusqueda`): no una petición por letra.
33
+ *
34
+ * **El texto de sugerencia va en un renglón, con «…» si no cabe.** Es un `Text` encima del campo y
35
+ * no el `placeholder` del `TextInput`: el de Android parte en dos renglones lo que no cabe, y el
36
+ * segundo queda cortado a la mitad.
37
+ *
38
+ * Dentro de una hoja de `@gorhom/bottom-sheet` el campo es el suyo (`entrada`, su
39
+ * `BottomSheetTextInput`): con el de React Native el teclado tapa la hoja en vez de subirla.
40
+ */
41
+ export function Buscador({
42
+ texto,
43
+ onCambiar,
44
+ placeholder,
45
+ autoFocus,
46
+ onBlur,
47
+ style,
48
+ entrada: Entrada,
49
+ }: {
50
+ texto: string;
51
+ onCambiar: (texto: string) => void;
52
+ placeholder: string;
53
+ autoFocus?: boolean;
54
+ onBlur?: () => void;
55
+ style?: StyleProp<ViewStyle>;
56
+ /** El campo en el que se escribe, si no es el `TextInput` de la app. */
57
+ entrada?: React.ComponentType<TextInputProps>;
58
+ }) {
59
+ const c = usePaleta();
60
+ const styles = useStyles();
61
+ const Campo = Entrada ?? TextInput;
62
+ return (
63
+ <View style={[styles.buscador, style]}>
64
+ <MaterialCommunityIcons name="magnify" size={24} color={c.secondary} />
65
+ <View style={styles.campo}>
66
+ {!texto ? (
67
+ <Text
68
+ style={styles.sugerencia}
69
+ numberOfLines={1}
70
+ ellipsizeMode="tail"
71
+ pointerEvents="none"
72
+ >
73
+ {placeholder}
74
+ </Text>
75
+ ) : null}
76
+ <Campo
77
+ value={texto}
78
+ onChangeText={onCambiar}
79
+ accessibilityLabel={placeholder}
80
+ autoCorrect={false}
81
+ autoFocus={autoFocus}
82
+ onBlur={onBlur}
83
+ returnKeyType="search"
84
+ selectionColor={c.primary}
85
+ // El de la app ya trae su letra y su color; uno de fuera, no.
86
+ style={[fuenteBase, { color: c.texto }, styles.entrada]}
87
+ />
88
+ </View>
89
+ {texto ? (
90
+ <Pressable
91
+ onPress={() => onCambiar("")}
92
+ hitSlop={8}
93
+ accessibilityLabel="Borrar búsqueda"
94
+ >
95
+ <MaterialCommunityIcons name="close-circle" size={22} color={c.secondary} />
96
+ </Pressable>
97
+ ) : null}
98
+ </View>
99
+ );
100
+ }
101
+
102
+ /** Lo que dice el botón de los filtros de una lista y qué abre. */
103
+ export interface FiltrosDeCabecera {
104
+ /** Cuántos filtros hay puestos: el globito. */
105
+ cuenta: number;
106
+ /** Si sólo cambió el orden: un punto. */
107
+ punto: boolean;
108
+ onPress: () => void;
109
+ }
110
+
111
+ /**
112
+ * El botón de los filtros, junto al buscador: dice cuántos hay puestos, como el del mapa, y lleva un
113
+ * punto si sólo cambió el orden.
114
+ */
115
+ function BotonDeFiltros({ cuenta, punto, onPress }: FiltrosDeCabecera) {
116
+ const c = usePaleta();
117
+ const styles = useStyles();
118
+ const activo = Boolean(cuenta) || punto;
119
+ return (
120
+ <Pressable
121
+ onPress={onPress}
122
+ accessibilityRole="button"
123
+ accessibilityLabel={cuenta ? `Filtros, ${cuenta} puestos` : "Filtros y orden"}
124
+ hitSlop={4}
125
+ style={({ pressed }) => [
126
+ styles.botonDeFiltros,
127
+ activo && styles.botonDeFiltrosActivo,
128
+ pressed && styles.presionada,
129
+ ]}
130
+ >
131
+ <MaterialCommunityIcons
132
+ name="filter-variant"
133
+ size={26}
134
+ color={activo ? c.primary : c.secondaryDark}
135
+ />
136
+ {cuenta ? (
137
+ <View style={styles.globito}>
138
+ <Text style={styles.globitoTexto} maxFontSizeMultiplier={1.2}>
139
+ {cuenta}
140
+ </Text>
141
+ </View>
142
+ ) : punto ? (
143
+ <View style={styles.punto} />
144
+ ) : null}
145
+ </Pressable>
146
+ );
147
+ }
148
+
149
+ /**
150
+ * Lo de arriba de una lista: el buscador, con el botón de sus filtros a la derecha si los tiene, y
151
+ * las pestañas que la cortan («En curso», «Por iniciar»). Con una sola pestaña no se pintan.
152
+ *
153
+ * Una lista cuyo servidor no busca por texto (una bandeja que sólo se filtra) va sin `placeholder`:
154
+ * entonces no lleva buscador —uno que no filtrara nada engañaría— y el botón de los filtros queda
155
+ * solo, a la derecha.
156
+ */
157
+ export function CabeceraDeLista<K extends string>({
158
+ texto,
159
+ onBuscar,
160
+ placeholder,
161
+ pestanas,
162
+ activa,
163
+ onPestana,
164
+ filtros,
165
+ }: {
166
+ texto?: string;
167
+ onBuscar?: (texto: string) => void;
168
+ /** Sin esto no hay buscador. */
169
+ placeholder?: string;
170
+ pestanas?: readonly Pestana<K>[];
171
+ activa?: K;
172
+ onPestana?: (key: K) => void;
173
+ filtros?: FiltrosDeCabecera;
174
+ }) {
175
+ const styles = useStyles();
176
+ return (
177
+ <View style={styles.cabecera}>
178
+ {placeholder !== undefined || filtros ? (
179
+ <View style={styles.filaDeBusqueda}>
180
+ {placeholder !== undefined ? (
181
+ <Buscador
182
+ texto={texto ?? ""}
183
+ onCambiar={onBuscar ?? (() => {})}
184
+ placeholder={placeholder}
185
+ style={styles.flex}
186
+ />
187
+ ) : (
188
+ <View style={styles.flex} />
189
+ )}
190
+ {filtros ? <BotonDeFiltros {...filtros} /> : null}
191
+ </View>
192
+ ) : null}
193
+ {pestanas && pestanas.length > 1 && activa && onPestana ? (
194
+ <Pestanas pestanas={pestanas} activa={activa} onSelect={onPestana} />
195
+ ) : null}
196
+ </View>
197
+ );
198
+ }
199
+
200
+ /**
201
+ * Un renglón de una lista como tarjeta: el título y, a su derecha, su estado (un `Chip`); debajo,
202
+ * lo que acompaña, un renglón por dato. Nada se recorta: con la letra al 180% parte en los
203
+ * renglones que haga falta.
204
+ */
205
+ export function TarjetaDeLista({
206
+ titulo,
207
+ estado,
208
+ lineas,
209
+ children,
210
+ onPress,
211
+ }: {
212
+ titulo: string;
213
+ estado?: React.ReactNode;
214
+ /** Los renglones de abajo; los vacíos no se pintan. */
215
+ lineas?: (string | null | undefined | false)[];
216
+ children?: React.ReactNode;
217
+ onPress?: () => void;
218
+ }) {
219
+ const styles = useStyles();
220
+ return (
221
+ <Tarjeta onPress={onPress}>
222
+ <View style={styles.tarjetaCabecera}>
223
+ <Text style={styles.tarjetaTitulo}>{titulo}</Text>
224
+ {estado}
225
+ </View>
226
+ {lineas
227
+ ?.filter((l): l is string => Boolean(l))
228
+ .map((l, i) => (
229
+ <Text key={i} style={styles.linea}>
230
+ {l}
231
+ </Text>
232
+ ))}
233
+ {children}
234
+ </Tarjeta>
235
+ );
236
+ }
237
+
238
+ /** Una sección de una ficha: su rótulo y lo suyo debajo. */
239
+ export function SeccionDeFicha({
240
+ titulo,
241
+ children,
242
+ }: {
243
+ titulo: string;
244
+ children: React.ReactNode;
245
+ }) {
246
+ const styles = useStyles();
247
+ return (
248
+ <View style={styles.seccion}>
249
+ <Text style={styles.rotulo}>{titulo}</Text>
250
+ {children}
251
+ </View>
252
+ );
253
+ }
254
+
255
+ /**
256
+ * Un renglón que abre otra ficha: «Operador · Juan Pérez ›». Sin `href` (no hay a dónde, o no se
257
+ * tiene el permiso) se pinta igual pero sin la flecha y sin abrir nada.
258
+ */
259
+ export function RenglonDeLiga({
260
+ etiqueta,
261
+ valor,
262
+ href,
263
+ detalle,
264
+ }: {
265
+ etiqueta: string;
266
+ valor: string;
267
+ href?: Href | null;
268
+ detalle?: string | null;
269
+ }) {
270
+ const c = usePaleta();
271
+ const styles = useStyles();
272
+ return (
273
+ <Pressable
274
+ onPress={href ? () => router.push(href) : undefined}
275
+ disabled={!href}
276
+ accessibilityRole={href ? "link" : undefined}
277
+ style={({ pressed }) => [styles.renglon, pressed && styles.presionada]}
278
+ >
279
+ <View style={styles.renglonTexto}>
280
+ <Text style={styles.etiqueta}>{etiqueta}</Text>
281
+ {/* En el color primario cuando abre otra ficha: así se distingue de un dato. */}
282
+ <Text style={[styles.valor, href ? styles.liga : null]}>{valor}</Text>
283
+ {detalle ? <Text style={styles.linea}>{detalle}</Text> : null}
284
+ </View>
285
+ {href ? (
286
+ <IconoDeRenglon
287
+ name="chevron-right"
288
+ fontSize={tipografia.subtitulo}
289
+ color={c.secondaryLight}
290
+ />
291
+ ) : null}
292
+ </Pressable>
293
+ );
294
+ }
295
+
296
+ /**
297
+ * Un renglón que dice cuántos hay de algo y lo abre: «Excepciones 3 ›». Como los contenidos de una
298
+ * transferencia en la app de acv-wms. Lo que abre es de quien lo usa (una `HojaInferior`).
299
+ */
300
+ export function FilaConContador({
301
+ icono,
302
+ etiqueta,
303
+ cuantos,
304
+ detalle,
305
+ onPress,
306
+ }: {
307
+ icono: React.ComponentProps<typeof MaterialCommunityIcons>["name"];
308
+ etiqueta: string;
309
+ /** `null` mientras se cuenta. */
310
+ cuantos: number | null;
311
+ /** Lo que acompaña: «2 pendientes». */
312
+ detalle?: string | null;
313
+ onPress: () => void;
314
+ }) {
315
+ const c = usePaleta();
316
+ const styles = useStyles();
317
+ return (
318
+ <Pressable
319
+ onPress={onPress}
320
+ accessibilityRole="button"
321
+ style={({ pressed }) => [styles.renglon, pressed && styles.presionada]}
322
+ >
323
+ <View style={styles.iconoDeContador}>
324
+ <MaterialCommunityIcons name={icono} size={20} color={c.primary} />
325
+ </View>
326
+ <View style={styles.renglonTexto}>
327
+ <Text style={styles.valor}>{etiqueta}</Text>
328
+ {detalle ? <Text style={styles.linea}>{detalle}</Text> : null}
329
+ </View>
330
+ <Text style={styles.cuantos}>{cuantos ?? "…"}</Text>
331
+ <IconoDeRenglon
332
+ name="chevron-right"
333
+ fontSize={tipografia.subtitulo}
334
+ color={c.secondaryLight}
335
+ />
336
+ </Pressable>
337
+ );
338
+ }
339
+
340
+ /** Los dígitos de un teléfono, para WhatsApp: `+52 664 123 4567` → `526641234567`. */
341
+ const digitos = (telefono: string) => telefono.replace(/\D/g, "");
342
+
343
+ /**
344
+ * Una persona con su teléfono y su correo, **para llamarle o escribirle desde ahí**: cada uno es un
345
+ * botón. Sin teléfono ni correo, sólo su nombre.
346
+ */
347
+ export function RenglonDeContacto({
348
+ nombre,
349
+ detalle,
350
+ telefono,
351
+ correo,
352
+ enHoja,
353
+ }: {
354
+ nombre: string;
355
+ /** El puesto, el parentesco, el tipo de contacto. */
356
+ detalle?: string | null;
357
+ telefono?: string | null;
358
+ correo?: string | null;
359
+ /** En una hoja (`HojaInferior`), del color del fondo, como `RenglonDeHoja`: si no, no se distingue. */
360
+ enHoja?: boolean;
361
+ }) {
362
+ const c = usePaleta();
363
+ const styles = useStyles();
364
+ const boton = (
365
+ icono: React.ComponentProps<typeof MaterialCommunityIcons>["name"],
366
+ etiqueta: string,
367
+ url: string,
368
+ ) => (
369
+ <Pressable
370
+ key={etiqueta}
371
+ onPress={() => Linking.openURL(url).catch(() => {})}
372
+ accessibilityRole="button"
373
+ accessibilityLabel={etiqueta}
374
+ hitSlop={6}
375
+ style={({ pressed }) => [styles.accion, pressed && styles.presionada]}
376
+ >
377
+ <MaterialCommunityIcons name={icono} size={24} color={c.primary} />
378
+ </Pressable>
379
+ );
380
+ return (
381
+ <View style={[styles.renglon, enHoja && styles.renglonEnHoja]}>
382
+ <View style={styles.renglonTexto}>
383
+ <Text style={styles.valor}>{nombre}</Text>
384
+ {detalle ? <Text style={styles.linea}>{detalle}</Text> : null}
385
+ {telefono ? <Text style={styles.linea}>{telefono}</Text> : null}
386
+ {correo ? <Text style={styles.linea}>{correo}</Text> : null}
387
+ </View>
388
+ <View style={styles.acciones}>
389
+ {telefono ? boton("phone", `Llamar a ${nombre}`, `tel:${telefono}`) : null}
390
+ {telefono
391
+ ? boton(
392
+ "whatsapp",
393
+ `WhatsApp a ${nombre}`,
394
+ `https://wa.me/${digitos(telefono)}`,
395
+ )
396
+ : null}
397
+ {correo ? boton("email-outline", `Correo a ${nombre}`, `mailto:${correo}`) : null}
398
+ </View>
399
+ </View>
400
+ );
401
+ }
402
+
403
+ /**
404
+ * Abre una dirección en la app de mapas del teléfono: Apple Maps en iOS y, en Android, la que
405
+ * atienda `geo:` (Google Maps, Waze…). Si ninguna la atiende, Google Maps en el navegador.
406
+ */
407
+ const abrirEnMapas = (direccion: string) => {
408
+ const q = encodeURIComponent(direccion);
409
+ const nativa = Platform.OS === "ios" ? `maps:0,0?q=${q}` : `geo:0,0?q=${q}`;
410
+ Linking.openURL(nativa).catch(() =>
411
+ Linking.openURL(`https://www.google.com/maps/search/?api=1&query=${q}`).catch(() => {}),
412
+ );
413
+ };
414
+
415
+ /**
416
+ * Una dirección **que se abre en el mapa del teléfono**: el renglón entero es el botón, para
417
+ * llegar a donde se entrega sin copiarla a mano. Las líneas que falten no se pintan; sin ninguna,
418
+ * no hay renglón. Es el hermano de `RenglonDeContacto`.
419
+ */
420
+ export function RenglonDeDireccion({
421
+ etiqueta = "Dirección",
422
+ lineas,
423
+ enHoja,
424
+ }: {
425
+ etiqueta?: string;
426
+ /** La calle, la colonia, «Ciudad, Estado, CP», el país: un renglón cada una. */
427
+ lineas: (string | null | undefined)[];
428
+ /** En una hoja (`HojaInferior`), del color del fondo, como `RenglonDeContacto`. */
429
+ enHoja?: boolean;
430
+ }) {
431
+ const c = usePaleta();
432
+ const styles = useStyles();
433
+ const presentes = lineas.map((l) => l?.trim()).filter((l): l is string => Boolean(l));
434
+ if (!presentes.length) return null;
435
+ return (
436
+ <Pressable
437
+ onPress={() => abrirEnMapas(presentes.join(", "))}
438
+ accessibilityRole="link"
439
+ accessibilityLabel={`Abrir en el mapa: ${presentes.join(", ")}`}
440
+ style={({ pressed }) => [
441
+ styles.renglon,
442
+ enHoja && styles.renglonEnHoja,
443
+ pressed && styles.presionada,
444
+ ]}
445
+ >
446
+ <View style={styles.renglonTexto}>
447
+ <Text style={styles.etiqueta}>{etiqueta}</Text>
448
+ {presentes.map((l, i) => (
449
+ <Text key={i} style={i === 0 ? styles.valor : styles.linea}>
450
+ {l}
451
+ </Text>
452
+ ))}
453
+ </View>
454
+ <View style={styles.accion}>
455
+ <MaterialCommunityIcons name="map-marker-outline" size={24} color={c.primary} />
456
+ </View>
457
+ </Pressable>
458
+ );
459
+ }
460
+
461
+ /**
462
+ * Un renglón de una hoja (`HojaInferior`): el título con su chip y lo que acompaña. **No es
463
+ * `TarjetaDeLista`**: ésa es del color de la hoja y adentro de ella no se distinguía un renglón del
464
+ * siguiente. Con `onPress` se toca (abre un archivo, una ficha) y lleva una flecha.
465
+ */
466
+ export function RenglonDeHoja({
467
+ titulo,
468
+ estado,
469
+ lineas,
470
+ atenuado,
471
+ onPress,
472
+ children,
473
+ }: {
474
+ titulo: string;
475
+ estado?: { texto: string; tono: TonoDeChip } | null;
476
+ lineas: (string | null | undefined | false)[];
477
+ /** Lo que ya no cuenta (una excepción revocada, una vigencia reemplazada). */
478
+ atenuado?: boolean;
479
+ onPress?: () => void;
480
+ /** Lo que va debajo: el botón de una administrativa. */
481
+ children?: React.ReactNode;
482
+ }) {
483
+ const c = usePaleta();
484
+ const styles = useStyles();
485
+ return (
486
+ <Pressable
487
+ onPress={onPress}
488
+ disabled={!onPress}
489
+ accessibilityRole={onPress ? "button" : undefined}
490
+ style={({ pressed }) => [
491
+ styles.renglonDeHoja,
492
+ atenuado && styles.atenuado,
493
+ pressed && styles.presionada,
494
+ ]}
495
+ >
496
+ {estado || !onPress ? (
497
+ <View style={styles.tarjetaCabecera}>
498
+ <Text style={styles.tarjetaTitulo}>{titulo}</Text>
499
+ {estado ? <Chip texto={estado.texto} tono={estado.tono} /> : null}
500
+ </View>
501
+ ) : (
502
+ // Con la flecha, sin partir: el título toma lo que queda y la flecha se queda en el
503
+ // primer renglón aunque el título ocupe varios.
504
+ <View style={styles.cabeceraConFlecha}>
505
+ <Text style={[styles.tarjetaTitulo, styles.flex]}>{titulo}</Text>
506
+ <MaterialCommunityIcons name="chevron-right" size={24} color={c.secondary} />
507
+ </View>
508
+ )}
509
+ {lineas
510
+ .filter((l): l is string => Boolean(l))
511
+ .map((l, i) => (
512
+ <Text key={i} style={styles.linea}>
513
+ {l}
514
+ </Text>
515
+ ))}
516
+ {children}
517
+ </Pressable>
518
+ );
519
+ }
520
+
521
+ /**
522
+ * Lo que se dice al pie de una hoja que no trae todos (las hojas piden los primeros 100): «Hay 140;
523
+ * aquí van los 100 más recientes.» Si están todos, nada.
524
+ */
525
+ export function AvisoDeRecortados({ cuantos, traidos }: { cuantos: number; traidos: number }) {
526
+ const styles = useStyles();
527
+ if (cuantos <= traidos) return null;
528
+ return (
529
+ <Text style={styles.linea}>
530
+ Hay {cuantos}; aquí van los {traidos} más recientes.
531
+ </Text>
532
+ );
533
+ }
534
+
535
+ /** Lo que dice una hoja mientras carga, si falló o si no hay nada. */
536
+ export function EstadoDeHoja({
537
+ cargando,
538
+ fallo,
539
+ vacio,
540
+ }: {
541
+ cargando: boolean;
542
+ fallo: boolean;
543
+ vacio: string | null;
544
+ }) {
545
+ const c = usePaleta();
546
+ const styles = useStyles();
547
+ if (cargando) return <ActivityIndicator color={c.primary} />;
548
+ if (fallo)
549
+ return <Text style={styles.linea}>No se pudo cargar. Jala la ficha para releer.</Text>;
550
+ return vacio ? <Text style={styles.linea}>{vacio}</Text> : null;
551
+ }
552
+
553
+ const useStyles = crearEstilos((c) => ({
554
+ cabecera: { gap: 10, paddingTop: 12, paddingBottom: 4 },
555
+ filaDeBusqueda: { flexDirection: "row", alignItems: "center", gap: 10 },
556
+ flex: { flex: 1 },
557
+ // Del alto del buscador y con su borde, para que se lean como una sola barra.
558
+ botonDeFiltros: {
559
+ width: 52,
560
+ height: 52,
561
+ borderRadius: 14,
562
+ borderWidth: 1.5,
563
+ borderColor: c.secondaryLighter,
564
+ backgroundColor: c.superficie,
565
+ alignItems: "center",
566
+ justifyContent: "center",
567
+ },
568
+ botonDeFiltrosActivo: { borderColor: c.primary },
569
+ globito: {
570
+ position: "absolute",
571
+ top: 4,
572
+ right: 4,
573
+ minWidth: 18,
574
+ height: 18,
575
+ borderRadius: 9,
576
+ paddingHorizontal: 4,
577
+ backgroundColor: c.primary,
578
+ alignItems: "center",
579
+ justifyContent: "center",
580
+ },
581
+ globitoTexto: { color: c.sobrePrimario, fontSize: 12, fontWeight: "800" },
582
+ punto: {
583
+ position: "absolute",
584
+ top: 8,
585
+ right: 8,
586
+ width: 10,
587
+ height: 10,
588
+ borderRadius: 5,
589
+ backgroundColor: c.primary,
590
+ },
591
+ buscador: {
592
+ flexDirection: "row",
593
+ alignItems: "center",
594
+ gap: 6,
595
+ backgroundColor: c.superficie,
596
+ borderRadius: 14,
597
+ borderWidth: 1.5,
598
+ borderColor: c.secondaryLighter,
599
+ paddingHorizontal: 12,
600
+ minHeight: 52,
601
+ },
602
+ campo: { flex: 1, justifyContent: "center" },
603
+ entrada: { fontSize: tipografia.cuerpo, paddingVertical: 10, paddingHorizontal: 0 },
604
+ // Encima del campo, donde iría el `placeholder`: mismo tamaño, sin partirse.
605
+ sugerencia: {
606
+ position: "absolute",
607
+ left: 0,
608
+ right: 0,
609
+ fontSize: tipografia.cuerpo,
610
+ color: c.secondaryLight,
611
+ },
612
+ presionada: { opacity: 0.7 },
613
+ renglonDeHoja: { backgroundColor: c.fondo, borderRadius: 14, padding: 14, gap: 4 },
614
+ cabeceraConFlecha: { flexDirection: "row", alignItems: "flex-start", gap: 8 },
615
+ atenuado: { opacity: 0.55 },
616
+ tarjetaCabecera: {
617
+ flexDirection: "row",
618
+ alignItems: "flex-start",
619
+ justifyContent: "space-between",
620
+ flexWrap: "wrap",
621
+ gap: 8,
622
+ },
623
+ tarjetaTitulo: { flexShrink: 1, ...renglon(tipografia.subtitulo), fontWeight: "800" },
624
+ linea: { ...renglon(tipografia.secundario), color: c.secondary },
625
+ seccion: { gap: 8 },
626
+ rotulo: {
627
+ ...renglon(tipografia.etiqueta),
628
+ fontWeight: "800",
629
+ color: c.secondary,
630
+ textTransform: "uppercase",
631
+ letterSpacing: 0.8,
632
+ },
633
+ renglon: {
634
+ flexDirection: "row",
635
+ alignItems: "center",
636
+ gap: 10,
637
+ backgroundColor: c.superficie,
638
+ borderRadius: 14,
639
+ padding: 14,
640
+ },
641
+ renglonTexto: { flex: 1, gap: 2 },
642
+ renglonEnHoja: { backgroundColor: c.fondo },
643
+ etiqueta: {
644
+ ...renglon(tipografia.etiqueta),
645
+ fontWeight: "800",
646
+ color: c.secondary,
647
+ textTransform: "uppercase",
648
+ letterSpacing: 0.8,
649
+ },
650
+ valor: { ...renglon(tipografia.subtitulo), fontWeight: "800" },
651
+ liga: { color: c.primary },
652
+ iconoDeContador: {
653
+ width: 36,
654
+ height: 36,
655
+ borderRadius: 18,
656
+ alignItems: "center",
657
+ justifyContent: "center",
658
+ backgroundColor: c.primaryWash,
659
+ },
660
+ cuantos: { ...renglon(tipografia.subtitulo), fontWeight: "800", color: c.secondary },
661
+ acciones: { flexDirection: "row", gap: 6 },
662
+ accion: {
663
+ width: 44,
664
+ height: 44,
665
+ borderRadius: 22,
666
+ alignItems: "center",
667
+ justifyContent: "center",
668
+ backgroundColor: c.primaryWash,
669
+ },
670
+ }));