Documentation

StyleBop is a visual CSS editor for Mac. Open a folder of stylesheets and browse them as interactive node diagrams — edit properties, colors, and variables without touching the code editor unless you want to.

Installation

Download the DMG from the StyleBop page, open it, and drag StyleBop.app into your Applications folder. Then double-click to launch. macOS 14 or later is required. Apple Silicon only.

Opening a Project

StyleBop works with folders — it reads every .css file in the folder you open, recursively, and renders the folder hierarchy in the sidebar.

HTML Files

StyleBop opens .html and .htm files alongside .css — handy for small projects that keep their styles inline in a single HTML file. The surrounding markup is left untouched; StyleBop only edits the style declarations inside.

The sidebar shows the folder you opened as a tree: subfolders are expandable rows, CSS files are leaves. Each file row shows the filename, a count of rulesets, and the number of CSS variables (--custom-properties) defined in the file. A dot appears when a file has unsaved changes.

Folders

Click the disclosure triangle to expand or collapse a folder. The + button at the bottom of the sidebar offers both New CSS File and New Folder; each is created inside the currently-selected file's folder, or at the project root if no file is selected.

Right-click a folder to access: New CSS File Here, New Folder Here, Rename…, Show in Finder, and Delete… (moves the folder and its contents to Trash after confirmation).

Drag and drop

Drag any file or folder onto another folder row to move it inside. Drop onto empty space in the sidebar to move it back to the project root. Folder rows highlight while a drag is hovering over them. Moves use FileManager directly, so unsaved changes, selection, and open state are preserved.

File actions

Right-click any file to access: Duplicate, Rename, Show in Finder, Revert to Saved, and Delete. These are also available in the File menu for the currently selected file.

Rulesets Canvas

The canvas shows every ruleset in the selected file as a draggable node. Descendant selectors (like .card .title) are indented based on their combinator depth, so nesting is visible at a glance.

Selecting nodes

Reordering

Drag any node to a new position. Undo (⌘Z) reverses the move.

Renaming a selector

Double-click a node's selector text to edit it inline. Press Return to confirm.

Creating rulesets

Deleting rulesets

Select one or more nodes and press Delete or Backspace. The deletion is undoable.

Media Queries

StyleBop treats @media blocks as first-class citizens on the canvas, so responsive variants stay visually grouped with the rule they modify.

The media query badge

Any ruleset wrapped in a media query shows a rounded badge on its node with the query text (e.g. max-width: 680px). The parentheses are stripped for readability but preserved on disk.

Hoisting under the base selector

A media-wrapped ruleset is hoisted directly beneath the first non-media ruleset that matches its selector (or its base token for descendants). A .card inside @media (max-width: 680px) appears indented under the unqualified .card — regardless of where it sits in the file. If there's no match, it renders at its natural position in file order with no hoisting.

Wrapping an existing ruleset

Hover a node and click the media wrap icon (next to the + icon). A sheet opens with a combo box listing every media query already used in the document — pick one, or type a new one. Bare feature expressions like max-width: 680px are auto-parenthesized; comma- and and-joined expressions are handled too.

Editing or removing the query

When a media-wrapped ruleset is selected, the Property Editor shows a media row above the CSS properties. Click it to open the same combo box and change the query. Clear the field to unwrap the ruleset entirely.

Creating a responsive variant

Use the related + button on an existing node, then pick a media query in the sheet — you get a second copy of that selector, already wrapped and grouped with the original.

Nested Selectors

StyleBop understands native CSS nesting. If your source file uses nested blocks with & or bare descendant selectors inside another rule, the parser desugars them into flat rulesets so every nested child becomes its own node on the canvas, but the original nesting is restored byte-for-byte when the file is saved.

At-Rules & Comments

StyleBop is structurally aware of the at-rules you actually use day to day:

Anything else — vendor at-rules, @import, @charset, @namespace, license headers, inline /* comments */ between declarations — is preserved verbatim through the load → save round trip. You won't lose comments or at-rules by opening a file and saving it.

Property Editor

The panel on the right shows the CSS properties of the selected ruleset(s). Click any property to edit it. The name field has autocomplete for standard CSS property names; the value field has autocomplete for valid values for that property.

Editing existing properties

Deleting properties

Select one or more properties with the checkbox on the left (or click the row and use Delete) and press Delete or Backspace.

Tokens Panel

Switch to the Tokens tab (⌘2) to see all CSS custom properties (--name: value) in the file, grouped by the ruleset that defines them. (Internally these are CSS variables — "tokens" is just a friendlier name for the design-system role they usually play.)

Animations Panel

Switch to the Animations tab to manage every @keyframes block in the file. Each animation appears as a card with its keyframe steps (e.g. 0%, 50%, to), and each step's properties show up in the Property Editor when selected.

Code Editor

Switch to the Code tab (⌘4) for a full-text view of the CSS file with syntax highlighting and a line-number gutter. Edits here are reflected on the canvas immediately. When you switch back to the canvas, the selected ruleset and variable are preserved and the scroll position adjusts to keep them visible.

The Code tab also has its own dedicated text-edit undo stack — ⌘Z / ⌘⇧Z here walk back typing edits without disturbing the file's structural undo history (rename, reorder, color change, etc.). The stack survives leaving and returning to the tab.

Autocompletion

As you type a property name or value, a small popup of context-aware suggestions appears once the partial token is at least two characters long. The list filters as you keep typing.

ShortcutAction
EscOpen the suggestion popup at the current cursor position
/ Move the highlighted suggestion
/ Accept the highlighted suggestion (cursor stays on the same line)
Esc (popup open)Dismiss without inserting
Click outsideDismiss

Smart Typing

The Code tab also handles the small mechanical edits a CSS author would otherwise repeat constantly:

All of these are skipped on multi-character paste, so dropping a snippet into the file works as expected.

Filtering / search

Press ⌘F at any time to focus the filter field. The label adapts to the current tab — Filter Rulesets, Filter Tokens, or Filter Animations — and matches against names and selectors as you type.

Adding Properties

Press ⌘K, click + at the bottom of the property list, or press Return when a property is selected (if no field is in edit mode). A new row appears with the name field focused.

  1. Type the property name. Autocomplete suggests matching CSS properties.
  2. Press Tab to move to the value field.
  3. Type a value, or use Tab to cycle through available pickers (see below).
  4. Press Return to commit the new property.
  5. Press Escape to cancel without saving.
Tip: Picker cycling is only available when the value field is empty. Once you've typed a value, Tab commits the property instead of cycling pickers.

Picker Cycling (Tab)

When adding a new property with the value field empty, Tab and Shift-Tab cycle through whichever pickers are relevant for the current property name. The set is property-aware — only relevant pickers show up:

Tab opens the next picker in sequence (cycling back to the first after the last). Shift-Tab goes backwards. Choosing a value from any picker fills the value field and returns focus to the value input, ready for you to press Return to commit.

Color Picker

The color swatch button (colored square) opens a popover with:

Press Return while the hex field is focused to confirm the value and close the popover.

Shadow Popover

For box-shadow properties, a dedicated popover opens in place of the text field. It writes a valid box-shadow value as you change it, so you never have to memorize the syntax.

The live preview updates the property value on every change, so the canvas/code editor reflects the shadow in real time. Press Return or click outside the popover to close it.

Border Radius Editor

For border-radius, the dashed-square button opens a popover that lets you edit each corner independently with drag handles or paired numeric inputs.

The popover writes the most compact shorthand it can — 10px, 10px 20px, etc. — instead of always emitting four values.

Flex Visualizer

For flex properties, the button (appears as a grid icon) opens a visual picker showing the effect of each value in context. Click a value to apply it.

Grid Visualizer

On grid-template-columns and grid-template-rows, the 3×3 grid button opens a popover that edits both axes plus gap together.

Unrecognized track tokens (minmax(...), repeat(...), named lines) survive verbatim — the popover edits what it can and round-trips the rest.

Gradient & Image Builder

On background and background-image, the layered-rectangle button opens a popover that handles four flavors: linear, radial, conic, and url(...) images.

Filter Chain

On filter and backdrop-filter, the wand button opens a popover with a live preview swatch and one slider per active filter.

Variable Picker

The { } button opens a searchable list of all CSS custom properties defined in the current file that are compatible with the selected CSS property. Typing in the search field filters the list. Click a variable to insert it as var(--name).

Extract to Variable

Right-click any property row in the property panel and choose Extract to Variable… to lift its current value into a CSS custom property. The naming sheet shows the literal value, suggests a sensible default name based on its shape (e.g. --color-3b82f6 for a hex, --space- for a length), and tells you how many occurrences will be rewritten.

On commit, StyleBop:

The menu item is hidden for empty values, mixed-selection rows, and values that are already a var(--…) reference.

Animation & Transition

One popover handles every timing-related property. The cubic-bezier curve sits at the top with draggable handles; below it the controls adapt to the property:

Curve handles can drag into the side buffer zones for visual freedom; the emitted CSS clamps x to [0,1] so it stays spec-compliant.

Variable Usage Tracker

Each row in the Tokens tab shows a small badge after the value:

Counts are computed live across all loaded files, so renaming or removing a usage updates the badge immediately.

Cascade Layers

The layer row in the property panel (above media) doubles as a priority editor. Click it to open the Cascade Layers modal:

StyleBop maintains a single canonical @layer a, b, c; declaration near the top of the file (after any @import lines) and keeps it in sync as you edit.

Feature Queries

The supports row wraps the current ruleset in a @supports (...) block. Click to enter or edit the condition — bare features like (display: grid), negations like not (display: grid), and compound forms with and / or.

File Actions

Files autosave when you switch away from them, or you can save explicitly. Unsaved changes are shown as a dot in the sidebar.

ActionHow to access
New CSS file⌘⇧N, click + at the bottom of the sidebar → New CSS File, or File → New File
New folderClick + at the bottom of the sidebar → New Folder, or right-click a folder → New Folder Here
Move file / folderDrag onto a folder row (into that folder) or onto empty sidebar space (to project root)
Save current file⌘S
Save all files⌘⇧S
Revert to savedRight-click file → Revert to Saved…, or File → Revert to Saved…
RenameClick the selected file's name, or right-click → Rename…
DuplicateRight-click → Duplicate
Show in FinderRight-click → Show in Finder
DeleteRight-click → Delete… (moves to Trash after confirmation)

External Changes

StyleBop watches the open folder for edits made elsewhere — VS Code or another IDE, git pull, a build script, a teammate's commit. Changes that don't conflict with anything you're doing are folded in silently; the rest get a digest sheet on next focus.

Undo & Redo

Every action in StyleBop is undoable: property edits, renames, reorders, color changes, additions, deletions, and file operations.

Each file has its own undo stack. Switching files preserves your undo history for each file independently. The Code tab additionally maintains its own dedicated text-edit stack — typing edits don't fight structural changes (rename, reorder, etc.) in the same history, and that stack survives leaving and returning to the Code tab.

Find & Replace

StyleBop ships two scopes of find:

Editor Integrations

Free extensions for VS Code and JetBrains IDEs (IntelliJ, WebStorm, PyCharm, etc.) add an Open in StyleBop command to the right-click menu on any .css, .html, or .htm file — or any folder, to open the whole project. The cursor's line number is forwarded, and StyleBop's smart-router lands on the matching surface (Rulesets canvas, Animations, Tokens, or Fonts) instead of dropping you in the Code tab.

Keyboard Shortcuts

Global

ShortcutAction
⌘OOpen folder
⌘⌥NNew window (empty workspace)
⌘⇧NNew CSS file in current project
⌘SSave current file
⌘⇧SSave all files
⌘ZUndo
⌘⇧ZRedo
⌘WClose window
⌘⇧WClose project (keeps the window)

View

ShortcutAction
⌘1Switch to Rulesets canvas
⌘2Switch to Tokens panel
⌘3Switch to Animations panel
⌘4Switch to Code editor
⌘FFocus the filter field (or open the Code tab's find bar)
⌘⌥FFind & Replace across the whole project
⌘/Open the Cheat Sheet (every shortcut and gesture)

Canvas

ShortcutAction
⌘NNew ruleset
⌘-click / ⇧-clickAdd / remove node from selection
Double-click selectorRename ruleset inline
Drag nodeReorder ruleset
Delete / BackspaceDelete selected ruleset(s)
Click below last nodeAdd a new ruleset
Hover node + + iconAdd a related (descendant) ruleset
Hover node + media iconWrap this ruleset in a media query

Property Editor

ShortcutAction
⌘KAdd a new property to the selected ruleset
⌘⌥KAdd a new CSS variable
⌘⇧AAdd a new @keyframes animation
ReturnAdd new property (when none is being edited)
TabMove to next field; or, when adding a property with an empty value, open next picker
⇧TabMove to previous field; or, when adding a property with an empty value, open previous picker
ReturnCommit edit / confirm picker hex input
EscapeCancel edit or cancel new property
DeleteDelete selected properties

Sidebar

ShortcutAction
Click file name (already selected)Rename file inline
ReturnConfirm rename
EscapeCancel rename
Drag file or folder onto folderMove into that folder
Drag file or folder onto empty spaceMove to project root
Right-click fileDuplicate, Rename, Show in Finder, Revert, Delete
Right-click folderNew CSS File Here, New Folder Here, Rename, Show in Finder, Delete

Cheat Sheet

Press ⌘/ any time (or use Help → Cheat Sheet) to open a reference modal listing every keyboard shortcut and canvas gesture in StyleBop, grouped into six sections: Tabs & Navigation, Find & Replace, Editing, Selection, Property Visualizers, and Reveal in Code. It's a copy of the tables above, condensed into one always-available card so you don't have to leave your work to look something up.