diff --git a/RELEASE.md b/RELEASE.md
new file mode 100644
index 0000000..3c69a70
--- /dev/null
+++ b/RELEASE.md
@@ -0,0 +1,16 @@
+## Release Checklist
+
+#### Update version, docs, tag, and publish
+
+Assumes documentation.js v4 has been installed globally:
+`npm install -g documentation`
+
+- [ ] git checkout master
+- [ ] Update CHANGELOG
+- [ ] Update version number in `include/shelf-pack.hpp` and `makedocs.sh`
+- [ ] ./makedocs.sh
+- [ ] git add .
+- [ ] git commit -m 'vA.B.C'
+- [ ] git tag vA.B.C
+- [ ] git push origin master vA.B.C
+- [ ] open pull request in `mason` project
diff --git a/docs/assets/anchor.js b/docs/assets/anchor.js
new file mode 100644
index 0000000..476a8f9
--- /dev/null
+++ b/docs/assets/anchor.js
@@ -0,0 +1,198 @@
+/*!
+ * AnchorJS - v1.2.1 - 2015-07-02
+ * https://github.com/bryanbraun/anchorjs
+ * Copyright (c) 2015 Bryan Braun; Licensed MIT
+ */
+
+function AnchorJS(options) {
+ 'use strict';
+ this.options = options || {};
+
+ this._applyRemainingDefaultOptions = function(opts) {
+ this.options.icon = this.options.hasOwnProperty('icon')
+ ? opts.icon
+ : '\ue9cb'; // Accepts characters (and also URLs?), like '#', '¶', '❡', or '§'.
+ this.options.visible = this.options.hasOwnProperty('visible')
+ ? opts.visible
+ : 'hover'; // Also accepts 'always'
+ this.options.placement = this.options.hasOwnProperty('placement')
+ ? opts.placement
+ : 'right'; // Also accepts 'left'
+ this.options.class = this.options.hasOwnProperty('class') ? opts.class : ''; // Accepts any class name.
+ };
+
+ this._applyRemainingDefaultOptions(options);
+
+ this.add = function(selector) {
+ var elements,
+ elsWithIds,
+ idList,
+ elementID,
+ i,
+ roughText,
+ tidyText,
+ index,
+ count,
+ newTidyText,
+ readableID,
+ anchor;
+
+ this._applyRemainingDefaultOptions(this.options);
+
+ // Provide a sensible default selector, if none is given.
+ if (!selector) {
+ selector = 'h1, h2, h3, h4, h5, h6';
+ } else if (typeof selector !== 'string') {
+ throw new Error('The selector provided to AnchorJS was invalid.');
+ }
+
+ elements = document.querySelectorAll(selector);
+ if (elements.length === 0) {
+ return false;
+ }
+
+ this._addBaselineStyles();
+
+ // We produce a list of existing IDs so we don't generate a duplicate.
+ elsWithIds = document.querySelectorAll('[id]');
+ idList = [].map.call(elsWithIds, function assign(el) {
+ return el.id;
+ });
+
+ for (i = 0; i < elements.length; i++) {
+ if (elements[i].hasAttribute('id')) {
+ elementID = elements[i].getAttribute('id');
+ } else {
+ roughText = elements[i].textContent;
+
+ // Refine it so it makes a good ID. Strip out non-safe characters, replace
+ // spaces with hyphens, truncate to 32 characters, and make toLowerCase.
+ //
+ // Example string: // '⚡⚡⚡ Unicode icons are cool--but they definitely don't belong in a URL fragment.'
+ tidyText = roughText
+ .replace(/[^\w\s-]/gi, '') // ' Unicode icons are cool--but they definitely dont belong in a URL fragment'
+ .replace(/\s+/g, '-') // '-Unicode-icons-are-cool--but-they-definitely-dont-belong-in-a-URL-fragment'
+ .replace(/-{2,}/g, '-') // '-Unicode-icons-are-cool-but-they-definitely-dont-belong-in-a-URL-fragment'
+ .substring(0, 64) // '-Unicode-icons-are-cool-but-they-definitely-dont-belong-in-a-URL'
+ .replace(/^-+|-+$/gm, '') // 'Unicode-icons-are-cool-but-they-definitely-dont-belong-in-a-URL'
+ .toLowerCase(); // 'unicode-icons-are-cool-but-they-definitely-dont-belong-in-a-url'
+
+ // Compare our generated ID to existing IDs (and increment it if needed)
+ // before we add it to the page.
+ newTidyText = tidyText;
+ count = 0;
+ do {
+ if (index !== undefined) {
+ newTidyText = tidyText + '-' + count;
+ }
+ // .indexOf is supported in IE9+.
+ index = idList.indexOf(newTidyText);
+ count += 1;
+ } while (index !== -1);
+ index = undefined;
+ idList.push(newTidyText);
+
+ // Assign it to our element.
+ // Currently the setAttribute element is only supported in IE9 and above.
+ elements[i].setAttribute('id', newTidyText);
+
+ elementID = newTidyText;
+ }
+
+ readableID = elementID.replace(/-/g, ' ');
+
+ // The following code builds the following DOM structure in a more effiecient (albeit opaque) way.
+ // '';
+ anchor = document.createElement('a');
+ anchor.className = 'anchorjs-link ' + this.options.class;
+ anchor.href = '#' + elementID;
+ anchor.setAttribute('aria-label', 'Anchor link for: ' + readableID);
+ anchor.setAttribute('data-anchorjs-icon', this.options.icon);
+
+ if (this.options.visible === 'always') {
+ anchor.style.opacity = '1';
+ }
+
+ if (this.options.icon === '\ue9cb') {
+ anchor.style.fontFamily = 'anchorjs-icons';
+ anchor.style.fontStyle = 'normal';
+ anchor.style.fontVariant = 'normal';
+ anchor.style.fontWeight = 'normal';
+ anchor.style.lineHeight = 1;
+ }
+
+ if (this.options.placement === 'left') {
+ anchor.style.position = 'absolute';
+ anchor.style.marginLeft = '-1em';
+ anchor.style.paddingRight = '0.5em';
+ elements[i].insertBefore(anchor, elements[i].firstChild);
+ } else {
+ // if the option provided is `right` (or anything else).
+ anchor.style.paddingLeft = '0.375em';
+ elements[i].appendChild(anchor);
+ }
+ }
+
+ return this;
+ };
+
+ this.remove = function(selector) {
+ var domAnchor, elements = document.querySelectorAll(selector);
+ for (var i = 0; i < elements.length; i++) {
+ domAnchor = elements[i].querySelector('.anchorjs-link');
+ if (domAnchor) {
+ elements[i].removeChild(domAnchor);
+ }
+ }
+ return this;
+ };
+
+ this._addBaselineStyles = function() {
+ // We don't want to add global baseline styles if they've been added before.
+ if (document.head.querySelector('style.anchorjs') !== null) {
+ return;
+ }
+
+ var style = document.createElement('style'),
+ linkRule = ' .anchorjs-link {' +
+ ' opacity: 0;' +
+ ' text-decoration: none;' +
+ ' -webkit-font-smoothing: antialiased;' +
+ ' -moz-osx-font-smoothing: grayscale;' +
+ ' }',
+ hoverRule = ' *:hover > .anchorjs-link,' +
+ ' .anchorjs-link:focus {' +
+ ' opacity: 1;' +
+ ' }',
+ anchorjsLinkFontFace = ' @font-face {' +
+ ' font-family: "anchorjs-icons";' +
+ ' font-style: normal;' +
+ ' font-weight: normal;' + // Icon from icomoon; 10px wide & 10px tall; 2 empty below & 4 above
+ ' src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBTUAAAC8AAAAYGNtYXAWi9QdAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zgq29TcAAAF4AAABNGhlYWQEZM3pAAACrAAAADZoaGVhBhUDxgAAAuQAAAAkaG10eASAADEAAAMIAAAAFGxvY2EAKACuAAADHAAAAAxtYXhwAAgAVwAAAygAAAAgbmFtZQ5yJ3cAAANIAAAB2nBvc3QAAwAAAAAFJAAAACAAAwJAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpywPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6cv//f//AAAAAAAg6cv//f//AAH/4xY5AAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACADEARAJTAsAAKwBUAAABIiYnJjQ/AT4BMzIWFxYUDwEGIicmND8BNjQnLgEjIgYPAQYUFxYUBw4BIwciJicmND8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFA8BDgEjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAEAAAABAACiToc1Xw889QALBAAAAAAA0XnFFgAAAADRecUWAAAAAAJTAsAAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAAlMAAQAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAACAAAAAoAAMQAAAAAACgAUAB4AmgABAAAABQBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIABwCfAAEAAAAAAAMADgBLAAEAAAAAAAQADgC0AAEAAAAAAAUACwAqAAEAAAAAAAYADgB1AAEAAAAAAAoAGgDeAAMAAQQJAAEAHAAOAAMAAQQJAAIADgCmAAMAAQQJAAMAHABZAAMAAQQJAAQAHADCAAMAAQQJAAUAFgA1AAMAAQQJAAYAHACDAAMAAQQJAAoANAD4YW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format("truetype");' +
+ ' }',
+ pseudoElContent = ' [data-anchorjs-icon]::after {' +
+ ' content: attr(data-anchorjs-icon);' +
+ ' }',
+ firstStyleEl;
+
+ style.className = 'anchorjs';
+ style.appendChild(document.createTextNode('')); // Necessary for Webkit.
+
+ // We place it in the head with the other style tags, if possible, so as to
+ // not look out of place. We insert before the others so these styles can be
+ // overridden if necessary.
+ firstStyleEl = document.head.querySelector('[rel="stylesheet"], style');
+ if (firstStyleEl === undefined) {
+ document.head.appendChild(style);
+ } else {
+ document.head.insertBefore(style, firstStyleEl);
+ }
+
+ style.sheet.insertRule(linkRule, style.sheet.cssRules.length);
+ style.sheet.insertRule(hoverRule, style.sheet.cssRules.length);
+ style.sheet.insertRule(pseudoElContent, style.sheet.cssRules.length);
+ style.sheet.insertRule(anchorjsLinkFontFace, style.sheet.cssRules.length);
+ };
+}
+
+var anchors = new AnchorJS();
diff --git a/docs/assets/bass-addons.css b/docs/assets/bass-addons.css
new file mode 100644
index 0000000..c27e96d
--- /dev/null
+++ b/docs/assets/bass-addons.css
@@ -0,0 +1,12 @@
+.input {
+ font-family: inherit;
+ display: block;
+ width: 100%;
+ height: 2rem;
+ padding: .5rem;
+ margin-bottom: 1rem;
+ border: 1px solid #ccc;
+ font-size: .875rem;
+ border-radius: 3px;
+ box-sizing: border-box;
+}
diff --git a/docs/assets/bass.css b/docs/assets/bass.css
new file mode 100644
index 0000000..15e0dc9
--- /dev/null
+++ b/docs/assets/bass.css
@@ -0,0 +1,543 @@
+/*! Basscss | http://basscss.com | MIT License */
+
+.h1{ font-size: 2rem }
+.h2{ font-size: 1.5rem }
+.h3{ font-size: 1.25rem }
+.h4{ font-size: 1rem }
+.h5{ font-size: .875rem }
+.h6{ font-size: .75rem }
+
+.font-family-inherit{ font-family:inherit }
+.font-size-inherit{ font-size:inherit }
+.text-decoration-none{ text-decoration:none }
+
+.bold{ font-weight: bold; font-weight: bold }
+.regular{ font-weight:normal }
+.italic{ font-style:italic }
+.caps{ text-transform:uppercase; letter-spacing: .2em; }
+
+.left-align{ text-align:left }
+.center{ text-align:center }
+.right-align{ text-align:right }
+.justify{ text-align:justify }
+
+.nowrap{ white-space:nowrap }
+.break-word{ word-wrap:break-word }
+
+.line-height-1{ line-height: 1 }
+.line-height-2{ line-height: 1.125 }
+.line-height-3{ line-height: 1.25 }
+.line-height-4{ line-height: 1.5 }
+
+.list-style-none{ list-style:none }
+.underline{ text-decoration:underline }
+
+.truncate{
+ max-width:100%;
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:nowrap;
+}
+
+.list-reset{
+ list-style:none;
+ padding-left:0;
+}
+
+.inline{ display:inline }
+.block{ display:block }
+.inline-block{ display:inline-block }
+.table{ display:table }
+.table-cell{ display:table-cell }
+
+.overflow-hidden{ overflow:hidden }
+.overflow-scroll{ overflow:scroll }
+.overflow-auto{ overflow:auto }
+
+.clearfix:before,
+.clearfix:after{
+ content:" ";
+ display:table
+}
+.clearfix:after{ clear:both }
+
+.left{ float:left }
+.right{ float:right }
+
+.fit{ max-width:100% }
+
+.max-width-1{ max-width: 24rem }
+.max-width-2{ max-width: 32rem }
+.max-width-3{ max-width: 48rem }
+.max-width-4{ max-width: 64rem }
+
+.border-box{ box-sizing:border-box }
+
+.align-baseline{ vertical-align:baseline }
+.align-top{ vertical-align:top }
+.align-middle{ vertical-align:middle }
+.align-bottom{ vertical-align:bottom }
+
+.m0{ margin:0 }
+.mt0{ margin-top:0 }
+.mr0{ margin-right:0 }
+.mb0{ margin-bottom:0 }
+.ml0{ margin-left:0 }
+.mx0{ margin-left:0; margin-right:0 }
+.my0{ margin-top:0; margin-bottom:0 }
+
+.m1{ margin: .5rem }
+.mt1{ margin-top: .5rem }
+.mr1{ margin-right: .5rem }
+.mb1{ margin-bottom: .5rem }
+.ml1{ margin-left: .5rem }
+.mx1{ margin-left: .5rem; margin-right: .5rem }
+.my1{ margin-top: .5rem; margin-bottom: .5rem }
+
+.m2{ margin: 1rem }
+.mt2{ margin-top: 1rem }
+.mr2{ margin-right: 1rem }
+.mb2{ margin-bottom: 1rem }
+.ml2{ margin-left: 1rem }
+.mx2{ margin-left: 1rem; margin-right: 1rem }
+.my2{ margin-top: 1rem; margin-bottom: 1rem }
+
+.m3{ margin: 2rem }
+.mt3{ margin-top: 2rem }
+.mr3{ margin-right: 2rem }
+.mb3{ margin-bottom: 2rem }
+.ml3{ margin-left: 2rem }
+.mx3{ margin-left: 2rem; margin-right: 2rem }
+.my3{ margin-top: 2rem; margin-bottom: 2rem }
+
+.m4{ margin: 4rem }
+.mt4{ margin-top: 4rem }
+.mr4{ margin-right: 4rem }
+.mb4{ margin-bottom: 4rem }
+.ml4{ margin-left: 4rem }
+.mx4{ margin-left: 4rem; margin-right: 4rem }
+.my4{ margin-top: 4rem; margin-bottom: 4rem }
+
+.mxn1{ margin-left: -.5rem; margin-right: -.5rem; }
+.mxn2{ margin-left: -1rem; margin-right: -1rem; }
+.mxn3{ margin-left: -2rem; margin-right: -2rem; }
+.mxn4{ margin-left: -4rem; margin-right: -4rem; }
+
+.ml-auto{ margin-left:auto }
+.mr-auto{ margin-right:auto }
+.mx-auto{ margin-left:auto; margin-right:auto; }
+
+.p0{ padding:0 }
+.pt0{ padding-top:0 }
+.pr0{ padding-right:0 }
+.pb0{ padding-bottom:0 }
+.pl0{ padding-left:0 }
+.px0{ padding-left:0; padding-right:0 }
+.py0{ padding-top:0; padding-bottom:0 }
+
+.p1{ padding: .5rem }
+.pt1{ padding-top: .5rem }
+.pr1{ padding-right: .5rem }
+.pb1{ padding-bottom: .5rem }
+.pl1{ padding-left: .5rem }
+.py1{ padding-top: .5rem; padding-bottom: .5rem }
+.px1{ padding-left: .5rem; padding-right: .5rem }
+
+.p2{ padding: 1rem }
+.pt2{ padding-top: 1rem }
+.pr2{ padding-right: 1rem }
+.pb2{ padding-bottom: 1rem }
+.pl2{ padding-left: 1rem }
+.py2{ padding-top: 1rem; padding-bottom: 1rem }
+.px2{ padding-left: 1rem; padding-right: 1rem }
+
+.p3{ padding: 2rem }
+.pt3{ padding-top: 2rem }
+.pr3{ padding-right: 2rem }
+.pb3{ padding-bottom: 2rem }
+.pl3{ padding-left: 2rem }
+.py3{ padding-top: 2rem; padding-bottom: 2rem }
+.px3{ padding-left: 2rem; padding-right: 2rem }
+
+.p4{ padding: 4rem }
+.pt4{ padding-top: 4rem }
+.pr4{ padding-right: 4rem }
+.pb4{ padding-bottom: 4rem }
+.pl4{ padding-left: 4rem }
+.py4{ padding-top: 4rem; padding-bottom: 4rem }
+.px4{ padding-left: 4rem; padding-right: 4rem }
+
+.col{
+ float:left;
+ box-sizing:border-box;
+}
+
+.col-right{
+ float:right;
+ box-sizing:border-box;
+}
+
+.col-1{
+ width:8.33333%;
+}
+
+.col-2{
+ width:16.66667%;
+}
+
+.col-3{
+ width:25%;
+}
+
+.col-4{
+ width:33.33333%;
+}
+
+.col-5{
+ width:41.66667%;
+}
+
+.col-6{
+ width:50%;
+}
+
+.col-7{
+ width:58.33333%;
+}
+
+.col-8{
+ width:66.66667%;
+}
+
+.col-9{
+ width:75%;
+}
+
+.col-10{
+ width:83.33333%;
+}
+
+.col-11{
+ width:91.66667%;
+}
+
+.col-12{
+ width:100%;
+}
+@media (min-width: 40em){
+
+ .sm-col{
+ float:left;
+ box-sizing:border-box;
+ }
+
+ .sm-col-right{
+ float:right;
+ box-sizing:border-box;
+ }
+
+ .sm-col-1{
+ width:8.33333%;
+ }
+
+ .sm-col-2{
+ width:16.66667%;
+ }
+
+ .sm-col-3{
+ width:25%;
+ }
+
+ .sm-col-4{
+ width:33.33333%;
+ }
+
+ .sm-col-5{
+ width:41.66667%;
+ }
+
+ .sm-col-6{
+ width:50%;
+ }
+
+ .sm-col-7{
+ width:58.33333%;
+ }
+
+ .sm-col-8{
+ width:66.66667%;
+ }
+
+ .sm-col-9{
+ width:75%;
+ }
+
+ .sm-col-10{
+ width:83.33333%;
+ }
+
+ .sm-col-11{
+ width:91.66667%;
+ }
+
+ .sm-col-12{
+ width:100%;
+ }
+
+}
+@media (min-width: 52em){
+
+ .md-col{
+ float:left;
+ box-sizing:border-box;
+ }
+
+ .md-col-right{
+ float:right;
+ box-sizing:border-box;
+ }
+
+ .md-col-1{
+ width:8.33333%;
+ }
+
+ .md-col-2{
+ width:16.66667%;
+ }
+
+ .md-col-3{
+ width:25%;
+ }
+
+ .md-col-4{
+ width:33.33333%;
+ }
+
+ .md-col-5{
+ width:41.66667%;
+ }
+
+ .md-col-6{
+ width:50%;
+ }
+
+ .md-col-7{
+ width:58.33333%;
+ }
+
+ .md-col-8{
+ width:66.66667%;
+ }
+
+ .md-col-9{
+ width:75%;
+ }
+
+ .md-col-10{
+ width:83.33333%;
+ }
+
+ .md-col-11{
+ width:91.66667%;
+ }
+
+ .md-col-12{
+ width:100%;
+ }
+
+}
+@media (min-width: 64em){
+
+ .lg-col{
+ float:left;
+ box-sizing:border-box;
+ }
+
+ .lg-col-right{
+ float:right;
+ box-sizing:border-box;
+ }
+
+ .lg-col-1{
+ width:8.33333%;
+ }
+
+ .lg-col-2{
+ width:16.66667%;
+ }
+
+ .lg-col-3{
+ width:25%;
+ }
+
+ .lg-col-4{
+ width:33.33333%;
+ }
+
+ .lg-col-5{
+ width:41.66667%;
+ }
+
+ .lg-col-6{
+ width:50%;
+ }
+
+ .lg-col-7{
+ width:58.33333%;
+ }
+
+ .lg-col-8{
+ width:66.66667%;
+ }
+
+ .lg-col-9{
+ width:75%;
+ }
+
+ .lg-col-10{
+ width:83.33333%;
+ }
+
+ .lg-col-11{
+ width:91.66667%;
+ }
+
+ .lg-col-12{
+ width:100%;
+ }
+
+}
+.flex{ display:-webkit-box; display:-webkit-flex; display:-ms-flexbox; display:flex }
+
+@media (min-width: 40em){
+ .sm-flex{ display:-webkit-box; display:-webkit-flex; display:-ms-flexbox; display:flex }
+}
+
+@media (min-width: 52em){
+ .md-flex{ display:-webkit-box; display:-webkit-flex; display:-ms-flexbox; display:flex }
+}
+
+@media (min-width: 64em){
+ .lg-flex{ display:-webkit-box; display:-webkit-flex; display:-ms-flexbox; display:flex }
+}
+
+.flex-column{ -webkit-box-orient:vertical; -webkit-box-direction:normal; -webkit-flex-direction:column; -ms-flex-direction:column; flex-direction:column }
+.flex-wrap{ -webkit-flex-wrap:wrap; -ms-flex-wrap:wrap; flex-wrap:wrap }
+
+.items-start{ -webkit-box-align:start; -webkit-align-items:flex-start; -ms-flex-align:start; -ms-grid-row-align:flex-start; align-items:flex-start }
+.items-end{ -webkit-box-align:end; -webkit-align-items:flex-end; -ms-flex-align:end; -ms-grid-row-align:flex-end; align-items:flex-end }
+.items-center{ -webkit-box-align:center; -webkit-align-items:center; -ms-flex-align:center; -ms-grid-row-align:center; align-items:center }
+.items-baseline{ -webkit-box-align:baseline; -webkit-align-items:baseline; -ms-flex-align:baseline; -ms-grid-row-align:baseline; align-items:baseline }
+.items-stretch{ -webkit-box-align:stretch; -webkit-align-items:stretch; -ms-flex-align:stretch; -ms-grid-row-align:stretch; align-items:stretch }
+
+.self-start{ -webkit-align-self:flex-start; -ms-flex-item-align:start; align-self:flex-start }
+.self-end{ -webkit-align-self:flex-end; -ms-flex-item-align:end; align-self:flex-end }
+.self-center{ -webkit-align-self:center; -ms-flex-item-align:center; align-self:center }
+.self-baseline{ -webkit-align-self:baseline; -ms-flex-item-align:baseline; align-self:baseline }
+.self-stretch{ -webkit-align-self:stretch; -ms-flex-item-align:stretch; align-self:stretch }
+
+.justify-start{ -webkit-box-pack:start; -webkit-justify-content:flex-start; -ms-flex-pack:start; justify-content:flex-start }
+.justify-end{ -webkit-box-pack:end; -webkit-justify-content:flex-end; -ms-flex-pack:end; justify-content:flex-end }
+.justify-center{ -webkit-box-pack:center; -webkit-justify-content:center; -ms-flex-pack:center; justify-content:center }
+.justify-between{ -webkit-box-pack:justify; -webkit-justify-content:space-between; -ms-flex-pack:justify; justify-content:space-between }
+.justify-around{ -webkit-justify-content:space-around; -ms-flex-pack:distribute; justify-content:space-around }
+
+.content-start{ -webkit-align-content:flex-start; -ms-flex-line-pack:start; align-content:flex-start }
+.content-end{ -webkit-align-content:flex-end; -ms-flex-line-pack:end; align-content:flex-end }
+.content-center{ -webkit-align-content:center; -ms-flex-line-pack:center; align-content:center }
+.content-between{ -webkit-align-content:space-between; -ms-flex-line-pack:justify; align-content:space-between }
+.content-around{ -webkit-align-content:space-around; -ms-flex-line-pack:distribute; align-content:space-around }
+.content-stretch{ -webkit-align-content:stretch; -ms-flex-line-pack:stretch; align-content:stretch }
+.flex-auto{
+ -webkit-box-flex:1;
+ -webkit-flex:1 1 auto;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto;
+ min-width:0;
+ min-height:0;
+}
+.flex-none{ -webkit-box-flex:0; -webkit-flex:none; -ms-flex:none; flex:none }
+
+.order-0{ -webkit-box-ordinal-group:1; -webkit-order:0; -ms-flex-order:0; order:0 }
+.order-1{ -webkit-box-ordinal-group:2; -webkit-order:1; -ms-flex-order:1; order:1 }
+.order-2{ -webkit-box-ordinal-group:3; -webkit-order:2; -ms-flex-order:2; order:2 }
+.order-3{ -webkit-box-ordinal-group:4; -webkit-order:3; -ms-flex-order:3; order:3 }
+.order-last{ -webkit-box-ordinal-group:100000; -webkit-order:99999; -ms-flex-order:99999; order:99999 }
+
+.relative{ position:relative }
+.absolute{ position:absolute }
+.fixed{ position:fixed }
+
+.top-0{ top:0 }
+.right-0{ right:0 }
+.bottom-0{ bottom:0 }
+.left-0{ left:0 }
+
+.z1{ z-index: 1 }
+.z2{ z-index: 2 }
+.z3{ z-index: 3 }
+.z4{ z-index: 4 }
+
+.border{
+ border-style:solid;
+ border-width: 1px;
+}
+
+.border-top{
+ border-top-style:solid;
+ border-top-width: 1px;
+}
+
+.border-right{
+ border-right-style:solid;
+ border-right-width: 1px;
+}
+
+.border-bottom{
+ border-bottom-style:solid;
+ border-bottom-width: 1px;
+}
+
+.border-left{
+ border-left-style:solid;
+ border-left-width: 1px;
+}
+
+.border-none{ border:0 }
+
+.rounded{ border-radius: 3px }
+.circle{ border-radius:50% }
+
+.rounded-top{ border-radius: 3px 3px 0 0 }
+.rounded-right{ border-radius: 0 3px 3px 0 }
+.rounded-bottom{ border-radius: 0 0 3px 3px }
+.rounded-left{ border-radius: 3px 0 0 3px }
+
+.not-rounded{ border-radius:0 }
+
+.hide{
+ position:absolute !important;
+ height:1px;
+ width:1px;
+ overflow:hidden;
+ clip:rect(1px, 1px, 1px, 1px);
+}
+
+@media (max-width: 40em){
+ .xs-hide{ display:none !important }
+}
+
+@media (min-width: 40em) and (max-width: 52em){
+ .sm-hide{ display:none !important }
+}
+
+@media (min-width: 52em) and (max-width: 64em){
+ .md-hide{ display:none !important }
+}
+
+@media (min-width: 64em){
+ .lg-hide{ display:none !important }
+}
+
+.display-none{ display:none !important }
+
diff --git a/docs/assets/fonts/EOT/SourceCodePro-Bold.eot b/docs/assets/fonts/EOT/SourceCodePro-Bold.eot
new file mode 100755
index 0000000..d24cc39
Binary files /dev/null and b/docs/assets/fonts/EOT/SourceCodePro-Bold.eot differ
diff --git a/docs/assets/fonts/EOT/SourceCodePro-Regular.eot b/docs/assets/fonts/EOT/SourceCodePro-Regular.eot
new file mode 100755
index 0000000..09e9473
Binary files /dev/null and b/docs/assets/fonts/EOT/SourceCodePro-Regular.eot differ
diff --git a/docs/assets/fonts/LICENSE.txt b/docs/assets/fonts/LICENSE.txt
new file mode 100755
index 0000000..1177330
--- /dev/null
+++ b/docs/assets/fonts/LICENSE.txt
@@ -0,0 +1,93 @@
+Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/docs/assets/fonts/OTF/SourceCodePro-Bold.otf b/docs/assets/fonts/OTF/SourceCodePro-Bold.otf
new file mode 100755
index 0000000..f4e576c
Binary files /dev/null and b/docs/assets/fonts/OTF/SourceCodePro-Bold.otf differ
diff --git a/docs/assets/fonts/OTF/SourceCodePro-Regular.otf b/docs/assets/fonts/OTF/SourceCodePro-Regular.otf
new file mode 100755
index 0000000..4e3b9d0
Binary files /dev/null and b/docs/assets/fonts/OTF/SourceCodePro-Regular.otf differ
diff --git a/docs/assets/fonts/TTF/SourceCodePro-Bold.ttf b/docs/assets/fonts/TTF/SourceCodePro-Bold.ttf
new file mode 100755
index 0000000..e0c576f
Binary files /dev/null and b/docs/assets/fonts/TTF/SourceCodePro-Bold.ttf differ
diff --git a/docs/assets/fonts/TTF/SourceCodePro-Regular.ttf b/docs/assets/fonts/TTF/SourceCodePro-Regular.ttf
new file mode 100755
index 0000000..437f472
Binary files /dev/null and b/docs/assets/fonts/TTF/SourceCodePro-Regular.ttf differ
diff --git a/docs/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff b/docs/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff
new file mode 100755
index 0000000..cf96099
Binary files /dev/null and b/docs/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff differ
diff --git a/docs/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff b/docs/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff
new file mode 100755
index 0000000..395436e
Binary files /dev/null and b/docs/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff differ
diff --git a/docs/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff b/docs/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff
new file mode 100755
index 0000000..c65ba84
Binary files /dev/null and b/docs/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff differ
diff --git a/docs/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff b/docs/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff
new file mode 100755
index 0000000..0af792a
Binary files /dev/null and b/docs/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff differ
diff --git a/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 b/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2
new file mode 100755
index 0000000..cbe3835
Binary files /dev/null and b/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 differ
diff --git a/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 b/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2
new file mode 100755
index 0000000..65cd591
Binary files /dev/null and b/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 differ
diff --git a/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 b/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2
new file mode 100755
index 0000000..b78d523
Binary files /dev/null and b/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 differ
diff --git a/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 b/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2
new file mode 100755
index 0000000..18d2199
Binary files /dev/null and b/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 differ
diff --git a/docs/assets/fonts/source-code-pro.css b/docs/assets/fonts/source-code-pro.css
new file mode 100755
index 0000000..3abb4f0
--- /dev/null
+++ b/docs/assets/fonts/source-code-pro.css
@@ -0,0 +1,23 @@
+@font-face{
+ font-family: 'Source Code Pro';
+ font-weight: 400;
+ font-style: normal;
+ font-stretch: normal;
+ src: url('EOT/SourceCodePro-Regular.eot') format('embedded-opentype'),
+ url('WOFF2/TTF/SourceCodePro-Regular.ttf.woff2') format('woff2'),
+ url('WOFF/OTF/SourceCodePro-Regular.otf.woff') format('woff'),
+ url('OTF/SourceCodePro-Regular.otf') format('opentype'),
+ url('TTF/SourceCodePro-Regular.ttf') format('truetype');
+}
+
+@font-face{
+ font-family: 'Source Code Pro';
+ font-weight: 700;
+ font-style: normal;
+ font-stretch: normal;
+ src: url('EOT/SourceCodePro-Bold.eot') format('embedded-opentype'),
+ url('WOFF2/TTF/SourceCodePro-Bold.ttf.woff2') format('woff2'),
+ url('WOFF/OTF/SourceCodePro-Bold.otf.woff') format('woff'),
+ url('OTF/SourceCodePro-Bold.otf') format('opentype'),
+ url('TTF/SourceCodePro-Bold.ttf') format('truetype');
+}
diff --git a/docs/assets/github.css b/docs/assets/github.css
new file mode 100644
index 0000000..8852abb
--- /dev/null
+++ b/docs/assets/github.css
@@ -0,0 +1,123 @@
+/*
+
+github.com style (c) Vasily Polovnyov
+
+*/
+
+.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ color: #333;
+ background: #f8f8f8;
+ -webkit-text-size-adjust: none;
+}
+
+.hljs-comment,
+.diff .hljs-header,
+.hljs-javadoc {
+ color: #998;
+ font-style: italic;
+}
+
+.hljs-keyword,
+.css .rule .hljs-keyword,
+.hljs-winutils,
+.nginx .hljs-title,
+.hljs-subst,
+.hljs-request,
+.hljs-status {
+ color: #1184CE;
+}
+
+.hljs-number,
+.hljs-hexcolor,
+.ruby .hljs-constant {
+ color: #ed225d;
+}
+
+.hljs-string,
+.hljs-tag .hljs-value,
+.hljs-phpdoc,
+.hljs-dartdoc,
+.tex .hljs-formula {
+ color: #ed225d;
+}
+
+.hljs-title,
+.hljs-id,
+.scss .hljs-preprocessor {
+ color: #900;
+ font-weight: bold;
+}
+
+.hljs-list .hljs-keyword,
+.hljs-subst {
+ font-weight: normal;
+}
+
+.hljs-class .hljs-title,
+.hljs-type,
+.vhdl .hljs-literal,
+.tex .hljs-command {
+ color: #458;
+ font-weight: bold;
+}
+
+.hljs-tag,
+.hljs-tag .hljs-title,
+.hljs-rules .hljs-property,
+.django .hljs-tag .hljs-keyword {
+ color: #000080;
+ font-weight: normal;
+}
+
+.hljs-attribute,
+.hljs-variable,
+.lisp .hljs-body {
+ color: #008080;
+}
+
+.hljs-regexp {
+ color: #009926;
+}
+
+.hljs-symbol,
+.ruby .hljs-symbol .hljs-string,
+.lisp .hljs-keyword,
+.clojure .hljs-keyword,
+.scheme .hljs-keyword,
+.tex .hljs-special,
+.hljs-prompt {
+ color: #990073;
+}
+
+.hljs-built_in {
+ color: #0086b3;
+}
+
+.hljs-preprocessor,
+.hljs-pragma,
+.hljs-pi,
+.hljs-doctype,
+.hljs-shebang,
+.hljs-cdata {
+ color: #999;
+ font-weight: bold;
+}
+
+.hljs-deletion {
+ background: #fdd;
+}
+
+.hljs-addition {
+ background: #dfd;
+}
+
+.diff .hljs-change {
+ background: #0086b3;
+}
+
+.hljs-chunk {
+ color: #aaa;
+}
diff --git a/docs/assets/site.js b/docs/assets/site.js
new file mode 100644
index 0000000..55ada03
--- /dev/null
+++ b/docs/assets/site.js
@@ -0,0 +1,110 @@
+/* global anchors */
+
+// add anchor links to headers
+anchors.options.placement = 'left';
+anchors.add('h3');
+
+// Filter UI
+var tocElements = document.getElementById('toc').getElementsByTagName('li');
+
+document.getElementById('filter-input').addEventListener('keyup', function(e) {
+ var i, element, children;
+
+ // enter key
+ if (e.keyCode === 13) {
+ // go to the first displayed item in the toc
+ for (i = 0; i < tocElements.length; i++) {
+ element = tocElements[i];
+ if (!element.classList.contains('display-none')) {
+ location.replace(element.firstChild.href);
+ return e.preventDefault();
+ }
+ }
+ }
+
+ var match = function() {
+ return true;
+ };
+
+ var value = this.value.toLowerCase();
+
+ if (!value.match(/^\s*$/)) {
+ match = function(element) {
+ return element.firstChild.innerHTML.toLowerCase().indexOf(value) !== -1;
+ };
+ }
+
+ for (i = 0; i < tocElements.length; i++) {
+ element = tocElements[i];
+ children = Array.from(element.getElementsByTagName('li'));
+ if (match(element) || children.some(match)) {
+ element.classList.remove('display-none');
+ } else {
+ element.classList.add('display-none');
+ }
+ }
+});
+
+var toggles = document.getElementsByClassName('toggle-step-sibling');
+for (var i = 0; i < toggles.length; i++) {
+ toggles[i].addEventListener('click', toggleStepSibling);
+}
+
+function toggleStepSibling() {
+ var stepSibling = this.parentNode.parentNode.parentNode.getElementsByClassName(
+ 'toggle-target'
+ )[0];
+ var klass = 'display-none';
+ if (stepSibling.classList.contains(klass)) {
+ stepSibling.classList.remove(klass);
+ stepSibling.innerHTML = '▾';
+ } else {
+ stepSibling.classList.add(klass);
+ stepSibling.innerHTML = '▸';
+ }
+}
+
+var items = document.getElementsByClassName('toggle-sibling');
+for (var j = 0; j < items.length; j++) {
+ items[j].addEventListener('click', toggleSibling);
+}
+
+function toggleSibling() {
+ var stepSibling = this.parentNode.getElementsByClassName('toggle-target')[0];
+ var icon = this.getElementsByClassName('icon')[0];
+ var klass = 'display-none';
+ if (stepSibling.classList.contains(klass)) {
+ stepSibling.classList.remove(klass);
+ icon.innerHTML = '▾';
+ } else {
+ stepSibling.classList.add(klass);
+ icon.innerHTML = '▸';
+ }
+}
+
+function showHashTarget(targetId) {
+ var hashTarget = document.getElementById(targetId);
+ // new target is hidden
+ if (
+ hashTarget &&
+ hashTarget.offsetHeight === 0 &&
+ hashTarget.parentNode.parentNode.classList.contains('display-none')
+ ) {
+ hashTarget.parentNode.parentNode.classList.remove('display-none');
+ }
+}
+
+window.addEventListener('hashchange', function() {
+ showHashTarget(location.hash.substring(1));
+});
+
+showHashTarget(location.hash.substring(1));
+
+var toclinks = document.getElementsByClassName('pre-open');
+for (var k = 0; k < toclinks.length; k++) {
+ toclinks[k].addEventListener('mousedown', preOpen, false);
+}
+
+function preOpen() {
+ showHashTarget(this.hash.substring(1));
+}
diff --git a/docs/assets/style.css b/docs/assets/style.css
new file mode 100644
index 0000000..d7e56e0
--- /dev/null
+++ b/docs/assets/style.css
@@ -0,0 +1,136 @@
+.documentation {
+ font-family: Helvetica, sans-serif;
+ color: #666;
+ line-height: 1.5;
+ background: #f5f5f5;
+}
+
+.black {
+ color: #666;
+}
+
+.bg-white {
+ background-color: #fff;
+}
+
+h4 {
+ margin: 20px 0 10px 0;
+}
+
+.documentation h3 {
+ color: #000;
+}
+
+.border-bottom {
+ border-color: #ddd;
+}
+
+a {
+ color: #1184CE;
+ text-decoration: none;
+}
+
+.documentation a[href]:hover {
+ text-decoration: underline;
+}
+
+a:hover {
+ cursor: pointer;
+}
+
+.py1-ul li {
+ padding: 5px 0;
+}
+
+.max-height-100 {
+ max-height: 100%;
+}
+
+section:target h3 {
+ font-weight:700;
+}
+
+.documentation td,
+.documentation th {
+ padding: .25rem .25rem;
+}
+
+h1:hover .anchorjs-link,
+h2:hover .anchorjs-link,
+h3:hover .anchorjs-link,
+h4:hover .anchorjs-link {
+ opacity: 1;
+}
+
+.fix-3 {
+ width: 25%;
+ max-width: 244px;
+}
+
+.fix-3 {
+ width: 25%;
+ max-width: 244px;
+}
+
+@media (min-width: 52em) {
+ .fix-margin-3 {
+ margin-left: 25%;
+ }
+}
+
+.pre, pre, code, .code {
+ font-family: Source Code Pro,Menlo,Consolas,Liberation Mono,monospace;
+ font-size: 14px;
+}
+
+.fill-light {
+ background: #F9F9F9;
+}
+
+.width2 {
+ width: 1rem;
+}
+
+.input {
+ font-family: inherit;
+ display: block;
+ width: 100%;
+ height: 2rem;
+ padding: .5rem;
+ margin-bottom: 1rem;
+ border: 1px solid #ccc;
+ font-size: .875rem;
+ border-radius: 3px;
+ box-sizing: border-box;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+.prose table th,
+.prose table td {
+ text-align: left;
+ padding:8px;
+ border:1px solid #ddd;
+}
+
+.prose table th:nth-child(1) { border-right: none; }
+.prose table th:nth-child(2) { border-left: none; }
+
+.prose table {
+ border:1px solid #ddd;
+}
+
+.prose-big {
+ font-size: 18px;
+ line-height: 30px;
+}
+
+.quiet {
+ opacity: 0.7;
+}
+
+.minishadow {
+ box-shadow: 2px 2px 10px #f3f3f3;
+}
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..3a8b243
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,41 @@
+
+
+
+
+ 2.0.1 | Documentation
+
+
+
+
+
+
+
+
+
+
+
diff --git a/makedocs.sh b/makedocs.sh
new file mode 100755
index 0000000..9f9fc56
--- /dev/null
+++ b/makedocs.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+
+documentation build include/shelf-pack.hpp \
+ --name shelf-pack-cpp \
+ --project-version 2.0.1 \
+ --polyglot --parseExtension=hpp \
+ --lint \
+ --github \
+ --format html \
+ --output docs/