$primary
For strongly drawing attention to items
$primary-hover
$primary-focus
This design system is intended to be implemented in different ways depending on the type of project.
If you're unsure, please contact Gretchen or Brad with any questions about which approach is most appropriate for your project.
There are three stylesheets that comprise the Strategies design system: _core, _fonts, and _styles. The CORE file contains only mixins and variables and the FONTS file contains only font imports, while the STYLES file includes all applied definitions. To use the full design system, include all three files in your project; this is best when starting a new project. When retrofitting an existing project, start with only CORE and FONTS.
To install / update in your project, use NPM:
To reference in your project:
You can also download the latest directly here: CORE, FONTS, and STYLES. Or check out the repo in Bitbucket > design_system > package.
This mission statement of the Strategies team reflects broader aspirations from Sasaki’s brand: optimism, idealism, and commitment; shifting focus from the spatial to the human; shaping experiences through physical environments. The Strategies team is responsible for manifesting these brand concepts in digital environments. This design system provides the digital building blocks to use while creating those digital environments.
The following concepts are founding principles that drive how our brand is expressed digitally. Sasaki Strategies interfaces should:
Data and technology can be intimidating for those who don’t work with it every day. We seek to overcome that barrier, by designing interfaces that are inviting to interact with, clear to understand, welcoming and accessible. To do this, we create self-explanatory interfaces, use a warm voice for copy, and avoid overly dark or heavy visual design.
Much of the content that we work with is complex. While our interfaces are approachable, that doesn’t mean they lack depth -- the interfaces we create should enable deep understanding and clearly reveal complex nuances. To accomplish this, we believe in providing details on demand while maintaining a minimalist and clean visual style.
Sasaki, and in particular Strategies, offers a unique presence and contribution to the world -- one that balances both data and design with equal weight. The interfaces we create should reflect that distinctive approach; they should use consistently recognizable elements such as tone, motion, and visual design to be clearly identified as Sasaki products.
We believe that the people and places we work with are important; our work often has large-scale impact on spaces, budgets, and residents’ lives, and we don’t take that lightly. As such, the interfaces we design should balance play with gravitas to create trust. The information, experience, and performance of our tools and products should reinforce our credibility as experts.
Just as Sasaki strives for excellence in other areas of our design practice, the design of the digital tools and products we create also aspire to be best-in-class, on a shared playing field with interface design industry leaders. Our interfaces will be marked by an elevated and thoughtful clarity of design, and will be conscious of the latest design trends, to assert our commitment in producing high quality interface design.
Each of the components and styles shown below have been designed with these concepts in mind. The colors and typography styles pulled directly from Sasaki’s brand already reflect these ideas, while new additions not already specified in Sasaki’s brand guidelines (buttons, hover states, shadows, form inputs, etc.) seek to replicate the tone of Sasaki’s brand -- through design decisions like slightly rounded corners, clean and simple icons, and subtle shadow effects.
Read more about the full brand guidelines and the spirit of Sasaki’s vision here: R:\_Brand Resources\00_Brand Guidelines\Sasaki_BrandGuidelines.pdf
It is recommended to use CSS Grid to more easily make our tools mobile-friendly / responsive to different screen sizes. Familiarize yourself with it, as well as its browser limitations and workarounds. See this article for more info.
This design system is built mobile-first. Standard media queries are included in the design system as Sass mixins, so you can use them as follows:
// MEDIA QUERIES
// Extra small devices (portrait phones, less than 576px)
// Small devices (landscape phones, 576px and up)
@mixin sm {
@media (min-width: 576px) { @content; };
}
// Medium devices (tablets, 768px and up)
@mixin md {
@media (min-width: 768px) { @content; };
}
// Large devices (desktops, 992px and up)
@mixin lg {
@media (min-width: 992px) { @content; };
}
// Extra large devices (large desktops, 1200px and up)
@mixin xl {
@media (min-width: 1200px) { @content; };
}
Global styles are definitions woven throughout an entire project, used in components, patterns, and templates. Logos, color, typography, and icons are the primary global elements used in this style guide.
Use each color by using the Sass variables shown below (i.e., "color: $primary;").
These are the primary colors to be used for interface components; data visualization colors may expand beyond this palette.
$primary
For strongly drawing attention to items
$primary-hover
$primary-focus
$secondary
For more gently drawing attention to items
$secondary-hover
$secondary-focus
$nl (neutral light)
Ideal as a background wash to differentiate areas of the page
$nl-hover
$nl-focus
$nd (neutral dark)
Use sparingly and lightly; for example, as default font color
$nd-hover
$nd-focus
These colors are only to be used for interface success, warning, and error messages.
$success
$warning
$error
All webfonts are pre-loaded into the design system (fonts.scss) using an @import link -- just target the font using the $ selector as follows below!
Light (200), Medium (500), Bold (700)
Korolev is Sasaki's primary brand font. This personality-rich display font should be used for headlines, not body copy. We use Typekit to display the webfont in light (200), medium (500), and bold (700) weights. To use Korolev, use "font-family: $Korolev".
Regular (500)
Open Sans is not included in Sasaki's brand guidelines, but is a web-friendly sans-serif that should be used for body copy. To use Open Sans, use "font-family: $OpenSans".
Light (200)
Cheltenham ITC Pro is Sasaki's brand serif font, though Georgia is an acceptable webfont alternative (and is specified in the fallbacks in this style guide). However, most of the apps and interfaces that Strategies builds does not typically call for the use of a serif font; use sparingly. We use Sasaki's fonts.com account to load this webfont in the light (200) weight. To use Cheltenham, use "font-family: $Cheltenham".
Sizes can be adjusted to fit your project, but please use rem units (not px, pt, or em). Please also note that the white space around each header style is almost as important as the text itself; if you adjust sizes, be sure that breathing room is maintained proportionately.
p-lg: Large Body Text
p-md: Medium Body Text
p-sm: Small Body Text
Styles for React Table are included in this design system; you can view a Codesandbox live preview below.
We use the Retina Icons iconset, a purchased library with thousands of icons to choose from.
The icons can be loaded in three ways, depending on the implementation.
Recommended for most uses
Each icon has been assigned a classname and corresponding style. Look up the classname in the reference app, then code an icon object and assign the appropriate classname. An example is shown below:
<i class="retina-winter-2995"></i>
Style-first solution
To add the icon using only CSS, look up the icon's webfont unicode in the reference app and enter it as a content tag in the stylesheet, including the $Retina font family. An example is shown below:
<span class="unicode-test"></span>
.unicode-test:before {
font-family: $Retina;
content: "\f1b6";
}
Not recommended; managing assets is cumbersome and increases load times
If the above two methods aren't applicable, find the icon file on the network (L:\sa_strategies\Retina Icons), upload the asset, and embed as an image. There are a number of file formats available for every icon, including png, svg, eps, and more.
While there are thousands of icons to choose from in the Retina iconset, we most often use the icons shown below. Classnames and unicodes included for reference.
retina-arrows-0005
e9eb
retina-arrows-0006
e9ec
retina-arrows-0007
e9ed
retina-arrows-0008
e9ee
retina-theessentials-2527
f07d
retina-theessentials-2544
f089
retina-theessentials-2592
e994
retina-theessentials-2582
f0a0
retina-theessentials-2542
f087
retina-theessentials-2543
f088
retina-arrows-0044
e604
retina-theessentials-2634
f0c5
retina-theessentials-2588
f0a6
retina-theessentials-2550
e753
retina-theessentials-2606
e996
retina-theessentials-2576
e990
retina-theessentials-2679
f0e3
retina-theessentials-2681
e9a5
retina-theessentials-2680
f0e4
retina-theessentials-2523
f079
retina-filetypecontent-1074
ecb5
retina-theessentials-2541
f086
retina-theessentials-2538
f083
retina-theessentials-2540
f085
retina-theessentials-2537
f082
retina-theessentials-2613
f0b5
retina-theessentials-2618
f0ba
retina-theessentials-2619
f0bb
If color and type are global styles woven throughout a project, think of components as the building blocks (atoms) that help the project begin to take shape.
Buttons are shown in block (max 250px width) and standard sizes.
<button type="button" class="ss-button nl">Standard</button>
<button type="button" class="ss-button block nl">Block</button>
When using buttons of various sizes or colors, keep in mind the hierarchy of what you're asking the user to do -- for example, if you want to encourage them to click "yes," use a bright color for "yes" and a grey-tone for "no."
<button type="button" class="ss-button primary">Primary</button>
<button type="button" class="ss-button secondary">Secondary</button>
<button type="button" class="ss-button nl">Secondary</button>
<button type="button" class="ss-button nd">Secondary</button>
These small, square buttons can be used for individual button treatments or in combination with each other to create toolbars.
<button type="button" class="ss-button sq"></button>
Toolbar combinations can be created by creating square icon buttons within a horizontal toolbar (hz-tb) or vertical toolbar (vt-tb), as follows:
<div class="hz-tb">
<button type="button" class="ss-button sq"><i class="retina-filetypecontent-1074"></i></button>
<button type="button" class="ss-button sq"><i class="retina-theessentials-2541"></i></button>
<button type="button" class="ss-button sq"><i class="retina-theessentials-2592"></i></button>
<button type="button" class="ss-button sq"><i class="retina-theessentials-2538"></i></button>
</div>
<div class="vt-tb">
<button type="button" class="ss-button sq"><i class="retina-design-0719"></i></button>
<button type="button" class="ss-button sq"><i class="retina-design-0722"></i></button>
<button type="button" class="ss-button sq"><i class="retina-design-0797"></i></button>
<button type="button" class="ss-button sq"><i class="retina-theessentials-2576"></i></button>
</div>
Included in this design system are override styles for Leaflet Standard and Leaflet Editable default icons; a demo is shown below. The tools used here have class names assigned according to their kind, and styles assigned to those class kinds. We're hiding the default icons with visibility: hidden, and instead loading Retina icons into the "before" pseudo class.
<div id="slidecontainer">
<input type="range" class="ss-slider">
</div>
What is the radio button state?
<p class="form-prompt">What is the radio button state?</p>
<div>
<input id="radio-1" class="radio" name="radio-group" type="radio">
<label for="radio-1" class="radio-label">Radio is off</label>
</div>
<div>
<input id="radio-2" class="radio" name="radio-group" type="radio" checked>
<label for="radio-2" class="radio-label">Radio is on</label>
</div>
<div>
<input id="radio-3" class="radio" name="radio-group-2" type="radio" disabled>
<label for="radio-3" class="radio-label">Disabled radio is off</label>
</div>
<div>
<input id="radio-4" class="radio" name="radio-group-2" type="radio" disabled checked>
<label for="radio-4" class="radio-label">Disabled radio is on</label>
</div>
What is the checkbox state?
<p class="form-prompt">What is the checkbox state?</p>
<div>
<input id="checkbox-1" class="checkbox" name="checkbox-group" type="checkbox">
<label for="checkbox-1" class="checkbox-label">Unchecked</label>
</div>
<div>
<input id="checkbox-2" class="checkbox" name="checkbox-group" type="checkbox" checked>
<label for="checkbox-2" class="checkbox-label">Checked</label>
</div>
<div>
<input id="checkbox-3" class="checkbox" name="checkbox-group-2" type="checkbox" disabled>
<label for="checkbox-3" class="checkbox-label">Disabled unchecked</label>
</div>
<div>
<input id="checkbox-4" class="checkbox" name="checkbox-group-2" type="checkbox" disabled checked>
<label for="checkbox-4" class="checkbox-label">Disabled checked</label>
</div>
How do you feel today?
<p class="form-prompt">How do you feel today?</p>
<select class="dropdown">
<optgroup label="Positive">
<option value="fantastic">Fantastic</option>
<option value="great">Great</option>
<option value="pretty good">Pretty Good</option>
<option value="just ok">Just OK</option>
</optgroup>
<optgroup label="Negative">
<option value="meh">Meh</option>
<option value="pretty bad">Pretty Bad</option>
<option value="terrible">Terrible</option>
<option value="worst">Worst Ever</option>
</optgroup>
</select>
<div class="text-input">
<label>Your Name</label>
<input type="text" placeholder="Type here">
</div>
<div class="text-input">
<input type="text" class="success" placeholder="Type here"><i class="retina-theessentials-2679"></i>
</div>
<div class="text-input">
<input type="text" class="warning" placeholder="Type here"><i class="retina-theessentials-2681"></i>
</div>
<div class="text-input">
<input type="text" class="error" placeholder="Type here"><i class="retina-theessentials-2680"></i>
</div>
<div class="text-area">
<label>What do you think?</label>
<textarea rows="3" cols="50" placeholder="Type here"></textarea>
</div>
<input type="submit" class="ss-button primary">