CINXE.COM
<!doctype html> <html data-n-head-ssr lang="en" data-n-head="lang"> <head data-n-head=""> <title data-n-head="true">Sarah Drasner's Site</title><meta data-n-head="true" charset="utf-8"><meta data-n-head="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-n-head="true" data-hid="description" name="description" content="Sarah Drasner's site"><link data-n-head="true" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-n-head="true" rel="preload" as="style" href="https://cloud.typography.com/7626114/6931412/css/fonts.css"><link data-n-head="true" rel="stylesheet" type="text/css" href="https://cloud.typography.com/7626114/6931412/css/fonts.css"><link rel="preload" href="/_nuxt/21139e525cff45921797.js" as="script"><link rel="preload" href="/_nuxt/9f4e10bfcbf3e95aef1f.js" as="script"><link rel="preload" href="/_nuxt/4bda9c7095f4f9df3298.js" as="script"><link rel="preload" href="/_nuxt/45f91ff6957fed4552a2.js" as="script"><link rel="preload" href="/_nuxt/874d3d38e3bf4e568bdc.js" as="script"><style data-vue-ssr-id="3baa03b4:0 17cfdfa9:0 aab9a468:0 34a29404:0 21d76a79:0 0349549d:0 76711e5d:0 b9c8de1e:0 7a823a01:0">/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}small{font-size:80%}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}textarea{overflow:auto}details{display:block}.nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;-webkit-transition:width .1s,opacity .4s;transition:width .1s,opacity .4s;background-color:#7f7ff8;z-index:999999}.nuxt-progress.nuxt-progress-notransition{-webkit-transition:none;transition:none}.nuxt-progress-failed{background-color:red}html{font-family:Mercury Display A,Mercury Display B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-weight:400;font-style:normal;font-size:16px;word-spacing:1px;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-webkit-box-sizing:border-box;box-sizing:border-box;background:#141618;color:#eee;font-display:swap}.hidden{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.setup{color:#7f7ff8;margin-bottom:10px;border:1px dashed;padding:10px}.punchline:before{position:absolute;width:20px;height:20px;content:"🙄";bottom:10px;right:10px;font-size:50px}.punchline{color:#79cef8;border:1px double;padding:10px;position:relative}[data-v-9b59b55a],[data-v-9b59b55a]:after,[data-v-9b59b55a]:before{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0}body[data-v-9b59b55a],html[data-v-9b59b55a]{height:100%}body[data-v-9b59b55a]{margin:0;padding:0;overflow:hidden}main[data-v-9b59b55a]{height:100%;margin:8vmin}main.blogpost[data-v-9b59b55a]{margin:0!important}.logo[data-v-9b59b55a],h1[data-v-9b59b55a],h2[data-v-9b59b55a],h3[data-v-9b59b55a],h4[data-v-9b59b55a]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;text-transform:uppercase;font-weight:500;font-style:normal;color:#fff}h2[data-v-9b59b55a]{font-size:40px}h3[data-v-9b59b55a]{font-size:30px}code[data-v-9b59b55a]{background:#eee;padding:4px 10px;border-radius:6px}.tag[data-v-9b59b55a]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;text-transform:uppercase;font-weight:500;font-style:normal;margin:10px 10px 10px 0;display:inline-block;font-size:13px;padding:4px 20px;border-radius:2px;color:#7f7ff8;border:1px solid #7f7ff8}li[data-v-9b59b55a],p[data-v-9b59b55a]{color:#b5b3b3;font-size:18px;font-display:swap}li a[data-v-9b59b55a],p a[data-v-9b59b55a]{font-weight:600;color:#fff}input[data-v-9b59b55a],textarea[data-v-9b59b55a]{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;margin:10px 0 20px;font-size:15px;padding:5px;background:#444;border:#000;border-bottom:1px solid #44f;color:#fff}label[data-v-9b59b55a]{font-family:Segoe UI,Roboto,Helvetica Neue,-apple-system,BlinkMacSystemFont,Arial,sans-serif}button[data-v-9b59b55a],label[data-v-9b59b55a]{text-transform:uppercase;letter-spacing:.15em;font-size:13px}button[data-v-9b59b55a]{background:0 0;border:1px solid #7f7ff8;color:#7f7ff8;border-radius:1000px 1000px;padding:10px;width:100%;font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-transition:all .25s ease;transition:all .25s ease;cursor:pointer;outline:0}button[data-v-9b59b55a]:active{outline:1px dotted #666}button[data-v-9b59b55a]:hover{background:#44f;color:#fff;border-color:#44f}button[type=submit][data-v-9b59b55a]{background:#44f;border:none;color:#fff}.hidden[data-v-9b59b55a]{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}ul.site-links[data-v-9b59b55a]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-weight:500;padding-left:0;list-style:none;text-transform:uppercase;font-size:20px;margin-top:3px;opacity:.8}.site-links li[data-v-9b59b55a],.social-links svg[data-v-9b59b55a]{display:inline-block;padding-right:15px}.glitch[data-v-9b59b55a],.social-links a[data-v-9b59b55a]{color:#fff}.glitch[data-v-9b59b55a]{position:relative;mix-blend-mode:lighten}.glitch[data-v-9b59b55a]:after,.glitch[data-v-9b59b55a]:before{content:attr(data-text);position:absolute;top:0;width:100%;background:#141618;clip:rect(0,0,0,0)}.glitch[data-v-9b59b55a]:before{left:-1px;text-shadow:4px 0 rgba(255,0,0,.7);animation:glitch-loop-1-data-v-9b59b55a .8s ease-in-out infinite alternate-reverse}.glitch[data-v-9b59b55a]:after{left:1px;text-shadow:-7px 0 rgba(0,0,255,.7);animation:glitch-loop-2-data-v-9b59b55a 1s ease-in-out infinite alternate-reverse}@-webkit-keyframes glitch-loop-1-data-v-9b59b55a{0%{clip:rect(36px,9999px,9px,0)}25%{clip:rect(25px,9999px,99px,0)}50%{clip:rect(50px,9999px,102px,0)}75%{clip:rect(20px,9999px,92px,0)}to{clip:rect(100px,9999px,98px,0)}}@keyframes glitch-loop-1-data-v-9b59b55a{0%{clip:rect(36px,9999px,9px,0)}25%{clip:rect(25px,9999px,99px,0)}50%{clip:rect(50px,9999px,102px,0)}75%{clip:rect(20px,9999px,92px,0)}to{clip:rect(100px,9999px,98px,0)}}@-webkit-keyframes glitch-loop-2-data-v-9b59b55a{0%{top:-1px;left:1px;clip:rect(65px,9999px,119px,0)}25%{top:-8px;left:2px;clip:rect(79px,9999px,19px,0)}50%{top:-3px;left:2px;clip:rect(68px,9999px,11px,0)}75%{top:0;left:-2px;clip:rect(95px,9999px,53px,0)}to{top:-1px;left:-4px;clip:rect(31px,9999px,149px,0)}}@keyframes glitch-loop-2-data-v-9b59b55a{0%{top:-1px;left:1px;clip:rect(65px,9999px,119px,0)}25%{top:-8px;left:2px;clip:rect(79px,9999px,19px,0)}50%{top:-3px;left:2px;clip:rect(68px,9999px,11px,0)}75%{top:0;left:-2px;clip:rect(95px,9999px,53px,0)}to{top:-1px;left:-4px;clip:rect(31px,9999px,149px,0)}}thead[data-v-9b59b55a]{font-family:Helvetica,Segoe UI,Tahoma,Geneva,Verdana,sans-serif;color:#888;text-align:left;border-bottom:1px solid #666}thead th[data-v-9b59b55a]{font-weight:400;letter-spacing:.05em;font-size:14px}table[data-v-9b59b55a]{border-collapse:collapse}td[data-v-9b59b55a],th[data-v-9b59b55a]{border-bottom:1px solid #4b4a4a;padding:.8rem 0;text-align:left}tr[data-v-9b59b55a]{-webkit-transition:all .15s ease;transition:all .15s ease}tr[data-v-9b59b55a]:hover{background-color:hsla(0,0%,100%,.05)}.list-item[data-v-9b59b55a]{-webkit-transition:all 1s;transition:all 1s}.list-enter[data-v-9b59b55a],.list-leave-to[data-v-9b59b55a]{opacity:0;-webkit-transform:translateY(30px);transform:translateY(30px)}.list-leave-active[data-v-9b59b55a]{position:absolute}pre[data-v-9b59b55a]{white-space:pre-wrap;background:#ddd;border-radius:4px;padding:8px}article ul[data-v-9b59b55a]{margin-top:0}nav[data-v-9b59b55a]{background:#141618;color:#fff;padding:30px 8vmin 25px}a[data-v-9b59b55a],a[data-v-9b59b55a]:active,a[data-v-9b59b55a]:visited{text-decoration:none;color:#fff}.logo[data-v-9b59b55a]{text-transform:uppercase;font-size:25px;display:inline}ul.site-links[data-v-9b59b55a]{float:right}@media screen and (max-width:500px){nav[data-v-9b59b55a]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-left:-10px;padding:30px 20px 25px;-webkit-box-shadow:0 2px 10px 0 #000;box-shadow:0 2px 10px 0 #000;border:1px solid #222}nav a[data-v-9b59b55a]{margin:0 20px}nav svg[data-v-9b59b55a]{margin-left:-30px}}svg[data-v-23cb9e66]{vertical-align:middle;margin-top:-15px}.fernpath{fill:url(#grad1)}a[data-v-6150acad],a[data-v-6150acad]:active,a[data-v-6150acad]:visited{color:#fff}[data-v-6150acad],[data-v-6150acad]:after,[data-v-6150acad]:before{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0}body[data-v-6150acad],html[data-v-6150acad]{height:100%}body[data-v-6150acad]{margin:0;padding:0;overflow:hidden}main[data-v-6150acad]{height:100%;margin:8vmin}main.blogpost[data-v-6150acad]{margin:0!important}.logo[data-v-6150acad],h1[data-v-6150acad],h2[data-v-6150acad],h3[data-v-6150acad],h4[data-v-6150acad]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;text-transform:uppercase;font-weight:500;font-style:normal;color:#fff}h2[data-v-6150acad]{font-size:40px}h3[data-v-6150acad]{font-size:30px}code[data-v-6150acad]{background:#eee;padding:4px 10px;border-radius:6px}.tag[data-v-6150acad]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;text-transform:uppercase;font-weight:500;font-style:normal;margin:10px 10px 10px 0;display:inline-block;font-size:13px;padding:4px 20px;border-radius:2px;color:#7f7ff8;border:1px solid #7f7ff8}li[data-v-6150acad],p[data-v-6150acad]{color:#b5b3b3;font-size:18px;font-display:swap}li a[data-v-6150acad],p a[data-v-6150acad]{font-weight:600;color:#fff}input[data-v-6150acad],textarea[data-v-6150acad]{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;margin:10px 0 20px;font-size:15px;padding:5px;background:#444;border:#000;border-bottom:1px solid #44f;color:#fff}label[data-v-6150acad]{font-family:Segoe UI,Roboto,Helvetica Neue,-apple-system,BlinkMacSystemFont,Arial,sans-serif}button[data-v-6150acad],label[data-v-6150acad]{text-transform:uppercase;letter-spacing:.15em;font-size:13px}button[data-v-6150acad]{background:0 0;border:1px solid #7f7ff8;color:#7f7ff8;border-radius:1000px 1000px;padding:10px;width:100%;font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-transition:all .25s ease;transition:all .25s ease;cursor:pointer;outline:0}button[data-v-6150acad]:active{outline:1px dotted #666}button[data-v-6150acad]:hover{background:#44f;color:#fff;border-color:#44f}button[type=submit][data-v-6150acad]{background:#44f;border:none;color:#fff}.hidden[data-v-6150acad]{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}ul.site-links[data-v-6150acad]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-weight:500;padding-left:0;list-style:none;text-transform:uppercase;font-size:20px;margin-top:3px;opacity:.8}.site-links li[data-v-6150acad],.social-links svg[data-v-6150acad]{display:inline-block;padding-right:15px}.glitch[data-v-6150acad],.social-links a[data-v-6150acad]{color:#fff}.glitch[data-v-6150acad]{position:relative;mix-blend-mode:lighten}.glitch[data-v-6150acad]:after,.glitch[data-v-6150acad]:before{content:attr(data-text);position:absolute;top:0;width:100%;background:#141618;clip:rect(0,0,0,0)}.glitch[data-v-6150acad]:before{left:-1px;text-shadow:4px 0 rgba(255,0,0,.7);animation:glitch-loop-1-data-v-6150acad .8s ease-in-out infinite alternate-reverse}.glitch[data-v-6150acad]:after{left:1px;text-shadow:-7px 0 rgba(0,0,255,.7);animation:glitch-loop-2-data-v-6150acad 1s ease-in-out infinite alternate-reverse}@-webkit-keyframes glitch-loop-1-data-v-6150acad{0%{clip:rect(36px,9999px,9px,0)}25%{clip:rect(25px,9999px,99px,0)}50%{clip:rect(50px,9999px,102px,0)}75%{clip:rect(20px,9999px,92px,0)}to{clip:rect(100px,9999px,98px,0)}}@keyframes glitch-loop-1-data-v-6150acad{0%{clip:rect(36px,9999px,9px,0)}25%{clip:rect(25px,9999px,99px,0)}50%{clip:rect(50px,9999px,102px,0)}75%{clip:rect(20px,9999px,92px,0)}to{clip:rect(100px,9999px,98px,0)}}@-webkit-keyframes glitch-loop-2-data-v-6150acad{0%{top:-1px;left:1px;clip:rect(65px,9999px,119px,0)}25%{top:-8px;left:2px;clip:rect(79px,9999px,19px,0)}50%{top:-3px;left:2px;clip:rect(68px,9999px,11px,0)}75%{top:0;left:-2px;clip:rect(95px,9999px,53px,0)}to{top:-1px;left:-4px;clip:rect(31px,9999px,149px,0)}}@keyframes glitch-loop-2-data-v-6150acad{0%{top:-1px;left:1px;clip:rect(65px,9999px,119px,0)}25%{top:-8px;left:2px;clip:rect(79px,9999px,19px,0)}50%{top:-3px;left:2px;clip:rect(68px,9999px,11px,0)}75%{top:0;left:-2px;clip:rect(95px,9999px,53px,0)}to{top:-1px;left:-4px;clip:rect(31px,9999px,149px,0)}}thead[data-v-6150acad]{font-family:Helvetica,Segoe UI,Tahoma,Geneva,Verdana,sans-serif;color:#888;text-align:left;border-bottom:1px solid #666}thead th[data-v-6150acad]{font-weight:400;letter-spacing:.05em;font-size:14px}table[data-v-6150acad]{border-collapse:collapse}td[data-v-6150acad],th[data-v-6150acad]{border-bottom:1px solid #4b4a4a;padding:.8rem 0;text-align:left}tr[data-v-6150acad]{-webkit-transition:all .15s ease;transition:all .15s ease}tr[data-v-6150acad]:hover{background-color:hsla(0,0%,100%,.05)}.list-item[data-v-6150acad]{-webkit-transition:all 1s;transition:all 1s}.list-enter[data-v-6150acad],.list-leave-to[data-v-6150acad]{opacity:0;-webkit-transform:translateY(30px);transform:translateY(30px)}.list-leave-active[data-v-6150acad]{position:absolute}pre[data-v-6150acad]{white-space:pre-wrap;background:#ddd;border-radius:4px;padding:8px}article ul[data-v-6150acad]{margin-top:0}a[data-v-6150acad],a[data-v-6150acad]:active,a[data-v-6150acad]:visited{text-decoration:none;color:#b5b3b3;font-weight:500!important}[data-v-0fea1b4d],[data-v-0fea1b4d]:after,[data-v-0fea1b4d]:before{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0}body[data-v-0fea1b4d],html[data-v-0fea1b4d]{height:100%}body[data-v-0fea1b4d]{margin:0;padding:0;overflow:hidden}main[data-v-0fea1b4d]{height:100%;margin:8vmin}main.blogpost[data-v-0fea1b4d]{margin:0!important}.logo[data-v-0fea1b4d],h1[data-v-0fea1b4d],h2[data-v-0fea1b4d],h3[data-v-0fea1b4d],h4[data-v-0fea1b4d]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;text-transform:uppercase;font-weight:500;font-style:normal;color:#fff}h2[data-v-0fea1b4d]{font-size:40px}h3[data-v-0fea1b4d]{font-size:30px}code[data-v-0fea1b4d]{background:#eee;padding:4px 10px;border-radius:6px}.tag[data-v-0fea1b4d]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;text-transform:uppercase;font-weight:500;font-style:normal;margin:10px 10px 10px 0;display:inline-block;font-size:13px;padding:4px 20px;border-radius:2px;color:#7f7ff8;border:1px solid #7f7ff8}li[data-v-0fea1b4d],p[data-v-0fea1b4d]{color:#b5b3b3;font-size:18px;font-display:swap}li a[data-v-0fea1b4d],p a[data-v-0fea1b4d]{font-weight:600;color:#fff}input[data-v-0fea1b4d],textarea[data-v-0fea1b4d]{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;margin:10px 0 20px;font-size:15px;padding:5px;background:#444;border:#000;border-bottom:1px solid #44f;color:#fff}label[data-v-0fea1b4d]{font-family:Segoe UI,Roboto,Helvetica Neue,-apple-system,BlinkMacSystemFont,Arial,sans-serif}button[data-v-0fea1b4d],label[data-v-0fea1b4d]{text-transform:uppercase;letter-spacing:.15em;font-size:13px}button[data-v-0fea1b4d]{background:0 0;border:1px solid #7f7ff8;color:#7f7ff8;border-radius:1000px 1000px;padding:10px;width:100%;font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-transition:all .25s ease;transition:all .25s ease;cursor:pointer;outline:0}button[data-v-0fea1b4d]:active{outline:1px dotted #666}button[data-v-0fea1b4d]:hover{background:#44f;color:#fff;border-color:#44f}button[type=submit][data-v-0fea1b4d]{background:#44f;border:none;color:#fff}.hidden[data-v-0fea1b4d]{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}ul.site-links[data-v-0fea1b4d]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-weight:500;padding-left:0;list-style:none;text-transform:uppercase;font-size:20px;margin-top:3px;opacity:.8}.site-links li[data-v-0fea1b4d],.social-links svg[data-v-0fea1b4d]{display:inline-block;padding-right:15px}.glitch[data-v-0fea1b4d],.social-links a[data-v-0fea1b4d]{color:#fff}.glitch[data-v-0fea1b4d]{position:relative;mix-blend-mode:lighten}.glitch[data-v-0fea1b4d]:after,.glitch[data-v-0fea1b4d]:before{content:attr(data-text);position:absolute;top:0;width:100%;background:#141618;clip:rect(0,0,0,0)}.glitch[data-v-0fea1b4d]:before{left:-1px;text-shadow:4px 0 rgba(255,0,0,.7);animation:glitch-loop-1-data-v-0fea1b4d .8s ease-in-out infinite alternate-reverse}.glitch[data-v-0fea1b4d]:after{left:1px;text-shadow:-7px 0 rgba(0,0,255,.7);animation:glitch-loop-2-data-v-0fea1b4d 1s ease-in-out infinite alternate-reverse}@-webkit-keyframes glitch-loop-1-data-v-0fea1b4d{0%{clip:rect(36px,9999px,9px,0)}25%{clip:rect(25px,9999px,99px,0)}50%{clip:rect(50px,9999px,102px,0)}75%{clip:rect(20px,9999px,92px,0)}to{clip:rect(100px,9999px,98px,0)}}@keyframes glitch-loop-1-data-v-0fea1b4d{0%{clip:rect(36px,9999px,9px,0)}25%{clip:rect(25px,9999px,99px,0)}50%{clip:rect(50px,9999px,102px,0)}75%{clip:rect(20px,9999px,92px,0)}to{clip:rect(100px,9999px,98px,0)}}@-webkit-keyframes glitch-loop-2-data-v-0fea1b4d{0%{top:-1px;left:1px;clip:rect(65px,9999px,119px,0)}25%{top:-8px;left:2px;clip:rect(79px,9999px,19px,0)}50%{top:-3px;left:2px;clip:rect(68px,9999px,11px,0)}75%{top:0;left:-2px;clip:rect(95px,9999px,53px,0)}to{top:-1px;left:-4px;clip:rect(31px,9999px,149px,0)}}@keyframes glitch-loop-2-data-v-0fea1b4d{0%{top:-1px;left:1px;clip:rect(65px,9999px,119px,0)}25%{top:-8px;left:2px;clip:rect(79px,9999px,19px,0)}50%{top:-3px;left:2px;clip:rect(68px,9999px,11px,0)}75%{top:0;left:-2px;clip:rect(95px,9999px,53px,0)}to{top:-1px;left:-4px;clip:rect(31px,9999px,149px,0)}}thead[data-v-0fea1b4d]{font-family:Helvetica,Segoe UI,Tahoma,Geneva,Verdana,sans-serif;color:#888;text-align:left;border-bottom:1px solid #666}thead th[data-v-0fea1b4d]{font-weight:400;letter-spacing:.05em;font-size:14px}table[data-v-0fea1b4d]{border-collapse:collapse}td[data-v-0fea1b4d],th[data-v-0fea1b4d]{border-bottom:1px solid #4b4a4a;padding:.8rem 0;text-align:left}tr[data-v-0fea1b4d]{-webkit-transition:all .15s ease;transition:all .15s ease}tr[data-v-0fea1b4d]:hover{background-color:hsla(0,0%,100%,.05)}.list-item[data-v-0fea1b4d]{-webkit-transition:all 1s;transition:all 1s}.list-enter[data-v-0fea1b4d],.list-leave-to[data-v-0fea1b4d]{opacity:0;-webkit-transform:translateY(30px);transform:translateY(30px)}.list-leave-active[data-v-0fea1b4d]{position:absolute}pre[data-v-0fea1b4d]{white-space:pre-wrap;background:#ddd;border-radius:4px;padding:8px}article ul[data-v-0fea1b4d]{margin-top:0}main[data-v-0fea1b4d]{display:grid;grid-gap:8vmin;grid-template-columns:1fr 2fr 2fr}.projectheading[data-v-0fea1b4d]{grid-column:1/2;position:fixed}.codepen[data-v-0fea1b4d]{grid-column:2/3;font-size:18px}.codepen a[data-v-0fea1b4d],.codepen a[data-v-0fea1b4d]:-webkit-any-link,.codepen a[data-v-0fea1b4d]:active,.codepen a[data-v-0fea1b4d]:visited{text-decoration:none;color:#fff!important;font-weight:700}.github[data-v-0fea1b4d]{grid-column:3}h1[data-v-0fea1b4d]{-webkit-transform:rotate(90deg);transform:rotate(90deg);position:absolute;left:80px;top:0;-webkit-transform-origin:0 0;transform-origin:0 0;font-size:8vmin}.codepen h3[data-v-0fea1b4d]{margin-top:30px}button[data-v-0fea1b4d]{margin:15px 0;color:#ec633a}button[data-v-0fea1b4d],button[data-v-0fea1b4d]:hover{border:1px solid #ec633a}button[data-v-0fea1b4d]:hover{background:#ec633a}a[data-v-0fea1b4d],a[data-v-0fea1b4d]:active,a[data-v-0fea1b4d]:visited,p a[data-v-0fea1b4d],p a[data-v-0fea1b4d]:active,p a[data-v-0fea1b4d]:visited{text-decoration:none;color:#fff;font-weight:700}.github h3[data-v-0fea1b4d]{padding-bottom:5px;font-size:25px}.github h3 a[data-v-0fea1b4d]{color:#dcdbdb;font-weight:400}.github h3 a[data-v-0fea1b4d]:hover{color:#fff}.projectblurb[data-v-0fea1b4d]{bottom:8vmin;position:fixed;line-height:1.4;width:210px}@media screen and (max-width:1000px){main[data-v-0fea1b4d]{grid-gap:5vmin;margin:4vmin;grid-template:"a" "b" "c"}.projectheading[data-v-0fea1b4d]{grid-area:a;position:relative;height:150px;margin:30px 0}.projectheading h1[data-v-0fea1b4d]{left:40px;font-size:40px}.projectheading .projectblurb[data-v-0fea1b4d]{position:relative;bottom:auto;margin-left:70px}.codepen[data-v-0fea1b4d]{grid-area:b}.github[data-v-0fea1b4d]{grid-area:c}}a[data-v-429e21cc],a[data-v-429e21cc]:active,a[data-v-429e21cc]:visited{text-decoration:none;color:#fff}[data-v-429e21cc],[data-v-429e21cc]:after,[data-v-429e21cc]:before{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0}body[data-v-429e21cc],html[data-v-429e21cc]{height:100%}body[data-v-429e21cc]{margin:0;padding:0;overflow:hidden}main[data-v-429e21cc]{height:100%;margin:8vmin}main.blogpost[data-v-429e21cc]{margin:0!important}.logo[data-v-429e21cc],h1[data-v-429e21cc],h2[data-v-429e21cc],h3[data-v-429e21cc],h4[data-v-429e21cc]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;text-transform:uppercase;font-weight:500;font-style:normal;color:#fff}h2[data-v-429e21cc]{font-size:40px}h3[data-v-429e21cc]{font-size:30px}code[data-v-429e21cc]{background:#eee;padding:4px 10px;border-radius:6px}.tag[data-v-429e21cc]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;text-transform:uppercase;font-weight:500;font-style:normal;margin:10px 10px 10px 0;display:inline-block;font-size:13px;padding:4px 20px;border-radius:2px;color:#7f7ff8;border:1px solid #7f7ff8}li[data-v-429e21cc],p[data-v-429e21cc]{color:#b5b3b3;font-size:18px;font-display:swap}li a[data-v-429e21cc],p a[data-v-429e21cc]{font-weight:600;color:#fff}input[data-v-429e21cc],textarea[data-v-429e21cc]{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;margin:10px 0 20px;font-size:15px;padding:5px;background:#444;border:#000;border-bottom:1px solid #44f;color:#fff}label[data-v-429e21cc]{font-family:Segoe UI,Roboto,Helvetica Neue,-apple-system,BlinkMacSystemFont,Arial,sans-serif}button[data-v-429e21cc],label[data-v-429e21cc]{text-transform:uppercase;letter-spacing:.15em;font-size:13px}button[data-v-429e21cc]{background:0 0;border:1px solid #7f7ff8;color:#7f7ff8;border-radius:1000px 1000px;padding:10px;width:100%;font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-transition:all .25s ease;transition:all .25s ease;cursor:pointer;outline:0}button[data-v-429e21cc]:active{outline:1px dotted #666}button[data-v-429e21cc]:hover{background:#44f;color:#fff;border-color:#44f}button[type=submit][data-v-429e21cc]{background:#44f;border:none;color:#fff}.hidden[data-v-429e21cc]{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}ul.site-links[data-v-429e21cc]{font-family:Gotham XNarrow A,Gotham XNarrow B,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-weight:500;padding-left:0;list-style:none;text-transform:uppercase;font-size:20px;margin-top:3px;opacity:.8}.site-links li[data-v-429e21cc],.social-links svg[data-v-429e21cc]{display:inline-block;padding-right:15px}.glitch[data-v-429e21cc],.social-links a[data-v-429e21cc]{color:#fff}.glitch[data-v-429e21cc]{position:relative;mix-blend-mode:lighten}.glitch[data-v-429e21cc]:after,.glitch[data-v-429e21cc]:before{content:attr(data-text);position:absolute;top:0;width:100%;background:#141618;clip:rect(0,0,0,0)}.glitch[data-v-429e21cc]:before{left:-1px;text-shadow:4px 0 rgba(255,0,0,.7);animation:glitch-loop-1-data-v-429e21cc .8s ease-in-out infinite alternate-reverse}.glitch[data-v-429e21cc]:after{left:1px;text-shadow:-7px 0 rgba(0,0,255,.7);animation:glitch-loop-2-data-v-429e21cc 1s ease-in-out infinite alternate-reverse}@-webkit-keyframes glitch-loop-1-data-v-429e21cc{0%{clip:rect(36px,9999px,9px,0)}25%{clip:rect(25px,9999px,99px,0)}50%{clip:rect(50px,9999px,102px,0)}75%{clip:rect(20px,9999px,92px,0)}to{clip:rect(100px,9999px,98px,0)}}@keyframes glitch-loop-1-data-v-429e21cc{0%{clip:rect(36px,9999px,9px,0)}25%{clip:rect(25px,9999px,99px,0)}50%{clip:rect(50px,9999px,102px,0)}75%{clip:rect(20px,9999px,92px,0)}to{clip:rect(100px,9999px,98px,0)}}@-webkit-keyframes glitch-loop-2-data-v-429e21cc{0%{top:-1px;left:1px;clip:rect(65px,9999px,119px,0)}25%{top:-8px;left:2px;clip:rect(79px,9999px,19px,0)}50%{top:-3px;left:2px;clip:rect(68px,9999px,11px,0)}75%{top:0;left:-2px;clip:rect(95px,9999px,53px,0)}to{top:-1px;left:-4px;clip:rect(31px,9999px,149px,0)}}@keyframes glitch-loop-2-data-v-429e21cc{0%{top:-1px;left:1px;clip:rect(65px,9999px,119px,0)}25%{top:-8px;left:2px;clip:rect(79px,9999px,19px,0)}50%{top:-3px;left:2px;clip:rect(68px,9999px,11px,0)}75%{top:0;left:-2px;clip:rect(95px,9999px,53px,0)}to{top:-1px;left:-4px;clip:rect(31px,9999px,149px,0)}}thead[data-v-429e21cc]{font-family:Helvetica,Segoe UI,Tahoma,Geneva,Verdana,sans-serif;color:#888;text-align:left;border-bottom:1px solid #666}thead th[data-v-429e21cc]{font-weight:400;letter-spacing:.05em;font-size:14px}table[data-v-429e21cc]{border-collapse:collapse}td[data-v-429e21cc],th[data-v-429e21cc]{border-bottom:1px solid #4b4a4a;padding:.8rem 0;text-align:left}tr[data-v-429e21cc]{-webkit-transition:all .15s ease;transition:all .15s ease}tr[data-v-429e21cc]:hover{background-color:hsla(0,0%,100%,.05)}.list-item[data-v-429e21cc]{-webkit-transition:all 1s;transition:all 1s}.list-enter[data-v-429e21cc],.list-leave-to[data-v-429e21cc]{opacity:0;-webkit-transform:translateY(30px);transform:translateY(30px)}.list-leave-active[data-v-429e21cc]{position:absolute}pre[data-v-429e21cc]{white-space:pre-wrap;background:#ddd;border-radius:4px;padding:8px}article ul[data-v-429e21cc]{margin-top:0}footer[data-v-429e21cc]{background:#141618;position:relative;color:#fff;text-align:center;width:100vw;padding:50px 8vw 30px}footer div[data-v-429e21cc],footer hr[data-v-429e21cc]{margin-bottom:30px}footer hr[data-v-429e21cc]{opacity:.1}footer .site-links[data-v-429e21cc],footer p[data-v-429e21cc]{margin-bottom:30px}footer p[data-v-429e21cc]{opacity:.7}</style> </head> <body data-n-head=""> <div data-server-rendered="true" id="__nuxt"><!----><div id="__layout"><div><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" width="1" height="1" role="presentation" class="hidden"><defs><linearGradient id="grad1" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:#505050;stop-opacity:1"></stop> <stop offset="100%" style="stop-color:#c8c8c8;stop-opacity:1"></stop></linearGradient></defs></svg> <nav data-v-9b59b55a><a href="/" data-v-9b59b55a><svg xmlns="http://www.w3.org/2000/svg" viewBox="100 150 385 450" width="50" height="50" aria-labelledby="fern" role="presentation" data-v-23cb9e66 data-v-9b59b55a><title id="fern" lang="en" data-v-23cb9e66>Fern Icon</title> <g data-v-23cb9e66><path d="M402.768,420.896c6.936-3.065,15.188-5.879,24.471-9.164c9.47-3.35,30.715-15.18,29.606-20.304 c-2.265-6.066-38.039,12.122-46.367,18.354c-0.069-0.514,4.316-5.685,4.795-6.242c1.354-1.578,2.723-3.291,4.097-4.959 c1.846-2.242,3.896-4.168,6.037-6.145c4.162-3.841,8.332-7.845,11.966-12.397c3.599-4.51,5.198-5.843,8.363-11.311 c2.104-3.633,3.689-11.148,2.632-12.604c-0.887-0.926-11.666,4.616-19.727,13.35c-6.309,6.834-11.679,14.456-16.063,23.178 c-1.428,2.84-2.421,5.922-4.312,8.516c1.252-5.812,3.358-12.843,3.018-20.051c-0.339-7.188-0.473-21.746-4.187-23.98 c-2.159-1.059-6.377,18.68-6.378,27.107c0,4.039,0.194,8.279,0.323,12.397c0.135,4.283,0.493,8.671,0.108,12.505 c-0.148,1.479-1.584,2.593-2.372,3.45c1.083-8.316,0.832-16.407-1.06-22.962c-1.906-6.607-6.34-27.207-8.043-27.184 c-3.853,0.334-2.732,23.922-1.785,32.679c0.645,5.965,3.062,12.973,4.743,18.222c0.543,1.693,1.355,4.066,1.186,5.498 c-0.171,1.44-2.241,3.152-2.803,4.096c-1.84-10.328-3.405-20.708-7.367-29.107c-2.747-5.822-6.599-10.208-11.714-14.122 c-2.353-1.8-7.235-4.908-8.193-3.989c-3.566,4.596,2.523,22.645,7.331,30.509c4.942,8.086,10.664,15.431,15.416,23.394 c-1.056,1.926-2.146,3.818-3.45,5.497c-4.633-8.033-6.767-17.521-12.937-23.824c-4.642-4.741-10.713-7.558-16.752-11.019 c-2.062-1.182-5.912-2.54-6.856-2.133c-2.271,1.419,6.497,18.698,12.937,25.01c6.449,6.322,15.092,10.282,20.482,17.572 c-0.796,1.755-2.757,4.594-3.486,6.415c-0.833-0.43-1.275-1.328-1.833-2.048c-3.969-5.123-8.515-13.836-14.066-17.605 c-6.5-4.413-18.64-9.739-22.018-9.671c-2.857,0.158,13.673,21.687,25.341,27.544c4.163,2.091,7.024,4.409,9.772,7.494 c-4.79,9.979-7.613,19.677-10.743,31.315c-12.672-32.642-25.293-65.332-41.396-94.543c3.493-2.698,7.262-5.099,11.212-7.438 c3.904-2.312,8.083-4.274,12.182-6.468c8.092-4.331,16.483-8.48,24.902-12.397c14.602-6.792,29.08-14.356,38.271-27.058 c1.759-2.432,6.253-7.893,3.233-8.301c-12.273-2.086-23.821,0.104-32.341,3.881c-8.793,3.898-16.019,9.401-22.746,14.985 c-12.884,10.693-23.893,23.267-35.252,35.575c-0.7,0.759-1.37,1.612-2.264,2.156c-0.85-1.666-0.241-0.808-1.075-2.49 c5.698-10.351,11.699-21.545,19.617-30.066c7.841-8.438,15.079-14.194,22.306-23.336c7.187-9.089,11.479-16.47,18.966-29.446 c2.083-3.61,5.065-9.622,10.48-24.955c0.988-2.798,5.989-12.976,4.737-17.777c-0.798-3.054-16.64,13.62-24.7,21.271 c-8.581,8.145-16.05,18.858-23.272,28.427c-14.534,19.254-21.554,44.901-31.129,69.395c-0.54-0.751-5.069-6.12-5.093-6.762 c-0.026-0.707,1.237-2.642,1.617-3.557c7.576-18.27,15.381-35.863,22.53-54.549c3.787-9.898,7.207-20.075,7.978-33.203 c0.666-11.338-1.539-22.834-3.126-32.449c-0.404-2.444-1.356-7.921-3.773-6.253c-1.561,1.078-3.258,3.412-4.42,5.175 c-8.955,13.583-13.941,30.267-17.464,49.266c-4.049,21.836-4.339,46.18-7.654,68.563c-0.365,0.101-11.102-17.221-13.543-20.623 c1.766-11.144,6.406-19.536,8.262-27.893c2.52-11.338,3.313-22.562,2.693-35.572c-1.011-21.241-6.69-39.989-10.814-57.291 c-0.567-2.378-2.642-9.734-4.971-9.652c-2.209,0.077-2.384,6.161-2.648,8.541c-1.842,16.596-2.993,34.478-4.097,51.827 c-1.252,19.69,1.585,46.461,5.779,62.795c0.056,0.324-11.479-13.297-14.834-16.979c2.062-9.388,2.867-21.499,1.401-31.694 c-1.396-9.709-4.566-18.665-7.654-26.843c-5.435-14.397-12.68-28.195-20.674-40.455c-1.159-1.777-4.002-6.582-5.572-7.191 c-0.738-0.269-1.214,0.642-1.244,4.309c0.149,4.706,2.5,28.495,5.591,43.024c3.116,14.643,7.7,27.953,18.808,48.722 c-0.268,0.207-7.365-7.119-8.121-7.875c-7.07-7.07-14.818-14.715-18.312-21.204c-5.38-9.992-10.926-22.414-21.906-33.394 c-8.153-8.153-22.127-17.274-29.001-21.007c-10.849-5.89-29.446-13.974-28.947-9.482c0.7,6.302,13.476,27.45,34.937,44.918 c7.492,6.099,26.047,15.519,34.936,19.964c2.995,1.497,15.634,15.104,15.472,15.472c-10.624-3.472-33.634-12.767-45.621-15.655 c-6.098-1.47-13.417-2.098-20.375-1.617c-9.097,0.629-17.392,3.24-18.65,3.773c-1.368,0.58-3.741,1.856-2.695,3.019 c9.713,6.822,23.927,12.759,39.428,14.474c12.528,1.386,36.809,4.138,50.277,4.729c2.085,0.092,4.341-0.116,5.929,0.324 c1.057,0.292,14.25,13.28,14.126,13.765c-17.895-3.092-40.236-8.592-60.266-10.316c-18.854-1.622-41.385,0.14-52.533,7.987 c-2.066,1.454-5.998,5.096-3.45,6.468c11.658,5.294,41.847,7.631,62.667,8.722c21.777,1.142,41.93-1.721,57.782-7.654 c7.45,8.182,11.7,13.714,17.798,22.888c-19.789-2.712-39.98-6.436-61.017-7.87c-22.291-1.52-45.36-0.156-62.094,5.714 c-11.386,3.994-32.662,14.672-30.077,15.955c10.174,5.297,23.266,7.331,37.516,7.331c14.618,0,27.779-2.298,40.534-4.312 c13.259-2.093,25.574-3.977,38.809-6.037c11.035-1.718,22.765-3.286,35.36-3.881c1.818-0.085,4.658-0.329,5.713,0 c0.79,0.246,8.233,10.233,9.99,13.664c-20.485-0.285-41.171,3.693-62.322,4.111c-6.967,0.138-13.941,0.133-20.59,0.863 c-22.312,2.449-38.282,11.715-52.824,22.208c-1.959,1.414-4.527,3.358-5.821,4.959c-0.583,0.721-1.725,2.812-1.126,3.082 c11.238,4.246,27.756,2.87,39.612,0.799c12.528-2.188,24.415-5.235,35.898-8.086c23.679-5.878,46.635-17.202,70.407-22.545 c1.749,2.132,4.458,7.204,5.847,9.696c-16.79,5.816-33.927,10.508-47.757,18.973c-13.919,8.52-24.75,19.713-35.575,31.155 c-2.642-2.783-16.423-16.752-17.059-14.378c-0.396,1.595,5.2,17.864,8.111,24.188c-0.848,0.938-2.878,3.229-4.312,4.743 c-6.947-6.205-27.25-24.679-27.465-22.652c-0.499,5.275,14.342,26.077,20.027,35.157c2.976,4.754,6.277,8.476,10.349,11.967 c3.472,2.976,7.343,5.853,10.672,8.839c0.445,0.4,1.208,0.938,1.078,1.294c-1.138-0.408-2.373-0.714-3.773-1.077 c-1.291-0.336-2.971-0.324-4.097-0.863c-0.88-0.422-18.312-22.315-25.563-30.685c-8.741-10.088-17.354-16.366-32.651-19.767 c-2.494-0.503,2.488,7.945,4.851,11.427c10.053,14.804,25.634,24.396,39.672,34.82c0.525,0.39,1.385,0.658,1.293,1.078 c-12.278-4.726-23.481-11.194-37.084-14.984c-6.671-1.859-14.549-3.45-22.639-3.45c-8.229,0-13.016,2.191-19.528,4.312 c-2.22,0.776-1.216,1.651,0,2.695c8.841,7.062,20.144,9.527,34.621,10.888c7.317,0.688,14.799,0.998,21.884,1.94 c7.011,0.932,13.542,2.894,19.728,4.097c-11.314,1.913-22.694,2.483-31.586,6.576c-4.314,1.985-8.009,4.7-11.427,7.653 c-3.325,2.874-7.157,5.975-8.409,10.565c-0.021,1.562,13.813,0.756,19.512-0.755c15.876-4.209,27.697-12.355,41.289-19.189 c1.194-0.6,2.78-1.669,3.666-1.725c1.07-0.067,3.355,0.765,4.527,1.078c1.568,0.419,2.998,0.97,4.42,1.186 c-6.86,2.34-13.516,4.066-19.621,6.684c-18.338,7.865-42.464,27.318-45.362,40.843c-0.357,1.654,26.571-11.107,41.785-20.409 c5.864-3.585,11.798-7.956,16.513-12.671c4.783-4.783,9.999-8.708,16.17-11.858c3.663,1.512,7.725,2.624,11.643,3.881 c-6.688,2.892-13.412,6.103-20.159,9.271c-13.41,6.297-27.184,15.523-35.888,26.669c-4.323,5.536-10.303,19.114-7.449,18.285 c30.753-10.213,55.75-26.178,71.581-51.314c3.413,1.151,8.887,3.359,12.229,4.581c-5.59,4.45-11.563,8.204-17.437,12.345 c-5.888,4.149-12.117,7.798-17.249,12.828c-5.231,5.128-12.104,14.034-15.421,20.743c-3.239,6.551-8.846,15.893-7.541,16.449 c6.869-0.081,26.519-14.063,36.114-25.765c4.535-5.531,27.767-33.754,28.279-33.527c2.924,1.297,5.988,2.887,8.624,4.097 c-8.866,7.808-18.128,14.837-25.118,24.579c-6.94,9.673-22.013,37.613-20.196,39.122c0.525,0.476,15.07-10.89,19.464-14.973 c8.587-7.978,14.202-16.09,19.964-26.951c2.192-4.132,5.426-12.016,8.15-15.74c0.847-1.158,1.652-2.521,2.911-3.343 c23.984,12.726,44.791,28.509,61.663,48.728c0.892,1.068,2.568,3.619,3.45,3.881c0.835,0.249,2.187-0.021,3.233,0 c2.818,0.057,6.064,0.669,8.948,0.539c-1.049-16.474-3.355-36.804-0.442-53.112c5.948,16.224,11.291,34.537,15.966,52.034 c2.049,0.898,5.557,0.337,8.193,0.647c-5.241-21.232-12.623-42.615-20.052-62.526c-0.548-1.469-1.602-3.207-1.51-4.636 c0.239-3.685,1.432-7.97,2.372-11.427c2.876-10.57,6.75-21.105,11.104-30.077c10.311,2.843,17.057,6.418,26.705,9.934 c9.157,3.336,27.804,5.422,35.714,3.11c0.819-0.268-2.296-4.02-4.097-5.498c-1.804-1.48-3.628-2.979-5.606-4.204 c-4.06-2.513-8.739-4.333-13.906-5.714c-10.498-2.806-23.114-2.655-36.329-2.587c0.835-1.896,1.814-3.647,2.91-5.282 c11.625-0.855,21.08,2.529,31.909,2.695c5.516,0.084,14.219-0.389,19.232-0.947c5.183-0.578,17.382-1.905,16.265-4.106 c-2.194-4.01-22.622-7.99-33.771-7.99c-10.925-0.001-20.836,2.403-30.185,4.419c0.816-1.482,1.624-2.975,2.694-4.204 c10.409-1.611,21.488-2.637,30.832-5.39c9.206-2.713,31.189-11.618,29.464-17.264c-0.973-2.607-37.674,7.245-56.51,16.422 C396.618,426.138,401.73,421.354,402.768,420.896z M236.211,482.666c-3.259-5.951-5.706-12.408-8.839-18.326 c-3.15-5.946-7.167-11.002-11.428-15.739c0.979-0.661,2.605-1.573,3.45-2.264c7.599,15.437,20.287,25.78,29,40.103 C244.439,485.075,240.374,483.822,236.211,482.666z M255.508,488.812c-5.287-12.877-9.877-26.993-15.847-39.456 c-1.487-3.103-3.113-6.089-5.175-8.732c-0.623-0.799-1.175-1.532-1.833-2.479c3.39-1.354,6.89-3.172,10.133-4.312 c3.286,22.91,9.676,42.717,20.698,57.89C261.046,490.964,258.083,489.793,255.508,488.812z M356.196,554.14 c-0.453,0.161-0.58-0.446-0.755-0.646c-17.833-20.361-39.795-37.264-65.329-50.021c3.037-12.596,3.84-24.18,4.535-35.055 c0.469-7.351-2.768-16.837-5.49-24.954c-0.436-1.149-3.273,3.139-4.991,5.49c-2.905,3.977-1.794,9.015-2.776,14.786 c-1.371,8.058,0.28,25.64,3.332,37.037c-3.73-1.552-7.309-3.256-10.996-4.851c-2.213-12.921-4.972-25.995-8.84-37.516 c-3.802-11.326-14.631-22.1-20.544-25.273c14.042-5.91,25.773-11.217,36.176-20.327c5.264-4.61,9.516-9.834,14.338-14.554 c4.976-4.871,10.827-8.627,16.817-12.613c0.877,1.063,1.397,2.484,2.155,3.666c-0.988,1.575-2.374,2.864-3.665,4.204 c-9.158,9.508-17.875,19.479-25.98,30.292c-4.483,5.981-8.734,12.491-11.212,20.914c-1.579,5.369-2.954,14.125-1.509,21.345 c0.499,2.495,1.848,5.446,2.919,5.367c1.436-0.106,3.377-2.177,4.519-3.318c8.575-8.575,16.409-17.997,22.962-28.244 c7.814-12.222,13.772-25.437,16.602-41.828c15.676,29.712,27.655,62.579,40.318,95.837c0.448,1.177-2.235,23.185-2.803,30.293 C355.197,533.994,355.558,544.007,356.196,554.14z" class="fernpath" data-v-23cb9e66></path></g></svg> <span class="logo" data-v-9b59b55a>Sarah Drasner</span></a> <ul class="site-links" data-v-6150acad data-v-9b59b55a><li data-v-6150acad><a href="/writing" data-v-6150acad>writing</a></li> <li data-v-6150acad><a href="/speaking" data-v-6150acad>speaking</a></li> <li data-v-6150acad><a href="/projects" class="nuxt-link-exact-active nuxt-link-active" data-v-6150acad>projects</a></li></ul></nav> <main data-v-0fea1b4d><section class="projectheading" data-v-0fea1b4d><h1 data-v-0fea1b4d>Projects</h1> <div class="projectblurb" data-v-0fea1b4d><p data-v-0fea1b4d> Follow me on <a href="https://codepen.io/sdras/" name="codepen" data-v-0fea1b4d><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 32 32" aria-labelledby="codepen" role="presentation" data-v-0fea1b4d><title id="codepen" lang="en">codepen</title> <path fill="currentColor" d="M29.555 11.501l-14-9.333c-0.336-0.224-0.774-0.224-1.109 0l-14 9.333c-0.278 0.185-0.445 0.498-0.445 0.832v9.333c0 0.334 0.167 0.647 0.445 0.832l14 9.333c0.168 0.112 0.361 0.168 0.555 0.168s0.387-0.056 0.555-0.168l14-9.333c0.278-0.185 0.445-0.498 0.445-0.832v-9.333c0-0.334-0.167-0.647-0.445-0.832zM15 20.465l-5.197-3.465 5.197-3.465 5.197 3.465-5.197 3.465zM16 11.798v-6.93l11.197 7.465-5.197 3.465-6-4zM14 11.798l-6 4-5.197-3.465 11.197-7.465v6.93zM6.197 17l-4.197 2.798v-5.596l4.197 2.798zM8 18.202l6 4v6.93l-11.197-7.465 5.197-3.465zM16 22.202l6-4 5.197 3.465-11.197 7.465v-6.93zM23.803 17l4.197-2.798v5.596l-4.197-2.798z"></path></svg> CodePen </a> <br data-v-0fea1b4d>or <a href="https://github.com/sdras" name="github" data-v-0fea1b4d><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 32 32" aria-labelledby="github" role="presentation" data-v-0fea1b4d><title id="github" lang="en">github</title> <path fill="currentColor" d="M16 0.395c-8.836 0-16 7.163-16 16 0 7.069 4.585 13.067 10.942 15.182 0.8 0.148 1.094-0.347 1.094-0.77 0-0.381-0.015-1.642-0.022-2.979-4.452 0.968-5.391-1.888-5.391-1.888-0.728-1.849-1.776-2.341-1.776-2.341-1.452-0.993 0.11-0.973 0.11-0.973 1.606 0.113 2.452 1.649 2.452 1.649 1.427 2.446 3.743 1.739 4.656 1.33 0.143-1.034 0.558-1.74 1.016-2.14-3.554-0.404-7.29-1.777-7.29-7.907 0-1.747 0.625-3.174 1.649-4.295-0.166-0.403-0.714-2.030 0.155-4.234 0 0 1.344-0.43 4.401 1.64 1.276-0.355 2.645-0.532 4.005-0.539 1.359 0.006 2.729 0.184 4.008 0.539 3.054-2.070 4.395-1.64 4.395-1.64 0.871 2.204 0.323 3.831 0.157 4.234 1.026 1.12 1.647 2.548 1.647 4.295 0 6.145-3.743 7.498-7.306 7.895 0.574 0.497 1.085 1.47 1.085 2.963 0 2.141-0.019 3.864-0.019 4.391 0 0.426 0.288 0.925 1.099 0.768 6.354-2.118 10.933-8.113 10.933-15.18 0-8.837-7.164-16-16-16z"></path></svg> GitHub </a> if you want, I suppose. </p></div></section> <section class="codepen" data-v-0fea1b4d><h2 data-v-0fea1b4d>CodePen</h2> <div data-v-0fea1b4d><h3 data-v-0fea1b4d>React Animated Page Transitions</h3> <p data-v-0fea1b4d>Just a small demo to show a few page transitions in React. Using GreenSock and SVG.</p> <a href="https://codepen.io/sdras/full/gWWQgb" target="_blank" data-v-0fea1b4d><button data-v-0fea1b4d>See pen ⟶</button></a> <iframe height="400" scrolling="no" title="React Animated Page Transitions" src="//codepen.io/jfksdca/embed/gWWQgb/?height=400&theme-id=22041&default-tab=result" frameborder="no" allowtransparency="true" allowfullscreen style="width:100%" data-v-0fea1b4d> See the Pen <a href="https://codepen.io/sdras/gWWQgb" data-v-0fea1b4d>React Animated Page Transitions</a> by Sarah Drasner ( <a href="https://codepen.io/sdras" data-v-0fea1b4d>@sdras</a>) on <a href="https://codepen.io" data-v-0fea1b4d>CodePen</a>. </iframe></div><div data-v-0fea1b4d><h3 data-v-0fea1b4d>Vue-controlled Wall-E</h3> <p data-v-0fea1b4d>I found this dribbble shot of Wall-E that I loved, and wanted to see if I could manipulate him with Vue bindings. https://dribbble.com/shots/2758895-Wall-e Uses Vue, GreenSock, and SVG</p> <a href="https://codepen.io/sdras/full/YZBGNp" target="_blank" data-v-0fea1b4d><button data-v-0fea1b4d>See pen ⟶</button></a> <iframe height="400" scrolling="no" title="Vue-controlled Wall-E" src="//codepen.io/jfksdca/embed/YZBGNp/?height=400&theme-id=22041&default-tab=result" frameborder="no" allowtransparency="true" allowfullscreen style="width:100%" data-v-0fea1b4d> See the Pen <a href="https://codepen.io/sdras/YZBGNp" data-v-0fea1b4d>Vue-controlled Wall-E</a> by Sarah Drasner ( <a href="https://codepen.io/sdras" data-v-0fea1b4d>@sdras</a>) on <a href="https://codepen.io" data-v-0fea1b4d>CodePen</a>. </iframe></div><div data-v-0fea1b4d><h3 data-v-0fea1b4d>Vue Time Comparison</h3> <p data-v-0fea1b4d>Using the browser's native API for .toLocaleTimeString to get rid of libraries like moment.js for world time that respects daylight savings. Made with Vue, SVG, GreenSock, and 🤘🏼 The dial was built off of this dribbble shot with minor tweaks: https://dribbble.com/shots/2196737-Day-048-Speedometer and the graphic was a purchased game backround</p> <a href="https://codepen.io/sdras/full/RZGqxR" target="_blank" data-v-0fea1b4d><button data-v-0fea1b4d>See pen ⟶</button></a> <iframe height="400" scrolling="no" title="Vue Time Comparison" src="//codepen.io/jfksdca/embed/RZGqxR/?height=400&theme-id=22041&default-tab=result" frameborder="no" allowtransparency="true" allowfullscreen style="width:100%" data-v-0fea1b4d> See the Pen <a href="https://codepen.io/sdras/RZGqxR" data-v-0fea1b4d>Vue Time Comparison</a> by Sarah Drasner ( <a href="https://codepen.io/sdras" data-v-0fea1b4d>@sdras</a>) on <a href="https://codepen.io" data-v-0fea1b4d>CodePen</a>. </iframe></div><div data-v-0fea1b4d><h3 data-v-0fea1b4d>JavaScript Array Explorer</h3> <p data-v-0fea1b4d>When I was first learning array methods, I spent a lot of time digging through the docs to find the appropriate one, and I had to search one by one. I made this resource to help people find the correct array method a bit more naturally. You can narrow down what you want to do and explore until you find what's most useful to you. All of the code is MIT open source and hosted on github if you'd like to see how this is made: https://github.com/sdras/array-explorer/.</p> <a href="https://codepen.io/sdras/full/gogVRX" target="_blank" data-v-0fea1b4d><button data-v-0fea1b4d>See pen ⟶</button></a> <iframe height="400" scrolling="no" title="JavaScript Array Explorer" src="//codepen.io/jfksdca/embed/gogVRX/?height=400&theme-id=22041&default-tab=result" frameborder="no" allowtransparency="true" allowfullscreen style="width:100%" data-v-0fea1b4d> See the Pen <a href="https://codepen.io/sdras/gogVRX" data-v-0fea1b4d>JavaScript Array Explorer</a> by Sarah Drasner ( <a href="https://codepen.io/sdras" data-v-0fea1b4d>@sdras</a>) on <a href="https://codepen.io" data-v-0fea1b4d>CodePen</a>. </iframe></div><div data-v-0fea1b4d><h3 data-v-0fea1b4d>💥 Boom 💥</h3> <p data-v-0fea1b4d>What I think about when I think about nuclear power races</p> <a href="https://codepen.io/sdras/full/VpYeNj" target="_blank" data-v-0fea1b4d><button data-v-0fea1b4d>See pen ⟶</button></a> <iframe height="400" scrolling="no" title="💥 Boom 💥" src="//codepen.io/jfksdca/embed/VpYeNj/?height=400&theme-id=22041&default-tab=result" frameborder="no" allowtransparency="true" allowfullscreen style="width:100%" data-v-0fea1b4d> See the Pen <a href="https://codepen.io/sdras/VpYeNj" data-v-0fea1b4d>💥 Boom 💥</a> by Sarah Drasner ( <a href="https://codepen.io/sdras" data-v-0fea1b4d>@sdras</a>) on <a href="https://codepen.io" data-v-0fea1b4d>CodePen</a>. </iframe></div><div data-v-0fea1b4d><h3 data-v-0fea1b4d>Example Motion Design Docs</h3> <p data-v-0fea1b4d>Showing how motion design documentation can communicate branding and a direction for cohesive animation on a site. Illustrations by Kristen Kong.</p> <a href="https://codepen.io/sdras/full/JbaGwg" target="_blank" data-v-0fea1b4d><button data-v-0fea1b4d>See pen ⟶</button></a> <iframe height="400" scrolling="no" title="Example Motion Design Docs" src="//codepen.io/jfksdca/embed/JbaGwg/?height=400&theme-id=22041&default-tab=result" frameborder="no" allowtransparency="true" allowfullscreen style="width:100%" data-v-0fea1b4d> See the Pen <a href="https://codepen.io/sdras/JbaGwg" data-v-0fea1b4d>Example Motion Design Docs</a> by Sarah Drasner ( <a href="https://codepen.io/sdras" data-v-0fea1b4d>@sdras</a>) on <a href="https://codepen.io" data-v-0fea1b4d>CodePen</a>. </iframe></div><div data-v-0fea1b4d><h3 data-v-0fea1b4d>Dynamically Generated Alt Text</h3> <p data-v-0fea1b4d>I kept hearing about machine learning being used for evil and wanted to use it for something good. Social media posts typically don't have a way to enter alt text and the only users I see that reliably remember to add descriptions to the post are accessibility experts or blind people. Hopefully this allows good alt text to be a bit more ubiquitous. You can find more information on how Azure's Computer Vision API works, as well as how to use it in your own projects here: https://aka.ms/Uzrshc</p> <a href="https://codepen.io/sdras/full/jawPGa" target="_blank" data-v-0fea1b4d><button data-v-0fea1b4d>See pen ⟶</button></a> <iframe height="400" scrolling="no" title="Dynamically Generated Alt Text" src="//codepen.io/jfksdca/embed/jawPGa/?height=400&theme-id=22041&default-tab=result" frameborder="no" allowtransparency="true" allowfullscreen style="width:100%" data-v-0fea1b4d> See the Pen <a href="https://codepen.io/sdras/jawPGa" data-v-0fea1b4d>Dynamically Generated Alt Text</a> by Sarah Drasner ( <a href="https://codepen.io/sdras" data-v-0fea1b4d>@sdras</a>) on <a href="https://codepen.io" data-v-0fea1b4d>CodePen</a>. </iframe></div></section> <section class="github" data-v-0fea1b4d><h2 data-v-0fea1b4d>GitHub</h2> <table data-v-0fea1b4d><tbody data-v-0fea1b4d><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/animated-guide-vue3" data-v-0fea1b4d>animated guide vue3</a> <!----></h3> <p data-v-0fea1b4d>✩ 141</p> <p data-v-0fea1b4d></p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/array-explorer" data-v-0fea1b4d>array explorer</a> <a href="https://arrayexplorer.netlify.com/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 2451</p> <p data-v-0fea1b4d>⚡️ A resource to help figure out what JavaScript array method would be best to use at any given time</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/awesome-actions" data-v-0fea1b4d>awesome actions</a> <!----></h3> <p data-v-0fea1b4d>✩ 13566</p> <p data-v-0fea1b4d>A curated list of awesome actions to use on GitHub</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/Benchmarking-Animations" data-v-0fea1b4d>Benchmarking Animations</a> <!----></h3> <p data-v-0fea1b4d>✩ 6</p> <p data-v-0fea1b4d>Writing the same simple animation in a loop in SMIL, Canvas, CSS, and Velocity for benchmarking purposes.</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/building-web-apps-with-vue" data-v-0fea1b4d>building web apps with vue</a> <!----></h3> <p data-v-0fea1b4d>✩ 221</p> <p data-v-0fea1b4d>building-web-app-with-vue</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/career-ladders" data-v-0fea1b4d>career ladders</a> <a href="https://career-ladders.dev/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 505</p> <p data-v-0fea1b4d>A sample of career ladders I use for my organization, open sourced for anyone.</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/cda-locale" data-v-0fea1b4d>cda locale</a> <a href="https://cda-locale.netlify.com/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 101</p> <p data-v-0fea1b4d>Showing Microsoft Cloud Developer Advocates speaking, 2017 and 2018</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/contentful-nuxt-netlify" data-v-0fea1b4d>contentful nuxt netlify</a> <a href="https://contentful-nuxt-example.netlify.com/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 41</p> <p data-v-0fea1b4d>Example setup for Contentful and Nuxt on Netlify</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/cssgridgenerator" data-v-0fea1b4d>cssgridgenerator</a> <a href="https://cssgrid-generator.netlify.com/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 3716</p> <p data-v-0fea1b4d>🧮 Generate basic CSS Grid code to make dynamic layouts!</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/d3-example-ignitetour" data-v-0fea1b4d>d3 example ignitetour</a> <!----></h3> <p data-v-0fea1b4d>✩ 21</p> <p data-v-0fea1b4d> This repo serves as an example for Microsoft Ignite the Tour. In this session, we explore how to create basic charts and graphs using d3.</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/data-in-motion" data-v-0fea1b4d>data in motion</a> <!----></h3> <p data-v-0fea1b4d>✩ 14</p> <p data-v-0fea1b4d>My talk about the importance of animation in data visualizations</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/design-for-developers" data-v-0fea1b4d>design for developers</a> <a href="https://frontendmasters.com/courses/design-for-developers/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 607</p> <p data-v-0fea1b4d>Design for Developers Workshop</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/devex-utm-builder" data-v-0fea1b4d>devex utm builder</a> <!----></h3> <p data-v-0fea1b4d>✩ 7</p> <p data-v-0fea1b4d></p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/docs-extensionpack" data-v-0fea1b4d>docs extensionpack</a> <!----></h3> <p data-v-0fea1b4d>✩ 53</p> <p data-v-0fea1b4d>A collection of extensions for writing, editing, and reviewing documentation in VS Code</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/easiest-netlify-lambda-example" data-v-0fea1b4d>easiest netlify lambda example</a> <!----></h3> <p data-v-0fea1b4d>✩ 4</p> <p data-v-0fea1b4d></p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/ecommerce-netlify" data-v-0fea1b4d>ecommerce netlify</a> <a href="https://ecommerce-netlify.netlify.app/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 1217</p> <p data-v-0fea1b4d>🛍 A JAMstack Ecommerce Site built with Nuxt and Netlify Functions</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/example-azure-node" data-v-0fea1b4d>example azure node</a> <!----></h3> <p data-v-0fea1b4d>✩ 68</p> <p data-v-0fea1b4d>An example Node webapp deployed with GitHub actions</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/favegame" data-v-0fea1b4d>favegame</a> <a href="https://hasura-nuxt-demo.netlify.app/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 41</p> <p data-v-0fea1b4d>Small starter example of Hasura, Nuxt, and Netlify for Jamstack/SSR rendering</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/firefighter-demo" data-v-0fea1b4d>firefighter demo</a> <a href="https://sdras.github.io/firefighter-demo/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 66</p> <p data-v-0fea1b4d>🚨 Demo to improve an existing firefighter app by making it queue tasks offline</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/fortnite-vscode-theme" data-v-0fea1b4d>fortnite vscode theme</a> <a href="https://marketplace.visualstudio.com/items?itemName=sdras.fortnite-vscode-theme" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 140</p> <p data-v-0fea1b4d></p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/frontendmasters-svganimation" data-v-0fea1b4d>frontendmasters svganimation</a> <!----></h3> <p data-v-0fea1b4d>✩ 193</p> <p data-v-0fea1b4d>Frontend Masters- Advanced SVG Animation Course</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/gsap-player" data-v-0fea1b4d>gsap player</a> <!----></h3> <p data-v-0fea1b4d>✩ 92</p> <p data-v-0fea1b4d>A small, customizable youtube-like player for gsap timelines</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/headless-wp-nuxt2" data-v-0fea1b4d>headless wp nuxt2</a> <!----></h3> <p data-v-0fea1b4d>✩ 31</p> <p data-v-0fea1b4d></p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/hero-generator" data-v-0fea1b4d>hero generator</a> <a href="https://hero-generator.netlify.app/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 567</p> <p data-v-0fea1b4d>🦸🏻♀️Hero Generator! Create a nice hero image for your site or app</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/inbedby7pm" data-v-0fea1b4d>inbedby7pm</a> <a href="https://marketplace.visualstudio.com/items?itemName=sdras.inbedby7pm" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 113</p> <p data-v-0fea1b4d>My other theme was for Night Owls like myself. This theme was requested for by the "In Bed by 7pm" crowd</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/intro-to-vue" data-v-0fea1b4d>intro to vue</a> <a href="https://frontendmasters.com/workshops/vue-v2/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 2558</p> <p data-v-0fea1b4d>Workshop Materials for my Introduction to Vue.js Workshop</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/is-this-a-sandwich" data-v-0fea1b4d>is this a sandwich</a> <a href="https://isthisasandwich.netlify.com/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 97</p> <p data-v-0fea1b4d>Is this a sandwich?</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/jamstack-template" data-v-0fea1b4d>jamstack template</a> <!----></h3> <p data-v-0fea1b4d>✩ 9</p> <p data-v-0fea1b4d></p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/JAMstack-Workshop" data-v-0fea1b4d>JAMstack Workshop</a> <!----></h3> <p data-v-0fea1b4d>✩ 62</p> <p data-v-0fea1b4d>Workshop materials for JAMstack workshop using Vue and Netlify.</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/JS-stroll" data-v-0fea1b4d>JS stroll</a> <!----></h3> <p data-v-0fea1b4d>✩ 213</p> <p data-v-0fea1b4d>Rewriting code from other languages or other technologies into Vanilla JS and SVG for fun and practice.</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/livecode-svganimation" data-v-0fea1b4d>livecode svganimation</a> <!----></h3> <p data-v-0fea1b4d>✩ 95</p> <p data-v-0fea1b4d>In my Smashing Toronto talk, I'll be live coding an SVG animation from start to finish. Here's the repo that houses the base materials, and any further references for things we don't have time to cover.</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/netlify-functions-example" data-v-0fea1b4d>netlify functions example</a> <!----></h3> <p data-v-0fea1b4d>✩ 58</p> <p data-v-0fea1b4d></p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/night-owl-vscode-theme" data-v-0fea1b4d>night owl vscode theme</a> <a href="https://aka.ms/nightowl" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 2256</p> <p data-v-0fea1b4d>🌌 NIGHT OWL: A VS Code dark theme for contrast for nighttime coding, 🦉 LIGHT OWL: a daytime light theme</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/object-explorer" data-v-0fea1b4d>object explorer</a> <a href="https://objectexplorer.netlify.com/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 1367</p> <p data-v-0fea1b4d>🔥 A resource to help figure out what JavaScript object method would be best to use at any given time</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/page-transitions-simple" data-v-0fea1b4d>page transitions simple</a> <!----></h3> <p data-v-0fea1b4d>✩ 156</p> <p data-v-0fea1b4d>Vue/Nuxt Page Transitions- Simple Demonstration</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/page-transitions-travelapp" data-v-0fea1b4d>page transitions travelapp</a> <a href="https://pagetransitions.netlify.app/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 1608</p> <p data-v-0fea1b4d>Travel App, Native-like Page Transitions</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/perfmatters-demo" data-v-0fea1b4d>perfmatters demo</a> <!----></h3> <p data-v-0fea1b4d>✩ 11</p> <p data-v-0fea1b4d>demo for perfmatters conf https://perfmattersconf.com/</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/productive-twitter" data-v-0fea1b4d>productive twitter</a> <a href="https://chrome.google.com/webstore/detail/productive-twitter/elgfikcdihncknnnedljbbignlmnppii" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 156</p> <p data-v-0fea1b4d>Chrome extension: Minimal and friendly theme for productive twitter use</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/project-explorer" data-v-0fea1b4d>project explorer</a> <a href="https://sdras.github.io/project-explorer-site/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 486</p> <p data-v-0fea1b4d> 🎋A CLI tool to create an annotated tree visualization of any project</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/react-aframe-demo1" data-v-0fea1b4d>react aframe demo1</a> <!----></h3> <p data-v-0fea1b4d>✩ 16</p> <p data-v-0fea1b4d>React A-Frame Demo 1</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/sample-stripe-handler" data-v-0fea1b4d>sample stripe handler</a> <a href="https://shoppity.azurewebsites.net/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 156</p> <p data-v-0fea1b4d>Serverless function that uses the stripe api for a checkout process in a Vue application</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/sample-vue-shop" data-v-0fea1b4d>sample vue shop</a> <a href="https://shoppity.azurewebsites.net/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 1180</p> <p data-v-0fea1b4d>See readme for newer repo details! A sample shop that shows how to manage payments with Vue, Stripe, and Serverless Functions</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/sdras" data-v-0fea1b4d>sdras</a> <!----></h3> <p data-v-0fea1b4d>✩ 22</p> <p data-v-0fea1b4d>it me!</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/smashing" data-v-0fea1b4d>smashing</a> <a href="https://smashingtoronto.netlify.com/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 68</p> <p data-v-0fea1b4d>This was the result of a live code talk at Smashing Conf in Toronto, this is how far I got in 45 minutes</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/smashing-template" data-v-0fea1b4d>smashing template</a> <!----></h3> <p data-v-0fea1b4d>✩ 11</p> <p data-v-0fea1b4d>a base of the smashing talk</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/svg-workshop" data-v-0fea1b4d>svg workshop</a> <a href="https://frontendmasters.com/courses/svg-essentials-animation/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 656</p> <p data-v-0fea1b4d>Materials for SVG Essentials & Animation Course</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/three-vue-pattern" data-v-0fea1b4d>three vue pattern</a> <a href="https://sdras.github.io/three-vue-pattern/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 96</p> <p data-v-0fea1b4d>A biofeedback visualization made with Three.js, Vue, and LUIS (cognitive services), made with Brian Holt</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/Transform_intro" data-v-0fea1b4d>Transform_intro</a> <!----></h3> <p data-v-0fea1b4d>✩ 6</p> <p data-v-0fea1b4d>Introduction to Transforms, with the use of a transition in a class applied to all examples</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/vue-directory-tree" data-v-0fea1b4d>vue directory tree</a> <a href="https://sdras.github.io/vue-directory-tree/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 161</p> <p data-v-0fea1b4d>A visualization of relevant files for vue repo, along with notes</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/vue-hooks-foodapp" data-v-0fea1b4d>vue hooks foodapp</a> <a href="https://sdras.github.io/vue-hooks-foodapp/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 181</p> <p data-v-0fea1b4d>A food app using a few hooks in Vue to show how they can work (experimental)</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/vue-sample-svg-icons" data-v-0fea1b4d>vue sample svg icons</a> <a href="https://sdras.github.io/vue-sample-svg-icons/" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 426</p> <p data-v-0fea1b4d>An opinionated example of how to use SVG icons in a Vue.js application</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/vue-sublime-snippets" data-v-0fea1b4d>vue sublime snippets</a> <!----></h3> <p data-v-0fea1b4d>✩ 146</p> <p data-v-0fea1b4d>Simplify and supercharging my workflow with snippets for Vue.js that help me spin things up quickly</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/vue-vscode-extensionpack" data-v-0fea1b4d>vue vscode extensionpack</a> <!----></h3> <p data-v-0fea1b4d>✩ 269</p> <p data-v-0fea1b4d>The extensions I use when developing a Vue application with VS Code</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/vue-vscode-snippets" data-v-0fea1b4d>vue vscode snippets</a> <a href="https://marketplace.visualstudio.com/items?itemName=sdras.vue-vscode-snippets" target="_blank" data-v-0fea1b4d>· Site</a></h3> <p data-v-0fea1b4d>✩ 1119</p> <p data-v-0fea1b4d>These snippets were built to supercharge my workflow in the most seamless manner possible.</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/vue-weather-notifier" data-v-0fea1b4d>vue weather notifier</a> <!----></h3> <p data-v-0fea1b4d>✩ 193</p> <p data-v-0fea1b4d>A small SVG animation illustrating a weather app notification in Vue</p></td></tr><tr data-v-0fea1b4d><td data-v-0fea1b4d><h3 data-v-0fea1b4d><a href="https://github.com/sdras/vue-wine-label" data-v-0fea1b4d>vue wine label</a> <!----></h3> <p data-v-0fea1b4d>✩ 55</p> <p data-v-0fea1b4d>A very silly demo showing how to make a wine label making dashboard with Vue.js</p></td></tr></tbody></table></section></main> <footer data-v-429e21cc><div data-v-429e21cc><a href="/" data-v-429e21cc><svg xmlns="http://www.w3.org/2000/svg" viewBox="100 150 385 450" width="50" height="50" aria-labelledby="fern" role="presentation" data-v-23cb9e66 data-v-429e21cc><title id="fern" lang="en" data-v-23cb9e66>Fern Icon</title> <g data-v-23cb9e66><path d="M402.768,420.896c6.936-3.065,15.188-5.879,24.471-9.164c9.47-3.35,30.715-15.18,29.606-20.304 c-2.265-6.066-38.039,12.122-46.367,18.354c-0.069-0.514,4.316-5.685,4.795-6.242c1.354-1.578,2.723-3.291,4.097-4.959 c1.846-2.242,3.896-4.168,6.037-6.145c4.162-3.841,8.332-7.845,11.966-12.397c3.599-4.51,5.198-5.843,8.363-11.311 c2.104-3.633,3.689-11.148,2.632-12.604c-0.887-0.926-11.666,4.616-19.727,13.35c-6.309,6.834-11.679,14.456-16.063,23.178 c-1.428,2.84-2.421,5.922-4.312,8.516c1.252-5.812,3.358-12.843,3.018-20.051c-0.339-7.188-0.473-21.746-4.187-23.98 c-2.159-1.059-6.377,18.68-6.378,27.107c0,4.039,0.194,8.279,0.323,12.397c0.135,4.283,0.493,8.671,0.108,12.505 c-0.148,1.479-1.584,2.593-2.372,3.45c1.083-8.316,0.832-16.407-1.06-22.962c-1.906-6.607-6.34-27.207-8.043-27.184 c-3.853,0.334-2.732,23.922-1.785,32.679c0.645,5.965,3.062,12.973,4.743,18.222c0.543,1.693,1.355,4.066,1.186,5.498 c-0.171,1.44-2.241,3.152-2.803,4.096c-1.84-10.328-3.405-20.708-7.367-29.107c-2.747-5.822-6.599-10.208-11.714-14.122 c-2.353-1.8-7.235-4.908-8.193-3.989c-3.566,4.596,2.523,22.645,7.331,30.509c4.942,8.086,10.664,15.431,15.416,23.394 c-1.056,1.926-2.146,3.818-3.45,5.497c-4.633-8.033-6.767-17.521-12.937-23.824c-4.642-4.741-10.713-7.558-16.752-11.019 c-2.062-1.182-5.912-2.54-6.856-2.133c-2.271,1.419,6.497,18.698,12.937,25.01c6.449,6.322,15.092,10.282,20.482,17.572 c-0.796,1.755-2.757,4.594-3.486,6.415c-0.833-0.43-1.275-1.328-1.833-2.048c-3.969-5.123-8.515-13.836-14.066-17.605 c-6.5-4.413-18.64-9.739-22.018-9.671c-2.857,0.158,13.673,21.687,25.341,27.544c4.163,2.091,7.024,4.409,9.772,7.494 c-4.79,9.979-7.613,19.677-10.743,31.315c-12.672-32.642-25.293-65.332-41.396-94.543c3.493-2.698,7.262-5.099,11.212-7.438 c3.904-2.312,8.083-4.274,12.182-6.468c8.092-4.331,16.483-8.48,24.902-12.397c14.602-6.792,29.08-14.356,38.271-27.058 c1.759-2.432,6.253-7.893,3.233-8.301c-12.273-2.086-23.821,0.104-32.341,3.881c-8.793,3.898-16.019,9.401-22.746,14.985 c-12.884,10.693-23.893,23.267-35.252,35.575c-0.7,0.759-1.37,1.612-2.264,2.156c-0.85-1.666-0.241-0.808-1.075-2.49 c5.698-10.351,11.699-21.545,19.617-30.066c7.841-8.438,15.079-14.194,22.306-23.336c7.187-9.089,11.479-16.47,18.966-29.446 c2.083-3.61,5.065-9.622,10.48-24.955c0.988-2.798,5.989-12.976,4.737-17.777c-0.798-3.054-16.64,13.62-24.7,21.271 c-8.581,8.145-16.05,18.858-23.272,28.427c-14.534,19.254-21.554,44.901-31.129,69.395c-0.54-0.751-5.069-6.12-5.093-6.762 c-0.026-0.707,1.237-2.642,1.617-3.557c7.576-18.27,15.381-35.863,22.53-54.549c3.787-9.898,7.207-20.075,7.978-33.203 c0.666-11.338-1.539-22.834-3.126-32.449c-0.404-2.444-1.356-7.921-3.773-6.253c-1.561,1.078-3.258,3.412-4.42,5.175 c-8.955,13.583-13.941,30.267-17.464,49.266c-4.049,21.836-4.339,46.18-7.654,68.563c-0.365,0.101-11.102-17.221-13.543-20.623 c1.766-11.144,6.406-19.536,8.262-27.893c2.52-11.338,3.313-22.562,2.693-35.572c-1.011-21.241-6.69-39.989-10.814-57.291 c-0.567-2.378-2.642-9.734-4.971-9.652c-2.209,0.077-2.384,6.161-2.648,8.541c-1.842,16.596-2.993,34.478-4.097,51.827 c-1.252,19.69,1.585,46.461,5.779,62.795c0.056,0.324-11.479-13.297-14.834-16.979c2.062-9.388,2.867-21.499,1.401-31.694 c-1.396-9.709-4.566-18.665-7.654-26.843c-5.435-14.397-12.68-28.195-20.674-40.455c-1.159-1.777-4.002-6.582-5.572-7.191 c-0.738-0.269-1.214,0.642-1.244,4.309c0.149,4.706,2.5,28.495,5.591,43.024c3.116,14.643,7.7,27.953,18.808,48.722 c-0.268,0.207-7.365-7.119-8.121-7.875c-7.07-7.07-14.818-14.715-18.312-21.204c-5.38-9.992-10.926-22.414-21.906-33.394 c-8.153-8.153-22.127-17.274-29.001-21.007c-10.849-5.89-29.446-13.974-28.947-9.482c0.7,6.302,13.476,27.45,34.937,44.918 c7.492,6.099,26.047,15.519,34.936,19.964c2.995,1.497,15.634,15.104,15.472,15.472c-10.624-3.472-33.634-12.767-45.621-15.655 c-6.098-1.47-13.417-2.098-20.375-1.617c-9.097,0.629-17.392,3.24-18.65,3.773c-1.368,0.58-3.741,1.856-2.695,3.019 c9.713,6.822,23.927,12.759,39.428,14.474c12.528,1.386,36.809,4.138,50.277,4.729c2.085,0.092,4.341-0.116,5.929,0.324 c1.057,0.292,14.25,13.28,14.126,13.765c-17.895-3.092-40.236-8.592-60.266-10.316c-18.854-1.622-41.385,0.14-52.533,7.987 c-2.066,1.454-5.998,5.096-3.45,6.468c11.658,5.294,41.847,7.631,62.667,8.722c21.777,1.142,41.93-1.721,57.782-7.654 c7.45,8.182,11.7,13.714,17.798,22.888c-19.789-2.712-39.98-6.436-61.017-7.87c-22.291-1.52-45.36-0.156-62.094,5.714 c-11.386,3.994-32.662,14.672-30.077,15.955c10.174,5.297,23.266,7.331,37.516,7.331c14.618,0,27.779-2.298,40.534-4.312 c13.259-2.093,25.574-3.977,38.809-6.037c11.035-1.718,22.765-3.286,35.36-3.881c1.818-0.085,4.658-0.329,5.713,0 c0.79,0.246,8.233,10.233,9.99,13.664c-20.485-0.285-41.171,3.693-62.322,4.111c-6.967,0.138-13.941,0.133-20.59,0.863 c-22.312,2.449-38.282,11.715-52.824,22.208c-1.959,1.414-4.527,3.358-5.821,4.959c-0.583,0.721-1.725,2.812-1.126,3.082 c11.238,4.246,27.756,2.87,39.612,0.799c12.528-2.188,24.415-5.235,35.898-8.086c23.679-5.878,46.635-17.202,70.407-22.545 c1.749,2.132,4.458,7.204,5.847,9.696c-16.79,5.816-33.927,10.508-47.757,18.973c-13.919,8.52-24.75,19.713-35.575,31.155 c-2.642-2.783-16.423-16.752-17.059-14.378c-0.396,1.595,5.2,17.864,8.111,24.188c-0.848,0.938-2.878,3.229-4.312,4.743 c-6.947-6.205-27.25-24.679-27.465-22.652c-0.499,5.275,14.342,26.077,20.027,35.157c2.976,4.754,6.277,8.476,10.349,11.967 c3.472,2.976,7.343,5.853,10.672,8.839c0.445,0.4,1.208,0.938,1.078,1.294c-1.138-0.408-2.373-0.714-3.773-1.077 c-1.291-0.336-2.971-0.324-4.097-0.863c-0.88-0.422-18.312-22.315-25.563-30.685c-8.741-10.088-17.354-16.366-32.651-19.767 c-2.494-0.503,2.488,7.945,4.851,11.427c10.053,14.804,25.634,24.396,39.672,34.82c0.525,0.39,1.385,0.658,1.293,1.078 c-12.278-4.726-23.481-11.194-37.084-14.984c-6.671-1.859-14.549-3.45-22.639-3.45c-8.229,0-13.016,2.191-19.528,4.312 c-2.22,0.776-1.216,1.651,0,2.695c8.841,7.062,20.144,9.527,34.621,10.888c7.317,0.688,14.799,0.998,21.884,1.94 c7.011,0.932,13.542,2.894,19.728,4.097c-11.314,1.913-22.694,2.483-31.586,6.576c-4.314,1.985-8.009,4.7-11.427,7.653 c-3.325,2.874-7.157,5.975-8.409,10.565c-0.021,1.562,13.813,0.756,19.512-0.755c15.876-4.209,27.697-12.355,41.289-19.189 c1.194-0.6,2.78-1.669,3.666-1.725c1.07-0.067,3.355,0.765,4.527,1.078c1.568,0.419,2.998,0.97,4.42,1.186 c-6.86,2.34-13.516,4.066-19.621,6.684c-18.338,7.865-42.464,27.318-45.362,40.843c-0.357,1.654,26.571-11.107,41.785-20.409 c5.864-3.585,11.798-7.956,16.513-12.671c4.783-4.783,9.999-8.708,16.17-11.858c3.663,1.512,7.725,2.624,11.643,3.881 c-6.688,2.892-13.412,6.103-20.159,9.271c-13.41,6.297-27.184,15.523-35.888,26.669c-4.323,5.536-10.303,19.114-7.449,18.285 c30.753-10.213,55.75-26.178,71.581-51.314c3.413,1.151,8.887,3.359,12.229,4.581c-5.59,4.45-11.563,8.204-17.437,12.345 c-5.888,4.149-12.117,7.798-17.249,12.828c-5.231,5.128-12.104,14.034-15.421,20.743c-3.239,6.551-8.846,15.893-7.541,16.449 c6.869-0.081,26.519-14.063,36.114-25.765c4.535-5.531,27.767-33.754,28.279-33.527c2.924,1.297,5.988,2.887,8.624,4.097 c-8.866,7.808-18.128,14.837-25.118,24.579c-6.94,9.673-22.013,37.613-20.196,39.122c0.525,0.476,15.07-10.89,19.464-14.973 c8.587-7.978,14.202-16.09,19.964-26.951c2.192-4.132,5.426-12.016,8.15-15.74c0.847-1.158,1.652-2.521,2.911-3.343 c23.984,12.726,44.791,28.509,61.663,48.728c0.892,1.068,2.568,3.619,3.45,3.881c0.835,0.249,2.187-0.021,3.233,0 c2.818,0.057,6.064,0.669,8.948,0.539c-1.049-16.474-3.355-36.804-0.442-53.112c5.948,16.224,11.291,34.537,15.966,52.034 c2.049,0.898,5.557,0.337,8.193,0.647c-5.241-21.232-12.623-42.615-20.052-62.526c-0.548-1.469-1.602-3.207-1.51-4.636 c0.239-3.685,1.432-7.97,2.372-11.427c2.876-10.57,6.75-21.105,11.104-30.077c10.311,2.843,17.057,6.418,26.705,9.934 c9.157,3.336,27.804,5.422,35.714,3.11c0.819-0.268-2.296-4.02-4.097-5.498c-1.804-1.48-3.628-2.979-5.606-4.204 c-4.06-2.513-8.739-4.333-13.906-5.714c-10.498-2.806-23.114-2.655-36.329-2.587c0.835-1.896,1.814-3.647,2.91-5.282 c11.625-0.855,21.08,2.529,31.909,2.695c5.516,0.084,14.219-0.389,19.232-0.947c5.183-0.578,17.382-1.905,16.265-4.106 c-2.194-4.01-22.622-7.99-33.771-7.99c-10.925-0.001-20.836,2.403-30.185,4.419c0.816-1.482,1.624-2.975,2.694-4.204 c10.409-1.611,21.488-2.637,30.832-5.39c9.206-2.713,31.189-11.618,29.464-17.264c-0.973-2.607-37.674,7.245-56.51,16.422 C396.618,426.138,401.73,421.354,402.768,420.896z M236.211,482.666c-3.259-5.951-5.706-12.408-8.839-18.326 c-3.15-5.946-7.167-11.002-11.428-15.739c0.979-0.661,2.605-1.573,3.45-2.264c7.599,15.437,20.287,25.78,29,40.103 C244.439,485.075,240.374,483.822,236.211,482.666z M255.508,488.812c-5.287-12.877-9.877-26.993-15.847-39.456 c-1.487-3.103-3.113-6.089-5.175-8.732c-0.623-0.799-1.175-1.532-1.833-2.479c3.39-1.354,6.89-3.172,10.133-4.312 c3.286,22.91,9.676,42.717,20.698,57.89C261.046,490.964,258.083,489.793,255.508,488.812z M356.196,554.14 c-0.453,0.161-0.58-0.446-0.755-0.646c-17.833-20.361-39.795-37.264-65.329-50.021c3.037-12.596,3.84-24.18,4.535-35.055 c0.469-7.351-2.768-16.837-5.49-24.954c-0.436-1.149-3.273,3.139-4.991,5.49c-2.905,3.977-1.794,9.015-2.776,14.786 c-1.371,8.058,0.28,25.64,3.332,37.037c-3.73-1.552-7.309-3.256-10.996-4.851c-2.213-12.921-4.972-25.995-8.84-37.516 c-3.802-11.326-14.631-22.1-20.544-25.273c14.042-5.91,25.773-11.217,36.176-20.327c5.264-4.61,9.516-9.834,14.338-14.554 c4.976-4.871,10.827-8.627,16.817-12.613c0.877,1.063,1.397,2.484,2.155,3.666c-0.988,1.575-2.374,2.864-3.665,4.204 c-9.158,9.508-17.875,19.479-25.98,30.292c-4.483,5.981-8.734,12.491-11.212,20.914c-1.579,5.369-2.954,14.125-1.509,21.345 c0.499,2.495,1.848,5.446,2.919,5.367c1.436-0.106,3.377-2.177,4.519-3.318c8.575-8.575,16.409-17.997,22.962-28.244 c7.814-12.222,13.772-25.437,16.602-41.828c15.676,29.712,27.655,62.579,40.318,95.837c0.448,1.177-2.235,23.185-2.803,30.293 C355.197,533.994,355.558,544.007,356.196,554.14z" class="fernpath" data-v-23cb9e66></path></g></svg></a></div> <ul class="site-links" data-v-6150acad data-v-429e21cc><li data-v-6150acad><a href="/writing" data-v-6150acad>writing</a></li> <li data-v-6150acad><a href="/speaking" data-v-6150acad>speaking</a></li> <li data-v-6150acad><a href="/projects" class="nuxt-link-exact-active nuxt-link-active" data-v-6150acad>projects</a></li></ul> <hr data-v-429e21cc> <p data-v-429e21cc>All materials © Sarah Drasner 2021</p> <div class="social-links" data-v-429e21cc><a href="https://twitter.com/sarah_edo" name="twitter" data-v-429e21cc><svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 32 32" aria-labelledby="twitter" role="presentation" data-v-429e21cc><title id="twitter" lang="en">twitter</title> <path fill="currentColor" d="M32 7.075c-1.175 0.525-2.444 0.875-3.769 1.031 1.356-0.813 2.394-2.1 2.887-3.631-1.269 0.75-2.675 1.3-4.169 1.594-1.2-1.275-2.906-2.069-4.794-2.069-3.625 0-6.563 2.938-6.563 6.563 0 0.512 0.056 1.012 0.169 1.494-5.456-0.275-10.294-2.888-13.531-6.862-0.563 0.969-0.887 2.1-0.887 3.3 0 2.275 1.156 4.287 2.919 5.463-1.075-0.031-2.087-0.331-2.975-0.819 0 0.025 0 0.056 0 0.081 0 3.181 2.263 5.838 5.269 6.437-0.55 0.15-1.131 0.231-1.731 0.231-0.425 0-0.831-0.044-1.237-0.119 0.838 2.606 3.263 4.506 6.131 4.563-2.25 1.762-5.075 2.813-8.156 2.813-0.531 0-1.050-0.031-1.569-0.094 2.913 1.869 6.362 2.95 10.069 2.95 12.075 0 18.681-10.006 18.681-18.681 0-0.287-0.006-0.569-0.019-0.85 1.281-0.919 2.394-2.075 3.275-3.394z"></path></svg></a> <a href="https://github.com/sdras" name="github" data-v-429e21cc><svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 32 32" aria-labelledby="github" role="presentation" data-v-429e21cc><title id="github" lang="en">github</title> <path fill="currentColor" d="M16 0.395c-8.836 0-16 7.163-16 16 0 7.069 4.585 13.067 10.942 15.182 0.8 0.148 1.094-0.347 1.094-0.77 0-0.381-0.015-1.642-0.022-2.979-4.452 0.968-5.391-1.888-5.391-1.888-0.728-1.849-1.776-2.341-1.776-2.341-1.452-0.993 0.11-0.973 0.11-0.973 1.606 0.113 2.452 1.649 2.452 1.649 1.427 2.446 3.743 1.739 4.656 1.33 0.143-1.034 0.558-1.74 1.016-2.14-3.554-0.404-7.29-1.777-7.29-7.907 0-1.747 0.625-3.174 1.649-4.295-0.166-0.403-0.714-2.030 0.155-4.234 0 0 1.344-0.43 4.401 1.64 1.276-0.355 2.645-0.532 4.005-0.539 1.359 0.006 2.729 0.184 4.008 0.539 3.054-2.070 4.395-1.64 4.395-1.64 0.871 2.204 0.323 3.831 0.157 4.234 1.026 1.12 1.647 2.548 1.647 4.295 0 6.145-3.743 7.498-7.306 7.895 0.574 0.497 1.085 1.47 1.085 2.963 0 2.141-0.019 3.864-0.019 4.391 0 0.426 0.288 0.925 1.099 0.768 6.354-2.118 10.933-8.113 10.933-15.18 0-8.837-7.164-16-16-16z"></path></svg></a> <a href="https://codepen.io/sdras/" name="codepen" data-v-429e21cc><svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 32 32" aria-labelledby="codepen" role="presentation" data-v-429e21cc><title id="codepen" lang="en">codepen</title> <path fill="currentColor" d="M29.555 11.501l-14-9.333c-0.336-0.224-0.774-0.224-1.109 0l-14 9.333c-0.278 0.185-0.445 0.498-0.445 0.832v9.333c0 0.334 0.167 0.647 0.445 0.832l14 9.333c0.168 0.112 0.361 0.168 0.555 0.168s0.387-0.056 0.555-0.168l14-9.333c0.278-0.185 0.445-0.498 0.445-0.832v-9.333c0-0.334-0.167-0.647-0.445-0.832zM15 20.465l-5.197-3.465 5.197-3.465 5.197 3.465-5.197 3.465zM16 11.798v-6.93l11.197 7.465-5.197 3.465-6-4zM14 11.798l-6 4-5.197-3.465 11.197-7.465v6.93zM6.197 17l-4.197 2.798v-5.596l4.197 2.798zM8 18.202l6 4v6.93l-11.197-7.465 5.197-3.465zM16 22.202l6-4 5.197 3.465-11.197 7.465v-6.93zM23.803 17l4.197-2.798v5.596l-4.197-2.798z"></path></svg></a></div></footer></div></div></div><script>window.__NUXT__=function(e,t,n,o,a,i,s,r,l,h,c,d,m,p,u,g,f,y,w,k,b,v,I,S,A,x,C,T,_,j,V,z,W,M,D,F,J,N,P,G,O,B,H,E,L,R,q,U,Y,K,$,Q,X,Z,ee,te,ne,oe,ae,ie,se,re,le,he,ce,de,me,pe,ue){return{layout:"default",data:[{}],error:o,state:{blogPosts:[{title:"Reflections on 2020",date:"January 1 2021",thumbnail:"/images/uploads/reflection.jpg",body:"The week that the World Health Organization announced that COVID was a pandemic, my husband started night sweating again. Night sweats are a symptom of his cancer, lymphoma, returning— it’s not a perfect indicator, but they historically correlate like clockwork to when the disease has spread in his body. As we reviewed the high-risk groups for complications of COVID, I saw “people over 70” on the list. That’s when my mom called to say that my stepdad, over 70 and a medical professional, was set to work the frontlines of care in San Francisco.\n\nI can’t remember if I physically curled up into a ball or if I just felt like I did. I had been watching the John Hopkins dashboard rise for weeks, the charts didn’t just show statistics, they revealed the threat posed to everyone I loved.\n\nWhen the doctors finally did confirm that Dizzy was relapsing, thankfully I had already processed this a bit and could instead concentrate on supporting him. Ever the optimist, Dizzy had felt that my worries were unfounded. Keep in mind, his optimism while dealing with a disease like his is a feature, not a bug. We’ve long suspected that he’s been able to recover from intensive chemo sessions and other treatments because he’s such a sweet and positive person.\n\n\n\nEven with that cognitive head start, nothing really prepared me for the eventual realization that if anything ever happened to Dizzy I would lose my stepchildren too. They mean the world to me — they are the sweetest, funniest, most loveable kids in the world and I’m sure I’m not biased.\n\n\n\n\n_Photo by Vera Davidova on Unsplash_\n\n## To Mask or Not to Mask\n\nWhat happened next was incredibly anxiety and anger-producing. The kids mom who we co-parent with doesn’t believe COVID is real, and doesn’t believe in masks. She taught them that COVID is a hoax, that wearing masks was impinging on their freedom, and that we were giving in to fear by trying to protect Dizzy or anyone else.\n\n\n\nUp until then when we talked about Dizzy being sick, we said just that- that he was sick and we have to fight it and they can use their masks to protect him, like a superhero wears a mask. We had not previously named his sickness to them as cancer as we didn’t want to scare them.\n\n\n\nWe both spent a lot of energy trying to understand what to do here. On the one hand, his very life was at stake. On the other, children feeling like they’re caught between two parents giving them completely different information about the world around them can be pretty detrimental to their well-being. On the third hand (...I guess that would be a foot?), beyond even COVID, really diving in and explaining the dangers of his cancer is a lot for a tiny, developing human brain to carry.\n\n\n\nWe sought council in therapy (my own therapist deserves some sort of medal of honor for the amount she taught me this year), friends, and each other.\n\n\n\nOne of my best friends gave me great advice and the tough love I needed: “I know you’re trying to protect them. But consider that if you don’t tell them the whole story and something does happen to their dad, that situation is much worse and they will wish you both would have been more clear with them.” My therapist said, “Fear, as an emotion, has a purpose. We are taught to dislike fear and shield ourselves from it. But that same fear is a biological response that helps keep us safe. I think it’s great that both of you don’t want your children to feel fear. But in this case, it’s a very useful emotion. You can tell them the truth and then help them get through it. For example: ‘I know this is scary. And I need you to understand it. How can I help comfort you in this moment while you process it.’”\n\n\n\nI won't go into too much detail here, but we did eventually have to convey the gravity of the situation, and it was incredibly hard for all of us.\n\n\n\nOur story isn’t unique. This year has been hard on everyone. But it feels meaningful to me to share the story of this year in its entirety, because well, the strangest and most comforting thing about a worldwide phenomenon is we’re all going through it together. We, none of us, are alone.\n\n## Strangely, Good News\n\n\n\nThis year has not been all bad. We’ve been traveling and going out less, which means we’ve created some new traditions in our family.\n\n\n\nWe got a karaoke microphone and little globe light that shoots stars everywhere, and did dance parties every night with the kids, jumping on a bed, for a while. We played epic hide and go seek games! Everyone else leveled up at Fortnite and Minecraft while I coded (predictably). We started making crepes on Saturday mornings. We got pretty good at it! Until I spilled batter everywhere and made several batches that tasted alternatively runny and like cardboard. We called the mistake “stovepancake” and ate waffles instead.\n\n**I wrote 25 posts this year**, my favorite of which are:\n* [Understanding Async Await](https://css-tricks.com/understanding-async-await/)\n* [How to Scope Down PRs](https://www.netlify.com/blog/2020/03/31/how-to-scope-down-prs/?utm_source=personalsite&utm_medium=scopedprs-sd&utm_campaign=devex)- which GitHub picked up on and interviewed me for their [State of the Octoverse](https://octoverse.github.com/)\n* [In Defense of a Fussy Website](https://css-tricks.com/in-defense-of-a-fussy-website/)\n* And a 60-odd page deep dive into how to make an [API with AWS using Lambda, DynamoDB, API Gateway, and Netlify (it has chapters!)](https://www.netlify.com/guides/creating-an-api-with-aws-lambda-dynamodb-and-api-gateway/)\n\nWe published the [new Vue documentation](https://v3.vuejs.org/), which I had the honor of working closely on with Ben Hong, Natalia Tepluhina, and Phan An. The major rewrites I worked on significantly were [to the reactivity](https://v3.vuejs.org/guide/reactivity.html) and [animation sections](https://v3.vuejs.org/guide/transitions-overview.html#class-based-animations-transitions) (I even used some animated explainers to walk through reactivity!). I was also in a [documentary about Vue](https://www.youtube.com/watch?v=OrxmtDw4pVI) by Honeypot! That was fun.\n\nI did two Frontend Masters courses this year, one was a refresh of my existing [Intro to Vue course](https://frontendmasters.com/courses/vue-3/), updated for Vue 3. The other was a brand new course called [Building Applications with Vue and Nuxt](https://frontendmasters.com/courses/vue-nuxt-apps/). I livecoded for 8 hours straight! What a wild ride. It certainly was an experiment that grew me and I had a great time with it- I built a game as well as a takeout application :). Marc and the Frontend Masters team put a lot of care into making the recording experience smooth and safe. Thank you!\n\nI spent the most time on my team at Netlify which are some of the brightest people I’ve ever had the opportunity to work with. Our org is quite unique, and I have a writeup coming out all about Developer Experience at Netlify in the new year!\n\nA couple of things I personally worked on that saw the light of day this year were the [Million Devs](https://million-devs.netlify.com/) project (I captured [some of the process here](https://css-tricks.com/the-making-of-netlifys-million-devs-svg-animation-site/)), and [Jamstack Explorers](https://explorers.netlify.com/). However, I am a VP now, and manage an org so I spend most of my time and energy at work unblocking others.\n\nThere have been a lot of posts lately about how it’s a bit silly to align any part of your identity to your job, and I get that. But I will say, I spend a lot of my time with the people I work with and they have really helped me get through this year. Together we build products we believe in, support each other, and make sure to tease each other mercilessly. They made this year not just bearable but enjoyable.\n\n## Learning (is hard)\n\nThe hardest things I learned this year have not been about development. **I learned how to create better boundaries.** This has always been a weakness of mine. I am the kind of person who says yes to everything and any goofy idea that comes into my head, so I had to spend a lot of time unpacking that my time is finite as well as my energy, and that where a person spends their time should ideally align with their values.\n\nThis is increasingly challenging as tech asks for more and more from me. The old saying goes, '[work expands so as to fill the time available](https://en.wikipedia.org/wiki/Parkinson%27s_law).' There’s a certain unhealthy expectation in tech that people be on call for you at any time, in any manner, for free. I think it’s related to Open Source (which I love), but I’m not quite sure. The thing is, I can’t even see everything anymore- I can’t scroll back and see notifications on twitter past 8 hours. Email is overwhelming. Same with github notifications. This year I really had to come to grips that I can’t do everything, and have to instead prioritize my time better. Don't get me wrong, I still work a lot and pull shifts I would not necessarily recommend to others, so I don't have this all figured out. All I can say is, I'm working on it.\n\n> Work expands so as to fill the time available...\n\nI used to feel incredibly guilty about saying no to anything. Ultimately, it didn't serve me well, as I started working from the moment I woke up to the moment I went to sleep, without any energy left for myself or my family and friends. I knew something had to give, and I had to be more purposeful. I’m not sure if that sounds callous or not- it was only a couple of years ago that I would have given anything to have people care enough in my projects to write me or file an issue!\n\nI’m now in a situation where I have to acknowledge that in order to stay healthy and support my family, I do have to align my time investment with my own values. I appreciate the support the community has given me here.\n\n## With a Little Help From My Friends\n\nTech aside, there are some very special people who have really made a difference this year. The list is too big to name each one, but I feel brighter, stronger and supported due to each and every one of you. Which really does show me that we get through these things by leaning on one another both ways, which is the ingredients for an embrace, if you think about it.\n\n\n_Drawing I did this year of the word Hope_\n\nI have no promises that next year will bring with it more clarity, but I have hope. And I hope it goes better for you, too.",tags:[l,w,p],path:"/blog/reflections-on-2020"},{title:"Why Netlify?",date:"April 27th 2019",thumbnail:"/images/uploads/celebrate4.webp",body:"I’ve taken a new position at [Netlify](https://www.netlify.com/) as **Head of Developer Experience**! I’m so excited for this change and it makes sense to provide a little context for those who are curious about general career decisions and arc. \n\nWork is where you spend the majority of your waking hours, so career decisions, though only being one aspect of your life, take up so much of our time. I wanted to work on a product that I think paves the road for the web ahead, smoothes pain points and frees people to focus on the tasks that are meaningful to them. For me, that’s Netlify. I’ve been using them for quite a while as a maintainer of the [Vue documentation](https://vuejs.org/) which uses Netlify for deploy and was so impressed with the experience. I came to think of it as a gold standard of developer experience for static sites, forms, and more.\n\n### Smaller for Big Changes\n\nThe company is large enough to create great impact yet small enough to adjust and adapt to the ever changing landscape with care and ease. After working at a few bigger companies as both full-time and consultant, I wanted to work at a smaller place where there was less bureaucracy and we could move quickly and do more with less. **_I’m at the point in my career where I really want to stir shit up._** Not only do I think this is possible at Netlify, but the company itself is making huge strides in this landscape and I’m excited to be a part of it.\n\n### The Company You Keep\n\nI paid close attention to who I would be working with, as that can also shape a job. The prospect of working with [Frances Berriman](https://twitter.com/phae) ([co-creator of PWAs](https://en.wikipedia.org/wiki/Progressive_web_applications#Characteristics)), [Phil Hawksworth](https://twitter.com/philhawksworth), [Divya Sasidharan](https://twitter.com/shortdiv), [Shawn Wang](https://twitter.com/swyx), and [David Calavera](https://twitter.com/calavera), among many other really impressive people, is exciting!\n\nAs we talked about what kind of job I would have at this company, I was surprised and delighted by how much [Matt Biilmann](https://twitter.com/biilmann) and [Chris Bach](https://twitter.com/Chr_Bach), the founders, genuinely listened and helped shape my position in a way that played to my strengths and career goals, while finding the focus that would make the most sense for the company. This way of refining, strategizing, and collaborating feels like they’ve already done so much due diligence towards setting me up for success and valuing me. I feel so much gratitude for their trust and investment.\n\nThis very post is now written on my new blog- I took my posts off Medium, moved my site over to Netlify, and created this new section. I primarily write for [CSS-Tricks](https://css-tricks.com/) but this is the home for more personal content. \n\nI'll be putting out a few posts on how I made this with Nuxt and Netlify CMS, along with a repo if you want to get started trying it out yourself.\n\nI couldn’t be more thrilled! **I start on May 13**, and you can look forward to a lot of advancements from me and my team in the coming months on making things even more easy to work with and understand!",tags:[l,p],path:"/blog/why-netlify"},{title:"Mourning as a Developer",date:"August 14th 2018",thumbnail:"/images/uploads/mourning-feature.jpg",body:'The title of this post is a little misleading- it’s not so different to mourn as a developer than a person with any other kind of job. But speaking as a developer, I’ll talk about my experiences through that lens, as I know no other.\n\nA friend of mine died last week. We weren’t best friends, but he was a great person whose company I loved, and, looking back at our digital history, realized we were there for each other through a lot of challenging times: heartbreak, harassment, job loss, and medical problems, to name a few. He was a wonderful person who was raunchy and hilarious and if you felt bad, would make you feel better by making fun of you and then giving you a sincere hug. In short, he was the best.\n\nIt’s also the two-year anniversary of the death of one of my best friends in the world. He and I dated and lived together for 4 years, and when we broke up, we remained great friends. I still remember this spooky (it gives me chills down my spine to think about it) feeling as he walked away the last time we hung out. Something felt wrong but I couldn’t put my finger on it. Not too long after, he was out for a morning hike. He was wearing sandals and tripped on a rock. He hit his head and he was gone.\n\n\n\nDuring these times of processing death, people often urge you to stop working. I’ve done that. It can help, sometimes. With Cameron, because we were so close, the pain was so deep I felt like it was swallowing me. I couldn’t do anything. Until I could. And the work helped, honestly. I couldn’t process what was going on in any real way when I wasn’t working. I oscillated between fits of despair and numbness. Everything felt blank, like I was out of my body. I couldn’t observe myself. It just pooled around me, and I dissolved.\n\nBut then in work, I found solace. In work, some part of me was occupied. When I was coding, I could detach enough to see myself, to see him, to see our history together, and the loss of what could have been our future friendship. One part of me was focused, and breathing, and occupied. I found that especially when I was doing tasks that I had already mastered, that’s when I could actually process Cameron’s passing.\n\nWhen I sat with the pain, for a little while it was too sharp- there was no room for me there. However, when I was involved in a programming task, my breathing steadied. I could step into it with a bit of cover, and embrace it in a way that didn’t feel so harmful.\n\nThe only caveat to this was QA. Though I usually appreciate QA’s comprehensive study of software and respect that it’s extremely grueling work, while I was mourning, my empathy levels were low. I found it hard to take tickets for edge cases. I felt exhausted if I wasn’t connected to the value of the task.\n\nSocializing when I was mourning was also especially taxing. I found I couldn’t relate to people who weren’t also mourning or hadn’t mourned for a little while. Everything seemed artificial or unimportant. When I was coding, however, I lost my sense of self or even others beyond the normal “what did they mean by this” as I read someone else’s code. I found that I had a bit more patience for refactoring. In a way, it helped- I didn’t have to invent something new, but to improve on what was there, and I could dive really far into that task without my usual hurry and hustle. If nothing was important anymore on the surface, I might as well make it great. Life is short, after all.\n\nI suppose the point of this post is- when you’re in mourning, do what is right for you. I had a lot of people urging me to stop working to process what was happening, in part because I was incredibly productive at this time, and that looks very unnatural from the outside. Hollywood teaches you that mourning is sitting on a bench looking at a tree. I tried that and it wasn’t my path.\n\nLooking back, I think coding really helped me. I don’t believe any two people will share the same process. What works for me might not work for you. But if you’re anything like me, and there’s guilt associated with doing what you need while you’re mourning, I suggest giving yourself a break. Love yourself and honor them in the way that feels healthy for you.',tags:[l,ce],path:"/blog/mourning-as-a-developer"},{title:"Reflections on 2018",date:"December 23rd 2018",thumbnail:"/images/uploads/mawwage2.svg",body:'When I opened the document to write this, I had to pause to remember what year it was. Life has been a blur lately. This is due to jetlag, due to the sheer amount of things going on, and it’s shaped the past year a lot.\n\nPersonally, this year has brought some great life changes. We added Beam to our little family. [If you read last year’s post](https://medium.com/@sarah_edo/feeling-happy-at-the-end-of-the-world-e3a9dab624bb), you’ll know about my dog Sudo. She’s a wise philosopher and mighty hunter. Beam, on the other hand, is a bit of a gremlin dumpling. He steals your stuff, he honks like a goose, he’s always destroying something. But he’s also the most affectionate and sweet little guy. He gets away with everything because of his face.\n\n\n\nI also got married to [Dizzy](https://twitter.com/dizzyd). This is great news for me because he’s the best human I’ve ever met and way too good for me (shh, don’t tell him). I’m lucky to be with him. He also has the best kids. Stepmotherhood is a great gig for someone like me who never wanted kids of their own. I zip straight from motherhood to grandmotherhood- we play hide and seek, I spoil them, and we have a really great time together. I never thought I would be content to hang out with kids instead of going to bar with friends on a Friday night- turns out these tiny humans are just as entertaining as drunk people, though there’s still the chance you’ll be barfed on.\n\n\n\nIn terms of community work, I kicked it up a notch this year. I made quite a few public GitHub repos, 20 to be specific, gathering **10,028 stars in total**. These stats aren’t really something to over-index on, but what they do allow me to see is whether people are using the projects and appreciate the time investment.\n\nMy favorite among those being:\n\n* [Array Explorer](https://github.com/sdras/array-explorer)\n* [Object Explorer](https://sdras.github.io/object-explorer/)\n* [Project Explorer](https://sdras.github.io/project-explorer-site/) (really gotta think of better names for these)\n* [Page Transitions Travelapp](https://github.com/sdras/page-transitions-travelapp)\n* [Sample Vue Shop](https://github.com/sdras/sample-vue-shop)\n* [Awesome Actions](https://github.com/sdras/awesome-actions)\n\nI made some VS Code extensions:\n\n* [Vue VS Code Snippets](https://marketplace.visualstudio.com/items?itemName=sdras.vue-vscode-snippets&WT.mc_id=marketplace-pack-sdras)\n* [Vue Extension Pack](https://marketplace.visualstudio.com/items?itemName=sdras.vue-vscode-extensionpack&WT.mc_id=twitter-social-sdras)\n* Most notable, [Night Owl Theme](https://aka.ms/nightowl) is used in a lot of places- it was ported 16 times to other platforms, and has **183K downloads** so far.\n\nI wrote **19 posts**, most were on CSS-Tricks, 10 of which were about Vue.js, gathering roughly **half a million views** altogether (483K to be exact). It still astounds me that writing words on these here internets can reach so many people. My favorite of these are:\n\n* [Introducing GitHub Actions](https://css-tricks.com/introducing-github-actions/)\n* [Native-like Page Transitions on the Web](https://css-tricks.com/native-like-animations-for-page-transitions-on-the-web/)\n* [Understanding the Almighty Reducer](<Understanding the Almighty Reducer>)\n\nAs for Vue core, I’ve been working along on the [Cookbook](https://vuejs.org/v2/cookbook/) with great contributions from the community. Honestly I haven’t been able to devote enough time to it lately as I would like, having been on the road and working. I have to turn my attention to it soon to revamp and improve it for [Vue 3 coming out next year](https://medium.com/the-vue-point/plans-for-the-next-iteration-of-vue-js-777ffea6fabf). There’s also some other work I’m gonna get to work on that I hope will be _super dope_, but I can’t tell you about that quite yet 🤫\n\n\n\n_This photo is of some, not all, of the Vue core team in Japan_\n\nI spoke **30** times in **13** different countries including Iceland, Japan, Poland, the UK, and Switzerland. This is probably the most privileged part of my life, and I appreciate this opportunity so much. It wasn’t even that long ago that I was being rejected from everything, so being invited to these is a real honor.\n\nIt was so fun, but the last few years were also very conference-heavy so I think I really gotta slow it down in the future and find a more sane pace. My goal for this year was to keep it at a dozen and clearly I missed that goal (I love travel). My 12 year old stepdaughter has put herself in charge of my calendar for next year. I have 100% more faith in her than me so that’s the plan. I’d like to make space for others to have that kind of journey if they want it, too.\n\nA record of some of my [slide decks are here](https://noti.st/sdras). My favorite talk of the year was probably this one from JS Conf Iceland:\n\n<iframe width="560" height="315" src="https://www.youtube.com/embed/i2iCyulbnus" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>\n\nI taught a few workshops, a bunch of Vue ones, some [Web Animation Workshops with Val Head](https://webanimationworkshops.com/), and more recently, [Design for Developers](https://frontendmasters.com/workshops/design-for-devs/) and [SVG Animations](https://frontendmasters.com/courses/svg-animation/) for Frontend Masters. Design for Developers is the first workshop I’ve created solely because people asked me to.\n\nThe most meaningful work of this year was getting to co-organize [Concatenate Conf](https://concatenate.io/) with Christian Nwamba, and Brian Holt, with Prosper Otemuyiwa as our MC. Next year the planning committee has grown to include Gift Egwuenu, who spoke at this year’s event, and Simona Cotin. The concept for this conference is a free conference for Nigerians- due to travel and monetary restrictions, sometimes they are denied access to international developer events, so we wanted to bring the conference there. [Christian wrote an amazing thread about it here](https://twitter.com/codebeast/status/1018828622134743040).\n\n**We filled up 1000 slots in 24 hours!** We had speakers both local and remote and the whole thing was livestreamed. We trended #1 on twitter in Nigeria for almost 4 days. Some businesses in the area declared it a holiday and let people off of work to attend. Collaborating with Christian on this has been a dream- he’s one of the most thoughtful, hardworking, and intelligent people I’ve ever had the opportunity to work with, and if you don’t follow him, you’re missing out.\n\n\n\nWe’re opening sponsorships to this event for October 2019 soon, so if you’re a company and interested in supporting, please reach out! info@concatenate.io. We’re also creating an open collective soon to collect donations from individuals. We’re hoping to fly speakers out next year so we can have an even more hands-on event this time!\n\nI was promoted at Microsoft, I’m now **Lead of Emerging Markets**, Cloud Developer Advocates. Some of what we’re doing in this group is supporting communities like Concatenate Conf did, and that’s so exciting.\n\nAll in all, it’s been pretty busy! I’m actually kind of hoping to slow down a bit next year, I’ve been going pretty hard for a while now and I want to find a better balance. Because I’m an introvert, the OSS work where I sit at home and code all day feels really replenishing while going to speak at conferences takes it out of me completely. I’m definitely planning on maximizing the ways I can contribute from my pajamas. Because that’s the dream, right? That’s my dream, anyways. 🚫👖',tags:[l,w,p],path:"/blog/reflections-on-2018"},{title:"Feeling Happy at the End of the World",date:"December 11th 2017",thumbnail:"/images/uploads/beach.svg",body:'This year has been a surreal one for me. I’ve had years that were particularly tough, years that trended more cheerfully, but 2017 was unique and bizarre because I felt an immense guilt in my happiness.\n\nI think this might have been the year I found the most personal happiness, but the giant caveat in everything was watching the world divide, watching racism, sexism and hatred rise, and seeing some real damage that incurred on people’s lives around the world.\n\nPersonally, the biggest and most wonderful part of my whole year is that my fiancé, Dizzy Smith, has now gone two full years without needing treatment for his cancer. I don’t talk about this that much because I don’t want to jinx it, but this one thing informs so much of my happiness, I would be remiss to exclude it.\n\nWe bought a house and I moved to Denver from SF (my hometown), a change that has also brought me a lot of joy because I have more space to work (an office of my own for my first time in my life!) I get to live with Dizzy’s kids, who are the best children in the world and I’m not even biased. The only exception being the children of the people who read this article. Then it’s a tie.\n\n\n\nWe also got a puppy this year! I love Sudo so very much and have always wanted a dog. She makes every day better. The kids and the dog remind me daily of wonder, and help me feel gratitude for pieces of life I can sometimes take for granted. Grass! Rolling around in grass! I never understood why they got rid of recess.\n\nShe’s bigger now, she was so tiny when we got her!\n\nSudo will also do this thing where she picks up a stick and it makes her SO HAPPY! It’s the most important stick of all time. And then she’ll accidentally drop it but she’ll just move on. She doesn’t pine for it. She doesn’t try to hold it so tight. She just lives in the moment with her stick. Way to go.\n\nThose who know me (and probably some who don’t) know that the two things that I love most outside family and friends are travel and work itself. This year has been amazing because I’ve gotten to do both in spades. I made a promise to myself few years back to try to save up money to visit at least one new country a year. This year I spoke at nearly 50 conferences in 11 countries, 4 of which were new to me. I made acquaintances and friends all over the globe. I made a project where you can track my activities as well as my coworkers as we speak around the world. It’s made with Azure Serverless functions and Vue.js.\n\n\n\nYou can [play with the demo here](http://cda-locale.azurewebsites.net/)\n\nI got to work on so many cool projects with so many technologies! I made 18 repos, over 250 codepens, but only released 40 of them (so much bad work to get to the good stuff, haha). I put out 18 articles, all on CSS-Tricks (mostly on Vue.js!) and created some slide decks that in total got more than a half a million views. My book on [SVG Animations with O’Reilly](https://www.amazon.com/SVG-Animations-Implementations-Responsive-Animation/dp/1491939702/) was published, and my business with Val Head, [Web Animation Workshops](http://webanimationworkshops.com/), put on 7 workshops. This is all outside of the contract and consulting work I was doing, which meant my year moved at a quick pace. But I wouldn’t say that’s unusual- I’ve been happily working, and staying productive for many years now. I think people have noticed much more lately than they did even two years ago (when I had 700 followers), another thing I can be grateful for. I’ve been a software engineer for more than a decade, but no one noticed my work for most of that time. If that’s you too, all I can say is- **_keep going_**.\n\nThere’s a bittersweet part to this success, too, where I close out the year feeling that tech still has so far to go. I’m asked on average once a conference if I code or if I code my own demos, despite stating clearly now in the intro that they are mine unless I state otherwise. This doesn’t happen to my male counterparts. Whatever excuse you thought up just now to retort this, just please don’t. Please just listen for once.\n\nI also receive a good amount of harassment, usually off of educational material, which sucks. I’m not leaving tech, I’m not saying this for pity, and I’m not asking to be commended- I want to express that the experience of a woman in tech who simply wants to code is still not great. Women and people of color have to survive abuse and bias to be here and until we look this in the face and draw awareness to it I’m not doing my due diligence for the people who come after me. There are much more horrible stories that I can tell you about my career and sexual harassment than these, but those are very personal stories to tell. We have work to do. [As Alisha Ramos so eloquently put it](https://www.youtube.com/watch?v=PtKOzKNJF-s), “The strongest pipeline in the world does no good if it leads directly into the sewer.”\n\nFor my part, this year I started a more formal way of mentoring underrepresented folks. My schedule is slammed so I didn’t get to fulfill as many as I wanted to, but I worked with about a dozen people, which is a dozen more than last year. Next year I plan to do less speaking so I can make a deeper commitment to mentoring and be with my family more. It’s important to me to do so because, as someone who has been building sites and gaining knowledge from other developers via stack overflow, blogs, github, and codepen for so many years, I feel the need to even the score and try to give what I have taken back to the community. ([see this tweet for details](https://twitter.com/sarah_edo/status/878950382759813120))\n\n\n\nSpeaking of community, I shared a post two years ago saying that it was my goal at the beginning of that year to get something published in CSS-Tricks and by the year end was a staff writer for the publication. I am still a staff writer for them today and couldn’t be more proud of being a part of it. Chris is a great voice in our community and the fellow writers and guest writers are quality all the way down. We even added a new member of our staff this year, Miriam Suzanne, whose work and speaking I greatly admire.\n\nIn the beginning of this year one of my big goals was to put out learning materials for Vue.js (an article or two I think it said). 13 articles, 12 repos and 1 Frontend Masters workshop later, and I’ve official joined the Vue Core team, my first stop is leading the effort to create a new section called The Cookbook, that walks through how to create certain patterns, shows simple and complex examples, and even speaks with nuance around when this pattern will fail, and when to consider using an alternative means of execution. I work closely alongside Chris Fritz to integrate this, which is truly awesome because I look up to him, he is a hero in terms of good documentation. I’m very excited to be working on Vue.js because I believe in the project, and reading through Evan You’s well organized and well commented source code, I feel very lucky to be on this team.\n\n\n\nLast but certainly not least, I recently joined Microsoft as a Senior Developer Advocate, a job I love so far. It’s a good fit for me because I like working with the community, creating open source work, and working with product teams to improve things for developers. The choice to leave consulting was a hard one to make because business was booming and I like working for myself, but Microsoft’s new internal catch phrase of “meet developers where they are” really appealed to me and they let me be pretty autonomous and creative in what projects I create, which is _**the dream**_. Azure has a lot of nice offerings and I’m a naturally curious person so I’m having fun exploring the possibilities. I also love my team, Simona, Burke, Asim, Brian, and John- jobs are so much better when you like your coworkers and boss.\n\nOne thing I’m looking forward to as the year closes that has become a tradition is that my friend Meagan comes over and Meagan, Dizzy, and I write out what we’d like to accomplish in the next year. We choose 10 things or so and write detailed, actionable items. We also revisit what we wanted to accomplish last year to see how far we came. I haven’t looked at my list in a while but last I checked, it had a range from career focused to personal. No, none of them are about dieting or going to the gym 🙂. I mention this process because I recommend it. It’s a nice exercise to align yourself with what you really want and revisit if you’re actually doing things to achieve what’s actually important to you in the grand scheme of everything. I tend to get pretty focused on the details, this helps me zoom out.\n\nThat’s it! 2017 was a hard year that I’m personally grateful for. I’m a very lucky lady. I’m grateful for web development, the community it offers, and… hot damn we get to build this stuff for a living! How cool is that! When the news gets me down, I refocus on the work, because working is the best distraction in the world. Aside from puppies and sticks.',tags:[l,w,p],path:"/blog/feeling-happy-at-the-end-of-the-world"},{title:"Responsive Animated Infographics",date:"June 13th 2015",thumbnail:"/images/uploads/1_sjkq8mnt34a5_cbrmjcioq.jpeg",body:'Do you remember the infographic? Infographics became very popular because of their impact on conversion. On the user side, they were full of quick, easy to digest information. They were colorful and, when created well, clearly illustrated comparative information that one could pick up at a glance. On the creator’s side, they [increased the ROI](http://www.bitrebels.com/social/social-media-analytics-impact-infographic/) (return on investment) of their posts and shares. The impact of the graphics on a [company’s visibility and brand awareness](http://www.bitrebels.com/social/social-media-roi-infographics-2013/) was staggering. The Whole Brain Blog [boasted numbers](http://blog.thewholebraingroup.com/return-on-infographics) such as:\n\n* increased traffic to their website by over **400%**\n* lead increase by almost **4500%**\n* the number of new visitors to their site to almost **78%**\n\nBut one thing all of these posts have in common is that they are at least two years old.\n\n> If infographics have that kind of potential for performance, why do they seem to be considered a played out fad?\n\nOne possible reason is the [tipping point for mobile](http://www.lukew.com/ff/entry.asp?1939). Infographics that are exciting and all-encompassing on the desktop become an arduous pinch-n-grab affair on a mobile device. This means sharing via social media with the rise of traffic on mobile, causes frustration and decline for the engagement potential on these images.\n\nThe next reason is a little more simple. When a concept doesn’t adjust to the present context, it fades away. With more interactivity and motion on the web, a static graphic doesn’t have the same pull as something that is more visually exciting, and here is where motion trumps all.\n\nAnimation shouldn’t be considered at the end of the design and development process, it should be the bones. If we marry that idea with the concept of conveying a lot of information visually, we can update the very basis of what an infographic is and does. I took the text content of an infographic I found in the book [Knowledge is Beautiful](http://www.amazon.com/Knowledge-Beautiful-Impossible-Invisible-Connections-Visualized/dp/0062188224), and reimagined the look, feel, and implementation.\n\nHere is a revisited approach, keeping in mind the two problems equated with its decline. **A responsive, animated infographic.** Keep in mind that the progress of the text transitions are sped up here in order to demo the animation, not neccessarily the content. Shown below is the collapsed responsive view, so [visit the pen here](http://codepen.io/sdras/full/JdJgrB/) for the full content.\n\n<iframe height="300" style="width: 100%;" scrolling="no" title="Responsive Animated Infographic." src="//codepen.io/sdras/embed/JdJgrB/?height=300&theme-id=5162&default-tab=result" frameborder="no" allowtransparency="true" allowfullscreen="true">\n\n See the Pen <a href=\'https://codepen.io/sdras/pen/JdJgrB/\'>Responsive Animated Infographic.</a> by Sarah Drasner\n\n (<a href=\'https://codepen.io/sdras\'>@sdras</a>) on <a href=\'https://codepen.io\'>CodePen</a>.\n\n</iframe>\n\nIn terms of design, traditional infographics typically make use of a salon-style, visually-loaded method. Here, we’ve still filled the usable image area but updated the design to feel a little more clean. We didn’t overload the graphic with many elements because unlike traditional static infographics, if there are too many different moving parts, it’s disorienting for the viewer. It’s also heavier to load so there is a performance hit.\n\nIn terms of responsive design, instead of having the entire presentation be fluid throughout, we had the infographic stay in place until a breakpoint, and then moved elements to different positions, allowing the main SVG to respond fluidly at that juncture. Even though we designed desktop first, our media queries are a mobile-first implementation. I used an SVG which is very easy to make fluid, adjusting the viewport slightly on mobile with javascript.\n\n```\nvar shape = document.getElementById(“svg”);\n```\n\n```\n// media query event handler\n```\n\n```\nif (matchMedia) {\n```\n\n```\n var mq = window.matchMedia(“(min-width: 826px)”);\n```\n\n```\n mq.addListener(WidthChange);\n```\n\n```\n WidthChange(mq);\n```\n\n```\n}\n```\n\n```\n// media query change\n```\n\n```\nfunction WidthChange(mq) {\n```\n\n```\n if (mq.matches) {\n```\n\n```\n shape.setAttribute(“viewBox”, “0 0 765 587”);\n```\n\n```\n shape.setAttribute(“enable-background”, “0 0 765 587”);\n```\n\n```\n }\n```\n\n```\n else {\n```\n\n```\n shape.setAttribute(“viewBox”, “0 0 592 588”);\n```\n\n```\n shape.setAttribute(“enable-background”, “0 0 592 588”);\n```\n\n```\n }\n```\n\n```\n};\n```\n\nWe’re then animating it with [GreenSock(GSAP)](http://greensock.com/) to take advantage of the both the timeline and the ability to scrub the animation to find different points in time to interact with on a slider. GreenSock also helps with a lot of [cross-browser transformation origin](https://css-tricks.com/svg-animation-on-css-transforms/) rendering problems on SVG. Below is an example of one piece of information in the graphic displaying on the timeline. Note that we’ve added a relative time for all of these animations to fire at using a label.\n\n```\ntl.add(“likely”);\n```\n\n```\ntl.to($(“.p1”), 0.3, {\n```\n\n```\n scale: 1.3,\n```\n\n```\n transformOrigin: “50% 100%”,\n```\n\n```\n fill: $blue,\n```\n\n```\n ease: Bounce.easeOut\n```\n\n```\n}, “likely”)\n```\n\n```\n.to($effect, 0.3, {\n```\n\n```\n y: -10,\n```\n\n```\n ease: Circ.easeOut\n```\n\n```\n}, “likely”)\n```\n\n```\n.to($eLine, 0.3, {\n```\n\n```\n stroke: $orange,\n```\n\n```\n ease: Sine.easeOut\n```\n\n```\n}, “likely”)\n```\n\n```\n.fromTo($(“.d1”), 0.3, {\n```\n\n```\n opacity: 0,\n```\n\n```\n scale: 0.7\n```\n\n```\n}, {\n```\n\n```\n opacity: 1,\n```\n\n```\n scale: 1,\n```\n\n```\n ease: Back.easeOut\n```\n\n```\n}, “likely”)\n```\n\n```\n.to($m1, 0.3, {\n```\n\n```\n fill: $green,\n```\n\n```\n ease: Circ.easeOut\n```\n\n```\n}, “likely”);\n```\n\nWe can also improve the accessibility of the graphic by adding a title attribute on the illustrative svgs. You can also supply an `aria-labelledby` on the associative svg.\n\n```\n<svg aria-labelledby=”title” id=”svg” xmlns=”http://www.w3.org/2000/svg" viewBox=”0 0 765 587">\n```\n\n```\n<title id=”title” lang=”en”>Circle of icons that illustrate Global Warming Solutions</title>\n```\n\nIf you need to, you can also supply a title for any element in the SVG DOM. You can find more information on implementation in this great article by Dudley Storey. In the case of this demo, we kept the text separate so that it’s still completely legible to screen readers. This is an improvement over the original infographics, which as static images, could not be accessed in this way.\n\nWe’ve provided a fallback to older browsers and devices by creating a static image that still rotates with the timeline and dialogs. We use modernizr to check and provide a hook so that the image doesn’t download when it’s not necessary. This doesn’t provide all the information that the full SVG does, the purpose of the png here is a graceful degradation. If you want to make sure that your reach is backwards compatible with no degradation, you can offer something more robust.\n\n```\n.inlinesvg .fallback {\n```\n\n```\n display: none;\n```\n\n```\n}\n```\n\n```\n.no-inlinesvg .fallback { \n```\n\n```\n width: 500px;\n```\n\n```\n height: 500px;\n```\n\n```\n display: block;\n```\n\n```\n}\n```\n\nThis demo is merely a sketch, to ponder methods for which we can give shareable information more muscles with responsive animation. The same thing could also be achieved with pngs, CSS, canvas, and variety of other methods. The potential that we have with the tools now supported on the web are exciting and can breathe new life into older concepts.',tags:[l,"SVG","tutorial"],path:"/blog/rethinking-information-presentation-responsive-animated-infographics"},{title:"Thought Morphology",date:"April 20th 2014",thumbnail:"/images/uploads/thought-morph2.jpg",body:'Phylogenetic is a term used in biology which refers to evolutionary relationships between species. Phylogenetic data is organized in a matrix format. Analysis of a phylo-matrix results in a phylogenetic tree. In my statement, I want to describe the evolution of thoughts and ideas using a phylo-style tree and thus adopted the term phylosynaptic. A synapse is the junction between two nerve cells and is the basis for thought within the brain.\n\n\n\nThe first version of this document was created in 2002. At the time, I was working at the Field Museum of Natural History as a Scientific Illustrator. I was surrounded by thousands upon thousands of jars of amphibians, reptiles, and fish, all organized in jars and perched in giant structures based on their placement within the Linnaean System of Classification. I had been studying the Enlightenment and Classical Antiquity philosophies for a few years prior and working there called these studies to the forefront of my mind. These studies played a large part in the development of the concepts that I used to create fine art for the next decade of my life. I was interested in appreciating and critiquing the way that humans, and predominantly, Western civilizations, had used categorical order in thought processes to govern our understanding. I was particularly interested in the flawed logical biases of these categorical systems, and how they all developed.\n\nThe Enlightenment was a time where western civilization began to embrace categorical order. It was the advent of encyclopedias, dictionaries, and the Linnaean System of Classification. The ideas of reductionist thinking, in conjunction with clearly stated principles, tests, and empirical evidence was the basis for a large Scientific Revolution. These ideas were not new — in Ancient Greece, Plato had introduced a Theory of Forms that began to examine the nature of an idea of a characteristic or form can differ from human perception. It was the birth of much philosophical debate that carried on for 2000 years.\n\nThe idea that humankind could understand and control its surroundings through categorical investigation was pertinent to scientific analysis. To me, the implications of this were at once exciting and confounding. Deriving order from chaos is a useful technique for understanding the world, but it can also negatively impact our understanding of the world by creating delineations where there are none. Eleanor Rosch discussed some of these problems in terms of cognitive psychology: she ascertained that for correct scientific analysis, no member of a category could be a “better example” of the category than others, and that the categories being determined had to be separate from the peculiarities of any beings doing the categorizing.\n\nEven with the reductionist processes in place, the management of groupings should also be called into analysis. In George Lakoff’s study of categorical order “Women, Fire, and Dangerous Things” he ascertains from the beginning that categories are problematized through culture as well, such as the instance of the Australian Aboriginal language Dyirbal,\n\n> “which has a category balan, that actually includes women, fire and dangerous things. … This is not simply a matter of categorization by common properties. Categorization is not a matter to be taken lightly.”\n\nIt is particularly easy in a case such as balan to see the implications of a cultural bias, but what of the Western cultural predispositions of which we might not be so aware? The Linnaean System of Classification had to have been biased in some ways. Today, biologists compare morphological data based on DNA analysis. Prior to the era where this was possible, scientists would use what is called a morphological tree. The basic premise was to create a list of all of the features that a species could possess and then figure out how many characteristics were aligned. From this analysis, a morphological tree could be determined with those species that had the most commonalities situated together and grouped out into the Linnaean System.\n\nBut who determines what are called traits? Certainly the data could be slanted by an unequal measure of features in any given area. This is merely an example, of course, the critique works for so many types of categorical systems.\n\nDespite these flaws, I am in awe of such a system. The ability to determine similarities of very abstract concepts or evolutionary processes, even species, is impressive to say the least. It is exciting and useful that this kind of analysis is possible and that we can create ordered observations and critical conclusions from that which surrounds us.\n\nMy critique and appreciation for the system comes in the form of my artist’s statement, where I decided to create an analysis of the thoughts that I have when I create a piece of art. I was interested to see what commonalities emerged, wondering if I could perhaps learn something but also critiquing the system a bit (with a touch of humor). Most of my art touches on categorical order, and thus the statement of artist intent should be composed of those concepts, too.',tags:[l,ce],path:"/blog/thought-morphology"}],codepenProjects:[{id:"gWWQgb",title:"React Animated Page Transitions",details:"Just a small demo to show a few page transitions in React. Using GreenSock and SVG."},{id:"YZBGNp",title:"Vue-controlled Wall-E",details:"I found this dribbble shot of Wall-E that I loved, and wanted to see if I could manipulate him with Vue bindings. https://dribbble.com/shots/2758895-Wall-e\n\nUses Vue, GreenSock, and SVG"},{id:"RZGqxR",title:"Vue Time Comparison",details:"Using the browser's native API for .toLocaleTimeString to get rid of libraries like moment.js for world time that respects daylight savings. Made with Vue, SVG, GreenSock, and 🤘🏼\n\nThe dial was built off of this dribbble shot with minor tweaks: https://dribbble.com/shots/2196737-Day-048-Speedometer and the graphic was a purchased game backround"},{id:"gogVRX",title:"JavaScript Array Explorer",details:"When I was first learning array methods, I spent a lot of time digging through the docs to find the appropriate one, and I had to search one by one. I made this resource to help people find the correct array method a bit more naturally. You can narrow down what you want to do and explore until you find what's most useful to you.\n\nAll of the code is MIT open source and hosted on github if you'd like to see how this is made: https://github.com/sdras/array-explorer/."},{id:"VpYeNj",title:"💥 Boom 💥",details:"What I think about when I think about nuclear power races"},{id:"JbaGwg",title:"Example Motion Design Docs",details:"Showing how motion design documentation can communicate branding and a direction for cohesive animation on a site. Illustrations by Kristen Kong."},{id:"jawPGa",title:"Dynamically Generated Alt Text",details:"I kept hearing about machine learning being used for evil and wanted to use it for something good. Social media posts typically don't have a way to enter alt text and the only users I see that reliably remember to add descriptions to the post are accessibility experts or blind people. Hopefully this allows good alt text to be a bit more ubiquitous. You can find more information on how Azure's Computer Vision API works, as well as how to use it in your own projects here: https://aka.ms/Uzrshc"}],githubProjects:[{id:241900492,html_url:"https://github.com/sdras/animated-guide-vue3",name:"animated-guide-vue3",homepage:n,stargazers_count:141,description:o},{id:115382152,html_url:"https://github.com/sdras/array-explorer",name:"array-explorer",homepage:"https://arrayexplorer.netlify.com/",stargazers_count:2451,description:"⚡️ A resource to help figure out what JavaScript array method would be best to use at any given time"},{id:153500249,html_url:"https://github.com/sdras/awesome-actions",name:"awesome-actions",homepage:n,stargazers_count:13566,description:"A curated list of awesome actions to use on GitHub"},{id:25430428,html_url:"https://github.com/sdras/Benchmarking-Animations",name:"Benchmarking-Animations",homepage:o,stargazers_count:6,description:"Writing the same simple animation in a loop in SMIL, Canvas, CSS, and Velocity for benchmarking purposes."},{id:285059448,html_url:"https://github.com/sdras/building-web-apps-with-vue",name:"building-web-apps-with-vue",homepage:o,stargazers_count:221,description:"building-web-app-with-vue"},{id:355601088,html_url:"https://github.com/sdras/career-ladders",name:"career-ladders",homepage:"https://career-ladders.dev/",stargazers_count:505,description:"A sample of career ladders I use for my organization, open sourced for anyone."},{id:103750851,html_url:"https://github.com/sdras/cda-locale",name:"cda-locale",homepage:"https://cda-locale.netlify.com/",stargazers_count:101,description:"Showing Microsoft Cloud Developer Advocates speaking, 2017 and 2018"},{id:255032668,html_url:"https://github.com/sdras/contentful-nuxt-netlify",name:"contentful-nuxt-netlify",homepage:"https://contentful-nuxt-example.netlify.com/",stargazers_count:41,description:"Example setup for Contentful and Nuxt on Netlify"},{id:188726142,html_url:"https://github.com/sdras/cssgridgenerator",name:"cssgridgenerator",homepage:"https://cssgrid-generator.netlify.com/",stargazers_count:3716,description:"🧮 Generate basic CSS Grid code to make dynamic layouts!"},{id:157916577,html_url:"https://github.com/sdras/d3-example-ignitetour",name:"d3-example-ignitetour",homepage:n,stargazers_count:21,description:" This repo serves as an example for Microsoft Ignite the Tour. In this session, we explore how to create basic charts and graphs using d3."},{id:104523154,html_url:"https://github.com/sdras/data-in-motion",name:"data-in-motion",homepage:o,stargazers_count:14,description:"My talk about the importance of animation in data visualizations"},{id:149911333,html_url:"https://github.com/sdras/design-for-developers",name:"design-for-developers",homepage:"https://frontendmasters.com/courses/design-for-developers/",stargazers_count:607,description:"Design for Developers Workshop"},{id:260720499,html_url:"https://github.com/sdras/devex-utm-builder",name:"devex-utm-builder",homepage:n,stargazers_count:7,description:o},{id:335819397,html_url:"https://github.com/sdras/docs-extensionpack",name:"docs-extensionpack",homepage:n,stargazers_count:53,description:"A collection of extensions for writing, editing, and reviewing documentation in VS Code"},{id:211209452,html_url:"https://github.com/sdras/easiest-netlify-lambda-example",name:"easiest-netlify-lambda-example",homepage:o,stargazers_count:4,description:o},{id:195306388,html_url:"https://github.com/sdras/ecommerce-netlify",name:"ecommerce-netlify",homepage:"https://ecommerce-netlify.netlify.app/",stargazers_count:1217,description:"🛍 A JAMstack Ecommerce Site built with Nuxt and Netlify Functions"},{id:153392539,html_url:"https://github.com/sdras/example-azure-node",name:"example-azure-node",homepage:o,stargazers_count:68,description:"An example Node webapp deployed with GitHub actions"},{id:304960633,html_url:"https://github.com/sdras/favegame",name:"favegame",homepage:"https://hasura-nuxt-demo.netlify.app/",stargazers_count:41,description:"Small starter example of Hasura, Nuxt, and Netlify for Jamstack/SSR rendering"},{id:120164392,html_url:"https://github.com/sdras/firefighter-demo",name:"firefighter-demo",homepage:"https://sdras.github.io/firefighter-demo/",stargazers_count:66,description:"🚨 Demo to improve an existing firefighter app by making it queue tasks offline"},{id:380874662,html_url:"https://github.com/sdras/fortnite-vscode-theme",name:"fortnite-vscode-theme",homepage:"https://marketplace.visualstudio.com/items?itemName=sdras.fortnite-vscode-theme",stargazers_count:140,description:o},{id:44459340,html_url:"https://github.com/sdras/frontendmasters-svganimation",name:"frontendmasters-svganimation",homepage:n,stargazers_count:193,description:"Frontend Masters- Advanced SVG Animation Course"},{id:84117686,html_url:"https://github.com/sdras/gsap-player",name:"gsap-player",homepage:o,stargazers_count:92,description:"A small, customizable youtube-like player for gsap timelines"},{id:254994570,html_url:"https://github.com/sdras/headless-wp-nuxt2",name:"headless-wp-nuxt2",homepage:o,stargazers_count:31,description:o},{id:256776348,html_url:"https://github.com/sdras/hero-generator",name:"hero-generator",homepage:"https://hero-generator.netlify.app/",stargazers_count:567,description:"🦸🏻♀️Hero Generator! Create a nice hero image for your site or app"},{id:298932375,html_url:"https://github.com/sdras/inbedby7pm",name:"inbedby7pm",homepage:"https://marketplace.visualstudio.com/items?itemName=sdras.inbedby7pm",stargazers_count:113,description:'My other theme was for Night Owls like myself. This theme was requested for by the "In Bed by 7pm" crowd'},{id:96451164,html_url:"https://github.com/sdras/intro-to-vue",name:"intro-to-vue",homepage:"https://frontendmasters.com/workshops/vue-v2/",stargazers_count:2558,description:"Workshop Materials for my Introduction to Vue.js Workshop"},{id:253121308,html_url:"https://github.com/sdras/is-this-a-sandwich",name:"is-this-a-sandwich",homepage:"https://isthisasandwich.netlify.com/",stargazers_count:97,description:"Is this a sandwich?"},{id:301778112,html_url:"https://github.com/sdras/jamstack-template",name:"jamstack-template",homepage:o,stargazers_count:9,description:o},{id:210421869,html_url:"https://github.com/sdras/JAMstack-Workshop",name:"JAMstack-Workshop",homepage:n,stargazers_count:62,description:"Workshop materials for JAMstack workshop using Vue and Netlify."},{id:57518901,html_url:"https://github.com/sdras/JS-stroll",name:"JS-stroll",homepage:n,stargazers_count:213,description:"Rewriting code from other languages or other technologies into Vanilla JS and SVG for fun and practice."},{id:137523268,html_url:"https://github.com/sdras/livecode-svganimation",name:"livecode-svganimation",homepage:o,stargazers_count:95,description:"In my Smashing Toronto talk, I'll be live coding an SVG animation from start to finish. Here's the repo that houses the base materials, and any further references for things we don't have time to cover."},{id:195251394,html_url:"https://github.com/sdras/netlify-functions-example",name:"netlify-functions-example",homepage:o,stargazers_count:58,description:o},{id:133761470,html_url:"https://github.com/sdras/night-owl-vscode-theme",name:"night-owl-vscode-theme",homepage:"https://aka.ms/nightowl",stargazers_count:2256,description:"🌌 NIGHT OWL: A VS Code dark theme for contrast for nighttime coding, 🦉 LIGHT OWL: a daytime light theme"},{id:115576472,html_url:"https://github.com/sdras/object-explorer",name:"object-explorer",homepage:"https://objectexplorer.netlify.com/",stargazers_count:1367,description:"🔥 A resource to help figure out what JavaScript object method would be best to use at any given time"},{id:126620410,html_url:"https://github.com/sdras/page-transitions-simple",name:"page-transitions-simple",homepage:n,stargazers_count:156,description:"Vue/Nuxt Page Transitions- Simple Demonstration"},{id:127487566,html_url:"https://github.com/sdras/page-transitions-travelapp",name:"page-transitions-travelapp",homepage:"https://pagetransitions.netlify.app/",stargazers_count:1608,description:"Travel App, Native-like Page Transitions"},{id:178600030,html_url:"https://github.com/sdras/perfmatters-demo",name:"perfmatters-demo",homepage:o,stargazers_count:11,description:"demo for perfmatters conf https://perfmattersconf.com/"},{id:197872016,html_url:"https://github.com/sdras/productive-twitter",name:"productive-twitter",homepage:"https://chrome.google.com/webstore/detail/productive-twitter/elgfikcdihncknnnedljbbignlmnppii",stargazers_count:156,description:"Chrome extension: Minimal and friendly theme for productive twitter use"},{id:147777231,html_url:"https://github.com/sdras/project-explorer",name:"project-explorer",homepage:"https://sdras.github.io/project-explorer-site/",stargazers_count:486,description:" 🎋A CLI tool to create an annotated tree visualization of any project"},{id:66226012,html_url:"https://github.com/sdras/react-aframe-demo1",name:"react-aframe-demo1",homepage:o,stargazers_count:16,description:"React A-Frame Demo 1"},{id:112036900,html_url:"https://github.com/sdras/sample-stripe-handler",name:"sample-stripe-handler",homepage:H,stargazers_count:156,description:"Serverless function that uses the stripe api for a checkout process in a Vue application"},{id:111872580,html_url:"https://github.com/sdras/sample-vue-shop",name:"sample-vue-shop",homepage:H,stargazers_count:1180,description:"See readme for newer repo details! A sample shop that shows how to manage payments with Vue, Stripe, and Serverless Functions"},{id:278231093,html_url:"https://github.com/sdras/sdras",name:"sdras",homepage:o,stargazers_count:22,description:"it me!"},{id:193728725,html_url:"https://github.com/sdras/smashing",name:"smashing",homepage:"https://smashingtoronto.netlify.com/",stargazers_count:68,description:"This was the result of a live code talk at Smashing Conf in Toronto, this is how far I got in 45 minutes"},{id:192017045,html_url:"https://github.com/sdras/smashing-template",name:"smashing-template",homepage:n,stargazers_count:11,description:"a base of the smashing talk"},{id:60487530,html_url:"https://github.com/sdras/svg-workshop",name:"svg-workshop",homepage:"https://frontendmasters.com/courses/svg-essentials-animation/",stargazers_count:656,description:"Materials for SVG Essentials & Animation Course"},{id:124803662,html_url:"https://github.com/sdras/three-vue-pattern",name:"three-vue-pattern",homepage:"https://sdras.github.io/three-vue-pattern/",stargazers_count:96,description:"A biofeedback visualization made with Three.js, Vue, and LUIS (cognitive services), made with Brian Holt"},{id:11664161,html_url:"https://github.com/sdras/Transform_intro",name:"Transform_intro",homepage:o,stargazers_count:6,description:"Introduction to Transforms, with the use of a transition in a class applied to all examples"},{id:128571331,html_url:"https://github.com/sdras/vue-directory-tree",name:"vue-directory-tree",homepage:"https://sdras.github.io/vue-directory-tree/",stargazers_count:161,description:"A visualization of relevant files for vue repo, along with notes"},{id:166589467,html_url:"https://github.com/sdras/vue-hooks-foodapp",name:"vue-hooks-foodapp",homepage:"https://sdras.github.io/vue-hooks-foodapp/",stargazers_count:181,description:"A food app using a few hooks in Vue to show how they can work (experimental)"},{id:115216805,html_url:"https://github.com/sdras/vue-sample-svg-icons",name:"vue-sample-svg-icons",homepage:"https://sdras.github.io/vue-sample-svg-icons/",stargazers_count:426,description:"An opinionated example of how to use SVG icons in a Vue.js application"},{id:78369522,html_url:"https://github.com/sdras/vue-sublime-snippets",name:"vue-sublime-snippets",homepage:o,stargazers_count:146,description:"Simplify and supercharging my workflow with snippets for Vue.js that help me spin things up quickly"},{id:111356664,html_url:"https://github.com/sdras/vue-vscode-extensionpack",name:"vue-vscode-extensionpack",homepage:o,stargazers_count:269,description:"The extensions I use when developing a Vue application with VS Code"},{id:100876550,html_url:"https://github.com/sdras/vue-vscode-snippets",name:"vue-vscode-snippets",homepage:"https://marketplace.visualstudio.com/items?itemName=sdras.vue-vscode-snippets",stargazers_count:1119,description:"These snippets were built to supercharge my workflow in the most seamless manner possible."},{id:78888506,html_url:"https://github.com/sdras/vue-weather-notifier",name:"vue-weather-notifier",homepage:o,stargazers_count:193,description:"A small SVG animation illustrating a weather app notification in Vue"},{id:78554297,html_url:"https://github.com/sdras/vue-wine-label",name:"vue-wine-label",homepage:o,stargazers_count:55,description:"A very silly demo showing how to make a wine label making dashboard with Vue.js"}],writing:[{platform:t,link:"https://css-tricks.com/good-meetings/",date:"Jul 2, 2021",title:"Good Meetings"},{platform:t,link:"https://css-tricks.com/your-team-is-not-them/",date:"Apr 28, 2021",title:"Your Team is Not 'Them'"},{platform:t,link:"https://css-tricks.com/the-importance-of-career-laddering/",date:"Apr 15, 2021",title:"The Importance of Career Laddering"},{platform:t,link:"https://css-tricks.com/splitting-time-between-product-and-engineering-efforts/",date:"Apr 5, 2021",title:"Splitting Time Between Product and Engineering Efforts"},{platform:t,link:"https://css-tricks.com/mistakes-ive-made-as-an-engineering-manager/",date:"Feb 18, 2021",title:"Mistakes I’ve Made as an Engineering Manager"},{platform:u,link:"https://www.netlify.com/blog/2021/01/06/developer-experience-at-netlify/",date:"Jan 6, 2021",title:"Developer Experience at Netlify"},{platform:t,link:"https://css-tricks.com/creating-arrays-in-hasura/",date:"Jan 4, 2021",title:"Creating Arrays in Hasura"},{platform:t,link:"https://css-tricks.com/creating-ui-components-in-svg/",date:"Nov 23, 2020",title:"Creating UI Components in SVG"},{platform:t,link:"https://css-tricks.com/quick-localstorage-usage-in-vue/",date:"Nov 6, 2020",title:"Quick LocalStorage Usage in Vue"},{platform:u,link:"https://www.netlify.com/blog/2020/10/28/why-jamstack-an-animated-guide/",date:"Oct 28, 2020",title:"Why Jamstack? An Animated Guide"},{platform:u,link:"https://www.netlify.com/blog/2020/10/26/graphql-with-hasura-and-nuxt/",date:"Oct 26, 2020",title:"GraphQL with Hasura and Nuxt"},{platform:u,link:"https://www.netlify.com/guides/creating-an-api-with-aws-lambda-dynamodb-and-api-gateway/",date:B,title:"Lambda, DynamoDB, and API Gateway for your Jamstack App"},{platform:t,link:"https://css-tricks.com/the-empty-box/",date:B,title:"The Empty Box"},{platform:r,link:"https://www.netlify.com/blog/2020/09/10/the-new-target-static-mode-in-nuxt/",date:"Sep 10, 2020",title:"The New Target Static Mode in Nuxt"},{platform:t,link:"https://css-tricks.com/setting-up-and-customizing-the-ant-design-system-in-a-nuxt-app/",date:"Sep 9, 2020",title:"Setting up and Customizing the Ant Design System in a Nuxt App"},{platform:t,link:"https://css-tricks.com/the-making-of-netlifys-million-devs-svg-animation-site//",date:"Aug 3, 2020",title:"The Making of: Netlify’s Million Devs SVG Animation Site"},{platform:t,link:"https://css-tricks.com/vue-3-0-has-entered-release-candidate-stage/",date:"Jul 23, 2020",title:"Vue 3.0 has entered Release Candidate stage!"},{platform:t,link:"https://css-tricks.com/in-defense-of-a-fussy-website/",date:"June 27, 2020",title:"In Defense of a Fussy Website"},{platform:t,link:"https://css-tricks.com/get-programmatic-control-of-your-builds-with-netlify-build-plugins/",date:"May 27, 2020",title:"Get Programmatic Control of your Builds with Netlify Build Plugins"},{platform:t,link:"https://css-tricks.com/how-to-convert-a-date-string-into-a-human-readable-format/",date:"May 26, 2020",title:"How to Convert a Date String into a Human-Readable Format"},{platform:t,link:"https://css-tricks.com/how-to-build-a-chrome-extension/",date:"May 19, 2020",title:"How to Build a Chrome Extension"},{platform:r,link:"https://www.netlify.com/blog/2020/05/05/what-netlifys-infrastructure-team-learned-as-it-increased-deploy-speed-by-up-to-2x/?utm_source=personalsite&utm_medium=nitrodeploys-sd&utm_campaign=devex",date:"May 5, 2020",title:"What Netlify’s Infrastructure Team Learned as it Increased Deploy Speed by up to 2x"},{platform:c,link:"https://css-tricks.com/advice-for-writing-a-technical-resume/",date:"April 29, 2020",title:"Advice for Writing a Technical Resume"},{platform:r,link:"https://www.netlify.com/blog/2020/04/24/automate-contentful-deploys-with-netlify-webhooks/?utm_source=personalsite&utm_medium=contentful-sd&utm_campaign=devex",date:"April 24, 2020",title:"Automate Contentful Deploys with Netlify Webhooks"},{platform:r,link:"https://www.netlify.com/blog/2020/04/20/create-a-blog-with-contentful-and-nuxt/?utm_source=personalsite&utm_medium=contentful-sd&utm_campaign=devex",date:"April 20, 2020",title:"Create a Blog with Contentful and Nuxt"},{platform:r,link:"https://www.netlify.com/blog/2020/04/12/speed-up-productivity-with-terminal-aliases/?utm_source=personalsite&utm_medium=terminalalias-sd&utm_campaign=devex",date:"April 12, 2020",title:"Speed Up Productivity with Terminal Aliases"},{platform:r,link:"https://www.netlify.com/blog/2020/03/31/how-to-scope-down-prs/?utm_source=personalsite&utm_medium=scopedprs-sd&utm_campaign=devex",date:"March 31, 2020",title:"How to Scope Down PRs"},{platform:r,link:"https://www.netlify.com/blog/2020/01/21/advice-from-a-graphql-expert/?utm_source=personalsite&utm_medium=graphql-sd&utm_campaign=devex",date:"January 21, 2020",title:"Advice from a GraphQL Expert"},{platform:c,link:"https://css-tricks.com/how-to-turn-a-procreate-drawing-into-a-web-animation/",date:"Jan 20, 2020",title:"How to Turn a Procreate Drawing into a Web Animation"},{platform:c,link:"https://css-tricks.com/how-to-animate-on-the-web-with-greensock/",date:"Jan 13, 2020",title:"How to Animate on the Web with GreenSock"},{platform:c,link:"https://css-tricks.com/understanding-async-await/",date:"Jan 9, 2020",title:"Understanding Async Await"},{platform:c,link:"https://css-tricks.com/how-to-stack-elements-in-css/",date:"Jan 6, 2020",title:"How to Stack Elements in CSS"},{platform:r,link:"https://www.netlify.com/blog/2019/11/18/what-are-microservices/?utm_source=personalsite&utm_medium=microservices-sd&utm_campaign=devex",date:"Nov 18, 2019",title:"What are Microservices?"},{platform:r,link:"https://www.netlify.com/blog/2019/10/16/creating-and-using-your-first-netlify-build-plugin/?utm_source=personalsite&utm_medium=buildplugin-sd&utm_campaign=devex",date:"Oct 16, 2019",title:"Creating and using your first Netlify Build Plugin"},{platform:t,link:"https://css-tricks.com/how-to-contribute-to-an-open-source-project/",date:"Sept 9, 2019",title:"How to Contribute to an Open Source Project"},{platform:t,link:"https://css-tricks.com/lets-build-a-jamstack-e-commerce-store-with-netlify-functions/",date:"Aug 20, 2019",title:"Let’s Build a JAMstack E-Commerce Store with Netlify Functions"},{platform:t,link:"https://css-tricks.com/creating-dynamic-routes-in-a-nuxt-application/",date:"July 30, 2019",title:"Creating Dynamic Routes in a Nuxt Application"},{platform:t,link:"https://css-tricks.com/finally-a-post-on-finally-in-promises/",date:"July 16, 2019",title:"Finally… A Post on Finally in Promises"},{platform:t,link:"https://css-tricks.com/prioritizing/",date:"May 27, 2019",title:"Prioritizing"},{platform:t,link:"https://css-tricks.com/form-validation-in-under-an-hour-with-vuelidate/",date:"April 2, 2019",title:"Form Validation in Under an Hour with Vuelidate"},{platform:t,link:"https://css-tricks.com/learning-to-learn/",date:"March 4, 2019",title:"Learning to Learn"},{platform:t,link:"https://css-tricks.com/what-hooks-mean-for-vue/",date:"February 4, 2019",title:"What Hooks Mean for Vue"},{platform:t,link:"https://css-tricks.com/the-importance-of-one-on-ones/",date:"January 30, 2019",title:"The Importance of One-on-Ones"},{platform:t,link:"https://css-tricks.com/voice-controlled-web-visualizations-with-vue-js-and-machine-learning/",date:"October 29, 2018",title:"Voice-Controlled Web Visualizations with Vue.js and Machine Learning"},{platform:t,link:"https://css-tricks.com/durable-functions-fan-out-fan-in-patterns/",date:"October 23, 2018",title:"Durable Functions: Fan Out Fan In Patterns"},{platform:t,link:"https://css-tricks.com/introducing-github-actions/",date:G,title:"Introducing GitHub Actions"},{platform:t,link:"https://css-tricks.com/how-to-import-a-sass-file-into-every-vue-component-in-an-app/",date:G,title:"How to Import a Sass File into Every Vue Component in an App"},{platform:t,link:"https://css-tricks.com/what-are-durable-functions/",date:"October 9, 2018",title:"What are Durable Functions?"},{platform:t,link:"https://css-tricks.com/create-your-own-serverless-api/",date:"July 16, 2018",title:"Create your own Serverless API"},{platform:t,link:"https://css-tricks.com/balancing-time/",date:"June 22, 2018",title:"Balancing Time"},{platform:t,link:"https://css-tricks.com/understanding-the-almighty-reducer/",date:"June 13, 2018",title:"Understanding the Almighty Reducer"},{platform:t,link:"https://css-tricks.com/creating-a-vs-code-theme/",date:"June 8, 2018",title:"Creating a VS Code Theme"},{platform:t,link:"https://css-tricks.com/what-does-the-h-stand-for-in-vues-render-method/",date:"May 30, 2018",title:"What does the h stand for in Vue's render method"},{platform:t,link:"https://css-tricks.com/native-like-animations-for-page-transitions-on-the-web/",date:"April 23, 2018",title:"Native-like Animations for Page Transitions on the Web"},{platform:t,link:"https://css-tricks.com/methods-computed-and-watchers-in-vue-js/",date:"April 6, 2018",title:"Methods, Computed, and Watchers in Vue.js"},{platform:k,link:"https://www.smashingmagazine.com/2018/02/jquery-vue-javascript/",date:"February 13, 2018",title:"Replacing jQuery With Vue.js: No Build Step Necessary"},{platform:t,link:"https://css-tricks.com/javascript-love-youre-perfect-now-change/",date:"February 1, 2018",title:"JavaScript, I love you, you're perfect, now change"},{platform:t,link:"https://css-tricks.com/creating-vue-js-serverless-checkout-part-one/",date:"January 16, 2018",title:"Creating a Vue.js Serverless Checkout Form: Setup and Testing"},{platform:t,link:"https://css-tricks.com/creating-vue-js-serverless-checkout-part-two/",date:"January 17, 2018",title:"Creating a Vue.js Serverless Checkout Form: Stripe Function and Hosting"},{platform:t,link:"https://css-tricks.com/creating-vue-js-serverless-checkout-part-three/",date:"January 18, 2018",title:"Creating a Vue.js Serverless Checkout Form: Application and Checkout Component"},{platform:t,link:"https://css-tricks.com/creating-vue-js-serverless-checkout-part-four/",date:"January 19, 2018",title:"Creating a Vue.js Serverless Checkout Form: Configure the Checkout Component"},{platform:t,link:"https://css-tricks.com/open-source-etiquette-guidebook/",date:"December 8, 2017",title:"An Open Source Etiquette Guidebook"},{platform:t,link:"https://css-tricks.com/the-art-of-comments/",date:"October 16, 2017",title:"The Art of Comments"},{platform:t,link:"https://css-tricks.com/exploring-data-with-serverless-and-vue-part-2/",date:"October 11, 2017",title:"Exploring Data with Serverless and Vue: Filtering and Using the Data"},{platform:t,link:"https://css-tricks.com/exploring-data-with-serverless-and-vue-part-i/",date:"October 10, 2017",title:"Exploring Data with Serverless and Vue: Automatically Update GitHub Files With Serverless Functions"},{platform:t,link:"https://css-tricks.com/simple-server-side-rendering-routing-page-transitions-nuxt-js/",date:"July 24, 2017",title:"Simple Server Side Rendering, Routing, and Page Transitions with Nuxt.js"},{platform:t,link:"https://css-tricks.com/using-mixins-vue-js/",date:"June 14, 2017",title:"Using Mixins in Vue.js"},{platform:t,link:"https://css-tricks.com/masking-vs-clipping-use/",date:"June 7, 2017",title:"Masking vs. Clipping: When to Use Each"},{platform:t,link:"https://css-tricks.com/using-filters-vue-js/",date:"June 3, 2017",title:"Using Filters in Vue.js"},{platform:t,link:"https://css-tricks.com/production-progressive-web-apps-javascript-frameworks/",date:"May 27, 2017",title:"Production Progressive Web Apps with JavaScript Frameworks"},{platform:t,link:"https://css-tricks.com/power-custom-directives-vue/",date:"April 20, 2017",title:"The Power of Custom Directives in Vue"},{platform:t,link:"https://css-tricks.com/debugging-tips-tricks/",date:"April 11, 2017",title:"Debugging Tips and Tricks"},{platform:t,link:"https://css-tricks.com/intro-to-vue-5-animations/",date:"Feb 3, 2017",title:"Intro to Vue: Animations"},{platform:t,link:"https://css-tricks.com/intro-to-vue-4-vuex/",date:"Feb 2, 2017",title:"Intro to Vue: Vuex"},{platform:t,link:"https://css-tricks.com/intro-to-vue-3-vue-cli-lifecycle-hooks/",date:"Feb 1, 2017",title:"Intro to Vue: Vue-cli and Lifecycle Hooks"},{platform:t,link:"https://css-tricks.com/intro-to-vue-2-components-props-slots/",date:"Jan 31, 2017",title:"Intro to Vue: Components, Props, and Slots"},{platform:t,link:"https://css-tricks.com/intro-to-vue-1-rendering-directives-events/",date:"Jan 30, 2017",title:"Intro to Vue: Rendering, Directives, and Events"},{platform:t,link:"https://css-tricks.com/guide-2017-conferences/",date:"December 26, 2016",title:"A Guide to 2017 Conferences"},{platform:"24 Ways",link:"https://24ways.org/2016/animation-in-design-systems/",date:"December 15, 2016",title:"Animation in Design Systems"},{platform:t,link:"https://css-tricks.com/introduction-mo-js/",date:"Nov 17, 2016",title:"An Introduction to mo.js"},{platform:t,link:"https://css-tricks.com/on-style-maintenance/",date:"Oct 21, 2016",title:"On Style Maintenance"},{platform:t,link:"https://css-tricks.com/nerds-guide-color-web/",date:"Sept 12, 2016",title:"A Nerd’s Guide to Color on the Web"},{platform:t,link:"https://css-tricks.com/new-favorite-es6-toy-destructured-objects-parameters/",date:"Sept 6, 2016",title:"My New Favorite ES6 Toy: Destructured Objects as Parameters"},{platform:t,link:"https://css-tricks.com/high-performance-svgs/",date:"August 1, 2016",title:"High Performance SVGs"},{platform:t,link:"https://css-tricks.com/interactive-data-visualization-animating-viewbox/",date:"June 8, 2016",title:"Interactive Data Visualization: Animating the viewBox"},{platform:t,link:"https://css-tricks.com/comparison-animation-technologies/",date:"May 2, 2016",title:"A Comparison of Animation Technologies"},{platform:J,link:"http://www.creativebloq.com/web-design/how-create-animations-scale-all-devices-31619478",date:"April, 2016",title:"Create Animations that Scale for All Devices"},{platform:t,link:"https://css-tricks.com/creating-svg-icon-system-react/",date:"March 15, 2016",title:"Creating an SVG Icon System with React"},{platform:t,link:"https://css-tricks.com/introducing-css-scroll-snap-points/",date:"March 2, 2016",title:"Introducing CSS Scroll Snap Points"},{platform:t,link:"https://css-tricks.com/an-interview-with-una-kravets/",date:"February 26, 2016",title:"An Interview with Una Kravets"},{platform:J,link:n,date:"February, 2016",title:"Gallery- Sensational Design and Superb Development"},{platform:t,link:"https://css-tricks.com/productive-in-react/",date:"February 8, 2016",title:"I Learned How to Be Productive in React in a Week and You Can, Too"},{platform:t,link:"https://css-tricks.com/smil-is-dead-long-live-smil-a-guide-to-alternatives-to-smil-features/",date:"December 14, 2015",title:"SMIL is dead! Long live SMIL! A guide to alternatives to SMIL features"},{platform:t,link:"https://css-tricks.com/2016-front-end-conferences/",date:"continuously updated",title:"A Guide to 2016 Front End Conferences"},{platform:t,link:"https://css-tricks.com/the-making-of-the-css-tricks-logo-easter-egg-animation/",date:"November 6, 2015",title:"The Making of the CSS-Tricks Logo Easter Egg Animation"},{platform:t,link:"https://css-tricks.com/the-importance-of-context-shifting-in-ux-patterns/",date:"September 10, 2015",title:"The Importance of Context-Shifting in UX Patterns"},{platform:t,link:"https://css-tricks.com/debugging-css-keyframe-animations/",date:"August 3, 2015",title:"Debugging CSS Keyframe Animations"},{platform:v,link:"http://davidwalsh.name/gsap-features",date:"October 6, 2015",title:"GSAP and SVG for Power Users Part 3: New 1.18.0 Features"},{platform:v,link:"http://davidwalsh.name/gsap-svg-responsive-animation",date:"July 14, 2015",title:"GSAP and SVG for Power Users Part 2: Complex Responsive Animation"},{platform:v,link:"http://davidwalsh.name/gsap-svg",date:"June 29, 2015",title:"GSAP and SVG for Power Users Part 1: Motion Along a Path"},{platform:k,link:"http://www.smashingmagazine.com/2015/06/08/practical-techniques-on-designing-animation/",date:"June 8, 2015",title:"Practical Techniques on Designing Animation"},{platform:k,link:"http://www.smashingmagazine.com/2015/03/17/different-ways-to-use-svg-sprites-in-animation/",date:"March 17, 2015",title:"A Few Different Ways To Use SVG Sprites In Animation"},{platform:t,link:"https://css-tricks.com/weighing-svg-animation-techniques-benchmarks/",date:"January 27, 2015",title:"Weighing SVG Animation Techniques (with Benchmarks)"}],speaking:[{conference:F,link:S,keynote:e,city:x,date:D},{conference:F,link:S,keynote:e,city:x,date:D},{conference:"Frontend Masters: Vue.js 3 Fundamentals, v2",link:S,keynote:e,city:x,date:"Sep 23, 2020"},{conference:"Vue Amsterdam",link:"https://vuejs.amsterdam/",keynote:e,city:T,date:"Feb 20-21, 2020"},{conference:"JSConf Hawaiʻi",link:"https://www.jsconfhi.com/",keynote:e,city:"Hawaiʻi, USA",date:"Feb 5-7, 2020"},{conference:"An Event Apart Denver",link:"http://aneventapart.com/event/denver-2019",keynote:e,city:"Denver CO",date:"October 28-29, 2019"},{conference:$,link:"https://concatenate.io",keynote:e,city:"Nigeria and Kenya",date:"October 11 - 17, 2019"},{conference:"Artifact",link:"https://artifactconf.com/",keynote:e,city:"Austin, Texas",date:"September 30- October 1, 2019"},{conference:"Fullstack Fest",link:"https://2019.fullstackfest.com/",keynote:e,city:j,date:"September 4-6, 2019"},{conference:"An Event Apart Washington DC",link:"https://aneventapart.com/event/washington-dc-2019",keynote:e,city:"Washington DC",date:"July 29-31, 2019"},{conference:"Jamstack Conf",link:"https://jamstackconf.com/london/",keynote:a,city:"London",date:"July 9-10, 2019"},{conference:z,link:M,keynote:e,city:_,date:"June 25-26, 2019"},{conference:W,link:I,keynote:e,city:_,date:"June 24, 2019"},{conference:"Dinosaur JS",link:"https://dinosaurjs.org/",keynote:a,city:"Denver",date:"June 20, 2019"},{conference:"All Day Hey",link:"https://alldayhey.com/",keynote:e,city:"Leeds, UK",date:"May 3, 2019"},{conference:"Codecamp",link:"https://codecamp.ro/cluj",keynote:a,city:b,date:"April 13, 2019"},{conference:N,link:P,keynote:a,city:b,date:"April 11-12, 2019"},{conference:"PerfMatters",link:"https://perfmattersconf.com/",keynote:e,city:h,date:"April 2-3, 2019"},{conference:O,link:"https://us.vuejs.org/",keynote:e,city:"Tampa, FL",date:"March 25-27, 2019"},{conference:"An Event Apart Seattle",link:"http://aneventapart.com/event/seattle-2019",keynote:e,city:f,date:"March 4–6, 2019"},{conference:"DenverScript",link:"https://www.meetup.com/DenverScript/",keynote:e,city:f,date:"February 26, 2019"},{conference:"Clarity Conf",link:"https://www.clarityconf.com/",keynote:e,city:m,date:"December 11-12, 2018"},{conference:"Microsoft Ignite | The Tour",link:"https://www.microsoft.com/en-us/ignite-the-tour/?WT.mc_id=tour-drasnersite-sdras",keynote:e,city:"Berlin",date:"December 6-7, 2018"},{conference:"Frontend Masters: Advanced SVG Animations v2",link:V,keynote:e,city:L,date:"November 30, 2018"},{conference:"Frontend Masters: Design for Developers",link:V,keynote:e,city:L,date:"November 29, 2018"},{conference:"Coldfront",link:"https://2018.coldfront.co/",keynote:e,city:"Copenhagen",date:"November 13-14, 2018"},{conference:"VueFes Japan",link:"https://vuefes.jp/",keynote:e,city:"Tokyo",date:"November 3, 2018"},{conference:z,link:M,keynote:e,city:m,date:"October 23-24, 2018"},{conference:W,link:I,keynote:e,city:m,date:"October 25, 2018"},{conference:"Web Unleashed",link:"http://fitc.ca/event/webu18/",keynote:e,city:g,date:"October 1-3, 2018"},{conference:$,link:"https://concatenate.io/",keynote:e,city:"Lagos, Nigeria",date:"August 10-11, 2018"},{conference:"Fullstack",link:"https://skillsmatter.com/conferences/9815-fullstack-2018-the-conference-on-javascript-node-and-internet-of-things",keynote:a,city:q,date:"July 11-13, 2018"},{conference:s,link:i,keynote:e,city:"Brighton, UK",date:"July 9-10, 2018"},{conference:"Serverless Days",link:"https://london.serverlessdays.io/",keynote:a,city:q,date:"July 6, 2018"},{conference:W,link:I,keynote:e,city:g,date:"June 25, 2018"},{conference:z,link:"hhttps://smashingconf.com/",keynote:e,city:"no slides conference, Toronto, Canada",date:"June 26-27, 2018"},{conference:"FrontTrends",link:"https://2018.front-trends.com/",keynote:a,city:"Warsaw, Poland",date:"May 24-25, 2018"},{conference:"Microsoft Build",link:"https://www.microsoft.com/en-us/build",keynote:e,city:"Seattle, WA",date:"May 8-11, 2018"},{conference:"Uphill Conf",link:K,keynote:e,city:ue,date:"May 3, 2018"},{conference:"SVG Animation Workshop at Uphill Conf",link:K,keynote:e,city:ue,date:"May 2, 2018"},{conference:N,link:P,keynote:e,city:b,date:"April 18-20, 2018"},{conference:"Smashing Conf SF Workshop",link:"https://smashingconf.com/sf-2018/workshops",keynote:e,city:"San Francisco, California",date:"April 16, 2018"},{conference:O,link:Q,keynote:e,city:X,date:"March 27-28, 2018"},{conference:"VueConf US Workshop",link:Q,keynote:e,city:X,date:"March 26, 2018"},{conference:"JS Conf Iceland",link:"https://2018.jsconf.is/",keynote:a,city:"Reykjavik, Iceland",date:"March 1-2, 2018"},{conference:"VueConf Amsterdam",link:"https://www.frontenddeveloperlove.com/vuejsamsterdam/",keynote:e,city:Z,date:"February 16, 2018"},{conference:"Frontend Love",link:"https://www.frontenddeveloperlove.com/frontendlove",keynote:e,city:Z,date:"February 15, 2018"},{conference:"You Gotta Love Frontend",link:"https://www.yougottalovefrontend.com/",keynote:e,city:"Tel Aviv, Israel",date:"Oct 30-31, 2017"},{conference:ee,link:te,keynote:a,city:ne,date:"Oct 9-11, 2017"},{conference:"CSS Dev Conf Workshop with Val Head",link:te,keynote:e,city:ne,date:"Oct 11, 2017"},{conference:s,link:i,keynote:e,city:"Pittsburgh",date:"Oct 13, 2017"},{conference:"Smashing Conf Barcelona",link:"http://lanyrd.com/2017/smashingconf-barcelona/",keynote:e,city:j,date:"Oct 17-18, 2017"},{conference:"Reactive Conf",link:"https://reactiveconf.com/",keynote:e,city:"Bratislava, Slovakia",date:"October 26-28, 2017"},{conference:"FullStack Fest",link:"https://2017.fullstackfest.com/",keynote:e,city:j,date:"September 7-8, 2017"},{conference:s,link:i,keynote:e,city:"Portland",date:"September 18-19, 2017"},{conference:"D3 Unconf",link:"http://visfest.com/d3unconf-2017/",keynote:a,city:h,date:"September 21-22, 2017"},{conference:"The Web Unleashed- Workshop",link:"http://fitc.ca/event/webu17/",keynote:e,city:g,date:"September 25-26, 2017"},{conference:"JS Channel",link:"http://jschannel.com/#/",keynote:a,city:"Bangalore, India",date:"July 28-29, 2017"},{conference:"Develop Denver",link:"https://developdenver.org/",keynote:e,city:f,date:"August 10-11, 2017"},{conference:s,link:i,keynote:e,city:f,date:"August 18, 2017"},{conference:"Frontend Conference Zurich",link:oe,keynote:e,city:ae,date:"August 31-September 1, 2017"},{conference:s,link:i,keynote:e,city:"Paris",date:"September 4-5, 2017"},{conference:"Frontend Conference Zurich Workshop",link:oe,keynote:e,city:ae,date:"TBA, 2017"},{conference:"Frontend Masters: Vue",link:V,keynote:e,city:d,date:"July 14, 2017"},{conference:"Vue Conf",link:se,keynote:e,city:re,date:"June 22-23, 2017"},{conference:"Vue Workshop",link:se,keynote:e,city:re,date:"June 21, 2017"},{conference:s,link:i,keynote:e,city:_,date:"June 12-13, 2017"},{conference:"Awwwards Conference",link:"http://conference.awwwards.com/los-angeles-2017/",keynote:a,city:"Los Angeles, California",date:"June 1-2, 2017"},{conference:"React Europe",link:"https://www.react-europe.org/",keynote:e,city:"Paris, France",date:"May 18-19,2017"},{conference:"Beyond Tellerrand",link:"https://beyondtellerrand.com/",keynote:e,city:le,date:"May 15-17, 2017"},{conference:"Beyond Tellerrand Workshop: Building SVG",link:"https://beyondtellerrand.com/events/duesseldorf-2017/workshops/from-animations-to-data-visualisation",keynote:e,city:le,date:"May 17, 2017"},{conference:"FITC Toronto 2017- The Technology & Creativity Conference",link:"http://fitc.ca/event/to17/",keynote:e,city:g,date:"April 23-25, 2017"},{conference:s,link:i,keynote:e,city:"Chicago",date:"April 13-14, 2017"},{conference:he,link:"https://smashingconf.com/workshops/sarah-drasner",keynote:e,city:y,date:"April 6, 2017"},{conference:"SFHTML5",link:"https://www.meetup.com/sfhtml5/",keynote:e,city:y,date:"April 7, 2017"},{conference:"Forward JS Workshop",link:"https://forwardjs.com/",keynote:e,city:h,date:"Mar 4, 2017"},{conference:s,link:i,keynote:e,city:y,date:"February 20-21, 2017"},{conference:de,link:"http://environmentsforhumans.com/2017/svg-summit/",keynote:e,city:d,date:"February 15, 2017"},{conference:"Sass Summit, Environments for Humans",link:"http://environmentsforhumans.com/2016/sass-summit/",keynote:e,city:d,date:"Dec 14, 2016"},{conference:s,link:i,keynote:e,city:m,date:"Dec 8-9, 2016"},{conference:"CSSDay.io",link:"http://cssday.io/",keynote:a,city:"Arizona",date:"Dec 3, 2016"},{conference:"CSS Dev Conf Asia",link:"https://2016.cssconf.asia/",keynote:e,city:"Singapore",date:"Nov 24, 2016"},{conference:s,link:i,keynote:e,city:"Austin, TX",date:"Nov 14-15, 2016"},{conference:"O’Reilly Live Training: Building SVG Animations",link:"http://www.oreilly.com/live-training/building-svg-animations.html",keynote:e,city:me,date:"Nov 1-2, 2016"},{conference:ee,link:"http://2016.cssdevconf.com/",keynote:e,city:"San Antonio, TX",date:"Oct 17-18, 2016"},{conference:"Fronteers",link:"https://fronteers.nl/congres/2016",keynote:e,city:T,date:"Oct 6-7, 2016"},{conference:"Fronteers Workshop: Advanced SVG Animation",link:"https://fronteers.nl/congres/2016/workshops/advanced-svg-animation-with-sarah-drasner",keynote:e,city:T,date:"Oct 5, 2016"},{conference:"CSSConf",link:"https://2016.cssconf.com/",keynote:a,city:me,date:"Sept 26-27, 2016"},{conference:"Mirror Conf",link:"http://mirrorconf.com/",keynote:e,city:"Braga, Portugal, CA",date:"September 23-24, 2016"},{conference:"Smashing Conf Freiburg",link:"http://lanyrd.com/2016/smashingconf-freiburg/",keynote:e,city:"Freiburg, Germany",date:"Sept 12-13, 2016"},{conference:"React Rally",link:"http://www.reactrally.com/#/",keynote:a,city:"Salt Lake City, UT",date:"August 25-26, 2016"},{conference:pe,link:"http://www.generateconf.com/san-francisco-2016/",keynote:e,city:h,date:"July 15, 2016"},{conference:"Smashing Conf New York",link:"http://smashingconf.com/",keynote:e,city:A,date:"June 14-15, 2016"},{conference:he,link:"http://smashingconf.com/workshops/sarah-drasner",keynote:e,city:A,date:"June 16, 2016"},{conference:"Valio Con",link:"http://valiocon.com/",keynote:e,city:"San Diego, CA",date:"May 19-22, 2016"},{conference:pe,link:"http://www.generateconf.com/new-york-2016",keynote:e,city:A,date:"April 22, 2016"},{conference:"O’Reilly Fluent",link:"http://conferences.oreilly.com/fluent/javascript-html-us?cmp=ot-web-confreg-home-flca16_eventlisting",keynote:a,city:h,date:"March 8-10, 2016"},{conference:"JavaScript Summit",link:"http://environmentsforhumans.com/2016/javascript-summit/",keynote:e,city:d,date:"February 23-24, 2016"},{conference:"ForwardJS Summit",link:"http://forwardjs.com/summit",keynote:e,city:h,date:"February 10, 2016"},{conference:de,link:"http://environmentsforhumans.com/2016/svg-summit/",keynote:e,city:d,date:"January 21, 2016"}],podcasts:[{conference:"★ Frontend Happy Hour: Sipping our drinks, enjoying the Vue - Vue JS",link:"https://frontendhappyhour.com/episodes/sipping-our-drinks-enjoying-the-vue-vue-js/",keynote:e,city:n,date:"Nov 24, 2019"},{conference:"Full Stack Cast: Change, Dogma, and Growing as an Engineer",link:"https://shows.pippa.io/full-stack-cast/episodes/sarah-drasner-change-dogma-and-growing-as-an-engineer",keynote:e,city:n,date:"June 17, 2019"},{conference:"Learning Vue- teaching Chris Coyier",link:"https://css-tricks.com/video-screencasts/159-learning-vue/",keynote:e,city:n,date:"May 12, 2018"},{conference:"Codenewbies",link:"https://www.codenewbie.org/podcast/which-javascript-framework-should-you-learn",keynote:e,city:n,date:"February 26, 2018"},{conference:"FullStack Radio",link:"http://www.fullstackradio.com/82",keynote:e,city:n,date:"February 14, 2018"},{conference:"Software Engineering Daily",link:"https://softwareengineeringdaily.com/2017/12/01/animating-vuejs-with-sarah-drasner/",keynote:e,city:n,date:"December 1, 2017"},{conference:"CodePen Radio",link:"https://blog.codepen.io/2017/06/20/135-sarah-drasner/",keynote:e,city:n,date:"June 20, 2017"},{conference:"The Versioning Show",link:"https://www.sitepoint.com/animating-with-css-javascript-and-svg/",keynote:e,city:n,date:"June 13, 2017"},{conference:"Non-breaking Space",link:"https://goodstuff.fm/nbsp/119",keynote:e,city:n,date:"May 16, 2017"},{conference:"Stack Overflow Podcast",link:"https://stackoverflow.blog/2017/05/08/podcast-108-welcome-back-joel/",keynote:e,city:n,date:"May 8, 2017"},{conference:"The Modern Web, Vue.js with Sarah Drasner and Evan You",link:"https://modernweb.podbean.com/e/mw-s04e09-evan-yu-sarah-drasner",keynote:e,city:n,date:"April 27, 2017"},{conference:"Thundernerds",link:"https://www.youtube.com/watch?v=nz20pVC2Vxg",keynote:e,city:n,date:"April 10, 2017"},{conference:"Toolsday: Animation Tools with Sarah",link:"http://toolsday.io/episodes/animationtools.html",keynote:e,city:n,date:"December 20, 2016"},{conference:"Coding Rainbow, Guest Tutorial: Web Animations and Mo.js",link:"https://www.youtube.com/watch?v=yRxWa8lXasI&t=1s",keynote:e,city:n,date:"December 19, 2016"},{conference:"JavaScript Air, Web Animations",link:"https://javascriptair.com/episodes/2016-06-29/",keynote:e,city:n,date:"June 29, 2016"},{conference:"Scotch Makes Us Animated, Front End Happy Hour",link:"http://frontendhappyhour.com/episodes/scotch-makes-us-animated/",keynote:e,city:n,date:"June 6, 2016"},{conference:"Shoptalk Show episode on Animation with Val Head",link:"http://shoptalkshow.com/episodes/216-val-head-sarah-drasner/",keynote:e,city:n,date:"May 20, 2016"},{conference:"React Powered Comment Form Pairing with Chris Coyier on CSS-Tricks",link:"https://css-tricks.com/video-screencasts/147-starting-react-powered-comment-form/",keynote:e,city:n,date:"March 18, 2016"},{conference:"Episcura",link:"http://episcura.com/blog/2016/03/09/featured-artist-interview-sarah-drasner/",keynote:e,city:n,date:"March 9, 2016"},{conference:"Non-Breaking Space",link:"http://goodstuff.fm/nbsp/63",keynote:e,city:n,date:"January 18, 2016"},{conference:"SVG Immersion Podcast Round Table: Sarah Drasner, Petr Tichy, Dudley Storey",link:"http://svgimmersion.com/round-table-sarah-drasner-petr-tichy-dudley-storey",keynote:e,city:n,date:"November 27, 2015"},{conference:"Shop Talk Show",link:"http://shoptalkshow.com/episodes/177-with-sarah-drasner/",keynote:e,city:n,date:"August 4, 2015"},{conference:"CSS Design Awards",link:"http://www.cssdesignawards.com/dd/design-stories-8-analogue-passions-of-web-professionals/53/",keynote:e,city:n,date:"June 10, 2015"},{conference:"SVG Immersion Podcast",link:"http://svgimmersion.com/interview-sarah-drasner-p1",keynote:e,city:n,date:"April 16, 2015"}]},serverRendered:a}}(!1,"CSS-Tricks","",null,!0,"https://webanimationworkshops.com/","Web Animation Workshops with Val Head","Netlify Blog","all posts","San Francisco, CA","CSS Tricks","Online","New York","life updates","Netlify","Toronto, Canada","Denver, CO","San Francisco","year end review","Smashing Magazine","Cluj, Romania","David Walsh Blog","https://smashingconf.com/workshops","https://frontendmasters.com/workshops/","New York, NY","Virtual",0,"Amsterdam","Toronto","Barcelona, Spain","https://frontendmasters.com/courses/","Smashing Conf","Smashing Workshop: Intro to Vue","https://smashingconf.com/","Sept 25, 2020","Frontend Masters: Building Web Applications with Vue 3","Net Magazine","JS Heroes","https://jsheroes.io/","October 17, 2018","VueConf US","Oct 5, 2020","https://shoppity.azurewebsites.net/",0,"Minneapolis",0,"London, UK",0,0,"https://uphillconf.com/","Concatenate","http://us.vuejs.org/","New Orleans, Louisiana","Amsterdam, Netherlands","CSS Dev Conf","http://2017.cssdevconf.com/","New Orleans, LA","https://frontendconf.ch/","Zurich, Switzerland",0,"https://conf.vuejs.org/","Wrocław, Poland","Düsseldorf","Smashing Conf Workshop: Advanced SVG Animations","introspection","SVG Summit","Boston, MA","Generate Conf (NetMag)","Bern, Switzerland")</script><script src="/_nuxt/21139e525cff45921797.js" defer></script><script src="/_nuxt/874d3d38e3bf4e568bdc.js" defer></script><script src="/_nuxt/9f4e10bfcbf3e95aef1f.js" defer></script><script src="/_nuxt/4bda9c7095f4f9df3298.js" defer></script><script src="/_nuxt/45f91ff6957fed4552a2.js" defer></script> <script> if (window.netlifyIdentity) { window.netlifyIdentity.on("init", user => { if (!user) { window.netlifyIdentity.on("login", () => { document.location.href = "/admin/"; }); } }); } </script><!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-143840589-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-143840589-1'); </script></body> </html>