Electron React Boilerplate with Tailwind
Let's add Tailwind with Electron React Boilerplate to use for our main styling...
@Joshue Abance
Thu Jun 01 2023
About
A Foundation for Scalable Cross-Platform Apps
Features
-
Faster Iteration: Hot Reloading
Make changes to your app and preview the changes without having to refresh your app. Changes are made so that the state of your app is not lost.
-
Scalable: Incremental Typing
Bulding scalable apps without types can only go so far. Get type errors while developing your app. Errors are thrown during compile-time and runtime.
-
Performance: Build Optimizations
Optimization and minification of code with webpack comes out of the box. This avoids running into performance bottlenecks associated with traditional electron apps
Official Website: https://electron-react-boilerplate.js.org/
Setup
-
Clone the
electron-react-boilerplaterepository.git clone --depth=1 \ https://github.com/electron-react-boilerplate/electron-react-boilerplate \ your-project-name # replace with your project name -
Swith to your project and install dependencies
cd your-project-name npm install
Using different package manager
You might want to use a different package manager
Install Tailwind and Dependencies and Setup
npm install -D tailwindcss autoprefixer postcss postcss-loader
-
Create initial tailwind config
npx tailwindcss init -p -
Move
postcss.config.jsto.erb/configs/# bash mv postcss.config.js .erb/configs
Update erb configs
-
.erb/configs/webpack.config.renderer.dev.ts// webpack.config.renderer.dev.ts // ... { test: /\.s?(c|a)ss$/, use: [ 'style-loader', { loader: 'css-loader', options: { modules: true, sourceMap: true, importLoaders: 1, }, }, 'sass-loader', ], include: /\.module\.s?(c|a)ss$/, }, { test: /\.s?css$/, use: [ 'style-loader', 'css-loader', 'sass-loader', // add the codes below { loader: 'postcss-loader', options: { postcssOptions: { plugins: [require('tailwindcss'), require('autoprefixer')], }, }, }, // to here ], exclude: /\.module\.s?(c|a)ss$/, }, // Fonts { test: /\.(woff|woff2|eot|ttf|otf)$/i, type: 'asset/resource', }, // ... -
.erb/configs/webpack.config.renderer.prod.ts{ test: /\.s?(a|c)ss$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader', options: { modules: true, sourceMap: true, importLoaders: 1, }, }, 'sass-loader', ], include: /\.module\.s?(c|a)ss$/, }, { test: /\.s?(a|c)ss$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader', // add the codes below { loader: 'postcss-loader', options: { postcssOptions: { plugins: [require('tailwindcss'), require('autoprefixer')], }, }, }, // to here ], exclude: /\.module\.s?(c|a)ss$/, }, // Fonts { test: /\.(woff|woff2|eot|ttf|otf)$/i, type: 'asset/resource', }, -
Update Tailwind config (
tailwind.config.js/tailwind.config.cjs)/** @type {import('tailwindcss').Config} */ module.exports = { content: ["./src/renderer/**/*.{ts,tsx,js,jsx,ejs}"], // update content to have styles theme: { extend: {}, }, plugins: [], }; -
Modify
App.css(src/renderer/App.css)Add tailwind directives.
@tailwind base; @tailwind components; @tailwind utilities; -
Happy hacking!
More Features
Adding Google Fonts
To be able to have google fonts along with our application, we will need to install the fonts we need with @fontsource (https://fontsource.org/)
-
Pick a font from FontSource and install it. For this example, we will use
Interfont (https://fontsource.org/fonts/inter)For some reason, installing the variable version of the font
@fontsource-variable/interdoesn’t work when imported to our app.npm install @fontsource/inter -
Import the fonts to your
src/renderer/index.tsx// index.tsx import { createRoot } from "react-dom/client"; import App from "./App"; // import the font weights you only need import "@fontsource/inter/200.css"; import "@fontsource/inter/300.css"; import "@fontsource/inter/400.css"; import "@fontsource/inter/500.css"; import "@fontsource/inter/600.css"; import "@fontsource/inter/700.css"; import "@fontsource/inter/800.css"; const container = document.getElementById("root") as HTMLElement; const root = createRoot(container); root.render(<App />); // calling IPC exposed from preload script window.electron.ipcRenderer.once("ipc-example", (arg) => { // eslint-disable-next-line no-console console.log(arg); }); window.electron.ipcRenderer.sendMessage("ipc-example", ["ping"]); -
Add our font to the tailwind config
// tailwind.config.js // we want to extend with the default fontfamilies const { fontFamily } = require("tailwindcss/defaultTheme"); /** @type {import('tailwindcss').Config} */ module.exports = { content: ["./src/renderer/**/*.{ts,tsx}"], theme: { extend: { fontFamily: { sans: ["Inter", ...fontFamily.sans], // add our font, sans is the default font used by tailwind in all texts }, }, }, plugins: [], };
More References
- https://electron-react-boilerplate.js.org/docs/styling
- https://github.com/tbdsux/erb-tailwind (my own copy of erb with tailwind added already but is not up to date with the original project)
Enjoy coding!