Config
Custom Adaptive Logic
AdaptiveThemeProvider.adaptiveModeInfo can be set if you want to use a different user agent
or completely control the adaptive logic yourself. The theme uses AdaptiveModeContext to pass
this info to the child components which can be used separately if needed.
Different User Agent
Theme
import { AdaptiveThemeProvider } from "adaptive-material-ui/theme/adaptiveThemeProvider";
<AdaptiveThemeProvider
adaptiveModeInfo={{ userAgent: req.headers["user-agent"] }}
></AdaptiveThemeProvider>;
Context
import { AdaptiveModeContext } from "adaptive-material-ui/adaptiveMode";
<AdaptiveModeContext.Provider
value={{ userAgent: req.headers["user-agent"] }}
></AdaptiveModeContext.Provider>;
Custom Logic
Theme
import { AdaptiveThemeProvider } from "adaptive-material-ui/theme/adaptiveThemeProvider";
let mode = "android";
if (user.name === "personIdoNotLike") {
mode = "desktop";
}
<AdaptiveThemeProvider
adaptiveModeInfo={{ mode: mode }}
></AdaptiveThemeProvider>;
Context
import { AdaptiveModeContext } from "adaptive-material-ui/adaptiveMode";
let mode = "android";
if (user.name === "personIdoNotLike") {
mode = "desktop";
}
<AdaptiveModeContext.Provider
value={{ mode: mode }}
></AdaptiveModeContext.Provider>;
SSR
See the example project
using Next.js
Enforce Adaptive Component Use
ESLint can be configured to warn when using MUI components that have Adaptive counterparts
by adding the following rule to your ESLint config file.
This will for example warn if the <Button> component is used instead of <AdaptiveButton>.
import { restrictToAdaptiveComponents } from "adaptive-material-ui/eslintRule";
import { defineConfig } from "eslint/config";
export default defineConfig({
rules: {
"no-restricted-syntax": ["warn", ...restrictToAdaptiveComponents()],
},
});
Specific components can be excluded by passing a list of MUI names into the excludeComponents option.
import { restrictToAdaptiveComponents } from "adaptive-material-ui/eslintRule";
import { defineConfig } from "eslint/config";
export default defineConfig({
rules: {
"no-restricted-syntax": [
"warn",
...restrictToAdaptiveComponents({ excludeComponents: ["Button"] }),
],
},
});
Minimizing Bundle Size
To avoid barrel imports
similar ESLint & VS Code settings can be configured as shown here.
ESLint Config
{
"rules": {
"no-restricted-imports": [
"error",
{
"patterns": [
{ "regex": "^@mui/[^/]+$" },
{ "regex": "^adaptive-material-ui$" }
]
}
]
}
}
VS Code Setting
{
"typescript.preferences.autoImportSpecifierExcludeRegexes": [
"^@mui/[^/]+$",
"^adaptive-material-ui$"
]
}