# Help Bubble URL: /react/components/help-bubble Source: https://github.com/daangn/seed-design/blob/dev/docs/content/react/components/help-bubble.mdx 사용자에게 컴포넌트의 상태나 특정 기능에 대한 추가 정보를 제공하는 컴포넌트입니다. 사용 가능 버전: @seed-design/react@0.0.1, @seed-design/css@0.0.1 ## Preview ```tsx import { IconILowercaseSerifCircleFill } from "@karrotmarket/react-monochrome-icon"; import { HelpBubbleTrigger } from "seed-design/ui/help-bubble"; import { ActionButton } from "seed-design/ui/action-button"; import { Icon } from "@seed-design/react"; export default function HelpBubblePreview() { return ( } /> ); } ``` ## Installation - npm: npx @seed-design/cli@latest add ui:help-bubble - pnpm: pnpm dlx @seed-design/cli@latest add ui:help-bubble - yarn: yarn dlx @seed-design/cli@latest add ui:help-bubble - bun: bun x @seed-design/cli@latest add ui:help-bubble ## Props ### `HelpBubbleTrigger` ### `HelpBubbleAnchor` ## Examples 아래 예시들은 대부분 `closeOnInteractOutside={false}`가 설정되어 `pointerdown`이 발생해도 닫히지 않도록 되어 있습니다. ### Trigger `HelpBubbleTrigger`의 `children`을 클릭하면 Help Bubble이 열리고 닫힙니다. `children`으로는 `button` 등 포커스 가능한 요소를 넣어야 합니다. ``는 `aria-haspopup="dialog"` 속성을 설정하고, Help Bubble의 `open` 상태에 따라 `aria-expanded` 속성을 자동으로 설정합니다. 이 속성은 스크린 리더와 같은 보조 기술에 유용합니다. ```tsx import { VStack } from "@seed-design/react"; import { useState } from "react"; import { HelpBubbleTrigger } from "seed-design/ui/help-bubble"; import { Switch } from "seed-design/ui/switch"; import { ActionButton } from "seed-design/ui/action-button"; export default function () { const [isControlledHelpBubbleOpen, setIsControlledHelpBubbleOpen] = useState(true); return ( 토글 토글 ); } ``` ### Anchor `HelpBubbleAnchor`의 `children`은 Help Bubble이 위치를 잡는 데에만 사용되며 클릭으로 열고 닫는 동작은 없습니다. `defaultOpen`과 `showCloseButton`을 사용하여 적절하게 열리고 닫히도록 하거나, `open` prop을 controlled하게 사용하여 열리고 닫힌 상태를 직접 관리할 수 있습니다. ```tsx import { VStack } from "@seed-design/react"; import { useState } from "react"; import { Avatar } from "seed-design/ui/avatar"; import { HelpBubbleAnchor } from "seed-design/ui/help-bubble"; import { Switch } from "seed-design/ui/switch"; export default function () { const [isControlledHelpBubbleOpen, setIsControlledHelpBubbleOpen] = useState(true); return ( ); } ``` ### Close On Interact Outside `closeOnInteractOutside` prop을 `false`로 설정하면 Help Bubble 및 `HelpBubbleTrigger`, `HelpBubbleAnchor` 외부를 클릭해도 Help Bubble이 닫히지 않습니다. 기본값은 `true`입니다. ```tsx import { VStack } from "@seed-design/react"; import { HelpBubbleTrigger } from "seed-design/ui/help-bubble"; import { ActionButton } from "seed-design/ui/action-button"; export default function () { return ( 토글 토글 ); } ``` ### Placement ```tsx import { IconSparkle2 } from "@karrotmarket/react-multicolor-icon"; import { Box, Icon } from "@seed-design/react"; import { HelpBubbleAnchor } from "seed-design/ui/help-bubble"; export default function HelpBubblePreview() { return (
} /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } />
); } ``` ### Flip ```tsx import { IconSparkle2 } from "@karrotmarket/react-multicolor-icon"; import { Icon } from "@seed-design/react"; import { HelpBubbleAnchor } from "seed-design/ui/help-bubble"; export default function HelpBubbleFlip() { return ( } /> ); } ``` ### Close Button ```tsx import { ActionButton } from "seed-design/ui/action-button"; import { HelpBubbleTrigger } from "seed-design/ui/help-bubble"; export default function HelpBubbleCloseButton() { return ( 토글 ); } ``` ### Description `description`을 사용하여 `title` 아래에 설명을 추가할 수 있습니다. ```tsx import { IconSparkle2 } from "@karrotmarket/react-multicolor-icon"; import { Icon } from "@seed-design/react"; import { HelpBubbleAnchor } from "seed-design/ui/help-bubble"; export default function HelpBubbleDescription() { return ( } /> ); } ``` ### Title Only ```tsx import { IconSparkle2 } from "@karrotmarket/react-multicolor-icon"; import { Icon } from "@seed-design/react"; import { HelpBubbleAnchor } from "seed-design/ui/help-bubble"; export default function HelpBubbleTitleOnly() { return ( } /> ); } ``` ### Setting Width Manually `content`에는 기본 최대 너비가 지정되어 있습니다. `contentProps`에 `maxWidth`를 지정하면 이 기본값을 덮어쓰고, `none`을 지정하면 최대 너비 제한이 사라집니다. 인라인 스타일로 `width`를 함께 지정할 수도 있으며, 이때 `maxWidth`가 `width`보다 좁으면 `maxWidth`가 적용됩니다. ```tsx import { HelpBubbleAnchor } from "seed-design/ui/help-bubble"; import { SegmentedControl, SegmentedControlItem } from "seed-design/ui/segmented-control"; import { Text, VStack } from "@seed-design/react"; import { useState } from "react"; const WIDTH_OPTIONS = ["200px", "300px", "unset"] as const; const MAX_WIDTH_OPTIONS = ["200px", "400px", "none"] as const; export default function HelpBubbleWidth() { const [width, setWidth] = useState<(typeof WIDTH_OPTIONS)[number]>("unset"); const [maxWidth, setMaxWidth] = useState<(typeof MAX_WIDTH_OPTIONS)[number]>("400px"); return ( width setWidth(value as (typeof WIDTH_OPTIONS)[number])} > {WIDTH_OPTIONS.map((option) => ( {option} ))} maxWidth setMaxWidth(value as (typeof MAX_WIDTH_OPTIONS)[number])} > {MAX_WIDTH_OPTIONS.map((option) => ( {option} ))} ); } ``` ### Line Breaks ```tsx import { IconSparkle2 } from "@karrotmarket/react-multicolor-icon"; import { Icon } from "@seed-design/react"; import { HelpBubbleAnchor } from "seed-design/ui/help-bubble"; import { HStack } from "@seed-design/react"; export default function HelpBubbleLineBreaks() { return ( Breaking
lines
using
`<br />`s } > } />
} />
); } ``` ### `z-index` Offset ```tsx import { Flex, HStack, VStack } from "@seed-design/react"; import { useState } from "react"; import { HelpBubbleAnchor } from "seed-design/ui/help-bubble"; import { Slider } from "seed-design/ui/slider"; import { Avatar } from "seed-design/ui/avatar"; export default function HelpBubbleZIndexOffset() { const [zIndexOffset, setZIndexOffset] = useState(5); return ( {Array.from({ length: 5 }, (_, i) => ( {i + 100} ))} setZIndexOffset(value)} markers={[0, 5]} getAriaLabel={() => "zIndexOffset"} hideValueIndicator /> ); } ```