@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.
Files changed (2) hide show
  1. package/README.md +218 -0
  2. 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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dropi/react-native-design-system",
3
- "version": "0.2.21",
3
+ "version": "0.2.22",
4
4
  "description": "A React Native package built from scratch",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",