TapAreaLink is mainly used as navigational element
Props
Usage guidelines
See TapArea.
Localization
Be sure to localize all text strings. Note that localization can lengthen text by 20 to 30 percent.
import { Box, DefaultLabelProvider, Flex, Image, Mask, TapAreaLink, Text, } from 'gestalt'; export default function Example() { return ( <DefaultLabelProvider labels={{ Link: { accessibilityNewTabLabel: 'Öffnet eine neue Browser-Registerkarte.', accessibilityDownloadLabel: 'Es lädt eine Datei herunter.', }, }} > <Flex alignItems="center" height="100%" justifyContent="center"> <TapAreaLink fullWidth={false} href="#" onTap={({ event }) => event.preventDefault()} target="blank" > <Box borderStyle="lg" column={12} padding={3} width={200}> <Mask rounding={2}> <Image alt="Antelope Canyon" naturalHeight={1} naturalWidth={1} src="https://i.ibb.co/DwYrGy6/stock14.jpg" /> </Mask> <Text align="center">Besuchen Sie Pinterest.com</Text> </Box> </TapAreaLink> </Flex> </DefaultLabelProvider> ); }
Variants
See TapArea for more variants.
Compress behavior
import { useState } from 'react'; import { Box, Flex, Image, Label, Mask, Switch, TapAreaLink, Text, } from 'gestalt'; export default function Example() { const [disabled, setDisabled] = useState(false); const [compressed, setCompressed] = useState('compress'); const [tabIndex, setTabIndex] = useState(false); return ( <Box alignItems="center" display="flex" height="100%" justifyContent="center" padding={8} > <Flex alignItems="start" direction="column" gap={{ column: 6, row: 0 }}> <Flex gap={6} wrap> <TapAreaLink disabled={disabled} href="https://www.pinterest.com" tabIndex={tabIndex ? -1 : 0} tapStyle={compressed} target="blank" > <Box borderStyle="lg" column={12} padding={3} width={200}> <Mask rounding={2}> <Image alt="Antelope Canyon" naturalHeight={1} naturalWidth={1} src="https://i.ibb.co/DwYrGy6/stock14.jpg" /> </Mask> <Text align="center">Visit Pinterest.com</Text> </Box> </TapAreaLink> </Flex> <Flex gap={{ column: 0, row: 2 }}> <Switch id="compress-buttons" onChange={() => setCompressed(compressed === 'compress' ? 'none' : 'compress') } switched={compressed === 'compress'} /> <Box flex="grow" paddingX={2}> <Label htmlFor="compress-buttons"> <Text>Compress TapArea</Text> </Label> </Box> </Flex> <Flex gap={{ column: 0, row: 2 }}> <Switch id="disable-buttons" onChange={() => setDisabled(!disabled)} switched={disabled} /> <Box flex="grow" paddingX={2}> <Label htmlFor="disable-buttons"> <Text>Disable TapArea</Text> </Label> </Box> </Flex> <Flex gap={{ column: 0, row: 2 }}> <Switch id="unreachable-buttons" onChange={() => setTabIndex(!tabIndex)} switched={tabIndex} /> <Box flex="grow" paddingX={2}> <Label htmlFor="unreachable-buttons"> <Text>Remove from keyboard navigation with tabIndex</Text> </Label> </Box> </Flex> </Flex> </Box> ); }
Focus style
import { Box, Flex, TapAreaLink, Text } from 'gestalt'; export default function TapAreaLinkExample() { return ( <Box padding={8} width="100%"> <Flex gap={6} width="100%"> <Flex direction="column" gap={6} width="100%"> <Box alignItems="center" borderStyle="sm" color="light" display="flex" height={150} justifyContent="center" width={150} > <TapAreaLink focusColor="lightBackground" fullHeight={false} fullWidth={false} href="www.pinterest.com" onTap={({ event }) => event.preventDefault()} > <Box height={100} width={100}> <Text color="dark" size="100"> focusColor=lightBackground </Text> </Box> </TapAreaLink> </Box> <Box alignItems="center" borderStyle="sm" color="dark" display="flex" height={150} justifyContent="center" width={150} > <TapAreaLink focusColor="darkBackground" fullHeight={false} fullWidth={false} href="www.pinterest.com" onTap={({ event }) => event.preventDefault()} > <Box height={100} width={100}> <Text color="light" size="100"> focusColor=darkBackground </Text> </Box> </TapAreaLink> </Box> </Flex> <Flex direction="column" gap={6} width="100%"> <Box alignItems="center" borderStyle="sm" color="light" display="flex" height={150} justifyContent="center" width={150} > <TapAreaLink focusColor="lightBackground" fullHeight={false} fullWidth={false} href="www.pinterest.com" innerFocusColor="default" onTap={({ event }) => event.preventDefault()} > <Box height={100} width={100}> <Text color="dark" size="100"> focusColor=lightBackground & innerFocusColor=default </Text> </Box> </TapAreaLink> </Box> <Box alignItems="center" borderStyle="sm" color="dark" display="flex" height={150} justifyContent="center" width={150} > <TapAreaLink focusColor="darkBackground" fullHeight={false} fullWidth={false} href="www.pinterest.com" innerFocusColor="default" onTap={({ event }) => event.preventDefault()} > <Box height={100} width={100}> <Text color="light" size="100"> focusColor=darkBackground & innerFocusColor=default </Text> </Box> </TapAreaLink> </Box> </Flex> <Flex direction="column" gap={6} width="100%"> <Box alignItems="center" borderStyle="sm" color="light" display="flex" height={150} justifyContent="center" width={150} > <TapAreaLink focusColor="lightBackground" fullHeight={false} fullWidth={false} href="www.pinterest.com" innerFocusColor="inverse" onTap={({ event }) => event.preventDefault()} > <Box height={100} width={100}> <Text color="dark" size="100"> focusColor=lightBackground & innerFocusColor=inverse </Text> </Box> </TapAreaLink> </Box> <Box alignItems="center" borderStyle="sm" color="dark" display="flex" height={150} justifyContent="center" width={150} > <TapAreaLink focusColor="darkBackground" fullHeight={false} fullWidth={false} href="www.pinterest.com" innerFocusColor="inverse" onTap={({ event }) => event.preventDefault()} > <Box height={100} width={100}> <Text color="light" size="100"> focusColor=darkBackground & innerFocusColor=inverse </Text> </Box> </TapAreaLink> </Box> </Flex> </Flex> </Box> ); }
Height & width
import { Box, Flex, TapAreaLink, Text } from 'gestalt'; export default function Example() { return ( <Box alignItems="center" display="flex" height="100%" justifyContent="center" padding={8} > <Flex gap={6} height={250} maxWidth={500} wrap> <Box borderStyle="sm" height="100%" margin={3} width="100%"> <TapAreaLink fullHeight href="www.pinterest.com" onTap={({ event }) => event.stopPropagation()} > <Box color="secondary" height="100%"> <Text align="center">Full parent height</Text> </Box> </TapAreaLink> </Box> <Box borderStyle="sm" height="100%" margin={3} width="100%"> <TapAreaLink href="www.pinterest.com" onTap={({ event }) => event.stopPropagation()} > <Box color="secondary" height="100%"> <Text align="center">Child height only</Text> </Box> </TapAreaLink> </Box> </Flex> </Box> ); }
Inline usage
import { Box, Flex, TapAreaLink, Text } from 'gestalt'; export default function Example() { return ( <Box alignItems="center" display="flex" height="100%" justifyContent="center" padding={8} > <Box color="warningBase" height={250} maxWidth={500} padding={3}> <Flex direction="column" gap={{ column: 6, row: 0 }}> <Flex.Item> <Text color="inverse" inline> Other content </Text> <Box borderStyle="sm" column={6} margin={3}> <TapAreaLink href="www.pinterest.com" onTap={({ event }) => event.stopPropagation()} > <Box color="secondary" height="100%"> <Text align="center">Default behavior (block)</Text> </Box> </TapAreaLink> </Box> </Flex.Item> <Flex.Item> <Text color="inverse" inline> Other content </Text> <Box borderStyle="sm" column={6} display="inlineBlock" margin={3}> <TapAreaLink href="www.pinterest.com" onTap={({ event }) => event.stopPropagation()} > <Box color="secondary" height="100%"> <Text align="center">Inline behavior</Text> </Box> </TapAreaLink> </Box> </Flex.Item> </Flex> </Box> </Box> ); }
While TapArea doesn't provide an inline
prop, this behavior can be achieved by wrapping with <Box display="inlineBlock">
.
Mouse cursor
import { Box, Flex, TapAreaLink, Text } from 'gestalt'; export default function TapAreaExample() { return ( <Flex gap={2} wrap> {[ 'copy', 'grab', 'grabbing', 'move', 'noDrop', 'pointer', 'zoomIn', 'zoomOut', ].map((cursor) => ( <TapAreaLink key={cursor} fullWidth={false} href="www.pinterest.com" mouseCursor={cursor} onTap={({ event }) => event.stopPropagation()} > <Box borderStyle="lg" height={100} padding={4} width={250}> <Text size="200">hover here </Text> <Text size="200" weight="bold"> {`mouseCursor="${cursor}"`} </Text> </Box> </TapAreaLink> ))} </Flex> ); }
Rounding
In ordee to observe TapArea's border radius, focus on each component below navigating with the keyboard. fullWidth={false}
might be required to wrap to the children component. Make the sure the children components match the rounding as well.
External handlers
TapAreaLink consumes external handlers from GlobalEventsHandlerProvider.
Handlers:
- onNavigation: executed when TapAreaLink is clicked
See GlobalEventsHandlerProvider for more information.
Component quality checklist
Quality item | Status | Status description |
---|---|---|
Figma Library | Component is not currently available in Figma. | |
Responsive Web | Component does not respond to changing viewport sizes in web and mobile web. |
Internal documentation
Related
GlobalEventsHandlerProvider
GlobalEventsHandlerProvider allows external link navigation control across all children components with link behavior.
See
GlobalEventsHandlerProvider to learn more about link navigation.