diff --git a/dist/assets/css/all.css b/dist/assets/css/all.css
new file mode 100644
index 0000000000..59bca3d6de
--- /dev/null
+++ b/dist/assets/css/all.css
@@ -0,0 +1,4 @@
+/*! normalize.css v1.1.0 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}button,html,input,select,textarea{font-family:sans-serif}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ol,nav ul{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure,form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}
+;code[class*=language-],pre[class*=language-],textarea{color:#222;font-family:Inconsolata,Consolas,Monaco,Andale Mono,monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;font-size:1em!important}pre[class*=language-]{position:relative;padding:.5em 1em;margin:.5em 0 0 -.5em;border-left:.5em solid #afafaf;background-color:#fff;background-image:-webkit-linear-gradient(transparent 50%,rgba(69,142,209,.06) 0);background-image:-o-linear-gradient(transparent 50%,rgba(69,142,209,.06) 50%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,transparent),color-stop(50%,rgba(69,142,209,.06)));background-image:linear-gradient(transparent 50%,rgba(69,142,209,.06) 0);-webkit-background-size:2.9em 2.9em;background-size:2.9em 2.9em;-webkit-background-origin:content-box;background-origin:content-box;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{margin-bottom:1em}:not(pre)>code[class*=language-]{position:relative;padding:.2em;border-radius:.3em;color:#333;border:1px solid rgba(0,0,0,.1)}:not(pre)>code[class*=language-]:after,pre[class*=language-]:after{right:.75em;left:auto}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#a0a0a0}.token.punctuation{color:#666}.token.boolean,.token.constant,.token.function-name,.token.number,.token.property,.token.symbol,.token.tag{color:#dc3787}.token.attr-name,.token.builtin,.token.function,.token.selector,.token.string{color:#00a1d3}.token.entity,.token.operator,.token.url,.token.variable{color:#a67f59;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.class-name,.token.keyword{color:#704f21}.token.important,.token.regex{color:#e90}.language-css .token.string,.style .token.string{color:#a67f59;background:hsla(0,0%,100%,.5)}.token.important{font-weight:400}.token.entity{cursor:help}.namespace{opacity:.7}@media screen and (max-width:767px){pre[class*=language-]:after,pre[class*=language-]:before{bottom:14px;-webkit-box-shadow:none;box-shadow:none}}.token.cr:before,.token.lf:before,.token.tab:not(:empty):before{color:#e0d7d1}pre.line-numbers{padding-left:3.8em;counter-reset:linenumber}pre.line-numbers,pre.line-numbers>code{position:relative}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}
+;button,html,input,select{color:#222}textarea{line-height:1.45em;padding:.5em 1em;border:none}body{font-size:1em;line-height:1.4}::-moz-selection{background:#b3d4fc;text-shadow:none}::selection{background:#b3d4fc;text-shadow:none}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}img{vertical-align:middle}img.med_left{width:300px;float:left}img.med_right{width:300px;float:right}img.small_left{width:200px;float:left}img.smaller_left{width:140px;float:left}img.small_right{width:200px;float:right}img.smaller_right{width:140px;float:right}img.small_center{width:200px;margin-left:250px}img.small{width:160px}img.med{width:400px}img.med_center{width:400px;margin-left:150px}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}.tagline{display:none}#home-page .home{pointer-events:none}#home-page .home a{pointer-events:all}#lockup>a{position:relative;display:block;width:200px;height:90px}#logo_image{position:absolute;top:0}#menu,#menu.top_menu{list-style:none;font-family:Montserrat,sans-serif;width:100%;margin:0 0 1em;padding:0;height:100%;font-size:1.3em}#menu.top_menu li{display:inline}#home-sketch{position:absolute;top:0;left:0;z-index:-2}@media screen and (max-width:780px){.sidebar-menu{clear:both;max-height:0;-webkit-transition:max-height .4s ease-out;-o-transition:max-height .4s ease-out;transition:max-height .4s ease-out;overflow:hidden}.sidebar-menu-nav-element{width:91vw}.sidebar-menu a{display:block;text-align:center;padding-bottom:.11em;border-bottom:.11em dashed transparent}.sidebar-menu-icon{top:2rem;cursor:pointer;float:right;padding:28px 20px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-bottom:5rem}.sidebar-menu-icon .sidebar-nav-icon{background:#ed225d;display:block;height:2px;position:relative;-webkit-transition:background .4s ease-out;-o-transition:background .4s ease-out;transition:background .4s ease-out;width:18px}.sidebar-menu-icon .sidebar-nav-icon:after,.sidebar-menu-icon .sidebar-nav-icon:before{background:#ed225d;content:"";display:block;height:100%;position:absolute;-webkit-transition:all .4s ease-out;-o-transition:all .4s ease-out;transition:all .4s ease-out;width:100%}.sidebar-menu-icon .sidebar-nav-icon:before{top:5px}.sidebar-menu-icon .sidebar-nav-icon:after{top:-5px}.sidebar-menu-btn{display:none}.sidebar-menu-btn:checked~.sidebar-menu{max-height:475px}.sidebar-menu-btn:checked~.sidebar-menu-icon .sidebar-nav-icon{background:transparent}.sidebar-menu-btn:checked~.sidebar-menu-icon .sidebar-nav-icon:before{-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);top:0}.sidebar-menu-btn:checked~.sidebar-menu-icon .sidebar-nav-icon:after{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);top:0}}.sidebar-menu-btn{display:none}#home-sketch-frame{position:fixed;width:100%;height:100%;left:0;top:0;z-index:-2;overflow:hidden;pointer-events:all;border:0}#credits{position:fixed;bottom:0;left:0;z-index:2;padding:1em;font-size:.7em}#skip-to-content{position:absolute;left:0;top:40px;z-index:5;background-color:#ed225d;color:#fff;width:auto;height:50px;border:none;outline-style:none;text-align:center;font-size:25px;padding:5px;opacity:0}#skip-to-content:focus{opacity:1}.button_box{padding:.4em .6em;margin:.5em 0;font-family:Montserrat,sans-serif;display:inline-block}.button_box,.download_box{border:1px solid #ed225d;color:#333}.download_box{padding:.4em;margin:0 1.75em 0 0;width:18.65em;float:left;height:7.45em;position:relative}.button_box:hover,.download_box:hover{border:1px solid #ed225d;background:#ed225d;color:#fff}.download_box.half_box{width:10.83em;margin-right:1.75em;float:left}.download_box.half_box.last_box{margin-right:0}.download_box .download_name{font-size:1em;margin:0;padding-bottom:.3em;border-bottom:.09em dashed #ed225d;line-height:1.2;font-family:Montserrat,sans-serif;display:block}.download_box:hover .download_name{-webkit-text-stroke-width:0;border-bottom-color:#fff}.download_box p{font-size:.65em;margin:0;position:absolute;bottom:1em}.download_box svg{height:.65em;width:.65em;position:absolute;bottom:3.5em}.download_box:hover svg{fill:#fff}.download_box h4+p{display:block}#download-page .link_group{width:100%;margin-bottom:3em}.download_box{margin-top:1em}.support div.download_box{margin-top:1em;margin-bottom:1em}#download-page .support p{font-size:.8em;position:static;margin-top:.3em}#slideshow{margin:1em 0}#slideshow p{font-size:.8em;color:#ababab;line-height:1.2em;margin-top:.5em}.extra{color:#fff;position:absolute;bottom:.65em;right:.9em;font-weight:700;-ms-transform:rotate(-12deg);-webkit-transform:rotate(-12deg);-o-transform:rotate(-12deg);transform:rotate(-12deg);font-size:.8em}#get-started-page .edit_space{position:relative;-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3;margin-bottom:4.8125em}#get-started-page .edit_space .copy_button{color:#2d7bb6;border-color:rgba(45,123,182,.25);float:right;margin:1.5em 0 1.5em .5em;background:hsla(0,0%,100%,.7);position:absolute;z-index:2;left:31.33em;top:-1.5em}@media (max-width:780px){#get-started-page .edit_space .copy_button{left:6.44em}}@media (max-width:600px){#get-started-page .edit_space .copy_button{left:5.91em}}#examples-page .column{margin-bottom:2em}#reference-page main h1{float:left}.reference-group h2{font-size:1.5em}.reference-group h3{font-size:1em;font-family:Montserrat,sans-serif;margin-top:.5em}div.reference-group{display:inline-block}div.reference-subgroups{margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}div.reference-subgroup{width:11em;margin-bottom:1em}#reference-page .params table p{display:inline;font-size:inherit}#reference-page .param-optional{color:#afafaf}#item{width:100%}#item h2{margin:.777em 0 0;font-size:1.444em;font-weight:inherit;font-family:Inconsolata,consolas,monospace;color:#00a1d3}#item h3{font-size:1.33em;margin:1em 0 0}#item ul{margin-top:.5em}#item li{margin-bottom:1em}.description{clear:both;display:block;width:100%}.syntax pre{width:100%}.item-wrapper,.list-wrapper{float:left;outline:none}.paramname{display:inline-block;min-width:25%;margin-right:1%;font-size:1.2em}.paramtype p{display:inline;font-size:1em}.paramtype{font-size:1.2em;width:73%;vertical-align:top}#library-page .group-name,.paramtype{display:inline-block}#library-page .group-name:hover{color:#ed225d}.example div{position:relative}.example-content .example_code{position:relative;left:1em;padding-top:0;margin-top:1rem;border:none;width:30.5em;max-width:100%}.example-content .example_code.norender{left:0;margin-left:0}.example-content .edit_space{position:absolute;top:0;left:0;margin-top:-.5em;width:100%;pointer-events:none}.example-content .edit_space *{pointer-events:auto}.example-content .edit_space ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;position:relative;pointer-events:none}.example-content .edit_space ul li button{font-family:Montserrat,sans-serif;font-size:1em;color:#ccc;border:1px solid hsla(0,0%,78.4%,.15);background:transparent;outline:none;margin-top:.25em}.example-content .edit_space ul li button:hover,.example_container.editing ul li button{color:#2d7bb6;border-color:rgba(45,123,182,.25)}.example-content .edit_space .edit_area{position:absolute;top:.5em;left:120px;width:30.5em;display:none;font-family:monospace;padding:1.5em .5em .5em;font-size:15pt}.display_button{margin-bottom:2em;font-family:Montserrat,sans-serif;font-size:1em;color:#2d7bb6;border:1px solid rgba(45,123,182,.25);background:transparent;outline:none}.example-content .example_container{width:36em;max-width:100%;border-top:.09em dashed #333;padding-top:.5em;margin-top:2em;min-height:120px;height:-webkit-calc(110% + 20px);height:calc(110% + 20px);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.example-content .example_container:first-of-type{margin-top:1em}@media (max-width:600px){.example-content .example_code{margin-top:.2rem;left:.5rem}.example-content .example_container{width:100%;min-height:220px;height:-webkit-calc(110% + 120px);height:calc(110% + 120px);display:block}.example-content .edit_space .edit_area{top:-webkit-calc(120px + 1em);top:calc(120px + 1em);left:0;width:100%;padding:.5em}.example_container button{top:124px}.description{margin-top:3rem}.edit_button{left:0}.reset_button{left:2.58em}.copy_button{left:5.91em}}form{pointer-events:all}#search_button{background:url(../img/search.png) 100% no-repeat}#search input[type=search],#search input[type=text]{border:1px solid hsla(0,0%,78.4%,.5);font-family:Montserrat,sans-serif;font-size:2.25em;width:9.75em}#search .twitter-typeahead .tt-hint,#search ::-webkit-input-placeholder{color:#ccc}:-moz-placeholder,:-ms-input-placeholder,::-moz-placeholder{color:#ccc}#search input[type=text]:focus{color:#2d7bb6;outline-color:#2d7bb6;outline-width:1px;outline-style:solid}#search .twitter-typeahead .tt-dropdown-menu{background-color:#fff}#search .twitter-typeahead .tt-suggestion.tt-cursor{color:#333;background-color:#eee}#search .twitter-typeahead .tt-suggestion p{margin:0}#search .twitter-typeahead .tt-suggestion p .small{font-size:12px;color:#666}#search{float:right}#search .twitter-typeahead .tt-dropdown-menu{border:1px solid rgba(0,0,0,.2);padding:.5em;max-height:200px;overflow-y:auto;font-size:1em;line-height:1.4em}#search .twitter-typeahead .tt-suggestion{padding:3px 20px;line-height:24px;cursor:pointer}#search .twitter-typeahead .empty-message{padding:8px 20px 1px;font-size:14px;line-height:24px}#search_button{float:right}a.code.core{color:#333}a.code.addon{color:#704f21}#contribute-item{font-size:.75em;text-align:left;display:inline-block;width:320px;height:250px;float:left;border:1px solid #ed225d;margin:0 25px 25px 0;position:relative}.contribute-item-container{position:absolute;z-index:20;margin:0;padding:10px}.container{height:100px;position:relative;background:#fff;margin-top:1.5em}#infoi,#navi{width:100%;height:100%;position:absolute;top:0;left:0}#infoi{z-index:10}h3.contribute-title{font-size:1.33em;margin:0 0 27px;padding-bottom:.3em;border-bottom:.09em dashed #ed225d}.label{position:relative}.label .nounderline img{margin:.5em 0 0}.label h3{color:#fff;position:absolute;top:0;margin:1em}.label:hover h3{color:#ed225d}h3{font-size:1.33em;margin:1em 0 0}.bullet-list{padding:0 0 0 40px;list-style:disc}#libraries-page .label h3{background-color:#000;padding:0 5px}#learn-page .label .nounderline img{height:-webkit-fit-content;height:-moz-fit-content;height:fit-content}#learn-page .info{display:inline-block}#exampleDisplay,#exampleEditor,#exampleFrame{width:36em;border:none}#exampleDisplay{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column;-ms-flex-flow:column;flex-flow:column}#popupExampleFrame{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1000;border:none}#exampleDisplay button{color:#2d7bb6;border-color:rgba(45,123,182,.25);float:right;margin:.5em 0 0 .5em;background:hsla(0,0%,100%,.7);position:absolute;left:0;z-index:2}#exampleDisplay .edit_button{left:25.42em;top:-2.5em}#exampleDisplay .reset_button{left:28em;top:-2.5em}#exampleDisplay .copy_button{left:31.33em;top:-2.5em}#exampleDisplay button:hover{background:#fff}#exampleDisplay .edit_space{position:relative;-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}#exampleDisplay #exampleFrame{height:22em;-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}#exampleDisplay #exampleEditor{height:500em;width:710px;overflow:hidden;margin-top:.5em;color:#222;font-family:Inconsolata,consolas,monospace;font-size:1em;background-color:#fff;line-height:1em;-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}#exampleDisplay #exampleEditor .ace_gutter-cell{background-image:none;padding-left:10px;overflow:hidden;background-color:#afafaf}#exampleDisplay #exampleEditor .ace_gutter-cell.ace_info{background-color:#d7e5f5}#exampleDisplay #exampleEditor .ace_gutter-cell.ace_warning{background-color:gold;color:#fff}#exampleDisplay #exampleEditor .ace_gutter-cell.ace_error{background-color:tomato;color:#fff}#exampleDisplay #exampleEditor .ace_numeric,#exampleDisplay #exampleEditor .ace_tag{color:#dc3787}#exampleDisplay #exampleEditor .ace_attribute-name,#exampleDisplay #exampleEditor .ace_class,#exampleDisplay #exampleEditor .ace_type{color:#704f21}#exampleDisplay #exampleEditor .ace_function,#exampleDisplay #exampleEditor .ace_keyword,#exampleDisplay #exampleEditor .ace_support{color:#00a1d3}#exampleDisplay #exampleEditor .ace_comment{color:#a0a0a0}#exampleDisplay #exampleEditor .ace_string{color:#a67f59}#exampleDisplay #exampleEditor .ace_operator{color:#333}#exampleDisplay #exampleEditor .ace_regexp{color:#e90}#exampleDisplay #exampleEditor .ace-gutter,#exampleDisplay #exampleEditor .ace-gutter-layer{color:#333}#exampleDisplay #exampleEditor .ace_folding-enabled{width:10px!important;color:#333}.attribution{background-color:#eee;font-size:15px;padding:10px;margin:30px 0}#featuring{margin-bottom:1em}#showcase-page .showcase-intro h1{font:italic 900 14.5vw Montserrat,sans-serif;color:#ed225d;text-align:left;text-transform:uppercase}#showcase-page .showcase-intro p{font:400 1.4rem Montserrat,sans-serif;line-height:1.5em}#showcase-page .project-page h2,#showcase-page .showcase-featured h2{font:italic 900 2rem Montserrat,sans-serif;color:#ed225d;letter-spacing:.05rem}#showcase-page ul.left-column,#showcase-page ul.links,#showcase-page ul.project-tags,#showcase-page ul.right-column{list-style:none}#showcase-page img[alt]{font-size:.9rem}#showcase-page .showcase-featured{margin-top:15%}#showcase-page .showcase-featured h3.title{font:italic 900 1rem Montserrat,sans-serif}#showcase-page .showcase-featured p.credit{font:500 1rem Montserrat,sans-serif}#showcase-page .showcase-featured p.description{font-size:1em;margin-bottom:.5rem}#showcase-page .nominate{margin-top:1.5em;display:inline-block}#showcase-page .nominate a,#showcase-page .nominate a:visited{padding:.4em .5em;position:relative;top:0;left:0;border:2px solid #ed225d;-webkit-box-shadow:4px 4px 0 #ed225d;box-shadow:4px 4px 0 #ed225d;font:1.5rem Montserrat,sans-serif;color:#ed225d;letter-spacing:.02rem;-webkit-transition:all .3s;-o-transition:all .3s;transition:all .3s}@media (max-width:500px){#showcase-page .nominate a,#showcase-page .nominate a:visited{padding:.4em .3em;font:1.3rem Montserrat,sans-serif}}#showcase-page .nominate a:hover{top:4px;left:4px;-webkit-box-shadow:none;box-shadow:none}#showcase-page .showcase-featured a,#showcase-page .showcase-featured a:visited{font-size:1.2rem;color:#ed225d;letter-spacing:.02rem;line-height:1.5}#showcase-page .showcase-featured a:after{content:" →"}#showcase-page .showcase-featured a.tag:after{content:""}#showcase-page .showcase-featured .no-arrow-link:after{content:" "}#showcase-page .showcase-featured .no-arrow-link:hover{text-decoration:none;padding:none;border:none}.project-info{margin-top:1em}ul.project-tags a{line-height:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;font-size:.5em;margin:0}h3.title{margin-top:3em}#showcase-page ul.project-tags li{margin:5px;display:inline-block}h2.featuring{margin-top:0}#showcase-page a.tag{display:inline-block;padding:6px 14px;background-color:#ffe8e8;border-radius:27px;font:.7rem Montserrat,sans-serif;color:#333}#showcase-page ul.project-tags li{margin:0}#showcase-page{margin-top:3em}#showcase-page .project-page h2{line-height:1.4}@media (min-width:720px){#showcase-page .showcase-intro h1{font:italic 900 6.35vw Montserrat,sans-serif}#showcase-page .showcase-intro p{line-height:1.75em;font-size:1em}#showcase-page .project-metadata{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}#showcase-page .project-resources{margin-left:3rem}#showcase-page .project-a{width:90%;float:right;display:inline-block;clear:both}#showcase-page .half-image{width:48%}}#showcase-page .project-metadata{margin-top:3%}#showcase-page .project-metadata section h3{color:#ed225d;font:700 italic 1rem Montserrat,sans-serif}#showcase-page .project-resources ul.links{font:500 .7rem Montserrat,sans-serif;letter-spacing:.01rem;line-height:1.5;margin:.5rem 0}#showcase-page .project-credit{font:italic 700 1.25rem Montserrat,sans-serif}#showcase-page .project-credit p{margin:.5rem 0}#showcase-page .creator-from,#showcase-page .note{font-size:.7rem}#showcase-page .qa-group{margin-bottom:2em}#showcase-page .project-q{margin-left:0;display:inline-block;clear:both;font:900 1.2rem Montserrat,sans-serif;line-height:1.5}#showcase-page code{font-size:1.1rem}#teach-page .case-list a:hover{border-bottom:none}#teach-page .heading{font:400 1.4rem Montserrat,sans-serif;color:#000;line-height:1.2em;padding-bottom:.4em;border-bottom:4px dotted #ed225d}#teach-page h3.title{margin-top:3em}#teach-page .search-filter{display:inline}#teach-page .search-filter label{display:inline-block;font:italic 900 1rem Montserrat,sans-serif;padding:6px 12px;text-align:left;white-space:nowrap;color:#ed225d;margin-bottom:.6em;margin-top:1.2em;border:1px solid #ed225d;cursor:pointer}#teach-page .search-filter label:hover{color:#fff;background-color:#ed225d}#teach-page .search-filter input[type=checkbox]{display:absolute;position:absolute;opacity:0}#teach-page ul.filters p.filter-title{font:400 .83rem Montserrat,sans-serif;color:#ed225d;height:50px;padding-top:20px;background:none;background-color:none;-webkit-box-shadow:none;box-shadow:none;display:inline-block;border:none;clear:both}#teach-page ul.filters li{display:inline;list-style:none;width:100%}#teach-page ul.filters li label{display:inline-block;border-radius:25px;font:200 .7rem Montserrat,sans-serif;color:#000;white-space:nowrap;margin:3px 0;-webkit-transition:.2s;-o-transition:.2s;transition:.2s;background:#fafafa;padding:6px 12px;cursor:pointer}#teach-page ul.filters li label:before{display:inline-block;padding:2px}#teach-page ul.filters li label:hover{color:#ed225d;background:#ffe8e8}#teach-page ul.filters li input[type=checkbox]:checked+label{color:#fff;background:#ed225d}#teach-page ul.filters li input[type=checkbox]{display:absolute;position:absolute;opacity:0}#teach-page ul.filters li.clear{display:block;clear:both}#teach-page .filter-panel{background-color:#fff;max-height:0;overflow:hidden;-webkit-transition:max-height .2s ease-out;-o-transition:max-height .2s ease-out;transition:max-height .2s ease-out;margin-bottom:.8em;padding:0 0 .4em}#teach-page .filter-panel p{margin:0;color:#333;font-size:.83em;height:50px;padding-top:20px;-webkit-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out;transition:all .5s ease-in-out}#teach-page .teach-intro p{font:400 1.2rem Times,sans-serif;line-height:1.5em}#teach-page .modal-title{margin-left:1em;margin-right:1em;font:400 1rem Montserrat,sans-serif;color:#ed225d;line-height:1.2em}#teach-page ul.cases li.clear{display:block;clear:both;margin-top:1em;margin-bottom:1.2em}#teach-page img{margin-bottom:1.4em}#teach-page img[alt]{font:.6rem Montserrat,sans-serif;color:#bababa}#teach-page .close{position:relative;color:#ffc7c7;float:right;font-size:40px;font-weight:700;margin-right:.4em;margin-top:.4em;cursor:pointer}#teach-page .close:hover,.close:focus{color:#ed225d;text-decoration:none;cursor:pointer}#teach-page .case label{margin:2px;padding:5px 8px;display:inline-block;border-radius:25px;font:.7rem Montserrat,sans-serif;color:#aaa;white-space:nowrap;color:#fff;background:#ed225d}#teach-page .modal-body::-webkit-scrollbar{width:5px;height:5px;border-radius:10px}#teach-page .modal-body::-webkit-scrollbar-track{background:#f1f1f1}#teach-page .modal-body::-webkit-scrollbar-thumb{background:#ffe8e8}#teach-page .case{margin-left:2em;margin-right:2em}#teach-page .case span{color:#ed225d;font:900 1.4rem Montserrat,sans-serif}#teach-page .case p.lead-name{font:900 Italic 1.2rem Montserrat,sans-serif;color:#ed225d;line-height:1.4em;border-bottom:1.4em}#teach-page .case .speech{position:relative;font:200 Italic .8rem Montserrat,sans-serif;color:#000;background:#ffe8e8;padding:.5em 1.2em;border-radius:.4em;border-bottom:none;margin-bottom:2em;margin-top:1em}#teach-page .case .speech:after{content:"";position:absolute;top:0;left:8%;width:0;height:0;border:10px solid transparent;border-bottom-color:#ffe8e8;border-top:0;margin-left:-10px;margin-top:-10px}#teach-page .case p.subtitle{font:400 1rem Montserrat,sans-serif;color:#ed225d}#teach-page .case p,#teach-page .case p.subtitle{line-height:1.4em;border-bottom:.1em dashed rgba(237,34,93,.15)}#teach-page .case p{font:400 1rem Times,sans-serif;color:#000}#teach-page .modal-footer,#teach-page .modal-header{margin-bottom:.8em}#teach-page .modal-body:-webkit-scrollbar{display:none}#teach-page .modal{display:none;position:fixed;z-index:100;width:100%;height:100%;top:0;left:0;right:0;overflow:auto;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:rgba(255,232,232,.5)}#teach-page .modal-content{position:fixed;background:#fff;top:2%;left:2%;right:2%;bottom:2%;margin:auto;border:1.2px solid #ffe8e8;max-width:740px;-webkit-box-shadow:10px 100px 30px -17px rgba(237,34,93,.5);box-shadow:10px 100px 30px -17px rgba(237,34,93,.5);-webkit-box-shadow:10px 100px 20px -17px rgba(237,34,93,.5);box-shadow:10px 100px 20px -17px rgba(237,34,93,.5);-webkit-box-shadow:10px 20px 10px -17px rgba(237,34,93,.5);box-shadow:10px 20px 10px -17px rgba(237,34,93,.5)}#teach-page .modal-body{margin:auto;height:85%;width:95%;overflow-y:auto}#teach-page .results-wrapper{width:100%;outline:none;background:#fff}#teach-page .results-wrapper ul li.case-list a.myBtn{overflow:hidden;text-overflow:ellipsis}#teach-page .case-list{margin-bottom:.8em;padding-bottom:.4em;font:400 1rem Times,sans-serif;line-height:1.2em;border-bottom:.1em dashed #ffe8e8}*,:after,:before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html{font-size:1.25em}body{margin:0;background-color:#fff;font-family:Times;font-weight:400;line-height:1.45;color:#333}p{font-size:1.2em;margin:.5em 0}.freeze{overflow:hidden}#menu li a:focus:active,#menu li a:focus:hover,#menu li a:link,#menu li a:visited{color:#ed225d;background:transparent;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}a:link,a:visited{color:#2d7bb6;text-decoration:none}#reference a:hover,a:active,a:hover{color:#ed225d;text-decoration:none;padding-bottom:.11em;border-bottom:.11em dashed #ed225d;-webkit-transition:border-bottom 30ms linear;-o-transition:border-bottom 30ms linear;transition:border-bottom 30ms linear}a.nounderline:hover{border:none}a.here{color:#ed225d;text-decoration:none;padding-bottom:.1em;border-bottom:transparent;border-bottom-color:#ed225d}.highlight{background-color:rgba(237,34,93,.15)}.container>div:first-of-type{margin-top:2em}h1,h2,h3,h4,h5{margin:1.414em 0 .5em;font-weight:inherit;line-height:1.2;font-family:Montserrat,sans-serif}h1{font-size:2.25em;margin:0}h2{font-size:1.5em;margin:1em 0 0}.code{font-family:Inconsolata,consolas,monospace}#backlink{margin:1.2em .444em 0 0;font-family:Montserrat,sans-serif;float:right}#backlink a{color:#afafaf}#backlink a:hover{color:#ed225d;border-bottom:none}#promo,#promo:visited{width:100%;background:#98fb98;margin:0;text-align:center;padding:.4em 0;background:#74ffb7;background:-webkit-radial-gradient(circle,#74ffb7 0,#8afff2 100%);background:-o-radial-gradient(circle,#74ffb7 0,#8afff2 100%);background:radial-gradient(circle,#74ffb7 0,#8afff2 100%);font-family:Montserrat,sans-serif;color:#ed225d!important}#promo:hover{background:#ed225d;color:#fff!important}#promo-link{margin:0!important;padding:0}#family a:link,#family a:visited{margin:.4em}#family a:active,#family a:hover{margin:.4em;border:none}#family{position:absolute;z-index:9999;top:0;left:0;width:100%;overflow:none;margin:0;border-bottom:1px solid rgba(51,51,51,.5);-webkit-box-shadow:0 0 10px #333;box-shadow:0 0 10px #333;background-color:hsla(0,0%,100%,.85)}#processing-sites{margin:.375em 0}#processing-sites li{list-style:none;display:inline-block;margin:0}#processing-sites li:first-child{margin-left:2em}#processing-sites li:last-child{float:right;margin-right:2em}.code-snippet{margin:0 0 0 1em;width:90%;clear:both}.column-span{margin:0 0 0 1em;padding:0;float:left;max-width:100%}.method_description p{margin-top:0}main{padding:0}.spacer{clear:both}ul{margin:0;padding:0;list-style:none}ol{font-size:1.2em}li{margin:0;padding:0}ul.list_view{margin:.5em 0 0 1em;padding:0;list-style:disc;list-style-position:outside;font-size:1.2em}ol ul.list_view{font-size:1em}ul.inside{margin:0 0 0 2em;padding:0;list-style:disc;list-style-position:inside}.image-row img{width:48%;height:14.3%}.image-row img+img{float:right;margin-right:0;margin-bottom:.25em}img,main div img{margin:.5em .5em 0 0;width:100%}p+img{margin-top:0}.video{width:100%}#lockup{position:absolute;top:-5.75em;left:1.25em;height:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#lockup object{margin:0;padding:0;border:none}#lockup a:focus{outline:0}.logo{padding:0;border:none;margin:0 0 .4em;height:4.5em;width:9.75em}#lockup p{color:#ed225d;font-size:.7em;font-family:Montserrat,sans-serif;margin:.5em 0 0 8.5em}#lockup a:link{border:transparent;height:4.5em;width:9.75em}.caption{margin-bottom:2.5em}.caption p,.caption span{text-align:right;font-size:.7em;font-family:Montserrat,sans-serif;padding-top:.25em}footer{clear:both;border-top:.1em dashed #ed225d;margin:2em 0}.videoWrapper{position:relative;padding-bottom:56.25%;height:0;margin-top:.5em}.videoWrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%}.ir{background-color:transparent;border:0;overflow:hidden;*text-indent:-9999px}.ir:before{content:"";display:block;width:0;height:150%}.hidden{display:none!important;visibility:hidden}.sr-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only.focusable:active,.sr-only.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.clearfix{*zoom:1}#notMobile-message{display:none;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}#asterisk-design-element,#isMobile-displayButton,.separator-design-element{display:none}.pointerevents #asterisk-design-element,.pointerevents .separator-design-element{pointer-events:none;display:inline-block}@media (min-width:780px){.container{width:49em!important;margin:11.5em auto}main{width:36em;padding:0!important}footer{width:48em}}@media (min-width:780px){.container{margin:11.5em auto;width:100%;padding:.8em 0 0;height:auto;min-height:100%}#home-page{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:row;-ms-flex-wrap:row;flex-wrap:row}main{padding:0 1em 0 0}#family,.small,footer,small{font-size:.7em}footer{clear:both}#i18n-btn{position:absolute;top:4em;right:1em}#i18n-btn a,#menu{font-family:Montserrat,sans-serif}#menu{list-style:none;margin:0 .75em 0 -1.85em;width:7.3em;height:100%;border-top:transparent;border-bottom:transparent;padding:0;font-size:.83em;z-index:100;position:relative;top:0}#menu li{float:none;margin:0 0 1em;text-align:right}#menu li:nth-child(11){margin-top:3em;padding-top:.5em}.left-column{width:48%;float:left;margin-bottom:40px}.right-column{width:48%;float:right;margin-right:0;margin-bottom:.25em}.narrow-left-column{width:32%;float:left}.wide-right-column{width:64%;float:right;margin-right:0;margin-bottom:.25em}.book{font-size:.7em}.column_0,.column_1,.column_2{float:left;width:11.333em}.column_0,.column_1{margin-right:1em}#collection-list-nav{width:100%;clear:both;border-bottom:1px dashed rgba(0,0,0,.2)}#collection-list-categories{font-family:Montserrat,sans-serif;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin:1em 0 1.5em}#collection-list-categories ul{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}#collection-list{margin:0}.group-name.first{margin-top:0!important}.column.group-name{margin-bottom:1em}#library-page .group-name{margin:2em 0 .5em}#library-page .column{margin-top:1em}#list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1em}}@media (max-width:780px){.tagline{display:none!important}#family{display:none}#i18n-btn{position:absolute;top:.5em;right:.7em;z-index:10}#search{float:left;margin-bottom:1em}#search,#search input[type=text]{width:100%}#search input[type=search],#search input[type=text]{font-size:1.5em}#lockup{position:absolute;top:2em;left:1em}.column-span{margin:0;padding:0 1em;float:left}#menu,#menu.top_menu{margin:6em 0 .5em;font-size:1.3em}#menu li{display:inline-block}#menu li:last-child a:after{content:""}#menu li a:after{content:","}#contribute-item:first-child{margin-left:0}.download_box{width:96%}.download_box.half_box{width:46%;margin-right:4%;float:left}#etc_list{font-size:1.2em;margin-top:1em}#asterisk-design-element,.separator-design-element{display:none!important;pointer-events:none}pre[class*=language-]{padding:.5em;width:100%}code{word-wrap:break-word;word-break:break-all}#credits{position:relative!important;z-index:2;margin-top:-7em;padding:0 2em 3em 1em;font-size:.5em;float:right;width:100%;text-align:right}#credits,#home-sketch-frame{display:none}#exampleDisplay,#exampleDisplay #exampleEditor,#exampleFrame{width:100%}#exampleDisplay .edit_button{left:-.58em}#exampleDisplay .reset_button{left:3em}#exampleDisplay .copy_button{left:6.44em}#exampleEditor{margin-top:3em}.small,footer,small{font-size:.5em}.paramtype{width:96%}}@media (max-width:400px){#i18n{margin-top:.75em!important}body{margin-top:-.75em!important}}iframe{border:none;width:100%}.iframe-container{overflow:hidden;position:relative}.iframe-container iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.cnv_div{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.cnv_div>*{width:100px;height:auto}#i18n-buttons{margin:0;background:#fff}#i18n-buttons li{list-style:none;display:inline-block;margin-left:.5em}#i18n-btn a{border:none;outline:none;font-size:.7em;color:#696969;z-index:5}#i18n-btn a:hover{color:#ed225d}#i18n-btn a.disabled{color:#ed225d;cursor:default}#asterisk-design-element{position:fixed;z-index:-1;opacity:.6;pointer-events:none}.separator-design-element{width:.33em;height:.33em;margin:0 .09em .18em;display:inline-block;overflow:hidden;text-indent:-100%;background:transparent url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCI+PHBhdGggZD0iTTE2LjkgMTAuM2w4LjUtMi42IDEuNyA1LjItOC41IDIuOSA1LjMgNy41LTQuNCAzLjItNS42LTcuMy01LjQgNy4xTDQuMiAyM2w1LjMtNy4yLTguNi0zLjIgMS43LTUuMiA4LjYgMi44VjEuNEgxN3Y4Ljl6IiBmaWxsPSIjZWQyMjVkIiBzdHJva2U9IiNlZDIyNWQiLz48L3N2Zz4=");-webkit-background-size:.33em .33em;background-size:.33em}#home-page #asterisk-design-element{bottom:-8%;right:20%;height:12em;width:12em;opacity:1}#examples-page #asterisk-design-element,#learn-page #asterisk-design-element,#other-content-types-page #asterisk-design-element{bottom:-14%;left:-20%;height:25em;width:25em;-webkit-transform:rotate(-1deg);-ms-transform:rotate(-1deg);-o-transform:rotate(-1deg);transform:rotate(-1deg)}#books-page #asterisk-design-element,#libraries-page #asterisk-design-element{bottom:-19%;right:-16%;height:28em;width:28em;-webkit-transform:rotate(2deg);-ms-transform:rotate(2deg);-o-transform:rotate(2deg);transform:rotate(2deg)}#community-page #asterisk-design-element,#get-started-page #asterisk-design-element{top:10%;right:-20%;height:30em;width:30em;-webkit-transform:rotate(2deg);-ms-transform:rotate(2deg);-o-transform:rotate(2deg);transform:rotate(2deg)}#download-page #asterisk-design-element,#reference-page #asterisk-design-element{top:7%;left:1%;height:10em;width:10em;-webkit-transform:rotate(-21deg);-ms-transform:rotate(-21deg);-o-transform:rotate(-21deg);transform:rotate(-21deg)}.email-octopus-email-address{color:#ed225d;text-decoration:none;padding-bottom:.11em;outline:none;border:none;border-bottom:.11em dashed #ed225d;-webkit-transition:border-bottom 30ms linear;-o-transition:border-bottom 30ms linear;transition:border-bottom 30ms linear;width:13em}.email-octopus-form-row-hp{position:absolute;left:-5000px}.email-octopus-form-row button{border:1px solid #ed225d;color:#ed225d;padding:.4em .6em;margin:1em 0 0;font-family:Montserrat,sans-serif;display:block}.email-octopus-form-row button:hover{background-color:#ed225d;color:#fff}.email-octopus-email-address::-webkit-input-placeholder{color:#ababab}.email-octopus-email-address:-moz-placeholder,.email-octopus-email-address::-moz-placeholder{color:#ababab}.email-octopus-email-address:-ms-input-placeholder{color:#ababab}@media (min-width:720px){.email-octopus-email-address{width:16em}.email-octopus-form-row button{margin:0 0 0 .5em;display:inline}}
+/*# sourceMappingURL=maps/all.css.map */
\ No newline at end of file
diff --git a/dist/assets/css/maps/all.css.map b/dist/assets/css/maps/all.css.map
new file mode 100644
index 0000000000..d3dc28567d
--- /dev/null
+++ b/dist/assets/css/maps/all.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../all.css"],"names":[],"mappings":"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AY,CACb,AAED,oCACE,yDAEE,YAAY,AACZ,wBAAwB,AAExB,eAAgB,CACjB,CAEF,AAGD,gEAGE,aAAe,CAChB,AAED,iBAEE,mBAAoB,AACpB,wBAA0B,CAC3B,AAED,uCALE,iBAAmB,CAOpB,AAED,iCACE,kBAAmB,AACnB,oBAAqB,AACrB,MAAO,AACP,eAAgB,AAChB,YAAa,AACb,UAAW,AACX,oBAAqB,AACrB,4BAA6B,AAE7B,yBAA0B,AAC1B,sBAAuB,AACvB,qBAAsB,AACtB,gBAAkB,CAEnB,AAED,wBACE,oBAAqB,AACrB,cAAe,AACf,4BAA8B,CAC/B,AAED,+BACE,4BAA6B,AAC7B,WAAY,AACZ,cAAe,AACf,mBAAqB,AACrB,gBAAkB,CACnB;CAAA,AAaD,yBAIE,UAAY,CACb,AAED,SACE,mBAAoB,AACpB,iBAA6B,AAC7B,WAAa,CACd,AAED,KACE,cAAe,AACf,eAAiB,CAClB,AAQD,iBACE,mBAAoB,AACpB,gBAAkB,CACnB,AAED,YACE,mBAAoB,AACpB,gBAAkB,CACnB,AAMD,GACE,cAAe,AACf,WAAY,AACZ,SAAU,AACV,0BAA2B,AAC3B,aAAc,AACd,SAAW,CACZ,AAMD,IACE,qBAAuB,CACxB,AAED,aACE,YAAa,AACb,UAAY,CACb,AAED,cACE,YAAa,AACb,WAAa,CACd,AAED,eACE,YAAa,AACb,UAAY,CACb,AAED,iBACE,YAAa,AACb,UAAY,CACb,AAED,gBACE,YAAa,AACb,WAAa,CACd,AAED,kBACE,YAAa,AACb,WAAa,CACd,AAED,iBACE,YAAa,AACb,iBAAmB,CACpB,AAED,UACE,WAAa,CACd,AAED,QACE,WAAa,CACd,AAED,eACE,YAAa,AACb,iBAAmB,CACpB,AAMD,SACE,SAAU,AACV,SAAU,AACV,SAAW,CACZ,AAMD,SACE,eAAiB,CAClB,AAOD,SACE,YAAc,CACf,AAED,iBACE,mBAAqB,CACtB,AAED,mBACE,kBAAoB,CACrB,AAED,UACE,kBAAmB,AACnB,cAAe,AACf,YAAa,AACb,WAAa,CACd,AAED,YACE,kBAAmB,AACnB,KAAO,CACR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BAAqC,AACrC,kBAAmB,AACnB,UAAW,AACX,aAAc,AACd,UAAY,CACb,AAED,yBACE,2CACE,WAAa,CACd,CACF,AACD,yBACE,2CACE,WAAa,CACd,CACF,AAOD,uBACE,iBAAmB,CACpB,AAQD,wBACE,UAAY,CACb,AAED,oBACE,eAAiB,CAClB,AAED,oBACE,cAAe,AACf,kCAAsC,AACtC,eAAkB,CACnB,AAED,oBACE,oBAAsB,CACvB,AAED,wBACE,SAAU,AACV,oBAAc,AAAd,qBAAc,AAAd,oBAAc,AAAd,aAAc,AACd,8BAAoB,AAApB,6BAAoB,AAApB,2BAAoB,AAApB,uBAAoB,AAApB,mBAAoB,AACpB,uBAAgB,AAAhB,mBAAgB,AAAhB,cAAgB,CACjB,AACD,uBACE,WAAY,AACZ,iBAAmB,CACpB,AAED,gCASE,eAAgB,AAChB,iBAAmB,CACpB,AAED,gCACE,aAAe,CAChB,AAED,MACE,UAAY,CACb,AAED,SACE,kBAAsB,AACtB,kBAAmB,AACnB,oBAAqB,AACrB,2CAAgD,AAChD,aAAe,CAChB,AAED,SACE,iBAAkB,AAClB,cAAkB,CACnB,AAED,SACE,eAAkB,CACnB,AAED,SACE,iBAAmB,CACpB,AAED,aACE,WAAY,AACZ,cAAe,AACf,UAAY,CACb,AAED,YACE,UAAY,CACb,AAED,4BAEE,WAAY,AACZ,YAAc,CACf,AAED,WACE,qBAAsB,AACtB,cAAe,AACf,gBAAiB,AACjB,eAAiB,CAClB,AAED,aACE,eAAgB,AAChB,aAAe,CAChB,AAED,WAEE,gBAAiB,AACjB,UAAW,AACX,kBAAoB,CACrB,AAED,qCANE,oBAAsB,CAQvB,AAED,gCACE,aAAe,CAChB,AAID,aACE,iBAAmB,CACpB,AAED,+BACE,kBAAmB,AACnB,SAAU,AACV,cAAe,AACf,gBAAiB,AACjB,YAAa,AACb,aAAc,AACd,cAAgB,CACjB,AAED,wCACE,OAAU,AACV,aAAe,CAChB,AAED,6BACE,kBAAmB,AACnB,MAAO,AACP,OAAQ,AACR,iBAAmB,AACnB,WAAY,AACZ,mBAAqB,CACtB,AAED,+BACE,mBAAqB,CACtB,AAED,gCACE,oBAAc,AAAd,qBAAc,AAAd,oBAAc,AAAd,aAAc,AACd,8BAA4B,AAA5B,8BAA4B,AAA5B,mCAA4B,AAA5B,+BAA4B,AAA5B,2BAA4B,AAC5B,kBAAmB,AACnB,mBAAqB,CACtB,AAED,0CACE,kCAAsC,AACtC,cAAe,AACf,WAAY,AACZ,sCAA4C,AAC5C,uBAAwB,AACxB,aAAc,AACd,gBAAmB,CACpB,AAED,wFAEE,cAAe,AACf,iCAAuC,CACxC,AAED,wCACE,kBAAmB,AACnB,SAAW,AACX,WAAY,AACZ,aAAc,AAEd,aAAc,AACd,sBAAuB,AACvB,wBAAiC,AACjC,cAAgB,CACjB,AAED,gBACE,kBAAmB,AACnB,kCAAsC,AACtC,cAAe,AACf,cAAe,AACf,sCAA2C,AAC3C,uBAAwB,AACxB,YAAc,CACf,AAED,oCACE,WAAY,AACZ,eAAgB,AAEhB,6BAAuB,AACvB,iBAAmB,AACnB,eAAgB,AAChB,iBAAkB,AAClB,iCAAgC,AAAhC,yBAAgC,AAChC,oBAAc,AAAd,qBAAc,AAAd,oBAAc,AAAd,YAAc,CACf,AAED,kDACE,cAAgB,CACjB,AAGD,yBACE,+BACE,iBAAmB,AACnB,UAAa,CACd,AAED,oCACE,WAAY,AACZ,iBAAkB,AAClB,kCAAiC,AAAjC,0BAAiC,AACjC,aAAe,CAChB,AAED,wCACE,8BAAuB,AAAvB,sBAAuB,AACvB,OAAQ,AACR,WAAY,AACZ,YAAe,CAChB,AAED,0BACE,SAAW,CACZ,AAED,aACE,eAAiB,CAClB,AAED,aACE,MAAQ,CACT,AAED,cACE,WAAa,CACd,AAED,aACE,WAAa,CACd,CACF,AAED,KACE,kBAAoB,CACrB,AAED,eACE,gDAAkD,CACnD,AAED,oDAEE,qCAA2C,AAC3C,kCAAsC,AACtC,iBAAkB,AAClB,YAAc,CACf,AAED,wEAEE,UAAY,CACb,AAED,4DAGE,UAAY,CACb,AAED,+BACE,cAAe,AACf,sBAAuB,AACvB,kBAAmB,AACnB,mBAAqB,CACtB,AAED,6CACE,qBAAuB,CAKxB,AAED,oDACE,WAAY,AACZ,qBAAuB,CACxB,AAED,4CACE,QAAU,CACX,AAED,mDACE,eAAgB,AAChB,UAAY,CACb,AAED,QACE,WAAa,CACd,AAED,6CACE,gCAAqC,AACrC,aAAe,AACf,iBAAkB,AAClB,gBAAiB,AACjB,cAAe,AACf,iBAAmB,CACpB,AAED,0CACE,iBAAkB,AAClB,iBAAkB,AAClB,cAAgB,CACjB,AAED,0CACE,qBAA2B,AAC3B,eAAgB,AAChB,gBAAkB,CACnB,AAED,eACE,WAAa,CACd,AAED,YACE,UAAY,CACb,AAED,aACE,aAAe,CAChB,AAcD,iBACE,gBAAkB,AAClB,gBAAiB,AACjB,qBAAsB,AACtB,YAAa,AACb,aAAc,AACd,WAAY,AACZ,yBAA0B,AAC1B,qBAAsB,AACtB,iBAAmB,CACpB,AAED,2BACE,kBAAmB,AACnB,WAAY,AACZ,SAAU,AACV,YAAc,CACf,AAED,WAEE,aAAc,AACd,kBAAmB,AACnB,gBAAkB,AAClB,gBAAkB,CACnB,AAED,aAEE,WAAY,AACZ,YAAa,AACb,kBAAmB,AACnB,MAAO,AACP,MAAQ,CACT,AAED,OACE,UAAY,CACb,AAED,oBACE,iBAAkB,AAClB,gBAAmB,AACnB,oBAAsB,AAEtB,kCAA6B,CAC9B,AAQD,OACE,iBAAmB,CACpB,AAED,wBACE,eAAoB,CACrB,AAED,UACE,WAAa,AACb,kBAAmB,AACnB,MAAO,AACP,UAAY,CACb,AAED,gBACE,aAAe,CAChB,AAED,GACE,iBAAkB,AAClB,cAAkB,CACnB,AAED,aACE,mBAAoB,AACpB,eAAiB,CAClB,AAED,0BACE,sBAAwB,AACxB,aAAgB,CACjB,AAED,oCACE,2BAAoB,AAApB,wBAAoB,AAApB,kBAAoB,CACrB,AAED,kBACE,oBAAsB,CACvB,AAED,6CAGE,WAAY,AACZ,WAAa,CACd,AAED,gBACE,oBAAc,AAAd,qBAAc,AAAd,oBAAc,AAAd,aAAc,AACd,4BAAkB,AAAlB,6BAAkB,AAAlB,yBAAkB,AAAlB,qBAAkB,AAAlB,gBAAkB,CACnB,AAED,mBACE,eAAgB,AAChB,MAAO,AACP,OAAQ,AACR,QAAS,AACT,SAAU,AACV,aAAc,AACd,WAAa,CACd,AAED,uBACE,cAAe,AACf,kCAAuC,AACvC,YAAa,AACb,qBAAwB,AACxB,8BAAqC,AACrC,kBAAmB,AACnB,OAAQ,AACR,SAAW,CACZ,AAED,6BACE,aAAc,AACd,UAAY,CACb,AAED,8BACE,UAAW,AACX,UAAY,CACb,AAED,6BACE,aAAc,AACd,UAAY,CACb,AAED,6BACE,eAAiB,CAClB,AAED,4BACE,kBAAmB,AACnB,4BAAS,AAAT,gBAAS,AAAT,iBAAS,AAAT,OAAS,CACV,AAED,8BACE,YAAa,AACb,4BAAS,AAAT,gBAAS,AAAT,iBAAS,AAAT,OAAS,CACV,AAED,+BACE,aAAc,AACd,YAAa,AACb,gBAAiB,AACjB,gBAAkB,AAClB,WAAY,AACZ,2CAAgD,AAChD,cAAe,AACf,sBAAuB,AACvB,gBAAiB,AACjB,4BAAS,AAAT,gBAAS,AAAT,iBAAS,AAAT,OAAS,CACV,AAED,gDACE,sBAAuB,AACvB,kBAAmB,AACnB,gBAAiB,AACjB,wBAA0B,CAC3B,AAED,yDACE,wBAA0B,CAC3B,AAED,4DACE,sBAA0B,AAC1B,UAAe,CAChB,AAED,0DACE,wBAA0B,AAC1B,UAAe,CAChB,AAMD,oFAEE,aAAe,CAEhB,AAKD,sIAGE,aAAe,CAEhB,AAKD,qIAGE,aAAe,CAEhB,AAKD,4CACE,aAAe,CAEhB,AAKD,2CACE,aAAe,CAEhB,AAED,6CACE,UAAY,CACb,AAID,2CACE,UAAY,CAEb,AAMD,4FACE,UAAY,CACb,AAED,oDACE,qBAAuB,AACvB,UAAY,CACb,AAED,aACE,sBAAuB,AACvB,eAAgB,AAChB,aAAc,AACd,aAA0B,CAC3B,AAOD,WACE,iBAAmB,CACpB,AAED,kCACE,6CAAiD,AACjD,cAAe,AACf,gBAAiB,AACjB,wBAA0B,CAC3B,AAED,iCACE,sCAA0C,AAC1C,iBAAmB,CACpB,AAED,qEAEE,2CAA+C,AAC/C,cAAe,AACf,qBAAwB,CACzB,AAED,oHAIE,eAAiB,CAClB,AAED,wBACE,eAAkB,CACnB,AAED,kCACE,cAAgB,CACjB,AAED,2CACE,0CAA+C,CAChD,AAED,2CACE,mCAAwC,CACzC,AAED,gDACE,cAAe,AACf,mBAAsB,CACvB,AAED,yBACE,iBAAkB,AAClB,oBAAsB,CACvB,AAED,8DAEE,kBAAqB,AACrB,kBAAmB,AACnB,MAAS,AACT,OAAU,AACV,yBAA0B,AAC1B,qCAA8B,AAA9B,6BAA8B,AAE9B,kCAAsC,AACtC,cAAe,AACf,sBAAwB,AACxB,2BAAqB,AAArB,sBAAqB,AAArB,kBAAqB,CACtB,AAED,yBACE,8DAEE,kBAAqB,AACrB,iCAAsC,CACvC,CACF,AAED,iCACE,QAAS,AACT,SAAU,AACV,wBAAiB,AAAjB,eAAiB,CAClB,AAED,gFAEE,iBAAkB,AAClB,cAAe,AACf,sBAAwB,AACxB,eAAiB,CAClB,AAED,0CACE,YAAc,CACf,AACD,8CACE,UAAY,CACb,AACD,uDACE,WAAa,CACd,AAED,uDACE,qBAAsB,AACtB,aAAc,AACd,WAAa,CACd,AAED,cACE,cAAgB,CACjB,AAED,kBACE,cAAe,AACf,oBAAqB,AACrB,qBAAsB,AACtB,oBAAc,AAAd,aAAc,AACd,uBAAwB,AACxB,mBAAgB,AAAhB,eAAgB,AAChB,eAAiB,AACjB,QAAY,CACb,AACD,SACE,cAAgB,CACjB,AACD,kCACE,WAAY,AACZ,oBAAsB,CACvB,AACD,aACE,YAAgB,CACjB,AACD,qBACE,qBAAsB,AACtB,iBAAkB,AAClB,yBAA0B,AAC1B,mBAAoB,AACpB,iCAAsC,AACtC,UAAY,CACb,AACD,kCACE,QAAY,CACb,AAqBD,eACE,cAAgB,CACjB,AAED,gCACE,eAAiB,CAClB,AAED,yBAME,kCACE,4CAAiD,CAClD,AAED,iCACE,mBAAoB,AACpB,aAAe,CAChB,AAED,iCACE,oBAAc,AAAd,qBAAc,AAAd,oBAAc,AAAd,YAAc,CACf,AAED,kCACE,gBAAkB,CACnB,AAED,0BACE,UAAW,AACX,YAAa,AACb,qBAAsB,AACtB,UAAY,CACb,AAED,2BACE,SAAW,CACZ,CACF,AAED,iCACE,aAAe,CAChB,AAED,4CACE,cA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AAR,eAAQ,AAAR,WAAQ,AAAR,MAAQ,CACT,AACD,iBACE,QAAU,CACX,AACD,kBACE,sBAAyB,CAC1B,AACD,mBACE,iBAAmB,CACpB,AAED,0BACE,iBAAsB,CACvB,AACD,sBACE,cAAgB,CACjB,AACD,MACE,oBAAc,AAAd,qBAAc,AAAd,oBAAc,AAAd,aAAc,AACd,8BAAoB,AAApB,6BAAoB,AAApB,2BAAoB,AAApB,uBAAoB,AAApB,mBAAoB,AACpB,uBAAgB,AAAhB,mBAAgB,AAAhB,eAAgB,AAChB,iBAAmB,CACpB,CACF,AAED,yBACE,SACE,sBAAyB,CAC1B,AAED,QACE,YAAc,CACf,AAED,UACE,kBAAmB,AACnB,SAAW,AACX,WAAa,AACb,UAAY,CACb,AAED,QAEE,WAAY,AACZ,iBAAmB,CACpB,AAED,iCALE,UAAY,CAOb,AAED,oDAEE,eAAiB,CAClB,AAED,QACE,kBAAmB,AACnB,QAAS,AACT,QAAU,CACX,AACD,aACE,SAAS,AACT,cAAe,AACf,UAAY,CACb,AACD,qBAEE,kBAAsB,AACtB,eAAiB,CAClB,AACD,SACE,oBAAsB,CACvB,AAED,4BACE,UAAY,CACb,AAED,iBACE,WAAa,CACd,AAED,6BACE,aAAiB,CAClB,AACD,cACE,SAAW,CACZ,AACD,uBACE,UAAW,AACX,gBAAiB,AACjB,UAAY,CACb,AACD,UACE,gBAAiB,AACjB,cAAgB,CACjB,AACD,mDAEE,uBAAyB,AACzB,mBAAqB,CACtB,AACD,sBACE,aAAqB,AACrB,UAAY,CACb,AAED,KACE,qBAAsB,AACtB,oBAAsB,CACvB,AACD,SACE,4BAA8B,AAC9B,UAAW,AACX,gBAAiB,AACjB,sBAAuB,AACvB,eAAiB,AACjB,YAAa,AACb,WAAY,AACZ,gBAAkB,CAGnB,AACD,4BAHE,YAAc,CAMf,AACD,6DAGE,UAAY,CACb,AACD,6BACE,WAAc,CACf,AACD,8BACE,QAAU,CACX,AACD,6BACE,WAAa,CACd,AACD,eACE,cAAgB,CACjB,AACD,oBAGE,cAAiB,CAClB,AACD,WACE,SAAW,CACZ,CACF,AAED,yBACE,MACE,0BAA8B,CAC/B,AACD,KACE,2BAA+B,CAChC,CACF,AAED,OACE,YAAa,AACb,UAAY,CACb,AAED,kBACE,gBAAiB,AACjB,iBAAmB,CACpB,AAED,yBACE,SAAU,AACV,YAAa,AACb,OAAQ,AACR,kBAAmB,AACnB,MAAO,AACP,UAAY,CACb,AAED,SAIE,2BAAqB,AAArB,4BAAqB,AAArB,2BAAqB,AAArB,oBAAqB,AACrB,4BAAuB,AAAvB,6BAAuB,AAAvB,8BAAuB,AAAvB,0BAAuB,AAAvB,qBAAuB,CACxB,AAED,WACE,YAAa,AACb,WAAa,CACd,AAQD,cACE,SAAU,AACV,eAAkB,CACnB,AAED,iBACE,gBAAiB,AACjB,qBAAsB,AACtB,gBAAmB,CACpB,AAED,YACE,YAAa,AACb,aAAc,AACd,eAAiB,AACjB,cAAe,AACf,SAAW,CACZ,AAED,kBACE,aAAe,CAChB,AAED,qBACE,cAAe,AACf,cAAgB,CACjB,AAUD,yBACE,eAAgB,AAChB,WAAY,AACZ,WAAa,AACb,mBAAqB,CACtB,AAID,0BACE,YAAc,AACd,aAAe,AACf,qBAA+B,AAC/B,qBAAsB,AACtB,gBAAiB,AACjB,kBAAmB,AACnB,6WACoY,AACpY,oCAAwB,AAAxB,qBAAwB,CACzB,AAED,oCACE,WAAY,AACZ,UAAW,AACX,YAAa,AACb,WAAY,AACZ,SAAW,CACZ,AAED,gIAGE,YAAa,AACb,UAAW,AACX,YAAa,AACb,WAAY,AACZ,gCAAiC,AAEjC,4BAA6B,AAC7B,2BAA4B,AAC5B,uBAAyB,CAC1B,AAED,8EAEE,YAAa,AACb,WAAY,AACZ,YAAa,AACb,WAAY,AACZ,+BAAgC,AAEhC,2BAA4B,AAC5B,0BAA2B,AAC3B,sBAAwB,CACzB,AAED,oFAEE,QAAS,AACT,WAAY,AACZ,YAAa,AACb,WAAY,AACZ,+BAAgC,AAEhC,2BAA4B,AAC5B,0BAA2B,AAC3B,sBAAwB,CACzB,AAED,iFAEE,OAAQ,AACR,QAAS,AACT,YAAa,AACb,WAAY,AACZ,iCAAkC,AAElC,6BAA8B,AAC9B,4BAA6B,AAC7B,wBAA0B,CAC3B,AAED,6BACE,cAAe,AACf,qBAAsB,AACtB,qBAAuB,AACvB,aAAc,AAGd,YAA6B,AAA7B,mCAA6B,AAC7B,6CAAsC,AAAtC,wCAAsC,AAAtC,qCAAsC,AACtC,UAAY,CACb,AAED,2BACE,kBAAmB,AACnB,YAAc,CACf,AAED,+BACE,yBAA0B,AAC1B,cAAe,AACf,kBAAqB,AACrB,eAAkB,AAClB,kCAAsC,AACtC,aAAe,CAChB,AAED,qCACE,yBAA0B,AAC1B,UAAa,CACd,AAED,wDACE,aAAe,CAChB,AAID,6FACE,aAAe,CAChB,AACD,mDACE,aAAe,CAChB,AAED,yBACE,6BACE,UAAY,CACb,AAED,+BAEE,kBAAmB,AACnB,cAAgB,CACjB,CACF","file":"../all.css","sourcesContent":["/*! normalize.css v1.1.0 | MIT License | git.io/normalize */\r\n\r\n/* ==========================================================================\r\n HTML5 display definitions\r\n ========================================================================== */\r\n\r\n/**\r\n * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3.\r\n */\r\n\r\narticle,\r\naside,\r\ndetails,\r\nfigcaption,\r\nfigure,\r\nfooter,\r\nheader,\r\nhgroup,\r\nmain,\r\nnav,\r\nsection,\r\nsummary {\r\n display: block;\r\n}\r\n\r\n/**\r\n * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3.\r\n */\r\n\r\naudio,\r\ncanvas,\r\nvideo {\r\n display: inline-block;\r\n *display: inline;\r\n *zoom: 1;\r\n}\r\n\r\n/**\r\n * Prevent modern browsers from displaying `audio` without controls.\r\n * Remove excess height in iOS 5 devices.\r\n */\r\n\r\naudio:not([controls]) {\r\n display: none;\r\n height: 0;\r\n}\r\n\r\n/**\r\n * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4.\r\n * Known issue: no IE 6 support.\r\n */\r\n\r\n[hidden] {\r\n display: none;\r\n}\r\n\r\n/* ==========================================================================\r\n Base\r\n ========================================================================== */\r\n\r\n/**\r\n * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using\r\n * `em` units.\r\n * 2. Prevent iOS text size adjust after orientation change, without disabling\r\n * user zoom.\r\n */\r\n\r\nhtml {\r\n font-size: 100%; /* 1 */\r\n -webkit-text-size-adjust: 100%; /* 2 */\r\n -ms-text-size-adjust: 100%; /* 2 */\r\n}\r\n\r\n/**\r\n * Address `font-family` inconsistency between `textarea` and other form\r\n * elements.\r\n */\r\n\r\nhtml,\r\nbutton,\r\ninput,\r\nselect,\r\ntextarea {\r\n font-family: sans-serif;\r\n}\r\n\r\n/**\r\n * Address margins handled incorrectly in IE 6/7.\r\n */\r\n\r\nbody {\r\n margin: 0;\r\n}\r\n\r\n/* ==========================================================================\r\n Links\r\n ========================================================================== */\r\n\r\n/**\r\n * Address `outline` inconsistency between Chrome and other browsers.\r\n */\r\n\r\na:focus {\r\n outline: thin dotted;\r\n}\r\n\r\n/**\r\n * Improve readability when focused and also mouse hovered in all browsers.\r\n */\r\n\r\na:active,\r\na:hover {\r\n outline: 0;\r\n}\r\n\r\n/* ==========================================================================\r\n Typography\r\n ========================================================================== */\r\n\r\n/**\r\n * Address font sizes and margins set differently in IE 6/7.\r\n * Address font sizes within `section` and `article` in Firefox 4+, Safari 5,\r\n * and Chrome.\r\n */\r\n\r\nh1 {\r\n font-size: 2em;\r\n margin: 0.67em 0;\r\n}\r\n\r\nh2 {\r\n font-size: 1.5em;\r\n margin: 0.83em 0;\r\n}\r\n\r\nh3 {\r\n font-size: 1.17em;\r\n margin: 1em 0;\r\n}\r\n\r\nh4 {\r\n font-size: 1em;\r\n margin: 1.33em 0;\r\n}\r\n\r\nh5 {\r\n font-size: 0.83em;\r\n margin: 1.67em 0;\r\n}\r\n\r\nh6 {\r\n font-size: 0.67em;\r\n margin: 2.33em 0;\r\n}\r\n\r\n/**\r\n * Address styling not present in IE 7/8/9, Safari 5, and Chrome.\r\n */\r\n\r\nabbr[title] {\r\n border-bottom: 1px dotted;\r\n}\r\n\r\n/**\r\n * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome.\r\n */\r\n\r\nb,\r\nstrong {\r\n font-weight: bold;\r\n}\r\n\r\nblockquote {\r\n margin: 1em 40px;\r\n}\r\n\r\n/**\r\n * Address styling not present in Safari 5 and Chrome.\r\n */\r\n\r\ndfn {\r\n font-style: italic;\r\n}\r\n\r\n/**\r\n * Address differences between Firefox and other browsers.\r\n * Known issue: no IE 6/7 normalization.\r\n */\r\n\r\nhr {\r\n -moz-box-sizing: content-box;\r\n box-sizing: content-box;\r\n height: 0;\r\n}\r\n\r\n/**\r\n * Address styling not present in IE 6/7/8/9.\r\n */\r\n\r\nmark {\r\n background: #ff0;\r\n color: #000;\r\n}\r\n\r\n/**\r\n * Address margins set differently in IE 6/7.\r\n */\r\n\r\np,\r\npre {\r\n margin: 1em 0;\r\n}\r\n\r\n/**\r\n * Correct font family set oddly in IE 6, Safari 4/5, and Chrome.\r\n */\r\n\r\ncode,\r\nkbd,\r\npre,\r\nsamp {\r\n font-family: monospace, serif;\r\n _font-family: 'courier new', monospace;\r\n font-size: 1em;\r\n}\r\n\r\n/**\r\n * Improve readability of pre-formatted text in all browsers.\r\n */\r\n\r\npre {\r\n white-space: pre;\r\n white-space: pre-wrap;\r\n word-wrap: break-word;\r\n}\r\n\r\n/**\r\n * Address CSS quotes not supported in IE 6/7.\r\n */\r\n\r\nq {\r\n quotes: none;\r\n}\r\n\r\n/**\r\n * Address `quotes` property not supported in Safari 4.\r\n */\r\n\r\nq:before,\r\nq:after {\r\n content: '';\r\n content: none;\r\n}\r\n\r\n/**\r\n * Address inconsistent and variable font size in all browsers.\r\n */\r\n\r\nsmall {\r\n font-size: 80%;\r\n}\r\n\r\n/**\r\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\r\n */\r\n\r\nsub,\r\nsup {\r\n font-size: 75%;\r\n line-height: 0;\r\n position: relative;\r\n vertical-align: baseline;\r\n}\r\n\r\nsup {\r\n top: -0.5em;\r\n}\r\n\r\nsub {\r\n bottom: -0.25em;\r\n}\r\n\r\n/* ==========================================================================\r\n Lists\r\n ========================================================================== */\r\n\r\n/**\r\n * Address margins set differently in IE 6/7.\r\n */\r\n\r\ndl,\r\nmenu,\r\nol,\r\nul {\r\n margin: 1em 0;\r\n}\r\n\r\ndd {\r\n margin: 0 0 0 40px;\r\n}\r\n\r\n/**\r\n * Address paddings set differently in IE 6/7.\r\n */\r\n\r\nmenu,\r\nol,\r\nul {\r\n padding: 0 0 0 40px;\r\n}\r\n\r\n/**\r\n * Correct list images handled incorrectly in IE 7.\r\n */\r\n\r\nnav ul,\r\nnav ol {\r\n list-style: none;\r\n list-style-image: none;\r\n}\r\n\r\n/* ==========================================================================\r\n Embedded content\r\n ========================================================================== */\r\n\r\n/**\r\n * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3.\r\n * 2. Improve image quality when scaled in IE 7.\r\n */\r\n\r\nimg {\r\n border: 0; /* 1 */\r\n -ms-interpolation-mode: bicubic; /* 2 */\r\n}\r\n\r\n/**\r\n * Correct overflow displayed oddly in IE 9.\r\n */\r\n\r\nsvg:not(:root) {\r\n overflow: hidden;\r\n}\r\n\r\n/* ==========================================================================\r\n Figures\r\n ========================================================================== */\r\n\r\n/**\r\n * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11.\r\n */\r\n\r\nfigure {\r\n margin: 0;\r\n}\r\n\r\n/* ==========================================================================\r\n Forms\r\n ========================================================================== */\r\n\r\n/**\r\n * Correct margin displayed oddly in IE 6/7.\r\n */\r\n\r\nform {\r\n margin: 0;\r\n}\r\n\r\n/**\r\n * Define consistent border, margin, and padding.\r\n */\r\n\r\nfieldset {\r\n border: 1px solid #c0c0c0;\r\n margin: 0 2px;\r\n padding: 0.35em 0.625em 0.75em;\r\n}\r\n\r\n/**\r\n * 1. Correct color not being inherited in IE 6/7/8/9.\r\n * 2. Correct text not wrapping in Firefox 3.\r\n * 3. Correct alignment displayed oddly in IE 6/7.\r\n */\r\n\r\nlegend {\r\n border: 0; /* 1 */\r\n padding: 0;\r\n white-space: normal; /* 2 */\r\n *margin-left: -7px; /* 3 */\r\n}\r\n\r\n/**\r\n * 1. Correct font size not being inherited in all browsers.\r\n * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5,\r\n * and Chrome.\r\n * 3. Improve appearance and consistency in all browsers.\r\n */\r\n\r\nbutton,\r\ninput,\r\nselect,\r\ntextarea {\r\n font-size: 100%; /* 1 */\r\n margin: 0; /* 2 */\r\n vertical-align: baseline; /* 3 */\r\n *vertical-align: middle; /* 3 */\r\n}\r\n\r\n/**\r\n * Address Firefox 3+ setting `line-height` on `input` using `!important` in\r\n * the UA stylesheet.\r\n */\r\n\r\nbutton,\r\ninput {\r\n line-height: normal;\r\n}\r\n\r\n/**\r\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\r\n * All other form control elements do not inherit `text-transform` values.\r\n * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+.\r\n * Correct `select` style inheritance in Firefox 4+ and Opera.\r\n */\r\n\r\nbutton,\r\nselect {\r\n text-transform: none;\r\n}\r\n\r\n/**\r\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\r\n * and `video` controls.\r\n * 2. Correct inability to style clickable `input` types in iOS.\r\n * 3. Improve usability and consistency of cursor style between image-type\r\n * `input` and others.\r\n * 4. Remove inner spacing in IE 7 without affecting normal text inputs.\r\n * Known issue: inner spacing remains in IE 6.\r\n */\r\n\r\nbutton,\r\nhtml input[type=\"button\"], /* 1 */\r\ninput[type=\"reset\"],\r\ninput[type=\"submit\"] {\r\n -webkit-appearance: button; /* 2 */\r\n cursor: pointer; /* 3 */\r\n *overflow: visible; /* 4 */\r\n}\r\n\r\n/**\r\n * Re-set default cursor for disabled elements.\r\n */\r\n\r\nbutton[disabled],\r\nhtml input[disabled] {\r\n cursor: default;\r\n}\r\n\r\n/**\r\n * 1. Address box sizing set to content-box in IE 8/9.\r\n * 2. Remove excess padding in IE 8/9.\r\n * 3. Remove excess padding in IE 7.\r\n * Known issue: excess padding remains in IE 6.\r\n */\r\n\r\ninput[type=\"checkbox\"],\r\ninput[type=\"radio\"] {\r\n box-sizing: border-box; /* 1 */\r\n padding: 0; /* 2 */\r\n *height: 13px; /* 3 */\r\n *width: 13px; /* 3 */\r\n}\r\n\r\n/**\r\n * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.\r\n * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome\r\n * (include `-moz` to future-proof).\r\n */\r\n\r\ninput[type=\"search\"] {\r\n -webkit-appearance: textfield; /* 1 */\r\n -moz-box-sizing: content-box;\r\n -webkit-box-sizing: content-box; /* 2 */\r\n box-sizing: content-box;\r\n}\r\n\r\n/**\r\n * Remove inner padding and search cancel button in Safari 5 and Chrome\r\n * on OS X.\r\n */\r\n\r\ninput[type=\"search\"]::-webkit-search-cancel-button,\r\ninput[type=\"search\"]::-webkit-search-decoration {\r\n -webkit-appearance: none;\r\n}\r\n\r\n/**\r\n * Remove inner padding and border in Firefox 3+.\r\n */\r\n\r\nbutton::-moz-focus-inner,\r\ninput::-moz-focus-inner {\r\n border: 0;\r\n padding: 0;\r\n}\r\n\r\n/**\r\n * 1. Remove default vertical scrollbar in IE 6/7/8/9.\r\n * 2. Improve readability and alignment in all browsers.\r\n */\r\n\r\ntextarea {\r\n overflow: auto; /* 1 */\r\n vertical-align: top; /* 2 */\r\n}\r\n\r\n/* ==========================================================================\r\n Tables\r\n ========================================================================== */\r\n\r\n/**\r\n * Remove most spacing between table cells.\r\n */\r\n\r\ntable {\r\n border-collapse: collapse;\r\n border-spacing: 0;\r\n}\r\n;/* http://prismjs.com/download.html?themes=prism-coy&languages=markup+css+css-extras+clike+javascript+java&plugins=line-numbers */\r\n\r\n/*\r\n\r\n * p5.js highlighting based on the prism.js Coy theme for JavaScript, CoffeeScript, CSS and HTML\r\n * Based on https://github.com/tshedor/workshop-wp-theme (Example: http://workshop.kansan.com/category/sessions/basics or http://workshop.timshedor.com/category/sessions/basics);\r\n * @author Tim Shedor\r\n\r\n*/\r\n\r\ncode[class*=\"language-\"],\r\npre[class*=\"language-\"],\r\ntextarea {\r\n color: #222;\r\n font-family:\r\n 'Inconsolata',\r\n Consolas,\r\n Monaco,\r\n 'Andale Mono',\r\n monospace;\r\n direction: ltr;\r\n text-align: left;\r\n white-space: pre;\r\n word-spacing: normal;\r\n word-break: normal;\r\n -moz-tab-size: 4;\r\n -o-tab-size: 4;\r\n tab-size: 4;\r\n -webkit-hyphens: none;\r\n -moz-hyphens: none;\r\n -ms-hyphens: none;\r\n hyphens: none;\r\n font-size: 1em !important;\r\n}\r\n\r\n/* Code blocks */\r\npre[class*=\"language-\"] {\r\n position:relative;\r\n padding: 0.5em 1.0em;\r\n margin: 0.5em 0 0 -0.5em;\r\n border-left: 0.5em solid #AFAFAF; /* coy og blue 10px solid 358ccb */\r\n background-color: #fff; /* coy og white #fdfdfd */\r\n /* lines */\r\n background-image: -webkit-linear-gradient(transparent 50%, rgba(69, 142, 209, 0.06) 50%);\r\n background-image: -moz-linear-gradient(transparent 50%, rgba(69, 142, 209, 0.06) 50%);\r\n background-image: -ms-linear-gradient(transparent 50%, rgba(69, 142, 209, 0.06) 50%);\r\n background-image: -o-linear-gradient(transparent 50%, rgba(69, 142, 209, 0.06) 50%);\r\n background-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.06) 50%);\r\n background-size: 2.9em 2.9em; /* adjusts height of alternating lines */\r\n background-origin:content-box;\r\n /* set overflow to just let the code roll */\r\n overflow:auto;\r\n /* or uncomment this to let an inner vertical scroll be triggered,\r\n but be generous as to when\r\n max-height:36em; */\r\n}\r\n\r\ncode[class*=\"language\"] {\r\n}\r\n\r\n\r\n:not(pre) > code[class*=\"language-\"],\r\npre[class*=\"language-\"] {\r\n margin-bottom: 1em;\r\n}\r\n\r\n/* Inline code */\r\n:not(pre) > code[class*=\"language-\"] {\r\n position:relative;\r\n padding: .2em;\r\n -webkit-border-radius: 0.3em;\r\n -moz-border-radius: 0.3em;\r\n -ms-border-radius: 0.3em;\r\n -o-border-radius: 0.3em;\r\n border-radius: 0.3em;\r\n color: #333;\r\n border: 1px solid rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n\r\n:not(pre) > code[class*=\"language-\"]:after,\r\npre[class*=\"language-\"]:after {\r\n right: 0.75em;\r\n left: auto;\r\n}\r\n\r\n/* code colors */\r\n.token.comment,\r\n.token.block-comment,\r\n.token.prolog,\r\n.token.doctype,\r\n.token.cdata {\r\n color: #A0A0A0; /* light gray */ /* 727272 898189 919191 A0A0A0 AFAFAF BEBEBE coy og: #7D8B99; */\r\n}\r\n\r\n.token.punctuation {\r\n color: #666; /* darker gray */ /* og coy 5F6364 */\r\n}\r\n\r\n.token.property,\r\n.token.tag,\r\n.token.boolean,\r\n.token.number,\r\n.token.function-name,\r\n.token.constant,\r\n.token.symbol {\r\n color: #DC3787; /* not p5 pink, but related */ /* og coy c92c2c a reddish color */\r\n}\r\n\r\n.token.selector,\r\n.token.attr-name,\r\n.token.string,\r\n.token.function,\r\n.token.builtin {\r\n color: #00A1D3; /* blue */ /* 877923 */ /* og coy 2f9c0a - green */\r\n}\r\n\r\n.token.operator,\r\n.token.entity,\r\n.token.url,\r\n.token.variable {\r\n color: #a67f59; /* og coy a67f59 a light brown */\r\n background: rgba(255, 255, 255, 0.5);\r\n}\r\n\r\n.token.atrule,\r\n.token.attr-value,\r\n.token.keyword,\r\n.token.class-name {\r\n color: #704F21; /* 9F944F brown */ /* og coy #1990b8 blue */\r\n}\r\n\r\n.token.regex,\r\n.token.important {\r\n color: #e90; /* og coy e90 orange */\r\n}\r\n.language-css .token.string,\r\n.style .token.string {\r\n color: #a67f59; /* og coy a67f59 a light brown */\r\n background: rgba(255, 255, 255, 0.5);\r\n}\r\n\r\n.token.important {\r\n font-weight: normal;\r\n}\r\n\r\n.token.entity {\r\n cursor: help;\r\n}\r\n\r\n.namespace {\r\n opacity: .7;\r\n}\r\n\r\n@media screen and (max-width:767px){\r\n pre[class*=\"language-\"]:before,\r\n pre[class*=\"language-\"]:after {\r\n bottom:14px;\r\n -webkit-box-shadow:none;\r\n -moz-box-shadow:none;\r\n box-shadow:none;\r\n }\r\n\r\n}\r\n\r\n/* Plugin styles */\r\n.token.tab:not(:empty):before,\r\n.token.cr:before,\r\n.token.lf:before {\r\n color: #e0d7d1; /* og coy very light brown */\r\n}\r\n\r\npre.line-numbers {\r\n position: relative;\r\n padding-left: 3.8em;\r\n counter-reset: linenumber;\r\n}\r\n\r\npre.line-numbers > code {\r\n position: relative;\r\n}\r\n\r\n.line-numbers .line-numbers-rows {\r\n position: absolute;\r\n pointer-events: none;\r\n top: 0;\r\n font-size: 100%;\r\n left: -3.8em;\r\n width: 3em; /* works for line-numbers below 1000 lines */\r\n letter-spacing: -1px;\r\n border-right: 1px solid #999;\r\n\r\n -webkit-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n user-select: none;\r\n\r\n}\r\n\r\n.line-numbers-rows > span {\r\n pointer-events: none;\r\n display: block;\r\n counter-increment: linenumber;\r\n}\r\n\r\n.line-numbers-rows > span:before {\r\n content: counter(linenumber);\r\n color: #999;\r\n display: block;\r\n padding-right: 0.8em;\r\n text-align: right;\r\n}\r\n;/*\r\n * HTML5 Boilerplate\r\n *\r\n * What follows is the result of much research on cross-browser styling.\r\n * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,\r\n * Kroc Camen, and the H5BP dev community and team.\r\n */\r\n\r\n/* ==========================================================================\r\n Base styles: opinionated defaults\r\n ========================================================================== */\r\n\r\nhtml,\r\nbutton,\r\ninput,\r\nselect {\r\n color: #222;\r\n}\r\n\r\ntextarea {\r\n line-height: 1.45em;\r\n padding: 0.5em 1em 0.5em 1em;\r\n border: none;\r\n}\r\n\r\nbody {\r\n font-size: 1em;\r\n line-height: 1.4;\r\n}\r\n\r\n/*\r\n * Remove text-shadow in selection highlight: h5bp.com/i\r\n * These selection rule sets have to be separate.\r\n * Customize the background color to match your design.\r\n */\r\n\r\n::-moz-selection {\r\n background: #b3d4fc;\r\n text-shadow: none;\r\n}\r\n\r\n::selection {\r\n background: #b3d4fc;\r\n text-shadow: none;\r\n}\r\n\r\n/*\r\n * A better looking default horizontal rule\r\n */\r\n\r\nhr {\r\n display: block;\r\n height: 1px;\r\n border: 0;\r\n border-top: 1px solid #ccc;\r\n margin: 1em 0;\r\n padding: 0;\r\n}\r\n\r\n/*\r\n * Remove the gap between images and the bottom of their containers: h5bp.com/i/440\r\n */\r\n\r\nimg {\r\n vertical-align: middle;\r\n}\r\n\r\nimg.med_left {\r\n width: 300px;\r\n float: left;\r\n}\r\n\r\nimg.med_right {\r\n width: 300px;\r\n float: right;\r\n}\r\n\r\nimg.small_left {\r\n width: 200px;\r\n float: left;\r\n}\r\n\r\nimg.smaller_left {\r\n width: 140px;\r\n float: left;\r\n}\r\n\r\nimg.small_right {\r\n width: 200px;\r\n float: right;\r\n}\r\n\r\nimg.smaller_right {\r\n width: 140px;\r\n float: right;\r\n}\r\n\r\nimg.small_center {\r\n width: 200px;\r\n margin-left: 250px;\r\n}\r\n\r\nimg.small {\r\n width: 160px;\r\n}\r\n\r\nimg.med {\r\n width: 400px;\r\n}\r\n\r\nimg.med_center {\r\n width: 400px;\r\n margin-left: 150px;\r\n}\r\n\r\n/*\r\n * Remove default fieldset styles.\r\n */\r\n\r\nfieldset {\r\n border: 0;\r\n margin: 0;\r\n padding: 0;\r\n}\r\n\r\n/*\r\n * Allow only vertical resizing of textareas.\r\n */\r\n\r\ntextarea {\r\n resize: vertical;\r\n}\r\n\r\n/*\r\n //////////////////////////////////////////////////\r\n HOMEPAGE\r\n //////////////////////////////////////////////////\r\n*/\r\n.tagline {\r\n display: none;\r\n}\r\n\r\n#home-page .home {\r\n pointer-events: none;\r\n}\r\n\r\n#home-page .home a {\r\n pointer-events: all;\r\n}\r\n\r\n#lockup > a {\r\n position: relative;\r\n display: block;\r\n width: 200px;\r\n height: 90px;\r\n}\r\n\r\n#logo_image {\r\n position: absolute;\r\n top: 0;\r\n}\r\n\r\n#menu.top_menu,\r\n#menu {\r\n list-style: none;\r\n font-family: 'Montserrat', sans-serif;\r\n width: 100%;\r\n margin: 0 0 1em 0;\r\n padding: 0;\r\n height: 100%;\r\n font-size: 1.3em;\r\n}\r\n\r\n#menu.top_menu li {\r\n display: inline;\r\n}\r\n\r\n#home-sketch {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: -2;\r\n}\r\n\r\n/* <======== Styling for responsive menu bar ========> */\r\n\r\n@media screen and (max-width: 780px) {\r\n .sidebar-menu {\r\n clear: both;\r\n max-height: 0;\r\n transition: max-height 0.4s ease-out;\r\n overflow: hidden;\r\n }\r\n\r\n .sidebar-menu-nav-element {\r\n width: 91vw;\r\n }\r\n\r\n .sidebar-menu a {\r\n display: block;\r\n text-align: center;\r\n padding-bottom: 0.11em;\r\n border-bottom: 0.11em dashed transparent;\r\n }\r\n\r\n .sidebar-menu-icon {\r\n top: 2rem;\r\n cursor: pointer;\r\n float: right;\r\n padding: 28px 20px;\r\n position: relative;\r\n user-select: none;\r\n margin-bottom: 5rem;\r\n }\r\n\r\n .sidebar-menu-icon .sidebar-nav-icon {\r\n background: #ed225d;\r\n display: block;\r\n height: 2px;\r\n position: relative;\r\n transition: background 0.4s ease-out;\r\n width: 18px;\r\n }\r\n\r\n .sidebar-menu-icon .sidebar-nav-icon:before,\r\n .sidebar-menu-icon .sidebar-nav-icon:after {\r\n background: #ed225d;\r\n content: '';\r\n display: block;\r\n height: 100%;\r\n position: absolute;\r\n transition: all 0.4s ease-out;\r\n width: 100%;\r\n }\r\n\r\n .sidebar-menu-icon .sidebar-nav-icon:before {\r\n top: 5px;\r\n }\r\n\r\n .sidebar-menu-icon .sidebar-nav-icon:after {\r\n top: -5px;\r\n }\r\n\r\n .sidebar-menu-btn {\r\n display: none;\r\n }\r\n\r\n .sidebar-menu-btn:checked ~ .sidebar-menu {\r\n max-height: 475px;\r\n }\r\n\r\n .sidebar-menu-btn:checked ~ .sidebar-menu-icon .sidebar-nav-icon {\r\n background: transparent;\r\n }\r\n\r\n .sidebar-menu-btn:checked ~ .sidebar-menu-icon .sidebar-nav-icon:before {\r\n transform: rotate(-45deg);\r\n top: 0;\r\n }\r\n\r\n .sidebar-menu-btn:checked ~ .sidebar-menu-icon .sidebar-nav-icon:after {\r\n transform: rotate(45deg);\r\n top: 0;\r\n }\r\n}\r\n\r\n.sidebar-menu-btn {\r\n display: none;\r\n}\r\n\r\n/* <=================================================> */\r\n\r\n#home-sketch-frame {\r\n position: fixed;\r\n width: 100%;\r\n height: 100%;\r\n left: 0;\r\n top: 0;\r\n z-index: -2;\r\n overflow: hidden;\r\n pointer-events: all;\r\n border: 0;\r\n}\r\n\r\n#credits {\r\n position: fixed;\r\n bottom: 0;\r\n left: 0;\r\n z-index: 2;\r\n padding: 1em;\r\n font-size: 0.7em;\r\n}\r\n\r\n#skip-to-content {\r\n position: absolute;\r\n left: 0px;\r\n top: 40px;\r\n z-index: 5;\r\n background-color: #ed225d;\r\n color: white;\r\n width: auto;\r\n height: 50px;\r\n border: none;\r\n outline-style: none;\r\n text-align: center;\r\n font-size: 25px;\r\n padding: 5px;\r\n opacity: 0;\r\n}\r\n\r\n#skip-to-content:focus {\r\n opacity: 1;\r\n}\r\n\r\n/*\r\n //////////////////////////////////////////////////\r\n DOWNLOAD PAGE\r\n //////////////////////////////////////////////////\r\n*/\r\n\r\n.button_box {\r\n border: 1px solid #ed225d;\r\n padding: 0.4em 0.6em;\r\n margin: 0.5em 0;\r\n color: #333;\r\n font-family: 'Montserrat', sans-serif;\r\n display: inline-block;\r\n}\r\n\r\n.download_box {\r\n border: 1px solid #ed225d;\r\n padding: 0.4em;\r\n margin: 0 1.75em 0 0;\r\n width: 18.65em;\r\n float: left;\r\n color: #333;\r\n height: 7.45em;\r\n position: relative;\r\n}\r\n\r\n.download_box:hover,\r\n.button_box:hover {\r\n border: 1px solid #ed225d;\r\n background: #ed225d;\r\n color: #ffffff;\r\n}\r\n\r\n.download_box.half_box {\r\n width: 10.83em;\r\n margin-right: 1.75em;\r\n float: left;\r\n}\r\n\r\n.download_box.half_box.last_box {\r\n margin-right: 0;\r\n}\r\n\r\n.download_box .download_name {\r\n font-size: 1em;\r\n margin: 0;\r\n padding-bottom: 0.3em;\r\n border-bottom: 0.09em dashed;\r\n border-bottom-color: #ed225d;\r\n line-height: 1.2;\r\n font-family: 'Montserrat', sans-serif;\r\n display: block;\r\n}\r\n\r\n.download_box:hover .download_name {\r\n -webkit-text-stroke-width: 0;\r\n border-bottom-color: #fff;\r\n}\r\n\r\n.download_box p {\r\n font-size: 0.65em;\r\n margin: 0;\r\n position: absolute;\r\n bottom: 1em;\r\n}\r\n\r\n.download_box svg {\r\n height: 0.65em;\r\n width: 0.65em;\r\n position: absolute;\r\n bottom: 3.5em;\r\n}\r\n\r\n.download_box:hover svg {\r\n fill: white;\r\n}\r\n\r\n.download_box h4 + p {\r\n display: block;\r\n}\r\n\r\n#download-page .link_group {\r\n width: 100%;\r\n margin-bottom: 3em;\r\n}\r\n\r\n.download_box {\r\n margin-top: 1em;\r\n}\r\n\r\n.support div.download_box {\r\n margin-top: 1em;\r\n margin-bottom: 1em;\r\n}\r\n\r\n#download-page .support p {\r\n font-size: 0.8em;\r\n position: static;\r\n margin-top: 0.3em;\r\n}\r\n\r\n#slideshow {\r\n margin: 1em 0;\r\n}\r\n\r\n#slideshow p {\r\n font-size: 0.8em;\r\n color: #ababab;\r\n line-height: 1.2em;\r\n margin-top: 0.5em;\r\n}\r\n\r\n.extra {\r\n color: white;\r\n position: absolute;\r\n bottom: 0.65em;\r\n right: 0.9em;\r\n font-weight: bold;\r\n -ms-transform: rotate(-12deg);\r\n -webkit-transform: rotate(-12deg);\r\n transform: rotate(-12deg);\r\n font-size: 0.8em;\r\n}\r\n\r\n/*\r\n //////////////////////////////////////////////////\r\n GET STARTED\r\n //////////////////////////////////////////////////\r\n*/\r\n#get-started-page .edit_space {\r\n position: relative;\r\n order: 3;\r\n margin-bottom: 4.8125em;\r\n}\r\n#get-started-page .edit_space .copy_button{\r\n color: #2d7bb6;\r\n border-color: rgba(45, 123, 182, 0.25);\r\n float: right;\r\n margin: 1.5em 0 1.5em 0.5em;\r\n background: rgba(255, 255, 255, 0.7);\r\n position: absolute;\r\n z-index: 2;\r\n left: 31.33em;\r\n top: -1.5em;\r\n}\r\n/* To make get-started-page responsive */\r\n@media (max-width: 780px) {\r\n #get-started-page .edit_space .copy_button{\r\n left: 6.44em;\r\n }\r\n}\r\n@media (max-width: 600px) {\r\n #get-started-page .edit_space .copy_button{\r\n left: 5.91em;\r\n }\r\n}\r\n/*\r\n //////////////////////////////////////////////////\r\n EXAMPLES\r\n //////////////////////////////////////////////////\r\n*/\r\n\r\n#examples-page .column {\r\n margin-bottom: 2em;\r\n}\r\n\r\n/*\r\n //////////////////////////////////////////////////\r\n REFERENCE\r\n //////////////////////////////////////////////////\r\n*/\r\n\r\n#reference-page main h1 {\r\n float: left;\r\n}\r\n\r\n.reference-group h2 {\r\n font-size: 1.5em;\r\n}\r\n\r\n.reference-group h3 {\r\n font-size: 1em;\r\n font-family: 'Montserrat', sans-serif;\r\n margin-top: 0.5em;\r\n}\r\n\r\ndiv.reference-group {\r\n display: inline-block;\r\n}\r\n\r\ndiv.reference-subgroups {\r\n margin: 0;\r\n display: flex;\r\n flex-direction: row;\r\n flex-wrap: wrap;\r\n}\r\ndiv.reference-subgroup {\r\n width: 11em;\r\n margin-bottom: 1em;\r\n}\r\n\r\n#reference-page .params table p {\r\n /* Recently-added support for Markdown means that every parameter\r\n * description is wrapped in a paragraph element. (Previously, they weren't\r\n * wrapped in any kind of element.)\r\n *\r\n * We may eventually want to display paragraphs as blocks, so that we\r\n * can have lengthy descriptions for parameters, but for now we'll\r\n * keep our pre-existing behavior and essentially make paragraphs\r\n * \"invisible\" by rendering them inline. */\r\n display: inline;\r\n font-size: inherit;\r\n}\r\n\r\n#reference-page .param-optional {\r\n color: #afafaf;\r\n}\r\n\r\n#item {\r\n width: 100%;\r\n}\r\n\r\n#item h2 {\r\n margin: 0.777em 0 0 0;\r\n font-size: 1.444em;\r\n font-weight: inherit;\r\n font-family: 'Inconsolata', consolas, monospace;\r\n color: #00a1d3;\r\n}\r\n\r\n#item h3 {\r\n font-size: 1.33em;\r\n margin: 1em 0 0 0;\r\n}\r\n\r\n#item ul {\r\n margin-top: 0.5em;\r\n}\r\n\r\n#item li {\r\n margin-bottom: 1em;\r\n}\r\n\r\n.description {\r\n clear: both;\r\n display: block;\r\n width: 100%;\r\n}\r\n\r\n.syntax pre {\r\n width: 100%;\r\n}\r\n\r\n.item-wrapper,\r\n.list-wrapper {\r\n float: left;\r\n outline: none;\r\n}\r\n\r\n.paramname {\r\n display: inline-block;\r\n min-width: 25%;\r\n margin-right: 1%;\r\n font-size: 1.2em;\r\n}\r\n\r\n.paramtype p {\r\n display: inline;\r\n font-size: 1em;\r\n}\r\n\r\n.paramtype {\r\n display: inline-block;\r\n font-size: 1.2em;\r\n width: 73%;\r\n vertical-align: top;\r\n}\r\n\r\n#library-page .group-name {\r\n display: inline-block;\r\n}\r\n\r\n#library-page .group-name:hover {\r\n color: #ed225d;\r\n}\r\n\r\n/* EXAMPLES IN REF */\r\n\r\n.example div {\r\n position: relative;\r\n}\r\n\r\n.example-content .example_code {\r\n position: relative;\r\n left: 1em;\r\n padding-top: 0;\r\n margin-top: 1rem;\r\n border: none;\r\n width: 30.5em;\r\n max-width: 100%;\r\n}\r\n\r\n.example-content .example_code.norender {\r\n left: 0px;\r\n margin-left: 0;\r\n}\r\n\r\n.example-content .edit_space {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n margin-top: -0.5em;\r\n width: 100%;\r\n pointer-events: none;\r\n}\r\n\r\n.example-content .edit_space * {\r\n pointer-events: auto;\r\n}\r\n\r\n.example-content .edit_space ul {\r\n display: flex;\r\n flex-direction: row-reverse;\r\n position: relative;\r\n pointer-events: none;\r\n}\r\n\r\n.example-content .edit_space ul li button {\r\n font-family: 'Montserrat', sans-serif;\r\n font-size: 1em;\r\n color: #ccc;\r\n border: 1px solid rgba(200, 200, 200, 0.15);\r\n background: transparent;\r\n outline: none;\r\n margin-top: 0.25em;\r\n}\r\n\r\n.example-content .edit_space ul li button:hover,\r\n.example_container.editing ul li button {\r\n color: #2d7bb6;\r\n border-color: rgba(45, 123, 182, 0.25);\r\n}\r\n\r\n.example-content .edit_space .edit_area {\r\n position: absolute;\r\n top: 0.5em;\r\n left: 120px;\r\n width: 30.5em;\r\n padding-top: 1.5rem;\r\n display: none;\r\n font-family: monospace;\r\n padding: 1.5em 0.5em 0.5em 0.5em;\r\n font-size: 15pt;\r\n}\r\n\r\n.display_button {\r\n margin-bottom: 2em;\r\n font-family: 'Montserrat', sans-serif;\r\n font-size: 1em;\r\n color: #2d7bb6;\r\n border: 1px solid rgba(45, 123, 182, 0.25);\r\n background: transparent;\r\n outline: none;\r\n}\r\n\r\n.example-content .example_container {\r\n width: 36em;\r\n max-width: 100%;\r\n border-top: 0.09em dashed;\r\n border-top-color: #333;\r\n padding-top: 0.5em;\r\n margin-top: 2em;\r\n min-height: 120px;\r\n height: calc(100% * 1.1 + 20px);\r\n display: flex;\r\n}\r\n\r\n.example-content .example_container:first-of-type {\r\n margin-top: 1em;\r\n}\r\n\r\n/*to make ref example responsive*/\r\n@media (max-width: 600px) {\r\n .example-content .example_code {\r\n margin-top: 0.2rem;\r\n left: 0.5rem;\r\n }\r\n\r\n .example-content .example_container {\r\n width: 100%;\r\n min-height: 220px;\r\n height: calc(100% * 1.1 + 120px);\r\n display: block;\r\n }\r\n\r\n .example-content .edit_space .edit_area {\r\n top: calc(120px + 1em);\r\n left: 0;\r\n width: 100%;\r\n padding: 0.5em;\r\n }\r\n\r\n .example_container button {\r\n top: 124px;\r\n }\r\n\r\n .description {\r\n margin-top: 3rem;\r\n }\r\n\r\n .edit_button {\r\n left: 0;\r\n }\r\n\r\n .reset_button {\r\n left: 2.58em;\r\n }\r\n\r\n .copy_button {\r\n left: 5.91em;\r\n }\r\n}\r\n\r\nform {\r\n pointer-events: all;\r\n}\r\n\r\n#search_button {\r\n background: url(../img/search.png) 100% no-repeat;\r\n}\r\n\r\n#search input[type='text'],\r\n#search input[type='search'] {\r\n border: 1px solid rgba(200, 200, 200, 0.5);\r\n font-family: 'Montserrat', sans-serif;\r\n font-size: 2.25em;\r\n width: 9.75em;\r\n}\r\n\r\n#search ::-webkit-input-placeholder,\r\n#search .twitter-typeahead .tt-hint {\r\n color: #ccc;\r\n}\r\n\r\n:-moz-placeholder,\r\n::-moz-placeholder,\r\n:-ms-input-placeholder {\r\n color: #ccc;\r\n}\r\n\r\n#search input[type='text']:focus {\r\n color: #2d7bb6;\r\n outline-color: #2d7bb6;\r\n outline-width: 1px;\r\n outline-style: solid;\r\n}\r\n\r\n#search .twitter-typeahead .tt-dropdown-menu {\r\n background-color: #fff;\r\n border: 1px solid rgba(0, 0, 0, 0.2);\r\n overflow-y: auto;\r\n font-size: 1em;\r\n line-height: 1.4em;\r\n}\r\n\r\n#search .twitter-typeahead .tt-suggestion.tt-cursor {\r\n color: #333;\r\n background-color: #eee;\r\n}\r\n\r\n#search .twitter-typeahead .tt-suggestion p {\r\n margin: 0;\r\n}\r\n\r\n#search .twitter-typeahead .tt-suggestion p .small {\r\n font-size: 12px;\r\n color: #666;\r\n}\r\n\r\n#search {\r\n float: right;\r\n}\r\n\r\n#search .twitter-typeahead .tt-dropdown-menu {\r\n border: 1px solid rgba(0, 0, 0, 0.2);\r\n padding: 0.5em;\r\n max-height: 200px;\r\n overflow-y: auto;\r\n font-size: 1em;\r\n line-height: 1.4em;\r\n}\r\n\r\n#search .twitter-typeahead .tt-suggestion {\r\n padding: 3px 20px;\r\n line-height: 24px;\r\n cursor: pointer;\r\n}\r\n\r\n#search .twitter-typeahead .empty-message {\r\n padding: 8px 20px 1px 20px;\r\n font-size: 14px;\r\n line-height: 24px;\r\n}\r\n\r\n#search_button {\r\n float: right;\r\n}\r\n\r\na.code.core {\r\n color: #333;\r\n}\r\n\r\na.code.addon {\r\n color: #704f21;\r\n}\r\n\r\n/*\r\n //////////////////////////////////////////////////\r\n CONTRIBUTORS FORM\r\n //////////////////////////////////////////////////\r\n*/\r\n\r\n/*\r\n //////////////////////////////////////////////////\r\n Contributors\r\n //////////////////////////////////////////////////\r\n*/\r\n\r\n#contribute-item {\r\n font-size: 0.75em;\r\n text-align: left;\r\n display: inline-block;\r\n width: 320px;\r\n height: 250px;\r\n float: left;\r\n border: 1px solid #ed225d;\r\n margin: 0 25px 25px 0;\r\n position: relative;\r\n}\r\n\r\n.contribute-item-container {\r\n position: absolute;\r\n z-index: 20;\r\n margin: 0;\r\n padding: 10px;\r\n}\r\n\r\n.container {\r\n /* width: 100px;*/\r\n height: 100px;\r\n position: relative;\r\n background: white;\r\n margin-top: 1.5em; /* temp promo */\r\n}\r\n\r\n#navi,\r\n#infoi {\r\n width: 100%;\r\n height: 100%;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n}\r\n\r\n#infoi {\r\n z-index: 10;\r\n}\r\n\r\nh3.contribute-title {\r\n font-size: 1.33em;\r\n margin: 0 0 27px 0;\r\n padding-bottom: 0.3em;\r\n border-bottom: 0.09em dashed;\r\n border-bottom-color: #ed225d;\r\n}\r\n\r\n/*\r\n //////////////////////////////////////////////////\r\n LIBRARIES / LEARN\r\n //////////////////////////////////////////////////\r\n*/\r\n\r\n.label {\r\n position: relative;\r\n}\r\n\r\n.label .nounderline img {\r\n margin: 0.5em 0 0 0;\r\n}\r\n\r\n.label h3 {\r\n color: white;\r\n position: absolute;\r\n top: 0;\r\n margin: 1em;\r\n}\r\n\r\n.label:hover h3 {\r\n color: #ed225d;\r\n}\r\n\r\nh3 {\r\n font-size: 1.33em;\r\n margin: 1em 0 0 0;\r\n}\r\n\r\n.bullet-list {\r\n padding: 0 0 0 40px;\r\n list-style: disc;\r\n}\r\n\r\n#libraries-page .label h3{\r\n background-color: black;\r\n padding:0px 5px;\r\n}\r\n\r\n#learn-page .label .nounderline img {\r\n height: fit-content;\r\n}\r\n\r\n#learn-page .info {\r\n display: inline-block;\r\n}\r\n\r\n#exampleDisplay,\r\n#exampleFrame,\r\n#exampleEditor {\r\n width: 36em;\r\n border: none;\r\n}\r\n\r\n#exampleDisplay {\r\n display: flex;\r\n flex-flow: column;\r\n}\r\n\r\n#popupExampleFrame {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n z-index: 1000;\r\n border: none;\r\n}\r\n\r\n#exampleDisplay button {\r\n color: #2d7bb6;\r\n border-color: rgba(45, 123, 182, 0.25);\r\n float: right;\r\n margin: 0.5em 0 0 0.5em;\r\n background: rgba(255, 255, 255, 0.7);\r\n position: absolute;\r\n left: 0;\r\n z-index: 2;\r\n}\r\n\r\n#exampleDisplay .edit_button {\r\n left: 25.42em;\r\n top: -2.5em;\r\n}\r\n\r\n#exampleDisplay .reset_button {\r\n left: 28em;\r\n top: -2.5em;\r\n}\r\n\r\n#exampleDisplay .copy_button {\r\n left: 31.33em;\r\n top: -2.5em;\r\n}\r\n\r\n#exampleDisplay button:hover {\r\n background: #fff;\r\n}\r\n\r\n#exampleDisplay .edit_space {\r\n position: relative;\r\n order: 3;\r\n}\r\n\r\n#exampleDisplay #exampleFrame {\r\n height: 22em;\r\n order: 2;\r\n}\r\n\r\n#exampleDisplay #exampleEditor {\r\n height: 500em;\r\n width: 710px;\r\n overflow: hidden;\r\n margin-top: 0.5em;\r\n color: #222;\r\n font-family: 'Inconsolata', consolas, monospace;\r\n font-size: 1em;\r\n background-color: #fff;\r\n line-height: 1em;\r\n order: 4;\r\n}\r\n\r\n#exampleDisplay #exampleEditor .ace_gutter-cell {\r\n background-image: none;\r\n padding-left: 10px;\r\n overflow: hidden;\r\n background-color: #afafaf;\r\n}\r\n\r\n#exampleDisplay #exampleEditor .ace_gutter-cell.ace_info {\r\n background-color: #d7e5f5;\r\n}\r\n\r\n#exampleDisplay #exampleEditor .ace_gutter-cell.ace_warning {\r\n background-color: #ffd700;\r\n color: #ffffff;\r\n}\r\n\r\n#exampleDisplay #exampleEditor .ace_gutter-cell.ace_error {\r\n background-color: #ff6347;\r\n color: #ffffff;\r\n}\r\n\r\n/* property, tag, boolean,\r\n number, function-name, constant,\r\n symbol */\r\n\r\n#exampleDisplay #exampleEditor .ace_numeric,\r\n#exampleDisplay #exampleEditor .ace_tag {\r\n color: #dc3787;\r\n /* not p5 pink, but related */\r\n}\r\n\r\n/* atrule, attr-value, keyword,\r\n class-name */\r\n\r\n#exampleDisplay #exampleEditor .ace_type,\r\n#exampleDisplay #exampleEditor .ace_class,\r\n#exampleDisplay #exampleEditor .ace_attribute-name {\r\n color: #704f21;\r\n /* darker brown */\r\n}\r\n\r\n/* selector, attr-name,\r\nfunction, builtin */\r\n\r\n#exampleDisplay #exampleEditor .ace_function,\r\n#exampleDisplay #exampleEditor .ace_keyword,\r\n#exampleDisplay #exampleEditor .ace_support {\r\n color: #00a1d3;\r\n /* not p5 blue, but related */\r\n}\r\n\r\n/* comment, block-comment, prolog,\r\n doctype, cdata */\r\n\r\n#exampleDisplay #exampleEditor .ace_comment {\r\n color: #a0a0a0;\r\n /* light gray */\r\n}\r\n\r\n/* operator, entity, url,\r\nvariable */\r\n\r\n#exampleDisplay #exampleEditor .ace_string {\r\n color: #a67f59;\r\n /* og coy a67f59 a light brown */\r\n}\r\n\r\n#exampleDisplay #exampleEditor .ace_operator {\r\n color: #333;\r\n}\r\n\r\n/* regex, important */\r\n\r\n#exampleDisplay #exampleEditor .ace_regexp {\r\n color: #e90;\r\n /* og coy e90 orange */\r\n}\r\n\r\n#exampleDisplay #exampleEditor .ace-gutter {\r\n color: #333;\r\n}\r\n\r\n#exampleDisplay #exampleEditor .ace-gutter-layer {\r\n color: #333;\r\n}\r\n\r\n#exampleDisplay #exampleEditor .ace_folding-enabled {\r\n width: 10px !important;\r\n color: #333;\r\n}\r\n\r\n.attribution {\r\n background-color: #eee;\r\n font-size: 15px;\r\n padding: 10px;\r\n margin: 30px 0px 30px 0px;\r\n}\r\n\r\n/*\r\n //////////////////////////////////////////////////\r\n SHOWCASE\r\n //////////////////////////////////////////////////\r\n*/\r\n#featuring {\r\n margin-bottom: 1em;\r\n}\r\n\r\n#showcase-page .showcase-intro h1 {\r\n font: italic 900 14.5vw 'Montserrat', sans-serif;\r\n color: #ed225d;\r\n text-align: left;\r\n text-transform: uppercase;\r\n}\r\n\r\n#showcase-page .showcase-intro p {\r\n font: 400 1.4rem 'Montserrat', sans-serif;\r\n line-height: 1.5em;\r\n}\r\n\r\n#showcase-page .showcase-featured h2,\r\n#showcase-page .project-page h2 {\r\n font: italic 900 2rem 'Montserrat', sans-serif;\r\n color: #ed225d;\r\n letter-spacing: 0.05rem;\r\n}\r\n\r\n#showcase-page ul.left-column,\r\n#showcase-page ul.right-column,\r\n#showcase-page ul.project-tags,\r\n#showcase-page ul.links {\r\n list-style: none;\r\n}\r\n\r\n#showcase-page img[alt] {\r\n font-size: 0.9rem;\r\n}\r\n\r\n#showcase-page .showcase-featured {\r\n margin-top: 15%;\r\n}\r\n\r\n#showcase-page .showcase-featured h3.title {\r\n font: italic 900 1rem 'Montserrat', sans-serif;\r\n}\r\n\r\n#showcase-page .showcase-featured p.credit {\r\n font: 500 1rem 'Montserrat', sans-serif;\r\n}\r\n\r\n#showcase-page .showcase-featured p.description {\r\n font-size: 1em;\r\n margin-bottom: 0.5rem;\r\n}\r\n\r\n#showcase-page .nominate {\r\n margin-top: 1.5em;\r\n display: inline-block;\r\n}\r\n\r\n#showcase-page .nominate a,\r\n#showcase-page .nominate a:visited {\r\n padding: 0.4em 0.5em;\r\n position: relative;\r\n top: 0px;\r\n left: 0px;\r\n border: solid #ed225d 2px;\r\n box-shadow: 4px 4px 0 #ed225d;\r\n\r\n font: 1.5rem 'Montserrat', sans-serif;\r\n color: #ed225d;\r\n letter-spacing: 0.02rem;\r\n transition: all 0.3s;\r\n}\r\n\r\n@media (max-width: 500px) {\r\n #showcase-page .nominate a,\r\n #showcase-page .nominate a:visited {\r\n padding: 0.4em 0.3em;\r\n font: 1.3rem 'Montserrat', sans-serif;\r\n }\r\n}\r\n\r\n#showcase-page .nominate a:hover {\r\n top: 4px;\r\n left: 4px;\r\n box-shadow: none;\r\n}\r\n\r\n#showcase-page .showcase-featured a,\r\n#showcase-page .showcase-featured a:visited {\r\n font-size: 1.2rem;\r\n color: #ed225d;\r\n letter-spacing: 0.02rem;\r\n line-height: 1.5;\r\n}\r\n\r\n#showcase-page .showcase-featured a::after {\r\n content: ' →';\r\n}\r\n#showcase-page .showcase-featured a.tag::after {\r\n content: '';\r\n}\r\n#showcase-page .showcase-featured .no-arrow-link::after {\r\n content: ' ';\r\n}\r\n\r\n#showcase-page .showcase-featured .no-arrow-link:hover {\r\n text-decoration: none;\r\n padding: none;\r\n border: none;\r\n}\r\n\r\n.project-info {\r\n margin-top: 1em;\r\n}\r\n\r\nul.project-tags a {\r\n line-height: 0;\r\n display: -webkit-box;\r\n display: -webkit-flex;\r\n display: flex;\r\n -webkit-flex-wrap: wrap;\r\n flex-wrap: wrap;\r\n font-size: 0.5em;\r\n margin: 0px;\r\n}\r\nh3.title {\r\n margin-top: 3em;\r\n}\r\n#showcase-page ul.project-tags li {\r\n margin: 5px;\r\n display: inline-block;\r\n}\r\nh2.featuring {\r\n margin-top: 0px;\r\n}\r\n#showcase-page a.tag {\r\n display: inline-block;\r\n padding: 6px 14px;\r\n background-color: #ffe8e8;\r\n border-radius: 27px;\r\n font: 0.7rem 'Montserrat', sans-serif;\r\n color: #333;\r\n}\r\n#showcase-page ul.project-tags li {\r\n margin: 0px;\r\n}\r\n/*\r\n //////////////////////////////////////////////////\r\n SHOWCASE - FEATURED PROJECT PAGE\r\n //////////////////////////////////////////////////\r\n*/\r\n\r\n/* Link style for mobile and tablet screens (no :hover state) */\r\n/*\r\n@media (max-width: 991.98px){\r\n #showcase-page .project-page a, #showcase-page .project-page a:visited {\r\n color:#ED225D;\r\n text-decoration: none;\r\n padding-bottom: 0.11em;\r\n border-bottom: 0.11em dashed;\r\n border-bottom-color: #ED225D;\r\n transition: border-bottom 30ms linear;\r\n }\r\n}\r\n*/\r\n\r\n#showcase-page{\r\n margin-top: 3em;\r\n}\r\n\r\n#showcase-page .project-page h2 {\r\n line-height: 1.4;\r\n}\r\n\r\n@media (min-width: 720px) {\r\n /* for desktop/tablet:\r\n * - two columns, one each for resources & authors\r\n * - indent answer paragraphs in q & a\r\n */\r\n\r\n #showcase-page .showcase-intro h1 {\r\n font: italic 900 6.35vw 'Montserrat', sans-serif;\r\n }\r\n\r\n #showcase-page .showcase-intro p {\r\n line-height: 1.75em;\r\n font-size: 1em;\r\n }\r\n\r\n #showcase-page .project-metadata {\r\n display: flex;\r\n }\r\n\r\n #showcase-page .project-resources {\r\n margin-left: 3rem;\r\n }\r\n\r\n #showcase-page .project-a {\r\n width: 90%;\r\n float: right;\r\n display: inline-block;\r\n clear: both;\r\n }\r\n\r\n #showcase-page .half-image {\r\n width: 48%;\r\n }\r\n}\r\n\r\n#showcase-page .project-metadata {\r\n margin-top: 3%;\r\n}\r\n\r\n#showcase-page .project-metadata section h3 {\r\n color: #ed225d;\r\n font: bold italic 1rem 'Montserrat', sans-serif;\r\n}\r\n\r\n#showcase-page .project-resources ul.links {\r\n font: 500 0.7rem 'Montserrat', sans-serif;\r\n letter-spacing: 0.01rem;\r\n line-height: 1.5;\r\n margin: 0.5rem 0;\r\n}\r\n\r\n#showcase-page .project-credit {\r\n font: italic bold 1.25rem 'Montserrat', sans-serif;\r\n}\r\n\r\n#showcase-page .project-credit p {\r\n margin: 0.5rem 0;\r\n}\r\n\r\n#showcase-page .note {\r\n font-size: 0.7rem;\r\n}\r\n\r\n#showcase-page .creator-from {\r\n font-size: 0.7rem;\r\n}\r\n\r\n#showcase-page .qa-group{\r\n margin-bottom: 2em;\r\n}\r\n\r\n#showcase-page .project-q {\r\n margin-left: 0%;\r\n display: inline-block;\r\n clear: both;\r\n /*\r\n font-size: 1.2rem;\r\n font-weight: 900;\r\n */\r\n font: 900 1.2rem 'Montserrat', sans-serif;\r\n line-height: 1.5;\r\n}\r\n\r\n#showcase-page code {\r\n font-size: 1.1rem;\r\n}\r\n\r\n\r\n/* ==========================================================================\r\n Teach Page\r\n ========================================================================== */\r\n\r\n#teach-page .case-list a:hover {\r\n border-bottom: none;\r\n}\r\n\r\n#teach-page .heading {\r\n font: 400 1.4rem \"Montserrat\", sans-serif;\r\n color: black;\r\n line-height: 1.2em;\r\n padding-bottom: .4em;\r\n border-bottom: 4px dotted #ed225d;\r\n}\r\n\r\n#teach-page h3.title{\r\n margin-top: 3em;\r\n}\r\n\r\n/*search-filter label*/\r\n\r\n#teach-page .search-filter {\r\n display: inline;\r\n}\r\n\r\n#teach-page .search-filter label {\r\n display: inline-block;\r\n font: italic 900 1rem \"Montserrat\", sans-serif;\r\n padding: 6px 12px;\r\n text-align: left;\r\n white-space: nowrap;\r\n color: #ed225d;\r\n /*transition: .2s; */\r\n margin-bottom: .6em;\r\n margin-top: 1.2em;\r\n border: 1px solid #ed225d;\r\n\r\n\r\n}\r\n\r\n#teach-page .search-filter label {\r\n cursor: pointer;\r\n}\r\n\r\n\r\n#teach-page .search-filter label:hover {\r\n color: white;\r\n background-color: #ed225d;\r\n}\r\n\r\n\r\n#teach-page .search-filter input[type=\"checkbox\"] {\r\n display: absolute;\r\n}\r\n\r\n\r\n#teach-page .search-filter input[type=\"checkbox\"] {\r\n position: absolute;\r\n opacity: 0;\r\n}\r\n\r\n\r\n#teach-page ul.filters p.filter-title {\r\n font: 400 0.83rem \"Montserrat\", sans-serif;\r\n color: #ed225d;\r\n height: 50px;\r\n padding-top:20px;\r\n background: none;\r\n background-color: none;\r\n box-shadow: none;\r\n display: inline-block;\r\n border: none;\r\n clear: both;\r\n\r\n}\r\n\r\n\r\n\r\n\r\n#teach-page ul.filters li {\r\n display: inline;\r\n list-style: none;\r\n width: 100%;\r\n}\r\n\r\n#teach-page ul.filters li label {\r\n display: inline-block;\r\n border-radius: 25px;\r\n font: 200 0.7rem \"Montserrat\", sans-serif;\r\n /*font-style: normal;\r\n font-variant: normal;\r\n text-rendering: auto;\r\n -webkit-font-smoothing: antialiased;*/\r\n\r\n color: black;\r\n white-space: nowrap;\r\n margin: 3px 0px;\r\n transition: .2s;\r\n background: #fafafa;\r\n}\r\n\r\n#teach-page ul.filters li label {\r\n padding: 6px 12px;\r\n cursor: pointer;\r\n}\r\n\r\n#teach-page ul.filters li label::before {\r\n display: inline-block;\r\n padding: 2px 2px 2px 2px; /*padding among labels*/\r\n}\r\n\r\n#teach-page ul.filters li label:hover {\r\n color: #ed225d;\r\n background: #ffe8e8;\r\n /*transform: translateY(2px);*/\r\n\r\n }\r\n\r\n#teach-page ul.filters li input[type=\"checkbox\"]:checked + label {\r\n color: white;\r\n background: #ed225d;\r\n\r\n}\r\n\r\n#teach-page ul.filters li input[type=\"checkbox\"] {\r\n display: absolute;\r\n position: absolute;\r\n opacity: 0;\r\n}\r\n\r\n\r\n#teach-page ul.filters li.clear{\r\n display: block;\r\n clear: both;\r\n\r\n}\r\n\r\n\r\n/*Filter Panel*/\r\n\r\n#teach-page .filter-panel {\r\n padding: 0px;\r\n background-color: white;\r\n max-height: 0;\r\n overflow: hidden;\r\n transition: max-height 0.2s ease-out;\r\n margin-bottom: 0.8em;\r\n padding-bottom: .4em;\r\n\r\n}\r\n\r\n\r\n\r\n#teach-page .filter-panel p {\r\n margin: 0;\r\n color: #333;\r\n font-size: .83em;\r\n height: 50px;\r\n padding-top:20px;\r\n transition: all 0.5s ease-in-out;\r\n}\r\n\r\n\r\n /*p5 workshop and class title*/\r\n#teach-page .teach-intro p {\r\n font: 400 1.2rem \"Times\", sans-serif;\r\n line-height: 1.5em;\r\n}\r\n\r\n\r\n/*modal box*/\r\n\r\n#teach-page .modal-title{\r\n\r\n margin-left: 1em;\r\n margin-right: 1em;\r\n\r\n font: 400 1rem \"Montserrat\", sans-serif;\r\n color: #ed225d;\r\n line-height: 1.2em;\r\n\r\n}\r\n\r\n#teach-page ul.cases li.clear{\r\n display: block;\r\n clear: both;\r\n margin-top: 1em;\r\n margin-bottom: 1.2em;\r\n}\r\n\r\n\r\n#teach-page img{\r\n margin-bottom: 1.4em;\r\n}\r\n\r\n#teach-page img[alt]{\r\n font: 0.6rem \"Montserrat\", sans-serif;\r\n color: #bababa;\r\n\r\n}\r\n\r\n#teach-page .close {\r\n position: relative;\r\n color: #ffc7c7;\r\n float: right;\r\n font-size: 40px;\r\n font-weight: bold;\r\n margin-right: .4em;\r\n margin-top: .4em;\r\n cursor:pointer;\r\n}\r\n\r\n#teach-page .close:hover, .close:focus {\r\n color: #ed225d;\r\n text-decoration: none;\r\n cursor: pointer;\r\n}\r\n\r\n#teach-page .case label{\r\n margin-left: 1em;\r\n margin-right: 1em;\r\n margin: 2px 2px;\r\n padding: 5px 8px;\r\n display: inline-block;\r\n border-radius: 25px;\r\n font: 0.7rem \"Montserrat\", sans-serif;\r\n color: #aaaaaa;\r\n white-space: nowrap;\r\n color: white;\r\n background: #ed225d;\r\n}\r\n\r\n/*modal scrollbar*/\r\n\r\n#teach-page .modal-body::-webkit-scrollbar {\r\n\r\n width: 5px;\r\n height: 5px;\r\n border-radius: 10px;\r\n}\r\n\r\n#teach-page .modal-body::-webkit-scrollbar-track {\r\n background: #f1f1f1;\r\n}\r\n\r\n#teach-page .modal-body::-webkit-scrollbar-thumb {\r\n background: #ffe8e8;\r\n}\r\n\r\n/*modal contents*/\r\n\r\n#teach-page .case{\r\n margin-left: 2em;\r\n margin-right:2em;\r\n}\r\n\r\n#teach-page .case span {\r\n color: #ed225d;\r\n font: 900 1.4rem \"Montserrat\", sans-serif;\r\n}\r\n\r\n\r\n#teach-page .case p.lead-name{\r\n font: 900 Italic 1.2rem \"Montserrat\", sans-serif;\r\n color: #ed225d;\r\n line-height: 1.4em;\r\n border-bottom: 1.4em;\r\n}\r\n\r\n#teach-page .case .speech{\r\n\r\n position: relative;\r\n font: 200 Italic .8rem \"Montserrat\", sans-serif;\r\n color: black; /*#aaaaaa; */\r\n background: #ffe8e8;\r\n padding: 0.5em 1.2em;\r\n border-radius: .4em;\r\n border-bottom: none;\r\n margin-bottom: 2em;\r\n margin-top: 1em;\r\n\r\n\r\n}\r\n\r\n#teach-page .case .speech::after {\r\n content: '';\r\n position: absolute;\r\n top: 0;\r\n left: 8%;\r\n width: 0;\r\n height: 0;\r\n border: 10px solid transparent;\r\n border-bottom-color: #ffe8e8;\r\n border-top: 0;\r\n margin-left: -10px;\r\n margin-top: -10px;\r\n}\r\n\r\n#teach-page .case p.subtitle{\r\n\r\n font: 400 1rem \"Montserrat\", sans-serif;\r\n color: #ed225d;\r\n line-height: 1.4em;\r\n border-bottom: 0.1em dashed rgba(237, 34, 93, 0.15);\r\n}\r\n\r\n#teach-page .case p{\r\n font: 400 1rem \"Times\", sans-serif;\r\n color: black;\r\n line-height: 1.4em;\r\n\r\n border-bottom: 0.1em dashed rgba(237, 34, 93, 0.15);\r\n\r\n}\r\n\r\n#teach-page .modal-header{\r\n\r\n margin-bottom: 0.8em;\r\n}\r\n\r\n\r\n#teach-page .modal-footer{\r\n\r\n margin-bottom: 0.8em;\r\n}\r\n\r\n/*#teach-page .modal-body p{\r\n border-bottom: 0.1em dashed rgba(237, 34, 93, 0.15);\r\n\r\n}*/\r\n\r\n#teach-page .modal-body:-webkit-scrollbar{\r\n display: none;\r\n}\r\n\r\n\r\n#teach-page .modal {\r\n display: none; /* Hidden by default */\r\n position: fixed; /* Stay in place */\r\n z-index: 100;\r\n width: 100%;\r\n height: 100%;\r\n top:0;\r\n left:0;\r\n right:0;\r\n overflow: auto;\r\n box-sizing: border-box;\r\n background-color: rgba(255, 232, 232, 0.5); /* Fallback color */\r\n\r\n}\r\n\r\n#teach-page .modal-content{\r\n position: fixed;\r\n background: white;\r\n top: 2%;\r\n left: 2%;\r\n right: 2%;\r\n bottom: 2%;\r\n margin: auto; /*keep centered*/\r\n border: 1.2px solid #ffe8e8;\r\n max-width: 740px;\r\n box-shadow: 10px 100px 30px -17px rgba(237, 34, 93, 0.5);\r\n box-shadow: 10px 100px 20px -17px rgba(237, 34, 93, 0.5);\r\n box-shadow: 10px 20px 10px -17px rgba(237, 34, 93, 0.5);\r\n}\r\n\r\n#teach-page .modal-body{\r\n\r\n margin: auto;\r\n height: 85%;\r\n width: 95%;\r\n overflow-y: auto;\r\n\r\n}\r\n\r\n#teach-page .results-wrapper{\r\n width: 100%;\r\n outline: none;\r\n background: white;\r\n /*background: white;\r\n background: #fafafa;*/\r\n /*border: solid white 1px;*/\r\n /*background: -webkit-linear-gradient(to bottom, white, #fafafa);\r\n background: linear-gradient(to bottom, white, #fafafa);*/\r\n /*border: 1px solid #ffe8e8;*/\r\n /*box-shadow: 10px 100px 30px -17px rgba(237, 34, 93, 0.5);\r\n box-shadow: 10px 100px 20px -17px rgba(255, 232, 232, 0.5);\r\n box-shadow: 10px 20px 10px -17px rgba(237, 34, 93, 0.5);*/\r\n\r\n\r\n}\r\n\r\n#teach-page .results-wrapper ul li.case-list a.myBtn {\r\n\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n\r\n}\r\n\r\n#teach-page .case-list{\r\n\r\n margin-bottom: 0.8em;\r\n padding-bottom: .4em;\r\n\r\n font: 400 1.0rem \"Times\", sans-serif;\r\n line-height: 1.2em;\r\n\r\n border-bottom: 0.1em dashed #ffe8e8;\r\n\r\n}\r\n\r\n/* ==========================================================================\r\n Author's custom styles\r\n ========================================================================== */\r\n\r\n/* apply a natural box layout model to all elements */\r\n\r\n*,\r\n*:before,\r\n*:after {\r\n -moz-box-sizing: border-box;\r\n -webkit-box-sizing: border-box;\r\n box-sizing: border-box;\r\n}\r\n\r\nhtml {\r\n font-size: 1.25em;\r\n}\r\n\r\nbody {\r\n margin: 0;\r\n background-color: #fff;\r\n font-family: 'Times';\r\n font-weight: 400;\r\n line-height: 1.45;\r\n color: #333;\r\n}\r\n\r\np {\r\n font-size: 1.2em;\r\n margin: 0.5em 0;\r\n}\r\n\r\n.freeze {\r\n overflow: hidden;\r\n}\r\n\r\n/* menu links */\r\n\r\n#menu li a:link,\r\n#menu li a:visited,\r\n#menu li a:focus:active,\r\n#menu li a:focus:hover {\r\n color: #ed225d;\r\n /* gray #333;\r\n og p5 pink #ED225D;\r\n blue #2D7BB6 (a lighter Processing blue — it's our take on it) */\r\n /*outline: none !important; keep on for accessibility */\r\n background: transparent;\r\n -webkit-touch-callout: none;\r\n -webkit-user-select: none;\r\n -khtml-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n user-select: none;\r\n}\r\n\r\n/* body links */\r\n\r\na:link,\r\na:visited {\r\n color: #2d7bb6;\r\n text-decoration: none;\r\n /*outline: none !important; keep on for accessibility */\r\n}\r\n\r\na:active,\r\na:hover,\r\n#reference a:hover {\r\n color: #ed225d;\r\n text-decoration: none;\r\n padding-bottom: 0.11em;\r\n border-bottom: 0.11em dashed;\r\n border-bottom-color: #ed225d;\r\n transition: border-bottom 30ms linear;\r\n}\r\n\r\na.nounderline:hover {\r\n border: none;\r\n}\r\n\r\na.here {\r\n color: #ed225d;\r\n text-decoration: none;\r\n padding-bottom: 0.1em;\r\n border-bottom: transparent;\r\n border-bottom-color: #ed225d;\r\n}\r\n\r\n.highlight {\r\n background-color: rgba(237, 34, 93, 0.15);\r\n}\r\n\r\n.container > div:first-of-type {\r\n margin-top: 2em;\r\n}\r\n\r\nh1,\r\nh2,\r\nh3,\r\nh4,\r\nh5 {\r\n margin: 1.414em 0 0.5em 0;\r\n font-weight: inherit;\r\n line-height: 1.2;\r\n font-family: 'Montserrat', sans-serif;\r\n}\r\n\r\nh1 {\r\n font-size: 2.25em;\r\n /* 2.369em */\r\n margin: 0;\r\n}\r\n\r\nh2 {\r\n font-size: 1.5em;\r\n /* 1.777em */\r\n margin: 1em 0 0 0;\r\n}\r\n\r\n.code {\r\n font-family: 'Inconsolata', consolas, monospace;\r\n}\r\n\r\n#backlink {\r\n margin: 1.2em 0.444em 0 0;\r\n font-family: 'Montserrat', sans-serif;\r\n float: right;\r\n}\r\n\r\n#backlink a {\r\n color: #afafaf;\r\n}\r\n\r\n#backlink a:hover {\r\n color: #ed225d;\r\n border-bottom: none;\r\n}\r\n\r\n/*\r\n //////////////////////////////////////////////////\r\n HEADER\r\n //////////////////////////////////////////////////\r\n*/\r\n\r\n#promo,\r\n#promo:visited {\r\n width: 100%;\r\n background: palegreen;\r\n padding: 0;\r\n margin: 0;\r\n text-align: center;\r\n padding: 0.4em 0;\r\n background: rgb(116, 255, 183);\r\n background: radial-gradient(\r\n circle,\r\n rgba(116, 255, 183, 1) 0%,\r\n rgba(138, 255, 242, 1) 100%\r\n );\r\n font-family: 'Montserrat', sans-serif;\r\n color: #ed225d !important;\r\n}\r\n\r\n#promo:hover {\r\n background: #ed225d;\r\n color: white !important;\r\n}\r\n\r\n#promo-link {\r\n margin: 0 !important;\r\n padding: 0;\r\n}\r\n\r\n#family a:link,\r\n#family a:visited {\r\n margin: 0.4em;\r\n}\r\n\r\n#family a:hover,\r\n#family a:active {\r\n margin: 0.4em;\r\n border: none;\r\n}\r\n\r\n#family {\r\n position: absolute;\r\n z-index: 9999;\r\n top: 0;\r\n left: 0;\r\n /*padding: 0.5em 2em;*/\r\n width: 100%;\r\n /* 96, 100% if fixed*/\r\n border-bottom: 1px solid;\r\n overflow: none;\r\n margin: 0;\r\n border-bottom-color: rgba(51, 51, 51, 0.5);\r\n -webkit-box-shadow: 0px 0px 10px #333;\r\n -moz-box-shadow: 0px 0px 10px #333;\r\n box-shadow: 0px 0px 10px #333;\r\n background-color: rgba(255, 255, 255, 0.85);\r\n /* */\r\n}\r\n\r\n#processing-sites {\r\n margin: 0.375em 0;\r\n}\r\n\r\n#processing-sites li {\r\n list-style: none;\r\n display: inline-block;\r\n margin: 0;\r\n}\r\n\r\n#processing-sites li:first-child {\r\n margin-left: 2em;\r\n}\r\n\r\n#processing-sites li:last-child {\r\n float: right;\r\n margin-right: 2em;\r\n}\r\n\r\n.code-snippet {\r\n margin: 0 0 0 1em;\r\n width: 90%;\r\n clear: both;\r\n}\r\n\r\n.column-span {\r\n margin: 0 0 0 1em;\r\n padding: 0;\r\n float: left;\r\n max-width: 100%;\r\n}\r\n\r\n.method_description p {\r\n margin-top: 0;\r\n}\r\n\r\nmain {\r\n padding: 0;\r\n}\r\n\r\n.spacer {\r\n clear: both;\r\n}\r\n\r\nul {\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n}\r\n\r\nol {\r\n font-size: 1.2em;\r\n}\r\n\r\nli {\r\n margin: 0;\r\n padding: 0;\r\n}\r\n\r\nul.list_view {\r\n margin: 0.5em 0 0 1em;\r\n padding: 0;\r\n list-style: disc;\r\n list-style-position: outside;\r\n font-size: 1.2em;\r\n}\r\n\r\nol ul.list_view {\r\n font-size: 1em;\r\n}\r\n\r\nul.inside {\r\n margin: 0 0 0 2em;\r\n padding: 0;\r\n list-style: disc;\r\n list-style-position: inside;\r\n}\r\n\r\n.image-row img {\r\n width: 48%;\r\n height: 14.3%;\r\n}\r\n\r\n.image-row img + img {\r\n float: right;\r\n margin-right: 0;\r\n margin-bottom: 0.25em;\r\n}\r\n\r\nimg,\r\nmain div img {\r\n margin: 0.5em 0.5em 0 0;\r\n width: 100%;\r\n}\r\n\r\np + img {\r\n margin-top: 0;\r\n}\r\n\r\n.video {\r\n width: 100%;\r\n}\r\n\r\n#lockup {\r\n position: absolute;\r\n top: -5.75em;\r\n left: 1.25em;\r\n height: 0px;\r\n -webkit-touch-callout: none;\r\n -webkit-user-select: none;\r\n -khtml-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n user-select: none;\r\n}\r\n\r\n#lockup object {\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n}\r\n\r\n#lockup a:focus {\r\n outline: 0;\r\n}\r\n\r\n.logo {\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n margin-bottom: 0.4em;\r\n height: 4.5em;\r\n width: 9.75em;\r\n}\r\n\r\n#lockup p {\r\n color: #ed225d;\r\n font-size: 0.7em;\r\n font-family: 'Montserrat', sans-serif;\r\n margin: 0.5em 0 0 8.5em;\r\n}\r\n\r\n#lockup a:link {\r\n border: transparent;\r\n height: 4.5em;\r\n width: 9.75em;\r\n}\r\n\r\n.caption {\r\n margin-bottom: 2.5em;\r\n}\r\n\r\n.caption span,\r\n.caption p {\r\n text-align: right;\r\n font-size: 0.7em;\r\n font-family: 'Montserrat', sans-serif;\r\n padding-top: 0.25em;\r\n}\r\n\r\nfooter {\r\n clear: both;\r\n border-top: 0.1em dashed;\r\n border-top-color: #ed225d;\r\n margin: 2em 0;\r\n}\r\n\r\n.videoWrapper {\r\n position: relative;\r\n padding-bottom: 56.25%; /* 16:9 */\r\n height: 0;\r\n margin-top: 0.5em;\r\n}\r\n.videoWrapper iframe {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n/* ==========================================================================\r\n Helper classes\r\n ========================================================================== */\r\n\r\n/*\r\n * Image replacement\r\n */\r\n\r\n.ir {\r\n background-color: transparent;\r\n border: 0;\r\n overflow: hidden;\r\n /* IE 6/7 fallback */\r\n *text-indent: -9999px;\r\n}\r\n\r\n.ir:before {\r\n content: '';\r\n display: block;\r\n width: 0;\r\n height: 150%;\r\n}\r\n\r\n/*\r\n * Hide from both screenreaders and browsers: h5bp.com/u\r\n */\r\n\r\n.hidden {\r\n display: none !important;\r\n visibility: hidden;\r\n}\r\n\r\n/*\r\n * Hide only visually, but have it available for screenreaders: h5bp.com/v\r\n */\r\n\r\n.sr-only {\r\n border: 0;\r\n clip: rect(0 0 0 0);\r\n height: 1px;\r\n margin: -1px;\r\n overflow: hidden;\r\n padding: 0;\r\n position: absolute;\r\n width: 1px;\r\n}\r\n\r\n/*\r\n * Extends the .visuallyhidden class to allow the element to be focusable\r\n * when navigated to via the keyboard: h5bp.com/p\r\n */\r\n\r\n.sr-only.focusable:active,\r\n.sr-only.focusable:focus {\r\n clip: auto;\r\n height: auto;\r\n margin: 0;\r\n overflow: visible;\r\n position: static;\r\n width: auto;\r\n}\r\n\r\n/*\r\n * Hide visually and from screenreaders, but maintain layout\r\n */\r\n\r\n.invisible {\r\n visibility: hidden;\r\n}\r\n\r\n/*\r\n * Clearfix: contain floats\r\n *\r\n * For modern browsers\r\n * 1. The space content is one way to avoid an Opera bug when the\r\n * `contenteditable` attribute is included anywhere else in the document.\r\n * Otherwise it causes space to appear at the top and bottom of elements\r\n * that receive the `clearfix` class.\r\n * 2. The use of `table` rather than `block` is only necessary if using\r\n * `:before` to contain the top-margins of child elements.\r\n */\r\n\r\n.clearfix:before,\r\n.clearfix:after {\r\n content: ' ';\r\n /* 1 */\r\n display: table;\r\n /* 2 */\r\n}\r\n\r\n.clearfix:after {\r\n clear: both;\r\n}\r\n\r\n/*\r\n * For IE 6/7 only\r\n * Include this rule to trigger hasLayout and contain floats.\r\n */\r\n\r\n.clearfix {\r\n *zoom: 1;\r\n}\r\n\r\n/* ==========================================================================\r\n Responsive design\r\n ========================================================================== */\r\n\r\n#notMobile-message {\r\n display: none;\r\n order: 1;\r\n}\r\n\r\n#isMobile-displayButton {\r\n display: none;\r\n}\r\n\r\n#asterisk-design-element,\r\n.separator-design-element {\r\n display: none;\r\n}\r\n\r\n.pointerevents #asterisk-design-element,\r\n.pointerevents .separator-design-element {\r\n pointer-events: none;\r\n display: inline-block;\r\n}\r\n\r\n@media (min-width: 780px) {\r\n .container {\r\n width: 49em !important;\r\n margin: 11.5em auto; /* temp promo, 10.0em */\r\n }\r\n main {\r\n width: 36em;\r\n padding: 0 !important;\r\n }\r\n footer {\r\n width: 48em;\r\n }\r\n}\r\n\r\n@media (min-width: 780px) {\r\n .container {\r\n margin: 11.5em auto; /* temp promo, 10.0em */\r\n width: 100%;\r\n padding: 0.8em 0 0 0;\r\n height: auto;\r\n min-height: 100%;\r\n }\r\n #home-page {\r\n display: flex;\r\n flex-wrap: row;\r\n }\r\n main {\r\n padding: 0 1em 0 0;\r\n }\r\n small,\r\n .small,\r\n footer,\r\n #family {\r\n font-size: 0.7em;\r\n }\r\n footer {\r\n clear: both;\r\n /*margin: 4em 0 2em -.75em;*/\r\n }\r\n #i18n-btn {\r\n position: absolute;\r\n top: 4.0em; /* temp promo, 2.5em */\r\n right: 1em;\r\n }\r\n #i18n-btn a {\r\n font-family: 'Montserrat', sans-serif;\r\n }\r\n #menu {\r\n list-style: none;\r\n font-family: 'Montserrat', sans-serif;\r\n margin: 0 0.75em 0 -1.85em;\r\n /* margin-right: 0.75em; */\r\n width: 7.3em;\r\n height: 100%;\r\n /*float:left;*/\r\n border-top: transparent;\r\n border-bottom: transparent;\r\n padding: 0;\r\n font-size: 0.83em;\r\n z-index: 100;\r\n position: relative;\r\n top: 0;\r\n }\r\n #menu li {\r\n float: none;\r\n margin: 0 0 1em 0;\r\n text-align: right;\r\n }\r\n /* #menu li:last-child {\r\n margin: 0;\r\n } */\r\n /* #menu .other-link::after {\r\n content:\"\\2192\";\r\n margin-right: -0.98em;\r\n content:\" »\";\r\n } */\r\n #menu li:nth-child(11) {\r\n margin-top: 3em;\r\n padding-top: 0.5em;\r\n /*border-top: 0.06em solid rgba(51,51,51,0.25);*/\r\n }\r\n .left-column {\r\n width: 48%;\r\n float: left;\r\n margin-bottom: 40px;\r\n }\r\n .right-column {\r\n width: 48%;\r\n float: right;\r\n margin-right: 0;\r\n margin-bottom: 0.25em;\r\n }\r\n .narrow-left-column {\r\n width: 32%;\r\n float: left;\r\n }\r\n .wide-right-column {\r\n width: 64%;\r\n float: right;\r\n margin-right: 0;\r\n margin-bottom: 0.25em;\r\n }\r\n .book {\r\n font-size: 0.7em;\r\n }\r\n .column_0,\r\n .column_1,\r\n .column_2 {\r\n float: left;\r\n width: 11.333em;\r\n }\r\n .column_0,\r\n .column_1 {\r\n margin-right: 1em;\r\n }\r\n #collection-list-nav {\r\n width: 100%;\r\n clear: both;\r\n border-bottom: 1px dashed rgba(0, 0, 0, 0.2);\r\n }\r\n\r\n #collection-list-categories {\r\n font-family: 'Montserrat', sans-serif;\r\n display: flex;\r\n flex-direction: row;\r\n margin: 1em 0 1.5em 0;\r\n }\r\n #collection-list-categories ul {\r\n flex: 1;\r\n }\r\n #collection-list {\r\n margin: 0;\r\n }\r\n .group-name.first {\r\n margin-top: 0 !important;\r\n }\r\n .column.group-name {\r\n margin-bottom: 1em;\r\n }\r\n\r\n #library-page .group-name {\r\n margin: 2em 0 0.5em 0;\r\n }\r\n #library-page .column {\r\n margin-top: 1em;\r\n }\r\n #list {\r\n display: flex;\r\n flex-direction: row;\r\n flex-wrap: wrap;\r\n margin-bottom: 1em;\r\n }\r\n}\r\n\r\n@media (max-width: 780px) {\r\n .tagline {\r\n display: none !important;\r\n }\r\n\r\n #family {\r\n display: none;\r\n }\r\n\r\n #i18n-btn {\r\n position: absolute;\r\n top: 0.5em;\r\n right: 0.7em;\r\n z-index: 10;\r\n }\r\n\r\n #search {\r\n width: 100%;\r\n float: left;\r\n margin-bottom: 1em;\r\n }\r\n\r\n #search input[type='text'] {\r\n width: 100%;\r\n }\r\n\r\n #search input[type='text'],\r\n #search input[type='search'] {\r\n font-size: 1.5em;\r\n }\r\n\r\n #lockup {\r\n position: absolute;\r\n top: 2em;\r\n left: 1em;\r\n }\r\n .column-span {\r\n margin:0;\r\n padding: 0 1em;\r\n float: left;\r\n }\r\n #menu.top_menu,\r\n #menu {\r\n margin: 6em 0 0.5em 0;\r\n font-size: 1.3em;\r\n }\r\n #menu li {\r\n display: inline-block;\r\n }\r\n\r\n #menu li:nth-last-child(1) a::after {\r\n content: '';\r\n }\r\n\r\n #menu li a::after {\r\n content: ',';\r\n }\r\n\r\n #contribute-item:first-child {\r\n margin-left: 0px;\r\n }\r\n .download_box {\r\n width: 96%;\r\n }\r\n .download_box.half_box {\r\n width: 46%;\r\n margin-right: 4%;\r\n float: left;\r\n }\r\n #etc_list {\r\n font-size: 1.2em;\r\n margin-top: 1em;\r\n }\r\n #asterisk-design-element,\r\n .separator-design-element {\r\n display: none !important;\r\n pointer-events: none;\r\n }\r\n pre[class*='language-'] {\r\n padding: 0.5em 0.5em;\r\n width: 100%;\r\n }\r\n\r\n code {\r\n word-wrap: break-word;\r\n word-break: break-all;\r\n }\r\n #credits {\r\n position: relative !important;\r\n z-index: 2;\r\n margin-top: -7em;\r\n padding: 0 2em 3em 1em;\r\n font-size: 0.5em;\r\n float: right;\r\n width: 100%;\r\n text-align: right;\r\n display: none;\r\n /* HIDDEN SKETCH */\r\n }\r\n #home-sketch-frame {\r\n display: none;\r\n /* HIDDEN SKETCH */\r\n }\r\n #exampleDisplay,\r\n #exampleFrame,\r\n #exampleDisplay #exampleEditor {\r\n width: 100%;\r\n }\r\n #exampleDisplay .edit_button {\r\n left: -0.58em;\r\n }\r\n #exampleDisplay .reset_button {\r\n left: 3em;\r\n }\r\n #exampleDisplay .copy_button {\r\n left: 6.44em;\r\n }\r\n #exampleEditor {\r\n margin-top: 3em;\r\n }\r\n small,\r\n .small,\r\n footer {\r\n font-size: 0.5em;\r\n }\r\n .paramtype {\r\n width: 96%;\r\n }\r\n}\r\n\r\n@media (max-width: 400px) {\r\n #i18n {\r\n margin-top: 0.75em !important;\r\n }\r\n body {\r\n margin-top: -0.75em !important;\r\n }\r\n}\r\n\r\niframe {\r\n border: none;\r\n width: 100%;\r\n}\r\n\r\n.iframe-container {\r\n overflow: hidden;\r\n position: relative;\r\n}\r\n\r\n.iframe-container iframe {\r\n border: 0;\r\n height: 100%;\r\n left: 0;\r\n position: absolute;\r\n top: 0;\r\n width: 100%;\r\n}\r\n\r\n.cnv_div {\r\n /* This ensures that all canvases and additional html elements (if any) from\r\n * the example code snippets are only 100px wide rather than covering the\r\n * entire page, which potentially obscures the example code. */\r\n display: inline-flex;\r\n flex-direction: column;\r\n}\r\n\r\n.cnv_div > * {\r\n width: 100px;\r\n height: auto;\r\n}\r\n\r\n/*\r\n //////////////////////////////////////////////////\r\n LANGUAGE BUTTONS\r\n //////////////////////////////////////////////////\r\n*/\r\n\r\n#i18n-buttons {\r\n margin: 0;\r\n background: white;\r\n}\r\n\r\n#i18n-buttons li {\r\n list-style: none;\r\n display: inline-block;\r\n margin-left: 0.5em;\r\n}\r\n\r\n#i18n-btn a {\r\n border: none;\r\n outline: none;\r\n font-size: 0.7em;\r\n color: #696969;\r\n z-index: 5;\r\n}\r\n\r\n#i18n-btn a:hover {\r\n color: #ed225d;\r\n}\r\n\r\n#i18n-btn a.disabled {\r\n color: #ed225d;\r\n cursor: default;\r\n}\r\n\r\n/*\r\n //////////////////////////////////////////////////\r\n ASTERISKS\r\n //////////////////////////////////////////////////\r\n*/\r\n\r\n/* constants for the asterisk */\r\n\r\n#asterisk-design-element {\r\n position: fixed;\r\n z-index: -1;\r\n opacity: 0.6;\r\n pointer-events: none;\r\n}\r\n\r\n/* variations for asterisks on pages */\r\n\r\n.separator-design-element {\r\n width: 0.33em;\r\n height: 0.33em;\r\n margin: 0 0.09em 0.18em 0.09em;\r\n display: inline-block;\r\n overflow: hidden;\r\n text-indent: -100%;\r\n background: transparent\r\n url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgdmlld0JveD0iMCAwIDI4IDI4Ij48cGF0aCBkPSJNMTYuOSAxMC4zbDguNS0yLjYgMS43IDUuMiAtOC41IDIuOSA1LjMgNy41IC00LjQgMy4yIC01LjYtNy4zTDguNSAyNi4zbC00LjMtMy4zIDUuMy03LjJMMC45IDEyLjZsMS43LTUuMiA4LjYgMi44VjEuNGg1LjhWMTAuM3oiIHN0eWxlPSJmaWxsOiNFRDIyNUQ7c3Ryb2tlOiNFRDIyNUQiLz48L3N2Zz4=');\r\n background-size: 0.33em;\r\n}\r\n\r\n#home-page #asterisk-design-element {\r\n bottom: -8%;\r\n right: 20%;\r\n height: 12em;\r\n width: 12em;\r\n opacity: 1;\r\n}\r\n\r\n#learn-page #asterisk-design-element,\r\n#examples-page #asterisk-design-element,\r\n#other-content-types-page #asterisk-design-element {\r\n bottom: -14%;\r\n left: -20%;\r\n height: 25em;\r\n width: 25em;\r\n -webkit-transform: rotate(-1deg);\r\n -moz-transform: rotate(-1deg);\r\n -ms-transform: rotate(-1deg);\r\n -o-transform: rotate(-1deg);\r\n transform: rotate(-1deg);\r\n}\r\n\r\n#libraries-page #asterisk-design-element,\r\n#books-page #asterisk-design-element {\r\n bottom: -19%;\r\n right: -16%;\r\n height: 28em;\r\n width: 28em;\r\n -webkit-transform: rotate(2deg);\r\n -moz-transform: rotate(2deg);\r\n -ms-transform: rotate(2deg);\r\n -o-transform: rotate(2deg);\r\n transform: rotate(2deg);\r\n}\r\n\r\n#get-started-page #asterisk-design-element,\r\n#community-page #asterisk-design-element {\r\n top: 10%;\r\n right: -20%;\r\n height: 30em;\r\n width: 30em;\r\n -webkit-transform: rotate(2deg);\r\n -moz-transform: rotate(2deg);\r\n -ms-transform: rotate(2deg);\r\n -o-transform: rotate(2deg);\r\n transform: rotate(2deg);\r\n}\r\n\r\n#reference-page #asterisk-design-element,\r\n#download-page #asterisk-design-element {\r\n top: 7%;\r\n left: 1%;\r\n height: 10em;\r\n width: 10em;\r\n -webkit-transform: rotate(-21deg);\r\n -moz-transform: rotate(-21deg);\r\n -ms-transform: rotate(-21deg);\r\n -o-transform: rotate(-21deg);\r\n transform: rotate(-21deg);\r\n}\r\n\r\n.email-octopus-email-address {\r\n color: #ed225d;\r\n text-decoration: none;\r\n padding-bottom: 0.11em;\r\n outline: none;\r\n border: none;\r\n border-bottom: 0.11em dashed;\r\n border-bottom-color: #ed225d;\r\n transition: border-bottom 30ms linear;\r\n width: 13em;\r\n}\r\n\r\n.email-octopus-form-row-hp {\r\n position: absolute;\r\n left: -5000px;\r\n}\r\n\r\n.email-octopus-form-row button {\r\n border: 1px solid #ed225d;\r\n color: #ed225d;\r\n padding: 0.4em 0.6em;\r\n margin: 1em 0 0 0;\r\n font-family: 'Montserrat', sans-serif;\r\n display: block;\r\n}\r\n\r\n.email-octopus-form-row button:hover {\r\n background-color: #ed225d;\r\n color: white;\r\n}\r\n\r\n.email-octopus-email-address::-webkit-input-placeholder {\r\n color: #ababab;\r\n}\r\n.email-octopus-email-address::-moz-placeholder {\r\n color: #ababab;\r\n}\r\n.email-octopus-email-address:-moz-placeholder {\r\n color: #ababab;\r\n}\r\n.email-octopus-email-address:-ms-input-placeholder {\r\n color: #ababab;\r\n}\r\n\r\n@media (min-width: 720px) {\r\n .email-octopus-email-address {\r\n width: 16em;\r\n }\r\n\r\n .email-octopus-form-row button {\r\n margin: 0;\r\n margin-left: 0.5em;\r\n display: inline;\r\n }\r\n}\r\n"]}
\ No newline at end of file
diff --git a/dist/assets/examples/assets/360video_256crop_v2.mp4 b/dist/assets/examples/assets/360video_256crop_v2.mp4
new file mode 100644
index 0000000000..e64ba0d13c
Binary files /dev/null and b/dist/assets/examples/assets/360video_256crop_v2.mp4 differ
diff --git a/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_01.mp3 b/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_01.mp3
new file mode 100644
index 0000000000..9653a67bb6
Binary files /dev/null and b/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_01.mp3 differ
diff --git a/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_01.ogg b/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_01.ogg
new file mode 100644
index 0000000000..ddb329fc15
Binary files /dev/null and b/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_01.ogg differ
diff --git a/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_02.mp3 b/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_02.mp3
new file mode 100644
index 0000000000..b113049905
Binary files /dev/null and b/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_02.mp3 differ
diff --git a/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_02.ogg b/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_02.ogg
new file mode 100644
index 0000000000..77d530a2df
Binary files /dev/null and b/dist/assets/examples/assets/Damscray_-_Dancing_Tiger_02.ogg differ
diff --git a/dist/assets/examples/assets/Damscray_DancingTiger.mp3 b/dist/assets/examples/assets/Damscray_DancingTiger.mp3
new file mode 100644
index 0000000000..b113049905
Binary files /dev/null and b/dist/assets/examples/assets/Damscray_DancingTiger.mp3 differ
diff --git a/dist/assets/examples/assets/Damscray_DancingTiger.ogg b/dist/assets/examples/assets/Damscray_DancingTiger.ogg
new file mode 100644
index 0000000000..77d530a2df
Binary files /dev/null and b/dist/assets/examples/assets/Damscray_DancingTiger.ogg differ
diff --git a/dist/assets/examples/assets/LeagueGothic-Regular.otf b/dist/assets/examples/assets/LeagueGothic-Regular.otf
new file mode 100644
index 0000000000..6cd753faf8
Binary files /dev/null and b/dist/assets/examples/assets/LeagueGothic-Regular.otf differ
diff --git a/dist/assets/examples/assets/SourceSansPro-Regular.otf b/dist/assets/examples/assets/SourceSansPro-Regular.otf
new file mode 100644
index 0000000000..38941ae72f
Binary files /dev/null and b/dist/assets/examples/assets/SourceSansPro-Regular.otf differ
diff --git a/dist/assets/examples/assets/basic.frag b/dist/assets/examples/assets/basic.frag
new file mode 100644
index 0000000000..e6bc05d861
--- /dev/null
+++ b/dist/assets/examples/assets/basic.frag
@@ -0,0 +1,22 @@
+// casey conchinha - @kcconch ( https://github.com/kcconch )
+// louise lessel - @louiselessel ( https://github.com/louiselessel )
+// more p5.js + shader examples: https://itp-xstory.github.io/p5js-shaders/
+// this is a modification of a shader by adam ferriss
+// https://github.com/aferriss/p5jsShaderExamples/tree/gh-pages/2_texture-coordinates/2-1_basic
+
+precision mediump float;
+
+// this is the same variable we declared in the vertex shader
+// we need to declare it here too!
+varying vec2 vTexCoord;
+
+void main() {
+
+ // copy the vTexCoord
+ // vTexCoord is a value that goes from 0.0 - 1.0 depending on the pixels location
+ // we can use it to access every pixel on the screen
+ vec2 coord = vTexCoord;
+
+ // x values for red, y values for green, both for blue
+ gl_FragColor = vec4(coord.x, coord.y, (coord.x+coord.y), 1.0 );
+}
diff --git a/dist/assets/examples/assets/basic.vert b/dist/assets/examples/assets/basic.vert
new file mode 100644
index 0000000000..df069583a8
--- /dev/null
+++ b/dist/assets/examples/assets/basic.vert
@@ -0,0 +1,26 @@
+// vert file and comments from adam ferriss
+// https://github.com/aferriss/p5jsShaderExamples
+
+// our vertex data
+attribute vec3 aPosition;
+
+// our texcoordinates
+attribute vec2 aTexCoord;
+
+// this is a variable that will be shared with the fragment shader
+// we will assign the attribute texcoords to the varying texcoords to move them from the vert shader to the frag shader
+// it can be called whatever you want but often people prefiv it with 'v' to indicate that it is a varying
+varying vec2 vTexCoord;
+
+void main() {
+
+ // copy the texture coordinates
+ vTexCoord = aTexCoord;
+
+ // copy the position data into a vec4, using 1.0 as the w component
+ vec4 positionVec4 = vec4(aPosition, 1.0);
+ positionVec4.xy = positionVec4.xy * 2.0 - 1.0;
+
+ // send the vertex information on to the fragment shader
+ gl_Position = positionVec4;
+}
diff --git a/dist/assets/examples/assets/beat.mp3 b/dist/assets/examples/assets/beat.mp3
new file mode 100644
index 0000000000..3e5802604c
Binary files /dev/null and b/dist/assets/examples/assets/beat.mp3 differ
diff --git a/dist/assets/examples/assets/beat.ogg b/dist/assets/examples/assets/beat.ogg
new file mode 100644
index 0000000000..c13f86a41f
Binary files /dev/null and b/dist/assets/examples/assets/beat.ogg differ
diff --git a/dist/assets/examples/assets/beatbox.mp3 b/dist/assets/examples/assets/beatbox.mp3
new file mode 100644
index 0000000000..23fb92eb71
Binary files /dev/null and b/dist/assets/examples/assets/beatbox.mp3 differ
diff --git a/dist/assets/examples/assets/beatbox.ogg b/dist/assets/examples/assets/beatbox.ogg
new file mode 100644
index 0000000000..b2593a6340
Binary files /dev/null and b/dist/assets/examples/assets/beatbox.ogg differ
diff --git a/dist/assets/examples/assets/brush.png b/dist/assets/examples/assets/brush.png
new file mode 100644
index 0000000000..f3390e3501
Binary files /dev/null and b/dist/assets/examples/assets/brush.png differ
diff --git a/dist/assets/examples/assets/bubbles.csv b/dist/assets/examples/assets/bubbles.csv
new file mode 100644
index 0000000000..88ac4c1b72
--- /dev/null
+++ b/dist/assets/examples/assets/bubbles.csv
@@ -0,0 +1,5 @@
+x,y,diameter,name
+160,103,43.19838,Happy
+372,137,52.42526,Sad
+273,235,61.14072,Joyous
+121,179,44.758068,Melancholy
\ No newline at end of file
diff --git a/dist/assets/examples/assets/bubbles.json b/dist/assets/examples/assets/bubbles.json
new file mode 100644
index 0000000000..173b118dd4
--- /dev/null
+++ b/dist/assets/examples/assets/bubbles.json
@@ -0,0 +1,20 @@
+{
+ "bubbles": [
+ {
+ "position": {
+ "x": 160,
+ "y": 103
+ },
+ "diameter": 43.19838,
+ "label": "Happy"
+ },
+ {
+ "position": {
+ "x": 372,
+ "y": 137
+ },
+ "diameter": 52.42526,
+ "label": "Sad"
+ }
+ ]
+}
diff --git a/dist/assets/examples/assets/bx-spring.mp3 b/dist/assets/examples/assets/bx-spring.mp3
new file mode 100644
index 0000000000..4a955ab7fa
Binary files /dev/null and b/dist/assets/examples/assets/bx-spring.mp3 differ
diff --git a/dist/assets/examples/assets/bx-spring.ogg b/dist/assets/examples/assets/bx-spring.ogg
new file mode 100644
index 0000000000..b01abee927
Binary files /dev/null and b/dist/assets/examples/assets/bx-spring.ogg differ
diff --git a/dist/assets/examples/assets/cat.jpg b/dist/assets/examples/assets/cat.jpg
new file mode 100644
index 0000000000..6fd0221988
Binary files /dev/null and b/dist/assets/examples/assets/cat.jpg differ
diff --git a/dist/assets/examples/assets/concrete-tunnel.mp3 b/dist/assets/examples/assets/concrete-tunnel.mp3
new file mode 100644
index 0000000000..1bfbd4f8f8
Binary files /dev/null and b/dist/assets/examples/assets/concrete-tunnel.mp3 differ
diff --git a/dist/assets/examples/assets/concrete-tunnel.ogg b/dist/assets/examples/assets/concrete-tunnel.ogg
new file mode 100644
index 0000000000..be5f66b72c
Binary files /dev/null and b/dist/assets/examples/assets/concrete-tunnel.ogg differ
diff --git a/dist/assets/examples/assets/doorbell.mp3 b/dist/assets/examples/assets/doorbell.mp3
new file mode 100644
index 0000000000..44b6367916
Binary files /dev/null and b/dist/assets/examples/assets/doorbell.mp3 differ
diff --git a/dist/assets/examples/assets/doorbell.ogg b/dist/assets/examples/assets/doorbell.ogg
new file mode 100644
index 0000000000..e816288c97
Binary files /dev/null and b/dist/assets/examples/assets/doorbell.ogg differ
diff --git a/dist/assets/examples/assets/drum.mp3 b/dist/assets/examples/assets/drum.mp3
new file mode 100644
index 0000000000..9cd8727617
Binary files /dev/null and b/dist/assets/examples/assets/drum.mp3 differ
diff --git a/dist/assets/examples/assets/drum.ogg b/dist/assets/examples/assets/drum.ogg
new file mode 100644
index 0000000000..5061a1b319
Binary files /dev/null and b/dist/assets/examples/assets/drum.ogg differ
diff --git a/dist/assets/examples/assets/fingers.mov b/dist/assets/examples/assets/fingers.mov
new file mode 100644
index 0000000000..a9cbbbe3ea
Binary files /dev/null and b/dist/assets/examples/assets/fingers.mov differ
diff --git a/dist/assets/examples/assets/fingers.webm b/dist/assets/examples/assets/fingers.webm
new file mode 100644
index 0000000000..8fb81cfd15
Binary files /dev/null and b/dist/assets/examples/assets/fingers.webm differ
diff --git a/dist/assets/examples/assets/large-dark-plate.mp3 b/dist/assets/examples/assets/large-dark-plate.mp3
new file mode 100644
index 0000000000..b9a15cbed7
Binary files /dev/null and b/dist/assets/examples/assets/large-dark-plate.mp3 differ
diff --git a/dist/assets/examples/assets/large-dark-plate.ogg b/dist/assets/examples/assets/large-dark-plate.ogg
new file mode 100644
index 0000000000..40115377e5
Binary files /dev/null and b/dist/assets/examples/assets/large-dark-plate.ogg differ
diff --git a/dist/assets/examples/assets/lucky_dragons_-_power_melody.mp3 b/dist/assets/examples/assets/lucky_dragons_-_power_melody.mp3
new file mode 100644
index 0000000000..c54c70c01a
Binary files /dev/null and b/dist/assets/examples/assets/lucky_dragons_-_power_melody.mp3 differ
diff --git a/dist/assets/examples/assets/lucky_dragons_-_power_melody.ogg b/dist/assets/examples/assets/lucky_dragons_-_power_melody.ogg
new file mode 100644
index 0000000000..1e5b9e7abc
Binary files /dev/null and b/dist/assets/examples/assets/lucky_dragons_-_power_melody.ogg differ
diff --git a/dist/assets/examples/assets/mask.png b/dist/assets/examples/assets/mask.png
new file mode 100644
index 0000000000..a6737489b9
Binary files /dev/null and b/dist/assets/examples/assets/mask.png differ
diff --git a/dist/assets/examples/assets/moonwalk.jpg b/dist/assets/examples/assets/moonwalk.jpg
new file mode 100644
index 0000000000..36cc6c060e
Binary files /dev/null and b/dist/assets/examples/assets/moonwalk.jpg differ
diff --git a/dist/assets/examples/assets/parrot-bw.png b/dist/assets/examples/assets/parrot-bw.png
new file mode 100644
index 0000000000..cbc6a868d1
Binary files /dev/null and b/dist/assets/examples/assets/parrot-bw.png differ
diff --git a/dist/assets/examples/assets/parrot-color.png b/dist/assets/examples/assets/parrot-color.png
new file mode 100644
index 0000000000..5addae8d3a
Binary files /dev/null and b/dist/assets/examples/assets/parrot-color.png differ
diff --git a/dist/assets/examples/assets/particle_texture.png b/dist/assets/examples/assets/particle_texture.png
new file mode 100644
index 0000000000..0852c88e1d
Binary files /dev/null and b/dist/assets/examples/assets/particle_texture.png differ
diff --git a/dist/assets/examples/assets/rover.png b/dist/assets/examples/assets/rover.png
new file mode 100644
index 0000000000..a597279130
Binary files /dev/null and b/dist/assets/examples/assets/rover.png differ
diff --git a/dist/assets/examples/assets/rover_wide.jpg b/dist/assets/examples/assets/rover_wide.jpg
new file mode 100644
index 0000000000..793781a3be
Binary files /dev/null and b/dist/assets/examples/assets/rover_wide.jpg differ
diff --git a/dist/assets/examples/assets/small-plate.mp3 b/dist/assets/examples/assets/small-plate.mp3
new file mode 100644
index 0000000000..656e154a5f
Binary files /dev/null and b/dist/assets/examples/assets/small-plate.mp3 differ
diff --git a/dist/assets/examples/assets/small-plate.ogg b/dist/assets/examples/assets/small-plate.ogg
new file mode 100644
index 0000000000..7b70d3349d
Binary files /dev/null and b/dist/assets/examples/assets/small-plate.ogg differ
diff --git a/dist/assets/examples/assets/texture.frag b/dist/assets/examples/assets/texture.frag
new file mode 100644
index 0000000000..c74ce3f42f
--- /dev/null
+++ b/dist/assets/examples/assets/texture.frag
@@ -0,0 +1,84 @@
+// casey conchinha - @kcconch ( https://github.com/kcconch )
+// louise lessel - @louiselessel ( https://github.com/louiselessel )
+// more p5.js + shader examples: https://itp-xstory.github.io/p5js-shaders/
+// rotate/tile functions from example by patricio gonzalez vivo
+// @patriciogv ( patriciogonzalezvivo.com )
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+
+#define PI 3.14159265358979323846
+
+uniform vec2 resolution;
+uniform float time;
+uniform vec2 mouse;
+
+vec2 rotate2D (vec2 _st, float _angle) {
+ _st -= 0.5;
+ _st = mat2(cos(_angle),-sin(_angle),
+ sin(_angle),cos(_angle)) * _st;
+ _st += 0.5;
+ return _st;
+}
+
+vec2 tile (vec2 _st, float _zoom) {
+ _st *= _zoom;
+ return fract(_st);
+}
+
+vec2 rotateTilePattern(vec2 _st){
+
+ // Scale the coordinate system by 2x2
+ _st *= 2.0;
+
+ // Give each cell an index number
+ // according to its position
+ float index = 0.0;
+ index += step(1., mod(_st.x,2.0));
+ index += step(1., mod(_st.y,2.0))*2.0;
+
+ // |
+ // 2 | 3
+ // |
+ //--------------
+ // |
+ // 0 | 1
+ // |
+
+ // Make each cell between 0.0 - 1.0
+ _st = fract(_st);
+
+ // Rotate each cell according to the index
+ if(index == 1.0){
+ // Rotate cell 1 by 90 degrees
+ _st = rotate2D(_st,PI*0.5);
+ } else if(index == 2.0){
+ // Rotate cell 2 by -90 degrees
+ _st = rotate2D(_st,PI*-0.5);
+ } else if(index == 3.0){
+ // Rotate cell 3 by 180 degrees
+ _st = rotate2D(_st,PI);
+ }
+
+ return _st;
+}
+
+float concentricCircles(in vec2 st, in vec2 radius, in float res, in float scale) {
+ float dist = distance(st,radius);
+ float pct = floor(dist*res)/scale;
+ return pct;
+}
+
+void main (void) {
+ vec2 st = gl_FragCoord.xy/resolution.xy;
+ vec2 mst = gl_FragCoord.xy/mouse.xy;
+ float mdist= distance(vec2(1.0,1.0), mst);
+
+ float dist = distance(st,vec2(sin(time/10.0),cos(time/10.0)));
+ st = tile(st,10.0);
+
+ st = rotate2D(st,dist/(mdist/5.0)*PI*2.0);
+
+ gl_FragColor = vec4(vec3(concentricCircles(st, vec2(0.0,0.0), 5.0, 5.0),concentricCircles(st, vec2(0.0,0.0), 10.0, 10.0),concentricCircles(st, vec2(0.0,0.0), 20.0, 10.0)),1.0);
+}
diff --git a/dist/assets/examples/assets/texture.vert b/dist/assets/examples/assets/texture.vert
new file mode 100644
index 0000000000..5dd95c9b31
--- /dev/null
+++ b/dist/assets/examples/assets/texture.vert
@@ -0,0 +1,15 @@
+// vert file and comments from adam ferriss
+// https://github.com/aferriss/p5jsShaderExamples
+
+// our vertex data
+attribute vec3 aPosition;
+
+void main() {
+
+ // copy the position data into a vec4, using 1.0 as the w component
+ vec4 positionVec4 = vec4(aPosition, 1.0);
+ positionVec4.xy = positionVec4.xy * 2.0 - 1.0;
+
+ // send the vertex information on to the fragment shader
+ gl_Position = positionVec4;
+}
diff --git a/dist/assets/examples/assets/uniforms.frag b/dist/assets/examples/assets/uniforms.frag
new file mode 100644
index 0000000000..bf2ad1bc5d
--- /dev/null
+++ b/dist/assets/examples/assets/uniforms.frag
@@ -0,0 +1,77 @@
+// casey conchinha - @kcconch ( https://github.com/kcconch )
+// louise lessel - @louiselessel ( https://github.com/louiselessel )
+// more p5.js + shader examples: https://itp-xstory.github.io/p5js-shaders/
+// this is a modification of a shader by adam ferriss
+// https://github.com/aferriss/p5jsShaderExamples/tree/gh-pages/5_shapes/5-3_polygon
+
+precision mediump float;
+
+// these are known as preprocessor directive
+// essentially we are just declaring some variables that wont change
+// you can think of them just like const variables
+
+#define PI 3.14159265359
+#define TWO_PI 6.28318530718
+
+// we need the sketch resolution to perform some calculations
+uniform vec2 resolution;
+uniform float time;
+uniform float mouse;
+
+// this is a function that turns an rgb value that goes from 0 - 255 into 0.0 - 1.0
+vec3 rgb(float r, float g, float b){
+ return vec3(r / 255.0, g / 255.0, b / 255.0);
+}
+
+vec4 poly(float x, float y, float size, float sides, float rotation, vec3 col){
+ // get our coordinates
+ vec2 coord = gl_FragCoord.xy;
+
+ // move the coordinates to where we want to draw the shape
+ vec2 pos = vec2(x,y) - coord;
+
+ // calculate the angle of a pixel relative to our position
+ float angle = atan( pos.x, pos.y) + PI + rotation;
+
+ // calculate the size of our shape
+ float radius = TWO_PI / sides;
+
+ // this is the function that controls our shapes appearance
+ // i pulled it from the book of shaders shapes page https://thebookofshaders.com/07/
+ // essentially what we are doing here is computing a circle with length(pos) and manipulating it's shape with the cos() function
+ // this technique is really powerful and can be used to create all sorts of different shapes
+ // for instance, try changing cos() to sin()
+ float d = cos(floor(0.5 + angle / radius) * radius - angle) * length(pos);
+
+ // restrict our shape to black and white and set it's size
+ // we use the smoothstep function to get a nice soft edge
+ d = 1.0 - smoothstep(size*0.5, size*0.5+1.0, d);
+
+ // return the color with the shape as the alpha channel
+ return vec4(col, d);
+}
+
+
+void main() {
+
+ vec2 center = resolution * 1.0; // draw the shape at the center of the screen
+ float size = resolution.y * 0.5; // make the shape a quarter of the screen height
+ float sides = mod(floor(mouse), 7.0) + 3.0; // slowly increase the sides, when it reaches 10 sides, go back down to 3
+ float rotation = time; // rotation is in radians, but for time it doesnt really matter
+
+ // lets make our shape in the center of the screen. We have to subtract half of it's width and height just like in p5
+ float x = center.x ;
+ float y = center.y ;
+
+ // a color for the shape
+ vec3 grn = rgb(200.0, 240.0, 200.0);
+
+ // call our shape function with poly(x, y, sz, sides, rotation, color);
+ vec4 poly = poly(center.x , center.y, size, sides, rotation, grn);
+
+ // mix the polygon with the opposite of the green color according to the shapes alpha
+ poly.rgb = mix(1.0 - grn, poly.rgb, poly.a);
+
+ // render to screen
+ gl_FragColor = vec4(poly.rgb, 1.0);
+}
diff --git a/dist/assets/examples/assets/uniforms.vert b/dist/assets/examples/assets/uniforms.vert
new file mode 100644
index 0000000000..568a87edd2
--- /dev/null
+++ b/dist/assets/examples/assets/uniforms.vert
@@ -0,0 +1,19 @@
+// vert file and comments from adam ferriss
+// https://github.com/aferriss/p5jsShaderExamples
+
+attribute vec3 aPosition;
+attribute vec2 aTexCoord;
+
+void main() {
+
+ // copy the position data into a vec4, using 1.0 as the w component
+ vec4 positionVec4 = vec4(aPosition, 1.0);
+
+ // scale the rect by two, and move it to the center of the screen
+ // if we don't do this, it will appear with its bottom left corner in the center of the sketch
+ // try commenting this line out to see what happens
+ positionVec4.xy = positionVec4.xy * 2.0 - 1.0;
+
+ // send the vertex information on to the fragment shader
+ gl_Position = positionVec4;
+}
diff --git a/dist/assets/examples/assets/webcam.frag b/dist/assets/examples/assets/webcam.frag
new file mode 100644
index 0000000000..ada0949d9a
--- /dev/null
+++ b/dist/assets/examples/assets/webcam.frag
@@ -0,0 +1,34 @@
+// casey conchinha - @kcconch ( https://github.com/kcconch )
+// louise lessel - @louiselessel ( https://github.com/louiselessel )
+// more p5.js + shader examples: https://itp-xstory.github.io/p5js-shaders/
+
+precision mediump float;
+
+// grab texcoords from vert shader
+varying vec2 vTexCoord;
+
+// our texture coming from p5
+uniform sampler2D tex0;
+
+
+void main() {
+ vec2 uv = vTexCoord;
+
+ // the texture is loaded upside down and backwards by default so lets flip it
+ uv.y = 1.0 - uv.y;
+
+ vec4 tex = texture2D(tex0, uv);
+
+ float gray = (tex.r + tex.g + tex.b) / 3.0;
+
+ float res = 20.0;
+ float scl = res / (10.0);
+
+ float threshR = (fract(floor(tex.r*res)/scl)*scl) * gray ;
+ float threshG = (fract(floor(tex.g*res)/scl)*scl) * gray ;
+ float threshB = (fract(floor(tex.b*res)/scl)*scl) * gray ;
+ vec3 thresh = vec3(threshR, threshG, threshB);
+
+ // render the output
+ gl_FragColor = vec4(thresh, 1.0);
+}
diff --git a/dist/assets/examples/assets/webcam.vert b/dist/assets/examples/assets/webcam.vert
new file mode 100644
index 0000000000..c04d96c34a
--- /dev/null
+++ b/dist/assets/examples/assets/webcam.vert
@@ -0,0 +1,21 @@
+// vert file and comments from adam ferriss
+// https://github.com/aferriss/p5jsShaderExamples
+
+// our vertex data
+attribute vec3 aPosition;
+attribute vec2 aTexCoord;
+
+// lets get texcoords just for fun!
+varying vec2 vTexCoord;
+
+void main() {
+ // copy the texcoords
+ vTexCoord = aTexCoord;
+
+ // copy the position data into a vec4, using 1.0 as the w component
+ vec4 positionVec4 = vec4(aPosition, 1.0);
+ positionVec4.xy = positionVec4.xy * 2.0 - 1.0;
+
+ // send the vertex information on to the fragment shader
+ gl_Position = positionVec4;
+}
diff --git a/dist/assets/examples/en/00_Structure/00_Statements_and_Comments.js b/dist/assets/examples/en/00_Structure/00_Statements_and_Comments.js
new file mode 100644
index 0000000000..8b8d81e5b1
--- /dev/null
+++ b/dist/assets/examples/en/00_Structure/00_Statements_and_Comments.js
@@ -0,0 +1,20 @@
+/*
+ * @name Comments and Statements
+ * @arialabel Mustard yellow background
+ * @description Statements are the elements that make up programs. The ";" (semi-colon) symbol is used to end statements. It is called the "statement terminator". Comments are used for making notes to help people better understand programs. A comment begins with two forward slashes ("//"). (ported from https://processing.org/examples/statementscomments.html)
+ */
+// The createCanvas function is a statement that tells the computer
+// how large to make the window.
+// Each function statement has zero or more parameters.
+// Parameters are data passed into the function
+// and are used as values for telling the computer what to do.
+function setup() {
+ createCanvas(710, 400);
+}
+
+// The background function is a statement that tells the computer
+// which color (or gray value) to make the background of the display window
+function draw() {
+ background(204, 153, 0);
+}
+
diff --git a/dist/assets/examples/en/00_Structure/01_Coordinates.js b/dist/assets/examples/en/00_Structure/01_Coordinates.js
new file mode 100644
index 0000000000..76e304461d
--- /dev/null
+++ b/dist/assets/examples/en/00_Structure/01_Coordinates.js
@@ -0,0 +1,40 @@
+/*
+ * @name Coordinates
+ * @arialabel Black background with a orange outline of a square in the middle and a blue line across at the top ⅓ point of the square
+ * @description All shapes drawn to the screen have a position that is
+ * specified as a coordinate. All coordinates are measured as the distance from
+ * the origin in units of pixels. The origin [0, 0] is the coordinate in the
+ * upper left of the window and the coordinate in the lower right is [width-1,
+ * height-1].
+ */
+function setup() {
+ // Sets the screen to be 720 pixels wide and 400 pixels high
+ createCanvas(720, 400);
+}
+
+function draw() {
+ // Set the background to black and turn off the fill color
+ background(0);
+ noFill();
+
+ // The two parameters of the point() method each specify
+ // coordinates.
+ // The first parameter is the x-coordinate and the second is the Y
+ stroke(255);
+ point(width * 0.5, height * 0.5);
+ point(width * 0.5, height * 0.25);
+
+ // Coordinates are used for drawing all shapes, not just points.
+ // Parameters for different functions are used for different
+ // purposes. For example, the first two parameters to line()
+ // specify the coordinates of the first endpoint and the second
+ // two parameters specify the second endpoint
+ stroke(0, 153, 255);
+ line(0, height * 0.33, width, height * 0.33);
+
+ // By default, the first two parameters to rect() are the
+ // coordinates of the upper-left corner and the second pair
+ // is the width and height
+ stroke(255, 153, 0);
+ rect(width * 0.25, height * 0.1, width * 0.5, height * 0.8);
+}
diff --git a/dist/assets/examples/en/00_Structure/02_Width_and_Height.js b/dist/assets/examples/en/00_Structure/02_Width_and_Height.js
new file mode 100644
index 0000000000..a80a682a4b
--- /dev/null
+++ b/dist/assets/examples/en/00_Structure/02_Width_and_Height.js
@@ -0,0 +1,21 @@
+/*
+ * @name Width and Height
+ * @arialabel Pattern of grey and green horizontal lines. The left half also has white vertical lines. The left half is broken up into two triangular shapes, one which is predominately green stripes, and one which is white with the white stripes
+ * @description The 'width' and 'height' variables contain the
+ * width and height of the display window as defined in the createCanvas()
+ * function.
+ */
+function setup() {
+ createCanvas(720, 400);
+}
+
+function draw() {
+ background(127);
+ noStroke();
+ for (let i = 0; i < height; i += 20) {
+ fill(129, 206, 15);
+ rect(0, i, width, 10);
+ fill(255);
+ rect(i, 0, 10, height);
+ }
+}
diff --git a/dist/assets/examples/en/00_Structure/03_Setup_and_Draw.js b/dist/assets/examples/en/00_Structure/03_Setup_and_Draw.js
new file mode 100644
index 0000000000..ec48063635
--- /dev/null
+++ b/dist/assets/examples/en/00_Structure/03_Setup_and_Draw.js
@@ -0,0 +1,28 @@
+/*
+ * @name Setup and Draw
+ * @arialabel Animated horizontal white line on a black background that moves from the bottom to the top of the screen
+ * @description The code inside the draw() function runs continuously from top
+ * to bottom until the program is stopped.
+ */
+let y = 100;
+
+// The statements in the setup() function
+// execute once when the program begins
+function setup() {
+ // createCanvas must be the first statement
+ createCanvas(720, 400);
+ stroke(255); // Set line drawing color to white
+ frameRate(30);
+}
+// The statements in draw() are executed until the
+// program is stopped. Each statement is executed in
+// sequence and after the last line is read, the first
+// line is executed again.
+function draw() {
+ background(0); // Set the background to black
+ y = y - 1;
+ if (y < 0) {
+ y = height;
+ }
+ line(0, y, width, y);
+}
diff --git a/dist/assets/examples/en/00_Structure/04_No_Loop.js b/dist/assets/examples/en/00_Structure/04_No_Loop.js
new file mode 100644
index 0000000000..48e0095d7e
--- /dev/null
+++ b/dist/assets/examples/en/00_Structure/04_No_Loop.js
@@ -0,0 +1,31 @@
+/*
+ * @name No Loop
+ * @arialabel Horizontal white line across the middle of a black background
+ * @description The noLoop() function causes draw() to only execute once.
+ * Without calling noLoop(), the code inside draw() is run continually.
+ */
+let y;
+
+// The statements in the setup() function
+// execute once when the program begins
+function setup() {
+ // createCanvas should be the first statement
+ createCanvas(720, 400);
+ stroke(255); // Set line drawing color to white
+ noLoop();
+
+ y = height * 0.5;
+}
+
+// The statements in draw() are executed until the
+// program is stopped. Each statement is executed in
+// sequence and after the last line is read, the first
+// line is executed again.
+function draw() {
+ background(0); // Set the background to black
+ y = y - 1;
+ if (y < 0) {
+ y = height;
+ }
+ line(0, y, width, y);
+}
diff --git a/dist/assets/examples/en/00_Structure/05_Loop.js b/dist/assets/examples/en/00_Structure/05_Loop.js
new file mode 100644
index 0000000000..a624d8520f
--- /dev/null
+++ b/dist/assets/examples/en/00_Structure/05_Loop.js
@@ -0,0 +1,27 @@
+/*
+ * @name Loop
+ * @arialabel Horizontal white line on a black background that moves from the bottom to the top of the screen parallel to the x-axis
+ * @description The code inside the draw() function runs continuously from top
+ * to bottom until the program is stopped.
+ */
+let y = 100;
+
+// The statements in the setup() function
+// execute once when the program begins
+function setup() {
+ createCanvas(720, 400); // Size must be the first statement
+ stroke(255); // Set line drawing color to white
+ frameRate(30);
+}
+// The statements in draw() are executed until the
+// program is stopped. Each statement is executed in
+// sequence and after the last line is read, the first
+// line is executed again.
+function draw() {
+ background(0); // Set the background to black
+ y = y - 1;
+ if (y < 0) {
+ y = height;
+ }
+ line(0, y, width, y);
+}
diff --git a/dist/assets/examples/en/00_Structure/06_Redraw.js b/dist/assets/examples/en/00_Structure/06_Redraw.js
new file mode 100644
index 0000000000..6a05360b92
--- /dev/null
+++ b/dist/assets/examples/en/00_Structure/06_Redraw.js
@@ -0,0 +1,34 @@
+/*
+ * @name Redraw
+ * @arialabel Horizontal white line across a black background that moves higher on the screen with each mouse click
+ * @description The redraw() function makes draw() execute once. In this example,
+ * draw() is executed once every time the mouse is clicked.
+ */
+
+let y;
+
+// The statements in the setup() function
+// execute once when the program begins
+function setup() {
+ createCanvas(720, 400);
+ stroke(255);
+ noLoop();
+ y = height * 0.5;
+}
+
+// The statements in draw() are executed until the
+// program is stopped. Each statement is executed in
+// sequence and after the last line is read, the first
+// line is executed again.
+function draw() {
+ background(0);
+ y = y - 4;
+ if (y < 0) {
+ y = height;
+ }
+ line(0, y, width, y);
+}
+
+function mousePressed() {
+ redraw();
+}
diff --git a/dist/assets/examples/en/00_Structure/07_Functions.js b/dist/assets/examples/en/00_Structure/07_Functions.js
new file mode 100644
index 0000000000..648915c01d
--- /dev/null
+++ b/dist/assets/examples/en/00_Structure/07_Functions.js
@@ -0,0 +1,29 @@
+/*
+ *@name Functions
+ *@arialabel Three targets are created in the shape of black circles. There is a gradient from white to black from the center of the circle to the outer edge.
+ *@description The drawTarget() function makes it easy to draw many distinct
+ *targets. Each call to drawTarget() specifies the position, size, and number of
+ *rings for each target.
+ */
+
+function setup() {
+ createCanvas(720, 400);
+ background(51);
+ noStroke();
+ noLoop();
+}
+
+function draw() {
+ drawTarget(width * 0.25, height * 0.4, 200, 4);
+ drawTarget(width * 0.5, height * 0.5, 300, 10);
+ drawTarget(width * 0.75, height * 0.3, 120, 6);
+}
+
+function drawTarget(xloc, yloc, size, num) {
+ const grayvalues = 255 / num;
+ const steps = size / num;
+ for (let i = 0; i < num; i++) {
+ fill(i * grayvalues);
+ ellipse(xloc, yloc, size - i * steps, size - i * steps);
+ }
+}
diff --git a/dist/assets/examples/en/00_Structure/08_Recursion.js b/dist/assets/examples/en/00_Structure/08_Recursion.js
new file mode 100644
index 0000000000..4f0b211912
--- /dev/null
+++ b/dist/assets/examples/en/00_Structure/08_Recursion.js
@@ -0,0 +1,36 @@
+/*
+ *@name Recursion
+ *@arialabel Grey circle with two grey circles across its middle. Each of these two grey circles have more grey circles across its middle. This pattern continues until no more can be drawn within them.
+ *@description A demonstration of recursion, which means functions call themselves.
+ * A recursive function must have a terminating condition, without which it will
+ * go into an infinite loop. Notice how the drawCircle() function calls itself
+ * at the end of its block. It continues to do this until the variable "level" is
+ * equal to 1.
+ */
+
+function setup() {
+ createCanvas(720, 560);
+ noStroke();
+ noLoop();
+}
+
+function draw() {
+ drawCircle(width / 2, 280, 6);
+}
+
+function drawCircle(x, radius, level) {
+ // 'level' is the variable that terminates the recursion once it reaches
+ // a certain value (here, 1). If a terminating condition is not
+ // specified, a recursive function keeps calling itself again and again
+ // until it runs out of stack space - not a favourable outcome!
+ const tt = (126 * level) / 4.0;
+ fill(tt);
+ ellipse(x, height / 2, radius * 2, radius * 2);
+ if (level > 1) {
+ // 'level' decreases by 1 at every step and thus makes the terminating condition
+ // attainable
+ level = level - 1;
+ drawCircle(x - radius / 2, radius / 2, level);
+ drawCircle(x + radius / 2, radius / 2, level);
+ }
+}
diff --git a/dist/assets/examples/en/00_Structure/09_Create_Graphics.js b/dist/assets/examples/en/00_Structure/09_Create_Graphics.js
new file mode 100644
index 0000000000..a786f0c06c
--- /dev/null
+++ b/dist/assets/examples/en/00_Structure/09_Create_Graphics.js
@@ -0,0 +1,30 @@
+/*
+ * @name Create Graphics
+ * @arialabel Black background with a very dark grey rectangle in the middle. The user’s mouse draws in white but not on the center rectangle.
+ * @description Creates and returns a new p5.Renderer object. Use this
+ * class if you need to draw into an off-screen graphics buffer. The two parameters
+ * define the width and height in pixels.
+ */
+
+let pg;
+
+function setup() {
+ createCanvas(710, 400);
+ pg = createGraphics(400, 250);
+}
+
+function draw() {
+ fill(0, 12);
+ rect(0, 0, width, height);
+ fill(255);
+ noStroke();
+ ellipse(mouseX, mouseY, 60, 60);
+
+ pg.background(51);
+ pg.noFill();
+ pg.stroke(255);
+ pg.ellipse(mouseX - 150, mouseY - 75, 60, 60);
+
+ //Draw the offscreen buffer to the screen with image()
+ image(pg, 150, 75);
+}
diff --git a/dist/assets/examples/en/01_Form/00_Points_and_Lines.js b/dist/assets/examples/en/01_Form/00_Points_and_Lines.js
new file mode 100644
index 0000000000..4aeb06e69f
--- /dev/null
+++ b/dist/assets/examples/en/01_Form/00_Points_and_Lines.js
@@ -0,0 +1,37 @@
+/*
+ * @name Points and Lines
+ * @arialabel White outline of a square on a black background
+ * @description Points and lines can be used to draw basic geometry.
+ * Change the value of the variable 'd' to scale the form. The four
+ * variables set the positions based on the value of 'd'.
+ */
+function setup() {
+ let d = 70;
+ let p1 = d;
+ let p2 = p1 + d;
+ let p3 = p2 + d;
+ let p4 = p3 + d;
+
+ // Sets the screen to be 720 pixels wide and 400 pixels high
+ createCanvas(720, 400);
+ background(0);
+ noSmooth();
+
+ translate(140, 0);
+
+ // Draw gray box
+ stroke(153);
+ line(p3, p3, p2, p3);
+ line(p2, p3, p2, p2);
+ line(p2, p2, p3, p2);
+ line(p3, p2, p3, p3);
+
+ // Draw white points
+ stroke(255);
+ point(p1, p1);
+ point(p1, p3);
+ point(p2, p4);
+ point(p3, p1);
+ point(p4, p2);
+ point(p4, p4);
+}
diff --git a/dist/assets/examples/en/01_Form/01_Shape_Primitives.js b/dist/assets/examples/en/01_Form/01_Shape_Primitives.js
new file mode 100644
index 0000000000..b7726f42ca
--- /dev/null
+++ b/dist/assets/examples/en/01_Form/01_Shape_Primitives.js
@@ -0,0 +1,32 @@
+/*
+ * @name Shape Primitives
+ * @arialabel From left to right: a grey triangle, a darker grey square, a light grey trapezoid, a white circle, a light grey triangle, and a white half circle, on a black background
+ * @description The basic shape primitive functions are triangle(),
+ * rect(), quad(), ellipse(), and arc(). Squares are made with rect()
+ * and circles are made with ellipse(). Each of these functions requires
+ * a number of parameters to determine the shape's position and size.
+ */
+function setup() {
+ // Sets the screen to be 720 pixels wide and 400 pixels high
+ createCanvas(720, 400);
+ background(0);
+ noStroke();
+
+ fill(204);
+ triangle(18, 18, 18, 360, 81, 360);
+
+ fill(102);
+ rect(81, 81, 63, 63);
+
+ fill(204);
+ quad(189, 18, 216, 18, 216, 360, 144, 360);
+
+ fill(255);
+ ellipse(252, 144, 72, 72);
+
+ fill(204);
+ triangle(288, 18, 351, 360, 288, 360);
+
+ fill(255);
+ arc(479, 300, 280, 280, PI, TWO_PI);
+}
diff --git a/dist/assets/examples/en/01_Form/02_Pie_Chart.js b/dist/assets/examples/en/01_Form/02_Pie_Chart.js
new file mode 100644
index 0000000000..b95d3b6b43
--- /dev/null
+++ b/dist/assets/examples/en/01_Form/02_Pie_Chart.js
@@ -0,0 +1,35 @@
+/*
+ * @name Pie Chart
+ * @arialabel Pie chart on a grey background with the different slices of the pie chart in various shades of grey
+ * @description Uses the arc() function to generate a pie chart from the data
+ * stored in an array.
+ */
+let angles = [30, 10, 45, 35, 60, 38, 75, 67];
+
+function setup() {
+ createCanvas(720, 400);
+ noStroke();
+ noLoop(); // Run once and stop
+}
+
+function draw() {
+ background(100);
+ pieChart(300, angles);
+}
+
+function pieChart(diameter, data) {
+ let lastAngle = 0;
+ for (let i = 0; i < data.length; i++) {
+ let gray = map(i, 0, data.length, 0, 255);
+ fill(gray);
+ arc(
+ width / 2,
+ height / 2,
+ diameter,
+ diameter,
+ lastAngle,
+ lastAngle + radians(angles[i])
+ );
+ lastAngle += radians(angles[i]);
+ }
+}
diff --git a/dist/assets/examples/en/01_Form/03_Regular_Polygon.js b/dist/assets/examples/en/01_Form/03_Regular_Polygon.js
new file mode 100644
index 0000000000..d84740c2fd
--- /dev/null
+++ b/dist/assets/examples/en/01_Form/03_Regular_Polygon.js
@@ -0,0 +1,44 @@
+/*
+ * @name Regular Polygon
+ * @arialabel Three white shapes with black outlines on a grey background rotating. From left to right, a triangle, icosagon, and a heptagon
+ * @description What is your favorite? Pentagon? Hexagon? Heptagon? No?
+ * What about the icosagon? The polygon() function created for this example is
+ * capable of drawing any regular polygon. Try placing different numbers into
+ * the polygon() function calls within draw() to explore.
+ */
+function setup() {
+ createCanvas(720, 400);
+}
+
+function draw() {
+ background(102);
+
+ push();
+ translate(width * 0.2, height * 0.5);
+ rotate(frameCount / 200.0);
+ polygon(0, 0, 82, 3);
+ pop();
+
+ push();
+ translate(width * 0.5, height * 0.5);
+ rotate(frameCount / 50.0);
+ polygon(0, 0, 80, 20);
+ pop();
+
+ push();
+ translate(width * 0.8, height * 0.5);
+ rotate(frameCount / -100.0);
+ polygon(0, 0, 70, 7);
+ pop();
+}
+
+function polygon(x, y, radius, npoints) {
+ let angle = TWO_PI / npoints;
+ beginShape();
+ for (let a = 0; a < TWO_PI; a += angle) {
+ let sx = x + cos(a) * radius;
+ let sy = y + sin(a) * radius;
+ vertex(sx, sy);
+ }
+ endShape(CLOSE);
+}
diff --git a/dist/assets/examples/en/01_Form/04_Star.js b/dist/assets/examples/en/01_Form/04_Star.js
new file mode 100644
index 0000000000..e8dbb998c2
--- /dev/null
+++ b/dist/assets/examples/en/01_Form/04_Star.js
@@ -0,0 +1,47 @@
+/*
+ * @name Star
+ * @arialabel Grey background with three white shapes rotating with black outlines. From left to right, a 3-pointed star, a 40-pointed shape, and a 5-pointed star
+ * @description The star() function created for this example is capable of
+ * drawing a wide range of different forms. Try placing different numbers
+ * into the star() function calls within draw() to explore.
+ */
+function setup() {
+ createCanvas(720, 400);
+}
+
+function draw() {
+ background(102);
+
+ push();
+ translate(width * 0.2, height * 0.5);
+ rotate(frameCount / 200.0);
+ star(0, 0, 5, 70, 3);
+ pop();
+
+ push();
+ translate(width * 0.5, height * 0.5);
+ rotate(frameCount / 50.0);
+ star(0, 0, 80, 100, 40);
+ pop();
+
+ push();
+ translate(width * 0.8, height * 0.5);
+ rotate(frameCount / -100.0);
+ star(0, 0, 30, 70, 5);
+ pop();
+}
+
+function star(x, y, radius1, radius2, npoints) {
+ let angle = TWO_PI / npoints;
+ let halfAngle = angle / 2.0;
+ beginShape();
+ for (let a = 0; a < TWO_PI; a += angle) {
+ let sx = x + cos(a) * radius2;
+ let sy = y + sin(a) * radius2;
+ vertex(sx, sy);
+ sx = x + cos(a + halfAngle) * radius1;
+ sy = y + sin(a + halfAngle) * radius1;
+ vertex(sx, sy);
+ }
+ endShape(CLOSE);
+}
diff --git a/dist/assets/examples/en/01_Form/05_Triangle_Strip.js b/dist/assets/examples/en/01_Form/05_Triangle_Strip.js
new file mode 100644
index 0000000000..be5a1d2807
--- /dev/null
+++ b/dist/assets/examples/en/01_Form/05_Triangle_Strip.js
@@ -0,0 +1,39 @@
+/*
+ * @name Triangle Strip
+ * @arialabel A ring of white triangles form a heptagon on the grey background. When a user drags their mouse from left to right, the number of triangles increase and create a smoother, circular ring
+ * @description Example by Ira Greenberg. Generate a closed ring using the
+ * vertex() function and beginShape(TRIANGLE_STRIP) mode. The outsideRadius
+ * and insideRadius variables control ring's radii respectively.
+ */
+let x;
+let y;
+let outsideRadius = 150;
+let insideRadius = 100;
+
+function setup() {
+ createCanvas(720, 400);
+ background(204);
+ x = width / 2;
+ y = height / 2;
+}
+
+function draw() {
+ background(204);
+
+ let numPoints = int(map(mouseX, 0, width, 6, 60));
+ let angle = 0;
+ let angleStep = 180.0 / numPoints;
+
+ beginShape(TRIANGLE_STRIP);
+ for (let i = 0; i <= numPoints; i++) {
+ let px = x + cos(radians(angle)) * outsideRadius;
+ let py = y + sin(radians(angle)) * outsideRadius;
+ angle += angleStep;
+ vertex(px, py);
+ px = x + cos(radians(angle)) * insideRadius;
+ py = y + sin(radians(angle)) * insideRadius;
+ vertex(px, py);
+ angle += angleStep;
+ }
+ endShape();
+}
diff --git a/dist/assets/examples/en/01_Form/06_Bezier.js b/dist/assets/examples/en/01_Form/06_Bezier.js
new file mode 100644
index 0000000000..cef3778da3
--- /dev/null
+++ b/dist/assets/examples/en/01_Form/06_Bezier.js
@@ -0,0 +1,29 @@
+/*
+ * @name Bezier
+ * @arialabel 10 lines in a bezier curve formation. The bottom of the curve does not move but as the user’s mouse moves, the top of the curve follows the left and right movement
+ * @description The first two parameters for the bezier() function specify the
+ * first point in the curve and the last two parameters specify the last point.
+ * The middle parameters set the control points that define the shape of the
+ * curve.
+ */
+function setup() {
+ createCanvas(720, 400);
+ stroke(255);
+ noFill();
+}
+
+function draw() {
+ background(0);
+ for (let i = 0; i < 200; i += 20) {
+ bezier(
+ mouseX - i / 2.0,
+ 40 + i,
+ 410,
+ 20,
+ 440,
+ 300,
+ 240 - i / 16.0,
+ 300 + i / 8.0
+ );
+ }
+}
diff --git a/dist/assets/examples/en/01_Form/07_3D_Primitives.js b/dist/assets/examples/en/01_Form/07_3D_Primitives.js
new file mode 100644
index 0000000000..89a93fc57f
--- /dev/null
+++ b/dist/assets/examples/en/01_Form/07_3D_Primitives.js
@@ -0,0 +1,31 @@
+/*
+ * @name 3D Primitives
+ * @arialabel Grey background with a dark grey cube in the bottom left corner and a white outlined sphere in the bottom right corner
+ * @frame 720,400 (optional)
+ * @description Placing mathematically 3D objects in synthetic space.
+ * The box() and sphere() functions take at least one parameter to specify their
+ * size. These shapes are positioned using the translate() function.
+ */
+function setup() {
+ createCanvas(710, 400, WEBGL);
+}
+
+function draw() {
+ background(100);
+
+ noStroke();
+ fill(50);
+ push();
+ translate(-275, 175);
+ rotateY(1.25);
+ rotateX(-0.9);
+ box(100);
+ pop();
+
+ noFill();
+ stroke(255);
+ push();
+ translate(500, height * 0.35, -200);
+ sphere(300);
+ pop();
+}
diff --git a/dist/assets/examples/en/01_Form/08_Trig_Wheels_and_Pie_Chart.js b/dist/assets/examples/en/01_Form/08_Trig_Wheels_and_Pie_Chart.js
new file mode 100644
index 0000000000..dcbf6dfd29
--- /dev/null
+++ b/dist/assets/examples/en/01_Form/08_Trig_Wheels_and_Pie_Chart.js
@@ -0,0 +1,89 @@
+/*
+ * @name Trig Wheels and Pie Chart
+ * @arialabel Two circles on a white background. One circle has slices of various colors. One circle is comprised of rectangles spiraled into a circle shape in a rainbow gradient
+ * @frame 400,400
+ * @description contributed by
+ Prof WM Harris, How to create
+a trig color wheel and a visualization of a population age data as a
+pie chart.
+ Functions are
+created for the canvas setup, trig color wheel, drawslice, and pie
+chart. The size of the slices are determined as well as their color
+range. The pie chart is separated by definitive color per value
+whereas the trig color wheel has a fixed slice amount with a range
+color fill.
+*/
+
+function setup() {
+ createCanvas(400, 400);
+ colorMode(HSB);
+ angleMode(DEGREES);
+
+ //vars for color wheel center point
+ let x = width / 2;
+ let y = height / 2 + 100;
+ colorWheel(x, y, 100); //slide 11
+
+ noStroke();
+ pieChartPop(200, 100); //slide 12
+}
+
+//**** slide 12 pie chart trig demo
+function pieChartPop(x, y) {
+ let [total, child, young, adult, senior, elder] = [577, 103, 69,
+ 122, 170, 113
+ ];
+ let startValue = 0;
+ let range = 0;
+
+ //child slice
+ range = child / total;
+ drawSlice("blue", x, y, 200, startValue, startValue + range);
+ startValue += range;
+ //young slice
+ range = young / total;
+ drawSlice("orange", x, y, 200, startValue, startValue + range);
+ startValue += range;
+ //adult slice
+ range = adult / total;
+ drawSlice("green", x, y, 200, startValue, startValue + range);
+ startValue += range;
+ //senior slice
+ range = senior / total;
+ drawSlice("tan", x, y, 200, startValue, startValue + range);
+ startValue += range;
+ //elder slice
+ range = elder / total;
+ drawSlice("pink", x, y, 200, startValue, startValue + range);
+ startValue += range;
+
+}
+
+/**
+ * drawSlice - draw colored arc based on angle percentages. slide 13
+ * Adjust angles so that 0% starts at top (actually -90).
+ * @param {color} fColor - fill color
+ * @param {number} x - center x
+ * @param {number} y - center y
+ * @param {number} d - diameter
+ * @param {float} percent1 - starting percentage
+ * @param {float} percent2 - ending percentage
+ */
+function drawSlice(fColor, x, y, d, percent1, percent2) {
+ fill(fColor);
+ arc(x, y, d, d, -90 + percent1 * 360, -90 + percent2 * 360);
+}
+
+//**** slide 11 trig demo
+function colorWheel(x, y, rad) {
+ strokeWeight(10);
+ strokeCap(SQUARE);
+
+ //Iterate 360 degrees of lines, +10deg per turn
+ for (let a = 0; a < 360; a += 10) {
+ stroke(a, 150, 200); //hue based on a
+ //radius is 100, angle is a degrees
+ line(x, y, x + rad * cos(a),
+ y + rad * sin(a));
+ }
+}
diff --git a/dist/assets/examples/en/02_Data/00_Variables.js b/dist/assets/examples/en/02_Data/00_Variables.js
new file mode 100644
index 0000000000..95b750da04
--- /dev/null
+++ b/dist/assets/examples/en/02_Data/00_Variables.js
@@ -0,0 +1,38 @@
+/*
+ * @name Variables
+ * @arialabel Black background with three sets of grey lines that form rectangles.
+ * @description Variables are used for storing values. In this example, change
+ * the values of variables to affect the composition.
+ */
+function setup() {
+ createCanvas(720, 400);
+ background(0);
+ stroke(153);
+ strokeWeight(4);
+ strokeCap(SQUARE);
+
+ let a = 50;
+ let b = 120;
+ let c = 180;
+
+ line(a, b, a + c, b);
+ line(a, b + 10, a + c, b + 10);
+ line(a, b + 20, a + c, b + 20);
+ line(a, b + 30, a + c, b + 30);
+
+ a = a + c;
+ b = height - b;
+
+ line(a, b, a + c, b);
+ line(a, b + 10, a + c, b + 10);
+ line(a, b + 20, a + c, b + 20);
+ line(a, b + 30, a + c, b + 30);
+
+ a = a + c;
+ b = height - b;
+
+ line(a, b, a + c, b);
+ line(a, b + 10, a + c, b + 10);
+ line(a, b + 20, a + c, b + 20);
+ line(a, b + 30, a + c, b + 30);
+}
diff --git a/dist/assets/examples/en/02_Data/01_True_and_False.js b/dist/assets/examples/en/02_Data/01_True_and_False.js
new file mode 100644
index 0000000000..d86f218d15
--- /dev/null
+++ b/dist/assets/examples/en/02_Data/01_True_and_False.js
@@ -0,0 +1,32 @@
+/*
+ * @name True and False
+ * @arialabel Black background with vertical white lines on the left half and horizontal white lines on the right half
+ * @description A Boolean variable has only two possible values: true or false.
+ * It is common to use Booleans with control statements to determine the flow
+ * of a program. In this example, when the boolean value "b" is true, vertical
+ * lines are drawn and when the boolean value "b" is false, horizontal
+ * lines are drawn.
+ */
+function setup() {
+ createCanvas(720, 400);
+ background(0);
+ stroke(255);
+
+ let b = false;
+ let d = 20;
+ let middle = width / 2;
+
+ for (let i = d; i <= width; i += d) {
+ b = i < middle;
+
+ if (b === true) {
+ // Vertical line
+ line(i, d, i, height - d);
+ }
+
+ if (b === false) {
+ // Horizontal line
+ line(middle, i - middle + d, width - d, i - middle + d);
+ }
+ }
+}
diff --git a/dist/assets/examples/en/02_Data/03_Variable_Scope.js b/dist/assets/examples/en/02_Data/03_Variable_Scope.js
new file mode 100644
index 0000000000..a58724046a
--- /dev/null
+++ b/dist/assets/examples/en/02_Data/03_Variable_Scope.js
@@ -0,0 +1,49 @@
+/*
+ * @name Variable Scope
+ * @arialabel Black background with vertical white lines condensed on the left side
+ * @description Variables have a global or function "scope". For example,
+ * variables declared within either the setup() or draw() functions may be
+ * only used in these functions. Global variables, variables declared outside
+ * of setup() and draw(), may be used anywhere within the program. If a function
+ * variable is declared with the same name as a global variable, the program
+ * will use the function variable to make its calculations within the current
+ * scope.
+ */
+let a = 80; // Create a global variable "a"
+
+function setup() {
+ createCanvas(720, 400);
+ background(0);
+ stroke(255);
+ noLoop();
+}
+
+function draw() {
+ // Draw a line using the global variable "a"
+ line(a, 0, a, height);
+
+ // Use a local variable a in for loop
+ for (let a = 120; a < 200; a += 3) {
+ line(a, 0, a, height);
+ }
+
+ // Make a call to the custom function drawAnotherLine()
+ drawAnotherLine();
+
+ // Make a call to the custom function drawYetAnotherLine()
+ drawYetAnotherLine();
+}
+
+function drawAnotherLine() {
+ // Create a new variable "a" local to this function
+ let a = 320;
+ // Draw a line using the local variable "a"
+ line(a, 0, a, height);
+}
+
+function drawYetAnotherLine() {
+ // Because no new local variable "a" is set,
+ // this line draws using the original global
+ // variable "a" which is set to the value 20.
+ line(a + 3, 0, a + 3, height);
+}
diff --git a/dist/assets/examples/en/02_Data/04_Numbers.js b/dist/assets/examples/en/02_Data/04_Numbers.js
new file mode 100644
index 0000000000..b786a524b5
--- /dev/null
+++ b/dist/assets/examples/en/02_Data/04_Numbers.js
@@ -0,0 +1,32 @@
+/*
+ * @name Numbers
+ * @arialabel A black background with one white vertical line on the top half and one on the bottom. Both lines move from the left to the right of the screen with the top vertical line moving faster than the bottom.
+ * @frame 720,400
+ * @description Numbers can be written with or without decimals. An integer
+ * (more commonly called an int) is a number without a decimal point. A float
+ * is a floating-point number, which means it is a number that has a decimal
+ * place.
+ */
+let a = 0; // Create a global variable "a" of type Number
+let b = 0; // Create a global variable "b" of type Number
+
+function setup() {
+ createCanvas(720, 400);
+ stroke(255);
+}
+
+function draw() {
+ background(0);
+
+ a = a + 1; // Increment a with an integer
+ b = b + 0.2; //Increment b with a float
+ line(a, 0, a, height / 2);
+ line(b, height / 2, b, height);
+
+ if (a > width) {
+ a = 0;
+ }
+ if (b > width) {
+ b = 0;
+ }
+}
diff --git a/dist/assets/examples/en/03_Arrays/00_Array.js b/dist/assets/examples/en/03_Arrays/00_Array.js
new file mode 100644
index 0000000000..0c245ea30f
--- /dev/null
+++ b/dist/assets/examples/en/03_Arrays/00_Array.js
@@ -0,0 +1,45 @@
+/*
+ * @name Array
+ * @arialabel Vertical lines are graphed across a white background to visualize the values of a cosine curve
+ * @description An array is a list of data. Each piece of data in an array
+ * is identified by an index number representing its position in
+ * the array. Arrays are zero based, which means that the first
+ * element in the array is [0], the second element is [1], and so on.
+ * In this example, an array named "coswave" is created and
+ * filled with the cosine values. This data is displayed three
+ * separate ways on the screen.
+ */
+let coswave = [];
+
+function setup() {
+ createCanvas(720, 360);
+ for (let i = 0; i < width; i++) {
+ let amount = map(i, 0, width, 0, PI);
+ coswave[i] = abs(cos(amount));
+ }
+ background(255);
+ noLoop();
+}
+
+function draw() {
+ let y1 = 0;
+ let y2 = height / 3;
+ for (let i = 0; i < width; i += 3) {
+ stroke(coswave[i] * 255);
+ line(i, y1, i, y2);
+ }
+
+ y1 = y2;
+ y2 = y1 + y1;
+ for (let i = 0; i < width; i += 3) {
+ stroke((coswave[i] * 255) / 4);
+ line(i, y1, i, y2);
+ }
+
+ y1 = y2;
+ y2 = height;
+ for (let i = 0; i < width; i += 3) {
+ stroke(255 - coswave[i] * 255);
+ line(i, y1, i, y2);
+ }
+}
diff --git a/dist/assets/examples/en/03_Arrays/01_Array_2d.js b/dist/assets/examples/en/03_Arrays/01_Array_2d.js
new file mode 100644
index 0000000000..82f04efe9a
--- /dev/null
+++ b/dist/assets/examples/en/03_Arrays/01_Array_2d.js
@@ -0,0 +1,39 @@
+/*
+ * @name Array 2D
+ * @arialabel A grid of dots drawn on a black background. Dots closer to the center are darker in color and dots further away from the center are whiter in color
+ * @description Demonstrates the syntax for creating a two-dimensional (2D)
+ * array. Values in a 2D array are accessed through two index values.
+ * 2D arrays are useful for storing images. In this example, each dot
+ * is colored in relation to its distance from the center of the image.
+ */
+let distances = [];
+let maxDistance;
+let spacer;
+
+function setup() {
+ createCanvas(720, 360);
+ maxDistance = dist(width / 2, height / 2, width, height);
+ for (let x = 0; x < width; x++) {
+ distances[x] = []; // create nested array
+ for (let y = 0; y < height; y++) {
+ let distance = dist(width / 2, height / 2, x, y);
+ distances[x][y] = (distance / maxDistance) * 255;
+ }
+ }
+ spacer = 10;
+ noLoop(); // Run once and stop
+}
+
+function draw() {
+ background(0);
+ // This embedded loop skips over values in the arrays based on
+ // the spacer variable, so there are more values in the array
+ // than are drawn here. Change the value of the spacer variable
+ // to change the density of the points
+ for (let x = 0; x < width; x += spacer) {
+ for (let y = 0; y < height; y += spacer) {
+ stroke(distances[x][y]);
+ point(x + spacer / 2, y + spacer / 2);
+ }
+ }
+}
diff --git a/dist/assets/examples/en/03_Arrays/02_Array_Objects.js b/dist/assets/examples/en/03_Arrays/02_Array_Objects.js
new file mode 100644
index 0000000000..cae5bc765e
--- /dev/null
+++ b/dist/assets/examples/en/03_Arrays/02_Array_Objects.js
@@ -0,0 +1,72 @@
+/*
+ * @name Array Objects
+ * @arialabel Small white circles all over a black background that move side to side and sometimes collide and bounce off of each other
+ * @description Demonstrates the syntax for creating an array of custom objects.
+ */
+
+class Module {
+ constructor(xOff, yOff, x, y, speed, unit) {
+ this.xOff = xOff;
+ this.yOff = yOff;
+ this.x = x;
+ this.y = y;
+ this.speed = speed;
+ this.unit = unit;
+ this.xDir = 1;
+ this.yDir = 1;
+ }
+
+ // Custom method for updating the variables
+ update() {
+ this.x = this.x + this.speed * this.xDir;
+ if (this.x >= this.unit || this.x <= 0) {
+ this.xDir *= -1;
+ this.x = this.x + 1 * this.xDir;
+ this.y = this.y + 1 * this.yDir;
+ }
+ if (this.y >= this.unit || this.y <= 0) {
+ this.yDir *= -1;
+ this.y = this.y + 1 * this.yDir;
+ }
+ }
+
+ // Custom method for drawing the object
+ draw() {
+ fill(255);
+ ellipse(this.xOff + this.x, this.yOff + this.y, 6, 6);
+ }
+}
+
+let unit = 40;
+let count;
+let mods = [];
+
+function setup() {
+ createCanvas(720, 360);
+ noStroke();
+ let wideCount = width / unit;
+ let highCount = height / unit;
+ count = wideCount * highCount;
+
+ let index = 0;
+ for (let y = 0; y < highCount; y++) {
+ for (let x = 0; x < wideCount; x++) {
+ mods[index++] = new Module(
+ x * unit,
+ y * unit,
+ unit / 2,
+ unit / 2,
+ random(0.05, 0.8),
+ unit
+ );
+ }
+ }
+}
+
+function draw() {
+ background(0);
+ for (let i = 0; i < count; i++) {
+ mods[i].update();
+ mods[i].draw();
+ }
+}
diff --git a/dist/assets/examples/en/03_Arrays/03_Walk_Over_2dArray.js b/dist/assets/examples/en/03_Arrays/03_Walk_Over_2dArray.js
new file mode 100644
index 0000000000..b8e6d5431d
--- /dev/null
+++ b/dist/assets/examples/en/03_Arrays/03_Walk_Over_2dArray.js
@@ -0,0 +1,86 @@
+/*
+ * @name Walk Over 2dArray
+ * @arialabel 20 phrases in black text are arranged on a black background with 4 phrases in a row, 5 rows total
+ * @frame 400,400
+ * @description contributed by
+ Prof WM Harris, How to display 2D array contents on the canvas
+using regular for and for-of loops in multiple different ways.
+ A function is created for the canvas, the 2D
+ array (Friend Array) is initialized and walked over using nested
+ loops in different ways. Variables x and y are used to place the
+ array item on the canvas in the form of 2D array.
+ The final nested loop is used to initialize 2D
+ array (Fish Array) with random Integers (fish ages).
+*/
+
+
+//"use strict"; //catch some common coding errors
+
+
+/**
+ * setup :
+ */
+function setup() {
+ createCanvas(400, 600);
+ //create 2D array, slide 4
+ let friendArray = [
+ ["Nona", "mac & cheese", "orange", "Eid al-fitr"],
+ ["Marylin", "ice cream", "blue", "Halloween"],
+ ["Rashaad", "garbage plates", "turquoise", "Christmas"],
+ ["Ava", "sushi", "pink", "New Years"]
+ ];
+ friendArray.push(["Xavier", "Louisiana creole", "red", "their birthday"]);
+
+ //walking 2D array, slide 6
+ let y = 20; // Start row based on text size of 20
+ for (let f = 0; f < friendArray.length; f++) { // outer array
+ let x = 10; // Start item in this row
+ for (let t = 0; t < friendArray[f].length; t++) { //inner
+ text(friendArray[f][t], x, y);
+ x += textWidth(friendArray[f][t]) + 20; //place next item
+ }
+ y += 28; // place next row
+ }
+
+ //walking 2D array, variation on slide 6
+ //with embedded arithmetic for y
+ //
+ for (let f = 0; f < friendArray.length; f++) { // outer array
+ let x = 10; // Start item in this row
+ for (let t = 0; t < friendArray[f].length; t++) { //inner
+ //y is v-padding + LCV * v-spacing
+ text(friendArray[f][t], x, 200 + f * 28);
+ x += textWidth(friendArray[f][t]) + 20; //place next item
+ }
+ }
+
+ //walking 2D array, slide 7
+ //need to use x and y variables to manage canvas placement
+ y = 400;
+ for (let friend of friendArray) {
+ let x = 10; // Start item in this row
+ console.log("x and y", x, y);
+ console.log("friend:", friend);
+ for (let item of friend) {
+ console.log("item & x:", item, x);
+ text(item, x, y);
+ x += textWidth(item) + 20; //place next item
+ }
+ y += 28; // place next row
+ }
+
+ //slide 9, creating 2D array: schools of fish ages
+ console.log("\n *** Fish ages in 2D ***");
+ const schools = [];
+ //4 schools of fish
+ for (let t = 0; t < 4; t++) {
+ schools[t] = []; //initialize this school
+ console.log("schools[t]?", t, schools[t]);
+
+ // Add 10 randomized ages to the array
+ for (let a = 0; a < 10; a++) {
+ schools[t].push(round(random(1, 5)));
+ }
+ }
+ console.log(schools);
+ }
diff --git a/dist/assets/examples/en/04_Control/00_Iteration.js b/dist/assets/examples/en/04_Control/00_Iteration.js
new file mode 100644
index 0000000000..6d51a4c860
--- /dev/null
+++ b/dist/assets/examples/en/04_Control/00_Iteration.js
@@ -0,0 +1,42 @@
+/*
+ * @name Iteration
+ * @arialabel White bars on the top half of the screen intersect with thin lines on the left and dark grey bars on the right
+ * @description Iteration with a "for" structure to construct repetitive forms.
+ */
+let y;
+let num = 14;
+
+function setup() {
+ createCanvas(720, 360);
+ background(102);
+ noStroke();
+
+ // Draw white bars
+ fill(255);
+ y = 60;
+ for (let i = 0; i < num / 3; i++) {
+ rect(50, y, 475, 10);
+ y += 20;
+ }
+
+ // Gray bars
+ fill(51);
+ y = 40;
+ for (let i = 0; i < num; i++) {
+ rect(405, y, 30, 10);
+ y += 20;
+ }
+ y = 50;
+ for (let i = 0; i < num; i++) {
+ rect(425, y, 30, 10);
+ y += 20;
+ }
+
+ // Thin lines
+ y = 45;
+ fill(0);
+ for (let i = 0; i < num - 1; i++) {
+ rect(120, y, 40, 1);
+ y += 20;
+ }
+}
diff --git a/dist/assets/examples/en/04_Control/01_Embedded_Iteration.js b/dist/assets/examples/en/04_Control/01_Embedded_Iteration.js
new file mode 100644
index 0000000000..ff7b852a8e
--- /dev/null
+++ b/dist/assets/examples/en/04_Control/01_Embedded_Iteration.js
@@ -0,0 +1,22 @@
+/*
+ * @name Embedded Iteration
+ * @arialabel Rays emerge from the center of the screen to the edges. There is also a square grid of white circles over the window
+ * @description Embedding "for" structures allows repetition in two dimensions.
+ */
+function setup() {
+ createCanvas(720, 360);
+ background(0);
+ noStroke();
+
+ let gridSize = 35;
+
+ for (let x = gridSize; x <= width - gridSize; x += gridSize) {
+ for (let y = gridSize; y <= height - gridSize; y += gridSize) {
+ noStroke();
+ fill(255);
+ rect(x - 1, y - 1, 3, 3);
+ stroke(255, 50);
+ line(x, y, width / 2, height / 2);
+ }
+ }
+}
diff --git a/dist/assets/examples/en/04_Control/02_Conditionals_1.js b/dist/assets/examples/en/04_Control/02_Conditionals_1.js
new file mode 100644
index 0000000000..e3b6b582f1
--- /dev/null
+++ b/dist/assets/examples/en/04_Control/02_Conditionals_1.js
@@ -0,0 +1,27 @@
+/*
+ * @name Conditionals 1
+ * @arialabel Pattern of alternating long and short lines
+ * @description Conditions are like questions.
+ * They allow a program to decide to take one action if
+ * the answer to a question is true or to do another action
+ * if the answer to the question is false.
+ * The questions asked within a program are always logical
+ * or relational statements. For example, if the variable 'i' is
+ * equal to zero then draw a line.
+ */
+function setup() {
+ createCanvas(720, 360);
+ background(0);
+
+ for (let i = 10; i < width; i += 10) {
+ // If 'i' divides by 20 with no remainder draw the first line
+ // else draw the second line
+ if (i % 20 === 0) {
+ stroke(255);
+ line(i, 80, i, height / 2);
+ } else {
+ stroke(153);
+ line(i, 20, i, 180);
+ }
+ }
+}
diff --git a/dist/assets/examples/en/04_Control/03_Conditionals_2.js b/dist/assets/examples/en/04_Control/03_Conditionals_2.js
new file mode 100644
index 0000000000..a84c2ba04a
--- /dev/null
+++ b/dist/assets/examples/en/04_Control/03_Conditionals_2.js
@@ -0,0 +1,29 @@
+/*
+ * @name Conditionals 2
+ * @arialabel The top half of the window has spaced out vertical lines. The bottom half of the window has more condensed vertical lines
+ * @description We extend the language of conditionals from the previous
+ * example by adding the keyword "else". This allows conditionals
+ * to ask two or more sequential questions, each with a different
+ * action.
+ */
+function setup() {
+ createCanvas(720, 360);
+ background(0);
+
+ for (let i = 2; i < width - 2; i += 4) {
+ // If 'i' divides by 20 with no remainder
+ if (i % 20 === 0) {
+ stroke(255);
+ line(i, 80, i, height / 2);
+ // If 'i' divides by 10 with no remainder
+ } else if (i % 10 === 0) {
+ stroke(153);
+ line(i, 20, i, 180);
+ // If neither of the above two conditions are met
+ // then draw this line
+ } else {
+ stroke(102);
+ line(i, height / 2, i, height - 20);
+ }
+ }
+}
diff --git a/dist/assets/examples/en/04_Control/04_Logical_Operators.js b/dist/assets/examples/en/04_Control/04_Logical_Operators.js
new file mode 100644
index 0000000000..7cc4decc76
--- /dev/null
+++ b/dist/assets/examples/en/04_Control/04_Logical_Operators.js
@@ -0,0 +1,43 @@
+/*
+ * @name Logical Operators
+ * @arialabel Horizontal black lines across half of a grey background. Part of these lines are shifted left and there are vertical lines of dots above and below this
+ * @description The logical operators for AND (&&) and OR (||) are used to
+ * combine simple relational statements into more complex expressions.
+ * The NOT (!) operator is used to negate a boolean statement.
+ */
+let test = false;
+
+function setup() {
+ createCanvas(720, 360);
+ background(126);
+
+ for (let i = 5; i <= height; i += 5) {
+ // Logical AND
+ stroke(0);
+ if (i > 35 && i < 100) {
+ line(width / 4, i, width / 2, i);
+ test = false;
+ }
+
+ // Logical OR
+ stroke(76);
+ if (i <= 35 || i >= 100) {
+ line(width / 2, i, width, i);
+ test = true;
+ }
+
+ // Testing if a boolean value is "true"
+ // The expression "if(test)" is equivalent to "if(test == true)"
+ if (test) {
+ stroke(0);
+ point(width / 3, i);
+ }
+
+ // Testing if a boolean value is "false"
+ // The expression "if(!test)" is equivalent to "if(test == false)"
+ if (!test) {
+ stroke(255);
+ point(width / 4, i);
+ }
+ }
+}
diff --git a/dist/assets/examples/en/04_Control/05_Logical_Operators_2.js b/dist/assets/examples/en/04_Control/05_Logical_Operators_2.js
new file mode 100644
index 0000000000..17b32a83a6
--- /dev/null
+++ b/dist/assets/examples/en/04_Control/05_Logical_Operators_2.js
@@ -0,0 +1,92 @@
+/*
+ * @name Logical Operators 2
+ * @arialabel Squares travel diagonally across the screen when a rectangle on the screen is pressed
+ * @frame 400,400
+ * @description contributed by
+ Prof WM Harris, How
+ to create Xboxes with one global variable and create conditions with
+ boolean variables and boolean expressions by utilizing Boolean
+ operators ||, &&, and ! to do boundary checking.
+ Functions
+ are created for both the canvas set up as well as the creation of
+ the boxes. Background color is dependent on the location of the
+ boxes in the canvas space. When mouse button and key are pressed
+ simultaneously, the “where” text and box color changes to cyan,
+ but if the mouse button is clicked alone then the animation will
+ start. When q or Q are pressed the text “Did you type q or Q?”
+ will change to blue, else it will be purple. If the mouse is placed
+ within the orange box containing the text, “withinRect” then the
+ shape will turn pink.
+ */
+
+
+//1 coordinate for everything :)
+let where = 0; //control boxes' positions
+
+function setup() {
+ createCanvas(400, 400);
+}
+
+function draw() {
+ //similar to slide 4 use of OR, ||
+ //to set bg color of canvas
+ if ((where < 0) || (where > height)) {
+ background("beige");
+ } else {
+ background("chocolate");
+ }
+
+ //similar to slide 4 use of AND, &&
+ //to set fill color of box & text
+ if (mouseIsPressed && keyIsPressed) {
+ fill("cyan");
+ } else {
+ fill(255);
+ }
+
+ //boxL
+ rect(where, where, 40);
+
+ //boxR, pad x coordinate for size of box
+ rect(width - where - 40, where, 40);
+
+ //Move the boxes
+ where = where + 1;
+
+ //Show the value of where the boxes are
+ text("where is " + where, 150, 30);
+
+ //testing not, ! and or, || operators
+ if (!(key === "q" || key === "Q")) {
+ fill("purple");
+ } else {
+ fill("dodgerBlue");
+ }
+ //Show the current key value
+ text("Did you type a q or Q? " + key, 150, 70);
+
+ //*** Boundary checking ***
+ //Is the mouse within rect boundary?
+ //left, right, top, bottom
+ let withinRect = (mouseX >= 150) &&
+ (mouseX <= 150 + 100) &&
+ (mouseY >= 300) &&
+ (mouseY <= 300 + 40);
+ //fill color based on value of withinRect
+ if (withinRect) {
+ fill("pink");
+ } else {
+ fill("orange");
+ }
+ //draw the rect
+ rect(150, 300, 100, 40);
+ //show withinRect value as label on rect
+ fill(0);
+ text("withinRect " + withinRect, 160, 320);
+}
+
+//boxes restart
+function mousePressed() {
+ //Reset boxes back up and above the canvas
+ where = -50;
+}
\ No newline at end of file
diff --git a/dist/assets/examples/en/04_Control/06_Conditional_Shapes.js b/dist/assets/examples/en/04_Control/06_Conditional_Shapes.js
new file mode 100644
index 0000000000..f3562640ee
--- /dev/null
+++ b/dist/assets/examples/en/04_Control/06_Conditional_Shapes.js
@@ -0,0 +1,49 @@
+/*
+ * @name Conditional Shapes
+ * @arialabel The middle of the window is white and the user’s mouse draws red dots within it. The side edges of the window are beige and as the user’s mouse travels up and down the edges, orange squares with a red border are drawn up and down the center of the window
+ * @frame 400,400
+ * @description contributed by
+ Prof WM Harris, How
+ to draw different shapes mid canvas depending on the mouse position.
+ Functions
+ are created for the main canvas set up with the markers on the left and
+ right hand sides. One is also created for the location of the mouse
+ regarding the canvas and the markers. If the mouse is within the
+ outer left hand beige rectangle, then the shape of circle is drawn
+ down the center of the canvas. If the mouse is within the outer right
+ hand beige rectangle, then the shape of square is drawn down the
+ center of the canvas.
+*/
+function setup() {
+ createCanvas(400, 400);
+ strokeWeight(3);
+ //center squares to match circles
+ rectMode(CENTER);
+
+ //draw rects to mark far sides
+ noStroke();
+ fill("beige");
+ rect(5, height / 2, 10, height);
+ rect(width - 5, height / 2, 10, height);
+ fill("orange");
+ stroke("brown");
+
+ }
+
+ function draw() {
+ point(mouseX, mouseY);
+
+ //if (test) {doThis; }
+ //test: mouseX on far left of canvas
+ //doThis: draw a circle at mouseY
+ if (mouseX < 10) {
+ circle(width / 2, mouseY, 20);
+ }
+
+ //test: mouseX on far right of canvas
+ //doThis: draw a square at mouseY
+ if (mouseX > width - 10) {
+ square(width / 2, mouseY, 20);
+ }
+
+ }
diff --git a/dist/assets/examples/en/05_Image/00_Load_and_Display_Image.js b/dist/assets/examples/en/05_Image/00_Load_and_Display_Image.js
new file mode 100644
index 0000000000..2d4c70b8a8
--- /dev/null
+++ b/dist/assets/examples/en/05_Image/00_Load_and_Display_Image.js
@@ -0,0 +1,23 @@
+/*
+ * @name Load and Display Image
+ * @arialabel An astronaut on a planet with the same image in a smaller size in the bottom left quarter
+ * @description Images can be loaded and displayed to the screen at their
+ * actual size or any other size.
+ *
To run this example locally, you will need an + * image file, and a running + * local server.
+ + */ +let img; // Declare variable 'img'. + +function setup() { + createCanvas(720, 400); + img = loadImage('assets/moonwalk.jpg'); // Load the image +} + +function draw() { + // Displays the image at its actual size at point (0,0) + image(img, 0, 0); + // Displays the image at point (0, height/2) at half size + image(img, 0, height / 2, img.width / 2, img.height / 2); +} diff --git a/dist/assets/examples/en/05_Image/01_Background_Image.js b/dist/assets/examples/en/05_Image/01_Background_Image.js new file mode 100644 index 0000000000..32a6af747c --- /dev/null +++ b/dist/assets/examples/en/05_Image/01_Background_Image.js @@ -0,0 +1,32 @@ +/* + * @name Background Image + * @arialabel An astronaut on a planet with a horizontal yellow line traveling from the top to the bottom of the image + * @description This example presents the fastest way to load a + * background image. To load an image as the background, + * it must be the same width and height as the program. + *To run this example locally, you will need an + * image file, and a running + * local server.
+ */ +let bg; +let y = 0; + +function setup() { + // The background image must be the same size as the parameters + // into the createCanvas() method. In this program, the size of + // the image is 720x400 pixels. + bg = loadImage('assets/moonwalk.jpg'); + createCanvas(720, 400); +} + +function draw() { + background(bg); + + stroke(226, 204, 0); + line(0, y, width, y); + + y++; + if (y > height) { + y = 0; + } +} diff --git a/dist/assets/examples/en/05_Image/02_Transparency.js b/dist/assets/examples/en/05_Image/02_Transparency.js new file mode 100644 index 0000000000..8a12536041 --- /dev/null +++ b/dist/assets/examples/en/05_Image/02_Transparency.js @@ -0,0 +1,26 @@ +/* + * @name Transparency + * @arialabel An astronaut on planet as the background with a slightly transparent version of this image on top that moves with the horizontal direction of the user’s mouse + * @description Move the pointer left and right across the image to change its + * position. This program overlays one image over another by modifying the + * alpha value of the image with the tint() function. + *To run this example locally, you will need an + * image file, and a running + * local server.
+ */ +let img; +let offset = 0; +let easing = 0.05; + +function setup() { + createCanvas(720, 400); + img = loadImage('assets/moonwalk.jpg'); // Load an image into the program +} + +function draw() { + image(img, 0, 0); // Display at full opacity + let dx = mouseX - img.width / 2 - offset; + offset += dx * easing; + tint(255, 127); // Display at half opacity + image(img, offset, 0); +} diff --git a/dist/assets/examples/en/05_Image/03_Alpha_Mask.js b/dist/assets/examples/en/05_Image/03_Alpha_Mask.js new file mode 100644 index 0000000000..477fc3bf89 --- /dev/null +++ b/dist/assets/examples/en/05_Image/03_Alpha_Mask.js @@ -0,0 +1,29 @@ +/* + * @name Alpha Mask + * @arialabel An astronaut on a planet as the background with a slightly transparent version of this image on top that moves with the horizontal direction of the user’s mouse. Both have a light blue gradient on the right side. + * @description Loads a "mask" for an image to specify the transparency in + * different parts of the image. The two images are blended together using + * the mask() method of p5.Image. + *To run this example locally, you will need two + * image files, and a running + * local server.
+ */ +let img; +let imgMask; + +function preload() { + img = loadImage('assets/moonwalk.jpg'); + imgMask = loadImage('assets/mask.png'); +} + +function setup() { + createCanvas(720, 400); + img.mask(imgMask); + imageMode(CENTER); +} + +function draw() { + background(0, 102, 153); + image(img, width / 2, height / 2); + image(img, mouseX, mouseY); +} diff --git a/dist/assets/examples/en/05_Image/04_Create_Image.js b/dist/assets/examples/en/05_Image/04_Create_Image.js new file mode 100644 index 0000000000..cd2e0b9ec0 --- /dev/null +++ b/dist/assets/examples/en/05_Image/04_Create_Image.js @@ -0,0 +1,26 @@ +/* + * @name Create Image + * @arialabel Black background with a blue gradient square on the left. Another blue gradient square follows the user’s mouse as it moves + * @description The createImage() function provides a fresh buffer of pixels to + * play with. This example creates an image gradient. + */ +let img; // Declare variable 'img'. + +function setup() { + createCanvas(720, 400); + img = createImage(230, 230); + img.loadPixels(); + for (let x = 0; x < img.width; x++) { + for (let y = 0; y < img.height; y++) { + let a = map(y, 0, img.height, 255, 0); + img.set(x, y, [0, 153, 204, a]); + } + } + img.updatePixels(); +} + +function draw() { + background(0); + image(img, 90, 80); + image(img, mouseX - img.width / 2, mouseY - img.height / 2); +} diff --git a/dist/assets/examples/en/05_Image/05_Pointillism.js b/dist/assets/examples/en/05_Image/05_Pointillism.js new file mode 100644 index 0000000000..22c60611c0 --- /dev/null +++ b/dist/assets/examples/en/05_Image/05_Pointillism.js @@ -0,0 +1,35 @@ +/* + * @name Pointillism + * @arialabel Dots generate on the screen. As the user’s mouse moves left the dots become smaller and as the user’s mouse moves right, the dots become bigger. The colors of the dots are dependent on an image of choice + * @description By Dan Shiffman. Mouse horizontal location controls size of + * dots. Creates a simple pointillist effect using ellipses colored according + * to pixels in an image. + *To run this example locally, you will need an + * image file, and a running + * local server.
+ */ +let img; +let smallPoint, largePoint; + +function preload() { + img = loadImage('assets/moonwalk.jpg'); +} + +function setup() { + createCanvas(720, 400); + smallPoint = 4; + largePoint = 40; + imageMode(CENTER); + noStroke(); + background(255); + img.loadPixels(); +} + +function draw() { + let pointillize = map(mouseX, 0, width, smallPoint, largePoint); + let x = floor(random(img.width)); + let y = floor(random(img.height)); + let pix = img.get(x, y); + fill(pix, 128); + ellipse(x, y, pointillize, pointillize); +} diff --git a/dist/assets/examples/en/05_Image/06_Blur.js b/dist/assets/examples/en/05_Image/06_Blur.js new file mode 100644 index 0000000000..f2992b49ba --- /dev/null +++ b/dist/assets/examples/en/05_Image/06_Blur.js @@ -0,0 +1,90 @@ +/* + * @name Blur + * @arialabel Astronaut rendered in black and white on the left and a blurred version of the image on the right + * @description A low-pass filter that blurs an image. This program analyzes every pixel in an image and blends it with all the neighboring pixels to blur the image. + *To run this example locally, you will need an + * image file, and a running + * local server.
+ */ + +let img; +let w = 80; + +// It's possible to convolve the image with many different +// matrices to produce different effects. This is a high-pass +// filter; it accentuates the edges. +const matrix = [ [ -1, -1, -1 ], + [ -1, 9, -1 ], + [ -1, -1, -1 ] ]; + +function preload() { + img = loadImage('assets/moonwalk.jpg'); +} + +function setup() { + createCanvas(720, 400); + img.loadPixels(); + + // pixelDensity(1) for not scaling pixel density to display density + // for more information, check the reference of pixelDensity() + pixelDensity(1); +} + +function draw() { + // We're only going to process a portion of the image + // so let's set the whole image as the background first + background(img); + + // Calculate the small rectangle we will process + const xstart = constrain(mouseX - w/2, 0, img.width); + const ystart = constrain(mouseY - w/2, 0, img.height); + const xend = constrain(mouseX + w/2, 0, img.width); + const yend = constrain(mouseY + w/2, 0, img.height); + const matrixsize = 3; + + loadPixels(); + // Begin our loop for every pixel in the smaller image + for (let x = xstart; x < xend; x++) { + for (let y = ystart; y < yend; y++ ) { + let c = convolution(x, y, matrix, matrixsize, img); + + // retrieve the RGBA values from c and update pixels() + let loc = (x + y*img.width) * 4; + pixels[loc] = red(c); + pixels[loc + 1] = green(c); + pixels[loc + 2] = blue(c); + pixels[loc + 3] = alpha(c); + } + } + updatePixels(); +} + +function convolution(x, y, matrix, matrixsize, img) { + let rtotal = 0.0; + let gtotal = 0.0; + let btotal = 0.0; + const offset = Math.floor(matrixsize / 2); + for (let i = 0; i < matrixsize; i++){ + for (let j = 0; j < matrixsize; j++){ + + // What pixel are we testing + const xloc = (x + i - offset); + const yloc = (y + j - offset); + let loc = (xloc + img.width * yloc) * 4; + + // Make sure we haven't walked off our image, we could do better here + loc = constrain(loc, 0 , img.pixels.length - 1); + + // Calculate the convolution + // retrieve RGB values + rtotal += (img.pixels[loc]) * matrix[i][j]; + gtotal += (img.pixels[loc + 1]) * matrix[i][j]; + btotal += (img.pixels[loc + 2]) * matrix[i][j]; + } + } + // Make sure RGB is within range + rtotal = constrain(rtotal, 0, 255); + gtotal = constrain(gtotal, 0, 255); + btotal = constrain(btotal, 0, 255); + + // Return the resulting color + return color(rtotal, gtotal, btotal); +} \ No newline at end of file diff --git a/dist/assets/examples/en/05_Image/10_Copy_Method.js b/dist/assets/examples/en/05_Image/10_Copy_Method.js new file mode 100644 index 0000000000..eb9966e40e --- /dev/null +++ b/dist/assets/examples/en/05_Image/10_Copy_Method.js @@ -0,0 +1,21 @@ +/* + * @name Copy() method + * @arialabel Parrot rendered in black and white. The user’s cursor is a paint brush and as the user presses and holds on the image, the area becomes colored + * @frame 600,400 + * @description An example of how to simulate coloring image with the copy() method. + */ +let draft, ready; +function preload() { + ready = loadImage("assets/parrot-color.png"); + draft = loadImage("assets/parrot-bw.png"); +} +function setup() { + createCanvas(600, 400); + noCursor(); + cursor("assets/brush.png", 20, -10); + image(ready, 0, 0); + image(draft, 0, 0); +} +function mouseDragged() { + copy(ready, mouseX, mouseY, 20, 20, mouseX, mouseY, 20, 20); +} diff --git a/dist/assets/examples/en/07_Color/00_Hue.js b/dist/assets/examples/en/07_Color/00_Hue.js new file mode 100644 index 0000000000..7ea8fc1cbc --- /dev/null +++ b/dist/assets/examples/en/07_Color/00_Hue.js @@ -0,0 +1,26 @@ +/* + * @name Hue + * @arialabel Vertical bars of color appear in a gradient pattern as the user drags their mouse across the screen + * @description Hue is the color reflected from or transmitted through an + * object and is typically referred to as the name of the color (red, blue, + * yellow, etc.) Move the cursor vertically over each bar to alter its hue. + */ +const barWidth = 20; +let lastBar = -1; + +function setup() { + createCanvas(720, 400); + colorMode(HSB, height, height, height); + noStroke(); + background(0); +} + +function draw() { + let whichBar = mouseX / barWidth; + if (whichBar !== lastBar) { + let barX = whichBar * barWidth; + fill(mouseY, height, height); + rect(barX, 0, barWidth, height); + lastBar = whichBar; + } +} diff --git a/dist/assets/examples/en/07_Color/01_Saturation.js b/dist/assets/examples/en/07_Color/01_Saturation.js new file mode 100644 index 0000000000..27ff14d3f8 --- /dev/null +++ b/dist/assets/examples/en/07_Color/01_Saturation.js @@ -0,0 +1,26 @@ +/* + * @name Saturation + * @arialabel Vertical bars of color appear in a gradient rainbow pattern as the user drags their mouse across the screen. The saturation of these bars change as the user’s mouse drags through + * @description Saturation is the strength or purity of the color and + * represents the amount of gray in proportion to the hue. A "saturated" + * color is pure and an "unsaturated" color has a large percentage of gray. + * Move the cursor vertically over each bar to alter its saturation. + */ +const barWidth = 20; +let lastBar = -1; + +function setup() { + createCanvas(720, 400); + colorMode(HSB, width, height, 100); + noStroke(); +} + +function draw() { + let whichBar = mouseX / barWidth; + if (whichBar !== lastBar) { + let barX = whichBar * barWidth; + fill(barX, mouseY, 66); + rect(barX, 0, barWidth, height); + lastBar = whichBar; + } +} diff --git a/dist/assets/examples/en/07_Color/02_Brightness.js b/dist/assets/examples/en/07_Color/02_Brightness.js new file mode 100644 index 0000000000..e94eb2cd2e --- /dev/null +++ b/dist/assets/examples/en/07_Color/02_Brightness.js @@ -0,0 +1,47 @@ +/* + * @name Brightness + * @arialabel A black and white photograph of an astronaut on the moon covered by black. The mouse acts as a light and a circular area of the photograph is illuminated where the mouse hovers + * @description By Dan Shiffman. This program adjusts the brightness of a part + * of the image by calculating the distance of each pixel to the mouse. + *To run this example locally, you will need + * at least an image file and a running local server.
+ */ +let img; + +function preload() { + img = loadImage('assets/moonwalk.jpg'); +} + +function setup() { + createCanvas(720, 200); + pixelDensity(1); + img.loadPixels(); + loadPixels(); +} + +function draw() { + for (let x = 0; x < img.width; x++) { + for (let y = 0; y < img.height; y++) { + // Calculate the 1D location from a 2D grid + let loc = (x + y * img.width) * 4; + // Get the R,G,B values from image + let r, g, b; + r = img.pixels[loc]; + // Calculate an amount to change brightness based on proximity to the mouse + let maxdist = 50; + let d = dist(x, y, mouseX, mouseY); + let adjustbrightness = (255 * (maxdist - d)) / maxdist; + r += adjustbrightness; + // Constrain RGB to make sure they are within 0-255 color range + r = constrain(r, 0, 255); + // Make a new color and set pixel in the window + //color c = color(r, g, b); + let pixloc = (y * width + x) * 4; + pixels[pixloc] = r; + pixels[pixloc + 1] = r; + pixels[pixloc + 2] = r; + pixels[pixloc + 3] = 255; + } + } + updatePixels(); +} diff --git a/dist/assets/examples/en/07_Color/03_Color_Variables.js b/dist/assets/examples/en/07_Color/03_Color_Variables.js new file mode 100644 index 0000000000..5c211264dc --- /dev/null +++ b/dist/assets/examples/en/07_Color/03_Color_Variables.js @@ -0,0 +1,41 @@ +/* + * @name Color Variables + * @arialabel Two squares on a brown background. Both squares are made up of two squares in a larger square. On the left, the outer square is burnt umber, the middle square is golden, and the center square is orange. On the right, the outer square is orange, the middle is burnt umber, and the middle is golden + * @description (Homage to Albers.) This example creates variables for colors + * that may be referred to in the program by a name, rather than a number. + */ +function setup() { + createCanvas(710, 400); + noStroke(); + background(51, 0, 0); + + let inside = color(204, 102, 0); + let middle = color(204, 153, 0); + let outside = color(153, 51, 0); + + // These statements are equivalent to the statements above. + // Programmers may use the format they prefer. + //let inside = color('#CC6600'); + //let middle = color('#CC9900'); + //let outside = color('#993300'); + + push(); + translate(80, 80); + fill(outside); + rect(0, 0, 200, 200); + fill(middle); + rect(40, 60, 120, 120); + fill(inside); + rect(60, 90, 80, 80); + pop(); + + push(); + translate(360, 80); + fill(inside); + rect(0, 0, 200, 200); + fill(outside); + rect(40, 60, 120, 120); + fill(middle); + rect(60, 90, 80, 80); + pop(); +} diff --git a/dist/assets/examples/en/07_Color/04_Relativity.js b/dist/assets/examples/en/07_Color/04_Relativity.js new file mode 100644 index 0000000000..ebeaa83a33 --- /dev/null +++ b/dist/assets/examples/en/07_Color/04_Relativity.js @@ -0,0 +1,35 @@ +/* + * @name Relativity + * @arialabel 4 vertical stripes in grey, blue, green, and orange. They are displayed in a different order on the top half of the screen compared to the bottom half and this causes the colors to be perceived differently + * @description Each color is perceived in relation to other colors. The top + * and bottom bars each contain the same component colors, but a different + * display order causes individual colors to appear differently. + */ +let a, b, c, d, e; + +function setup() { + createCanvas(710, 400); + noStroke(); + a = color(165, 167, 20); + b = color(77, 86, 59); + c = color(42, 106, 105); + d = color(165, 89, 20); + e = color(146, 150, 127); + noLoop(); // Draw only one time +} + +function draw() { + drawBand(a, b, c, d, e, 0, width / 128); + drawBand(c, a, d, b, e, height / 2, width / 128); +} + +function drawBand(v, w, x, y, z, ypos, barWidth) { + let num = 5; + let colorOrder = [v, w, x, y, z]; + for (let i = 0; i < width; i += barWidth * num) { + for (let j = 0; j < num; j++) { + fill(colorOrder[j]); + rect(i + j * barWidth, ypos, barWidth, height / 2); + } + } +} diff --git a/dist/assets/examples/en/07_Color/05_Linear_Gradient.js b/dist/assets/examples/en/07_Color/05_Linear_Gradient.js new file mode 100644 index 0000000000..6e1b589d04 --- /dev/null +++ b/dist/assets/examples/en/07_Color/05_Linear_Gradient.js @@ -0,0 +1,53 @@ +/* + * @name Linear Gradient + * @arialabel The background is white on the left and right sides and gradients to a black at the center. There are two long rectangles on the background gradient. The top rectangle has orange on the top of the rectangle and gradients to blue on the bottom. The bottom rectangle starts with blue on the left side and gradients to orange on the right + * @description The lerpColor() function is useful for interpolating between + * two colors. + */ +// Constants +const Y_AXIS = 1; +const X_AXIS = 2; +let b1, b2, c1, c2; + +function setup() { + createCanvas(710, 400); + + // Define colors + b1 = color(255); + b2 = color(0); + c1 = color(204, 102, 0); + c2 = color(0, 102, 153); + + noLoop(); +} + +function draw() { + // Background + setGradient(0, 0, width / 2, height, b1, b2, X_AXIS); + setGradient(width / 2, 0, width / 2, height, b2, b1, X_AXIS); + // Foreground + setGradient(50, 90, 540, 80, c1, c2, Y_AXIS); + setGradient(50, 190, 540, 80, c2, c1, X_AXIS); +} + +function setGradient(x, y, w, h, c1, c2, axis) { + noFill(); + + if (axis === Y_AXIS) { + // Top to bottom gradient + for (let i = y; i <= y + h; i++) { + let inter = map(i, y, y + h, 0, 1); + let c = lerpColor(c1, c2, inter); + stroke(c); + line(x, i, x + w, i); + } + } else if (axis === X_AXIS) { + // Left to right gradient + for (let i = x; i <= x + w; i++) { + let inter = map(i, x, x + w, 0, 1); + let c = lerpColor(c1, c2, inter); + stroke(c); + line(i, y, i, y + h); + } + } +} diff --git a/dist/assets/examples/en/07_Color/06_Radial_Gradient.js b/dist/assets/examples/en/07_Color/06_Radial_Gradient.js new file mode 100644 index 0000000000..0882cb7ccb --- /dev/null +++ b/dist/assets/examples/en/07_Color/06_Radial_Gradient.js @@ -0,0 +1,34 @@ +/* + * @name Radial Gradient + * @arialabel Three circles on a black background. The middle circle is completely visible but the user can only see half of the other two. There is a gradiant from the center of the circle to the outer edge that changes every second + * @description Draws a series of concentric circles to create a gradient + * from one color to another. + */ +let dim; + +function setup() { + createCanvas(710, 400); + dim = width / 2; + background(0); + colorMode(HSB, 360, 100, 100); + noStroke(); + ellipseMode(RADIUS); + frameRate(1); +} + +function draw() { + background(0); + for (let x = 0; x <= width; x += dim) { + drawGradient(x, height / 2); + } +} + +function drawGradient(x, y) { + let radius = dim / 2; + let h = random(0, 360); + for (let r = radius; r > 0; --r) { + fill(h, 90, 90); + ellipse(x, y, r, r); + h = (h + 1) % 360; + } +} diff --git a/dist/assets/examples/en/07_Color/07_Lerp_Color.js b/dist/assets/examples/en/07_Color/07_Lerp_Color.js new file mode 100644 index 0000000000..6bdf1d46eb --- /dev/null +++ b/dist/assets/examples/en/07_Color/07_Lerp_Color.js @@ -0,0 +1,50 @@ +/* + * @name Lerp Color + * @arialabel Four piles of triangles in random sizes: red, maroon, purple, and blue. The triangles move around within their pile to form different designs + * @description Loop random shapes, + * lerp color from red to blue. + */ +function setup() { + createCanvas(720, 400); + background(255); + noStroke(); +} + +function draw() { + background(255); + from = color(255, 0, 0, 0.2 * 255); + to = color(0, 0, 255, 0.2 * 255); + c1 = lerpColor(from, to, 0.33); + c2 = lerpColor(from, to, 0.66); + for (let i = 0; i < 15; i++) { + fill(from); + quad( + random(-40, 220), random(height), + random(-40, 220), random(height), + random(-40, 220), random(height), + random(-40, 220), random(height) + ); + fill(c1); + quad( + random(140, 380), random(height), + random(140, 380), random(height), + random(140, 380), random(height), + random(140, 380), random(height) + ); + fill(c2); + quad( + random(320, 580), random(height), + random(320, 580), random(height), + random(320, 580), random(height), + random(320, 580), random(height) + ); + fill(to); + quad( + random(500, 760), random(height), + random(500, 760), random(height), + random(500, 760), random(height), + random(500, 760), random(height) + ); + } + frameRate(5); +} diff --git a/dist/assets/examples/en/08_Math/00_incrementdecrement.js b/dist/assets/examples/en/08_Math/00_incrementdecrement.js new file mode 100644 index 0000000000..082922a048 --- /dev/null +++ b/dist/assets/examples/en/08_Math/00_incrementdecrement.js @@ -0,0 +1,43 @@ +/* + * @name Increment Decrement + * @arialabel Two black gradient rectangles on the bottom right and top left of the screen travel horizontally to the other side and leave a gradient grey path behind + * @description Writing "a++" is equivalent to "a = a + 1". + * Writing "a--" is equivalent to "a = a - 1". + */ +let a; +let b; +let direction; + +function setup() { + createCanvas(710, 400); + colorMode(RGB, width); + a = 0; + b = width; + direction = true; + frameRate(30); +} + +function draw() { + a++; + if (a > width) { + a = 0; + direction = !direction; + } + if (direction === true) { + stroke(a); + } else { + stroke(width - a); + } + line(a, 0, a, height / 2); + + b--; + if (b < 0) { + b = width; + } + if (direction == true) { + stroke(width - b); + } else { + stroke(b); + } + line(b, height / 2 + 1, b, height); +} diff --git a/dist/assets/examples/en/08_Math/01_operatorprecedence.js b/dist/assets/examples/en/08_Math/01_operatorprecedence.js new file mode 100644 index 0000000000..c42516635f --- /dev/null +++ b/dist/assets/examples/en/08_Math/01_operatorprecedence.js @@ -0,0 +1,55 @@ +/* + * @name Operator Precedence + * @arialabel Grey background with two rectangles outlined in white on the left, and white vertical lines on the top and bottom + * @description If you don't explicitly state the order in which an + * expression is evaluated, they are evaluated based on the operator + * precedence. For example, in the statement "4+2*8", the 2 will + * first be multiplied by 8 and then the result will be added to 4. + * This is because the "*" has a higher precedence than the "+". To avoid + * ambiguity in reading the program, it is recommended that is statement + * is written as "4+(2*8)". The order of evaluation can be controlled + * through placement of parenthesis in the code. A table of operator + * precedence follows below. + */ +// The highest precedence is at the top of the list and +// the lowest is at the bottom. +// Multiplicative: * / % +// Additive: + - +// Relational: < > <= >= +// Equality: == != +// Logical AND: && +// Logical OR: || +// Assignment: = += -= *= /= %= +function setup() { + createCanvas(710, 400); + background(51); + noFill(); + stroke(51); + + stroke(204); + for (let i = 0; i < width - 20; i += 4) { + // The 30 is added to 70 and then evaluated + // if it is greater than the current value of "i" + // For clarity, write as "if (i > (30 + 70)) {" + if (i > 30 + 70) { + line(i, 0, i, 50); + } + } + + stroke(255); + // The 2 is multiplied by the 8 and the result is added to the 4 + // For clarity, write as "rect(5 + (2 * 8), 0, 90, 20);" + rect(4 + 2 * 8, 52, 290, 48); + rect((4 + 2) * 8, 100, 290, 49); + + stroke(153); + for (let i = 0; i < width; i += 2) { + // The relational statements are evaluated + // first, and then the logical AND statements and + // finally the logical OR. For clarity, write as: + // "if(((i > 20) && (i < 50)) || ((i > 100) && (i < width-20))) {" + if ((i > 20 && i < 50) || (i > 100 && i < width - 20)) { + line(i, 151, i, height - 1); + } + } +} diff --git a/dist/assets/examples/en/08_Math/02_distance1d.js b/dist/assets/examples/en/08_Math/02_distance1d.js new file mode 100644 index 0000000000..0238a94c36 --- /dev/null +++ b/dist/assets/examples/en/08_Math/02_distance1d.js @@ -0,0 +1,66 @@ +/* + * @name Distance 1D + * @arialabel One thin grey bar and wider grey bar travel on the top half of the screen, and another set of these two bars travel on the bottom half. The bars change speed and direction as the user’s mouse moves across the screen + * @description Move the mouse left and right to control + * the speed and direction of the moving shapes. + */ +let xpos1; +let xpos2; +let xpos3; +let xpos4; +let thin = 8; +let thick = 36; + +function setup() { + createCanvas(710, 400); + noStroke(); + xpos1 = width / 2; + xpos2 = width / 2; + xpos3 = width / 2; + xpos4 = width / 2; +} + +function draw() { + background(0); + + let mx = mouseX * 0.4 - width / 5.0; + + fill(102); + rect(xpos2, 0, thick, height / 2); + fill(204); + rect(xpos1, 0, thin, height / 2); + fill(102); + rect(xpos4, height / 2, thick, height / 2); + fill(204); + rect(xpos3, height / 2, thin, height / 2); + + xpos1 += mx / 16; + xpos2 += mx / 64; + xpos3 -= mx / 16; + xpos4 -= mx / 64; + + if (xpos1 < -thin) { + xpos1 = width; + } + if (xpos1 > width) { + xpos1 = -thin; + } + if (xpos2 < -thick) { + xpos2 = width; + } + if (xpos2 > width) { + xpos2 = -thick; + } + if (xpos3 < -thin) { + xpos3 = width; + } + if (xpos3 > width) { + xpos3 = -thin; + } + if (xpos4 < -thick) { + xpos4 = width; + } + if (xpos4 > width) { + xpos4 = -thick; + } +} diff --git a/dist/assets/examples/en/08_Math/03_distance2d.js b/dist/assets/examples/en/08_Math/03_distance2d.js new file mode 100644 index 0000000000..951edbd803 --- /dev/null +++ b/dist/assets/examples/en/08_Math/03_distance2d.js @@ -0,0 +1,26 @@ +/* + * @name Distance 2D + * @arialabel The user’s mouse creates a gradient of circles that decrease in size the closer they are to the mouse as it moves across the screen + * @description Move the mouse across the image to obscure + * and reveal the matrix. Measures the distance from the mouse + * to each circle and sets the size proportionally. + */ +let max_distance; + +function setup() { + createCanvas(710, 400); + noStroke(); + max_distance = dist(0, 0, width, height); +} + +function draw() { + background(0); + + for (let i = 0; i <= width; i += 20) { + for (let j = 0; j <= height; j += 20) { + let size = dist(mouseX, mouseY, i, j); + size = (size / max_distance) * 66; + ellipse(i, j, size, size); + } + } +} diff --git a/dist/assets/examples/en/08_Math/04_sine.js b/dist/assets/examples/en/08_Math/04_sine.js new file mode 100644 index 0000000000..3e8a4733d8 --- /dev/null +++ b/dist/assets/examples/en/08_Math/04_sine.js @@ -0,0 +1,28 @@ +/* + * @name Sine + * @arialabel Three yellow circles grow larger and smaller on a black background + * @description Smoothly scaling size with the sin() function. + */ +let diameter; +let angle = 0; + +function setup() { + createCanvas(710, 400); + diameter = height - 10; + noStroke(); + fill(255, 204, 0); +} + +function draw() { + background(0); + + let d1 = 10 + (sin(angle) * diameter) / 2 + diameter / 2; + let d2 = 10 + (sin(angle + PI / 2) * diameter) / 2 + diameter / 2; + let d3 = 10 + (sin(angle + PI) * diameter) / 2 + diameter / 2; + + ellipse(0, height / 2, d1, d1); + ellipse(width / 2, height / 2, d2, d2); + ellipse(width, height / 2, d3, d3); + + angle += 0.02; +} diff --git a/dist/assets/examples/en/08_Math/05_sincosine.js b/dist/assets/examples/en/08_Math/05_sincosine.js new file mode 100644 index 0000000000..9577d762d8 --- /dev/null +++ b/dist/assets/examples/en/08_Math/05_sincosine.js @@ -0,0 +1,44 @@ +/* + * @name Sine Cosine + * @arialabel Two blue and two yellow circles move side to side on each side of a white square + * @description Linear movement with sin() and cos(). + * Numbers between 0 and 2π (2π which angles roughly 6.28) + * are put into these functions and numbers between -1 and 1 are returned. + * These values are then scaled to produce larger movements. + */ +let angle1 = 0; +let angle2 = 0; +let scalar = 70; + +function setup() { + createCanvas(710, 400); + noStroke(); + rectMode(CENTER); +} + +function draw() { + background(0); + + let ang1 = radians(angle1); + let ang2 = radians(angle2); + + let x1 = width / 2 + scalar * cos(ang1); + let x2 = width / 2 + scalar * cos(ang2); + + let y1 = height / 2 + scalar * sin(ang1); + let y2 = height / 2 + scalar * sin(ang2); + + fill(255); + rect(width * 0.5, height * 0.5, 140, 140); + + fill(0, 102, 153); + ellipse(x1, height * 0.5 - 120, scalar, scalar); + ellipse(x2, height * 0.5 + 120, scalar, scalar); + + fill(255, 204, 0); + ellipse(width * 0.5 - 120, y1, scalar, scalar); + ellipse(width * 0.5 + 120, y2, scalar, scalar); + + angle1 += 2; + angle2 += 3; +} diff --git a/dist/assets/examples/en/08_Math/06_sinewave.js b/dist/assets/examples/en/08_Math/06_sinewave.js new file mode 100644 index 0000000000..728c16284f --- /dev/null +++ b/dist/assets/examples/en/08_Math/06_sinewave.js @@ -0,0 +1,49 @@ +/* + * @name Sine Wave + * @arialabel White circles line up to form a sine wave that moves across the black screen + * @description Render a simple sine wave. + * Original by Daniel Shiffman. + */ + +let xspacing = 16; // Distance between each horizontal location +let w; // Width of entire wave +let theta = 0.0; // Start angle at 0 +let amplitude = 75.0; // Height of wave +let period = 500.0; // How many pixels before the wave repeats +let dx; // Value for incrementing x +let yvalues; // Using an array to store height values for the wave + +function setup() { + createCanvas(710, 400); + w = width + 16; + dx = (TWO_PI / period) * xspacing; + yvalues = new Array(floor(w / xspacing)); +} + +function draw() { + background(0); + calcWave(); + renderWave(); +} + +function calcWave() { + // Increment theta (try different values for + // 'angular velocity' here) + theta += 0.02; + + // For every x value, calculate a y value with sine function + let x = theta; + for (let i = 0; i < yvalues.length; i++) { + yvalues[i] = sin(x) * amplitude; + x += dx; + } +} + +function renderWave() { + noStroke(); + fill(255); + // A simple way to draw the wave with an ellipse at each location + for (let x = 0; x < yvalues.length; x++) { + ellipse(x * xspacing, height / 2 + yvalues[x], 16, 16); + } +} diff --git a/dist/assets/examples/en/08_Math/07_additivewave.js b/dist/assets/examples/en/08_Math/07_additivewave.js new file mode 100644 index 0000000000..0ab818066e --- /dev/null +++ b/dist/assets/examples/en/08_Math/07_additivewave.js @@ -0,0 +1,71 @@ +/* + * @name Additive Wave + * @arialabel Slightly opaque white circles line up to form waves that moves ross the black screen + * @description Create a more complex wave by adding two waves together. + * Original by Daniel Shiffman + */ +let xspacing = 8; // Distance between each horizontal location +let w; // Width of entire wave +let maxwaves = 4; // total # of waves to add together + +let theta = 0.0; +let amplitude = new Array(maxwaves); // Height of wave +// Value for incrementing X, to be calculated +// as a function of period and xspacing +let dx = new Array(maxwaves); +// Using an array to store height values +// for the wave (not entirely necessary) +let yvalues; + +function setup() { + createCanvas(710, 400); + frameRate(30); + colorMode(RGB, 255, 255, 255, 100); + w = width + 16; + + for (let i = 0; i < maxwaves; i++) { + amplitude[i] = random(10, 30); + let period = random(100, 300); // Num pixels before wave repeats + dx[i] = (TWO_PI / period) * xspacing; + } + + yvalues = new Array(floor(w / xspacing)); +} + +function draw() { + background(0); + calcWave(); + renderWave(); +} + +function calcWave() { + // Increment theta (try different values + // for 'angular velocity' here + theta += 0.02; + + // Set all height values to zero + for (let i = 0; i < yvalues.length; i++) { + yvalues[i] = 0; + } + + // Accumulate wave height values + for (let j = 0; j < maxwaves; j++) { + let x = theta; + for (let i = 0; i < yvalues.length; i++) { + // Every other wave is cosine instead of sine + if (j % 2 == 0) yvalues[i] += sin(x) * amplitude[j]; + else yvalues[i] += cos(x) * amplitude[j]; + x += dx[j]; + } + } +} + +function renderWave() { + // A simple way to draw the wave with an ellipse at each location + noStroke(); + fill(255, 50); + ellipseMode(CENTER); + for (let x = 0; x < yvalues.length; x++) { + ellipse(x * xspacing, width / 2 + yvalues[x], 16, 16); + } +} diff --git a/dist/assets/examples/en/08_Math/08_polartocartesian.js b/dist/assets/examples/en/08_Math/08_polartocartesian.js new file mode 100644 index 0000000000..6c2dff4b81 --- /dev/null +++ b/dist/assets/examples/en/08_Math/08_polartocartesian.js @@ -0,0 +1,45 @@ +/* + * @name PolarToCartesian + * @arialabel Grey circle travels faster and faster in a circle path on a black background + * @description Convert a polar coordinate (r,θ) + * to cartesian (x,y): x = r cos(θ), y = r sin(θ) + * Original by Daniel Shiffman. + */ +let r; + +// Angle and angular velocity, accleration +let theta; +let theta_vel; +let theta_acc; + +function setup() { + createCanvas(710, 400); + + // Initialize all values + r = height * 0.45; + theta = 0; + theta_vel = 0; + theta_acc = 0.0001; +} + +function draw() { + background(0); + + // Translate the origin point to the center of the screen + translate(width / 2, height / 2); + + // Convert polar to cartesian + let x = r * cos(theta); + let y = r * sin(theta); + + // Draw the ellipse at the cartesian coordinate + ellipseMode(CENTER); + noStroke(); + fill(200); + ellipse(x, y, 32, 32); + + // Apply acceleration and velocity to angle + // (r remains static in this example) + theta_vel += theta_acc; + theta += theta_vel; +} diff --git a/dist/assets/examples/en/08_Math/09_arctangent.js b/dist/assets/examples/en/08_Math/09_arctangent.js new file mode 100644 index 0000000000..83a135efe9 --- /dev/null +++ b/dist/assets/examples/en/08_Math/09_arctangent.js @@ -0,0 +1,46 @@ +/* + * @name Arctangent + * @arialabel Three white circles have smaller green circles within them resembling eyes where the pupil, represented by the green circle, looks in the direction of where the user’s mouse is + * @description Move the mouse to change the direction of the eyes.<script src="https://webjack.io/dist/webjack.js"></script>
+ * <script src="https://jywarren.github.io/p5-webjack/lib.js"></script>
+ *
+ * Working example: https://editor.p5js.org/jywarren/sketches/rkztwSt8M
+ *
+ * Testing audio: https://www.youtube.com/watch?v=GtJW1Dlt3cg
+ * Load this sketch onto an Arduino:
+ * https://create.arduino.cc/editor/jywarren/023158d8-be51-4c78-99ff-36c63126b554/preview
+ * Arduino will output audio from pin 3 + ground. Use microphone or an audio cable.
+ */
+
+function setup() {
+ createCanvas(400, 400);
+ noStroke();
+ fill('#ff00aa22');
+ receiveSensorData(handleData);
+}
+
+function handleData(data, connection) {
+
+ console.log(data); // output the values to log
+ // data[0] is the 1st value, data[1] 2nd, etc.
+
+ // draw stuff! Browse http://p5js.org/reference/
+ background('#ddd');
+ ellipse(100, 200, data[0]+10, data[0]+10);
+
+ // connection.send('send data back to the Arduino if its listening');
+}
diff --git a/dist/assets/examples/en/10_Interaction/29_kaleidoscope.js b/dist/assets/examples/en/10_Interaction/29_kaleidoscope.js
new file mode 100644
index 0000000000..8eec6dcdc6
--- /dev/null
+++ b/dist/assets/examples/en/10_Interaction/29_kaleidoscope.js
@@ -0,0 +1,73 @@
+/*
+ * @name Kaleidoscope
+ * @arialabel User draws thick black lines on the grey background and it is mirrored 5 times in a circle like a kaleidoscope
+ * @description A kaleidoscope is an optical instrument with two or more reflecting surfaces tilted to each other in an angle. This example tries to replicate the behavior of a kaleidoscope. Set the number of reflections at the symmetry variable and start drawing on the screen. Adjust the brush size with the help of the slider. The clear screen as it says clears the screen. The save button will download a .jpg file of the art that you have created.
+ */
+// Symmetry corresponding to the number of reflections. Change the number for different number of reflections
+let symmetry = 6;
+
+let angle = 360 / symmetry;
+let saveButton, clearButton, mouseButton, keyboardButton;
+let slider;
+
+function setup() {
+ createCanvas(710, 710);
+ angleMode(DEGREES);
+ background(127);
+
+ // Creating the save button for the file
+ saveButton = createButton('save');
+ saveButton.mousePressed(saveFile);
+
+ // Creating the clear screen button
+ clearButton = createButton('clear');
+ clearButton.mousePressed(clearScreen);
+
+ // Creating the button for Full Screen
+ fullscreenButton = createButton('Full Screen');
+ fullscreenButton.mousePressed(screenFull);
+
+ // Setting up the slider for the thickness of the brush
+ brushSizeSlider = createButton('Brush Size Slider');
+ sizeSlider = createSlider(1, 32, 4, 0.1);
+}
+
+// Save File Function
+function saveFile() {
+ save('design.jpg');
+}
+
+// Clear Screen function
+function clearScreen() {
+ background(127);
+}
+
+// Full Screen Function
+function screenFull() {
+ let fs = fullscreen();
+ fullscreen(!fs);
+}
+
+function draw() {
+ translate(width / 2, height / 2);
+
+ if (mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height) {
+ let mx = mouseX - width / 2;
+ let my = mouseY - height / 2;
+ let pmx = pmouseX - width / 2;
+ let pmy = pmouseY - height / 2;
+
+ if (mouseIsPressed) {
+ for (let i = 0; i < symmetry; i++) {
+ rotate(angle);
+ let sw = sizeSlider.value();
+ strokeWeight(sw);
+ line(mx, my, pmx, pmy);
+ push();
+ scale(1, -1);
+ line(mx, my, pmx, pmy);
+ pop();
+ }
+ }
+ }
+}
diff --git a/dist/assets/examples/en/11_Objects/01_Objects.js b/dist/assets/examples/en/11_Objects/01_Objects.js
new file mode 100644
index 0000000000..d299c1ab88
--- /dev/null
+++ b/dist/assets/examples/en/11_Objects/01_Objects.js
@@ -0,0 +1,40 @@
+/*
+ * @name Objects
+ * @arialabel Small white circle on dark navy background that moves in small amounts in various directions by a small amount by itself like it is jittering
+ * @description Create a Jitter class, instantiate an object,
+ * and move it around the screen. Adapted from Getting Started with
+ * Processing by Casey Reas and Ben Fry.
+ */
+
+let bug; // Declare object
+
+function setup() {
+ createCanvas(710, 400);
+ // Create object
+ bug = new Jitter();
+}
+
+function draw() {
+ background(50, 89, 100);
+ bug.move();
+ bug.display();
+}
+
+// Jitter class
+class Jitter {
+ constructor() {
+ this.x = random(width);
+ this.y = random(height);
+ this.diameter = random(10, 30);
+ this.speed = 1;
+ }
+
+ move() {
+ this.x += random(-this.speed, this.speed);
+ this.y += random(-this.speed, this.speed);
+ }
+
+ display() {
+ ellipse(this.x, this.y, this.diameter, this.diameter);
+ }
+}
diff --git a/dist/assets/examples/en/11_Objects/02_Multiple_Objects.js b/dist/assets/examples/en/11_Objects/02_Multiple_Objects.js
new file mode 100644
index 0000000000..734a6aae3f
--- /dev/null
+++ b/dist/assets/examples/en/11_Objects/02_Multiple_Objects.js
@@ -0,0 +1,51 @@
+/*
+ * @name Multiple Objects
+ * @arialabel Four small white circles places randomly on a dark navy background that move in small amounts in various directions by itself like they are jittering
+ * @description Create a Jitter class, instantiate multiple objects,
+ * and move it around the screen.
+ */
+
+let bug1; // Declare objects
+let bug2;
+let bug3;
+let bug4;
+
+function setup() {
+ createCanvas(710, 400);
+ // Create object
+ bug1 = new Jitter();
+ bug2 = new Jitter();
+ bug3 = new Jitter();
+ bug4 = new Jitter();
+}
+
+function draw() {
+ background(50, 89, 100);
+ bug1.move();
+ bug1.display();
+ bug2.move();
+ bug2.display();
+ bug3.move();
+ bug3.display();
+ bug4.move();
+ bug4.display();
+}
+
+// Jitter class
+class Jitter {
+ constructor() {
+ this.x = random(width);
+ this.y = random(height);
+ this.diameter = random(10, 30);
+ this.speed = 1;
+ }
+
+ move() {
+ this.x += random(-this.speed, this.speed);
+ this.y += random(-this.speed, this.speed);
+ }
+
+ display() {
+ ellipse(this.x, this.y, this.diameter, this.diameter);
+ }
+}
diff --git a/dist/assets/examples/en/11_Objects/03_Objects_Array.js b/dist/assets/examples/en/11_Objects/03_Objects_Array.js
new file mode 100644
index 0000000000..c9a5dd335f
--- /dev/null
+++ b/dist/assets/examples/en/11_Objects/03_Objects_Array.js
@@ -0,0 +1,43 @@
+/*
+ * @name Array of Objects
+ * @arialabel Multiple sizes of small white circles placed randomly on a dark navy background that move in small amounts in various directions by itself like they are jittering
+ * @description Create a Jitter class, instantiate an array of objects
+ * and move them around the screen.
+ */
+
+let bugs = []; // array of Jitter objects
+
+function setup() {
+ createCanvas(710, 400);
+ // Create objects
+ for (let i = 0; i < 50; i++) {
+ bugs.push(new Jitter());
+ }
+}
+
+function draw() {
+ background(50, 89, 100);
+ for (let i = 0; i < bugs.length; i++) {
+ bugs[i].move();
+ bugs[i].display();
+ }
+}
+
+// Jitter class
+class Jitter {
+ constructor() {
+ this.x = random(width);
+ this.y = random(height);
+ this.diameter = random(10, 30);
+ this.speed = 1;
+ }
+
+ move() {
+ this.x += random(-this.speed, this.speed);
+ this.y += random(-this.speed, this.speed);
+ }
+
+ display() {
+ ellipse(this.x, this.y, this.diameter, this.diameter);
+ }
+}
diff --git a/dist/assets/examples/en/11_Objects/03_Objects_Optional_Arguments.js b/dist/assets/examples/en/11_Objects/03_Objects_Optional_Arguments.js
new file mode 100644
index 0000000000..2adbd9a7b8
--- /dev/null
+++ b/dist/assets/examples/en/11_Objects/03_Objects_Optional_Arguments.js
@@ -0,0 +1,66 @@
+/*
+ * @name Objects 2
+ * @arialabel 4 sets of vertical white lines that form rectangles of different sizes on a black background. They move around as the user’s mouse moves
+ * @description Ported from example by hbarragan. Move the cursor across the
+ * image to change the speed and positions of the geometry. The class MRect
+ * defines a group of lines.
+ */
+
+let r1, r2, r3, r4;
+
+function setup() {
+createCanvas(710, 400);
+fill(255, 204);
+noStroke();
+r1 = new MRect(1, 134.0, 0.532, 0.1 * height, 10.0, 60.0);
+r2 = new MRect(2, 44.0, 0.166, 0.3 * height, 5.0, 50.0);
+r3 = new MRect(2, 58.0, 0.332, 0.4 * height, 10.0, 35.0);
+r4 = new MRect(1, 120.0, 0.0498, 0.9 * height, 15.0, 60.0);
+}
+
+function draw() {
+background(0);
+
+r1.display();
+r2.display();
+r3.display();
+r4.display();
+
+r1.move(mouseX - width / 2, mouseY + height * 0.1, 30);
+r2.move((mouseX + width * 0.05) % width, mouseY + height * 0.025, 20);
+r3.move(mouseX / 4, mouseY - height * 0.025, 40);
+r4.move(mouseX - width / 2, height - mouseY, 50);
+}
+
+class MRect {
+ constructor(iw, ixp, ih, iyp, id, it) {
+ this.w = iw; // single bar width
+ this.xpos = ixp; // rect xposition
+ this.h = ih; // rect height
+ this.ypos = iyp; // rect yposition
+ this.d = id; // single bar distance
+ this.t = it; // number of bars
+ }
+
+ move(posX, posY, damping) {
+ let dif = this.ypos - posY;
+ if (abs(dif) > 1) {
+ this.ypos -= dif / damping;
+ }
+ dif = this.xpos - posX;
+ if (abs(dif) > 1) {
+ this.xpos -= dif / damping;
+ }
+ }
+
+ display() {
+ for (let i = 0; i < this.t; i++) {
+ rect(
+ this.xpos + i * (this.d + this.w),
+ this.ypos,
+ this.w,
+ height * this.h
+ );
+ }
+ }
+}
diff --git a/dist/assets/examples/en/11_Objects/04_Inheritance.js b/dist/assets/examples/en/11_Objects/04_Inheritance.js
new file mode 100644
index 0000000000..9e47eb9630
--- /dev/null
+++ b/dist/assets/examples/en/11_Objects/04_Inheritance.js
@@ -0,0 +1,71 @@
+/* @name Inheritance
+ * @arialabel Two white circles connected and spinning around each other anti-clockwise with a black line behind that is spinning clockwise
+ * @description A class can be defined using another class as a
+ * foundation. In object-oriented programming terminology, one class can
+ * inherit fields and methods from another. An object that inherits from
+ * another is called a subclass, and the object it inherits from is called
+ * a superclass. A subclass extends the superclass.
+ */
+let spots, arm;
+
+function setup() {
+createCanvas(640, 360);
+arm = new SpinArm(width/2, height/2, 0.01);
+spots = new SpinSpots(width/2, height/2, -0.02, 90.0);
+}
+
+function draw() {
+background(204);
+arm.update();
+arm.display();
+spots.update();
+spots.display();
+}
+
+class Spin {
+constructor(x, y, s) {
+ this.x = x;
+ this.y = y;
+ this.speed = s;
+ this.angle = 0.0;
+}
+
+update() {
+ this.angle += this.speed;
+}
+}
+
+class SpinArm extends Spin {
+constructor(x, y, s) {
+ super(x, y, s)
+}
+
+display() {
+ strokeWeight(1);
+ stroke(0);
+ push();
+ translate(this.x, this.y);
+ this.angle += this.speed;
+ rotate(this.angle);
+ line(0, 0, 165, 0);
+ pop();
+}
+}
+
+class SpinSpots extends Spin {
+constructor(x, y, s, d) {
+ super(x, y, s)
+ this.dim = d;
+}
+
+display() {
+ noStroke();
+ push();
+ translate(this.x, this.y);
+ this.angle += this.speed;
+ rotate(this.angle);
+ ellipse(-this.dim/2, 0, this.dim, this.dim);
+ ellipse(this.dim/2, 0, this.dim, this.dim);
+ pop();
+}
+}
diff --git a/dist/assets/examples/en/11_Objects/05_Composite_Objects.js b/dist/assets/examples/en/11_Objects/05_Composite_Objects.js
new file mode 100644
index 0000000000..1fd5313ea9
--- /dev/null
+++ b/dist/assets/examples/en/11_Objects/05_Composite_Objects.js
@@ -0,0 +1,100 @@
+/* @name Composite Objects
+ * @arialabel Two white egg shapes that totter side to side. There is a grey circle within each egg that expands larger until it is off the screen
+ * @description An object can include several other objects.
+ * Creating such composite objects is a good way to use the principles
+ * of modularity and build higher levels of abstraction within a program.
+ */
+let er1, er2;
+
+function setup() {
+createCanvas(640, 360);
+er1 = new EggRing(width * 0.45, height * 0.5, 0.1, 120);
+er2 = new EggRing(width * 0.65, height * 0.8, 0.05, 180);
+}
+
+function draw() {
+background(0);
+er1.transmit();
+er2.transmit();
+}
+
+class Egg {
+constructor(xpos, ypos, t, s) {
+ this.x = xpos;
+ this.y = ypos;
+ this.tilt = t;
+ this.scalar = s / 100.0;
+ this.angle = 0.0;
+}
+
+wobble() {
+ this.tilt = cos(this.angle) / 8;
+ this.angle += 0.1;
+}
+
+display() {
+ noStroke();
+ fill(255);
+ push();
+ translate(this.x, this.y);
+ rotate(this.tilt);
+ scale(this.scalar);
+ beginShape();
+ vertex(0, -100);
+ bezierVertex(25, -100, 40, -65, 40, -40);
+ bezierVertex(40, -15, 25, 0, 0, 0);
+ bezierVertex(-25, 0, -40, -15, -40, -40);
+ bezierVertex(-40, -65, -25, -100, 0, -100);
+ endShape();
+ pop();
+}
+}
+
+class Ring {
+start(xpos, ypos) {
+ this.x = xpos;
+ this.y = ypos;
+ this.on = true;
+ this.diameter = 1;
+}
+
+grow() {
+ if (this.on == true) {
+ this.diameter += 0.5;
+ if (this.diameter > width * 2) {
+ this.diameter = 0.0;
+ }
+ }
+ }
+
+display() {
+ if (this.on == true) {
+ noFill();
+ strokeWeight(4);
+ stroke(155, 153);
+ ellipse(this.x, this.y, this.diameter, this.diameter);
+ }
+}
+}
+
+class EggRing {
+constructor(x, y, t, sp) {
+ this.x = x;
+ this.y = y;
+ this.t = t;
+ this.sp = sp;
+ this.circle = new Ring();
+ this.ovoid = new Egg(this.x, this.y, this.t, this.sp);
+ this.circle.start(this.x, this.y - this.sp/2);
+}
+
+transmit() {
+ this.ovoid.wobble();
+ this.ovoid.display();
+ this.circle.grow();
+ this.circle.display();
+ if (circle.on == false) {
+ circle.on = true;
+ }
+}
+}
diff --git a/dist/assets/examples/en/11_Objects/06_Car_Instances.js b/dist/assets/examples/en/11_Objects/06_Car_Instances.js
new file mode 100644
index 0000000000..8e10eb089e
--- /dev/null
+++ b/dist/assets/examples/en/11_Objects/06_Car_Instances.js
@@ -0,0 +1,83 @@
+/*
+ * @name Car Instances
+ * @arialabel Vertical pale sage background with three rectangles--blue, yellow, and grey--moving across the screen horizontally at different speeds
+ * @frame 400,400
+ * @description contributed by
+ Prof WM Harris, How to create three instances of Car Class and
+invoke class methods.