Problem: Accessibility Barrier for Screen Readers Users (NVDA)
Currently, the Bubble framework applies mousedown
, mouseup
, and mousemove
event listeners to all elements by default, even when they are not interactive.
This behavior causes a critical issue for users of screen readers like NVDA (NonVisual Desktop Access):
The screen reader incorrectly announces non-interactive elements (such as headings, paragraphs, and plain text) as “Clickable”.
Root Cause Analysis:
- Bubble’s
run.js
attaches mouse-related listeners globally to the main container (.bubble-element.Page...
) and to internal elements (h1
,p
,div
,span
, etc.). - These listeners exist regardless of whether the elements have workflows or actions associated with them.
- Screen readers like NVDA detect the presence of mouse event listeners and assume the element is interactive, leading to incorrect semantic interpretation.
Impact:
This violates key WCAG (Web Content Accessibility Guidelines) principles.
Severely impacts the user experience for blind or visually impaired users relying on screen readers.
Even if a Bubble developer explicitly marks an element as non-clickable (without workflows), the issue persists because the event listeners are still present at the framework level.
Workarounds Attempted (All Failed):
CSS (
pointer-events: none
) — does not prevent the NVDA from announcing “clickable”.JavaScript (
stopPropagation
,removeEventListener
) — ineffective due to anonymous listeners attached by the Bubble framework inrun.js
.Monkey patching
addEventListener
globally — works partially but introduces risks and side effects to the app’s functionality.
Proposed Solution:
Add a Page-Level Setting (or Element-Level Setting):
“Disable Non-Interactive Mouse Listeners for Accessibility”
When enabled, this option should prevent Bubble from attachingmousedown
,mouseup
, andmousemove
listeners to elements that do not have workflows or interactive actions attached.
This feature would:
Significantly improve screen reader behavior (NVDA stops announcing “clickable” on non-interactive content).
Align Bubble apps with WCAG standards.
Provide better user experiences for visually impaired users.
Reduce the need for risky JavaScript hacks to force accessibility compliance.
Suggested Implementation Options:
- Global toggle at the page level:
[ ] Disable non-interactive mouse listeners for accessibility
- Or smarter internal detection:
Only apply mouse listeners if the element has workflows, conditionals, or dynamic actions attached.
Call to Action:
This feature would be a huge step towards making Bubble apps more accessible by design, supporting inclusivity and adherence to accessibility best practices.
I encourage the Bubble team to prioritize this, as it affects not only developer experience but also the experience of thousands of end-users who rely on assistive technologies.