MeDo

AI 툴팁 생성기.

필요한 힌트를 설명하면 MeDo가 동작 전체를 생성합니다 — 열기·닫기 지연, 뷰포트 경계를 피하는 반전, 항상 트리거를 향하는 화살표, 키보드 포커스 트리거, 그리고 aria-describedby 연결까지.

툴팁
툴팁

툴팁은 사용자 3분의 1이 결코 보지 못하는 유일한 컴포넌트입니다

터치스크린에는 호버가 없습니다. "이 컨트롤을 실행하지 않고 설명만 보여줘"를 안정적으로 뜻하는 휴대폰 제스처는 없으며, 따라서 모든 툴팁은 트래픽의 상당 부분에게 보이지 않습니다. 이 한 가지 사실이 툴팁 설계 논쟁의 대부분을 시작 전에 끝냅니다. 툴팁은 사용자가 반드시 필요로 하지 않는 정보만 담을 수 있습니다. 입력 필드 요건, 오류 메시지, 가격 관련 주의사항, 아이콘만 있는 버튼의 의미는 모두 눈에 보이는 곳이나 접근 가능한 이름에 있어야 합니다. 툴팁을 이미 그것 없이도 작동하는 인터페이스 위에 얹는 다듬기로 취급하면, 접근성 문제는 대부분 스스로 해결됩니다.

템플릿 6개

생성할 수 있는 툴팁 템플릿

모든 템플릿은 스크린샷이 아니라 실제 프롬프트입니다. 어떤 AI 에디터에든 붙여넣거나 MeDo에서 실행해 React + Tailwind 코드를 그대로 받으세요.

BasicLabel Hint

Dark Panel Hint on Hover and Focus

The default tooltip: one line of plain text, dark panel, arrow, delays in both directions. Reach for it when a control is already named and you only want to add a detail a mouse user might appreciate.

Create a tooltip component that wraps a single trigger child and renders a short plain-text hint on pointer enter and on focus-visible. Use a dark slate panel with 13px white text, 6px vertical and 10px horizontal padding, a 6px radius, a 240px max width and an 8px offset from the trigger, plus a 6px arrow aimed at the trigger. Open after a 300ms delay and close after 100ms so the pointer can cross the gap without the panel vanishing. Dismiss on Escape, on blur and on scroll. Give the panel role="tooltip" and link it to the trigger with aria-describedby only while it is open, rather than leaving hidden markup in the tree. Fade and translate 4px on entry, and drop the transition entirely under prefers-reduced-motion.

MeDo에서 시도하기
Icon-onlyIcon Button

Tooltip as the Only Label a Control Has

When the icon is the whole button, the tooltip text is the accessible name — not a description. Getting that distinction wrong is why so many toolbars announce the same word twice.

Create a tooltip for an icon-only button where the tooltip text is the only name the control has. Put that string in aria-label on the button and do not also set aria-describedby, so the same words are not announced twice. The visible panel exists for sighted pointer users: dark surface, 12px text, a single line that does not wrap under 200px. Open on hover after a 400ms delay but open immediately on focus-visible, since a keyboard user has already committed to the control. Close on Escape, on blur and on pointer leave. Keep the button hit area at least 44px even when the glyph is 20px, and skip rendering the panel entirely when a coarse pointer is detected.

MeDo에서 시도하기
CollisionAuto Flip

Edge-Aware Placement With a Tracking Arrow

Handles the case a fixed side always breaks: a trigger near the top of a scroll container or the right edge of the viewport. The arrow has to re-anchor after the flip or it points at nothing.

Create a tooltip with collision-aware placement: a preferred side prop of top, bottom, left or right, an explicit fallback order, and shifting along the cross axis when the panel would overflow the viewport or the nearest scrolling ancestor. Add a 6px arrow that re-anchors to the trigger centre after any flip or shift, clamped so it never slides past the panel corner radius. Recompute position on scroll and resize behind a requestAnimationFrame throttle, and close rather than reposition once the trigger leaves the visible area. Keep the aria-describedby relationship stable across repositioning so the description is not re-announced. Use role="tooltip" and plain text content with no interactive children.

MeDo에서 시도하기
ToolbarGroup Skip

Shared Delay Across a Button Row

One provider, one timer. Once the first tooltip in a toolbar has opened, moving along the row should switch content instantly instead of making the user wait 300ms per button.

Create a tooltip provider that shares open state across a group of triggers in a toolbar. The first tooltip in the group waits the full 300ms open delay; while any tooltip in the group is open, moving to a sibling trigger swaps the content with no delay and no exit animation, so the panel appears to slide along the row. Leaving the group entirely closes after a 150ms grace period. Reuse a single positioned panel element rather than mounting one per trigger, and update its aria-describedby target as the active trigger changes. Escape closes the group and returns focus behaviour to normal. Under prefers-reduced-motion, replace the slide with an instant content swap.

MeDo에서 시도하기
Multi-lineRich Hint

Two-Line Tooltip With a Keyboard Shortcut

A label line plus a monospace shortcut hint on the right. Still passive, still text-only — the moment you want a link in here, you want a popover instead.

Create a tooltip that renders a label line plus a secondary line, with an optional keyboard shortcut rendered as a small monospace chip aligned to the right of the label. Cap the panel at 260px, allow the description to wrap to two lines, and keep line-height at 1.4 so the two lines read as one block. Content stays non-interactive: no links, no buttons, no selectable code — if the user needs to click inside, use a popover. Announce the whole panel as one description via aria-describedby so the shortcut is read as part of the sentence rather than as a separate node. Open after 300ms, close after 100ms, dismiss on Escape and blur.

MeDo에서 시도하기
OverflowTruncation

Tooltip Only When the Text Is Clipped

Table cells and file names truncate with an ellipsis; a tooltip that repeats already-visible text is noise. Measure the element and only attach the tooltip when scrollWidth exceeds clientWidth.

Create a conditional tooltip for truncated text: compare scrollWidth against clientWidth on the target element and only register hover and focus handlers when the text is actually clipped, so a fully visible cell never shows a tooltip repeating itself. Re-measure on resize and whenever the text content changes, using a ResizeObserver rather than a window listener. When active, show the full string in a dark panel capped at 320px with wrapping enabled, positioned below the cell to avoid covering the row header. Make the truncated element focusable with tabindex="0" only while the tooltip is registered, so keyboard users can reach it without collecting empty tab stops across the whole table.

MeDo에서 시도하기

툴팁 커스터마이즈 방법

열기 지연과 닫기 지연을 따로 설정하세요

하나의 공통 지연은 양방향 모두에서 잘못됩니다. 열기 전 약 300ms는 포인터가 툴바를 지나갈 때 툴팁이 번쩍이는 것을 막고, 100ms의 짧은 닫기 지연은 패널이 이동 중에 사라지지 않고 포인터가 트리거에서 툴팁으로 이동할 수 있게 합니다.

고정된 방향이 아니라 충돌 감지를 요청하세요

위쪽에 고정된 툴팁은 뷰포트 상단이나 스크롤 컨테이너의 경계에서 잘립니다. 선호 방향과 대체 방향을 지정해 컴포넌트가 스스로 반전하고 이동하도록 하고, 이동 후에도 화살표가 트리거를 계속 가리켜야 한다고 명시하세요.

호버뿐 아니라 포커스로도 열리도록 요구하세요

툴팁이 마우스에만 반응하면 키보드 사용자는 아무것도 얻지 못합니다. focus-visible에서 열리고 Escape와 blur에서 닫히도록 요청하세요. 이는 스위치 기기나 스크린 리더로 탐색하는 사람에게도 사용 가능하게 만드는 조건입니다.

콘텐츠는 수동적이고 텍스트만으로 유지하세요

툴팁에 링크, 버튼, 복사 가능한 텍스트가 들어가는 순간 그것에 도달해 열어 둘 방법이 필요해지고, 더 이상 툴팁이 아닙니다. 콘텐츠가 인터랙티브하지 않은 일반 텍스트라고 명시하고, 안에 클릭할 것이 필요하면 팝오버를 사용하세요.

툴팁 컴포넌트를 사용하는 사람

대시보드 또는 관리 도구

아이콘만 있는 툴바 버튼에 실제 접근 가능한 이름을 부여하고, 시각으로 마우스를 쓰는 사용자에게 레이블을 반복하는 툴팁을 더합니다. 포인터가 인접한 버튼 사이를 이동할 때는 열기 지연을 건너뜁니다.

SaaS 제품

지표 계산 방식을 설명하는 차트 범례 힌트로, 패널 상단 근처에서는 트리거 아래로 반전되고 스크롤 시 닫혀 설명 대상과 분리되어 떠 있는 일이 없습니다.

이커머스 스토어

사이즈 표 약어와 배송 배지 아이콘을 호버로 설명하되, 같은 정보를 상품 페이지 본문에도 표시합니다. 휴대폰 쇼핑객은 호버를 실행할 수 없기 때문입니다.

개발자 문서

인라인 코드 토큰과 약어가 호버 또는 포커스 시 한 줄 타입 시그니처를 보여주며, 최대 너비를 좁게 제한해 패널이 설명 중인 코드 샘플을 덮지 않게 합니다.

웹사이트 유형별 툴팁 패턴

같은 툴팁 컴포넌트를 게시되는 사이트 유형에 맞춰 조정합니다.

01 / 06

Dashboard and Admin Tools

Dense toolbars are where tooltips earn their keep and where a per-trigger delay is most annoying. Use one shared provider so moving along a row of icon buttons swaps the label instantly. The tooltip still cannot be the only place the label exists — every icon button needs a real accessible name regardless.

툴팁 스타일과 변형

페이지의 나머지 부분과 어울리는 변형을 골라 바로 생성하세요.

01 / 06

Dark Panel Tooltip

A dark slate surface with white text is the default for a reason: it reads as an overlay rather than as page content, so users do not mistake it for a permanent part of the layout. Keep the panel opaque — a translucent tooltip over a chart becomes unreadable exactly where it is needed.

React, Next.js, Vue, Svelte에서의 툴팁

React, Next.js, Vue 3, SvelteKit, Astro 또는 순수 HTML — 같은 툴팁을 여섯 가지 방식으로 넣을 수 있습니다.

01 / 06

React Tooltip

Positioning needs real DOM measurement, so this is a client component with refs on both trigger and panel. Portal the panel to document.body — a tooltip inside a container with overflow: hidden will be clipped no matter how correct the coordinates are.

src/components/Tooltip.tsx

export function Tooltip({ label, children }) {
  const [open, setOpen] = useState(false)
  const id = useId()

  return (
    <span
      onPointerEnter={() => setOpen(true)}
      onPointerLeave={() => setOpen(false)}
    >
      {cloneElement(children, { 'aria-describedby': open ? id : undefined })}
      {open && createPortal(<Panel id={id}>{label}</Panel>, document.body)}
    </span>
  )
}

툴팁을 프로젝트에 추가하는 방법

툴팁 템플릿을 고르고 프로덕션에 배포하기까지 네 단계.

01~30s

Pick a Tooltip Pattern

Choose by what the trigger already tells the user: a label hint for a named control, the icon-only variant when the tooltip text is the accessible name, or the truncation variant for table cells.

02~10s

Copy the Prompt

Take it into MeDo, Lovable, Bolt, v0 or Cursor, and set the open and close delays before you run it. Those two numbers are what separates a helpful hint from a panel that flickers across a toolbar.

03~1min

Generate and Refine

You get React + Tailwind back with a live preview. Follow up in plain English — "flip below near the top edge", "open instantly on focus", "skip the delay between toolbar buttons" — rather than editing coordinate math by hand.

04~2min

Wire the Triggers and Test the Keyboard

Portal the panel out of any overflow-hidden ancestor, then tab to each trigger and press Escape. If the hint only appears on hover, or Escape does not close it, the component is not shippable yet.

툴팁에 대한 자주 묻는 질문

AI로 툴팁 컴포넌트를 생성하는 방법은?

트리거, 위치, 타이밍을 하나의 프롬프트로 설명하세요 — 예를 들어 "트리거 위에 어두운 툴팁, 열기 지연 300ms, 뷰포트 경계에 닿으면 반전, 포커스에서도 열림". MeDo는 위치 지정 로직, 화살표, 지연, aria-describedby 연결을 함께 생성하므로, 스타일만 입힌 absolute div가 아니라 동작이 완성된 결과가 나옵니다.

툴팁과 팝오버의 차이는 무엇인가요?

툴팁은 수동적입니다. 가리키는 요소의 짧은 텍스트 설명을 보여주고, 벗어나는 즉시 닫히며, 클릭할 수 있는 것을 담지 않습니다. 팝오버는 인터랙티브합니다. 클릭으로 열리고 열린 상태를 유지하며, 링크·버튼·폼 필드를 담고 포커스를 가두거나 관리합니다. 툴팁 안에 버튼을 두고 싶어졌다면 필요한 것은 팝오버였습니다.

툴팁에 aria-describedby를 써야 하나요, aria-label을 써야 하나요?

트리거에 이미 보이는 이름이나 접근 가능한 이름이 있고 툴팁이 보충 설명을 더한다면 aria-describedby를 사용하세요. 설명은 이름 뒤에 안내되기 때문입니다. 아이콘만 있는 버튼처럼 툴팁 텍스트가 해당 컨트롤의 유일한 이름이라면 aria-label을 사용하고, 같은 문자열이 두 번 안내되지 않도록 그 경우에는 aria-describedby를 생략하세요.

툴팁이 터치 기기에서 작동할 수 있나요?

안정적으로는 아닙니다. 터치스크린에는 호버 상태가 없고 길게 누르기는 이미 텍스트 선택과 컨텍스트 메뉴가 차지하고 있어, 탭으로 툴팁을 띄우는 패턴은 플랫폼과 충돌합니다. 휴대폰과 태블릿 사용자는 툴팁을 결코 보지 못한다고 가정하고, 필수 정보는 보이는 텍스트나 접근 가능한 이름에 두세요.

툴팁이 열리기까지의 지연은 얼마가 좋을까요?

대략 200~500ms가 잘 작동하며 300ms가 안전한 기본값입니다. 이 지연은 포인터가 다른 곳으로 가는 도중 컨트롤 줄을 지나갈 때 툴팁이 깜빡이지 않게 하기 위해 존재합니다. 여기에 약 100ms의 훨씬 짧은 닫기 지연을 함께 두어 포인터가 툴팁으로 향하는 동안 패널이 사라지지 않게 하세요.

툴팁은 키보드로 닫을 수 있어야 하나요?

그렇습니다. WCAG는 호버나 포커스로 표시된 콘텐츠를 포인터나 포커스를 움직이지 않고 닫을 수 있어야 한다고 요구하며, 실무적으로는 Escape로 닫히는 것을 뜻합니다. 또한 읽을 수 있을 만큼 충분히 표시되어야 하고, 포인터가 위를 지나갈 수 있도록 호버 가능해야 합니다. 프롬프트에 키보드 지원을 언급하면 MeDo가 Escape, blur, 호버 브리지 동작을 구현합니다.