Sync EUI icon library with Jan–May 2026 renames and additions#3378
Conversation
EUI renamed virtually all icons from camelCase to snake_case in Jan 2026 (#9279) and has continued adding new icons since. This brings docs-builder fully up to date. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughThis PR adds IconAliases and TokenAliases dictionaries to EuiSvgIcons and updates TryGetIcon, TryGetToken, GetIcon(string), and GetIcon(string, string? cssClass) to resolve names through those aliases before retrieving or returning SVG content (with optional CSS class injection). The docs "Available Icons" table is updated to use canonical snake_case icon identifiers. Sequence Diagram(s)sequenceDiagram
participant Caller
participant EuiSvgIcons
participant IconAliases
participant SvgDictionary
Caller->>EuiSvgIcons: TryGetIcon(name) / GetIcon(name[, cssClass])
EuiSvgIcons->>IconAliases: Resolve(name) -> canonicalName?
IconAliases-->>EuiSvgIcons: canonicalName (or original)
EuiSvgIcons->>SvgDictionary: Lookup(canonicalName)
SvgDictionary-->>EuiSvgIcons: SVG content (string)
EuiSvgIcons->>EuiSvgIcons: If cssClass provided -> inject class into SVG
EuiSvgIcons-->>Caller: Return SVG string
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches✨ Simplify code
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
docs/syntax/icons.md (1)
665-665:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winUsage examples should demonstrate canonical icon names.
The examples use the legacy alias
checkCircleinstead of the canonicalcheck_circle. Update examples to use canonical snake_case names to guide users toward current naming conventions.📝 Proposed fix
| Status | Description | |:--------------:|:------------| -| {icon}`checkCircle` | Success | +| {icon}`check_circle` | Success | | {icon}`warning` | Warning | | {icon}`error` | Error |And in the Markdown block:
| Status | Description | |:--------------:|:------------| -| {icon}`checkCircle` | Success | +| {icon}`check_circle` | Success | | {icon}`warning` | Warning | | {icon}`error` | Error |Also applies to: 675-675
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/syntax/icons.md` at line 665, Update the example icon names to use canonical snake_case forms: replace the legacy alias checkCircle with check_circle in the icons documentation (the table row containing "{icon}`checkCircle`" and any other occurrences such as the one noted at line 675), ensuring all usage examples show the canonical names so users are guided to the current naming convention.src/Elastic.Documentation.Svg/EuiSvgIcons.cs (1)
257-258:⚠️ Potential issue | 🔴 Critical | ⚡ Quick winGetToken does not resolve token aliases.
Every other lookup method (TryGetIcon, TryGetToken, GetIcon overloads) resolves aliases, but GetToken does not. This breaks the transparent alias resolution contract and creates an inconsistent API.
🔧 Proposed fix
public static string? GetToken(string name) => - Tokens.TryGetValue(name, out var svg) ? svg : null; +{ + if (TokenAliases.TryGetValue(name, out var canonical)) + name = canonical; + return Tokens.TryGetValue(name, out var svg) ? svg : null; +}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs` around lines 257 - 258, GetToken currently returns Tokens.TryGetValue(name) directly and therefore doesn't resolve aliases; update GetToken to mirror the alias-resolution behavior used by TryGetIcon/TryGetToken/GetIcon overloads: if Tokens.TryGetValue(name) fails, check the token alias mapping (e.g., TokenAliases or similar alias dictionary used elsewhere), follow the alias target(s) until you arrive at a real token name (guarding against cycles or excessive depth), then return the looked-up SVG from Tokens, or null if none found. Ensure you reference GetToken, Tokens, and the existing alias dictionary/methods used by TryGetIcon/TryGetToken so behavior is consistent across lookups.
🧹 Nitpick comments (1)
docs/syntax/icons.md (1)
268-268: 💤 Low valueIcon name uses camelCase inconsistent with surrounding snake_case names.
indexTemporarystands out as the only camelCase icon name in a table of snake_case names. If this is the actual canonical name on disk, consider renaming it toindex_temporaryfor consistency with the EUI snake_case convention.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/syntax/icons.md` at line 268, The icon name in the docs uses camelCase (`indexTemporary`) which is inconsistent with the surrounding snake_case convention; rename the symbol to `index_temporary` in the docs table (replace `{icon}`indexTemporary`` with `{icon}`index_temporary``) and, if the actual asset on disk is named `indexTemporary`, rename the asset and any references (imports, CSS classes, examples) to `index_temporary` consistently across the repo (search for `indexTemporary` and update all occurrences, including references in functions/components that use the icon).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@docs/syntax/icons.md`:
- Line 665: Update the example icon names to use canonical snake_case forms:
replace the legacy alias checkCircle with check_circle in the icons
documentation (the table row containing "{icon}`checkCircle`" and any other
occurrences such as the one noted at line 675), ensuring all usage examples show
the canonical names so users are guided to the current naming convention.
In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs`:
- Around line 257-258: GetToken currently returns Tokens.TryGetValue(name)
directly and therefore doesn't resolve aliases; update GetToken to mirror the
alias-resolution behavior used by TryGetIcon/TryGetToken/GetIcon overloads: if
Tokens.TryGetValue(name) fails, check the token alias mapping (e.g.,
TokenAliases or similar alias dictionary used elsewhere), follow the alias
target(s) until you arrive at a real token name (guarding against cycles or
excessive depth), then return the looked-up SVG from Tokens, or null if none
found. Ensure you reference GetToken, Tokens, and the existing alias
dictionary/methods used by TryGetIcon/TryGetToken so behavior is consistent
across lookups.
---
Nitpick comments:
In `@docs/syntax/icons.md`:
- Line 268: The icon name in the docs uses camelCase (`indexTemporary`) which is
inconsistent with the surrounding snake_case convention; rename the symbol to
`index_temporary` in the docs table (replace `{icon}`indexTemporary`` with
`{icon}`index_temporary``) and, if the actual asset on disk is named
`indexTemporary`, rename the asset and any references (imports, CSS classes,
examples) to `index_temporary` consistently across the repo (search for
`indexTemporary` and update all occurrences, including references in
functions/components that use the icon).
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 9466d9af-4f4c-4900-9fc1-610b31f20ab8
⛔ Files ignored due to path filters (298)
src/Elastic.Documentation.Svg/svgs/align_bottom.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/align_bottom_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/align_bottom_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/align_center_horizontal.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/align_center_vertical.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/align_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/align_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/align_top.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/align_top_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/align_top_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/analyze_event.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/archive.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/arrow_down.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/arrow_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/arrow_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/axis_x.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/axis_y_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/axis_y_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/bell_slash.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/bolt.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/branch_user.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/briefcase.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/bulb.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/bullseye.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_anomaly.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_area.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_area_stack.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_bar_horizontal.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_bar_horizontal_stack.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_bar_vertical.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_bar_vertical_stack.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_change_point.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_gauge.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_heatmap.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_line.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_metric.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_pie.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_tag_cloud.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_threshold.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chart_waterfall.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/checkInCircleFilled.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/check_circle.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/check_circle_fill.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chevron_double_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chevron_double_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chevron_limit_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chevron_limit_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chevron_single_down.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chevron_single_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chevron_single_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/chevron_single_up.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/clickLeft.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/clickRight.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/click_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/click_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/clock_control.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/clock_counter.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/cloud.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/cloud_drizzle.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/cloud_stormy.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/cloud_sunny.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/command_line.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/compare.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/continuity_above.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/continuity_above_below.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/continuity_below.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/continuity_within.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/contrastHigh.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/contrast_fill.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/cross_circle.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/crosshair.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/dashed_circle.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/display.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/distribute_horizontal.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/distribute_vertical.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/document_edit.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/documents.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/dot_in_circle.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/doubleArrowLeft.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/drag.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/drag_horizontal.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/drag_vertical.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_distribute_horizontal.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_distribute_vertical.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_item_align_bottom.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_item_align_center.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_item_align_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_item_align_middle.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_item_align_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_item_align_top.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_position_bottom_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_position_bottom_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_position_top_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/editor_position_top_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/ellipsis.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/errorFilled.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/error_fill.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/esql_vis.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/expandMini.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/external.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/eye_slash.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/filter_exclude.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/filter_ignore.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/filter_in_circle.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/filter_include.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/folder_close.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/folder_closed.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/folder_open.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/frame_next.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/frame_previous.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/fullScreenExit.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/full_screen_exit.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/grab_omnidirectional.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/hourglass.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/if.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/index_close.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/index_edit.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/index_open.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/index_runtime.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/index_settings.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/inputOutput.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/input_output.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/kubernetesPod.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/kubernetes_node.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/kubernetes_pod.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/lineDashed.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/lineDotted.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/lineSolid.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/line_break.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/line_break_slash.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/line_dash.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/line_dot.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/line_solid.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/link_slash.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/list_bullet.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/list_check.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/list_number.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/lock_open.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/log_out.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/magnify.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/magnify_exclamation.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/magnify_minus.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/magnify_plus.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/magnify_with_exclamation.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/magnify_with_minus.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/magnify_with_plus.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/mail.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/map.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/mapping.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/maximize.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/megaphone.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/menuLeft.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/menuRight.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/menu_down.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/menu_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/menu_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/menu_up.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/minus_circle.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/minus_in_circle_filled.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/minus_in_square.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/minus_square.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/money.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/page_select.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/pagesSelect.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/pages_select.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/paint_bucket.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/pattern.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/pin_fill.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/pipeBreaks.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/pipeNoBreaks.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/play_filled.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/plus_circle.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/plus_in_square.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/plus_square.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/popper.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/presentation.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/processor.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/product_agent.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/product_cloud_infra.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/product_dashboard.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/product_discover.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/product_ml.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/product_streams_classic.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/product_streams_wired.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/query.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/query_field.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/query_operand.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/query_selector.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/query_value.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/queue.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/radar.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/readOnly.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/read_only.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/redo.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/refresh_time.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/return.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/rocket.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/scissors.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/section.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/security_signal.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/security_signal_detected.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/security_signal_resolved.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/send.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/server.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/session_viewer.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/significant_events.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/sortAscending.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/sortDescending.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/sort_ascending.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/sort_descending.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/sort_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/sort_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/star.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/star_fill.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/star_fill_space.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/star_filled.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/star_minus_fill.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/star_plus_empty.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/star_plus_fill.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/stop_fill.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/table.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/table_density_high.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/table_density_low.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/table_info.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/table_of_contents.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/table_time.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/text.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/text_align_center.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/text_align_left.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/text_align_right.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/text_bold.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/text_heading.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/text_italic.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/text_strike.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/text_underline.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/thermometer.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/thumbDown.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/thumbUp.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/thumb_down.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/thumb_up.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/timeline.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/timelineWithArrow.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/timeline_with_arrow.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_alias.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_annotation.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_array.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_binary.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_boolean.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_class.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_completion_suggester.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_constant.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_date.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_dimension.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_element.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_enum.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_enum_member.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_event.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_exception.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_field.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_file.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_flattened.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_function.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_geo.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_histogram.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_interface.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_ip.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_join.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_key.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_keyword.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_method.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_metric_counter.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_metric_gauge.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_module.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_namespace.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_nested.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_null.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_number.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_object.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_operator.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_package.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_parameter.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_percolator.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_property.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_range.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_rank_feature.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_rank_features.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_repo.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_search_type.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_semantic_text.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_shape.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_string.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_struct.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_symbol.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_tag.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_text.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_token_count.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_variable.svgis excluded by!**/*.svgsrc/Elastic.Documentation.Svg/svgs/tokens/token_vector_dense.svgis excluded by!**/*.svg
📒 Files selected for processing (2)
docs/syntax/icons.mdsrc/Elastic.Documentation.Svg/EuiSvgIcons.cs
pipeBreaks was renamed to line_break (not pipe_breaks) and pipeNoBreaks to line_break_slash per EUI batch rename commit 1a42be0c. Co-authored-by: Cursor <cursoragent@cursor.com>
Switches the NL-enabled state description from a magnify+sparkles combo to the single magnify_sparkles glyph added in elastic/docs-builder#3378. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/Elastic.Documentation.Svg/EuiSvgIcons.cs (1)
257-258:⚠️ Potential issue | 🔴 Critical | ⚡ Quick winMissing token alias resolution in
GetToken.
GetTokendoesn't resolve token aliases before lookup, breaking backward compatibility for legacy camelCase token names. All other public methods (TryGetIcon,TryGetToken, bothGetIconoverloads) resolve aliases first.🔧 Proposed fix
public static string? GetToken(string name) => - Tokens.TryGetValue(name, out var svg) ? svg : null; +{ + if (TokenAliases.TryGetValue(name, out var canonical)) + name = canonical; + return Tokens.TryGetValue(name, out var svg) ? svg : null; +}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs` around lines 257 - 258, GetToken currently looks up the raw name in Tokens (Tokens.TryGetValue(name,...)) and therefore fails for legacy/camelCase token aliases; change it to resolve aliases the same way as TryGetToken/TryGetIcon/GetIcon by first normalizing the input (e.g. var resolvedName = ResolveAlias(name) or call the shared alias-resolution helper used by the other methods) and then call Tokens.TryGetValue(resolvedName, out var svg) ? svg : null so alias names return the correct token.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs`:
- Around line 257-258: GetToken currently looks up the raw name in Tokens
(Tokens.TryGetValue(name,...)) and therefore fails for legacy/camelCase token
aliases; change it to resolve aliases the same way as
TryGetToken/TryGetIcon/GetIcon by first normalizing the input (e.g. var
resolvedName = ResolveAlias(name) or call the shared alias-resolution helper
used by the other methods) and then call Tokens.TryGetValue(resolvedName, out
var svg) ? svg : null so alias names return the correct token.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 3a673012-d2c0-4e22-83d3-674df6874190
⛔ Files ignored due to path filters (1)
src/Elastic.Documentation.Svg/svgs/magnify_sparkles.svgis excluded by!**/*.svg
📒 Files selected for processing (1)
src/Elastic.Documentation.Svg/EuiSvgIcons.cs
|
@florent-leborgne Out of curiosity, how many icon roles are we using throughout the docs presently? We could consider converting them to the new format using AI and then remove the aliases later on. |
Yes that's probably something we should do regularly, but I think we still need the logic to handle transitions (release change in docs builder, then clean up, etc.) |
…ditor (#6350) (#6692) ## Summary -> Requires elastic/docs-builder#3378 to land first for the updated icons used in the NL section. Until then, CI will fail. This PR addresses #6350 with the following changes to `explore-analyze/query-filter/languages/esql-kibana.md`: - Renames the section that documents the ES|QL editor search bar from `### Free-text quick search` to `### Build queries with KQL or natural language`. The previous title relied on "Quick search", which is an internal Kibana code name and never appears in the product UI. - Restructures the section into two parallel H4 children (`#### Filter your data with KQL` and `#### Generate a query from natural language`), so KQL stays available on 9.3+ and the natural-language mode is documented as a new preview capability on 9.5+ and on serverless. - Preserves the existing `esql-kibana-quick-search` anchor on the parent section to avoid breaking external links (Kibana code, blog posts, other docs). The new NL subsection uses the consistent `esql-kibana-quick-search-nl` anchor. - Drops every `**Quick search**` bold pseudo-label from prose. The trigger button in `ESQLMenu` is icon-only with no visible text label; the only "Quick search" string was on a `QuickSearchAction` footer button that has been dead code since the Feb 2026 editor redesign (PR [#251223](elastic/kibana#251223)). - Uses `` {icon}`magnify` `` for the trigger (matches the plain icon state seen by users without natural-language access) and `` {icon}`magnify_sparkles` `` in the NL section to match the sparkles-magnify glyph shown in product when natural language is enabled. The glyph is a custom Kibana SVG (`MagnifySparklesIcon`); it has been added to docs-builder in elastic/docs-builder#3378 so it can be rendered via the `{icon}` directive. Key factual notes the issue body got wrong: - The feature gate was a **feature flag** (`esql.nlToEsqlEnabled`), not an advanced setting. Since the flag was never documented publicly, there is no "advanced setting instruction" to remove; the change is purely additive. - The license gate is **Enterprise**, not "non-basic" — verified at HEAD in `use_nl_to_esql_check.ts` (`license.hasAtLeast('enterprise')`). - The feature is still marked **Technical preview** in the UI (flask icon + `techPreviewTooltip` in `editor_visor/index.tsx`), so the docs use `preview` rather than `ga` for the new content. - Natural language mode also requires a configured LLM connector; the backend rejects the call with `No AI connector configured` otherwise (`nl_to_esql_route.ts`). - The current query in the editor is sent to the LLM as additional context (`buildNlToEsqlAdditionalContext` in `nl_to_esql_route.ts`), so I added a tip about follow-up requests. ## Resolves Closes #6350 ## Screenshots - [x] Added `explore-analyze/images/kibana-esql-search-bar-nl.png` to the new `Generate a query from natural language` subsection, showing the mode selector open with **Natural language** selected and a sample prompt running against sample data. - The existing KQL GIF (`esql-quick-search-kql.gif`) is kept as-is in the KQL subsection. For users without an Enterprise license, the search icon stays as the plain magnify glyph and the mode selector is hidden, so the GIF still accurately reflects what they see — no update needed. --- > **AI-generated draft** — created with Claude Opus 4.7. > Review all generated content for factual accuracy before merging. --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Liam Thompson <leemthompo@gmail.com>
Why
EUI renamed virtually all icons from camelCase to snake_case in January 2026 (elastic/eui#9279) and continued adding new icons through May 2026. Without this sync, docs-builder was serving outdated or missing icon glyphs and would break the build whenever a doc page used a renamed icon name.
What
EuiSvgIconsso that any existing doc page using an old camelCase name (e.g.{icon}\checkCircle`,{icon}`errorFilled`,{icon}`wordWrap``) transparently resolves to the current EUI glyph without a build error — old SVG files deleted, aliases handle resolutionchart_*,drag_*,chevron_*,ellipsis,server,significant_events, etc.)tokenAlias.svg) to snake_case (token_alias.svg) to match EUIdocs/syntax/icons.mdregenerated from the actual files on disk (580 entries, alphabetical)How
The alias mechanism lives in
EuiSvgIcons.TryGetIcon/GetIcon/TryGetToken. On lookup, the name is checked against a staticIconAliases/TokenAliasesdictionary first; if matched, the canonical name is substituted before hitting the embedded-resource dictionary. This means old doc pages keep working at zero maintenance cost, and future EUI renames only require adding an alias entry rather than a bulk docs update.Made with Cursor