Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

bootstrap-classic

kaizhu25616MIT2020.6.12

this zero-dependency package will provide single css-rollup (includes font/glyphicon/theme) and single js-rollup (includes jquery) of twitter-bootstrap (v3.4.1), datatables (v1.10.20), and chart.js (v2.9.3) with working web-demo

bootstrap, datatables, chartjs

readme

bootstrap-lite

this zero-dependency package will provide single css-rollup (includes font/glyphicon/theme) and single js-rollup (includes jquery) of twitter-bootstrap (v3.4.1), datatables (v1.10.20), and chart.js (v2.9.3) with working web-demo

live web demo

screenshot

travis-ci.com build-status coverage

NPM

build commit status

git-branch : master beta alpha
test-server-github : github.com test-server github.com test-server github.com test-server
test-report : test-report test-report test-report
coverage : coverage coverage coverage
build-artifacts : build-artifacts build-artifacts build-artifacts

npmPackageListing

npmPackageDependencyTree

table of contents

  1. cdn download
  2. documentation
  3. quickstart standalone app
  4. quickstart example.js
  5. extra screenshots
  6. package.json
  7. changelog of last 50 commits
  8. internal build script
  9. misc

cdn download

documentation

api doc

apidoc

cli help

screenshot

changelog 2020.6.12

  • npm publish 2020.6.12
  • include datatables and chartjs
  • jslint - add eslint-rule no-multiple-empty-lines
  • add limited win32-compat
  • remove globalThis polyfill
  • migrate ci from travis-ci.org to travis-ci.com
  • none

todo

  • improve apidoc with jquery-plugin documentation
  • none

this package requires

  • darwin or linux os

quickstart standalone app

to run this example, follow instruction in script below

this shell script will download and run web-demo of bootstrap-lite as standalone app

1. download standalone app

curl -O https://kaizhu256.github.io/node-bootstrap-lite/build..beta..travis-ci.com/app/assets.app.js

2. run standalone app

PORT=8081 node ./assets.app.js

3. open browser to http://127.0.0.1:8081 and play with web-demo

4. edit file assets.app.js to suit your needs

`

output from browser

screenshot

output from shell

screenshot

quickstart example.js

screenshot

to run this example, follow instruction in script below

this script will run web-demo of bootstrap-lite

instruction

1. save this script as example.js
2. run shell-command:
    $ npm install bootstrap-lite && \
        PORT=8081 node example.js
3. open browser to http://127.0.0.1:8081 and play with web-demo
4. edit this script to suit your needs

*/

/* istanbul instrument in package bootstrap / // assets.utility2.header.js - start / jslint utility2:true / / istanbul ignore next / // run shared js-env code - init-local (function () { "use strict"; let consoleError; let local; // init debugInline if (!globalThis.debugInline) { consoleError = console.error; globalThis.debugInline = function (...argList) { /

     * this function will both print <argList> to stderr
     * and return <argList>[0]
     */
        consoleError("\n\ndebugInline");
        consoleError(...argList);
        consoleError("\n");
        return argList[0];
    };
}
// init local
local = {};
local.local = local;
globalThis.globalLocal = local;
// init isBrowser
local.isBrowser = (
    typeof globalThis.XMLHttpRequest === "function"
    && globalThis.navigator
    && typeof globalThis.navigator.userAgent === "string"
);
// init isWebWorker
local.isWebWorker = (
    local.isBrowser && typeof globalThis.importScripts === "function"
);
// init function
local.assertJsonEqual = function (aa, bb) {
/*
 * this function will assert JSON.stringify(<aa>) === JSON.stringify(<bb>)
 */
    let objectDeepCopyWithKeysSorted;
    objectDeepCopyWithKeysSorted = function (obj) {
    /*
     * this function will recursively deep-copy <obj> with keys sorted
     */
        let sorted;
        if (typeof obj !== "object" || !obj) {
            return obj;
        }
        // recursively deep-copy list with child-keys sorted
        if (Array.isArray(obj)) {
            return obj.map(objectDeepCopyWithKeysSorted);
        }
        // recursively deep-copy obj with keys sorted
        sorted = {};
        Object.keys(obj).sort().forEach(function (key) {
            sorted[key] = objectDeepCopyWithKeysSorted(obj[key]);
        });
        return sorted;
    };
    aa = JSON.stringify(objectDeepCopyWithKeysSorted(aa));
    bb = JSON.stringify(objectDeepCopyWithKeysSorted(bb));
    if (aa !== bb) {
        throw new Error(JSON.stringify(aa) + " !== " + JSON.stringify(bb));
    }
};
local.assertOrThrow = function (passed, msg) {
/*
 * this function will throw <msg> if <passed> is falsy
 */
    if (passed) {
        return;
    }
    throw (
        (
            msg
            && typeof msg.message === "string"
            && typeof msg.stack === "string"
        )
        // if msg is err, then leave as is
        ? msg
        : new Error(
            typeof msg === "string"
            // if msg is string, then leave as is
            ? msg
            // else JSON.stringify(msg)
            : JSON.stringify(msg, undefined, 4)
        )
    );
};
local.coalesce = function (...argList) {
/*
 * this function will coalesce null, undefined, or "" in <argList>
 */
    let arg;
    let ii;
    ii = 0;
    while (ii < argList.length) {
        arg = argList[ii];
        if (arg !== undefined && arg !== null && arg !== "") {
            return arg;
        }
        ii += 1;
    }
    return arg;
};
local.identity = function (val) {
/*
 * this function will return <val>
 */
    return val;
};
local.nop = function () {
/*
 * this function will do nothing
 */
    return;
};
local.objectAssignDefault = function (tgt = {}, src = {}, depth = 0) {
/*
 * this function will if items from <tgt> are null, undefined, or "",
 * then overwrite them with items from <src>
 */
    let recurse;
    recurse = function (tgt, src, depth) {
        Object.entries(src).forEach(function ([
            key, bb
        ]) {
            let aa;
            aa = tgt[key];
            if (aa === undefined || aa === null || aa === "") {
                tgt[key] = bb;
                return;
            }
            if (
                depth !== 0
                && typeof aa === "object" && aa && !Array.isArray(aa)
                && typeof bb === "object" && bb && !Array.isArray(bb)
            ) {
                recurse(aa, bb, depth - 1);
            }
        });
    };
    recurse(tgt, src, depth | 0);
    return tgt;
};
// bug-workaround - throw unhandledRejections in node-process
if (
    typeof process === "object" && process
    && typeof process.on === "function"
    && process.unhandledRejections !== "strict"
) {
    process.unhandledRejections = "strict";
    process.on("unhandledRejection", function (err) {
        throw err;
    });
}

}()); // assets.utility2.header.js - end

/* jslint utility2:true */ (function (local) { "use strict";

// run shared js-env code - init-before (function () { // init local local = ( globalThis.utility2_rollup || globalThis.utility2_bootstrap || require("bootstrap-lite") ); // init exports globalThis.local = local; }());

/* istanbul ignore next */ // run browser js-env code - init-test (function () { if (!local.isBrowser) { return; } }());

/* istanbul ignore next / // run node js-env code - init-test (function () { if (local.isBrowser) { return; } // init exports module.exports = local; // init assetsDict local.assetsDict = local.assetsDict || {}; / jslint ignore:start */ local.assetsDict["/assets.index.template.html"] = '\ <!doctype html>\n\

<html lang="en">\n\ <head>\n\ <meta charset="utf-8">\n\ <meta name="viewport" content="width=device-width, initial-scale=1">\n\ \n\ <title>{{env.npm_package_name}} ({{env.npm_package_version}})</title>\n\ <link href="https://github.com/kaizhu256/node-bootstrap-lite/blob/master/assets.bootstrap.css" rel="stylesheet">\n\ <style>\n\ /* https://github.com/twbs/bootstrap/blob/v3.4.1/docs/examples/dashboard/dashboard.css */\n\ /*\n\ * Base structure\n\ */\n\ /* Move down content because we have a fixed navbar that is 50px tall */\n\ body {\n\ padding-top: 50px;\n\ }\n\ /*\n\ * Global add-ons\n\ */\n\ .sub-header {\n\ padding-bottom: 10px;\n\ border-bottom: 1px solid #eee;\n\ }\n\ /*\n\ * Top navigation\n\ * Hide default border to remove 1px line.\n\ */\n\ .navbar-fixed-top {\n\ border: 0;\n\ }\n\ /*\n\ * Sidebar\n\ */\n\ /* Hide for mobile, show later */\n\ .sidebar {\n\ display: none;\n\ }\n\ @media (min-width: 768px) {\n\ .sidebar {\n\ position: fixed;\n\ top: 51px;\n\ bottom: 0;\n\ left: 0;\n\ z-index: 1000;\n\ display: block;\n\ padding: 20px;\n\ overflow-x: hidden;\n\ overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */\n\ background-color: #f5f5f5;\n\ border-right: 1px solid #eee;\n\ }\n\ }\n\ /* Sidebar navigation */\n\ .nav-sidebar {\n\ margin-right: -21px; /* 20px padding + 1px border */\n\ margin-bottom: 20px;\n\ margin-left: -20px;\n\ }\n\ .nav-sidebar > li > a {\n\ padding-right: 20px;\n\ padding-left: 20px;\n\ }\n\ .nav-sidebar > .active > a,\n\ .nav-sidebar > .active > a:hover,\n\ .nav-sidebar > .active > a:focus {\n\ color: #fff;\n\ background-color: #428bca;\n\ }\n\ /*\n\ * Main content\n\ */\n\ .main {\n\ padding: 20px;\n\ }\n\ @media (min-width: 768px) {\n\ .main {\n\ padding-right: 40px;\n\ padding-left: 40px;\n\ }\n\ }\n\ .main .page-header {\n\ margin-top: 0;\n\ }\n\ /*\n\ * Placeholder dashboard ideas\n\ */\n\ .placeholders {\n\ margin-bottom: 30px;\n\ text-align: center;\n\ }\n\ .placeholders h4 {\n\ margin-bottom: 0;\n\ }\n\ .placeholder {\n\ margin-bottom: 20px;\n\ }\n\ .placeholder img {\n\ display: inline-block;\n\ border-radius: 50%;\n\ }\n\ .theme-dropdown .dropdown-menu {\n\ position: static;\n\ display: block;\n\ margin-bottom: 20px;\n\ }\n\ .theme-showcase > p > .btn {\n\ margin: 5px 0;\n\ }\n\ /* https://github.com/twbs/bootstrap/blob/v3.4.1/docs/examples/theme/theme.css */\n\ .theme-showcase .navbar .container {\n\ width: auto;\n\ }\n\ </style>\n\ </head>\n\ <body>\n\ \n\ \n\
\n\
\n\ \n\
\n\ \n\ \n\
\n\

\n\ \n\ {{env.npm_package_name}} ({{env.npm_package_version}})\n\ \n\

\n\

{{env.npm_package_description}}

\n\ \n\
\n\ \n\ \n\ \n\

DataTables

\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
NamePositionOfficeAgeStart dateSalary
Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
Garrett WintersAccountantTokyo632011/07/25$170,750
Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
Airi SatouAccountantTokyo332008/11/28$162,700
Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
Jena GainesOffice ManagerLondon302008/12/19$90,560
Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
Michael SilvaMarketing DesignerLondon662012/11/27$198,500
Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
Gloria LittleSystems AdministratorNew York592009/04/10$237,500
Bradley GreerSoftware EngineerLondon412012/10/13$132,000
Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
Caesar VancePre-Sales SupportNew York212011/12/12$106,450
Doris WilderSales AssistantSidney232010/09/20$85,600
Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
Shou ItouRegional MarketingTokyo202011/08/14$163,000
Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
Suki BurksDeveloperLondon532009/10/22$114,500
Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
Hope FuentesSecretarySan Francisco412010/02/12$109,850
Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
Timothy MooneyOffice ManagerLondon372008/12/11$136,200
Jackson BradshawDirectorNew York652008/09/26$645,750
Olivia LiangSupport EngineerSingapore642011/02/03$234,500
Bruno NashSoftware EngineerLondon382011/05/03$163,500
Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
Thor WaltonDeveloperNew York612013/08/11$98,540
Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
Cara StevensSales AssistantNew York462011/12/06$145,600
Hermione ButlerRegional DirectorLondon472011/03/21$356,250
Lael GreerSystems AdministratorLondon212009/02/27$103,500
Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
Donna SniderCustomer SupportNew York272011/01/25$112,000
NamePositionOfficeAgeStart dateSalary
\n\
\n\
\n\
\n\ \n\

Chart.js

\n\
\n\ <canvas id="canvas"></canvas>\n\
\n\
\n\
\n\ <button id="randomizeData">Randomize Data</button>\n\ <button id="addDataset">Add Dataset</button>\n\ <button id="removeDataset">Remove Dataset</button>\n\ <button id="addData">Add Data</button>\n\ <button id="removeData">Remove Data</button>\n\
\n\
\n\
\n\ \n\

Dashboard

\n\
\n\
\n\ Generic placeholder thumbnail\n\

Label

\n\ Something else\n\
\n\
\n\ Generic placeholder thumbnail\n\

Label

\n\ Something else\n\
\n\
\n\ Generic placeholder thumbnail\n\

Label

\n\ Something else\n\
\n\
\n\ Generic placeholder thumbnail\n\

Label

\n\ Something else\n\
\n\
\n\

Section title

\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
#HeaderHeaderHeaderHeader
1,001Loremipsumdolorsit
1,002ametconsecteturadipiscingelit
1,003IntegernecodioPraesent
1,003liberoSedcursusante
1,004dapibusdiamSednisi
1,005Nullaquissemat
1,006nibhelementumimperdietDuis
1,007sagittisipsumPraesentmauris
1,008Fuscenectellussed
1,009auguesemperportaMauris
1,010massaVestibulumlaciniaarcu
1,011egetnullaClassaptent
1,012tacitisociosquadlitora
1,013torquentperconubianostra
1,014perinceptoshimenaeosCurabitur
1,015sodalesligulainlibero
\n\
\n\ \n\ \n\
\n\

Theme example

\n\

This is a template showcasing the optional theme stylesheet included in Bootstrap. Use it as a starting point to create something more unique by building on or modifying it.

\n\
\n\
\n\

Buttons

\n\
\n\

\n\ <button type="button" class="btn btn-lg btn-default">Default</button>\n\ <button type="button" class="btn btn-lg btn-primary">Primary</button>\n\ <button type="button" class="btn btn-lg btn-success">Success</button>\n\ <button type="button" class="btn btn-lg btn-info">Info</button>\n\ <button type="button" class="btn btn-lg btn-warning">Warning</button>\n\ <button type="button" class="btn btn-lg btn-danger">Danger</button>\n\ <button type="button" class="btn btn-lg btn-link">Link</button>\n\

\n\

\n\ <button type="button" class="btn btn-default">Default</button>\n\ <button type="button" class="btn btn-primary">Primary</button>\n\ <button type="button" class="btn btn-success">Success</button>\n\ <button type="button" class="btn btn-info">Info</button>\n\ <button type="button" class="btn btn-warning">Warning</button>\n\ <button type="button" class="btn btn-danger">Danger</button>\n\ <button type="button" class="btn btn-link">Link</button>\n\

\n\

\n\ <button type="button" class="btn btn-sm btn-default">Default</button>\n\ <button type="button" class="btn btn-sm btn-primary">Primary</button>\n\ <button type="button" class="btn btn-sm btn-success">Success</button>\n\ <button type="button" class="btn btn-sm btn-info">Info</button>\n\ <button type="button" class="btn btn-sm btn-warning">Warning</button>\n\ <button type="button" class="btn btn-sm btn-danger">Danger</button>\n\ <button type="button" class="btn btn-sm btn-link">Link</button>\n\

\n\

\n\ <button type="button" class="btn btn-xs btn-default">Default</button>\n\ <button type="button" class="btn btn-xs btn-primary">Primary</button>\n\ <button type="button" class="btn btn-xs btn-success">Success</button>\n\ <button type="button" class="btn btn-xs btn-info">Info</button>\n\ <button type="button" class="btn btn-xs btn-warning">Warning</button>\n\ <button type="button" class="btn btn-xs btn-danger">Danger</button>\n\ <button type="button" class="btn btn-xs btn-link">Link</button>\n\

\n\
\n\

Tables

\n\
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
#First NameLast NameUsername
1MarkOtto@mdo
2JacobThornton@fat
3Larrythe Bird@twitter
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
#First NameLast NameUsername
1MarkOtto@mdo
2JacobThornton@fat
3Larrythe Bird@twitter
\n\
\n\
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
#First NameLast NameUsername
1MarkOtto@mdo
MarkOtto@TwBootstrap
2JacobThornton@fat
3Larry the Bird@twitter
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
#First NameLast NameUsername
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
\n\
\n\
\n\
\n\

Thumbnails

\n\
\n\ A generic square placeholder image with a white border around it, making it resemble a photograph taken with an old instant camera\n\
\n\

Labels

\n\
\n\

\n\ Default\n\ Primary\n\ Success\n\ Info\n\ Warning\n\ Danger\n\

\n\

\n\ Default\n\ Primary\n\ Success\n\ Info\n\ Warning\n\ Danger\n\

\n\

\n\ Default\n\ Primary\n\ Success\n\ Info\n\ Warning\n\ Danger\n\

\n\

\n\ Default\n\ Primary\n\ Success\n\ Info\n\ Warning\n\ Danger\n\

\n\
\n\ Default\n\ Primary\n\ Success\n\ Info\n\ Warning\n\ Danger\n\
\n\
\n\ Default\n\ Primary\n\ Success\n\ Info\n\ Warning\n\ Danger\n\
\n\

\n\ Default\n\ Primary\n\ Success\n\ Info\n\ Warning\n\ Danger\n\

\n\
\n\

Badges

\n\
\n\

\n\ Inbox 42\n\

\n\ \n\
\n\

Dropdown menus

\n\
\n\ \n\
\n\

Navs

\n\
\n\ \n\ \n\
\n\

Navbars

\n\
\n\ \n\ \n\
\n\

Alerts

\n\
\n\
\n\ Well done! You successfully read this important alert message.\n\
\n\
\n\ Heads up! This alert needs your attention, but it\'s not super important.\n\
\n\
\n\ Warning! Best check yo self, you\'re not looking too good.\n\
\n\
\n\ Oh snap! Change a few things up and try submitting again.\n\
\n\
\n\

Progress bars

\n\
\n\
\n\
60% Complete
\n\
\n\
\n\
40% Complete (success)
\n\
\n\
\n\
20% Complete
\n\
\n\
\n\
60% Complete (warning)
\n\
\n\
\n\
80% Complete (danger)
\n\
\n\
\n\
60% Complete
\n\
\n\
\n\
35% Complete (success)
\n\
20% Complete (warning)
\n\
10% Complete (danger)
\n\
\n\
\n\

List groups

\n\
\n\ \n\
\n\

Panels

\n\
\n\
\n\
\n\
\n\
\n\

Panel title

\n\
\n\
\n\ Panel content\n\
\n\
\n\
\n\
\n\

Panel title

\n\
\n\
\n\ Panel content\n\
\n\
\n\
\n\
\n\
\n\
\n\

Panel title

\n\
\n\
\n\ Panel content\n\
\n\
\n\
\n\
\n\

Panel title

\n\
\n\
\n\ Panel content\n\
\n\
\n\
\n\
\n\
\n\
\n\

Panel title

\n\
\n\
\n\ Panel content\n\
\n\
\n\
\n\
\n\

Panel title

\n\
\n\
\n\ Panel content\n\
\n\
\n\
\n\
\n\
\n\

Wells

\n\
\n\
\n\

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed diam eget risus varius blandit sit amet non magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean lacinia bibendum nulla sed consectetur.

\n\
\n\
\n\

Carousel

\n\
\n\
\n\
    \n\
  1. \n\
  2. \n\
  3. \n\
\n\
\n\
\n\ First slide\n\
\n\
\n\ Second slide\n\
\n\
\n\ Third slide\n\
\n\
\n\ \n\ \n\ Previous\n\ \n\ \n\ \n\ Next\n\ \n\
\n\
\n\
\n\
\n\ \n\ \n\ <script src="https://raw.githubusercontent.com/kaizhu256/node-bootstrap-lite/master/assets.bootstrap.js"></script>\n\ <script>\n\ // https://github.com/twbs/bootstrap/blob/v3.4.1/docs/assets/js/docs.min.js\n\ window.initHolderJs();\n\ </script>\n\ <script>\n\ // https://github.com/DataTables/DataTables/blob/1.10.20/examples/basic_init/zero_configuration.html\n\ $(document).ready(function() {\n\ $(\'#example\').DataTable();\n\ });\n\ </script>\n\ <script>\n\ // https://github.com/chartjs/Chart.js/blob/v2.9.3/samples/utils.js\n\ \'use strict\';\n\ window.chartColors = {\n\ red: \'rgb(255, 99, 132)\',\n\ orange: \'rgb(255, 159, 64)\',\n\ yellow: \'rgb(255, 205, 86)\',\n\ green: \'rgb(75, 192, 192)\',\n\ blue: \'rgb(54, 162, 235)\',\n\ purple: \'rgb(153, 102, 255)\',\n\ grey: \'rgb(201, 203, 207)\'\n\ };\n\ (function(global) {\n\ var MONTHS = [\n\ \'January\',\n\ \'February\',\n\ \'March\',\n\ \'April\',\n\ \'May\',\n\ \'June\',\n\ \'July\',\n\ \'August\',\n\ \'September\',\n\ \'October\',\n\ \'November\',\n\ \'December\'\n\ ];\n\ var COLORS = [\n\ \'#4dc9f6\',\n\ \'#f67019\',\n\ \'#f53794\',\n\ \'#537bc4\',\n\ \'#acc236\',\n\ \'#166a8f\',\n\ \'#00a950\',\n\ \'#58595b\',\n\ \'#8549ba\'\n\ ];\n\ var Samples = global.Samples || (global.Samples = {});\n\ var Color = global.Color;\n\ Samples.utils = {\n\ // Adapted from http2://indiegamr.com/generate-repeatable-random-numbers-in-js/\n\ srand: function(seed) {\n\ this._seed = seed;\n\ },\n\ rand: function(min, max) {\n\ var seed = this._seed;\n\ min = min === undefined ? 0 : min;\n\ max = max === undefined ? 1 : max;\n\ this._seed = (seed * 9301 + 49297) % 233280;\n\ return min + (this._seed / 233280) * (max - min);\n\ },\n\ numbers: function(config) {\n\ var cfg = config || {};\n\ var min = cfg.min || 0;\n\ var max = cfg.max || 1;\n\ var from = cfg.from || [];\n\ var count = cfg.count || 8;\n\ var decimals = cfg.decimals || 8;\n\ var continuity = cfg.continuity || 1;\n\ var dfactor = Math.pow(10, decimals) || 0;\n\ var data = [];\n\ var i, value;\n