# Bulma CSS — Code Examples & Common Patterns

Practical, copy-paste-ready patterns for building with Bulma.

---

## Page Skeleton

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>My Bulma Page</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@1.0.4/css/bulma.min.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
</head>
<body>
  <!-- Navbar -->
  <!-- Hero / Content -->
  <!-- Footer -->
</body>
</html>
```

---

## Navbar with Burger Menu

```html
<nav class="navbar is-primary" role="navigation" aria-label="main navigation">
  <div class="navbar-brand">
    <a class="navbar-item" href="/">
      <strong>Brand</strong>
    </a>
    <a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="mainNav">
      <span aria-hidden="true"></span>
      <span aria-hidden="true"></span>
      <span aria-hidden="true"></span>
      <span aria-hidden="true"></span>
    </a>
  </div>
  <div id="mainNav" class="navbar-menu">
    <div class="navbar-start">
      <a class="navbar-item">Home</a>
      <a class="navbar-item">Features</a>
      <div class="navbar-item has-dropdown is-hoverable">
        <a class="navbar-link">More</a>
        <div class="navbar-dropdown">
          <a class="navbar-item">About</a>
          <a class="navbar-item">Team</a>
          <hr class="navbar-divider">
          <a class="navbar-item">Contact</a>
        </div>
      </div>
    </div>
    <div class="navbar-end">
      <div class="navbar-item">
        <div class="buttons">
          <a class="button is-white"><strong>Sign up</strong></a>
          <a class="button is-light is-outlined">Log in</a>
        </div>
      </div>
    </div>
  </div>
</nav>

<script>
// Burger toggle (minimal JS required — Bulma is CSS-only)
document.addEventListener('DOMContentLoaded', () => {
  const burgers = document.querySelectorAll('.navbar-burger');
  burgers.forEach(burger => {
    burger.addEventListener('click', () => {
      const target = document.getElementById(burger.dataset.target);
      burger.classList.toggle('is-active');
      target.classList.toggle('is-active');
    });
  });
});
</script>
```

---

## Hero Section

```html
<section class="hero is-primary is-medium">
  <div class="hero-body">
    <div class="container">
      <p class="title is-1">Welcome to My App</p>
      <p class="subtitle is-3">A modern web experience</p>
      <div class="buttons">
        <a class="button is-white is-medium">Get Started</a>
        <a class="button is-primary is-inverted is-outlined is-medium">Learn More</a>
      </div>
    </div>
  </div>
</section>
```

### Fullheight Hero with Navbar

```html
<body class="has-navbar-fixed-top">
<nav class="navbar is-fixed-top is-dark">...</nav>
<section class="hero is-fullheight-with-navbar is-info">
  <div class="hero-head">
    <!-- Optional top content -->
  </div>
  <div class="hero-body">
    <div class="container has-text-centered">
      <p class="title">Centered Hero</p>
      <p class="subtitle">With head and foot</p>
    </div>
  </div>
  <div class="hero-foot">
    <div class="tabs is-centered is-boxed">
      <ul>
        <li class="is-active"><a>Overview</a></li>
        <li><a>Details</a></li>
      </ul>
    </div>
  </div>
</section>
</body>
```

---

## Responsive Columns

### Three Equal Columns
```html
<div class="columns is-mobile is-multiline">
  <div class="column is-one-third-desktop is-half-tablet is-full-mobile">
    <div class="box">Column 1</div>
  </div>
  <div class="column is-one-third-desktop is-half-tablet is-full-mobile">
    <div class="box">Column 2</div>
  </div>
  <div class="column is-one-third-desktop is-half-tablet is-full-mobile">
    <div class="box">Column 3</div>
  </div>
</div>
```

### Sidebar Layout
```html
<div class="columns">
  <div class="column is-3">
    <aside class="menu">
      <p class="menu-label">General</p>
      <ul class="menu-list">
        <li><a class="is-active">Dashboard</a></li>
        <li><a>Customers</a></li>
        <li><a>Settings</a></li>
      </ul>
    </aside>
  </div>
  <div class="column">
    <div class="content">
      <h2>Main Content</h2>
      <p>This area fills the remaining space.</p>
    </div>
  </div>
</div>
```

---

## Card Grid

```html
<div class="columns is-multiline">
  <div class="column is-4" >
    <div class="card">
      <div class="card-image">
        <figure class="image is-4by3">
          <img src="https://picsum.photos/640/480" alt="Card image">
        </figure>
      </div>
      <div class="card-content">
        <div class="media">
          <div class="media-left">
            <figure class="image is-48x48">
              <img class="is-rounded" src="https://picsum.photos/96" alt="Avatar">
            </figure>
          </div>
          <div class="media-content">
            <p class="title is-4">John Doe</p>
            <p class="subtitle is-6">@johndoe</p>
          </div>
        </div>
        <div class="content">
          Lorem ipsum dolor sit amet. <a href="#">#bulma</a>
          <br><time datetime="2024-01-15">Jan 15, 2024</time>
        </div>
      </div>
      <footer class="card-footer">
        <a class="card-footer-item">Like</a>
        <a class="card-footer-item">Share</a>
      </footer>
    </div>
  </div>
  <!-- Repeat .column.is-4 > .card for more cards -->
</div>
```

---

## Login Form

```html
<section class="hero is-fullheight">
  <div class="hero-body">
    <div class="container">
      <div class="columns is-centered">
        <div class="column is-4">
          <div class="box">
            <h1 class="title has-text-centered">Login</h1>
            <form>
              <div class="field">
                <label class="label">Email</label>
                <div class="control has-icons-left">
                  <input class="input" type="email" placeholder="email@example.com">
                  <span class="icon is-small is-left">
                    <i class="fas fa-envelope"></i>
                  </span>
                </div>
              </div>
              <div class="field">
                <label class="label">Password</label>
                <div class="control has-icons-left">
                  <input class="input" type="password" placeholder="********">
                  <span class="icon is-small is-left">
                    <i class="fas fa-lock"></i>
                  </span>
                </div>
              </div>
              <div class="field">
                <label class="checkbox">
                  <input type="checkbox"> Remember me
                </label>
              </div>
              <div class="field">
                <button class="button is-primary is-fullwidth">Login</button>
              </div>
            </form>
            <p class="has-text-centered mt-4">
              <a href="#">Forgot password?</a> · <a href="#">Sign up</a>
            </p>
          </div>
        </div>
      </div>
    </div>
  </div>
</section>
```

---

## Contact Form (Horizontal)

```html
<form>
  <div class="field is-horizontal">
    <div class="field-label is-normal">
      <label class="label">Name</label>
    </div>
    <div class="field-body">
      <div class="field">
        <div class="control has-icons-left">
          <input class="input" type="text" placeholder="First name">
          <span class="icon is-small is-left"><i class="fas fa-user"></i></span>
        </div>
      </div>
      <div class="field">
        <div class="control">
          <input class="input" type="text" placeholder="Last name">
        </div>
      </div>
    </div>
  </div>

  <div class="field is-horizontal">
    <div class="field-label is-normal">
      <label class="label">Email</label>
    </div>
    <div class="field-body">
      <div class="field is-expanded">
        <div class="control has-icons-left">
          <input class="input is-success" type="email" placeholder="email@example.com">
          <span class="icon is-small is-left"><i class="fas fa-envelope"></i></span>
        </div>
        <p class="help is-success">This email is valid</p>
      </div>
    </div>
  </div>

  <div class="field is-horizontal">
    <div class="field-label is-normal">
      <label class="label">Subject</label>
    </div>
    <div class="field-body">
      <div class="field is-narrow">
        <div class="control">
          <div class="select is-fullwidth">
            <select>
              <option>General</option>
              <option>Support</option>
              <option>Sales</option>
            </select>
          </div>
        </div>
      </div>
    </div>
  </div>

  <div class="field is-horizontal">
    <div class="field-label is-normal">
      <label class="label">Message</label>
    </div>
    <div class="field-body">
      <div class="field">
        <div class="control">
          <textarea class="textarea" placeholder="Your message..."></textarea>
        </div>
      </div>
    </div>
  </div>

  <div class="field is-horizontal">
    <div class="field-label"></div>
    <div class="field-body">
      <div class="field">
        <div class="control">
          <button class="button is-primary">Send Message</button>
        </div>
      </div>
    </div>
  </div>
</form>
```

---

## Input Addons

```html
<!-- Search bar with button -->
<div class="field has-addons">
  <div class="control is-expanded">
    <input class="input" type="text" placeholder="Search...">
  </div>
  <div class="control">
    <button class="button is-info">
      <span class="icon"><i class="fas fa-search"></i></span>
    </button>
  </div>
</div>

<!-- Amount with currency -->
<div class="field has-addons">
  <div class="control">
    <a class="button is-static">$</a>
  </div>
  <div class="control is-expanded">
    <input class="input" type="number" placeholder="Amount">
  </div>
  <div class="control">
    <a class="button is-primary">Pay</a>
  </div>
</div>
```

---

## Modal with JavaScript

```html
<button class="button is-primary" id="openModal">Open Modal</button>

<div class="modal" id="myModal">
  <div class="modal-background"></div>
  <div class="modal-card">
    <header class="modal-card-head">
      <p class="modal-card-title">Confirm Action</p>
      <button class="delete" aria-label="close"></button>
    </header>
    <section class="modal-card-body">
      <p>Are you sure you want to proceed?</p>
    </section>
    <footer class="modal-card-foot">
      <div class="buttons">
        <button class="button is-success">Confirm</button>
        <button class="button">Cancel</button>
      </div>
    </footer>
  </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', () => {
  const modal = document.getElementById('myModal');
  const html = document.documentElement;

  // Open
  document.getElementById('openModal').addEventListener('click', () => {
    modal.classList.add('is-active');
    html.classList.add('is-clipped');
  });

  // Close (background click, delete button, cancel button)
  modal.querySelectorAll('.modal-background, .delete, .modal-card-foot .button:not(.is-success)')
    .forEach(el => {
      el.addEventListener('click', () => {
        modal.classList.remove('is-active');
        html.classList.remove('is-clipped');
      });
    });
});
</script>
```

---

## Notification with Dismiss

```html
<div class="notification is-warning">
  <button class="delete"></button>
  <strong>Warning!</strong> Please check your input before submitting.
</div>

<script>
document.addEventListener('DOMContentLoaded', () => {
  document.querySelectorAll('.notification .delete').forEach(btn => {
    btn.addEventListener('click', () => {
      btn.parentNode.remove();
    });
  });
});
</script>
```

---

## Pricing Table

```html
<div class="columns is-centered">
  <div class="column is-4">
    <div class="box has-text-centered">
      <h3 class="title is-4">Free</h3>
      <p class="title is-2 has-text-primary">$0<span class="subtitle is-6">/mo</span></p>
      <div class="content">
        <ul style="list-style: none; padding: 0;">
          <li class="py-2">1 User</li>
          <li class="py-2">5 GB Storage</li>
          <li class="py-2 has-text-grey-light"><s>Priority Support</s></li>
        </ul>
      </div>
      <button class="button is-primary is-outlined is-fullwidth">Choose Plan</button>
    </div>
  </div>
  <div class="column is-4">
    <div class="box has-text-centered has-background-primary-light">
      <span class="tag is-primary is-medium mb-3">Popular</span>
      <h3 class="title is-4">Pro</h3>
      <p class="title is-2 has-text-primary">$29<span class="subtitle is-6">/mo</span></p>
      <div class="content">
        <ul style="list-style: none; padding: 0;">
          <li class="py-2">10 Users</li>
          <li class="py-2">100 GB Storage</li>
          <li class="py-2">Priority Support</li>
        </ul>
      </div>
      <button class="button is-primary is-fullwidth">Choose Plan</button>
    </div>
  </div>
  <div class="column is-4">
    <div class="box has-text-centered">
      <h3 class="title is-4">Enterprise</h3>
      <p class="title is-2 has-text-primary">$99<span class="subtitle is-6">/mo</span></p>
      <div class="content">
        <ul style="list-style: none; padding: 0;">
          <li class="py-2">Unlimited Users</li>
          <li class="py-2">1 TB Storage</li>
          <li class="py-2">24/7 Support</li>
        </ul>
      </div>
      <button class="button is-primary is-outlined is-fullwidth">Contact Us</button>
    </div>
  </div>
</div>
```

---

## Dashboard Layout (Sidebar + Content)

```html
<body class="has-navbar-fixed-top">
<nav class="navbar is-dark is-fixed-top">
  <div class="navbar-brand">
    <a class="navbar-item"><strong>Dashboard</strong></a>
  </div>
  <div class="navbar-end">
    <div class="navbar-item">
      <figure class="image is-32x32"><img class="is-rounded" src="avatar.png" alt="User"></figure>
    </div>
  </div>
</nav>

<div class="columns is-gapless" style="min-height: 100vh; padding-top: 52px;">
  <!-- Sidebar -->
  <div class="column is-2 has-background-dark">
    <aside class="menu p-4">
      <p class="menu-label has-text-grey-light">General</p>
      <ul class="menu-list">
        <li><a class="has-text-white is-active">
          <span class="icon"><i class="fas fa-tachometer-alt"></i></span> Dashboard
        </a></li>
        <li><a class="has-text-grey-light">
          <span class="icon"><i class="fas fa-users"></i></span> Users
        </a></li>
        <li><a class="has-text-grey-light">
          <span class="icon"><i class="fas fa-cog"></i></span> Settings
        </a></li>
      </ul>
    </aside>
  </div>
  <!-- Main Content -->
  <div class="column">
    <section class="section">
      <div class="level">
        <div class="level-item has-text-centered">
          <div>
            <p class="heading">Users</p>
            <p class="title">3,456</p>
          </div>
        </div>
        <div class="level-item has-text-centered">
          <div>
            <p class="heading">Revenue</p>
            <p class="title">$12,345</p>
          </div>
        </div>
        <div class="level-item has-text-centered">
          <div>
            <p class="heading">Orders</p>
            <p class="title">789</p>
          </div>
        </div>
      </div>
      <div class="box">
        <h2 class="title is-4">Recent Activity</h2>
        <table class="table is-fullwidth is-hoverable">
          <thead>
            <tr><th>User</th><th>Action</th><th>Date</th><th>Status</th></tr>
          </thead>
          <tbody>
            <tr>
              <td>Alice</td><td>Created account</td><td>Apr 7, 2026</td>
              <td><span class="tag is-success is-light">Active</span></td>
            </tr>
            <tr>
              <td>Bob</td><td>Updated profile</td><td>Apr 6, 2026</td>
              <td><span class="tag is-warning is-light">Pending</span></td>
            </tr>
          </tbody>
        </table>
      </div>
    </section>
  </div>
</div>
</body>
```

---

## Media Object (Comment Thread)

```html
<article class="media">
  <figure class="media-left">
    <p class="image is-64x64"><img class="is-rounded" src="avatar1.png" alt=""></p>
  </figure>
  <div class="media-content">
    <div class="content">
      <p>
        <strong>Alice</strong> <small>@alice</small> <small>2 hours ago</small>
        <br>
        Great article! Really enjoyed reading this.
      </p>
    </div>
    <!-- Nested reply -->
    <article class="media">
      <figure class="media-left">
        <p class="image is-48x48"><img class="is-rounded" src="avatar2.png" alt=""></p>
      </figure>
      <div class="media-content">
        <div class="content">
          <p>
            <strong>Bob</strong> <small>@bob</small> <small>1 hour ago</small>
            <br>
            Thanks Alice! Glad you liked it.
          </p>
        </div>
      </div>
    </article>
    <!-- Reply form -->
    <article class="media">
      <figure class="media-left">
        <p class="image is-48x48"><img class="is-rounded" src="avatar3.png" alt=""></p>
      </figure>
      <div class="media-content">
        <div class="field">
          <div class="control">
            <textarea class="textarea" placeholder="Add a reply..." rows="2"></textarea>
          </div>
        </div>
        <div class="field">
          <div class="control">
            <button class="button is-primary is-small">Reply</button>
          </div>
        </div>
      </div>
    </article>
  </div>
  <div class="media-right">
    <button class="delete"></button>
  </div>
</article>
```

---

## Tags with Addons

```html
<!-- Status tags -->
<div class="tags has-addons">
  <span class="tag is-dark">npm</span>
  <span class="tag is-success">v1.0.4</span>
</div>

<div class="tags has-addons">
  <span class="tag is-dark">build</span>
  <span class="tag is-warning">pending</span>
</div>

<!-- Deletable tags -->
<div class="tags">
  <span class="tag is-primary is-medium">
    JavaScript <button class="delete is-small"></button>
  </span>
  <span class="tag is-link is-medium">
    CSS <button class="delete is-small"></button>
  </span>
  <span class="tag is-info is-medium">
    Bulma <button class="delete is-small"></button>
  </span>
</div>
```

---

## Breadcrumb Navigation

```html
<nav class="breadcrumb has-arrow-separator" aria-label="breadcrumbs">
  <ul>
    <li><a href="#"><span class="icon is-small"><i class="fas fa-home"></i></span><span>Home</span></a></li>
    <li><a href="#">Products</a></li>
    <li><a href="#">Electronics</a></li>
    <li class="is-active"><a href="#" aria-current="page">Smartphones</a></li>
  </ul>
</nav>
```

---

## Sass Customization Example

```scss
// my-bulma.scss

// 1. Override initial variables
$primary: #6366f1;       // Indigo
$info: #06b6d4;          // Cyan
$success: #10b981;       // Emerald
$warning: #f59e0b;       // Amber
$danger: #ef4444;        // Red

$family-sans-serif: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
$radius: 8px;
$radius-small: 4px;
$radius-large: 12px;

// 2. Override derived variables
$link: $primary;
$scheme-main: #fafbfc;
$scheme-main-bis: #f0f2f5;

// 3. Import Bulma
@import "bulma/bulma";

// 4. Your custom styles (after Bulma)
.card {
  transition: transform 0.2s, box-shadow 0.2s;
  &:hover {
    transform: translateY(-2px);
    box-shadow: 0 8px 25px rgba(0,0,0,0.1);
  }
}
```

---

## Dark Mode Toggle

```html
<html class="theme-light">
<head>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@1.0.4/css/bulma.min.css">
</head>
<body>
  <button class="button" id="themeToggle">
    <span class="icon"><i class="fas fa-moon"></i></span>
    <span>Dark Mode</span>
  </button>

  <script>
  document.getElementById('themeToggle').addEventListener('click', () => {
    const html = document.documentElement;
    const isDark = html.classList.contains('theme-dark');
    html.classList.toggle('theme-dark', !isDark);
    html.classList.toggle('theme-light', isDark);
  });
  </script>
</body>
</html>
```

---

## Grid (v1.x) — Responsive Product Grid

```html
<div class="fixed-grid has-4-cols-desktop has-2-cols-tablet has-1-cols-mobile">
  <div class="grid">
    <div class="cell">
      <div class="box"><p class="title is-5">Product 1</p></div>
    </div>
    <div class="cell">
      <div class="box"><p class="title is-5">Product 2</p></div>
    </div>
    <div class="cell">
      <div class="box"><p class="title is-5">Product 3</p></div>
    </div>
    <div class="cell">
      <div class="box"><p class="title is-5">Product 4</p></div>
    </div>
  </div>
</div>
```

---

## Level (Stats Bar)

```html
<div class="level is-mobile">
  <div class="level-item has-text-centered">
    <div>
      <p class="heading">Tweets</p>
      <p class="title">3.2K</p>
    </div>
  </div>
  <div class="level-item has-text-centered">
    <div>
      <p class="heading">Following</p>
      <p class="title">245</p>
    </div>
  </div>
  <div class="level-item has-text-centered">
    <div>
      <p class="heading">Followers</p>
      <p class="title">12.5K</p>
    </div>
  </div>
  <div class="level-item has-text-centered">
    <div>
      <p class="heading">Likes</p>
      <p class="title">8.9K</p>
    </div>
  </div>
</div>
```

---

## Panel (Filterable List)

```html
<nav class="panel is-primary">
  <p class="panel-heading">Repositories</p>
  <div class="panel-block">
    <p class="control has-icons-left">
      <input class="input is-primary" type="text" placeholder="Search">
      <span class="icon is-left"><i class="fas fa-search"></i></span>
    </p>
  </div>
  <p class="panel-tabs">
    <a class="is-active">All</a>
    <a>Public</a>
    <a>Private</a>
    <a>Forks</a>
  </p>
  <a class="panel-block is-active">
    <span class="panel-icon"><i class="fas fa-book"></i></span> bulma
  </a>
  <a class="panel-block">
    <span class="panel-icon"><i class="fas fa-code-branch"></i></span> my-project
  </a>
  <a class="panel-block">
    <span class="panel-icon"><i class="fas fa-code-branch"></i></span> another-repo
  </a>
  <div class="panel-block">
    <button class="button is-primary is-outlined is-fullwidth">Reset filters</button>
  </div>
</nav>
```
