# Bulma
You can use this package to install Bulma in your Phoenix project without needing to rely on Node or NPM.
It works by leveraging the [DartSass](https://github.com/cargosense/dart_sass) package.
### Installing DartSass
DartSass is an Elixir library that works similar to Esbuild and does actual Sass processing.
#### Install DartSass in `mix.exs`
[https://github.com/CargoSense/dart_sass](`dart_sass`) Github repo.
Add the following line to your `deps()` section:
```elixir
{:dart_sass, "~> 0.7", runtime: Mix.env() == :dev}
```
Then configure which version of dart-sass to use by adding this to your `config/config.exs` file.
You will probably need to check on [NPM](https://www.npmjs.com/package/sass) to get the latest version number.
```elixir
config :dart_sass,
version: "1.79.3",
default: [
args: ~w(css:../priv/static/assets),
cd: Path.expand("../assets", __DIR__)
]
```
Run `mix deps.get` then install Sass:
```sh
mix sass.install
```
### Rename assets/css/app.css
Rename the existing `assets/css/app.css` to `assets/css/app.scss`.
### Update app.js in assets/js/
Comment out or delete this line:
```javascript
// import "../css/app.css";
```
For development, enable watch mode by changing your watchers configuration for `MyApp.Endpoint` in `config/dev.exs`.
```elixir
watchers: [
# Start the esbuild watcher by calling Esbuild.install_and_run(:default, args)
esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]},
sass: {
DartSass,
:install_and_run,
[:default, ~w(--embed-source-map --source-map-urls=absolute --watch)]
}
]
```
Finally, back in your mix.exs, make sure you have an assets.deploy alias for deployments, which will also use the --style=compressed option:
```elixir
"assets.deploy": [
"esbuild default --minify",
"sass default --no-source-map --style=compressed",
"phx.digest"
]
```
## Installing Bulma
There are effectively three different ways to install Bulma.
### Method 1: Using a CDN
The first way to install Bulma is to just include the `bulma.min.css` file from a CDN like [JSDeliver](https://www.jsdelivr.com/package/npm/bulma). With this approach, you would not be able to customize Bulma at all.
### Method 2: Using Node and npm
The second way is to install `node` and `npm`, create a `package.json` file, add `bulma` to it, then tell `dart-sass` where the Sass files were installed. However, this makes our app depend on `node` again.
### Method 3: Using Hex Package
The third way is to install the [Bulma Hex package](https://github.com/kevinlang/bulma-elixir). This approach includes all of the Bulma Sass files in a convenient package that can easily be added to your Mix project. To do this:
* Go to your `mix.exs` file and add it:
```elixir
{:bulma, "1.0.2"}
```
* Update your `dart-sass` config to include it as a load path:
```elixir
config :dart_sass,
version: "1.79.3",
default: [
args: ~w(--load-path=../deps/bulma css:../priv/static/assets),
cd: Path.expand("../assets", __DIR__)
]
```
* Import Bulma into your root style sheet, `assets/css/app.scss`:
```scss
@import "bulma";
```
## Using Bulma and CSS Cleanup
Now that we have Bulma installed, let's do some minimal changes to the generated app. First, get rid of the `assets/css/phoenix.css` file.
Then replace the content of the `assets/css/app.scss` file with:
```scss
// override bulma variables before import to customize
$phoenix-orange: #f05423;
$primary: $phoenix-orange;
@import "bulma";
// add our own styles after the Bulma import
```
Here we are overriding the `$primary` variable outlined in the [Bulma docs](https://bulma.io/documentation/customize/variables/) to our `$phoenix-orange` color.
## Updating HTML Files
Let's update some of our HTML files so we can show Bulma in action. First, remove the header in `root.html.heex`.
Then let's make a nice big Bulma hero section on our main `index.html` page:
```html
<section class="hero is-primary is-fullheight">
<div class="hero-body">
<div class="container has-text-centered">
<p class="title">Phoenix</p>
<p class="subtitle">With Bulma!</p>
</div>
</div>
</section>
```
The version of this package exactly matches the version of Bulma that it contains. As of now, it has version `1.0.2`.