Skip to content

feat(editor): Support showing full label in tooltip on hover of dropdown menu items (no-changelog)#28231

Merged
CharlieKolb merged 4 commits intomasterfrom
dropdownMenu_titel_hover
Apr 14, 2026
Merged

feat(editor): Support showing full label in tooltip on hover of dropdown menu items (no-changelog)#28231
CharlieKolb merged 4 commits intomasterfrom
dropdownMenu_titel_hover

Conversation

@CharlieKolb
Copy link
Copy Markdown
Contributor

@CharlieKolb CharlieKolb commented Apr 9, 2026

Summary

Support showing a tooltip on very long names on dropdowns. Opt in currently to avoid changing existing behavior, also open to enabling this by default if preferred.

image

Related Linear tickets, Github issues, and Community forum posts

https://linear.app/n8n/issue/ADO-5043/improve-dropdown-menu-to-support-full-label-tooltip-on-hover

Review / Merge checklist

  • I have seen this code, I have run this code, and I take responsibility for this code.
  • PR title and summary are descriptive. (conventions)
  • Docs updated or follow-up ticket created.
  • Tests included.
  • PR Labeled with Backport to Beta, Backport to Stable, or Backport to v1 (if the PR is an urgent fix that needs to be backported)

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 9, 2026

Bundle Report

Changes will increase total bundle size by 309.95kB (0.68%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
editor-ui-esm 45.73MB 309.95kB (0.68%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: editor-ui-esm

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/typescript.worker-*.js -251 bytes 10.88MB -0.0%
assets/worker-*.js 3.14MB 3.16MB 17560.06% ⚠️
assets/worker-*.js -3.14MB 17.9kB -99.43%
assets/constants-*.js 933 bytes 3.14MB 0.03%
assets/src-*.js 5.69kB 2.43MB 0.23%
assets/index-*.js 3.95kB 1.31MB 0.3%
assets/ParameterInputList-*.js 2.98kB 1.27MB 0.23%
assets/users.store-*.js 1.99kB 1.05MB 0.19%
assets/expressions-*.js -1.01kB 857.51kB -0.12%
assets/index-*.css 7.39kB 820.2kB 0.91%
assets/core-*.js 9.44kB 623.4kB 1.54%
assets/src-*.css 4.18kB 495.46kB 0.85%
assets/useCanvasMapping-*.js 212 bytes 462.69kB 0.05%
assets/RunData-*.js 189 bytes 345.84kB 0.05%
assets/InstanceAiView-*.js 47.69kB 343.85kB 16.1% ⚠️
assets/ParameterInputList-*.css 2.02kB 208.23kB 0.98%
assets/WorkflowsView-*.js 1.68kB 201.71kB 0.84%
assets/table-*.js -28 bytes 178.59kB -0.02%
assets/InstanceAiView-*.css 11.03kB 166.78kB 7.08% ⚠️
assets/NodeView-*.js 97 bytes 137.24kB 0.07%
assets/usePostMessageHandler-*.js 48 bytes 137.03kB 0.04%
assets/WorkflowLayout-*.js 493 bytes 127.82kB 0.39%
assets/useRootStore-*.js 25 bytes 126.61kB 0.02%
assets/router-*.js 1.41kB 119.22kB 1.2%
assets/canvas.eventBus-*.js -4 bytes 117.47kB -0.0%
assets/SettingsSso-*.js 11.4kB 105.97kB 12.06% ⚠️
assets/NodeCreator-*.js 467 bytes 103.92kB 0.45%
assets/useCanvasOperations-*.js -1 bytes 95.39kB -0.0%
assets/NodeSettings-*.js 3 bytes 84.6kB 0.0%
assets/settings.store-*.js 293 bytes 80.06kB 0.37%
assets/CanvasRunWorkflowButton-*.js -6.68kB 77.64kB -7.92%
assets/ProjectSettings-*.js 707 bytes 74.07kB 0.96%
assets/SettingsLdapView-*.js 49 bytes 71.38kB 0.07%
assets/WorkflowHistory-*.js -1 bytes 71.02kB -0.0%
assets/node-*.js (New) 70.47kB 70.47kB 100.0% 🚀
assets/ChatView-*.js 48 bytes 58.01kB 0.08%
assets/get-*.js -12 bytes 55.96kB -0.02%
assets/CreditWarningBanner-*.js -10.83kB 55.21kB -16.39%
assets/upload-*.js -18 bytes 52.29kB -0.03%
assets/SettingsMCPView-*.js 48 bytes 48.71kB 0.1%
assets/merge-*.js -56 bytes 47.34kB -0.12%
assets/TemplatesSearchView-*.js 48 bytes 47.29kB 0.1%
assets/AppSidebar-*.js 11.39kB 43.2kB 35.79% ⚠️
assets/SettingsInstanceAiView-*.js 32.59kB 42.79kB 319.45% ⚠️
assets/useLogsTreeExpand-*.js -1 bytes 41.24kB -0.0%
assets/NodeDetailsViewV2-*.js 184 bytes 38.03kB 0.49%
assets/ExecutionsView-*.js 48 bytes 36.05kB 0.13%
assets/SettingsSso-*.css 880 bytes 34.75kB 2.6%
assets/SettingsUsersView-*.js 561 bytes 32.58kB 1.75%
assets/usePushConnection-*.js 113 bytes 31.14kB 0.36%
assets/SettingsSecretsProviders.ee-*.js 48 bytes 28.72kB 0.17%
assets/useRunWorkflow-*.js 48 bytes 27.86kB 0.17%
assets/SettingsChatHubView-*.js 48 bytes 27.85kB 0.17%
assets/WorkerView-*.js 48 bytes 27.82kB 0.17%
assets/_MapCache-*.js -40 bytes 27.61kB -0.14%
assets/ProjectHeader-*.js 1.65kB 27.43kB 6.4% ⚠️
assets/CredentialsView-*.js 48 bytes 24.76kB 0.19%
assets/InstanceAiOptinModal-*.js (New) 24.73kB 24.73kB 100.0% 🚀
assets/SettingsSourceControl-*.js 48 bytes 24.67kB 0.19%
assets/RecommendedTemplateCard-*.js -4 bytes 24.07kB -0.02%
assets/SettingsInstanceAiView-*.css 19.05kB 23.57kB 421.28% ⚠️
assets/InsightsDashboard-*.js 48 bytes 20.65kB 0.23%
assets/ProjectVariables-*.js 48 bytes 20.45kB 0.24%
assets/SettingsUsageAndPlan-*.js 48 bytes 19.09kB 0.25%
assets/DataTableActions-*.js 422 bytes 18.28kB 2.36%
assets/MainSidebarHeader-*.js -172 bytes 18.28kB -0.93%
assets/SecuritySettings-*.js 592 bytes 18.03kB 3.4%
assets/AppSidebar-*.css 3.67kB 17.63kB 26.31% ⚠️
assets/SettingsLogStreamingView-*.js 48 bytes 17.48kB 0.28%
assets/SettingsPersonalView-*.js 49 bytes 17.16kB 0.29%
assets/SettingsCommunityNodesView-*.js 48 bytes 16.46kB 0.29%
assets/instanceAiSettings.store-*.js (New) 14.99kB 14.99kB 100.0% 🚀
assets/DataTableView-*.js 48 bytes 14.96kB 0.32%
assets/DataTableDetailsView-*.js 115 bytes 14.57kB 0.8%
assets/shuffle-*.js -3 bytes 14.34kB -0.02%
assets/useQuickConnect-*.js (New) 14.27kB 14.27kB 100.0% 🚀
assets/SettingsApiView-*.js 48 bytes 13.76kB 0.35%
assets/ProjectRolesView-*.js 48 bytes 13.67kB 0.35%
assets/TemplatesCollectionView-*.js 48 bytes 13.47kB 0.36%
assets/SigninView-*.js 1 bytes 13.34kB 0.01%
assets/InstanceAiOptinModal-*.css (New) 12.45kB 12.45kB 100.0% 🚀
assets/SettingsExternalSecrets-*.js 48 bytes 11.26kB 0.43%
assets/useDebounce-*.js -5 bytes 10.3kB -0.05%
assets/SettingsAiGatewayView-*.js 3.28kB 10.02kB 48.68% ⚠️
assets/OAuthConsentView-*.js 48 bytes 10.0kB 0.48%
assets/dataTable.store-*.js 96 bytes 9.49kB 1.02%
assets/folders.store-*.js 89 bytes 8.99kB 1.0%
assets/_baseOrderBy-*.js -7 bytes 7.63kB -0.09%
assets/setupPanel.utils-*.js (New) 7.27kB 7.27kB 100.0% 🚀
assets/_initCloneObject-*.js -11 bytes 6.95kB -0.16%
assets/ProjectHeader-*.css 394 bytes 6.86kB 6.1% ⚠️
assets/TemplatesWorkflowView-*.js 48 bytes 6.79kB 0.71%
assets/SettingsAIView-*.js 48 bytes 6.66kB 0.73%
assets/useSettingsItems-*.js 565 bytes 6.45kB 9.61% ⚠️
assets/DataTableDetailsView-*.css 23 bytes 6.43kB 0.36%
assets/dist-*.js 846 bytes 5.34kB 18.8% ⚠️
assets/SettingsLayout-*.js 184 bytes 5.2kB 3.67%
assets/nodeIcon-*.js 447 bytes 4.73kB 10.45% ⚠️
assets/SettingsAiGatewayView-*.css -172 bytes 3.96kB -4.16%
assets/values-*.js -4 bytes 3.34kB -0.12%
assets/SettingsInstanceRegistryView-*.css (New) 3.06kB 3.06kB 100.0% 🚀
assets/SettingsInstanceRegistryView-*.js (New) 2.99kB 2.99kB 100.0% 🚀
assets/flatten-*.js -3 bytes 2.2kB -0.14%
assets/orderBy-*.js -1 bytes 1.98kB -0.05%
assets/useDocumentTitle-*.js (New) 1.5kB 1.5kB 100.0% 🚀
assets/pickBy-*.js -1 bytes 1.45kB -0.07%
assets/useAiGateway-*.js -14.25kB 1.42kB -90.97%
assets/uniqBy-*.js -1 bytes 1.36kB -0.07%
assets/InstanceAiLayout-*.js 131 bytes 1.17kB 12.67% ⚠️
assets/instanceAiPermissions-*.js (New) 352 bytes 352 bytes 100.0% 🚀
assets/instanceAi.settings.api-*.js (Deleted) -1.13kB 0 bytes -100.0% 🗑️

<slot name="item-label" :item="props" :ui="labelProps">
<N8nText
:class="$style['item-label']"
:title="showFullLabelOnHover && label.length >= 20 ? label : undefined"
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is fairly arbitrary, I'm not familiar enough with the component to know if this applies in general, but for my use case I see 19 characters if truncated with overflow.

If there's a css-only solution that would be preferred, please let me know

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not that I know of :/
The simples thing would be to compare scroll and client width, but we can also introduce a library like pretext that seems like an overkill but could come in handy in other places in the project.

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 9, 2026

Codecov Report

❌ Patch coverage is 14.28571% with 6 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...v2/components/DropdownMenu/DropdownMenu.stories.ts 0.00% 6 Missing ⚠️

📢 Thoughts on this report? Let us know!

@CharlieKolb CharlieKolb marked this pull request as ready for review April 9, 2026 07:35
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 5 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/frontend/@n8n/design-system/src/v2/components/DropdownMenu/DropdownMenuItem.test.ts">

<violation number="1" location="packages/frontend/@n8n/design-system/src/v2/components/DropdownMenu/DropdownMenuItem.test.ts:124">
P3: The test name says “on hover,” but the test never triggers a hover. Either add a hover interaction or rename the test to match what it actually asserts.

(Based on your team's feedback about matching test titles to asserted scenarios.) [FEEDBACK_USED]</violation>
</file>
Architecture diagram
sequenceDiagram
    participant User
    participant Menu as DropdownMenu
    participant Item as DropdownMenuItem
    participant Label as N8nText
    participant Browser

    Note over Menu, Item: Configuration Flow

    User->>Menu: Renders dropdown
    Menu->>Menu: Evaluate showFullLabelOnHover (Prop)
    
    loop for each item
        Menu->>Item: NEW: Pass showFullLabelOnHover prop
        
        Note over Item: Logic: (item.prop ?? menu.prop)
        
        alt NEW: showFullLabelOnHover is true AND label.length >= 20
            Item->>Label: CHANGED: Set title attribute to full label text
        else 
            Item->>Label: title attribute is undefined
        end

        opt Item has children (Submenu)
            Item->>Item: NEW: Recursively pass prop to child N8nDropdownMenuItem
        end
    end

    Note over User, Browser: Interaction Flow

    User->>Browser: Hover mouse over truncated label
    Browser->>Browser: Detect title attribute on N8nText element
    Browser-->>User: Display native system tooltip with full label text
Loading

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 9, 2026

Performance Comparison

Comparing currentlatest master14-day baseline

Idle baseline with Instance AI module loaded

Metric Current Latest Master Baseline (avg) vs Master vs Baseline Status
instance-ai-heap-used-baseline 186.70 MB 186.52 MB 186.34 MB (σ 0.24) +0.1% +0.2% ⚠️
instance-ai-rss-baseline 337.54 MB 388.20 MB 372.63 MB (σ 22.95) -13.1% -9.4% ⚠️

docker-stats

Metric Current Latest Master Baseline (avg) vs Master vs Baseline Status
docker-image-size-n8n 1269.76 MB 1269.76 MB 1269.76 MB (σ 0.00) +0.0% +0.0%
docker-image-size-runners 393.00 MB 393.00 MB 391.63 MB (σ 11.06) +0.0% +0.3%

Memory consumption baseline with starter plan resources

Metric Current Latest Master Baseline (avg) vs Master vs Baseline Status
memory-heap-used-baseline 114.17 MB 114.05 MB 113.86 MB (σ 0.84) +0.1% +0.3%
memory-rss-baseline 279.30 MB 287.98 MB 284.98 MB (σ 42.51) -3.0% -2.0%
How to read this table
  • Current: This PR's value (or latest master if PR perf tests haven't run)
  • Latest Master: Most recent nightly master measurement
  • Baseline: Rolling 14-day average from master
  • vs Master: PR impact (current vs latest master)
  • vs Baseline: Drift from baseline (current vs rolling avg)
  • Status: ✅ within 1σ | ⚠️ 1-2σ | 🔴 >2σ regression

@n8n-assistant n8n-assistant Bot added the n8n team Authored by the n8n team label Apr 9, 2026
…nMenu/DropdownMenuItem.test.ts

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

@MiloradFilipovic MiloradFilipovic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works nicely, I left a few comments so take a look what makes sense

<slot name="item-label" :item="props" :ui="labelProps">
<N8nText
:class="$style['item-label']"
:title="showFullLabelOnHover && label.length >= 20 ? label : undefined"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not that I know of :/
The simples thing would be to compare scroll and client width, but we can also introduce a library like pretext that seems like an overkill but could come in handy in other places in the project.

<slot name="item-label" :item="props" :ui="labelProps">
<N8nText
:class="$style['item-label']"
:title="showFullLabelOnHover && label.length >= 20 ? label : undefined"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Any reason for using title over N8nToolTip?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just cause I kept it optional - will try that 👌

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm tempted to stick with the title on the text here 😅 Moving this risks breaking a use case which hardcodes a css override also technically, so I'd rather not touch it anyway

image

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright, makes sense, it was a nit after all. I just see we are mixing those a bit all over the place but we should consult the design team for some guidelines. Good to go for this one

Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 4 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/frontend/@n8n/design-system/src/v2/components/DropdownMenu/DropdownMenuItem.vue">

<violation number="1" location="packages/frontend/@n8n/design-system/src/v2/components/DropdownMenu/DropdownMenuItem.vue:122">
P2: The new `titleAttr` dropped the `showFullLabelOnHover` guard, so long-label tooltips are now enabled globally instead of only when opted in.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

Copy link
Copy Markdown
Contributor

@MiloradFilipovic MiloradFilipovic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@CharlieKolb CharlieKolb added this pull request to the merge queue Apr 14, 2026
Merged via the queue into master with commit 90a3f46 Apr 14, 2026
71 checks passed
@CharlieKolb CharlieKolb deleted the dropdownMenu_titel_hover branch April 14, 2026 11:46
Aijeyomah pushed a commit to Aijeyomah/n8n that referenced this pull request Apr 15, 2026
…own menu items (no-changelog) (n8n-io#28231)

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
@n8n-assistant
Copy link
Copy Markdown
Contributor

n8n-assistant Bot commented Apr 21, 2026

Got released with n8n@2.18.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

n8n team Authored by the n8n team Released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants