From 9ed567ec08cee7f96b363bc1847697ee71e1ba88 Mon Sep 17 00:00:00 2001 From: "Rico Sta. Cruz" Date: Sun, 14 Jun 2020 11:02:56 +1000 Subject: [PATCH 1/6] Replace Webpack (_js) with Parcel (_parcel) --- .babelrc | 5 +- .gitattributes | 1 + .prettierrc | 3 +- Makefile | 32 +- _config.yml | 24 +- _includes/2017/critical/critical.js | 16 +- _includes/2017/foot.html | 2 - _js/app.js | 7 - _js/helpers/__tests__/qs.test.js | 21 - _js/wrapify/__tests__/index.test.js | 63 - _parcel/app.js | 31 + {_js => _parcel}/behaviors/anchors.js | 6 +- {_js => _parcel}/behaviors/dismiss.js | 2 +- {_js => _parcel}/behaviors/dismissable.js | 0 {_js => _parcel}/behaviors/disqus.js | 0 {_js => _parcel}/behaviors/h3-section-list.js | 4 +- {_js => _parcel}/behaviors/main-body.js | 0 {_js => _parcel}/behaviors/no-preview.js | 0 {_js => _parcel}/behaviors/search-form.js | 2 +- {_js => _parcel}/behaviors/search-input.js | 4 +- .../behaviors/searchable-header.js | 7 +- {_js => _parcel}/behaviors/searchable-item.js | 0 {_js => _parcel}/critical.js | 2 +- {_js => _parcel}/helpers/data.js | 6 +- {_js => _parcel}/helpers/dismiss.js | 4 +- {_js => _parcel}/helpers/dom.js | 23 +- {_js => _parcel}/helpers/inject_disqus.js | 6 +- {_js => _parcel}/helpers/noop.js | 0 {_js => _parcel}/helpers/permutate.js | 15 +- {_js => _parcel}/helpers/preview.js | 2 +- {_js => _parcel}/helpers/qs.js | 6 +- {_js => _parcel}/helpers/search.js | 12 +- {_js => _parcel}/helpers/store.js | 4 +- {_js => _parcel}/initializers/onmount.js | 4 +- _parcel/initializers/prism.js | 1 + .../__snapshots__/index.test.js.snap | 0 _parcel/wrapify/__tests__/index.test.js | 88 + {_js => _parcel}/wrapify/index.js | 37 +- _sass/2017/style.scss | 4 +- assets/packed/app.css | 3 + assets/packed/app.js | 169 +- assets/packed/app.js.map | 1 - assets/packed/vendor.js | 2 - assets/packed/vendor.js.map | 1 - package.json | 87 +- yarn.lock | 10428 ++++++++++------ 46 files changed, 7001 insertions(+), 4134 deletions(-) create mode 100644 .gitattributes delete mode 100644 _js/app.js delete mode 100644 _js/helpers/__tests__/qs.test.js delete mode 100644 _js/wrapify/__tests__/index.test.js create mode 100644 _parcel/app.js rename {_js => _parcel}/behaviors/anchors.js (93%) rename {_js => _parcel}/behaviors/dismiss.js (94%) rename {_js => _parcel}/behaviors/dismissable.js (100%) rename {_js => _parcel}/behaviors/disqus.js (100%) rename {_js => _parcel}/behaviors/h3-section-list.js (87%) rename {_js => _parcel}/behaviors/main-body.js (100%) rename {_js => _parcel}/behaviors/no-preview.js (100%) rename {_js => _parcel}/behaviors/search-form.js (91%) rename {_js => _parcel}/behaviors/search-input.js (88%) rename {_js => _parcel}/behaviors/searchable-header.js (70%) rename {_js => _parcel}/behaviors/searchable-item.js (100%) rename {_js => _parcel}/critical.js (96%) rename {_js => _parcel}/helpers/data.js (74%) rename {_js => _parcel}/helpers/dismiss.js (87%) rename {_js => _parcel}/helpers/dom.js (55%) rename {_js => _parcel}/helpers/inject_disqus.js (81%) rename {_js => _parcel}/helpers/noop.js (100%) rename {_js => _parcel}/helpers/permutate.js (79%) rename {_js => _parcel}/helpers/preview.js (79%) rename {_js => _parcel}/helpers/qs.js (67%) rename {_js => _parcel}/helpers/search.js (66%) rename {_js => _parcel}/helpers/store.js (89%) rename {_js => _parcel}/initializers/onmount.js (73%) create mode 100644 _parcel/initializers/prism.js rename {_js => _parcel}/wrapify/__tests__/__snapshots__/index.test.js.snap (100%) create mode 100644 _parcel/wrapify/__tests__/index.test.js rename {_js => _parcel}/wrapify/index.js (77%) create mode 100644 assets/packed/app.css delete mode 100644 assets/packed/app.js.map delete mode 100644 assets/packed/vendor.js delete mode 100644 assets/packed/vendor.js.map diff --git a/.babelrc b/.babelrc index 43a5682a6..cf97ee5ce 100644 --- a/.babelrc +++ b/.babelrc @@ -1,9 +1,10 @@ { "presets": [ [ - "env", + "@babel/preset-env", { - "forceAllTransforms": true + "useBuiltIns": "entry", + "targets": "> 2%" } ] ] diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..cdfdd3780 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +yarn.lock binary diff --git a/.prettierrc b/.prettierrc index ae863e143..4f49fe278 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,6 @@ { "semi": false, "singleQuote": true, - "jsxSingleQuote": true + "jsxSingleQuote": true, + "trailingComma": "none" } diff --git a/Makefile b/Makefile index e2ad817c4..b64cf7c38 100644 --- a/Makefile +++ b/Makefile @@ -16,36 +16,10 @@ _site: bundle exec jekyll build --incremental critical: _site ## Builds critical path CSS/JS - node _support/critical.js + yarn critical -# Ensure that bins are available. -ensure-bin: - @if [ ! -d $(npmbin) ]; then \ - echo "---"; \ - echo "Error: $(npmbin) not found, you may need to run '[docker-compose run --rm web] yarn install'."; \ - echo "---"; \ - exit 1; \ - fi - @if ! which jekyll &>/dev/null; then \ - echo "---"; \ - echo "Warning: Jekyll not found, you may need to run '[docker-compose run --rm web] bundle install'."; \ - echo "---"; \ - fi - -dev: ensure-bin ## Starts development server - $(npmbin)/concurrently -k -p command -c "blue,green" \ - "make dev-webpack" \ - "make dev-jekyll" - -dev-webpack: ensure-bin - $(npmbin)/webpack --watch --colors -p - -dev-jekyll: ensure-bin - if [ -f _site ]; then \ - bundle exec jekyll serve --safe --trace --drafts --watch --incremental --host $(HOST) --port $(PORT); \ - else \ - bundle exec jekyll serve --safe --trace --drafts --watch --host $(HOST) --port $(PORT); \ - fi +dev: + yarn dev test: _site ## Runs rudimentary tests @test -f _site/vim.html diff --git a/_config.yml b/_config.yml index f931eb28a..499ea866f 100644 --- a/_config.yml +++ b/_config.yml @@ -9,21 +9,23 @@ plugins: - jekyll-github-metadata exclude: - - Makefile - - README.md + - .babelrc + - .cache + - CNAME - CONTRIBUTING.md + - docker_compose.yml + - Dockerfile - Gemfile - Gemfile.lock - - CNAME - - vendor - - package.json - - .babelrc - - yarn.lock - - package-lock.json - - webpack.config.js + - Makefile - node_modules - - Dockerfile - - docker_compose.yml + - package.json + - package-lock.json + - README.md + - vendor + - webpack.config.js + - yarn-error.log + - yarn.lock # Markdown diff --git a/_includes/2017/critical/critical.js b/_includes/2017/critical/critical.js index 9a95fcaa0..3d02adbea 100644 --- a/_includes/2017/critical/critical.js +++ b/_includes/2017/critical/critical.js @@ -1 +1,15 @@ -!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var t={};n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n(n.s=2)}([function(e,n){function t(e,n){var t=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;if(t)return t.call(e,n);if(e.parentNode){for(var r=e.parentNode.querySelectorAll(n),o=r.length;o--;0)if(r[o]===e)return!0;return!1}}e.exports=t},function(e,n,t){function r(e,n){if(n){if(Array.isArray(n))return void o(n,function(n){r(e,n)});if(e.classList){var t=n.split(" ").filter(Boolean);o(t,function(n){e.classList.add(n)})}else e.className+=" "+n}}var o=t(4);e.exports=r},function(e,n,t){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(){d||((0,c.default)(document.documentElement,"LoadDone"),d=!0)}var i=t(3),u=r(i),a=t(1),c=r(a),f=t(6),l=r(f),s=document.querySelector("[data-js-main-body]");s&&((0,u.default)(s),(0,c.default)(s,"-wrapified")),(0,l.default)(window,"load",o),setTimeout(o,5e3);var d=void 0},function(e,n,t){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){if(Array.isArray(e)){for(var n=0,t=Array(e.length);nt.length)&&(e=t.length);for(var r=0,n=new Array(e);rr.length)&&(t=r.length);for(var n=0,e=new Array(t);n - {% for lang in page.prism_languages %}{% endfor %} diff --git a/_js/app.js b/_js/app.js deleted file mode 100644 index 1099f465c..000000000 --- a/_js/app.js +++ /dev/null @@ -1,7 +0,0 @@ -// 3rd party libs -window.Prism = require('prismjs') - -// All the others -function requireAll (r) { r.keys().forEach(r) } -requireAll(require.context('./initializers/', true, /\.js$/)) -requireAll(require.context('./behaviors/', true, /\.js$/)) diff --git a/_js/helpers/__tests__/qs.test.js b/_js/helpers/__tests__/qs.test.js deleted file mode 100644 index e71495c32..000000000 --- a/_js/helpers/__tests__/qs.test.js +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-env jest */ -import qs from '../qs' - -describe('qs()', () => { - test('basic', run({ - input: '?preview=1', - output: { preview: '1' } - })) - - test('two fragments', run({ - input: '?a=1&b=2', - output: { a: '1', b: '2' } - })) - - function run ({ input, output }) { - return function () { - const result = qs(input) - expect(result).toEqual(output) - } - } -}) diff --git a/_js/wrapify/__tests__/index.test.js b/_js/wrapify/__tests__/index.test.js deleted file mode 100644 index 1b51f359d..000000000 --- a/_js/wrapify/__tests__/index.test.js +++ /dev/null @@ -1,63 +0,0 @@ -/* eslint-env jest */ -import wrapify from '../index' -import $ from 'jquery' - -it('simple usage', run(` -
-

simple usage

- -

install

-

(install)

- -

usage

-

(usage)

-
-`, $div => { - expect($div.find('.h2-section .h3-section-list .h3-section').length).toEqual(2) -})) - -it('h3 with class', run(` -
-

install

-

(install)

-
-`, $div => { - expect($div.find('div.h3-section.-hello').length).toEqual(1) - expect($div.find('div.h3-section-list.-hello').length).toEqual(1) -})) - -it('multiple h2s', run(` -
-

multiple h2

- -

install

-

(install)

- -

usage

-

(usage)

- -

getting started

- -

first

-

(first)

- -

second

-

(second)

-
-`)) - -function run (input, fn) { - return function () { - const $div = $(input) - wrapify($div[0]) - expect($div[0]).toMatchSnapshot() - if (fn) fn($div) - } -} - -it('h2 + pre', run(` -
-

heading

-
(code)
-
-`)) diff --git a/_parcel/app.js b/_parcel/app.js new file mode 100644 index 000000000..11134b7e5 --- /dev/null +++ b/_parcel/app.js @@ -0,0 +1,31 @@ +// Prismjs +import 'prismjs' +import 'prismjs/plugins/line-highlight/prism-line-highlight.min.js' +import 'prismjs/components/prism-jsx.min.js' +import 'prismjs/components/prism-bash.min.js' +import 'prismjs/components/prism-scss.min.js' +import 'prismjs/components/prism-css.min.js' +import 'prismjs/components/prism-elixir.min.js' +import 'prismjs/components/prism-ruby.min.js' + +// Initializers +import './initializers/prism' +import './initializers/onmount' + +// Behaviors +import './behaviors/anchors' +import './behaviors/dismissable' +import './behaviors/dismiss' +import './behaviors/disqus' +import './behaviors/h3-section-list' +import './behaviors/main-body' +import './behaviors/no-preview' +import './behaviors/searchable-header' +import './behaviors/searchable-item' +import './behaviors/search-form' +import './behaviors/search-input' + +// CSS +import 'sanitize.css/sanitize' +import 'prismjs/plugins/line-highlight/prism-line-highlight.css' +import 'hint.css/hint.min.css' diff --git a/_js/behaviors/anchors.js b/_parcel/behaviors/anchors.js similarity index 93% rename from _js/behaviors/anchors.js rename to _parcel/behaviors/anchors.js index 025b5b14e..efe8f7ca4 100644 --- a/_js/behaviors/anchors.js +++ b/_parcel/behaviors/anchors.js @@ -9,7 +9,7 @@ const DEFAULTS = { // text of anchor text: '#', // append before or after innerText? - shouldAppend: false, + shouldAppend: false } /* @@ -19,7 +19,9 @@ const DEFAULTS = { onmount('[data-js-anchors]', function () { const data = JSON.parse(this.getAttribute('data-js-anchors') || '{}') const rules = Array.isArray(data) - ? (data.length ? data : [DEFAULTS]) + ? data.length + ? data + : [DEFAULTS] : [Object.assign({}, DEFAULTS, data)] for (const { rule, className, text, shouldAppend } of rules) { diff --git a/_js/behaviors/dismiss.js b/_parcel/behaviors/dismiss.js similarity index 94% rename from _js/behaviors/dismiss.js rename to _parcel/behaviors/dismiss.js index 676db0f11..8dba8cd44 100644 --- a/_js/behaviors/dismiss.js +++ b/_parcel/behaviors/dismiss.js @@ -14,7 +14,7 @@ onmount('[data-js-dismiss]', function () { const dismissable = getData(parent, 'js-dismissable') const id = (dismissable && dismissable.id) || '' - on(this, 'click', e => { + on(this, 'click', (e) => { Dismiss.setDismissed(id) e.preventDefault() if (parent) remove(parent) diff --git a/_js/behaviors/dismissable.js b/_parcel/behaviors/dismissable.js similarity index 100% rename from _js/behaviors/dismissable.js rename to _parcel/behaviors/dismissable.js diff --git a/_js/behaviors/disqus.js b/_parcel/behaviors/disqus.js similarity index 100% rename from _js/behaviors/disqus.js rename to _parcel/behaviors/disqus.js diff --git a/_js/behaviors/h3-section-list.js b/_parcel/behaviors/h3-section-list.js similarity index 87% rename from _js/behaviors/h3-section-list.js rename to _parcel/behaviors/h3-section-list.js index 45ba06d16..9a6bd5598 100644 --- a/_js/behaviors/h3-section-list.js +++ b/_parcel/behaviors/h3-section-list.js @@ -1,6 +1,6 @@ /* eslint-disable no-new */ -import Isotope from 'isotope-layout/dist/isotope.pkgd.js' +import Isotope from 'isotope-layout' import onmount from 'onmount' import on from 'dom101/on' import qsa from 'dom101/query-selector-all' @@ -17,7 +17,7 @@ onmount('[data-js-h3-section-list]', function () { const images = qsa('img', this) - images.forEach(image => { + images.forEach((image) => { on(image, 'load', () => { iso.layout() }) diff --git a/_js/behaviors/main-body.js b/_parcel/behaviors/main-body.js similarity index 100% rename from _js/behaviors/main-body.js rename to _parcel/behaviors/main-body.js diff --git a/_js/behaviors/no-preview.js b/_parcel/behaviors/no-preview.js similarity index 100% rename from _js/behaviors/no-preview.js rename to _parcel/behaviors/no-preview.js diff --git a/_js/behaviors/search-form.js b/_parcel/behaviors/search-form.js similarity index 91% rename from _js/behaviors/search-form.js rename to _parcel/behaviors/search-form.js index c0091bf24..2cf243516 100644 --- a/_js/behaviors/search-form.js +++ b/_parcel/behaviors/search-form.js @@ -6,7 +6,7 @@ import on from 'dom101/on' */ onmount('[data-js-search-form]', function () { - on(this, 'submit', e => { + on(this, 'submit', (e) => { e.preventDefault() const link = document.querySelector('a[data-search-index]:visible') diff --git a/_js/behaviors/search-input.js b/_parcel/behaviors/search-input.js similarity index 88% rename from _js/behaviors/search-input.js rename to _parcel/behaviors/search-input.js index 0162a2903..ae17e0ac7 100644 --- a/_js/behaviors/search-input.js +++ b/_parcel/behaviors/search-input.js @@ -17,6 +17,8 @@ onmount('[data-js-search-input]', function () { const query = (qs(window.location.search) || {}).q if (query && query.length) { this.value = query - setTimeout(() => { Search.show(query) }) + setTimeout(() => { + Search.show(query) + }) } }) diff --git a/_js/behaviors/searchable-header.js b/_parcel/behaviors/searchable-header.js similarity index 70% rename from _js/behaviors/searchable-header.js rename to _parcel/behaviors/searchable-header.js index a9947944b..b569921dc 100644 --- a/_js/behaviors/searchable-header.js +++ b/_parcel/behaviors/searchable-header.js @@ -10,11 +10,12 @@ import './searchable-item' */ onmount('[data-js-searchable-header]', function () { - const els = nextUntil(this, '[data-js-searchable-header]') - .filter(el => matches(el, '[data-search-index]')) + const els = nextUntil(this, '[data-js-searchable-header]').filter((el) => + matches(el, '[data-search-index]') + ) const keywords = els - .map(n => n.getAttribute('data-search-index')) + .map((n) => n.getAttribute('data-search-index')) .join(' ') .split(' ') diff --git a/_js/behaviors/searchable-item.js b/_parcel/behaviors/searchable-item.js similarity index 100% rename from _js/behaviors/searchable-item.js rename to _parcel/behaviors/searchable-item.js diff --git a/_js/critical.js b/_parcel/critical.js similarity index 96% rename from _js/critical.js rename to _parcel/critical.js index d949e5e85..b92f80be7 100644 --- a/_js/critical.js +++ b/_parcel/critical.js @@ -20,7 +20,7 @@ on(window, 'load', done) setTimeout(done, 5000) let isDone -function done () { +function done() { if (isDone) return addClass(document.documentElement, 'LoadDone') isDone = true diff --git a/_js/helpers/data.js b/_parcel/helpers/data.js similarity index 74% rename from _js/helpers/data.js rename to _parcel/helpers/data.js index 2e74e4285..fddc4073a 100644 --- a/_js/helpers/data.js +++ b/_parcel/helpers/data.js @@ -2,7 +2,7 @@ * Stores and retrieves data from an element. Works like jQuery.data(). */ -export function data (el, key, val) { +export function data(el, key, val) { if (typeof val !== 'undefined') { return getData(el, key) } else { @@ -10,11 +10,11 @@ export function data (el, key, val) { } } -export function getData (el, key) { +export function getData(el, key) { const str = el.getAttribute('data-' + key) return JSON.parse(str || '{}') } -export function setData (el, key, val) { +export function setData(el, key, val) { el.setAttribute('data-' + key, JSON.stringify(val)) } diff --git a/_js/helpers/dismiss.js b/_parcel/helpers/dismiss.js similarity index 87% rename from _js/helpers/dismiss.js rename to _parcel/helpers/dismiss.js index b629d2b71..2d8b1a207 100644 --- a/_js/helpers/dismiss.js +++ b/_parcel/helpers/dismiss.js @@ -7,7 +7,7 @@ import * as Store from './store' * setDismissed('2017-09-02-happy-birthday') */ -export function setDismissed (id) { +export function setDismissed(id) { Store.update('dismissed', function (data) { data[id] = true return data @@ -22,7 +22,7 @@ export function setDismissed (id) { * isDismissed('2017-09-02-happy-birthday') => true */ -export function isDismissed (id) { +export function isDismissed(id) { const data = Store.fetch('dismissed') return data && data[id] } diff --git a/_js/helpers/dom.js b/_parcel/helpers/dom.js similarity index 55% rename from _js/helpers/dom.js rename to _parcel/helpers/dom.js index bf94941cb..723c41fc5 100644 --- a/_js/helpers/dom.js +++ b/_parcel/helpers/dom.js @@ -4,33 +4,35 @@ import matches from 'dom101/matches' * Just like jQuery.append */ -export function appendMany (el, children) { - children.forEach(child => { el.appendChild(child) }) +export function appendMany(el, children) { + children.forEach((child) => { + el.appendChild(child) + }) } /* * Just like jQuery.nextUntil */ -export function nextUntil (el, selector) { +export function nextUntil(el, selector) { const nextEl = el.nextSibling return nextUntilTick(nextEl, selector, []) } -function nextUntilTick (el, selector, acc) { +function nextUntilTick(el, selector, acc) { if (!el) return acc const isMatch = matches(el, selector) if (isMatch) return acc - return nextUntilTick(el.nextSibling, selector, [ ...acc, el ]) + return nextUntilTick(el.nextSibling, selector, [...acc, el]) } /* * Just like jQuery.before */ -export function before (reference, newNode) { +export function before(reference, newNode) { reference.parentNode.insertBefore(newNode, reference) } @@ -38,9 +40,8 @@ export function before (reference, newNode) { * Like jQuery.children('selector') */ -export function findChildren (el, selector) { - return [].slice.call(el.children) - .filter(child => matches(child, selector)) +export function findChildren(el, selector) { + return [].slice.call(el.children).filter((child) => matches(child, selector)) } /** @@ -52,9 +53,9 @@ export function findChildren (el, selector) { * createDiv({ class: 'foo' }) */ -export function createDiv (props) { +export function createDiv(props) { const d = document.createElement('div') - Object.keys(props).forEach(key => { + Object.keys(props).forEach((key) => { d.setAttribute(key, props[key]) }) return d diff --git a/_js/helpers/inject_disqus.js b/_parcel/helpers/inject_disqus.js similarity index 81% rename from _js/helpers/inject_disqus.js rename to _parcel/helpers/inject_disqus.js index 886b15faa..5fd742504 100644 --- a/_js/helpers/inject_disqus.js +++ b/_parcel/helpers/inject_disqus.js @@ -5,12 +5,12 @@ * inject('devhints.disqus.com') */ -export default function inject (host) { +export default function inject(host) { injectEmbed(host) injectCount(host) } -export function injectEmbed (host) { +export function injectEmbed(host) { const d = document const s = d.createElement('script') s.src = `https://${host}/embed.js` @@ -18,7 +18,7 @@ export function injectEmbed (host) { ;(d.head || d.body).appendChild(s) } -export function injectCount (host) { +export function injectCount(host) { const d = document const s = d.createElement('script') s.src = `https://${host}/count.js` diff --git a/_js/helpers/noop.js b/_parcel/helpers/noop.js similarity index 100% rename from _js/helpers/noop.js rename to _parcel/helpers/noop.js diff --git a/_js/helpers/permutate.js b/_parcel/helpers/permutate.js similarity index 79% rename from _js/helpers/permutate.js rename to _parcel/helpers/permutate.js index 99918d7a6..2bbb4e9ca 100644 --- a/_js/helpers/permutate.js +++ b/_parcel/helpers/permutate.js @@ -7,7 +7,7 @@ * }) */ -export default function permutate (data) { +export default function permutate(data) { let words = [] if (data.slug) { words = words.concat(permutateString(data.slug)) @@ -26,11 +26,11 @@ export default function permutate (data) { * => ['h', 'hi', 'j', 'jo', 'joe'] */ -export function permutateString (str) { +export function permutateString(str) { let words = [] let inputs = splitwords(str) - inputs.forEach(word => { + inputs.forEach((word) => { words = words.concat(permutateWord(word)) }) @@ -45,7 +45,7 @@ export function permutateString (str) { * => ['h', 'he', 'hel', 'hell', 'hello'] */ -export function permutateWord (str) { +export function permutateWord(str) { let words = [] const len = str.length for (var i = 1; i <= len; ++i) { @@ -62,10 +62,11 @@ export function permutateWord (str) { * => ['hello', 'world'] */ -export function splitwords (str) { - const words = str.toLowerCase() +export function splitwords(str) { + const words = str + .toLowerCase() .split(/[ /\-_]/) - .filter(k => k && k.length !== 0) + .filter((k) => k && k.length !== 0) return words } diff --git a/_js/helpers/preview.js b/_parcel/helpers/preview.js similarity index 79% rename from _js/helpers/preview.js rename to _parcel/helpers/preview.js index 670c09c68..1c1a49eff 100644 --- a/_js/helpers/preview.js +++ b/_parcel/helpers/preview.js @@ -2,6 +2,6 @@ * Checks if we're in preview mode (?preview=1). */ -export function isPreview () { +export function isPreview() { return window.location.search.indexOf('preview=1') !== -1 } diff --git a/_js/helpers/qs.js b/_parcel/helpers/qs.js similarity index 67% rename from _js/helpers/qs.js rename to _parcel/helpers/qs.js index c87edee8a..e2a2fdc8a 100644 --- a/_js/helpers/qs.js +++ b/_parcel/helpers/qs.js @@ -2,16 +2,16 @@ * Helper: minimal qs implementation */ -export default function qs (search) { +export default function qs(search) { search = search.substr(1) - const parts = search.split('&').map(p => p.split('=')) + const parts = search.split('&').map((p) => p.split('=')) return parts.reduce((result, part) => { result[part[0]] = qsdecode(part[1]) return result }, {}) } -export function qsdecode (string) { +export function qsdecode(string) { if (!string) string = '' string = string.replace(/\+/g, ' ') return string diff --git a/_js/helpers/search.js b/_parcel/helpers/search.js similarity index 66% rename from _js/helpers/search.js rename to _parcel/helpers/search.js index 914b6ef94..db6548664 100644 --- a/_js/helpers/search.js +++ b/_parcel/helpers/search.js @@ -8,8 +8,8 @@ import qsa from 'dom101/query-selector-all' * Search.showAll() */ -export function showAll () { - qsa('[data-search-index]').forEach(el => { +export function showAll() { + qsa('[data-search-index]').forEach((el) => { el.removeAttribute('aria-hidden') }) } @@ -21,20 +21,20 @@ export function showAll () { * Search.show('hello') */ -export function show (val) { +export function show(val) { const keywords = splitwords(val) if (!keywords.length) return showAll() const selectors = keywords - .map(k => `[data-search-index~=${JSON.stringify(k)}]`) + .map((k) => `[data-search-index~=${JSON.stringify(k)}]`) .join('') - qsa('[data-search-index]').forEach(el => { + qsa('[data-search-index]').forEach((el) => { el.setAttribute('aria-hidden', true) }) - qsa(selectors).forEach(el => { + qsa(selectors).forEach((el) => { el.removeAttribute('aria-hidden') }) } diff --git a/_js/helpers/store.js b/_parcel/helpers/store.js similarity index 89% rename from _js/helpers/store.js rename to _parcel/helpers/store.js index 8da6af718..a2f4ad652 100644 --- a/_js/helpers/store.js +++ b/_parcel/helpers/store.js @@ -9,7 +9,7 @@ * }) */ -export function update (key, fn) { +export function update(key, fn) { if (!window.localStorage) return let data = JSON.parse(window.localStorage[key] || '{}') data = fn(data) @@ -23,7 +23,7 @@ export function update (key, fn) { * const data = fetch('dismissed') */ -export function fetch (key) { +export function fetch(key) { if (!window.localStorage) return return JSON.parse(window.localStorage[key] || '{}') } diff --git a/_js/initializers/onmount.js b/_parcel/initializers/onmount.js similarity index 73% rename from _js/initializers/onmount.js rename to _parcel/initializers/onmount.js index f015e59eb..26958618a 100644 --- a/_js/initializers/onmount.js +++ b/_parcel/initializers/onmount.js @@ -6,5 +6,7 @@ import onmount from 'onmount' */ ready(() => { - setTimeout(() => { onmount() }) + setTimeout(() => { + onmount() + }) }) diff --git a/_parcel/initializers/prism.js b/_parcel/initializers/prism.js new file mode 100644 index 000000000..b32e140f8 --- /dev/null +++ b/_parcel/initializers/prism.js @@ -0,0 +1 @@ +window.Prism = require('prismjs') diff --git a/_js/wrapify/__tests__/__snapshots__/index.test.js.snap b/_parcel/wrapify/__tests__/__snapshots__/index.test.js.snap similarity index 100% rename from _js/wrapify/__tests__/__snapshots__/index.test.js.snap rename to _parcel/wrapify/__tests__/__snapshots__/index.test.js.snap diff --git a/_parcel/wrapify/__tests__/index.test.js b/_parcel/wrapify/__tests__/index.test.js new file mode 100644 index 000000000..019161994 --- /dev/null +++ b/_parcel/wrapify/__tests__/index.test.js @@ -0,0 +1,88 @@ +/* eslint-env jest */ +import wrapify from '../index' + +it( + 'simple usage', + run( + ` +
+

simple usage

+ +

install

+

(install)

+ +

usage

+

(usage)

+
+`, + (root) => { + expect( + root.querySelectorAll('.h2-section .h3-section-list .h3-section').length + ).toEqual(2) + } + ) +) + +it( + 'h3 with class', + run( + ` +
+

install

+

(install)

+
+`, + (root) => { + expect(root.querySelectorAll('div.h3-section.-hello').length).toEqual(1) + expect( + root.querySelectorAll('div.h3-section-list.-hello').length + ).toEqual(1) + } + ) +) + +it( + 'multiple h2s', + run(` +
+

multiple h2

+ +

install

+

(install)

+ +

usage

+

(usage)

+ +

getting started

+ +

first

+

(first)

+ +

second

+

(second)

+
+`) +) + +function run(input, fn) { + return function () { + const div = document.createElement('div') + div.innerHTML = input + + const root = div.children[0] + wrapify(root) + expect(root).toMatchSnapshot() + + if (fn) fn(root) + } +} + +it( + 'h2 + pre', + run(` +
+

heading

+
(code)
+
+`) +) diff --git a/_js/wrapify/index.js b/_parcel/wrapify/index.js similarity index 77% rename from _js/wrapify/index.js rename to _parcel/wrapify/index.js index e2b93f589..0af5fbaf1 100644 --- a/_js/wrapify/index.js +++ b/_parcel/wrapify/index.js @@ -1,6 +1,12 @@ import matches from 'dom101/matches' import addClass from 'dom101/add-class' -import { appendMany, nextUntil, before, findChildren, createDiv } from '../helpers/dom' +import { + appendMany, + nextUntil, + before, + findChildren, + createDiv +} from '../helpers/dom' /** * Wraps h2 sections into h2-section. @@ -9,14 +15,16 @@ import { appendMany, nextUntil, before, findChildren, createDiv } from '../helpe * @private */ -export default function wrapify (root) { +export default function wrapify(root) { // These are your H2 sections. Returns a list of .h2-section nodes. const sections = wrapifyH2(root) // For each h2 section, wrap the H3's in them - sections.forEach(section => { + sections.forEach((section) => { const bodies = findChildren(section, '[data-js-h3-section-list]') - bodies.forEach(body => { wrapifyH3(body) }) + bodies.forEach((body) => { + wrapifyH3(body) + }) }) } @@ -33,14 +41,15 @@ export default function wrapify (root) { * @private */ -function wrapifyH2 (root) { +function wrapifyH2(root) { return groupify(root, { tag: 'h2', wrapperFn: () => createDiv({ class: 'h2-section' }), - bodyFn: () => createDiv({ - class: 'body h3-section-list', - 'data-js-h3-section-list': '' - }) + bodyFn: () => + createDiv({ + class: 'body h3-section-list', + 'data-js-h3-section-list': '' + }) }) } @@ -57,7 +66,7 @@ function wrapifyH2 (root) { * @private */ -function wrapifyH3 (root) { +function wrapifyH3(root) { return groupify(root, { tag: 'h3', wrapperFn: () => createDiv({ class: 'h3-section' }), @@ -71,27 +80,27 @@ function wrapifyH3 (root) { * @private */ -export function groupify (el, { tag, wrapperFn, bodyFn }) { +export function groupify(el, { tag, wrapperFn, bodyFn }) { const first = el.children[0] let result = [] // Handle the markup before the first h2 if (first && !matches(first, tag)) { const sibs = nextUntil(first, tag) - result.push(wrap(first, null, [ first, ...sibs ])) + result.push(wrap(first, null, [first, ...sibs])) } // Find all h3's inside it const children = findChildren(el, tag) - children.forEach(child => { + children.forEach((child) => { const sibs = nextUntil(child, tag) result.push(wrap(child, child, sibs)) }) return result - function wrap (pivot, first, sibs) { + function wrap(pivot, first, sibs) { const wrap = wrapperFn() const pivotClass = pivot.className diff --git a/_sass/2017/style.scss b/_sass/2017/style.scss index fe6454134..c69fcde89 100644 --- a/_sass/2017/style.scss +++ b/_sass/2017/style.scss @@ -1,4 +1,6 @@ -@import '../vendor/sanitize.css/sanitize'; +// Generated by parcel +@import '../../assets/packed/app.css'; + @import './variables'; @import '../vendor/modularscale/modularscale'; @import '../vendor/ionicons-inline/ionicons'; diff --git a/assets/packed/app.css b/assets/packed/app.css new file mode 100644 index 000000000..52185c95c --- /dev/null +++ b/assets/packed/app.css @@ -0,0 +1,3 @@ +*,:after,:before{box-sizing:border-box}:after,:before{text-decoration:inherit;vertical-align:inherit}html{cursor:default;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;word-break:break-word}body{margin:0}h1{font-size:2em;margin:.67em 0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{margin:0}hr{height:0;overflow:visible}main{display:block}nav ol,nav ul{list-style:none;padding:0}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}audio,canvas,iframe,img,svg,video{vertical-align:middle}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}iframe,img{border-style:none}svg:not([fill]){fill:currentColor}svg:not(:root){overflow:hidden}table{border-collapse:collapse}button,input,select{margin:0}button{overflow:visible;text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}fieldset{border:1px solid #a0a0a0;padding:.35em .75em .625em}input{overflow:visible}legend{color:inherit;display:table;max-width:100%;white-space:normal}progress{display:inline-block;vertical-align:baseline}select{text-transform:none}textarea{margin:0;overflow:auto;resize:vertical}[type=checkbox],[type=radio]{padding:0}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}details,dialog{display:block}dialog{background-color:#fff;border:solid;color:#000;height:-moz-fit-content;height:-webkit-fit-content;height:fit-content;left:0;margin:auto;padding:1em;position:absolute;right:0;width:-moz-fit-content;width:-webkit-fit-content;width:fit-content}dialog:not([open]){display:none}summary{display:list-item}canvas{display:inline-block}template{display:none}[tabindex],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}[hidden]{display:none}[aria-busy=true]{cursor:progress}[aria-controls]{cursor:pointer}[aria-disabled=true],[disabled]{cursor:not-allowed}[aria-hidden=false][hidden]{display:initial}[aria-hidden=false][hidden]:not(:focus){clip:rect(0,0,0,0);position:absolute}pre[data-line]{position:relative;padding:1em 0 1em 3em}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:hsla(24,20%,50%,.08);background:linear-gradient(90deg,hsla(24,20%,50%,.1) 70%,hsla(24,20%,50%,0));pointer-events:none;line-height:inherit;white-space:pre}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:hsla(24,20%,50%,.4);color:#f5f2f0;font:700 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px #fff}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:after,.line-numbers .line-highlight:before{content:none}/*! Hint.css - v2.6.0 - 2019-04-27 +* http://kushagragour.in/lab/hint/ +* Copyright (c) 2019 Kushagra Gour */[class*=hint--]{position:relative;display:inline-block}[class*=hint--]:after,[class*=hint--]:before{position:absolute;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);transform:translateZ(0);visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;-webkit-transition:.3s ease;-moz-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0s;-moz-transition-delay:0s;transition-delay:0s}[class*=hint--]:hover:after,[class*=hint--]:hover:before{visibility:visible;opacity:1;-webkit-transition-delay:.1s;-moz-transition-delay:.1s;transition-delay:.1s}[class*=hint--]:before{content:"";position:absolute;background:0 0;border:6px solid transparent;z-index:1000001}[class*=hint--]:after{background:#383838;color:#fff;padding:8px 10px;font-size:12px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;line-height:12px;white-space:nowrap;text-shadow:0 -1px 0 #000;box-shadow:4px 4px 8px rgba(0,0,0,.3)}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label=""]:after,[aria-label=""]:before,[data-hint=""]:after,[data-hint=""]:before{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#383838}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#383838}.hint--top:after,.hint--top:before{bottom:100%;left:50%}.hint--top:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translateX(-50%)}.hint--top:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}.hint--bottom:after,.hint--bottom:before{top:100%;left:50%}.hint--bottom:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translateX(-50%)}.hint--bottom:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}.hint--right:before{border-right-color:#383838;margin-left:-11px;margin-bottom:-6px}.hint--right:after{margin-bottom:-14px}.hint--right:after,.hint--right:before{left:100%;bottom:50%}.hint--right:hover:after,.hint--right:hover:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--left:before{border-left-color:#383838;margin-right:-11px;margin-bottom:-6px}.hint--left:after{margin-bottom:-14px}.hint--left:after,.hint--left:before{right:100%;bottom:50%}.hint--left:hover:after,.hint--left:hover:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--top-left:after,.hint--top-left:before{bottom:100%;left:50%}.hint--top-left:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translateX(-100%);margin-left:12px}.hint--top-left:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--top-left:hover:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translateX(-100%) translateY(-8px)}.hint--top-right:after,.hint--top-right:before{bottom:100%;left:50%}.hint--top-right:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translateX(0);margin-left:-12px}.hint--top-right:hover:after,.hint--top-right:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--bottom-left:after,.hint--bottom-left:before{top:100%;left:50%}.hint--bottom-left:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translateX(-100%);margin-left:12px}.hint--bottom-left:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--bottom-left:hover:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translateX(-100%) translateY(8px)}.hint--bottom-right:after,.hint--bottom-right:before{top:100%;left:50%}.hint--bottom-right:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translateX(0);margin-left:-12px}.hint--bottom-right:hover:after,.hint--bottom-right:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--large:after,.hint--medium:after,.hint--small:after{white-space:normal;line-height:1.4em;word-wrap:break-word}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}.hint--error:after{background-color:#b34e4d;text-shadow:0 -1px 0 #592726}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{background-color:#c09854;text-shadow:0 -1px 0 #6c5328}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{background-color:#3986ac;text-shadow:0 -1px 0 #1a3c4d}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{background-color:#458746;text-shadow:0 -1px 0 #1a321a}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--top:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}.hint--always.hint--top-left:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--top-left:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translateX(-100%) translateY(-8px)}.hint--always.hint--top-right:after,.hint--always.hint--top-right:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--bottom:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--bottom:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}.hint--always.hint--bottom-left:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--bottom-left:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translateX(-100%) translateY(8px)}.hint--always.hint--bottom-right:after,.hint--always.hint--bottom-right:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--left:after,.hint--always.hint--left:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--always.hint--right:after,.hint--always.hint--right:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:after,.hint--no-animate:before{-webkit-transition-duration:0s;-moz-transition-duration:0s;transition-duration:0s}.hint--bounce:after,.hint--bounce:before{-webkit-transition:opacity .3s ease,visibility .3s ease,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s ease,visibility .3s ease,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s ease,visibility .3s ease,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:after,.hint--no-shadow:before{text-shadow:none;box-shadow:none} \ No newline at end of file diff --git a/assets/packed/app.js b/assets/packed/app.js index 738692192..a1a7acca8 100644 --- a/assets/packed/app.js +++ b/assets/packed/app.js @@ -1,42 +1,127 @@ -webpackJsonp([0],{"/k7tj9kxRFhFtZjlt346":function(t,e,i){"use strict";function n(t,e){if(window.localStorage){var i=JSON.parse(window.localStorage[t]||"{}");i=e(i),window.localStorage[t]=JSON.stringify(i)}}function o(t){if(window.localStorage)return JSON.parse(window.localStorage[t]||"{}")}Object.defineProperty(e,"__esModule",{value:!0}),e.update=n,e.fetch=o},"2QOxTCxkuzN0PP2kJ2jn":function(t,e,i){"use strict";function n(t){s.update("dismissed",function(e){return e[t]=!0,e})}function o(t){var e=s.fetch("dismissed");return e&&e[t]}Object.defineProperty(e,"__esModule",{value:!0}),e.setDismissed=n,e.isDismissed=o;var r=i("/k7tj9kxRFhFtZjlt346"),s=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}(r)},"2tov+8o2NrZdw/Lg8JZA":function(t,e,i){function n(t){return i(o(t))}function o(t){var e=r[t];if(!(e+1))throw new Error("Cannot find module '"+t+"'.");return e}var r={"./onmount.js":"6hLKOGpXaWUwTDQA5TL2"};n.keys=function(){return Object.keys(r)},n.resolve=o,t.exports=n,n.id="2tov+8o2NrZdw/Lg8JZA"},"6hLKOGpXaWUwTDQA5TL2":function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("tqbVxj9+xGAhlFrQpyTS"),r=n(o),s=i("yfX/NEeqeNrvWENPWWKS"),a=n(s);(0,r.default)(function(){setTimeout(function(){(0,a.default)()})})},"BF4TFfJ+K+wsuHfLZ/S3":function(t,e,i){"use strict";function n(){return-1!==window.location.search.indexOf("preview=1")}Object.defineProperty(e,"__esModule",{value:!0}),e.isPreview=n},BuWMdGeXUEK0GmkN01pU:function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("yfX/NEeqeNrvWENPWWKS"),r=n(o),s=i("cYqQDyTPtD7lV79ovj4Y"),a=n(s);(0,r.default)("[data-js-disqus]",function(){var t=JSON.parse(this.getAttribute("data-js-disqus")),e=this.parentNode;e.setAttribute("hidden",!0),window.disqus_config=function(){this.page.url=t.url,this.page.identifier=t.identifier},window.addEventListener("load",function(){setTimeout(function(){(0,a.default)(t.host),e.removeAttribute("hidden")},100)})})},C2mk7N9JzKWlcOYJrkfi:function(t,e){function i(t,e){var i=t.matches||t.matchesSelector||t.msMatchesSelector||t.mozMatchesSelector||t.webkitMatchesSelector||t.oMatchesSelector;if(i)return i.call(t,e);if(t.parentNode){for(var n=t.parentNode.querySelectorAll(e),o=n.length;o--;0)if(n[o]===t)return!0;return!1}}t.exports=i},"CjZN/azBHJxH2NsOjfdD":function(t,e,i){"use strict";function n(t,e,i){return void 0!==i?o(t,e):r(t,e,i)}function o(t,e){var i=t.getAttribute("data-"+e);return JSON.parse(i||"{}")}function r(t,e,i){t.setAttribute("data-"+e,JSON.stringify(i))}Object.defineProperty(e,"__esModule",{value:!0}),e.data=n,e.getData=o,e.setData=r},"D3SYMdNAenu80VOO7/Dv":function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("yfX/NEeqeNrvWENPWWKS"),r=n(o),s=i("MKJaVdnD9jF7rk6rW6AJ"),a=n(s);(0,r.default)("[data-js-search-form]",function(){(0,a.default)(this,"submit",function(t){t.preventDefault();var e=document.querySelector("a[data-search-index]:visible"),i=e&&e.getAttribute("href");i&&(window.location=i)})})},DfTyEU8lscjHXmCMlptO:function(t,e,i){"use strict";function n(){(0,a.default)("[data-search-index]").forEach(function(t){t.removeAttribute("aria-hidden")})}function o(t){var e=(0,r.splitwords)(t);if(!e.length)return n();var i=e.map(function(t){return"[data-search-index~="+JSON.stringify(t)+"]"}).join("");(0,a.default)("[data-search-index]").forEach(function(t){t.setAttribute("aria-hidden",!0)}),(0,a.default)(i).forEach(function(t){t.removeAttribute("aria-hidden")})}Object.defineProperty(e,"__esModule",{value:!0}),e.showAll=n,e.show=o;var r=i("GOdGag34TlRuHa2OZoh9"),s=i("EvxNxLK9yKFmn1U14Kvw"),a=function(t){return t&&t.__esModule?t:{default:t}}(s)},"E+dCGfS1pT5WowYv7jpv":function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var o=i("GbzL7C/QFmiBZDICkla+"),r=n(o),s=i("yfX/NEeqeNrvWENPWWKS"),a=n(s),u=i("MKJaVdnD9jF7rk6rW6AJ"),h=n(u),c=i("EvxNxLK9yKFmn1U14Kvw"),f=n(c);(0,a.default)("[data-js-h3-section-list]",function(){var t=new r.default(this,{itemSelector:".h3-section",transitionDuration:0});(0,f.default)("img",this).forEach(function(e){(0,h.default)(e,"load",function(){t.layout()})}),(0,h.default)(window,"load",function(){t.layout()})})},EvxNxLK9yKFmn1U14Kvw:function(t,e){function i(t,e){return Array.prototype.slice.call((e||document).querySelectorAll(t))}t.exports=i},GOdGag34TlRuHa2OZoh9:function(t,e,i){"use strict";function n(t){var e=[];return t.slug&&(e=e.concat(o(t.slug))),t.category&&(e=e.concat(o(t.category))),e}function o(t){var e=[];return s(t).forEach(function(t){e=e.concat(r(t))}),e}function r(t){for(var e=[],i=t.length,n=1;n<=i;++n)e.push(t.substr(0,n));return e}function s(t){return t.toLowerCase().split(/[ \/\-_]/).filter(function(t){return t&&0!==t.length})}Object.defineProperty(e,"__esModule",{value:!0}),e.default=n,e.permutateString=o,e.permutateWord=r,e.splitwords=s},"GbzL7C/QFmiBZDICkla+":function(t,e,i){var n,o,r,s,a,n,u,h,c,f,n,d,n,l,p,n,m,n,l,v,n,l,g,n,l,y,n,l,_,n,l,b,n,l,E,n,o;/*! - * Isotope PACKAGED v3.0.4 - * - * Licensed GPLv3 for open source use - * or Isotope Commercial License for commercial use - * - * http://isotope.metafizzy.co - * Copyright 2017 Metafizzy - */ -!function(r,s){n=[i("g2okcHDGBNRpe9zqR9sR")],void 0!==(o=function(t){return s(r,t)}.apply(e,n))&&(t.exports=o)}(window,function(t,e){"use strict";function i(i,r,a){function u(t,e,n){var o,r="$()."+i+'("'+e+'")';return t.each(function(t,u){var h=a.data(u,i);if(!h)return void s(i+" not initialized. Cannot call methods, i.e. "+r);var c=h[e];if(!c||"_"==e.charAt(0))return void s(r+" is not a valid method");var f=c.apply(h,n);o=void 0===o?f:o}),void 0!==o?o:t}function h(t,e){t.each(function(t,n){var o=a.data(n,i);o?(o.option(e),o._init()):(o=new r(n,e),a.data(n,i,o))})}(a=a||e||t.jQuery)&&(r.prototype.option||(r.prototype.option=function(t){a.isPlainObject(t)&&(this.options=a.extend(!0,this.options,t))}),a.fn[i]=function(t){if("string"==typeof t){return u(this,t,o.call(arguments,1))}return h(this,t),this},n(a))}function n(t){!t||t&&t.bridget||(t.bridget=i)}var o=Array.prototype.slice,r=t.console,s=void 0===r?function(){}:function(t){r.error(t)};return n(e||t.jQuery),i}),function(t,e){s=e,a={id:"ev-emitter/ev-emitter",exports:{},loaded:!1},r="function"==typeof s?s.call(a.exports,i,a.exports,a):s,a.loaded=!0,void 0===r&&(r=a.exports)}("undefined"!=typeof window&&window,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var i=this._events=this._events||{},n=i[t]=i[t]||[];return-1==n.indexOf(e)&&n.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var i=this._onceEvents=this._onceEvents||{};return(i[t]=i[t]||{})[e]=!0,this}},e.off=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var n=i.indexOf(e);return-1!=n&&i.splice(n,1),this}},e.emitEvent=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var n=0,o=i[n];e=e||[];for(var r=this._onceEvents&&this._onceEvents[t];o;){var s=r&&r[o];s&&(this.off(t,o),delete r[o]),o.apply(this,e),n+=s?0:1,o=i[n]}return this}},t}),/*! - * getSize v2.0.2 - * measure size of elements - * MIT license - */ -function(t,i){"use strict";n=[],u=function(){return i()}.apply(e,n)}(window,function(){"use strict";function t(t){var e=parseFloat(t);return-1==t.indexOf("%")&&!isNaN(e)&&e}function e(){}function i(){for(var t={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},e=0;e