Пользовательский интерфейс материалов (React) использует решение для создания тем, в котором объект темы создается в JS, а затем передается в компонент верхнего уровня. Создание объекта темы в Opal может быть сложным, поскольку компонент Material ожидает передачи JS-функции, которая фактически создает тему на лету.
У кого-нибудь есть пример того, как это работает хорошо?
После некоторых экспериментов я получил это, смешав код JS и Opal, так что вот решение на случай, если кто-то еще придумает это. (Может быть лучшее решение «больше опала», поэтому, если есть, опубликуйте альтернативный ответ, но приведенный ниже работает хорошо.
Сначала импортируйте библиотеки JS с помощью веб-пакета:
import { MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles';
import indigo from '@material-ui/core/colors/indigo';
import pink from '@material-ui/core/colors/pink';
import red from '@material-ui/core/colors/red';
global.createMuiTheme = createMuiTheme;
global.MuiThemeProvider = MuiThemeProvider;
global.indigo = indigo;
global.pink = pink;
global.red = red;
Добавьте следующее в свои активы Javascript:
// app/assets/javascripts/my_theme.js
const my_theme = createMuiTheme(
{ palette: {
primary: { main: pink[500] },
secondary: { main: indigo[500] }
}
});
Затем укажите тему в коде компонента верхнего уровня:
class MyRouter < HyperComponent
include Hyperstack::Router
render(DIV) do
MuiThemeProvider(theme: `my_theme` ) do
CssBaseline do
...
end
end
end
end