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; }