diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..beccc5f
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,5 @@
+node_modules
+dist
+.idea
+src/assets/fabricator
+src/docs
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 0000000..2ca931c
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,6 @@
+{
+ "extends": ["airbnb-base", "plugin:prettier/recommended"],
+ "rules": {
+ "arrow-body-style": 0
+ }
+}
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..2125666
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index e67876a..67a5a93 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
node_modules
-
-
+.sass-cache
+.idea
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..c1a6f66
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,4 @@
+{
+ "singleQuote": true,
+ "trailingComma": "es5"
+}
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..2d3e75f
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,10 @@
+sudo: false
+language: node_js
+
+node_js:
+ - "8.14"
+
+notifications:
+ webhooks:
+ on_success: change
+ on_failure: always
diff --git a/LICENSE b/LICENSE
index 7faf2fb..d98ac7d 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,21 +1,8 @@
-MIT License
+The MIT License (MIT)
+Copyright (c) 2016 Luke Askew
-Copyright (c) 2019 Sunbird-Ed
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
index 55fcf6c..d8b4111 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,39 @@
-# sunbird-ui-components
-Repository of common Sunbird UI components which are used across all Sunbird apps
+[![GitHub release](https://img.shields.io/github/release/fbrctr/fabricator.svg)]()
+[![Build Status](https://travis-ci.org/fbrctr/fabricator.svg)](https://travis-ci.org/fbrctr/fabricator)
+[![devDependency Status](https://david-dm.org/fbrctr/fabricator/dev-status.svg)](https://david-dm.org/fbrctr/fabricator#info=devDependencies)
+[![Join the chat at https://gitter.im/fbrctr/fabricator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/fbrctr/fabricator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+
+
+
+
+# Fabricator
+
+> _fabricate_ - to make by assembling parts or sections.
+
+Fabricator is a tool for building website UI toolkits - _think ["Tiny Bootstraps, for Every Client"](http://daverupert.com/2013/04/responsive-deliverables/#tiny-bootstraps-for-every-client)_
+
+## Quick Start
+
+```shell
+$ curl -L https://github.com/fbrctr/fabricator/archive/master.tar.gz | tar zx --strip 1
+$ npm start
+```
+
+## Documentation
+
+#### [Read the docs →](http://fbrctr.github.io/docs)
+
+## Demo
+
+#### [Default Fabricator Instance →](http://fbrctr.github.io/demo)
+
+## Credits
+
+Created by [Luke Askew](http://twitter.com/lukeaskew).
+
+Logo by [Abby Putinski](https://abbyputinski.com/)
+
+## License
+
+[The MIT License (MIT)](http://opensource.org/licenses/mit-license.php)
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 0000000..e1ac1fd
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,15 @@
+module.exports = function babelConfig(api) {
+ api.cache.using(() => process.env.NODE_ENV === 'development');
+
+ return {
+ presets: [
+ [
+ '@babel/preset-env',
+ {
+ modules: false,
+ useBuiltIns: 'usage',
+ },
+ ],
+ ],
+ };
+};
diff --git a/dist/assets/default/scripts/c/codecopy.min.js b/dist/assets/default/scripts/c/codecopy.min.js
new file mode 100644
index 0000000..647d576
--- /dev/null
+++ b/dist/assets/default/scripts/c/codecopy.min.js
@@ -0,0 +1,2 @@
+!function(t,e){"object"===typeof exports&&"object"===typeof module?module.exports=e():"function"===typeof define&&define.amd?define([],e):"object"===typeof exports?exports.codecopy=e():t.codecopy=e()}(window,function(){return function(t){var e={};function n(o){if(e[o])return e[o].exports;var r=e[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=t,n.c=e,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:o})},n.r=function(t){Object.defineProperty(t,"__esModule",{value:!0})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=2)}([function(t,e,n){var o;o=function(){return function(t){var e={};function n(o){if(e[o])return e[o].exports;var r=e[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=t,n.c=e,n.i=function(t){return t},n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:o})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=3)}([function(t,e,n){var o,r,i;r=[t,n(7)],void 0===(i="function"===typeof(o=function(t,e){"use strict";var n,o=(n=e)&&n.__esModule?n:{default:n},r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,o.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,o.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==("undefined"===typeof t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),t}();t.exports=a})?o.apply(e,r):o)||(t.exports=i)},function(t,e,n){var o=n(6),r=n(5);t.exports=function(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!o.string(e))throw new TypeError("Second argument must be a String");if(!o.fn(n))throw new TypeError("Third argument must be a Function");if(o.node(t))return function(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}(t,e,n);if(o.nodeList(t))return function(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}(t,e,n);if(o.string(t))return function(t,e,n){return r(document.body,t,e,n)}(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"===typeof t.action?t.action:this.defaultAction,this.target="function"===typeof t.target?t.target:this.defaultTarget,this.text="function"===typeof t.text?t.text:this.defaultText,this.container="object"===u(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,a.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new r.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return f("action",t)}},{key:"defaultTarget",value:function(t){var e=f("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return f("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"===typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),e}(i.default);function f(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}t.exports=s})?o.apply(e,r):o)||(t.exports=i)},function(t,e){var n=9;if("undefined"!==typeof Element&&!Element.prototype.matches){var o=Element.prototype;o.matches=o.matchesSelector||o.mozMatchesSelector||o.msMatchesSelector||o.oMatchesSelector||o.webkitMatchesSelector}t.exports=function(t,e){for(;t&&t.nodeType!==n;){if("function"===typeof t.matches&&t.matches(e))return t;t=t.parentNode}}},function(t,e,n){var o=n(4);function r(t,e,n,r,i){var a=function(t,e,n,r){return function(n){n.delegateTarget=o(n.target,e),n.delegateTarget&&r.call(t,n)}}.apply(this,arguments);return t.addEventListener(n,a,i),{destroy:function(){t.removeEventListener(n,a,i)}}}t.exports=function(t,e,n,o,i){return"function"===typeof t.addEventListener?r.apply(null,arguments):"function"===typeof n?r.bind(null,document).apply(null,arguments):("string"===typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return r(t,e,n,o,i)}))}},function(t,e){e.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},e.nodeList=function(t){var n=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in t&&(0===t.length||e.node(t[0]))},e.string=function(t){return"string"===typeof t||t instanceof String},e.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},function(t,e){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}}])},t.exports=o()},function(t,e,n){var o=n(0);t.exports=function(t){document.querySelectorAll(t).forEach(function(t){var e=t.parentNode,n=document.createElement("div");e.replaceChild(n,t),n.appendChild(t),n.classList.add("codecopy"),n.firstChild.insertAdjacentHTML("beforebegin",'\n \n \n \n \n ')}),new o(".codecopy-btn",{target:function(t){return t.parentNode}}).on("success",function(t){t.trigger.setAttribute("aria-label","Copied!"),t.clearSelection()}),document.querySelectorAll(".codecopy-btn").forEach(function(t){t.addEventListener("mouseleave",function(t){t.target.setAttribute("aria-label","Copy to clipboard"),t.target.blur()}),t.addEventListener("click",function(t){t.preventDefault()})})}},function(t,e,n){t.exports=n(1)}])});
+//# sourceMappingURL=codecopy.min.js.map
\ No newline at end of file
diff --git a/dist/assets/default/styles/c/codecopy.min.css b/dist/assets/default/styles/c/codecopy.min.css
new file mode 100644
index 0000000..be8db60
--- /dev/null
+++ b/dist/assets/default/styles/c/codecopy.min.css
@@ -0,0 +1 @@
+.codecopy{overflow:visible}.codecopy,.codecopy .tooltipped{position:relative}.codecopy .tooltipped:after{z-index:2;padding:.5em .75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;-webkit-font-smoothing:subpixel-antialiased;color:#fff;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-wrap:break-word;white-space:pre;content:attr(aria-label);background:#1b1f23;border-radius:3px}.codecopy .tooltipped:after,.codecopy .tooltipped:before{position:absolute;display:none;pointer-events:none;opacity:0}.codecopy .tooltipped:before{z-index:3;width:0;height:0;color:#1b1f23;content:"";border:6px solid transparent}@keyframes a{0%{opacity:0}to{opacity:1}}.codecopy .tooltipped:active:after,.codecopy .tooltipped:active:before,.codecopy .tooltipped:focus:after,.codecopy .tooltipped:focus:before,.codecopy .tooltipped:hover:after,.codecopy .tooltipped:hover:before{display:inline-block;text-decoration:none;animation-name:a;animation-duration:.1s;animation-fill-mode:forwards;animation-timing-function:ease-in;animation-delay:.4s}.codecopy .tooltipped-no-delay:active:after,.codecopy .tooltipped-no-delay:active:before,.codecopy .tooltipped-no-delay:focus:after,.codecopy .tooltipped-no-delay:focus:before,.codecopy .tooltipped-no-delay:hover:after,.codecopy .tooltipped-no-delay:hover:before{animation-delay:0s}.codecopy .tooltipped-multiline:active:after,.codecopy .tooltipped-multiline:focus:after,.codecopy .tooltipped-multiline:hover:after{display:table-cell}.codecopy .tooltipped-s:after,.codecopy .tooltipped-se:after,.codecopy .tooltipped-sw:after{top:100%;right:50%;margin-top:6px}.codecopy .tooltipped-s:before,.codecopy .tooltipped-se:before,.codecopy .tooltipped-sw:before{top:auto;right:50%;bottom:-7px;margin-right:-6px;border-bottom-color:#1b1f23}.codecopy .tooltipped-se:after{right:auto;left:50%;margin-left:-16px}.codecopy .tooltipped-sw:after{margin-right:-16px}.codecopy .tooltipped-n:after,.codecopy .tooltipped-ne:after,.codecopy .tooltipped-nw:after{right:50%;bottom:100%;margin-bottom:6px}.codecopy .tooltipped-n:before,.codecopy .tooltipped-ne:before,.codecopy .tooltipped-nw:before{top:-7px;right:50%;bottom:auto;margin-right:-6px;border-top-color:#1b1f23}.codecopy .tooltipped-ne:after{right:auto;left:50%;margin-left:-16px}.codecopy .tooltipped-nw:after{margin-right:-16px}.codecopy .tooltipped-n:after,.codecopy .tooltipped-s:after{transform:translateX(50%)}.codecopy .tooltipped-w:after{right:100%;bottom:50%;margin-right:6px;transform:translateY(50%)}.codecopy .tooltipped-w:before{top:50%;bottom:50%;left:-7px;margin-top:-6px;border-left-color:#1b1f23}.codecopy .tooltipped-e:after{bottom:50%;left:100%;margin-left:6px;transform:translateY(50%)}.codecopy .tooltipped-e:before{top:50%;right:-7px;bottom:50%;margin-top:-6px;border-right-color:#1b1f23}.codecopy .tooltipped-align-right-1:after,.codecopy .tooltipped-align-right-2:after{right:0;margin-right:0}.codecopy .tooltipped-align-right-1:before{right:10px}.codecopy .tooltipped-align-right-2:before{right:15px}.codecopy .tooltipped-align-left-1:after,.codecopy .tooltipped-align-left-2:after{left:0;margin-left:0}.codecopy .tooltipped-align-left-1:before{left:5px}.codecopy .tooltipped-align-left-2:before{left:10px}.codecopy .tooltipped-multiline:after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate}.codecopy .tooltipped-multiline.tooltipped-n:after,.codecopy .tooltipped-multiline.tooltipped-s:after{right:auto;left:50%;transform:translateX(-50%)}.codecopy .tooltipped-multiline.tooltipped-e:after,.codecopy .tooltipped-multiline.tooltipped-w:after{right:100%}@media screen and (min-width:0\0){.codecopy .tooltipped-multiline:after{width:250px}}.codecopy .tooltipped-sticky:after,.codecopy .tooltipped-sticky:before{display:inline-block}.codecopy .tooltipped-sticky.tooltipped-multiline:after{display:table-cell}.codecopy .btn,.codecopy .codecopy-btn{position:relative;display:inline-block;padding:6px 12px;font-size:14px;font-weight:600;line-height:20px;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-repeat:repeat-x;background-position:-1px -1px;background-size:110% 110%;border:1px solid rgba(27,31,35,.2);border-radius:.25em;-webkit-appearance:none;-moz-appearance:none;appearance:none}.codecopy .btn i,.codecopy .codecopy-btn i{font-style:normal;font-weight:500;opacity:.75}.codecopy .btn .octicon,.codecopy .codecopy-btn .octicon{vertical-align:text-top}.codecopy .btn .Counter,.codecopy .codecopy-btn .Counter{color:#586069;text-shadow:none;background-color:rgba(27,31,35,.1)}.codecopy .btn:hover,.codecopy .codecopy-btn:hover{text-decoration:none;background-repeat:repeat-x}.codecopy .btn:focus,.codecopy .codecopy-btn:focus{outline:0}.codecopy .btn.disabled,.codecopy .btn:disabled,.codecopy .codecopy-btn:disabled,.codecopy .disabled.codecopy-btn{cursor:default;background-position:0 0}.codecopy .btn.selected,.codecopy .btn:active,.codecopy .codecopy-btn:active,.codecopy .selected.codecopy-btn{background-image:none}.codecopy .btn,.codecopy .codecopy-btn{color:#24292e;background-color:#eff3f6;background-image:linear-gradient(-180deg,#fafbfc,#eff3f6 90%)}.codecopy .btn.focus,.codecopy .btn:focus,.codecopy .codecopy-btn:focus,.codecopy .focus.codecopy-btn{box-shadow:0 0 0 .2em rgba(3,102,214,.3)}.codecopy .btn.hover,.codecopy .btn:hover,.codecopy .codecopy-btn:hover,.codecopy .hover.codecopy-btn{background-color:#e6ebf1;background-image:linear-gradient(-180deg,#f0f3f6,#e6ebf1 90%);background-position:-.5em;border-color:rgba(27,31,35,.35)}.codecopy .btn.selected,.codecopy .btn:active,.codecopy .codecopy-btn:active,.codecopy .selected.codecopy-btn,[open]>.codecopy .btn,[open]>.codecopy .codecopy-btn{background-color:#e9ecef;background-image:none;border-color:rgba(27,31,35,.35);box-shadow:inset 0 .15em .3em rgba(27,31,35,.15)}.codecopy .btn.disabled,.codecopy .btn:disabled,.codecopy .codecopy-btn:disabled,.codecopy .disabled.codecopy-btn{color:rgba(36,41,46,.4);background-color:#eff3f6;background-image:none;border-color:rgba(27,31,35,.2);box-shadow:none}.codecopy .btn-primary{color:#fff;background-color:#28a745;background-image:linear-gradient(-180deg,#34d058,#28a745 90%)}.codecopy .btn-primary.focus,.codecopy .btn-primary:focus{box-shadow:0 0 0 .2em rgba(52,208,88,.4)}.codecopy .btn-primary.hover,.codecopy .btn-primary:hover{background-color:#269f42;background-image:linear-gradient(-180deg,#2fcb53,#269f42 90%);background-position:-.5em;border-color:rgba(27,31,35,.5)}.codecopy .btn-primary.selected,.codecopy .btn-primary:active,[open]>.codecopy .btn-primary{background-color:#279f43;background-image:none;border-color:rgba(27,31,35,.5);box-shadow:inset 0 .15em .3em rgba(27,31,35,.15)}.codecopy .btn-primary.disabled,.codecopy .btn-primary:disabled{color:hsla(0,0%,100%,.75);background-color:#94d3a2;background-image:none;border-color:rgba(27,31,35,.2);box-shadow:none}.codecopy .btn-primary .Counter{color:#29b249;background-color:#fff}.codecopy .btn-purple{color:#fff;background-color:#643ab0;background-image:linear-gradient(-180deg,#7e55c7,#643ab0 90%)}.codecopy .btn-purple.focus,.codecopy .btn-purple:focus{box-shadow:0 0 0 .2em rgba(126,85,199,.4)}.codecopy .btn-purple.hover,.codecopy .btn-purple:hover{background-color:#5f37a8;background-image:linear-gradient(-180deg,#784ec5,#5f37a8 90%);background-position:-.5em;border-color:rgba(27,31,35,.5)}.codecopy .btn-purple.selected,.codecopy .btn-purple:active,[open]>.codecopy .btn-purple{background-color:#613ca4;background-image:none;border-color:rgba(27,31,35,.5);box-shadow:inset 0 .15em .3em rgba(27,31,35,.15)}.codecopy .btn-purple.disabled,.codecopy .btn-purple:disabled{color:hsla(0,0%,100%,.75);background-color:#b19cd7;background-image:none;border-color:rgba(27,31,35,.2);box-shadow:none}.codecopy .btn-purple .Counter{color:#683cb8;background-color:#fff}.codecopy .btn-blue{color:#fff;background-color:#0361cc;background-image:linear-gradient(-180deg,#0679fc,#0361cc 90%)}.codecopy .btn-blue.focus,.codecopy .btn-blue:focus{box-shadow:0 0 0 .2em rgba(6,121,252,.4)}.codecopy .btn-blue.hover,.codecopy .btn-blue:hover{background-color:#035cc2;background-image:linear-gradient(-180deg,#0374f4,#035cc2 90%);background-position:-.5em;border-color:rgba(27,31,35,.5)}.codecopy .btn-blue.selected,.codecopy .btn-blue:active,[open]>.codecopy .btn-blue{background-color:#045cc1;background-image:none;border-color:rgba(27,31,35,.5);box-shadow:inset 0 .15em .3em rgba(27,31,35,.15)}.codecopy .btn-blue.disabled,.codecopy .btn-blue:disabled{color:hsla(0,0%,100%,.75);background-color:#81b0e5;background-image:none;border-color:rgba(27,31,35,.2);box-shadow:none}.codecopy .btn-blue .Counter{color:#0366d6;background-color:#fff}.codecopy .btn-danger{color:#cb2431;background-color:#fafbfc;background-image:linear-gradient(-180deg,#fafbfc,#eff3f6 90%)}.codecopy .btn-danger:focus{box-shadow:0 0 0 .2em rgba(203,36,49,.4)}.codecopy .btn-danger:hover{color:#fff;background-color:#cb2431;background-image:linear-gradient(-180deg,#de4450,#cb2431 90%);border-color:rgba(27,31,35,.5)}.codecopy .btn-danger:hover .Counter{color:#fff}.codecopy .btn-danger.selected,.codecopy .btn-danger:active,[open]>.codecopy .btn-danger{color:#fff;background-color:#b5202c;background-image:none;border-color:rgba(27,31,35,.5);box-shadow:inset 0 .15em .3em rgba(27,31,35,.15)}.codecopy .btn-danger.disabled,.codecopy .btn-danger:disabled{color:rgba(203,36,49,.4);background-color:#eff3f6;background-image:none;border-color:rgba(27,31,35,.2);box-shadow:none}.codecopy .btn-outline{color:#0366d6;background-color:#fff;background-image:none}.codecopy .btn-outline .Counter{background-color:rgba(27,31,35,.07)}.codecopy .btn-outline.selected,.codecopy .btn-outline:active,.codecopy .btn-outline:hover,[open]>.codecopy .btn-outline{color:#fff;background-color:#0366d6;background-image:none;border-color:#0366d6}.codecopy .btn-outline.selected .Counter,.codecopy .btn-outline:active .Counter,.codecopy .btn-outline:hover .Counter,[open]>.codecopy .btn-outline .Counter{color:#0366d6;background-color:#fff}.codecopy .btn-outline:focus{border-color:#0366d6;box-shadow:0 0 0 .2em rgba(3,102,214,.4)}.codecopy .btn-outline.disabled,.codecopy .btn-outline:disabled{color:rgba(27,31,35,.3);background-color:#fff;border-color:rgba(27,31,35,.15);box-shadow:none}.codecopy .btn-with-count{float:left;border-top-right-radius:0;border-bottom-right-radius:0}.codecopy .btn-sm,.codecopy .codecopy-btn{padding:3px 10px;font-size:12px;line-height:20px}.codecopy .btn-large{padding:.75em 1.25em;font-size:inherit;border-radius:6px}.codecopy .hidden-text-expander{display:block}.codecopy .hidden-text-expander.inline{position:relative;top:-1px;display:inline-block;margin-left:5px;line-height:0}.codecopy .ellipsis-expander,.codecopy .hidden-text-expander a{display:inline-block;height:12px;padding:0 5px 5px;font-size:12px;font-weight:600;line-height:6px;color:#444d56;text-decoration:none;vertical-align:middle;background:#dfe2e5;border:0;border-radius:1px}.codecopy .ellipsis-expander:hover,.codecopy .hidden-text-expander a:hover{text-decoration:none;background-color:#c6cbd1}.codecopy .ellipsis-expander:active,.codecopy .hidden-text-expander a:active{color:#fff;background-color:#2188ff}.codecopy .social-count{float:left;padding:3px 10px;font-size:12px;font-weight:600;line-height:20px;color:#24292e;vertical-align:middle;background-color:#fff;border:1px solid rgba(27,31,35,.2);border-left:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.codecopy .social-count:active,.codecopy .social-count:hover{text-decoration:none}.codecopy .social-count:hover{color:#0366d6;cursor:pointer}.codecopy .btn-block{display:block;width:100%;text-align:center}.codecopy .btn-link{display:inline-block;padding:0;font-size:inherit;color:#0366d6;text-decoration:none;white-space:nowrap;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.codecopy .btn-link:hover{text-decoration:underline}.codecopy .btn-link:disabled,.codecopy .btn-link:disabled:hover{color:rgba(88,96,105,.5);cursor:default}.codecopy .details-reset>summary{list-style:none}.codecopy .details-reset>summary:before{display:none}.codecopy .details-reset>summary::-webkit-details-marker{display:none}.codecopy .BtnGroup{display:inline-block;vertical-align:middle}.codecopy .BtnGroup:before{display:table;content:""}.codecopy .BtnGroup:after{display:table;clear:both;content:""}.codecopy .BtnGroup+.btn,.codecopy .BtnGroup+.BtnGroup,.codecopy .BtnGroup+.codecopy-btn{margin-left:5px}.codecopy .BtnGroup-item{position:relative;float:left;border-right-width:0;border-radius:0}.codecopy .BtnGroup-item:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.codecopy .BtnGroup-item:last-child{border-right-width:1px;border-top-right-radius:3px;border-bottom-right-radius:3px}.codecopy .BtnGroup-item.selected,.codecopy .BtnGroup-item:active,.codecopy .BtnGroup-item:focus,.codecopy .BtnGroup-item:hover{border-right-width:1px}.codecopy .BtnGroup-item.selected+.BtnGroup-form .BtnGroup-item,.codecopy .BtnGroup-item.selected+.BtnGroup-item,.codecopy .BtnGroup-item:active+.BtnGroup-form .BtnGroup-item,.codecopy .BtnGroup-item:active+.BtnGroup-item,.codecopy .BtnGroup-item:focus+.BtnGroup-form .BtnGroup-item,.codecopy .BtnGroup-item:focus+.BtnGroup-item,.codecopy .BtnGroup-item:hover+.BtnGroup-form .BtnGroup-item,.codecopy .BtnGroup-item:hover+.BtnGroup-item{border-left-width:0}.codecopy .BtnGroup-form{float:left}.codecopy .BtnGroup-form:first-child .BtnGroup-item{border-top-left-radius:3px;border-bottom-left-radius:3px}.codecopy .BtnGroup-form:last-child .BtnGroup-item{border-right-width:1px;border-top-right-radius:3px;border-bottom-right-radius:3px}.codecopy .BtnGroup-form .BtnGroup-item{border-right-width:0;border-radius:0}.codecopy .BtnGroup-form.selected .BtnGroup-item,.codecopy .BtnGroup-form:active .BtnGroup-item,.codecopy .BtnGroup-form:focus .BtnGroup-item,.codecopy .BtnGroup-form:hover .BtnGroup-item{border-right-width:1px}.codecopy .BtnGroup-form.selected+.BtnGroup-form .BtnGroup-item,.codecopy .BtnGroup-form.selected+.BtnGroup-item,.codecopy .BtnGroup-form:active+.BtnGroup-form .BtnGroup-item,.codecopy .BtnGroup-form:active+.BtnGroup-item,.codecopy .BtnGroup-form:focus+.BtnGroup-form .BtnGroup-item,.codecopy .BtnGroup-form:focus+.BtnGroup-item,.codecopy .BtnGroup-form:hover+.BtnGroup-form .BtnGroup-item,.codecopy .BtnGroup-form:hover+.BtnGroup-item{border-left-width:0}.codecopy .codecopy-btn{box-shadow:none;min-height:0;transition:opacity .3s ease-in-out;opacity:0;position:absolute;z-index:1;padding:3px 6px;right:5px;top:5px}.codecopy .codecopy-btn .codecopy-btn-icon{border-radius:0;margin-top:-3px;position:relative;top:3px;padding:0;vertical-align:initial;min-height:0}.codecopy .codecopy-btn:focus,.codecopy .codecopy-btn:hover{box-shadow:none}.codecopy:hover .codecopy-btn{opacity:1}
\ No newline at end of file
diff --git a/dist/assets/fabricator/scripts/f.js b/dist/assets/fabricator/scripts/f.js
new file mode 100644
index 0000000..0dd2d27
--- /dev/null
+++ b/dist/assets/fabricator/scripts/f.js
@@ -0,0 +1,111 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./src/assets/fabricator/scripts/fabricator.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./src/assets/fabricator/scripts/fabricator.js":
+/*!*****************************************************!*\
+ !*** ./src/assets/fabricator/scripts/fabricator.js ***!
+ \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var require;var require;__webpack_require__(/*! ./prism */ \"./src/assets/fabricator/scripts/prism.js\");\n\n/**\n * Global `fabricator` object\n * @namespace\n */\nconst fabricator = window.fabricator = {};\n\n\n/**\n * Default options\n * @type {Object}\n */\nfabricator.options = {\n toggles: {\n labels: true,\n notes: true,\n code: false,\n },\n menu: false,\n mq: '(min-width: 60em)',\n};\n\n// open menu by default if large screen\nfabricator.options.menu = window.matchMedia(fabricator.options.mq).matches;\n\n/**\n * Feature detection\n * @type {Object}\n */\nfabricator.test = {};\n\n// test for sessionStorage\nfabricator.test.sessionStorage = (() => {\n const test = '_f';\n try {\n sessionStorage.setItem(test, test);\n sessionStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n})();\n\n// create storage object if it doesn't exist; store options\nif (fabricator.test.sessionStorage) {\n sessionStorage.fabricator = sessionStorage.fabricator || JSON.stringify(fabricator.options);\n}\n\n\n/**\n * Cache DOM\n * @type {Object}\n */\nfabricator.dom = {\n root: document.querySelector('html'),\n primaryMenu: document.querySelector('.f-menu'),\n menuItems: document.querySelectorAll('.f-menu li a'),\n menuToggle: document.querySelector('.f-menu-toggle'),\n};\n\n\n/**\n * Get current option values from session storage\n * @return {Object}\n */\nfabricator.getOptions = () => {\n return (fabricator.test.sessionStorage) ? JSON.parse(sessionStorage.fabricator) : fabricator.options;\n};\n\n\n/**\n * Build color chips\n */\nfabricator.buildColorChips = () => {\n\n const chips = document.querySelectorAll('.f-color-chip');\n\n for (let i = chips.length - 1; i >= 0; i--) {\n const color = chips[i].querySelector('.f-color-chip__color').innerHTML;\n chips[i].style.borderTopColor = color;\n chips[i].style.borderBottomColor = color;\n }\n\n return fabricator;\n\n};\n\n\n/**\n * Add `f-active` class to active menu item\n */\nfabricator.setActiveItem = () => {\n\n /**\n * Match the window location with the menu item, set menu item as active\n */\n const setActive = () => {\n\n // get current file and hash without first slash\n const loc = (window.location.pathname + window.location.hash);\n const current = loc.replace(/(^\\/)([^#]+)?(#[\\w\\-\\.]+)?$/ig, (match, slash, file, hash) => {\n return (file || '') + (hash || '').split('.')[0];\n }) || 'index.html';\n\n\n // find the current section in the items array\n for (let i = fabricator.dom.menuItems.length - 1; i >= 0; i--) {\n\n const item = fabricator.dom.menuItems[i];\n\n // get item href without first slash\n const href = item.getAttribute('href').replace(/^\\//g, '');\n\n if (href === current) {\n item.classList.add('f-active');\n } else {\n item.classList.remove('f-active');\n }\n\n }\n\n };\n\n window.addEventListener('hashchange', setActive);\n\n setActive();\n\n return fabricator;\n\n};\n\n\n/**\n * Click handler to primary menu toggle\n * @return {Object} fabricator\n */\nfabricator.menuToggle = () => {\n\n // shortcut menu DOM\n const toggle = fabricator.dom.menuToggle;\n const options = fabricator.getOptions();\n\n // toggle classes on certain elements\n const toggleClasses = () => {\n options.menu = !fabricator.dom.root.classList.contains('f-menu-active');\n fabricator.dom.root.classList.toggle('f-menu-active');\n\n if (fabricator.test.sessionStorage) {\n sessionStorage.setItem('fabricator', JSON.stringify(options));\n }\n };\n\n // toggle classes on ctrl + m press\n document.onkeydown = (e) => {\n if (e.ctrlKey && e.keyCode === 'M'.charCodeAt(0)) {\n toggleClasses();\n }\n };\n\n // toggle classes on click\n toggle.addEventListener('click', () => {\n toggleClasses();\n });\n\n // close menu when clicking on item (for collapsed menu view)\n const closeMenu = () => {\n if (!window.matchMedia(fabricator.options.mq).matches) {\n toggleClasses();\n }\n };\n\n for (let i = 0; i < fabricator.dom.menuItems.length; i++) {\n fabricator.dom.menuItems[i].addEventListener('click', closeMenu);\n }\n\n return fabricator;\n\n};\n\n\n/**\n * Handler for preview and code toggles\n * @return {Object} fabricator\n */\nfabricator.allItemsToggles = () => {\n\n const itemCache = {\n labels: document.querySelectorAll('[data-f-toggle=\"labels\"]'),\n notes: document.querySelectorAll('[data-f-toggle=\"notes\"]'),\n code: document.querySelectorAll('[data-f-toggle=\"code\"]'),\n };\n\n const toggleAllControls = document.querySelectorAll('.f-controls [data-f-toggle-control]');\n const options = fabricator.getOptions();\n\n // toggle all\n const toggleAllItems = (type, value) => {\n\n const button = document.querySelector(`.f-controls [data-f-toggle-control=${type}]`);\n const items = itemCache[type];\n\n for (let i = 0; i < items.length; i++) {\n if (value) {\n items[i].classList.remove('f-item-hidden');\n } else {\n items[i].classList.add('f-item-hidden');\n }\n }\n\n // toggle styles\n if (value) {\n button.classList.add('f-active');\n } else {\n button.classList.remove('f-active');\n }\n\n // update options\n options.toggles[type] = value;\n\n if (fabricator.test.sessionStorage) {\n sessionStorage.setItem('fabricator', JSON.stringify(options));\n }\n\n };\n\n for (let i = 0; i < toggleAllControls.length; i++) {\n\n toggleAllControls[i].addEventListener('click', (e) => {\n\n // extract info from target node\n const type = e.currentTarget.getAttribute('data-f-toggle-control');\n const value = e.currentTarget.className.indexOf('f-active') < 0;\n\n // toggle the items\n toggleAllItems(type, value);\n\n });\n\n }\n\n // persist toggle options from page to page\n Object.keys(options.toggles).forEach((key) => {\n toggleAllItems(key, options.toggles[key]);\n });\n\n return fabricator;\n\n};\n\n\n/**\n * Handler for single item code toggling\n */\nfabricator.singleItemToggle = () => {\n\n const itemToggleSingle = document.querySelectorAll('.f-item-group [data-f-toggle-control]');\n\n // toggle single\n const toggleSingleItemCode = (e) => {\n const group = e.currentTarget.parentNode.parentNode.parentNode;\n const type = e.currentTarget.getAttribute('data-f-toggle-control');\n group.querySelector(`[data-f-toggle=${type}]`).classList.toggle('f-item-hidden');\n };\n\n for (let i = 0; i < itemToggleSingle.length; i++) {\n itemToggleSingle[i].addEventListener('click', toggleSingleItemCode);\n }\n\n return fabricator;\n\n};\n\n\n/**\n * Automatically select code when code block is clicked\n */\nfabricator.bindCodeAutoSelect = () => {\n\n const codeBlocks = document.querySelectorAll('.f-item-code');\n\n const select = (block) => {\n const selection = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(block.querySelector('code'));\n selection.removeAllRanges();\n selection.addRange(range);\n };\n\n for (let i = codeBlocks.length - 1; i >= 0; i--) {\n codeBlocks[i].addEventListener('click', select.bind(this, codeBlocks[i]));\n }\n\n};\n\n\n/**\n * Open/Close menu based on session var.\n * Also attach a media query listener to close the menu when resizing to smaller screen.\n */\nfabricator.setInitialMenuState = () => {\n\n // root element\n const root = document.querySelector('html');\n\n const mq = window.matchMedia(fabricator.options.mq);\n\n // if small screen\n const mediaChangeHandler = (list) => {\n if (!list.matches) {\n root.classList.remove('f-menu-active');\n } else {\n if (fabricator.getOptions().menu) {\n root.classList.add('f-menu-active');\n } else {\n root.classList.remove('f-menu-active');\n }\n }\n };\n\n mq.addListener(mediaChangeHandler);\n mediaChangeHandler(mq);\n\n return fabricator;\n\n};\n\n\nfunction myFunction() {\n var copyText = document.getElementById(\"myInput\");\n copyText.select();\n document.execCommand(\"copy\");\n \n var tooltip = document.getElementById(\"myTooltip\");\n tooltip.innerHTML = \"Copied: \" + copyText.value;\n}\n\nfunction outFunc() {\n var tooltip = document.getElementById(\"myTooltip\");\n tooltip.innerHTML = \"Copy to clipboard\";\n}\n\n/**\n * Initialization\n */\nfabricator\n .setInitialMenuState()\n .menuToggle()\n .allItemsToggles()\n .singleItemToggle()\n .buildColorChips()\n .setActiveItem()\n .bindCodeAutoSelect();\n\n\n\n /*!\n * clipboard.js v1.5.10\n * https://zenorocha.github.io/clipboard.js\n *\n * Licensed MIT © Zeno Rocha\n */\n!function(t){if(true)module.exports=t();else { var e; }}(function(){var t,e,n;return function t(e,n,o){function i(c,a){if(!n[c]){if(!e[c]){var s=\"function\"==typeof require&&require;if(!a&&s)return require(c,!0);if(r)return r(c,!0);var l=new Error(\"Cannot find module '\"+c+\"'\");throw l.code=\"MODULE_NOT_FOUND\",l}var u=n[c]={exports:{}};e[c][0].call(u.exports,function(t){var n=e[c][1][t];return i(n?n:t)},u,u.exports,t,e,n,o)}return n[c].exports}for(var r=\"function\"==typeof require&&require,c=0;co;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],i=[];if(o&&e)for(var r=0,c=o.length;c>r;r++)o[r].fn!==e&&o[r].fn._!==e&&i.push(o[r]);return i.length?n[t]=i:delete n[t],this}},e.exports=o},{}],8:[function(e,n,o){!function(i,r){if(\"function\"==typeof t&&t.amd)t([\"module\",\"select\"],r);else if(\"undefined\"!=typeof o)r(n,e(\"select\"));else{var c={exports:{}};r(c,i.select),i.clipboardAction=c.exports}}(this,function(t,e){\"use strict\";function n(t){return t&&t.__esModule?t:{\"default\":t}}function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}var i=n(e),r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol?\"symbol\":typeof t},c=function(){function t(t,e){for(var n=0;n text.length) {\n\t\t\t\t\t\t// Something went terribly wrong, ABORT, ABORT!\n\t\t\t\t\t\tbreak tokenloop;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (str instanceof Token) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tpattern.lastIndex = 0;\n\n\t\t\t\t\tvar match = pattern.exec(str);\n\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tif(lookbehind) {\n\t\t\t\t\t\t\tlookbehindLength = match[1].length;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar from = match.index - 1 + lookbehindLength,\n\t\t\t\t\t\t\tmatch = match[0].slice(lookbehindLength),\n\t\t\t\t\t\t\tlen = match.length,\n\t\t\t\t\t\t\tto = from + len,\n\t\t\t\t\t\t\tbefore = str.slice(0, from + 1),\n\t\t\t\t\t\t\tafter = str.slice(to + 1);\n\n\t\t\t\t\t\tvar args = [i, 1];\n\n\t\t\t\t\t\tif (before) {\n\t\t\t\t\t\t\targs.push(before);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias);\n\n\t\t\t\t\t\targs.push(wrapped);\n\n\t\t\t\t\t\tif (after) {\n\t\t\t\t\t\t\targs.push(after);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tArray.prototype.splice.apply(strarr, args);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn strarr;\n\t},\n\n\thooks: {\n\t\tall: {},\n\n\t\tadd: function (name, callback) {\n\t\t\tvar hooks = _.hooks.all;\n\n\t\t\thooks[name] = hooks[name] || [];\n\n\t\t\thooks[name].push(callback);\n\t\t},\n\n\t\trun: function (name, env) {\n\t\t\tvar callbacks = _.hooks.all[name];\n\n\t\t\tif (!callbacks || !callbacks.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i=0, callback; callback = callbacks[i++];) {\n\t\t\t\tcallback(env);\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar Token = _.Token = function(type, content, alias) {\n\tthis.type = type;\n\tthis.content = content;\n\tthis.alias = alias;\n};\n\nToken.stringify = function(o, language, parent) {\n\tif (typeof o == 'string') {\n\t\treturn o;\n\t}\n\n\tif (_.util.type(o) === 'Array') {\n\t\treturn o.map(function(element) {\n\t\t\treturn Token.stringify(element, language, o);\n\t\t}).join('');\n\t}\n\n\tvar env = {\n\t\ttype: o.type,\n\t\tcontent: Token.stringify(o.content, language, parent),\n\t\ttag: 'span',\n\t\tclasses: ['token', o.type],\n\t\tattributes: {},\n\t\tlanguage: language,\n\t\tparent: parent\n\t};\n\n\tif (env.type == 'comment') {\n\t\tenv.attributes['spellcheck'] = 'true';\n\t}\n\n\tif (o.alias) {\n\t\tvar aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];\n\t\tArray.prototype.push.apply(env.classes, aliases);\n\t}\n\n\t_.hooks.run('wrap', env);\n\n\tvar attributes = '';\n\n\tfor (var name in env.attributes) {\n\t\tattributes += name + '=\"' + (env.attributes[name] || '') + '\"';\n\t}\n\n\treturn '<' + env.tag + ' class=\"' + env.classes.join(' ') + '\" ' + attributes + '>' + env.content + '' + env.tag + '>';\n\n};\n\nif (!self.document) {\n\tif (!self.addEventListener) {\n\t\t// in Node.js\n\t\treturn self.Prism;\n\t}\n \t// In worker\n\tself.addEventListener('message', function(evt) {\n\t\tvar message = JSON.parse(evt.data),\n\t\t lang = message.language,\n\t\t code = message.code;\n\n\t\tself.postMessage(JSON.stringify(_.util.encode(_.tokenize(code, _.languages[lang]))));\n\t\tself.close();\n\t}, false);\n\n\treturn self.Prism;\n}\n\n// Get current script and highlight\nvar script = document.getElementsByTagName('script');\n\nscript = script[script.length - 1];\n\nif (script) {\n\t_.filename = script.src;\n\n\tif (document.addEventListener && !script.hasAttribute('data-manual')) {\n\t\tdocument.addEventListener('DOMContentLoaded', _.highlightAll);\n\t}\n}\n\nreturn self.Prism;\n\n})();\n\nif ( true && module.exports) {\n\tmodule.exports = Prism;\n}\n;\nPrism.languages.markup = {\n\t'comment': //,\n\t'prolog': /<\\?.+?\\?>/,\n\t'doctype': //,\n\t'cdata': //i,\n\t'tag': {\n\t\tpattern: /<\\/?[\\w:-]+\\s*(?:\\s+[\\w:-]+(?:=(?:(\"|')(\\\\?[\\w\\W])*?\\1|[^\\s'\">=]+))?\\s*)*\\/?>/i,\n\t\tinside: {\n\t\t\t'tag': {\n\t\t\t\tpattern: /^<\\/?[\\w:-]+/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^<\\/?/,\n\t\t\t\t\t'namespace': /^[\\w-]+?:/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'attr-value': {\n\t\t\t\tpattern: /=(?:('|\")[\\w\\W]*?(\\1)|[^\\s>]+)/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /=|>|\"/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'punctuation': /\\/?>/,\n\t\t\t'attr-name': {\n\t\t\t\tpattern: /[\\w:-]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'namespace': /^[\\w-]+?:/\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t},\n\t'entity': /?[\\da-z]{1,8};/i\n};\n\n// Plugin to make entity title show the real entity, idea by Roman Komarov\nPrism.hooks.add('wrap', function(env) {\n\n\tif (env.type === 'entity') {\n\t\tenv.attributes['title'] = env.content.replace(/&/, '&');\n\t}\n});\n;\nPrism.languages.css = {\n\t'comment': /\\/\\*[\\w\\W]*?\\*\\//,\n\t'atrule': {\n\t\tpattern: /@[\\w-]+?.*?(;|(?=\\s*\\{))/i,\n\t\tinside: {\n\t\t\t'punctuation': /[;:]/\n\t\t}\n\t},\n\t'url': /url\\((?:([\"'])(\\\\\\n|\\\\?.)*?\\1|.*?)\\)/i,\n\t'selector': /[^\\{\\}\\s][^\\{\\};]*(?=\\s*\\{)/,\n\t'string': /(\"|')(\\\\\\n|\\\\?.)*?\\1/,\n\t'property': /(\\b|\\B)[\\w-]+(?=\\s*:)/i,\n\t'important': /\\B!important\\b/i,\n\t'punctuation': /[\\{\\};:]/,\n\t'function': /[-a-z0-9]+(?=\\()/i\n};\n\nif (Prism.languages.markup) {\n\tPrism.languages.insertBefore('markup', 'tag', {\n\t\t'style': {\n\t\t\tpattern: /