feat(mobile): consumption-only mobile experience behind MOBILE_CONSUMPTION_MODE

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>
This commit is contained in:
Superset Dev
2026-07-20 08:54:16 -07:00
parent ef459c21e8
commit a256eb04cd
63 changed files with 2921 additions and 195 deletions

View File

@@ -110,6 +110,7 @@ FEATURE_FLAGS = {
"ALERT_REPORTS": True,
"DATASET_FOLDERS": True,
"ENABLE_EXTENSIONS": True,
"MOBILE_CONSUMPTION_MODE": True,
"SEMANTIC_LAYERS": True,
}
EXTENSIONS_PATH = "/app/docker/extensions"