Tooltip
아이콘 버튼의 이름이나 짧은 보조 설명을 hover/focus 시 보여줍니다. 필수 정보를 툴팁에만 두지 않습니다.
1. Default
요소 위쪽에 뜨는 기본 위치입니다.
목록을 다시 불러옵니다
HTML
<span class="tooltip-wrap show"><button type="button" class="btn md secondary">새로 고침</button><span class="tooltip" role="tooltip">목록을 다시 불러옵니다</span></span>CSS · .tooltip, .tooltip-wrap
/* JS Design System v0.6 · .tooltip, .tooltip-wrap · 토큰(var(--*))은 assets/style.css :root 참고 */
.tooltip-wrap{position:relative;display:inline-flex}
.tooltip{position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);background:var(--bg-inverse);color:var(--text-inverse);font-size:12px;font-weight:500;line-height:1.4;padding:6px 10px;border-radius:6px;white-space:nowrap;box-shadow:var(--shadow-2);z-index:10;pointer-events:none;opacity:0;transition:opacity var(--motion-fast)}
.tooltip::after{content:"";position:absolute;left:50%;top:100%;transform:translateX(-50%);border:5px solid transparent;border-top-color:var(--bg-inverse)}
.tooltip.bottom{bottom:auto;top:calc(100% + 8px)}
.tooltip.bottom::after{top:auto;bottom:100%;border-top-color:transparent;border-bottom-color:var(--bg-inverse)}
.tooltip.left{left:auto;right:calc(100% + 8px);bottom:50%;transform:translateY(50%)}
.tooltip.left::after{left:100%;top:50%;transform:translateY(-50%);border-top-color:transparent;border-left-color:var(--bg-inverse)}
.tooltip.right{left:calc(100% + 8px);bottom:50%;transform:translateY(50%)}
.tooltip.right::after{left:auto;right:100%;top:50%;transform:translateY(-50%);border-top-color:transparent;border-right-color:var(--bg-inverse)}
.tooltip-wrap:hover .tooltip,.tooltip-wrap:focus-within .tooltip,.tooltip-wrap.show .tooltip{opacity:1}
.tooltip.multi{white-space:normal;width:220px;text-align:left}React · @jiran/ds-react
import { Button, Tooltip } from "@jiran/ds-react";
export default function Example() {
return (
<Tooltip content="목록을 다시 불러옵니다" show>
<Button variant="secondary">새로 고침</Button>
</Tooltip>
);
}2. Position
기본 위. .bottom / .left / .right. 예제는 .show 로 항상 표시.
위 (기본)
아래
왼쪽
오른쪽
HTML
<span class="tooltip-wrap show"><button type="button" class="btn md secondary">Top</button><span class="tooltip" role="tooltip">위 (기본)</span></span>
<span class="tooltip-wrap show"><button type="button" class="btn md secondary">Bottom</button><span class="tooltip bottom" role="tooltip">아래</span></span>
<span class="tooltip-wrap show"><button type="button" class="btn md secondary">Left</button><span class="tooltip left" role="tooltip">왼쪽</span></span>
<span class="tooltip-wrap show"><button type="button" class="btn md secondary">Right</button><span class="tooltip right" role="tooltip">오른쪽</span></span>CSS · .tooltip, .tooltip-wrap
/* JS Design System v0.6 · .tooltip, .tooltip-wrap · 토큰(var(--*))은 assets/style.css :root 참고 */
.tooltip-wrap{position:relative;display:inline-flex}
.tooltip{position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);background:var(--bg-inverse);color:var(--text-inverse);font-size:12px;font-weight:500;line-height:1.4;padding:6px 10px;border-radius:6px;white-space:nowrap;box-shadow:var(--shadow-2);z-index:10;pointer-events:none;opacity:0;transition:opacity var(--motion-fast)}
.tooltip::after{content:"";position:absolute;left:50%;top:100%;transform:translateX(-50%);border:5px solid transparent;border-top-color:var(--bg-inverse)}
.tooltip.bottom{bottom:auto;top:calc(100% + 8px)}
.tooltip.bottom::after{top:auto;bottom:100%;border-top-color:transparent;border-bottom-color:var(--bg-inverse)}
.tooltip.left{left:auto;right:calc(100% + 8px);bottom:50%;transform:translateY(50%)}
.tooltip.left::after{left:100%;top:50%;transform:translateY(-50%);border-top-color:transparent;border-left-color:var(--bg-inverse)}
.tooltip.right{left:calc(100% + 8px);bottom:50%;transform:translateY(50%)}
.tooltip.right::after{left:auto;right:100%;top:50%;transform:translateY(-50%);border-top-color:transparent;border-right-color:var(--bg-inverse)}
.tooltip-wrap:hover .tooltip,.tooltip-wrap:focus-within .tooltip,.tooltip-wrap.show .tooltip{opacity:1}
.tooltip.multi{white-space:normal;width:220px;text-align:left}React · @jiran/ds-react
import { Button, Tooltip } from "@jiran/ds-react";
export default function Example() {
return (
<>
<Tooltip content="위 (기본)" show><Button variant="secondary">Top</Button></Tooltip>
<Tooltip content="아래" position="bottom" show><Button variant="secondary">Bottom</Button></Tooltip>
<Tooltip content="왼쪽" position="left" show><Button variant="secondary">Left</Button></Tooltip>
<Tooltip content="오른쪽" position="right" show><Button variant="secondary">Right</Button></Tooltip>
</>
);
}3. On Hover / Focus
실제 동작. 아이콘 버튼 위에 마우스를 올리거나 포커스하세요. aria-describedby 로 연결.
새로 고침
필터
삭제
HTML
<span class="tooltip-wrap"><button type="button" class="btn md secondary icon" aria-label="새로 고침" aria-describedby="tt1"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4"/><path d="M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4"/></svg></button><span class="tooltip" role="tooltip" id="tt1">새로 고침</span></span>
<span class="tooltip-wrap"><button type="button" class="btn md secondary icon" aria-label="필터" aria-describedby="tt2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227"/></svg></button><span class="tooltip" role="tooltip" id="tt2">필터</span></span>
<span class="tooltip-wrap"><button type="button" class="btn md danger secondary icon" aria-label="삭제" aria-describedby="tt3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 7l16 0"/><path d="M10 11l0 6"/><path d="M14 11l0 6"/><path d="M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12"/><path d="M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3"/></svg></button><span class="tooltip" role="tooltip" id="tt3">삭제</span></span>CSS · .tooltip, .tooltip-wrap
/* JS Design System v0.6 · .tooltip, .tooltip-wrap · 토큰(var(--*))은 assets/style.css :root 참고 */
.tooltip-wrap{position:relative;display:inline-flex}
.tooltip{position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);background:var(--bg-inverse);color:var(--text-inverse);font-size:12px;font-weight:500;line-height:1.4;padding:6px 10px;border-radius:6px;white-space:nowrap;box-shadow:var(--shadow-2);z-index:10;pointer-events:none;opacity:0;transition:opacity var(--motion-fast)}
.tooltip::after{content:"";position:absolute;left:50%;top:100%;transform:translateX(-50%);border:5px solid transparent;border-top-color:var(--bg-inverse)}
.tooltip.bottom{bottom:auto;top:calc(100% + 8px)}
.tooltip.bottom::after{top:auto;bottom:100%;border-top-color:transparent;border-bottom-color:var(--bg-inverse)}
.tooltip.left{left:auto;right:calc(100% + 8px);bottom:50%;transform:translateY(50%)}
.tooltip.left::after{left:100%;top:50%;transform:translateY(-50%);border-top-color:transparent;border-left-color:var(--bg-inverse)}
.tooltip.right{left:calc(100% + 8px);bottom:50%;transform:translateY(50%)}
.tooltip.right::after{left:auto;right:100%;top:50%;transform:translateY(-50%);border-top-color:transparent;border-right-color:var(--bg-inverse)}
.tooltip-wrap:hover .tooltip,.tooltip-wrap:focus-within .tooltip,.tooltip-wrap.show .tooltip{opacity:1}
.tooltip.multi{white-space:normal;width:220px;text-align:left}React · @jiran/ds-react
import { Button, Icon, Tooltip } from "@jiran/ds-react";
export default function Example() {
return (
<>
<Tooltip content="새로 고침"><Button variant="secondary" icon aria-label="새로 고침"><Icon name="refresh" /></Button></Tooltip>
<Tooltip content="필터"><Button variant="secondary" icon aria-label="필터"><Icon name="filter" /></Button></Tooltip>
<Tooltip content="삭제"><Button variant="danger-secondary" icon aria-label="삭제"><Icon name="trash" /></Button></Tooltip>
</>
);
}4. Multiline
두 줄 이상은 .multi (폭 220). 그 이상 설명은 Popover/도움말 링크.
검토 필요서명이 확인되지 않은 실행 파일입니다. 24시간 내 처리하지 않으면 자동 차단됩니다.
HTML
<span class="tooltip-wrap show"><span class="indicator warn">검토 필요</span><span class="tooltip multi" role="tooltip">서명이 확인되지 않은 실행 파일입니다. 24시간 내 처리하지 않으면 자동 차단됩니다.</span></span>CSS · .tooltip, .tooltip-wrap
/* JS Design System v0.6 · .tooltip, .tooltip-wrap · 토큰(var(--*))은 assets/style.css :root 참고 */
.tooltip-wrap{position:relative;display:inline-flex}
.tooltip{position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);background:var(--bg-inverse);color:var(--text-inverse);font-size:12px;font-weight:500;line-height:1.4;padding:6px 10px;border-radius:6px;white-space:nowrap;box-shadow:var(--shadow-2);z-index:10;pointer-events:none;opacity:0;transition:opacity var(--motion-fast)}
.tooltip::after{content:"";position:absolute;left:50%;top:100%;transform:translateX(-50%);border:5px solid transparent;border-top-color:var(--bg-inverse)}
.tooltip.bottom{bottom:auto;top:calc(100% + 8px)}
.tooltip.bottom::after{top:auto;bottom:100%;border-top-color:transparent;border-bottom-color:var(--bg-inverse)}
.tooltip.left{left:auto;right:calc(100% + 8px);bottom:50%;transform:translateY(50%)}
.tooltip.left::after{left:100%;top:50%;transform:translateY(-50%);border-top-color:transparent;border-left-color:var(--bg-inverse)}
.tooltip.right{left:calc(100% + 8px);bottom:50%;transform:translateY(50%)}
.tooltip.right::after{left:auto;right:100%;top:50%;transform:translateY(-50%);border-top-color:transparent;border-right-color:var(--bg-inverse)}
.tooltip-wrap:hover .tooltip,.tooltip-wrap:focus-within .tooltip,.tooltip-wrap.show .tooltip{opacity:1}
.tooltip.multi{white-space:normal;width:220px;text-align:left}React · @jiran/ds-react
import { Indicator, Tooltip } from "@jiran/ds-react";
export default function Example() {
return (
<Tooltip content="서명이 확인되지 않은 실행 파일입니다. 24시간 내 처리하지 않으면 자동 차단됩니다." multi show>
<Indicator tone="warn">검토 필요</Indicator>
</Tooltip>
);
}Props
HTML 에서는 클래스와 속성으로, React(@jiran/ds-react)에서는 같은 이름의 prop(variant · size …)으로 변형·상태를 지정합니다.
| Prop / Class | Type · Values | Default | Description |
|---|---|---|---|
| .tooltip-wrap | container | — | position:relative 트리거 래퍼 |
| .tooltip | span | — | role=tooltip. 기본 위치 위 |
| position | .bottom | .left | .right | top | 위치 |
| .show | boolean | false | 강제 표시(문서·디버그) |
| .multi | boolean | false | 여러 줄, 폭 220 |
Usage
React: @jiran/ds-react 패키지를 설치하고 style.css 를 한 번 import 하면 위 React 탭 코드를 그대로 쓸 수 있습니다(React Package). HTML: assets/style.css 를 연결하고(일부만 필요하면 아래 컴포넌트 CSS 복사), 동작이 필요하면 assets/ds.js 를 함께 넣습니다 — 이 페이지의 프리뷰가 그 스크립트로 동작합니다. 색은 전부 토큰(var(--accent) 등)을 참조하므로 --accent-* 만 제품 컬러로 바꾸면 됩니다.
React @jiran/ds-react
npm i @jiran/ds-react
// main.tsx — 앱 진입점에서 한 번
import "@jiran/ds-react/style.css";
// 컴포넌트
import { Tooltip } from "@jiran/ds-react";HTML
<!-- 1) 토큰 + 전체 컴포넌트 스타일 한 번에 연결 -->
<link rel="stylesheet" href="assets/style.css">
<!-- 동작(드롭다운·탭·달력·표 정렬/선택·토스트 등) — 순수 JS 한 파일. React 제품은 불필요 -->
<script src="assets/ds.js" defer></script>
<!-- 2) 또는 아래 "Component CSS" 만 프로젝트 CSS 에 붙이고,
:root 토큰은 Foundations › Design Token 에서 복사 -->Component CSS .tooltip, .tooltip-wrap
/* JS Design System v0.6 · .tooltip, .tooltip-wrap · 토큰(var(--*))은 assets/style.css :root 참고 */
.tooltip-wrap{position:relative;display:inline-flex}
.tooltip{position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);background:var(--bg-inverse);color:var(--text-inverse);font-size:12px;font-weight:500;line-height:1.4;padding:6px 10px;border-radius:6px;white-space:nowrap;box-shadow:var(--shadow-2);z-index:10;pointer-events:none;opacity:0;transition:opacity var(--motion-fast)}
.tooltip::after{content:"";position:absolute;left:50%;top:100%;transform:translateX(-50%);border:5px solid transparent;border-top-color:var(--bg-inverse)}
.tooltip.bottom{bottom:auto;top:calc(100% + 8px)}
.tooltip.bottom::after{top:auto;bottom:100%;border-top-color:transparent;border-bottom-color:var(--bg-inverse)}
.tooltip.left{left:auto;right:calc(100% + 8px);bottom:50%;transform:translateY(50%)}
.tooltip.left::after{left:100%;top:50%;transform:translateY(-50%);border-top-color:transparent;border-left-color:var(--bg-inverse)}
.tooltip.right{left:calc(100% + 8px);bottom:50%;transform:translateY(50%)}
.tooltip.right::after{left:auto;right:100%;top:50%;transform:translateY(-50%);border-top-color:transparent;border-right-color:var(--bg-inverse)}
.tooltip-wrap:hover .tooltip,.tooltip-wrap:focus-within .tooltip,.tooltip-wrap.show .tooltip{opacity:1}
.tooltip.multi{white-space:normal;width:220px;text-align:left}