Design System Dev Resource
Menu

Helper scripts

general

browser and device info

How to use:
- This script adds a 2 CSS classes to the body tag of your document: its current operating system & its browser (ex. 'mac chrome').
- OS/browser specific styling can be added based on these classes.
- Additional browser details can be accessed in the browserSettings object within the script.

SCSS file JS file
<!-- no HTML, JS only -->
//nothing is needed here
(function () {
    {
        var unknown = '-';
  
        // browser
        var nVer = navigator.appVersion;
        var nAgt = navigator.userAgent;
        var browser = navigator.appName;
        var version = '' + parseFloat(navigator.appVersion);
        var majorVersion = parseInt(navigator.appVersion, 10);
        var nameOffset, verOffset, ix;
       
        // browserSettings 
        var browserSettings = {};
  
        // Opera
        if ((verOffset = nAgt.indexOf('Opera')) != -1) {
            browser = 'opera';
            version = nAgt.substring(verOffset + 6);
            if ((verOffset = nAgt.indexOf('Version')) != -1) {
                version = nAgt.substring(verOffset + 8);
            }
        }
        // Opera Next
        if ((verOffset = nAgt.indexOf('OPR')) != -1) {
            browser = 'opera next';
            version = nAgt.substring(verOffset + 4);
        }
        // Edge
        else if ((/Edg/.test(nAgt)) === true) {
            browser = 'edge';
            version = nAgt.substring(verOffset + 5);
        }
        // MSIE
        else if ((verOffset = nAgt.indexOf('MSIE')) != -1) {
            browser = 'msie';
            version = nAgt.substring(verOffset + 5);
        }
        // Chrome
        else if ((verOffset = nAgt.indexOf('Chrome')) != -1) {
            browser = 'chrome';
            version = nAgt.substring(verOffset + 7);
        }
        // Safari
        else if ((verOffset = nAgt.indexOf('Safari')) != -1) {
            browser = 'safari';
            version = nAgt.substring(verOffset + 7);
            if ((verOffset = nAgt.indexOf('Version')) != -1) {
                version = nAgt.substring(verOffset + 8);
            }
        }
        // Firefox
        else if ((verOffset = nAgt.indexOf('Firefox')) != -1) {
            browser = 'firefox';
            version = nAgt.substring(verOffset + 8);
        }
        // MSIE 11+
        else if (nAgt.indexOf('Trident/') != -1) {
            browser = 'ie11';
            version = nAgt.substring(nAgt.indexOf('rv:') + 3);
        }
        // Other browsers
        else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
            browser = nAgt.substring(nameOffset, verOffset);
            version = nAgt.substring(verOffset + 1);
            if (browser.toLowerCase() == browser.toUpperCase()) {
                browser = navigator.appName;
            }
        }
        // trim the version string
        if ((ix = version.indexOf(';')) != -1) version = version.substring(0, ix);
        if ((ix = version.indexOf(' ')) != -1) version = version.substring(0, ix);
        if ((ix = version.indexOf(')')) != -1) version = version.substring(0, ix);
  
        majorVersion = parseInt('' + version, 10);
        if (isNaN(majorVersion)) {
            version = '' + parseFloat(navigator.appVersion);
            majorVersion = parseInt(navigator.appVersion, 10);
        }
  
        // mobile version
        var mobile = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(nVer);
  
        // cookie
        var cookieEnabled = (navigator.cookieEnabled) ? true : false;
  
        if (typeof navigator.cookieEnabled == 'undefined' && !cookieEnabled) {
            document.cookie = 'testcookie';
            cookieEnabled = (document.cookie.indexOf('testcookie') != -1) ? true : false;
        }
  
        // system
        var os = unknown;
        var clientStrings = [
            {s:'windows-10', r:/(Windows 10.0|Windows NT 10.0)/},
            {s:'windows-8_1', r:/(Windows 8.1|Windows NT 6.3)/},
            {s:'windows-8', r:/(Windows 8|Windows NT 6.2)/},
            {s:'windows-7', r:/(Windows 7|Windows NT 6.1)/},
            {s:'android', r:/Android/},
            {s:'linux', r:/(Linux|X11)/},
            {s:'iOS', r:/(iPhone|iPad|iPod)/},
            {s:'mac', r:/Mac OS X/},
            {s:'mac-os-old', r:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},
            {s:'unix', r:/UNIX/},
            {s:'search-bot', r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/}
        ];
        for (var id in clientStrings) {
            var cs = clientStrings[id];
            if (cs.r.test(nAgt)) {
                os = cs.s;
                break;
            }
        }
  
        var osVersion = unknown;
  
        if (/Windows/.test(os)) {
            osVersion = /Windows (.*)/.exec(os)[1];
            os = 'windows';
        }
  
        switch (os) {
            case 'mac':
                osVersion = os + '-' +  /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];
                break;
  
            case 'android':
                osVersion =  os + '-' +  /Android ([\.\_\d]+)/.exec(nAgt)[1];
                break;
  
            case 'iOS':
                osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
                osVersion = os + '-' + osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
                break;

        } 
    }
    browserSettings = {
        os: os,
        version: osVersion,
        mobile: mobile,
        browser: browser,
        cookiesEnabled: cookieEnabled
    }
  
    document.querySelector('body').className += ' ' + os;
    document.querySelector('body').className += ' ' + browser;
    
  }(this));
    

component toggler

How to use:
- This script assigns a button that, when clicked, will hide/show other specific elements on a page. Example usage is below.
1. Add the script below to your JS file.
2. Add a unique CSS class to each element on the page that you want to hide/show when a button is clicked.
3. Add the data attribute data-bh-toggle-type to each element from step 2. Set their value to the ideal display CSS style, ie: block, inline, flex, etc
4. Add the data attribute data-bh-toggle to the button that will trigger the hide/show action of other elements. Set the value of data-bh-toggle to the unique CSS class in step 2.
5. (Optional) A class is also added to the button itself - bh-toggle-off, which can be used to style the button when clicked.

This content will show/hide

This content will also show/hide

SCSS file JS file
<!-- Example usage: -->
<button type="button" class="bh-primary-button" data-bh-toggle="interesting-classname">Click to toggle</button>
<p class="bh-body-1-main interesting-classname" data-bh-toggle-type="flex">This content will show/hide</p>
<p class="bh-body-1-main interesting-classname" data-bh-toggle-type="block">This content will also show/hide</p>
//nothing is needed here
var toggleButtons = document.querySelectorAll('[data-bh-toggle]');

for (var i = 0; i < toggleButtons.length; i++) {
    toggleButtons[i].addEventListener('click', function() {
        var componentsToToggle = document.getElementsByClassName(this.getAttribute('data-bh-toggle'));
        this.classList.toggle('bh-toggle-closed');

        for (var i = 0; i < componentsToToggle.length; i++) {
            var elementIsShown = componentsToToggle[i].offsetWidth > 0 && componentsToToggle[i].offsetHeight > 0,
                elementToggleType = componentsToToggle[i].getAttribute('data-bh-toggle-type');

            if (elementIsShown) {
                componentsToToggle[i].style.display = 'none';
            } else {
                componentsToToggle[i].style.display = elementToggleType;
            }
        }
    });
}