@acvl/mobile-components 0.0.3 → 0.0.5

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 (42) hide show
  1. package/README.md +3 -3
  2. package/lib/module/camara/CampoDeFotos.js +34 -12
  3. package/lib/module/camara/CampoDeFotos.js.map +1 -1
  4. package/lib/module/camara/index.js.map +1 -1
  5. package/lib/module/componentes/BotonFlotante.js +71 -0
  6. package/lib/module/componentes/BotonFlotante.js.map +1 -0
  7. package/lib/module/formularios/SelectorDeOpcion.js +19 -27
  8. package/lib/module/formularios/SelectorDeOpcion.js.map +1 -1
  9. package/lib/module/formularios/TextoDeAccesoControlado.js +1 -1
  10. package/lib/module/formularios/campos.js +257 -129
  11. package/lib/module/formularios/campos.js.map +1 -1
  12. package/lib/module/hoja/HojaDeLista.js +8 -3
  13. package/lib/module/hoja/HojaDeLista.js.map +1 -1
  14. package/lib/module/hoja/HojaInferior.js +8 -3
  15. package/lib/module/hoja/HojaInferior.js.map +1 -1
  16. package/lib/module/index.js +2 -1
  17. package/lib/module/index.js.map +1 -1
  18. package/lib/typescript/src/camara/CampoDeFotos.d.ts +17 -4
  19. package/lib/typescript/src/camara/CampoDeFotos.d.ts.map +1 -1
  20. package/lib/typescript/src/camara/index.d.ts +1 -1
  21. package/lib/typescript/src/camara/index.d.ts.map +1 -1
  22. package/lib/typescript/src/componentes/BotonFlotante.d.ts +21 -0
  23. package/lib/typescript/src/componentes/BotonFlotante.d.ts.map +1 -0
  24. package/lib/typescript/src/formularios/SelectorDeOpcion.d.ts +10 -0
  25. package/lib/typescript/src/formularios/SelectorDeOpcion.d.ts.map +1 -1
  26. package/lib/typescript/src/formularios/TextoDeAccesoControlado.d.ts +1 -1
  27. package/lib/typescript/src/formularios/campos.d.ts +43 -8
  28. package/lib/typescript/src/formularios/campos.d.ts.map +1 -1
  29. package/lib/typescript/src/hoja/HojaDeLista.d.ts.map +1 -1
  30. package/lib/typescript/src/hoja/HojaInferior.d.ts.map +1 -1
  31. package/lib/typescript/src/index.d.ts +2 -1
  32. package/lib/typescript/src/index.d.ts.map +1 -1
  33. package/package.json +1 -1
  34. package/src/camara/CampoDeFotos.tsx +41 -12
  35. package/src/camara/index.ts +6 -1
  36. package/src/componentes/BotonFlotante.tsx +65 -0
  37. package/src/formularios/SelectorDeOpcion.tsx +40 -22
  38. package/src/formularios/TextoDeAccesoControlado.tsx +1 -1
  39. package/src/formularios/campos.tsx +276 -123
  40. package/src/hoja/HojaDeLista.tsx +15 -9
  41. package/src/hoja/HojaInferior.tsx +15 -9
  42. package/src/index.ts +2 -0
@@ -14,6 +14,7 @@ import EstadoVacio from "../componentes/EstadoVacio";
14
14
  import IconoDeRenglon from "../componentes/IconoDeRenglon";
15
15
  import { crearEstilos, renglon, tipografia, usePaleta } from "../tema";
16
16
  import { Text, TextInput } from "../texto";
17
+ import { CajaDeCampo } from "./campos";
17
18
 
18
19
  /** Una opción de una lista: lo que se guarda (`value`) y lo que se lee (`label`). */
19
20
  export interface Opcion {
@@ -43,6 +44,16 @@ interface FuenteDeOpciones<T extends Opcion> {
43
44
  grupo?: (opcion: T) => string;
44
45
  vacio?: string;
45
46
  disabled?: boolean;
47
+ /**
48
+ * Lo que va a la derecha del rótulo: un «No aplica» que apaga el campo. No se apaga con él,
49
+ * porque es lo que lo vuelve a prender.
50
+ */
51
+ accesorio?: React.ReactNode;
52
+ /**
53
+ * Señala el campo mientras no tenga nada elegido: lo que falta capturar en un formulario largo.
54
+ * En ámbar y no en rojo, que es del error.
55
+ */
56
+ resaltarVacio?: boolean;
46
57
  }
47
58
 
48
59
  export interface PropsDeSelectorDeOpcion<T extends Opcion> extends FuenteDeOpciones<T> {
@@ -191,24 +202,30 @@ function RenglonDelSelector({
191
202
  texto,
192
203
  detalle,
193
204
  disabled,
205
+ accesorio,
206
+ pendiente,
194
207
  onPress,
195
208
  }: {
196
209
  etiqueta: string;
197
210
  texto: string | null;
198
211
  detalle?: string | null;
199
212
  disabled?: boolean;
213
+ accesorio?: React.ReactNode;
214
+ /** Vacío y se pidió resaltarlo (`resaltarVacio`). */
215
+ pendiente?: boolean;
200
216
  onPress: () => void;
201
217
  }) {
202
218
  const c = usePaleta();
203
219
  const styles = useStyles();
204
220
  return (
205
- <Pressable
221
+ <CajaDeCampo
222
+ etiqueta={etiqueta}
223
+ accesorio={accesorio}
206
224
  onPress={onPress}
207
- disabled={disabled}
208
225
  accessibilityRole="button"
209
- style={[styles.campo, disabled && styles.campoInactivo]}
226
+ disabled={disabled}
227
+ pendiente={pendiente}
210
228
  >
211
- <Text style={styles.etiqueta}>{etiqueta}</Text>
212
229
  <View style={styles.renglon}>
213
230
  <Text style={[styles.valor, !texto && styles.sinValor]}>{texto ?? "Elegir…"}</Text>
214
231
  <IconoDeRenglon
@@ -218,7 +235,7 @@ function RenglonDelSelector({
218
235
  />
219
236
  </View>
220
237
  {detalle ? <Text style={styles.detalle}>{detalle}</Text> : null}
221
- </Pressable>
238
+ </CajaDeCampo>
222
239
  );
223
240
  }
224
241
 
@@ -239,6 +256,8 @@ export default function SelectorDeOpcion<T extends Opcion>(props: PropsDeSelecto
239
256
  textoDeNinguno = "Ninguno",
240
257
  vacio,
241
258
  disabled,
259
+ accesorio,
260
+ resaltarVacio,
242
261
  } = props;
243
262
  const styles = useStyles();
244
263
  const [abierto, setAbierto] = React.useState(false);
@@ -257,6 +276,8 @@ export default function SelectorDeOpcion<T extends Opcion>(props: PropsDeSelecto
257
276
  texto={valor ? valor.label : null}
258
277
  detalle={valor ? detalle?.(valor) : null}
259
278
  disabled={disabled}
279
+ accesorio={accesorio}
280
+ pendiente={resaltarVacio && !valor}
260
281
  onPress={() => setAbierto(true)}
261
282
  />
262
283
  <HojaDeOpciones
@@ -294,7 +315,18 @@ export default function SelectorDeOpcion<T extends Opcion>(props: PropsDeSelecto
294
315
  * haga falta en vez de recortarse.
295
316
  */
296
317
  export function SelectorDeVarias<T extends Opcion>(props: PropsDeSelectorDeVarias<T>) {
297
- const { etiqueta, valor, onElegir, cargando, detalle, grupo, vacio, disabled } = props;
318
+ const {
319
+ etiqueta,
320
+ valor,
321
+ onElegir,
322
+ cargando,
323
+ detalle,
324
+ grupo,
325
+ vacio,
326
+ disabled,
327
+ accesorio,
328
+ resaltarVacio,
329
+ } = props;
298
330
  const [abierto, setAbierto] = React.useState(false);
299
331
  const [marcadas, setMarcadas] = React.useState<T[]>(valor);
300
332
  const { texto, buscar, visibles } = useBuscador(props);
@@ -320,6 +352,8 @@ export function SelectorDeVarias<T extends Opcion>(props: PropsDeSelectorDeVaria
320
352
  etiqueta={etiqueta}
321
353
  texto={valor.length ? valor.map((o) => o.label).join(", ") : null}
322
354
  disabled={disabled}
355
+ accesorio={accesorio}
356
+ pendiente={resaltarVacio && !valor.length}
323
357
  onPress={abrir}
324
358
  />
325
359
  <HojaDeOpciones
@@ -352,22 +386,6 @@ export function SelectorDeVarias<T extends Opcion>(props: PropsDeSelectorDeVaria
352
386
  }
353
387
 
354
388
  const useStyles = crearEstilos((c) => ({
355
- campo: {
356
- backgroundColor: c.superficie,
357
- borderRadius: 14,
358
- borderWidth: 2,
359
- borderColor: c.secondaryLighter,
360
- padding: 14,
361
- gap: 4,
362
- },
363
- campoInactivo: { opacity: 0.5 },
364
- etiqueta: {
365
- ...renglon(tipografia.etiqueta),
366
- fontWeight: "800",
367
- color: c.secondary,
368
- textTransform: "uppercase",
369
- letterSpacing: 0.8,
370
- },
371
389
  renglon: { flexDirection: "row", alignItems: "flex-start", gap: 8 },
372
390
  valor: { flex: 1, ...renglon(tipografia.subtitulo), fontWeight: "800", color: c.texto },
373
391
  sinValor: { color: c.secondaryLight, fontWeight: "600" },
@@ -10,7 +10,7 @@ import type { CampoAtado } from "./controlados";
10
10
  * con contorno y la etiqueta que sube al escribir. Con `contrasena`, oculta lo escrito y lleva el
11
11
  * ojo para verlo.
12
12
  *
13
- * Es de Paper y no `TextoControlado`, que lleva su rótulo arriba, porque así es la pantalla de
13
+ * Es de Paper y no `TextoControlado`, que lleva su rótulo dentro de la caja, porque así es la pantalla de
14
14
  * entrada de las apps.
15
15
  */
16
16
  export default function TextoDeAccesoControlado<T extends FieldValues>({