tooltips — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited tooltips (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Canonical source:examples/TOOLTIP_ACCESSIBILITY_BEST_PRACTICES.mdinmgifford/ACCESSIBILITY.mdThis skill is derived from that file. When in doubt, the example is authoritative.
Apply these rules when implementing or reviewing tooltip components. Only load this skill if the project contains tooltips.
Tooltips must convey supplementary information to all users regardless of input method. A tooltip unreachable by keyboard is an accessibility barrier.
Tooltips are non-interactive supplementary labels only. If the content is essential, or contains links/buttons, use persistent text or a popover instead.
| Level | Meaning |
|---|---|
| Critical | Tooltip contains essential information with no other access route |
| Serious | Tooltip unreachable by keyboard or AT |
| Moderate | Tooltip accessible but WCAG 1.4.13 requirements not fully met |
| Minor | Best-practice gap; marginal impact |
A tooltip is supplementary by definition. If the information it contains is required to complete a task, it must also appear as persistent visible text. Hiding essential content behind hover/focus only is Critical.
A tooltip that only appears on hover is Serious — keyboard users cannot trigger it.
function showTooltip() { tooltip.removeAttribute('hidden'); }
function hideTooltip() { tooltip.setAttribute('hidden', ''); }
trigger.addEventListener('mouseenter', showTooltip);
trigger.addEventListener('mouseleave', hideTooltip);
trigger.addEventListener('focusin', showTooltip);
trigger.addEventListener('focusout', hideTooltip);
// Escape dismisses without moving focus
trigger.addEventListener('keydown', (e) => {
if (e.key === 'Escape') hideTooltip();
});Incorrect ARIA on tooltips is Serious — AT users receive wrong or no supplementary information.
<button type="button" aria-describedby="save-tooltip">Save</button>
<div id="save-tooltip" role="tooltip" hidden>
Save changes to your draft
</div>Rules:
role="tooltip"aria-describedby (not aria-labelledby)hidden to conceal; never aria-hidden="true" on an active tooltipidrole="tooltip" on the trigger itselftabindex on the tooltip containerFor icon-only triggers, add aria-label for the accessible name:
<button type="button"
aria-label="Delete item"
aria-describedby="delete-tip">
<!-- SVG icon, aria-hidden="true" focusable="false" -->
</button>
<div id="delete-tip" role="tooltip" hidden>
Permanently removes this item from your account
</div>| Requirement | Description | Severity if failing |
|---|---|---|
| Dismissible | Escape dismisses without moving pointer or focus | Serious |
| Hoverable | User can move pointer over tooltip without it disappearing | Moderate |
| Persistent | Stays visible until trigger loses focus/hover | Moderate |
Hover tooltips do not work on touch screens. Use the toggletip pattern:
<button type="button"
aria-expanded="false"
aria-controls="info-tip"
aria-label="More information about password requirements">
<span aria-hidden="true">ⓘ</span>
</button>
<div id="info-tip" hidden>
Your password must be at least 12 characters and include a number.
</div>Toggle aria-expanded and hidden together on click.
prefers-reduced-motion:@media (prefers-reduced-motion: no-preference) {
[role="tooltip"] { transition: opacity 0.15s ease; }
}role="tooltip" on tooltip elementaria-describedby pointing to tooltip idEscape dismisses without moving focusprefers-reduced-motion respected for animationsStandards horizon: WCAG 3.0 is in development; 1.4.13 requirements are expected to carry forward. Monitor: <https://www.w3.org/TR/wcag-3.0/>
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.