@dropi/react-native-design-system 0.2.21 → 0.2.22
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.
- package/README.md +218 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -449,6 +449,224 @@ import { Alert } from "@dropi/react-native-design-system";
|
|
|
449
449
|
|
|
450
450
|
```
|
|
451
451
|
|
|
452
|
+
## Chip
|
|
453
|
+
|
|
454
|
+
El `Chip` es un componente compacto utilizado para mostrar **etiquetas, identificadores o categorías** de manera visual. Combina texto, íconos opcionales y un estilo diferenciado por variantes (`primary` / `tertiary`) para adaptarse a distintos contextos. Además, puede configurarse como **descartable** (`isDismissable`), mostrando un ícono de cierre que ejecuta una acción personalizada. Es ideal para mostrar información resumida como IDs de producto, estados, tags o filtros activos.
|
|
455
|
+
|
|
456
|
+
### 📦 Importación:
|
|
457
|
+
```Typescript
|
|
458
|
+
import { Chip } from "@dropi/react-native-design-system";
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### ⚙️ Props:
|
|
462
|
+
| Prop | Tipo | Descripción |
|
|
463
|
+
| :------------- | :------------------------- | :--------------------------------------------------------------------------- |
|
|
464
|
+
| variant | 'primary' \| 'tertiary' | *(Opcional)* Define el estilo visual. Por defecto es `'tertiary'`. |
|
|
465
|
+
| preIcon | IconName | *(Opcional)* Ícono que aparece antes del texto. |
|
|
466
|
+
| label | string | Texto que se muestra en el chip. |
|
|
467
|
+
| isDismissable | boolean | *(Opcional)* Muestra un ícono de cierre (`cross-circle`) a la derecha. |
|
|
468
|
+
| onDismiss | () => void | *(Opcional)* Callback ejecutado al presionar el ícono de cierre. |
|
|
469
|
+
|
|
470
|
+
### 🧩 Ejemplos de uso:
|
|
471
|
+
```Typescript
|
|
472
|
+
<Chip label="ID: 12345" variant="tertiary" />
|
|
473
|
+
|
|
474
|
+
<Chip
|
|
475
|
+
label="VARIABLE"
|
|
476
|
+
variant="primary"
|
|
477
|
+
/>
|
|
478
|
+
|
|
479
|
+
<Chip
|
|
480
|
+
label="Promo activa"
|
|
481
|
+
variant="primary"
|
|
482
|
+
preIcon="tag-outline"
|
|
483
|
+
/>
|
|
484
|
+
|
|
485
|
+
<Chip
|
|
486
|
+
label="Filtro aplicado"
|
|
487
|
+
variant="tertiary"
|
|
488
|
+
isDismissable
|
|
489
|
+
onDismiss={() => console.log("Filtro eliminado")}
|
|
490
|
+
/>
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
## Bottom Sheet
|
|
494
|
+
|
|
495
|
+
El `BottomSheetComponent` es un modal que se desliza desde la parte inferior de la pantalla, diseñado para mostrar contenido contextual sin interrumpir completamente la experiencia del usuario. Incluye un **backdrop semitransparente**, un **header con título opcional y botón de cierre**, soporte para **footer personalizado** y **snap points configurables** para controlar las alturas disponibles del sheet. El componente expone métodos imperativos (`present`, `close`, `dismiss`) mediante `forwardRef`, permitiendo un control programático completo desde el componente padre. Internamente usa `@gorhom/bottom-sheet` y mantiene la coherencia visual con los tokens del design system.
|
|
496
|
+
|
|
497
|
+
### 📦 Importación:
|
|
498
|
+
```Typescript
|
|
499
|
+
import { BottomSheetComponent, BottomSheetComponentRef } from "@dropi/react-native-design-system";
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
### ⚙️ Props:
|
|
503
|
+
| Prop | Tipo | Descripción |
|
|
504
|
+
| :----------- | :------------- | :----------------------------------------------------------------------------- |
|
|
505
|
+
| children | ReactNode | Contenido principal que se muestra dentro del bottom sheet. |
|
|
506
|
+
| footer | ReactNode | *(Opcional)* Contenido del footer fijo en la parte inferior del sheet. |
|
|
507
|
+
| title | string | *(Opcional)* Título mostrado en el header. Si no se provee, solo se muestra el botón de cierre. |
|
|
508
|
+
| snapPoints | string[] | *(Opcional)* Array de alturas disponibles (ej: `['50%', '90%']`). Por defecto: `['70%', '90%']`. |
|
|
509
|
+
| onDismiss | () => void | *(Opcional)* Callback ejecutado cuando el sheet se cierra completamente. |
|
|
510
|
+
| ref | BottomSheetComponentRef | Referencia para controlar el sheet imperativamente (`present`, `close`, `dismiss`). |
|
|
511
|
+
|
|
512
|
+
### 🔧 Métodos expuestos (via ref):
|
|
513
|
+
| Método | Descripción |
|
|
514
|
+
| :---------- | :----------------------------------------------------------------------------- |
|
|
515
|
+
| present() | Abre el bottom sheet desde la parte inferior. |
|
|
516
|
+
| close() | Cierra el sheet de forma animada. |
|
|
517
|
+
| dismiss() | Descarta el sheet inmediatamente. |
|
|
518
|
+
|
|
519
|
+
### 🧩 Ejemplos de uso:
|
|
520
|
+
```Typescript
|
|
521
|
+
import { useRef } from 'react';
|
|
522
|
+
import { Button, View } from 'react-native';
|
|
523
|
+
import { BottomSheetComponent, BottomSheetComponentRef, Body, DefaultButton } from '@dropi/react-native-design-system';
|
|
524
|
+
|
|
525
|
+
const MyScreen = () => {
|
|
526
|
+
const bottomSheetRef = useRef<BottomSheetComponentRef>(null);
|
|
527
|
+
|
|
528
|
+
return (
|
|
529
|
+
<View>
|
|
530
|
+
<Button
|
|
531
|
+
title="Abrir opciones"
|
|
532
|
+
onPress={() => bottomSheetRef.current?.present()}
|
|
533
|
+
/>
|
|
534
|
+
|
|
535
|
+
<BottomSheetComponent
|
|
536
|
+
ref={bottomSheetRef}
|
|
537
|
+
title="Opciones de envío"
|
|
538
|
+
snapPoints={['50%', '80%']}
|
|
539
|
+
onDismiss={() => console.log('Sheet cerrado')}
|
|
540
|
+
>
|
|
541
|
+
<View style={{ padding: 20 }}>
|
|
542
|
+
<Body type="m-regular">Selecciona tu método de envío preferido</Body>
|
|
543
|
+
</View>
|
|
544
|
+
</BottomSheetComponent>
|
|
545
|
+
</View>
|
|
546
|
+
);
|
|
547
|
+
};
|
|
548
|
+
|
|
549
|
+
// Con footer personalizado
|
|
550
|
+
<BottomSheetComponent
|
|
551
|
+
ref={sheetRef}
|
|
552
|
+
title="Confirmar pedido"
|
|
553
|
+
footer={
|
|
554
|
+
<DefaultButton
|
|
555
|
+
label="Confirmar"
|
|
556
|
+
variant="primary"
|
|
557
|
+
size="normal"
|
|
558
|
+
onPress={handleConfirm}
|
|
559
|
+
/>
|
|
560
|
+
}
|
|
561
|
+
>
|
|
562
|
+
<Body type="m-regular">Revisa los detalles antes de continuar</Body>
|
|
563
|
+
</BottomSheetComponent>
|
|
564
|
+
|
|
565
|
+
// Sin título (solo botón de cierre)
|
|
566
|
+
<BottomSheetComponent
|
|
567
|
+
ref={sheetRef}
|
|
568
|
+
snapPoints={['40%']}
|
|
569
|
+
>
|
|
570
|
+
<Body type="m-regular">Contenido simple sin título</Body>
|
|
571
|
+
</BottomSheetComponent>
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
## Select
|
|
575
|
+
|
|
576
|
+
El `Select` es un componente de selección que muestra un campo tipo dropdown con un **bottom sheet modal** para elegir entre múltiples opciones. Incluye soporte para **label**, **placeholder**, **helper text**, **estados de error** y **validación con bordes dinámicos**. El usuario puede explorar las opciones en un modal con scroll, seleccionar una de manera temporal (draft) y confirmar el cambio presionando el botón "Guardar" del footer, que solo se habilita si hubo cambios. Internamente usa `TitleDescription` para renderizar cada opción y `BottomSheetComponent` para la interfaz modal.
|
|
577
|
+
|
|
578
|
+
### 📦 Importación:
|
|
579
|
+
```Typescript
|
|
580
|
+
import { Select, SelectOption } from "@dropi/react-native-design-system";
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
### ⚙️ Props:
|
|
584
|
+
| Prop | Tipo | Descripción |
|
|
585
|
+
| :------------ | :-------------------- | :------------------------------------------------------------------------------- |
|
|
586
|
+
| options | SelectOption[] | Array de opciones disponibles. Cada una tiene `label` y `value`. |
|
|
587
|
+
| value | SelectOption \| null | *(Opcional)* Opción actualmente seleccionada. |
|
|
588
|
+
| onChange | (option: SelectOption) => void | Callback ejecutado cuando el usuario confirma una nueva selección. |
|
|
589
|
+
| label | string | *(Opcional)* Etiqueta que aparece sobre el campo. |
|
|
590
|
+
| placeholder | string | *(Opcional)* Texto mostrado cuando no hay selección. Por defecto: `'Seleccionar'`. |
|
|
591
|
+
| helper | string | *(Opcional)* Texto de ayuda bajo el campo (no se muestra si hay error). |
|
|
592
|
+
| hasError | boolean | *(Opcional)* Indica si el campo tiene un error. Cambia el color del borde. |
|
|
593
|
+
| errorMessage | string | *(Opcional)* Mensaje de error mostrado con ícono. |
|
|
594
|
+
| title | string | *(Opcional)* Título del bottom sheet. Si no se provee, usa `label` o "Seleccionar". |
|
|
595
|
+
| disabled | boolean | *(Opcional)* Desactiva el campo y reduce la opacidad. |
|
|
596
|
+
|
|
597
|
+
### 🔧 Tipo SelectOption:
|
|
598
|
+
```Typescript
|
|
599
|
+
type SelectOption = {
|
|
600
|
+
label: string
|
|
601
|
+
value: string | number
|
|
602
|
+
}
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
### 🧩 Ejemplos de uso:
|
|
606
|
+
```Typescript
|
|
607
|
+
import { useState } from 'react';
|
|
608
|
+
import { Select, SelectOption } from '@dropi/react-native-design-system';
|
|
609
|
+
|
|
610
|
+
const MyForm = () => {
|
|
611
|
+
const [country, setCountry] = useState<SelectOption | null>(null);
|
|
612
|
+
|
|
613
|
+
const countries: SelectOption[] = [
|
|
614
|
+
{ label: 'Colombia', value: 'CO' },
|
|
615
|
+
{ label: 'México', value: 'MX' },
|
|
616
|
+
{ label: 'Argentina', value: 'AR' },
|
|
617
|
+
];
|
|
618
|
+
|
|
619
|
+
return (
|
|
620
|
+
<Select
|
|
621
|
+
label="País"
|
|
622
|
+
placeholder="Selecciona tu país"
|
|
623
|
+
options={countries}
|
|
624
|
+
value={country}
|
|
625
|
+
onChange={setCountry}
|
|
626
|
+
/>
|
|
627
|
+
);
|
|
628
|
+
};
|
|
629
|
+
|
|
630
|
+
// Con helper text
|
|
631
|
+
<Select
|
|
632
|
+
label="Método de pago"
|
|
633
|
+
placeholder="Selecciona un método"
|
|
634
|
+
options={paymentMethods}
|
|
635
|
+
value={selectedMethod}
|
|
636
|
+
onChange={setSelectedMethod}
|
|
637
|
+
helper="Puedes cambiar esto más tarde"
|
|
638
|
+
/>
|
|
639
|
+
|
|
640
|
+
// Con estado de error
|
|
641
|
+
<Select
|
|
642
|
+
label="Ciudad"
|
|
643
|
+
placeholder="Selecciona tu ciudad"
|
|
644
|
+
options={cities}
|
|
645
|
+
value={selectedCity}
|
|
646
|
+
onChange={setSelectedCity}
|
|
647
|
+
hasError={!selectedCity}
|
|
648
|
+
errorMessage="Debes seleccionar una ciudad"
|
|
649
|
+
/>
|
|
650
|
+
|
|
651
|
+
// Con título personalizado en el modal
|
|
652
|
+
<Select
|
|
653
|
+
label="Categoría"
|
|
654
|
+
title="Elige una categoría de producto"
|
|
655
|
+
options={categories}
|
|
656
|
+
value={category}
|
|
657
|
+
onChange={setCategory}
|
|
658
|
+
/>
|
|
659
|
+
|
|
660
|
+
// Deshabilitado
|
|
661
|
+
<Select
|
|
662
|
+
label="Región"
|
|
663
|
+
options={regions}
|
|
664
|
+
value={region}
|
|
665
|
+
onChange={setRegion}
|
|
666
|
+
disabled={true}
|
|
667
|
+
/>
|
|
668
|
+
```
|
|
669
|
+
|
|
452
670
|
## Empty State
|
|
453
671
|
|
|
454
672
|
El EmptyState es un componente visual diseñado para mostrar pantallas vacías en escenarios donde no hay datos disponibles, ocurrió un estado inicial o se requiere una primera acción del usuario. Puede incluir una imagen, un título opcional, un mensaje descriptivo y un botón configurable. Mantiene una composición centrada y un diseño minimalista, usando automáticamente tamaños distintos para tablet gracias a isTablet.
|