- Include chart customizations in hasFilters so customization-only
dashboards get a mobile filter drawer trigger, not just a drawer
nobody can open (DashboardBuilder/state.ts).
- Fix the mobile "Dashboards" link under APPLICATION_ROOT deployments
by routing it through stripAppRoot/ensureAppRoot like the other
desktop menu links (RightMenu.tsx).
- Match the language picker's actual menu key (language-submenu, not
language-picker) so it shows up in the mobile menu (RightMenu.tsx).
- Initialize useIsMobile's viewport state synchronously from
matchMedia so MobileRouteGuard doesn't mount unsupported route
content for a commit before the mobile check settles.
- Hide the authoring-only Save as / Embed dashboard menu items on the
mobile consumption-only header menu.
- Fix the playwright mobile filter button locator to match the real
data-test/aria-label the trigger renders, so the drawer tests
actually exercise the flow instead of always skipping.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds an opt-in, consumption-only mobile experience (feature flag
MOBILE_CONSUMPTION_MODE, default off, @lifecycle: development):
- Dashboards: charts stacked full-width with real plugin dimensions
(ChartHolder reports full column count on mobile; heights capped to
the viewport minus chrome), sticky swipeable tab bars with gradient
overflow affordances, filter bar in a drawer (FilterBar mobileMode),
compact header (title scrolls away; edit/publish/fave/refresh controls
hidden; dashboard info moved into the kebab menu)
- Dashboard list: forced card view, full-width cards, search/filters and
sort in a drawer (single FilterControls instance)
- Home: dashboards-only Recents, compact empty states, desktop-only
sections hidden
- Navigation: hamburger drawer (dashboards, theme/language, user
info/logout with row-tap navigation)
- Route guarding: routes declare mobileSupported in routes.tsx;
everything else renders a MobileUnsupported screen; viewport growth
unblocks automatically (useIsMobile subscribes to matchMedia only when
the flag is on, so flag-off deployments have zero render delta)
- Serves a viewport meta tag (flag-gated) so mobile browsers lay out at
device width instead of the ~980px legacy viewport; exposes
is_feature_enabled to Jinja via the common context processor
- User docs (using-superset/mobile-experience.mdx) with a Playwright
screenshot generator following the docs:screenshots pattern
- Docker dev config enables the flag; jest + Playwright coverage
throughout
Squashed from the iterative mobile-dashboard-support history (preserved
at backup/mobile-pre-rebase-2).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>