7. Theming

Overview

DomKit is designed to be customized purely in CSS by overriding style classes. Controls primarily inherit from the following "base" style classes:

.domkit-control
.domkit-control-button
.domkit-control-text

Each DomKit control type further defines a specific style class using the convention domkit-<TypeName>. For example Button uses the class domkit-Button. A skeleton sample theme is included at the bottom of this page for reference.

Fonts

DomKit inherits all fonts from a parent or <body>. Setting the font on your page should be all that is needed to customize control fonts. The "base" control styles or specific type classes can be used to customize specific controls. Examples:

body { font: 14px 'Helvetica Neue', Arial, sans-serif; }
.domkit-control-text { font: 14px Monaco, Courier, monospace; }

div.domkit-TextArea { font: 12px Monaco, Courier, monospace; }

Valign

Controls are designed to automatically vertical align when placed inline with each other. Since controls are font agnostic (see Fonts above) this is accomplished by giving all controls a consistent line-height and adjusting padding to account for borders.

.domkit-control {
  padding: 5px 0;
}

.domkit-control-button {
  border: 1px solid #ccc;
  padding: 4px 10px;  // -1px for border to keep valign with .domkit-control
}

.domkit-control-text {
  border: 1px solid #ccc;
  padding: 4px 10px;  // -1px for border to keep valign with .domkit-control
}

Borders

DomKit defines several classes that can be used to provide a standard border color and style:

.domkit-border
.domkit-border-top
.domkit-border-left
.domkit-border-right
.domkit-border-bottom

These borders are used for more complex controls such as Table and Tree. Example use patterns:

// adding a border
Box { it.style.addClass("domkit-border") }

// adding a bottom-border
Box { it.style.addClass("domkit-border-bottom") }

// removing a left/right borders
Table {
  it.style.removeClass("domkit-border")
  it.style.addClass("domkit-border-top").addClass("domkit-border-bottom")
}

Selection

Selected items can be denoted by adding the domkit-sel class to an element. Focus is taken into account when possible, so we need to specify both the focused and unfocused selection styles:

.domkit-sel {
  background-color: #dcdcdc !important;
}

:focus .domkit-sel, .domkit-sel.pin {
  background-color: #3498db !important;
  color: #fff !important;
}

Focus

Focus rings for controls can be customized with :focus pseudo class:

.domkit-control-button:focus
.domkit-control-text:focus

Modals

Basic Dialog styles can be configured using the .domkit-Dialog-frame and .domkit-Dialog-title styles. The title bar also inherits .domkit-control.

div.domkit-Dialog-frame {
  background: #f2f2f2;
  border: 1px solid #aaa;
  border-radius: 4px 4px 0 0;
  box-shadow: 0px 12px 32px rgba(0, 0, 0, 0.4);
}

div.domkit-Dialog-title {
  text-align: center;
  font-weight: 500;
}

For Popup style:

div.domkit-Popup {
  background: rgba(248, 248, 248, 0.95);
  border: 1px solid #ddd;
  box-shadow: 0px 9px 18px rgba(0, 0, 0, 0.25);
}

A background mask is displayed under modals to prevent user input. This mask is styled using .domkit-Dialog-mask:

div.domkit-Dialog-mask {
  background: rgba(0, 0, 0, 0.25);
}

div.domkit-Popup-mask {
  background: none;
}

Table

The primary Table styles are:

div.domkit-Table
div.domkit-Table-header
div.domkit-Table-cell
div.domkit-Table-cell.odd
div.domkit-Table-cell.even

Table is a bit unique in that the cell size must be hard-coded to provide high performance for large data sets. So the -header and -cell styles will not inherit the parents font sizes (only the style). Additionally if the font size is increased, you may need to configure your rowHeight:

div.domkit-Table-header { font-size: 13px; }
div.domkit-Table-cell   { font-size: 14px; }

@Js class MyModel : TableModel
{
  override Int rowHeight() { 30 }
}

Fullscreen

To force the document body to fill the browser viewport similar to a desktop application, add the following styles:

html { height: 100%; }
body { height: 100%; overflow: hidden; }

Sample

Below is a sample starting point for a custom style sheet:

.domkit-sel {
  background-color: #dcdcdc !important;
}

:focus .domkit-sel, .domkit-sel.pin {
  background-color: #8e44ad !important;
  color: #fff !important;
}

:focus .domkit-sel a {
  color: #fff !important;
}

.domkit-control {
  font: 16px 'Helvetica Neue', Arial, sans-serif;
}

.domkit-control-button {
  background: #f8f8f8;
  border: 1px solid #444;
  border-radius: 5px;
}

.domkit-control-button:hover { background: #f0f0f0; }
.domkit-control-button.down  { background: #ccc; }
.domkit-control-button.selected,
.domkit-control-button.selected:hover {
  color: #fff;
  background-color: #8e44ad;
  border-color: #6d2f87;
}

.domkit-control-text {
  background: #fff;
  border: 1px solid #444;
  border-radius: 5px;
}

.domkit-control-button:focus, .domkit-control-text:focus {
  border-color: #8e44ad;
}

div.domkit-Table-header {
  font: bold 13px 'Helvetica Neue', Arial, sans-serif;
}
div.domkit-Table-cell {
  font: 14px 'Helvetica Neue', Arial, sans-serif;
}
div.domkit-Table-cell.odd  { background: #fff; }
div.domkit-Table-cell.even { background: #f8f8f8; }

div.domkit-Tree {
  font: 16px 'Helvetica Neue', Arial, sans-serif;
}

div.domkit-Dialog-frame {
  background: #fff;
  border: 1px solid #ccc;
  border-radius: 5px;
  box-shadow: 0px 12px 32px rgba(0, 0, 0, 0.4);
}

div.domkit-Dialog-title {
  text-align: center;
  font-weight: bold;
  background: #f8f8f8;
  border-bottom: 1px solid #ccc;
}

div.domkit-Dialog-mask {
  background: rgba(0, 0, 0, 0.25);
}

div.domkit-Popup {
  background: #fff;
  border: 1px solid #ccc;
  border-radius: 5px;
  box-shadow: 0px 9px 18px rgba(0, 0, 0, 0.25);
}

div.domkit-Popup-mask {
  background: none;
}