Figuration v4.3 is now available!

Migration to v4

A brief rundown of major changes to get you started upgrading from v3 to v4.



  • Updated the make-col() mixin to default to equal columns when size is not specified.


Input Group

  • Inputs groups recieved multiple fixes with borders for input validation states.


  • Lists gained some changes to how markers are handled.
  • Markers can now be moved 'inside' a list item with the .list-marker-inner modifier class.
  • Allow <button>s to be used for .nav-links.


  • Dropdown menus can now be clickable with a new autoClose option. You can use this option control if a menu closes when clicking inside or outside the menu.
  • Restored the missing iOS event bubble to close menus when another element is clicked.
  • <select> elements are now supported within menus.


  • Modals gained top and bottom variants.
  • Some basic functionality for chaining modals together has been added. You can still only have one modal at a time, but you can now go from one modal to another, and back again if desired.


  • Removed the jQuery method for hiding the popover header if a title option was not provided. Now the header element will be removed completely if no title is provided.


  • Slideshow controls can now be <button> elements.


  • Tab controls can now be <button> elements.


  • New utility functions:
    • CFW_isDisabled() - to check if a control is disabled.
    • CFW_controlEnable() and CFW_controlDisable() - updates disabled attribute, or tabindex and .disabled class - appropriate to the control.
    • CFW_isRTL() - to check content direction.



  • Extended form validation states customization capabilities. Added three new optional parameters to the form-validation-state mixin: tooltip-color, tooltip-bg, focus-box-shadow. These parameters can be set in the $form-validation-states map.


  • Added .d-grid to display utilities.
  • New gap utilities (.gap) for CSS Grid layouts.
  • New placement positionin utilities to adjust top, end, bottom, and start side offsets.
  • New .translate-middle-x and .translate-middle-y utilities to horizontally or vertically center absolute/fixed positioned elements.
  • New user interaction utilities for pointer-events and user-select.
  • Updated .sr-only-focusable to also work on containers, using :focus-within.


  • The follow option has been fixed for Collapse.
  • Fixed an alignment issue with Dropdown when using an RTL layout.
  • Scrollspy gets a new option for some control of the parents active markers.
    • New nested option to not create active markers on parent items, or only limit it to Dropdown parents.
  • Tooltips/Popover had some fixes and a couple of new options added.
    • The fade animation is now normalized between Tooltips and Popovers.
    • New display option to adjust the display CSS rule when the target is shown.
    • New customClass option to add class(es) when the target is shown.
    • Tooltip triggers can gain an aria-label attribute in some cases to improve accessibility.


  • Added more notes regarding accessibility.
  • Added/updated examples for various content, components, and widgets.



Figuration v4 is a considerable rework, and there are a large number of breaking changes across the entire framework. We will try to explain the changes below.

Some changes will most likely have been missed, so please refer to the documentation pages to see the revised/new implementations.

Browser Support

  • Support for Internet Explorer 10 has been dropped! IE 10 is getting old, and the market share is less than 0.1% in terms of global usage according to many trackers. Plus our use of MutationObservers in the Widgets either needs a polyfill, or things just don't work right.


  • .sr-only-focusable does not require .sr-only anymore, and elements should not use a combination of the two classes.


  • Reworked the colors, internal palette system, and consolidated the re-used component colors.
  • Added functions to check, and/or determine the best color, these can be found in /scss/functions/_color-util.scss.
  • Extended the contextual colors with light and dark contextual variants. These variants are not available as palettes by default.


  • Added two methods of Responsive Typography support.
    • Ratio scaling - variable sizing based on viewport dimension
    • Stepped scaling - one defined size per breakpoint
  • Inline lists, .list-inline, has been dropped and replaced with the .list-horizontal modifier in the new List component.


  • .table now creates a visually simple table, borders are controlled through a selection of modifier classes.
  • .table-hover and .table-striped now use a solid gradient color overlayed using background-image to create their visual state.
  • .table-scroll-* has dropped the down portion of the class name, and is now meant to used as a wrapper to prevent conflict with screen-readers due to the use of display: block.


Forms have recieved a major overhaul. Almost everything has been changed, from using em sizing by default, along with a simplification in terms of class names and their reusability across multiple input types and visual styles. A few of the changes are listed below, but there are many that have probably been missed, so it might be better to just review the forms documentation section for a better understanding.

  • Rewrote both custom and default checkboxes and radios into a consolidated .form-check. Now, both have matching HTML structure (outer <div> with sibling <input> and <label>, and the same layout styles (stacked default, inline with utilitiy classes). This allows us to style the label based on the input's state, simplifying support for the disabled attribute (previously requiring a parent class) and better support for form validation.

    • .custom-control is replaced with .form-check.
    • .custom-checkbox and .custom-radio modifiers are replaced with .form-checkradio, the styling is now determined by the input type.
    • added .form-switch modifier to make checkbox or radio look like a toggle switch.
    • .form-check-inline has been dropped in favor of utility classes.
  • Removed .col-form-legend in favor of an improved .form-label. This way the sizing variants, such as .form-label-sm and .form-label-lg, can be used on <legend> elements also.

  • Custom file inputs have been reworked with a new .form-file class and markup, replacing .custom-file. Along with removing the SCSS map and psuedo-elements. Using children elements in the <label>, the Choose file text now comes from the .form-file-text, and the Browse button is now a .form-file-button element, allowing for translations right in the HTML.

  • Custom select inputs have been reworked also, dropping the .custom-select, resulting in a merge into .form-control.

  • Added custom styling for input type="range" with the use for .form-range. The Slider widget has been removed from Figuration and moved into it's own repository: Figuration Slider.

  • Validation icons have been re-implemented. The .form-control-icon has been replaced with .has-validation-icon. The icons are still optional and can now be used with textual <input class="form-control">, <textarea class="form-control">, and <select class="form-control"> elements. Icons can be used within .input-groups but they no longer scale with the input sizing.

  • Dropped .form-control-color, .form-control-range, and .form-control-file . Use the updated .form-color, .form-range or .form-file classes instead to get a consistent visual input.


  • Dropped the .push and .pull modifiers in favor of .offset-* and flex utilities.
  • Dropped the position: relative from grid columns.
  • Horizontal padding is added to the columns only when they are direct children of a row, instead of being added to the columns themselves.
  • The column classes can now also be used as stand alone classes to control width, without the additional horizontal padding when used outside a .row.
  • Responsive gutter classes have been added, to allow control of the gutter size in horizontal and/or vertical directions.



  • Removed padding, background-color and border-radius from parent .breadcrumb element.


  • Added support for CSS checkbox and radio buttons, using .btn-check and .btn-check-input classes.
  • Content in buttons will now wrap by default. You can use the .text-nowrap utility class to preserve old behaviour.


  • Contextually colored cards have been removed. Now you will need to use the with text, background, and border color utilities.
  • Cards have been converted to flexbox layout.
  • Images need to use some variant of .card-img{-top/bottom}, or sometimes it can be a wrapper, to keep aspect ratio and scaling in check due to flexbox, especially with IE.
  • List and table sub-components now use a .card-list or .card-table respectively.
  • Responsive horizontal card layouts have been added with .card-horizontal{breakpoint}, .card-horizontal{breakpoint}-reverse, and child .card-col elements.

Grid Lines

Input Group

  • Input group addons have been removed, simplifying much of the related CSS. Place your buttons as they would exist anywhere else, but wrap text in .input-group-text.
  • Validation styles are now supported, as are multiple inputs (though you can only validate one input per group).
  • Sizing classes must be on the parent .input-group and not the individual form elements.

List Group

  • The List Group is no longer a stand-alone component, and is now modifier within the new List component.


  • A new component that allows for greater styling options for lists, or pseudo-lists using <div>s.


  • Pagination has been modified with a couple of style modifier classes for greater flexibility. The use of the .pagination-group modifier class on the .pagination element is needed to keep the same look as the older pagination component.


  • Dropped Switch component and consolidated with the .form-check radio and checkbox controls, through the use of the .form-switch modifier class. Check out the new switch custom control.



  • Renamed .flex-order to .order to both shorten and also match standard rule name.


  • The caret utilities have been upgraded to a 4-way style. Since .dropup is no longer on the parent container, you may have to change from .caret to .caretup.

Image Replacement

  • Dropped the .text-hide util and .text-hide() mixin—in favor of using .sr-only as the replacement.



  • Dropped button widget in favor of CSS input buttons. Single state toggles can be replaced with checkbox .btn-check variant.
  • Dropdown has been reworked to use a recursive model, and now uses Popper for advanced positioning. This also had an affect of changing all the available options.
    • There are positioning fallbacks in place if dynamic placement is disabled.
  • Menu direction classes have been expanded to use the following alternates: .dropup, .dropreverse, .dropend, .dropstart, replacing the previous .dropdown-menu-reverse and .dropdown-menu-forward classes.
    • The directions classes are now applied directly to the .dropdown-menu element, or the submenu ol/ul list elements, rather than it's parent container.
    • .dropreverse replaces .dropdown-menu-reverse on primary menus.
    • .dropend replaces .dropdown-menu-reverse on submenus.
    • .dropstart replaces .dropdown-menu-forward on all menus.
  • The class used to show menus, .open, is now used on the .dropdown-menu iteself, instead of the parent container.


  • Dropped support for jQuery animations as the slim build does not support them. Added an optional fade-in CSSS animation.


  • Dropped support for sliders using the Slider widget, and added support for <input type="range"> elements. A few improvements on the accesibility of the sliders were also added.


  • Popover now requires Popper for positioning, replacing our custom code. This also means changes to the available options.


  • Dropped the slider widget as a bundled plugin. This has been replaced with the .form-range styled <input type="range"> element.


  • Tooltip now requires Popper for positioning, replacing our custom code. This also means changes to the available options.


  • We have stopped using Jekyll, and changed to using Eleventy to generate the documentation.

Build Tools

  • Figuration now requires Node.js v10 or newer if using our build tools. This is due to the minimum Node.js requirement for grunt-sass.
  • The grunt directory has been removed, and replaced with a build directory.