TextCompact component is used for metadata, annotations, and other instances where text should be small and dense. Its line height is tighter than the Text component.
Props
Localization
Be sure to localize all text strings. Note that localization can lengthen text by 20 to 30 percent.
Keep text simple and short to avoid truncation or line wrapping when translating languages that require more characters.
import { useState } from 'react'; import { Box, ColorSchemeProvider, Flex, SelectList, TextCompact, } from 'gestalt'; export default function Example() { const [language, setLanguage] = useState('default'); const content = Object.freeze({ default: 'Lorem ipsum dolor sit amet, vis legimus appetere sententiae ex, est habeo erant noluisse ex. Ad sit enim vitae concludaturque, id diam aperiam explicari has. Alienum officiis vulputate sea ne. Nostrud mediocritatem pro in. Euripidis intellegat scriptorem ad vix', tall: 'अंतर्गत निर्माण क्षमता। विभाग लोगो तकनिकल प्रव्रुति प्रतिबध्दता अपने चुनने साधन आधुनिक स्वतंत्र संसाध पुस्तक व्याख्या सेऔर भाषाओ मानसिक सोफ़्टवेर जिसे लक्षण सादगि केवल सुचनाचलचित्र विकेन्द्रियकरण देने शीघ्र सारांश प्रसारन विचरविमर्श उदेशीत आधुनिक विचारशिलता उनको बलवान', ck: '法大感康催今間郎済分暮測。会転大籍法必辞住利業済表者加社。見競回画訴藤投冠阪暮止逮使際女審。堅種術天可毎帰画級見田頭豊世建抽座総目功。作温霊住再提略投際界利浜東着送容方権六。阪千割断待伴民腺結道員賀荷知外森若免教。転図思万応野心信住調策公被常解年間本。自教震済日実産記運聞玲止辛需成上人通点。所再男高北補西集齢訪上根', ja: '尾ノホタクスフ名津以樹ふなり夜巣区ヨクエヨイ個尾御すんちゆゅときよりせけ離根巣遊野名離他都二露二鵜ひへせと、毛以く派雲ろ絵ほまり列知津絵日日区目魔阿御ろんさゆ等他。れへ巣課他毛てむゅむす、るふせ素等タヌユツャョ毛露かほれよむつ氏雲区露素やゅて魔巣露樹差。手課擢屋列他無屋手区模露も派二日樹氏くたすゅ。', vi: 'Lorem Ipsum chỉ đơn giản là một đoạn văn bản giả, được dùng vào việc trình bày và dàn trang phục vụ cho in ấn. Lorem Ipsum đã được sử dụng như một văn bản chuẩn cho ngành công nghiệp in ấn từ những năm 1500, khi một họa sĩ vô danh ghép nhiều đoạn văn bản với nhau để tạo', th: 'Lorem Ipsum คือ เนื้อหาจำลองแบบเรียบๆ ที่ใช้กันในธุรกิจงานพิมพ์หรืองานเรียงพิมพ์ มันได้กลายมาเป็นเนื้อหาจำลองมาตรฐานของธุรกิจดังกล่าวมาตั้งแต่ศตวรรษที่ 16 เมื่อเครื่องพิมพ์โนเนมเครื่องหนึ่งนำรางตัวพิมพ์มาสลับสับตำแหน่งตัวอักษรเพื่อทำหนังสือตัวอย่าง Lorem Ipsum อยู่ยงคงกระพันมาไม่ใช่แค่เพียงห้าศตวรรษ แต่อยู่มาจนถึงยุคที่พลิกโฉมเข้าสู่งานเรียงพิมพ์ด้วยวิธีทางอิเล็กทรอนิกส์ และยังคงสภาพเดิมไว้อย่างไม่มีการเปลี่ยนแปลง', }); return ( <Box height="100%" padding={8} width="100%"> <Flex direction="column" gap={4} width="100%"> <SelectList id="selectlistMain" label="line height type" onChange={({ value }) => { if ( value === 'default' || value === 'ja' || value === 'tall' || value === 'ck' || value === 'th' || value === 'vi' ) { setLanguage(value); } }} > {[ { label: 'default', value: 'default' }, { label: 'tall', value: 'tall' }, { label: 'ck', value: 'ck' }, { label: 'ja', value: 'ja' }, { label: 'vi', value: 'vi' }, { label: 'th', value: 'th' }, ].map(({ label, value }) => ( <SelectList.Option key={label} label={label} value={value} /> ))} </SelectList> <ColorSchemeProvider colorScheme="light" fullDimensions id="localizationLanaguage" language={language} > <TextCompact>{content[language]}</TextCompact> </ColorSchemeProvider> </Flex> </Box> ); }
Variants
Alignment
Use align
to adjust the positioning of text within wrapper elements.
import { Divider, Flex, TextCompact } from 'gestalt'; export default function Example() { return ( <Flex alignItems="center" height="100%" justifyContent="center" width="100%" > <Flex direction="column" gap={{ column: 4, row: 0 }} width={200}> <TextCompact align="start">Start (default)</TextCompact> <Divider /> <TextCompact align="end">End</TextCompact> <Divider /> <TextCompact align="center">Center</TextCompact> <Divider /> <TextCompact align="forceLeft">Force left</TextCompact> <Divider /> <TextCompact align="forceRight">Force right</TextCompact> </Flex> </Flex> ); }
Block vs. inline
The TextCompact component allows you to specify whether you want block
or inline
text.
import { Box, Flex, TextCompact } from 'gestalt'; export default function Example() { return ( <Flex alignItems="center" height="100%" justifyContent="center" width="100%" > <Flex alignItems="start" direction="column" gap={{ column: 4, row: 0 }}> <TextCompact> Some content in a default block element. (default) </TextCompact> <Box> <TextCompact inline>Inline text with the inline prop.</TextCompact>{' '} <TextCompact inline>More inline text.</TextCompact> </Box> </Flex> </Flex> ); }
Colors
You can specify which color you want for your text. Most colors change in dark mode, but light
and dark
are available when no switch is desired.
import { Box, Flex, TextCompact } from 'gestalt'; export default function Example() { return ( <Flex alignItems="center" height="100%" justifyContent="center" width="100%" > <Flex alignItems="start" direction="column" gap={{ column: 3, row: 0 }}> <TextCompact color="default">Default</TextCompact> <TextCompact color="subtle">Subtle</TextCompact> <Box color="inverse" padding={1}> <TextCompact color="inverse">Inverse</TextCompact> </Box> <TextCompact color="disabled">Disabled</TextCompact> <TextCompact color="error">Error</TextCompact> <TextCompact color="success">Success</TextCompact> <TextCompact color="warning">Warning</TextCompact> <TextCompact color="recommendation">Recommendation</TextCompact> <TextCompact color="link">Link</TextCompact> <TextCompact color="shopping">Shopping</TextCompact> <Box color="primary" padding={1}> <TextCompact color="light">Light</TextCompact> </Box> <Box color="infoWeak" padding={1}> <TextCompact color="dark">Dark</TextCompact> </Box> </Flex> </Flex> ); }
Overflow & truncation
Gestalt provides utility options to deal with text overflow.
import { Box, Flex, TextCompact } from 'gestalt'; export default function Example() { return ( <Flex height="100%" justifyContent="center" width="100%"> <Flex direction="column" gap={{ column: 2, row: 0 }} width={200}> <TextCompact>breakWord (default):</TextCompact> <Box color="secondary" padding={2} rounding={2}> <TextCompact> This is a long and Supercalifragilisticexpialidocious sentence. 次の単語グレートブリテンおよび北アイルランド連合王国で本当に大きな言葉 </TextCompact> </Box> <TextCompact>normal:</TextCompact> <Box color="secondary" padding={2} rounding={2}> <TextCompact overflow="normal"> This is a long and Supercalifragilisticexpialidocious sentence. 次の単語グレートブリテンおよび北アイルランド連合王国で本当に大きな言葉 </TextCompact> </Box> <TextCompact>breakAll:</TextCompact> <Box color="secondary" padding={2} rounding={2}> <TextCompact overflow="breakAll"> This is a long and Supercalifragilisticexpialidocious sentence. 次の単語グレートブリテンおよび北アイルランド連合王国で本当に大きな言葉 </TextCompact> </Box> <TextCompact>lineClamp:</TextCompact> <Box color="secondary" padding={2} rounding={2}> <TextCompact lineClamp={2}> This is a long and Supercalifragilisticexpialidocious sentence. 次の単語グレートブリテンおよび北アイルランド連合王国で本当に大きな言葉 </TextCompact> </Box> </Flex> </Flex> ); }
Style
TextCompact is available in ´default´ and ´emphasis´ weight as well as in italic.
import { Flex, TextCompact } from 'gestalt'; export default function Example() { return ( <Flex alignItems="center" height="100%" justifyContent="center" width="100%" > <Flex alignItems="start" direction="column" gap={2}> <TextCompact weight="default">Default</TextCompact> <TextCompact weight="emphasis">Emphasis</TextCompact> <TextCompact italic>Italic</TextCompact> </Flex> </Flex> ); }
Title
The title
attribute on a <div>
can be used to show the full text of a truncated string on hover. That attribute is populated automatically when the text is truncated using lineClamp
, as long as children
is a string.
If children
is a React.Node
(e.g.
when using Link), use the title
prop to manually set the title
attribute.
import { Box, Flex, Link, TextCompact } from 'gestalt'; export default function Example() { return ( <Flex alignItems="center" height="100%" justifyContent="center" width="100%" > <Flex alignItems="start" direction="column" gap={2}> <Flex alignItems="center" direction="column" gap={2}> <TextCompact weight="emphasis"> Hover over the examples below for a few seconds to see the title text: </TextCompact> <Box borderStyle="sm" maxWidth={400} padding={1}> <Flex direction="column" gap={3}> <Flex direction="column" gap={1}> <TextCompact italic> This title attribute is automatically added because lineClamp is used and children is a string. </TextCompact> <TextCompact lineClamp={1}> This is a long and Supercalifragilisticexpialidocious sentence. 次の単語グレートブリテンおよび北アイルランド連合王国で本当に大きな言葉 </TextCompact> </Flex> <Flex direction="column" gap={1}> <TextCompact italic> This example uses lineClamp but has no title attribute, because children is a React.Node. </TextCompact> <TextCompact lineClamp={1}> <Link href="#"> This is a long and Supercalifragilisticexpialidocious sentence. 次の単語グレートブリテンおよび北アイルランド連合王国で本当に大きな言葉 </Link> </TextCompact> </Flex> <Flex direction="column" gap={1}> <TextCompact italic> This example uses lineClamp and children is a React.Node, but uses the title prop. </TextCompact> <TextCompact lineClamp={1} title="This is a long and Supercalifragilisticexpialidocious sentence. 次の単語グレートブリテンおよび北アイルランド連合王国で本当に大きな言葉" > <Link href="#"> This is a long and Supercalifragilisticexpialidocious sentence. 次の単語グレートブリテンおよび北アイルランド連合王国で本当に大きな言葉 </Link> </TextCompact> </Flex> </Flex> </Box> </Flex> </Flex> </Flex> ); }
Refs
Don't use ref
to manipulate the underlaying HTML div or span elements. Use ref
to only read HTML attributes. For example, a valid use case can be detecting
truncation. The example below illustrates a case where detecting truncation allows rendering links contained within Text.
import { useEffect, useRef, useState } from 'react'; import { Box, Flex, Label, Link, Switch, TextCompact } from 'gestalt'; export default function Example() { const [showLongText, setShowLongText] = useState(false); const [applyTruncationDetection, setApplyTruncationDetection] = useState(false); const text = 'Tag brand partners in your Idea Pins with the paid partnership tool.'; const veryLongText = 'Tag brand partners in your Idea Pins with the paid partnership tool. Just make an Idea Pin in the app, add the paid partnership label and tag your partner brand. Once they approve the request, their brand name will show up on your Idea Pin. Brands can also choose to promote your Idea Pins as ads, boosting your reach to even more people. When you use the paid partnership tool, you work directly with brands to define the payment terms and process. Pinterest will not be directly involved in payment.'; const textRef = useRef(null); const [ellipsisActive, setEllipsisActive] = useState(false); const isEllipsisActive = (element) => element.offsetHeight < element.scrollHeight || element.offsetWidth < element.scrollWidth; useEffect(() => { const checkEllipsisActive = () => { if (textRef.current) { if (!ellipsisActive && isEllipsisActive(textRef.current)) { setEllipsisActive(true); } else if (ellipsisActive && !isEllipsisActive(textRef.current)) { setEllipsisActive(false); } } }; checkEllipsisActive(); window.addEventListener('resize', checkEllipsisActive); return () => { window.removeEventListener('resize', checkEllipsisActive); }; }); return ( <Flex alignItems="center" height="100%" justifyContent="center" width="100%" > <Flex direction="column" gap={8} width="90%"> <Flex direction="column" gap={2}> <Box alignItems="center" display="flex"> <Box paddingX={2}> <Label htmlFor="longText"> <TextCompact>Show long text</TextCompact> </Label> </Box> <Switch id="longText" onChange={() => setShowLongText(!showLongText)} switched={showLongText} /> </Box> <Box alignItems="center" display="flex"> <Box paddingX={2}> <Label htmlFor="truncation"> <TextCompact>Apply truncation detection</TextCompact> </Label> </Box> <Switch id="truncation" onChange={() => setApplyTruncationDetection(!applyTruncationDetection) } switched={applyTruncationDetection} /> </Box> </Flex> <Flex direction="column"> <TextCompact ref={textRef} align="start" inline lineClamp={2} title={ ellipsisActive && typeof veryLongText === 'string' ? veryLongText : undefined } > {showLongText ? veryLongText : text}{' '} <TextCompact inline> <Link accessibilityLabel="Visit our Help Site" display="inline" href="#" > Visit our Help Site </Link> </TextCompact> </TextCompact> {ellipsisActive && applyTruncationDetection ? ( <TextCompact> <Link accessibilityLabel="Visit our Help Site" display="inline" href="#" > Visit our Help Site </Link> </TextCompact> ) : null} </Flex> </Flex> </Flex> ); }
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. |
Related
Heading
A component to use for all text content on a page except for UI text components.
Heading
Heading allows you to add H1–H6 level text on a page. They are generally placed underneath a PageHeader, and provide you with a way to create a logical text hierarchy.
Typography guidelines
A run-down on our typographic foundations, with some guidelines for using Heading and Text components together in products.
Link
Used as a text-only navigational element. Links usually appear within or directly following a paragraph or sentence.