or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

animations.mdbasic-components.mdforms.mdhooks-utilities.mdindex.mdlayout.mdmedia-data.mdnavigation-feedback.mdoverlays.mdtheme.mdtypography.md

overlays.mddocs/

0

# Overlay Components

1

2

Modal dialogs, popovers, tooltips, drawers, and overlay management components for complex user interactions.

3

4

## Capabilities

5

6

### Modal Component

7

8

Full-screen or centered modal dialog component.

9

10

```typescript { .api }

11

/**

12

* Modal dialog component for overlaying content

13

* @param props - Modal component props

14

* @returns JSX element representing a modal dialog

15

*/

16

function Modal(props: IModalProps): JSX.Element;

17

18

interface IModalProps extends StyledProps {

19

isOpen: boolean;

20

onClose: () => void;

21

initialFocusRef?: React.RefObject<any>;

22

finalFocusRef?: React.RefObject<any>;

23

avoidKeyboard?: boolean;

24

closeOnOverlayClick?: boolean;

25

isKeyboardDismissable?: boolean;

26

overlayVisible?: boolean;

27

backdropVisible?: boolean;

28

animationPreset?: "slide" | "fade";

29

size?: "xs" | "sm" | "md" | "lg" | "xl" | "full";

30

children?: React.ReactNode;

31

useRNModal?: boolean;

32

_backdrop?: IBackdropProps;

33

_fade?: IFadeProps;

34

_slide?: ISlideProps;

35

}

36

```

37

38

**Usage Example:**

39

40

```typescript

41

import { Modal, Button, Text, VStack } from "native-base";

42

43

function ModalExample() {

44

const [showModal, setShowModal] = React.useState(false);

45

46

return (

47

<>

48

<Button onPress={() => setShowModal(true)}>Open Modal</Button>

49

<Modal isOpen={showModal} onClose={() => setShowModal(false)}>

50

<Modal.Content maxWidth="400px">

51

<Modal.CloseButton />

52

<Modal.Header>Contact us</Modal.Header>

53

<Modal.Body>

54

<VStack space={3}>

55

<Text>Modal body content goes here</Text>

56

</VStack>

57

</Modal.Body>

58

<Modal.Footer>

59

<Button.Group space={2}>

60

<Button variant="ghost" onPress={() => setShowModal(false)}>

61

Cancel

62

</Button>

63

<Button onPress={() => setShowModal(false)}>

64

Save

65

</Button>

66

</Button.Group>

67

</Modal.Footer>

68

</Modal.Content>

69

</Modal>

70

</>

71

);

72

}

73

```

74

75

### Popover Component

76

77

Contextual popup component that appears relative to a trigger element.

78

79

```typescript { .api }

80

/**

81

* Popover component for contextual content display

82

* @param props - Popover component props

83

* @returns JSX element representing a popover

84

*/

85

function Popover(props: IPopoverProps): JSX.Element;

86

87

interface IPopoverProps extends StyledProps {

88

isOpen?: boolean;

89

defaultIsOpen?: boolean;

90

onOpen?: () => void;

91

onClose?: () => void;

92

trigger?: (props: any) => JSX.Element;

93

placement?:

94

| "auto"

95

| "auto-start"

96

| "auto-end"

97

| "top"

98

| "top-start"

99

| "top-end"

100

| "bottom"

101

| "bottom-start"

102

| "bottom-end"

103

| "right"

104

| "right-start"

105

| "right-end"

106

| "left"

107

| "left-start"

108

| "left-end";

109

closeOnBlur?: boolean;

110

initialFocusRef?: React.RefObject<any>;

111

finalFocusRef?: React.RefObject<any>;

112

isKeyboardDismissable?: boolean;

113

shouldOverlapWithTrigger?: boolean;

114

crossOffset?: number;

115

offset?: number;

116

children?: React.ReactNode;

117

trapFocus?: boolean;

118

}

119

```

120

121

**Usage Example:**

122

123

```typescript

124

import { Popover, Button, Text, Box } from "native-base";

125

126

function PopoverExample() {

127

return (

128

<Popover

129

trigger={(triggerProps) => (

130

<Button {...triggerProps}>Open Popover</Button>

131

)}

132

>

133

<Popover.Content accessibilityLabel="Welcome Message" w="56">

134

<Popover.Arrow />

135

<Popover.CloseButton />

136

<Popover.Header>Welcome!</Popover.Header>

137

<Popover.Body>

138

<Text>This is the popover content</Text>

139

</Popover.Body>

140

<Popover.Footer justifyContent="flex-end">

141

<Button.Group size="xs">

142

<Button variant="ghost">Cancel</Button>

143

<Button>Apply</Button>

144

</Button.Group>

145

</Popover.Footer>

146

</Popover.Content>

147

</Popover>

148

);

149

}

150

```

151

152

### Tooltip Component

153

154

Simple tooltip component for hover or focus states.

155

156

```typescript { .api }

157

/**

158

* Tooltip component for contextual help text

159

* @param props - Tooltip component props

160

* @returns JSX element representing a tooltip

161

*/

162

function Tooltip(props: ITooltipProps): JSX.Element;

163

164

interface ITooltipProps extends StyledProps {

165

label: string;

166

children: React.ReactElement;

167

isOpen?: boolean;

168

defaultIsOpen?: boolean;

169

onOpen?: () => void;

170

onClose?: () => void;

171

placement?:

172

| "auto"

173

| "auto-start"

174

| "auto-end"

175

| "top"

176

| "top-start"

177

| "top-end"

178

| "bottom"

179

| "bottom-start"

180

| "bottom-end"

181

| "right"

182

| "right-start"

183

| "right-end"

184

| "left"

185

| "left-start"

186

| "left-end";

187

hasArrow?: boolean;

188

arrowSize?: number;

189

arrowShadowColor?: string;

190

bg?: ResponsiveValue<string>;

191

backgroundColor?: ResponsiveValue<string>;

192

openDelay?: number;

193

closeDelay?: number;

194

closeOnClick?: boolean;

195

shouldWrapChildren?: boolean;

196

offset?: number;

197

crossOffset?: number;

198

isDisabled?: boolean;

199

}

200

```

201

202

**Usage Example:**

203

204

```typescript

205

import { Tooltip, Button } from "native-base";

206

207

<Tooltip label="This is a tooltip" placement="top">

208

<Button>Hover me</Button>

209

</Tooltip>

210

```

211

212

### Drawer Component

213

214

Side panel drawer component for navigation or content.

215

216

```typescript { .api }

217

/**

218

* Drawer component for side panel content

219

* @param props - Drawer component props

220

* @returns JSX element representing a side drawer

221

*/

222

function Drawer(props: IDrawerProps): JSX.Element;

223

224

interface IDrawerProps extends StyledProps {

225

isOpen: boolean;

226

onClose: () => void;

227

placement?: "top" | "right" | "bottom" | "left";

228

size?: "xs" | "sm" | "md" | "lg" | "xl" | "full";

229

initialFocusRef?: React.RefObject<any>;

230

finalFocusRef?: React.RefObject<any>;

231

isKeyboardDismissable?: boolean;

232

overlayVisible?: boolean;

233

backdropVisible?: boolean;

234

closeOnOverlayClick?: boolean;

235

children?: React.ReactNode;

236

_backdrop?: IBackdropProps;

237

_content?: IBoxProps;

238

_body?: IBoxProps;

239

}

240

```

241

242

**Usage Example:**

243

244

```typescript

245

import { Drawer, Button, VStack } from "native-base";

246

247

function DrawerExample() {

248

const [isOpen, setIsOpen] = React.useState(false);

249

250

return (

251

<>

252

<Button onPress={() => setIsOpen(true)}>Open Drawer</Button>

253

<Drawer isOpen={isOpen} onClose={() => setIsOpen(false)} size="md">

254

<Drawer.Content>

255

<Drawer.CloseButton />

256

<Drawer.Header>Menu</Drawer.Header>

257

<Drawer.Body>

258

<VStack space={4}>

259

<Button variant="ghost">Home</Button>

260

<Button variant="ghost">About</Button>

261

<Button variant="ghost">Contact</Button>

262

</VStack>

263

</Drawer.Body>

264

</Drawer.Content>

265

</Drawer>

266

</>

267

);

268

}

269

```

270

271

### AlertDialog Component

272

273

Alert dialog component for important confirmations or warnings.

274

275

```typescript { .api }

276

/**

277

* Alert dialog component for critical user confirmations

278

* @returns JSX element representing an alert dialog

279

*/

280

function AlertDialog(): JSX.Element;

281

```

282

283

### Actionsheet Component

284

285

Bottom sheet component for contextual actions on mobile.

286

287

```typescript { .api }

288

/**

289

* Action sheet component for mobile-friendly action selection

290

* @param props - Actionsheet component props

291

* @returns JSX element representing a bottom action sheet

292

*/

293

function Actionsheet(props: IActionsheetProps): JSX.Element;

294

295

interface IActionsheetProps extends StyledProps {

296

isOpen: boolean;

297

onClose: () => void;

298

hideDragIndicator?: boolean;

299

size?: "xs" | "sm" | "md" | "lg" | "xl" | "full";

300

disableOverlay?: boolean;

301

children?: React.ReactNode;

302

_backdrop?: IBackdropProps;

303

}

304

305

interface IActionsheetContentProps extends IBoxProps {

306

children?: React.ReactNode;

307

}

308

309

interface IActionsheetItemProps extends IPressableProps {

310

children?: React.ReactNode;

311

isDisabled?: boolean;

312

startIcon?: JSX.Element;

313

endIcon?: JSX.Element;

314

_text?: ITextProps;

315

_icon?: IIconProps;

316

}

317

```

318

319

**Usage Example:**

320

321

```typescript

322

import { Actionsheet, Button, VStack, Text } from "native-base";

323

324

function ActionsheetExample() {

325

const [isOpen, setIsOpen] = React.useState(false);

326

327

return (

328

<>

329

<Button onPress={() => setIsOpen(true)}>Open Actionsheet</Button>

330

<Actionsheet isOpen={isOpen} onClose={() => setIsOpen(false)}>

331

<Actionsheet.Content>

332

<VStack w="100%" space={2}>

333

<Actionsheet.Item onPress={() => console.log("Delete")}>

334

<Text>Delete</Text>

335

</Actionsheet.Item>

336

<Actionsheet.Item onPress={() => console.log("Share")}>

337

<Text>Share</Text>

338

</Actionsheet.Item>

339

<Actionsheet.Item onPress={() => console.log("Edit")}>

340

<Text>Edit</Text>

341

</Actionsheet.Item>

342

</VStack>

343

</Actionsheet.Content>

344

</Actionsheet>

345

</>

346

);

347

}

348

```

349

350

### Backdrop Component

351

352

Backdrop overlay component used by modals and other overlay components.

353

354

```typescript { .api }

355

/**

356

* Backdrop component for overlay backgrounds

357

* @returns JSX element representing overlay backdrop

358

*/

359

function Backdrop(): JSX.Element;

360

361

interface IBackdropProps extends IPressableProps {

362

bg?: ResponsiveValue<string>;

363

backgroundColor?: ResponsiveValue<string>;

364

opacity?: ResponsiveValue<number>;

365

}

366

```

367

368

## Overlay Management Patterns

369

370

### Managing Multiple Overlays

371

372

When working with multiple overlays, consider z-index stacking and focus management:

373

374

```typescript

375

import { Modal, Popover, useDisclose } from "native-base";

376

377

function MultipleOverlaysExample() {

378

const { isOpen: isModalOpen, onOpen: onModalOpen, onClose: onModalClose } = useDisclose();

379

const { isOpen: isPopoverOpen, onOpen: onPopoverOpen, onClose: onPopoverClose } = useDisclose();

380

381

return (

382

<>

383

<Button onPress={onModalOpen}>Open Modal</Button>

384

385

<Modal isOpen={isModalOpen} onClose={onModalClose}>

386

<Modal.Content>

387

<Modal.Header>Modal with Popover</Modal.Header>

388

<Modal.Body>

389

<Popover

390

isOpen={isPopoverOpen}

391

onClose={onPopoverClose}

392

trigger={(triggerProps) => (

393

<Button {...triggerProps} onPress={onPopoverOpen}>

394

Open Popover

395

</Button>

396

)}

397

>

398

<Popover.Content>

399

<Popover.Body>

400

<Text>Nested overlay content</Text>

401

</Popover.Body>

402

</Popover.Content>

403

</Popover>

404

</Modal.Body>

405

</Modal.Content>

406

</Modal>

407

</>

408

);

409

}

410

```

411

412

### Focus Management

413

414

Proper focus management for accessibility:

415

416

```typescript

417

import { Modal, Input } from "native-base";

418

419

function FocusManagedModal() {

420

const [isOpen, setIsOpen] = React.useState(false);

421

const initialRef = React.useRef(null);

422

const finalRef = React.useRef(null);

423

424

return (

425

<>

426

<Button ref={finalRef} onPress={() => setIsOpen(true)}>

427

Open Modal

428

</Button>

429

430

<Modal

431

isOpen={isOpen}

432

onClose={() => setIsOpen(false)}

433

initialFocusRef={initialRef}

434

finalFocusRef={finalRef}

435

>

436

<Modal.Content>

437

<Modal.Header>Focus Management</Modal.Header>

438

<Modal.Body>

439

<Input ref={initialRef} placeholder="This input gets focus" />

440

</Modal.Body>

441

</Modal.Content>

442

</Modal>

443

</>

444

);

445

}

446

```