Card

콘텐츠에 대한 정보를 간략하게 표현하는 기본 카드 요소입니다. 이미지, 텍스트, 뱃지 등 다양한 요소를 조합하여 각 항목의 정보를 시각적으로 일관성 있게 전달합니다.

Basic card

일반적인 상황에서 정보를 묶어 표시할 때 사용합니다.

Heading

Caption

Sub caption

Extra caption

import { Card, CardThumbnail, CardTitle, CardCaption, CardContent } from '@wanteddev/wds';

const Demo = () => {
  return (
    <Card 
      width="240px" 
      sx={{ margin: 'auto' }}
    >
      <CardThumbnail
        src="https://static.wanted.co.kr/images/company/79/elpzxpmgh94xesrf__1080_790.png"
        alt="Wanted Company Image"
        width="240px"
      />
      <CardContent>
        <CardTitle>Heading</CardTitle>
        <CardCaption>Caption</CardCaption>
        <CardCaption>Sub caption</CardCaption>
        <CardCaption>Extra caption</CardCaption>
      </CardContent>
    </Card>
  );
}

export default Demo;

Anatomy

아래와 같은 구조로 조합하여 사용합니다.

<Card>
  <CardThumbnail />
  <CardContent>
    <CardContentItem position="top" />
    <CardTitle />
    <CardCaption />
    <CardCaption />
    <CardCaption />
    <CardContentItem position="bottom" />
  </CardContent>
</Card>

With content

CardContentItemposition을 조정하여 상단, 하단에 콘텐츠를 추가할 수 있습니다.

뱃지나 부가적인 내용을 추가할 때 사용합니다.

BadgeBadgeBadge

Heading

Caption

Heading

Caption

BadgeBadgeBadge
import { FlexBox, Card, CardTitle, CardCaption, CardContent, CardContentItem, ContentBadge, CardThumbnailSkeleton } from '@wanteddev/wds';

const Demo = () => {
  return (
    <FlexBox gap="24px" flexDirection="column" alignItems="center">
      <Card width="240px">
        <CardThumbnailSkeleton animation={false} />
        <CardContent>
          <CardContentItem position="top" variant="badge">
            {new Array(3).fill(0).map((_, i) => (
              <ContentBadge key={i} color="neutral">Badge</ContentBadge>
            ))}
          </CardContentItem>
          <CardTitle>Heading</CardTitle>
          <CardCaption>Caption</CardCaption>
        </CardContent>
      </Card>
      <Card width="240px">
        <CardThumbnailSkeleton animation={false} />
        <CardContent>
          <CardTitle>Heading</CardTitle>
          <CardCaption>Caption</CardCaption>
          <CardContentItem position="bottom" variant="badge">
            {new Array(3).fill(0).map((_, i) => (
              <ContentBadge key={i} color="neutral">Badge</ContentBadge>
            ))}
          </CardContentItem>
        </CardContent>
      </Card>
    </FlexBox>
  );
}

export default Demo;

With thumbnail content

CardThumbnail의 leadingContent, trailingContent로 썸네일에 콘텐츠를 추가할 수 있습니다.

CardThumbnailContent로 요소를 감싸서 사용합니다.

import { useToast, ToggleIcon, Card, CardThumbnail, CardTitle, CardCaption, CardContent, CardThumbnailContent } from '@wanteddev/wds';
import { IconBookmark, IconBookmarkFill } from '@wanteddev/wds-icon';
import { useState } from 'react';

const Demo = () => {
  const toast = useToast();
  const [isBookmarked, setIsBookmarked] = useState(false);

  return (
    <Card 
      as="a" 
      href="https://wanted.co.kr" 
      target="_blank" 
      width="240px" 
      sx={{ margin: 'auto' }}
    >
      <CardThumbnail
        src="https://static.wanted.co.kr/images/company/79/elpzxpmgh94xesrf__1080_790.png"
        alt="Wanted Company Image"
        width="240px"
        leadingContent={
          <CardThumbnailContent variant="text">
            캡션
          </CardThumbnailContent>
        }
        trailingContent={
          <CardThumbnailContent variant="toggle-icon">
            <ToggleIcon 
              active={isBookmarked} 
              onActiveChange={setIsBookmarked} 
              activeColor="semantic.primary.normal" 
              onClick={() => {
                if (!isBookmarked) {
                  toast({
                    variant: 'positive',
                    content: '북마크에 저장되었습니다.',
                  });
                }
                setIsBookmarked((prevIsBookmarked) => !prevIsBookmarked);
              }}
            >
              {isBookmarked 
                ? <IconBookmarkFill /> 
                : <IconBookmark />
              }
            </ToggleIcon>
          </CardThumbnailContent>
        }
      />
      <CardContent>
        <CardTitle>Heading</CardTitle>
        <CardCaption>Caption</CardCaption>
        <CardCaption>Sub caption</CardCaption>
        <CardCaption>Extra caption</CardCaption>
      </CardContent>
    </Card>
  );
}

export default Demo;

Platform

platform 옵션을 통해 내부 콘텐츠의 간격 및 크기를 조정할 수 있습니다.

  • desktop (default)
  • mobile

Heading

platform: desktop

Sub caption

Extra caption

Heading

platform: mobile

Sub caption

Extra caption

import { FlexBox, Card, CardThumbnail, CardTitle, CardCaption, CardContent } from '@wanteddev/wds';

const Demo = () => {
  return (
    <FlexBox gap="24px" flexDirection="column" alignItems="center">
      <Card width="240px" platform="desktop">
        <CardThumbnail
          src="https://static.wanted.co.kr/images/company/79/elpzxpmgh94xesrf__1080_790.png"
          alt="Wanted Company Image"
        />
        <CardContent>
          <CardTitle>Heading</CardTitle>
          <CardCaption>platform: desktop</CardCaption>
          <CardCaption>Sub caption</CardCaption>
          <CardCaption>Extra caption</CardCaption>
        </CardContent>
      </Card>

      <Card width="200px" platform="mobile">
        <CardThumbnail
          src="https://static.wanted.co.kr/images/company/79/elpzxpmgh94xesrf__1080_790.png"
          alt="Wanted Company Image"
        />
        <CardContent>
          <CardTitle>Heading</CardTitle>
          <CardCaption>platform: mobile</CardCaption>
          <CardCaption>Sub caption</CardCaption>
          <CardCaption>Extra caption</CardCaption>
        </CardContent>
      </Card>
    </FlexBox>
  );
}

export default Demo;

Skeleton

Card의 로딩 상태를 표현할 때 Skeleton 컴포넌트들을 조합해서 사용합니다.

  • CardSkeleton
  • CardThumbnailSkeleton
  • CardContent
  • CardContentItemSkeleton
  • CardTitleSkeleton
  • CardCaptionSkeleton
import { CardSkeleton, CardThumbnailSkeleton, CardContentItemSkeleton, CardTitleSkeleton, CardCaptionSkeleton, CardContent } from '@wanteddev/wds';

const Demo = () => {
  return (
    <CardSkeleton width="240px" sx={{ marginInline: 'auto' }}>
      <CardThumbnailSkeleton />
      <CardContent>
        <CardContentItemSkeleton />
        <CardTitleSkeleton />
        <CardCaptionSkeleton type="normal" />
        <CardCaptionSkeleton type="sub" />
        <CardCaptionSkeleton type="extra" />
        <CardContentItemSkeleton />
      </CardContent>
    </CardSkeleton>
  );
}

export default Demo;

API

Card

정해진 breakpoint에 따라 아래 옵션을 override 할 수 있습니다.

  • platform
  • width
NameTypesdefaultValue
as
ElementType
-
platform
"desktop" | "mobile"
"desktop"
width
Property.Width<string | number> | undefined
-
children
ReactNode
-
sx
SxProp
-
xl
Merge<Omit<CardDefaultProps, "sx">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Omit<CardDefaultProps, "sx">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Omit<CardDefaultProps, "sx">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Omit<CardDefaultProps, "sx">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Omit<CardDefaultProps, "sx">, { sx?: CSSInterpolation; }> | undefined
-
flexDirection
Property.FlexDirection | undefined
-
flexWrap
Property.FlexWrap | undefined
-
justifyContent
Property.JustifyContent | undefined
-
alignItems
Property.AlignItems | undefined
-
alignContent
Property.AlignContent | undefined
-
order
Property.Order | undefined
-
flex
Property.Flex<string | number> | undefined
-
flexGrow
Property.FlexGrow | undefined
-
flexShrink
Property.FlexShrink | undefined
-
flexBasis
Property.FlexBasis<string | number> | undefined
-
alignSelf
Property.AlignSelf | undefined
-
gap
Property.Gap<string | number> | undefined
-
rowGap
Property.RowGap<string | number> | undefined
-
columnGap
Property.ColumnGap<string | number> | undefined
-

CardThumbnail

NameTypesdefaultValue
xl
Merge<Pick<CardThumbnailDefaultProps, "ratio">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Pick<CardThumbnailDefaultProps, "ratio">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Pick<CardThumbnailDefaultProps, "ratio">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Pick<CardThumbnailDefaultProps, "ratio">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Pick<CardThumbnailDefaultProps, "ratio">, { sx?: CSSInterpolation; }> | undefined
-
children
ReactNode
-
onLoad
() => void
-
onError
() => void
-
onAbort
() => void
-
sx
SxProp
-
leadingContent
ReactNode
-
trailingContent
ReactNode
-
src
string
-
srcSet
string
-
alt
string
-
referrerPolicy
"" | "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin" | "unsafe-url"
-
crossOrigin
"" | "anonymous" | "use-credentials"
-
width
Property.Width<string | number> | undefined
-
ratio
"1:1" | "5:4" | "4:3" | "3:2" | "16:10" | "1.618:1" | "16:9" | "2:1" | "21:9"
-
portrait
boolean
-
overlay
ReactNode
-

CardThumbnailContent

NameTypesdefaultValue
variant
"text" | "custom" | "toggle-icon"
"custom"
children
ReactNode
-
sx
SxProp
-
xl
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
flexDirection
Property.FlexDirection | undefined
-
flexWrap
Property.FlexWrap | undefined
-
justifyContent
Property.JustifyContent | undefined
-
alignItems
Property.AlignItems | undefined
-
alignContent
Property.AlignContent | undefined
-
order
Property.Order | undefined
-
flex
Property.Flex<string | number> | undefined
-
flexGrow
Property.FlexGrow | undefined
-
flexShrink
Property.FlexShrink | undefined
-
flexBasis
Property.FlexBasis<string | number> | undefined
-
alignSelf
Property.AlignSelf | undefined
-
gap
Property.Gap<string | number> | undefined
-
rowGap
Property.RowGap<string | number> | undefined
-
columnGap
Property.ColumnGap<string | number> | undefined
-

CardContent

NameTypesdefaultValue
flexDirection
Property.FlexDirection | undefined
-
flexWrap
Property.FlexWrap | undefined
-
justifyContent
Property.JustifyContent | undefined
-
alignItems
Property.AlignItems | undefined
-
alignContent
Property.AlignContent | undefined
-
order
Property.Order | undefined
-
flex
Property.Flex<string | number> | undefined
-
flexGrow
Property.FlexGrow | undefined
-
flexShrink
Property.FlexShrink | undefined
-
flexBasis
Property.FlexBasis<string | number> | undefined
-
alignSelf
Property.AlignSelf | undefined
-
gap
Property.Gap<string | number> | undefined
-
rowGap
Property.RowGap<string | number> | undefined
-
columnGap
Property.ColumnGap<string | number> | undefined
-
children
ReactNode
-
sx
SxProp
-
xl
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-

CardTitle

NameTypesdefaultValue
as
ElementType
-
xl
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
color
ThemeColorsToken
-
children
ReactNode
-
sx
SxProp
-
variant
"display1" | "display2" | "display3" | "title1" | "title2" | "title3" | "heading1" | "heading2" | "headline1" | "headline2" | "body1" | "body1-reading" | "body2" | "body2-reading" | "label1" | "label1-reading" | "label2" | "caption1" | "caption2"
-
weight
"medium" | "regular" | "bold"
-
align
Property.TextAlign | undefined
-
noWrap
boolean
-
display
Property.Display | undefined
-

CardCaption

NameTypesdefaultValue
as
ElementType
-
xl
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
color
ThemeColorsToken
"semantic.label.alternative"
children
ReactNode
-
sx
SxProp
-
variant
"display1" | "display2" | "display3" | "title1" | "title2" | "title3" | "heading1" | "heading2" | "headline1" | "headline2" | "body1" | "body1-reading" | "body2" | "body2-reading" | "label1" | "label1-reading" | "label2" | "caption1" | "caption2"
-
weight
"medium" | "regular" | "bold"
-
align
Property.TextAlign | undefined
-
noWrap
boolean
-
display
Property.Display | undefined
-

CardContentItem

NameTypesdefaultValue
variant
"badge" | "custom"
-
position
"top" | "bottom"
"top"
children
ReactNode
-
sx
SxProp
-
xl
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
flexDirection
Property.FlexDirection | undefined
-
flexWrap
Property.FlexWrap | undefined
-
justifyContent
Property.JustifyContent | undefined
-
alignItems
Property.AlignItems | undefined
-
alignContent
Property.AlignContent | undefined
-
order
Property.Order | undefined
-
flex
Property.Flex<string | number> | undefined
-
flexGrow
Property.FlexGrow | undefined
-
flexShrink
Property.FlexShrink | undefined
-
flexBasis
Property.FlexBasis<string | number> | undefined
-
alignSelf
Property.AlignSelf | undefined
-
gap
Property.Gap<string | number> | undefined
-
rowGap
Property.RowGap<string | number> | undefined
-
columnGap
Property.ColumnGap<string | number> | undefined
-

CardSkeleton

NameTypesdefaultValue
as
ElementType
-
platform
"desktop" | "mobile"
"desktop"
width
Property.Width<string | number> | undefined
-
children
ReactNode
-
sx
SxProp
-
xl
Merge<Omit<CardDefaultProps, "sx">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Omit<CardDefaultProps, "sx">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Omit<CardDefaultProps, "sx">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Omit<CardDefaultProps, "sx">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Omit<CardDefaultProps, "sx">, { sx?: CSSInterpolation; }> | undefined
-
flexDirection
Property.FlexDirection | undefined
-
flexWrap
Property.FlexWrap | undefined
-
justifyContent
Property.JustifyContent | undefined
-
alignItems
Property.AlignItems | undefined
-
alignContent
Property.AlignContent | undefined
-
order
Property.Order | undefined
-
flex
Property.Flex<string | number> | undefined
-
flexGrow
Property.FlexGrow | undefined
-
flexShrink
Property.FlexShrink | undefined
-
flexBasis
Property.FlexBasis<string | number> | undefined
-
alignSelf
Property.AlignSelf | undefined
-
gap
Property.Gap<string | number> | undefined
-
rowGap
Property.RowGap<string | number> | undefined
-
columnGap
Property.ColumnGap<string | number> | undefined
-

CardThumbnailSkeleton

NameTypesdefaultValue
ratio
"1:1" | "5:4" | "4:3" | "3:2" | "16:10" | "1.618:1" | "16:9" | "2:1" | "21:9"
-
portrait
boolean
-
border
boolean
-
radius
boolean
-
children
ReactNode
-
overlay
ReactNode
-
width
Property.Width<string | number> | undefined
-
sx
SxProp
-
xl
Merge<Pick<ThumbnailDefaultProps, "width" | "ratio" | "portrait" | "radius" | "border">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Pick<ThumbnailDefaultProps, "width" | "ratio" | "portrait" | "radius" | "border">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Pick<ThumbnailDefaultProps, "width" | "ratio" | "portrait" | "radius" | "border">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Pick<ThumbnailDefaultProps, "width" | "ratio" | "portrait" | "radius" | "border">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Pick<ThumbnailDefaultProps, "width" | "ratio" | "portrait" | "radius" | "border">, { sx?: CSSInterpolation; }> | undefined
-
color
ThemeColorsToken
-
variant
"circle" | "text" | "rectangle"
-
align
"center" | "left" | "right"
-
height
Property.Height<string | number> | undefined
-
opacity
"opacity.0" | "opacity.100" | "opacity.5" | "opacity.22" | "opacity.97" | "opacity.8" | "opacity.12" | "opacity.16" | "opacity.28" | "opacity.35" | "opacity.43" | "opacity.52" | "opacity.61" | "opacity.74" | "opacity.88"
-
animation
boolean
-

CardContentItemSkeleton

NameTypesdefaultValue
variant
"circle" | "text" | "rectangle"
-
width
Property.Width<string | number> | undefined
"48px"
height
Property.Height<string | number> | undefined
"20px"
radius
Property.BorderRadius<string | number> | undefined
-
color
ThemeColorsToken
-
opacity
"opacity.0" | "opacity.100" | "opacity.5" | "opacity.22" | "opacity.97" | "opacity.8" | "opacity.12" | "opacity.16" | "opacity.28" | "opacity.35" | "opacity.43" | "opacity.52" | "opacity.61" | "opacity.74" | "opacity.88"
-
align
"center" | "left" | "right"
-
animation
boolean
-
sx
SxProp
-
xl
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-

CardTitleSkeleton

NameTypesdefaultValue
variant
"circle" | "text" | "rectangle"
-
width
Property.Width<string | number> | undefined
-
height
Property.Height<string | number> | undefined
-
radius
Property.BorderRadius<string | number> | undefined
-
color
ThemeColorsToken
-
opacity
"opacity.0" | "opacity.100" | "opacity.5" | "opacity.22" | "opacity.97" | "opacity.8" | "opacity.12" | "opacity.16" | "opacity.28" | "opacity.35" | "opacity.43" | "opacity.52" | "opacity.61" | "opacity.74" | "opacity.88"
-
align
"center" | "left" | "right"
-
animation
boolean
-
sx
SxProp
-
xl
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-

CardCaptionSkeleton

NameTypesdefaultValue
type
"sub" | "normal" | "extra"
"normal"
children
ReactNode
-
color
ThemeColorsToken
-
sx
SxProp
-
xl
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Pick<SkeletonDefaultProps, "height" | "width">, { sx?: CSSInterpolation; }> | undefined
-
variant
"circle" | "text" | "rectangle"
-
align
"center" | "left" | "right"
-
height
Property.Height<string | number> | undefined
"18px"
width
Property.Width<string | number> | undefined
-
radius
Property.BorderRadius<string | number> | undefined
-
opacity
"opacity.0" | "opacity.100" | "opacity.5" | "opacity.22" | "opacity.97" | "opacity.8" | "opacity.12" | "opacity.16" | "opacity.28" | "opacity.35" | "opacity.43" | "opacity.52" | "opacity.61" | "opacity.74" | "opacity.88"
-
animation
boolean
-

© 2026 Wanted Lab, Inc.