@title CSS Coding Standards
@group standards

This document describes CSS features and coding standards for Phabricator.

= Overview =

This document describes technical and style guidelines for writing CSS in
Phabricator.

Phabricator has a limited CSS preprocessor. This document describes the features
it makes available.

= Z-Indexes =

You should put all `z-index` rules in `z-index.css`, and keep them sorted. The
goal is to make indexes relatively manageable and reduce the escalation of the
Great Z-Index War where all indexes grow without bound in an endless arms race.

= Color Variables =

Phabricator's preprocessor provides some standard color variables. You can
reference these with `{$color}`. For example:

  lang=css
  span.critical {
    color: {$red};
  }

You can find a list of all available colors in the **UIExamples** application.

= Printable Rules =

If you preface a rule with `!print`, it will be transformed into a print rule
and activated when the user is printing the page or viewing a printable version
of the page:

  lang=css
  !print div.menu {
    display: none;
  }

Specifically, this directive causes two copies of the rule to be written out.
The output will look something like this:

  lang=css
  .printable div.menu {
    display: none;
  }

  @media print {
    div.menu {
      display: none;
    }
  }

The former will activate when users look at the printable versions of pages, by
adding `__print__` to the URI. The latter will be activated in print contexts
by the media query.

= Device Rules =

Phabricator's environment defines several device classes which can be used to
adjust behavior responsively. In particular:

  lang=css
  .device-phone {
    /* Smallest breakpoint, usually for phones. */
  }

  .device-tablet {
    /* Middle breakpoint, usually for tablets. */
  }

  .device-desktop {
    /* Largest breakpoint, usually for desktops. */
  }

Since many rules are specific to handheld devices, the `.device` class selects
either tablets or phones:

  lang=css
  .device {
    /* Phone or tablet (not desktop). */
  }

= Image Inlining =

Phabricator's CSS preprocessor automatically inlines images which are less than
32KB using `data:` URIs. This is primarily useful for gradients or textures
which are small and difficult to sprite.