Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
197 commits
Select commit Hold shift + click to select a range
c5971b3
:sparkles: New integration check first step
dej611 May 12, 2026
d89a077
:wrench: register the new cli module
dej611 May 13, 2026
d6407c0
:sparkles: New CLI to validate workflows examples
dej611 May 13, 2026
7f18cc1
Changes from node scripts/lint_ts_projects --fix
kibanamachine May 14, 2026
40996c6
Changes from node scripts/generate codeowners
kibanamachine May 14, 2026
61ad2b7
Changes from node scripts/regenerate_moon_projects.js --update
kibanamachine May 14, 2026
e1b7537
Merge branch 'main' into fix/integration-worflows-test
dej611 May 18, 2026
a8cc1d6
Merge branch 'main' into fix/integration-worflows-test
dej611 May 22, 2026
c325f1c
Merge branch 'main' into fix/integration-worflows-test
dej611 May 25, 2026
a24ae45
Merge branch 'main' into fix/integration-worflows-test
dej611 May 27, 2026
4d91f58
[Security Solution][Entity Analytics] Show leads read-privileges call…
abhishekbhatia1710 May 27, 2026
aa99fec
Fix `@elastic/eui/no-unnamed-interactive-element` lint violations in …
Copilot May 27, 2026
b4ff638
[Flaky Test Fixer] Create flaky test investigator skill (#269071)
csr May 27, 2026
8a490b6
[kbn-code-owners] Add `elastic/observability-bi` team under Observabi…
csr May 27, 2026
16cb633
skip failing test suite (#267137)
kibanamachine May 27, 2026
e793609
skip failing test suite (#270744)
kibanamachine May 27, 2026
6f68365
[Security Solution][Rule Edit] Properly abort esql requests made by t…
denar50 May 27, 2026
4f84567
[Scout] Sanitize Buildkite step keys for nested plugin names (#271412)
steliosmavro May 27, 2026
b374513
[Synthetics] Wait for active space before fetching cross-space monito…
shahzad31 May 27, 2026
4bf6b1f
[@kbn/rspack-optimizer] Fall back to ephemeral HMR port on EADDRINUSE…
shahzad31 May 27, 2026
fb18ef2
Fix @elastic/eui/require-table-caption lint violations in drilldown m…
Copilot May 27, 2026
f7c06a5
Split entity_analytics test CODEOWNERS by feature (#271422)
maxcold May 27, 2026
668d2b2
Remove async imports from reporting plugin setup and start methods (#…
nreese May 27, 2026
36c8922
[Fleet] Don't try to invalidate remote API keys (#271403)
jillguyonnet May 27, 2026
f757d37
[Graph] update graph api and ftr test entities fixtures alias (#271209)
alexreal1314 May 27, 2026
4e128d0
Add aria-label to Custom Instructions textarea in edit details flyout…
Copilot May 27, 2026
8ad7aa9
Update dependency selenium-webdriver to v4.44.0 (main) (#271362)
elastic-renovate-prod[bot] May 27, 2026
9912414
[Fleet] Replace oneOf with discriminatedUnion where applicable (#271407)
criamico May 27, 2026
edbe5c1
Add aria-label to Auto-included badge for screen reader announcement …
Copilot May 27, 2026
4585542
[Dashboards in chat] Hide XY axis titles for AI-generated visualizati…
olapawlus May 27, 2026
857603f
Move unified rules page into Stack Management (#269568)
jasonrhodes May 27, 2026
0b04611
Update EUI to v116.2.0 (#271384)
acstll May 27, 2026
3339ec0
[Chrome Next] App Header (#271288)
Dosant May 27, 2026
9968fa4
[SigEvents] Add lifecycle view and filters for significant events (#2…
cesco-f May 27, 2026
98c7902
[SigEvents] Register KI workflows as managed workflows (#270377)
cesco-f May 27, 2026
56a1c44
[Obs AI] Add minimum time for trace change point agg (#271350)
neptunian May 27, 2026
07458ce
[DOCS] Adds 9.4.2 Kibana release notes (#270302)
nastasha-solomon May 27, 2026
10f7bde
[DOCS] Adds 9.3.5 Kibana release notes (#270299)
nastasha-solomon May 27, 2026
0fb8cae
[DOCS][Release Notes] Updates known issue description in Kibana relea…
nastasha-solomon May 27, 2026
0eb58b5
feat: add experimental badge support for UiSettings, use it for agent…
seanstory May 27, 2026
32340a9
[Security Solution] Instrument DetectionRulesClient with change track…
maximpn May 27, 2026
03fa567
[EARS] Make EARS feature-flag gate functionality per-provider (#270426)
seanstory May 27, 2026
cbaf473
[Entity Analytics] Anomaly detection behavior maintainer (#269309)
ymao1 May 27, 2026
621a331
[ML] move loadIfNeeded in index file, remove unloading on finish (#27…
dmlemeshko May 27, 2026
42b2e96
[kbn-evals] Fix typo in the smoke tests evaluation suite path (#271425)
SrdjanLL May 27, 2026
55f52ac
[i18n] Update kibana.yml with non-deprecated setting (#270781)
tsullivan May 27, 2026
7a4b862
[Cases][Templates] Improvements to templates yaml editor (#269076)
MykhailoKondrat May 27, 2026
aae6ae9
[Metrics][Discover] Refactor METRICS_INFO error handling (#270627)
jorgeoliveira117 May 27, 2026
4b2af0f
[Alerting v2] Flag rule ESQL query errors as user errors (#270643)
jcger May 27, 2026
88eadef
[Console] Enable auto-merge in console_definitons (#270941)
SoniaSanzV May 27, 2026
c0679b6
[Security Solution] AT skill `get_endpoint_artifacts` tool (#270607)
joeypoon May 27, 2026
c7b089e
Use uuid matchers in search MV13 rollback fixtures (#271196)
gsoldevila May 27, 2026
01175c2
[docs] Update SO validate troubleshooting section for new PR comment …
gsoldevila May 27, 2026
f0e4180
upgrade @ai-sdk/provider-utils to 3.0.25 (#270773)
wildemat May 27, 2026
79c081c
[Security] Mirror elasticsearch-controller role changes to Kibana rol…
tiansivive May 27, 2026
6b33bce
chore(deps): bump `shell-quote` from `1.8.3` to `1.8.4` (#271534)
azasypkin May 27, 2026
ffba678
Update z-index and height properties in useMenuHeaderStyle hook (#271…
paulinashakirova May 27, 2026
c761807
[Discover][Metrics] Reorganize metric grid card actions (#267302)
justinkambic May 27, 2026
7c2e09d
[Fleet] Add collector groups (#270619)
nchaulet May 27, 2026
b7241af
[CI] Skip archive upload when tsc fails (#271467)
tylersmalley May 27, 2026
2b80713
feat(action_policies): Create simple actions from rule form (#271319)
kdelemme May 27, 2026
0834567
[Fleet] Add package policy conditions UI support (#270315)
MichelLosier May 27, 2026
b7793c3
[Search][Getting Started] Chat first view (#270500)
TattdCodeMonkey May 27, 2026
38ad177
[V2 Rules] Discover Composer — field population fixes and general sty…
baileycash-elastic May 27, 2026
f5b5e07
[ResponseOps] Surface task_manager.runSoon 409 conflicts to callers (…
ersin-erdal May 27, 2026
8c8b89c
[Discover][Metrics] Preserve current page when a discover tab is dupl…
lucaslopezf May 27, 2026
6f0665f
[Home] Hide inaccessible Stack Management link (#271528)
kapral18 May 27, 2026
195b446
skip failing test suite (#263863)
kibanamachine May 27, 2026
c66e90b
[ci] Disable composite uploads (#271521)
jbudz May 27, 2026
3a67f34
[Alerting v2] Fix YAML blur handler + splitQuery round-trip tests (#2…
yiannisnikolopoulos May 27, 2026
f6e1b30
AGENTS.md: prefer scripts/check for local verification (#271591)
tylersmalley May 27, 2026
8a5c9b1
[kbn-evals] Skip snapshot repo verification for read-only ops, remove…
viduni94 May 27, 2026
b5fb9b7
[* as Code] Remove CM from visualize library and refactor add from li…
Heenawter May 27, 2026
a7bf699
[ResponseOps] Synchronously invalidate rule API keys on DELETE via `i…
ersin-erdal May 27, 2026
71aa0e9
[GH Workflow] Add Node Version (#271578)
hannahbrooks May 27, 2026
93891ba
[CI] Remove shallow checkout for rspack verify step (#271331)
tylersmalley May 28, 2026
d61d412
[Scout] Update test config manifests (#271606)
kibanamachine May 28, 2026
f08e27b
[ES|QL] Dot-prefixed sources validation (#271263)
momovdg May 28, 2026
f244d7f
[ResponseOps][Alerting V2] Response descriptions are generic and non-…
georgianaonoleata1904 May 28, 2026
c82d62e
[kbn-ui] Move skill to proper folder (#270542)
sabarasaba May 28, 2026
89a968a
[Security solution] Remove stale GenAI ownership (#271593)
stephmilovic May 28, 2026
165dbd2
[Fleet] Fix namespace index templates labels (#271465)
jillguyonnet May 28, 2026
b707ccf
[One Workflow] managed workflows - restrict mutations (#270896)
rosomri May 28, 2026
a33cb20
[Synthetics] All monitors errors page !! (#211205)
shahzad31 May 28, 2026
bb1c732
(fix) OBS BI - exclude rollup indices from otel telemetry collection …
marcia-t May 28, 2026
028335f
[Security Solution] Enable @kbn/change-history feature flag (#270091)
maximpn May 28, 2026
92aed99
[Entity Store] Fix before-all timeout in CSV upload FTR suite and uns…
maxcold May 28, 2026
366c550
remove redundant top-level after hooks from FTR suites (#271312)
dmlemeshko May 28, 2026
57aa8c1
Bump fast-xml-builder to 1.2.0 (#270595)
jeramysoucy May 28, 2026
3214a8e
Upgrade @opentelemetry/host-metrics 0.38.2 → 0.38.3 (#271613)
jeramysoucy May 28, 2026
404f1fd
migrate som / ml / monitoring ui tests to scout (#271394)
dmlemeshko May 28, 2026
540333d
[One Workflow] Serial polling for execution UI to prevent overlapping…
skynetigor May 28, 2026
acfb497
[RnA] [Severity] Dispatcher: include severity in notification policy …
miguelmartin-elastic May 28, 2026
915ccd1
[Custom Threshold rule] Fix viewInAppUrl to use rule's lookback windo…
ana-davydova May 28, 2026
b1f8ae8
[ResponseOps] Lazy spec connectors - registry cleanup (#271200)
jcger May 28, 2026
a821567
[Security] Fix Overview Host integration test fixture for newer ES co…
MadameSheema May 28, 2026
48a6b68
Fix console tests (#255313)
SoniaSanzV May 28, 2026
275c723
[Core][Logging] Include Node roots in OTEL gRPC TLS CAs (#271622)
afharo May 28, 2026
fc53c21
[docs] Add security advisory notice to 9.3.5 and 9.4.2 release notes …
florent-leborgne May 28, 2026
51440a4
[Entity Store] Add telemetry client for Entity Maintainers (#269637)
kubasobon May 28, 2026
edc19a0
[saved-objects] Remove permanently dead code from v2 migration algori…
gsoldevila May 28, 2026
5d8dbfe
[Alerting v2] Consolidate the feature privileges into one place (#270…
cnasikas May 28, 2026
d871f7f
[Traces in Discover] Monitor silent fetches in Traces overview (#270…
tfcmarques May 28, 2026
788704d
[SharedUX] Adjust side nav spacing (#271661)
angeles-mb May 28, 2026
ddef4b8
[Flaky Test Fixer] Use `flaky-test-investigator` skill in Failed Test…
csr May 28, 2026
01f1459
[core/http] Fix FIPS-mode cookie sealing (Deriving bits failed) (#268…
rgodfrey-elastic May 28, 2026
99865fd
[Streams] Add DLM phases flyout (#271395)
damian-polewski May 28, 2026
3c3bbc2
Remove js-sha256 dependency (#271339)
legrego May 28, 2026
667d815
Decentralize synthtrace scenarios: colocate with plugin code (#270157)
flash1293 May 28, 2026
e04bc5b
[Shared UX][DateRangePicker] Enhance selectable text parts on button …
acstll May 28, 2026
f18d7a0
feat(kibana-data-discovery, security-threat-hunting): replace title p…
weronikaolejniczak May 28, 2026
b0d9aa6
[AWS Onboarding] Add Connect Account step UI (#271195)
juliaElastic May 28, 2026
2307d98
[ES|QL] Integrate KQL search in Lookup Index Editor (#271284)
sddonne May 28, 2026
aa19a6a
[Scout] Create "Migrate tests to Scout" guide (#271611)
csr May 28, 2026
0a161f7
[Public Attack APIs] Add feature flag, route constants, and stub atta…
agusruidiazgd May 28, 2026
7b829c5
[SLO] Clean up orphaned transforms and stop transforms for disabled S…
shahzad31 May 28, 2026
a4a4b19
[One Workflow][ES|QL] Integrate es|ql autocomplete feature to elastic…
dej611 May 28, 2026
25d03a3
[Entity Analytics] Passing internalEsClient to prebuilt watchlist set…
ymao1 May 28, 2026
d866b57
Add aria-expanded to Agent Builder sidebar toggle button (#271262)
Copilot May 28, 2026
80423f4
Extract Chrome app header infra fixes (#271670)
Dosant May 28, 2026
164e435
[Fleet] Consolidate data stream operations concurrency (#271530)
jillguyonnet May 28, 2026
9209737
feat(security-detection-rule-management): replace title props and wra…
weronikaolejniczak May 28, 2026
676b34d
feat(contextual-security-apps, fleet): replace title props and wrap E…
weronikaolejniczak May 28, 2026
f3e9265
Add accessible names to SLO create page select elements (#270990)
Copilot May 28, 2026
48e4cee
[Streams][Streamlang] Add URI parts processor (#265608)
diogolima-elastic May 28, 2026
05e1673
feat(obs-onboarding-team): replace title props and wrap EuiButtonIcon…
weronikaolejniczak May 28, 2026
070e325
Add aria-label to Tags combo box in agent builder edit details flyout…
Copilot May 28, 2026
b1e9338
[Entity Store] Improve WHERE clause (#271664)
romulets May 28, 2026
3d53c00
[CODEOWNERS] Move Fleet cloud_connector ownership from contextual-sec…
Omolola-Akinleye May 28, 2026
d42e1a6
Update dependency chromedriver to v148.0.3 (main) (#271569)
elastic-renovate-prod[bot] May 28, 2026
ccb4ab1
Lens annotation fix (#269824)
alvarezmelissa87 May 28, 2026
bcff2a0
Better APM infrastructure tab empty state (#271090)
sbelastic May 28, 2026
1929550
[One Workflow] Add back navigation on workflow load error screen (#27…
skynetigor May 28, 2026
29d7aba
Security quality gate unmapped FTR tests - Periodic Pipeline (#260791)
k-g-elastic May 28, 2026
9babecc
migrate home app ui tests to scout (#271356)
dmlemeshko May 28, 2026
56be1a6
[Alerting v2] Use compressed form inputs in rule builder (#271734)
benakansara May 28, 2026
d510e69
[Metrics][APM] Context aware open in discover label (#271343)
justinkambic May 28, 2026
2ae9381
[Osquery] rrule scheduling API routes + Fleet fan-out (flag off) (#27…
tomsonpl May 28, 2026
ecde1c6
[Agent Builder] Add AttachmentGroup and group_id to the attachment sy…
jonwalstedt May 28, 2026
257ba92
[graph] migrate ftr tests to scout (#270506)
dmlemeshko May 28, 2026
3256ac3
[ML][Discover] Add change point view in Discover (#265331)
alvarezmelissa87 May 28, 2026
962b874
[Metrics][Discover] Rename datastream to `indexName` (#270784)
justinkambic May 28, 2026
1d27198
[One Workflow](fix): `scheduleWorkflowTriggers` prevent scheduling if…
VladimirFilonov May 28, 2026
dbf06bc
Update A11Y skill with new EUI tooltip accessibility rules (#271423)
alexwizp May 28, 2026
d8a552b
[UII] Use managed OTLP endpoint in Add collector flyout (#270324)
jen-huang May 28, 2026
01d03ff
[Fleet] Fix missing reserved index pattern guard in streaming install…
Supplementing May 28, 2026
0365022
[Dashboards in Chat] Add skill selection eval suite (#269819)
mbondyra May 28, 2026
22d1ef5
fix(a11y): add aria-label/aria-labelledby to EuiPopover/EuiModal comp…
alexwizp May 28, 2026
5dc4ce7
[Alerting v2] Simplify rule builder state management (#271678)
benakansara May 28, 2026
1edb08a
[ftr] replace UI login with cookie session (#271520)
dmlemeshko May 28, 2026
89908de
[Lens] XY annotation groups should have a non-empty label (#271536)
nickofthyme May 28, 2026
5812a56
[Lens] Split bloated Lens FTR files: lens/group6/metric.ts (#271392)
maryam-saeidi May 29, 2026
4618f2d
[Canvas] Fix stale nextPage closure in autoplay timer (fix #268125) (…
adrianchen-es May 29, 2026
af43375
[Scout] Update test config manifests (#271828)
kibanamachine May 29, 2026
d1e1bee
Add @kbn/data-views-as-code plugin (#271523)
AlexGPlay May 29, 2026
c30f79e
[Discover] Pre-migration to Scout cleanup: deduplicate within-plugin …
jughosta May 29, 2026
29d70f4
[js-yaml to yaml migration] @elastic/obs-onboarding-team (#252349)
jeramysoucy May 29, 2026
174205d
[SharedUX][Chrome Next] Add Spaces context switcher to global header …
angeles-mb May 29, 2026
369b941
[ES|QL] Shorter placeholder for inline editor or small space (#271691)
stratoula May 29, 2026
710fe76
[ML] Dashboards as code: Registers Schema for the `Log Rate Analysis`…
rbrtj May 29, 2026
0eec97b
feat(contextual-security-apps, security-entity-analytics): replace ti…
weronikaolejniczak May 29, 2026
7cdb551
feat(appex-sharedux, eui-team): replace title props and wrap EuiButto…
weronikaolejniczak May 29, 2026
709a818
[Osquery] Default to CSV in the Export Results modal (#271450)
tomsonpl May 29, 2026
1b0b811
[Sig Events] Add Discovery navigation to global search (#271690)
mykolaharmash May 29, 2026
d3ea7dc
skip failing test suite (#259686)
kibanamachine May 29, 2026
7cccbbd
[i18n] Stream translation files by writing locale into the file itsel…
TinaHeiligers May 29, 2026
a014fcb
[Profiling] Fix profiling API tests when running on test lanes (again…
AlejandroFrndz May 29, 2026
56c3b57
[Entity Analytics][Leads generation] Add Scout API tests for lead gen…
abhishekbhatia1710 May 29, 2026
09a72d5
feat(appex-sharedux): replace title props and wrap EuiButtonIcon with…
weronikaolejniczak May 29, 2026
cd6fc25
fix(apm): make service map environment control single-select (#271754)
jennypavlova May 29, 2026
59928a1
[Discover] Pre-migration cleanup: additional within-plugin dedupe opp…
jughosta May 29, 2026
617977d
feat(kibana-esql): replace title props and wrap EuiButtonIcon with Eu…
weronikaolejniczak May 29, 2026
8fa48d7
Add AI triage workflow for issues with "needs-team" label (#255151)
jughosta May 29, 2026
f26fbce
[Security Solution][Endpoint] Fix runscript API route in API docs (#2…
paul-tavares May 29, 2026
6fa0cd7
skip failing test suite (#271826)
kibanamachine May 29, 2026
9cfc810
migrate kibana management ftr tests to scout (#270902)
dmlemeshko May 29, 2026
cbcc152
[ES|QL][Discover] Highlight results when using ES|QL highlight (#271519)
sddonne May 29, 2026
5a19475
[SigEvents] Migrate onboarding from task manager to workflow engine (…
cesco-f May 29, 2026
5dc4cfd
feat(kibana-data-discovery): replace title props and wrap EuiButtonIc…
weronikaolejniczak May 29, 2026
7667ec7
[Agent Builder] Updated reasoning panel/inline events (#271849)
chrisbmar May 29, 2026
82747ad
Fix Service Map no longer inherits dynamic dashboard filters (#271765)
sbelastic May 29, 2026
7178550
[Fleet] Fix namespace index templates labels (followup) (#271704)
jillguyonnet May 29, 2026
e4dfefd
[CSP] Fix agentless GCP CIS integration test - handle Cloud Connector…
animehart May 29, 2026
3bd55be
[Entity Analytics][Watchlists] Show warning when Entity Store inactiv…
CAWilson94 May 29, 2026
d1009d4
[kbn-ui] Move chrome-layout-constants and utils into kbnui (#271625)
sabarasaba May 29, 2026
1a52848
Remove eui-provider-dev-warning shared_ux plugin (#271720)
paulinashakirova May 29, 2026
08d08db
[ResponseOps][Alerting V2] No concurrency control on rule updates (#2…
georgianaonoleata1904 May 29, 2026
1e2c676
[main] Sync bundled packages with Package Storage (#271884)
elastic-vault-github-plugin-prod[bot] May 29, 2026
8010768
Revert "Add AI triage workflow for issues with "needs-team" label" (#…
jughosta May 29, 2026
a226024
[Obs AI] Fix observability index discovery for Streams data (#269633)
arturoliduena May 29, 2026
845efe2
kbn-evals Vault: dev support (#271633)
arturoliduena May 29, 2026
e1938c5
[Security Solution] Update prebuilt rule installation and rule upgrad…
alainnahalliday May 29, 2026
894ea3f
[SecuritySolution][Navigation] Add add external links to security sol…
ashokaditya May 29, 2026
33b3072
[Security Solution] Fix flaky Cypress tests that use `preventPrebuilt…
nikitaindik May 29, 2026
988ff0f
[Alerting v2] Add recovery conditions to threshold rule builder (#271…
benakansara May 29, 2026
0481f89
[Discover] Update export tab app menu label (#271781)
davismcphee May 29, 2026
5a3cc3e
:sparkles: Revisit logic to be simpler
dej611 May 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion .agents/skills/accessibility/references/components/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ Open the guide that matches the component(s) you are writing or refactoring. Rea
| `interactive_components.md` | Names for interactive controls | `EuiBetaBadge`, `EuiButtonIcon`, `EuiComboBox`, `EuiSelect`, `EuiSuperSelect`, `EuiPagination`, `EuiTreeView`, `EuiBreadcrumbs` |
| `overlays.md` | Modals, flyouts, popovers | `EuiModal`, `EuiFlyout`, `EuiFlyoutResizable`, `EuiConfirmModal`, `EuiPopover` |
| `radio_groups.md` | Radio groups (`name` grouping) | `EuiRadio`, `EuiRadioGroup` |
| `tooltip_icon.md` | Tooltip on icon button (no duplicate SR text) | `EuiToolTip`, `EuiButtonIcon` |
| `tooltip_content.md` | No interactive elements in tooltip `content` / `title` | `EuiToolTip`, `EuiIconTip` |
| `tooltip_icon.md` | Tooltip on icon button (wrap + no duplicate SR text, no native `title`) | `EuiToolTip`, `EuiButtonIcon` |
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# EUI tooltip content: no interactive elements

**Applies to:** `EuiToolTip`, `EuiIconTip` — the `content` and `title` props

Tooltip `content` and `title` render inside a portal with `role="tooltip"`. The overlay only appears while the trigger is hovered or focused and is dismissed on blur, so any focusable element placed inside it is unreachable by keyboard and assistive-technology users. Use **`EuiPopover`** when the content needs to be interactive.

**Related guides:** **`overlays.md`** (`EuiPopover` for interactive content) · **`tooltip_icon.md`** (wrapping `EuiButtonIcon` with `EuiToolTip`) · **`icons_and_tooltips.md`** (`EuiIconTip` vs `EuiToolTip` + `EuiIcon`).

## Canonical usage

- `EuiToolTip` / `EuiIconTip` `content` and `title` may contain:
- **Plain strings** (preferred — easy to localize and read).
- **Non-interactive JSX** — text nodes, `<span>`, `<p>`, `EuiText`, `EuiIcon`, and the display-only badges/cards (`EuiBadge`, `EuiBetaBadge`, `EuiCard`) used **without** `onClick` / `href`.
- They must **not** contain anything focusable:
- Native `<a>`, `<button>`, `<input>`, `<select>`, `<textarea>`.
- Interactive EUI components — `EuiLink`, `EuiButton`, `EuiButtonEmpty`, `EuiButtonIcon`, `EuiFieldText`, `EuiFieldNumber`, `EuiFieldSearch`, `EuiFieldPassword`, `EuiTextArea`, `EuiSelect`, `EuiSuperSelect`, `EuiComboBox`, `EuiSelectable`, `EuiSwitch`, `EuiCheckbox`, `EuiRadio`, `EuiRange`, `EuiDualRange`, `EuiColorPicker`, `EuiDatePicker`, `EuiSuperDatePicker`, `EuiFilterButton`, `EuiPagination`, `EuiTab`, `EuiTreeView`, `EuiContextMenuItem`, `EuiKeyPadMenuItem`, `EuiListGroupItem`, `EuiBreadcrumbs`, `EuiBasicTable`, `EuiInMemoryTable`, `EuiCheckableCard`, …
- The rule searches recursively — interactive elements nested inside fragments, conditional renders (`cond && …`, `cond ? … : …`), or wrapper elements are reported too.
- When users need to interact with the content (click a link, fill a field), switch the wrapper to **`EuiPopover`** triggered by an explicit click — never by hover.

### Manual-review cases (rule is silent)

- **Variable content** — `content={tooltipContent}` / `title={titleNode}` is intentionally skipped because it cannot be statically analyzed. Trace the variable and verify it never holds focusable JSX.
- **Conditionally-interactive components** — `EuiBadge`, `EuiBetaBadge`, `EuiCard` are excluded from the rule because they render as a plain element without `onClick` / `href`. As soon as you add `onClick` or `href`, they become focusable and the same restriction applies — move the interaction out of the tooltip.

## Examples

```tsx
<EuiToolTip content="Just text">
<EuiButton>Hover me</EuiButton>
</EuiToolTip>

<EuiToolTip content={<EuiText><p>Description</p></EuiText>}>
<EuiButton>Hover me</EuiButton>
</EuiToolTip>

<EuiIconTip content="Informational text" type="info" />

// Display-only badge is fine
<EuiToolTip content={<EuiBadge>v2.0</EuiBadge>}>
<EuiButton>Hover me</EuiButton>
</EuiToolTip>
```

## Common mistakes

```tsx
// WRONG — link inside tooltip is not keyboard-reachable
<EuiToolTip content={<EuiLink href="/docs">Learn more</EuiLink>}>
<EuiButton>Hover me</EuiButton>
</EuiToolTip>

// RIGHT — switch to EuiPopover so the link participates in the focus order
const [isOpen, setIsOpen] = useState(false);
const togglePopover = () => setIsOpen((open) => !open);
const closePopover = () => setIsOpen(false);

<EuiPopover
button={<EuiButton onClick={togglePopover}>More info</EuiButton>}
isOpen={isOpen}
closePopover={closePopover}
>
<EuiLink href="/docs">Learn more</EuiLink>
</EuiPopover>

// WRONG — button inside `EuiIconTip` content
<EuiIconTip content={<EuiButton>Click</EuiButton>} type="info" />

// RIGHT — keep the icon tip purely informational
<EuiIconTip content="Informational text" type="info" />

// WRONG — interactive element inside `title` is also reported
<EuiToolTip title={<EuiLink href="#">Learn more</EuiLink>} content="Info">
<EuiButton>Hover</EuiButton>
</EuiToolTip>

// WRONG — interactive child wrapped in a fragment is reported recursively
<EuiToolTip content={<><span>Text</span><EuiLink href="#">Link</EuiLink></>}>
<EuiButton>Hover</EuiButton>
</EuiToolTip>

// WRONG — interactive child behind `cond && …` is reported
<EuiToolTip content={<span>{cond && <EuiLink href="#">Link</EuiLink>}</span>}>
<EuiButton>Hover</EuiButton>
</EuiToolTip>

// WRONG — interactive child inside a ternary is reported
<EuiToolTip content={cond ? <EuiLink href="#">Link</EuiLink> : null}>
<EuiButton>Hover</EuiButton>
</EuiToolTip>

// WRONG — conditionally-interactive badge with onClick becomes focusable
<EuiToolTip content={<EuiBadge onClick={onClick}>Open</EuiBadge>}>
<EuiButton>Hover</EuiButton>
</EuiToolTip>
```
53 changes: 31 additions & 22 deletions .agents/skills/accessibility/references/components/tooltip_icon.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,58 @@

**Applies to:** `EuiToolTip`, `EuiButtonIcon`

When **`EuiToolTip`** wraps **`EuiButtonIcon`** and the tooltip **`content`** matches the button's **`aria-label`**, assistive technology can announce the same text twice. Use **`disableScreenReaderOutput`** so the tooltip stays available to sighted users while screen readers hear the name once.
Every **`EuiButtonIcon`** needs two things:

**Related guides:** **`focus_and_keyboard.md`** (tooltip anchors / `tabIndex`) · **`icons_and_tooltips.md`** (`EuiIconTip` vs `EuiToolTip` + `EuiIcon`).
1. **A visible tooltip for sighted users** — wrap the button with **`EuiToolTip`**. Do **not** use the native **`title`** prop on `EuiButtonIcon`; browser tooltips are unstyled, have no delay control, and are not reliably announced by screen readers across browser / AT combinations.
2. **An accessible name for assistive technology** — keep **`aria-label`** on the button.

## Canonical usage
When the tooltip **`content`** and the button's **`aria-label`** match (same string, same variable, or same `i18n` call), also set **`disableScreenReaderOutput`** on `EuiToolTip` so screen readers announce the name once instead of twice.

- **`content`** equals **`aria-label`** (same string or same variable / same `i18n` call) → set **`disableScreenReaderOutput`** on **`EuiToolTip`**.
- **`content`** differs from **`aria-label`** → no extra prop; both will be announced as intended.
- Child is not **`EuiButtonIcon`** → this pattern doesn't apply; check the related guides above.
**Related guides:** **`focus_and_keyboard.md`** (tooltip anchors / `tabIndex`) · **`icons_and_tooltips.md`** (`EuiIconTip` vs `EuiToolTip` + `EuiIcon`) · **`tooltip_content.md`** (no interactive elements inside tooltip `content` / `title`).

Prefer a single **`i18n.translate`** call (same id + `defaultMessage`) for both **`content`** and **`aria-label`** so the strings can't drift apart.
## Canonical usage

For `{...tooltipProps}` spreads, merge **`disableScreenReaderOutput`** at the callsite or in the spread source.
1. Wrap every `EuiButtonIcon` with `EuiToolTip`. Remove any `title` prop from the button.
2. Pass the same localized string to `EuiToolTip` `content` and the button's `aria-label`. Prefer a single **`i18n.translate`** call (same id + `defaultMessage`) referenced from both places so the strings cannot drift apart.
3. When `content` and `aria-label` match → add **`disableScreenReaderOutput`** on `EuiToolTip`.
4. When `content` and `aria-label` intentionally differ (the tooltip elaborates beyond the name) → do **not** add `disableScreenReaderOutput`; both will be announced as intended.

## Examples

```tsx
<EuiToolTip
content={i18n.translate('filter.add', { defaultMessage: 'Add filter' })}
disableScreenReaderOutput
>
const editLabel = i18n.translate('myFeature.editItem', {
defaultMessage: 'Edit item',
});

<EuiToolTip content={editLabel} disableScreenReaderOutput>
<EuiButtonIcon
iconType="plusInCircle"
aria-label={i18n.translate('filter.add', { defaultMessage: 'Add filter' })}
onClick={onAdd}
iconType="pencil"
aria-label={editLabel}
onClick={onEdit}
/>
</EuiToolTip>
```

## Common mistakes

```tsx
// WRONG — screen reader announces "Add filter" twice
<EuiToolTip content={label}>
<EuiButtonIcon iconType="plusInCircle" aria-label={label} onClick={onAdd} />
// WRONG — no visible tooltip for sighted users
<EuiButtonIcon iconType="trash" aria-label="Delete" onClick={onDelete} />

// WRONG — native `title` is not reliably announced by screen readers and has no consistent visual styling
<EuiButtonIcon title="Delete" aria-label="Delete" iconType="trash" onClick={onDelete} />

// WRONG — tooltip and `aria-label` without `disableScreenReaderOutput` will lead to SR announcement duplication
<EuiToolTip content="Delete">
<EuiButtonIcon iconType="trash" aria-label="Delete" onClick={onDelete} />
</EuiToolTip>

// RIGHT
<EuiToolTip content={label} disableScreenReaderOutput>
<EuiButtonIcon iconType="plusInCircle" aria-label={label} onClick={onAdd} />
// RIGHT — wrap, keep `aria-label`, and add `disableScreenReaderOutput` when `content` matches
<EuiToolTip content="Delete" disableScreenReaderOutput>
<EuiButtonIcon iconType="trash" aria-label="Delete" onClick={onDelete} />
</EuiToolTip>

// WRONG — different ids, strings may drift apart
// WRONG — different i18n ids may drift apart
content={i18n.translate('a.tooltip', { defaultMessage: 'Add' })}
aria-label={i18n.translate('a.button', { defaultMessage: 'Add' })}

Expand Down
2 changes: 2 additions & 0 deletions .agents/skills/accessibility/references/eslint.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,6 @@ Secondary path: when starting from a rule id, jump to the canonical **component
| `@elastic/eui/require-aria-label-for-modals` | [`components/overlays.md`](components/overlays.md) | `{...props}` hides wiring; no visible title without UX change — escalate. |
| `@elastic/eui/require-table-caption` | [`components/data_tables.md`](components/data_tables.md) | `tableCaption` only via `{...tableProps}` — fix at source; no duplicate conflicting captions. |
| `@elastic/eui/sr-output-disabled-tooltip` | [`components/tooltip_icon.md`](components/tooltip_icon.md) | `EuiToolTip` props from spread; child not `EuiButtonIcon`. |
| `@elastic/eui/tooltip-button-icon-wrap` | [`components/tooltip_icon.md`](components/tooltip_icon.md) | `{...props}` without an explicit `title` is silently skipped — verify the spread does not omit a tooltip. No `aria-label` on the button → autofix can't run; supply both `aria-label` and `EuiToolTip` `content`. |
| `@elastic/eui/tooltip-focusable-anchor` | [`components/focus_and_keyboard.md`](components/focus_and_keyboard.md) | `{...anchorProps}` or unknown custom anchor. |
| `@elastic/eui/tooltip-no-interactive-content` | [`components/tooltip_content.md`](components/tooltip_content.md) | Variable content (`content={var}` / `title={var}`) is silently skipped — trace and verify. `EuiBadge` / `EuiBetaBadge` / `EuiCard` with `onClick` / `href` become focusable and need migration to `EuiPopover`. |
Loading