From 9a74e2af7b827c38db65ac5856cf7c42220b705b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 16 Apr 2022 10:44:28 +0000 Subject: [PATCH] test(a11y): add a11y testing (based on axe-core) (#604) 6109ff9c0b029e8c03d6a058f39f3c3c5dbc60ff --- .nojekyll | 0 404.html | 1 + 404.html.gz | Bin 0 -> 47727 bytes 404/index.html | 1 + 404/index.html.gz | Bin 0 -> 47663 bytes about/index.html | 1 + about/index.html.gz | Bin 0 -> 49756 bytes app-82702098eac976ce09a7.js | 3 + app-82702098eac976ce09a7.js.LICENSE.txt | 23 + app-82702098eac976ce09a7.js.gz | Bin 0 -> 20760 bytes app-82702098eac976ce09a7.js.map | 1 + books/index.html | 1 + books/index.html.gz | Bin 0 -> 48038 bytes ...65e266447fb916e1c7-f06a2ec58da3040f6568.js | 3 + ...16e1c7-f06a2ec58da3040f6568.js.LICENSE.txt | 24 + ...266447fb916e1c7-f06a2ec58da3040f6568.js.gz | Bin 0 -> 189734 bytes ...66447fb916e1c7-f06a2ec58da3040f6568.js.map | 1 + chunk-map.json | 1 + commons-8e088829d30999d21ca5.js | 2 + commons-8e088829d30999d21ca5.js.gz | Bin 0 -> 4513 bytes commons-8e088829d30999d21ca5.js.map | 1 + ...fline-app-shell-js-c8eef4cb2e218060d5ec.js | 2 + ...ne-app-shell-js-c8eef4cb2e218060d5ec.js.gz | Bin 0 -> 352 bytes ...e-app-shell-js-c8eef4cb2e218060d5ec.js.map | 1 + ...-src-pages-404-tsx-8f0fa29cf8c78726b548.js | 2 + ...c-pages-404-tsx-8f0fa29cf8c78726b548.js.gz | Bin 0 -> 378 bytes ...-pages-404-tsx-8f0fa29cf8c78726b548.js.map | 1 + ...emplates-about-tsx-57b0431b2754270102f7.js | 2 + ...lates-about-tsx-57b0431b2754270102f7.js.gz | Bin 0 -> 379 bytes ...ates-about-tsx-57b0431b2754270102f7.js.map | 1 + ...emplates-books-tsx-5ab576df07cee9866291.js | 2 + ...lates-books-tsx-5ab576df07cee9866291.js.gz | Bin 0 -> 339 bytes ...ates-books-tsx-5ab576df07cee9866291.js.map | 1 + ...templates-home-tsx-c1377c9a43fc070df0ed.js | 2 + ...plates-home-tsx-c1377c9a43fc070df0ed.js.gz | Bin 0 -> 347 bytes ...lates-home-tsx-c1377c9a43fc070df0ed.js.map | 1 + ...templates-post-tsx-27b8f3bb9fa0ea7fdee7.js | 2 + ...plates-post-tsx-27b8f3bb9fa0ea7fdee7.js.gz | Bin 0 -> 373 bytes ...lates-post-tsx-27b8f3bb9fa0ea7fdee7.js.map | 1 + ...emplates-posts-tsx-4bfc807a338478db5606.js | 2 + ...lates-posts-tsx-4bfc807a338478db5606.js.gz | Bin 0 -> 346 bytes ...ates-posts-tsx-4bfc807a338478db5606.js.map | 1 + ...templates-tags-tsx-0d483e93f29c5379de01.js | 2 + ...plates-tags-tsx-0d483e93f29c5379de01.js.gz | Bin 0 -> 422 bytes ...lates-tags-tsx-0d483e93f29c5379de01.js.map | 1 + coverage-lines.svg | 1 + cssAdvancedNotes/index.html | 10 + cssAdvancedNotes/index.html.gz | Bin 0 -> 53085 bytes cssBasicNotes/index.html | 2895 ++++++++++ cssBasicNotes/index.html.gz | Bin 0 -> 101829 bytes designPatternsBasicNotes/index.html | 2064 ++++++++ designPatternsBasicNotes/index.html.gz | Bin 0 -> 84383 bytes favicon-32x32.png | Bin 0 -> 1719 bytes framework-2da9b26c220acba5776c.js | 3 + framework-2da9b26c220acba5776c.js.LICENSE.txt | 29 + framework-2da9b26c220acba5776c.js.gz | Bin 0 -> 43572 bytes framework-2da9b26c220acba5776c.js.map | 1 + gitBasicNotes/index.html | 404 ++ gitBasicNotes/index.html.gz | Bin 0 -> 71574 bytes htmlBasicNotes/index.html | 616 +++ htmlBasicNotes/index.html.gz | Bin 0 -> 68193 bytes icons/icon-144x144.png | Bin 0 -> 9683 bytes icons/icon-192x192.png | Bin 0 -> 13179 bytes icons/icon-256x256.png | Bin 0 -> 14860 bytes icons/icon-384x384.png | Bin 0 -> 28862 bytes icons/icon-48x48.png | Bin 0 -> 2779 bytes icons/icon-512x512.png | Bin 0 -> 47205 bytes icons/icon-72x72.png | Bin 0 -> 4370 bytes icons/icon-96x96.png | Bin 0 -> 5988 bytes idb-keyval-3.2.0-iife.min.js | 1 + idb-keyval-3.2.0-iife.min.js.gz | Bin 0 -> 500 bytes index.html | 1 + index.html.gz | Bin 0 -> 40144 bytes javascriptAdvancedNotes/index.html | 4692 +++++++++++++++++ javascriptAdvancedNotes/index.html.gz | Bin 0 -> 164597 bytes javascriptBasicNotes/index.html | 3123 +++++++++++ javascriptBasicNotes/index.html.gz | Bin 0 -> 110076 bytes linuxBasicNotes/index.html | 978 ++++ linuxBasicNotes/index.html.gz | Bin 0 -> 82664 bytes manifest.webmanifest | 1 + offline-plugin-app-shell-fallback/index.html | 1 + .../index.html.gz | Bin 0 -> 39383 bytes page-data/404.html/page-data.json | 5 + page-data/404/page-data.json | 5 + page-data/about/page-data.json | 5 + page-data/app-data.json | 1 + page-data/books/page-data.json | 5 + page-data/cssAdvancedNotes/page-data.json | 5 + page-data/cssBasicNotes/page-data.json | 5 + .../designPatternsBasicNotes/page-data.json | 5 + page-data/gitBasicNotes/page-data.json | 5 + page-data/htmlBasicNotes/page-data.json | 5 + page-data/index/page-data.json | 5 + .../javascriptAdvancedNotes/page-data.json | 5 + page-data/javascriptBasicNotes/page-data.json | 5 + page-data/linuxBasicNotes/page-data.json | 5 + .../page-data.json | 5 + page-data/posts/page-data.json | 5 + page-data/reactBasicNotes/page-data.json | 5 + .../reactRouterBasicNotes/page-data.json | 5 + page-data/reduxBasicNotes/page-data.json | 5 + page-data/securityBasicNotes/page-data.json | 5 + page-data/sq/d/1635110865.json | 1 + page-data/sq/d/1796865374.json | 1 + page-data/sq/d/3354928244.json | 1 + page-data/tags/Architecture/page-data.json | 5 + page-data/tags/CSS/page-data.json | 5 + .../tags/Computer Science/page-data.json | 5 + page-data/tags/Design Patterns/page-data.json | 5 + page-data/tags/Development/page-data.json | 5 + .../tags/Frontend Development/page-data.json | 5 + page-data/tags/GNU/page-data.json | 5 + page-data/tags/Git/page-data.json | 5 + page-data/tags/HTML/page-data.json | 5 + page-data/tags/JavaScript/page-data.json | 5 + page-data/tags/Linux/page-data.json | 5 + page-data/tags/React Router/page-data.json | 5 + page-data/tags/React/page-data.json | 5 + page-data/tags/Redux/page-data.json | 5 + page-data/tags/Security/page-data.json | 5 + page-data/tags/Vim/page-data.json | 5 + page-data/tags/Web Development/page-data.json | 5 + page-data/tags/all/page-data.json | 5 + page-data/tags/page-data.json | 5 + page-data/vimBasicNotes/page-data.json | 5 + polyfill-1b158f8b0388372dd044.js | 2 + polyfill-1b158f8b0388372dd044.js.gz | Bin 0 -> 28223 bytes polyfill-1b158f8b0388372dd044.js.map | 1 + posts/index.html | 1 + posts/index.html.gz | Bin 0 -> 49444 bytes reactBasicNotes/index.html | 4399 ++++++++++++++++ reactBasicNotes/index.html.gz | Bin 0 -> 127524 bytes reactRouterBasicNotes/index.html | 290 + reactRouterBasicNotes/index.html.gz | Bin 0 -> 54784 bytes reduxBasicNotes/index.html | 1318 +++++ reduxBasicNotes/index.html.gz | Bin 0 -> 74951 bytes robots.txt | 4 + securityBasicNotes/index.html | 68 + securityBasicNotes/index.html.gz | Bin 0 -> 60538 bytes sitemap/sitemap-0.xml | 1 + sitemap/sitemap-index.xml | 1 + ...nding-b6345785ef9fb73e7965b0a688b08128.jpg | Bin 0 -> 522116 bytes styles.fa1bc6b65ddd6168fe60.css | 8 + styles.fa1bc6b65ddd6168fe60.css.gz | Bin 0 -> 37967 bytes sw.js | 192 + sw.js.gz | Bin 0 -> 2229 bytes tags/Architecture/index.html | 1 + tags/Architecture/index.html.gz | Bin 0 -> 48109 bytes tags/CSS/index.html | 1 + tags/CSS/index.html.gz | Bin 0 -> 48093 bytes tags/Computer Science/index.html | 1 + tags/Computer Science/index.html.gz | Bin 0 -> 48121 bytes tags/Design Patterns/index.html | 1 + tags/Design Patterns/index.html.gz | Bin 0 -> 48106 bytes tags/Development/index.html | 1 + tags/Development/index.html.gz | Bin 0 -> 48141 bytes tags/Frontend Development/index.html | 1 + tags/Frontend Development/index.html.gz | Bin 0 -> 48269 bytes tags/GNU/index.html | 1 + tags/GNU/index.html.gz | Bin 0 -> 48141 bytes tags/Git/index.html | 1 + tags/Git/index.html.gz | Bin 0 -> 48149 bytes tags/HTML/index.html | 1 + tags/HTML/index.html.gz | Bin 0 -> 48102 bytes tags/JavaScript/index.html | 1 + tags/JavaScript/index.html.gz | Bin 0 -> 48182 bytes tags/Linux/index.html | 1 + tags/Linux/index.html.gz | Bin 0 -> 48147 bytes tags/React Router/index.html | 1 + tags/React Router/index.html.gz | Bin 0 -> 48116 bytes tags/React/index.html | 1 + tags/React/index.html.gz | Bin 0 -> 48150 bytes tags/Redux/index.html | 1 + tags/Redux/index.html.gz | Bin 0 -> 48108 bytes tags/Security/index.html | 1 + tags/Security/index.html.gz | Bin 0 -> 48114 bytes tags/Vim/index.html | 1 + tags/Vim/index.html.gz | Bin 0 -> 48110 bytes tags/Web Development/index.html | 1 + tags/Web Development/index.html.gz | Bin 0 -> 48344 bytes tags/all/index.html | 1 + tags/all/index.html.gz | Bin 0 -> 48423 bytes tags/index.html | 1 + tags/index.html.gz | Bin 0 -> 48429 bytes vimBasicNotes/index.html | 194 + vimBasicNotes/index.html.gz | Bin 0 -> 63460 bytes webpack-runtime-3e2d80549d8ecdcb17de.js | 2 + webpack-runtime-3e2d80549d8ecdcb17de.js.gz | Bin 0 -> 2308 bytes webpack-runtime-3e2d80549d8ecdcb17de.js.map | 1 + webpack.stats.json | 1 + workbox-v4.3.1/workbox-background-sync.dev.js | 822 +++ .../workbox-background-sync.dev.js.gz | Bin 0 -> 5733 bytes .../workbox-background-sync.dev.js.map | 1 + .../workbox-background-sync.prod.js | 2 + .../workbox-background-sync.prod.js.gz | Bin 0 -> 1558 bytes .../workbox-background-sync.prod.js.map | 1 + .../workbox-broadcast-update.dev.js | 496 ++ .../workbox-broadcast-update.dev.js.gz | Bin 0 -> 4500 bytes .../workbox-broadcast-update.dev.js.map | 1 + .../workbox-broadcast-update.prod.js | 2 + .../workbox-broadcast-update.prod.js.gz | Bin 0 -> 931 bytes .../workbox-broadcast-update.prod.js.map | 1 + .../workbox-cacheable-response.dev.js | 200 + .../workbox-cacheable-response.dev.js.gz | Bin 0 -> 1721 bytes .../workbox-cacheable-response.dev.js.map | 1 + .../workbox-cacheable-response.prod.js | 2 + .../workbox-cacheable-response.prod.js.gz | Bin 0 -> 340 bytes .../workbox-cacheable-response.prod.js.map | 1 + workbox-v4.3.1/workbox-core.dev.js | 1712 ++++++ workbox-v4.3.1/workbox-core.dev.js.gz | Bin 0 -> 10905 bytes workbox-v4.3.1/workbox-core.dev.js.map | 1 + workbox-v4.3.1/workbox-core.prod.js | 2 + workbox-v4.3.1/workbox-core.prod.js.gz | Bin 0 -> 2432 bytes workbox-v4.3.1/workbox-core.prod.js.map | 1 + workbox-v4.3.1/workbox-expiration.dev.js | 652 +++ workbox-v4.3.1/workbox-expiration.dev.js.gz | Bin 0 -> 5420 bytes workbox-v4.3.1/workbox-expiration.dev.js.map | 1 + workbox-v4.3.1/workbox-expiration.prod.js | 2 + workbox-v4.3.1/workbox-expiration.prod.js.gz | Bin 0 -> 1235 bytes workbox-v4.3.1/workbox-expiration.prod.js.map | 1 + .../workbox-navigation-preload.dev.js | 110 + .../workbox-navigation-preload.dev.js.gz | Bin 0 -> 876 bytes .../workbox-navigation-preload.dev.js.map | 1 + .../workbox-navigation-preload.prod.js | 2 + .../workbox-navigation-preload.prod.js.gz | Bin 0 -> 316 bytes .../workbox-navigation-preload.prod.js.map | 1 + workbox-v4.3.1/workbox-offline-ga.dev.js | 243 + workbox-v4.3.1/workbox-offline-ga.dev.js.gz | Bin 0 -> 2520 bytes workbox-v4.3.1/workbox-offline-ga.dev.js.map | 1 + workbox-v4.3.1/workbox-offline-ga.prod.js | 2 + workbox-v4.3.1/workbox-offline-ga.prod.js.gz | Bin 0 -> 881 bytes workbox-v4.3.1/workbox-offline-ga.prod.js.map | 1 + workbox-v4.3.1/workbox-precaching.dev.js | 989 ++++ workbox-v4.3.1/workbox-precaching.dev.js.gz | Bin 0 -> 6713 bytes workbox-v4.3.1/workbox-precaching.dev.js.map | 1 + workbox-v4.3.1/workbox-precaching.prod.js | 2 + workbox-v4.3.1/workbox-precaching.prod.js.gz | Bin 0 -> 1669 bytes workbox-v4.3.1/workbox-precaching.prod.js.map | 1 + workbox-v4.3.1/workbox-range-requests.dev.js | 268 + .../workbox-range-requests.dev.js.gz | Bin 0 -> 2505 bytes .../workbox-range-requests.dev.js.map | 1 + workbox-v4.3.1/workbox-range-requests.prod.js | 2 + .../workbox-range-requests.prod.js.gz | Bin 0 -> 743 bytes .../workbox-range-requests.prod.js.map | 1 + workbox-v4.3.1/workbox-routing.dev.js | 1020 ++++ workbox-v4.3.1/workbox-routing.dev.js.gz | Bin 0 -> 7420 bytes workbox-v4.3.1/workbox-routing.dev.js.map | 1 + workbox-v4.3.1/workbox-routing.prod.js | 2 + workbox-v4.3.1/workbox-routing.prod.js.gz | Bin 0 -> 1448 bytes workbox-v4.3.1/workbox-routing.prod.js.map | 1 + workbox-v4.3.1/workbox-strategies.dev.js | 1138 ++++ workbox-v4.3.1/workbox-strategies.dev.js.gz | Bin 0 -> 4639 bytes workbox-v4.3.1/workbox-strategies.dev.js.map | 1 + workbox-v4.3.1/workbox-strategies.prod.js | 2 + workbox-v4.3.1/workbox-strategies.prod.js.gz | Bin 0 -> 1161 bytes workbox-v4.3.1/workbox-strategies.prod.js.map | 1 + workbox-v4.3.1/workbox-streams.dev.js | 337 ++ workbox-v4.3.1/workbox-streams.dev.js.gz | Bin 0 -> 2670 bytes workbox-v4.3.1/workbox-streams.dev.js.map | 1 + workbox-v4.3.1/workbox-streams.prod.js | 2 + workbox-v4.3.1/workbox-streams.prod.js.gz | Bin 0 -> 671 bytes workbox-v4.3.1/workbox-streams.prod.js.map | 1 + workbox-v4.3.1/workbox-sw.js | 2 + workbox-v4.3.1/workbox-sw.js.gz | Bin 0 -> 733 bytes workbox-v4.3.1/workbox-sw.js.map | 1 + workbox-v4.3.1/workbox-window.dev.es5.mjs | 885 ++++ workbox-v4.3.1/workbox-window.dev.es5.mjs.map | 1 + workbox-v4.3.1/workbox-window.dev.mjs | 751 +++ workbox-v4.3.1/workbox-window.dev.mjs.map | 1 + workbox-v4.3.1/workbox-window.dev.umd.js | 896 ++++ workbox-v4.3.1/workbox-window.dev.umd.js.gz | Bin 0 -> 7765 bytes workbox-v4.3.1/workbox-window.dev.umd.js.map | 1 + workbox-v4.3.1/workbox-window.prod.es5.mjs | 2 + .../workbox-window.prod.es5.mjs.map | 1 + workbox-v4.3.1/workbox-window.prod.mjs | 2 + workbox-v4.3.1/workbox-window.prod.mjs.map | 1 + workbox-v4.3.1/workbox-window.prod.umd.js | 2 + workbox-v4.3.1/workbox-window.prod.umd.js.gz | Bin 0 -> 1788 bytes workbox-v4.3.1/workbox-window.prod.umd.js.map | 1 + 279 files changed, 32190 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 404.html.gz create mode 100644 404/index.html create mode 100644 404/index.html.gz create mode 100644 about/index.html create mode 100644 about/index.html.gz create mode 100644 app-82702098eac976ce09a7.js create mode 100644 app-82702098eac976ce09a7.js.LICENSE.txt create mode 100644 app-82702098eac976ce09a7.js.gz create mode 100644 app-82702098eac976ce09a7.js.map create mode 100644 books/index.html create mode 100644 books/index.html.gz create mode 100644 c5a7ab853fadc4e50d843365e266447fb916e1c7-f06a2ec58da3040f6568.js create mode 100644 c5a7ab853fadc4e50d843365e266447fb916e1c7-f06a2ec58da3040f6568.js.LICENSE.txt create mode 100644 c5a7ab853fadc4e50d843365e266447fb916e1c7-f06a2ec58da3040f6568.js.gz create mode 100644 c5a7ab853fadc4e50d843365e266447fb916e1c7-f06a2ec58da3040f6568.js.map create mode 100644 chunk-map.json create mode 100644 commons-8e088829d30999d21ca5.js create mode 100644 commons-8e088829d30999d21ca5.js.gz create mode 100644 commons-8e088829d30999d21ca5.js.map create mode 100644 component---cache-caches-gatsby-plugin-offline-app-shell-js-c8eef4cb2e218060d5ec.js create mode 100644 component---cache-caches-gatsby-plugin-offline-app-shell-js-c8eef4cb2e218060d5ec.js.gz create mode 100644 component---cache-caches-gatsby-plugin-offline-app-shell-js-c8eef4cb2e218060d5ec.js.map create mode 100644 component---src-pages-404-tsx-8f0fa29cf8c78726b548.js create mode 100644 component---src-pages-404-tsx-8f0fa29cf8c78726b548.js.gz create mode 100644 component---src-pages-404-tsx-8f0fa29cf8c78726b548.js.map create mode 100644 component---src-templates-about-tsx-57b0431b2754270102f7.js create mode 100644 component---src-templates-about-tsx-57b0431b2754270102f7.js.gz create mode 100644 component---src-templates-about-tsx-57b0431b2754270102f7.js.map create mode 100644 component---src-templates-books-tsx-5ab576df07cee9866291.js create mode 100644 component---src-templates-books-tsx-5ab576df07cee9866291.js.gz create mode 100644 component---src-templates-books-tsx-5ab576df07cee9866291.js.map create mode 100644 component---src-templates-home-tsx-c1377c9a43fc070df0ed.js create mode 100644 component---src-templates-home-tsx-c1377c9a43fc070df0ed.js.gz create mode 100644 component---src-templates-home-tsx-c1377c9a43fc070df0ed.js.map create mode 100644 component---src-templates-post-tsx-27b8f3bb9fa0ea7fdee7.js create mode 100644 component---src-templates-post-tsx-27b8f3bb9fa0ea7fdee7.js.gz create mode 100644 component---src-templates-post-tsx-27b8f3bb9fa0ea7fdee7.js.map create mode 100644 component---src-templates-posts-tsx-4bfc807a338478db5606.js create mode 100644 component---src-templates-posts-tsx-4bfc807a338478db5606.js.gz create mode 100644 component---src-templates-posts-tsx-4bfc807a338478db5606.js.map create mode 100644 component---src-templates-tags-tsx-0d483e93f29c5379de01.js create mode 100644 component---src-templates-tags-tsx-0d483e93f29c5379de01.js.gz create mode 100644 component---src-templates-tags-tsx-0d483e93f29c5379de01.js.map create mode 100644 coverage-lines.svg create mode 100644 cssAdvancedNotes/index.html create mode 100644 cssAdvancedNotes/index.html.gz create mode 100644 cssBasicNotes/index.html create mode 100644 cssBasicNotes/index.html.gz create mode 100644 designPatternsBasicNotes/index.html create mode 100644 designPatternsBasicNotes/index.html.gz create mode 100644 favicon-32x32.png create mode 100644 framework-2da9b26c220acba5776c.js create mode 100644 framework-2da9b26c220acba5776c.js.LICENSE.txt create mode 100644 framework-2da9b26c220acba5776c.js.gz create mode 100644 framework-2da9b26c220acba5776c.js.map create mode 100644 gitBasicNotes/index.html create mode 100644 gitBasicNotes/index.html.gz create mode 100644 htmlBasicNotes/index.html create mode 100644 htmlBasicNotes/index.html.gz create mode 100644 icons/icon-144x144.png create mode 100644 icons/icon-192x192.png create mode 100644 icons/icon-256x256.png create mode 100644 icons/icon-384x384.png create mode 100644 icons/icon-48x48.png create mode 100644 icons/icon-512x512.png create mode 100644 icons/icon-72x72.png create mode 100644 icons/icon-96x96.png create mode 100644 idb-keyval-3.2.0-iife.min.js create mode 100644 idb-keyval-3.2.0-iife.min.js.gz create mode 100644 index.html create mode 100644 index.html.gz create mode 100644 javascriptAdvancedNotes/index.html create mode 100644 javascriptAdvancedNotes/index.html.gz create mode 100644 javascriptBasicNotes/index.html create mode 100644 javascriptBasicNotes/index.html.gz create mode 100644 linuxBasicNotes/index.html create mode 100644 linuxBasicNotes/index.html.gz create mode 100644 manifest.webmanifest create mode 100644 offline-plugin-app-shell-fallback/index.html create mode 100644 offline-plugin-app-shell-fallback/index.html.gz create mode 100644 page-data/404.html/page-data.json create mode 100644 page-data/404/page-data.json create mode 100644 page-data/about/page-data.json create mode 100644 page-data/app-data.json create mode 100644 page-data/books/page-data.json create mode 100644 page-data/cssAdvancedNotes/page-data.json create mode 100644 page-data/cssBasicNotes/page-data.json create mode 100644 page-data/designPatternsBasicNotes/page-data.json create mode 100644 page-data/gitBasicNotes/page-data.json create mode 100644 page-data/htmlBasicNotes/page-data.json create mode 100644 page-data/index/page-data.json create mode 100644 page-data/javascriptAdvancedNotes/page-data.json create mode 100644 page-data/javascriptBasicNotes/page-data.json create mode 100644 page-data/linuxBasicNotes/page-data.json create mode 100644 page-data/offline-plugin-app-shell-fallback/page-data.json create mode 100644 page-data/posts/page-data.json create mode 100644 page-data/reactBasicNotes/page-data.json create mode 100644 page-data/reactRouterBasicNotes/page-data.json create mode 100644 page-data/reduxBasicNotes/page-data.json create mode 100644 page-data/securityBasicNotes/page-data.json create mode 100644 page-data/sq/d/1635110865.json create mode 100644 page-data/sq/d/1796865374.json create mode 100644 page-data/sq/d/3354928244.json create mode 100644 page-data/tags/Architecture/page-data.json create mode 100644 page-data/tags/CSS/page-data.json create mode 100644 page-data/tags/Computer Science/page-data.json create mode 100644 page-data/tags/Design Patterns/page-data.json create mode 100644 page-data/tags/Development/page-data.json create mode 100644 page-data/tags/Frontend Development/page-data.json create mode 100644 page-data/tags/GNU/page-data.json create mode 100644 page-data/tags/Git/page-data.json create mode 100644 page-data/tags/HTML/page-data.json create mode 100644 page-data/tags/JavaScript/page-data.json create mode 100644 page-data/tags/Linux/page-data.json create mode 100644 page-data/tags/React Router/page-data.json create mode 100644 page-data/tags/React/page-data.json create mode 100644 page-data/tags/Redux/page-data.json create mode 100644 page-data/tags/Security/page-data.json create mode 100644 page-data/tags/Vim/page-data.json create mode 100644 page-data/tags/Web Development/page-data.json create mode 100644 page-data/tags/all/page-data.json create mode 100644 page-data/tags/page-data.json create mode 100644 page-data/vimBasicNotes/page-data.json create mode 100644 polyfill-1b158f8b0388372dd044.js create mode 100644 polyfill-1b158f8b0388372dd044.js.gz create mode 100644 polyfill-1b158f8b0388372dd044.js.map create mode 100644 posts/index.html create mode 100644 posts/index.html.gz create mode 100644 reactBasicNotes/index.html create mode 100644 reactBasicNotes/index.html.gz create mode 100644 reactRouterBasicNotes/index.html create mode 100644 reactRouterBasicNotes/index.html.gz create mode 100644 reduxBasicNotes/index.html create mode 100644 reduxBasicNotes/index.html.gz create mode 100644 robots.txt create mode 100644 securityBasicNotes/index.html create mode 100644 securityBasicNotes/index.html.gz create mode 100644 sitemap/sitemap-0.xml create mode 100644 sitemap/sitemap-index.xml create mode 100644 static/landing-b6345785ef9fb73e7965b0a688b08128.jpg create mode 100644 styles.fa1bc6b65ddd6168fe60.css create mode 100644 styles.fa1bc6b65ddd6168fe60.css.gz create mode 100644 sw.js create mode 100644 sw.js.gz create mode 100644 tags/Architecture/index.html create mode 100644 tags/Architecture/index.html.gz create mode 100644 tags/CSS/index.html create mode 100644 tags/CSS/index.html.gz create mode 100644 tags/Computer Science/index.html create mode 100644 tags/Computer Science/index.html.gz create mode 100644 tags/Design Patterns/index.html create mode 100644 tags/Design Patterns/index.html.gz create mode 100644 tags/Development/index.html create mode 100644 tags/Development/index.html.gz create mode 100644 tags/Frontend Development/index.html create mode 100644 tags/Frontend Development/index.html.gz create mode 100644 tags/GNU/index.html create mode 100644 tags/GNU/index.html.gz create mode 100644 tags/Git/index.html create mode 100644 tags/Git/index.html.gz create mode 100644 tags/HTML/index.html create mode 100644 tags/HTML/index.html.gz create mode 100644 tags/JavaScript/index.html create mode 100644 tags/JavaScript/index.html.gz create mode 100644 tags/Linux/index.html create mode 100644 tags/Linux/index.html.gz create mode 100644 tags/React Router/index.html create mode 100644 tags/React Router/index.html.gz create mode 100644 tags/React/index.html create mode 100644 tags/React/index.html.gz create mode 100644 tags/Redux/index.html create mode 100644 tags/Redux/index.html.gz create mode 100644 tags/Security/index.html create mode 100644 tags/Security/index.html.gz create mode 100644 tags/Vim/index.html create mode 100644 tags/Vim/index.html.gz create mode 100644 tags/Web Development/index.html create mode 100644 tags/Web Development/index.html.gz create mode 100644 tags/all/index.html create mode 100644 tags/all/index.html.gz create mode 100644 tags/index.html create mode 100644 tags/index.html.gz create mode 100644 vimBasicNotes/index.html create mode 100644 vimBasicNotes/index.html.gz create mode 100644 webpack-runtime-3e2d80549d8ecdcb17de.js create mode 100644 webpack-runtime-3e2d80549d8ecdcb17de.js.gz create mode 100644 webpack-runtime-3e2d80549d8ecdcb17de.js.map create mode 100644 webpack.stats.json create mode 100644 workbox-v4.3.1/workbox-background-sync.dev.js create mode 100644 workbox-v4.3.1/workbox-background-sync.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-background-sync.dev.js.map create mode 100644 workbox-v4.3.1/workbox-background-sync.prod.js create mode 100644 workbox-v4.3.1/workbox-background-sync.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-background-sync.prod.js.map create mode 100644 workbox-v4.3.1/workbox-broadcast-update.dev.js create mode 100644 workbox-v4.3.1/workbox-broadcast-update.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-broadcast-update.dev.js.map create mode 100644 workbox-v4.3.1/workbox-broadcast-update.prod.js create mode 100644 workbox-v4.3.1/workbox-broadcast-update.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-broadcast-update.prod.js.map create mode 100644 workbox-v4.3.1/workbox-cacheable-response.dev.js create mode 100644 workbox-v4.3.1/workbox-cacheable-response.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-cacheable-response.dev.js.map create mode 100644 workbox-v4.3.1/workbox-cacheable-response.prod.js create mode 100644 workbox-v4.3.1/workbox-cacheable-response.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-cacheable-response.prod.js.map create mode 100644 workbox-v4.3.1/workbox-core.dev.js create mode 100644 workbox-v4.3.1/workbox-core.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-core.dev.js.map create mode 100644 workbox-v4.3.1/workbox-core.prod.js create mode 100644 workbox-v4.3.1/workbox-core.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-core.prod.js.map create mode 100644 workbox-v4.3.1/workbox-expiration.dev.js create mode 100644 workbox-v4.3.1/workbox-expiration.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-expiration.dev.js.map create mode 100644 workbox-v4.3.1/workbox-expiration.prod.js create mode 100644 workbox-v4.3.1/workbox-expiration.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-expiration.prod.js.map create mode 100644 workbox-v4.3.1/workbox-navigation-preload.dev.js create mode 100644 workbox-v4.3.1/workbox-navigation-preload.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-navigation-preload.dev.js.map create mode 100644 workbox-v4.3.1/workbox-navigation-preload.prod.js create mode 100644 workbox-v4.3.1/workbox-navigation-preload.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-navigation-preload.prod.js.map create mode 100644 workbox-v4.3.1/workbox-offline-ga.dev.js create mode 100644 workbox-v4.3.1/workbox-offline-ga.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-offline-ga.dev.js.map create mode 100644 workbox-v4.3.1/workbox-offline-ga.prod.js create mode 100644 workbox-v4.3.1/workbox-offline-ga.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-offline-ga.prod.js.map create mode 100644 workbox-v4.3.1/workbox-precaching.dev.js create mode 100644 workbox-v4.3.1/workbox-precaching.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-precaching.dev.js.map create mode 100644 workbox-v4.3.1/workbox-precaching.prod.js create mode 100644 workbox-v4.3.1/workbox-precaching.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-precaching.prod.js.map create mode 100644 workbox-v4.3.1/workbox-range-requests.dev.js create mode 100644 workbox-v4.3.1/workbox-range-requests.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-range-requests.dev.js.map create mode 100644 workbox-v4.3.1/workbox-range-requests.prod.js create mode 100644 workbox-v4.3.1/workbox-range-requests.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-range-requests.prod.js.map create mode 100644 workbox-v4.3.1/workbox-routing.dev.js create mode 100644 workbox-v4.3.1/workbox-routing.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-routing.dev.js.map create mode 100644 workbox-v4.3.1/workbox-routing.prod.js create mode 100644 workbox-v4.3.1/workbox-routing.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-routing.prod.js.map create mode 100644 workbox-v4.3.1/workbox-strategies.dev.js create mode 100644 workbox-v4.3.1/workbox-strategies.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-strategies.dev.js.map create mode 100644 workbox-v4.3.1/workbox-strategies.prod.js create mode 100644 workbox-v4.3.1/workbox-strategies.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-strategies.prod.js.map create mode 100644 workbox-v4.3.1/workbox-streams.dev.js create mode 100644 workbox-v4.3.1/workbox-streams.dev.js.gz create mode 100644 workbox-v4.3.1/workbox-streams.dev.js.map create mode 100644 workbox-v4.3.1/workbox-streams.prod.js create mode 100644 workbox-v4.3.1/workbox-streams.prod.js.gz create mode 100644 workbox-v4.3.1/workbox-streams.prod.js.map create mode 100644 workbox-v4.3.1/workbox-sw.js create mode 100644 workbox-v4.3.1/workbox-sw.js.gz create mode 100644 workbox-v4.3.1/workbox-sw.js.map create mode 100644 workbox-v4.3.1/workbox-window.dev.es5.mjs create mode 100644 workbox-v4.3.1/workbox-window.dev.es5.mjs.map create mode 100644 workbox-v4.3.1/workbox-window.dev.mjs create mode 100644 workbox-v4.3.1/workbox-window.dev.mjs.map create mode 100644 workbox-v4.3.1/workbox-window.dev.umd.js create mode 100644 workbox-v4.3.1/workbox-window.dev.umd.js.gz create mode 100644 workbox-v4.3.1/workbox-window.dev.umd.js.map create mode 100644 workbox-v4.3.1/workbox-window.prod.es5.mjs create mode 100644 workbox-v4.3.1/workbox-window.prod.es5.mjs.map create mode 100644 workbox-v4.3.1/workbox-window.prod.mjs create mode 100644 workbox-v4.3.1/workbox-window.prod.mjs.map create mode 100644 workbox-v4.3.1/workbox-window.prod.umd.js create mode 100644 workbox-v4.3.1/workbox-window.prod.umd.js.gz create mode 100644 workbox-v4.3.1/workbox-window.prod.umd.js.map diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/404.html b/404.html new file mode 100644 index 0000000000..da503c06ea --- /dev/null +++ b/404.html @@ -0,0 +1 @@ +Sabertaz Blog

Sorry, the page you visited does not exist.

Copyright © SabertazBuilt with React and GatsbyLast Built Time 2022/4/16 10:40:24
\ No newline at end of file diff --git a/404.html.gz b/404.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..179a2134201393f15e71bb8bf931d909ae253cd3 GIT binary patch literal 47727 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 Blog

Sorry, the page you visited does not exist.

Copyright © SabertazBuilt with React and GatsbyLast Built Time 2022/4/16 10:40:24
\ No newline at end of file diff --git a/404/index.html.gz b/404/index.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..4d0e4b30feec9343c865108549a78e1a6491c11f GIT binary patch literal 47663 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 literal 0 HcmV?d00001 diff --git a/about/index.html b/about/index.html new file mode 100644 index 0000000000..a7b56b7d0b --- /dev/null +++ b/about/index.html @@ -0,0 +1 @@ +Sabertaz Blog
sabertazimi
Joined in Sat May 30 2015
TypeScript
23
awesome-notes
hust-lab
dragon-zsh-theme
sabertazimi
Copyright © SabertazBuilt with React and GatsbyLast Built Time 2022/4/16 10:40:24
\ No newline at end of file diff --git a/about/index.html.gz b/about/index.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..abdbf33d2e805141e4de247c5237b08581bc0347 GIT binary patch literal 49756 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[n]=e[n]);return o},e.exports.__esModule=!0,e.exports.default=e.exports},9489:function(e){function t(n,r){return e.exports=t=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n,r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},2393:function(e,t){"use strict";var n=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},c=u.state,l=u.replace,p=void 0!==l&&l;if("number"==typeof t)e.history.go(t);else{c=n({},c,{key:Date.now()+""});try{i||p?e.history.replaceState(c,null,t):e.history.pushState(c,null,t)}catch(h){e.location[p?"replace":"assign"](t)}}a=r(e),i=!0;var f=new Promise((function(e){return s=e}));return o.forEach((function(e){return e({location:a,action:"PUSH"})})),f}}},a=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/",t=e.indexOf("?"),n={pathname:t>-1?e.substr(0,t):e,search:t>-1?e.substr(t):""},r=0,o=[n],a=[null];return{get location(){return o[r]},addEventListener:function(e,t){},removeEventListener:function(e,t){},history:{get entries(){return o},get index(){return r},get state(){return a[r]},pushState:function(e,t,n){var i=n.split("?"),s=i[0],u=i[1],c=void 0===u?"":u;r++,o.push({pathname:s,search:c.length?"?"+c:c}),a.push(e)},replaceState:function(e,t,n){var i=n.split("?"),s=i[0],u=i[1],c=void 0===u?"":u;o[r]={pathname:s,search:c},a[r]=e},go:function(e){var t=r+e;t<0||t>a.length-1||(r=t)}}}},i=!("undefined"==typeof window||!window.document||!window.document.createElement),s=o(i?window:a()),u=s.navigate;t.V5=s},2098:function(e,t,n){"use strict";t.__esModule=!0,t.shallowCompare=t.validateRedirect=t.insertParams=t.resolve=t.match=t.pick=t.startsWith=void 0;var r,o=n(1143),a=(r=o)&&r.__esModule?r:{default:r};var i=function(e,t){return e.substr(0,t.length)===t},s=function(e,t){for(var n=void 0,r=void 0,o=t.split("?")[0],i=h(o),s=""===i[0],c=f(e),p=0,d=c.length;pt.score?-1:e.index-t.index}))},h=function(e){return e.replace(/(^\/+|\/+$)/g,"").split("/")},d=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r0})))&&n.length>0?"?"+n.join("&"):"")},v=["uri","path"];t.startsWith=i,t.pick=s,t.match=function(e,t){return s([{path:e}],t)},t.resolve=function(e,t){if(i(e,"/"))return e;var n=e.split("?"),r=n[0],o=n[1],a=t.split("?")[0],s=h(r),u=h(a);if(""===s[0])return d(a,o);if(!i(s[0],".")){var c=u.concat(s).join("/");return d(("/"===a?"":"/")+c,o)}for(var l=u.concat(s),p=[],f=0,v=l.length;fn?n:e}function a(e){return 100*(-1+e)}function i(e){return e>=0&&e<.2?.1:e>=.2&&e<.5?.04:e>=.5&&e<.8?.02:e>=.8&&e<.99?.005:0}function s(e){e&&e.parentNode&&e.parentNode.removeChild(e)}n.r(t),n.d(t,{assign:function(){return r},clamp:function(){return o},toBarPerc:function(){return a},randomInc:function(){return i},removeElement:function(){return s},queue:function(){return u}});var u=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1===e.length&&t()}}()},"./src/styles.css":function(e,t,n){n.r(t)}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var a=t[r]={exports:{}};return e[r](a,a.exports,n),a.exports}n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};return function(){n.r(r);var e=n("./src/util.js"),t=(n("./src/styles.css"),{minimum:.08,easing:"linear",speed:200,trickle:!0,trickleSpeed:200,showSpinner:!0,barSelector:"div.bar",barLabel:"processing request",spinnerSelector:"div.spinner",spinnerLabel:"processing request",parent:"body",template:'\n

\n
\n
\n
\n
\n
\n '});r.default=function(){var n=t,r=null,o=0,a=0;function i(){if(document.getElementById("nprogress"))return document.getElementById("nprogress");document.documentElement.classList.add("nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=n.template;var o="number"==typeof r?"-100":(0,e.toBarPerc)(r||0),a=t.querySelector(n.barSelector);a.setAttribute("aria-label",n.barLabel),a.style.transform="translate3d(".concat(o,"%,0,0)"),a.style.transition="all 0 linear";var i=t.querySelector(n.spinnerSelector);i&&(n.showSpinner?i.setAttribute("aria-label",n.spinnerLabel):(0,e.removeElement)(i));var s=document.querySelector(n.parent);return s&&(s!==document.body&&s.classList.add("nprogress-custom-parent"),s.appendChild(t)),t}return{configure:function(t){return(0,e.assign)(n,t),this},set:function(t){var o=this,a=(0,e.clamp)(t,n.minimum,1);r=1===a?null:a;var s=i();return s.offsetWidth,(0,e.queue)((function(t){var r=n.speed,i=n.easing,u=s.querySelector(n.barSelector);u.setAttribute("aria-valuenow",a),u.style.transform="translate3d(".concat((0,e.toBarPerc)(a),"%,0,0)"),u.style.transition="all ".concat(r,"ms ").concat(i),1===a?(s.style.transition="none",s.style.opacity=1,s.offsetWidth,setTimeout((function(){s.style.transition="all ".concat(r,"ms linear"),s.style.opacity=0,setTimeout((function(){o.remove(),t()}),r)}),r)):setTimeout(t,r)})),this},start:function(){var e=this;return r||this.set(0),n.trickle&&function t(){setTimeout((function(){r&&(e.inc(),t())}),n.trickleSpeed)}(),this},done:function(e){if(!e&&!r)return this;var t=.5*Math.random();return this.inc(.3+t).set(1)},inc:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:(0,e.randomInc)(r);if(!r)return this.start();var n=(0,e.clamp)(r+t,0,.994);return this.set(n)},remove:function(){document.documentElement.classList.remove("nprogress-busy"),document.querySelector(n.parent).classList.remove("nprogress-custom-parent");var t=document.getElementById("nprogress");t&&(0,e.removeElement)(t)},promise:function(e){var t=this;0===a&&this.start(),o+=1,a+=1;var n=function(){0==(a-=1)?(o=0,t.done()):t.set((o-a)/o)};return e.then(n).catch(n),this},get status(){return r},get settings(){return n}}}()}(),r=r.default}()},e.exports=t()},4564:function(e){"use strict";var t=/[|\\{}()[\]^$+*?.]/g;e.exports=function(e){if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(t,"\\$&")}},8440:function(e,t){"use strict";t.__esModule=!0,t.applyTrailingSlashOption=void 0;t.applyTrailingSlashOption=function(e,t){void 0===t&&(t="legacy");var n=e.endsWith(".html");return"/"===e?e:(n&&(t="never"),"always"===t?e.endsWith("/")?e:e+"/":"never"===t&&e.endsWith("/")?e.slice(0,-1):e)}},8037:function(e,t,n){"use strict";var r=n(5318);t.__esModule=!0,t.withPrefix=v,t.withAssetPrefix=function(e){return v(e,m())},t.navigate=t.default=void 0;var o=r(n(7316)),a=r(n(1506)),i=r(n(5354)),s=r(n(7154)),u=r(n(5697)),c=r(n(7294)),l=n(9499),p=n(1752);t.parsePath=p.parsePath;var f=n(4587),h=n(349),d=["to","getProps","onClick","onMouseEnter","activeClassName","activeStyle","innerRef","partiallyActive","state","replace","_location"];function v(e,t){var n,r;if(void 0===t&&(t=g()),!(0,f.isLocalLink)(e))return e;if(e.startsWith("./")||e.startsWith("../"))return e;var o=null!==(n=null!==(r=t)&&void 0!==r?r:m())&&void 0!==n?n:"/";return""+(null!=o&&o.endsWith("/")?o.slice(0,-1):o)+(e.startsWith("/")?e:"/"+e)}var m=function(){return"/blog"},g=function(){return"/blog"};var y={activeClassName:u.default.string,activeStyle:u.default.object,partiallyActive:u.default.bool};function w(e){return c.default.createElement(l.Location,null,(function(t){var n=t.location;return c.default.createElement(b,(0,s.default)({},e,{_location:n}))}))}var b=function(e){function t(t){var n;(n=e.call(this,t)||this).defaultGetProps=function(e){var t=e.isPartiallyCurrent,r=e.isCurrent;return(n.props.partiallyActive?t:r)?{className:[n.props.className,n.props.activeClassName].filter(Boolean).join(" "),style:(0,s.default)({},n.props.style,n.props.activeStyle)}:null};var r=!1;return"undefined"!=typeof window&&window.IntersectionObserver&&(r=!0),n.state={IOSupported:r},n.abortPrefetch=null,n.handleRef=n.handleRef.bind((0,a.default)(n)),n}(0,i.default)(t,e);var n=t.prototype;return n._prefetch=function(){var e=window.location.pathname+window.location.search;this.props._location&&this.props._location.pathname&&(e=this.props._location.pathname+this.props._location.search);var t=(0,h.rewriteLinkPath)(this.props.to,e),n=(0,p.parsePath)(t),r=n.pathname+n.search;if(e!==r)return ___loader.enqueue(r)},n.componentWillUnmount=function(){if(this.io){var e=this.io,t=e.instance,n=e.el;this.abortPrefetch&&this.abortPrefetch.abort(),t.unobserve(n),t.disconnect()}},n.handleRef=function(e){var t,n,r,o=this;this.props.innerRef&&Object.prototype.hasOwnProperty.call(this.props.innerRef,"current")?this.props.innerRef.current=e:this.props.innerRef&&this.props.innerRef(e),this.state.IOSupported&&e&&(this.io=(t=e,n=function(e){e?o.abortPrefetch=o._prefetch():o.abortPrefetch&&o.abortPrefetch.abort()},(r=new window.IntersectionObserver((function(e){e.forEach((function(e){t===e.target&&n(e.isIntersecting||e.intersectionRatio>0)}))}))).observe(t),{instance:r,el:t}))},n.render=function(){var e=this,t=this.props,n=t.to,r=t.getProps,a=void 0===r?this.defaultGetProps:r,i=t.onClick,u=t.onMouseEnter,v=(t.activeClassName,t.activeStyle,t.innerRef,t.partiallyActive,t.state),m=t.replace,g=t._location,y=(0,o.default)(t,d);var w=(0,h.rewriteLinkPath)(n,g.pathname);return(0,f.isLocalLink)(w)?c.default.createElement(l.Link,(0,s.default)({to:w,state:v,getProps:a,innerRef:this.handleRef,onMouseEnter:function(e){u&&u(e);var t=(0,p.parsePath)(w);___loader.hovering(t.pathname+t.search)},onClick:function(t){if(i&&i(t),!(0!==t.button||e.props.target||t.defaultPrevented||t.metaKey||t.altKey||t.ctrlKey||t.shiftKey)){t.preventDefault();var n=m,r=encodeURI(w)===g.pathname;"boolean"!=typeof m&&r&&(n=!0),window.___navigate(w,{state:v,replace:n})}return!0}},y)):c.default.createElement("a",(0,s.default)({href:w},y))},t}(c.default.Component);b.propTypes=(0,s.default)({},y,{onClick:u.default.func,to:u.default.string.isRequired,replace:u.default.bool,state:u.default.object});var P=c.default.forwardRef((function(e,t){return c.default.createElement(w,(0,s.default)({innerRef:t},e))}));t.default=P;t.navigate=function(e,t){window.___navigate((0,h.rewriteLinkPath)(e,window.location.pathname),t)}},4587:function(e,t){"use strict";t.__esModule=!0,t.isLocalLink=void 0;var n=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/;t.isLocalLink=function(e){if("string"==typeof e)return!function(e){return n.test(e)}(e)}},1752:function(e,t){"use strict";t.__esModule=!0,t.parsePath=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.slice(o),t=t.slice(0,o));var a=t.indexOf("?");-1!==a&&(n=t.slice(a),t=t.slice(0,a));return{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}},349:function(e,t,n){"use strict";t.__esModule=!0,t.rewriteLinkPath=void 0;var r=n(2098),o=(n(8440),n(1752)),a=n(4587),i=n(8037),s=function(e){return null==e?void 0:e.startsWith("/")};t.rewriteLinkPath=function(e,t){if("number"==typeof e)return e;if(!(0,a.isLocalLink)(e))return e;var n=(0,o.parsePath)(e),u=(n.pathname,n.search,n.hash,e);return s(u)?(0,i.withPrefix)(u):function(e,t){return s(e)?e:(0,r.resolve)(e,t)}(u,t)}},9679:function(e,t,n){"use strict";t.p2=t.$C=void 0;var r=n(1432);t.$C=r.ScrollHandler;var o=n(4855);t.p2=o.useScrollRestoration},1432:function(e,t,n){"use strict";var r=n(5318);t.__esModule=!0,t.ScrollHandler=t.ScrollContext=void 0;var o=r(n(1506)),a=r(n(5354)),i=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=c(t);if(n&&n.has(e))return n.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,n&&n.set(e,r);return r}(n(7294)),s=r(n(5697)),u=n(1142);function c(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(c=function(e){return e?n:t})(e)}var l=i.createContext(new u.SessionStorage);t.ScrollContext=l,l.displayName="GatsbyScrollContext";var p=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a0?u:n?[n]:[]},t.I=function(e,t,n){return r.reduce((function(n,r){return r.plugin[e]?n.then((function(){return r.plugin[e](t,r.options)})):n}),Promise.resolve())}},8299:function(e,t,n){"use strict";n.d(t,{Z:function(){return r}});var r=function(e){return e=e||Object.create(null),{on:function(t,n){(e[t]||(e[t]=[])).push(n)},off:function(t,n){e[t]&&e[t].splice(e[t].indexOf(n)>>>0,1)},emit:function(t,n){(e[t]||[]).slice().map((function(e){e(n)})),(e["*"]||[]).slice().map((function(e){e(t,n)}))}}}()},7802:function(e,t,n){"use strict";n.d(t,{UD:function(){return f},Cj:function(){return d},GA:function(){return h},DS:function(){return p}});var r=n(2098),o=n(1505),a=function(e){if(void 0===e)return e;var t=e.split("?"),n=t[0],r=t[1],o=void 0===r?"":r;return o&&(o="?"+o),"/"===n?"/"+o:"/"===n.charAt(n.length-1)?n.slice(0,-1)+o:n+o},i=n(6073),s=new Map,u=[],c=function(e){var t=e;if(-1!==e.indexOf("?")){var n=e.split("?"),r=n[0],a=n[1];t=r+"?"+encodeURIComponent(a)}var i=decodeURIComponent(t);return(0,o.Z)(i,decodeURIComponent("/blog")).split("#")[0]};function l(e){return e.startsWith("/")||e.startsWith("https://")||e.startsWith("http://")?e:new URL(e,window.location.href+(window.location.href.endsWith("/")?"":"/")).pathname}var p=function(e){u=e},f=function(e){var t=v(e),n=u.map((function(e){var t=e.path;return{path:e.matchPath,originalPath:t}})),o=(0,r.pick)(n,t);return o?a(o.route.originalPath):null},h=function(e){var t=v(e),n=u.map((function(e){var t=e.path;return{path:e.matchPath,originalPath:t}})),o=(0,r.pick)(n,t);return o?o.params:{}},d=function e(t){var n=c(l(t));if(s.has(n))return s.get(n);var r=(0,i.J)(t);if(r)return e(r.toPath);var o=f(n);return o||(o=v(t)),s.set(n,o),o},v=function(e){var t=c(l(e));return"/index.html"===t&&(t="/"),t=a(t)}},1597:function(e,t,n){"use strict";n.r(t),n.d(t,{Link:function(){return o.default},PageRenderer:function(){return s.a},StaticQuery:function(){return p},StaticQueryContext:function(){return c},graphql:function(){return h},navigate:function(){return o.navigate},parsePath:function(){return o.parsePath},prefetchPathname:function(){return u},useScrollRestoration:function(){return a.p2},useStaticQuery:function(){return f},withAssetPrefix:function(){return o.withAssetPrefix},withPrefix:function(){return o.withPrefix}});var r=n(7294),o=n(8037),a=n(9679),i=n(2743),s=n.n(i),u=n(1975).ZP.enqueue,c=r.createContext({});function l(e){var t=e.staticQueryData,n=e.data,o=e.query,a=e.render,i=n?n.data:t[o]&&t[o].data;return r.createElement(r.Fragment,null,i&&a(i),!i&&r.createElement("div",null,"Loading (StaticQuery)"))}var p=function(e){var t=e.data,n=e.query,o=e.render,a=e.children;return r.createElement(c.Consumer,null,(function(e){return r.createElement(l,{data:t,query:n,render:o||a,staticQueryData:e})}))},f=function(e){var t;r.useContext;var n=r.useContext(c);if(isNaN(Number(e)))throw new Error("useStaticQuery was called with a string but expects to be called using `graphql`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql`"+e+"`);\n");if(null!==(t=n[e])&&void 0!==t&&t.data)return n[e].data;throw new Error("The result of this StaticQuery could not be fetched.\n\nThis is likely a bug in Gatsby and if refreshing the page does not fix it, please open an issue in https://github.com/gatsbyjs/gatsby/issues")};function h(){throw new Error("It appears like Gatsby is misconfigured. Gatsby related `graphql` calls are supposed to only be evaluated at compile time, and then compiled away. Unfortunately, something went wrong and the query was left in the compiled code.\n\nUnless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.")}},1975:function(e,t,n){"use strict";n.d(t,{uQ:function(){return l},kL:function(){return w},ZP:function(){return _},hs:function(){return E},jN:function(){return P},N1:function(){return b}});var r=n(4578),o=n(3433),a=function(e){if("undefined"==typeof document)return!1;var t=document.createElement("link");try{if(t.relList&&"function"==typeof t.relList.supports)return t.relList.supports(e)}catch(n){return!1}return!1}("prefetch")?function(e,t){return new Promise((function(n,r){if("undefined"!=typeof document){var o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),Object.keys(t).forEach((function(e){o.setAttribute(e,t[e])})),o.onload=n,o.onerror=r,(document.getElementsByTagName("head")[0]||document.getElementsByName("script")[0].parentNode).appendChild(o)}else r()}))}:function(e){return new Promise((function(t,n){var r=new XMLHttpRequest;r.open("GET",e,!0),r.onload=function(){200===r.status?t():n()},r.send(null)}))},i={},s=function(e,t){return new Promise((function(n){i[e]?n():a(e,t).then((function(){n(),i[e]=!0})).catch((function(){}))}))},u=n(8299),c=n(7802),l={Error:"error",Success:"success"},p=function(e){return e&&e.default||e},f=function(e){var t,n=e.split("?"),r=n[0],o=n[1];return"/blog/page-data/"+("/"===r?"index":(t="/"===(t=r)[0]?t.slice(1):t).endsWith("/")?t.slice(0,-1):t)+"/page-data.json"+(o?"?"+o:"")};function h(e,t){return void 0===t&&(t="GET"),new Promise((function(n){var r=new XMLHttpRequest;r.open(t,e,!0),r.onreadystatechange=function(){4==r.readyState&&n(r)},r.send(null)}))}var d,v=/bot|crawler|spider|crawling/i,m=function(e,t){void 0===t&&(t=null);var n={componentChunkName:e.componentChunkName,path:e.path,webpackCompilationHash:e.webpackCompilationHash,matchPath:e.matchPath,staticQueryHashes:e.staticQueryHashes,getServerDataError:e.getServerDataError};return{component:t,json:e.result,page:n}},g=function(){function e(e,t){this.inFlightNetworkRequests=new Map,this.pageDb=new Map,this.inFlightDb=new Map,this.staticQueryDb={},this.pageDataDb=new Map,this.isPrefetchQueueRunning=!1,this.prefetchQueued=[],this.prefetchTriggered=new Set,this.prefetchCompleted=new Set,this.loadComponent=e,(0,c.DS)(t)}var t=e.prototype;return t.memoizedGet=function(e){var t=this,n=this.inFlightNetworkRequests.get(e);return n||(n=h(e,"GET"),this.inFlightNetworkRequests.set(e,n)),n.then((function(n){return t.inFlightNetworkRequests.delete(e),n})).catch((function(n){throw t.inFlightNetworkRequests.delete(e),n}))},t.setApiRunner=function(e){this.apiRunner=e,this.prefetchDisabled=e("disableCorePrefetching").some((function(e){return e}))},t.fetchPageDataJson=function(e){var t=this,n=e.pagePath,r=e.retries,o=void 0===r?0:r,a=f(n);return this.memoizedGet(a).then((function(r){var a=r.status,i=r.responseText;if(200===a)try{var s=JSON.parse(i);if(void 0===s.path)throw new Error("not a valid pageData response");var u=n.split("?")[1];return u&&!s.path.includes(u)&&(s.path+="?"+u),Object.assign(e,{status:l.Success,payload:s})}catch(c){}return 404===a||200===a?"/404.html"===n||"/500.html"===n?Object.assign(e,{status:l.Error}):t.fetchPageDataJson(Object.assign(e,{pagePath:"/404.html",notFound:!0})):500===a?t.fetchPageDataJson(Object.assign(e,{pagePath:"/500.html",internalServerError:!0})):o<3?t.fetchPageDataJson(Object.assign(e,{retries:o+1})):Object.assign(e,{status:l.Error})}))},t.loadPageDataJson=function(e){var t=this,n=(0,c.Cj)(e);if(this.pageDataDb.has(n)){var r=this.pageDataDb.get(n);return Promise.resolve(r)}return this.fetchPageDataJson({pagePath:n}).then((function(e){return t.pageDataDb.set(n,e),e}))},t.findMatchPath=function(e){return(0,c.UD)(e)},t.loadPage=function(e){var t=this,n=(0,c.Cj)(e);if(this.pageDb.has(n)){var r=this.pageDb.get(n);return r.error?{error:r.error,status:r.status}:Promise.resolve(r.payload)}if(this.inFlightDb.has(n))return this.inFlightDb.get(n);var o=Promise.all([this.loadAppData(),this.loadPageDataJson(n)]).then((function(e){var r=e[1];if(r.status===l.Error)return{status:l.Error};var o=r.payload,a=o,i=a.componentChunkName,s=a.staticQueryHashes,c=void 0===s?[]:s,p={},f=t.loadComponent(i).then((function(t){var n;return p.createdAt=new Date,!t||t instanceof Error?(p.status=l.Error,p.error=t):(p.status=l.Success,!0===r.notFound&&(p.notFound=!0),o=Object.assign(o,{webpackCompilationHash:e[0]?e[0].webpackCompilationHash:""}),n=m(o,t)),n})),h=Promise.all(c.map((function(e){if(t.staticQueryDb[e]){var n=t.staticQueryDb[e];return{staticQueryHash:e,jsonPayload:n}}return t.memoizedGet("/blog/page-data/sq/d/"+e+".json").then((function(t){var n=JSON.parse(t.responseText);return{staticQueryHash:e,jsonPayload:n}})).catch((function(){throw new Error("We couldn't load \"/blog/page-data/sq/d/"+e+'.json"')}))}))).then((function(e){var n={};return e.forEach((function(e){var r=e.staticQueryHash,o=e.jsonPayload;n[r]=o,t.staticQueryDb[r]=o})),n}));return Promise.all([f,h]).then((function(e){var r,o=e[0],a=e[1];return o&&(r=Object.assign({},o,{staticQueryResults:a}),p.payload=r,u.Z.emit("onPostLoadPageResources",{page:r,pageResources:r})),t.pageDb.set(n,p),p.error?{error:p.error,status:p.status}:r})).catch((function(e){return{error:e,status:l.Error}}))}));return o.then((function(){t.inFlightDb.delete(n)})).catch((function(e){throw t.inFlightDb.delete(n),e})),this.inFlightDb.set(n,o),o},t.loadPageSync=function(e,t){void 0===t&&(t={});var n=(0,c.Cj)(e);if(this.pageDb.has(n)){var r,o=this.pageDb.get(n);if(o.payload)return o.payload;if(null!==(r=t)&&void 0!==r&&r.withErrorDetails)return{error:o.error,status:o.status}}},t.shouldPrefetch=function(e){return!!function(){if("connection"in navigator&&void 0!==navigator.connection){if((navigator.connection.effectiveType||"").includes("2g"))return!1;if(navigator.connection.saveData)return!1}return!0}()&&((!navigator.userAgent||!v.test(navigator.userAgent))&&!this.pageDb.has(e))},t.prefetch=function(e){var t=this;if(!this.shouldPrefetch(e))return{then:function(e){return e(!1)},abort:function(){}};if(this.prefetchTriggered.has(e))return{then:function(e){return e(!0)},abort:function(){}};var n={resolve:null,reject:null,promise:null};n.promise=new Promise((function(e,t){n.resolve=e,n.reject=t})),this.prefetchQueued.push([e,n]);var r=new AbortController;return r.signal.addEventListener("abort",(function(){var n=t.prefetchQueued.findIndex((function(t){return t[0]===e}));-1!==n&&t.prefetchQueued.splice(n,1)})),this.isPrefetchQueueRunning||(this.isPrefetchQueueRunning=!0,setTimeout((function(){t._processNextPrefetchBatch()}),3e3)),{then:function(e,t){return n.promise.then(e,t)},abort:r.abort.bind(r)}},t._processNextPrefetchBatch=function(){var e=this;(window.requestIdleCallback||function(e){return setTimeout(e,0)})((function(){var t=e.prefetchQueued.splice(0,4),n=Promise.all(t.map((function(t){var n=t[0],r=t[1];return e.prefetchTriggered.has(n)||(e.apiRunner("onPrefetchPathname",{pathname:n}),e.prefetchTriggered.add(n)),e.prefetchDisabled?r.resolve(!1):e.doPrefetch((0,c.Cj)(n)).then((function(){e.prefetchCompleted.has(n)||(e.apiRunner("onPostPrefetchPathname",{pathname:n}),e.prefetchCompleted.add(n)),r.resolve(!0)}))})));e.prefetchQueued.length?n.then((function(){setTimeout((function(){e._processNextPrefetchBatch()}),3e3)})):e.isPrefetchQueueRunning=!1}))},t.doPrefetch=function(e){var t=this,n=f(e);return s(n,{crossOrigin:"anonymous",as:"fetch"}).then((function(){return t.loadPageDataJson(e)}))},t.hovering=function(e){this.loadPage(e)},t.getResourceURLsForPathname=function(e){var t=(0,c.Cj)(e),n=this.pageDataDb.get(t);if(n){var r=m(n.payload);return[].concat((0,o.Z)(y(r.page.componentChunkName)),[f(t)])}return null},t.isPageNotFound=function(e){var t=(0,c.Cj)(e),n=this.pageDb.get(t);return!n||n.notFound},t.loadAppData=function(e){var t=this;return void 0===e&&(e=0),this.memoizedGet("/blog/page-data/app-data.json").then((function(n){var r,o=n.status,a=n.responseText;if(200!==o&&e<3)return t.loadAppData(e+1);if(200===o)try{var i=JSON.parse(a);if(void 0===i.webpackCompilationHash)throw new Error("not a valid app-data response");r=i}catch(s){}return r}))},e}(),y=function(e){return(window.___chunkMapping[e]||[]).map((function(e){return"/blog"+e}))},w=function(e){function t(t,n,r){var o;return o=e.call(this,(function(e){if(!t.components[e])throw new Error("We couldn't find the correct component chunk with the name "+e);return t.components[e]().then(p).catch((function(e){return e}))}),n)||this,r&&o.pageDataDb.set((0,c.Cj)(r.path),{pagePath:r.path,payload:r,status:"success"}),o}(0,r.Z)(t,e);var n=t.prototype;return n.doPrefetch=function(t){return e.prototype.doPrefetch.call(this,t).then((function(e){if(e.status!==l.Success)return Promise.resolve();var t=e.payload,n=t.componentChunkName,r=y(n);return Promise.all(r.map(s)).then((function(){return t}))}))},n.loadPageDataJson=function(t){return e.prototype.loadPageDataJson.call(this,t).then((function(e){return e.notFound?h(t,"HEAD").then((function(t){return 200===t.status?{status:l.Error}:e})):e}))},t}(g),b=function(e){d=e},P={enqueue:function(e){return d.prefetch(e)},getResourceURLsForPathname:function(e){return d.getResourceURLsForPathname(e)},loadPage:function(e){return d.loadPage(e)},loadPageSync:function(e,t){return void 0===t&&(t={}),d.loadPageSync(e,t)},prefetch:function(e){return d.prefetch(e)},isPageNotFound:function(e){return d.isPageNotFound(e)},hovering:function(e){return d.hovering(e)},loadAppData:function(){return d.loadAppData()}},_=P;function E(){return d?d.staticQueryDb:{}}},8522:function(e,t,n){"use strict";var r=n(4578),o=n(7294),a=n(3092),i=n(7802),s=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=Object.assign({},this.props,{params:Object.assign({},(0,i.GA)(this.props.location.pathname),this.props.pageResources.json.pageContext.__params)}),t=(0,o.createElement)(this.props.pageResources.component,Object.assign({},e,{key:this.props.path||this.props.pageResources.page.path}));return(0,a.h)("wrapPageElement",{element:t,props:e},t,(function(t){return{element:t.result,props:e}})).pop()},t}(o.Component);t.Z=s},5824:function(e,t,n){"use strict";var r=n(4578),o=n(3092),a=n(7294),i=n(9499),s=n(9679),u=n(1597),c=n(1975),l=n(6073),p=n(8299),f={id:"gatsby-announcer",style:{position:"absolute",top:0,width:1,height:1,padding:0,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0},"aria-live":"assertive","aria-atomic":"true"},h=n(2393),d=n(8037);function v(e){var t=(0,l.J)(e),n=window.location,r=n.hash,o=n.search;return null!=t&&(window.___replace(t.toPath+o+r),!0)}var m="";window.addEventListener("unhandledrejection",(function(e){/loading chunk \d* failed./i.test(e.reason)&&m&&(window.location.pathname=m)}));var g=function(e,t){v(e.pathname)||(m=e.pathname,(0,o.h)("onPreRouteUpdate",{location:e,prevLocation:t}))},y=function(e,t){v(e.pathname)||(0,o.h)("onRouteUpdate",{location:e,prevLocation:t})},w=function(e,t){if(void 0===t&&(t={}),"number"!=typeof e){var n=(0,d.parsePath)(e),r=n.pathname,a=n.search,s=n.hash,u=(0,l.J)(r);if(u&&(e=u.toPath+a+s),window.___swUpdated)window.location=r+a+s;else{var f=setTimeout((function(){p.Z.emit("onDelayedLoadPageResources",{pathname:r}),(0,o.h)("onRouteUpdateDelayed",{location:window.location})}),1e3);c.ZP.loadPage(r+a).then((function(n){if(!n||n.status===c.uQ.Error)return window.history.replaceState({},"",location.href),window.location=r,void clearTimeout(f);n&&n.page.webpackCompilationHash!==window.___webpackCompilationHash&&("serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&"activated"===navigator.serviceWorker.controller.state&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"}),window.location=r+a+s),(0,i.navigate)(e,t),clearTimeout(f)}))}}else h.V5.navigate(e)};function b(e,t){var n=this,r=t.location,a=r.pathname,i=r.hash,s=(0,o.h)("shouldUpdateScroll",{prevRouterProps:e,pathname:a,routerProps:{location:r},getSavedScrollPosition:function(e){return[0,n._stateStorage.read(e,e.key)]}});if(s.length>0)return s[s.length-1];if(e&&e.location.pathname===a)return i?decodeURI(i.slice(1)):[0,0];return!0}var P=function(e){function t(t){var n;return(n=e.call(this,t)||this).announcementRef=a.createRef(),n}(0,r.Z)(t,e);var n=t.prototype;return n.componentDidUpdate=function(e,t){var n=this;requestAnimationFrame((function(){var e="new page at "+n.props.location.pathname;document.title&&(e=document.title);var t=document.querySelectorAll("#gatsby-focus-wrapper h1");t&&t.length&&(e=t[0].textContent);var r="Navigated to "+e;n.announcementRef.current&&(n.announcementRef.current.innerText!==r&&(n.announcementRef.current.innerText=r))}))},n.render=function(){return a.createElement("div",Object.assign({},f,{ref:this.announcementRef}))},t}(a.Component),_=function(e,t){var n,r;return e.href!==t.href||(null==e||null===(n=e.state)||void 0===n?void 0:n.key)!==(null==t||null===(r=t.state)||void 0===r?void 0:r.key)},E=function(e){function t(t){var n;return n=e.call(this,t)||this,g(t.location,null),n}(0,r.Z)(t,e);var n=t.prototype;return n.componentDidMount=function(){y(this.props.location,null)},n.shouldComponentUpdate=function(e){return!!_(e.location,this.props.location)&&(g(this.props.location,e.location),!0)},n.componentDidUpdate=function(e){_(e.location,this.props.location)&&y(this.props.location,e.location)},n.render=function(){return a.createElement(a.Fragment,null,this.props.children,a.createElement(P,{location:location}))},t}(a.Component),S=n(8522),k=n(5418);function x(e,t){for(var n in e)if(!(n in t))return!0;for(var r in t)if(e[r]!==t[r])return!0;return!1}var R,C,O=function(e){function t(t){var n;n=e.call(this)||this;var r=t.location,o=t.pageResources;return n.state={location:Object.assign({},r),pageResources:o||c.ZP.loadPageSync(r.pathname+r.search,{withErrorDetails:!0})},n}(0,r.Z)(t,e),t.getDerivedStateFromProps=function(e,t){var n=e.location;return t.location.href!==n.href?{pageResources:c.ZP.loadPageSync(n.pathname+n.search,{withErrorDetails:!0}),location:Object.assign({},n)}:{location:Object.assign({},n)}};var n=t.prototype;return n.loadResources=function(e){var t=this;c.ZP.loadPage(e).then((function(n){n&&n.status!==c.uQ.Error?t.setState({location:Object.assign({},window.location),pageResources:n}):(window.history.replaceState({},"",location.href),window.location=e)}))},n.shouldComponentUpdate=function(e,t){return t.pageResources?this.state.pageResources!==t.pageResources||(this.state.pageResources.component!==t.pageResources.component||(this.state.pageResources.json!==t.pageResources.json||(!(this.state.location.key===t.location.key||!t.pageResources.page||!t.pageResources.page.matchPath&&!t.pageResources.page.path)||function(e,t,n){return x(e.props,t)||x(e.state,n)}(this,e,t)))):(this.loadResources(e.location.pathname+e.location.search),!1)},n.render=function(){return this.props.children(this.state)},t}(a.Component),j=n(1505),D=new c.kL(k,[],window.pageData);(0,c.N1)(D),D.setApiRunner(o.h);var L=n(745);C=function(e,t){return L.createRoot(t).render(e)},R=function(e,t){return L.hydrateRoot(t,e)},window.asyncRequires=k,window.___emitter=p.Z,window.___loader=c.jN,h.V5.listen((function(e){e.location.action=e.action})),window.___push=function(e){return w(e,{replace:!1})},window.___replace=function(e){return w(e,{replace:!0})},window.___navigate=function(e,t){return w(e,t)};var T="gatsby-reload-compilation-hash-match";(0,o.I)("onClientEntry").then((function(){(0,o.h)("registerServiceWorker").filter(Boolean).length>0&&n(9939);var e=function(e){return a.createElement(i.BaseContext.Provider,{value:{baseuri:"/",basepath:"/"}},a.createElement(S.Z,e))},t=a.createContext({}),l=function(e){function n(){return e.apply(this,arguments)||this}return(0,r.Z)(n,e),n.prototype.render=function(){var e=this.props.children;return a.createElement(i.Location,null,(function(n){var r=n.location;return a.createElement(O,{location:r},(function(n){var r=n.pageResources,o=n.location,i=(0,c.hs)();return a.createElement(u.StaticQueryContext.Provider,{value:i},a.createElement(t.Provider,{value:{pageResources:r,location:o}},e))}))}))},n}(a.Component),p=function(n){function o(){return n.apply(this,arguments)||this}return(0,r.Z)(o,n),o.prototype.render=function(){var n=this;return a.createElement(t.Consumer,null,(function(t){var r=t.pageResources,o=t.location;return a.createElement(E,{location:o},a.createElement(s.$C,{location:o,shouldUpdateScroll:b},a.createElement(i.Router,{basepath:"/blog",location:o,id:"gatsby-focus-wrapper"},a.createElement(e,Object.assign({path:"/404.html"===r.page.path||"/500.html"===r.page.path?(0,j.Z)(o.pathname,"/blog"):encodeURI((r.page.matchPath||r.page.path).split("?")[0])},n.props,{location:o,pageResources:r},r.json)))))}))},o}(a.Component),f=window,h=f.pagePath,d=f.location;h&&"/blog"+h!==d.pathname+(h.includes("?")?d.search:"")&&!(D.findMatchPath((0,j.Z)(d.pathname,"/blog"))||h.match(/^\/(404|500)(\/?|.html)$/)||h.match(/^\/offline-plugin-app-shell-fallback\/?$/))&&(0,i.navigate)("/blog"+h+(h.includes("?")?"":d.search)+d.hash,{replace:!0});var v=function(){try{return sessionStorage}catch(e){return null}};c.jN.loadPage(d.pathname+d.search).then((function(e){var t,n=v();if(null!=e&&null!==(t=e.page)&&void 0!==t&&t.webpackCompilationHash&&e.page.webpackCompilationHash!==window.___webpackCompilationHash&&("serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&"activated"===navigator.serviceWorker.controller.state&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"}),n&&!("1"===n.getItem(T))))return n.setItem(T,"1"),void window.location.reload(!0);if(n&&n.removeItem(T),!e||e.status===c.uQ.Error){var r="page resources for "+d.pathname+" not found. Not rendering React";if(e&&e.error)throw console.error(r),e.error;throw new Error(r)}var i=(0,o.h)("wrapRootElement",{element:a.createElement(p,null)},a.createElement(p,null),(function(e){return{element:e.result}})).pop(),s=function(){var e=a.useRef(!1);return a.useEffect((function(){e.current||(e.current=!0,performance.mark&&performance.mark("onInitialClientRender"),(0,o.h)("onInitialClientRender"))}),[]),a.createElement(l,null,i)},u=document.getElementById("gatsby-focus-wrapper"),f=C;u&&u.children.length&&(f=R);var h=(0,o.h)("replaceHydrateFunction",void 0,f)[0];function m(){var e="undefined"!=typeof window?document.getElementById("___gatsby"):null;h(a.createElement(s,null),e)}var g=document;if("complete"===g.readyState||"loading"!==g.readyState&&!g.documentElement.doScroll)setTimeout((function(){m()}),0);else{var y=function e(){g.removeEventListener("DOMContentLoaded",e,!1),window.removeEventListener("load",e,!1),m()};g.addEventListener("DOMContentLoaded",y,!1),window.addEventListener("load",y,!1)}}))}))},224:function(e,t,n){"use strict";n.r(t);var r=n(7294),o=n(1975),a=n(8522);t.default=function(e){var t=e.location,n=o.ZP.loadPageSync(t.pathname);return n?r.createElement(a.Z,Object.assign({location:t,pageResources:n},n.json)):null}},2743:function(e,t,n){var r;e.exports=(r=n(224))&&r.default||r},9712:function(e,t){t.O=function(e){return e}},6073:function(e,t,n){"use strict";n.d(t,{J:function(){return a}});var r=new Map,o=new Map;function a(e){var t=r.get(e);return t||(t=o.get(e.toLowerCase())),t}[].forEach((function(e){e.ignoreCase?o.set(e.fromPath,e):r.set(e.fromPath,e)}))},9939:function(e,t,n){"use strict";n.r(t);var r=n(3092);"https:"!==window.location.protocol&&"localhost"!==window.location.hostname?console.error("Service workers can only be used over HTTPS, or on localhost for development"):"serviceWorker"in navigator&&navigator.serviceWorker.register("/blog/sw.js").then((function(e){e.addEventListener("updatefound",(function(){(0,r.h)("onServiceWorkerUpdateFound",{serviceWorker:e});var t=e.installing;console.log("installingWorker",t),t.addEventListener("statechange",(function(){switch(t.state){case"installed":navigator.serviceWorker.controller?(window.___swUpdated=!0,(0,r.h)("onServiceWorkerUpdateReady",{serviceWorker:e}),window.___failedResources&&(console.log("resources failed, SW updated - reloading"),window.location.reload())):(console.log("Content is now available offline!"),(0,r.h)("onServiceWorkerInstalled",{serviceWorker:e}));break;case"redundant":console.error("The installing service worker became redundant."),(0,r.h)("onServiceWorkerRedundant",{serviceWorker:e});break;case"activated":(0,r.h)("onServiceWorkerActive",{serviceWorker:e})}}))}))})).catch((function(e){console.error("Error during service worker registration:",e)}))},1505:function(e,t,n){"use strict";function r(e,t){return void 0===t&&(t=""),t?e===t?"/":e.startsWith(t+"/")?e.slice(t.length):e:e}n.d(t,{Z:function(){return r}})},7420:function(e,t,n){"use strict";n.r(t)},8194:function(e,t,n){"use strict";var r=n(5318);t.__esModule=!0,t.default=function(e,t,n){var r=v(n,t);return e.addEventListener("click",r),function(){return e.removeEventListener("click",r)}},t.routeThroughBrowserOrApp=t.hashShouldBeFollowed=t.pathIsNotHandledByApp=t.urlsAreOnSameOrigin=t.authorIsForcingNavigation=t.anchorsTargetIsEquivalentToSelf=t.findClosestAnchor=t.navigationWasHandledElsewhere=t.slashedPathname=t.userIsForcingNavigation=void 0;var o=r(n(4564)),a=n(1597),i=function(e){return 0!==e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey};t.userIsForcingNavigation=i;var s=function(e){return"/"===e[0]?e:"/"+e};t.slashedPathname=s;var u=function(e){return e.defaultPrevented};t.navigationWasHandledElsewhere=u;var c=function(e){for(;e.parentNode;e=e.parentNode)if("a"===e.nodeName.toLowerCase())return e;return null};t.findClosestAnchor=c;var l=function(e){return!1===e.hasAttribute("target")||null==e.target||["_self",""].includes(e.target)||"_parent"===e.target&&(!e.ownerDocument.defaultView.parent||e.ownerDocument.defaultView.parent===e.ownerDocument.defaultView)||"_top"===e.target&&(!e.ownerDocument.defaultView.top||e.ownerDocument.defaultView.top===e.ownerDocument.defaultView)};t.anchorsTargetIsEquivalentToSelf=l;var p=function(e){return!0===e.hasAttribute("download")||!1===l(e)};t.authorIsForcingNavigation=p;var f=function(e,t){return e.protocol===t.protocol&&e.host===t.host};t.urlsAreOnSameOrigin=f;var h=function(e,t){return!1===t.test(s(e.pathname))||-1!==e.pathname.search(/^.*\.((?!htm)[a-z0-9]{1,5})$/i)};t.pathIsNotHandledByApp=h;var d=function(e,t){return""!==t.hash&&(""===t.pathname||t.pathname===e.pathname)};t.hashShouldBeFollowed=d;var v=function(e,t){return function(n){if(window.___failedResources)return!0;if(i(n))return!0;if(u(n))return!0;var r=c(n.target);if(null==r)return!0;if(p(r))return!0;var l=document.createElement("a");""!==r.href&&(l.href=r.href),"SVGAnimatedString"in window&&r.href instanceof SVGAnimatedString&&(l.href=r.href.animVal);var v=document.createElement("a");if(v.href=window.location.href,!1===f(v,l))return!0;var m=new RegExp("^"+(0,o.default)((0,a.withPrefix)("/")));if(h(l,m))return!0;if(d(v,l))return!0;if(t.excludePattern&&new RegExp(t.excludePattern).test(l.pathname))return!0;n.preventDefault();var g=s(l.pathname).replace(m,"/");return e(""+g+l.search+l.hash),!1}};t.routeThroughBrowserOrApp=v},5903:function(e,t,n){"use strict";var r=n(5318),o=n(1597),a=r(n(8194));t.onClientEntry=function(e,t){void 0===t&&(t={}),(0,a.default)(window,t,(function(e){(0,o.navigate)(e)}))}},9608:function(e,t,n){"use strict";n.r(t),n.d(t,{onRouteUpdate:function(){return r}});n(1597),n(292);var r=function(e,t){e.location}},292:function(e,t,n){"use strict";var r=n(1597)},8805:function(e,t,n){"use strict";var r=n(5318);t.__esModule=!0,t.onRouteUpdate=t.onRouteUpdateDelayed=t.onClientEntry=void 0;var o=r(n(7154)),a=r(n(2735)),i={color:"#29d"};t.onClientEntry=function(e,t){void 0===t&&(t={});var n=(0,o.default)({},i,t),r="\n #nprogress {\n pointer-events: none;\n }\n #nprogress .bar {\n background: "+n.color+";\n position: fixed;\n z-index: 1031;\n top: 0;\n left: 0;\n width: 100%;\n height: 2px;\n }\n #nprogress .peg {\n display: block;\n position: absolute;\n right: 0px;\n width: 100px;\n height: 100%;\n box-shadow: 0 0 10px "+n.color+", 0 0 5px "+n.color+";\n opacity: 1.0;\n -webkit-transform: rotate(3deg) translate(0px, -4px);\n -ms-transform: rotate(3deg) translate(0px, -4px);\n transform: rotate(3deg) translate(0px, -4px);\n }\n #nprogress .spinner {\n display: block;\n position: fixed;\n z-index: 1031;\n top: 15px;\n right: 15px;\n }\n #nprogress .spinner-icon {\n width: 18px;\n height: 18px;\n box-sizing: border-box;\n border: solid 2px transparent;\n border-top-color: "+n.color+";\n border-left-color: "+n.color+";\n border-radius: 50%;\n -webkit-animation: nprogress-spinner 400ms linear infinite;\n animation: nprogress-spinner 400ms linear infinite;\n }\n .nprogress-custom-parent {\n overflow: hidden;\n position: relative;\n }\n .nprogress-custom-parent #nprogress .spinner,\n .nprogress-custom-parent #nprogress .bar {\n position: absolute;\n }\n @-webkit-keyframes nprogress-spinner {\n 0% {\n -webkit-transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n }\n }\n @keyframes nprogress-spinner {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n ",s=document.createElement("style");s.id="nprogress-styles",s.innerHTML=r,document.head.appendChild(s),a.default.configure(n)};t.onRouteUpdateDelayed=function(){a.default.start()};t.onRouteUpdate=function(){a.default.done()}},9684:function(e,t){"use strict";t.registerServiceWorker=function(){return"true"!=={}.GATSBY_IS_PREVIEW};var n=/^(stylesheet|preload)$/,r=[];function o(e,t){if(!window.___swUpdated&&"serviceWorker"in navigator){var n=navigator.serviceWorker;if(null===n.controller)r.push(e);else{var o=t(e);n.controller.postMessage({gatsbyApi:"setPathResources",path:e,resources:o})}}}t.onServiceWorkerActive=function(e){var t=e.getResourceURLsForPathname,o=e.serviceWorker;if("true"!=={}.GATSBY_IS_PREVIEW)if(window.___swUpdated)o.active.postMessage({gatsbyApi:"clearPathResources"});else{var a=document.querySelectorAll("\n head > script[src],\n head > link[href],\n head > style[data-href]\n "),i=[].slice.call(a).filter((function(e){return"LINK"!==e.tagName||n.test(e.getAttribute("rel"))})).map((function(e){return e.src||e.href||e.getAttribute("data-href")})),s=[];r.forEach((function(e){var n=t(e);s.push.apply(s,n),o.active.postMessage({gatsbyApi:"setPathResources",path:e,resources:n})})),[].concat(i,s).forEach((function(e){var t=document.createElement("link");t.rel="prefetch",t.href=e,t.onload=t.remove,t.onerror=t.remove,document.head.appendChild(t)}))}},t.onRouteUpdate=function(e){var t=e.location,n=e.getResourceURLsForPathname;o(t.pathname.replace("/blog",""),n),"serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"enableOfflineShell"})},t.onPostPrefetchPathname=function(e){o(e.pathname,e.getResourceURLsForPathname)}},9650:function(e,t){"use strict";var n=0,r=function(e){var t=window.decodeURI(e.replace("#",""));if(""!==t){var r=document.getElementById(t);if(r){var o=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop,a=document.documentElement.clientTop||document.body.clientTop||0,i=window.getComputedStyle(r),s=i.getPropertyValue("scroll-margin-top")||i.getPropertyValue("scroll-snap-margin-top")||"0px";return r.getBoundingClientRect().top+o-parseInt(s,10)-a-n}}return null};t.onInitialClientRender=function(e,t){t.offsetY&&(n=t.offsetY),requestAnimationFrame((function(){var e=r(window.location.hash);null!==e&&window.scrollTo(0,e)}))},t.shouldUpdateScroll=function(e){var t=e.routerProps.location,n=r(t.hash);return null===n||[0,n]}},9499:function(e,t,n){"use strict";n.r(t),n.d(t,{BaseContext:function(){return I},Link:function(){return J},Location:function(){return A},LocationProvider:function(){return M},Match:function(){return X},Redirect:function(){return Y},Router:function(){return W},ServerLocation:function(){return U},createHistory:function(){return _},createMemorySource:function(){return E},globalHistory:function(){return k},isRedirect:function(){return V},matchPath:function(){return c},navigate:function(){return x},redirectTo:function(){return $},useLocation:function(){return ee},useMatch:function(){return re},useNavigate:function(){return te},useParams:function(){return ne}});var r=n(7294),o=n(1143),a=n.n(o),i=n(9712),s=function(e,t){return e.substr(0,t.length)===t},u=function(e,t){for(var n=void 0,r=void 0,o=t.split("?")[0],i=g(o),s=""===i[0],u=m(e),c=0,l=u.length;ct.score?-1:e.index-t.index}))},g=function(e){return e.replace(/(^\/+|\/+$)/g,"").split("/")},y=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r0})))&&n.length>0?"?"+n.join("&"):"")},w=["uri","path"],b=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},s=i.state,u=i.replace,c=void 0!==u&&u;if("number"==typeof t)e.history.go(t);else{s=b({},s,{key:Date.now()+""});try{o||c?e.history.replaceState(s,null,t):e.history.pushState(s,null,t)}catch(p){e.location[c?"replace":"assign"](t)}}r=P(e),o=!0;var l=new Promise((function(e){return a=e}));return n.forEach((function(e){return e({location:r,action:"PUSH"})})),l}}},E=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/",t=e.indexOf("?"),n={pathname:t>-1?e.substr(0,t):e,search:t>-1?e.substr(t):""},r=0,o=[n],a=[null];return{get location(){return o[r]},addEventListener:function(e,t){},removeEventListener:function(e,t){},history:{get entries(){return o},get index(){return r},get state(){return a[r]},pushState:function(e,t,n){var i=n.split("?"),s=i[0],u=i[1],c=void 0===u?"":u;r++,o.push({pathname:s,search:c.length?"?"+c:c}),a.push(e)},replaceState:function(e,t,n){var i=n.split("?"),s=i[0],u=i[1],c=void 0===u?"":u;o[r]={pathname:s,search:c},a[r]=e},go:function(e){var t=r+e;t<0||t>a.length-1||(r=t)}}}},S=!("undefined"==typeof window||!window.document||!window.document.createElement),k=_(S?window:E()),x=k.navigate,R=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function O(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function j(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function D(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var L=function(e,t){var n=(0,r.createContext)(t);return n.displayName=e,n},T=L("Location"),A=function(e){var t=e.children;return r.createElement(T.Consumer,null,(function(e){return e?t(e):r.createElement(M,null,t)}))},M=function(e){function t(){var n,r;O(this,t);for(var o=arguments.length,a=Array(o),i=0;i-1?(a=t.substring(0,o),i=t.substring(o)):a=t,r.createElement(T.Provider,{value:{location:{pathname:a,search:i,hash:""},navigate:function(){throw new Error("You can't call navigate on the server.")}}},n)},I=L("Base",{baseuri:"/",basepath:"/",navigate:k.navigate}),W=function(e){return r.createElement(I.Consumer,null,(function(t){return r.createElement(A,null,(function(n){return r.createElement(N,R({},t,n,e))}))}))},N=function(e){function t(){return O(this,t),j(this,e.apply(this,arguments))}return D(t,e),t.prototype.render=function(){var e=this.props,t=e.location,n=e.navigate,o=e.basepath,a=e.primary,i=e.children,s=(e.baseuri,e.component),c=void 0===s?"div":s,p=C(e,["location","navigate","basepath","primary","children","baseuri","component"]),f=r.Children.toArray(i).reduce((function(e,t){var n=ae(o)(t);return e.concat(n)}),[]),h=t.pathname,d=u(f,h);if(d){var v=d.params,m=d.uri,g=d.route,y=d.route.value;o=g.default?o:g.path.replace(/\*$/,"");var w=R({},v,{uri:m,location:t,navigate:function(e,t){return n(l(e,m),t)}}),b=r.cloneElement(y,w,y.props.children?r.createElement(W,{location:t,primary:a},y.props.children):void 0),P=a?q:c,_=a?R({uri:m,location:t,component:c},p):p;return r.createElement(I.Provider,{value:{baseuri:m,basepath:o,navigate:w.navigate}},r.createElement(P,_,b))}return null},t}(r.PureComponent);N.defaultProps={primary:!0};var F=L("Focus"),q=function(e){var t=e.uri,n=e.location,o=e.component,a=C(e,["uri","location","component"]);return r.createElement(F.Consumer,null,(function(e){return r.createElement(Q,R({},a,{component:o,requestFocus:e,uri:t,location:n}))}))},Z=!0,H=0,Q=function(e){function t(){var n,r;O(this,t);for(var o=arguments.length,a=Array(o),i=0;ie.length)&&(t=e.length);for(var n=0,r=new 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 z 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 b{`lc1b2)jOJ|xfdpzZ#Drk`eF_zM951X3Mq literal 0 HcmV?d00001 diff --git a/app-82702098eac976ce09a7.js.map b/app-82702098eac976ce09a7.js.map new file mode 100644 index 0000000000..fbe1c4280a --- /dev/null +++ b/app-82702098eac976ce09a7.js.map @@ -0,0 +1 @@ +{"version":3,"file":"app-82702098eac976ce09a7.js","mappings":"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","sources":["webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/extends.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/inheritsLoose.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/setPrototypeOf.js","webpack://@sabertazimi/blog/./node_modules/@gatsbyjs/reach-router/lib/history.js","webpack://@sabertazimi/blog/./node_modules/@gatsbyjs/reach-router/lib/utils.js","webpack://@sabertazimi/blog/./node_modules/accessible-nprogress/dist/accessible-nprogress.js","webpack://@sabertazimi/blog/./node_modules/escape-string-regexp/index.js","webpack://@sabertazimi/blog/./node_modules/gatsby-page-utils/dist/apply-trailing-slash-option.js","webpack://@sabertazimi/blog/./node_modules/gatsby-link/index.js","webpack://@sabertazimi/blog/./node_modules/gatsby-link/is-local-link.js","webpack://@sabertazimi/blog/./node_modules/gatsby-link/parse-path.js","webpack://@sabertazimi/blog/./node_modules/gatsby-link/rewrite-link-path.js","webpack://@sabertazimi/blog/./node_modules/gatsby-react-router-scroll/index.js","webpack://@sabertazimi/blog/./node_modules/gatsby-react-router-scroll/scroll-handler.js","webpack://@sabertazimi/blog/./node_modules/gatsby-react-router-scroll/session-storage.js","webpack://@sabertazimi/blog/./node_modules/gatsby-react-router-scroll/use-scroll-restoration.js","webpack://@sabertazimi/blog/./.cache/_this_is_virtual_fs_path_/$virtual/async-requires.js","webpack://@sabertazimi/blog/./.cache/api-runner-browser-plugins.js","webpack://@sabertazimi/blog/./.cache/api-runner-browser.js","webpack://@sabertazimi/blog/./node_modules/mitt/dist/mitt.es.js","webpack://@sabertazimi/blog/./.cache/emitter.js","webpack://@sabertazimi/blog/./.cache/normalize-page-path.js","webpack://@sabertazimi/blog/./.cache/find-path.js","webpack://@sabertazimi/blog/./.cache/gatsby-browser-entry.js","webpack://@sabertazimi/blog/./.cache/prefetch.js","webpack://@sabertazimi/blog/./.cache/loader.js","webpack://@sabertazimi/blog/./.cache/page-renderer.js","webpack://@sabertazimi/blog/./.cache/route-announcer-props.js","webpack://@sabertazimi/blog/./.cache/navigation.js","webpack://@sabertazimi/blog/./node_modules/shallow-compare/es/index.js","webpack://@sabertazimi/blog/./.cache/production-app.js","webpack://@sabertazimi/blog/./.cache/ensure-resources.js","webpack://@sabertazimi/blog/./.cache/public-page-renderer-prod.js","webpack://@sabertazimi/blog/./.cache/public-page-renderer.js","webpack://@sabertazimi/blog/./.cache/react-lifecycles-compat.js","webpack://@sabertazimi/blog/./.cache/redirect-utils.js","webpack://@sabertazimi/blog/./.cache/register-service-worker.js","webpack://@sabertazimi/blog/./.cache/strip-prefix.js","webpack://@sabertazimi/blog/./node_modules/gatsby-plugin-catch-links/catch-links.js","webpack://@sabertazimi/blog/./node_modules/gatsby-plugin-catch-links/gatsby-browser.js","webpack://@sabertazimi/blog/./node_modules/gatsby-plugin-manifest/gatsby-browser.js","webpack://@sabertazimi/blog/./node_modules/gatsby-plugin-manifest/get-manifest-pathname.js","webpack://@sabertazimi/blog/./node_modules/gatsby-plugin-nprogress/gatsby-browser.js","webpack://@sabertazimi/blog/./node_modules/gatsby-plugin-offline/gatsby-browser.js","webpack://@sabertazimi/blog/./node_modules/gatsby-remark-autolink-headers/gatsby-browser.js","webpack://@sabertazimi/blog/./node_modules/@gatsbyjs/reach-router/es/lib/utils.js","webpack://@sabertazimi/blog/./node_modules/@gatsbyjs/reach-router/es/lib/history.js","webpack://@sabertazimi/blog/./node_modules/@gatsbyjs/reach-router/es/index.js","webpack://@sabertazimi/blog/./node_modules/invariant/browser.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://@sabertazimi/blog/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js"],"sourcesContent":["function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var setPrototypeOf = require(\"./setPrototypeOf.js\");\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inheritsLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar getLocation = function getLocation(source) {\n var _source$location = source.location,\n search = _source$location.search,\n hash = _source$location.hash,\n href = _source$location.href,\n origin = _source$location.origin,\n protocol = _source$location.protocol,\n host = _source$location.host,\n hostname = _source$location.hostname,\n port = _source$location.port;\n var pathname = source.location.pathname;\n\n if (!pathname && href && canUseDOM) {\n var url = new URL(href);\n pathname = url.pathname;\n }\n\n return {\n pathname: encodeURI(decodeURI(pathname)),\n search: search,\n hash: hash,\n href: href,\n origin: origin,\n protocol: protocol,\n host: host,\n hostname: hostname,\n port: port,\n state: source.history.state,\n key: source.history.state && source.history.state.key || \"initial\"\n };\n};\n\nvar createHistory = function createHistory(source, options) {\n var listeners = [];\n var location = getLocation(source);\n var transitioning = false;\n\n var resolveTransition = function resolveTransition() {};\n\n return {\n get location() {\n return location;\n },\n\n get transitioning() {\n return transitioning;\n },\n\n _onTransitionComplete: function _onTransitionComplete() {\n transitioning = false;\n resolveTransition();\n },\n listen: function listen(listener) {\n listeners.push(listener);\n\n var popstateListener = function popstateListener() {\n location = getLocation(source);\n listener({\n location: location,\n action: \"POP\"\n });\n };\n\n source.addEventListener(\"popstate\", popstateListener);\n return function () {\n source.removeEventListener(\"popstate\", popstateListener);\n listeners = listeners.filter(function (fn) {\n return fn !== listener;\n });\n };\n },\n navigate: function navigate(to) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n state = _ref.state,\n _ref$replace = _ref.replace,\n replace = _ref$replace === undefined ? false : _ref$replace;\n\n if (typeof to === \"number\") {\n source.history.go(to);\n } else {\n state = _extends({}, state, {\n key: Date.now() + \"\"\n }); // try...catch iOS Safari limits to 100 pushState calls\n\n try {\n if (transitioning || replace) {\n source.history.replaceState(state, null, to);\n } else {\n source.history.pushState(state, null, to);\n }\n } catch (e) {\n source.location[replace ? \"replace\" : \"assign\"](to);\n }\n }\n\n location = getLocation(source);\n transitioning = true;\n var transition = new Promise(function (res) {\n return resolveTransition = res;\n });\n listeners.forEach(function (listener) {\n return listener({\n location: location,\n action: \"PUSH\"\n });\n });\n return transition;\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\n\n\nvar createMemorySource = function createMemorySource() {\n var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n var searchIndex = initialPath.indexOf(\"?\");\n var initialLocation = {\n pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n search: searchIndex > -1 ? initialPath.substr(searchIndex) : \"\"\n };\n var index = 0;\n var stack = [initialLocation];\n var states = [null];\n return {\n get location() {\n return stack[index];\n },\n\n addEventListener: function addEventListener(name, fn) {},\n removeEventListener: function removeEventListener(name, fn) {},\n history: {\n get entries() {\n return stack;\n },\n\n get index() {\n return index;\n },\n\n get state() {\n return states[index];\n },\n\n pushState: function pushState(state, _, uri) {\n var _uri$split = uri.split(\"?\"),\n pathname = _uri$split[0],\n _uri$split$ = _uri$split[1],\n search = _uri$split$ === undefined ? \"\" : _uri$split$;\n\n index++;\n stack.push({\n pathname: pathname,\n search: search.length ? \"?\" + search : search\n });\n states.push(state);\n },\n replaceState: function replaceState(state, _, uri) {\n var _uri$split2 = uri.split(\"?\"),\n pathname = _uri$split2[0],\n _uri$split2$ = _uri$split2[1],\n search = _uri$split2$ === undefined ? \"\" : _uri$split2$;\n\n stack[index] = {\n pathname: pathname,\n search: search\n };\n states[index] = state;\n },\n go: function go(to) {\n var newIndex = index + to;\n\n if (newIndex < 0 || newIndex > states.length - 1) {\n return;\n }\n\n index = newIndex;\n }\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\n\n\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\n\nvar getSource = function getSource() {\n return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate; ////////////////////////////////////////////////////////////////////////////////\n\nexports.globalHistory = globalHistory;\nexports.navigate = navigate;\nexports.createHistory = createHistory;\nexports.createMemorySource = createMemorySource;","\"use strict\";\n\nexports.__esModule = true;\nexports.shallowCompare = exports.validateRedirect = exports.insertParams = exports.resolve = exports.match = exports.pick = exports.startsWith = undefined;\n\nvar _invariant = require(\"invariant\");\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n} ////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\n\n\nvar startsWith = function startsWith(string, search) {\n return string.substr(0, search.length) === search;\n}; ////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n// static > dynamic > splat > root\n//\n// This way we don't have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n// { path, default, value }\n//\n// And a returned match looks like:\n//\n// { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\n\n\nvar pick = function pick(routes, uri) {\n var match = void 0;\n var default_ = void 0;\n\n var _uri$split = uri.split(\"?\"),\n uriPathname = _uri$split[0];\n\n var uriSegments = segmentize(uriPathname);\n var isRootUri = uriSegments[0] === \"\";\n var ranked = rankRoutes(routes);\n\n for (var i = 0, l = ranked.length; i < l; i++) {\n var missed = false;\n var route = ranked[i].route;\n\n if (route.default) {\n default_ = {\n route: route,\n params: {},\n uri: uri\n };\n continue;\n }\n\n var routeSegments = segmentize(route.path);\n var params = {};\n var max = Math.max(uriSegments.length, routeSegments.length);\n var index = 0;\n\n for (; index < max; index++) {\n var routeSegment = routeSegments[index];\n var uriSegment = uriSegments[index];\n\n if (isSplat(routeSegment)) {\n // Hit a splat, just grab the rest, and return a match\n // uri: /files/documents/work\n // route: /files/*\n var param = routeSegment.slice(1) || \"*\";\n params[param] = uriSegments.slice(index).map(decodeURIComponent).join(\"/\");\n break;\n }\n\n if (uriSegment === undefined) {\n // URI is shorter than the route, no match\n // uri: /users\n // route: /users/:userId\n missed = true;\n break;\n }\n\n var dynamicMatch = paramRe.exec(routeSegment);\n\n if (dynamicMatch && !isRootUri) {\n var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n !matchIsNotReserved ? process.env.NODE_ENV !== \"production\" ? (0, _invariant2.default)(false, \" dynamic segment \\\"\" + dynamicMatch[1] + \"\\\" is a reserved name. Please use a different name in path \\\"\" + route.path + \"\\\".\") : (0, _invariant2.default)(false) : void 0;\n var value = decodeURIComponent(uriSegment);\n params[dynamicMatch[1]] = value;\n } else if (routeSegment !== uriSegment) {\n // Current segments don't match, not dynamic, not splat, so no match\n // uri: /users/123/settings\n // route: /users/:id/profile\n missed = true;\n break;\n }\n }\n\n if (!missed) {\n match = {\n route: route,\n params: params,\n uri: \"/\" + uriSegments.slice(0, index).join(\"/\")\n };\n break;\n }\n }\n\n return match || default_ || null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\n\n\nvar match = function match(path, uri) {\n return pick([{\n path: path\n }], uri);\n}; ////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files. Relative URIs\n// in the browser can feel awkward because not only can you be \"in a directory\"\n// you can be \"at a file\", too. For example\n//\n// browserSpecResolve('foo', '/bar/') => /bar/foo\n// browserSpecResolve('foo', '/bar') => /foo\n//\n// But on the command line of a file system, it's not as complicated, you can't\n// `cd` from a file, only directories. This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n// \n// // instead of\n// \n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n// cd deeper\n// # not\n// cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\n\n\nvar resolve = function resolve(to, base) {\n // /foo/bar, /baz/qux => /foo/bar\n if (startsWith(to, \"/\")) {\n return to;\n }\n\n var _to$split = to.split(\"?\"),\n toPathname = _to$split[0],\n toQuery = _to$split[1];\n\n var _base$split = base.split(\"?\"),\n basePathname = _base$split[0];\n\n var toSegments = segmentize(toPathname);\n var baseSegments = segmentize(basePathname); // ?a=b, /users?b=c => /users?a=b\n\n if (toSegments[0] === \"\") {\n return addQuery(basePathname, toQuery);\n } // profile, /users/789 => /users/789/profile\n\n\n if (!startsWith(toSegments[0], \".\")) {\n var pathname = baseSegments.concat(toSegments).join(\"/\");\n return addQuery((basePathname === \"/\" ? \"\" : \"/\") + pathname, toQuery);\n } // ./ /users/123 => /users/123\n // ../ /users/123 => /users\n // ../.. /users/123 => /\n // ../../one /a/b/c/d => /a/b/one\n // .././one /a/b/c/d => /a/b/c/one\n\n\n var allSegments = baseSegments.concat(toSegments);\n var segments = [];\n\n for (var i = 0, l = allSegments.length; i < l; i++) {\n var segment = allSegments[i];\n if (segment === \"..\") segments.pop();else if (segment !== \".\") segments.push(segment);\n }\n\n return addQuery(\"/\" + segments.join(\"/\"), toQuery);\n}; ////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\n\nvar insertParams = function insertParams(path, params) {\n var _path$split = path.split(\"?\"),\n pathBase = _path$split[0],\n _path$split$ = _path$split[1],\n query = _path$split$ === undefined ? \"\" : _path$split$;\n\n var segments = segmentize(pathBase);\n var constructedPath = \"/\" + segments.map(function (segment) {\n var match = paramRe.exec(segment);\n return match ? params[match[1]] : segment;\n }).join(\"/\");\n var _params$location = params.location;\n _params$location = _params$location === undefined ? {} : _params$location;\n var _params$location$sear = _params$location.search,\n search = _params$location$sear === undefined ? \"\" : _params$location$sear;\n var searchSplit = search.split(\"?\")[1] || \"\";\n constructedPath = addQuery(constructedPath, query, searchSplit);\n return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n var filter = function filter(segment) {\n return isDynamic(segment);\n };\n\n var fromString = segmentize(from).filter(filter).sort().join(\"/\");\n var toString = segmentize(to).filter(filter).sort().join(\"/\");\n return fromString === toString;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar paramRe = /^:(.+)/;\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n return segment === \"\";\n};\n\nvar isDynamic = function isDynamic(segment) {\n return paramRe.test(segment);\n};\n\nvar isSplat = function isSplat(segment) {\n return segment && segment[0] === \"*\";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n score += SEGMENT_POINTS;\n if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n return score;\n }, 0);\n return {\n route: route,\n score: score,\n index: index\n };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n return routes.map(rankRoute).sort(function (a, b) {\n return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n });\n};\n\nvar segmentize = function segmentize(uri) {\n return uri // strip starting/ending slashes\n .replace(/(^\\/+|\\/+$)/g, \"\").split(\"/\");\n};\n\nvar addQuery = function addQuery(pathname) {\n for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n query[_key - 1] = arguments[_key];\n }\n\n query = query.filter(function (q) {\n return q && q.length > 0;\n });\n return pathname + (query && query.length > 0 ? \"?\" + query.join(\"&\") : \"\");\n};\n\nvar reservedNames = [\"uri\", \"path\"];\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\n\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n var obj1Keys = Object.keys(obj1);\n return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n\n\nexports.startsWith = startsWith;\nexports.pick = pick;\nexports.match = match;\nexports.resolve = resolve;\nexports.insertParams = insertParams;\nexports.validateRedirect = validateRedirect;\nexports.shallowCompare = shallowCompare;","/*!\n * \n * Mon Sep 06 2021 22:45:41 GMT-0500 (Central Daylight Time)\n * Accessible NProgress, (c) 2021 Nicholas Mackey - http://nmackey.com/accessible-nprogress\n * @license MIT\n *\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n if (typeof exports === 'object' && typeof module === 'object') module.exports = factory();else if (typeof define === 'function' && define.amd) define(\"NProgress\", [], factory);else if (typeof exports === 'object') exports[\"NProgress\"] = factory();else root[\"NProgress\"] = factory();\n})(self, function () {\n return (\n /******/\n function () {\n // webpackBootstrap\n\n /******/\n \"use strict\";\n /******/\n\n var __webpack_modules__ = {\n /***/\n \"./src/util.js\":\n /*!*********************!*\\\n !*** ./src/util.js ***!\n \\*********************/\n\n /***/\n function srcUtilJs(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n __webpack_require__.r(__webpack_exports__);\n /* harmony export */\n\n\n __webpack_require__.d(__webpack_exports__, {\n /* harmony export */\n \"assign\": function assign() {\n return (\n /* binding */\n _assign\n );\n },\n\n /* harmony export */\n \"clamp\": function clamp() {\n return (\n /* binding */\n _clamp\n );\n },\n\n /* harmony export */\n \"toBarPerc\": function toBarPerc() {\n return (\n /* binding */\n _toBarPerc\n );\n },\n\n /* harmony export */\n \"randomInc\": function randomInc() {\n return (\n /* binding */\n _randomInc\n );\n },\n\n /* harmony export */\n \"removeElement\": function removeElement() {\n return (\n /* binding */\n _removeElement\n );\n },\n\n /* harmony export */\n \"queue\": function queue() {\n return (\n /* binding */\n _queue\n );\n }\n /* harmony export */\n\n });\n /**\n * Substitute for Object.assign()\n * Modified from: https://stackoverflow.com/a/30498430\n *\n * @param {object} target - target object to merge to\n * @param {...object} objectsToMerge - arbitrary number of objects to merge into 'target'\n * @return {object} target merged object\n */\n\n\n function _assign(target) {\n var retTarget = Object(target);\n\n for (var i = 0; i < (arguments.length <= 1 ? 0 : arguments.length - 1); i += 1) {\n var obj = i + 1 < 1 || arguments.length <= i + 1 ? undefined : arguments[i + 1];\n var keys = Object.keys(obj);\n\n for (var j = 0; j < keys.length; j += 1) {\n retTarget[keys[j]] = obj[keys[j]];\n }\n }\n\n return retTarget;\n }\n /**\n * Ensure n is between min & max\n *\n * @param {number} value - number to clamp\n * @param {number} min - minimum\n * @param {number} max - maximum\n * @return {number} clampped value\n */\n\n\n function _clamp(value, min, max) {\n if (value < min) return min;\n if (value > max) return max;\n return value;\n }\n /**\n * Converts a percentage (`0..1`) to a bar translateX\n * percentage (`-100%..0%`).\n *\n * @param {number} value - percentage to convert\n * @return {number} percentage\n */\n\n\n function _toBarPerc(value) {\n return (-1 + value) * 100;\n }\n /**\n * Gets an increment to use based on status\n *\n * @param {number} status - current status of the progress bar\n * @return {number} increment\n */\n\n\n function _randomInc(status) {\n if (status >= 0 && status < 0.2) {\n return 0.1;\n }\n\n if (status >= 0.2 && status < 0.5) {\n return 0.04;\n }\n\n if (status >= 0.5 && status < 0.8) {\n return 0.02;\n }\n\n if (status >= 0.8 && status < 0.99) {\n return 0.005;\n }\n\n return 0;\n }\n /**\n * Removes an element from the DOM.\n *\n * @param {HTMLElement} element - element to remove\n */\n\n\n function _removeElement(element) {\n if (element && element.parentNode) {\n element.parentNode.removeChild(element);\n }\n }\n /**\n * Queues a function to be executed.\n *\n * @return {function}\n */\n\n\n var _queue = function () {\n var functionQueue = [];\n\n function next() {\n var fn = functionQueue.shift();\n\n if (fn) {\n fn(next);\n }\n }\n\n return function (fn) {\n functionQueue.push(fn);\n\n if (functionQueue.length === 1) {\n next();\n }\n };\n }();\n /***/\n\n },\n\n /***/\n \"./src/styles.css\":\n /*!************************!*\\\n !*** ./src/styles.css ***!\n \\************************/\n\n /***/\n function srcStylesCss(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n __webpack_require__.r(__webpack_exports__); // extracted by mini-css-extract-plugin\n\n /***/\n\n }\n /******/\n\n };\n /************************************************************************/\n\n /******/\n // The module cache\n\n /******/\n\n var __webpack_module_cache__ = {};\n /******/\n\n /******/\n // The require function\n\n /******/\n\n function __webpack_require__(moduleId) {\n /******/\n // Check if module is in cache\n\n /******/\n var cachedModule = __webpack_module_cache__[moduleId];\n /******/\n\n if (cachedModule !== undefined) {\n /******/\n return cachedModule.exports;\n /******/\n }\n /******/\n // Create a new module (and put it into the cache)\n\n /******/\n\n\n var module = __webpack_module_cache__[moduleId] = {\n /******/\n // no module.id needed\n\n /******/\n // no module.loaded needed\n\n /******/\n exports: {}\n /******/\n\n };\n /******/\n\n /******/\n // Execute the module function\n\n /******/\n\n __webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n /******/\n\n /******/\n // Return the exports of the module\n\n /******/\n\n\n return module.exports;\n /******/\n }\n /******/\n\n /************************************************************************/\n\n /******/\n\n /* webpack/runtime/define property getters */\n\n /******/\n\n\n !function () {\n /******/\n // define getter functions for harmony exports\n\n /******/\n __webpack_require__.d = function (exports, definition) {\n /******/\n for (var key in definition) {\n /******/\n if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n /******/\n Object.defineProperty(exports, key, {\n enumerable: true,\n get: definition[key]\n });\n /******/\n }\n /******/\n\n }\n /******/\n\n };\n /******/\n\n }();\n /******/\n\n /******/\n\n /* webpack/runtime/hasOwnProperty shorthand */\n\n /******/\n\n !function () {\n /******/\n __webpack_require__.o = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n /******/\n\n }();\n /******/\n\n /******/\n\n /* webpack/runtime/make namespace object */\n\n /******/\n\n !function () {\n /******/\n // define __esModule on exports\n\n /******/\n __webpack_require__.r = function (exports) {\n /******/\n if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n /******/\n Object.defineProperty(exports, Symbol.toStringTag, {\n value: 'Module'\n });\n /******/\n }\n /******/\n\n\n Object.defineProperty(exports, '__esModule', {\n value: true\n });\n /******/\n };\n /******/\n\n }();\n /******/\n\n /************************************************************************/\n\n var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n\n !function () {\n /*!**********************!*\\\n !*** ./src/index.js ***!\n \\**********************/\n __webpack_require__.r(__webpack_exports__);\n /* harmony import */\n\n\n var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\n /*! ./util */\n \"./src/util.js\");\n /* harmony import */\n\n\n var _styles_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\n /*! ./styles.css */\n \"./src/styles.css\");\n\n var DEFAULTS = {\n minimum: 0.08,\n easing: 'linear',\n speed: 200,\n trickle: true,\n trickleSpeed: 200,\n showSpinner: true,\n barSelector: 'div.bar',\n barLabel: 'processing request',\n spinnerSelector: 'div.spinner',\n spinnerLabel: 'processing request',\n parent: 'body',\n template: \"\\n

\\n
\\n
\\n
\\n
\\n
\\n \"\n };\n\n var NProgress = function NProgress() {\n var localSettings = DEFAULTS;\n var localStatus = null;\n var initialPromises = 0;\n var currentPromises = 0;\n /**\n * @return {boolean} If the progress bar is rendered.\n */\n\n function isRendered() {\n return !!document.getElementById('nprogress');\n }\n /**\n * @return {boolean} If there is curent progress.\n */\n\n\n function isStarted() {\n return typeof localStatus === 'number';\n }\n /**\n * Renders the progress bar markup based on the `template` setting.\n *\n * @return {HTMLElement} The element rendered.\n */\n\n\n function render() {\n if (isRendered()) {\n return document.getElementById('nprogress');\n }\n\n document.documentElement.classList.add('nprogress-busy');\n var progress = document.createElement('div');\n progress.id = 'nprogress';\n progress.innerHTML = localSettings.template;\n var perc = isStarted() ? '-100' : (0, _util__WEBPACK_IMPORTED_MODULE_0__.toBarPerc)(localStatus || 0);\n var bar = progress.querySelector(localSettings.barSelector);\n bar.setAttribute('aria-label', localSettings.barLabel);\n bar.style.transform = \"translate3d(\".concat(perc, \"%,0,0)\");\n bar.style.transition = 'all 0 linear';\n var spinner = progress.querySelector(localSettings.spinnerSelector);\n\n if (spinner) {\n if (!localSettings.showSpinner) {\n (0, _util__WEBPACK_IMPORTED_MODULE_0__.removeElement)(spinner);\n } else {\n spinner.setAttribute('aria-label', localSettings.spinnerLabel);\n }\n }\n\n var parent = document.querySelector(localSettings.parent);\n\n if (parent) {\n if (parent !== document.body) {\n parent.classList.add('nprogress-custom-parent');\n }\n\n parent.appendChild(progress);\n }\n\n return progress;\n }\n\n return {\n /**\n * Updates configuration.\n *\n * @param {object} options - options to override/set\n * @return {object} The NProgress object.\n */\n configure: function configure(options) {\n (0, _util__WEBPACK_IMPORTED_MODULE_0__.assign)(localSettings, options);\n return this;\n },\n\n /**\n * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.\n *\n * @param {number} value - progress to set\n * @return {object} The NProgress object.\n */\n set: function set(value) {\n var _this = this;\n\n var clamppedValue = (0, _util__WEBPACK_IMPORTED_MODULE_0__.clamp)(value, localSettings.minimum, 1);\n localStatus = clamppedValue === 1 ? null : clamppedValue;\n var progress = render(); // Repaint\n\n progress.offsetWidth; // eslint-disable-line no-unused-expressions\n\n (0, _util__WEBPACK_IMPORTED_MODULE_0__.queue)(function (next) {\n // Add transition\n var speed = localSettings.speed,\n easing = localSettings.easing;\n var bar = progress.querySelector(localSettings.barSelector);\n bar.setAttribute('aria-valuenow', clamppedValue);\n bar.style.transform = \"translate3d(\".concat((0, _util__WEBPACK_IMPORTED_MODULE_0__.toBarPerc)(clamppedValue), \"%,0,0)\");\n bar.style.transition = \"all \".concat(speed, \"ms \").concat(easing);\n\n if (clamppedValue === 1) {\n // Fade out\n progress.style.transition = 'none';\n progress.style.opacity = 1; // Repaint\n\n progress.offsetWidth; // eslint-disable-line no-unused-expressions\n\n setTimeout(function () {\n progress.style.transition = \"all \".concat(speed, \"ms linear\");\n progress.style.opacity = 0;\n setTimeout(function () {\n _this.remove();\n\n next();\n }, speed);\n }, speed);\n } else {\n setTimeout(next, speed);\n }\n });\n return this;\n },\n\n /**\n * Shows the progress bar.\n * This is the same as setting the status to 0%, except that it doesn't go backwards.\n *\n * @return {object} The NProgress object.\n */\n start: function start() {\n var _this2 = this;\n\n if (!localStatus) {\n this.set(0);\n }\n\n var work = function work() {\n setTimeout(function () {\n if (!localStatus) {\n return;\n }\n\n _this2.inc();\n\n work();\n }, localSettings.trickleSpeed);\n };\n\n if (localSettings.trickle) {\n work();\n }\n\n return this;\n },\n\n /**\n * Hides the progress bar.\n * This is the *sort of* the same as setting the status to 100%, with the\n * difference being `done()` makes some placebo effect of some realistic motion.\n *\n * @param {boolean} force - show the progress bar complete even if its hidden\n * @return {object} The NProgress object.\n */\n done: function done(force) {\n if (!force && !localStatus) {\n return this;\n }\n\n var halfRandom = 0.5 * Math.random();\n return this.inc(0.3 + halfRandom).set(1);\n },\n\n /**\n * Increments progress bar by given amount.\n *\n * @param {number} [amount] - amount to increment the progress bar by\n * @return {object} The NProgress object.\n */\n inc: function inc() {\n var amount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _util__WEBPACK_IMPORTED_MODULE_0__.randomInc)(localStatus);\n\n if (!localStatus) {\n return this.start();\n }\n\n var clamppedStatus = (0, _util__WEBPACK_IMPORTED_MODULE_0__.clamp)(localStatus + amount, 0, 0.994);\n return this.set(clamppedStatus);\n },\n\n /**\n * Removes the element. Opposite of render().\n */\n remove: function remove() {\n document.documentElement.classList.remove('nprogress-busy');\n document.querySelector(localSettings.parent).classList.remove('nprogress-custom-parent');\n var progress = document.getElementById('nprogress');\n\n if (progress) {\n (0, _util__WEBPACK_IMPORTED_MODULE_0__.removeElement)(progress);\n }\n },\n\n /**\n * Waits for all supplied promises and increases the progress as the promises resolve.\n *\n * @param $promise Promise\n * @return {object} The NProgress object.\n */\n promise: function promise($promise) {\n var _this3 = this;\n\n if (currentPromises === 0) {\n this.start();\n }\n\n initialPromises += 1;\n currentPromises += 1;\n\n var promiseResolution = function promiseResolution() {\n currentPromises -= 1;\n\n if (currentPromises === 0) {\n initialPromises = 0;\n\n _this3.done();\n } else {\n _this3.set((initialPromises - currentPromises) / initialPromises);\n }\n };\n\n $promise.then(promiseResolution).catch(promiseResolution);\n return this;\n },\n\n get status() {\n return localStatus;\n },\n\n get settings() {\n return localSettings;\n }\n\n };\n };\n /* harmony default export */\n\n\n __webpack_exports__[\"default\"] = NProgress();\n }();\n __webpack_exports__ = __webpack_exports__[\"default\"];\n /******/\n\n return __webpack_exports__;\n /******/\n }()\n );\n});","'use strict';\n\nvar matchOperatorsRe = /[|\\\\{}()[\\]^$+*?.]/g;\n\nmodule.exports = function (str) {\n if (typeof str !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n return str.replace(matchOperatorsRe, '\\\\$&');\n};","\"use strict\";\n\nexports.__esModule = true;\nexports.applyTrailingSlashOption = void 0; // TODO(v5): Remove legacy setting and default to \"always\"\n\nvar applyTrailingSlashOption = function applyTrailingSlashOption(input, option) {\n if (option === void 0) {\n option = \"legacy\";\n }\n\n var hasHtmlSuffix = input.endsWith(\".html\");\n if (input === \"/\") return input;\n\n if (hasHtmlSuffix) {\n option = \"never\";\n }\n\n if (option === \"always\") {\n return input.endsWith(\"/\") ? input : input + \"/\";\n }\n\n if (option === \"never\") {\n return input.endsWith(\"/\") ? input.slice(0, -1) : input;\n }\n\n return input;\n};\n\nexports.applyTrailingSlashOption = applyTrailingSlashOption;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.withPrefix = withPrefix;\nexports.withAssetPrefix = withAssetPrefix;\nexports.navigate = exports.default = void 0;\n\nvar _objectWithoutPropertiesLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutPropertiesLoose\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reachRouter = require(\"@gatsbyjs/reach-router\");\n\nvar _parsePath = require(\"./parse-path\");\n\nexports.parsePath = _parsePath.parsePath;\n\nvar _isLocalLink = require(\"./is-local-link\");\n\nvar _rewriteLinkPath = require(\"./rewrite-link-path\");\n\nvar _excluded = [\"to\", \"getProps\", \"onClick\", \"onMouseEnter\", \"activeClassName\", \"activeStyle\", \"innerRef\", \"partiallyActive\", \"state\", \"replace\", \"_location\"];\n\nfunction withPrefix(path, prefix) {\n var _ref, _prefix;\n\n if (prefix === void 0) {\n prefix = getGlobalBasePrefix();\n }\n\n if (!(0, _isLocalLink.isLocalLink)(path)) {\n return path;\n }\n\n if (path.startsWith(\"./\") || path.startsWith(\"../\")) {\n return path;\n }\n\n var base = (_ref = (_prefix = prefix) !== null && _prefix !== void 0 ? _prefix : getGlobalPathPrefix()) !== null && _ref !== void 0 ? _ref : \"/\";\n return \"\" + (base !== null && base !== void 0 && base.endsWith(\"/\") ? base.slice(0, -1) : base) + (path.startsWith(\"/\") ? path : \"/\" + path);\n} // These global values are wrapped in typeof clauses to ensure the values exist.\n// This is especially problematic in unit testing of this component.\n\n\nvar getGlobalPathPrefix = function getGlobalPathPrefix() {\n return process.env.NODE_ENV !== \"production\" ? typeof __PATH_PREFIX__ !== \"undefined\" ? __PATH_PREFIX__ : undefined : __PATH_PREFIX__;\n};\n\nvar getGlobalBasePrefix = function getGlobalBasePrefix() {\n return process.env.NODE_ENV !== \"production\" ? typeof __BASE_PATH__ !== \"undefined\" ? __BASE_PATH__ : undefined : __BASE_PATH__;\n};\n\nfunction withAssetPrefix(path) {\n return withPrefix(path, getGlobalPathPrefix());\n}\n\nvar NavLinkPropTypes = {\n activeClassName: _propTypes.default.string,\n activeStyle: _propTypes.default.object,\n partiallyActive: _propTypes.default.bool\n}; // Set up IntersectionObserver\n\nvar createIntersectionObserver = function createIntersectionObserver(el, cb) {\n var io = new window.IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (el === entry.target) {\n // Check if element is within viewport, remove listener, destroy observer, and run link callback.\n // MSEdge doesn't currently support isIntersecting, so also test for an intersectionRatio > 0\n cb(entry.isIntersecting || entry.intersectionRatio > 0);\n }\n });\n }); // Add element to the observer\n\n io.observe(el);\n return {\n instance: io,\n el: el\n };\n};\n\nfunction GatsbyLinkLocationWrapper(props) {\n return /*#__PURE__*/_react.default.createElement(_reachRouter.Location, null, function (_ref2) {\n var location = _ref2.location;\n return /*#__PURE__*/_react.default.createElement(GatsbyLink, (0, _extends2.default)({}, props, {\n _location: location\n }));\n });\n}\n\nvar GatsbyLink = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(GatsbyLink, _React$Component);\n\n function GatsbyLink(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this; // Default to no support for IntersectionObserver\n\n _this.defaultGetProps = function (_ref3) {\n var isPartiallyCurrent = _ref3.isPartiallyCurrent,\n isCurrent = _ref3.isCurrent;\n\n if (_this.props.partiallyActive ? isPartiallyCurrent : isCurrent) {\n return {\n className: [_this.props.className, _this.props.activeClassName].filter(Boolean).join(\" \"),\n style: (0, _extends2.default)({}, _this.props.style, _this.props.activeStyle)\n };\n }\n\n return null;\n };\n\n var IOSupported = false;\n\n if (typeof window !== \"undefined\" && window.IntersectionObserver) {\n IOSupported = true;\n }\n\n _this.state = {\n IOSupported: IOSupported\n };\n _this.abortPrefetch = null;\n _this.handleRef = _this.handleRef.bind((0, _assertThisInitialized2.default)(_this));\n return _this;\n }\n\n var _proto = GatsbyLink.prototype;\n\n _proto._prefetch = function _prefetch() {\n var currentPath = window.location.pathname + window.location.search; // reach router should have the correct state\n\n if (this.props._location && this.props._location.pathname) {\n currentPath = this.props._location.pathname + this.props._location.search;\n }\n\n var rewrittenPath = (0, _rewriteLinkPath.rewriteLinkPath)(this.props.to, currentPath);\n var parsed = (0, _parsePath.parsePath)(rewrittenPath);\n var newPathName = parsed.pathname + parsed.search; // Prefetch is used to speed up next navigations. When you use it on the current navigation,\n // there could be a race-condition where Chrome uses the stale data instead of waiting for the network to complete\n\n if (currentPath !== newPathName) {\n return ___loader.enqueue(newPathName);\n }\n\n return undefined;\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (!this.io) {\n return;\n }\n\n var _this$io = this.io,\n instance = _this$io.instance,\n el = _this$io.el;\n\n if (this.abortPrefetch) {\n this.abortPrefetch.abort();\n }\n\n instance.unobserve(el);\n instance.disconnect();\n };\n\n _proto.handleRef = function handleRef(ref) {\n var _this2 = this;\n\n if (this.props.innerRef && Object.prototype.hasOwnProperty.call(this.props.innerRef, \"current\")) {\n this.props.innerRef.current = ref;\n } else if (this.props.innerRef) {\n this.props.innerRef(ref);\n }\n\n if (this.state.IOSupported && ref) {\n // If IO supported and element reference found, setup Observer functionality\n this.io = createIntersectionObserver(ref, function (inViewPort) {\n if (inViewPort) {\n _this2.abortPrefetch = _this2._prefetch();\n } else {\n if (_this2.abortPrefetch) {\n _this2.abortPrefetch.abort();\n }\n }\n });\n }\n };\n\n _proto.render = function render() {\n var _this3 = this;\n\n var _this$props = this.props,\n to = _this$props.to,\n _this$props$getProps = _this$props.getProps,\n getProps = _this$props$getProps === void 0 ? this.defaultGetProps : _this$props$getProps,\n _onClick = _this$props.onClick,\n _onMouseEnter = _this$props.onMouseEnter,\n $activeClassName = _this$props.activeClassName,\n $activeStyle = _this$props.activeStyle,\n $innerRef = _this$props.innerRef,\n partiallyActive = _this$props.partiallyActive,\n state = _this$props.state,\n replace = _this$props.replace,\n _location = _this$props._location,\n rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props, _excluded);\n\n if (process.env.NODE_ENV !== \"production\" && !(0, _isLocalLink.isLocalLink)(to)) {\n console.warn(\"External link \" + to + \" was detected in a Link component. Use the Link component only for internal links. See: https://gatsby.dev/internal-links\");\n }\n\n var prefixedTo = (0, _rewriteLinkPath.rewriteLinkPath)(to, _location.pathname);\n\n if (!(0, _isLocalLink.isLocalLink)(prefixedTo)) {\n return /*#__PURE__*/_react.default.createElement(\"a\", (0, _extends2.default)({\n href: prefixedTo\n }, rest));\n }\n\n return /*#__PURE__*/_react.default.createElement(_reachRouter.Link, (0, _extends2.default)({\n to: prefixedTo,\n state: state,\n getProps: getProps,\n innerRef: this.handleRef,\n onMouseEnter: function onMouseEnter(e) {\n if (_onMouseEnter) {\n _onMouseEnter(e);\n }\n\n var parsed = (0, _parsePath.parsePath)(prefixedTo);\n\n ___loader.hovering(parsed.pathname + parsed.search);\n },\n onClick: function onClick(e) {\n if (_onClick) {\n _onClick(e);\n }\n\n if (e.button === 0 && // ignore right clicks\n !_this3.props.target && // let browser handle \"target=_blank\"\n !e.defaultPrevented && // onClick prevented default\n !e.metaKey && // ignore clicks with modifier keys...\n !e.altKey && !e.ctrlKey && !e.shiftKey) {\n e.preventDefault();\n var shouldReplace = replace;\n\n var isCurrent = encodeURI(prefixedTo) === _location.pathname;\n\n if (typeof replace !== \"boolean\" && isCurrent) {\n shouldReplace = true;\n } // Make sure the necessary scripts and data are\n // loaded before continuing.\n\n\n window.___navigate(prefixedTo, {\n state: state,\n replace: shouldReplace\n });\n }\n\n return true;\n }\n }, rest));\n };\n\n return GatsbyLink;\n}(_react.default.Component);\n\nGatsbyLink.propTypes = (0, _extends2.default)({}, NavLinkPropTypes, {\n onClick: _propTypes.default.func,\n to: _propTypes.default.string.isRequired,\n replace: _propTypes.default.bool,\n state: _propTypes.default.object\n});\n\nvar _default = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n return /*#__PURE__*/_react.default.createElement(GatsbyLinkLocationWrapper, (0, _extends2.default)({\n innerRef: ref\n }, props));\n});\n\nexports.default = _default;\n\nvar navigate = function navigate(to, options) {\n window.___navigate((0, _rewriteLinkPath.rewriteLinkPath)(to, window.location.pathname), options);\n};\n\nexports.navigate = navigate;","\"use strict\";\n\nexports.__esModule = true;\nexports.isLocalLink = void 0;\n// Copied from https://github.com/sindresorhus/is-absolute-url/blob/3ab19cc2e599a03ea691bcb8a4c09fa3ebb5da4f/index.js\nvar ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\\d+\\-.]*?:/;\n\nvar isAbsolute = function isAbsolute(path) {\n return ABSOLUTE_URL_REGEX.test(path);\n};\n\nvar isLocalLink = function isLocalLink(path) {\n if (typeof path !== \"string\") {\n return undefined; // TODO(v5): Re-Add TypeError\n // throw new TypeError(`Expected a \\`string\\`, got \\`${typeof path}\\``)\n }\n\n return !isAbsolute(path);\n};\n\nexports.isLocalLink = isLocalLink;","\"use strict\";\n\nexports.__esModule = true;\nexports.parsePath = parsePath;\n\nfunction parsePath(path) {\n var pathname = path || \"/\";\n var search = \"\";\n var hash = \"\";\n var hashIndex = pathname.indexOf(\"#\");\n\n if (hashIndex !== -1) {\n hash = pathname.slice(hashIndex);\n pathname = pathname.slice(0, hashIndex);\n }\n\n var searchIndex = pathname.indexOf(\"?\");\n\n if (searchIndex !== -1) {\n search = pathname.slice(searchIndex);\n pathname = pathname.slice(0, searchIndex);\n }\n\n return {\n pathname: pathname,\n search: search === \"?\" ? \"\" : search,\n hash: hash === \"#\" ? \"\" : hash\n };\n}","\"use strict\";\n\nexports.__esModule = true;\nexports.rewriteLinkPath = void 0;\n\nvar _utils = require(\"@gatsbyjs/reach-router/lib/utils\");\n\nvar _applyTrailingSlashOption = require(\"gatsby-page-utils/apply-trailing-slash-option\");\n\nvar _parsePath2 = require(\"./parse-path\");\n\nvar _isLocalLink = require(\"./is-local-link\");\n\nvar _ = require(\".\");\n\n// Specific import to treeshake Node.js stuff\nvar isAbsolutePath = function isAbsolutePath(path) {\n return path === null || path === void 0 ? void 0 : path.startsWith(\"/\");\n};\n\nvar getGlobalTrailingSlash = function getGlobalTrailingSlash() {\n return typeof __TRAILING_SLASH__ !== \"undefined\" ? __TRAILING_SLASH__ : undefined;\n};\n\nfunction absolutify(path, current) {\n // If it's already absolute, return as-is\n if (isAbsolutePath(path)) {\n return path;\n }\n\n return (0, _utils.resolve)(path, current);\n}\n\nvar rewriteLinkPath = function rewriteLinkPath(path, relativeTo) {\n if (typeof path === \"number\") {\n return path;\n }\n\n if (!(0, _isLocalLink.isLocalLink)(path)) {\n return path;\n }\n\n var _parsePath = (0, _parsePath2.parsePath)(path),\n pathname = _parsePath.pathname,\n search = _parsePath.search,\n hash = _parsePath.hash;\n\n var option = getGlobalTrailingSlash();\n var adjustedPath = path;\n\n if (option === \"always\" || option === \"never\") {\n var output = (0, _applyTrailingSlashOption.applyTrailingSlashOption)(pathname, option);\n adjustedPath = \"\" + output + search + hash;\n }\n\n return isAbsolutePath(adjustedPath) ? (0, _.withPrefix)(adjustedPath) : absolutify(adjustedPath, relativeTo);\n};\n\nexports.rewriteLinkPath = rewriteLinkPath;","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = exports.ScrollContext = void 0;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nexports.ScrollContext = _scrollHandler.ScrollHandler;\n\nvar _useScrollRestoration = require(\"./use-scroll-restoration\");\n\nexports.useScrollRestoration = _useScrollRestoration.useScrollRestoration;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.ScrollHandler = exports.ScrollContext = void 0;\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _sessionStorage = require(\"./session-storage\");\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar ScrollContext = /*#__PURE__*/React.createContext(new _sessionStorage.SessionStorage());\nexports.ScrollContext = ScrollContext;\nScrollContext.displayName = \"GatsbyScrollContext\";\n\nvar ScrollHandler = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(ScrollHandler, _React$Component);\n\n function ScrollHandler() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this._stateStorage = new _sessionStorage.SessionStorage();\n _this._isTicking = false;\n _this._latestKnownScrollY = 0;\n\n _this.scrollListener = function () {\n _this._latestKnownScrollY = window.scrollY;\n\n if (!_this._isTicking) {\n _this._isTicking = true;\n requestAnimationFrame(_this._saveScroll.bind((0, _assertThisInitialized2.default)(_this)));\n }\n };\n\n _this.windowScroll = function (position, prevProps) {\n if (_this.shouldUpdateScroll(prevProps, _this.props)) {\n window.scrollTo(0, position);\n }\n };\n\n _this.scrollToHash = function (hash, prevProps) {\n var node = document.getElementById(hash.substring(1));\n\n if (node && _this.shouldUpdateScroll(prevProps, _this.props)) {\n node.scrollIntoView();\n }\n };\n\n _this.shouldUpdateScroll = function (prevRouterProps, routerProps) {\n var shouldUpdateScroll = _this.props.shouldUpdateScroll;\n\n if (!shouldUpdateScroll) {\n return true;\n } // Hack to allow accessing this._stateStorage.\n\n\n return shouldUpdateScroll.call((0, _assertThisInitialized2.default)(_this), prevRouterProps, routerProps);\n };\n\n return _this;\n }\n\n var _proto = ScrollHandler.prototype;\n\n _proto._saveScroll = function _saveScroll() {\n var key = this.props.location.key || null;\n\n if (key) {\n this._stateStorage.save(this.props.location, key, this._latestKnownScrollY);\n }\n\n this._isTicking = false;\n };\n\n _proto.componentDidMount = function componentDidMount() {\n window.addEventListener(\"scroll\", this.scrollListener);\n var scrollPosition;\n var _this$props$location = this.props.location,\n key = _this$props$location.key,\n hash = _this$props$location.hash;\n\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n\n if (scrollPosition) {\n this.windowScroll(scrollPosition, undefined);\n } else if (hash) {\n this.scrollToHash(decodeURI(hash), undefined);\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n window.removeEventListener(\"scroll\", this.scrollListener);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var _this$props$location2 = this.props.location,\n hash = _this$props$location2.hash,\n key = _this$props$location2.key;\n var scrollPosition;\n\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n /** There are two pieces of state: the browser url and\n * history state which keeps track of scroll position\n * Native behaviour prescribes that we ought to restore scroll position\n * when a user navigates back in their browser (this is the `POP` action)\n * Currently, reach router has a bug that prevents this at https://github.com/reach/router/issues/228\n * So we _always_ stick to the url as a source of truth — if the url\n * contains a hash, we scroll to it\n */\n\n\n if (hash) {\n this.scrollToHash(decodeURI(hash), prevProps);\n } else {\n this.windowScroll(scrollPosition, prevProps);\n }\n };\n\n _proto.render = function render() {\n return /*#__PURE__*/React.createElement(ScrollContext.Provider, {\n value: this._stateStorage\n }, this.props.children);\n };\n\n return ScrollHandler;\n}(React.Component);\n\nexports.ScrollHandler = ScrollHandler;\nScrollHandler.propTypes = {\n shouldUpdateScroll: _propTypes.default.func,\n children: _propTypes.default.element.isRequired,\n location: _propTypes.default.object.isRequired\n};","\"use strict\";\n\nexports.__esModule = true;\nexports.SessionStorage = void 0;\nvar STATE_KEY_PREFIX = \"@@scroll|\";\nvar GATSBY_ROUTER_SCROLL_STATE = \"___GATSBY_REACT_ROUTER_SCROLL\";\n\nvar SessionStorage = /*#__PURE__*/function () {\n function SessionStorage() {}\n\n var _proto = SessionStorage.prototype;\n\n _proto.read = function read(location, key) {\n var stateKey = this.getStateKey(location, key);\n\n try {\n var value = window.sessionStorage.getItem(stateKey);\n return value ? JSON.parse(value) : 0;\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[gatsby-react-router-scroll] Unable to access sessionStorage; sessionStorage is not available.\");\n }\n\n if (window && window[GATSBY_ROUTER_SCROLL_STATE] && window[GATSBY_ROUTER_SCROLL_STATE][stateKey]) {\n return window[GATSBY_ROUTER_SCROLL_STATE][stateKey];\n }\n\n return 0;\n }\n };\n\n _proto.save = function save(location, key, value) {\n var stateKey = this.getStateKey(location, key);\n var storedValue = JSON.stringify(value);\n\n try {\n window.sessionStorage.setItem(stateKey, storedValue);\n } catch (e) {\n if (window && window[GATSBY_ROUTER_SCROLL_STATE]) {\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n } else {\n window[GATSBY_ROUTER_SCROLL_STATE] = {};\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[gatsby-react-router-scroll] Unable to save state in sessionStorage; sessionStorage is not available.\");\n }\n }\n };\n\n _proto.getStateKey = function getStateKey(location, key) {\n var stateKeyBase = \"\" + STATE_KEY_PREFIX + location.pathname;\n return key === null || typeof key === \"undefined\" ? stateKeyBase : stateKeyBase + \"|\" + key;\n };\n\n return SessionStorage;\n}();\n\nexports.SessionStorage = SessionStorage;","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = useScrollRestoration;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nvar _react = require(\"react\");\n\nvar _reachRouter = require(\"@gatsbyjs/reach-router\");\n\nfunction useScrollRestoration(identifier) {\n var location = (0, _reachRouter.useLocation)();\n var state = (0, _react.useContext)(_scrollHandler.ScrollContext);\n var ref = (0, _react.useRef)(null);\n (0, _react.useLayoutEffect)(function () {\n if (ref.current) {\n var position = state.read(location, identifier);\n ref.current.scrollTo(0, position || 0);\n }\n }, [location.key]);\n return {\n ref: ref,\n onScroll: function onScroll() {\n if (ref.current) {\n state.save(location, identifier, ref.current.scrollTop);\n }\n }\n };\n}","exports.components = {\n \"component---cache-caches-gatsby-plugin-offline-app-shell-js\": () => import(\"./../../caches/gatsby-plugin-offline/app-shell.js\" /* webpackChunkName: \"component---cache-caches-gatsby-plugin-offline-app-shell-js\" */),\n \"component---src-pages-404-tsx\": () => import(\"./../../../src/pages/404.tsx\" /* webpackChunkName: \"component---src-pages-404-tsx\" */),\n \"component---src-templates-about-tsx\": () => import(\"./../../../src/templates/About.tsx\" /* webpackChunkName: \"component---src-templates-about-tsx\" */),\n \"component---src-templates-books-tsx\": () => import(\"./../../../src/templates/Books.tsx\" /* webpackChunkName: \"component---src-templates-books-tsx\" */),\n \"component---src-templates-home-tsx\": () => import(\"./../../../src/templates/Home.tsx\" /* webpackChunkName: \"component---src-templates-home-tsx\" */),\n \"component---src-templates-post-tsx\": () => import(\"./../../../src/templates/Post.tsx\" /* webpackChunkName: \"component---src-templates-post-tsx\" */),\n \"component---src-templates-posts-tsx\": () => import(\"./../../../src/templates/Posts.tsx\" /* webpackChunkName: \"component---src-templates-posts-tsx\" */),\n \"component---src-templates-tags-tsx\": () => import(\"./../../../src/templates/Tags.tsx\" /* webpackChunkName: \"component---src-templates-tags-tsx\" */)\n}\n\n","module.exports = [{\n plugin: require('../node_modules/gatsby-remark-autolink-headers/gatsby-browser.js'),\n options: {\"plugins\":[],\"offsetY\":0,\"className\":\"anchor\"},\n },{\n plugin: require('../node_modules/gatsby-plugin-manifest/gatsby-browser.js'),\n options: {\"plugins\":[],\"name\":\"Sabertaz Blog\",\"short_name\":\"Blog\",\"start_url\":\"/\",\"theme_color\":\"#1890ff\",\"background_color\":\"#f8f9fa\",\"display\":\"standalone\",\"icon\":\"src/images/favicon.ico\",\"include_favicon\":true,\"legacy\":true,\"theme_color_in_head\":true,\"cache_busting_mode\":\"query\",\"crossOrigin\":\"anonymous\",\"cacheDigest\":\"7bfa34b15e9a2e13cac05074d70bc6ed\"},\n },{\n plugin: require('../node_modules/gatsby-plugin-nprogress/gatsby-browser.js'),\n options: {\"plugins\":[],\"color\":\"#40a9ff\"},\n },{\n plugin: require('../node_modules/gatsby-plugin-offline/gatsby-browser.js'),\n options: {\"plugins\":[]},\n },{\n plugin: require('../node_modules/gatsby-plugin-catch-links/gatsby-browser.js'),\n options: {\"plugins\":[]},\n },{\n plugin: require('../gatsby-browser.js'),\n options: {\"plugins\":[]},\n }]\n","const plugins = require(`./api-runner-browser-plugins`)\nconst { getResourceURLsForPathname, loadPage, loadPageSync } =\n require(`./loader`).publicLoader\n\nexports.apiRunner = (api, args = {}, defaultReturn, argTransform) => {\n // Hooks for gatsby-cypress's API handler\n if (process.env.CYPRESS_SUPPORT) {\n if (window.___apiHandler) {\n window.___apiHandler(api)\n } else if (window.___resolvedAPIs) {\n window.___resolvedAPIs.push(api)\n } else {\n window.___resolvedAPIs = [api]\n }\n }\n\n let results = plugins.map(plugin => {\n if (!plugin.plugin[api]) {\n return undefined\n }\n\n args.getResourceURLsForPathname = getResourceURLsForPathname\n args.loadPage = loadPage\n args.loadPageSync = loadPageSync\n\n const result = plugin.plugin[api](args, plugin.options)\n if (result && argTransform) {\n args = argTransform({ args, result, plugin })\n }\n return result\n })\n\n // Filter out undefined results.\n results = results.filter(result => typeof result !== `undefined`)\n\n if (results.length > 0) {\n return results\n } else if (defaultReturn) {\n return [defaultReturn]\n } else {\n return []\n }\n}\n\nexports.apiRunnerAsync = (api, args, defaultReturn) =>\n plugins.reduce(\n (previous, next) =>\n next.plugin[api]\n ? previous.then(() => next.plugin[api](args, next.options))\n : previous,\n Promise.resolve()\n )\n","// \n// An event handler can take an optional event argument\n// and should not return a value\n \n \n\n// An array of all currently registered event handlers for a type\n \n \n// A map of event types and their corresponding event handlers.\n \n \n \n \n\n/** Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nfunction mitt(all ) {\n\tall = all || Object.create(null);\n\n\treturn {\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to listen for, or `\"*\"` for all events\n\t\t * @param {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton: function on(type , handler ) {\n\t\t\t(all[type] || (all[type] = [])).push(handler);\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to unregister `handler` from, or `\"*\"`\n\t\t * @param {Function} handler Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff: function off(type , handler ) {\n\t\t\tif (all[type]) {\n\t\t\t\tall[type].splice(all[type].indexOf(handler) >>> 0, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `\"*\"` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * @param {String} type The event type to invoke\n\t\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit: function emit(type , evt ) {\n\t\t\t(all[type] || []).slice().map(function (handler) { handler(evt); });\n\t\t\t(all['*'] || []).slice().map(function (handler) { handler(type, evt); });\n\t\t}\n\t};\n}\n\nexport default mitt;\n//# sourceMappingURL=mitt.es.js.map\n","import mitt from \"mitt\"\n\nconst emitter = mitt()\nexport default emitter\n","export default pathAndSearch => {\n if (pathAndSearch === undefined) {\n return pathAndSearch\n }\n let [path, search = ``] = pathAndSearch.split(`?`)\n if (search) {\n search = `?` + search\n }\n\n if (path === `/`) {\n return `/` + search\n }\n if (path.charAt(path.length - 1) === `/`) {\n return path.slice(0, -1) + search\n }\n return path + search\n}\n","import { pick } from \"@gatsbyjs/reach-router/lib/utils\"\nimport stripPrefix from \"./strip-prefix\"\nimport normalizePagePath from \"./normalize-page-path\"\nimport { maybeGetBrowserRedirect } from \"./redirect-utils.js\"\n\nconst pathCache = new Map()\nlet matchPaths = []\n\nconst trimPathname = rawPathname => {\n let newRawPathname = rawPathname\n const queryIndex = rawPathname.indexOf(`?`)\n\n if (queryIndex !== -1) {\n const [path, qs] = rawPathname.split(`?`)\n newRawPathname = `${path}?${encodeURIComponent(qs)}`\n }\n\n const pathname = decodeURIComponent(newRawPathname)\n\n // Remove the pathPrefix from the pathname.\n const trimmedPathname = stripPrefix(\n pathname,\n decodeURIComponent(__BASE_PATH__)\n )\n // Remove any hashfragment\n .split(`#`)[0]\n\n return trimmedPathname\n}\n\nfunction absolutify(path) {\n // If it's already absolute, return as-is\n if (\n path.startsWith(`/`) ||\n path.startsWith(`https://`) ||\n path.startsWith(`http://`)\n ) {\n return path\n }\n // Calculate path relative to current location, adding a trailing slash to\n // match behavior of @reach/router\n return new URL(\n path,\n window.location.href + (window.location.href.endsWith(`/`) ? `` : `/`)\n ).pathname\n}\n\n/**\n * Set list of matchPaths\n *\n * @param {Array<{path: string, matchPath: string}>} value collection of matchPaths\n */\nexport const setMatchPaths = value => {\n matchPaths = value\n}\n\n/**\n * Return a matchpath url\n * if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n * `/foo?bar=far` => `/page1`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string|null}\n */\nexport const findMatchPath = rawPathname => {\n const trimmedPathname = cleanPath(rawPathname)\n\n const pickPaths = matchPaths.map(({ path, matchPath }) => {\n return {\n path: matchPath,\n originalPath: path,\n }\n })\n\n const path = pick(pickPaths, trimmedPathname)\n\n if (path) {\n return normalizePagePath(path.route.originalPath)\n }\n\n return null\n}\n\n/**\n * Return a matchpath params from reach/router rules\n * if `match-paths.json` contains `{ \":bar/*foo\" }`, and the path is /baz/zaz/zoo\n * then it returns\n * { bar: baz, foo: zaz/zoo }\n *\n * @param {string} rawPathname A raw pathname\n * @return {object}\n */\nexport const grabMatchParams = rawPathname => {\n const trimmedPathname = cleanPath(rawPathname)\n\n const pickPaths = matchPaths.map(({ path, matchPath }) => {\n return {\n path: matchPath,\n originalPath: path,\n }\n })\n\n const path = pick(pickPaths, trimmedPathname)\n\n if (path) {\n return path.params\n }\n\n return {}\n}\n\n// Given a raw URL path, returns the cleaned version of it (trim off\n// `#` and query params), or if it matches an entry in\n// `match-paths.json`, its matched path is returned\n//\n// E.g. `/foo?bar=far` => `/foo`\n//\n// Or if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n// `/foo?bar=far` => `/page1`\nexport const findPath = rawPathname => {\n const trimmedPathname = trimPathname(absolutify(rawPathname))\n if (pathCache.has(trimmedPathname)) {\n return pathCache.get(trimmedPathname)\n }\n\n const redirect = maybeGetBrowserRedirect(rawPathname)\n if (redirect) {\n return findPath(redirect.toPath)\n }\n\n let foundPath = findMatchPath(trimmedPathname)\n\n if (!foundPath) {\n foundPath = cleanPath(rawPathname)\n }\n\n pathCache.set(trimmedPathname, foundPath)\n\n return foundPath\n}\n\n/**\n * Clean a url and converts /index.html => /\n * E.g. `/foo?bar=far` => `/foo`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string}\n */\nexport const cleanPath = rawPathname => {\n const trimmedPathname = trimPathname(absolutify(rawPathname))\n\n let foundPath = trimmedPathname\n if (foundPath === `/index.html`) {\n foundPath = `/`\n }\n\n foundPath = normalizePagePath(foundPath)\n\n return foundPath\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport Link, {\n withPrefix,\n withAssetPrefix,\n navigate,\n push,\n replace,\n navigateTo,\n parsePath,\n} from \"gatsby-link\"\nimport { useScrollRestoration } from \"gatsby-react-router-scroll\"\nimport PageRenderer from \"./public-page-renderer\"\nimport loader from \"./loader\"\n\nconst prefetchPathname = loader.enqueue\n\nconst StaticQueryContext = React.createContext({})\n\nfunction StaticQueryDataRenderer({ staticQueryData, data, query, render }) {\n const finalData = data\n ? data.data\n : staticQueryData[query] && staticQueryData[query].data\n\n return (\n \n {finalData && render(finalData)}\n {!finalData &&
Loading (StaticQuery)
}\n
\n )\n}\n\nconst StaticQuery = props => {\n const { data, query, render, children } = props\n\n return (\n \n {staticQueryData => (\n \n )}\n \n )\n}\n\nconst useStaticQuery = query => {\n if (\n typeof React.useContext !== `function` &&\n process.env.NODE_ENV === `development`\n ) {\n throw new Error(\n `You're likely using a version of React that doesn't support Hooks\\n` +\n `Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.`\n )\n }\n const context = React.useContext(StaticQueryContext)\n\n // query is a stringified number like `3303882` when wrapped with graphql, If a user forgets\n // to wrap the query in a grqphql, then casting it to a Number results in `NaN` allowing us to\n // catch the misuse of the API and give proper direction\n if (isNaN(Number(query))) {\n throw new Error(`useStaticQuery was called with a string but expects to be called using \\`graphql\\`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql\\`${query}\\`);\n`)\n }\n\n if (context[query]?.data) {\n return context[query].data\n } else {\n throw new Error(\n `The result of this StaticQuery could not be fetched.\\n\\n` +\n `This is likely a bug in Gatsby and if refreshing the page does not fix it, ` +\n `please open an issue in https://github.com/gatsbyjs/gatsby/issues`\n )\n }\n}\n\nStaticQuery.propTypes = {\n data: PropTypes.object,\n query: PropTypes.string.isRequired,\n render: PropTypes.func,\n children: PropTypes.func,\n}\n\nfunction graphql() {\n throw new Error(\n `It appears like Gatsby is misconfigured. Gatsby related \\`graphql\\` calls ` +\n `are supposed to only be evaluated at compile time, and then compiled away. ` +\n `Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n` +\n `Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.`\n )\n}\n\nexport {\n Link,\n withAssetPrefix,\n withPrefix,\n graphql,\n parsePath,\n navigate,\n useScrollRestoration,\n StaticQueryContext,\n StaticQuery,\n PageRenderer,\n useStaticQuery,\n prefetchPathname,\n}\n","const support = function (feature) {\n if (typeof document === `undefined`) {\n return false\n }\n const fakeLink = document.createElement(`link`)\n try {\n if (fakeLink.relList && typeof fakeLink.relList.supports === `function`) {\n return fakeLink.relList.supports(feature)\n }\n } catch (err) {\n return false\n }\n return false\n}\n\nconst linkPrefetchStrategy = function (url, options) {\n return new Promise((resolve, reject) => {\n if (typeof document === `undefined`) {\n reject()\n return\n }\n\n const link = document.createElement(`link`)\n link.setAttribute(`rel`, `prefetch`)\n link.setAttribute(`href`, url)\n\n Object.keys(options).forEach(key => {\n link.setAttribute(key, options[key])\n })\n\n link.onload = resolve\n link.onerror = reject\n\n const parentElement =\n document.getElementsByTagName(`head`)[0] ||\n document.getElementsByName(`script`)[0].parentNode\n parentElement.appendChild(link)\n })\n}\n\nconst xhrPrefetchStrategy = function (url) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest()\n req.open(`GET`, url, true)\n\n req.onload = () => {\n if (req.status === 200) {\n resolve()\n } else {\n reject()\n }\n }\n\n req.send(null)\n })\n}\n\nconst supportedPrefetchStrategy = support(`prefetch`)\n ? linkPrefetchStrategy\n : xhrPrefetchStrategy\n\nconst preFetched = {}\n\nconst prefetch = function (url, options) {\n return new Promise(resolve => {\n if (preFetched[url]) {\n resolve()\n return\n }\n\n supportedPrefetchStrategy(url, options)\n .then(() => {\n resolve()\n preFetched[url] = true\n })\n .catch(() => {}) // 404s are logged to the console anyway\n })\n}\n\nexport default prefetch\n","import prefetchHelper from \"./prefetch\"\nimport emitter from \"./emitter\"\nimport { setMatchPaths, findPath, findMatchPath } from \"./find-path\"\n\n/**\n * Available resource loading statuses\n */\nexport const PageResourceStatus = {\n /**\n * At least one of critical resources failed to load\n */\n Error: `error`,\n /**\n * Resources loaded successfully\n */\n Success: `success`,\n}\n\nconst preferDefault = m => (m && m.default) || m\n\nconst stripSurroundingSlashes = s => {\n s = s[0] === `/` ? s.slice(1) : s\n s = s.endsWith(`/`) ? s.slice(0, -1) : s\n return s\n}\n\nconst createPageDataUrl = rawPath => {\n const [path, maybeSearch] = rawPath.split(`?`)\n const fixedPath = path === `/` ? `index` : stripSurroundingSlashes(path)\n return `${__PATH_PREFIX__}/page-data/${fixedPath}/page-data.json${\n maybeSearch ? `?${maybeSearch}` : ``\n }`\n}\n\nfunction doFetch(url, method = `GET`) {\n return new Promise(resolve => {\n const req = new XMLHttpRequest()\n req.open(method, url, true)\n req.onreadystatechange = () => {\n if (req.readyState == 4) {\n resolve(req)\n }\n }\n req.send(null)\n })\n}\n\nconst doesConnectionSupportPrefetch = () => {\n if (\n `connection` in navigator &&\n typeof navigator.connection !== `undefined`\n ) {\n if ((navigator.connection.effectiveType || ``).includes(`2g`)) {\n return false\n }\n if (navigator.connection.saveData) {\n return false\n }\n }\n return true\n}\n\n// Regex that matches common search crawlers\nconst BOT_REGEX = /bot|crawler|spider|crawling/i\n\nconst toPageResources = (pageData, component = null) => {\n const page = {\n componentChunkName: pageData.componentChunkName,\n path: pageData.path,\n webpackCompilationHash: pageData.webpackCompilationHash,\n matchPath: pageData.matchPath,\n staticQueryHashes: pageData.staticQueryHashes,\n getServerDataError: pageData.getServerDataError,\n }\n\n return {\n component,\n json: pageData.result,\n page,\n }\n}\n\nexport class BaseLoader {\n constructor(loadComponent, matchPaths) {\n // Map of pagePath -> Page. Where Page is an object with: {\n // status: PageResourceStatus.Success || PageResourceStatus.Error,\n // payload: PageResources, // undefined if PageResourceStatus.Error\n // }\n // PageResources is {\n // component,\n // json: pageData.result,\n // page: {\n // componentChunkName,\n // path,\n // webpackCompilationHash,\n // staticQueryHashes\n // },\n // staticQueryResults\n // }\n this.pageDb = new Map()\n this.inFlightDb = new Map()\n this.staticQueryDb = {}\n this.pageDataDb = new Map()\n this.isPrefetchQueueRunning = false\n this.prefetchQueued = []\n this.prefetchTriggered = new Set()\n this.prefetchCompleted = new Set()\n this.loadComponent = loadComponent\n setMatchPaths(matchPaths)\n }\n\n inFlightNetworkRequests = new Map()\n\n memoizedGet(url) {\n let inFlightPromise = this.inFlightNetworkRequests.get(url)\n\n if (!inFlightPromise) {\n inFlightPromise = doFetch(url, `GET`)\n this.inFlightNetworkRequests.set(url, inFlightPromise)\n }\n\n // Prefer duplication with then + catch over .finally to prevent problems in ie11 + firefox\n return inFlightPromise\n .then(response => {\n this.inFlightNetworkRequests.delete(url)\n return response\n })\n .catch(err => {\n this.inFlightNetworkRequests.delete(url)\n throw err\n })\n }\n\n setApiRunner(apiRunner) {\n this.apiRunner = apiRunner\n this.prefetchDisabled = apiRunner(`disableCorePrefetching`).some(a => a)\n }\n\n fetchPageDataJson(loadObj) {\n const { pagePath, retries = 0 } = loadObj\n const url = createPageDataUrl(pagePath)\n return this.memoizedGet(url).then(req => {\n const { status, responseText } = req\n\n // Handle 200\n if (status === 200) {\n try {\n const jsonPayload = JSON.parse(responseText)\n if (jsonPayload.path === undefined) {\n throw new Error(`not a valid pageData response`)\n }\n\n const maybeSearch = pagePath.split(`?`)[1]\n if (maybeSearch && !jsonPayload.path.includes(maybeSearch)) {\n jsonPayload.path += `?${maybeSearch}`\n }\n\n return Object.assign(loadObj, {\n status: PageResourceStatus.Success,\n payload: jsonPayload,\n })\n } catch (err) {\n // continue regardless of error\n }\n }\n\n // Handle 404\n if (status === 404 || status === 200) {\n // If the request was for a 404/500 page and it doesn't exist, we're done\n if (pagePath === `/404.html` || pagePath === `/500.html`) {\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n }\n\n // Need some code here to cache the 404 request. In case\n // multiple loadPageDataJsons result in 404s\n return this.fetchPageDataJson(\n Object.assign(loadObj, { pagePath: `/404.html`, notFound: true })\n )\n }\n\n // handle 500 response (Unrecoverable)\n if (status === 500) {\n return this.fetchPageDataJson(\n Object.assign(loadObj, {\n pagePath: `/500.html`,\n internalServerError: true,\n })\n )\n }\n\n // Handle everything else, including status === 0, and 503s. Should retry\n if (retries < 3) {\n return this.fetchPageDataJson(\n Object.assign(loadObj, { retries: retries + 1 })\n )\n }\n\n // Retried 3 times already, result is an error.\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n })\n }\n\n loadPageDataJson(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.pageDataDb.has(pagePath)) {\n const pageData = this.pageDataDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !pageData.stale) {\n return Promise.resolve(pageData)\n }\n }\n\n return this.fetchPageDataJson({ pagePath }).then(pageData => {\n this.pageDataDb.set(pagePath, pageData)\n\n return pageData\n })\n }\n\n findMatchPath(rawPath) {\n return findMatchPath(rawPath)\n }\n\n // TODO check all uses of this and whether they use undefined for page resources not exist\n loadPage(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.pageDb.has(pagePath)) {\n const page = this.pageDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !page.payload.stale) {\n if (page.error) {\n return {\n error: page.error,\n status: page.status,\n }\n }\n\n return Promise.resolve(page.payload)\n }\n }\n\n if (this.inFlightDb.has(pagePath)) {\n return this.inFlightDb.get(pagePath)\n }\n\n const inFlightPromise = Promise.all([\n this.loadAppData(),\n this.loadPageDataJson(pagePath),\n ]).then(allData => {\n const result = allData[1]\n if (result.status === PageResourceStatus.Error) {\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n let pageData = result.payload\n const { componentChunkName, staticQueryHashes = [] } = pageData\n\n const finalResult = {}\n\n const componentChunkPromise = this.loadComponent(componentChunkName).then(\n component => {\n finalResult.createdAt = new Date()\n let pageResources\n if (!component || component instanceof Error) {\n finalResult.status = PageResourceStatus.Error\n finalResult.error = component\n } else {\n finalResult.status = PageResourceStatus.Success\n if (result.notFound === true) {\n finalResult.notFound = true\n }\n pageData = Object.assign(pageData, {\n webpackCompilationHash: allData[0]\n ? allData[0].webpackCompilationHash\n : ``,\n })\n pageResources = toPageResources(pageData, component)\n }\n // undefined if final result is an error\n return pageResources\n }\n )\n\n const staticQueryBatchPromise = Promise.all(\n staticQueryHashes.map(staticQueryHash => {\n // Check for cache in case this static query result has already been loaded\n if (this.staticQueryDb[staticQueryHash]) {\n const jsonPayload = this.staticQueryDb[staticQueryHash]\n return { staticQueryHash, jsonPayload }\n }\n\n return this.memoizedGet(\n `${__PATH_PREFIX__}/page-data/sq/d/${staticQueryHash}.json`\n )\n .then(req => {\n const jsonPayload = JSON.parse(req.responseText)\n return { staticQueryHash, jsonPayload }\n })\n .catch(() => {\n throw new Error(\n `We couldn't load \"${__PATH_PREFIX__}/page-data/sq/d/${staticQueryHash}.json\"`\n )\n })\n })\n ).then(staticQueryResults => {\n const staticQueryResultsMap = {}\n\n staticQueryResults.forEach(({ staticQueryHash, jsonPayload }) => {\n staticQueryResultsMap[staticQueryHash] = jsonPayload\n this.staticQueryDb[staticQueryHash] = jsonPayload\n })\n\n return staticQueryResultsMap\n })\n\n return (\n Promise.all([componentChunkPromise, staticQueryBatchPromise])\n .then(([pageResources, staticQueryResults]) => {\n let payload\n if (pageResources) {\n payload = { ...pageResources, staticQueryResults }\n finalResult.payload = payload\n emitter.emit(`onPostLoadPageResources`, {\n page: payload,\n pageResources: payload,\n })\n }\n\n this.pageDb.set(pagePath, finalResult)\n\n if (finalResult.error) {\n return {\n error: finalResult.error,\n status: finalResult.status,\n }\n }\n\n return payload\n })\n // when static-query fail to load we throw a better error\n .catch(err => {\n return {\n error: err,\n status: PageResourceStatus.Error,\n }\n })\n )\n })\n\n inFlightPromise\n .then(() => {\n this.inFlightDb.delete(pagePath)\n })\n .catch(error => {\n this.inFlightDb.delete(pagePath)\n throw error\n })\n\n this.inFlightDb.set(pagePath, inFlightPromise)\n\n return inFlightPromise\n }\n\n // returns undefined if the page does not exists in cache\n loadPageSync(rawPath, options = {}) {\n const pagePath = findPath(rawPath)\n if (this.pageDb.has(pagePath)) {\n const pageData = this.pageDb.get(pagePath)\n\n if (pageData.payload) {\n return pageData.payload\n }\n\n if (options?.withErrorDetails) {\n return {\n error: pageData.error,\n status: pageData.status,\n }\n }\n }\n return undefined\n }\n\n shouldPrefetch(pagePath) {\n // Skip prefetching if we know user is on slow or constrained connection\n if (!doesConnectionSupportPrefetch()) {\n return false\n }\n\n // Don't prefetch if this is a crawler bot\n if (navigator.userAgent && BOT_REGEX.test(navigator.userAgent)) {\n return false\n }\n\n // Check if the page exists.\n if (this.pageDb.has(pagePath)) {\n return false\n }\n\n return true\n }\n\n prefetch(pagePath) {\n if (!this.shouldPrefetch(pagePath)) {\n return {\n then: resolve => resolve(false),\n abort: () => {},\n }\n }\n if (this.prefetchTriggered.has(pagePath)) {\n return {\n then: resolve => resolve(true),\n abort: () => {},\n }\n }\n\n const defer = {\n resolve: null,\n reject: null,\n promise: null,\n }\n defer.promise = new Promise((resolve, reject) => {\n defer.resolve = resolve\n defer.reject = reject\n })\n this.prefetchQueued.push([pagePath, defer])\n const abortC = new AbortController()\n abortC.signal.addEventListener(`abort`, () => {\n const index = this.prefetchQueued.findIndex(([p]) => p === pagePath)\n // remove from the queue\n if (index !== -1) {\n this.prefetchQueued.splice(index, 1)\n }\n })\n\n if (!this.isPrefetchQueueRunning) {\n this.isPrefetchQueueRunning = true\n setTimeout(() => {\n this._processNextPrefetchBatch()\n }, 3000)\n }\n\n return {\n then: (resolve, reject) => defer.promise.then(resolve, reject),\n abort: abortC.abort.bind(abortC),\n }\n }\n\n _processNextPrefetchBatch() {\n const idleCallback = window.requestIdleCallback || (cb => setTimeout(cb, 0))\n\n idleCallback(() => {\n const toPrefetch = this.prefetchQueued.splice(0, 4)\n const prefetches = Promise.all(\n toPrefetch.map(([pagePath, dPromise]) => {\n // Tell plugins with custom prefetching logic that they should start\n // prefetching this path.\n if (!this.prefetchTriggered.has(pagePath)) {\n this.apiRunner(`onPrefetchPathname`, { pathname: pagePath })\n this.prefetchTriggered.add(pagePath)\n }\n\n // If a plugin has disabled core prefetching, stop now.\n if (this.prefetchDisabled) {\n return dPromise.resolve(false)\n }\n\n return this.doPrefetch(findPath(pagePath)).then(() => {\n if (!this.prefetchCompleted.has(pagePath)) {\n this.apiRunner(`onPostPrefetchPathname`, { pathname: pagePath })\n this.prefetchCompleted.add(pagePath)\n }\n\n dPromise.resolve(true)\n })\n })\n )\n\n if (this.prefetchQueued.length) {\n prefetches.then(() => {\n setTimeout(() => {\n this._processNextPrefetchBatch()\n }, 3000)\n })\n } else {\n this.isPrefetchQueueRunning = false\n }\n })\n }\n\n doPrefetch(pagePath) {\n const pageDataUrl = createPageDataUrl(pagePath)\n return prefetchHelper(pageDataUrl, {\n crossOrigin: `anonymous`,\n as: `fetch`,\n }).then(() =>\n // This was just prefetched, so will return a response from\n // the cache instead of making another request to the server\n this.loadPageDataJson(pagePath)\n )\n }\n\n hovering(rawPath) {\n this.loadPage(rawPath)\n }\n\n getResourceURLsForPathname(rawPath) {\n const pagePath = findPath(rawPath)\n const page = this.pageDataDb.get(pagePath)\n if (page) {\n const pageResources = toPageResources(page.payload)\n\n return [\n ...createComponentUrls(pageResources.page.componentChunkName),\n createPageDataUrl(pagePath),\n ]\n } else {\n return null\n }\n }\n\n isPageNotFound(rawPath) {\n const pagePath = findPath(rawPath)\n const page = this.pageDb.get(pagePath)\n return !page || page.notFound\n }\n\n loadAppData(retries = 0) {\n return this.memoizedGet(`${__PATH_PREFIX__}/page-data/app-data.json`).then(\n req => {\n const { status, responseText } = req\n\n let appData\n\n if (status !== 200 && retries < 3) {\n // Retry 3 times incase of non-200 responses\n return this.loadAppData(retries + 1)\n }\n\n // Handle 200\n if (status === 200) {\n try {\n const jsonPayload = JSON.parse(responseText)\n if (jsonPayload.webpackCompilationHash === undefined) {\n throw new Error(`not a valid app-data response`)\n }\n\n appData = jsonPayload\n } catch (err) {\n // continue regardless of error\n }\n }\n\n return appData\n }\n )\n }\n}\n\nconst createComponentUrls = componentChunkName =>\n (window.___chunkMapping[componentChunkName] || []).map(\n chunk => __PATH_PREFIX__ + chunk\n )\n\nexport class ProdLoader extends BaseLoader {\n constructor(asyncRequires, matchPaths, pageData) {\n const loadComponent = chunkName => {\n if (!asyncRequires.components[chunkName]) {\n throw new Error(\n `We couldn't find the correct component chunk with the name ${chunkName}`\n )\n }\n\n return (\n asyncRequires.components[chunkName]()\n .then(preferDefault)\n // loader will handle the case when component is error\n .catch(err => err)\n )\n }\n\n super(loadComponent, matchPaths)\n\n if (pageData) {\n this.pageDataDb.set(findPath(pageData.path), {\n pagePath: pageData.path,\n payload: pageData,\n status: `success`,\n })\n }\n }\n\n doPrefetch(pagePath) {\n return super.doPrefetch(pagePath).then(result => {\n if (result.status !== PageResourceStatus.Success) {\n return Promise.resolve()\n }\n const pageData = result.payload\n const chunkName = pageData.componentChunkName\n const componentUrls = createComponentUrls(chunkName)\n return Promise.all(componentUrls.map(prefetchHelper)).then(() => pageData)\n })\n }\n\n loadPageDataJson(rawPath) {\n return super.loadPageDataJson(rawPath).then(data => {\n if (data.notFound) {\n // check if html file exist using HEAD request:\n // if it does we should navigate to it instead of showing 404\n return doFetch(rawPath, `HEAD`).then(req => {\n if (req.status === 200) {\n // page (.html file) actually exist (or we asked for 404 )\n // returning page resources status as errored to trigger\n // regular browser navigation to given page\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n // if HEAD request wasn't 200, return notFound result\n // and show 404 page\n return data\n })\n }\n return data\n })\n }\n}\n\nlet instance\n\nexport const setLoader = _loader => {\n instance = _loader\n}\n\nexport const publicLoader = {\n enqueue: rawPath => instance.prefetch(rawPath),\n\n // Real methods\n getResourceURLsForPathname: rawPath =>\n instance.getResourceURLsForPathname(rawPath),\n loadPage: rawPath => instance.loadPage(rawPath),\n // TODO add deprecation to v4 so people use withErrorDetails and then we can remove in v5 and change default behaviour\n loadPageSync: (rawPath, options = {}) =>\n instance.loadPageSync(rawPath, options),\n prefetch: rawPath => instance.prefetch(rawPath),\n isPageNotFound: rawPath => instance.isPageNotFound(rawPath),\n hovering: rawPath => instance.hovering(rawPath),\n loadAppData: () => instance.loadAppData(),\n}\n\nexport default publicLoader\n\nexport function getStaticQueryResults() {\n if (instance) {\n return instance.staticQueryDb\n } else {\n return {}\n }\n}\n","import React, { createElement } from \"react\"\nimport PropTypes from \"prop-types\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport { grabMatchParams } from \"./find-path\"\n\n// Renders page\nclass PageRenderer extends React.Component {\n render() {\n const props = {\n ...this.props,\n params: {\n ...grabMatchParams(this.props.location.pathname),\n ...this.props.pageResources.json.pageContext.__params,\n },\n }\n\n const pageElement = createElement(this.props.pageResources.component, {\n ...props,\n key: this.props.path || this.props.pageResources.page.path,\n })\n\n const wrappedPage = apiRunner(\n `wrapPageElement`,\n { element: pageElement, props },\n pageElement,\n ({ result }) => {\n return { element: result, props }\n }\n ).pop()\n\n return wrappedPage\n }\n}\n\nPageRenderer.propTypes = {\n location: PropTypes.object.isRequired,\n pageResources: PropTypes.object.isRequired,\n data: PropTypes.object,\n pageContext: PropTypes.object.isRequired,\n}\n\nexport default PageRenderer\n","// This is extracted to separate module because it's shared\n// between browser and SSR code\nexport const RouteAnnouncerProps = {\n id: `gatsby-announcer`,\n style: {\n position: `absolute`,\n top: 0,\n width: 1,\n height: 1,\n padding: 0,\n overflow: `hidden`,\n clip: `rect(0, 0, 0, 0)`,\n whiteSpace: `nowrap`,\n border: 0,\n },\n \"aria-live\": `assertive`,\n \"aria-atomic\": `true`,\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport { maybeGetBrowserRedirect } from \"./redirect-utils.js\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport emitter from \"./emitter\"\nimport { RouteAnnouncerProps } from \"./route-announcer-props\"\nimport { navigate as reachNavigate } from \"@gatsbyjs/reach-router\"\nimport { globalHistory } from \"@gatsbyjs/reach-router/lib/history\"\nimport { parsePath } from \"gatsby-link\"\n\nfunction maybeRedirect(pathname) {\n const redirect = maybeGetBrowserRedirect(pathname)\n const { hash, search } = window.location\n\n if (redirect != null) {\n window.___replace(redirect.toPath + search + hash)\n return true\n } else {\n return false\n }\n}\n\n// Catch unhandled chunk loading errors and force a restart of the app.\nlet nextRoute = ``\n\nwindow.addEventListener(`unhandledrejection`, event => {\n if (/loading chunk \\d* failed./i.test(event.reason)) {\n if (nextRoute) {\n window.location.pathname = nextRoute\n }\n }\n})\n\nconst onPreRouteUpdate = (location, prevLocation) => {\n if (!maybeRedirect(location.pathname)) {\n nextRoute = location.pathname\n apiRunner(`onPreRouteUpdate`, { location, prevLocation })\n }\n}\n\nconst onRouteUpdate = (location, prevLocation) => {\n if (!maybeRedirect(location.pathname)) {\n apiRunner(`onRouteUpdate`, { location, prevLocation })\n if (\n process.env.GATSBY_EXPERIMENTAL_QUERY_ON_DEMAND &&\n process.env.GATSBY_QUERY_ON_DEMAND_LOADING_INDICATOR === `true`\n ) {\n emitter.emit(`onRouteUpdate`, { location, prevLocation })\n }\n }\n}\n\nconst navigate = (to, options = {}) => {\n // Support forward/backward navigation with numbers\n // navigate(-2) (jumps back 2 history steps)\n // navigate(2) (jumps forward 2 history steps)\n if (typeof to === `number`) {\n globalHistory.navigate(to)\n return\n }\n\n const { pathname, search, hash } = parsePath(to)\n const redirect = maybeGetBrowserRedirect(pathname)\n\n // If we're redirecting, just replace the passed in pathname\n // to the one we want to redirect to.\n if (redirect) {\n to = redirect.toPath + search + hash\n }\n\n // If we had a service worker update, no matter the path, reload window and\n // reset the pathname whitelist\n if (window.___swUpdated) {\n window.location = pathname + search + hash\n return\n }\n\n // Start a timer to wait for a second before transitioning and showing a\n // loader in case resources aren't around yet.\n const timeoutId = setTimeout(() => {\n emitter.emit(`onDelayedLoadPageResources`, { pathname })\n apiRunner(`onRouteUpdateDelayed`, {\n location: window.location,\n })\n }, 1000)\n\n loader.loadPage(pathname + search).then(pageResources => {\n // If no page resources, then refresh the page\n // Do this, rather than simply `window.location.reload()`, so that\n // pressing the back/forward buttons work - otherwise when pressing\n // back, the browser will just change the URL and expect JS to handle\n // the change, which won't always work since it might not be a Gatsby\n // page.\n if (!pageResources || pageResources.status === PageResourceStatus.Error) {\n window.history.replaceState({}, ``, location.href)\n window.location = pathname\n clearTimeout(timeoutId)\n return\n }\n\n // If the loaded page has a different compilation hash to the\n // window, then a rebuild has occurred on the server. Reload.\n if (process.env.NODE_ENV === `production` && pageResources) {\n if (\n pageResources.page.webpackCompilationHash !==\n window.___webpackCompilationHash\n ) {\n // Purge plugin-offline cache\n if (\n `serviceWorker` in navigator &&\n navigator.serviceWorker.controller !== null &&\n navigator.serviceWorker.controller.state === `activated`\n ) {\n navigator.serviceWorker.controller.postMessage({\n gatsbyApi: `clearPathResources`,\n })\n }\n\n window.location = pathname + search + hash\n }\n }\n reachNavigate(to, options)\n clearTimeout(timeoutId)\n })\n}\n\nfunction shouldUpdateScroll(prevRouterProps, { location }) {\n const { pathname, hash } = location\n const results = apiRunner(`shouldUpdateScroll`, {\n prevRouterProps,\n // `pathname` for backwards compatibility\n pathname,\n routerProps: { location },\n getSavedScrollPosition: args => [\n 0,\n // FIXME this is actually a big code smell, we should fix this\n // eslint-disable-next-line @babel/no-invalid-this\n this._stateStorage.read(args, args.key),\n ],\n })\n if (results.length > 0) {\n // Use the latest registered shouldUpdateScroll result, this allows users to override plugin's configuration\n // @see https://github.com/gatsbyjs/gatsby/issues/12038\n return results[results.length - 1]\n }\n\n if (prevRouterProps) {\n const {\n location: { pathname: oldPathname },\n } = prevRouterProps\n if (oldPathname === pathname) {\n // Scroll to element if it exists, if it doesn't, or no hash is provided,\n // scroll to top.\n return hash ? decodeURI(hash.slice(1)) : [0, 0]\n }\n }\n return true\n}\n\nfunction init() {\n // The \"scroll-behavior\" package expects the \"action\" to be on the location\n // object so let's copy it over.\n globalHistory.listen(args => {\n args.location.action = args.action\n })\n\n window.___push = to => navigate(to, { replace: false })\n window.___replace = to => navigate(to, { replace: true })\n window.___navigate = (to, options) => navigate(to, options)\n}\n\nclass RouteAnnouncer extends React.Component {\n constructor(props) {\n super(props)\n this.announcementRef = React.createRef()\n }\n\n componentDidUpdate(prevProps, nextProps) {\n requestAnimationFrame(() => {\n let pageName = `new page at ${this.props.location.pathname}`\n if (document.title) {\n pageName = document.title\n }\n const pageHeadings = document.querySelectorAll(`#gatsby-focus-wrapper h1`)\n if (pageHeadings && pageHeadings.length) {\n pageName = pageHeadings[0].textContent\n }\n const newAnnouncement = `Navigated to ${pageName}`\n if (this.announcementRef.current) {\n const oldAnnouncement = this.announcementRef.current.innerText\n if (oldAnnouncement !== newAnnouncement) {\n this.announcementRef.current.innerText = newAnnouncement\n }\n }\n })\n }\n\n render() {\n return
\n }\n}\n\nconst compareLocationProps = (prevLocation, nextLocation) => {\n if (prevLocation.href !== nextLocation.href) {\n return true\n }\n\n if (prevLocation?.state?.key !== nextLocation?.state?.key) {\n return true\n }\n\n return false\n}\n\n// Fire on(Pre)RouteUpdate APIs\nclass RouteUpdates extends React.Component {\n constructor(props) {\n super(props)\n onPreRouteUpdate(props.location, null)\n }\n\n componentDidMount() {\n onRouteUpdate(this.props.location, null)\n }\n\n shouldComponentUpdate(prevProps) {\n if (compareLocationProps(prevProps.location, this.props.location)) {\n onPreRouteUpdate(this.props.location, prevProps.location)\n return true\n }\n return false\n }\n\n componentDidUpdate(prevProps) {\n if (compareLocationProps(prevProps.location, this.props.location)) {\n onRouteUpdate(this.props.location, prevProps.location)\n }\n }\n\n render() {\n return (\n \n {this.props.children}\n \n \n )\n }\n}\n\nRouteUpdates.propTypes = {\n location: PropTypes.object.isRequired,\n}\n\nexport { init, shouldUpdateScroll, RouteUpdates, maybeGetBrowserRedirect }\n","// Pulled from react-compat\n// https://github.com/developit/preact-compat/blob/7c5de00e7c85e2ffd011bf3af02899b63f699d3a/src/index.js#L349\nfunction shallowDiffers(a, b) {\n for (var i in a) {\n if (!(i in b)) return true;\n }for (var _i in b) {\n if (a[_i] !== b[_i]) return true;\n }return false;\n}\n\nexport default (function (instance, nextProps, nextState) {\n return shallowDiffers(instance.props, nextProps) || shallowDiffers(instance.state, nextState);\n});","/* global HAS_REACT_18 */\nimport { apiRunner, apiRunnerAsync } from \"./api-runner-browser\"\nimport React from \"react\"\nimport { Router, navigate, Location, BaseContext } from \"@gatsbyjs/reach-router\"\nimport { ScrollContext } from \"gatsby-react-router-scroll\"\nimport { StaticQueryContext } from \"gatsby\"\nimport {\n shouldUpdateScroll,\n init as navigationInit,\n RouteUpdates,\n} from \"./navigation\"\nimport emitter from \"./emitter\"\nimport PageRenderer from \"./page-renderer\"\nimport asyncRequires from \"$virtual/async-requires\"\nimport {\n setLoader,\n ProdLoader,\n publicLoader,\n PageResourceStatus,\n getStaticQueryResults,\n} from \"./loader\"\nimport EnsureResources from \"./ensure-resources\"\nimport stripPrefix from \"./strip-prefix\"\n\n// Generated during bootstrap\nimport matchPaths from \"$virtual/match-paths.json\"\n\nconst loader = new ProdLoader(asyncRequires, matchPaths, window.pageData)\nsetLoader(loader)\nloader.setApiRunner(apiRunner)\n\nlet reactHydrate\nlet reactRender\nif (HAS_REACT_18) {\n const reactDomClient = require(`react-dom/client`)\n reactRender = (Component, el) =>\n reactDomClient.createRoot(el).render(Component)\n reactHydrate = (Component, el) => reactDomClient.hydrateRoot(el, Component)\n} else {\n const reactDomClient = require(`react-dom`)\n reactRender = reactDomClient.render\n reactHydrate = reactDomClient.hydrate\n}\n\nwindow.asyncRequires = asyncRequires\nwindow.___emitter = emitter\nwindow.___loader = publicLoader\n\nnavigationInit()\n\nconst reloadStorageKey = `gatsby-reload-compilation-hash-match`\n\napiRunnerAsync(`onClientEntry`).then(() => {\n // Let plugins register a service worker. The plugin just needs\n // to return true.\n if (apiRunner(`registerServiceWorker`).filter(Boolean).length > 0) {\n require(`./register-service-worker`)\n }\n\n // In gatsby v2 if Router is used in page using matchPaths\n // paths need to contain full path.\n // For example:\n // - page have `/app/*` matchPath\n // - inside template user needs to use `/app/xyz` as path\n // Resetting `basepath`/`baseuri` keeps current behaviour\n // to not introduce breaking change.\n // Remove this in v3\n const RouteHandler = props => (\n \n \n \n )\n\n const DataContext = React.createContext({})\n\n class GatsbyRoot extends React.Component {\n render() {\n const { children } = this.props\n return (\n \n {({ location }) => (\n \n {({ pageResources, location }) => {\n const staticQueryResults = getStaticQueryResults()\n return (\n \n \n {children}\n \n \n )\n }}\n \n )}\n \n )\n }\n }\n\n class LocationHandler extends React.Component {\n render() {\n return (\n \n {({ pageResources, location }) => (\n \n \n \n \n \n \n \n )}\n \n )\n }\n }\n\n const { pagePath, location: browserLoc } = window\n\n // Explicitly call navigate if the canonical path (window.pagePath)\n // is different to the browser path (window.location.pathname). SSR\n // page paths might include search params, while SSG and DSG won't.\n // If page path include search params we also compare query params.\n // But only if NONE of the following conditions hold:\n //\n // - The url matches a client side route (page.matchPath)\n // - it's a 404 page\n // - it's the offline plugin shell (/offline-plugin-app-shell-fallback/)\n if (\n pagePath &&\n __BASE_PATH__ + pagePath !==\n browserLoc.pathname + (pagePath.includes(`?`) ? browserLoc.search : ``) &&\n !(\n loader.findMatchPath(stripPrefix(browserLoc.pathname, __BASE_PATH__)) ||\n pagePath.match(/^\\/(404|500)(\\/?|.html)$/) ||\n pagePath.match(/^\\/offline-plugin-app-shell-fallback\\/?$/)\n )\n ) {\n navigate(\n __BASE_PATH__ +\n pagePath +\n (!pagePath.includes(`?`) ? browserLoc.search : ``) +\n browserLoc.hash,\n {\n replace: true,\n }\n )\n }\n\n // It's possible that sessionStorage can throw an exception if access is not granted, see https://github.com/gatsbyjs/gatsby/issues/34512\n const getSessionStorage = () => {\n try {\n return sessionStorage\n } catch {\n return null\n }\n }\n\n publicLoader.loadPage(browserLoc.pathname + browserLoc.search).then(page => {\n const sessionStorage = getSessionStorage()\n\n if (\n page?.page?.webpackCompilationHash &&\n page.page.webpackCompilationHash !== window.___webpackCompilationHash\n ) {\n // Purge plugin-offline cache\n if (\n `serviceWorker` in navigator &&\n navigator.serviceWorker.controller !== null &&\n navigator.serviceWorker.controller.state === `activated`\n ) {\n navigator.serviceWorker.controller.postMessage({\n gatsbyApi: `clearPathResources`,\n })\n }\n\n // We have not matching html + js (inlined `window.___webpackCompilationHash`)\n // with our data (coming from `app-data.json` file). This can cause issues such as\n // errors trying to load static queries (as list of static queries is inside `page-data`\n // which might not match to currently loaded `.js` scripts).\n // We are making attempt to reload if hashes don't match, but we also have to handle case\n // when reload doesn't fix it (possibly broken deploy) so we don't end up in infinite reload loop\n if (sessionStorage) {\n const isReloaded = sessionStorage.getItem(reloadStorageKey) === `1`\n\n if (!isReloaded) {\n sessionStorage.setItem(reloadStorageKey, `1`)\n window.location.reload(true)\n return\n }\n }\n }\n\n if (sessionStorage) {\n sessionStorage.removeItem(reloadStorageKey)\n }\n\n if (!page || page.status === PageResourceStatus.Error) {\n const message = `page resources for ${browserLoc.pathname} not found. Not rendering React`\n\n // if the chunk throws an error we want to capture the real error\n // This should help with https://github.com/gatsbyjs/gatsby/issues/19618\n if (page && page.error) {\n console.error(message)\n throw page.error\n }\n\n throw new Error(message)\n }\n\n const SiteRoot = apiRunner(\n `wrapRootElement`,\n { element: },\n ,\n ({ result }) => {\n return { element: result }\n }\n ).pop()\n\n const App = function App() {\n const onClientEntryRanRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!onClientEntryRanRef.current) {\n onClientEntryRanRef.current = true\n if (performance.mark) {\n performance.mark(`onInitialClientRender`)\n }\n\n apiRunner(`onInitialClientRender`)\n }\n }, [])\n\n return {SiteRoot}\n }\n\n const focusEl = document.getElementById(`gatsby-focus-wrapper`)\n\n // Client only pages have any empty body so we just do a normal\n // render to avoid React complaining about hydration mis-matches.\n let defaultRenderer = reactRender\n if (focusEl && focusEl.children.length) {\n defaultRenderer = reactHydrate\n }\n\n const renderer = apiRunner(\n `replaceHydrateFunction`,\n undefined,\n defaultRenderer\n )[0]\n\n function runRender() {\n const rootElement =\n typeof window !== `undefined`\n ? document.getElementById(`___gatsby`)\n : null\n\n renderer(, rootElement)\n }\n\n // https://github.com/madrobby/zepto/blob/b5ed8d607f67724788ec9ff492be297f64d47dfc/src/zepto.js#L439-L450\n // TODO remove IE 10 support\n const doc = document\n if (\n doc.readyState === `complete` ||\n (doc.readyState !== `loading` && !doc.documentElement.doScroll)\n ) {\n setTimeout(function () {\n runRender()\n }, 0)\n } else {\n const handler = function () {\n doc.removeEventListener(`DOMContentLoaded`, handler, false)\n window.removeEventListener(`load`, handler, false)\n\n runRender()\n }\n\n doc.addEventListener(`DOMContentLoaded`, handler, false)\n window.addEventListener(`load`, handler, false)\n }\n })\n})\n","import React from \"react\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport shallowCompare from \"shallow-compare\"\n\nclass EnsureResources extends React.Component {\n constructor(props) {\n super()\n const { location, pageResources } = props\n this.state = {\n location: { ...location },\n pageResources:\n pageResources ||\n loader.loadPageSync(location.pathname + location.search, {\n withErrorDetails: true,\n }),\n }\n }\n\n static getDerivedStateFromProps({ location }, prevState) {\n if (prevState.location.href !== location.href) {\n const pageResources = loader.loadPageSync(\n location.pathname + location.search,\n {\n withErrorDetails: true,\n }\n )\n\n return {\n pageResources,\n location: { ...location },\n }\n }\n\n return {\n location: { ...location },\n }\n }\n\n loadResources(rawPath) {\n loader.loadPage(rawPath).then(pageResources => {\n if (pageResources && pageResources.status !== PageResourceStatus.Error) {\n this.setState({\n location: { ...window.location },\n pageResources,\n })\n } else {\n window.history.replaceState({}, ``, location.href)\n window.location = rawPath\n }\n })\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n // Always return false if we're missing resources.\n if (!nextState.pageResources) {\n this.loadResources(\n nextProps.location.pathname + nextProps.location.search\n )\n return false\n }\n\n if (\n process.env.BUILD_STAGE === `develop` &&\n nextState.pageResources.stale\n ) {\n this.loadResources(\n nextProps.location.pathname + nextProps.location.search\n )\n return false\n }\n\n // Check if the component or json have changed.\n if (this.state.pageResources !== nextState.pageResources) {\n return true\n }\n if (\n this.state.pageResources.component !== nextState.pageResources.component\n ) {\n return true\n }\n\n if (this.state.pageResources.json !== nextState.pageResources.json) {\n return true\n }\n // Check if location has changed on a page using internal routing\n // via matchPath configuration.\n if (\n this.state.location.key !== nextState.location.key &&\n nextState.pageResources.page &&\n (nextState.pageResources.page.matchPath ||\n nextState.pageResources.page.path)\n ) {\n return true\n }\n return shallowCompare(this, nextProps, nextState)\n }\n\n render() {\n if (\n process.env.NODE_ENV !== `production` &&\n (!this.state.pageResources ||\n this.state.pageResources.status === PageResourceStatus.Error)\n ) {\n const message = `EnsureResources was not able to find resources for path: \"${this.props.location.pathname}\"\nThis typically means that an issue occurred building components for that path.\nRun \\`gatsby clean\\` to remove any cached elements.`\n if (this.state.pageResources?.error) {\n console.error(message)\n throw this.state.pageResources.error\n }\n\n throw new Error(message)\n }\n\n return this.props.children(this.state)\n }\n}\n\nexport default EnsureResources\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport loader from \"./loader\"\nimport InternalPageRenderer from \"./page-renderer\"\n\nconst ProdPageRenderer = ({ location }) => {\n const pageResources = loader.loadPageSync(location.pathname)\n if (!pageResources) {\n return null\n }\n return React.createElement(InternalPageRenderer, {\n location,\n pageResources,\n ...pageResources.json,\n })\n}\n\nProdPageRenderer.propTypes = {\n location: PropTypes.shape({\n pathname: PropTypes.string.isRequired,\n }).isRequired,\n}\n\nexport default ProdPageRenderer\n","const preferDefault = m => (m && m.default) || m\n\nif (process.env.BUILD_STAGE === `develop`) {\n module.exports = preferDefault(require(`./public-page-renderer-dev`))\n} else if (process.env.BUILD_STAGE === `build-javascript`) {\n module.exports = preferDefault(require(`./public-page-renderer-prod`))\n} else {\n module.exports = () => null\n}\n","exports.polyfill = Component => Component\n","import redirects from \"./redirects.json\"\n\n// Convert to a map for faster lookup in maybeRedirect()\n\nconst redirectMap = new Map()\nconst redirectIgnoreCaseMap = new Map()\n\nredirects.forEach(redirect => {\n if (redirect.ignoreCase) {\n redirectIgnoreCaseMap.set(redirect.fromPath, redirect)\n } else {\n redirectMap.set(redirect.fromPath, redirect)\n }\n})\n\nexport function maybeGetBrowserRedirect(pathname) {\n let redirect = redirectMap.get(pathname)\n if (!redirect) {\n redirect = redirectIgnoreCaseMap.get(pathname.toLowerCase())\n }\n return redirect\n}\n","import { apiRunner } from \"./api-runner-browser\"\n\nif (\n window.location.protocol !== `https:` &&\n window.location.hostname !== `localhost`\n) {\n console.error(\n `Service workers can only be used over HTTPS, or on localhost for development`\n )\n} else if (`serviceWorker` in navigator) {\n navigator.serviceWorker\n .register(`${__BASE_PATH__}/sw.js`)\n .then(function (reg) {\n reg.addEventListener(`updatefound`, () => {\n apiRunner(`onServiceWorkerUpdateFound`, { serviceWorker: reg })\n // The updatefound event implies that reg.installing is set; see\n // https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event\n const installingWorker = reg.installing\n console.log(`installingWorker`, installingWorker)\n installingWorker.addEventListener(`statechange`, () => {\n switch (installingWorker.state) {\n case `installed`:\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and the fresh content will\n // have been added to the cache.\n\n // We set a flag so Gatsby Link knows to refresh the page on next navigation attempt\n window.___swUpdated = true\n // We call the onServiceWorkerUpdateReady API so users can show update prompts.\n apiRunner(`onServiceWorkerUpdateReady`, { serviceWorker: reg })\n\n // If resources failed for the current page, reload.\n if (window.___failedResources) {\n console.log(`resources failed, SW updated - reloading`)\n window.location.reload()\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a \"Content is cached for offline use.\" message.\n console.log(`Content is now available offline!`)\n\n // Post to service worker that install is complete.\n // Delay to allow time for the event listener to be added --\n // otherwise fetch is called too soon and resources aren't cached.\n apiRunner(`onServiceWorkerInstalled`, { serviceWorker: reg })\n }\n break\n\n case `redundant`:\n console.error(`The installing service worker became redundant.`)\n apiRunner(`onServiceWorkerRedundant`, { serviceWorker: reg })\n break\n\n case `activated`:\n apiRunner(`onServiceWorkerActive`, { serviceWorker: reg })\n break\n }\n })\n })\n })\n .catch(function (e) {\n console.error(`Error during service worker registration:`, e)\n })\n}\n","/**\n * Remove a prefix from a string. Return the input string if the given prefix\n * isn't found.\n */\n\nexport default function stripPrefix(str, prefix = ``) {\n if (!prefix) {\n return str\n }\n\n if (str === prefix) {\n return `/`\n }\n\n if (str.startsWith(`${prefix}/`)) {\n return str.slice(prefix.length)\n }\n\n return str\n}\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = _default;\nexports.routeThroughBrowserOrApp = exports.hashShouldBeFollowed = exports.pathIsNotHandledByApp = exports.urlsAreOnSameOrigin = exports.authorIsForcingNavigation = exports.anchorsTargetIsEquivalentToSelf = exports.findClosestAnchor = exports.navigationWasHandledElsewhere = exports.slashedPathname = exports.userIsForcingNavigation = void 0;\n\nvar _escapeStringRegexp = _interopRequireDefault(require(\"escape-string-regexp\"));\n\nvar _gatsby = require(\"gatsby\");\n\nvar userIsForcingNavigation = function userIsForcingNavigation(event) {\n return event.button !== 0 || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;\n}; // IE does not include leading slash in anchor.pathname\n\n\nexports.userIsForcingNavigation = userIsForcingNavigation;\n\nvar slashedPathname = function slashedPathname(pathname) {\n return pathname[0] === \"/\" ? pathname : \"/\" + pathname;\n};\n\nexports.slashedPathname = slashedPathname;\n\nvar navigationWasHandledElsewhere = function navigationWasHandledElsewhere(event) {\n return event.defaultPrevented;\n};\n\nexports.navigationWasHandledElsewhere = navigationWasHandledElsewhere;\n\nvar findClosestAnchor = function findClosestAnchor(node) {\n for (; node.parentNode; node = node.parentNode) {\n if (node.nodeName.toLowerCase() === \"a\") {\n return node;\n }\n }\n\n return null;\n};\n\nexports.findClosestAnchor = findClosestAnchor;\n\nvar anchorsTargetIsEquivalentToSelf = function anchorsTargetIsEquivalentToSelf(anchor) {\n return (\n /* If target attribute is not present it's treated as _self */\n anchor.hasAttribute(\"target\") === false ||\n /**\n * The browser defaults to _self, but, not all browsers set\n * a.target to the string value `_self` by default\n */\n\n /**\n * Assumption: some browsers use null/undefined for default\n * attribute values\n */\n anchor.target == null ||\n /**\n * Some browsers use the empty string to mean _self, check\n * for actual `_self`\n */\n [\"_self\", \"\"].includes(anchor.target) ||\n /**\n * As per https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-target\n */\n anchor.target === \"_parent\" && (!anchor.ownerDocument.defaultView.parent || // Assumption: This can be falsey\n anchor.ownerDocument.defaultView.parent === anchor.ownerDocument.defaultView) || anchor.target === \"_top\" && (!anchor.ownerDocument.defaultView.top || // Assumption: This can be falsey\n anchor.ownerDocument.defaultView.top === anchor.ownerDocument.defaultView)\n );\n};\n\nexports.anchorsTargetIsEquivalentToSelf = anchorsTargetIsEquivalentToSelf;\n\nvar authorIsForcingNavigation = function authorIsForcingNavigation(anchor) {\n return (\n /**\n * HTML5 attribute that informs the browser to handle the\n * href as a downloadable file; let the browser handle it\n */\n anchor.hasAttribute(\"download\") === true ||\n /**\n * Let the browser handle anything that doesn't look like a\n * target=\"_self\" anchor\n */\n anchorsTargetIsEquivalentToSelf(anchor) === false\n );\n}; // https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy\n\n\nexports.authorIsForcingNavigation = authorIsForcingNavigation;\n\nvar urlsAreOnSameOrigin = function urlsAreOnSameOrigin(origin, destination) {\n return origin.protocol === destination.protocol &&\n /* a.host includes both hostname and port in the expected format host:port */\n origin.host === destination.host;\n};\n\nexports.urlsAreOnSameOrigin = urlsAreOnSameOrigin;\n\nvar pathIsNotHandledByApp = function pathIsNotHandledByApp(destination, pathStartRegEx) {\n var pathFileExtensionRegEx = /^.*\\.((?!htm)[a-z0-9]{1,5})$/i;\n return (\n /**\n * For when pathPrefix is used in an app and there happens to be a link\n * pointing to the same domain but outside of the app's pathPrefix. For\n * example, a Gatsby app lives at https://example.com/myapp/, with the\n * pathPrefix set to `/myapp`. When adding an absolute link to the same\n * domain but outside of the /myapp path, for example, `` the plugin won't catch it and\n * will navigate to an external link instead of doing a pushState resulting\n * in `https://example.com/myapp/https://example.com/not-my-app`\n */\n pathStartRegEx.test(slashedPathname(destination.pathname)) === false ||\n /**\n * Don't catch links pointed at what look like file extensions (other than\n * .htm/html extensions).\n */\n destination.pathname.search(pathFileExtensionRegEx) !== -1\n );\n};\n\nexports.pathIsNotHandledByApp = pathIsNotHandledByApp;\n\nvar hashShouldBeFollowed = function hashShouldBeFollowed(origin, destination) {\n return destination.hash !== \"\" && (\n /**\n * Dynamically created anchor links (href=\"#my-anchor\") do not always\n * have pathname on IE\n */\n destination.pathname === \"\" ||\n /* Don't catch links pointed to the same page but with a hash. */\n destination.pathname === origin.pathname);\n};\n\nexports.hashShouldBeFollowed = hashShouldBeFollowed;\n\nvar routeThroughBrowserOrApp = function routeThroughBrowserOrApp(hrefHandler, pluginOptions) {\n return function (event) {\n if (window.___failedResources) return true;\n if (userIsForcingNavigation(event)) return true;\n if (navigationWasHandledElsewhere(event)) return true;\n var clickedAnchor = findClosestAnchor(event.target);\n if (clickedAnchor == null) return true;\n if (authorIsForcingNavigation(clickedAnchor)) return true; // IE clears the host value if the anchor href changed after creation, e.g.\n // in React. Creating a new anchor element to ensure host value is present\n\n var destination = document.createElement(\"a\"); // https://html.spec.whatwg.org/multipage/links.html#concept-hyperlink-url-set\n // If clickedAnchor has no href attribute like `example`, the href getter returns empty string.\n\n if (clickedAnchor.href !== \"\") {\n destination.href = clickedAnchor.href;\n }\n\n if (\"SVGAnimatedString\" in window && clickedAnchor.href instanceof SVGAnimatedString) {\n destination.href = clickedAnchor.href.animVal;\n } // In IE, the default port is included in the anchor host but excluded from\n // the location host. This affects the ability to directly compare\n // location host to anchor host. For example: http://example.com would\n // have a location.host of 'example.com' and an destination.host of\n // 'example.com:80' Creating anchor from the location.href to normalize the\n // host value.\n\n\n var origin = document.createElement(\"a\");\n origin.href = window.location.href;\n if (urlsAreOnSameOrigin(origin, destination) === false) return true; // Regex to test pathname against pathPrefix\n\n var pathStartRegEx = new RegExp(\"^\" + (0, _escapeStringRegexp.default)((0, _gatsby.withPrefix)(\"/\")));\n if (pathIsNotHandledByApp(destination, pathStartRegEx)) return true;\n if (hashShouldBeFollowed(origin, destination)) return true;\n\n if (pluginOptions.excludePattern) {\n var excludeRegex = new RegExp(pluginOptions.excludePattern);\n\n if (excludeRegex.test(destination.pathname)) {\n return true;\n }\n }\n\n event.preventDefault(); // See issue #8907: destination.pathname already includes pathPrefix added\n // by gatsby-transformer-remark but gatsby-link.navigate needs href without\n\n var destinationPathname = slashedPathname(destination.pathname).replace(pathStartRegEx, \"/\");\n hrefHandler(\"\" + destinationPathname + destination.search + destination.hash);\n return false;\n };\n};\n\nexports.routeThroughBrowserOrApp = routeThroughBrowserOrApp;\n\nfunction _default(root, pluginOptions, cb) {\n var clickHandler = routeThroughBrowserOrApp(cb, pluginOptions);\n root.addEventListener(\"click\", clickHandler);\n return function () {\n return root.removeEventListener(\"click\", clickHandler);\n };\n}","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _gatsby = require(\"gatsby\");\n\nvar _catchLinks = _interopRequireDefault(require(\"./catch-links\"));\n\nexports.onClientEntry = function (_, pluginOptions) {\n if (pluginOptions === void 0) {\n pluginOptions = {};\n }\n\n (0, _catchLinks.default)(window, pluginOptions, function (href) {\n (0, _gatsby.navigate)(href);\n });\n};","/* global __MANIFEST_PLUGIN_HAS_LOCALISATION__ */\nimport { withPrefix } from \"gatsby\";\nimport getManifestForPathname from \"./get-manifest-pathname\"; // when we don't have localisation in our manifest, we tree shake everything away\n\nexport const onRouteUpdate = function onRouteUpdate({\n location\n}, pluginOptions) {\n if (__MANIFEST_PLUGIN_HAS_LOCALISATION__) {\n const {\n localize\n } = pluginOptions;\n const manifestFilename = getManifestForPathname(location.pathname, localize, true);\n const manifestEl = document.head.querySelector(`link[rel=\"manifest\"]`);\n\n if (manifestEl) {\n manifestEl.setAttribute(`href`, withPrefix(manifestFilename));\n }\n }\n};","\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _gatsby = require(\"gatsby\");\n\n/**\n * Get a manifest filename depending on localized pathname\n *\n * @param {string} pathname\n * @param {Array<{start_url: string, lang: string}>} localizedManifests\n * @param {boolean} shouldPrependPathPrefix\n * @return string\n */\nvar _default = (pathname, localizedManifests, shouldPrependPathPrefix = false) => {\n const defaultFilename = `manifest.webmanifest`;\n\n if (!Array.isArray(localizedManifests)) {\n return defaultFilename;\n }\n\n const localizedManifest = localizedManifests.find(app => {\n let startUrl = app.start_url;\n\n if (shouldPrependPathPrefix) {\n startUrl = (0, _gatsby.withPrefix)(startUrl);\n }\n\n return pathname.startsWith(startUrl);\n });\n\n if (!localizedManifest) {\n return defaultFilename;\n }\n\n return `manifest_${localizedManifest.lang}.webmanifest`;\n};\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.onRouteUpdate = exports.onRouteUpdateDelayed = exports.onClientEntry = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _accessibleNprogress = _interopRequireDefault(require(\"accessible-nprogress\"));\n\nvar defaultOptions = {\n color: \"#29d\"\n};\n\nvar onClientEntry = function onClientEntry(_gatsbyApi, pluginOptions) {\n if (pluginOptions === void 0) {\n pluginOptions = {};\n }\n\n // Merge default options with user defined options in `gatsby-config.js`\n var options = (0, _extends2.default)({}, defaultOptions, pluginOptions); // Inject styles.\n\n var styles = \"\\n #nprogress {\\n pointer-events: none;\\n }\\n #nprogress .bar {\\n background: \" + options.color + \";\\n position: fixed;\\n z-index: 1031;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 2px;\\n }\\n #nprogress .peg {\\n display: block;\\n position: absolute;\\n right: 0px;\\n width: 100px;\\n height: 100%;\\n box-shadow: 0 0 10px \" + options.color + \", 0 0 5px \" + options.color + \";\\n opacity: 1.0;\\n -webkit-transform: rotate(3deg) translate(0px, -4px);\\n -ms-transform: rotate(3deg) translate(0px, -4px);\\n transform: rotate(3deg) translate(0px, -4px);\\n }\\n #nprogress .spinner {\\n display: block;\\n position: fixed;\\n z-index: 1031;\\n top: 15px;\\n right: 15px;\\n }\\n #nprogress .spinner-icon {\\n width: 18px;\\n height: 18px;\\n box-sizing: border-box;\\n border: solid 2px transparent;\\n border-top-color: \" + options.color + \";\\n border-left-color: \" + options.color + \";\\n border-radius: 50%;\\n -webkit-animation: nprogress-spinner 400ms linear infinite;\\n animation: nprogress-spinner 400ms linear infinite;\\n }\\n .nprogress-custom-parent {\\n overflow: hidden;\\n position: relative;\\n }\\n .nprogress-custom-parent #nprogress .spinner,\\n .nprogress-custom-parent #nprogress .bar {\\n position: absolute;\\n }\\n @-webkit-keyframes nprogress-spinner {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n }\\n }\\n @keyframes nprogress-spinner {\\n 0% {\\n transform: rotate(0deg);\\n }\\n 100% {\\n transform: rotate(360deg);\\n }\\n }\\n \";\n var node = document.createElement(\"style\");\n node.id = \"nprogress-styles\";\n node.innerHTML = styles;\n document.head.appendChild(node);\n\n _accessibleNprogress.default.configure(options);\n};\n\nexports.onClientEntry = onClientEntry;\n\nvar onRouteUpdateDelayed = function onRouteUpdateDelayed() {\n _accessibleNprogress.default.start();\n};\n\nexports.onRouteUpdateDelayed = onRouteUpdateDelayed;\n\nvar onRouteUpdate = function onRouteUpdate() {\n _accessibleNprogress.default.done();\n};\n\nexports.onRouteUpdate = onRouteUpdate;","\"use strict\";\n\nexports.registerServiceWorker = function () {\n return process.env.GATSBY_IS_PREVIEW !== \"true\";\n}; // only cache relevant resources for this page\n\n\nvar whiteListLinkRels = /^(stylesheet|preload)$/;\nvar prefetchedPathnames = [];\n\nexports.onServiceWorkerActive = function (_ref) {\n var getResourceURLsForPathname = _ref.getResourceURLsForPathname,\n serviceWorker = _ref.serviceWorker;\n\n if (process.env.GATSBY_IS_PREVIEW === \"true\") {\n return;\n } // if the SW has just updated then clear the path dependencies and don't cache\n // stuff, since we're on the old revision until we navigate to another page\n\n\n if (window.___swUpdated) {\n serviceWorker.active.postMessage({\n gatsbyApi: \"clearPathResources\"\n });\n return;\n } // grab nodes from head of document\n\n\n var nodes = document.querySelectorAll(\"\\n head > script[src],\\n head > link[href],\\n head > style[data-href]\\n \"); // get all resource URLs\n\n var headerResources = [].slice.call(nodes) // don't include preconnect/prefetch/prerender resources\n .filter(function (node) {\n return node.tagName !== \"LINK\" || whiteListLinkRels.test(node.getAttribute(\"rel\"));\n }).map(function (node) {\n return node.src || node.href || node.getAttribute(\"data-href\");\n }); // Loop over prefetched pages and add their resources to an array,\n // plus specify which resources are required for those paths.\n\n var prefetchedResources = [];\n prefetchedPathnames.forEach(function (path) {\n var resources = getResourceURLsForPathname(path);\n prefetchedResources.push.apply(prefetchedResources, resources);\n serviceWorker.active.postMessage({\n gatsbyApi: \"setPathResources\",\n path: path,\n resources: resources\n });\n }); // Loop over all resources and fetch the page component + JSON data\n // to add it to the SW cache.\n\n var resources = [].concat(headerResources, prefetchedResources);\n resources.forEach(function (resource) {\n // Create a prefetch link for each resource, so Workbox runtime-caches them\n var link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = resource;\n link.onload = link.remove;\n link.onerror = link.remove;\n document.head.appendChild(link);\n });\n};\n\nfunction setPathResources(path, getResourceURLsForPathname) {\n // do nothing if the SW has just updated, since we still have old pages in\n // memory which we don't want to be whitelisted\n if (window.___swUpdated) return;\n\n if (\"serviceWorker\" in navigator) {\n var _navigator = navigator,\n serviceWorker = _navigator.serviceWorker;\n\n if (serviceWorker.controller === null) {\n // if SW is not installed, we need to record any prefetches\n // that happen so we can then add them to SW cache once installed\n prefetchedPathnames.push(path);\n } else {\n var resources = getResourceURLsForPathname(path);\n serviceWorker.controller.postMessage({\n gatsbyApi: \"setPathResources\",\n path: path,\n resources: resources\n });\n }\n }\n}\n\nexports.onRouteUpdate = function (_ref2) {\n var location = _ref2.location,\n getResourceURLsForPathname = _ref2.getResourceURLsForPathname;\n var pathname = location.pathname.replace(__BASE_PATH__, \"\");\n setPathResources(pathname, getResourceURLsForPathname);\n\n if (\"serviceWorker\" in navigator && navigator.serviceWorker.controller !== null) {\n navigator.serviceWorker.controller.postMessage({\n gatsbyApi: \"enableOfflineShell\"\n });\n }\n};\n\nexports.onPostPrefetchPathname = function (_ref3) {\n var pathname = _ref3.pathname,\n getResourceURLsForPathname = _ref3.getResourceURLsForPathname;\n setPathResources(pathname, getResourceURLsForPathname);\n};","\"use strict\";\n\nvar offsetY = 0;\n\nvar getTargetOffset = function getTargetOffset(hash) {\n var id = window.decodeURI(hash.replace(\"#\", \"\"));\n\n if (id !== \"\") {\n var element = document.getElementById(id);\n\n if (element) {\n var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;\n var clientTop = document.documentElement.clientTop || document.body.clientTop || 0;\n var computedStyles = window.getComputedStyle(element);\n var scrollMarginTop = computedStyles.getPropertyValue(\"scroll-margin-top\") || computedStyles.getPropertyValue(\"scroll-snap-margin-top\") || \"0px\";\n return element.getBoundingClientRect().top + scrollTop - parseInt(scrollMarginTop, 10) - clientTop - offsetY;\n }\n }\n\n return null;\n};\n\nexports.onInitialClientRender = function (_, pluginOptions) {\n if (pluginOptions.offsetY) {\n offsetY = pluginOptions.offsetY;\n }\n\n requestAnimationFrame(function () {\n var offset = getTargetOffset(window.location.hash);\n\n if (offset !== null) {\n window.scrollTo(0, offset);\n }\n });\n};\n\nexports.shouldUpdateScroll = function (_ref) {\n var location = _ref.routerProps.location;\n var offset = getTargetOffset(location.hash);\n return offset !== null ? [0, offset] : true;\n};","import invariant from \"invariant\"; ////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\n\nvar startsWith = function startsWith(string, search) {\n return string.substr(0, search.length) === search;\n}; ////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n// static > dynamic > splat > root\n//\n// This way we don't have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n// { path, default, value }\n//\n// And a returned match looks like:\n//\n// { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\n\n\nvar pick = function pick(routes, uri) {\n var match = void 0;\n var default_ = void 0;\n\n var _uri$split = uri.split(\"?\"),\n uriPathname = _uri$split[0];\n\n var uriSegments = segmentize(uriPathname);\n var isRootUri = uriSegments[0] === \"\";\n var ranked = rankRoutes(routes);\n\n for (var i = 0, l = ranked.length; i < l; i++) {\n var missed = false;\n var route = ranked[i].route;\n\n if (route.default) {\n default_ = {\n route: route,\n params: {},\n uri: uri\n };\n continue;\n }\n\n var routeSegments = segmentize(route.path);\n var params = {};\n var max = Math.max(uriSegments.length, routeSegments.length);\n var index = 0;\n\n for (; index < max; index++) {\n var routeSegment = routeSegments[index];\n var uriSegment = uriSegments[index];\n\n if (isSplat(routeSegment)) {\n // Hit a splat, just grab the rest, and return a match\n // uri: /files/documents/work\n // route: /files/*\n var param = routeSegment.slice(1) || \"*\";\n params[param] = uriSegments.slice(index).map(decodeURIComponent).join(\"/\");\n break;\n }\n\n if (uriSegment === undefined) {\n // URI is shorter than the route, no match\n // uri: /users\n // route: /users/:userId\n missed = true;\n break;\n }\n\n var dynamicMatch = paramRe.exec(routeSegment);\n\n if (dynamicMatch && !isRootUri) {\n var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n !matchIsNotReserved ? process.env.NODE_ENV !== \"production\" ? invariant(false, \" dynamic segment \\\"\" + dynamicMatch[1] + \"\\\" is a reserved name. Please use a different name in path \\\"\" + route.path + \"\\\".\") : invariant(false) : void 0;\n var value = decodeURIComponent(uriSegment);\n params[dynamicMatch[1]] = value;\n } else if (routeSegment !== uriSegment) {\n // Current segments don't match, not dynamic, not splat, so no match\n // uri: /users/123/settings\n // route: /users/:id/profile\n missed = true;\n break;\n }\n }\n\n if (!missed) {\n match = {\n route: route,\n params: params,\n uri: \"/\" + uriSegments.slice(0, index).join(\"/\")\n };\n break;\n }\n }\n\n return match || default_ || null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\n\n\nvar match = function match(path, uri) {\n return pick([{\n path: path\n }], uri);\n}; ////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files. Relative URIs\n// in the browser can feel awkward because not only can you be \"in a directory\"\n// you can be \"at a file\", too. For example\n//\n// browserSpecResolve('foo', '/bar/') => /bar/foo\n// browserSpecResolve('foo', '/bar') => /foo\n//\n// But on the command line of a file system, it's not as complicated, you can't\n// `cd` from a file, only directories. This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n// \n// // instead of\n// \n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n// cd deeper\n// # not\n// cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\n\n\nvar resolve = function resolve(to, base) {\n // /foo/bar, /baz/qux => /foo/bar\n if (startsWith(to, \"/\")) {\n return to;\n }\n\n var _to$split = to.split(\"?\"),\n toPathname = _to$split[0],\n toQuery = _to$split[1];\n\n var _base$split = base.split(\"?\"),\n basePathname = _base$split[0];\n\n var toSegments = segmentize(toPathname);\n var baseSegments = segmentize(basePathname); // ?a=b, /users?b=c => /users?a=b\n\n if (toSegments[0] === \"\") {\n return addQuery(basePathname, toQuery);\n } // profile, /users/789 => /users/789/profile\n\n\n if (!startsWith(toSegments[0], \".\")) {\n var pathname = baseSegments.concat(toSegments).join(\"/\");\n return addQuery((basePathname === \"/\" ? \"\" : \"/\") + pathname, toQuery);\n } // ./ /users/123 => /users/123\n // ../ /users/123 => /users\n // ../.. /users/123 => /\n // ../../one /a/b/c/d => /a/b/one\n // .././one /a/b/c/d => /a/b/c/one\n\n\n var allSegments = baseSegments.concat(toSegments);\n var segments = [];\n\n for (var i = 0, l = allSegments.length; i < l; i++) {\n var segment = allSegments[i];\n if (segment === \"..\") segments.pop();else if (segment !== \".\") segments.push(segment);\n }\n\n return addQuery(\"/\" + segments.join(\"/\"), toQuery);\n}; ////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\n\nvar insertParams = function insertParams(path, params) {\n var _path$split = path.split(\"?\"),\n pathBase = _path$split[0],\n _path$split$ = _path$split[1],\n query = _path$split$ === undefined ? \"\" : _path$split$;\n\n var segments = segmentize(pathBase);\n var constructedPath = \"/\" + segments.map(function (segment) {\n var match = paramRe.exec(segment);\n return match ? params[match[1]] : segment;\n }).join(\"/\");\n var _params$location = params.location;\n _params$location = _params$location === undefined ? {} : _params$location;\n var _params$location$sear = _params$location.search,\n search = _params$location$sear === undefined ? \"\" : _params$location$sear;\n var searchSplit = search.split(\"?\")[1] || \"\";\n constructedPath = addQuery(constructedPath, query, searchSplit);\n return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n var filter = function filter(segment) {\n return isDynamic(segment);\n };\n\n var fromString = segmentize(from).filter(filter).sort().join(\"/\");\n var toString = segmentize(to).filter(filter).sort().join(\"/\");\n return fromString === toString;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar paramRe = /^:(.+)/;\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n return segment === \"\";\n};\n\nvar isDynamic = function isDynamic(segment) {\n return paramRe.test(segment);\n};\n\nvar isSplat = function isSplat(segment) {\n return segment && segment[0] === \"*\";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n score += SEGMENT_POINTS;\n if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n return score;\n }, 0);\n return {\n route: route,\n score: score,\n index: index\n };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n return routes.map(rankRoute).sort(function (a, b) {\n return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n });\n};\n\nvar segmentize = function segmentize(uri) {\n return uri // strip starting/ending slashes\n .replace(/(^\\/+|\\/+$)/g, \"\").split(\"/\");\n};\n\nvar addQuery = function addQuery(pathname) {\n for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n query[_key - 1] = arguments[_key];\n }\n\n query = query.filter(function (q) {\n return q && q.length > 0;\n });\n return pathname + (query && query.length > 0 ? \"?\" + query.join(\"&\") : \"\");\n};\n\nvar reservedNames = [\"uri\", \"path\"];\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\n\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n var obj1Keys = Object.keys(obj1);\n return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n\n\nexport { startsWith, pick, match, resolve, insertParams, validateRedirect, shallowCompare };","var _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar getLocation = function getLocation(source) {\n var _source$location = source.location,\n search = _source$location.search,\n hash = _source$location.hash,\n href = _source$location.href,\n origin = _source$location.origin,\n protocol = _source$location.protocol,\n host = _source$location.host,\n hostname = _source$location.hostname,\n port = _source$location.port;\n var pathname = source.location.pathname;\n\n if (!pathname && href && canUseDOM) {\n var url = new URL(href);\n pathname = url.pathname;\n }\n\n return {\n pathname: encodeURI(decodeURI(pathname)),\n search: search,\n hash: hash,\n href: href,\n origin: origin,\n protocol: protocol,\n host: host,\n hostname: hostname,\n port: port,\n state: source.history.state,\n key: source.history.state && source.history.state.key || \"initial\"\n };\n};\n\nvar createHistory = function createHistory(source, options) {\n var listeners = [];\n var location = getLocation(source);\n var transitioning = false;\n\n var resolveTransition = function resolveTransition() {};\n\n return {\n get location() {\n return location;\n },\n\n get transitioning() {\n return transitioning;\n },\n\n _onTransitionComplete: function _onTransitionComplete() {\n transitioning = false;\n resolveTransition();\n },\n listen: function listen(listener) {\n listeners.push(listener);\n\n var popstateListener = function popstateListener() {\n location = getLocation(source);\n listener({\n location: location,\n action: \"POP\"\n });\n };\n\n source.addEventListener(\"popstate\", popstateListener);\n return function () {\n source.removeEventListener(\"popstate\", popstateListener);\n listeners = listeners.filter(function (fn) {\n return fn !== listener;\n });\n };\n },\n navigate: function navigate(to) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n state = _ref.state,\n _ref$replace = _ref.replace,\n replace = _ref$replace === undefined ? false : _ref$replace;\n\n if (typeof to === \"number\") {\n source.history.go(to);\n } else {\n state = _extends({}, state, {\n key: Date.now() + \"\"\n }); // try...catch iOS Safari limits to 100 pushState calls\n\n try {\n if (transitioning || replace) {\n source.history.replaceState(state, null, to);\n } else {\n source.history.pushState(state, null, to);\n }\n } catch (e) {\n source.location[replace ? \"replace\" : \"assign\"](to);\n }\n }\n\n location = getLocation(source);\n transitioning = true;\n var transition = new Promise(function (res) {\n return resolveTransition = res;\n });\n listeners.forEach(function (listener) {\n return listener({\n location: location,\n action: \"PUSH\"\n });\n });\n return transition;\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\n\n\nvar createMemorySource = function createMemorySource() {\n var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n var searchIndex = initialPath.indexOf(\"?\");\n var initialLocation = {\n pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n search: searchIndex > -1 ? initialPath.substr(searchIndex) : \"\"\n };\n var index = 0;\n var stack = [initialLocation];\n var states = [null];\n return {\n get location() {\n return stack[index];\n },\n\n addEventListener: function addEventListener(name, fn) {},\n removeEventListener: function removeEventListener(name, fn) {},\n history: {\n get entries() {\n return stack;\n },\n\n get index() {\n return index;\n },\n\n get state() {\n return states[index];\n },\n\n pushState: function pushState(state, _, uri) {\n var _uri$split = uri.split(\"?\"),\n pathname = _uri$split[0],\n _uri$split$ = _uri$split[1],\n search = _uri$split$ === undefined ? \"\" : _uri$split$;\n\n index++;\n stack.push({\n pathname: pathname,\n search: search.length ? \"?\" + search : search\n });\n states.push(state);\n },\n replaceState: function replaceState(state, _, uri) {\n var _uri$split2 = uri.split(\"?\"),\n pathname = _uri$split2[0],\n _uri$split2$ = _uri$split2[1],\n search = _uri$split2$ === undefined ? \"\" : _uri$split2$;\n\n stack[index] = {\n pathname: pathname,\n search: search\n };\n states[index] = state;\n },\n go: function go(to) {\n var newIndex = index + to;\n\n if (newIndex < 0 || newIndex > states.length - 1) {\n return;\n }\n\n index = newIndex;\n }\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\n\n\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\n\nvar getSource = function getSource() {\n return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate; ////////////////////////////////////////////////////////////////////////////////\n\nexport { globalHistory, navigate, createHistory, createMemorySource };","var _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nfunction _objectWithoutProperties(obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n/* eslint-disable jsx-a11y/anchor-has-content */\n\n\nimport React, { useContext, createContext } from \"react\";\nimport invariant from \"invariant\";\nimport { polyfill } from \"react-lifecycles-compat\";\nimport { startsWith, pick, resolve, match, insertParams, validateRedirect, shallowCompare } from \"./lib/utils\";\nimport { globalHistory, navigate, createHistory, createMemorySource } from \"./lib/history\"; ////////////////////////////////////////////////////////////////////////////////\n\nvar createNamedContext = function createNamedContext(name, defaultValue) {\n var Ctx = createContext(defaultValue);\n Ctx.displayName = name;\n return Ctx;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Location Context/Provider\n\n\nvar LocationContext = createNamedContext(\"Location\"); // sets up a listener if there isn't one already so apps don't need to be\n// wrapped in some top level provider\n\nvar Location = function Location(_ref) {\n var children = _ref.children;\n return React.createElement(LocationContext.Consumer, null, function (context) {\n return context ? children(context) : React.createElement(LocationProvider, null, children);\n });\n};\n\nvar LocationProvider = function (_React$Component) {\n _inherits(LocationProvider, _React$Component);\n\n function LocationProvider() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, LocationProvider);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n context: _this.getContext(),\n refs: {\n unlisten: null\n }\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n LocationProvider.prototype.getContext = function getContext() {\n var _props$history = this.props.history,\n navigate = _props$history.navigate,\n location = _props$history.location;\n return {\n navigate: navigate,\n location: location\n };\n };\n\n LocationProvider.prototype.componentDidCatch = function componentDidCatch(error, info) {\n if (isRedirect(error)) {\n var _navigate = this.props.history.navigate;\n\n _navigate(error.uri, {\n replace: true\n });\n } else {\n throw error;\n }\n };\n\n LocationProvider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevState.context.location !== this.state.context.location) {\n this.props.history._onTransitionComplete();\n }\n };\n\n LocationProvider.prototype.componentDidMount = function componentDidMount() {\n var _this2 = this;\n\n var refs = this.state.refs,\n history = this.props.history;\n\n history._onTransitionComplete();\n\n refs.unlisten = history.listen(function () {\n Promise.resolve().then(function () {\n // TODO: replace rAF with react deferred update API when it's ready https://github.com/facebook/react/issues/13306\n requestAnimationFrame(function () {\n if (!_this2.unmounted) {\n _this2.setState(function () {\n return {\n context: _this2.getContext()\n };\n });\n }\n });\n });\n });\n };\n\n LocationProvider.prototype.componentWillUnmount = function componentWillUnmount() {\n var refs = this.state.refs;\n this.unmounted = true;\n refs.unlisten();\n };\n\n LocationProvider.prototype.render = function render() {\n var context = this.state.context,\n children = this.props.children;\n return React.createElement(LocationContext.Provider, {\n value: context\n }, typeof children === \"function\" ? children(context) : children || null);\n };\n\n return LocationProvider;\n}(React.Component); ////////////////////////////////////////////////////////////////////////////////\n\n\nLocationProvider.defaultProps = {\n history: globalHistory\n};\nprocess.env.NODE_ENV !== \"production\" ? void 0 : void 0;\n\nvar ServerLocation = function ServerLocation(_ref2) {\n var url = _ref2.url,\n children = _ref2.children;\n var searchIndex = url.indexOf(\"?\");\n var searchExists = searchIndex > -1;\n var pathname = void 0;\n var search = \"\";\n var hash = \"\";\n\n if (searchExists) {\n pathname = url.substring(0, searchIndex);\n search = url.substring(searchIndex);\n } else {\n pathname = url;\n }\n\n return React.createElement(LocationContext.Provider, {\n value: {\n location: {\n pathname: pathname,\n search: search,\n hash: hash\n },\n navigate: function navigate() {\n throw new Error(\"You can't call navigate on the server.\");\n }\n }\n }, children);\n}; ////////////////////////////////////////////////////////////////////////////////\n// Sets baseuri and basepath for nested routers and links\n\n\nvar BaseContext = createNamedContext(\"Base\", {\n baseuri: \"/\",\n basepath: \"/\",\n navigate: globalHistory.navigate\n}); ////////////////////////////////////////////////////////////////////////////////\n// The main event, welcome to the show everybody.\n\nvar Router = function Router(props) {\n return React.createElement(BaseContext.Consumer, null, function (baseContext) {\n return React.createElement(Location, null, function (locationContext) {\n return React.createElement(RouterImpl, _extends({}, baseContext, locationContext, props));\n });\n });\n};\n\nvar RouterImpl = function (_React$PureComponent) {\n _inherits(RouterImpl, _React$PureComponent);\n\n function RouterImpl() {\n _classCallCheck(this, RouterImpl);\n\n return _possibleConstructorReturn(this, _React$PureComponent.apply(this, arguments));\n }\n\n RouterImpl.prototype.render = function render() {\n var _props = this.props,\n location = _props.location,\n _navigate2 = _props.navigate,\n basepath = _props.basepath,\n primary = _props.primary,\n children = _props.children,\n baseuri = _props.baseuri,\n _props$component = _props.component,\n component = _props$component === undefined ? \"div\" : _props$component,\n domProps = _objectWithoutProperties(_props, [\"location\", \"navigate\", \"basepath\", \"primary\", \"children\", \"baseuri\", \"component\"]);\n\n var routes = React.Children.toArray(children).reduce(function (array, child) {\n var routes = createRoute(basepath)(child);\n return array.concat(routes);\n }, []);\n var pathname = location.pathname;\n var match = pick(routes, pathname);\n\n if (match) {\n var params = match.params,\n uri = match.uri,\n route = match.route,\n element = match.route.value; // remove the /* from the end for child routes relative paths\n\n basepath = route.default ? basepath : route.path.replace(/\\*$/, \"\");\n\n var props = _extends({}, params, {\n uri: uri,\n location: location,\n navigate: function navigate(to, options) {\n return _navigate2(resolve(to, uri), options);\n }\n });\n\n var clone = React.cloneElement(element, props, element.props.children ? React.createElement(Router, {\n location: location,\n primary: primary\n }, element.props.children) : undefined); // using 'div' for < 16.3 support\n\n var FocusWrapper = primary ? FocusHandler : component; // don't pass any props to 'div'\n\n var wrapperProps = primary ? _extends({\n uri: uri,\n location: location,\n component: component\n }, domProps) : domProps;\n return React.createElement(BaseContext.Provider, {\n value: {\n baseuri: uri,\n basepath: basepath,\n navigate: props.navigate\n }\n }, React.createElement(FocusWrapper, wrapperProps, clone));\n } else {\n // Not sure if we want this, would require index routes at every level\n // warning(\n // false,\n // `\\n\\nNothing matched:\\n\\t${\n // location.pathname\n // }\\n\\nPaths checked: \\n\\t${routes\n // .map(route => route.path)\n // .join(\n // \"\\n\\t\"\n // )}\\n\\nTo get rid of this warning, add a default NotFound component as child of Router:\n // \\n\\tlet NotFound = () =>
Not Found!
\n // \\n\\t\\n\\t \\n\\t {/* ... */}\\n\\t`\n // );\n return null;\n }\n };\n\n return RouterImpl;\n}(React.PureComponent);\n\nRouterImpl.defaultProps = {\n primary: true\n};\nvar FocusContext = createNamedContext(\"Focus\");\n\nvar FocusHandler = function FocusHandler(_ref3) {\n var uri = _ref3.uri,\n location = _ref3.location,\n component = _ref3.component,\n domProps = _objectWithoutProperties(_ref3, [\"uri\", \"location\", \"component\"]);\n\n return React.createElement(FocusContext.Consumer, null, function (requestFocus) {\n return React.createElement(FocusHandlerImpl, _extends({}, domProps, {\n component: component,\n requestFocus: requestFocus,\n uri: uri,\n location: location\n }));\n });\n}; // don't focus on initial render\n\n\nvar initialRender = true;\nvar focusHandlerCount = 0;\n\nvar FocusHandlerImpl = function (_React$Component2) {\n _inherits(FocusHandlerImpl, _React$Component2);\n\n function FocusHandlerImpl() {\n var _temp2, _this4, _ret2;\n\n _classCallCheck(this, FocusHandlerImpl);\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _ret2 = (_temp2 = (_this4 = _possibleConstructorReturn(this, _React$Component2.call.apply(_React$Component2, [this].concat(args))), _this4), _this4.state = {}, _this4.requestFocus = function (node) {\n if (!_this4.state.shouldFocus && node) {\n node.focus();\n }\n }, _temp2), _possibleConstructorReturn(_this4, _ret2);\n }\n\n FocusHandlerImpl.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n var initial = prevState.uri == null;\n\n if (initial) {\n return _extends({\n shouldFocus: true\n }, nextProps);\n } else {\n var myURIChanged = nextProps.uri !== prevState.uri;\n var navigatedUpToMe = prevState.location.pathname !== nextProps.location.pathname && nextProps.location.pathname === nextProps.uri;\n return _extends({\n shouldFocus: myURIChanged || navigatedUpToMe\n }, nextProps);\n }\n };\n\n FocusHandlerImpl.prototype.componentDidMount = function componentDidMount() {\n focusHandlerCount++;\n this.focus();\n };\n\n FocusHandlerImpl.prototype.componentWillUnmount = function componentWillUnmount() {\n focusHandlerCount--;\n\n if (focusHandlerCount === 0) {\n initialRender = true;\n }\n };\n\n FocusHandlerImpl.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevProps.location !== this.props.location && this.state.shouldFocus) {\n this.focus();\n }\n };\n\n FocusHandlerImpl.prototype.focus = function focus() {\n if (process.env.NODE_ENV === \"test\") {\n // getting cannot read property focus of null in the tests\n // and that bit of global `initialRender` state causes problems\n // should probably figure it out!\n return;\n }\n\n var requestFocus = this.props.requestFocus;\n\n if (requestFocus) {\n requestFocus(this.node);\n } else {\n if (initialRender) {\n initialRender = false;\n } else if (this.node) {\n // React polyfills [autofocus] and it fires earlier than cDM,\n // so we were stealing focus away, this line prevents that.\n if (!this.node.contains(document.activeElement)) {\n this.node.focus();\n }\n }\n }\n };\n\n FocusHandlerImpl.prototype.render = function render() {\n var _this5 = this;\n\n var _props2 = this.props,\n children = _props2.children,\n style = _props2.style,\n requestFocus = _props2.requestFocus,\n _props2$component = _props2.component,\n Comp = _props2$component === undefined ? \"div\" : _props2$component,\n uri = _props2.uri,\n location = _props2.location,\n domProps = _objectWithoutProperties(_props2, [\"children\", \"style\", \"requestFocus\", \"component\", \"uri\", \"location\"]);\n\n return React.createElement(Comp, _extends({\n style: _extends({\n outline: \"none\"\n }, style),\n tabIndex: \"-1\",\n ref: function ref(n) {\n return _this5.node = n;\n }\n }, domProps), React.createElement(FocusContext.Provider, {\n value: this.requestFocus\n }, this.props.children));\n };\n\n return FocusHandlerImpl;\n}(React.Component);\n\npolyfill(FocusHandlerImpl);\n\nvar k = function k() {}; ////////////////////////////////////////////////////////////////////////////////\n\n\nvar forwardRef = React.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n forwardRef = function forwardRef(C) {\n return C;\n };\n}\n\nvar Link = forwardRef(function (_ref4, ref) {\n var innerRef = _ref4.innerRef,\n props = _objectWithoutProperties(_ref4, [\"innerRef\"]);\n\n return React.createElement(BaseContext.Consumer, null, function (_ref5) {\n var basepath = _ref5.basepath,\n baseuri = _ref5.baseuri;\n return React.createElement(Location, null, function (_ref6) {\n var location = _ref6.location,\n navigate = _ref6.navigate;\n\n var to = props.to,\n state = props.state,\n replace = props.replace,\n _props$getProps = props.getProps,\n getProps = _props$getProps === undefined ? k : _props$getProps,\n anchorProps = _objectWithoutProperties(props, [\"to\", \"state\", \"replace\", \"getProps\"]);\n\n var href = resolve(to, baseuri);\n var encodedHref = encodeURI(href);\n var isCurrent = location.pathname === encodedHref;\n var isPartiallyCurrent = startsWith(location.pathname, encodedHref);\n return React.createElement(\"a\", _extends({\n ref: ref || innerRef,\n \"aria-current\": isCurrent ? \"page\" : undefined\n }, anchorProps, getProps({\n isCurrent: isCurrent,\n isPartiallyCurrent: isPartiallyCurrent,\n href: href,\n location: location\n }), {\n href: href,\n onClick: function onClick(event) {\n if (anchorProps.onClick) anchorProps.onClick(event);\n\n if (shouldNavigate(event)) {\n event.preventDefault();\n var shouldReplace = replace;\n\n if (typeof replace !== \"boolean\" && isCurrent) {\n var _location$state = _extends({}, location.state),\n key = _location$state.key,\n restState = _objectWithoutProperties(_location$state, [\"key\"]);\n\n shouldReplace = shallowCompare(_extends({}, state), restState);\n }\n\n navigate(href, {\n state: state,\n replace: shouldReplace\n });\n }\n }\n }));\n });\n });\n});\nLink.displayName = \"Link\";\nprocess.env.NODE_ENV !== \"production\" ? void 0 : void 0; ////////////////////////////////////////////////////////////////////////////////\n\nfunction RedirectRequest(uri) {\n this.uri = uri;\n}\n\nvar isRedirect = function isRedirect(o) {\n return o instanceof RedirectRequest;\n};\n\nvar redirectTo = function redirectTo(to) {\n throw new RedirectRequest(to);\n};\n\nvar RedirectImpl = function (_React$Component3) {\n _inherits(RedirectImpl, _React$Component3);\n\n function RedirectImpl() {\n _classCallCheck(this, RedirectImpl);\n\n return _possibleConstructorReturn(this, _React$Component3.apply(this, arguments));\n } // Support React < 16 with this hook\n\n\n RedirectImpl.prototype.componentDidMount = function componentDidMount() {\n var _props3 = this.props,\n navigate = _props3.navigate,\n to = _props3.to,\n from = _props3.from,\n _props3$replace = _props3.replace,\n replace = _props3$replace === undefined ? true : _props3$replace,\n state = _props3.state,\n noThrow = _props3.noThrow,\n baseuri = _props3.baseuri,\n props = _objectWithoutProperties(_props3, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n Promise.resolve().then(function () {\n var resolvedTo = resolve(to, baseuri);\n navigate(insertParams(resolvedTo, props), {\n replace: replace,\n state: state\n });\n });\n };\n\n RedirectImpl.prototype.render = function render() {\n var _props4 = this.props,\n navigate = _props4.navigate,\n to = _props4.to,\n from = _props4.from,\n replace = _props4.replace,\n state = _props4.state,\n noThrow = _props4.noThrow,\n baseuri = _props4.baseuri,\n props = _objectWithoutProperties(_props4, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n var resolvedTo = resolve(to, baseuri);\n if (!noThrow) redirectTo(insertParams(resolvedTo, props));\n return null;\n };\n\n return RedirectImpl;\n}(React.Component);\n\nvar Redirect = function Redirect(props) {\n return React.createElement(BaseContext.Consumer, null, function (_ref7) {\n var baseuri = _ref7.baseuri;\n return React.createElement(Location, null, function (locationContext) {\n return React.createElement(RedirectImpl, _extends({}, locationContext, {\n baseuri: baseuri\n }, props));\n });\n });\n};\n\nprocess.env.NODE_ENV !== \"production\" ? void 0 : void 0; ////////////////////////////////////////////////////////////////////////////////\n\nvar Match = function Match(_ref8) {\n var path = _ref8.path,\n children = _ref8.children;\n return React.createElement(BaseContext.Consumer, null, function (_ref9) {\n var baseuri = _ref9.baseuri;\n return React.createElement(Location, null, function (_ref10) {\n var navigate = _ref10.navigate,\n location = _ref10.location;\n var resolvedPath = resolve(path, baseuri);\n var result = match(resolvedPath, location.pathname);\n return children({\n navigate: navigate,\n location: location,\n match: result ? _extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null\n });\n });\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n// Hooks\n\n\nvar useLocation = function useLocation() {\n var context = useContext(LocationContext);\n\n if (!context) {\n throw new Error(\"useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n return context.location;\n};\n\nvar useNavigate = function useNavigate() {\n var context = useContext(BaseContext);\n\n if (!context) {\n throw new Error(\"useNavigate hook was used but a BaseContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n return context.navigate;\n};\n\nvar useParams = function useParams() {\n var context = useContext(BaseContext);\n\n if (!context) {\n throw new Error(\"useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n var location = useLocation();\n var results = match(context.basepath, location.pathname);\n return results ? results.params : null;\n};\n\nvar useMatch = function useMatch(path) {\n if (!path) {\n throw new Error(\"useMatch(path: string) requires an argument of a string to match against\");\n }\n\n var context = useContext(BaseContext);\n\n if (!context) {\n throw new Error(\"useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n var location = useLocation();\n var resolvedPath = resolve(path, context.baseuri);\n var result = match(resolvedPath, location.pathname);\n return result ? _extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar stripSlashes = function stripSlashes(str) {\n return str.replace(/(^\\/+|\\/+$)/g, \"\");\n};\n\nvar createRoute = function createRoute(basepath) {\n return function (element) {\n if (!element) {\n return null;\n }\n\n if (element.type === React.Fragment && element.props.children) {\n return React.Children.map(element.props.children, createRoute(basepath));\n }\n\n !(element.props.path || element.props.default || element.type === Redirect) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \": Children of must have a `path` or `default` prop, or be a ``. None found on element type `\" + element.type + \"`\") : invariant(false) : void 0;\n !!(element.type === Redirect && (!element.props.from || !element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \" requires both \\\"from\\\" and \\\"to\\\" props when inside a .\") : invariant(false) : void 0;\n !!(element.type === Redirect && !validateRedirect(element.props.from, element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \" has mismatched dynamic segments, ensure both paths have the exact same dynamic segments.\") : invariant(false) : void 0;\n\n if (element.props.default) {\n return {\n value: element,\n default: true\n };\n }\n\n var elementPath = element.type === Redirect ? element.props.from : element.props.path;\n var path = elementPath === \"/\" ? basepath : stripSlashes(basepath) + \"/\" + stripSlashes(elementPath);\n return {\n value: element,\n default: element.props.default,\n path: element.props.children ? stripSlashes(path) + \"/*\" : path\n };\n };\n};\n\nvar shouldNavigate = function shouldNavigate(event) {\n return !event.defaultPrevented && event.button === 0 && !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}; ////////////////////////////////////////////////////////////////////////\n\n\nexport { Link, Location, LocationProvider, Match, Redirect, Router, ServerLocation, createHistory, createMemorySource, isRedirect, navigate, redirectTo, globalHistory, match as matchPath, useLocation, useNavigate, useParams, useMatch , BaseContext };","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (process.env.NODE_ENV !== 'production') {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}"],"names":["module","exports","self","ReferenceError","__esModule","_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","setPrototypeOf","subClass","superClass","create","constructor","obj","excluded","sourceKeys","keys","indexOf","_setPrototypeOf","o","p","__proto__","getLocation","_source$location","location","search","hash","href","origin","protocol","host","hostname","port","pathname","canUseDOM","URL","encodeURI","decodeURI","state","history","createHistory","options","listeners","transitioning","resolveTransition","_onTransitionComplete","listen","listener","push","popstateListener","action","addEventListener","removeEventListener","filter","fn","navigate","to","_ref","undefined","_ref$replace","replace","go","Date","now","replaceState","pushState","e","transition","Promise","res","forEach","createMemorySource","initialPath","searchIndex","initialLocation","substr","index","stack","states","name","entries","_","uri","_uri$split","split","_uri$split$","_uri$split2","_uri$split2$","newIndex","window","document","createElement","globalHistory","shallowCompare","validateRedirect","insertParams","resolve","match","pick","startsWith","_invariant","_invariant2","default","string","routes","default_","uriPathname","uriSegments","segmentize","isRootUri","ranked","rankRoutes","l","missed","route","params","routeSegments","path","max","Math","routeSegment","uriSegment","isSplat","slice","map","decodeURIComponent","join","dynamicMatch","paramRe","exec","reservedNames","value","isDynamic","segment","test","rankRoute","score","reduce","isRootSegment","SEGMENT_POINTS","sort","a","b","addQuery","_len","query","Array","_key","q","base","_to$split","toPathname","toQuery","basePathname","toSegments","baseSegments","concat","allSegments","segments","pop","_path$split","pathBase","_path$split$","constructedPath","_params$location","_params$location$sear","searchSplit","from","obj1","obj2","obj1Keys","every","factory","__webpack_modules__","__unused_webpack_module","__webpack_exports__","_assign","retTarget","j","_clamp","min","_toBarPerc","_randomInc","status","_removeElement","element","parentNode","removeChild","r","d","_queue","functionQueue","next","shift","__webpack_module_cache__","moduleId","cachedModule","definition","defineProperty","enumerable","get","prop","Symbol","toStringTag","_util__WEBPACK_IMPORTED_MODULE_0__","DEFAULTS","minimum","easing","speed","trickle","trickleSpeed","showSpinner","barSelector","barLabel","spinnerSelector","spinnerLabel","parent","template","localSettings","localStatus","initialPromises","currentPromises","render","getElementById","documentElement","classList","add","progress","id","innerHTML","perc","toBarPerc","bar","querySelector","setAttribute","style","transform","spinner","removeElement","body","appendChild","configure","set","_this","clamppedValue","clamp","offsetWidth","queue","opacity","setTimeout","remove","start","_this2","work","inc","done","force","halfRandom","random","amount","randomInc","clamppedStatus","promise","$promise","_this3","promiseResolution","then","catch","settings","NProgress","matchOperatorsRe","str","TypeError","applyTrailingSlashOption","input","option","hasHtmlSuffix","endsWith","_interopRequireDefault","withPrefix","withAssetPrefix","getGlobalPathPrefix","_objectWithoutPropertiesLoose2","_assertThisInitialized2","_inheritsLoose2","_extends2","_propTypes","_react","_reachRouter","_parsePath","parsePath","_isLocalLink","_rewriteLinkPath","_excluded","prefix","_prefix","getGlobalBasePrefix","isLocalLink","NavLinkPropTypes","activeClassName","activeStyle","object","partiallyActive","bool","GatsbyLinkLocationWrapper","props","Location","_ref2","GatsbyLink","_location","_React$Component","defaultGetProps","_ref3","isPartiallyCurrent","isCurrent","className","Boolean","IOSupported","IntersectionObserver","abortPrefetch","handleRef","bind","_proto","_prefetch","currentPath","rewrittenPath","rewriteLinkPath","parsed","newPathName","___loader","enqueue","componentWillUnmount","io","_this$io","instance","el","abort","unobserve","disconnect","ref","cb","innerRef","current","inViewPort","entry","isIntersecting","intersectionRatio","observe","_this$props","_this$props$getProps","getProps","_onClick","onClick","_onMouseEnter","onMouseEnter","rest","prefixedTo","Link","hovering","button","defaultPrevented","metaKey","altKey","ctrlKey","shiftKey","preventDefault","shouldReplace","___navigate","Component","propTypes","func","isRequired","_default","forwardRef","ABSOLUTE_URL_REGEX","isAbsolute","hashIndex","_utils","_parsePath2","isAbsolutePath","relativeTo","adjustedPath","absolutify","_scrollHandler","ScrollHandler","_useScrollRestoration","useScrollRestoration","ScrollContext","React","nodeInterop","cache","_getRequireWildcardCache","has","newObj","hasPropertyDescriptor","getOwnPropertyDescriptor","desc","_interopRequireWildcard","_sessionStorage","WeakMap","cacheBabelInterop","cacheNodeInterop","createContext","SessionStorage","displayName","args","_stateStorage","_isTicking","_latestKnownScrollY","scrollListener","scrollY","requestAnimationFrame","_saveScroll","windowScroll","position","prevProps","shouldUpdateScroll","scrollTo","scrollToHash","node","substring","scrollIntoView","prevRouterProps","routerProps","save","componentDidMount","scrollPosition","_this$props$location","read","componentDidUpdate","_this$props$location2","Provider","children","GATSBY_ROUTER_SCROLL_STATE","stateKey","getStateKey","sessionStorage","getItem","JSON","parse","storedValue","stringify","setItem","stateKeyBase","identifier","useLocation","useContext","useRef","useLayoutEffect","onScroll","scrollTop","components","plugin","require","plugins","getResourceURLsForPathname","loadPage","loadPageSync","api","defaultReturn","argTransform","results","result","previous","all","on","type","handler","off","splice","emit","evt","mitt","pathAndSearch","charAt","pathCache","Map","matchPaths","trimPathname","rawPathname","newRawPathname","qs","encodeURIComponent","stripPrefix","__BASE_PATH__","setMatchPaths","findMatchPath","trimmedPathname","cleanPath","pickPaths","matchPath","originalPath","normalizePagePath","grabMatchParams","findPath","redirect","maybeGetBrowserRedirect","toPath","foundPath","prefetchPathname","loader","StaticQueryContext","StaticQueryDataRenderer","staticQueryData","data","finalData","StaticQuery","Consumer","useStaticQuery","context","isNaN","Number","Error","graphql","supportedPrefetchStrategy","feature","fakeLink","relList","supports","err","support","url","reject","link","onload","onerror","getElementsByTagName","getElementsByName","req","XMLHttpRequest","open","send","preFetched","PageResourceStatus","Success","preferDefault","m","createPageDataUrl","rawPath","s","maybeSearch","__PATH_PREFIX__","doFetch","method","onreadystatechange","readyState","BOT_REGEX","toPageResources","pageData","component","page","componentChunkName","webpackCompilationHash","staticQueryHashes","getServerDataError","json","BaseLoader","loadComponent","inFlightNetworkRequests","pageDb","inFlightDb","staticQueryDb","pageDataDb","isPrefetchQueueRunning","prefetchQueued","prefetchTriggered","Set","prefetchCompleted","memoizedGet","inFlightPromise","response","delete","setApiRunner","apiRunner","prefetchDisabled","some","fetchPageDataJson","loadObj","pagePath","retries","responseText","jsonPayload","includes","payload","notFound","internalServerError","loadPageDataJson","error","loadAppData","allData","finalResult","componentChunkPromise","pageResources","createdAt","staticQueryBatchPromise","staticQueryHash","staticQueryResults","staticQueryResultsMap","emitter","withErrorDetails","shouldPrefetch","navigator","connection","effectiveType","saveData","doesConnectionSupportPrefetch","userAgent","prefetch","defer","abortC","AbortController","signal","findIndex","_processNextPrefetchBatch","requestIdleCallback","toPrefetch","prefetches","dPromise","doPrefetch","pageDataUrl","prefetchHelper","crossOrigin","as","createComponentUrls","isPageNotFound","appData","___chunkMapping","chunk","ProdLoader","asyncRequires","chunkName","componentUrls","setLoader","_loader","publicLoader","getStaticQueryResults","PageRenderer","pageContext","__params","pageElement","RouteAnnouncerProps","top","width","height","padding","overflow","clip","whiteSpace","border","maybeRedirect","___replace","nextRoute","event","reason","onPreRouteUpdate","prevLocation","onRouteUpdate","___swUpdated","timeoutId","clearTimeout","___webpackCompilationHash","serviceWorker","controller","postMessage","gatsbyApi","reachNavigate","getSavedScrollPosition","RouteAnnouncer","announcementRef","nextProps","pageName","title","pageHeadings","querySelectorAll","textContent","newAnnouncement","innerText","compareLocationProps","nextLocation","RouteUpdates","shouldComponentUpdate","shallowDiffers","_i","reactHydrate","reactRender","EnsureResources","getDerivedStateFromProps","prevState","loadResources","setState","nextState","reactDomClient","createRoot","hydrateRoot","___emitter","___push","reloadStorageKey","apiRunnerAsync","RouteHandler","BaseContext","baseuri","basepath","DataContext","GatsbyRoot","LocationHandler","Router","browserLoc","getSessionStorage","reload","removeItem","message","console","SiteRoot","App","onClientEntryRanRef","performance","mark","focusEl","defaultRenderer","renderer","runRender","rootElement","doc","doScroll","InternalPageRenderer","redirectMap","redirectIgnoreCaseMap","toLowerCase","redirects","ignoreCase","fromPath","register","reg","installingWorker","installing","log","___failedResources","root","pluginOptions","clickHandler","routeThroughBrowserOrApp","hashShouldBeFollowed","pathIsNotHandledByApp","urlsAreOnSameOrigin","authorIsForcingNavigation","anchorsTargetIsEquivalentToSelf","findClosestAnchor","navigationWasHandledElsewhere","slashedPathname","userIsForcingNavigation","_escapeStringRegexp","_gatsby","nodeName","anchor","hasAttribute","ownerDocument","defaultView","destination","pathStartRegEx","hrefHandler","clickedAnchor","SVGAnimatedString","animVal","RegExp","excludePattern","destinationPathname","_catchLinks","onClientEntry","onRouteUpdateDelayed","_accessibleNprogress","defaultOptions","color","_gatsbyApi","styles","head","registerServiceWorker","process","GATSBY_IS_PREVIEW","whiteListLinkRels","prefetchedPathnames","setPathResources","resources","onServiceWorkerActive","active","nodes","headerResources","tagName","getAttribute","src","prefetchedResources","resource","rel","onPostPrefetchPathname","offsetY","getTargetOffset","pageYOffset","clientTop","computedStyles","getComputedStyle","scrollMarginTop","getPropertyValue","getBoundingClientRect","parseInt","onInitialClientRender","offset","_objectWithoutProperties","_classCallCheck","Constructor","_possibleConstructorReturn","_inherits","writable","configurable","createNamedContext","defaultValue","Ctx","LocationContext","LocationProvider","_temp","getContext","refs","unlisten","_props$history","componentDidCatch","info","isRedirect","_navigate","unmounted","defaultProps","ServerLocation","baseContext","locationContext","RouterImpl","_React$PureComponent","_props","_navigate2","primary","_props$component","domProps","array","child","createRoute","clone","FocusWrapper","FocusHandler","wrapperProps","FocusContext","requestFocus","FocusHandlerImpl","initialRender","focusHandlerCount","_React$Component2","_temp2","_this4","_len2","_key2","shouldFocus","focus","myURIChanged","navigatedUpToMe","contains","activeElement","_this5","_props2","_props2$component","Comp","outline","tabIndex","n","k","C","_ref4","_ref5","_ref6","_props$getProps","anchorProps","encodedHref","shouldNavigate","_location$state","restState","RedirectRequest","redirectTo","RedirectImpl","_React$Component3","_props3","_props3$replace","noThrow","resolvedTo","_props4","Redirect","_ref7","Match","_ref8","_ref9","_ref10","resolvedPath","useNavigate","useParams","useMatch","stripSlashes","elementPath","condition","format","c","f","argIndex","framesToPop","_arrayLikeToArray","arr","len","arr2","_inheritsLoose","_iterableToArray","iter","iterator","_toConsumableArray","isArray","arrayLikeToArray","iterableToArray","unsupportedIterableToArray","_unsupportedIterableToArray","minLen","toString"],"sourceRoot":""} \ No newline at end of file diff --git a/books/index.html b/books/index.html new file mode 100644 index 0000000000..4ebc324cd6 --- /dev/null +++ b/books/index.html @@ -0,0 +1 @@ +Sabertaz Blog
Daily I Learned Notes
Written by sabertazimi
awesome-notes
Copyright © SabertazBuilt with React and GatsbyLast Built Time 2022/4/16 10:40:24
\ No newline at end of file diff --git a/books/index.html.gz b/books/index.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..c55c86025ee72fd6443cd09aa84e4da5ea1fd9bd GIT binary patch literal 48038 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,n<1/6?e+6*n*(t-e):n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function s(e){return u(e)/255}function u(e){return parseInt(e,16)}var f={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};function d(e){var t,n,r,o={r:0,g:0,b:0},c=1,d=null,p=null,m=null,v=!1,y=!1;return"string"==typeof e&&(e=function(e){if(0===(e=e.trim().toLowerCase()).length)return!1;var t=!1;if(f[e])e=f[e],t=!0;else if("transparent"===e)return{r:0,g:0,b:0,a:0,format:"name"};var n=h.rgb.exec(e);if(n)return{r:n[1],g:n[2],b:n[3]};if(n=h.rgba.exec(e))return{r:n[1],g:n[2],b:n[3],a:n[4]};if(n=h.hsl.exec(e))return{h:n[1],s:n[2],l:n[3]};if(n=h.hsla.exec(e))return{h:n[1],s:n[2],l:n[3],a:n[4]};if(n=h.hsv.exec(e))return{h:n[1],s:n[2],v:n[3]};if(n=h.hsva.exec(e))return{h:n[1],s:n[2],v:n[3],a:n[4]};if(n=h.hex8.exec(e))return{r:u(n[1]),g:u(n[2]),b:u(n[3]),a:s(n[4]),format:t?"name":"hex8"};if(n=h.hex6.exec(e))return{r:u(n[1]),g:u(n[2]),b:u(n[3]),format:t?"name":"hex"};if(n=h.hex4.exec(e))return{r:u(n[1]+n[1]),g:u(n[2]+n[2]),b:u(n[3]+n[3]),a:s(n[4]+n[4]),format:t?"name":"hex8"};if(n=h.hex3.exec(e))return{r:u(n[1]+n[1]),g:u(n[2]+n[2]),b:u(n[3]+n[3]),format:t?"name":"hex"};return!1}(e)),"object"==typeof e&&(g(e.r)&&g(e.g)&&g(e.b)?(t=e.r,n=e.g,r=e.b,o={r:255*a(t,255),g:255*a(n,255),b:255*a(r,255)},v=!0,y="%"===String(e.r).substr(-1)?"prgb":"rgb"):g(e.h)&&g(e.s)&&g(e.v)?(d=i(e.s),p=i(e.v),o=function(e,t,n){e=6*a(e,360),t=a(t,100),n=a(n,100);var r=Math.floor(e),o=e-r,i=n*(1-t),c=n*(1-o*t),l=n*(1-(1-o)*t),s=r%6;return{r:255*[n,c,i,i,l,n][s],g:255*[l,n,n,c,i,i][s],b:255*[i,i,l,n,n,c][s]}}(e.h,d,p),v=!0,y="hsv"):g(e.h)&&g(e.s)&&g(e.l)&&(d=i(e.s),m=i(e.l),o=function(e,t,n){var r,o,i;if(e=a(e,360),t=a(t,100),n=a(n,100),0===t)o=n,i=n,r=n;else{var c=n<.5?n*(1+t):n+t-n*t,s=2*n-c;r=l(s,c,e+1/3),o=l(s,c,e),i=l(s,c,e-1/3)}return{r:255*r,g:255*o,b:255*i}}(e.h,d,m),v=!0,y="hsl"),Object.prototype.hasOwnProperty.call(e,"a")&&(c=e.a)),c=function(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}(c),{ok:v,format:e.format||y,r:Math.min(255,Math.max(o.r,0)),g:Math.min(255,Math.max(o.g,0)),b:Math.min(255,Math.max(o.b,0)),a:c}}var p="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)",m="[\\s|\\(]+("+p+")[,|\\s]+("+p+")[,|\\s]+("+p+")\\s*\\)?",v="[\\s|\\(]+("+p+")[,|\\s]+("+p+")[,|\\s]+("+p+")[,|\\s]+("+p+")\\s*\\)?",h={CSS_UNIT:new RegExp(p),rgb:new RegExp("rgb"+m),rgba:new RegExp("rgba"+v),hsl:new RegExp("hsl"+m),hsla:new RegExp("hsla"+v),hsv:new RegExp("hsv"+m),hsva:new RegExp("hsva"+v),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function g(e){return Boolean(h.CSS_UNIT.exec(String(e)))}var y=[{index:7,opacity:.15},{index:6,opacity:.25},{index:5,opacity:.3},{index:5,opacity:.45},{index:5,opacity:.65},{index:5,opacity:.85},{index:4,opacity:.9},{index:3,opacity:.95},{index:2,opacity:.97},{index:1,opacity:.98}];function b(e){var t=function(e,t,n){e=a(e,255),t=a(t,255),n=a(n,255);var r=Math.max(e,t,n),o=Math.min(e,t,n),i=0,c=r,l=r-o,s=0===r?0:l/r;if(r===o)i=0;else{switch(r){case e:i=(t-n)/l+(t=60&&Math.round(e.h)<=240?n?Math.round(e.h)-2*t:Math.round(e.h)+2*t:n?Math.round(e.h)+2*t:Math.round(e.h)-2*t)<0?r+=360:r>=360&&(r-=360),r}function C(e,t,n){return 0===e.h&&0===e.s?e.s:((r=n?e.s-.16*t:4===t?e.s+.16:e.s+.05*t)>1&&(r=1),n&&5===t&&r>.1&&(r=.1),r<.06&&(r=.06),Number(r.toFixed(2)));var r}function k(e,t,n){var r;return(r=n?e.v+.05*t:e.v-.15*t)>1&&(r=1),Number(r.toFixed(2))}function Z(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],r=d(e),o=5;o>0;o-=1){var a=b(r),i=E(d({h:x(a,o,!0),s:C(a,o,!0),v:k(a,o,!0)}));n.push(i)}n.push(E(r));for(var c=1;c<=4;c+=1){var l=b(r),s=E(d({h:x(l,c),s:C(l,c),v:k(l,c)}));n.push(s)}return"dark"===t.theme?y.map((function(e){var r=e.index,o=e.opacity;return E(w(d(t.backgroundColor||"#141414"),d(n[r]),100*o))})):n}var O={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1890FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},S={},N={};Object.keys(O).forEach((function(e){S[e]=Z(O[e]),S[e].primary=S[e][5],N[e]=Z(O[e],{theme:"dark",backgroundColor:"#141414"}),N[e].primary=N[e][5]}));S.red,S.volcano,S.gold,S.orange,S.yellow,S.lime,S.green,S.cyan,S.blue,S.geekblue,S.purple,S.magenta,S.grey;var M=n(7294),P=n(7840),A=n(7759),T=n(119);function I(e,t){(0,P.ZP)(e,"[@ant-design/icons] ".concat(t))}function R(e){return"object"===(0,o.Z)(e)&&"string"==typeof e.name&&"string"==typeof e.theme&&("object"===(0,o.Z)(e.icon)||"function"==typeof e.icon)}function F(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).reduce((function(t,n){var r=e[n];if("class"===n)t.className=r,delete t.class;else t[n]=r;return t}),{})}function j(e,t,n){return n?M.createElement(e.tag,(0,r.Z)((0,r.Z)({key:t},F(e.attrs)),n),(e.children||[]).map((function(n,r){return j(n,"".concat(t,"-").concat(e.tag,"-").concat(r))}))):M.createElement(e.tag,(0,r.Z)({key:t},F(e.attrs)),(e.children||[]).map((function(n,r){return j(n,"".concat(t,"-").concat(e.tag,"-").concat(r))})))}function L(e){return Z(e)[0]}function _(e){return e?Array.isArray(e)?e:[e]:[]}var D={width:"1em",height:"1em",fill:"currentColor","aria-hidden":"true",focusable:"false"},z="\n.anticon {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n",V=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:z,t=(0,M.useContext)(T.Z),n=t.csp;(0,M.useEffect)((function(){(0,A.hq)(e,"@ant-design-icons",{prepend:!0,csp:n})}),[])}},6027:function(e,t,n){"use strict";n.d(t,{He:function(){return h},Ld:function(){return M},eC:function(){return b},f3:function(){return v},iG:function(){return y},rS:function(){return w},sb:function(){return k},ys:function(){return m}});var r=n(9439),o=n(8052),a=n(136),i=n(2963),c=n(1120),l=n(5671),s=n(3144),u=n(3907),f=n(7294);function d(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=(0,c.Z)(e);if(t){var o=(0,c.Z)(this).constructor;n=Reflect.construct(r,arguments,o)}else n=r.apply(this,arguments);return(0,i.Z)(this,n)}}var p=Symbol.for("Animated:node"),m=function(e){return e&&e[p]},v=function(e,t){return(0,u.dE)(e,p,t)},h=function(e){return e&&e[p]&&e[p].getPayload()},g=function(){function e(){(0,l.Z)(this,e),this.payload=void 0,v(this,this)}return(0,s.Z)(e,[{key:"getPayload",value:function(){return this.payload||[]}}]),e}(),y=function(e){(0,a.Z)(n,e);var t=d(n);function n(e){var r;return(0,l.Z)(this,n),(r=t.call(this)).done=!0,r.elapsedTime=void 0,r.lastPosition=void 0,r.lastVelocity=void 0,r.v0=void 0,r.durationProgress=0,r._value=e,u.is.num(r._value)&&(r.lastPosition=r._value),r}return(0,s.Z)(n,[{key:"getPayload",value:function(){return[this]}},{key:"getValue",value:function(){return this._value}},{key:"setValue",value:function(e,t){return u.is.num(e)&&(this.lastPosition=e,t&&(e=Math.round(e/t)*t,this.done&&(this.lastPosition=e))),this._value!==e&&(this._value=e,!0)}},{key:"reset",value:function(){var e=this.done;this.done=!1,u.is.num(this._value)&&(this.elapsedTime=0,this.durationProgress=0,this.lastPosition=this._value,e&&(this.lastVelocity=null),this.v0=null)}}],[{key:"create",value:function(e){return new n(e)}}]),n}(g),b=function(e){(0,a.Z)(n,e);var t=d(n);function n(e){var r;return(0,l.Z)(this,n),(r=t.call(this,0))._string=null,r._toString=void 0,r._toString=(0,u.mD)({output:[e,e]}),r}return(0,s.Z)(n,[{key:"getValue",value:function(){var e=this._string;return null==e?this._string=this._toString(this._value):e}},{key:"setValue",value:function(e){if(u.is.str(e)){if(e==this._string)return!1;this._string=e,this._value=1}else{if(!(0,o.Z)((0,c.Z)(n.prototype),"setValue",this).call(this,e))return!1;this._string=null}return!0}},{key:"reset",value:function(e){e&&(this._toString=(0,u.mD)({output:[this.getValue(),e]})),this._value=0,(0,o.Z)((0,c.Z)(n.prototype),"reset",this).call(this)}}],[{key:"create",value:function(e){return new n(e)}}]),n}(y),E={dependencies:null},w=function(e){(0,a.Z)(n,e);var t=d(n);function n(e){var r;return(0,l.Z)(this,n),(r=t.call(this)).source=e,r.setValue(e),r}return(0,s.Z)(n,[{key:"getValue",value:function(e){var t={};return(0,u.rU)(this.source,(function(n,r){var o;(o=n)&&o[p]===o?t[r]=n.getValue(e):(0,u.j$)(n)?t[r]=(0,u.je)(n):e||(t[r]=n)})),t}},{key:"setValue",value:function(e){this.source=e,this.payload=this._makePayload(e)}},{key:"reset",value:function(){this.payload&&(0,u.S6)(this.payload,(function(e){return e.reset()}))}},{key:"_makePayload",value:function(e){if(e){var t=new Set;return(0,u.rU)(e,this._addToPayload,t),Array.from(t)}}},{key:"_addToPayload",value:function(e){var t=this;E.dependencies&&(0,u.j$)(e)&&E.dependencies.add(e);var n=h(e);n&&(0,u.S6)(n,(function(e){return t.add(e)}))}}]),n}(g),x=function(e){(0,a.Z)(n,e);var t=d(n);function n(e){return(0,l.Z)(this,n),t.call(this,e)}return(0,s.Z)(n,[{key:"getValue",value:function(){return this.source.map((function(e){return e.getValue()}))}},{key:"setValue",value:function(e){var t=this.getPayload();return e.length==t.length?t.map((function(t,n){return t.setValue(e[n])})).some(Boolean):((0,o.Z)((0,c.Z)(n.prototype),"setValue",this).call(this,e.map(C)),!0)}}],[{key:"create",value:function(e){return new n(e)}}]),n}(w);function C(e){return((0,u.Df)(e)?b:y).create(e)}function k(e){var t=m(e);return t?t.constructor:u.is.arr(e)?x:(0,u.Df)(e)?b:y}function Z(){return Z=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},n=t.applyAnimatedValues,r=void 0===n?function(){return!1}:n,o=t.createAnimatedStyle,a=void 0===o?function(e){return new w(e)}:o,i=t.getComponentProps,c=void 0===i?function(e){return e}:i,l={applyAnimatedValues:r,createAnimatedStyle:a,getComponentProps:c},s=function e(t){var n=P(t)||"Anonymous";return(t=u.is.str(t)?e[t]||(e[t]=O(t,l)):t[N]||(t[N]=O(t,l))).displayName="Animated(".concat(n,")"),t};return(0,u.rU)(e,(function(t,n){u.is.arr(e)&&(n=P(t)),s[n]=s(t)})),{animated:s}},P=function(e){return u.is.str(e)?e:e&&u.is.str(e.displayName)?e.displayName:u.is.fun(e)&&e.name||null}},5394:function(e,t,n){"use strict";n.d(t,{Globals:function(){return b.OH},useSpring:function(){return He}});var r=n(7326),o=n(3433),a=n(9439),i=n(8052),c=n(136),l=n(2963),s=n(1120),u=n(9611);var f=n(8814);function d(e,t,n){return d=(0,f.Z)()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&(0,u.Z)(o,n.prototype),o},d.apply(null,arguments)}function p(e){var t="function"==typeof Map?new Map:void 0;return p=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return d(e,arguments,(0,s.Z)(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),(0,u.Z)(r,e)},p(e)}var m=n(5861),v=n(3144),h=n(5671),g=n(7757),y=n.n(g),b=n(3907),E=n(7294),w=n(6027);function x(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=(0,s.Z)(e);if(t){var o=(0,s.Z)(this).constructor;n=Reflect.construct(r,arguments,o)}else n=r.apply(this,arguments);return(0,l.Z)(this,n)}}function C(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return k(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return k(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,o=function(){};return{s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,i=!0,c=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return i=e.done,e},e:function(e){c=!0,a=e},f:function(){try{i||null==n.return||n.return()}finally{if(c)throw a}}}}function k(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?t-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:P,n=T;e.default&&!0!==e.default&&(e=e.default,n=Object.keys(e));var r,o={},a=C(n);try{for(a.s();!(r=a.n()).done;){var i=r.value,c=t(e[i],i);b.is.und(c)||(o[i]=c)}}catch(l){a.e(l)}finally{a.f()}return o},T=["config","onProps","onStart","onChange","onPause","onResume","onRest"],I={config:1,from:1,to:1,ref:1,loop:1,reset:1,pause:1,cancel:1,reverse:1,immediate:1,default:1,delay:1,onProps:1,onStart:1,onChange:1,onPause:1,onResume:1,onRest:1,onResolve:1,items:1,trail:1,sort:1,expires:1,initial:1,enter:1,update:1,leave:1,children:1,onDestroyed:1,keys:1,callId:1,parentId:1};function R(e){var t=function(e){var t={},n=0;if((0,b.rU)(e,(function(e,r){I[r]||(t[r]=e,n++)})),n)return t}(e);if(t){var n={to:t};return(0,b.rU)(e,(function(e,r){return r in t||(n[r]=e)})),n}return Z({},e)}function F(e){return e=(0,b.je)(e),b.is.arr(e)?e.map(F):(0,b.Df)(e)?b.OH.createStringInterpolator({range:[0,1],output:[e,e]})(1):e}function j(e){for(var t in e)return!0;return!1}function L(e){return b.is.fun(e)||b.is.arr(e)&&b.is.obj(e[0])}function _(e,t){var n;null==(n=e.ref)||n.delete(e),null==t||t.delete(e)}function D(e,t){var n;t&&e.ref!==t&&(null==(n=e.ref)||n.delete(e),t.add(e),e.ref=t)}var z=1.70158,V=1.525*z,B=z+1,H=2*Math.PI/3,W=2*Math.PI/4.5,U=function(e){var t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},q=Z({},{tension:170,friction:26},{mass:1,damping:1,easing:{linear:function(e){return e},easeInQuad:function(e){return e*e},easeOutQuad:function(e){return 1-(1-e)*(1-e)},easeInOutQuad:function(e){return e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2},easeInCubic:function(e){return e*e*e},easeOutCubic:function(e){return 1-Math.pow(1-e,3)},easeInOutCubic:function(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2},easeInQuart:function(e){return e*e*e*e},easeOutQuart:function(e){return 1-Math.pow(1-e,4)},easeInOutQuart:function(e){return e<.5?8*e*e*e*e:1-Math.pow(-2*e+2,4)/2},easeInQuint:function(e){return e*e*e*e*e},easeOutQuint:function(e){return 1-Math.pow(1-e,5)},easeInOutQuint:function(e){return e<.5?16*e*e*e*e*e:1-Math.pow(-2*e+2,5)/2},easeInSine:function(e){return 1-Math.cos(e*Math.PI/2)},easeOutSine:function(e){return Math.sin(e*Math.PI/2)},easeInOutSine:function(e){return-(Math.cos(Math.PI*e)-1)/2},easeInExpo:function(e){return 0===e?0:Math.pow(2,10*e-10)},easeOutExpo:function(e){return 1===e?1:1-Math.pow(2,-10*e)},easeInOutExpo:function(e){return 0===e?0:1===e?1:e<.5?Math.pow(2,20*e-10)/2:(2-Math.pow(2,-20*e+10))/2},easeInCirc:function(e){return 1-Math.sqrt(1-Math.pow(e,2))},easeOutCirc:function(e){return Math.sqrt(1-Math.pow(e-1,2))},easeInOutCirc:function(e){return e<.5?(1-Math.sqrt(1-Math.pow(2*e,2)))/2:(Math.sqrt(1-Math.pow(-2*e+2,2))+1)/2},easeInBack:function(e){return B*e*e*e-z*e*e},easeOutBack:function(e){return 1+B*Math.pow(e-1,3)+z*Math.pow(e-1,2)},easeInOutBack:function(e){return e<.5?Math.pow(2*e,2)*(7.189819*e-V)/2:(Math.pow(2*e-2,2)*((V+1)*(2*e-2)+V)+2)/2},easeInElastic:function(e){return 0===e?0:1===e?1:-Math.pow(2,10*e-10)*Math.sin((10*e-10.75)*H)},easeOutElastic:function(e){return 0===e?0:1===e?1:Math.pow(2,-10*e)*Math.sin((10*e-.75)*H)+1},easeInOutElastic:function(e){return 0===e?0:1===e?1:e<.5?-Math.pow(2,20*e-10)*Math.sin((20*e-11.125)*W)/2:Math.pow(2,-20*e+10)*Math.sin((20*e-11.125)*W)/2+1},easeInBounce:function(e){return 1-U(1-e)},easeOutBounce:U,easeInOutBounce:function(e){return e<.5?(1-U(1-2*e))/2:(1+U(2*e-1))/2}}.linear,clamp:!1}),K=(0,v.Z)((function e(){(0,h.Z)(this,e),this.tension=void 0,this.friction=void 0,this.frequency=void 0,this.damping=void 0,this.mass=void 0,this.velocity=0,this.restVelocity=void 0,this.precision=void 0,this.progress=void 0,this.duration=void 0,this.easing=void 0,this.clamp=void 0,this.bounce=void 0,this.decay=void 0,this.round=void 0,Object.assign(this,q)}));function Q(e,t){if(b.is.und(t.decay)){var n=!b.is.und(t.tension)||!b.is.und(t.friction);!n&&b.is.und(t.frequency)&&b.is.und(t.damping)&&b.is.und(t.mass)||(e.duration=void 0,e.decay=void 0),n&&(e.frequency=void 0)}else e.duration=void 0}var Y=[],X=(0,v.Z)((function e(){(0,h.Z)(this,e),this.changed=!1,this.values=Y,this.toValues=null,this.fromValues=Y,this.to=void 0,this.from=void 0,this.config=new K,this.immediate=!1}));function G(e,t){var n=t.key,r=t.props,o=t.defaultProps,a=t.state,i=t.actions;return new Promise((function(t,c){var l,s,u,f=S(null!=(l=r.cancel)?l:null==o?void 0:o.cancel,n);if(f)v();else{b.is.und(r.pause)||(a.paused=S(r.pause,n));var d=null==o?void 0:o.pause;!0!==d&&(d=a.paused||S(d,n)),s=O(r.delay||0,n),d?(a.resumeQueue.add(m),i.pause()):(i.resume(),m())}function p(){a.resumeQueue.add(m),a.timeouts.delete(u),u.cancel(),s=u.time-b.Wn.now()}function m(){s>0&&!b.OH.skipAnimation?(a.delayed=!0,u=b.Wn.setTimeout(v,s),a.pauseQueue.add(p),a.timeouts.add(u)):v()}function v(){a.delayed&&(a.delayed=!1),a.pauseQueue.delete(p),a.timeouts.delete(u),e<=(a.cancelId||0)&&(f=!0);try{i.start(Z({},r,{callId:e,cancel:f}),t)}catch(n){c(n)}}}))}var $=function(e,t){return 1==t.length?t[0]:t.some((function(e){return e.cancelled}))?te(e.get()):t.every((function(e){return e.noop}))?J(e.get()):ee(e.get(),t.every((function(e){return e.finished})))},J=function(e){return{value:e,noop:!0,finished:!0,cancelled:!1}},ee=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return{value:e,finished:t,cancelled:n}},te=function(e){return{value:e,cancelled:!0,finished:!1}};function ne(e,t,n,r){var o=t.callId,a=t.parentId,i=t.onRest,c=n.asyncTo,l=n.promise;return a||e!==c||t.reset?n.promise=(0,m.Z)(y().mark((function s(){var u,f,d,p,v,h,g,E;return y().wrap((function(s){for(;;)switch(s.prev=s.next){case 0:if(n.asyncId=o,n.asyncTo=e,u=A(t,(function(e,t){return"onRest"===t?void 0:e})),p=new Promise((function(e,t){return f=e,d=t})),v=function(e){var t=o<=(n.cancelId||0)&&te(r)||o!==n.asyncId&&ee(r,!1);if(t)throw e.result=t,d(e),e},h=function(e,t){var a=new oe,i=new ae;return(0,m.Z)(y().mark((function c(){var l,s;return y().wrap((function(c){for(;;)switch(c.prev=c.next){case 0:if(!b.OH.skipAnimation){c.next=5;break}throw re(n),i.result=ee(r,!1),d(i),i;case 5:return v(a),(l=b.is.obj(e)?Z({},e):Z({},t,{to:e})).parentId=o,(0,b.rU)(u,(function(e,t){b.is.und(l[t])&&(l[t]=e)})),c.next=11,r.start(l);case 11:if(s=c.sent,v(a),!n.paused){c.next=16;break}return c.next=16,new Promise((function(e){n.resumeQueue.add(e)}));case 16:return c.abrupt("return",s);case 17:case"end":return c.stop()}}),c)})))()},!b.OH.skipAnimation){s.next=9;break}return re(n),s.abrupt("return",ee(r,!1));case 9:return s.prev=9,E=b.is.arr(e)?function(){var e=(0,m.Z)(y().mark((function e(t){var n,r,o;return y().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=C(t),e.prev=1,n.s();case 3:if((r=n.n()).done){e.next=9;break}return o=r.value,e.next=7,h(o);case 7:e.next=3;break;case 9:e.next=14;break;case 11:e.prev=11,e.t0=e.catch(1),n.e(e.t0);case 14:return e.prev=14,n.f(),e.finish(14);case 17:case"end":return e.stop()}}),e,null,[[1,11,14,17]])})));return function(t){return e.apply(this,arguments)}}()(e):Promise.resolve(e(h,r.stop.bind(r))),s.next=13,Promise.all([E.then(f),p]);case 13:g=ee(r.get(),!0,!1),s.next=27;break;case 16:if(s.prev=16,s.t0=s.catch(9),!(s.t0 instanceof oe)){s.next=22;break}g=s.t0.result,s.next=27;break;case 22:if(!(s.t0 instanceof ae)){s.next=26;break}g=s.t0.result,s.next=27;break;case 26:throw s.t0;case 27:return s.prev=27,o==n.asyncId&&(n.asyncId=a,n.asyncTo=a?c:void 0,n.promise=a?l:void 0),s.finish(27);case 30:return b.is.fun(i)&&b.Wn.batchedUpdates((function(){i(g,r,r.item)})),s.abrupt("return",g);case 32:case"end":return s.stop()}}),s,null,[[9,16,27,30]])})))():l}function re(e,t){(0,b.yl)(e.timeouts,(function(e){return e.cancel()})),e.pauseQueue.clear(),e.resumeQueue.clear(),e.asyncId=e.asyncTo=e.promise=void 0,t&&(e.cancelId=t)}var oe=function(e){(0,c.Z)(n,e);var t=x(n);function n(){var e;return(0,h.Z)(this,n),(e=t.call(this,"An async animation has been interrupted. You see this error because you forgot to use `await` or `.catch(...)` on its returned promise.")).result=void 0,e}return(0,v.Z)(n)}(p(Error)),ae=function(e){(0,c.Z)(n,e);var t=x(n);function n(){var e;return(0,h.Z)(this,n),(e=t.call(this,"SkipAnimationSignal")).result=void 0,e}return(0,v.Z)(n)}(p(Error)),ie=function(e){return e instanceof le},ce=1,le=function(e){(0,c.Z)(n,e);var t=x(n);function n(){var e;(0,h.Z)(this,n);for(var r=arguments.length,o=new Array(r),a=0;a1&&void 0!==arguments[1]&&arguments[1];(0,b.k0)(this,{type:"change",parent:this,value:e,idle:t})}},{key:"_onPriorityChange",value:function(e){this.idle||b.fT.sort(this),(0,b.k0)(this,{type:"priority",parent:this,priority:e})}}]),n}(b.B0),se=Symbol.for("SpringPhase"),ue=function(e){return(1&e[se])>0},fe=function(e){return(2&e[se])>0},de=function(e){return(4&e[se])>0},pe=function(e,t){return t?e[se]|=3:e[se]&=-3},me=function(e,t){return t?e[se]|=4:e[se]&=-5},ve=function(e){(0,c.Z)(n,e);var t=x(n);function n(e,r){var o;if((0,h.Z)(this,n),(o=t.call(this)).key=void 0,o.animation=new X,o.queue=void 0,o.defaultProps={},o._state={paused:!1,delayed:!1,pauseQueue:new Set,resumeQueue:new Set,timeouts:new Set},o._pendingCalls=new Set,o._lastCallId=0,o._lastToId=0,o._memoizedDuration=0,!b.is.und(e)||!b.is.und(r)){var a=b.is.obj(e)?Z({},e):Z({},r,{from:e});b.is.und(a.default)&&(a.default=!0),o.start(a)}return o}return(0,v.Z)(n,[{key:"idle",get:function(){return!(fe(this)||this._state.asyncTo)||de(this)}},{key:"goal",get:function(){return(0,b.je)(this.animation.to)}},{key:"velocity",get:function(){var e=(0,w.ys)(this);return e instanceof w.iG?e.lastVelocity||0:e.getPayload().map((function(e){return e.lastVelocity||0}))}},{key:"hasAnimated",get:function(){return ue(this)}},{key:"isAnimating",get:function(){return fe(this)}},{key:"isPaused",get:function(){return de(this)}},{key:"isDelayed",get:function(){return this._state.delayed}},{key:"advance",value:function(e){var t=this,n=!0,r=!1,o=this.animation,a=o.config,i=o.toValues,c=(0,w.He)(o.to);!c&&(0,b.j$)(o.to)&&(i=(0,b.qo)((0,b.je)(o.to))),o.values.forEach((function(l,s){if(!l.done){var u=l.constructor==w.eC?1:c?c[s].lastPosition:i[s],f=o.immediate,d=u;if(!f){if(d=l.lastPosition,a.tension<=0)return void(l.done=!0);var p,m=l.elapsedTime+=e,v=o.fromValues[s],h=null!=l.v0?l.v0:l.v0=b.is.arr(a.velocity)?a.velocity[s]:a.velocity;if(b.is.und(a.duration))if(a.decay){var g=!0===a.decay?.998:a.decay,y=Math.exp(-(1-g)*m);d=v+h/(1-g)*(1-y),f=Math.abs(l.lastPosition-d)<.1,p=h*y}else{p=null==l.lastVelocity?h:l.lastVelocity;for(var E=a.precision||(v==u?.005:Math.min(1,.001*Math.abs(u-v))),x=a.restVelocity||E/10,C=a.clamp?0:a.bounce,k=!b.is.und(C),Z=v==u?l.v0>0:vx||!(f=Math.abs(u-d)<=E));++S){k&&(d==u||d>u==Z)&&(p=-p*C,d=u),d+=1*(p+=1*((1e-6*-a.tension*(d-u)+.001*-a.friction*p)/a.mass))}}else{var N=1;a.duration>0&&(t._memoizedDuration!==a.duration&&(t._memoizedDuration=a.duration,l.durationProgress>0&&(l.elapsedTime=a.duration*l.durationProgress,m=l.elapsedTime+=e)),N=(N=(a.progress||0)+m/t._memoizedDuration)>1?1:N<0?0:N,l.durationProgress=N),p=((d=v+a.easing(N)*(u-v))-l.lastPosition)/e,f=1==N}l.lastVelocity=p,Number.isNaN(d)&&(console.warn("Got NaN while animating:",t),f=!0)}c&&!c[s].done&&(f=!1),f?l.done=!0:n=!1,l.setValue(d,a.round)&&(r=!0)}}));var l=(0,w.ys)(this),s=l.getValue();if(n){var u=(0,b.je)(o.to);s===u&&!r||a.decay?r&&a.decay&&this._onChange(s):(l.setValue(u),this._onChange(u)),this._stop()}else r&&this._onChange(s)}},{key:"set",value:function(e){var t=this;return b.Wn.batchedUpdates((function(){t._stop(),t._focus(e),t._set(e)})),this}},{key:"pause",value:function(){this._update({pause:!0})}},{key:"resume",value:function(){this._update({pause:!1})}},{key:"finish",value:function(){var e=this;if(fe(this)){var t=this.animation,n=t.to,r=t.config;b.Wn.batchedUpdates((function(){e._onStart(),r.decay||e._set(n,!1),e._stop()}))}return this}},{key:"update",value:function(e){return(this.queue||(this.queue=[])).push(e),this}},{key:"start",value:function(e,t){var n,r=this;return b.is.und(e)?(n=this.queue||[],this.queue=[]):n=[b.is.obj(e)?e:Z({},t,{to:e})],Promise.all(n.map((function(e){return r._update(e)}))).then((function(e){return $(r,e)}))}},{key:"stop",value:function(e){var t=this,n=this.animation.to;return this._focus(this.get()),re(this._state,e&&this._lastCallId),b.Wn.batchedUpdates((function(){return t._stop(n,e)})),this}},{key:"reset",value:function(){this._update({reset:!0})}},{key:"eventObserved",value:function(e){"change"==e.type?this._start():"priority"==e.type&&(this.priority=e.priority+1)}},{key:"_prepareNode",value:function(e){var t=this.key||"",n=e.to,r=e.from;(null==(n=b.is.obj(n)?n[t]:n)||L(n))&&(n=void 0),null==(r=b.is.obj(r)?r[t]:r)&&(r=void 0);var o={to:n,from:r};if(!ue(this)){if(e.reverse){var a=[r,n];n=a[0],r=a[1]}r=(0,b.je)(r),b.is.und(r)?(0,w.ys)(this)||this._set(n):this._set(r)}return o}},{key:"_update",value:function(e,t){var n=this,r=Z({},e),o=this.key,a=this.defaultProps;r.default&&Object.assign(a,A(r,(function(e,t){return/^on/.test(t)?N(e,o):e}))),xe(this,r,"onProps"),Ce(this,"onProps",r,this);var i=this._prepareNode(r);if(Object.isFrozen(this))throw Error("Cannot animate a `SpringValue` object that is frozen. Did you forget to pass your component to `animated(...)` before animating its props?");var c=this._state;return G(++this._lastCallId,{key:o,props:r,defaultProps:a,state:c,actions:{pause:function(){de(n)||(me(n,!0),(0,b.bl)(c.pauseQueue),Ce(n,"onPause",ee(n,he(n,n.animation.to)),n))},resume:function(){de(n)&&(me(n,!1),fe(n)&&n._resume(),(0,b.bl)(c.resumeQueue),Ce(n,"onResume",ee(n,he(n,n.animation.to)),n))},start:this._merge.bind(this,i)}}).then((function(e){if(r.loop&&e.finished&&(!t||!e.noop)){var o=ge(r);if(o)return n._update(o,!0)}return e}))}},{key:"_merge",value:function(e,t,n){var r=this;if(t.cancel)return this.stop(!0),n(te(this));var o=!b.is.und(e.to),a=!b.is.und(e.from);if(o||a){if(!(t.callId>this._lastToId))return n(te(this));this._lastToId=t.callId}var i=this.key,c=this.defaultProps,l=this.animation,s=l.to,u=l.from,f=e.to,d=void 0===f?s:f,p=e.from,m=void 0===p?u:p;if(!a||o||t.default&&!b.is.und(d)||(d=m),t.reverse){var v=[m,d];d=v[0],m=v[1]}var h=!(0,b.Xy)(m,u);h&&(l.from=m),m=(0,b.je)(m);var g=!(0,b.Xy)(d,s);g&&this._focus(d);var y=L(t.to),E=l.config,x=E.decay,C=E.velocity;(o||a)&&(E.velocity=0),t.config&&!y&&function(e,t,n){for(var r in n&&(Q(n=Z({},n),t),t=Z({},n,t)),Q(e,t),Object.assign(e,t),q)null==e[r]&&(e[r]=q[r]);var o=e.mass,a=e.frequency,i=e.damping;b.is.und(a)||(a<.01&&(a=.01),i<0&&(i=0),e.tension=Math.pow(2*Math.PI/a,2)*o,e.friction=4*Math.PI*i*o/a)}(E,O(t.config,i),t.config!==c.config?O(c.config,i):void 0);var k=(0,w.ys)(this);if(!k||b.is.und(d))return n(ee(this,!0));var N=b.is.und(t.reset)?a&&!t.default:!b.is.und(m)&&S(t.reset,i),M=N?m:this.get(),P=F(d),A=b.is.num(P)||b.is.arr(P)||(0,b.Df)(P),T=!y&&(!A||S(c.immediate||t.immediate,i));if(g){var I=(0,w.sb)(d);if(I!==k.constructor){if(!T)throw Error("Cannot animate between ".concat(k.constructor.name," and ").concat(I.name,', as the "to" prop suggests'));k=this._set(P)}}var R=k.constructor,j=(0,b.j$)(d),_=!1;if(!j){var D=N||!ue(this)&&h;(g||D)&&(j=!(_=(0,b.Xy)(F(M),P))),((0,b.Xy)(l.immediate,T)||T)&&(0,b.Xy)(E.decay,x)&&(0,b.Xy)(E.velocity,C)||(j=!0)}if(_&&fe(this)&&(l.changed&&!N?j=!0:j||this._stop(s)),!y&&((j||(0,b.j$)(s))&&(l.values=k.getPayload(),l.toValues=(0,b.j$)(d)?null:R==w.eC?[1]:(0,b.qo)(P)),l.immediate!=T&&(l.immediate=T,T||N||this._set(s)),j)){var z=l.onRest;(0,b.S6)(we,(function(e){return xe(r,t,e)}));var V=ee(this,he(this,s));(0,b.bl)(this._pendingCalls,V),this._pendingCalls.add(n),l.changed&&b.Wn.batchedUpdates((function(){l.changed=!N,null==z||z(V,r),N?O(c.onRest,V):null==l.onStart||l.onStart(V,r)}))}N&&this._set(M),y?n(ne(t.to,t,this._state,this)):j?this._start():fe(this)&&!g?this._pendingCalls.add(n):n(J(M))}},{key:"_focus",value:function(e){var t=this.animation;e!==t.to&&((0,b.Ll)(this)&&this._detach(),t.to=e,(0,b.Ll)(this)&&this._attach())}},{key:"_attach",value:function(){var e=0,t=this.animation.to;(0,b.j$)(t)&&((0,b.UI)(t,this),ie(t)&&(e=t.priority+1)),this.priority=e}},{key:"_detach",value:function(){var e=this.animation.to;(0,b.j$)(e)&&(0,b.iL)(e,this)}},{key:"_set",value:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=(0,b.je)(e);if(!b.is.und(r)){var o=(0,w.ys)(this);if(!o||!(0,b.Xy)(r,o.getValue())){var a=(0,w.sb)(r);o&&o.constructor==a?o.setValue(r):(0,w.f3)(this,a.create(r)),o&&b.Wn.batchedUpdates((function(){t._onChange(r,n)}))}}return(0,w.ys)(this)}},{key:"_onStart",value:function(){var e=this.animation;e.changed||(e.changed=!0,Ce(this,"onStart",ee(this,he(this,e.to)),this))}},{key:"_onChange",value:function(e,t){t||(this._onStart(),O(this.animation.onChange,e,this)),O(this.defaultProps.onChange,e,this),(0,i.Z)((0,s.Z)(n.prototype),"_onChange",this).call(this,e,t)}},{key:"_start",value:function(){var e=this.animation;(0,w.ys)(this).reset((0,b.je)(e.to)),e.immediate||(e.fromValues=e.values.map((function(e){return e.lastPosition}))),fe(this)||(pe(this,!0),de(this)||this._resume())}},{key:"_resume",value:function(){b.OH.skipAnimation?this.finish():b.fT.start(this)}},{key:"_stop",value:function(e,t){if(fe(this)){pe(this,!1);var n=this.animation;(0,b.S6)(n.values,(function(e){e.done=!0})),n.toValues&&(n.onChange=n.onPause=n.onResume=void 0),(0,b.k0)(this,{type:"idle",parent:this});var r=t?te(this.get()):ee(this.get(),he(this,null!=e?e:n.to));(0,b.bl)(this._pendingCalls,r),n.changed&&(n.changed=!1,Ce(this,"onRest",r,this))}}}]),n}(le);function he(e,t){var n=F(t),r=F(e.get());return(0,b.Xy)(r,n)}function ge(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e.loop,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.to,r=O(t);if(r){var o=!0!==r&&R(r),a=(o||e).reverse,i=!o||o.reset;return ye(Z({},e,{loop:t,default:!1,pause:void 0,to:!a||L(n)?n:void 0,from:i?e.from:void 0,reset:i},o))}}function ye(e){var t=e=R(e),n=t.to,r=t.from,o=new Set;return b.is.obj(n)&&Ee(n,o),b.is.obj(r)&&Ee(r,o),e.keys=o.size?Array.from(o):null,e}function be(e){var t=ye(e);return b.is.und(t.default)&&(t.default=A(t)),t}function Ee(e,t){(0,b.rU)(e,(function(e,n){return null!=e&&t.add(n)}))}var we=["onStart","onRest","onChange","onPause","onResume"];function xe(e,t,n){e.animation[n]=t[n]!==M(t,n)?N(t[n],e.key):void 0}function Ce(e,t){for(var n,r,o,a,i,c,l=arguments.length,s=new Array(l>2?l-2:0),u=2;u0,c=this._changed.size>0;(i&&!this._started||c&&!this._started)&&(this._started=!0,(0,b.yl)(n,(function(t){var n=(0,a.Z)(t,2),r=n[0],o=n[1];o.value=e.get(),r(o,e,e._item)})));var l=!i&&this._started,s=c||l&&o.size?this.get():null;c&&r.size&&(0,b.yl)(r,(function(t){var n=(0,a.Z)(t,2),r=n[0],o=n[1];o.value=s,r(o,e,e._item)})),l&&(this._started=!1,(0,b.yl)(o,(function(t){var n=(0,a.Z)(t,2),r=n[0],o=n[1];o.value=s,r(o,e,e._item)})))}},{key:"eventObserved",value:function(e){if("change"==e.type)this._changed.add(e.parent),e.idle||this._active.add(e.parent);else{if("idle"!=e.type)return;this._active.delete(e.parent)}b.Wn.onFrame(this._onFrame)}}]),e}();function Se(e,t){return Promise.all(t.map((function(t){return Ne(e,t)}))).then((function(t){return $(e,t)}))}function Ne(e,t,n){return Me.apply(this,arguments)}function Me(){return Me=(0,m.Z)(y().mark((function e(t,n,r){var o,a,i,c,l,s,u,f,d,p,m,v,h;return y().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(o=n.keys,a=n.to,i=n.from,c=n.loop,l=n.onRest,s=n.onResolve,u=b.is.obj(n.default)&&n.default,c&&(n.loop=!1),!1===a&&(n.to=null),!1===i&&(n.from=null),(f=b.is.arr(a)||b.is.fun(a)?a:void 0)?(n.to=void 0,n.onRest=void 0,u&&(u.onRest=void 0)):(0,b.S6)(ke,(function(e){var r=n[e];if(b.is.fun(r)){var o=t._events[e];n[e]=function(e){var t=e.finished,n=e.cancelled,a=o.get(r);a?(t||(a.finished=!1),n&&(a.cancelled=!0)):o.set(r,{value:null,finished:t||!1,cancelled:n||!1})},u&&(u[e]=n[e])}})),d=t._state,n.pause===!d.paused?(d.paused=n.pause,(0,b.bl)(n.pause?d.pauseQueue:d.resumeQueue)):d.paused&&(n.pause=!0),p=(o||Object.keys(t.springs)).map((function(e){return t.springs[e].start(n)})),m=!0===n.cancel||!0===M(n,"cancel"),(f||m&&d.asyncId)&&p.push(G(++t._lastAsyncId,{props:n,state:d,actions:{pause:b.ZT,resume:b.ZT,start:function(e,n){m?(re(d,t._lastAsyncId),n(te(t))):(e.onRest=l,n(ne(f,e,d,t)))}}})),!d.paused){e.next=15;break}return e.next=15,new Promise((function(e){d.resumeQueue.add(e)}));case 15:return e.t0=$,e.t1=t,e.next=19,Promise.all(p);case 19:if(e.t2=e.sent,v=(0,e.t0)(e.t1,e.t2),!c||!v.finished||r&&v.noop){e.next=26;break}if(!(h=ge(n,c,a))){e.next=26;break}return Re(t,[h]),e.abrupt("return",Ne(t,h,!0));case 26:return s&&b.Wn.batchedUpdates((function(){return s(v,t,t.item)})),e.abrupt("return",v);case 28:case"end":return e.stop()}}),e)}))),Me.apply(this,arguments)}function Pe(e,t){var n=Z({},e.springs);return t&&(0,b.S6)((0,b.qo)(t),(function(e){b.is.und(e.keys)&&(e=ye(e)),b.is.obj(e.to)||(e=Z({},e,{to:void 0})),Ie(n,e,(function(e){return Te(e)}))})),Ae(e,n),n}function Ae(e,t){(0,b.rU)(t,(function(t,n){e.springs[n]||(e.springs[n]=t,(0,b.UI)(t,e))}))}function Te(e,t){var n=new ve;return n.key=e,t&&(0,b.UI)(n,t),n}function Ie(e,t,n){t.keys&&(0,b.S6)(t.keys,(function(r){(e[r]||(e[r]=n(r)))._prepareNode(t)}))}function Re(e,t){(0,b.S6)(t,(function(t){Ie(e.springs,t,(function(t){return Te(t,e)}))}))}function Fe(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}var je,Le,_e=["children"],De=function(e){var t=e.children,n=Fe(e,_e),r=(0,E.useContext)(ze),o=n.pause||!!r.pause,a=n.immediate||!!r.immediate;n=(0,b.Pr)((function(){return{pause:o,immediate:a}}),[o,a]);var i=ze.Provider;return E.createElement(i,{value:n},t)},ze=(je=De,Le={},Object.assign(je,E.createContext(Le)),je.Provider._context=je,je.Consumer._context=je,je);De.Provider=ze.Provider,De.Consumer=ze.Consumer;var Ve=function(){var e=[],t=function(t){(0,b.ZR)();var r=[];return(0,b.S6)(e,(function(e,o){if(b.is.und(t))r.push(e.start());else{var a=n(t,e,o);a&&r.push(e.start(a))}})),r};t.current=e,t.add=function(t){e.includes(t)||e.push(t)},t.delete=function(t){var n=e.indexOf(t);~n&&e.splice(n,1)},t.pause=function(){var t=arguments;return(0,b.S6)(e,(function(e){return e.pause.apply(e,(0,o.Z)(t))})),this},t.resume=function(){var t=arguments;return(0,b.S6)(e,(function(e){return e.resume.apply(e,(0,o.Z)(t))})),this},t.set=function(t){(0,b.S6)(e,(function(e){return e.set(t)}))},t.start=function(t){var n=this,r=[];return(0,b.S6)(e,(function(e,o){if(b.is.und(t))r.push(e.start());else{var a=n._getProps(t,e,o);a&&r.push(e.start(a))}})),r},t.stop=function(){var t=arguments;return(0,b.S6)(e,(function(e){return e.stop.apply(e,(0,o.Z)(t))})),this},t.update=function(t){var n=this;return(0,b.S6)(e,(function(e,r){return e.update(n._getProps(t,e,r))})),this};var n=function(e,t,n){return b.is.fun(e)?e(n,t):e};return t._getProps=n,t};function Be(e,t,n){var r=arguments,a=b.is.fun(t)&&t;a&&!n&&(n=[]);var i=(0,E.useMemo)((function(){return a||3==r.length?Ve():void 0}),[]),c=(0,E.useRef)(0),l=(0,b.NW)(),s=(0,E.useMemo)((function(){return{ctrls:[],queue:[],flush:function(e,t){var n=Pe(e,t);return c.current>0&&!s.queue.length&&!Object.keys(n).some((function(t){return!e.springs[t]}))?Se(e,t):new Promise((function(r){Ae(e,n),s.queue.push((function(){r(Se(e,t))})),l()}))}}}),[]),u=(0,E.useRef)((0,o.Z)(s.ctrls)),f=[],d=(0,b.zH)(e)||0;function p(e,n){for(var r=e;re}))||~p.length)};l.cancel=function(e){u.delete(e),f.delete(e),c.delete(e),s.delete(e),d.delete(e)},l.sync=function(e){y=!0,l.batchedUpdates(e),y=!1},l.throttle=function(e){var t;function n(){try{e.apply(void 0,(0,i.Z)(t))}finally{t=null}}function r(){for(var e=arguments.length,r=new Array(e),o=0;o1?t-1:0),r=1;re.priority?(B.add(e),l.onStart(K)):(Q(e),l(X))},advance:X,sort:function(e){if(U)l.onFrame((function(){return q.sort(e)}));else{var t=H.indexOf(e);~t&&(H.splice(t,1),Y(e))}},clear:function(){H=[],B.clear()}};function K(){B.forEach(Q),B.clear(),l(X)}function Q(e){H.includes(e)||Y(e)}function Y(e){var t,n,r;H.splice((n=function(t){return t.priority>e.priority},(r=(t=H).findIndex(n))<0?t.length:r),0,e)}function X(e){for(var t=W,n=0;n0}var G={transparent:0,aliceblue:4042850303,antiquewhite:4209760255,aqua:16777215,aquamarine:2147472639,azure:4043309055,beige:4126530815,bisque:4293182719,black:255,blanchedalmond:4293643775,blue:65535,blueviolet:2318131967,brown:2771004159,burlywood:3736635391,burntsienna:3934150143,cadetblue:1604231423,chartreuse:2147418367,chocolate:3530104575,coral:4286533887,cornflowerblue:1687547391,cornsilk:4294499583,crimson:3692313855,cyan:16777215,darkblue:35839,darkcyan:9145343,darkgoldenrod:3095792639,darkgray:2846468607,darkgreen:6553855,darkgrey:2846468607,darkkhaki:3182914559,darkmagenta:2332068863,darkolivegreen:1433087999,darkorange:4287365375,darkorchid:2570243327,darkred:2332033279,darksalmon:3918953215,darkseagreen:2411499519,darkslateblue:1211993087,darkslategray:793726975,darkslategrey:793726975,darkturquoise:13554175,darkviolet:2483082239,deeppink:4279538687,deepskyblue:12582911,dimgray:1768516095,dimgrey:1768516095,dodgerblue:512819199,firebrick:2988581631,floralwhite:4294635775,forestgreen:579543807,fuchsia:4278255615,gainsboro:3705462015,ghostwhite:4177068031,gold:4292280575,goldenrod:3668254975,gray:2155905279,green:8388863,greenyellow:2919182335,grey:2155905279,honeydew:4043305215,hotpink:4285117695,indianred:3445382399,indigo:1258324735,ivory:4294963455,khaki:4041641215,lavender:3873897215,lavenderblush:4293981695,lawngreen:2096890111,lemonchiffon:4294626815,lightblue:2916673279,lightcoral:4034953471,lightcyan:3774873599,lightgoldenrodyellow:4210742015,lightgray:3553874943,lightgreen:2431553791,lightgrey:3553874943,lightpink:4290167295,lightsalmon:4288707327,lightseagreen:548580095,lightskyblue:2278488831,lightslategray:2005441023,lightslategrey:2005441023,lightsteelblue:2965692159,lightyellow:4294959359,lime:16711935,limegreen:852308735,linen:4210091775,magenta:4278255615,maroon:2147483903,mediumaquamarine:1724754687,mediumblue:52735,mediumorchid:3126187007,mediumpurple:2473647103,mediumseagreen:1018393087,mediumslateblue:2070474495,mediumspringgreen:16423679,mediumturquoise:1221709055,mediumvioletred:3340076543,midnightblue:421097727,mintcream:4127193855,mistyrose:4293190143,moccasin:4293178879,navajowhite:4292783615,navy:33023,oldlace:4260751103,olive:2155872511,olivedrab:1804477439,orange:4289003775,orangered:4282712319,orchid:3664828159,palegoldenrod:4008225535,palegreen:2566625535,paleturquoise:2951671551,palevioletred:3681588223,papayawhip:4293907967,peachpuff:4292524543,peru:3448061951,pink:4290825215,plum:3718307327,powderblue:2967529215,purple:2147516671,rebeccapurple:1714657791,red:4278190335,rosybrown:3163525119,royalblue:1097458175,saddlebrown:2336560127,salmon:4202722047,sandybrown:4104413439,seagreen:780883967,seashell:4294307583,sienna:2689740287,silver:3233857791,skyblue:2278484991,slateblue:1784335871,slategray:1887473919,slategrey:1887473919,snow:4294638335,springgreen:16744447,steelblue:1182971135,tan:3535047935,teal:8421631,thistle:3636451583,tomato:4284696575,turquoise:1088475391,violet:4001558271,wheat:4125012991,white:4294967295,whitesmoke:4126537215,yellow:4294902015,yellowgreen:2597139199},$="[-+]?\\d*\\.?\\d+",J=$+"%";function ee(){for(var e=arguments.length,t=new Array(e),n=0;n1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function ue(e,t,n){var r=n<.5?n*(1+t):n+t-n*t,o=2*n-r,a=se(o,r,e+1/3),i=se(o,r,e),c=se(o,r,e-1/3);return Math.round(255*a)<<24|Math.round(255*i)<<16|Math.round(255*c)<<8}function fe(e){var t=parseInt(e,10);return t<0?0:t>255?255:t}function de(e){return(parseFloat(e)%360+360)%360/360}function pe(e){var t=parseFloat(e);return t<0?0:t>1?255:Math.round(255*t)}function me(e){var t=parseFloat(e);return t<0?0:t>100?1:t/100}function ve(e){var t,n,r="number"==typeof(t=e)?t>>>0===t&&t>=0&&t<=4294967295?t:null:(n=ce.exec(t))?parseInt(n[1]+"ff",16)>>>0:_&&void 0!==_[t]?_[t]:(n=te.exec(t))?(fe(n[1])<<24|fe(n[2])<<16|fe(n[3])<<8|255)>>>0:(n=ne.exec(t))?(fe(n[1])<<24|fe(n[2])<<16|fe(n[3])<<8|pe(n[4]))>>>0:(n=ae.exec(t))?parseInt(n[1]+n[1]+n[2]+n[2]+n[3]+n[3]+"ff",16)>>>0:(n=le.exec(t))?parseInt(n[1],16)>>>0:(n=ie.exec(t))?parseInt(n[1]+n[1]+n[2]+n[2]+n[3]+n[3]+n[4]+n[4],16)>>>0:(n=re.exec(t))?(255|ue(de(n[1]),me(n[2]),me(n[3])))>>>0:(n=oe.exec(t))?(ue(de(n[1]),me(n[2]),me(n[3]))|pe(n[4]))>>>0:null;if(null===r)return e;var o=(16711680&(r=r||0))>>>16,a=(65280&r)>>>8,i=(255&r)/255;return"rgba(".concat((4278190080&r)>>>24,", ").concat(o,", ").concat(a,", ").concat(i,")")}var he=function e(t,n,r){if(N.fun(t))return t;if(N.arr(t))return e({range:t,output:n,extrapolate:r});if(N.str(t.output[0]))return R(t);var o=t,a=o.output,i=o.range||[0,1],c=o.extrapolateLeft||o.extrapolate||"extend",l=o.extrapolateRight||o.extrapolate||"extend",s=o.easing||function(e){return e};return function(e){var t=function(e,t){for(var n=1;n=e);++n);return n-1}(e,i);return function(e,t,n,r,o,a,i,c,l){var s=l?l(e):e;if(sn){if("identity"===c)return s;"clamp"===c&&(s=n)}if(r===o)return r;if(t===n)return e<=t?r:o;t===-1/0?s=-s:n===1/0?s-=t:s=(s-t)/(n-t);s=a(s),r===-1/0?s=-s:o===1/0?s+=r:s=s*(o-r)+r;return s}(e,i[t],i[t+1],a[t],a[t+1],s,c,l,o.map)}};function ge(){return ge=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}var v=["style","children","scrollTop","scrollLeft"],h=/^--/;function g(e,t){return null==t||"boolean"==typeof t||""===t?"":"number"!=typeof t||0===t||h.test(e)||b.hasOwnProperty(e)&&b[e]?(""+t).trim():t+"px"}var y={};var b={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},E=["Webkit","Ms","Moz","O"];b=Object.keys(b).reduce((function(e,t){return E.forEach((function(n){return e[function(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}(n,t)]=e[t]})),e}),b);var w=["x","y","z"],x=/^(matrix|translate|scale|rotate|skew)/,C=/^(translate)/,k=/^(rotate|skew)/,Z=function(e,t){return f.is.num(e)&&0!==e?e+t:e},O=function e(t,n){return f.is.arr(t)?t.every((function(t){return e(t,n)})):f.is.num(t)?t===n:parseFloat(t)===n},S=function(e){(0,i.Z)(n,e);var t=p(n);function n(e){(0,a.Z)(this,n);var o=e.x,i=e.y,c=e.z,l=m(e,w),s=[],u=[];return(o||i||c)&&(s.push([o||0,i||0,c||0]),u.push((function(e){return["translate3d(".concat(e.map((function(e){return Z(e,"px")})).join(","),")"),O(e,0)]}))),(0,f.rU)(l,(function(e,t){if("transform"===t)s.push([e||""]),u.push((function(e){return[e,""===e]}));else if(x.test(t)){if(delete l[t],f.is.und(e))return;var n=C.test(t)?"px":k.test(t)?"deg":"";s.push((0,f.qo)(e)),u.push("rotate3d"===t?function(e){var t=(0,r.Z)(e,4),o=t[0],a=t[1],i=t[2],c=t[3];return["rotate3d(".concat(o,",").concat(a,",").concat(i,",").concat(Z(c,n),")"),O(c,0)]}:function(e){return["".concat(t,"(").concat(e.map((function(e){return Z(e,n)})).join(","),")"),O(e,t.startsWith("scale")?1:0)]})}})),s.length&&(l.transform=new N(s,u)),t.call(this,l)}return(0,o.Z)(n)}(d.rS),N=function(e){(0,i.Z)(n,e);var t=p(n);function n(e,r){var o;return(0,a.Z)(this,n),(o=t.call(this))._value=null,o.inputs=e,o.transforms=r,o}return(0,o.Z)(n,[{key:"get",value:function(){return this._value||(this._value=this._get())}},{key:"_get",value:function(){var e=this,t="",n=!0;return(0,f.S6)(this.inputs,(function(o,a){var i=(0,f.je)(o[0]),c=e.transforms[a](f.is.arr(i)?i:o.map(f.je)),l=(0,r.Z)(c,2),s=l[0],u=l[1];t+=" "+s,n=n&&u})),n?"none":t}},{key:"observerAdded",value:function(e){var t=this;1==e&&(0,f.S6)(this.inputs,(function(e){return(0,f.S6)(e,(function(e){return(0,f.j$)(e)&&(0,f.UI)(e,t)}))}))}},{key:"observerRemoved",value:function(e){var t=this;0==e&&(0,f.S6)(this.inputs,(function(e){return(0,f.S6)(e,(function(e){return(0,f.j$)(e)&&(0,f.iL)(e,t)}))}))}},{key:"eventObserved",value:function(e){"change"==e.type&&(this._value=null),(0,f.k0)(this,e)}}]),n}(f.B0),M=["scrollTop","scrollLeft"];s.Globals.assign({batchedUpdates:u.unstable_batchedUpdates,createStringInterpolator:f.qS,colors:f.O9});var P=(0,d.Ld)(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"],{applyAnimatedValues:function(e,t){if(!e.nodeType||!e.setAttribute)return!1;var n="filter"===e.nodeName||e.parentNode&&"filter"===e.parentNode.nodeName,r=t,o=r.style,a=r.children,i=r.scrollTop,c=r.scrollLeft,l=m(r,v),s=Object.values(l),u=Object.keys(l).map((function(t){return n||e.hasAttribute(t)?t:y[t]||(y[t]=t.replace(/([A-Z])/g,(function(e){return"-"+e.toLowerCase()})))}));for(var f in void 0!==a&&(e.textContent=a),o)if(o.hasOwnProperty(f)){var d=g(f,o[f]);h.test(f)?e.style.setProperty(f,d):e.style[f]=d}u.forEach((function(t,n){e.setAttribute(t,s[n])})),void 0!==i&&(e.scrollTop=i),void 0!==c&&(e.scrollLeft=c)},createAnimatedStyle:function(e){return new S(e)},getComponentProps:function(e){return m(e,M)}}).animated},4221:function(e,t,n){"use strict";n.d(t,{Tm:function(){return a},l$:function(){return o}});var r=n(7294),o=r.isValidElement;function a(e,t){return function(e,t,n){return o(e)?r.cloneElement(e,"function"==typeof n?n(e.props||{}):n):t}(e,e,t)}},2525:function(e,t,n){"use strict";n.d(t,{C:function(){return y},E_:function(){return g}});var r=n(7294),o=n(7462),a=n(4942),i=n(5900),c=n.n(i),l=n(8402),s=function(){var e=(0,r.useContext(g).getPrefixCls)("empty-img-default");return r.createElement("svg",{className:e,width:"184",height:"152",viewBox:"0 0 184 152",xmlns:"http://www.w3.org/2000/svg"},r.createElement("g",{fill:"none",fillRule:"evenodd"},r.createElement("g",{transform:"translate(24 31.67)"},r.createElement("ellipse",{className:"".concat(e,"-ellipse"),cx:"67.797",cy:"106.89",rx:"67.797",ry:"12.668"}),r.createElement("path",{className:"".concat(e,"-path-1"),d:"M122.034 69.674L98.109 40.229c-1.148-1.386-2.826-2.225-4.593-2.225h-51.44c-1.766 0-3.444.839-4.592 2.225L13.56 69.674v15.383h108.475V69.674z"}),r.createElement("path",{className:"".concat(e,"-path-2"),d:"M101.537 86.214L80.63 61.102c-1.001-1.207-2.507-1.867-4.048-1.867H31.724c-1.54 0-3.047.66-4.048 1.867L6.769 86.214v13.792h94.768V86.214z",transform:"translate(13.56)"}),r.createElement("path",{className:"".concat(e,"-path-3"),d:"M33.83 0h67.933a4 4 0 0 1 4 4v93.344a4 4 0 0 1-4 4H33.83a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4z"}),r.createElement("path",{className:"".concat(e,"-path-4"),d:"M42.678 9.953h50.237a2 2 0 0 1 2 2V36.91a2 2 0 0 1-2 2H42.678a2 2 0 0 1-2-2V11.953a2 2 0 0 1 2-2zM42.94 49.767h49.713a2.262 2.262 0 1 1 0 4.524H42.94a2.262 2.262 0 0 1 0-4.524zM42.94 61.53h49.713a2.262 2.262 0 1 1 0 4.525H42.94a2.262 2.262 0 0 1 0-4.525zM121.813 105.032c-.775 3.071-3.497 5.36-6.735 5.36H20.515c-3.238 0-5.96-2.29-6.734-5.36a7.309 7.309 0 0 1-.222-1.79V69.675h26.318c2.907 0 5.25 2.448 5.25 5.42v.04c0 2.971 2.37 5.37 5.277 5.37h34.785c2.907 0 5.277-2.421 5.277-5.393V75.1c0-2.972 2.343-5.426 5.25-5.426h26.318v33.569c0 .617-.077 1.216-.221 1.789z"})),r.createElement("path",{className:"".concat(e,"-path-5"),d:"M149.121 33.292l-6.83 2.65a1 1 0 0 1-1.317-1.23l1.937-6.207c-2.589-2.944-4.109-6.534-4.109-10.408C138.802 8.102 148.92 0 161.402 0 173.881 0 184 8.102 184 18.097c0 9.995-10.118 18.097-22.599 18.097-4.528 0-8.744-1.066-12.28-2.902z"}),r.createElement("g",{className:"".concat(e,"-g"),transform:"translate(149.65 15.383)"},r.createElement("ellipse",{cx:"20.654",cy:"3.167",rx:"2.849",ry:"2.815"}),r.createElement("path",{d:"M5.698 5.63H0L2.898.704zM9.259.704h4.985V5.63H9.259z"}))))},u=function(){var e=(0,r.useContext(g).getPrefixCls)("empty-img-simple");return r.createElement("svg",{className:e,width:"64",height:"41",viewBox:"0 0 64 41",xmlns:"http://www.w3.org/2000/svg"},r.createElement("g",{transform:"translate(0 1)",fill:"none",fillRule:"evenodd"},r.createElement("ellipse",{className:"".concat(e,"-ellipse"),cx:"32",cy:"33",rx:"32",ry:"7"}),r.createElement("g",{className:"".concat(e,"-g"),fillRule:"nonzero"},r.createElement("path",{d:"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z"}),r.createElement("path",{d:"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z",className:"".concat(e,"-path")}))))},f=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o0?"-".concat(v):v,k=!!y,Z="left"===v&&null!=h,O="right"===v&&null!=h,S=c()(x,"".concat(x,"-").concat(p),(t={},(0,o.Z)(t,"".concat(x,"-with-text"),k),(0,o.Z)(t,"".concat(x,"-with-text").concat(C),k),(0,o.Z)(t,"".concat(x,"-dashed"),!!b),(0,o.Z)(t,"".concat(x,"-plain"),!!E),(0,o.Z)(t,"".concat(x,"-rtl"),"rtl"===u),(0,o.Z)(t,"".concat(x,"-no-default-orientation-margin-left"),Z),(0,o.Z)(t,"".concat(x,"-no-default-orientation-margin-right"),O),t),g),N=(0,r.Z)((0,r.Z)({},Z&&{marginLeft:h}),O&&{marginRight:h});return a.createElement("div",(0,r.Z)({className:S},w,{role:"separator"}),y&&a.createElement("span",{className:"".concat(x,"-inner-text"),style:N},y))}},2712:function(e,t,n){"use strict";n(1696)},8402:function(e,t,n){"use strict";n.d(t,{Z:function(){return g},E:function(){return y}});var r=n(7462),o=n(5671),a=n(3144),i=n(136),c=n(9388),l=n(7294),s=n(166),u={locale:"en_US",today:"Today",now:"Now",backToToday:"Back to today",ok:"Ok",clear:"Clear",month:"Month",year:"Year",timeSelect:"select time",dateSelect:"select date",weekSelect:"Choose a week",monthSelect:"Choose a month",yearSelect:"Choose a year",decadeSelect:"Choose a decade",yearFormat:"YYYY",dateFormat:"M/D/YYYY",dayFormat:"D",dateTimeFormat:"M/D/YYYY HH:mm:ss",monthBeforeYear:!0,previousMonth:"Previous month (PageUp)",nextMonth:"Next month (PageDown)",previousYear:"Last year (Control + left)",nextYear:"Next year (Control + right)",previousDecade:"Last decade",nextDecade:"Next decade",previousCentury:"Last century",nextCentury:"Next century"},f={placeholder:"Select time",rangePlaceholder:["Start time","End time"]},d={lang:(0,r.Z)({placeholder:"Select date",yearPlaceholder:"Select year",quarterPlaceholder:"Select quarter",monthPlaceholder:"Select month",weekPlaceholder:"Select week",rangePlaceholder:["Start date","End date"],rangeYearPlaceholder:["Start year","End year"],rangeQuarterPlaceholder:["Start quarter","End quarter"],rangeMonthPlaceholder:["Start month","End month"],rangeWeekPlaceholder:["Start week","End week"]},u),timePickerLocale:(0,r.Z)({},f)},p=d,m="${label} is not a valid ${type}",v={locale:"en",Pagination:s.Z,DatePicker:d,TimePicker:f,Calendar:p,global:{placeholder:"Please select"},Table:{filterTitle:"Filter menu",filterConfirm:"OK",filterReset:"Reset",filterEmptyText:"No filters",filterCheckall:"Select all items",filterSearchPlaceholder:"Search in filters",emptyText:"No data",selectAll:"Select current page",selectInvert:"Invert current page",selectNone:"Clear all data",selectionAll:"Select all data",sortTitle:"Sort",expand:"Expand row",collapse:"Collapse row",triggerDesc:"Click to sort descending",triggerAsc:"Click to sort ascending",cancelSort:"Click to cancel sorting"},Modal:{okText:"OK",cancelText:"Cancel",justOkText:"OK"},Popconfirm:{okText:"OK",cancelText:"Cancel"},Transfer:{titles:["",""],searchPlaceholder:"Search here",itemUnit:"item",itemsUnit:"items",remove:"Remove",selectCurrent:"Select current page",removeCurrent:"Remove current page",selectAll:"Select all data",removeAll:"Remove all data",selectInvert:"Invert current page"},Upload:{uploading:"Uploading...",removeFile:"Remove file",uploadError:"Upload error",previewFile:"Preview file",downloadFile:"Download file"},Empty:{description:"No Data"},Icon:{icon:"icon"},Text:{edit:"Edit",copy:"Copy",copied:"Copied",expand:"Expand"},PageHeader:{back:"Back"},Form:{optional:"(optional)",defaultValidateMessages:{default:"Field validation error for ${label}",required:"Please enter ${label}",enum:"${label} must be one of [${enum}]",whitespace:"${label} cannot be a blank character",date:{format:"${label} date format is invalid",parse:"${label} cannot be converted to a date",invalid:"${label} is an invalid date"},types:{string:m,method:m,array:m,object:m,number:m,date:m,boolean:m,integer:m,float:m,regexp:m,email:m,url:m,hex:m},string:{len:"${label} must be ${len} characters",min:"${label} must be at least ${min} characters",max:"${label} must be up to ${max} characters",range:"${label} must be between ${min}-${max} characters"},number:{len:"${label} must be equal to ${len}",min:"${label} must be minimum ${min}",max:"${label} must be maximum ${max}",range:"${label} must be between ${min}-${max}"},array:{len:"Must be ${len} ${label}",min:"At least ${min} ${label}",max:"At most ${max} ${label}",range:"The amount of ${label} must be between ${min}-${max}"},pattern:{mismatch:"${label} does not match the pattern ${pattern}"}}},Image:{preview:"Preview"}},h=(0,l.createContext)(void 0),g=function(e){(0,i.Z)(n,e);var t=(0,c.Z)(n);function n(){return(0,o.Z)(this,n),t.apply(this,arguments)}return(0,a.Z)(n,[{key:"getLocale",value:function(){var e=this.props,t=e.componentName,n=e.defaultLocale||v[null!=t?t:"global"],o=this.context,a=t&&o?o[t]:{};return(0,r.Z)((0,r.Z)({},n instanceof Function?n():n),a||{})}},{key:"getLocaleCode",value:function(){var e=this.context,t=e&&e.locale;return e&&e.exist&&!t?v.locale:t}},{key:"render",value:function(){return this.props.children(this.getLocale(),this.getLocaleCode(),this.context)}}]),n}(l.Component);function y(e,t){var n=l.useContext(h),o=l.useMemo((function(){var o=t||v[e||"global"],a=e&&n?n[e]:{};return(0,r.Z)((0,r.Z)({},"function"==typeof o?o():o),a||{})}),[e,t,n]);return[o]}g.defaultProps={componentName:"global"},g.contextType=h},5900:function(e,t){var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e=[],t=0;t1&&void 0!==arguments[1]?arguments[1]:2;t();var a=(0,D.Z)((function(){o<=1?r({isCanceled:function(){return a!==e.current}}):n(r,o-1)}));e.current=a},t]}(),s=(0,a.Z)(l,2),u=s[0],f=s[1];return _((function(){if(o!==T&&o!==j){var e=z.indexOf(o),n=z[e+1],r=t(o);false===r?i(n):u((function(e){function t(){e.isCanceled()||i(n)}!0===r?t():Promise.resolve(r).then(t)}))}}),[e,o]),c.useEffect((function(){return function(){f()}}),[]),[function(){i(I)},o]};function H(e,t,n,i){var l=i.motionEnter,s=void 0===l||l,u=i.motionAppear,f=void 0===u||u,d=i.motionLeave,p=void 0===d||d,m=i.motionDeadline,v=i.motionLeaveImmediately,h=i.onAppearPrepare,g=i.onEnterPrepare,y=i.onLeavePrepare,b=i.onAppearStart,E=i.onEnterStart,w=i.onLeaveStart,x=i.onAppearActive,C=i.onEnterActive,k=i.onLeaveActive,S=i.onAppearEnd,T=i.onEnterEnd,j=i.onLeaveEnd,D=i.onVisibleChanged,z=L(),H=(0,a.Z)(z,2),W=H[0],U=H[1],q=L(N),K=(0,a.Z)(q,2),Q=K[0],Y=K[1],X=L(null),G=(0,a.Z)(X,2),$=G[0],J=G[1],ee=(0,c.useRef)(!1),te=(0,c.useRef)(null),ne=(0,c.useRef)(!1),re=(0,c.useRef)(null);function oe(){return n()||re.current}var ae=(0,c.useRef)(!1);function ie(e){var t,n=oe();e&&!e.deadline&&e.target!==n||(Q===M&&ae.current?t=null==S?void 0:S(n,e):Q===P&&ae.current?t=null==T?void 0:T(n,e):Q===A&&ae.current&&(t=null==j?void 0:j(n,e)),!1===t||ne.current||(Y(N),J(null)))}var ce=function(e){var t=(0,c.useRef)(),n=(0,c.useRef)(e);n.current=e;var r=c.useCallback((function(e){n.current(e)}),[]);function o(e){e&&(e.removeEventListener(O,r),e.removeEventListener(Z,r))}return c.useEffect((function(){return function(){o(t.current)}}),[]),[function(e){t.current&&t.current!==e&&o(t.current),e&&e!==t.current&&(e.addEventListener(O,r),e.addEventListener(Z,r),t.current=e)},o]}(ie),le=(0,a.Z)(ce,1)[0],se=c.useMemo((function(){var e,t,n;switch(Q){case"appear":return e={},(0,r.Z)(e,I,h),(0,r.Z)(e,R,b),(0,r.Z)(e,F,x),e;case"enter":return t={},(0,r.Z)(t,I,g),(0,r.Z)(t,R,E),(0,r.Z)(t,F,C),t;case"leave":return n={},(0,r.Z)(n,I,y),(0,r.Z)(n,R,w),(0,r.Z)(n,F,k),n;default:return{}}}),[Q]),ue=B(Q,(function(e){if(e===I){var t=se.prepare;return!!t&&t(oe())}var n;pe in se&&J((null===(n=se[pe])||void 0===n?void 0:n.call(se,oe(),null))||null);return pe===F&&(le(oe()),m>0&&(clearTimeout(te.current),te.current=setTimeout((function(){ie({deadline:!0})}),m))),true})),fe=(0,a.Z)(ue,2),de=fe[0],pe=fe[1],me=V(pe);ae.current=me,_((function(){U(t);var n,r=ee.current;(ee.current=!0,e)&&(!r&&t&&f&&(n=M),r&&t&&s&&(n=P),(r&&!t&&p||!r&&v&&!t&&p)&&(n=A),n&&(Y(n),de()))}),[t]),(0,c.useEffect)((function(){(Q===M&&!f||Q===P&&!s||Q===A&&!p)&&Y(N)}),[f,s,p]),(0,c.useEffect)((function(){return function(){clearTimeout(te.current),ne.current=!0}}),[]),(0,c.useEffect)((function(){void 0!==W&&Q===N&&(null==D||D(W))}),[W,Q]);var ve=$;return se.prepare&&pe===R&&(ve=(0,o.Z)({transition:"none"},ve)),[Q,pe,ve,null!=W?W:t]}var W=n(5671),U=n(3144),q=n(136),K=n(9388),Q=function(e){(0,q.Z)(n,e);var t=(0,K.Z)(n);function n(){return(0,W.Z)(this,n),t.apply(this,arguments)}return(0,U.Z)(n,[{key:"render",value:function(){return this.props.children}}]),n}(c.Component),Y=Q;var X=function(e){var t=e;function n(e){return!(!e.motionName||!t)}"object"===(0,i.Z)(e)&&(t=e.transitionSupport);var u=c.forwardRef((function(e,t){var i=e.visible,u=void 0===i||i,d=e.removeOnLeave,p=void 0===d||d,m=e.forceRender,v=e.children,h=e.motionName,g=e.leavedClassName,y=e.eventProps,b=n(e),E=(0,c.useRef)(),w=(0,c.useRef)();var x=H(b,u,(function(){try{return(0,l.Z)(E.current||w.current)}catch(e){return null}}),e),C=(0,a.Z)(x,4),k=C[0],Z=C[1],O=C[2],M=C[3],P=c.useRef(M);M&&(P.current=!0);var A=(0,c.useRef)(t);A.current=t;var T,F=c.useCallback((function(e){E.current=e,(0,s.mH)(A.current,e)}),[]),j=(0,o.Z)((0,o.Z)({},y),{},{visible:u});if(v)if(k!==N&&n(e)){var L,_;Z===I?_="prepare":V(Z)?_="active":Z===R&&(_="start"),T=v((0,o.Z)((0,o.Z)({},j),{},{className:f()(S(h,k),(L={},(0,r.Z)(L,S(h,"".concat(k,"-").concat(_)),_),(0,r.Z)(L,h,"string"==typeof h),L)),style:O}),F)}else T=M?v((0,o.Z)({},j),F):!p&&P.current?v((0,o.Z)((0,o.Z)({},j),{},{className:g}),F):m?v((0,o.Z)((0,o.Z)({},j),{},{style:{display:"none"}}),F):null;else T=null;return c.createElement(Y,{ref:w},T)}));return u.displayName="CSSMotion",u}(k),G=n(7462),$=n(5987),J="add",ee="keep",te="remove",ne="removed";function re(e){var t;return t=e&&"object"===(0,i.Z)(e)&&"key"in e?e:{key:e},(0,o.Z)((0,o.Z)({},t),{},{key:String(t.key)})}function oe(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return e.map(re)}function ae(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=[],r=0,a=t.length,i=oe(e),c=oe(t);i.forEach((function(e){for(var t=!1,i=r;i1}));return s.forEach((function(e){(n=n.filter((function(t){var n=t.key,r=t.status;return n!==e||r!==te}))).forEach((function(t){t.key===e&&(t.status=ee)}))})),n}var ie=["eventProps","visible","children","motionName","motionAppear","motionEnter","motionLeave","motionLeaveImmediately","motionDeadline","removeOnLeave","leavedClassName","onAppearStart","onAppearActive","onAppearEnd","onEnterStart","onEnterActive","onEnterEnd","onLeaveStart","onLeaveActive","onLeaveEnd"];!function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:X,n=function(e){(0,q.Z)(r,e);var n=(0,K.Z)(r);function r(){var e;return(0,W.Z)(this,r),(e=n.apply(this,arguments)).state={keyEntities:[]},e.removeKey=function(t){e.setState((function(e){return{keyEntities:e.keyEntities.map((function(e){return e.key!==t?e:(0,o.Z)((0,o.Z)({},e),{},{status:ne})}))}}))},e}return(0,U.Z)(r,[{key:"render",value:function(){var e=this,n=this.state.keyEntities,r=this.props,o=r.component,a=r.children,i=r.onVisibleChanged,l=(0,$.Z)(r,["component","children","onVisibleChanged"]),s=o||c.Fragment,u={};return ie.forEach((function(e){u[e]=l[e],delete l[e]})),delete l.keys,c.createElement(s,l,n.map((function(n){var r=n.status,o=(0,$.Z)(n,["status"]),l=r===J||r===ee;return c.createElement(t,(0,G.Z)({},u,{key:o.key,visible:l,eventProps:o,onVisibleChanged:function(t){null==i||i(t,{key:o.key}),t||e.removeKey(o.key)}}),a)})))}}],[{key:"getDerivedStateFromProps",value:function(e,t){var n=e.keys,r=t.keyEntities,o=oe(n);return{keyEntities:ae(r,o).filter((function(e){var t=r.find((function(t){var n=t.key;return e.key===n}));return!t||t.status!==ne||e.status!==te}))}}}]),r}(c.Component);n.defaultProps={component:"div"}}(k);var ce=X},166:function(e,t){"use strict";t.Z={items_per_page:"/ page",jump_to:"Go to",jump_to_confirm:"confirm",page:"",prev_page:"Previous Page",next_page:"Next Page",prev_5:"Previous 5 Pages",next_5:"Next 5 Pages",prev_3:"Previous 3 Pages",next_3:"Next 3 Pages"}},1485:function(e,t,n){"use strict";n.d(t,{Z:function(){return o}});var r=n(3935);function o(e,t,n,o){var a=r.unstable_batchedUpdates?function(e){r.unstable_batchedUpdates(n,e)}:n;return e.addEventListener&&e.addEventListener(t,a,o),{remove:function(){e.removeEventListener&&e.removeEventListener(t,a)}}}},2034:function(e,t,n){"use strict";function r(){return!("undefined"==typeof window||!window.document||!window.document.createElement)}n.d(t,{Z:function(){return r}})},7759:function(e,t,n){"use strict";n.d(t,{hq:function(){return u}});var r=n(2034),o="rc-util-key";function a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.mark;return t?t.startsWith("data-")?t:"data-".concat(t):o}function i(e){return e.attachTo?e.attachTo:document.querySelector("head")||document.body}function c(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,r.Z)())return null;var o,a=document.createElement("style");(null===(t=n.csp)||void 0===t?void 0:t.nonce)&&(a.nonce=null===(o=n.csp)||void 0===o?void 0:o.nonce);a.innerHTML=e;var c=i(n),l=c.firstChild;return n.prepend&&c.prepend?c.prepend(a):n.prepend&&l?c.insertBefore(a,l):c.appendChild(a),a}var l=new Map;function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=i(t);return Array.from(l.get(n).children).find((function(n){return"STYLE"===n.tagName&&n.getAttribute(a(t))===e}))}function u(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=i(n);if(!l.has(r)){var o=c("",n),u=o.parentNode;l.set(r,u),u.removeChild(o)}var f=s(t,n);if(f){var d,p,m;if((null===(d=n.csp)||void 0===d?void 0:d.nonce)&&f.nonce!==(null===(p=n.csp)||void 0===p?void 0:p.nonce))f.nonce=null===(m=n.csp)||void 0===m?void 0:m.nonce;return f.innerHTML!==e&&(f.innerHTML=e),f}var v=c(e,n);return v.setAttribute(a(n),t),v}},7714:function(e,t,n){"use strict";n.d(t,{Z:function(){return o}});var r=n(3935);function o(e){return e instanceof HTMLElement?e:r.findDOMNode(e)}},1884:function(e,t,n){"use strict";n.d(t,{Z:function(){return o}});var r=n(7294);function o(e,t,n){var o=r.useRef({});return"value"in o.current&&!n(o.current.condition,t)||(o.current.value=e(),o.current.condition=t),o.current.value}},6041:function(e,t,n){"use strict";n.d(t,{Z:function(){return a}});var r=n(9439),o=n(7294);function a(e,t){var n=t||{},a=n.defaultValue,i=n.value,c=n.onChange,l=n.postState,s=function(e){var t=o.useRef(!1),n=o.useState(e),a=(0,r.Z)(n,2),i=a[0],c=a[1];return o.useEffect((function(){return function(){t.current=!0}}),[]),[i,function(e,n){n&&t.current||c(e)}]}((function(){return void 0!==i?i:void 0!==a?"function"==typeof a?a():a:"function"==typeof e?e():e})),u=(0,r.Z)(s,2),f=u[0],d=u[1],p=void 0!==i?i:f;l&&(p=l(p));var m=o.useRef(c);m.current=c;var v=o.useCallback((function(e,t){d(e,t),p!==e&&m.current&&m.current(e,p)}),[p,m]),h=o.useRef(!0);return o.useEffect((function(){h.current?h.current=!1:void 0===i&&d(i)}),[i]),[p,v]}},8613:function(e,t,n){"use strict";n.d(t,{Z:function(){return o}});var r=n(1413);function o(e,t){var n=(0,r.Z)({},e);return Array.isArray(t)&&t.forEach((function(e){delete n[e]})),n}},518:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=function(e){return+setTimeout(e,16)},o=function(e){return clearTimeout(e)};"undefined"!=typeof window&&"requestAnimationFrame"in window&&(r=function(e){return window.requestAnimationFrame(e)},o=function(e){return window.cancelAnimationFrame(e)});var a=0,i=new Map;function c(e){i.delete(e)}function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=a+=1;function o(t){if(0===t)c(n),e();else{var a=r((function(){o(t-1)}));i.set(n,a)}}return o(t),n}l.cancel=function(e){var t=i.get(e);return c(t),o(t)}},2275:function(e,t,n){"use strict";n.d(t,{Yr:function(){return s},mH:function(){return i},sQ:function(){return c},x1:function(){return l}});var r=n(1002),o=n(6884),a=n(1884);function i(e,t){"function"==typeof e?e(t):"object"===(0,r.Z)(e)&&e&&"current"in e&&(e.current=t)}function c(){for(var e=arguments.length,t=new Array(e),n=0;ne.length)););var l=e.substring(0,t),s=e.substring(l.length+1,t+o),u=e.substring(t+o+1);e=l+s+u,o--}n.timeout=setTimeout((function(){n.toggleBlinking(!1),t>=e.length?n.doneTyping(e,t):n.keepTyping(e,t,o),n.temporaryPause&&(n.temporaryPause=!1,n.options.onTypingResumed(n.arrayPos,n))}),r)}),r):this.setPauseStatus(e,t,!0)}},{key:"keepTyping",value:function(e,t,n){0===t&&(this.toggleBlinking(!1),this.options.preStringTyped(this.arrayPos,this)),t+=n;var r=e.substr(0,t);this.replaceText(r),this.typewrite(e,t)}},{key:"doneTyping",value:function(e,t){var n=this;this.options.onStringTyped(this.arrayPos,this),this.toggleBlinking(!0),this.arrayPos===this.strings.length-1&&(this.complete(),!1===this.loop||this.curLoop===this.loopCount)||(this.timeout=setTimeout((function(){n.backspace(e,t)}),this.backDelay))}},{key:"backspace",value:function(e,t){var n=this;if(!0!==this.pause.status){if(this.fadeOut)return this.initFadeOut();this.toggleBlinking(!1);var r=this.humanizer(this.backSpeed);this.timeout=setTimeout((function(){t=a.htmlParser.backSpaceHtmlChars(e,t,n);var r=e.substr(0,t);if(n.replaceText(r),n.smartBackspace){var o=n.strings[n.arrayPos+1];o&&r===o.substr(0,t)?n.stopNum=t:n.stopNum=0}t>n.stopNum?(t--,n.backspace(e,t)):t<=n.stopNum&&(n.arrayPos++,n.arrayPos===n.strings.length?(n.arrayPos=0,n.options.onLastStringBackspaced(),n.shuffleStringsIfNeeded(),n.begin()):n.typewrite(n.strings[n.sequence[n.arrayPos]],t))}),r)}else this.setPauseStatus(e,t,!1)}},{key:"complete",value:function(){this.options.onComplete(this),this.loop?this.curLoop++:this.typingComplete=!0}},{key:"setPauseStatus",value:function(e,t,n){this.pause.typewrite=n,this.pause.curString=e,this.pause.curStrPos=t}},{key:"toggleBlinking",value:function(e){this.cursor&&(this.pause.status||this.cursorBlinking!==e&&(this.cursorBlinking=e,e?this.cursor.classList.add("typed-cursor--blink"):this.cursor.classList.remove("typed-cursor--blink")))}},{key:"humanizer",value:function(e){return Math.round(Math.random()*e/2)+e}},{key:"shuffleStringsIfNeeded",value:function(){this.shuffle&&(this.sequence=this.sequence.sort((function(){return Math.random()-.5})))}},{key:"initFadeOut",value:function(){var e=this;return this.el.className+=" "+this.fadeOutClass,this.cursor&&(this.cursor.className+=" "+this.fadeOutClass),setTimeout((function(){e.arrayPos++,e.replaceText(""),e.strings.length>e.arrayPos?e.typewrite(e.strings[e.sequence[e.arrayPos]],0):(e.typewrite(e.strings[0],0),e.arrayPos=0)}),this.fadeOutDelay)}},{key:"replaceText",value:function(e){this.attr?this.el.setAttribute(this.attr,e):this.isInput?this.el.value=e:"html"===this.contentType?this.el.innerHTML=e:this.el.textContent=e}},{key:"bindFocusEvents",value:function(){var e=this;this.isInput&&(this.el.addEventListener("focus",(function(t){e.stop()})),this.el.addEventListener("blur",(function(t){e.el.value&&0!==e.el.value.length||e.start()})))}},{key:"insertCursor",value:function(){this.showCursor&&(this.cursor||(this.cursor=document.createElement("span"),this.cursor.className="typed-cursor",this.cursor.setAttribute("aria-hidden",!0),this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)))}}]),e}();t.default=i,e.exports=t.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,o=Object.assign||function(e){for(var t=1;t":";";e.substr(t+1).charAt(0)!==o&&!(1+ ++t>e.length););t++}return t}},{key:"backSpaceHtmlChars",value:function(e,t,n){if("html"!==n.contentType)return t;var r=e.substr(t).charAt(0);if(">"===r||";"===r){var o="";for(o=">"===r?"<":"&";e.substr(t-1).charAt(0)!==o&&!(--t<0););t--}return t}}]),e}();t.default=r;var o=new r;t.htmlParser=o}])},e.exports=t()},1223:function(e,t,n){var r=n(5112),o=n(30),a=n(3070),i=r("unscopables"),c=Array.prototype;null==c[i]&&a.f(c,i,{configurable:!0,value:o(null)}),e.exports=function(e){c[i][e]=!0}},7475:function(e,t,n){var r=n(7854),o=n(3157),a=n(4411),i=n(111),c=n(5112)("species"),l=r.Array;e.exports=function(e){var t;return o(e)&&(t=e.constructor,(a(t)&&(t===l||o(t.prototype))||i(t)&&null===(t=t[c]))&&(t=void 0)),void 0===t?l:t}},5417:function(e,t,n){var r=n(7475);e.exports=function(e,t){return new(r(e))(0===t?0:t)}},6790:function(e,t,n){"use strict";var r=n(7854),o=n(3157),a=n(6244),i=n(9974),c=r.TypeError,l=function(e,t,n,r,s,u,f,d){for(var p,m,v=s,h=0,g=!!f&&i(f,d);h0&&o(p))m=a(p),v=l(e,t,p,m,v,u-1)-1;else{if(v>=9007199254740991)throw c("Exceed the acceptable array length");e[v]=p}v++}h++}return v};e.exports=l},9974:function(e,t,n){var r=n(1702),o=n(9662),a=n(4374),i=r(r.bind);e.exports=function(e,t){return o(e),void 0===t?e:a?i(e,t):function(){return e.apply(t,arguments)}}},490:function(e,t,n){var r=n(5005);e.exports=r("document","documentElement")},3157:function(e,t,n){var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},30:function(e,t,n){var r,o=n(9670),a=n(6048),i=n(748),c=n(3501),l=n(490),s=n(317),u=n(6200),f=u("IE_PROTO"),d=function(){},p=function(e){return"Sabertaz Blog
CSSFrontend DevelopmentWeb Development

CSS Advanced Notes

Posted on Thu Apr 13 2017
Last updated on Mon Sep 27 2021
(5 minutes)

CSS Advanced Notes

CSS Framework Key Points

  • Content
  • Centering
  • Font Family
  • Spacing
  • Color and Contrast
  • Balance (Position)
  • Primary and Secondary Color
  • Custom Text (Font)
  • Images and Links

Typography Principles

  • The typeface (font-family)
  • Type (modular) scale
  • Responsiveness of the text (size unit and breakpoints)
  • Spacing and vertical rhythm
  • Colors (theming)

refer to: font-family, font-size, spacing, color

font-size and spacing

  • set a base-size
  • multiples of base-size
  • use rem for most font-size, use em for some spacing (needing responsive design)
$xs: $base / $ratio / $ratio;
+$sm: $base / $ratio;
+$md: $base;
+$lg: $base * $ratio;
+$xl: $base * $ratio * ratio;

font-size

  • rem is better
  • em for responsive layout (etc. layer2 font based-on layer1 font in dropdown menu)
  • make text legible: at least 16px

spacing

make text breathe:

  • margin/padding: at least 15px
  • line-height: 1.4
  • word-spacing
  • letter-spacing
  • 60-100 characters per line

vertical rhythms

keep vertical spaces between elements on a page consistent (and relative) to each other:

  • Set the vertical white space between elements to a multiple of base-size
  • Set the line-height of all text elements to a multiple of base-size

Table

  • remove fills, grid lines, border and bolding
  • left-align text, right-align numbers and align headings with data
  • put white space to work to group and separate

Grid System

  • Must have different traits at different sizes
  • Must be fluid between breakpoints
  • Must have enough control to decide which columns will transform and at which point
  • Classes should ideally still make sense at all breakpoints

Form Design Principles

Buttons Placement Principles

  • Align the primary button to the left edge of the inputs
  • Put the back button above the form
  • Put tangentially related actions above the form
  • Place extra buttons based on what they do
  • In some single field forms put the button next to the input (e.g search button)
  • Put buttons on multi select forms above the form

https://adamsilver.io/articles/where-to-put-buttons-in-forms

Graceful Degradation

write old browser css code, then write modern browser css code

.grid {
+  display: flex;
+
+  /* old browser will ignore this rule */
+  display: grid;
+}

CSS Houdini

CSS Houdini bring many API:

  • css properties and values api: custom properties (–var, var(–var)), custom function (–darken(–var))
  • css layout api (layoutWorklet): layout below (display: flex/grid), layout above (css-sizing: min-content/max-content/fit-content)
  • css paint api (paintWorklet): background, background-color, background-image
  • css composite api (compositeWorklet)

to let developers enhance css without any browser updates

HomePage User Experience

UX Research point out that:

  • Feature a Broad Range of Product Types (6% Don’t)
  • Avoid Overly Aggressive and Distracting Ads (59% Don’t)
  • Implement Carousels Carefully (75% Don’t)
  • Assist the Selection of a Well-Defined Scope (62% Don’t)
  • Invest in Bespoke Imagery and Design (19% Don’t)
  • Make the Search Field Immediately Obvious (22% Don’t)
  • Implement Country & Language Selection Carefully (35% Don’t)
  • Ensure Visual Hit Areas Match the Actual Hit Areas (43% Don’t)

Design Principles

费茨定律

人机交互和人体工程学中人类活动的模型, 它预测了从任意位置快速移动到一个目标位置所需的时间, 由 2 个位置的距离(D)和目标大小(S)有关, 正比于 D, 反比于 S:

  • 关联性强的 UI 放置在一起
  • 大拇指点击热区
  • 屏幕边界视为无限大 (容易到达)
  • 关机滑动距离长

米勒定律

人的短时记忆能力广度为 7±2 个信息块:

  • 手机号/银行卡号/超大数字分段放置, 信息分层 e.g 134 9999 9999, 999, 999, 999
  • 文章布局时增大段落间 margin, 改变部分文字的粗细/字体/颜色
  • 导航/选项卡不超过 9 个 (超过 9 个可使用 dropdown/subMenu)

席克定律

用户所面临的选择数量越多, 做出选择所花费的时间就越长, 在人机交互的界面中选项越多, 意味着用户做出决策的时间越长:

  • 减少选项并提供默认值
  • 分类分层
  • 分步分页 (大部分手机应用注册界面)

泰斯勒定律

泰斯勒定律又称复杂性守恒定律, 该定律认为每一个过程都有其固有的复杂性, 这个复杂性存在一个临界点, 超过了这个点就不能再简化了, 你只能将固有的复杂性从一个地方移动到另外一个地方:

  • 智能手机: 按键的复杂度转为手机操作系统的复杂度
  • 智能推荐: 用户自己选择筛选条件的复杂度转为人工智能算法的复杂度
Copyright © SabertazBuilt with React and GatsbyLast Built Time 2022/4/16 10:40:24
\ No newline at end of file diff --git a/cssAdvancedNotes/index.html.gz b/cssAdvancedNotes/index.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..42ed16a7836e551f3479ee376a405cca32a1c769 GIT binary patch literal 53085 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 literal 0 HcmV?d00001 diff --git a/cssBasicNotes/index.html b/cssBasicNotes/index.html new file mode 100644 index 0000000000..0645c4fcf2 --- /dev/null +++ b/cssBasicNotes/index.html @@ -0,0 +1,2895 @@ +Sabertaz Blog \ No newline at end of file diff --git a/cssBasicNotes/index.html.gz b/cssBasicNotes/index.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..aec1927f46a25476165307b9630f0e2f5811a086 GIT binary patch literal 101829 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%0A5Yx2zBgIs$%NF95Ad0UYw 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

`*5>Qvu7f2_6dVFEK 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 literal 0 HcmV?d00001 diff --git a/designPatternsBasicNotes/index.html b/designPatternsBasicNotes/index.html new file mode 100644 index 0000000000..86e7525ff1 --- /dev/null +++ b/designPatternsBasicNotes/index.html @@ -0,0 +1,2064 @@ +Sabertaz Blog

Design PatternsArchitectureDevelopmentComputer Science

Design Patterns Notes

Posted on Mon May 15 2017
Last updated on Sun Mar 20 2022
(42 minutes)

Design Patterns Basic Notes

Basic Patterns

Software design is the art of managing dependencies and abstractions.

  • Minimizing dependencies.
  • Introduce fitting abstractions.

SOLID Principles

  • Single Responsibility Principle 单一功能原则
  • Open-closed Principle 开闭原则
  • Liskov Substitution Principle 里氏替换原则
  • Interface Segregation Principle 接口隔离原则
  • Dependency Inversion Principle 依赖反转原则

SOLID Principles

  • 单一职责是所有设计原则的基础
  • 开闭原则是设计的终极目标
  • 里氏替换原则强调的是子类替换父类后程序运行时的正确性, 它用来帮助实现开闭原则
  • 接口隔离原则用来帮助实现里氏替换原则, 同时它也体现了单一职责
  • 依赖倒置原则是过程式设计与面向对象设计的分水岭, 同时它也被用来指导接口隔离原则

Single Responsibility Principle

Too much functionality is in one class and you modify a piece of it, it can be difficult to understand how that will affect other dependent modules.

Open-Closed Principle

Allow users to add new functionalities without changing existing code, open for extension, close for modification.

class Coder {
+  constructor(fullName, language, hobby, education, workplace, position) {
+    this.fullName = fullName;
+    this.language = language;
+    this.hobby = hobby;
+    this.education = education;
+    this.workplace = workplace;
+    this.position = position;
+  }
+}
+
+// BAD: filter by any other new property have to change CodeFilter's code.
+class CoderFilter {
+  filterByName(coders, fullName) {
+    return coders.filter(coder => coder.fullName === fullName);
+  }
+
+  filterByLang(coders, language) {
+    return coders.filter(coder => coder.language === language);
+  }
+
+  filterByHobby(coders, hobby) {
+    return coders.filter(coder => coder.hobby === hobby);
+  }
+}
+
+// GOOD
+class CoderFilter {
+  filterByProp = (array, propName, value) =>
+    array.filter(element => element[propName] === value);
+}

Liskov Substitution Principle

Objects of ParentType can be replaced with objects of SubType without altering. Altering shows that SubType should not be subtype of ParentType (break Open Closed Principle), you should re-design ParentType and SubType.

Interface Segregation Principle

Clients should not be forced to depend upon interfaces that they do not use.

Dependency Inversion Principle

  • High-level modules should not depend on low-level modules. Both should depend on abstractions.
  • Abstractions should not depend upon details. Details should depend on abstractions.
  • Pros:
    • Loosely coupled modules.
    • Better reusability.
    • Better testability.

Literal Pattern

  • 不要使用 new Boolean()/new Number()/new String()
  • 避免使用 new Object()/new Array()

Closure and IIFE

Check Pattern

  • O || {} O || (O = {})
  • if (O && O.property)
  • if (typeof v === " ")
  • toString. apply(var)

Function Patterns

参数

  • 函数不应依赖于全局变量,实现与执行全局环境的的解耦
  • 全局变量应以函数参数/依赖的形式,注入函数内部

解耦

事件处理与 UI 逻辑

  • 事件处理函数与应用逻辑函数分开成单独函数,提高代码重用率
  • 应用逻辑函数不依赖于 event 对象,其属性值作为参数传入,易于解耦与测试
const MyApp = {
+  // 事件处理函数
+  handleClick(event) {
+    /* 将事件的属性作为参数,传递给应用逻辑函数
+     * 使得应用逻辑函数不依赖于 event 对象,易于解耦与测试
+     */
+    this.showPopup(event.clientX, event.clientY);
+  },
+
+  // 应用逻辑函数
+  showPopup(x, y) {
+    const popup = document.getElementById('popup');
+    popup.style.left = `${x}px`;
+    popup.style.top = `${y}px`;
+    popup.className = 'reveal';
+  },
+};

Env and Config

配置文件以 .env/JS(Object)/JSON/JSONP/XML/YML 格式单独存放,方便读取

Stand Library Idioms

  • use Number.isNaN not isNaN
  • use Number.isFinite not isFinite

Other Patterns

!!result 转化成 Boolean

Modular Patterns

Object Literal

通过对象字面量创建命名空间

APP.namespace = function (namespaceString) {
+  let parts = namespaceString.split('.');
+  let parent = APP;
+
+  // strip redundant leading global
+  if (parts[0] === 'APP') {
+    // remove leading global
+    parts = parts.slice(1);
+  }
+
+  for (let i = 0; i < parts.length; i += 1) {
+    // create a property if it doesn't exist
+    if (typeof parent[parts[i]] === 'undefined') {
+      parent[parts[i]] = {};
+    }
+    // 关键: 向内嵌套
+    parent = parent[parts[i]];
+  }
+
+  // 返回最内层模块
+  return parent;
+};
// assign returned value to a local var
+const module2 = APP.namespace('APP.modules.module2');
+module2 === APP.modules.module2; // true
+// skip initial `APP`
+APP.namespace('modules.module51');
+// long namespace
+APP.namespace('once.upon.a.time.there.was.this.long.nested.property');

IIFE Pattern

立即函数模式, 通过调用立即函数,返回一个对象,暴露(exposed to public)公共接口(特权/公共方法):

  • 闭包: 定义私有变量与特权方法
  • 返回对象: 即使通过外部代码改变返回对象的接口,也不会影响原接口
const obj = (function () {
+  // private member
+  let name = 'tazimi';
+
+  // private method
+  // excluded in return object
+
+  // privileged method
+  function getName() {
+    return name;
+  }
+
+  function setName(n) {
+    if (typeof n === 'string') {
+      name = n;
+    }
+    return this;
+  }
+
+  // public method
+  function logName() {
+    console.log(name);
+  }
+
+  // 闭包
+  // 公共接口: 特权/公共方法
+  return {
+    // 特权方法
+    getName,
+    setName,
+
+    // 公共方法
+    log: logName,
+  };
+})();
const App = App || {};
+App.utils = {};
+
+(function () {
+  let val = 5;
+
+  this.getValue = function () {
+    return val;
+  };
+
+  this.setValue = function (newVal) {
+    val = newVal;
+  };
+
+  // also introduce a new sub-namespace
+  this.tools = {};
+}.apply(App.utils));
+
+// inject new behavior into the tools namespace
+// which we defined via the utilities module
+
+(function () {
+  this.diagnose = function () {
+    return 'diagnosis';
+  };
+}.apply(App.utils.tools));
  • jQuery Plugin Pattern: 通过给立即函数传参,注入全局变量/其他依赖

UMD Pattern

Universal Module Definition:

  • 先判断是否支持 Node.js 的模块(exports),存在则使用 Node.js 模块模式
  • 再判断是否支持 AMD(define),存在则使用 AMD 方式加载模块
(function (window, factory) {
+  if (typeof exports === 'object') {
+    module.exports = factory();
+  } else if (typeof define === 'function' && define.amd) {
+    define(factory);
+  } else {
+    window.eventUtil = factory();
+  }
+})(this, function () {
+  // module ...
+});

Common Design Patterns

Common Design Patterns

Patterns Classification

Creation Patterns

  • Factory Method (工厂方法): 通过将数据和事件接口化来构建若干个子类.
  • Abstract Factory (抽象工厂): 建立若干族类的一个实例,这个实例不需要具体类的细节信息 (抽象类).
  • Builder (建造者): 将对象的构建方法和其表现形式分离开来,总是构建相同类型的对象.
  • Prototype (原型): 一个完全初始化的实例,用于拷贝或者克隆.
  • Singleton (单例): 一个类只有唯一的一个实例,这个实例在整个程序中有一个全局的访问点.

Structural Patterns

  • Adapter (适配器): 将不同类的接口进行匹配,调整,这样尽管内部接口不兼容但是不同的类还是可以协同工作的.
  • Bridge (桥接模式): 将对象的接口从其实现中分离出来,这样对象的实现和接口可以独立的变化.
  • Composite (组合模式): 通过将简单可组合的对象组合起来,构成一个完整的对象, 这个对象的能力将会超过这些组成部分的能力的总和,即会有新的能力产生.
  • Decorator (装饰器): 动态给对象增加一些可替换的处理流程。
  • Facade (外观模式): 一个类隐藏了内部子系统的复杂度,只暴露出一些简单的接口。
  • Flyweight (享元模式) 一个细粒度对象,用于将包含在其它地方的信息 在不同对象之间高效地共享。
  • Proxy (代理模式): 一个充当占位符的对象用来代表一个真实的对象。

Behavioral Patterns

  • Chain of Responsibility (响应链): 一种将请求在一串对象中传递的方式,寻找可以处理这个请求的对象.
  • Command (命令): 封装命令请求为一个对象,从而使记录日志,队列缓存请求,未处理请求进行错误处理 这些功能称为可能.
  • Interpreter (解释器): 将语言元素包含在一个应用中的一种方式,用于匹配目标语言的语法.
  • Iterator (迭代器): 在不需要直到集合内部工作原理的情况下,顺序访问一个集合里面的元素.
  • Mediator (中介者模式): 在类之间定义简化的通信方式,用于避免类之间显式的持有彼此的引用.
  • Observer (观察者模式): 用于将变化通知给多个类的方式,可以保证类之间的一致性.
  • Strategy (策略): 将算法封装到类中,将选择和实现分离开来.
  • State (状态): 当对象状态改变时,改变对象的行为.
  • Template Method (模板方法): 在一个方法中为某个算法建立一层外壳,将算法的具体步骤交付给子类去做.
  • Visitor (访问者): 为类增加新的操作而不改变类本身.

Factory Method Pattern

Creating objects without specify exact object class (not calling a constructor directly).

CoordinateSystem = {
+  CARTESIAN: 0,
+  POLAR: 1,
+};
+
+class Point {
+  constructor(x, y) {
+    this.x = x;
+    this.y = y;
+  }
+
+  static get factory() {
+    return new PointFactory();
+  }
+}
+
+class PointFactory {
+  static newCartesianPoint(x, y) {
+    return new Point(x, y);
+  }
+
+  static newPolarPoint(rho, theta) {
+    return new Point(rho * Math.cos(theta), rho * Math.sin(theta));
+  }
+}
+
+const point = PointFactory.newPolarPoint(5, Math.PI / 2);
+const point2 = PointFactory.newCartesianPoint(5, 6);
module.exports = (function () {
+  function VehicleFactory() {
+    const publicVehicle = {};
+
+    // specific factory
+    function Car(options) {
+      this.type = 'car';
+      this.doors = options.doors || 4;
+      this.state = options.state || 'brand new';
+      this.color = options.color || 'silver';
+      this.speed = options.speed || 10;
+    }
+    function Truck(options) {
+      this.type = 'truck';
+      this.state = options.state || 'used';
+      this.wheelSize = options.wheelSize || 'large';
+      this.color = options.color || 'blue';
+      this.speed = options.speed || 8;
+    }
+
+    // public features of vehicle , added to __proto__
+    function _run(...args) {
+      if (args.length === 0) {
+        console.log(`${this.type} - run with: ${this.speed}km/s`);
+      } else if (toString.apply(args[0]) === '[object Number]') {
+        this.speed = args[0];
+      }
+    }
+    function _withColor(...args) {
+      if (args.length === 0) {
+        console.log(
+          `The color of this ${this.type} product is : ${this.color}`
+        );
+      } else if (toString.apply(args[0]) === '[object String]') {
+        this.color = args[0];
+      }
+    }
+    // provide a function to change other public features
+    function _reform(funcName, newFunc) {
+      if (
+        typeof this[funcName] === 'function' ||
+        typeof this.prototype[funcName] === 'function'
+      ) {
+        delete this[funcName];
+        this.prototype[funcName] = newFunc;
+      }
+    }
+    // provide a function to add new public features
+    function _addFeature(funcName, newFunc) {
+      if (typeof this[funcName] === 'undefined') {
+        this[funcName] = newFunc;
+        this.prototype[funcName] = newFunc;
+      }
+    }
+
+    // private features, added to obj
+
+    // core: create method
+    this.create = function (options) {
+      let vehicleClass = '';
+      let newVehicle = {};
+
+      if (options.type === 'car') {
+        vehicleClass = Car;
+      } else {
+        vehicleClass = Truck;
+      }
+
+      // create new vehicle with options, by pre-defined specific constructor
+      newVehicle = new VehicleClass(options);
+      // set up prototype
+      newVehicle[[proto]] = publicVehicle;
+      newVehicle.prototype = publicVehicle;
+
+      // add public feature
+      newVehicle.prototype.run = _run;
+      newVehicle.prototype.withColor = _withColor;
+      newVehicle.prototype.reform = _reform;
+      newVehicle.prototype.addFeature = _addFeature;
+
+      // add private(separately) feature
+
+      // return new obj
+      return newVehicle;
+    };
+  }
+
+  // define more factory
+
+  return {
+    vehicleFactory: VehicleFactory,
+  };
+})();

Abstract Factory Pattern

Encapsulate a group of individual factories that have a common theme without specifying their concrete classes.

class Drink {
+  consume() {}
+}
+
+class Tea extends Drink {
+  consume() {
+    console.log('This is Tea');
+  }
+}
+
+class Coffee extends Drink {
+  consume() {
+    console.log(`This is Coffee`);
+  }
+}
+
+class DrinkFactory {
+  prepare(amount) {}
+}
+
+class TeaFactory extends DrinkFactory {
+  makeTea() {
+    console.log(`Tea Created`);
+    return new Tea();
+  }
+}
+
+class CoffeeFactory extends DrinkFactory {
+  makeCoffee() {
+    console.log(`Coffee Created`);
+    return new Coffee();
+  }
+}
+
+const teaDrinkFactory = new TeaFactory();
+const tea = teaDrinkFactory.makeTea();
+tea.consume();
const AbstractVehicleFactory = (function () {
+  // Storage for our vehicle types
+  const types = {};
+
+  function _getVehicle(type, customizations) {
+    const Vehicle = types[type];
+    return Vehicle ? new Vehicle(customizations) : null;
+  }
+  function _registerVehicle(type, Vehicle) {
+    const prototype = Vehicle.prototype;
+
+    // only register classes that fulfill the vehicle contract
+    if (prototype.drive && prototype.breakDown) {
+      types[type] = Vehicle;
+    }
+
+    return AbstractVehicleFactory;
+  }
+
+  return {
+    getVehicle: _getVehicle,
+    registerVehicle: _registerVehicle,
+  };
+})();

Builder Pattern

Flexible object creation with chain style calls.

class Person {
+  constructor() {
+    this.streetAddress = '';
+    this.postcode = '';
+    this.city = '';
+    this.companyName = '';
+    this.position = '';
+    this.annualIncome = 0;
+  }
+
+  toString() {
+    return (
+      `Person lives at ${this.streetAddress}, ${this.city}, ${this.postcode}\n` +
+      `and works at ${this.companyName} as a ${this.position} earning ${this.annualIncome}`
+    );
+  }
+}
+
+class PersonBuilder {
+  constructor(person = new Person()) {
+    this.person = person;
+  }
+
+  get lives() {
+    return new PersonAddressBuilder(this.person);
+  }
+
+  get works() {
+    return new PersonJobBuilder(this.person);
+  }
+
+  build() {
+    return this.person;
+  }
+}
+
+class PersonJobBuilder extends PersonBuilder {
+  constructor(person) {
+    super(person);
+  }
+
+  at(companyName) {
+    this.person.companyName = companyName;
+    return this;
+  }
+
+  asA(position) {
+    this.person.position = position;
+    return this;
+  }
+
+  earning(annualIncome) {
+    this.person.annualIncome = annualIncome;
+    return this;
+  }
+}
+
+class PersonAddressBuilder extends PersonBuilder {
+  constructor(person) {
+    super(person);
+  }
+
+  at(streetAddress) {
+    this.person.streetAddress = streetAddress;
+    return this;
+  }
+
+  withPostcode(postcode) {
+    this.person.postcode = postcode;
+    return this;
+  }
+
+  in(city) {
+    this.person.city = city;
+    return this;
+  }
+}
+
+const personBuilder = new PersonBuilder();
+const person = personBuilder.lives
+  .at('ABC Road')
+  .in('Multan')
+  .withPostcode('66000')
+  .works.at('Beijing')
+  .asA('Engineer')
+  .earning(10000)
+  .build();

Prototype Pattern

可以使用原型模式来减少创建新对象的成本. 关键方法 Object.create()/clone().

class Car {
+  constructor(name, model) {
+    this.name = name;
+    this.model = model;
+  }
+
+  SetName(name) {
+    console.log(`${name}`);
+  }
+
+  clone() {
+    return new Car(this.name, this.model);
+  }
+}
+
+const car = new Car();
+car.SetName('Audi');
+
+const car2 = car.clone();
+car2.SetName('BMW');

Singleton Pattern

Use Case: Redux, VueX 等状态管理工具, window 对象, 全局缓存等.

class Singleton {
+  constructor() {
+    const instance = this.constructor.instance;
+    if (instance) return instance;
+    this.constructor.instance = this;
+  }
+
+  say() {
+    console.log('Saying...');
+  }
+}
function Universe() {
+  // 缓存实例
+  let instance;
+
+  // anti-Self-Defined Function Pattern
+  // 反-自定义函数模式: 先重写,再初始化
+  // eslint-disable-next-line no-func-assign
+  Universe = function Universe() {
+    return instance;
+  };
+
+  // 保存原型,使其一直保持于同一位置
+  // (this指针指向不重要)
+  Universe.prototype = this;
+
+  instance = new Universe();
+  // 重定向constructor指针
+  instance.constructor = Universe;
+  // 功能代码
+  instance.start_time = 0;
+  instance.bang = 'Big';
+
+  return instance;
+}

Adapter Pattern

适配器通过内部使用新接口规定的属性/方法, 创建一个外观与旧接口一致的方法 (兼容旧代码):

  • old.method().
  • adapter.method(): 实现此 method 时, 使用了新接口规定的属性/方法.
class Calculator1 {
+  constructor() {
+    this.operations = function (value1, value2, operation) {
+      switch (operation) {
+        case 'add':
+          return value1 + value2;
+        case 'sub':
+          return value1 - value2;
+        default:
+          throw new Error('Unsupported operations!');
+      }
+    };
+  }
+}
+
+class Calculator2 {
+  constructor() {
+    this.add = function (value1, value2) {
+      return value1 + value2;
+    };
+
+    this.sub = function (value1, value2) {
+      return value1 - value2;
+    };
+  }
+}
+
+class CalcAdapter {
+  constructor() {
+    const cal2 = new Calculator2();
+
+    this.operations = function (value1, value2, operation) {
+      switch (operation) {
+        case 'add':
+          return cal2.add(value1, value2);
+        case 'sub':
+          return cal2.sub(value1, value2);
+        default:
+          throw new Error('Unsupported operations!');
+      }
+    };
+  }
+}
// old interface
+function Shipping() {
+  this.request = function (zipStart, zipEnd, weight) {
+    // ...
+    return '$49.75';
+  };
+}
+
+// new interface
+function AdvancedShipping() {
+  this.login = function (credentials) {
+    /* ... */
+  };
+  this.setStart = function (start) {
+    /* ... */
+  };
+  this.setDestination = function (destination) {
+    /* ... */
+  };
+  this.calculate = function (weight) {
+    return '$39.50';
+  };
+}
+
+// adapter interface
+function AdapterShipping(credentials) {
+  const shipping = new AdvancedShipping();
+
+  shipping.login(credentials);
+
+  return {
+    request(zipStart, zipEnd, weight) {
+      shipping.setStart(zipStart);
+      shipping.setDestination(zipEnd);
+      return shipping.calculate(weight);
+    },
+  };
+}
const shipping = new Shipping();
+const adapterShipping = new AdapterShipping(credentials);
+
+// original shipping object and interface
+let cost = shipping.request('78701', '10010', '2 lbs');
+log.add(`Old cost: ${cost}`);
+// new shipping object with adapted interface
+cost = adapter.request('78701', '10010', '2 lbs');

Bridge Pattern

  • Split large class or set of closely related classes into two separate hierarchies:
    • 分离抽象和实现 (Separate abstracts and implements).
    • 分离对象的两种不同属性. e.g 从 2 个不同维度上扩展对象.
class VectorRenderer {
+  renderCircle(radius) {
+    console.log(`Drawing a circle of radius ${radius}`);
+  }
+}
+
+class RasterRenderer {
+  renderCircle(radius) {
+    console.log(`Drawing pixels for circle of radius ${radius}`);
+  }
+}
+
+class Shape {
+  constructor(renderer) {
+    this.renderer = renderer;
+  }
+}
+
+class Circle extends Shape {
+  constructor(renderer, radius) {
+    super(renderer);
+    this.radius = radius;
+  }
+
+  draw() {
+    this.renderer.renderCircle(this.radius);
+  }
+
+  resize(factor) {
+    this.radius *= factor;
+  }
+}
+
+const raster = new RasterRenderer();
+const vector = new VectorRenderer();
+const circle = new Circle(vector, 5);
+circle.draw();
+circle.resize(2);
+circle.draw();

Composite Pattern

树形结构:

  • 根结点
    • Component 抽象对象/接口 采用最大宽接口,定义内点和叶点的操作
    • 将内点特有的操作集设为缺省操作集(空实现)
  • 内点
    • 持有父结点和子节点的引用(可使用 Flyweight 模式实现共享)
    • 操作集:内点操作集(可添加/删除组件)
  • 叶点
    • 持有父结点引用
    • 操作集:叶点操作集(不可添加/删除组件)

Decorator Pattern

  • 重写/重载/扩展对象原有的行为 (method), 但不改变对象原有属性
  • 可以添加新属性,并围绕新属性扩展对象的原行为 e.g 原对象只会说中文,装饰后同时说中文与英文
  • 避免了通过继承来为类型添加新的职责的形式可取,通过继承的方式容易造成子类的膨胀
  • 保持接口的一致性,动态改变对象的外观/职责
  • ConcreteDecorator 类: private ClassName component;(拥有一个对象引用)
const __decorate = function (decorators, target, key, desc) {
+  const argumentsLength = arguments.length;
+  let descriptorOrTarget;
+  let decorator;
+
+  if (argumentsLength < 3) {
+    // class decorator
+    descriptorOrTarget = target;
+  } else if (desc === null) {
+    // method decorator
+    descriptorOrTarget = Object.getOwnPropertyDescriptor(target, key);
+  }
+
+  for (let i = decorators.length - 1; i >= 0; i--) {
+    if (decorators[i]) {
+      decorator = decorators[i];
+
+      if (argumentsLength < 3) {
+        // if the decorator function returns a value use it;
+        // otherwise use the original.
+        descriptorOrTarget =
+          decorator(descriptorOrTarget) || descriptorOrTarget;
+      } else {
+        // if the decorator function returns a descriptor use it;
+        // otherwise use the original.
+        descriptorOrTarget =
+          decorator(target, key, descriptorOrTarget) || descriptorOrTarget;
+      }
+    }
+  }
+
+  if (argumentsLength > 3 && descriptorOrTarget) {
+    Object.defineProperty(target, key, descriptorOrTarget);
+  }
+
+  return descriptorOrTarget;
+};

Decorator Implementation

关键在于实现传递方式, 两种方式:

  • uber 属性获得每次装饰后结果
  • 循环叠加每次装饰后结果

符合开放封闭原则和单一职责模式.

// 构造函数
+function Sale(price) {
+  this.price = price || 100;
+}
+Sale.prototype.getPrice = function () {
+  return this.price;
+};
+
+// 定义具体装饰器
+// 通过uber属性获得上一次装饰后的结果
+Sale.decorators = {};
+Sale.decorators.fedTax = {
+  getPrice() {
+    let price = this.uber.getPrice();
+    price += (price * 5) / 100;
+    return price;
+  },
+};
+Sale.decorators.quebec = {
+  getPrice() {
+    let price = this.uber.getPrice();
+    price += (price * 7.5) / 100;
+    return price;
+  },
+};
+Sale.decorators.money = {
+  getPrice() {
+    return `$${this.uber.getPrice().toFixed(2)}`;
+  },
+};
+Sale.decorators.cdn = {
+  getPrice() {
+    return `CDN$ ${this.uber.getPrice().toFixed(2)}`;
+  },
+};
+
+Sale.prototype.decorate = function (decorator) {
+  const F = function () {};
+  const overrides = this.constructor.decorators[decorator];
+
+  // 临时代理构造函数
+  F.prototype = this;
+  const newObj = new F();
+
+  // 传递实现的关键
+  // 通过uber属性获得上一次装饰后的结果
+  newObj.uber = F.prototype;
+
+  for (const i in overrides) {
+    if (Object.prototype.hasOwnProperty.call(overrides, i)) {
+      newObj[i] = overrides[i];
+    }
+  }
+
+  return newObj;
+};

Decorators List

// 构造函数
+function Sale(price) {
+  this.price = price > 0 || 100;
+  this.decorators_list = [];
+}
+Sale.prototype.getPrice = function () {
+  return this.price;
+};
+
+// 定义具体装饰器
+Sale.decorators = {};
+Sale.decorators.fedTax = {
+  getPrice(price) {
+    return price + (price * 5) / 100;
+  },
+};
+Sale.decorators.quebec = {
+  getPrice(price) {
+    return price + (price * 7.5) / 100;
+  },
+};
+Sale.decorators.money = {
+  getPrice(price) {
+    return `$${price.toFixed(2)}`;
+  },
+};
+
+Sale.prototype.decorate = function (decorator) {
+  this.decorators_list.push(decorator);
+};
+Sale.prototype.getPrice = function () {
+  let price = this.price;
+  const max = this.decorators_list.length;
+
+  for (let i = 0; i < max; i += 1) {
+    const name = this.decorators_list[i];
+    // 传递实现的关键
+    // 通过循环叠加上一次装饰后的结果
+    price = Sale.decorators[name].getPrice(price);
+  }
+
+  return price;
+};

Decorator Pattern Example

// The constructor to decorate
+function MacBook() {
+  this.cost = function () {
+    return 997;
+  };
+  this.screenSize = function () {
+    return 11.6;
+  };
+}
+
+// Decorator 1
+function Memory(macBook) {
+  const v = macBook.cost();
+  macBook.cost = function () {
+    return v + 75;
+  };
+}
+
+// Decorator 2
+function Engraving(macBook) {
+  const v = macBook.cost();
+  macBook.cost = function () {
+    return v + 200;
+  };
+}
+
+// Decorator 3
+function Insurance(macBook) {
+  const v = macBook.cost();
+  macBook.cost = function () {
+    return v + 250;
+  };
+}
const mb = new MacBook();
+Memory(mb);
+Engraving(mb);
+Insurance(mb);
+
+// Outputs: 1522
+console.log(mb.cost());
+
+// Outputs: 11.6
+console.log(mb.screenSize());

Facade Pattern

将多个复杂的子系统封装+合并, 实现一个复杂功能, 但只暴露一个简单的接口: 封装复杂逻辑.

class CPU {
+  freeze() {
+    console.log('Freezed....');
+  }
+
+  jump(position) {
+    console.log('Go....');
+  }
+
+  execute() {
+    console.log('Run....');
+  }
+}
+
+class Memory {
+  load(position, data) {
+    console.log('Load....');
+  }
+}
+
+class HardDrive {
+  read(lba, size) {
+    console.log('Read....');
+  }
+}
+
+class ComputerFacade {
+  constructor() {
+    this.processor = new CPU();
+    this.ram = new Memory();
+    this.hd = new HardDrive();
+  }
+
+  start() {
+    this.processor.freeze();
+    this.ram.load(
+      this.BOOT_ADDRESS,
+      this.hd.read(this.BOOT_SECTOR, this.SECTOR_SIZE)
+    );
+    this.processor.jump(this.BOOT_ADDRESS);
+    this.processor.execute();
+  }
+}
+
+const computer = new ComputerFacade();
+computer.start();
sabertazimi.addMyEvent = function (el, ev, fn) {
+  if (el.addEventListener) {
+    el.addEventListener(ev, fn, false);
+  } else if (el.attachEvent) {
+    el.attachEvent(`on${ev}`, fn);
+  } else {
+    el[`on${ev}`] = fn;
+  }
+};

Flyweight Pattern

减小内存开销:

  • 内在信息 - 对象中的内部方法所需信息/属性, 一个单独的享元可替代大量具有相同内在信息的对象
  • 外部状态作为方法参数:使之适应不同的外部状态(context)——对象实例差异处
  • 某个类型的对象有大量的实例,对这些实例进行分类,合并相同分类的对象,只创建少量实例(享元)
  • 通过享元工厂来管理一组享元,当所需享元已存在时,返回已存在享元;当所需享元不存在时,创建新享元
function Flyweight(make, model, processor) {
+  this.make = make;
+  this.model = model;
+  this.processor = processor;
+}
+
+const FlyWeightFactory = (function () {
+  const flyweights = {};
+
+  return {
+    get(make, model, processor) {
+      // 不存在所需享元,新建新享元
+      if (!flyweights[make + model]) {
+        flyweights[make + model] = new Flyweight(make, model, processor);
+      }
+
+      return flyweights[make + model];
+    },
+
+    getCount() {
+      let count = 0;
+      for (const f in flyweights) count++;
+      return count;
+    },
+  };
+})();
+
+const Computer = function (make, model, processor, memory, tag) {
+  this.flyweight = FlyWeightFactory.get(make, model, processor);
+  this.memory = memory;
+  this.tag = tag;
+  this.getMake = function () {
+    return this.flyweight.make;
+  };
+  // ...
+};
+
+function ComputerCollection() {
+  const computers = {};
+  let count = 0;
+
+  return {
+    add(make, model, processor, memory, tag) {
+      computers[tag] = new Computer(make, model, processor, memory, tag);
+      count++;
+    },
+
+    get(tag) {
+      return computers[tag];
+    },
+
+    getCount() {
+      return count;
+    },
+  };
+}
+
+(function () {
+  const computers = new ComputerCollection();
+
+  computers.add('Dell', 'Studio XPS', 'Intel', '5G', 'Y755P');
+  computers.add('Dell', 'Studio XPS', 'Intel', '6G', 'X997T');
+  computers.add('Dell', 'Studio XPS', 'Intel', '2G', 'NT777');
+  computers.add('Dell', 'Studio XPS', 'Intel', '2G', '0J88A');
+  computers.add('HP', 'Envy', 'Intel', '4G', 'CNU883701');
+  computers.add('HP', 'Envy', 'Intel', '2G', 'TXU003283');
+
+  console.log(`Computers: ${computers.getCount()}`);
+  console.log(`Flyweights: ${FlyWeightFactory.getCount()}`);
+})();

Proxy Pattern

通过一个代理对象, 临时存储原对象方法调用产生的一系列结果 (新建对象), 减少重复对象的产生.

Use Case: 图片预加载, 缓存服务器, 处理跨域, 拦截器等.

class Percentage {
+  constructor(percent) {
+    this.percent = percent;
+  }
+
+  toString() {
+    return `${this.percent}&`;
+  }
+
+  valueOf() {
+    return this.percent / 100;
+  }
+}
+
+const fivePercent = new Percentage(5);
+console.log(fivePercent.toString());
+console.log(`5% of 50 is ${50 * fivePercent}`);
function GeoCoder() {
+  this.getLatLng = function (address) {
+    if (address === 'Amsterdam') {
+      return '52.3700° N, 4.8900° E';
+    } else if (address === 'London') {
+      return '51.5171° N, 0.1062° W';
+    } else if (address === 'Paris') {
+      return '48.8742° N, 2.3470° E';
+    } else if (address === 'Berlin') {
+      return '52.5233° N, 13.4127° E';
+    } else {
+      return '';
+    }
+  };
+}
+
+function GeoProxy() {
+  const geocoder = new GeoCoder();
+  const geocache = {};
+
+  return {
+    getLatLng(address) {
+      if (!geocache[address]) {
+        geocache[address] = geocoder.getLatLng(address);
+      }
+      log.add(`${address}: ${geocache[address]}`);
+      return geocache[address];
+    },
+    getCount() {
+      let count = 0;
+      for (const code in geocache) {
+        count++;
+      }
+      return count;
+    },
+  };
+}

Proxy in Vue:

const original = { name: 'jeff' };
+
+const reactive = new Proxy(original, {
+  get(target, key) {
+    console.log('Tracking: ', key);
+    return target[key];
+  },
+  set(target, key, value) {
+    console.log('updating UI...');
+    return Reflect.set(target, key, value);
+  },
+});
+
+console.log(reactive.name); // 'Tracking: name'
+reactive.name = 'bob'; // 'updating UI...'

Chain of Responsibility Pattern

一种将请求在一串对象中传递的方式,寻找可以处理这个请求的对象.

Use Case: Middlewares (Redux, Express, Koa).

class Creature {
+  constructor(name, attack, defense) {
+    this.name = name;
+    this.attack = attack;
+    this.defense = defense;
+  }
+
+  toString() {
+    return `${this.name} (${this.attack}/${this.defense})`;
+  }
+}
+
+class CreatureModifier {
+  constructor(creature) {
+    this.creature = creature;
+    this.next = null;
+  }
+
+  // Build chains.
+  add(modifier) {
+    if (this.next) this.next.add(modifier);
+    else this.next = modifier;
+  }
+
+  // Pass objects along to chains.
+  handle() {
+    if (this.next) this.next.handle();
+  }
+}
+
+class NoBonusesModifier extends CreatureModifier {
+  constructor(creature) {
+    super(creature);
+  }
+
+  handle() {
+    console.log('No bonuses for you!');
+  }
+}
+
+class DoubleAttackModifier extends CreatureModifier {
+  constructor(creature) {
+    super(creature);
+  }
+
+  handle() {
+    console.log(`Doubling ${this.creature.name}'s attack`);
+    this.creature.attack *= 2;
+    super.handle(); // Call next();
+  }
+}
+
+class IncreaseDefenseModifier extends CreatureModifier {
+  constructor(creature) {
+    super(creature);
+  }
+
+  handle() {
+    if (this.creature.attack <= 2) {
+      console.log(`Increasing ${this.creature.name}'s defense`);
+      this.creature.defense++;
+    }
+    super.handle(); // Call next();
+  }
+}
+
+const peekachu = new Creature('Peekachu', 1, 1);
+console.log(peekachu.toString());
+
+const root = new CreatureModifier(peekachu);
+root.add(new DoubleAttackModifier(peekachu));
+root.add(new IncreaseDefenseModifier(peekachu));
+// Chain: creatureModifier -> doubleAttackModifier -> increaseDefenseModifier.
+root.handle();
+
+console.log(peekachu.toString());

Command Pattern

有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁 (多个对象中的某个随机对象),也不知道被请求的操作是什么. 此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此的耦合关系

  • 将方法/动作封装成对象, 使得外部通过唯一方法 execute/run 调用内部方法/动作
  • 客户创建命令;调用者执行该命令;接收者在命令执行时执行相应操作
  • 客户通常被包装为一个对象,但是这不是必然的
  • 调用者接过命令并将其保存下来, 它会在某个时候调用该命令对象的 execute 方法
  • 调用者进行 commandObject.execute 这种调用时, 它所调用的方法将转而以 receiver.action() 这种形式调用恰当的方法

client and receiver

const SimpleCommand = function (receiving) {
+  this.receiving = receiving;
+};
+
+SimpleCommand.prototype.execute = function () {
+  this.receiving.action();
+};
module.exports = (function () {
+  const manager = {};
+
+  // command to be encapsulated
+  manager.isNull = function (nu) {
+    return toString.apply(nu) === '[object Null]';
+  };
+  manager.isArray = function (arr) {
+    return toString.apply(arr) === '[object Array]';
+  };
+  manager.isString = function (str) {
+    return toString.apply(str) === '[object String]';
+  };
+
+  // public api
+  function execute(command, ...args) {
+    return manager[command] && manager[command](...args);
+  }
+  function run(command) {
+    return manager[command] && manager[command](...arg);
+  }
+
+  return {
+    execute,
+    run,
+  };
+})();

Command pattern in UI development, bind command to UI components:

  • Executor: UI components.
  • Client and receiver: background tasks or other UI components.
  • Executor -> client: command.execute() -> receiver: receiver.action().

e.g click button -> refresh menu

// receiver
+const MenuBar = {
+  action() {
+    this.refresh();
+  },
+  refresh() {
+    console.log('refresh menu pages');
+  },
+};
+
+// client: command object
+// command: object with `action` implemented
+const Command = receiver => {
+  return function () {
+    receiver.action();
+  };
+};
+const RefreshMenuBarCommand = Command(MenuBar);
+
+// executor
+button.setCommand = command => {
+  button.command = command;
+};
+button.setCommand(RefreshMenuBarCommand);
+
+button.addEventLister('click', event => {
+  button.command();
+});
const MenuCommand = function (action) {
+  this.action = action;
+};
+MenuCommand.prototype.execute = function () {
+  this.action();
+};
+
+const fileActions = new FileActions();
+const EditActions = new EditActions();
+const InsertActions = new InsertActions();
+const HelpActions = new HelpActions();
+
+const appMenuBar = new MenuBar();
+// -----------
+const fileMenu = new Menu('File');
+const openCommand = new MenuCommand(fileActions.open);
+const closeCommand = new MenuCommand(fileActions.close);
+const saveCommand = new MenuCommand(fileActions.save);
+const saveAsCommand = new MenuCommand(fileActions.saveAs);
+
+fileMenu.add(new MenuItem('open', openCommand));
+fileMenu.add(new MenuItem('Close', closeCommand));
+fileMenu.add(new MenuItem('Save', saveCommand));
+fileMenu.add(new MenuItem('Close', saveAsCommand));
+
+appMenuBar.add(fileMenu);
+// --------------
+const editMenu = new Menu('Edit');
+const cutCommand = new MenuCommand(EditActions.cut);
+const copyCommand = new MenuCommand(EditActions.copy);
+const pasteCommand = new MenuCommand(EditActions.paste);
+const deleteCommand = new MenuCommand(EditActions.delete);
+
+editMenu.add(new MenuItem('Cut', cutCommand));
+editMenu.add(new MenuItem('Copy', copyCommand));
+editMenu.add(new MenuItem('Paste', pasteCommand));
+editMenu.add(new MenuItem('Delete', deleteCommand));
+
+appMenuBar.add(editMenu);
+
+// ------------
+const insertMenu = new Menu('Insert');
+const textBlockCommand = new MenuCommand(InsertActions.textBlock);
+insertMenu.add(new MenuItem('Text  Block', textBlockCommand));
+appMenuBar.add(insertMenu);
+
+// ------------
+const helpMenu = new Menu('Help');
+const showHelpCommand = new MenuCommand(HelpActions.showHelp());
+helpMenu.add(new MenuItem('Show Help', showHelpCommand));
+appMenuBar.add(helpMenu);
+
+document.getElementsByTagName('body')[0].appendChild(appMenuBar.getElement());
+appMenuBar.show();

Command sequences to implement Macro/Batch/Undo command:

const Cursor = function (width, height, parent) {
+  this.width = width;
+  this.height = height;
+  this.commandStack = [];
+
+  this.canvas = document.createElement('canvas');
+  this.canvas.width = this.width;
+  this.canvas.height = this.height;
+  parent.appendChild(this.canvas);
+
+  this.ctx = this.canvas.getContext('2d');
+  this.ctx.fillStyle = '#CCC000';
+  this.move(0, 0);
+};
+
+Cursor.prototype = {
+  move(x, y) {
+    this.commandStack.push(() => {
+      // `this` point to `Cursor`.
+      this.lineTo(x, y);
+    });
+  },
+  lineTo(x, y) {
+    this.position.x += x;
+    this.position.y += y;
+    this.ctx.lineTo(this.position.x, this.position.y);
+  },
+  executeCommands() {
+    this.position = { x: this.width / 2, y: this.height / 2 };
+    this.ctx.clearRect(0, 0, this.width, this.height);
+    this.ctx.beginPath();
+    this.ctx.moveTo(this.position.x, this.position.y);
+    for (let i = 0; i < this.commandStack.length; i++) {
+      this.commandStack[i]();
+    }
+    this.ctx.stroke();
+  },
+  undo() {
+    this.commandStack.pop();
+    this.executeCommands();
+  },
+};

Iterator Pattern

一个 Iterator 对象封装访问和遍历一个聚集对象中的各个构件的方法. 实现统一遍历接口, 符合单一功能和开放封闭原则.

Use Case: 遍历对象.

class Stuff {
+  constructor() {
+    this.a = 11;
+    this.b = 22;
+  }
+
+  [Symbol.iterator]() {
+    // eslint-disable-next-line @typescript-eslint/no-this-alias
+    const self = this;
+    let i = 0;
+
+    return {
+      next() {
+        return {
+          done: i > 1,
+          value: self[i++ === 0 ? 'a' : 'b'],
+        };
+      },
+    };
+  }
+
+  get backwards() {
+    // eslint-disable-next-line @typescript-eslint/no-this-alias
+    const self = this;
+    let i = 0;
+
+    return {
+      next() {
+        return {
+          done: i > 1,
+          value: self[i++ === 0 ? 'b' : 'a'],
+        };
+      },
+      // Make iterator iterable
+      [Symbol.iterator]() {
+        return this;
+      },
+    };
+  }
+}
+
+const stuff = new Stuff();
+for (const item of stuff) console.log(`${item}`);
+for (const item of stuff.backwards) console.log(`${item}`);

Mediator Pattern

一个 Mediator 对象封装对象间的协议: 中央集权的控制中心 - 所有观察者共享一个共有的被观察者(所有订阅者订阅同一个节点).

Defines an object that encapsulates how a set of objects interact:

class Person {
+  constructor(name) {
+    this.name = name;
+    this.chatLog = [];
+  }
+
+  receive(sender, message) {
+    const s = `${sender}: '${message}'`;
+    console.log(`[${this.name}'s chat session] ${s}`);
+    this.chatLog.push(s);
+  }
+
+  say(message) {
+    this.room.broadcast(this.name, message);
+  }
+
+  pm(who, message) {
+    this.room.message(this.name, who, message);
+  }
+}
+
+class ChatRoom {
+  constructor() {
+    this.people = [];
+  }
+
+  broadcast(source, message) {
+    for (const p of this.people)
+      if (p.name !== source) p.receive(source, message);
+  }
+
+  join(p) {
+    const joinMsg = `${p.name} joins the chat`;
+    this.broadcast('room', joinMsg);
+    p.room = this;
+    this.people.push(p);
+  }
+
+  message(source, destination, message) {
+    for (const p of this.people)
+      if (p.name === destination) p.receive(source, message);
+  }
+}
+
+const room = new ChatRoom();
+const zee = new Person('Zee');
+const shan = new Person('Shan');
+
+room.join(zee);
+room.join(shan);
+zee.say('Hello!!');
+
+const doe = new Person('Doe');
+room.join(doe);
+doe.say('Hello everyone!');

Observer Pattern

  • 被观察者(Subject)维护一组观察者列表, 每当被观察者状态改变时, 调用 notify 函数, 此函数中调用观察者(Observer)的 update 函数(可自定义).
  • decouple subject and observer: each depends on Abstraction not Implementation.

Use Case: 解耦, 跨层级通信, 事件绑定.

class Event {
+  constructor() {
+    this.handlers = new Map();
+    this.count = 0;
+  }
+
+  subscribe(handler) {
+    this.handlers.set(++this.count, handler);
+    return this.count;
+  }
+
+  unsubscribe(idx) {
+    this.handlers.delete(idx);
+  }
+
+  fire(sender, args) {
+    this.handlers.forEach((v, k) => v(sender, args));
+  }
+}
+
+class FallsIllArgs {
+  constructor(address) {
+    this.address = address;
+  }
+}
+
+class Person {
+  constructor(address) {
+    this.address = address;
+    this.fallsIll = new Event();
+  }
+
+  catchCold() {
+    this.fallsIll.fire(this, new FallsIllArgs(this.address));
+  }
+}
+
+const person = new Person('ABC road');
+const sub = person.fallsIll.subscribe((s, a) => {
+  console.log(`A doctor has been called to ${a.address}`);
+});
+person.catchCold();
+person.catchCold();
+
+person.fallsIll.unsubscribe(sub);
+person.catchCold();
function ObserverList() {
+  this.observerList = [];
+}
+
+ObserverList.prototype.Add = function (obj) {
+  return this.observerList.push(obj);
+};
+
+ObserverList.prototype.Empty = function () {
+  this.observerList = [];
+};
+
+ObserverList.prototype.Count = function () {
+  return this.observerList.length;
+};
+
+ObserverList.prototype.Get = function (index) {
+  if (index > -1 && index < this.observerList.length) {
+    return this.observerList[index];
+  }
+};
+
+ObserverList.prototype.Insert = function (obj, index) {
+  let pointer = -1;
+
+  if (index === 0) {
+    this.observerList.unshift(obj);
+    pointer = index;
+  } else if (index === this.observerList.length) {
+    this.observerList.push(obj);
+    pointer = index;
+  }
+
+  return pointer;
+};
+
+ObserverList.prototype.IndexOf = function (obj, startIndex) {
+  let i = startIndex;
+  let pointer = -1;
+
+  while (i < this.observerList.length) {
+    if (this.observerList[i] === obj) {
+      pointer = i;
+    }
+    i++;
+  }
+
+  return pointer;
+};
+
+ObserverList.prototype.RemoveAt = function (index) {
+  if (index === 0) {
+    this.observerList.shift();
+  } else if (index === this.observerList.length - 1) {
+    this.observerList.pop();
+  }
+};
+
+//  被观察者维护一个观察者列表
+function Subject() {
+  this.observers = new ObserverList();
+}
+
+Subject.prototype.AddObserver = function (observer) {
+  this.observers.Add(observer);
+};
+
+Subject.prototype.RemoveObserver = function (observer) {
+  this.observers.RemoveAt(this.observers.IndexOf(observer, 0));
+};
+
+Subject.prototype.Notify = function (context) {
+  const observerCount = this.observers.Count();
+  for (let i = 0; i < observerCount; i++) {
+    this.observers.Get(i).Update(context);
+  }
+};
+
+// The Observer
+function Observer() {
+  this.Update = function () {
+    // ...
+  };
+}
+
+// Extend an object with an extension
+function extend(extension, obj) {
+  for (const key in extension) {
+    obj[key] = extension[key];
+  }
+}

Pub-Sub Pattern

  • 观察者模式中主体和观察者是互相感知.
  • 发布-订阅模式是借助第三方来实现调度, 发布者和订阅者之间互不感知.

e.g Event Bus in Vue, Event Emitter in Node.

Pub-Sub Pattern Implementation

  • pubSub.js
module.exports = (function (window, doc, undef) {
+  const pubSub = {};
+
+  const topics = {};
+  let subUid = -1;
+
+  pubSub.publish = function (topic, args) {
+    // undefined check
+    if (!topics[topic]) {
+      return false;
+    }
+
+    setTimeout(function () {
+      const subscribers = topics[topic];
+      let len = subscribers ? subscribers.length : 0;
+
+      while (len--) {
+        subscribers[len].func(topic, args);
+      }
+    }, 0);
+
+    return true;
+  };
+
+  pubSub.subscribe = function (topic, func) {
+    // undefined check
+    if (!topics[topic]) {
+      topics[topic] = [];
+    }
+
+    // add observer to observerList (topics)
+    const token = (++subUid).toString();
+    topics[topic].push({
+      token,
+      func,
+    });
+    return token;
+  };
+
+  pubSub.unsubscribe = function (token) {
+    for (const m in topics) {
+      if (topics[m]) {
+        for (let i = 0, j = topics[m].length; i < j; i++) {
+          if (topics[m][i].token === token) {
+            topics[m].splice(i, 1);
+            return token;
+          }
+        }
+      }
+    }
+    return false;
+  };
+
+  return pubSub;
+})(this, this.document, undefined);
  • test.js
const pubsub = require('./pubSub.js');
+
+// add observer to observerList
+const testFirstSub = pubsub.subscribe('login', function (topic, data) {
+  console.log(`${topic}: ${data}`);
+});
+
+// subject broadcast/notify, observer update
+pubsub.publish('login', 'hello world!');
+pubsub.publish('login', ['test', 'a', 'b', 'c']);
+pubsub.publish('login', [{ color: 'blue' }, { text: 'hello' }]);
+
+setTimeout(function () {
+  pubsub.unsubscribe(testFirstSub);
+}, 0);
+
+// permanent subscribe
+pubsub.subscribe('sum', function (topic, data) {
+  if (toString.apply(data) !== '[object Array]') {
+    console.log(`Please input array: * ${data} * is not array!`);
+  } else {
+    const tmp = data.filter(function (item) {
+      return toString.apply(item) === '[object Number]';
+    });
+
+    if (tmp.length) {
+      const sum = tmp.reduce(function (previous, current) {
+        return previous + current;
+      }, 0);
+      console.log(`Sum of ${data} : ${sum}`);
+    } else {
+      console.log(
+        `Please input number array: * ${data} * is not number array!`
+      );
+    }
+  }
+
+  return this;
+});
+
+pubsub.publish('login', 'hello again!');
+pubsub.publish('sum', 'hello again!');
+pubsub.publish('sum', [1, 2, 3, 4, 5]);
+pubsub.publish('sum', ['a', 'b', 'c', 'd', 'e']);
  • in jQuery
// Equivalent to subscribe(topicName, callback)
+$(document).on('topicName', function () {
+  // ..perform some behavior
+});
+
+// Equivalent to publish(topicName)
+$(document).trigger('topicName');
+
+// Equivalent to unsubscribe(topicName)
+$(document).off('topicName');
  • MicroEvent.js
/**
+ * MicroEvent - to make any js object an event emitter (server or browser)
+ *
+ * - pure javascript - server compatible, browser compatible
+ * - don't rely on the browser doms
+ * - super simple - you get it immediately, no mystery, no magic involved
+ *
+ * - create a MicroEventDebug with goodies to debug
+ *   - make it safer to use
+ */
+
+const MicroEvent = function () {};
+MicroEvent.prototype = {
+  bind(event, fct) {
+    this._events = this._events || {};
+    this._events[event] = this._events[event] || [];
+    this._events[event].push(fct);
+  },
+  unbind(event, fct) {
+    this._events = this._events || {};
+    if (event in this._events === false) return;
+    this._events[event].splice(this._events[event].indexOf(fct), 1);
+  },
+  trigger(event, ...args) {
+    this._events = this._events || {};
+    if (event in this._events === false) return;
+    for (let i = 0; i < this._events[event].length; i++) {
+      this._events[event][i].apply(this, args);
+    }
+  },
+};
+
+/**
+ * mixin will delegate all MicroEvent.js function in the destination object
+ *
+ * - require('MicroEvent').mixin(Foobar) will make Foobar able to use MicroEvent
+ *
+ * @param {Object} the object which will support MicroEvent
+ */
+MicroEvent.mixin = function (destObject) {
+  const props = ['bind', 'unbind', 'trigger'];
+  for (let i = 0; i < props.length; i++) {
+    if (typeof destObject === 'function') {
+      destObject.prototype[props[i]] = MicroEvent.prototype[props[i]];
+    } else {
+      destObject[props[i]] = MicroEvent.prototype[props[i]];
+    }
+  }
+  return destObject;
+};
+
+// export in common js
+if (typeof module !== 'undefined' && 'exports' in module) {
+  module.exports = MicroEvent;
+}

Pub-Sub Pattern Sample

Ajax Callback
  • 当请求返回,并且实际的数据可用的时候,会生成一个通知
  • 如何使用这些事件(或者返回的数据),都是由订阅者自己决定的
  • 可以有多个不同的订阅者,以不同的方式使用返回的数据
  • Ajax 层: 唯一的责任 - 请求和返回数据,接着将数据发送给所有想要使用数据的地方
(function ($) {
+  // Pre-compile template and "cache" it using closure
+  const resultTemplate = _.template($('#resultTemplate').html());
+
+  // Subscribe to the new search tags topic
+  $.subscribe('/search/tags', function (tags) {
+    $('#searchResults').html(`Searched for: ${tags}`);
+  });
+
+  // Subscribe to the new results topic
+  $.subscribe('/search/resultSet', function (results) {
+    $('#searchResults').append(resultTemplate(results));
+  });
+
+  // Submit a search query and publish tags on the /search/tags topic
+  $('#flickrSearch').submit(function (e) {
+    e.preventDefault();
+    const tags = $(this).find('#query').val();
+
+    if (!tags) {
+      return;
+    }
+
+    $.publish('/search/tags', [$.trim(tags)]);
+  });
+
+  // Subscribe to new tags being published and perform
+  // a search query using them. Once data has returned
+  // publish this data for the rest of the application
+  // to consume
+
+  $.subscribe('/search/tags', function (tags) {
+    // Ajax Request
+    $.getJSON(
+      'http://api.flickr.com/services/feeds/',
+      {
+        tags,
+        tagMode: 'any',
+        format: 'json',
+      },
+
+      function (data) {
+        if (!data.items.length) {
+          return;
+        }
+
+        $.publish('/search/resultSet', data.items);
+      }
+    );
+  });
+})();

State Pattern

一个 State 对象封装一个与状态相关的行为, 运用有限状态机 (Finite State Machines) 根据 Object State 改变 Object Behavior: object set state as its member, state set object as its method parameter.

class Switch {
+  constructor() {
+    this.state = new OffState();
+  }
+
+  on() {
+    this.state.on(this);
+  }
+
+  off() {
+    this.state.off(this);
+  }
+}
+
+class State {
+  constructor() {
+    if (this.constructor === State) throw new Error('abstract!');
+  }
+
+  on(sw) {
+    console.log('Light is already on.');
+  }
+
+  off(sw) {
+    console.log('Light is already off.');
+  }
+}
+
+class OnState extends State {
+  constructor() {
+    super();
+    console.log('Light turned on.');
+  }
+
+  off(sw) {
+    console.log('Turning light off...');
+    sw.state = new OffState();
+  }
+}
+
+class OffState extends State {
+  constructor() {
+    super();
+    console.log('Light turned off.');
+  }
+
+  on(sw) {
+    console.log('Turning light on...');
+    sw.state = new OnState();
+  }
+}
+
+const button = new Switch();
+button.on();
+button.off();

Strategy Pattern

改变对象的内核/算法, 一个 Strategy 对象封装一个算法.

Use Case: 表单验证, 存在大量 if-else 场景, 各种重构等.

const OutputFormat = Object.freeze({
+  markdown: 0,
+  html: 1,
+});
+
+class ListStrategy {
+  start(buffer) {}
+  end(buffer) {}
+  addListItem(buffer, item) {}
+}
+
+class MarkdownListStrategy extends ListStrategy {
+  addListItem(buffer, item) {
+    buffer.push(` * ${item}`);
+  }
+}
+
+class HtmlListStrategy extends ListStrategy {
+  start(buffer) {
+    buffer.push('<ul>');
+  }
+
+  end(buffer) {
+    buffer.push('</ul>');
+  }
+
+  addListItem(buffer, item) {
+    buffer.push(`  <li>${item}</li>`);
+  }
+}
+
+class TextProcessor {
+  constructor(outputFormat) {
+    this.buffer = [];
+    this.setOutputFormat(outputFormat);
+  }
+
+  setOutputFormat(format) {
+    switch (format) {
+      case OutputFormat.markdown:
+        this.listStrategy = new MarkdownListStrategy();
+        break;
+      case OutputFormat.html:
+        this.listStrategy = new HtmlListStrategy();
+        break;
+      default:
+        throw new Error('Unsupported output format!');
+    }
+  }
+
+  appendList(items) {
+    this.listStrategy.start(this.buffer);
+    for (const item of items) this.listStrategy.addListItem(this.buffer, item);
+    this.listStrategy.end(this.buffer);
+  }
+
+  clear() {
+    this.buffer = [];
+  }
+
+  toString() {
+    return this.buffer.join('\n');
+  }
+}
+
+const tp = new TextProcessor();
+tp.setOutputFormat(OutputFormat.markdown);
+tp.appendList(['one', 'two', 'three']);
+console.log(tp.toString());
+
+tp.clear();
+tp.setOutputFormat(OutputFormat.html);
+tp.appendList(['one', 'two', 'three']);
+console.log(tp.toString());
// 违反开放封闭原则
+const activity = (type, price) => {
+  if (type === 'pre') {
+    return price * 0.95;
+  } else if (type === 'onSale') {
+    return price * 0.9;
+  } else if (type === 'back') {
+    return price * 0.85;
+  } else if (type === 'limit') {
+    return price * 0.8;
+  }
+};
+
+// 利用 Strategy Pattern 进行重构
+const activity = new Map([
+  ['pre', price => price * 0.95],
+  ['onSale', price => price * 0.9],
+  ['back', price => price * 0.85],
+  ['limit', price => price * 0.8],
+]);
+
+const getActivityPrice = (type, price) => activity.get(type)(price);
+
+// 新增新手活动
+activity.set('newcomer', price => price * 0.7);

Template Method Pattern

Abstract superclass defines the skeleton of an operation in terms of a number of high-level steps.

class Game {
+  constructor(numberOfPlayers) {
+    this.numberOfPlayers = numberOfPlayers;
+    this.currentPlayer = 0;
+  }
+
+  run() {
+    this.start();
+    while (!this.haveWinner) {
+      this.takeTurn();
+    }
+    console.log(`Player ${this.winningPlayer} wins.`);
+  }
+
+  start() {}
+  takeTurn() {}
+
+  get haveWinner() {
+    return this.haveWinner;
+  }
+
+  get winningPlayer() {
+    return this.winningPlayer;
+  }
+}
+
+class Chess extends Game {
+  constructor() {
+    super(2);
+    this.maxTurns = 10;
+    this.turn = 1;
+  }
+
+  start() {
+    console.log(
+      `Starting a game of chess with ${this.numberOfPlayers} players.`
+    );
+  }
+
+  get haveWinner() {
+    return this.turn === this.maxTurns;
+  }
+
+  takeTurn() {
+    console.log(`Turn ${this.turn++} taken by player ${this.currentPlayer}.`);
+    this.currentPlayer = (this.currentPlayer + 1) % this.numberOfPlayers;
+  }
+
+  get winningPlayer() {
+    return this.currentPlayer;
+  }
+}
+
+const chess = new Chess();
+chess.run();

Visitor Pattern

Separating an algorithm from an object structure on which it operates.

Use Case: Tree, Compiler (Abstract Syntax Tree).

class NumberExpression {
+  constructor(value) {
+    this.value = value;
+  }
+
+  print(buffer) {
+    buffer.push(this.value.toString());
+  }
+}
+
+class AdditionExpression {
+  constructor(left, right) {
+    this.left = left;
+    this.right = right;
+  }
+
+  print(buffer) {
+    buffer.push('(');
+    this.left.print(buffer);
+    buffer.push('+');
+    this.right.print(buffer);
+    buffer.push(')');
+  }
+}
+
+const e = new AdditionExpression(
+  new NumberExpression(5),
+  new AdditionExpression(new NumberExpression(1), new NumberExpression(9))
+);
+const buffer = [];
+e.print(buffer);

IOC and DI Pattern

  • IOC (inversion of control) 控制反转模式;控制反转是将组件间的依赖关系从程序内部提到外部来管理
  • DI (dependency injection) 依赖注入模式;依赖注入是指将组件的依赖通过外部以参数或其他形式注入
class Component {
+  run(context, options) {
+    const dep1 = context.getDep1();
+    const dep2 = context.getDep2();
+    dep1.run();
+    dep2.run();
+  }
+}
class DbMysql {
+  public function query(){}
+}
+
+class Controller {
+  public $db;
+  public function __construct($dbMysql) {
+    $this->db = $dbMysql;
+  }
+  public function action(){
+    $this->db->query();
+  }
+}
+
+$db = new DbMysql();
+$c = new Controller($db);
+$c->action();

With IOC container:

class DbMysql {
+  public function __construct($host, $name, $pwd) {
+    // do something
+  }
+  public function query() {
+    echo __METHOD__ . PHP_EOL;
+  }
+}
+
+class DbRedis {
+  public function __construct($host, $name, $pwd) {
+    // do something
+  }
+  public function set() {
+    echo __METHOD__ . PHP_EOL;
+  }
+}
+
+class controller {
+  public $mysql;
+  public $redis;
+  public function __construct($mysql, $redis) {
+    $this->mysql = $mysql;
+    $this->redis = $redis;
+  }
+  public function action() {
+    $this->mysql->query();
+    $this->redis->set();}
+  }
+}
+
+
+class Container {
+  public $bindings = [];
+  public function bind($key, Closure $value) {
+    $this->bindings[$key] = $value;
+  }
+  public function make($key) {
+    $new = $this->bindings[$key];
+    return $new();
+  }
+}
+
+$app = new Container();
+$app->bind('mysql', function () { return new DbMysql('host', 'name', 'pwd'); });
+$app->bind('redis', function () { return new DbRedis('host', 'name', 'pwd'); });
+$app->bind('controller', function () use ($app) {
+  return new Controller($app->make('mysql'), $app->make('redis'));
+});
+$controller = $app->make('controller');
+$controller->action();
+/** * 输出: * DbMysql::query * DbRedis::set */

With dependency injection:

// dependency provider
+// top module
+import * as React from 'react';
+import type { IProvider } from './providers';
+
+export interface IProvider<T> {
+  provide(): T;
+}
+
+@injectable()
+export class NameProvider implements IProvider<string> {
+  provide() {
+    return 'World';
+  }
+}
+
+export class Hello extends React.Component {
+  private readonly nameProvider: IProvider<string>;
+
+  render() {
+    return <h1>Hello {this.nameProvider.provide()}!</h1>;
+  }
+}

Class Pattern

const Person = function (firstName, lastName) {
+  this.firstName = firstName;
+  this.lastName = lastName;
+  this.gender = 'male';
+};
+
+// Define a subclass constructor for for "Superhero":
+const Superhero = function (firstName, lastName, powers) {
+  // Invoke the superclass constructor on the new object
+  // then use .call() to invoke the constructor as a method of
+  // the object to be initialized.
+  Person.call(this, firstName, lastName);
+
+  // Finally, store their powers, a new array of traits not found in a normal "Person"
+  this.powers = powers;
+};
+SuperHero.prototype = Object.create(Person.prototype);
const superman = new Superhero('Clark', 'Kent', ['flight', 'heat-vision']);
+console.log(superman);

Mix-In Pattern

将多个对象的属性混入同一个对象,达到继承/扩展/组合的效果

  • 不改变原型链
function mix(...args) {
+  let arg;
+  let prop;
+  const child = {};
+
+  for (arg = 0; arg < args.length; arg += 1) {
+    for (prop in args[arg]) {
+      if (Object.prototype.hasOwnProperty.call(args[arg], prop)) {
+        child[prop] = args[arg][prop];
+      }
+    }
+  }
+
+  return child;
+}
const cake = mix(
+  { eggs: 2, large: true },
+  { butter: 1, salted: true },
+  { flour: '3 cups' },
+  { sugar: 'sure!' }
+);
  • 改变原型链
// Extend an existing object with a method from another
+function mix(...args) {
+  const receivingClass = args[0];
+  const givingClass = args[1];
+
+  // mix-in provide certain methods
+  if (args[2]) {
+    for (let i = 2, len = args.length; i < len; i++) {
+      receivingClass.prototype[args[i]] = givingClass.prototype[args[i]];
+    }
+  } else {
+    // mix-in provide obj
+    for (const methodName in givingClass.prototype) {
+      if (!receivingClass.prototype[methodName]) {
+        receivingClass.prototype[methodName] =
+          givingClass.prototype[methodName];
+      }
+    }
+  }
+}

MVC Pattern

在 MVC 中,视图位于我们架构的顶部,其背后是控制器. 模型在控制器后面,而因此我们的视图了解得到我们的控制器,而控制器了解得到模型. 这里,我们的视图有对模型的直接访问. 然而将整个模型完全暴露给视图可能会有安全和性能损失, 这取决于我们应用程序的复杂性. MVVM 则尝试去避免这些问题.

在 MVP 中,控制器的角色被代理器所取代,代理器和视图处于同样的地位, 视图和模型的事件都被它侦听着并且接受它的调解. 不同于 MVVM,没有一个将视图绑定到视图模型的机制,因此我们转而依赖于每一个视图都实现一个允许代理器同视图去交互的接口.

MVVM 进一步允许我们创建一个模型的特定视图子集,包含了状态和逻辑信息, 避免了将模型完全暴露给视图的必要。 不同于 MVP 的代理器,视图模型并不需要去引用一个视图。 视图可以绑定到视图模型的属性上面,视图模型则去将包含在模型中的数据暴露给视图。 像我们所提到过的,对视图的抽象意味着其背后的代码需要较少的逻辑。

jQuery Pattern

Plugin Pattern

(function ($) {
+  $.extend($.fn, {
+    myPlugin() {
+      // your plugin logic
+    },
+  });
+})(jQuery);
// the semi-colon before the function invocation is a safety
+// net against concatenated scripts and/or other plugins
+// that are not closed properly.
+// eslint-disable-next-line no-shadow-restricted-names
+(function ($, window, document, undefined) {
+  // undefined is used here as the undefined global
+  // variable in ECMAScript 3 and is mutable (i.e. it can
+  // be changed by someone else). undefined isn't really
+  // being passed in so we can ensure that its value is
+  // truly undefined. In ES5, undefined can no longer be
+  // modified.
+
+  // window and document are passed through as local
+  // variables rather than as globals, because this (slightly)
+  // quickens the resolution process and can be more
+  // efficiently minified (especially when both are
+  // regularly referenced in our plugin).
+
+  // Create the defaults once
+  const pluginName = 'defaultPluginName';
+  const defaults = {
+    propertyName: 'value',
+  };
+
+  // The actual plugin constructor
+  function Plugin(element, options) {
+    this.element = element;
+
+    // jQuery has an extend method that merges the
+    // contents of two or more objects, storing the
+    // result in the first object. The first object
+    // is generally empty because we don't want to alter
+    // the default options for future instances of the plugin
+    this.options = $.extend({}, defaults, options);
+
+    this._defaults = defaults;
+    this._name = pluginName;
+
+    this.init();
+  }
+
+  Plugin.prototype.init = function () {
+    // Place initialization logic here
+    // We already have access to the DOM element and
+    // the options via the instance, e.g. this.element
+    // and this.options
+  };
+
+  // A really lightweight plugin wrapper around the constructor,
+  // preventing against multiple instantiations
+  $.fn[pluginName] = function (options) {
+    return this.each(function () {
+      if (!$.data(this, `plugin_${pluginName}`)) {
+        $.data(this, `plugin_${pluginName}`, new Plugin(this, options));
+      }
+    });
+  };
+})(jQuery, window, document);

Scalability Design

  • Prefer composites over mixins.
  • Always clone objects between components.
  • Use namespaced state store modules.
  • Write robust tests.
  • Interact with REST API via services/SDK.
  • Wrap third-party libraries other using them directly:
    • Abstract: changing dependencies without changing interface.
    • Extendability: More obvious route to extending functionality.

Domain Driven Design

Interface Layer

主要负责与外部系统进行交互与通信:

  • 做参数的基本处理, 比如入参校验, 回参 DTO 转换 (拆包, 组包)
  • Dubbo Services
  • RESTful API

Application Layer

Application Service 层只是很薄的一层, 它内部并不实现任何逻辑, 只是负责协调和转发 (流程编排), 委派业务动作给更下层的领域层.

Domain Layer

Domain 层是领域模型系统的核心, 负责维护面向对象的领域模型, 几乎全部的业务逻辑都会在这一层实现. 内部主要包含 Entity, ValueObject, Domain Event, Repository.

Infrastructure Layer

主要为 Interface, Application 和 Domain 三层提供支撑:

  • 封装基础资源服务, 通过依赖注入方式解耦.
  • Third-party tools, Message Queue, File, Cache, Database, Search etc.
  • 实现仓储接口 DB, 通常真正读写 DB.

DDD Layout

高并发系统设计

Concurrent Code Layer

  • Mutex Performance
  • Database Caches
  • Update Merge
  • BloomFilter
  • Asynchronous
  • Multi-Thread

Concurrent DataBase Layer

  • DataBase Type: RDBMS -> NoSQL -> NewSQL
  • Table Structure Design
  • Index Design
  • Split Table
  • Read and Write Separation
  • Data Slice and Data Partition
  • Hot Data Cache

Concurrent Architecture Layer

  • Microservices
  • Scale Friendly
  • FailFast
  • Data PreFetch
  • Multi-Level Caches

高可用系统设计

Resource Isolation

Load Balance Design

  • Hardware Load Balance
  • Software Load Balance
  • Load Balance Algorithms: Random, RoundRobin, WeightRoundRobin, ConsistentHash
  • Error Machines Auto Detection
  • Error Services Auto Retirement
  • Services Retry Automation
  • Recovery Services Auto Detection

Idempotence Design

在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.

Write Idempotence Design

  • Mutex
  • Key Index
  • Token
  • Data Version
  • State Machine

CAP Theory

A distributed system to simultaneously provide more than two out of the following three guarantees:

  • Consistency: Every read receives the most recent write or an error.
  • Availability: Every request receives a (non-error) response, without the guarantee that it contains the most recent write.
  • Partition tolerance: The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes.

服务熔断

服务限流

服务限流算法

一定程度上可以参考计算机网络拥塞控制算法:

  • 计数器固定窗口限流: 单位时间内达到阈值后开始限流, 单位时间后重新计数. 窗口临界处流量过大, 导致服务不可用.
  • 滑动窗口限流: 在固定窗口限流基础上, 将窗口向右滑动.
  • 漏斗限流: 未满前可进入, 满则拒绝. 可以平滑流量, 无法解决突发流量.
  • 令牌桶限流: 在漏斗限流基础上, 以恒定速率产生令牌. 拥有令牌可进入, 无则拒绝. 可以平滑流量, 可以容忍突发流量.

服务限流策略

  • 服务拒绝
  • 延时处理
  • 请求分级
  • 监控预警
  • 动态限流
  • 动态扩容

服务限流位置

  • 接入层限流: 通过 Nginx/API Router 对 DNS/IP 限流.
  • 应用限流: 每个服务拥有自己的集群限流服务.
  • 基础服务限流: 对消息队列/数据库限流.

服务降级

Reference

Copyright © SabertazBuilt with React and GatsbyLast Built Time 2022/4/16 10:40:24
\ No newline at end of file diff --git a/designPatternsBasicNotes/index.html.gz b/designPatternsBasicNotes/index.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..605d932f2a8ea5e1912b963c60b7691b368a1be3 GIT binary patch literal 84383 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 bnh#G&JDzRkpZJ1LsDAaoc0}oTiN*{7Ft*lu literal 0 HcmV?d00001 diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3882e4e1df66a1bb8c4c8620a2fb2c406b27d2 GIT binary patch literal 1719 zcmV;o21xmdP)pLX-PyuR9J=0mR*P>XBCF4T0~L25kW5`h~~yb=RFf6ii%f)S6(cx zF0A5>CKo{=ib4b-0YQX#W2UFO=clT>myP%nk?dx6*T}LznW{~8eyXN>`Y$_f*q!b7 z)a)=jAs4w_IbT)JjBz%z8&=2%hyJLp?)N$GIp?eLy!Z1O&zhbv^q|2`hz7o069z7z zb#Ht)b^paN5;YMg6qE{p(RKgx*8^{CxO>li6BZ4TtMhIP?!5)7)MK@AKmqG1&pG{LY8)(_+Dr#^zk zH4kTQn{Ww{dSVgl-GNA60>8-oD`4;k(Xi=+7*xQZCK{Uf2%-wsE4G)7T7YXWRI$`Q zf)lqth>Kg^*tsneFJWFiv4{=;ffEkhh(Uv=h2gP0JIlHdW>|v;RWPjCUb3k&*qFlL z+)1po2Uz&`Ma*Z(WL9Lmzci9>W{yc**?E^DLWA0m%=cFTIQB%SQ8Ug6Ry`J zo2ek1p2XFYe?==P4&kb~5y?~_G6N|LdM%w9PaqSG|v*#pcRbqySH9(|4m6#9YO{sSc@Z=6a zZhuW^4opvA?d20lJ1t52CcFxZq`N9=~c<*+A>%gVx_+=?d}#@y)9|?Zi&IPI$Ky;J1=*)RPnPtYL@e)!TOaHK{ODZ)ghLNXA3C)CQBgL9Hz%N31#G!n2+USsQ&)vfT|~?FI3wf5wZbgMaY_PvkYBRF1n3PCo5bJS?dC2v^od87D1L=db z{b7&|QJsXcW+Bw7=*=>QoW&rUL#iv1a3F~TF$WCbB60^R1w<3E{thv}{PpDx50~?k z@R3*bK!8Ian+70-xC5cVXayTAW1V&M^ehtXNTNMS*~bzu7Cq2FOsoHQ5%a@l{X?(N zCcwobuVwF60^0sNLe^mbPLx$pi%$b$O_UX6TE;a!jt(y(VP6*Y5+V%|@kvDdbS~&l zzY<0dr8~VJNG|LbAcutflaLcovtCWqAgVc#Iv@vjNE51m1ohivt1MxY9#SpIS$eWuJbv%? zy-@xez%^sx#>b%gJ*bw8$*?j6$m21PpRfiVv)|pIkGIr&`1Y13SMK43)YkZLI1+T9 z1wg5o4vSAg^(P=_Kt2uf3x!kmo6-n=1pc0v?27LI30W$d)4ux*R6n%GDc{{=_Ya5O zeOt)S0}t!#?vJfO_m&1^X>8
CSSFrontend DevelopmentWeb Development

CSS Basic Notes

Posted on Sun Mar 05 2017
Last updated on Sun Mar 20 2022
(84 minutes)

CSS Basic Notes

Cascading and Inheritance

Cascading Order

  1. user agent normal
  2. user normal
  3. author normal
  4. CSS Animations
  5. author !important
  6. user !important
  7. user agent !important

Specificity

Specificity (Selector Priority) has 4 bits - thousands, hundreds, tens, ones 0000:

  • thousands: inline-style
  • hundreds: ID selector
  • tens: class selector, attribute selector, pseudo-class(:)
  • ones: element selector, pseudo-element(::)

Universal selector (*), combinators (+, >, ~, ’ ’) negation pseudo-class (:not) have no effect on specificity, but selectors in it have effect on specificity

/* stylelint-disable at-rule-no-unknown */
+
+/* specificity: 0001 */
+h1 {
+  color: red;
+}
+
+/* specificity: 0100 */
+#id {
+  color: green;
+}
+
+/* specificity: 0003 */
+h1 + p::first-letter {
+  color: blue;
+}
+
+/* specificity: 0022 */
+li > a[href*='en-US'] > .inline-warning {
+  color: yellow;
+}
<!-- specificity: 1000; -->
+<h1 style="color: black">Hello</h1>
/* specificity: 0023 */
+div li:nth-child(2) a:hover,
+div li:nth-child(2) a:focus {
+  border: 10px dashed black;
+}
+
+/* specificity: 0024 */
+div div li:nth-child(2) a:hover,
+div div li:nth-child(2) a:focus {
+  border: 10px solid black;
+}
+
+/* specificity: 0033 */
+div div .nav:nth-child(2) a:hover,
+div div .nav:nth-child(2) a:focus {
+  border: 10px double black;
+}
+
+/* specificity: 0101 */
+#outer a {
+  background-color: red;
+}
+
+/* specificity: 0104 */
+#outer div ul li a {
+  color: yellow;
+}
+
+/* specificity: 0113 */
+#outer div ul .nav a {
+  color: white;
+}
+
+/* specificity: 0201 */
+#outer #inner a {
+  background-color: blue;
+}

Styles for a directly targeted element will always take precedence over inherited styles, regardless of the specificity of the inherited rule

#parent {
+  color: green;
+}
+
+/* <h1> element will be purple */
+h1 {
+  color: purple;
+}

CSS Inheritance

  • Most CSS properties that affect the text node are inherited properties: color, font-size, font-family, etc.
  • Most CSS properties that affect the element node are non-inherited properties.
  • When the unset value is set on an inherited property, it resets the property value to its inherited value.
  • unset value resets a non-inherited property to its initial value.
  • revert reverses the CSS default values to the browser user-agent styles.

Inherited CSS Property

  • all elements: visibility, cursor.
  • inline elements: letter-spacing, word-spacing, white-space, line-height, color, font, font-family, font-size, font-style, font-variant, font-weight, text-decoration, text-transform, direction
  • block elements: text-indent, text-align
  • list elements: list-style, list-style-type, list-style-position, list-style-image
  • table elements: border-collapse

Property Value

Initial Value

The initial value of a CSS property is its default value, as listed in its definition table

Specified Value

The specified value of a CSS property is the value it receives from the document’s style sheet

Computed Value

The computed value of a CSS property is the value that is transferred from parent to child during inheritance. It is calculated from the specified value by:

  1. Handling the special values inherit, initial, unset, and revert
  2. Doing the computation needed to reach the value described in the “Computed value” line in the property’s definition table

Used Value

The used value of a CSS property is its value after all calculations have been performed on the computed value:

  • The used values of dimensions (e.g., width, line-height) are in pixels
  • The used values of shorthand properties (e.g., background) are consistent with those of their component properties (e.g., background-color or background-size) and with position and float

Actual Value

The actual value of a CSS property is the used value of that property after any necessary approximations have been applied

The user agent performs four steps to calculate a property’s actual (final) value:

  1. the specified value is determined based on the result of cascading, inheritance, or using the initial value.
  2. the computed value is calculated according to the specification (for example, a span with position: absolute will have its computed display changed to block)
  3. layout is calculated, resulting in the used value
  4. the used value is transformed according to the limitations of the local environment, resulting in the actual value

initial -> specified -> computed -> used -> actual value

span {
+  position: absolute;
+} /* display computed to `block` */

Property Order

Property Order Summary

显示属性 -> 自身属性 -> 文本属性

Display Property

  • position
  • display
  • float
  • clear

Self Property

  • width
  • height
  • margin
  • padding
  • border
  • list-style
  • background

Text Property

  • color
  • font
  • text-decoration
  • text-align
  • vertical-align
  • white-space
  • other text
  • content

Property Order Details

Display Property Details

  • position
  • z-index
  • top
  • right
  • bottom
  • left
  • box-sizing
  • display
  • visibility
  • float
  • clear

Self Property Details

  • width
  • min-width
  • max-width
  • height
  • min-height
  • max-height
  • overflow
  • margin
  • margin-top
  • margin-right
  • margin-bottom
  • margin-left
  • padding
  • padding-top
  • padding-right
  • padding-bottom
  • padding-left
  • border
  • border-width
  • border-top-width
  • border-right-width
  • border-bottom-width
  • border-left-width
  • border-style
  • border-top-style
  • border-right-style
  • border-bottom-style
  • border-left-style
  • border-color
  • border-top-color
  • border-right-color
  • border-bottom-color
  • border-left-color
  • outline
  • list-style
  • table-layout
  • caption-side
  • border-collapse
  • border-spacing
  • empty-cells
  • background
  • background-color
  • background-image
  • background-repeat
  • background-position

Text Property Details

  • color
  • font
  • font-family
  • font-size
  • font-weight
  • line-height
  • text-align
  • text-indent
  • text-transform
  • text-decoration
  • letter-spacing
  • word-spacing
  • white-space
  • vertical-align
  • opacity
  • cursor
  • content
  • quotes

Naming Convention

Layout Structure Naming Convention

  • 容器: container
  • 页头:header
  • 内容:content/container
  • 页面主体:main
  • 页尾:footer
  • 导航:nav
  • 侧栏:sidebar
  • 栏目:column
  • 页面外围控制整体佈局宽度:wrapper
  • 左右中:left right center
  • 导航:nav
  • 主导航:main-nav
  • 子导航:sub-nav
  • 顶导航:top-nav
  • 边导航:sidebar
  • 左导航:left-sidebar
  • 右导航:right-sidebar
  • 菜单:menu
  • 子菜单:sub-menu
  • 标题: title
  • 摘要: summary

Functional Component Naming Convention

  • 标志:logo
  • 广告:banner
  • 登陆:login
  • 登录条:login-bar
  • 注册:register
  • 搜索:search
  • 功能区:shop
  • 标题:title
  • 加入:join us
  • 状态:status
  • 按钮:btn
  • 滚动:scroll
  • 标籤页:tab
  • 文章列表:list
  • 提示信息:msg
  • 当前的: current
  • 小技巧:tips
  • 图标: icon
  • 注释:note
  • 指南:guild
  • 服务:service
  • 热点:hot
  • 新闻:news
  • 下载:download
  • 投票:vote
  • 合作伙伴:partner
  • 友情链接:link
  • 版权:copyright

CSS Files Naming Convention

  • abstracts: $variables, @mixin function
  • vendors: external libraries (font-awesome, bootstrap)
  • base: normalize.css, reset.css, utils.css, font.css, base.css (margin-right, text-center, float-right)
  • components: form.css, button.css, navbar.css, dropdown.css
  • layout: columns.css, grid.css, header.css, footer.css, section.css, navigation.css
  • pages: home.css, about.css
  • themes: color.css, font.css
  • main.css

CSS Selector

CSS3 Selector

元素选择器

p {
+  margin-bottom: 1em;
+  line-height: 1.5em;
+}

关系选择器

Descendant Selectors

  • E F:所有后代选择器
  • E > F:直接子选择器
ul li {
+  margin-bottom: 0.5em;
+}
ul > li {
+  list-style: none;
+} /* 仅限ul的直接子元素li,忽略嵌套子元素 */

Using the descendant selector without more specificity can be really expensive. The browser is going to check every descendant element for a match because the relationship isn’t restricted to parent and child.

For .container ul li a selector:

  • match every <a> on the page
  • find every <a> contained in a <li>
  • use the previous matches and narrow down to the ones contained in a <ul>
  • finally, filter down the above selection to the ones contained in an element with the class .container

Sibling Selectors

  • E + F:直接相邻兄弟选择器
  • E ~ F:一般兄弟选择器
* + * {
+  margin-top: 1.5em;
+}
li + li {
+  border-top: 1px solid #ddd;
+}
/* p before h1 */
+p {
+  color: #fff;
+}
+
+/* 定位具有相同父元素的,h1标签之后的所有p标签 */
+h1 ~ p {
+  color: #f00;
+}

checkbox input as hidden click event listener

input.checkbox {
+  visibility: hidden;
+  opacity: 0;
+}
+
+nav {
+  transform: scale(0);
+}
+
+input.checkbox:checked + nav {
+  transform: scale(1);
+}
+
+input.checkbox:checked ~ nav {
+  transform: scale(1);
+}

Attribute Selectors

E[attr]

input[required] {
+  border: 1px solid #f00;
+} //定位页面里所有具有必填属性"required"的input

E[attr=val]

input[type='password'] {
+  border: 1px solid #aaa;
+} //定位页面里的密码输入框

E[attr|=val]

p[class|='a'] {
+  color: #333;
+} //定位页面里所有的P段落里具有class属性且属性值为a或是a-开始的,比如class="a"以及class="a-b"

E[attr~=val]

// 定位页面里所有具有属性title且属性值里拥有完整单词english的div容器
+// 比如title="english"以及title="a english"
+div[title~='english'] {
+  color: #f88;
+}

E[attr^=val]

div[class^='a'] {
+  color: #666;
+} //定位页面里具有属性class且属性值以a开头的div容器,比如class="a"以及class="ab"

E[attr$=val]

div[class$='a'] {
+  color: #f00;
+}
+//定位页面里具有属性class且属性值以a结尾的div窗口,比如class="nba"以及class="cba"

E[attr*=val]

a[title*='link'] {
+  text-decoration: underline;
+}
+//定位所有title里具有link字符串的a链接

Pseudo Class Selectors

  • :link:未访问的链接;
  • :visited:已访问的链接,不建议使用;
  • :hover:鼠标移动到容器,不仅限于链接,可用于页面中的任何元素;

link - visited - hover order matters

  • :active: 被激活时的状态,不仅限于链接,可用于任何具有 tabindex 属性的元素;
  • :focus: 获得焦点时状态,不仅限于链接,可用于任何具有 tabindex 属性的元素:
  • :enabled: 已启用的界面元素:input
  • :disabled: 已禁用的界面元素:input
  • :target: 该选择器定位当前活动页面内定位点的目标元素, #anchor-name #info:target {font-size:24px;}
  • :default: 应用于一个或多个作为一组类似元素中的默认元素的 UI 元素;
  • :valid: 应用于输入验证有效元素,基于 input 的 type/pattern 属性
  • :invalid: 应用于输入验证无效元素,
  • :in-range: 应用于具有范围限制的元素,其中该值位于限制内;比如具有 min 和 max 属性的 number 和 range 输入框;
  • :out-of-range: 与:in-range 选择相反,其中该值在限制范围外;
  • :required: 应用于具有必填属性 required 的表单控件;
  • :optional: 应用于没有必填属性 required 的所有表单控件
  • :read-only: 应用于其内容无法供用户修改的元素;
  • :read-write: 应用于其内容可供用户修改的元素,比如输入框;
  • :root: 根元素,始终指 html 元素;
  • :placeholder-shown: select input with placeholder
  • :focus-visible: selected when Tab (shortcut) focused
  • :focus-within: selected when any children focused
  • :empty:没有子元素的元素,没有子元素包括文本节点;
  • :not(exception):该选择器将选择与括号内的选择器不匹配的元素:
  • :lang(en):具有使用双字母缩写(en)表示的语言的元素;
  • <target_element>:has(<selector>): a target element has child elements, :has normal priority
  • <target_element>:where(<selector>): a target element has child elements, :where 0 priority
  • E F:first-of-type 相同类型 的第一个元素
  • E F:last-of-type 相同类型 的最后一个元素
  • E F:only-of-type 孩子中只有一种该元素
  • E :nth-child(n) 选择 E 的第 n 个孩子
  • E F:nth-child(n):该选择器定位元素 E 的第 n 个子元素的元素 F,可省略 E
  • E F:nth-last-child(n):该选择器定位元素 E 的倒数第 n 个子元素的元素 F,可省略 E
  • E F:nth-of-type(n):该选择器定位元素 E 的第 n 个 相同类型 子元素,可省略 E
  • E F:nth-lash-of-type(n):该选择器定位元素 E 的导数第 n 个 相同类型 子元素,可省略 E
  • E F:first-child 第一个孩子
  • E F:last-child 最后一个孩子
  • E F:only-child 单一后代
<a href="#p1">p1</a>
+<div id="p1">p1</div>
div:target {
+  background-color: purple;
+}
+
+#p1:target {
+  background-color: purple;
+}
@media screen and (prefers-reduced-motion: reduce) {
+  .msg {
+    opacity: 0;
+    transition: none;
+  }
+}
+
+.msg {
+  opacity: 0;
+  transition: opacity 0.2s ease-in-out;
+}
+
+input:not(:placeholder-shown) + .msg {
+  opacity: 1;
+}
/* Tab Focus Style */
+button:focus-visible {
+  outline: 2px solid #416dea;
+  outline-offset: 2px;
+  box-shadow: 0 1px 1px #416dea;
+}
+
+/* Mouse Focus Style */
+button:focus:not(:focus-visible) {
+  outline: 2px dotted #416dea;
+  outline-offset: 2px;
+  box-shadow: 0 1px 1px #416dea;
+}

Pseudo Element Selectors

  • ::first-line: 匹配文本首行.
  • ::first-letter: 匹配文本首字母.
  • ::selection: 匹配突出显示的文本.
  • ::before
  • ::after
/* 定义选中的文本颜色与背景色 */
+::selection {
+  color: #fff;
+  background: #444;
+}
  • ::before::after: 使用 content 属性生成额外的内容并插入在标记中.
a::after {
+  content: '↗';
+}

attr() – 调用当前元素的属性

a::after {
+  content: '(' attr(href) ')';
+}
+
+b::after {
+  content: '(' attr(data-language) ')';
+}

url() / uri() – 用于引用媒体文件

h1::before {
+  content: url('logo.png');
+}

counter() – 调用计数器,可以不使用列表元素实现序号功能,配合 CSS3 中counter-incrementcounter-reset属性

h2::before {
+  content: 'Chapter ' counter(chapter);
+  counter-increment: chapter;
+}
div {
+  counter-reset: tidbit-counter 58;
+}
+
+h2::before {
+  content: counter(tidbit-counter, list-style-type) ': ';
+  counter-increment: tidbit-counter 1;
+}
<div>
+  <h2>HTML</h2>
+  <h2>CSS</h2>
+  <h2>JS</h2>
+</div>
+
+<!-- output
+59: HTML
+60: CSS
+61: JS
+output -->

Nested counters:

ol {
+  list-style-type: none;
+  counter-reset: section; /* 为每个ol元素创建新的计数器实例 */
+}
+
+li::before {
+  content: counters(section, '.') ' '; /* 为所有计数器实例增加以“.”分隔的值 */
+  counter-increment: section; /* 只增加计数器的当前实例 */
+}
<ol>
+  <li>item</li>
+  <!-- 1     -->
+  <li>
+    item
+    <!-- 2     -->
+    <ol>
+      <li>item</li>
+      <!-- 2.1   -->
+      <li>item</li>
+      <!-- 2.2   -->
+      <li>
+        item
+        <!-- 2.3   -->
+        <ol>
+          <li>item</li>
+          <!-- 2.3.1 -->
+          <li>item</li>
+          <!-- 2.3.2 -->
+        </ol>
+        <ol>
+          <li>item</li>
+          <!-- 2.3.1 -->
+          <li>item</li>
+          <!-- 2.3.2 -->
+          <li>item</li>
+          <!-- 2.3.3 -->
+        </ol>
+      </li>
+      <li>item</li>
+      <!-- 2.4   -->
+    </ol>
+  </li>
+  <li>item</li>
+  <!-- 3     -->
+  <li>item</li>
+  <!-- 4     -->
+</ol>
+<ol>
+  <li>item</li>
+  <!-- 1     -->
+  <li>item</li>
+  <!-- 2     -->
+</ol>
.first-details-intro::after {
+  position: absolute;
+  top: 50%;
+  right: 0;
+  width: 0;
+  height: 0;
+  content: '';
+  border-top: 15px solid transparent;
+  border-right: 25px solid #fff;
+  border-bottom: 15px solid transparent;
+}

CSS Normalize

  • * selector has poor performance
html {
+  box-sizing: border-box;
+  padding: 0;
+  margin: 0;
+  font-size: 100%;
+}
+
+*,
+*::before,
+*::after {
+  box-sizing: inherit;
+  padding: inherit;
+  margin: inherit;
+}
+
+body {
+  line-height: 1.5;
+}

CSS Box

Width

auto with css-sizing: present for fill-available/max-content/min-content/fit-content with height/width/min-width/max-width/min-height/max-height/ grid-template-rows/grid-template-columns/flex-basis.

Z Index

数值越大,处于可视的优先级越大

Overflow

visible, hidden, scroll, auto

Resize Box

前置属性:overflow

/* 允许用户修改元素尺寸 */
+resize: none/both/horizontal/vertical/inherit;

Box Sizing

content-box(default), padding-box, border-box

Box Height

XXvh(viewport height)

直接计算宽度/高度

.my-element {
+  width: calc(10em + 3px);
+  height: calc(50% - 100px);
+}

Mobile Box Viewport

.my-element {
+  height: 100vh; /* Fallback for browsers that do not support Custom Properties */
+  height: calc(var(--vh, 1vh) * 100);
+}
window.addEventListener('resize', () => {
+  // Get viewport height and multiple it by 1% to get a value for a vh unit
+  const vh = window.innerHeight * 0.01;
+  document.documentElement.style.setProperty('--vh', `${vh}px`);
+});

Box Column

Multiple-column layout:

  • column-count
  • column-width
  • column-gap
  • column-rule
/* 子元素分列 */
+.three-column {
+  column-gap: 1em;
+  padding: 1em;
+  column-count: 3;
+}
  • column-count
  • column-width
  • column-gap 分隔距离
  • column-rule(style) 分隔线

Box Model

  • block-level box: display 属性为 block, list-item, table 的元素, 会生成 block-level box,并且参与 block formatting context
  • inline-level box: display 属性为 inline, inline-block, inline-table 的元素, 会生成 inline-level box,并且参与 inline formatting context
  • Flex Formatting Context(FFC)
  • Grid Formatting Context(GFC)

Box Margin

  • If both margin-left and margin-right are auto, their used values are equal. (CSS2 Visual formatting model details: 10.3.3)
  • If margin-top, or margin-bottom are auto, their used value is 0. (CSS2 Visual formatting model details: 10.6.3)

Box Percentage Length

Positioned elements with top: percentage depend on height of parent, if height of parent is auto, it’s not working.

Block Formatting Context

  • 一个 BFC 包含创建该上下文元素的所有子元素,但不包括创建了新 BFC 的子元素的内部元素
  • BFC 就是页面上的一个隔离的独立容器, 容器里面的子元素不会影响到外面的元素, 反之也如此
  • 一个元素不能同时存在于两个 BFC 中: 可让处于 BFC 内部的元素与外部的元素相互隔离
  • 内部的 Box 会在垂直方向,一个接一个地放置
  • vertical margin collapsing
  • 每个元素的 margin box 的左边, 与包含块 border box 的左边相接触
  • BFC 的区域不会与 float box 重叠: 自适应分栏布局, 清除外/内部浮动
  • 计算 BFC 的高度时, 浮动元素也参与计算: 防止内边距塌陷 (margin-top collapse with margin-bottom)

Stack Context

The root element forms the root stacking context. Other stacking contexts are generated by any position/opacity/transform element (including relatively positioned elements) having a computed value of z-index other than auto.

Once apply a position property to a box, can use the z-index property to adjust its stack level.

Create BFC

  • 根元素或其它包含它的元素
  • overflow: not visible (i.e hidden)
  • float: left/right
  • position: absolute/fixed
  • display: inline-block
  • display: table-cell/table-caption/table-*h
  • display: flow-root
  • direct children of display: flex/inline-flex
  • direct children of display: grid/inline-grid

Margin Collapsing

  • closet sibling: 1’s margin-bottom with 2’s margin-top
  • parent and it’s first/last child: up with up (bottom with bottom)
  • empty block: margin-top with margin-bottom

Best Practice: only use margin-bottom: 1em/1rem for spacing.

Float Patterns

float make element specified value of display:

  • inline-table computed to table
  • inline/inline-block/table-* computed to block

Fixed Parent

Floating wont work inside fixed or absolute div unless specify width

.parent {
+  position: fixed;
+  top: 5px;
+  left: 0;
+  width: 100%;
+}

Float ClearFix

Best Practice: 为父容器 (.row) 添加 .clearfix, display: table 防止外边距塌陷, clear: both 清除浮动.

.row {
+  width: 100%;
+  max-width: --var(row-max-width);
+  margin: 0 auto;
+}
+
+.clearfix::before,
+.clearfix::after {
+  display: table;
+  content: '';
+}
+
+.clearfix::after {
+  clear: both;
+}
+
+.clearfix {
+  *zoom: 1;
+}

Float Best Practice

  • 段中部分元素浮动(结合 margin/padding), 可实现内嵌效果
  • 分栏布局
  • shape-outside provides a way to customize wrapping, making it possible to wrap text around complex objects rather than simple boxes.
shape-outside: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);

Position Patterns

Static Position

top/left/width/right/z-index are invalid

Relative Position

  • 使元素相对于 static 布局, 可使用top/bottom/left/right属性进行定位.
  • 初始位置被保留, 不脱离文档流.

Absolute Position

  • 使元素相对于 浏览器窗口/父元素(position: non-static) 布局 (包括 % 形式的 width/height)
    • 若 body 为 static, 则元素不会随着滚动条滚动, 其相对于初始窗口布局.
  • 可使用 top/bottom/left/right 属性进行定位.
  • 初始位置不被保留, 脱离文档流.
  • float property computed to float: none.
  • display inline-table computed to table.
  • display inline/inline-block/table-* computed to block.
.overlay {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: -50;
+  width: 100%;
+  height: 100%;
+  background: rgb(0 0 0 / 50%);
+}
.fullscreen-video {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: -100;
+  width: 100%;
+  height: 100vh;
+  overflow: hidden;
+  background-size: cover;
+}
+
+.fullscreen-video video {
+  min-width: 100%;
+  min-height: 100%;
+}

Fixed Position

  • 使元素想对于 浏览器窗口 布局, 但不受滑动条影响
  • 可使用top/bottom/left/right属性进行定位
  • float: none
  • display: inline-table computed to table
  • display: inline/inline-block/table-* computed to block
/* 使子元素可以相对于父元素布局 */
+
+.parent {
+  position: relative;
+}
+
+.children {
+  position: absolute;
+  top: auto;
+  left: 0;
+}

Sticky Position

position: sticky + top: 0:

  • 粘性定位的元素在它距离视窗顶部大于 0 时, 会按照默认布局, 表现为 Relative Position.
  • 一旦其距离顶部的距离等于 0, 元素会固定在窗口顶部, 表现为 Fixed Position.
.sticky {
+  position: sticky;
+  top: 0;
+  margin-top: 50px;
+}

Flex Patterns

Flexbox Complete Guide

Flex Under the Hood

flex-basis 设置为 autowidth 或者 (height)不为auto时, 计算 used size 时会用 width 或者 (height) 代替 flex-basis:

  • When there is some free space left: true width = flex-basis + flex-grow/sum of flex-grow.
  • When there is not enough space: true width = flex-basis - flex-shrink/sum of flex-shrink.
  • Text nodes and pseudo-elements can be flex children.

Flex Useful Shorthand

flex: flex-grow flex-shrink flex-basis.

  • flex: auto:

元素会根据自身的宽度与高度来确定尺寸, 但是会自行伸长以吸收 flex 容器中额外的自由空间, 也会缩短至自身最小尺寸以适应容器. Equal to flex: 1 1 auto.

  • flex: initial:

属性默认值, 元素会根据自身宽高设置尺寸. 它会缩短自身以适应容器, 但不会伸长并吸收 flex 容器中的额外自由空间来适应容器. Equal to flex: 0 1 auto.

  • flex: none:

元素会根据自身宽高来设置尺寸. 它是完全非弹性的: 既不会缩短, 也不会伸长来适应 flex 容器. Equal to flex: 0 0 auto.

  • flex: <positive-number>

元素会被赋予一个容器中自由空间的指定占比. Equal to flex: <positive-number> 1 0.

Flex Parent Property

  • justify-content: defines alignment along main axis.
  • align-items: defines alignment for cross axis.
  • align-content: aligns flex container’s lines within when there is extra space in the cross-axis.
  • *-content adjust parent padding, *-items and *-self adjust children margin.

Common flex attributes:

  • display: flex;.
  • flex-direction: row/column;.
  • flex-wrap: nowrap/wrap/wrap-reverse;.
  • align-content: flex-start/flex-end/center/space-between/space-around;.
  • align-items: flex-start/flex-end/center/baseline/stretch;.
  • justify-content: flex-start/flex-end/center/space-between/space-around;.

Flex Children Property

  • flex: number; 宽/高度权重.
  • flex-basis: number;.
  • flex-grow: number;.
  • flex-shrink: number;.
  • align-self: auto/flex-start/flex-end/center/baseline/stretch;.
  • order: number; 显示顺序.

Flexibility of Float and Alignment

<div class="parent">
+    <div class="child></div>
+</div>
.parent {
+  display: flex;
+}
+
+.child {
+  /* this will push child to the right of parent border */
+  margin-left: auto;
+}

Flexbox Pseudo Elements

Set flex to pseudo elements of flex box will change width of pseudo elements.

.flex {
+  display: flex;
+}
+
+.flex::before {
+  position: relative; /* no need for absolute position */
+  display: block;
+}

Fixed Sidebar with Flexbox

<body>
+  <aside></aside>
+  <main></main>
+</body>
body {
+  display: flex;
+  height: 100vh;
+  margin: 0;
+}
+
+aside {
+  flex: 0 0 auto; /* inflexible */
+}
+
+main {
+  flex: 1 1 auto; /* auto flexible */
+  overflow: auto;
+}

Flexbox Best Practice

.container {
+  display: flex;
+}
+
+.initial {
+  /* width: 100px~200px */
+  flex: initial;
+  width: 200px;
+  min-width: 100px;
+}
+
+.none {
+  /* width: 200px */
+  flex: none;
+  width: 200px;
+}
+
+.flex1 {
+  /* width: left width * 1/3 */
+  flex: 1;
+}
+
+.flex2 {
+  /* width: left width * 2/3 */
+  flex: 2;
+}
/* 子元素全部居中对齐 */
+.vertical-container {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 300px;
+}
.layer {
+  display: flex;
+  flex-direction: row;
+  flex-grow: 1;
+  align-items: center;
+  justify-content: flex-start;
+  margin: 5px;
+  background-color: #fff;
+  border: 1px solid #000;
+}

Grid Patterns

Grid Complete Guide

.container {
+  grid-template-areas:
+    'header header header'
+    'advert content content'
+    'footer footer footer';
+
+  /*
+   * grid-template-columns:
+   *   repeat([auto-fit / auto-fill / numbers], minmax(60px, 1fr));
+   */
+
+  grid-template-rows: 1fr 1fr 1fr;
+  grid-template-rows: minmax(90px, 1fr);
+  grid-template-columns: 1fr 1fr 1fr;
+  grid-template-columns: repeat(3, 1fr);
+  grid-gap: 10px;
+  align-items: end;
+  justify-items: center;
+}
+
+.item {
+  grid-area: footer;
+  grid-row: start / end; /* 2 / -1 */
+  grid-column: start / end;
+  align-self: end;
+
+  /* grid-area: hstart / vstart / hend / vend */
+  justify-self: center;
+}

Responsive grid layout

.items {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
+}

named rows and columns

.main {
+  display: grid;
+  grid-template-rows: [header] 100px [body] auto;
+  grid-template-columns: [l-gutter] 1fr [sidebar] 4fr [content] 8fr [r-gutter] 1fr;
+  grid-gap: 1rem 2rem;
+}
+
+.header {
+  grid-row: header;
+  grid-column: sidebar / right-gutter;
+}
+
+.sidebar {
+  grid-row: body;
+  grid-column: sidebar;
+}
+
+.content {
+  grid-row: body;
+  grid-column: content;
+}

Grid Attention Tips

  • grid-column will refactor template of grid (grid-template-columns)
  • grid-row will refactor template of grid (grid-template-rows)

Grid Alignment

  • justify-content/align-content content within element, attach to parent css selector (effectively adjusts padding of parent)
  • justify-items/align-items inline items inside box, attach to parent css selector (controls margin of children )
  • justify-self/align-self inline element within parent, attach to children css selector (effectively adjusts margin of children)

Grid Pseudo Elements

h1.lines {
+  display: grid;
+  grid-template-columns: 1fr auto 1fr;
+  gap: 1em;
+}
+
+h1.lines::before,
+h1.lines::after {
+  align-self: center;
+  content: '';
+  border-top: 1px solid black;
+}

Column Patterns

  • float 左右元素 + margin 中间元素
  • float 元素 + width: %

Two Column Pattern

利用父元素 relative 与 子元素 absolute 进行布局

  • inline-block + inline-block
  • float + float
  • float + margin-left (block element ignore float element, inline element surround float element)
  • absolute + margin-left (absolute element not in normal flow)
  • float + BFC
.div-1 {
+  position: relative;
+}
+
+.div-1a {
+  position: absolute;
+  top: 0;
+  right: 0;
+  width: 200px;
+}
+
+.div-1b {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 200px;
+}

Three Column Pattern

Absolute and Margin Column

position .left and .right with absolute, add margin-left and margin-right to .middle

Float and Margin Column

.left .right .middle
.left {
+  float: left;
+}
+
+.right {
+  float: right;
+}
+
+.middle {
+  margin: 0 right-width 0 left-width;
+}

Float and Negative Margin Column

On a floated element, a negative margin opposite the float direction will decrease the float area, causing adjacent elements to overlap the floated element. A negative margin in the direction of the float will pull the floated element in that direction.

  1. HTML: .middle first
  2. padding-left and padding-right to .container, min-width: 2 * (leftWidth + rightWidth) to container
  3. Float: float: left to .left/.middle/.right
  4. Negative Margin: margin-left: -100% to .left, margin-right: -rightWidth px to .right
  5. Move: right: leftWidth px to .left
<div class="container">
+  <div class="middle"></div>
+  <div class="left"></div>
+  <div class="right"></div>
+</div>
.container {
+  padding: 0 200px 0 300px; /* padding-left = .left width, same to .right */
+}
+
+.container .middle {
+  float: left;
+  width: 100%;
+  background-color: violet;
+}
+
+.container .left {
+  position: relative;
+  right: 300px;
+  float: left;
+  width: 300px;
+  margin-left: -100%;
+  background-color: darkblue;
+}
+
+.container .right {
+  position: relative;
+  float: left;
+  width: 200px;
+  margin-right: -200px;
+  background-color: red;
+}

Centering Patterns

Centering CSS Complete Guide

Horizontal Centering Pattern

  • inline: text-align, flex/grid box
  • block: auto margin, flex/grid box
  • 父元素 float, 父子元素 relative
.container {
+  position: relative;
+  left: 50%;
+  float: left;
+}
+
+.container ul {
+  position: relative;
+  left: -50%;
+}

Vertical Centering Pattern

Vertical Inline element

  • padding
  • line-height
  • vertical-align: middle
    • 作用环境: parent element line-height === height.
    • 作用对象: children element display: inline-block/inline.
  • flexbox
  • grid

Button label (<a>) vertical alignment:

a.button::before {
+  display: inline-block;
+  height: 16px;
+  vertical-align: middle;
+  content: '';
+}

Vertical Block element

  • top + margin
  • top + translateY
  • vertical-align
  • flexbox
  • grid
.form-item-label {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+}

Mixing Centering Pattern

在子容器中在设置新元素即可

CSS Logical Properties and Values

CSS Logical Basis

In positioning/sizing/margin/padding/border/text alignment:

  • block-start for top
  • block-end for bottom
  • block for vertical
  • inline-start for left
  • inline-end for right
  • inline for horizontal

CSS Logical Reference

CSS ScrollBar

Custom ScrollBar

.demo::-webkit-scrollbar {
+  /* 滚动条整体样式 */
+
+  /* 高宽分别对应横竖滚动条的尺寸 */
+  width: 10px;
+  height: 1px;
+}
+
+.demo::-webkit-scrollbar-thumb {
+  background-color: blue;
+  background-image: linear-gradient(
+    45deg,
+    rgb(255 255 255 / 20%) 25%,
+    transparent 25%,
+    transparent 50%,
+    rgb(255 255 255 / 20%) 50%,
+    rgb(255 255 255 / 20%) 75%,
+    transparent 75%,
+    transparent
+  );
+
+  /* 滚动条方块 */
+  border-radius: 10px;
+}
+
+.demo::-webkit-scrollbar-track {
+  background-color: #ededed;
+
+  /* 滚动条轨道 */
+  border-radius: 10px;
+  box-shadow: inset 0 0 5px rgb(0 0 0 / 20%);
+}

Hidden ScrollBar

.demo {
+  scrollbar-width: none; /* FireFox */
+  -ms-overflow-style: none; /* IE 10+ */
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+.demo::-webkit-scrollbar {
+  display: none; /* Chrome Safari */
+}

CSS Opacity

0 ~ 1, 渐进效果常用属性

CSS Colors

HSL Color

  • H: hue
  • S: saturation (stay 50% etc.)
  • L: lightness (easy to theme colors)
/* Hover Button */
+:root {
+  --primary-h: 221;
+  --primary-s: 72%;
+  --primary-l: 62%;
+}
+
+.button {
+  background-color: hsl(var(--primary-h) var(--primary-s) var(--primary-l));
+}
+
+.button:hover,
+.button:focus {
+  --primary-l: 54%;
+}
/* Custom Buttons */
+:root {
+  --primary-h: 221;
+  --primary-s: 72%;
+  --primary-l: 62%;
+}
+
+.button {
+  background-color: hsl(var(--primary-h) var(--primary-s) var(--primary-l));
+}
+
+.button-secondary {
+  --primary-l: 90%;
+
+  color: #222;
+}
+
+.button-ghost {
+  --primary-l: 90%;
+
+  background-color: transparent;
+  border: 3px solid hsl(var(--primary-h) var(--primary-s) var(--primary-l));
+}
/* Change lightness to get gradient */
+.section {
+  background: linear-gradient(
+    to left,
+    hsl(var(--primary-h) var(--primary-s) var(--primary-l)),
+    hsl(var(--primary-h) var(--primary-s) 95%)
+  );
+}
+
+.section-2 {
+  --primary-h: 167;
+}

CSS Border

Border Radius

Border Image

border-image: source slice width outset repeat;

Border Collapse

table,
+tr,
+td {
+  border: 1px solid #666;
+}
+
+table {
+  border-collapse: collapse;
+}

Border Best Practice

Mix transparent with non-transparent border to make shapes (e.g. triangle).

.arrow-up {
+  width: 0;
+  height: 0;
+  border-right: 16px solid transparent;
+  border-bottom: 20px solid #8888e8;
+  border-left: 16px solid transparent;
+}
+
+.arrow-right {
+  width: 0;
+  height: 0;
+  border-top: 16px solid transparent;
+  border-bottom: 16px solid transparent;
+  border-left: 20px solid #e888a3;
+}
+
+.arrow-down {
+  width: 0;
+  height: 0;
+  border-top: 20px solid #f7df6c;
+  border-right: 16px solid transparent;
+  border-left: 16px solid transparent;
+}
+
+.arrow-left {
+  width: 0;
+  height: 0;
+  border-top: 16px solid transparent;
+  border-right: 20px solid #8de698;
+  border-bottom: 16px solid transparent;
+}

CSS Background

Background Image

  • url()
  • linear-gradient()
  • radial-gradient()

Awesome gradient buttons:

.btn:hover,
+.btn:focus {
+  background-position: right center; /* change the direction of the change here */
+}
+
+.btn-1 {
+  background-image: linear-gradient(
+    to right,
+    #f6d365 0%,
+    #fda085 51%,
+    #f6d365 100%
+  );
+}
+
+.btn-2 {
+  background-image: linear-gradient(
+    to right,
+    #fbc2eb 0%,
+    #a6c1ee 51%,
+    #fbc2eb 100%
+  );
+}
+
+.btn-3 {
+  background-image: linear-gradient(
+    to right,
+    #84fab0 0%,
+    #8fd3f4 51%,
+    #84fab0 100%
+  );
+}
+
+.btn-4 {
+  background-image: linear-gradient(
+    to right,
+    #a1c4fd 0%,
+    #c2e9fb 51%,
+    #a1c4fd 100%
+  );
+}
+
+.btn-5 {
+  background-image: linear-gradient(
+    to right,
+    #ffecd2 0%,
+    #fcb69f 51%,
+    #ffecd2 100%
+  );
+}

Background Size

  • contain
  • cover
  • useful for images and video
.video {
+  min-width: 100%;
+  min-height: 100%;
+  overflow: hidden;
+  background-size: cover;
+}

Background Repeat

/* Keyword values */
+background-repeat: repeat-x;
+background-repeat: repeat-y;
+background-repeat: repeat;
+background-repeat: space;
+background-repeat: round;
+background-repeat: no-repeat;
+
+/* Two-value syntax: horizontal | vertical */
+background-repeat: repeat space;
+background-repeat: repeat repeat;
+background-repeat: round space;
+background-repeat: no-repeat round;

Background Attachment

  • scroll: scrolls with the main view, but stays fixed inside the local view
  • local: scrolls both with the main view and the local view
  • fixed: stays fixed no matter what
  • 对于可以滚动的元素 (设置为 overflow: scroll 的元素), 当 background-attachment 设置为 scroll 时, 背景图不会随元素内容的滚动而滚动
  • 对于可以滚动的元素 (设置为 overflow: scroll 的元素), 设置 background-attachment: local, 则背景会随内容的滚动而滚动
  • parallax effect: background-attachment: fixed
background-attachment: scroll; /* 背景图相对于元素固定,背景随页面滚动而移动,即背景和内容绑定 */
+background-attachment: fixed; /* 背景图相对于元素内容固定 */
+background-attachment: local; /* 背景图相对于视口固定,所以随页面滚动背景不动,相当于背景被设置在了 body 上 */
/* parallax effect */
+body {
+  box-sizing: border-box;
+  width: 100%;
+  height: 100vh;
+  padding: 0;
+  margin: 0;
+}
+
+.parallax {
+  min-height: 60%; /* key */
+  background-image: url('./images/bg.jpg');
+  background-repeat: no-repeat;
+  background-attachment: fixed; /* key */
+  background-position: center;
+  background-size: cover;
+}

Background Clip

指定背景显示范围 content-box/padding-box/border-box

h1 {
+  background-image: url('bg.jpg');
+  background-clip: text;
+}

Background Origin

指定背景绘制起点 content-box/padding-box/border-box

Blend Mode

  • mix-blend-mode is used for text styles
  • with multiply: black is cutout (keep black) (0 * WHAT = 0)
  • with screen: white is cutout (keep white) (100 - (100 - WHAT) * (100 - 100) = 100)
<div class="background">
+  <h1>Even More CSS Secrets</h1>
+</div>
.background {
+  background-image: url('bg.png');
+  background-repeat: no-repeat;
+  background-position: center;
+  background-size: cover;
+}
+
+.background h1 {
+  color: white; /* keep white */
+  background-color: black; /* mix with background */
+  mix-blend-mode: screen; /* screen or multiply  */
+}

background-blend-mode is used for multiple background images

<div class="container"></div>
.container {
+  background: url($pic1), url($pic2);
+  background-size: cover;
+  background-blend-mode: lighten;
+}

Night mode:

.night {
+  filter: brightness(80%) grayscale(20%) contrast(1.2);
+  background-blend-mode: darken;
+}

movie style

.movie {
+  filter: contrast(1.1);
+  background-blend-mode: soft-light;
+}

Mask Style

  • Black for masking
  • White for showing
#masked {
+  width: 100px;
+  height: 100px;
+  background-color: #8cffa0;
+  mask-image: url('https://mdn.mozillademos.org/files/12668/MDN.svg'),
+    url('https://mdn.mozillademos.org/files/12676/star.svg');
+  mask-size: 100% 100%;
+  mask-composite: add; /* Can be changed in the live sample */
+}

Clip Path

Basic Clip Path

.polygon {
+  clip-path: polygon(75% 0%, 100% 50%, 75% 100%, 0% 100%, 25% 50%, 0% 0%);
+}

SVG Clip Path

<svg class="svg">
+  <clipPath id="circle" clipPathUnits="objectBoundingBox">
+    <path
+      d="M0.5,0 C0.776,0,1,0.224,1,0.5 C1,0.603,0.969,0.7,0.915,0.779 C0.897,0.767,0.876,0.76,0.853,0.76 C0.794,0.76,0.747,0.808,0.747,0.867 C0.747,0.888,0.753,0.908,0.764,0.925 C0.687,0.972,0.597,1,0.5,1 C0.224,1,0,0.776,0,0.5 C0,0.224,0.224,0,0.5,0"
+    ></path>
+  </clipPath>
+</svg>
.item {
+  clip-path: url('#circle');
+}

Background Best Practice

Scroll Indicator

body {
+  position: relative;
+}
+
+.indicator {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1;
+  pointer-events: none;
+  background: linear-gradient(to right top, teal 50%, transparent 50%) no-repeat;
+  background-size: 100% calc(100% - 100vh);
+  mix-blend-mode: darken;
+}
+
+/* use after element to hidden triangle background gradient */
+
+/* only show 5px background */
+.indicator::after {
+  position: fixed;
+  top: 5px;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1;
+  content: '';
+  background: #fff;
+}

Jumbotron and Landing Page

.jumbotron {
+  width: 1px;
+  height: 1px;
+  background-image: url('bg.jpg');
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-size: cover;
+}

Horizontal Scrolling Best Practices

Horizontal Scrolling:

  • Avoid a full-screen horizontal scroll; ensure that users know there is also content that can be reached using a traditional method.
  • Make scroll interactions obvious and provide instruction.
  • To avoid accessibility issues, ensure that horizontal scrolling elements also work with keyboard navigation.
  • Design horizontal scrolling elements in containers using HTML and CSS.
  • Use visual cues, such as partial images, to show that there is a horizontal scroll action in effect.
  • Use partial horizontal scrolling with a static design element for stability.
  • Design horizontal scroll bars in the same manner as vertical scroll bars to create an element of familiarity for users.

Horizontal Scrolling Methods:

  • Rotate 90 deg element.
  • display: flex; overflow-x: auto;
  • grid-auto-flow: column;
  • scroll-snap-type: x mandatory; scroll-snap-align: center;

CSS Text

.text {
+  text-align: center;
+  text-decoration: underline/line-through; /* 下划线与删除线 */
+}
+
+.paragraph {
+  line-height: 1.5em; /* 行间距  */
+  text-indent: 2em; /* 段落缩进 */
+  letter-spacing: 50px; /* 字间距  */
+  word-spacing: 50px; /* 词间距  */
+}

Text Alignment

justify: 自适应,左右都无空格

.wrap {
+  text-align: justify;
+  text-align-last: justify; /* 一个块或行的最后一行对齐方式 */
+  text-justify: distribute-all-lines; /* ie6-8 */
+}

Text Overflow

  • clip 切除溢出部分
  • ellipsis 省略号标志 (要设定 width)
.truncation-article-container {
+  width: 500px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
.article-container {
+  display: box;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 4; /* 需要显示的行数 */
+}

Text Wrap

/* 不换行 */
+.nowrap {
+  white-space: nowrap;
+}
+
+/* 自动换行 */
+.auto-wrap {
+  word-break: normal;
+  word-wrap: break-word;
+}
+
+/* 自动换行 */
+pre {
+  word-wrap: break-word; /* IE 5.5-7 */
+  white-space: pre-wrap; /* Modern Browsers */
+}
+
+/* 强制换行 */
+.force-wrap {
+  word-break: break-all;
+}

Text Transform

p {
+  font-variant: small-caps; /* 小型的大写字母 */
+  text-transform: uppercase; /* 大写字母 */
+  text-transform: lowercase; /* 小写字母 */
+  text-transform: capitalize; /* 首字母大写 */
+}

Text Writing Mode

Vertical Writing Mode

/* 单列展示 */
+.wrap-single {
+  width: 25px;
+  height: auto;
+  padding: 8px 5px;
+  font-size: 12px;
+  line-height: 18px;
+  word-wrap: break-word; /* 英文自动换行 */
+}
+
+/* 多列展示 */
+.wrap-multiple {
+  height: 200px;
+  line-height: 30px;
+  text-align: justify;
+  writing-mode: vertical-lr; /* 从左向右 */
+  writing-mode: vertical-rl; /* 从右向左 */
+  writing-mode: tb-lr; /* IE 从左向右 */
+  writing-mode: tb-rl; /* IE 从右向左 */
+}

White Space

  • Web Default: 空格被解析为换行
  • Web Default: 换行被解析为空格
  • Web Default: 自动合并空格

普通标签内自动忽略空格符, 并将其与空白符转换成一个空格进行输出, 可用 white-space 改变这一行为:

|------------|-----|----------|------|-------| | White Space|换行符|空格和制表符|文字换行|行尾空格| | normal | 合并 | 合并 | 换行 | 删除 | | nowrap | 合并 | 合并 | 不换行 | 删除 | | pre | 保留 | 保留 | 不换行 | 保留 | | pre-wrap | 保留 | 保留 | 换行 | 挂起 | | pre-line | 保留 | 合并 | 换行 | 删除 | | break-spaces | 保留 | 保留 | 换行 | 换行 |

CSS Font

Font Size

html {
+  /* 浏览器默认size为16px,此时将html-size自动计算为10px */
+  font-size: 62.5%;
+}
+
+small {
+  /* 11px */
+  font-size: 1.1rem;
+}
+
+strong {
+  /* 18px */
+  font-size: 1.8rem;
+}

Font Style

  • normal
  • italic
  • oblique

Font Variant

  • normal
  • small-caps: 小型大写字母

Font Size Adjust

  • 使字体保持大小,不随字体类型改变而改变
  • 不同字体有不同的值(x-height/字体尺寸)

Font Display

The font display timeline:

  • block period: font face is not loaded, render an invisible fallback font face (use normally when loaded in this period)
  • swap period: font face is not loaded, render a fallback font face (use normally when loaded in this period)
  • failure period: the user agent treats it as a failed load causing normal font fallback

font-display - how a font face is displayed based on whether and when it is downloaded and ready to use:

  • auto: font display strategy defined by the user agent
  • block: a short block period and an infinite swap period
  • swap: an extremely small block period and an infinite swap period
  • fallback: an extremely small block period and a short swap period
  • optional: an extremely small block period and no swap period
@font-face {
+  font-family: ExampleFont;
+  font-style: normal;
+  font-weight: 400;
+  src: url('/path/to/fonts/exampleFont.woff') format('woff'), url('/path/to/fonts/exampleFont.eot')
+      format('eot');
+  font-display: fallback;
+}

Custom Fonts Function

@font-face 使用户使用服务端提供的字体:

@font-face {
+  /* :call <SNR>105_SparkUpNext() */
+  font-family: mySpecialFont;
+  font-style: inherit;
+  font-weight: inherit;
+  font-variant: inherit;
+  src: url('./Colleen.ttf');
+}
+
+.selector {
+  /* :call <SNR>105_SparkUpNext() */
+  font-family: mySpecialFont, sans-serif;
+}

Font Best Practice

font-family: sans-serif;
+font-size: 12px;
+font-weight: 400;
+line-height: 100px;
+color: black;
+text-decoration: none;
+text-transform: uppercase;
+letter-spacing: 1.3px;
.mi: {
+  font-family: Arial, 'Microsoft YaHei', '黑体', '宋体', sans-serif;
+}
+
+.tao: {
+  font: 12px/1.5 Tahoma, Helvetica, Arial, '宋体', sans-serif;
+}
+
+.one-plus: {
+  font: 14px/1.5 'Microsoft YaHei', Arial, Tahoma, '\5b8b\4f53', sans-serif;
+}
+
+.tao-ued: {
+  font: 12px/1 Tahoma, Helvetica, Arial, '\5b8b\4f53', sans-serif;
+}
+
+.tao-ux: {
+  font-family: Helvetica, 'Hiragino Sans GB', 'Microsoft Yahei', '微软雅黑',
+    Arial, sans-serif;
+}
+
+.font {
+  font: 12px/1 Tahoma, Helvetica, Arial, '\5b8b\4f53', sans-serif;
+}
宋体 SimSun
+黑体 SimHei
+微软雅黑 Microsoft YaHei
+微软正黑体 Microsoft JhengHei
+新宋体 NSimSun
+新细明体 PMingLiU
+细明体 MingLiU
+标楷体 DFKai-SB
+仿宋 FangSong
+楷体 KaiTi
+仿宋_GB2312 FangSong_GB2312
+楷体_GB2312 KaiTi_GB2312
+
+宋体:SimSun
+
+华文细黑:STHeiti Light [STXihei]
+华文黑体:STHeiti
+华文楷体:STKaiti
+华文宋体:STSong
+华文仿宋:STFangsong
+儷黑 Pro:LiHei Pro Medium
+儷宋 Pro:LiSong Pro Light
+標楷體:BiauKai
+蘋果儷中黑:Apple LiGothic Medium
+蘋果儷細宋:Apple LiSung Light
+
+
+新細明體:PMingLiU
+細明體:MingLiU
+標楷體:DFKai-SB
+黑体:SimHei
+新宋体:NSimSun
+仿宋:FangSong
+楷体:KaiTi
+仿宋_GB2312:FangSong_GB2312
+楷体_GB2312:KaiTi_GB2312
+微軟正黑體:Microsoft JhengHei
+微软雅黑体:Microsoft YaHei
+
+隶书:LiSu
+幼圆:YouYuan
+华文细黑:STXihei
+华文楷体:STKaiti
+华文宋体:STSong
+华文中宋:STZhongsong
+华文仿宋:STFangsong
+方正舒体:FZShuTi
+方正姚体:FZYaoti
+华文彩云:STCaiyun
+华文琥珀:STHupo
+华文隶书:STLiti
+华文行楷:STXingkai
+华文新魏:STXinwei

CSS Counter

Adjust the appearance of content based on its location in a document.

/* Set a counter named 'section', and its initial value is 0. */
+body {
+  counter-reset: section;
+}
+
+/* Increment the value of section counter by 1 */
+
+/* Display the value of section counter */
+h3::before {
+  content: counter(section);
+  counter-increment: section;
+}

CSS Filter

.filter {
+  filter: url('resources.svg'); /* 引用SVG filter元素 */
+  filter: blur(5px); /* 模糊 */
+  filter: brightness(0.4); /* 高光 */
+  filter: contrast(200%); /* 对比度 */
+  filter: drop-shadow(16px 16px 20px blue); /* 阴影 */
+  filter: grayscale(50%); /* 灰度 */
+  filter: hue-rotate(90deg); /* 色相旋转 */
+  filter: invert(75%); /* 颜色翻转/反相 */
+  filter: opacity(25%); /* 透明度 */
+  filter: saturate(30%); /* 饱和度 */
+  filter: sepia(60%); /* 老照片 */
+
+  /* Apply multiple filters */
+  filter: contrast(175%) brightness(3%);
+
+  /* Global values */
+  filter: inherit;
+  filter: initial;
+  filter: unset;
+}

Fusion Effect

  • Parent element: background-color + filter: contrast().
  • Child element: filter: blur().
<div class="container">
+  <div class="circle circle-1"></div>
+  <div class="circle circle-2"></div>
+</div>
.container {
+  background: #fff; /* Required */
+  filter: contrast(30);
+}
+
+.circle {
+  filter: blur(10px);
+}

SVG Filter

内投影滤镜

<svg
+  width="300"
+  height="300"
+  viewBox="0 0 20 20"
+  style="position:absolute;left:-999px;"
+>
+  <filter id="inset-shadow">
+    <!-- 投影偏移 -->
+    <feOffset dx="0" dy="0" />
+    <!-- 投影模糊 -->
+    <feGaussianBlur stdDeviation="6" result="offset-blur" />
+    <!-- 反转投影使其变成内投影 -->
+    <feComposite
+      operator="out"
+      in="SourceGraphic"
+      in2="offset-blur"
+      result="inverse"
+    />
+    <!-- 内投影附加黑色 -->
+    <feFlood flood-color="black" flood-opacity=".95" result="color" />
+    <feComposite operator="in" in="color" in2="inverse" result="shadow" />
+    <!-- 把内投影显示在图像上 -->
+    <feComposite operator="over" in="shadow" in2="SourceGraphic" />
+  </filter>
+</svg>

毛玻璃滤镜

<svg width="0" height="0" style="position:absolute;">
+  <filter id="blur" color-interpolation-filters="sRGB">
+    <feGaussianBlur stdDeviation="6" edgeMode="duplicate" />
+    <feComponentTransfer>
+      <feFuncA type="discrete" tableValues="0 1" />
+    </feComponentTransfer>
+  </filter>
+</svg>

Backdrop Filter

body {
+  background-image: url('https://images.unsplash.com/image');
+  background-position: center;
+}
+
+.card {
+  background-color: rgb(17 25 40 / 54%);
+  border: 1px solid rgb(255 255 255 / 12.5%);
+  border-radius: 12px;
+  backdrop-filter: blur(12px) saturate(200%);
+}

CSS Interactive

Cursor and Pointer

.wrap {
+  pointer-events: none;
+  cursor: default;
+}

User Select

.wrap {
+  -webkit-touch-callout: none;
+  user-select: none;
+}

CSS Form

  • 输入框光标颜色
input {
+  caret-color: red;
+}

SVG Styles

svg {
+  fill: red;
+  stroke: blue;
+  stroke-linecap: round;
+  stroke-linejoin: round;
+  stroke-width: 2px;
+}

Object Position and Fit

object-position/object-fit 只针对替换元素有作用:

  • form component
  • img
  • video

object-position/object-fit 之间的关系有点类似于 background-position/background-size, 可以处理图片拉伸变形问题.

.image-container {
+  position: relative;
+  padding-bottom: calc(2 / 3) * 100%; /* (height / width) ratio */
+}
+
+.image-container > img {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}

Animation

Animation Property

Transition and Transform

@media screen and (prefers-reduced-motion: reduce) {
+  .div {
+    transition: none;
+    transform: scaleX(0);
+  }
+}
+
+.div {
+  transition: * * transform * * 0.5s ease;
+  transform: scaleX(0);
+}
+
+.div:hover,
+.div:focus {
+  transform: scaleX(1);
+}

Animation and Transform

Animation Helper

  • opacity
  • overflow: hidden
  • pseudo elements (::before and ::after)
  • pseudo elements with animation (opacity, scale, translate, width/height, margin, background-position)
  • :hover/:focus/:target + animation/transform/transition
  • transform: scale/translate
  • animation-delay
  • width/height
  • max-width/max-height
  • margin
  • border
  • background
  • background-position
  • background with multiple gradient
  • single box-shadow
  • multiple box-shadow
z-index: -1;
+overflow: hidden;

Changing top/right/bottom/left of pseudo element can change animation start point (e.g bottom: 0, right: 0, change width/height from 0 to 100%, size animation will start from bottom-right corner).

Transition

Basic Usage

  • transition-property: color;
  • transition-duration: 1s;
  • transition-timing-function: cubic-bezier(.42, 0, .58, 1);
  • transition-delay: .5s;
@media screen and (prefers-reduced-motion: reduce) {
+  .element {
+    transition: none;
+  }
+}
+
+.element {
+  transition: property duration timing-function delay;
+  transition: transform 0.5s ease-in-out 0.2s;
+}

Transition Internal

transition take effect only when browser detecting different styles between style stage.

// transition not working
+panel.style.transform = 'scale(0)';
+panel.style.transition = 'transform .5s';
+// previous `transform` is empty
+panel.style.transform = 'scale(1)';
+
+// transition working
+panel.style.transform = 'scale(0)';
+panel.style.transition = 'transform .5s';
+// previous `transform` is `scale(0)`
+requestAnimationFrame(() => {
+  panel.style.transform = 'scale(1)';
+});
+
+// transition working
+panel.style.transform = 'scale(0)';
+// `getComputedStyle(element).property` trigger a new `style` stage
+getComputedStyle(panel).transform;
+panel.style.transition = 'transform .5s';
+// previous `transform` is `scale(0)`
+panel.style.transform = 'scale(1)';

Transition Direction

By specifying the transition on the element itself, define the transition to occur in both directions (hover on and hover off).

Change transition when :hover etc state bring magic effect:

@media screen and (prefers-reduced-motion: reduce) {
+  .menu-nav {
+    visibility: hidden;
+    transition: none;
+    transform: translateX(-100%);
+  }
+}
+
+.menu-nav {
+  visibility: hidden;
+  transition: all 0.4s ease-in-out;
+  transform: translateX(-100%);
+}
+
+@media screen and (prefers-reduced-motion: reduce) {
+  .menu-link {
+    opacity: 0;
+    transition: none;
+  }
+}
+
+.menu-link {
+  opacity: 0;
+  transition: opacity 0.4s ease-in-out;
+}
+
+.menu-toggle:checked ~ .menu-nav {
+  visibility: visible;
+  transform: translateX(0);
+}
+
+@media screen and (prefers-reduced-motion: reduce) {
+  .menu-toggle:checked ~ .menu-nav .menu-link {
+    opacity: 1;
+
+    /* magic effect for delaying transition */
+    transition: none;
+  }
+}
+
+.menu-toggle:checked ~ .menu-nav .menu-link {
+  opacity: 1;
+
+  /* magic effect for delaying transition */
+  transition: opacity 0.4s ease-in-out 0.4s;
+}

Class Controls on Transition

Transition Best Practice: with transition: opacity 0.5s set, first add .opacity-0 class, then replace it with .opacity-1 class. Transition animation get trigger as css style of element changed (class changed).

@media screen and (prefers-reduced-motion: reduce) {
+  .element {
+    transition: none;
+  }
+}
+
+.element {
+  transition: opacity 0.5s;
+}
+
+/* before-enter -> enter -> before-leave -> leave */
+.enter,
+.before-leave {
+  opacity: 1;
+}
+
+.leave,
+.before-enter {
+  opacity: 0;
+}
div.classList.add('before-enter');
+
+setTimeout(() => {
+  div.classList.remove('before-enter');
+  div.classList.add('enter');
+}, 20);

Transform

Transformations do affect the visual rendering, but have no affect on the CSS layout other than affecting overflow. Transforms are also taken into account when computing client rectangles exposed via the Element Interface Extensions, namely getClientRects() and getBoundingClientRect(), which are specified in [CSSOM-VIEW].

  • scale/X/Y/Z/3d(): 0 - n
  • translate/X/Y/Z/3d(): n px
  • rotate/X/Y/Z/3d(): deg
  • skew/X/Y(): deg
  • matrix()/matrix3d()
  • transform-origin: change transform start point top bottom center left right
  • perspective(): 为 3D 转换元素定义透视视图
  • keep translate(-50%, -50%) in keyframe transform property list when using it for alignment

一般需要在容器元素上加上以下样式:

.transform-container {
+  perspective: 1024px;
+  transform-style: preserve-3d;
+}
+
+.front .back {
+  backface-visibility: hidden;
+}

:hover should not add to transformed elements :hover should add to parent element

当旋转绝对定位居中的元素时, 需要改变 transform-origin:

.rotate {
+  position: absolute;
+  top: 200px;
+  left: 50%;
+  transform: translateX(-50%);
+  transform-origin: left;
+}

Perspective

translateZ 的功能就是让元素在自己的眼前或近或远

.parent {
+  perspective: 201px;
+}

其子元素:

  • 设置的 translateZ 值越小,则子元素大小越小(因为元素远去,我们眼睛看到的就会变小);
  • translateZ 值越大,该元素也会越来越大
  • 当 translateZ 值非常接近 201 像素,但是不超过 201 像素的时候(如 200 像素) 该元素的大小就会撑满整个屏幕(父辈元素没有 overflow:hidden 的限制)
  • 当 translateZ 值再变大,超过 201 像素的时候,该元素看不见了

Transform Style

transform-style 属性也是 3D 效果中经常使用的, 其两个参数,flat|preserve-3d. 前者 flat 为默认值,表示平面的; 后者 preserve-3d 表示 3D 透视

backface-visibility

backface-visibility: hidden;

当元素 rotateY(180deg) 时,元素将被隐藏

Animation Details

  • transform: scale, translate, rotate, skew
  • animation bounce/cache: first -100, then, +5/+20, finally 0
@media screen and (prefers-reduced-motion: reduce) {
+  .element {
+    animation: none;
+  }
+}
+
+.element {
+  animation: name duration timing-function delay iteration-count direction;
+}

Tip : fade in body style

@keyframes body-fade-in {
+  from {
+    opacity: 0;
+  }
+
+  to {
+    opacity: 1;
+  }
+}
+
+@media screen and (prefers-reduced-motion: reduce) {
+  body {
+    animation: none;
+    animation-duration: 2.5s;
+    animation-timing-function: ease;
+    animation-iteration-count: 1;
+  }
+}
+
+body {
+  animation-name: body-fade-in;
+  animation-duration: 2.5s;
+  animation-timing-function: ease;
+  animation-iteration-count: 1;
+}
@keyframes name1 {
+  0% {
+    color: red;
+  }
+
+  50% {
+    color: blue;
+  }
+
+  100% {
+    color: green;
+  }
+}
+
+@keyframes name2 {
+  from {
+    color: red;
+  }
+
+  to {
+    color: green;
+  }
+}
+
+/* 直接动画 */
+@media screen and (prefers-reduced-motion: reduce) {
+  .div {
+    animation: none;
+    animation-duration: 1s;
+    animation-timing-function: cubic-bezier(0.42, 0, 0.58, 1);
+    animation-delay: 0.5s;
+  }
+}
+
+.div {
+  animation-name: name;
+  animation-duration: 1s;
+  animation-timing-function: cubic-bezier(0.42, 0, 0.58, 1);
+  animation-delay: 0.5s;
+}
+
+/* hover 后再播放动画, 高级化 transform + transition */
+@media screen and (prefers-reduced-motion: no-preference) {
+  .div:hover,
+  .div:focus {
+    animation-name: name;
+    animation-duration: 1s;
+    animation-timing-function: cubic-bezier(0.42, 0, 0.58, 1);
+    animation-delay: 0.5s;
+  }
+}
  • animation-iteration-count: 执行次数 infinite
  • animation-direction: 执行方向
    • normal 0%->100%方向
    • alternate/alternate-reverse 不断交替方向
    • reverse 100%->0%方向
  • animation-fill-mode: forwards
  • animation-play-state: paused/running
  • DOM events:
    • animationiteration: triggered after each animation iteration
    • animationend: triggered after an animation completes
    • animationstart: triggered at the start of an animation

Animation Play State

div {
+  animation-play-state: paused;
+}
+
+:checked ~ div {
+  animation-play-state: running;
+}

animation pattern: 利用 animation-paly-state 与 JS 添加 .animate 类控制动画开始和停止.

@media screen and (prefers-reduced-motion: reduce) {
+  .to-animate {
+    animation: none;
+    animation-play-state: paused;
+    animation-iteration-count: infinite;
+  }
+}
+
+.to-animate {
+  animation: animationName 1.5s linear;
+  animation-play-state: paused;
+  animation-iteration-count: infinite;
+}
+
+.animate {
+  animation-iteration-count: running;
+}
element.classList.add('animate');
+setTimeout(() => element.classList.remove('animate'), duration);

FLIP

  • first: 初始状态
  • last: 动画结束状态
  • invert: last 至 first 的 transform 属性
  • play: transition: transform .2s linear
/* first: scale(1), last: scale(1.2) */
+@media screen and (prefers-reduced-motion: reduce) {
+  .scale-up {
+    transition: none;
+    transform: scale(0.8);
+  }
+}
+
+.scale-up {
+  transition: transform 0.2s linear;
+  transform: scale(0.8);
+}
+
+.scale-up:hover,
+.scale-up:focus {
+  transform: none;
+}

Animation Best Practice

Clear Splash Animation

.cube {
+  backface-visibility: hidden;
+  perspective: 1000;
+  transform-style: preserve-3d;
+  transform: translate3d(0, 0, 0);
+}

GreenSock Library

TweenMax

TweenMax.fromTo(element, 1, { x: 0 }, { x: 100 });

TimelineMax

const tl = new TimelineMax();
+tl.staggerFrom(
+  [
+    '#Cap_1 > g > path:nth-child(1)',
+    '#Cap_1 > circle:nth-child(7)',
+    '#Cap_1 > path:nth-child(6)',
+    '#Cap_1 > circle:nth-child(5)',
+  ],
+  1,
+  {
+    scaleY: 0,
+    scaleX: 0,
+    transformOrigin: 'center',
+    ease: Bounce.easeOut,
+    stagger: 0.2,
+  }
+);

Responsive Design

Responsive Font

  • em/rem font-size

Responsive Length

  • vw
  • vh
  • vmin
  • vmax

Responsive Size

  • Size in em if the property scales according to it’s font-size.
  • Modular Font Size: Size in em if the font-size should be modular (relative to it’s context/parent).
  • Size everything else in rem (include media queries).
/* scales to self font-size */
+.container {
+  margin-top: 1.2em;
+}
/* modular font size */
+.container {
+  font-size: 1.2rem;
+}
+
+.container p {
+  font-size: 1em;
+}
+
+.container small {
+  font-size: 0.9em;
+}

Responsive Box

Responsive Width and Height

  • min-height
  • max-height
  • min-width
  • max-width
/* responsive images */
+img {
+  max-width: 100%;
+}

Responsive Inline Box

use inline-box with width

.element {
+  display: inline-box;
+  width: 80%;
+}

Responsive Image

.responsive-image {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
<picture>
+  <source srcset="mdn-logo-wide.png" media="(min-width: 600px)" />
+  <img src="mdn-logo-narrow.png" alt="MDN" />
+</picture>

Media Query

  • only for improving compatibility with older browsers
  • definition order matters when media query with a different selector
  • JavaScript API: window.matchMedia()
/* stylelint-disable */
+@media (not / only) 设备类型 and ((not) 设备特性),
+  (not / only) 设备类型 and ((not) 设备特性-1) and ((not) 设备特性-2) {
+  /* 样式代码 */
+}
+/* stylelint-enable */
/* screen size : 500px ~ 1000px */
+@media screen and (min-width: 500px) and (max-width: 1000px) {
+  .container {
+    width: 750px;
+  }
+}

设备类型

类型解释
all所有设备
braille盲文
embossed盲文打印
handheld手持设备
print文档打印或打印预览模式
projection项目演示,比如幻灯
screen彩色电脑屏幕
speech演讲
tty固定字母间距的网格的媒体,比如电传打字机
tv电视

设备特性

属性Min/Max描述
aspect-ratio整数/整数yes渲染界面宽高比例
device-aspect-ratio整数/整数yes设备屏幕宽高比例
color整数yes每种色彩的字节数
color-index整数yes色彩表中的色彩数
heightlengthyes渲染界面的高度
widthlengthyes渲染界面的宽度
device-heightlengthyes设备屏幕的输出高度
device-widthlengthyes设备屏幕的输出宽度
grid整数no是否是基于格栅的设备
monochrome整数yes缓冲器中每像素字节
resolution分辨率(“dpi/dpcm”)yes分辨率
scanProgressive interlacednotv 媒体扫描方式
orientationPortrait/landscapeno横屏或竖屏
  • prefers-contrast: less, more.
  • prefers-color-scheme: light, dark.
  • prefers-reduced-motion: no-preference, reduce.

Prefers Color Scheme

.day {
+  color: black;
+  background: #eee;
+}
+
+.night {
+  color: white;
+  background: #333;
+}
+
+@media (prefers-color-scheme: dark) {
+  .day.dark-scheme {
+    color: white;
+    background: #333;
+  }
+
+  .night.dark-scheme {
+    color: #ddd;
+    background: black;
+  }
+}
+
+@media (prefers-color-scheme: light) {
+  .day.light-scheme {
+    color: #555;
+    background: white;
+  }
+
+  .night.light-scheme {
+    color: black;
+    background: #eee;
+  }
+}

Prefers Reduced Motion

@media (prefers-reduced-motion) {
+  .animated {
+    animation: none;
+  }
+}

Style for Print PDF

Media Query Support Detection

Detecting media query support in CSS:

/* stylelint-disable-next-line */
+@media not all and (prefers-reduced-data), (prefers-reduced-data) {
+  color: blue;
+}
  • No support: not all and (prefers-reduced-data): false, (prefers-reduced-data): false, Combined: false.
  • Support, but off: not all and (prefers-reduced-data): true, (prefers-reduced-data): false, Combined: true.
  • Support, and on: not all and (prefers-reduced-data): false, (prefers-reduced-data): true, Combined: true.

Detecting media query support in JavaScript:

const query = '(prefers-reduced-data)';
+
+// window.matchMedia(query).media return 'not all' or original query string
+const resolvedMediaQuery = window.matchMedia(query).media;
+
+const isSupported = query === resolvedMediaQuery;

JavaScript Media Query API

// https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryList
+const mql = window.matchMedia(mediaQueryString);
if (window.matchMedia('(min-width: 400px)').matches) {
+  /* the view port is at least 400 pixels wide */
+} else {
+  /* the view port is less than 400 pixels wide */
+}

Container Query

.sidebar {
+  /* stylelint-disable-next-line  property-no-unknown */
+  container-type: inline-size;
+  /* stylelint-disable-next-line  property-no-unknown */
+  container-name: sidebar;
+}
+
+@container sidebar (min-width: 400px) {
+  .card {
+    display: grid;
+    grid-template-columns: 2fr 1fr;
+  }
+}

Accessibility

Screen Reader Only

.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0 0 0 0);
+  clip-path: polygon(0 0, 0 0, 0 0);
+  white-space: nowrap;
+  border: 0;
+}

Awesome Components

Landing Page

h1 {
+  background-image: url('bg.jpg');
+  background-clip: text;
+}
.jumbotron {
+  min-height: 100%;
+  background-image: url('');
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-size: cover;
+  opacity: 0.8;
+}
.fullscreen-video {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: -100;
+  width: 100%;
+  height: 100vh;
+  overflow: hidden;
+  background-size: cover;
+}
+
+.fullscreen-video video {
+  min-width: 100%;
+  min-height: 100%;
+}
.parallax {
+  min-height: 60%; /* key */
+  background-image: url('./images/bg.jpg');
+  background-repeat: no-repeat;
+  background-attachment: fixed; /* key */
+  background-position: center;
+  background-size: cover;
+}
.overlay {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background: rgb(0 0 0 / 50%);
+}

Flexible Heading

h1 {
+  display: flex;
+  align-items: center;
+  width: 100%;
+}
+
+h1::before,
+h1::after {
+  flex: 1;
+  height: 0.1em;
+  margin: 0.2em;
+  content: '';
+  background-color: gray;
+}
  • reset.css

Table

  • margin-left: auto to align-left
  • border: 0 and border-collapse: collapse to remove border line
  • table-layout: fixed to contain cells with same width
  • implement filter or pagination with display: none applied to <tr>
th,
+td {
+  padding: 12px 15px;
+  text-align: left;
+  border-bottom: 1px solid #e1e1e1;
+}
+
+th:first-child,
+td:first-child {
+  padding-left: 0;
+}
+
+th:last-child,
+td:last-child {
+  padding-right: 0;
+}

Form

Custom Form

input[type='email'],
+input[type='number'],
+input[type='search'],
+input[type='text'],
+input[type='tel'],
+input[type='url'],
+input[type='password'],
+textarea,
+select {
+  box-sizing: border-box;
+  height: 38px;
+  padding: 6px 10px;
+  background-color: #fff;
+  border: 1px solid #d1d1d1;
+  border-radius: 4px;
+  box-shadow: none;
+}
+
+/* Removes awkward default styles on some inputs for iOS */
+input[type='email'],
+input[type='number'],
+input[type='search'],
+input[type='text'],
+input[type='tel'],
+input[type='url'],
+input[type='password'],
+textarea {
+  appearance: none;
+}
+
+textarea {
+  min-height: 65px;
+  padding-top: 6px;
+  padding-bottom: 6px;
+}
+
+input[type='email']:focus,
+input[type='number']:focus,
+input[type='search']:focus,
+input[type='text']:focus,
+input[type='tel']:focus,
+input[type='url']:focus,
+input[type='password']:focus,
+textarea:focus,
+select:focus {
+  /* Custom border color */
+  border: 1px solid #33c3f0;
+
+  /* Key point: remove default outline */
+  outline: 2px solid transparent;
+  outline-offset: 2px;
+}
+
+label,
+legend {
+  display: block;
+  margin-bottom: 0.5rem;
+  font-weight: 600;
+}
+
+fieldset {
+  padding: 0;
+  border-width: 0;
+}
+
+input[type='checkbox'],
+input[type='radio'] {
+  display: inline;
+}
+
+label > .label-body {
+  display: inline-block;
+  margin-left: 0.5rem;
+  font-weight: normal;
+}

Custom Checkbox Widget

Input itself as border shape, Pseudo elements as center shape (checked transform animation):

input[type='checkbox'] + label::before {
+  position: relative;
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  margin-right: 10px;
+  content: '';
+  background: white;
+}
+
+input[type='checkbox']:checked + label::before {
+  background: #5ac5c9;
+}
+
+input[type='checkbox']:checked + label::after {
+  position: absolute;
+  top: 3px;
+  left: 27px;
+  width: 13px;
+  height: 6px;
+  content: '';
+  border-bottom: 2px solid black;
+  border-left: 2px solid black;
+  transform: rotate(-45deg);
+}
+
+input[type='checkbox']:focus + label::before {
+  outline: #5d9dd5 solid 1px;
+  box-shadow: 0 0 8px #5e9ed6;
+}
+
+input[type='checkbox']:disabled + label {
+  color: #575757;
+}
+
+input[type='checkbox']:disabled + label::before {
+  background: #ddd;
+}

Custom Select Widget

.custom-select {
+  width: 15%;
+  height: 35px;
+  margin-right: 20px;
+
+  /* 文本属性 */
+  text-align: center;
+  text-align-last: center;
+
+  /* 消除默认箭头 */
+  text-indent: 0.01px;
+  text-overflow: '';
+
+  /* 将箭头图片移至右端 */
+  background: url('images/arrow.png') no-repeat;
+  background-color: #fff;
+  background-position: right;
+
+  /* 自定义边框 */
+  border: 0;
+
+  /* 消除默认样式 */
+  appearance: none;
+}
+
+.custom-select:focus {
+  border: 1px solid #e74f4d;
+}
+
+.custom-select option {
+  width: 100%;
+  height: 25px;
+  padding-left: 30px;
+  line-height: 25px;
+  color: #323333;
+  background-color: #fff;
+  direction: rtl;
+}
+
+.custom-select option:hover,
+.custom-select option:focus {
+  color: #fff;
+  background: url('./img/tick.png') no-repeat 8px center;
+  background-color: #e74f4d;
+}

Custom Switch Widget

Pseudo element switch from circle to circle:

  • thumb-size: 2rem.
  • track-width: 2 * thumb-size.
  • track-height: thumb-size.
  • pseudo-element border-radius: 50%.
  • track border-radius: track-size.
  • checked transform: track background-color, pseudo element translateX.
.gui-switch > input {
+  appearance: none;
+  display: grid;
+  flex-shrink: 0;
+  grid: [track] 1fr / [track] 1fr;
+  align-items: center;
+  inline-size: var(--track-size);
+  block-size: var(--thumb-size);
+  padding: var(--track-padding);
+  border-radius: var(--track-size);
+}
+
+.gui-switch > input::before {
+  grid-area: track;
+  content: '';
+  inline-size: var(--thumb-size);
+  block-size: var(--thumb-size);
+}
  • list-style-type: 改变 ul/ol 前标记类型
  • list-style-image: 改变 ul/ol 前标记类型
  • 设置 <a href="#"> 样式
ul {
+  /* 垂直菜单设置宽度, 水平菜单不设置宽度 */
+  list-style: none;
+}
+
+/* 水平菜单 */
+li {
+  float: left;
+}
+
+a {
+  display: inline-block;
+  text-decoration: none;
+  cursor: pointer;
+}
ul {
+  text-align: right;
+}
+
+li {
+  display: inline-block;
+}
a {
+  text-decoration: none;
+  pointer-events: none;
+  cursor: default;
+  opacity: 0;
+}

Awesome Navigation Style

change bottom border

a {
+  position: relative;
+  padding-bottom: 5px;
+  color: #008080;
+  text-decoration: none;
+}
+
+a::after {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 0;
+  height: 3px;
+  content: '';
+  background-color: #22313f;
+  transform-origin: bottom-center;
+}
+
+a:hover,
+a:focus {
+  color: #22313f;
+}
+
+a:hover::after,
+a:focus::after {
+  width: 100%;
+}
<a
+  href="https://github.com/Trevald/WhatTheTag.com"
+  class="github-corner"
+  aria-label="View source on GitHub"
+>
+  <svg
+    width="80"
+    height="80"
+    viewBox="0 0 250 250"
+    style="position: absolute;top: 0;right: 0;color: #2d3748;border: 0;fill: #718096"
+    aria-hidden="true"
+  >
+    <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
+    <path
+      d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
+      fill="currentColor"
+      style="transform-origin: 130px 106px;"
+      class="octo-arm"
+    ></path>
+    <path
+      d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
+      fill="currentColor"
+      class="octo-body"
+    ></path>
+  </svg>
+</a>
+
+<style>
+  .github-corner:focus .octo-arm,
+  .github-corner:hover .octo-arm {
+    animation: none;
+  }
+
+  @media (prefers-reduced-motion: no-preference) {
+    .github-corner:focus .octo-arm,
+    .github-corner:hover .octo-arm {
+      animation: octocat-wave 560ms ease-in-out;
+    }
+  }
+
+  @keyframes octocat-wave {
+    0%,
+    100% {
+      transform: rotate(0);
+    }
+
+    20%,
+    60% {
+      transform: rotate(-25deg);
+    }
+
+    40%,
+    80% {
+      transform: rotate(10deg);
+    }
+  }
+</style>
  • 如果页面内容不足够长时, 页脚固定在浏览器窗口的底部
  • 如果内容足够长时, 页脚固定在页面的最底部

5 种方法:

  • negative bottom margin content-wrapper with fixed height footer.
<body>
+  <main class="wrapper">
+    content
+    <div class="push"></div>
+  </main>
+  <footer class="footer"></footer>
+</body>
+
+<style>
+  html,
+  body {
+    height: 100%;
+    margin: 0;
+  }
+
+  .wrapper {
+    min-height: 100%;
+
+    /* Equal to height of footer */
+
+    /* But also accounting for potential margin-bottom of last child */
+    margin-bottom: -50px;
+  }
+
+  .footer,
+  .push {
+    height: 50px;
+  }
+</style>
  • negative top margin on fixed height footer.
<body>
+  <main class="content">
+    <section class="content-inside">content</section>
+  </main>
+  <footer class="footer"></footer>
+</body>
+
+<style>
+  html,
+  body {
+    height: 100%;
+    margin: 0;
+  }
+
+  .content {
+    min-height: 100%;
+  }
+
+  .content-inside {
+    padding: 20px;
+    padding-bottom: 50px;
+  }
+
+  .footer {
+    height: 50px;
+    margin-top: -50px;
+  }
+</style>
  • calc on fixed height footer.
<body>
+  <main class="content">content</main>
+  <footer class="footer"></footer>
+</body>
+
+<style>
+  .content {
+    min-height: calc(100vh - 70px);
+  }
+
+  .footer {
+    height: 50px;
+  }
+</style>
  • Use flex on body.
<body>
+  <main class="content">content</main>
+  <footer class="footer"></footer>
+</body>
+
+<style>
+  html,
+  body {
+    height: 100%;
+  }
+
+  body {
+    display: flex;
+    flex-direction: column;
+  }
+
+  .content {
+    flex: 1 0 auto;
+  }
+
+  .footer {
+    flex-shrink: 0;
+  }
+</style>
  • Use grid on body.
<body>
+  <main class="content">content</main>
+  <footer class="footer"></footer>
+</body>
+
+<style>
+  html {
+    height: 100%;
+  }
+
+  body {
+    display: grid;
+    grid-template-rows: 1fr auto;
+    min-height: 100%;
+  }
+
+  .footer {
+    grid-row: 2 / 3;
+  }
+</style>
  • Use gird with min-content.
<body>
+  <div class="grid">
+    <header>
+      <!-- ... -->
+    </header>
+    <main>
+      <!-- ... -->
+    </div>
+    <footer>
+      <!-- ... -->
+    </footer>
+  </div>
+</body>
+
+<style>
+  .grid {
+    display: grid;
+    grid-template-rows: min-content auto min-content;
+    height: 100vh;
+  }
+</style>

Button

  • padding
a.btn-custom {
+  padding: 10px 40px;
+  line-height: 100px;
+  text-align: center;
+  background-color: #000;
+  border-radius: 0;
+}

Gradient Button

@media screen and (prefers-reduced-motion: reduce) {
+  a {
+    text-decoration: none;
+    background-image: linear-gradient(currentcolor, currentcolor);
+    background-repeat: no-repeat;
+    background-position: 0% 100%;
+    background-size: 0% 2px;
+    transition: none;
+  }
+}
+
+a {
+  text-decoration: none;
+  background-image: linear-gradient(currentcolor, currentcolor);
+  background-repeat: no-repeat;
+  background-position: 0% 100%;
+  background-size: 0% 2px;
+  transition: background-size 0.3s;
+}
+
+a:hover,
+a:focus {
+  background-size: 100% 2px;
+}
@media screen and (prefers-reduced-motion: reduce) {
+  a {
+    display: inline-block;
+    padding: 5px;
+    color: #333;
+    text-decoration: none;
+    background-image: linear-gradient(to top, #333 50%, #fff 50%);
+    background-size: 100% 200%;
+    transition: none;
+  }
+}
+
+a {
+  display: inline-block;
+  padding: 5px;
+  color: #333;
+  text-decoration: none;
+  background-image: linear-gradient(to top, #333 50%, #fff 50%);
+  background-size: 100% 200%;
+  transition: all 0.3s;
+}
+
+a:hover,
+a:focus {
+  color: #fff;
+  background-position: 0 100%;
+}

Picture

圆形图片

 {
+  overflow: hidden;
+  border-radius: 50%;
+}

Animation Tips

切换动画时, 需要先把之前的动画清除 (防止出现闪烁 Bug )

Animated Dots

.dot {
+  display: inline-block;
+  height: 1em;
+  overflow: hidden;
+  line-height: 1;
+  text-align: left;
+  vertical-align: -0.25ex;
+}
+
+@media screen and (prefers-reduced-motion: no-preference) {
+  .dot::before {
+    animation: dot1 3s infinite step-start both;
+  }
+}
+
+.dot::before {
+  display: block;
+  white-space: pre-wrap;
+  content: '...\A..\A.';
+}
+
+@keyframes dot1 {
+  33% {
+    transform: translateY(-2em);
+  }
+
+  66% {
+    transform: translateY(-1em);
+  }
+}

Fade with Class

@media screen and (prefers-reduced-motion: no-preference) {
+  .enter,
+  .leave {
+    transition: opacity 0.5s;
+  }
+}
+
+.before-enter,
+.leave {
+  opacity: 0;
+}
+
+.enter,
+.before-leave {
+  opacity: 1;
+}
function enter(el, done) {
+  el.classList.add('before-enter');
+
+  setTimeout(() => {
+    el.classList.remove('before-enter');
+    el.classList.add('enter');
+  }, 20);
+
+  setTimeout(() => {
+    el.classList.remove('enter');
+    done();
+  }, 500);
+}
+
+function leave(el, done) {
+  el.classList.add('before-leave');
+
+  setTimeout(() => {
+    el.classList.remove('before-leave');
+    el.classList.add('leave');
+  }, 0);
+
+  setTimeout(() => {
+    el.classList.remove('leave');
+    done();
+  }, 500);
+}

Accordion Menu Animation

@media screen and (prefers-reduced-motion: reduce) {
+  .menu {
+    max-height: 0;
+    overflow: hidden;
+    transition: none;
+  }
+}
+
+.menu {
+  max-height: 0;
+  overflow: hidden;
+  transition: max-height, 0.3s;
+}
+
+.menu:focus,
+.container:hover .menu {
+  max-height: 1em;
+}

Slides Animation

.slide {
+  width: 500%;
+  overflow: hidden;
+}
+
+@keyframes slide {
+  0% {
+    margin-left: 0;
+  }
+
+  10% {
+    margin-left: 0;
+  }
+
+  12% {
+    margin-left: -100%;
+  }
+
+  22% {
+    margin-left: -100%;
+  }
+
+  24% {
+    margin-left: -200%;
+  }
+
+  34% {
+    margin-left: -200%;
+  }
+
+  36% {
+    margin-left: -300%;
+  }
+
+  46% {
+    margin-left: -300%;
+  }
+
+  48% {
+    margin-left: -400%;
+  }
+
+  58% {
+    margin-left: -400%;
+  }
+
+  60% {
+    margin-left: -300%;
+  }
+
+  70% {
+    margin-left: -300%;
+  }
+
+  72% {
+    margin-left: -200%;
+  }
+
+  82% {
+    margin-left: -200%;
+  }
+
+  84% {
+    margin-left: -100%;
+  }
+
+  94% {
+    margin-left: -100%;
+  }
+
+  96% {
+    margin-left: 0;
+  }
+}

Resizable Component

CodePen Demo

// bottom-right:
+new_width = element_original_width + (mouseX - original_mouseX);
+new_height = element_original_height + (mouseY - original_mouseY);
+// bottom-left:
+new_width = element_original_width - (mouseX - original_mouseX);
+new_height = element_original_height + (mouseY - original_mouseY);
+new_x = element_original_x - (mouseX - original_mouseX);
+// top-right:
+new_width = element_original_width + (mouseX - original_mouseX);
+new_height = element_original_height - (mouseY - original_mouseY);
+new_y = element_original_y + (mouseY - original_mouseY);
+// top-left:
+new_width = element_original_width - (mouseX - original_mouseX);
+new_height = element_original_height - (mouseY - original_mouseY);
+new_x = element_original_x + (mouseX - original_mouseX);
+new_y = element_original_y + (mouseY - original_mouseY);

Slides

  • position: absolute to stack slides up
  • id + :target for style current slide (change z-index)
  • add animation to slide change: (prev, current, next) .slide, .slide:target, .slide:target ~ slide
  • add overflow: hidden to body when animation
<main>
+  <section class="slide" id="slide1">
+    <a class="slide-link" href="#slide2">next</a>
+  </section>
+  <section class="slide" id="slide2">
+    <a class="slide-link" href="#slide1">prev</a>
+    <a class="slide-link" href="#slide3">next</a>
+  </section>
+  <section class="slide" id="slide3">
+    <a class="slide-link" href="#slide2">prev</a>
+    <a class="slide-link" href="#slide4">next</a>
+  </section>
+  <section class="slide" id="slide4">
+    <a class="slide-link" href="#slide3">prev</a>
+    <a class="slide-link" href="#slide5">next</a>
+  </section>
+  <section class="slide" id="slide5">
+    <a class="slide-link" href="#slide4">prev</a>
+  </section>
+</main>
body {
+  overflow: hidden; /* key 1 */
+}
+
+.slide {
+  position: absolute; /* key 2 */
+  z-index: 0; /* key 3 */
+  box-sizing: border-box;
+  width: 100%;
+  height: 100vh;
+}
+
+.slide:target {
+  z-index: 1; /* key 4 */
+}
/* Rotate Fade-In Animation */
+@media screen and (prefers-reduced-motion: reduce) {
+  .slide {
+    z-index: 0;
+    transition: none;
+    transform: rotate(90deg);
+    transform-origin: 0 0;
+  }
+}
+
+.slide {
+  z-index: 0;
+  transition: transform 1s, opacity 0.8s;
+  transform: rotate(90deg);
+  transform-origin: 0 0;
+}
+
+.slide:target {
+  z-index: 1;
+  transform: rotate(0deg);
+}
+
+.slide:target ~ section {
+  opacity: 0;
+  transform: rotate(-90deg);
+}

当两个 width: 100% slide 同时处于同一水平位置, 添加左进/右进动画, 当 slide 向右滑动时, 水平的 scrollX 会直接滑到最右边, 导致幻灯片浏览异常. 解决办法 如下:

const resetScrollX = () => {
+  window.scrollTo(0, 0);
+};

Timeline and Steps

Use pseudo elements to construct circle and line:

/* The separator line */
+.c-timeline-item:not(:last-child) .c-timeline-content::before {
+  position: absolute;
+  top: 0;
+  right: 100%;
+  width: 2px;
+  height: 100%;
+  content: '';
+  background-color: #d3d3d3;
+}
+
+/* The circle */
+.c-timeline-content::after {
+  position: absolute;
+  top: 0;
+  left: -12px;
+  z-index: 1;
+  width: 20px;
+  height: 20px;
+  content: '';
+  background-color: #fff;
+  border: 2px solid #d3d3d3;
+  border-radius: 50%;
+}

Layout

相同单元

  • ul + li + float
  • .container{text-align:center;} + .content{width: xx%;}

元素定位

  • align
  • margin + padding
  • position + top/bottom/left/right
  • float
  • flex

Geometry and Shape

CSS Shape on CSS Tricks.

  • Background: color/size/image/gradient/clip-path. In modern browsers background/gradient/clip-path with transition/transform better than pseudo elements.
  • border.
  • box-shadow (inset).
  • clip-path
  • filter.
  • mask
  • aspect-ratio.
  • SVG:
    • SVG icon.
    • SVG filter.
    • SVG clip-path.
    • SVG mask.
  • pseudo elements.

CSSIcon: Pure CSS Icons

Stretch Line

  • background line
  • border line
  • pseudo element with line-through text-decoration
.line {
+  width: 70%;
+  height: 10px;
+  background-color: #000;
+}
+
+.line,
+.line-background {
+  background: linear-gradient(#000, #000) 50% / 70% 10px no-repeat;
+}
+
+.line,
+.line-border {
+  border-top: 10px solid #000;
+}
+
+.line,
+.line::after {
+  /* set thickness */
+  font-size: 5em;
+
+  /* hide content */
+  color: transparent;
+  text-decoration: line-through #000;
+
+  /* control line length */
+  content: '_______';
+}

Dash Line

  • background dash line
  • border dash line
  • pseudo element with dashed text-decoration
.dash-background {
+  background: linear-gradient(to left, #000 70%, transparent 0);
+  background-repeat: repeat-x;
+  background-size: 30px 10px;
+}
+
+.dash-border {
+  border-top: 10px dashed #000;
+}
+
+.dash::after {
+  text-decoration-style: dashed;
+}

Circle

  • background circle
  • clip path circle
  • border circle
  • pseudo element circle
.circle-background {
+  background-image: radial-gradient(#000 72%, transparent 0);
+}
+
+.circle-clip-path {
+  clip-path: circle(50%);
+}
+
+.circle-border {
+  border-radius: 50%;
+}
+
+.circle::after {
+  font-size: 120vw;
+  line-height: 0;
+  content: '·';
+}

Triangle

  • background triangle
  • clip path triangle
  • border triangle
  • pseudo element triangle
.triangle {
+  background: linear-gradient(<deg>, #000 50%, transparent 0);
+}
+
+/* clip path */
+.arrow-right {
+  width: 20px;
+  height: 32px;
+  clip-path: polygon(0 0, 0 100%, 100% 50%);
+  background-color: #e888a3;
+}
+
+/* transparent border */
+.arrow-up {
+  width: 0;
+  height: 0;
+  border-right: 16px solid transparent;
+  border-bottom: 20px solid #8888e8;
+  border-left: 16px solid transparent;
+}
+
+/* pseudo element + hidden overflow */
+.arrow-down {
+  position: relative;
+  width: 40px;
+  height: 40px;
+  overflow: hidden;
+
+  &::before {
+    position: absolute;
+    top: 0;
+    left: 0;
+    display: block;
+    width: calc(40px / 1.41);
+    height: calc(40px / 1.41);
+    content: '';
+    background: #f7df6c;
+    transform: rotate(-45deg);
+    transform-origin: 0 0;
+  }
+}
+
+/* HTML Entities */
+
+/**
+ * ◄ : &#9668;
+ * ► : &#9658;
+ * ▼ : &#9660;
+ * ▲ : &#9650;
+ */
+.arrow::before {
+  content: '&#9660';
+}

Polygon

const polygon = (n = 3) => {
+  const deg = (2 * Math.PI) / n;
+  const points = [];
+
+  for (let i = 0; i < n; ++i) {
+    const theta = deg * i;
+    const x = `${50 * Math.cos(theta) + 50}%`;
+    const y = `${50 * Math.sin(theta) + 50}%`;
+    points.push(`${x} ${y}`);
+  }
+
+  return `polygon(${points.join(',')})`;
+};

CSS Variables

Variables DOM API

.element {
+  height: 100vh; /* Fallback for browsers that do not support Custom Properties */
+  height: calc(var(--vh, 1vh) * 100);
+}
window.addEventListener('resize', () => {
+  const vh = window.innerHeight * 0.01;
+  document.documentElement.style.setProperty('--vh', `${vh}px`);
+});
const root = document.documentElement;
+const bgColor = getComputedStyle(root).getPropertyValue('--body-bg');

Scope Variables

<div class="alert alert-info">
+  <div class="alert-content">
+    <h2 class="alert-title">Info</h2>
+    <div class="alert-body">
+      <p>Info Message.</p>
+    </div>
+  </div>
+</div>
.alert {
+  --primary: #777;
+  --secondary: #ccc;
+
+  background-color: var(--secondary);
+  border: 1px solid var(--primary);
+}
+
+.alert::before {
+  background-color: var(--primary);
+}
+
+.alert-title {
+  color: var(--primary);
+}
+
+.alert-success {
+  --primary: #40c057;
+  --secondary: #d3f9d8;
+}
+
+.alert-info {
+  --primary: #228be6;
+  --secondary: #d0ebff;
+}
+
+.alert-warning {
+  --primary: #fab005;
+  --secondary: #fff3bf;
+}
+
+.alert-error {
+  --primary: #fa5252;
+  --secondary: #ffe3e3;
+}
:root {
+  --primary: hsl(260deg 95% 70%);
+  --secondary: hsl(320deg 95% 60%);
+}
+
+.button {
+  background-color: var(--button-background, transparent);
+}
+
+.button-primary {
+  --button-background: var(--primary);
+}
+
+.button-secondary {
+  --button-background: var(--secondary);
+}

Invalid and Empty Value in CSS Variables

  • --invalid-value: initial; is invalid value leading to var(--invalid-value) called failed, var(--invalid-value, backup-value) get backup-value.
  • --empty-value: ; is valid empty value leading to var(--empty-value) called succeeded, var(--empty-value, backup-value) get parent value.
  • Use Invalid and Empty Value to implement if (true) in CSS.
:root {
+  --on: initial;
+  --off: ;
+}
+
+button {
+  --is-raised: var(--off);
+
+  border: 1px solid var(--is-raised, rgb(0 0 0 / 10%));
+}
+
+button:hover,
+button:focus {
+  --is-raised: var(--on);
+}
/**
+ * css-media-vars
+ * BSD 2-Clause License
+ * Copyright (c) James0x57, PropJockey, 2020
+ */
+
+html {
+  --media-print: initial;
+  --media-screen: initial;
+  --media-speech: initial;
+  --media-xs: initial;
+  --media-sm: initial;
+  --media-md: initial;
+  --media-lg: initial;
+  --media-xl: initial;
+
+  /* ... */
+  --media-pointer-fine: initial;
+  --media-pointer-none: initial;
+}
+
+/* 把当前变量变为空值 */
+@media print {
+  html {
+    --media-print: ;
+  }
+}
+
+@media screen {
+  html {
+    --media-screen: ;
+  }
+}
+
+@media speech {
+  html {
+    --media-speech: ;
+  }
+}
+
+/* 把当前变量变为空值 */
+@media (max-width: 37.499em) {
+  html {
+    --media-xs: ;
+    --media-lte-sm: ;
+    --media-lte-md: ;
+    --media-lte-lg: ;
+  }
+}
+
+/** 移动优先的样式规则 */
+.breakpoints-demo > * {
+  /** 小于 37.5em, 宽度 100%  */
+  --xs-width: var(--media-xs) 100%;
+
+  /** 小于 56.249em, 宽度 49%  */
+  --sm-width: var(--media-sm) 49%;
+  --md-width: var(--media-md) 32%;
+  --lg-width: var(--media-gte-lg) 24%;
+
+  width: var(--xs-width, var(--sm-width, var(--md-width, var(--lg-width))));
+
+  --sm-and-down-bg: var(--media-lte-sm) red;
+  --md-and-up-bg: var(--media-gte-md) green;
+
+  background: var(--sm-and-down-bg, var(--md-and-up-bg));
+}

SVG

Inline SVG

<svg
+  width="100px"
+  height="100px"
+  viewBox="0 0 100 100"
+  version="1.1"
+  xmlns="..."
+>
+  <title>My Awesome SVG</title>
+  <circle class="circle" cx="50" cy="50" r="50" fill="#FFFF00" />
+</svg>
.circle {
+  fill: #ff0;
+}

SVG Basic Shape Tags

  • rectangles and squares: <rect>
  • circles: <circle>
  • ellipse: <ellipse>
  • line: <line>
  • polyline: <polyline>
  • polygon: <polygon>
  • path:<path>

SVG Text Tag

The text tag <text> is used to create selectable and accessible text.

SVG Accessibility Tags

The title <title> and description <desc> tags are specifically for providing accessibility content.

SVG Group Tag

The group tag <g> is used to group elements together to add class names and apply animations, filters, patterns and effects to a group of elements.

SVG Defs Tag

The defs tag <defs> is used to define elements for later reuse. This is where you create patterns, filters and masks to be reused later. This is also used to create icon systems.

<filter id="noise" y="0" x="0">
+  <feTurbulence stitchTiles="stitch" baseFrequency=".75" type="fractalNoise" />
+</filter>
<pattern ...>
+  ...
+  <rect
+    width="100%"
+    height="100%"
+    fill="white"
+    filter="url(#noise)"
+    opacity=".9"
+  />
+</pattern>

SVG Mask

Avatar with circle status indicator:

<svg role="none">
+  <mask id="circle">
+    <circle fill="white" cx="100" cy="100" r="100"></circle>
+    <circle fill="black" cx="86%" cy="86%" r="18"></circle>
+  </mask>
+  <g mask="url(#circle)">
+    <image
+      x="0"
+      y="0"
+      width="100%"
+      height="100%"
+      xlink:href="avatar.jpg"
+    ></image>
+    <circle
+      fill="none"
+      cx="100"
+      cy="100"
+      r="100"
+      stroke="rgb(0 0 0 / 10%)"
+      stroke-width="2"
+    ></circle>
+  </g>
+</svg>

PostCSS Tool

StyleLint Tool

stylelint-config-mass plugin index.js:

module.exports = {
+  extends: ['stylelint-config-sass-guidelines'],
+  rules: {
+    'order/properties-order': [
+      'position',
+      'z-index',
+      'top',
+      'right',
+      'bottom',
+      'left',
+      'box-sizing',
+      'display',
+      'visibility',
+      'opacity',
+      'mix-blend-mode',
+      'isolation',
+      'float',
+      'clear',
+      'flex',
+      'flex-basis',
+      'flex-direction',
+      'flex-flow',
+      'flex-grow',
+      'flex-shrink',
+      'flex-wrap',
+      'grid',
+      'grid-area',
+      'grid-template',
+      'grid-template-areas',
+      'grid-template-rows',
+      'grid-template-columns',
+      'grid-row',
+      'grid-row-start',
+      'grid-row-end',
+      'grid-column',
+      'grid-column-start',
+      'grid-column-end',
+      'grid-auto-rows',
+      'grid-auto-columns',
+      'grid-auto-flow',
+      'grid-gap',
+      'grid-row-gap',
+      'grid-column-gap',
+      'align-content',
+      'align-items',
+      'align-self',
+      'justify-content',
+      'justify-items',
+      'justify-self',
+      'order',
+      'columns',
+      'column-gap',
+      'column-fill',
+      'column-rule',
+      'column-rule-width',
+      'column-rule-style',
+      'column-rule-color',
+      'column-span',
+      'column-count',
+      'column-width',
+      'backface-visibility',
+      'perspective',
+      'perspective-origin',
+      'transform',
+      'transform-origin',
+      'transform-style',
+      'transition',
+      'transition-delay',
+      'transition-duration',
+      'transition-property',
+      'transition-timing-function',
+      'width',
+      'min-width',
+      'max-width',
+      'height',
+      'min-height',
+      'max-height',
+      'overflow',
+      'overflow-x',
+      'overflow-y',
+      'resize',
+      'margin',
+      'margin-top',
+      'margin-right',
+      'margin-bottom',
+      'margin-left',
+      'padding',
+      'padding-top',
+      'padding-right',
+      'padding-bottom',
+      'padding-left',
+      'border',
+      'border-top',
+      'border-right',
+      'border-bottom',
+      'border-left',
+      'border-width',
+      'border-top-width',
+      'border-right-width',
+      'border-bottom-width',
+      'border-left-width',
+      'border-style',
+      'border-top-style',
+      'border-right-style',
+      'border-bottom-style',
+      'border-left-style',
+      'border-radius',
+      'border-top-left-radius',
+      'border-top-right-radius',
+      'border-bottom-left-radius',
+      'border-bottom-right-radius',
+      'border-color',
+      'border-top-color',
+      'border-right-color',
+      'border-bottom-color',
+      'border-left-color',
+      'outline',
+      'outline-offset',
+      'outline-width',
+      'outline-style',
+      'outline-color',
+      'box-shadow',
+      'list-style',
+      'list-style-type',
+      'list-style-position',
+      'list-style-image',
+      'table-layout',
+      'caption-side',
+      'border-collapse',
+      'border-spacing',
+      'empty-cells',
+      'animation',
+      'animation-name',
+      'animation-duration',
+      'animation-timing-function',
+      'animation-delay',
+      'animation-iteration-count',
+      'animation-direction',
+      'animation-fill-mode',
+      'animation-play-state',
+      'background',
+      'background-attachment',
+      'background-clip',
+      'background-color',
+      'background-image',
+      'background-origin',
+      'background-position',
+      'background-repeat',
+      'background-size',
+      'background-blend-mode',
+      'cursor',
+      'color',
+      'font',
+      'font-family',
+      'font-kerning',
+      'font-size',
+      'font-size-adjust',
+      'font-stretch',
+      'font-weight',
+      'font-smoothing',
+      'osx-font-smoothing',
+      'font-variant',
+      'font-style',
+      'tab-size',
+      'text-align',
+      'text-align-last',
+      'text-justify',
+      'text-indent',
+      'text-transform',
+      'text-decoration',
+      'text-decoration-color',
+      'text-decoration-line',
+      'text-decoration-style',
+      'text-rendering',
+      'text-shadow',
+      'text-overflow',
+      'line-height',
+      'word-spacing',
+      'letter-spacing',
+      'white-space',
+      'word-break',
+      'word-wrap',
+      'vertical-align',
+      'content',
+      'quotes',
+      'counter-reset',
+      'counter-increment',
+      'page-break-before',
+      'page-break-after',
+      'page-break-inside',
+      'pointer-events',
+      'will-change',
+    ],
+    'order/properties-alphabetical-order': null,
+    'selector-class-pattern': [
+      '^[a-z0-9\\-\\_]+$',
+      {
+        message:
+          'Selector should be written in lowercase with hyphens (selector-class-pattern)',
+      },
+    ],
+  },
+};

Tailwind

Tailwind Directives

@layer base {
+  h1 {
+    @apply text-3xl;
+  }
+}
+
+@layer components {
+  .primary-btn {
+    @apply bg-yellow-600 hover:bg-yellow-800 text-black font-bold py-4 px-6 shadow-md;
+  }
+}
+
+@layer utilities {
+  @variants hover {
+    .padding-large {
+      padding: 30px;
+    }
+  }
+
+  @variants focus hover {
+    .border-small {
+      border: 1px solid #30485e;
+    }
+
+    .border-medium-dashed {
+      border: 7px dashed #30485e;
+    }
+  }
+
+  @responsive {
+    /* generate for all breakpoints */
+    .border-solid {
+      border: 10px solid #30485e;
+    }
+  }
+
+  @screen sm {
+    /* generate for small screen breakpoint */
+    .border-solid {
+      border: 10px solid #30485e;
+    }
+  }
+}

CSS Performance

Basic Perf Tips

  • use audits panel to diagnose
  • use CSS shorthand and color shortcuts
  • eliminate unneeded zeros and units
  • remove unused CSS by coverage panel of Devtools
  • link is parallel, @import isn’t parallel

CSS Selectors

减少选择器的复杂性,与构造样式本身的其他工作相比, 选择器复杂性可以占用计算元素样式所需时间的 50%以上

CSS Triggers

avoid to frequently change css property or call JS DOM API triggering layout stage (reflow)

will-change

告知浏览器该元素会有哪些变化的方法,这样浏览器可以在元素属性真正发生变化之前提前做好对应的优化准备工作

 {
+  will-change: auto;
+  will-change: scroll-position;
+  will-change: contents;
+  will-change: transform; /* Example of <custom-ident> */
+  will-change: opacity; /* Example of <custom-ident> */
+  will-change: left, top; /* Example of two <animate-feature> */
+  will-change: unset;
+  will-change: initial;
+  will-change: inherit;
+}

contain

CSS Containment

contain 属性允许开发者声明当前元素和它的内容尽可能的独立于 DOM 树的其他部分。 这使得浏览器在重新计算布局、样式、绘图或它们的组合的时候,只会影响到有限的 DOM 区域,而不是整个页面

/* 无布局包含 */
+contain: none;
+
+/* 布局包含 layout、style、paint 和 size */
+contain: strict;
+
+/* 布局包含layout、style 和 paint */
+contain: content;
+
+/* 布局包含 size */
+contain: size;
+
+/* 布局包含 layout */
+contain: layout;
+
+/* 布局包含 style */
+contain: style;
+
+/* 布局包含 paint */
+contain: paint;
  • size: 声明这个元素的尺寸会变化,不需要去检查它依赖关系中的尺寸变化
  • style: 声明那些同时会影响这个元素和其子孙元素的属性,都在这个元素的包含范围内
  • layout: 声明没有外部元素可以影响它内部的布局,反之亦然
  • paint: 声明这个元素的子孙节点不会在它边缘外显示。如果一个元素在视窗外或因其他原因导致不可见,则同样保证它的子孙节点不会被显示

Animation Frame

window.requestAnimationFrame:

  • Reflow: JavaScript -> Style -> Layout -> Paint -> Composite.
  • Repaint: Paint -> Composite.

告诉浏览器希望执行动画并请求浏览器在下一次重绘之前调用指定的函数来更新动画. 该方法使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用.

若想要在下次重绘时产生另一个动画画面,callback 必须调用 requestAnimationFrame.

let start = null;
+const element = document.getElementById('SomeElementYouWantToAnimate');
+element.style.position = 'absolute';
+
+function step(timestamp) {
+  if (!start) {
+    start = timestamp;
+  }
+
+  const progress = timestamp - start;
+  element.style.left = `${Math.min(progress / 10, 200)}px`;
+
+  if (progress < 2000) {
+    window.requestAnimationFrame(step);
+  }
+}
+
+window.requestAnimationFrame(step);

CSS Loading Tips

  • Lazyload any CSS not needed for Start Render:
    • This could be Critical CSS;
    • or splitting your CSS into Media Queries.
  • Avoid @import:
    • In your HTML;
    • but in CSS especially;
    • and beware of oddities with the PreLoad Scanner.
  • Be wary of synchronous CSS and JavaScript order:
    • JavaScript defined after CSS won’t run until CSSOM is completed;
    • so if your JavaScript doesn’t depend on your CSS;
      • load it before your CSS;
    • but if it does depend on your CSS:
      • load it after your CSS.
  • Load CSS as the DOM needs it:
    • This unblocks Start Render and allows progressive rendering.
<link rel="preload" href="/path/to/split.css" as="style" />
+<link
+  rel="stylesheet"
+  href="/path/to/split.css"
+  media="print"
+  onload="this.media='all'"
+/>

Animation Performance

Best Practice

  • High Performance Tips.
  • All animation: keyframe animation or transitions is best.
  • JS-based animation: requestAnimationFrame is better than setTimeout/setInterval.
  • Position animation:transform: translate(npx, npx) is better than top/right/bottom/left.
  • Scale animation: transform: scale(n) better than width/height.
  • Rotation animation: transform: rotate(deg) is better.
  • Opacity/visibility animation: opacity: 0...1 is better.

DevTools for Animation

  • DevTools for Animation Performance.
  • Slower CPU simulation in performance panel.
  • Enable paint instrumentation in performance panel.
  • FPS meter in rendering panel.
  • Paint flashing in rendering panel.
  • layers panel.

Animation Internal

CSS Triggers List:

  • width/height/margin/left/top in Layout stage.
  • box-shadow/border-radius/background/outline/color in Paint stage.
  • cursor/z-index/transform/opacity in Composite Layers stage.
  • top/left has very large time to paint each frame.

CSS Performance Reference

CSS Hacks

Modern CSS

Copyright © SabertazBuilt with React and GatsbyLast Built Time 2022/4/16 10:40:24