Essential cross-platform UI components for React Native with comprehensive theming and accessibility support
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Modal dialogs, popovers, tooltips, drawers, and overlay management components for complex user interactions.
Full-screen or centered modal dialog component.
/**
* Modal dialog component for overlaying content
* @param props - Modal component props
* @returns JSX element representing a modal dialog
*/
function Modal(props: IModalProps): JSX.Element;
interface IModalProps extends StyledProps {
isOpen: boolean;
onClose: () => void;
initialFocusRef?: React.RefObject<any>;
finalFocusRef?: React.RefObject<any>;
avoidKeyboard?: boolean;
closeOnOverlayClick?: boolean;
isKeyboardDismissable?: boolean;
overlayVisible?: boolean;
backdropVisible?: boolean;
animationPreset?: "slide" | "fade";
size?: "xs" | "sm" | "md" | "lg" | "xl" | "full";
children?: React.ReactNode;
useRNModal?: boolean;
_backdrop?: IBackdropProps;
_fade?: IFadeProps;
_slide?: ISlideProps;
}Usage Example:
import { Modal, Button, Text, VStack } from "native-base";
function ModalExample() {
const [showModal, setShowModal] = React.useState(false);
return (
<>
<Button onPress={() => setShowModal(true)}>Open Modal</Button>
<Modal isOpen={showModal} onClose={() => setShowModal(false)}>
<Modal.Content maxWidth="400px">
<Modal.CloseButton />
<Modal.Header>Contact us</Modal.Header>
<Modal.Body>
<VStack space={3}>
<Text>Modal body content goes here</Text>
</VStack>
</Modal.Body>
<Modal.Footer>
<Button.Group space={2}>
<Button variant="ghost" onPress={() => setShowModal(false)}>
Cancel
</Button>
<Button onPress={() => setShowModal(false)}>
Save
</Button>
</Button.Group>
</Modal.Footer>
</Modal.Content>
</Modal>
</>
);
}Contextual popup component that appears relative to a trigger element.
/**
* Popover component for contextual content display
* @param props - Popover component props
* @returns JSX element representing a popover
*/
function Popover(props: IPopoverProps): JSX.Element;
interface IPopoverProps extends StyledProps {
isOpen?: boolean;
defaultIsOpen?: boolean;
onOpen?: () => void;
onClose?: () => void;
trigger?: (props: any) => JSX.Element;
placement?:
| "auto"
| "auto-start"
| "auto-end"
| "top"
| "top-start"
| "top-end"
| "bottom"
| "bottom-start"
| "bottom-end"
| "right"
| "right-start"
| "right-end"
| "left"
| "left-start"
| "left-end";
closeOnBlur?: boolean;
initialFocusRef?: React.RefObject<any>;
finalFocusRef?: React.RefObject<any>;
isKeyboardDismissable?: boolean;
shouldOverlapWithTrigger?: boolean;
crossOffset?: number;
offset?: number;
children?: React.ReactNode;
trapFocus?: boolean;
}Usage Example:
import { Popover, Button, Text, Box } from "native-base";
function PopoverExample() {
return (
<Popover
trigger={(triggerProps) => (
<Button {...triggerProps}>Open Popover</Button>
)}
>
<Popover.Content accessibilityLabel="Welcome Message" w="56">
<Popover.Arrow />
<Popover.CloseButton />
<Popover.Header>Welcome!</Popover.Header>
<Popover.Body>
<Text>This is the popover content</Text>
</Popover.Body>
<Popover.Footer justifyContent="flex-end">
<Button.Group size="xs">
<Button variant="ghost">Cancel</Button>
<Button>Apply</Button>
</Button.Group>
</Popover.Footer>
</Popover.Content>
</Popover>
);
}Simple tooltip component for hover or focus states.
/**
* Tooltip component for contextual help text
* @param props - Tooltip component props
* @returns JSX element representing a tooltip
*/
function Tooltip(props: ITooltipProps): JSX.Element;
interface ITooltipProps extends StyledProps {
label: string;
children: React.ReactElement;
isOpen?: boolean;
defaultIsOpen?: boolean;
onOpen?: () => void;
onClose?: () => void;
placement?:
| "auto"
| "auto-start"
| "auto-end"
| "top"
| "top-start"
| "top-end"
| "bottom"
| "bottom-start"
| "bottom-end"
| "right"
| "right-start"
| "right-end"
| "left"
| "left-start"
| "left-end";
hasArrow?: boolean;
arrowSize?: number;
arrowShadowColor?: string;
bg?: ResponsiveValue<string>;
backgroundColor?: ResponsiveValue<string>;
openDelay?: number;
closeDelay?: number;
closeOnClick?: boolean;
shouldWrapChildren?: boolean;
offset?: number;
crossOffset?: number;
isDisabled?: boolean;
}Usage Example:
import { Tooltip, Button } from "native-base";
<Tooltip label="This is a tooltip" placement="top">
<Button>Hover me</Button>
</Tooltip>Side panel drawer component for navigation or content.
/**
* Drawer component for side panel content
* @param props - Drawer component props
* @returns JSX element representing a side drawer
*/
function Drawer(props: IDrawerProps): JSX.Element;
interface IDrawerProps extends StyledProps {
isOpen: boolean;
onClose: () => void;
placement?: "top" | "right" | "bottom" | "left";
size?: "xs" | "sm" | "md" | "lg" | "xl" | "full";
initialFocusRef?: React.RefObject<any>;
finalFocusRef?: React.RefObject<any>;
isKeyboardDismissable?: boolean;
overlayVisible?: boolean;
backdropVisible?: boolean;
closeOnOverlayClick?: boolean;
children?: React.ReactNode;
_backdrop?: IBackdropProps;
_content?: IBoxProps;
_body?: IBoxProps;
}Usage Example:
import { Drawer, Button, VStack } from "native-base";
function DrawerExample() {
const [isOpen, setIsOpen] = React.useState(false);
return (
<>
<Button onPress={() => setIsOpen(true)}>Open Drawer</Button>
<Drawer isOpen={isOpen} onClose={() => setIsOpen(false)} size="md">
<Drawer.Content>
<Drawer.CloseButton />
<Drawer.Header>Menu</Drawer.Header>
<Drawer.Body>
<VStack space={4}>
<Button variant="ghost">Home</Button>
<Button variant="ghost">About</Button>
<Button variant="ghost">Contact</Button>
</VStack>
</Drawer.Body>
</Drawer.Content>
</Drawer>
</>
);
}Alert dialog component for important confirmations or warnings.
/**
* Alert dialog component for critical user confirmations
* @returns JSX element representing an alert dialog
*/
function AlertDialog(): JSX.Element;Bottom sheet component for contextual actions on mobile.
/**
* Action sheet component for mobile-friendly action selection
* @param props - Actionsheet component props
* @returns JSX element representing a bottom action sheet
*/
function Actionsheet(props: IActionsheetProps): JSX.Element;
interface IActionsheetProps extends StyledProps {
isOpen: boolean;
onClose: () => void;
hideDragIndicator?: boolean;
size?: "xs" | "sm" | "md" | "lg" | "xl" | "full";
disableOverlay?: boolean;
children?: React.ReactNode;
_backdrop?: IBackdropProps;
}
interface IActionsheetContentProps extends IBoxProps {
children?: React.ReactNode;
}
interface IActionsheetItemProps extends IPressableProps {
children?: React.ReactNode;
isDisabled?: boolean;
startIcon?: JSX.Element;
endIcon?: JSX.Element;
_text?: ITextProps;
_icon?: IIconProps;
}Usage Example:
import { Actionsheet, Button, VStack, Text } from "native-base";
function ActionsheetExample() {
const [isOpen, setIsOpen] = React.useState(false);
return (
<>
<Button onPress={() => setIsOpen(true)}>Open Actionsheet</Button>
<Actionsheet isOpen={isOpen} onClose={() => setIsOpen(false)}>
<Actionsheet.Content>
<VStack w="100%" space={2}>
<Actionsheet.Item onPress={() => console.log("Delete")}>
<Text>Delete</Text>
</Actionsheet.Item>
<Actionsheet.Item onPress={() => console.log("Share")}>
<Text>Share</Text>
</Actionsheet.Item>
<Actionsheet.Item onPress={() => console.log("Edit")}>
<Text>Edit</Text>
</Actionsheet.Item>
</VStack>
</Actionsheet.Content>
</Actionsheet>
</>
);
}Backdrop overlay component used by modals and other overlay components.
/**
* Backdrop component for overlay backgrounds
* @returns JSX element representing overlay backdrop
*/
function Backdrop(): JSX.Element;
interface IBackdropProps extends IPressableProps {
bg?: ResponsiveValue<string>;
backgroundColor?: ResponsiveValue<string>;
opacity?: ResponsiveValue<number>;
}When working with multiple overlays, consider z-index stacking and focus management:
import { Modal, Popover, useDisclose } from "native-base";
function MultipleOverlaysExample() {
const { isOpen: isModalOpen, onOpen: onModalOpen, onClose: onModalClose } = useDisclose();
const { isOpen: isPopoverOpen, onOpen: onPopoverOpen, onClose: onPopoverClose } = useDisclose();
return (
<>
<Button onPress={onModalOpen}>Open Modal</Button>
<Modal isOpen={isModalOpen} onClose={onModalClose}>
<Modal.Content>
<Modal.Header>Modal with Popover</Modal.Header>
<Modal.Body>
<Popover
isOpen={isPopoverOpen}
onClose={onPopoverClose}
trigger={(triggerProps) => (
<Button {...triggerProps} onPress={onPopoverOpen}>
Open Popover
</Button>
)}
>
<Popover.Content>
<Popover.Body>
<Text>Nested overlay content</Text>
</Popover.Body>
</Popover.Content>
</Popover>
</Modal.Body>
</Modal.Content>
</Modal>
</>
);
}Proper focus management for accessibility:
import { Modal, Input } from "native-base";
function FocusManagedModal() {
const [isOpen, setIsOpen] = React.useState(false);
const initialRef = React.useRef(null);
const finalRef = React.useRef(null);
return (
<>
<Button ref={finalRef} onPress={() => setIsOpen(true)}>
Open Modal
</Button>
<Modal
isOpen={isOpen}
onClose={() => setIsOpen(false)}
initialFocusRef={initialRef}
finalFocusRef={finalRef}
>
<Modal.Content>
<Modal.Header>Focus Management</Modal.Header>
<Modal.Body>
<Input ref={initialRef} placeholder="This input gets focus" />
</Modal.Body>
</Modal.Content>
</Modal>
</>
);
}