Review-pass hardening of the mobile consumption mode:
- Add MOBILE_CONSUMPTION_MODE feature flag (default off, @lifecycle:
development) and a shared useIsMobile() hook; all mobile behavior and
mobile CSS now keys off the flag, so default behavior is unchanged
- Fix chart sizing: ChartHolder reports the full grid column count on
mobile so plugins get the true stacked width; drop the
width:100%!important CSS overrides on Chart/Row/ResizableContainer
- ListView: mount a single FilterControls instance (inline or drawer)
so filtersRef/clearFilters always target the visible instance; drop
the desktop-filters/desktop-sort CSS-hidden duplicates
- Route gating: routes declare mobileSupported in routes.tsx and
MobileRouteGuard receives it as a prop; remove the regex allowlist,
the unregistered /mobile-unsupported entry, and dead ?from= handling
- FilterBar: first-class mobileMode in verticalConfig replaces the
:has()/!important drawer CSS surgery in DashboardBuilder
- Consumption-only controls (explore links, slice kebab menus, card
kebab menus) are render-gated instead of CSS-hidden for a11y
- Use theme.screenSMMax instead of hardcoded 767px media queries
- RightMenu: match the Dashboards nav item by FAB-internal name, not
translated label; fix getOwnerName -> getUserName and owners ->
editors after the Subject-model refactor
- MobileUnsupported: use Button/link + icon instead of raw styled
buttons and a trailing arrow outside the translated string
- Regenerate docs/static/feature-flags.json
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>