git.iko.soy/rowtype-yoga/psfp
on master help sign in
The foundation has been laid
148366aMark Eibes
assets/icons/trianglelogo.svg+1−1
@@ -1 +1 @@
1−<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 39 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><path d="M0,33.021l12.425,-21.521l3.753,6.5l-8.672,15.021l-7.506,0Zm24.85,0l-11.571,0l5.785,-10.021l5.786,10.021Zm13.279,0l-7.506,0l-15.311,-26.521l3.752,-6.5l19.065,33.021Z"/></svg>
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 39 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><path d="M0,33.021l12.425,-21.521l3.753,6.5l-8.672,15.021l-7.506,0Zm24.85,0l-11.571,0l5.785,-10.021l5.786,10.021Zm13.279,0l-7.506,0l-15.311,-26.521l3.752,-6.5l19.065,33.021Z"/></svg>
blog/.psc-ide-port+1−1
@@ -1 +1 @@
1−15549
1+15877
blog/gatsby-config.js−9
@@ -28,15 +28,6 @@ module.exports = {
28 defaultLayouts: { default: path.resolve("./src/components/layout.js") }
28 defaultLayouts: { default: path.resolve("./src/components/layout.js") }
29 }
29 }
30 },
30 },
31− {
32− resolve: "gatsby-plugin-web-font-loader",
33− options: {
34− custom: {
35− families: ["Rubik"],
36− urls: ["/fonts/fonts.css"]
37− }
38− }
39− },
40 {
31 {
41 resolve: `gatsby-plugin-alias-imports`,
32 resolve: `gatsby-plugin-alias-imports`,
42 options: {
33 options: {
blog/package-lock.json+245
@@ -978,6 +978,19 @@
978 "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
978 "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
979 "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
979 "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
980 },
980 },
981+ "@emotion/is-prop-valid": {
982+ "version": "0.7.3",
983+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz",
984+ "integrity": "sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA==",
985+ "requires": {
986+ "@emotion/memoize": "0.7.1"
987+ }
988+ },
989+ "@emotion/memoize": {
990+ "version": "0.7.1",
991+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz",
992+ "integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg=="
993+ },
981 "@hapi/address": {
994 "@hapi/address": {
982 "version": "2.1.4",
995 "version": "2.1.4",
983 "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
996 "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
@@ -2303,6 +2316,14 @@
2303 "@xtuc/long": "4.2.2"
2316 "@xtuc/long": "4.2.2"
2304 }
2317 }
2305 },
2318 },
2319+ "@welldone-software/why-did-you-render": {
2320+ "version": "4.1.3-alpha.0",
2321+ "resolved": "https://registry.npmjs.org/@welldone-software/why-did-you-render/-/why-did-you-render-4.1.3-alpha.0.tgz",
2322+ "integrity": "sha512-YQVue1WNtFonSl/YJeg1Vjnx2+dX6F5r9Nv9QNKRh5Uky3vx4CBEez8EXu26lS2Ah3ZyU1AlpXh4r4i5nQJLUA==",
2323+ "requires": {
2324+ "lodash": "^4"
2325+ }
2326+ },
2306 "@xtuc/ieee754": {
2327 "@xtuc/ieee754": {
2307 "version": "1.2.0",
2328 "version": "1.2.0",
2308 "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
2329 "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@@ -4342,6 +4363,17 @@
4342 "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
4363 "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
4343 "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
4364 "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
4344 },
4365 },
4366+ "clipboard": {
4367+ "version": "2.0.6",
4368+ "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz",
4369+ "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==",
4370+ "optional": true,
4371+ "requires": {
4372+ "good-listener": "^1.2.2",
4373+ "select": "^1.1.2",
4374+ "tiny-emitter": "^2.0.0"
4375+ }
4376+ },
4345 "clipboardy": {
4377 "clipboardy": {
4346 "version": "2.3.0",
4378 "version": "2.3.0",
4347 "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz",
4379 "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz",
@@ -4924,6 +4956,16 @@
4924 "timsort": "^0.3.0"
4956 "timsort": "^0.3.0"
4925 }
4957 }
4926 },
4958 },
4959+ "css-jss": {
4960+ "version": "10.1.1",
4961+ "resolved": "https://registry.npmjs.org/css-jss/-/css-jss-10.1.1.tgz",
4962+ "integrity": "sha512-HrSD06y4dCfZ6nHtG/SucJBG8tbt+lbyBsUbxfqujyycxPLLd/B9mRKW97B8Ua8VWK8LR4i9ur0P8szZEjoqzQ==",
4963+ "requires": {
4964+ "@babel/runtime": "^7.3.1",
4965+ "jss": "10.1.1",
4966+ "jss-preset-default": "10.1.1"
4967+ }
4968+ },
4927 "css-loader": {
4969 "css-loader": {
4928 "version": "3.5.1",
4970 "version": "3.5.1",
4929 "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.1.tgz",
4971 "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.1.tgz",
@@ -5665,6 +5707,12 @@
5665 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
5707 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
5666 "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
5708 "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
5667 },
5709 },
5710+ "delegate": {
5711+ "version": "3.2.0",
5712+ "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
5713+ "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
5714+ "optional": true
5715+ },
5668 "delegates": {
5716 "delegates": {
5669 "version": "1.0.0",
5717 "version": "1.0.0",
5670 "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
5718 "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -7448,6 +7496,14 @@
7448 "reusify": "^1.0.4"
7496 "reusify": "^1.0.4"
7449 }
7497 }
7450 },
7498 },
7499+ "fault": {
7500+ "version": "1.0.4",
7501+ "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
7502+ "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
7503+ "requires": {
7504+ "format": "^0.2.0"
7505+ }
7506+ },
7451 "faye-websocket": {
7507 "faye-websocket": {
7452 "version": "0.11.3",
7508 "version": "0.11.3",
7453 "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
7509 "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
@@ -7738,6 +7794,11 @@
7738 "mime-types": "^2.1.12"
7794 "mime-types": "^2.1.12"
7739 }
7795 }
7740 },
7796 },
7797+ "format": {
7798+ "version": "0.2.2",
7799+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
7800+ "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs="
7801+ },
7741 "forwarded": {
7802 "forwarded": {
7742 "version": "0.1.2",
7803 "version": "0.1.2",
7743 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
7804 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@@ -9389,6 +9450,15 @@
9389 "slash": "^1.0.0"
9450 "slash": "^1.0.0"
9390 }
9451 }
9391 },
9452 },
9453+ "good-listener": {
9454+ "version": "1.2.2",
9455+ "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
9456+ "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
9457+ "optional": true,
9458+ "requires": {
9459+ "delegate": "^3.1.2"
9460+ }
9461+ },
9392 "got": {
9462 "got": {
9393 "version": "8.3.2",
9463 "version": "8.3.2",
9394 "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
9464 "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
@@ -9835,6 +9905,11 @@
9835 "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
9905 "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
9836 "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
9906 "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
9837 },
9907 },
9908+ "highlight.js": {
9909+ "version": "9.15.10",
9910+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.10.tgz",
9911+ "integrity": "sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw=="
9912+ },
9838 "hmac-drbg": {
9913 "hmac-drbg": {
9839 "version": "1.0.1",
9914 "version": "1.0.1",
9840 "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
9915 "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@@ -11311,6 +11386,16 @@
11311 "jss": "10.1.1"
11386 "jss": "10.1.1"
11312 }
11387 }
11313 },
11388 },
11389+ "jss-plugin-compose": {
11390+ "version": "10.1.1",
11391+ "resolved": "https://registry.npmjs.org/jss-plugin-compose/-/jss-plugin-compose-10.1.1.tgz",
11392+ "integrity": "sha512-0fD+YVGk0fVnsLiNf7CG4Lv7lYwmNyeE62Fbccx8k1mMdFoE7he0hpx37tudsfKW2ArCE+hf4fmJDXPW8l6LBw==",
11393+ "requires": {
11394+ "@babel/runtime": "^7.3.1",
11395+ "jss": "10.1.1",
11396+ "tiny-warning": "^1.0.2"
11397+ }
11398+ },
11314 "jss-plugin-default-unit": {
11399 "jss-plugin-default-unit": {
11315 "version": "10.1.1",
11400 "version": "10.1.1",
11316 "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.1.1.tgz",
11401 "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.1.1.tgz",
@@ -11320,6 +11405,25 @@
11320 "jss": "10.1.1"
11405 "jss": "10.1.1"
11321 }
11406 }
11322 },
11407 },
11408+ "jss-plugin-expand": {
11409+ "version": "10.1.1",
11410+ "resolved": "https://registry.npmjs.org/jss-plugin-expand/-/jss-plugin-expand-10.1.1.tgz",
11411+ "integrity": "sha512-ITO3RR4eTB3628B+gx8gLI7TKKE0TsFDBJ7BA648ZhXjHWQ5uxdC1bZld+++xnFL1l4kerj5tuWmZxS64C1Kcg==",
11412+ "requires": {
11413+ "@babel/runtime": "^7.3.1",
11414+ "jss": "10.1.1"
11415+ }
11416+ },
11417+ "jss-plugin-extend": {
11418+ "version": "10.1.1",
11419+ "resolved": "https://registry.npmjs.org/jss-plugin-extend/-/jss-plugin-extend-10.1.1.tgz",
11420+ "integrity": "sha512-dZl0hNsndP9GJM6yqA7lZmnx6KJHo/13Zeo5B3i2uaDNO9jd5Y3pp1XHURGfbFG3K29XsYBQPTgfBwQ7e7+nyA==",
11421+ "requires": {
11422+ "@babel/runtime": "^7.3.1",
11423+ "jss": "10.1.1",
11424+ "tiny-warning": "^1.0.2"
11425+ }
11426+ },
11323 "jss-plugin-global": {
11427 "jss-plugin-global": {
11324 "version": "10.1.1",
11428 "version": "10.1.1",
11325 "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.1.1.tgz",
11429 "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.1.1.tgz",
@@ -11357,6 +11461,26 @@
11357 "jss": "10.1.1"
11461 "jss": "10.1.1"
11358 }
11462 }
11359 },
11463 },
11464+ "jss-plugin-rule-value-observable": {
11465+ "version": "10.1.1",
11466+ "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.1.1.tgz",
11467+ "integrity": "sha512-l1zmLfS5Ks6CrthOIVTokHkDoI01ymnwNBlciN+IlaR4UsLEQBBL0+3BfQjOPvIYRAYXxYx3G7ebUHebr8mWyA==",
11468+ "requires": {
11469+ "@babel/runtime": "^7.3.1",
11470+ "jss": "10.1.1",
11471+ "symbol-observable": "^1.2.0"
11472+ }
11473+ },
11474+ "jss-plugin-template": {
11475+ "version": "10.1.1",
11476+ "resolved": "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.1.1.tgz",
11477+ "integrity": "sha512-CPhNapLDgj6gIJOi3vj/QPohF/1OHuLQj8ZjBYqrnzCDSfYV5s2Rzp1TicFGxUb07BRLh62ymU+MgH1hbKGSTQ==",
11478+ "requires": {
11479+ "@babel/runtime": "^7.3.1",
11480+ "jss": "10.1.1",
11481+ "tiny-warning": "^1.0.2"
11482+ }
11483+ },
11360 "jss-plugin-vendor-prefixer": {
11484 "jss-plugin-vendor-prefixer": {
11361 "version": "10.1.1",
11485 "version": "10.1.1",
11362 "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.1.1.tgz",
11486 "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.1.1.tgz",
@@ -11367,6 +11491,27 @@
11367 "jss": "10.1.1"
11491 "jss": "10.1.1"
11368 }
11492 }
11369 },
11493 },
11494+ "jss-preset-default": {
11495+ "version": "10.1.1",
11496+ "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-10.1.1.tgz",
11497+ "integrity": "sha512-YwQp/BZ8IiBwxDTQ4uPAjzI2k2njrw6RJegAPvhCB1MTmWN2oR9Dhb5aN3RtepUf/agUkewTMwQqoS6PijgVMg==",
11498+ "requires": {
11499+ "@babel/runtime": "^7.3.1",
11500+ "jss": "10.1.1",
11501+ "jss-plugin-camel-case": "10.1.1",
11502+ "jss-plugin-compose": "10.1.1",
11503+ "jss-plugin-default-unit": "10.1.1",
11504+ "jss-plugin-expand": "10.1.1",
11505+ "jss-plugin-extend": "10.1.1",
11506+ "jss-plugin-global": "10.1.1",
11507+ "jss-plugin-nested": "10.1.1",
11508+ "jss-plugin-props-sort": "10.1.1",
11509+ "jss-plugin-rule-value-function": "10.1.1",
11510+ "jss-plugin-rule-value-observable": "10.1.1",
11511+ "jss-plugin-template": "10.1.1",
11512+ "jss-plugin-vendor-prefixer": "10.1.1"
11513+ }
11514+ },
11370 "jsx-ast-utils": {
11515 "jsx-ast-utils": {
11371 "version": "2.2.3",
11516 "version": "2.2.3",
11372 "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz",
11517 "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz",
@@ -11819,6 +11964,15 @@
11819 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
11964 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
11820 "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
11965 "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
11821 },
11966 },
11967+ "lowlight": {
11968+ "version": "1.12.1",
11969+ "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.12.1.tgz",
11970+ "integrity": "sha512-OqaVxMGIESnawn+TU/QMV5BJLbUghUfjDWPAtFqDYDmDtr4FnB+op8xM+pR7nKlauHNUHXGt0VgWatFB8voS5w==",
11971+ "requires": {
11972+ "fault": "^1.0.2",
11973+ "highlight.js": "~9.15.0"
11974+ }
11975+ },
11822 "lpad-align": {
11976 "lpad-align": {
11823 "version": "1.1.2",
11977 "version": "1.1.2",
11824 "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz",
11978 "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz",
@@ -14418,6 +14572,14 @@
14418 "utila": "~0.4"
14572 "utila": "~0.4"
14419 }
14573 }
14420 },
14574 },
14575+ "prismjs": {
14576+ "version": "1.20.0",
14577+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.20.0.tgz",
14578+ "integrity": "sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ==",
14579+ "requires": {
14580+ "clipboard": "^2.0.0"
14581+ }
14582+ },
14421 "private": {
14583 "private": {
14422 "version": "0.1.8",
14584 "version": "0.1.8",
14423 "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
14585 "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@@ -15290,6 +15452,11 @@
15290 }
15452 }
15291 }
15453 }
15292 },
15454 },
15455+ "react-display-name": {
15456+ "version": "0.2.5",
15457+ "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.5.tgz",
15458+ "integrity": "sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg=="
15459+ },
15293 "react-dom": {
15460 "react-dom": {
15294 "version": "16.13.1",
15461 "version": "16.13.1",
15295 "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
15462 "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
@@ -15360,6 +15527,24 @@
15360 "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
15527 "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
15361 "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
15528 "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
15362 },
15529 },
15530+ "react-jss": {
15531+ "version": "10.1.1",
15532+ "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-10.1.1.tgz",
15533+ "integrity": "sha512-GCSKkyj6/bDNNgK1KtaU1FbTAKJ7CQE83p34qKpCc4tVPRi1wCfopyKot1cW/YYJizqltc2MaKzGqFK5eZhBSQ==",
15534+ "requires": {
15535+ "@babel/runtime": "^7.3.1",
15536+ "@emotion/is-prop-valid": "^0.7.3",
15537+ "css-jss": "10.1.1",
15538+ "hoist-non-react-statics": "^3.2.0",
15539+ "is-in-browser": "^1.1.3",
15540+ "jss": "10.1.1",
15541+ "jss-preset-default": "10.1.1",
15542+ "prop-types": "^15.6.0",
15543+ "shallow-equal": "^1.2.0",
15544+ "theming": "3.2.0",
15545+ "tiny-warning": "^1.0.2"
15546+ }
15547+ },
15363 "react-lifecycles-compat": {
15548 "react-lifecycles-compat": {
15364 "version": "3.0.4",
15549 "version": "3.0.4",
15365 "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
15550 "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
@@ -15414,6 +15599,18 @@
15414 "@react-spring/zdog": "9.0.0-canary.809.5.f01ecc2"
15599 "@react-spring/zdog": "9.0.0-canary.809.5.f01ecc2"
15415 }
15600 }
15416 },
15601 },
15602+ "react-syntax-highlighter": {
15603+ "version": "12.2.1",
15604+ "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-12.2.1.tgz",
15605+ "integrity": "sha512-CTsp0ZWijwKRYFg9xhkWD4DSpQqE4vb2NKVMdPAkomnILSmsNBHE0n5GuI5zB+PU3ySVvXvdt9jo+ViD9XibCA==",
15606+ "requires": {
15607+ "@babel/runtime": "^7.3.1",
15608+ "highlight.js": "~9.15.1",
15609+ "lowlight": "1.12.1",
15610+ "prismjs": "^1.8.4",
15611+ "refractor": "^2.4.1"
15612+ }
15613+ },
15417 "read": {
15614 "read": {
15418 "version": "1.0.7",
15615 "version": "1.0.7",
15419 "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
15616 "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
@@ -15577,6 +15774,26 @@
15577 "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz",
15774 "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz",
15578 "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw=="
15775 "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw=="
15579 },
15776 },
15777+ "refractor": {
15778+ "version": "2.10.1",
15779+ "resolved": "https://registry.npmjs.org/refractor/-/refractor-2.10.1.tgz",
15780+ "integrity": "sha512-Xh9o7hQiQlDbxo5/XkOX6H+x/q8rmlmZKr97Ie1Q8ZM32IRRd3B/UxuA/yXDW79DBSXGWxm2yRTbcTVmAciJRw==",
15781+ "requires": {
15782+ "hastscript": "^5.0.0",
15783+ "parse-entities": "^1.1.2",
15784+ "prismjs": "~1.17.0"
15785+ },
15786+ "dependencies": {
15787+ "prismjs": {
15788+ "version": "1.17.1",
15789+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.17.1.tgz",
15790+ "integrity": "sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==",
15791+ "requires": {
15792+ "clipboard": "^2.0.0"
15793+ }
15794+ }
15795+ }
15796+ },
15580 "regenerate": {
15797 "regenerate": {
15581 "version": "1.4.0",
15798 "version": "1.4.0",
15582 "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
15799 "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
@@ -16191,6 +16408,12 @@
16191 }
16408 }
16192 }
16409 }
16193 },
16410 },
16411+ "select": {
16412+ "version": "1.1.2",
16413+ "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
16414+ "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=",
16415+ "optional": true
16416+ },
16194 "select-hose": {
16417 "select-hose": {
16195 "version": "2.0.0",
16418 "version": "2.0.0",
16196 "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
16419 "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
@@ -16402,6 +16625,11 @@
16402 "resolved": "https://registry.npmjs.org/shallow-compare/-/shallow-compare-1.2.2.tgz",
16625 "resolved": "https://registry.npmjs.org/shallow-compare/-/shallow-compare-1.2.2.tgz",
16403 "integrity": "sha512-LUMFi+RppPlrHzbqmFnINTrazo0lPNwhcgzuAXVVcfy/mqPDrQmHAyz5bvV0gDAuRFrk804V0HpQ6u9sZ0tBeg=="
16626 "integrity": "sha512-LUMFi+RppPlrHzbqmFnINTrazo0lPNwhcgzuAXVVcfy/mqPDrQmHAyz5bvV0gDAuRFrk804V0HpQ6u9sZ0tBeg=="
16404 },
16627 },
16628+ "shallow-equal": {
16629+ "version": "1.2.1",
16630+ "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz",
16631+ "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA=="
16632+ },
16405 "shallowequal": {
16633 "shallowequal": {
16406 "version": "1.1.0",
16634 "version": "1.1.0",
16407 "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
16635 "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
@@ -17709,6 +17937,17 @@
17709 "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
17937 "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
17710 "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
17938 "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
17711 },
17939 },
17940+ "theming": {
17941+ "version": "3.2.0",
17942+ "resolved": "https://registry.npmjs.org/theming/-/theming-3.2.0.tgz",
17943+ "integrity": "sha512-n0fSNYXkX63rcFBBeAthy14IcgPZLHp0OGkGZheaj64j7cBoP7INLd6+7HIXqWVjFn1M5cYSiZ1nszi+jo/Szg==",
17944+ "requires": {
17945+ "hoist-non-react-statics": "^3.3.0",
17946+ "prop-types": "^15.5.8",
17947+ "react-display-name": "^0.2.4",
17948+ "tiny-warning": "^1.0.2"
17949+ }
17950+ },
17712 "through": {
17951 "through": {
17713 "version": "2.3.8",
17952 "version": "2.3.8",
17714 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
17953 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -17751,6 +17990,12 @@
17751 "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
17990 "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
17752 "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
17991 "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
17753 },
17992 },
17993+ "tiny-emitter": {
17994+ "version": "2.1.0",
17995+ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
17996+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
17997+ "optional": true
17998+ },
17754 "tiny-warning": {
17999 "tiny-warning": {
17755 "version": "1.0.3",
18000 "version": "1.0.3",
17756 "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
18001 "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
blog/package.json+4−1
@@ -7,6 +7,7 @@
7 "@material-ui/styles": "^4.9.0",
7 "@material-ui/styles": "^4.9.0",
8 "@mdx-js/mdx": "^1.1.5",
8 "@mdx-js/mdx": "^1.1.5",
9 "@mdx-js/react": "^1.1.5",
9 "@mdx-js/react": "^1.1.5",
10+ "@welldone-software/why-did-you-render": "^4.1.3-alpha.0",
10 "gatsby": "^2.19.45",
11 "gatsby": "^2.19.45",
11 "gatsby-image": "^2.2.8",
12 "gatsby-image": "^2.2.8",
12 "gatsby-plugin-alias-imports": "^1.0.5",
13 "gatsby-plugin-alias-imports": "^1.0.5",
@@ -27,8 +28,10 @@
27 "react": "^16.8.6",
28 "react": "^16.8.6",
28 "react-dom": "^16.8.6",
29 "react-dom": "^16.8.6",
29 "react-helmet": "^5.2.1",
30 "react-helmet": "^5.2.1",
31+ "react-jss": "^10.1.1",
30 "react-monaco-editor": "^0.33.0",
32 "react-monaco-editor": "^0.33.0",
31− "react-spring": "^9.0.0-beta.34"
33+ "react-spring": "^9.0.0-beta.34",
34+ "react-syntax-highlighter": "^12.2.1"
32 },
35 },
33 "keywords": [
36 "keywords": [
34 "gatsby"
37 "gatsby"
blog/src/components/PSLayout.purs+104−92
@@ -2,19 +2,30 @@ module PSLayout where
2
2
3import Prelude
3import Prelude
4
4
5+import Control.Monad.State (evalStateT, get, put, runStateT)
6+import Control.Monad.State as State
7+import Control.Monad.Trans.Class (lift)
5import Data.Array (foldMap)
8import Data.Array (foldMap)
6−import Data.Array as A
7import Data.Array as Array
9import Data.Array as Array
8import Data.Array.NonEmpty as NEA
10import Data.Array.NonEmpty as NEA
9import Data.Either (Either(..))
11import Data.Either (Either(..))
12+import Data.Foldable (fold)
13+import Data.Function.Uncurried (mkFn2)
10import Data.Maybe (Maybe(..), fromMaybe, isJust)
14import Data.Maybe (Maybe(..), fromMaybe, isJust)
15+import Data.Monoid (guard)
16+import Data.Monoid.Additive (Additive(..))
17+import Data.Newtype (ala)
18+import Data.Newtype as NT
11import Data.Nullable (Nullable)
19import Data.Nullable (Nullable)
12import Data.Nullable as Nullable
20import Data.Nullable as Nullable
13import Data.String as String
21import Data.String as String
22+import Data.Traversable (Accum, mapAccumL)
14import Data.Tuple.Nested ((/\))
23import Data.Tuple.Nested ((/\))
24+import Debug.Trace (spy)
15import Effect (Effect)
25import Effect (Effect)
16import Effect.Aff (launchAff_)
26import Effect.Aff (launchAff_)
17import Effect.Class (liftEffect)
27import Effect.Class (liftEffect)
28+import Effect.Class.Console (log)
18import JSS (jss, jssClasses)
29import JSS (jss, jssClasses)
19import Justifill (justifill)
30import Justifill (justifill)
20import Milkis.Impl (FetchImpl)
31import Milkis.Impl (FetchImpl)
@@ -22,7 +33,7 @@ import React.Basic (JSX, ReactComponent, fragment)
22import React.Basic.DOM (unsafeCreateDOMComponent)
33import React.Basic.DOM (unsafeCreateDOMComponent)
23import React.Basic.DOM as R
34import React.Basic.DOM as R
24import React.Basic.Helpers (jsx)
35import React.Basic.Helpers (jsx)
25−import React.Basic.Hooks (ReactChildren, component, componentWithChildren, element, reactChildrenToArray, useEffect, useState)
36+import React.Basic.Hooks (ReactChildren, component, componentWithChildren, element, memo, reactChildrenToArray, readRef, useEffect, useReducer, useRef, useState, writeRef)
26import React.Basic.Hooks as React
37import React.Basic.Hooks as React
27import Unsafe.Coerce (unsafeCoerce)
38import Unsafe.Coerce (unsafeCoerce)
28import Yoga.Box.Component as Box
39import Yoga.Box.Component as Box
@@ -67,7 +78,12 @@ type PreProps
67 }
78 }
68 }
79 }
69
80
81+data ShowModal
82+ = ShowModal Modal.Props
83+ | HideModal
84+
70mkLayout ∷
85mkLayout ∷
86+ ∀ r.
71 FetchImpl ->
87 FetchImpl ->
72 Effect
88 Effect
73 ( ReactComponent
89 ( ReactComponent
@@ -77,31 +93,34 @@ mkLayout ∷
77 )
93 )
78mkLayout fetchImpl = do
94mkLayout fetchImpl = do
79 themeProvider <- mkThemeProvider
95 themeProvider <- mkThemeProvider
96+ modal <- memo Modal.makeComponent
97+ clickAway <- memo ClickAway.makeComponent
80− mdxProviderComponent <- mkMdxProviderComponent (apiCompiler fetchImpl)
98+ mdxProviderComponent <- memo $ mkMdxProviderComponent (apiCompiler fetchImpl)
81 componentWithChildren "MDXLayout" \{ children, siteInfo } -> React.do
99 componentWithChildren "MDXLayout" \{ children, siteInfo } -> React.do
100+ maybeModalProps /\ dispatch <-
101+ useReducer Nothing case _, _ of
102+ _, ShowModal props -> Just props
103+ _, HideModal -> Nothing
82 pure
104 pure
83 $ element themeProvider
105 $ element themeProvider
84 { theme: fromTheme darkTheme
106 { theme: fromTheme darkTheme
85 , children:
107 , children:
108+ [ R.div_
109+ [ maybeModalProps
110+ # foldMap \modalProps ->
111+ fragment
112+ [ element clickAway { allowEscape: Just true, onClick: dispatch HideModal, style: Nothing }
113+ , element modal (justifill modalProps)
114+ ]
86− [ element mdxProviderComponent
115+ , element mdxProviderComponent
87− { children
116+ { children: spy "children" children
88− , siteInfo
117+ , siteInfo
118+ , showModal: dispatch <<< ShowModal
89− }
119+ }
120+ ]
90 ]
121 ]
91 }
122 }
92
123
93−mkSecret ∷ Effect (ReactComponent { kids ∷ Array JSX, visible ∷ Boolean, register ∷ Effect Unit })
94−mkSecret = do
95− component "Secret" \{ kids, visible, register } -> React.do
96− useEffect visible do
97− unless visible register
98− pure mempty
99− pure
100− $ R.div
101− { style: R.css { visibility: if visible then "visible" else "hidden" }
102− , children: kids
103− }
104−
105isQuiz ∷ JSX -> Boolean
124isQuiz ∷ JSX -> Boolean
106isQuiz a =
125isQuiz a =
107 (unsafeCoerce a).props.mdxType == "pre"
126 (unsafeCoerce a).props.mdxType == "pre"
@@ -116,21 +135,19 @@ mkMdxProviderComponent ∷
116 ( ReactComponent
135 ( ReactComponent
117 { children ∷ ReactChildren JSX
136 { children ∷ ReactChildren JSX
118 , siteInfo ∷ SiteQueryResult
137 , siteInfo ∷ SiteQueryResult
138+ , showModal ∷ Modal.Props -> Effect Unit
119 }
139 }
120 )
140 )
121mkMdxProviderComponent compiler = do
141mkMdxProviderComponent compiler = do
122− cssBaseline <- mkCssBaseline
142+ cssBaseline <- memo mkCssBaseline
123− editor <- mkCompileEditor compiler
143+ editor <- memo $ mkCompileEditor compiler
124− fillInTheGaps <- FillInTheGaps.makeComponent
125− box <- Box.makeComponent
144+ box <- memo $ Box.makeComponent
126− sidebar <- mkSidebar
145+ sidebar <- memo mkSidebar
127− header <- mkHeader
146+ header <- memo mkHeader
128 yogaInlineCode <- InlineCode.makeComponent
147 yogaInlineCode <- InlineCode.makeComponent
129− modal <- Modal.makeComponent
148+ quiz <- memo $ mkQuiz compiler
130− clickAway <- ClickAway.makeComponent
131− h <- mkH
149+ h <- memo mkH
132− p <- mkP
150+ p <- memo mkP
133− secret <- mkSecret
134 useStyles <-
151 useStyles <-
135 makeStylesJSS
152 makeStylesJSS
136 $ jssClasses \(theme ∷ CSSTheme) ->
153 $ jssClasses \(theme ∷ CSSTheme) ->
@@ -142,32 +159,23 @@ mkMdxProviderComponent compiler = do
142 , padding: "3px"
159 , padding: "3px"
143 , borderRadius: "3px"
160 , borderRadius: "3px"
144 }
161 }
145− , flexer:
146− { display: "flex"
147− , flexDirection: "row"
148− }
149 }
162 }
150− componentWithChildren "MDXProviderComponent" \{ children, siteInfo } -> React.do
163+ componentWithChildren "MDXProviderComponent" \{ children, siteInfo, showModal } -> React.do
151 classes <- useStyles {}
164 classes <- useStyles {}
152− visibleThrough /\ updateVisible <- useState 1
165+ visibleUntil /\ updateVisible <- useState 1
153− questions /\ updateQuestions <- useState []
154− maybeModal /\ updateModal <- useState Nothing
155 let
166 let
156− baseline child = element cssBaseline { kids: child }
167+ onFailure = showModal (justifill { title: "Failed", kids: [ R.text "Try again" ] } ∷ Modal.Props)
157−
168+ onSuccess = updateVisible (_ + one)
158− kids = reactChildrenToArray children
159−
160− foldVisible ∷ { i ∷ Int, acc ∷ Array JSX } -> JSX -> { i ∷ Int, acc ∷ Array JSX }
161− foldVisible { i, acc } a =
162− if i >= visibleThrough then
163− { i, acc }
164− else
165− if isQuiz a then
166− { i: i + 1, acc: A.snoc acc a }
167− else
168− { i, acc: A.snoc acc a }
169
169
170− visibleKids = kids # A.foldl foldVisible { i: 0, acc: [] ∷ Array JSX } # _.acc
170+ mapVisible i kid =
171+ { accum: i + if isQuiz kid then one else zero
172+ , value: guard (i < visibleUntil) (pure kid)
173+ }
174+ visibleKids :: Array JSX
175+ visibleKids = reactChildrenToArray children
176+ # mapAccumL mapVisible zero
177+ # _.value
178+ # Array.catMaybes
171
179
172 siteInfoJSX =
180 siteInfoJSX =
173 R.div
181 R.div
@@ -177,8 +185,8 @@ mkMdxProviderComponent compiler = do
177 , jsx box {} visibleKids
185 , jsx box {} visibleKids
178 ]
186 ]
179 }
187 }
180−
188+ mdxComponents /\ _ <-
181− mdxComponents =
189+ useState
182 { h1:
190 { h1:
183 \props ->
191 \props ->
184 element h ({ level: H2, text: props.children, className: Nothing })
192 element h ({ level: H2, text: props.children, className: Nothing })
@@ -197,9 +205,10 @@ mkMdxProviderComponent compiler = do
197 , inlineCode:
205 , inlineCode:
198 \props -> do
206 \props -> do
199 R.span { className: classes.code, children: props.children }
207 R.span { className: classes.code, children: props.children }
200− , pre:
208+ , pre: mkFn2
201− \(props ∷ PreProps) -> do
209+ \(props ∷ PreProps) other -> do
202 let
210 let
211+ _ = spy "other" other
203 childrenQ = Nullable.toMaybe props.children
212 childrenQ = Nullable.toMaybe props.children
204
213
205 propsQ = (_.props >>> Nullable.toMaybe) =<< childrenQ
214 propsQ = (_.props >>> Nullable.toMaybe) =<< childrenQ
@@ -227,20 +236,7 @@ mkMdxProviderComponent compiler = do
227
236
228 segmentsQ = parseSegments (codeQ ?|| "")
237 segmentsQ = parseSegments (codeQ ?|| "")
229 case isCode, language, segmentsQ of
238 case isCode, language, segmentsQ of
230− true, "purescript", Just initialSegments ->
239+ true, "purescript", Just initialSegments -> element quiz { initialSegments, onFailure, onSuccess }
231− jsx box {}
232− [ element fillInTheGaps
233− { initialSegments
234− , incantate: \segments -> launchAff_ do
235− let code = toCode segments
236− result <- compiler.compileAndRun { code }
237− liftEffect case result of
238− Right r | String.stripSuffix (String.Pattern "\n") r.stdout == (findResult $ join segments) ->
239− updateVisible (_ + 1)
240− _ ->
241− updateModal (const $ Just { title: "Failed", kids: [R.text "Try again"] })
242− }
243− ]
244 true, _, _ ->
240 true, _, _ ->
245 element editor
241 element editor
246 { initialCode: fromMaybe "" codeQ
242 { initialCode: fromMaybe "" codeQ
@@ -250,20 +246,43 @@ mkMdxProviderComponent compiler = do
250 false, _, _ -> element (unsafeCreateDOMComponent "pre") props
246 false, _, _ -> element (unsafeCreateDOMComponent "pre") props
251 }
247 }
252 pure
248 pure
253− $ baseline
254− [ element mdxProvider
249+ $ element mdxProvider
255− { children:
256− [ siteInfoJSX
250+ { children: pure $ jsx cssBaseline {} [ siteInfoJSX ]
257− ]
258− , components: mdxComponents
251+ , components: mdxComponents
252+ }
253+
254+mkQuiz ∷ _ -> Effect (ReactComponent _)
255+mkQuiz compiler = do
256+ fillInTheGaps <- FillInTheGaps.makeComponent
257+ box <- Box.makeComponent
258+ component "Quiz" \({ initialSegments, onFailure, onSuccess } ∷ { initialSegments ∷ _, onFailure ∷ _, onSuccess :: _}) -> React.do
259+ segments /\ updateSegments <- useState initialSegments
260+ solved /\ updateSolved <- useState false
261+ pure
262+ $ jsx box {}
263+ [ element fillInTheGaps
264+ { segments
265+ , incantate:
266+ launchAff_ do
267+ let
268+ code = toCode segments
269+ result <- compiler.compileAndRun { code }
270+ liftEffect case result of
271+ Right r
272+ | String.stripSuffix (String.Pattern "\n") r.stdout == (findResult $ join segments) -> do
273+ updateSolved (const true)
274+ onSuccess
275+ _ -> onFailure
276+ , updateSegments:
277+ \update -> do
278+ let
279+ updated = update segments
280+ case segments, updated of
281+ old, new
282+ | new == old -> mempty
283+ _, _ -> updateSegments (const updated)
284+ , readOnly: Just solved
259 }
285 }
260− , maybeModal # foldMap
261− (\modalProps ->
262− fragment [
263− element clickAway { allowEscape: Just true, onClick: updateModal (const Nothing), style: Nothing },
264− element modal (justifill modalProps)
265− ]
266− )
267 ]
286 ]
268
287
269mkSidebar = do
288mkSidebar = do
@@ -271,20 +290,13 @@ mkSidebar = do
271 useStyles <-
290 useStyles <-
272 makeStylesJSS
291 makeStylesJSS
273 $ jssClasses \(theme ∷ CSSTheme) ->
292 $ jssClasses \(theme ∷ CSSTheme) ->
274− { flexer:
275− jss
276− { display: "flex"
277− , flexDirection: "row"
278− , width: "300px"
279− , height: "300px"
280− }
281− }
293+ {}
282 component "Sidebar" \{ links } -> React.do
294 component "Sidebar" \{ links } -> React.do
283 classes <- useStyles {}
295 classes <- useStyles {}
284 pure
296 pure
285 $ element withSidebar
297 $ element withSidebar
286 ( justifill
298 ( justifill
287− { sidebarChildren: [ R.div_ [ R.text "hahahaha" ] ]
299+ { sidebarChildren: [ R.div_ [] ]
288 , notSidebarChildren: [] ∷ Array JSX
300 , notSidebarChildren: [] ∷ Array JSX
289 }
301 }
290 )
302 )
blog/src/components/layout.js+3−6
@@ -2,7 +2,8 @@ import React from "react";
2import PropTypes from "prop-types";
2import PropTypes from "prop-types";
3import { graphql, useStaticQuery } from "gatsby";
3import { graphql, useStaticQuery } from "gatsby";
4import { preToCodeBlock } from "mdx-utils";
4import { preToCodeBlock } from "mdx-utils";
5−const psLayout = require("./PSLayout.purs");
5+const psLayout = require("../../output/PSLayout/index.js"); // [FIXME] use the next line
6+// const psLayout = require("./PSLayout.purs");
6const fetch = typeof window !== "undefined" && window.fetch;
7const fetch = typeof window !== "undefined" && window.fetch;
7
8
8const PSLayout = psLayout.mkLayout(fetch)();
9const PSLayout = psLayout.mkLayout(fetch)();
@@ -24,8 +25,4 @@ const Layout = ({ children }) => {
24 return <PSLayout siteInfo={siteInfo}>{children}</PSLayout>;
25 return <PSLayout siteInfo={siteInfo}>{children}</PSLayout>;
25};
26};
26
27
27−Layout.propTypes = {
28− children: PropTypes.node.isRequired
29−};
30−
31−export default Layout;
28+export default Layout;
blog/src/pages/index.mdx−1
@@ -1,6 +1,5 @@
1import { Link } from 'gatsby'
1import { Link } from 'gatsby'
2
2
3−import Layout from '../components/layout'
4import SEO from '../components/seo'
3import SEO from '../components/seo'
5
4
6<SEO title="Home" keywords={['gatsby', 'application', 'react']} />
5<SEO title="Home" keywords={['gatsby', 'application', 'react']} />
blog/src/pages/optional.mdx+4−1
@@ -1,5 +1,6 @@
1import Layout from '../components/layout'
1import Layout from '../components/layout'
2import SEO from '../components/seo'
2import SEO from '../components/seo'
3+import { Link } from 'gatsby'
3
4
4<SEO title="Home" keywords={['gatsby', 'application', 'react']} />
5<SEO title="Home" keywords={['gatsby', 'application', 'react']} />
5
6
@@ -37,4 +38,6 @@ incantation = cast $
37
38
38---
39---
39
40
40−Guter Mann
41+Guter Mann
42+
43+<Link to="/optional/">Go to the first exercise</Link>
components/src/Yoga/FillInTheGaps/Component.purs+33−21
@@ -2,22 +2,23 @@ module Yoga.FillInTheGaps.Component where
2
2
3import Prelude
3import Prelude
4import Data.Array as A
4import Data.Array as A
5−import Data.Tuple.Nested ((/\))
5+import Data.Maybe (Maybe(..))
6+import Data.Monoid (guard)
6import Effect (Effect)
7import Effect (Effect)
7import Justifill (justifill)
8import Justifill (justifill)
8import React.Basic (JSX, ReactComponent, element)
9import React.Basic (JSX, ReactComponent, element)
9import React.Basic.DOM as R
10import React.Basic.DOM as R
10import React.Basic.Events (handler_)
11import React.Basic.Events (handler_)
11import React.Basic.Helpers (jsx)
12import React.Basic.Helpers (jsx)
12−import React.Basic.Hooks (component, useEffect, useState)
13+import React.Basic.Hooks (component)
13import React.Basic.Hooks as React
14import React.Basic.Hooks as React
14import React.Basic.SyntaxHighlighter.Component (HighlighterTheme, syntaxHighlighterImpl)
15import React.Basic.SyntaxHighlighter.Component (HighlighterTheme, syntaxHighlighterImpl)
15import Yoga.Button.Component (ButtonType(..), mkButton)
16import Yoga.Button.Component (ButtonType(..), mkButton)
17+import Yoga.Cluster.Component as Cluster
16import Yoga.FillInTheGaps.Logic (Segment(..), complete, updateSegments)
18import Yoga.FillInTheGaps.Logic (Segment(..), complete, updateSegments)
17−import Yoga.Helpers ((?||))
19+import Yoga.Helpers (ifJustTrue, (?||))
18import Yoga.InlineCode.Component as InlineCode
20import Yoga.InlineCode.Component as InlineCode
19import Yoga.Stack.Component as Stack
21import Yoga.Stack.Component as Stack
20−import Yoga.Cluster.Component as Cluster
21import Yoga.Theme.Styles (useTheme)
22import Yoga.Theme.Styles (useTheme)
22import Yoga.Theme.Syntax (mkHighlighterTheme)
23import Yoga.Theme.Syntax (mkHighlighterTheme)
23
24
@@ -27,43 +28,54 @@ visibleRange arr = { start, end }
27 start = A.findIndex (_ == [ Start ]) arr ?|| 0
28 start = A.findIndex (_ == [ Start ]) arr ?|| 0
28 end = A.findIndex (_ == [ End ]) arr ?|| A.length arr
29 end = A.findIndex (_ == [ End ]) arr ?|| A.length arr
29
30
30−renderSegments ∷ HighlighterTheme -> ReactComponent InlineCode.Props -> ((Array (Array Segment) -> Array (Array Segment)) -> Effect Unit) -> Array (Array Segment) -> JSX
31+renderSegments ∷ Maybe Boolean -> HighlighterTheme -> ReactComponent InlineCode.Props -> ((Array (Array Segment) -> Array (Array Segment)) -> Effect Unit) -> Array (Array Segment) -> JSX
31−renderSegments highlighterTheme ic update arrs = R.div_ (A.mapWithIndex renderLine arrs)
32+renderSegments readOnly highlighterTheme ic update arrs = R.div_ (A.mapWithIndex renderLine arrs)
32 where
33 where
33 { start, end } = visibleRange arrs
34 { start, end } = visibleRange arrs
34 renderLine i l = R.div_ (A.mapWithIndex (renderSegment i) l)
35 renderLine i l = R.div_ (A.mapWithIndex (renderSegment i) l)
35 renderSegment i j s =
36 renderSegment i j s =
36 if between start end i then case s of
37 if between start end i then case s of
37 Filler s' -> element syntaxHighlighterImpl { style: highlighterTheme, language: "purescript", children: s' }
38 Filler s' -> element syntaxHighlighterImpl { style: highlighterTheme, language: "purescript", children: s' }
38− Hole width _ ->
39+ Hole width text ->
39 element ic
40 element ic
40 $ justifill
41 $ justifill
41 { width
42 { width
42− , onSubmit: update <<< updateSegments i j
43+ , update: update <<< updateSegments i j
44+ , text
45+ , readOnly
43 }
46 }
44 _ -> mempty
47 _ -> mempty
45 else
48 else
46 mempty
49 mempty
47
50
48−makeComponent ∷ Effect (ReactComponent { initialSegments ∷ Array (Array Segment), incantate ∷ Array (Array Segment) -> Effect Unit })
51+type Props
52+ = { segments ∷ Array (Array Segment)
53+ , updateSegments ∷ (Array (Array Segment) -> Array (Array Segment)) -> Effect Unit
54+ , incantate ∷ Effect Unit
55+ , readOnly ∷ Maybe Boolean
56+ }
57+
58+makeComponent ∷ Effect (ReactComponent Props)
49makeComponent = do
59makeComponent = do
50 ic <- InlineCode.makeComponent
60 ic <- InlineCode.makeComponent
51 btn <- mkButton
61 btn <- mkButton
52 stack <- Stack.makeComponent
62 stack <- Stack.makeComponent
53 cluster <- Cluster.makeComponent
63 cluster <- Cluster.makeComponent
54− component "FillInTheGaps" \{ initialSegments, incantate } -> React.do
64+ component "FillInTheGaps" \({ updateSegments, segments, incantate, readOnly } ∷ Props) -> React.do
55− segments /\ modifySegments <- useState initialSegments
56 highlighterTheme <- useTheme <#> mkHighlighterTheme
65 highlighterTheme <- useTheme <#> mkHighlighterTheme
57 pure
66 pure
58 $ jsx stack {}
67 $ jsx stack {}
59− [ renderSegments highlighterTheme ic (modifySegments) segments
68+ [ renderSegments readOnly highlighterTheme ic updateSegments segments
69+ , if Just true == readOnly then
70+ mempty
71+ else
60− , jsx cluster {}
72+ jsx cluster {}
61− [ R.div_
73+ [ R.div_
62− [ jsx btn
74+ [ jsx btn
63− { onClick: handler_ (incantate segments)
75+ { onClick: handler_ incantate
64− , buttonType: if complete segments then HighlightedButton else DisabledButton
76+ , buttonType: if complete segments then HighlightedButton else DisabledButton
65− }
77+ }
66− [ R.text "Incantate" ]
78+ [ R.text "Incantate" ]
67− ]
79+ ]
68− ]
80+ ]
69 ]
81 ]
components/src/Yoga/FillInTheGaps/Logic.purs+1
@@ -33,6 +33,7 @@ data Segment
33 | Hole Int String
33 | Hole Int String
34
34
35derive instance eqSegment ∷ Eq Segment
35derive instance eqSegment ∷ Eq Segment
36+derive instance ordSegment ∷ Ord Segment
36getResult ∷ Segment -> Maybe String
37getResult ∷ Segment -> Maybe String
37getResult = case _ of
38getResult = case _ of
38 ExpectedResult r -> Just r
39 ExpectedResult r -> Just r
components/src/Yoga/FillInTheGaps/Stories.purs+24−19
@@ -1,8 +1,14 @@
1module Yoga.FillInTheGaps.Stories where
1module Yoga.FillInTheGaps.Stories where
2
2
3import Prelude hiding (add)
3import Prelude hiding (add)
4−import Data.String as String
4+import Control.Monad.Trans.Class (lift)
5+import Data.Maybe (Maybe(..))
6+import Data.Tuple.Nested ((/\))
5import Effect (Effect)
7import Effect (Effect)
8+import Effect.Ref as Ref
9+import React.Basic (ReactComponent)
10+import React.Basic.Hooks (element, useState, component)
11+import React.Basic.Hooks as React
6import Storybook.Decorator.FullScreen (fullScreenDecorator)
12import Storybook.Decorator.FullScreen (fullScreenDecorator)
7import Storybook.React (Storybook, add, addDecorator, storiesOf)
13import Storybook.React (Storybook, add, addDecorator, storiesOf)
8import Yoga.FillInTheGaps.Component as FillInTheGaps
14import Yoga.FillInTheGaps.Component as FillInTheGaps
@@ -13,9 +19,22 @@ stories ∷ Effect Storybook
13stories = do
19stories = do
14 storiesOf "FillInTheGaps" do
20 storiesOf "FillInTheGaps" do
15 addDecorator fullScreenDecorator
21 addDecorator fullScreenDecorator
22+ segRef <- Ref.new [] # lift
23+ add "The FillInTheGaps" makeWrapper
24+ [ {} ]
25+
26+makeWrapper ∷ Effect (ReactComponent {})
27+makeWrapper = do
16− add "The FillInTheGaps" (FillInTheGaps.makeComponent)
28+ gaps <- FillInTheGaps.makeComponent
29+ component "GapsWrapper" \_ -> React.do
17− [ { initialSegments: parseSegments codeWithHoles ?|| [], incantate: pure (pure unit) }
30+ segments /\ updateSegments <- useState (parseSegments codeWithHoles ?|| [])
18− ]
31+ pure
32+ $ element gaps
33+ { segments
34+ , updateSegments
35+ , incantate: mempty
36+ , readOnly: Just false
37+ }
19
38
20codeWithHoles =
39codeWithHoles =
21 """
40 """
@@ -25,22 +44,8 @@ import Grimoire
25
44
26incantation :: Effect Unit
45incantation :: Effect Unit
27--start here
46--start here
47+--please say Hello World
28incantation = cast
48incantation = cast
29 "{-Hello World-}"
49 "{-Hello World-}"
30--end here
50--end here
31"""
51"""
32−
33−correctCode =
34− String.replace
35− (String.Pattern "{-Hello World-}")
36− (String.Replacement "Hello World")
37− <<< String.replace
38− (String.Pattern "--result Hello World")
39− (String.Replacement "")
40− <<< String.replace
41− (String.Pattern "--start here")
42− (String.Replacement "")
43− <<< String.replace
44− (String.Pattern "--end here")
45− (String.Replacement "")
46− $ codeWithHoles
components/src/Yoga/InlineCode/Component.purs+15−11
@@ -1,11 +1,10 @@
1module Yoga.InlineCode.Component where
1module Yoga.InlineCode.Component where
2
2
3import Prelude
3import Prelude
4−import Prelude
5−import CSS (value)
6import Data.Foldable (fold, intercalate)
4import Data.Foldable (fold, intercalate)
7import Data.Maybe (Maybe)
5import Data.Maybe (Maybe)
8−import Data.String (trim)
6+import Data.Nullable (toNullable)
7+import Data.Nullable as Nullable
9import Data.Time.Duration (Milliseconds(..))
8import Data.Time.Duration (Milliseconds(..))
10import Data.Tuple.Nested ((/\))
9import Data.Tuple.Nested ((/\))
11import Effect (Effect)
10import Effect (Effect)
@@ -13,12 +12,13 @@ import Effect.Aff (delay)
13import Effect.Class (liftEffect)
12import Effect.Class (liftEffect)
14import Foreign.Object as Obj
13import Foreign.Object as Obj
15import React.Basic.DOM as R
14import React.Basic.DOM as R
16−import React.Basic.DOM.Events (capture, capture_, preventDefault, targetValue)
15+import React.Basic.DOM.Events (targetValue)
17−import React.Basic.Events (handler, handler_)
16+import React.Basic.Events (handler)
18−import React.Basic.Hooks (ReactComponent, component, useEffect, useState)
17+import React.Basic.Hooks (ReactComponent, component, useState)
19import React.Basic.Hooks as React
18import React.Basic.Hooks as React
20import React.Basic.Hooks.Aff (useAff)
19import React.Basic.Hooks.Aff (useAff)
21import Record.Extra (pick)
20import Record.Extra (pick)
21+import Unsafe.Coerce (unsafeCoerce)
22import Yoga.Helpers ((?||))
22import Yoga.Helpers ((?||))
23import Yoga.InlineCode.Styles (styles)
23import Yoga.InlineCode.Styles (styles)
24import Yoga.InlineCode.Styles as Styles
24import Yoga.InlineCode.Styles as Styles
@@ -31,20 +31,22 @@ type PropsR
31 = OptionalProps (Styles.PropsR)
31 = OptionalProps (Styles.PropsR)
32
32
33type OptionalProps r
33type OptionalProps r
34− = ( onSubmit ∷ String -> Effect Unit
34+ = ( update ∷ String -> Effect Unit
35+ , text ∷ Maybe String
35 , className ∷ Maybe String
36 , className ∷ Maybe String
37+ , readOnly ∷ Maybe Boolean
36 | r
38 | r
37 )
39 )
38
40
39makeComponent ∷ Effect (ReactComponent Props)
41makeComponent ∷ Effect (ReactComponent Props)
40makeComponent = do
42makeComponent = do
41 useStyles <- makeStylesJSS styles
43 useStyles <- makeStylesJSS styles
42− component "InlineCode" \props@{ className, onSubmit } -> React.do
44+ component "InlineCode" \props@{ className, text, update, readOnly } -> React.do
43− value /\ modifyValue <- useState ""
45+ value /\ modifyValue <- useState (text ?|| "")
44 classes <- useStyles $ pick props
46 classes <- useStyles $ pick props
45 useAff value do
47 useAff value do
46 delay (200.0 # Milliseconds)
48 delay (200.0 # Milliseconds)
47− onSubmit value # liftEffect
49+ update value # liftEffect
48 pure
50 pure
49 $ R.div
51 $ R.div
50 { className: classes.form
52 { className: classes.form
@@ -53,8 +55,10 @@ makeComponent = do
53 { className: intercalate " " [ classes.inlinecode, fold className ]
55 { className: intercalate " " [ classes.inlinecode, fold className ]
54 , maxLength: props.width ?|| 10
56 , maxLength: props.width ?|| 10
55 , value
57 , value
58+ , readOnly: readOnly ?|| false
59+ , disabled: readOnly ?|| false
56 , spellCheck: false
60 , spellCheck: false
57− , autoComplete: false
61+ , autoComplete: unsafeCoerce "false"
58 , autoCorrect: "off"
62 , autoCorrect: "off"
59 , autoCapitalize: "off"
63 , autoCapitalize: "off"
60 , onChange:
64 , onChange:
components/src/Yoga/InlineCode/Spec.purs+1−1
@@ -60,6 +60,6 @@ mkWrapper = do
60 pure
60 pure
61 $ element inlineCode
61 $ element inlineCode
62 ( justifill
62 ( justifill
63− { onSubmit: dispatch <<< InlineCodeAction
63+ { update: dispatch <<< InlineCodeAction
64 }
64 }
65 )
65 )
components/src/Yoga/InlineCode/Stories.purs+4−4
@@ -30,7 +30,7 @@ stories = do
30 addDecorator fullScreenDecorator
30 addDecorator fullScreenDecorator
31 add "The InlineCode" InlineCode.makeComponent
31 add "The InlineCode" InlineCode.makeComponent
32 [ ( justifill
32 [ ( justifill
33− { onSubmit: log
33+ { update: log
34 }
34 }
35 )
35 )
36 ]
36 ]
@@ -38,7 +38,7 @@ stories = do
38 [ { inside:
38 [ { inside:
39 \inlineCode ->
39 \inlineCode ->
40 [ R.text "hi!"
40 [ R.text "hi!"
41− , element inlineCode (justifill { onSubmit: log })
41+ , element inlineCode (justifill { update: log })
42 , R.text "hello again!"
42 , R.text "hello again!"
43 ]
43 ]
44 }
44 }
@@ -47,7 +47,7 @@ stories = do
47 [ { inside:
47 [ { inside:
48 \inlineCode ->
48 \inlineCode ->
49 [ R.code_ [ R.text "main = logShow \"" ]
49 [ R.code_ [ R.text "main = logShow \"" ]
50− , element inlineCode (justifill { onSubmit: log })
50+ , element inlineCode (justifill { update: log })
51 , R.code_ [ R.text "\"" ]
51 , R.code_ [ R.text "\"" ]
52 ]
52 ]
53 }
53 }
@@ -96,7 +96,7 @@ mkRealWrapper = do
96 $ R.div_
96 $ R.div_
97 [ R.h2_ [ R.text "Let's log some 'Magick'" ]
97 [ R.h2_ [ R.text "Let's log some 'Magick'" ]
98 , fragment $ renderCode codePrefix
98 , fragment $ renderCode codePrefix
99− , element inlineCode (justifill { onSubmit: dispatch <<< InlineCodeSubmitted, width: String.length "Magick" })
99+ , element inlineCode (justifill { update: dispatch <<< InlineCodeSubmitted, width: String.length "Magick" })
100 , fragment $ renderCode codeSuffix
100 , fragment $ renderCode codeSuffix
101 , R.br {}
101 , R.br {}
102 , case state of
102 , case state of
server/package-lock.json+489−2
@@ -4,6 +4,27 @@
4 "lockfileVersion": 1,
4 "lockfileVersion": 1,
5 "requires": true,
5 "requires": true,
6 "dependencies": {
6 "dependencies": {
7+ "@babel/runtime": {
8+ "version": "7.9.2",
9+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
10+ "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
11+ "requires": {
12+ "regenerator-runtime": "^0.13.4"
13+ }
14+ },
15+ "@emotion/is-prop-valid": {
16+ "version": "0.7.3",
17+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz",
18+ "integrity": "sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA==",
19+ "requires": {
20+ "@emotion/memoize": "0.7.1"
21+ }
22+ },
23+ "@emotion/memoize": {
24+ "version": "0.7.1",
25+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz",
26+ "integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg=="
27+ },
7 "accepts": {
28 "accepts": {
8 "version": "1.3.7",
29 "version": "1.3.7",
9 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
30 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
@@ -205,6 +226,21 @@
205 "supports-color": "^5.3.0"
226 "supports-color": "^5.3.0"
206 }
227 }
207 },
228 },
229+ "character-entities": {
230+ "version": "1.2.4",
231+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
232+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="
233+ },
234+ "character-entities-legacy": {
235+ "version": "1.1.4",
236+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
237+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="
238+ },
239+ "character-reference-invalid": {
240+ "version": "1.1.4",
241+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
242+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="
243+ },
208 "chownr": {
244 "chownr": {
209 "version": "1.1.3",
245 "version": "1.1.3",
210 "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz",
246 "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz",
@@ -220,6 +256,17 @@
220 "restore-cursor": "^2.0.0"
256 "restore-cursor": "^2.0.0"
221 }
257 }
222 },
258 },
259+ "clipboard": {
260+ "version": "2.0.6",
261+ "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz",
262+ "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==",
263+ "optional": true,
264+ "requires": {
265+ "good-listener": "^1.2.2",
266+ "select": "^1.1.2",
267+ "tiny-emitter": "^2.0.0"
268+ }
269+ },
223 "color-convert": {
270 "color-convert": {
224 "version": "1.9.3",
271 "version": "1.9.3",
225 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
272 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -244,6 +291,11 @@
244 "delayed-stream": "~1.0.0"
291 "delayed-stream": "~1.0.0"
245 }
292 }
246 },
293 },
294+ "comma-separated-tokens": {
295+ "version": "1.0.8",
296+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
297+ "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="
298+ },
247 "comment-json": {
299 "comment-json": {
248 "version": "2.4.1",
300 "version": "2.4.1",
249 "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-2.4.1.tgz",
301 "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-2.4.1.tgz",
@@ -337,6 +389,30 @@
337 }
389 }
338 }
390 }
339 },
391 },
392+ "css-jss": {
393+ "version": "10.1.1",
394+ "resolved": "https://registry.npmjs.org/css-jss/-/css-jss-10.1.1.tgz",
395+ "integrity": "sha512-HrSD06y4dCfZ6nHtG/SucJBG8tbt+lbyBsUbxfqujyycxPLLd/B9mRKW97B8Ua8VWK8LR4i9ur0P8szZEjoqzQ==",
396+ "requires": {
397+ "@babel/runtime": "^7.3.1",
398+ "jss": "10.1.1",
399+ "jss-preset-default": "10.1.1"
400+ }
401+ },
402+ "css-vendor": {
403+ "version": "2.0.8",
404+ "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz",
405+ "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==",
406+ "requires": {
407+ "@babel/runtime": "^7.8.3",
408+ "is-in-browser": "^1.0.2"
409+ }
410+ },
411+ "csstype": {
412+ "version": "2.6.10",
413+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.10.tgz",
414+ "integrity": "sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w=="
415+ },
340 "cyclist": {
416 "cyclist": {
341 "version": "1.0.1",
417 "version": "1.0.1",
342 "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
418 "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
@@ -366,6 +442,12 @@
366 "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
442 "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
367 "dev": true
443 "dev": true
368 },
444 },
445+ "delegate": {
446+ "version": "3.2.0",
447+ "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
448+ "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
449+ "optional": true
450+ },
369 "depd": {
451 "depd": {
370 "version": "1.1.2",
452 "version": "1.1.2",
371 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
453 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -528,6 +610,14 @@
528 "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
610 "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
529 "dev": true
611 "dev": true
530 },
612 },
613+ "fault": {
614+ "version": "1.0.4",
615+ "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
616+ "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
617+ "requires": {
618+ "format": "^0.2.0"
619+ }
620+ },
531 "figgy-pudding": {
621 "figgy-pudding": {
532 "version": "3.5.1",
622 "version": "3.5.1",
533 "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
623 "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
@@ -581,6 +671,11 @@
581 "mime-types": "^2.1.12"
671 "mime-types": "^2.1.12"
582 }
672 }
583 },
673 },
674+ "format": {
675+ "version": "0.2.2",
676+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
677+ "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs="
678+ },
584 "forwarded": {
679 "forwarded": {
585 "version": "0.1.2",
680 "version": "0.1.2",
586 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
681 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@@ -671,6 +766,15 @@
671 "path-is-absolute": "^1.0.0"
766 "path-is-absolute": "^1.0.0"
672 }
767 }
673 },
768 },
769+ "good-listener": {
770+ "version": "1.2.2",
771+ "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
772+ "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
773+ "optional": true,
774+ "requires": {
775+ "delegate": "^3.1.2"
776+ }
777+ },
674 "graceful-fs": {
778 "graceful-fs": {
675 "version": "4.2.3",
779 "version": "4.2.3",
676 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
780 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
@@ -703,6 +807,35 @@
703 "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz",
807 "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz",
704 "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ=="
808 "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ=="
705 },
809 },
810+ "hast-util-parse-selector": {
811+ "version": "2.2.4",
812+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz",
813+ "integrity": "sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA=="
814+ },
815+ "hastscript": {
816+ "version": "5.1.2",
817+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz",
818+ "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==",
819+ "requires": {
820+ "comma-separated-tokens": "^1.0.0",
821+ "hast-util-parse-selector": "^2.0.0",
822+ "property-information": "^5.0.0",
823+ "space-separated-tokens": "^1.0.0"
824+ }
825+ },
826+ "highlight.js": {
827+ "version": "9.15.10",
828+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.10.tgz",
829+ "integrity": "sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw=="
830+ },
831+ "hoist-non-react-statics": {
832+ "version": "3.3.2",
833+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
834+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
835+ "requires": {
836+ "react-is": "^16.7.0"
837+ }
838+ },
706 "http-errors": {
839 "http-errors": {
707 "version": "1.7.2",
840 "version": "1.7.2",
708 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
841 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
@@ -726,6 +859,11 @@
726 "sshpk": "^1.7.0"
859 "sshpk": "^1.7.0"
727 }
860 }
728 },
861 },
862+ "hyphenate-style-name": {
863+ "version": "1.0.3",
864+ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz",
865+ "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ=="
866+ },
729 "iconv-lite": {
867 "iconv-lite": {
730 "version": "0.4.24",
868 "version": "0.4.24",
731 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
869 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -766,12 +904,41 @@
766 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
904 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
767 "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
905 "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
768 },
906 },
907+ "is-alphabetical": {
908+ "version": "1.0.4",
909+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
910+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="
911+ },
912+ "is-alphanumerical": {
913+ "version": "1.0.4",
914+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
915+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
916+ "requires": {
917+ "is-alphabetical": "^1.0.0",
918+ "is-decimal": "^1.0.0"
919+ }
920+ },
921+ "is-decimal": {
922+ "version": "1.0.4",
923+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
924+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="
925+ },
769 "is-fullwidth-code-point": {
926 "is-fullwidth-code-point": {
770 "version": "2.0.0",
927 "version": "2.0.0",
771 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
928 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
772 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
929 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
773 "dev": true
930 "dev": true
774 },
931 },
932+ "is-hexadecimal": {
933+ "version": "1.0.4",
934+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
935+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="
936+ },
937+ "is-in-browser": {
938+ "version": "1.1.3",
939+ "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz",
940+ "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU="
941+ },
775 "is-plain-obj": {
942 "is-plain-obj": {
776 "version": "2.1.0",
943 "version": "2.1.0",
777 "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
944 "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
@@ -808,6 +975,11 @@
808 "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
975 "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
809 "dev": true
976 "dev": true
810 },
977 },
978+ "js-tokens": {
979+ "version": "4.0.0",
980+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
981+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
982+ },
811 "jsbn": {
983 "jsbn": {
812 "version": "0.1.1",
984 "version": "0.1.1",
813 "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
985 "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
@@ -861,6 +1033,153 @@
861 "verror": "1.10.0"
1033 "verror": "1.10.0"
862 }
1034 }
863 },
1035 },
1036+ "jss": {
1037+ "version": "10.1.1",
1038+ "resolved": "https://registry.npmjs.org/jss/-/jss-10.1.1.tgz",
1039+ "integrity": "sha512-Xz3qgRUFlxbWk1czCZibUJqhVPObrZHxY3FPsjCXhDld4NOj1BgM14Ir5hVm+Qr6OLqVljjGvoMcCdXNOAbdkQ==",
1040+ "requires": {
1041+ "@babel/runtime": "^7.3.1",
1042+ "csstype": "^2.6.5",
1043+ "is-in-browser": "^1.1.3",
1044+ "tiny-warning": "^1.0.2"
1045+ }
1046+ },
1047+ "jss-plugin-camel-case": {
1048+ "version": "10.1.1",
1049+ "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.1.1.tgz",
1050+ "integrity": "sha512-MDIaw8FeD5uFz1seQBKz4pnvDLnj5vIKV5hXSVdMaAVq13xR6SVTVWkIV/keyTs5txxTvzGJ9hXoxgd1WTUlBw==",
1051+ "requires": {
1052+ "@babel/runtime": "^7.3.1",
1053+ "hyphenate-style-name": "^1.0.3",
1054+ "jss": "10.1.1"
1055+ }
1056+ },
1057+ "jss-plugin-compose": {
1058+ "version": "10.1.1",
1059+ "resolved": "https://registry.npmjs.org/jss-plugin-compose/-/jss-plugin-compose-10.1.1.tgz",
1060+ "integrity": "sha512-0fD+YVGk0fVnsLiNf7CG4Lv7lYwmNyeE62Fbccx8k1mMdFoE7he0hpx37tudsfKW2ArCE+hf4fmJDXPW8l6LBw==",
1061+ "requires": {
1062+ "@babel/runtime": "^7.3.1",
1063+ "jss": "10.1.1",
1064+ "tiny-warning": "^1.0.2"
1065+ }
1066+ },
1067+ "jss-plugin-default-unit": {
1068+ "version": "10.1.1",
1069+ "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.1.1.tgz",
1070+ "integrity": "sha512-UkeVCA/b3QEA4k0nIKS4uWXDCNmV73WLHdh2oDGZZc3GsQtlOCuiH3EkB/qI60v2MiCq356/SYWsDXt21yjwdg==",
1071+ "requires": {
1072+ "@babel/runtime": "^7.3.1",
1073+ "jss": "10.1.1"
1074+ }
1075+ },
1076+ "jss-plugin-expand": {
1077+ "version": "10.1.1",
1078+ "resolved": "https://registry.npmjs.org/jss-plugin-expand/-/jss-plugin-expand-10.1.1.tgz",
1079+ "integrity": "sha512-ITO3RR4eTB3628B+gx8gLI7TKKE0TsFDBJ7BA648ZhXjHWQ5uxdC1bZld+++xnFL1l4kerj5tuWmZxS64C1Kcg==",
1080+ "requires": {
1081+ "@babel/runtime": "^7.3.1",
1082+ "jss": "10.1.1"
1083+ }
1084+ },
1085+ "jss-plugin-extend": {
1086+ "version": "10.1.1",
1087+ "resolved": "https://registry.npmjs.org/jss-plugin-extend/-/jss-plugin-extend-10.1.1.tgz",
1088+ "integrity": "sha512-dZl0hNsndP9GJM6yqA7lZmnx6KJHo/13Zeo5B3i2uaDNO9jd5Y3pp1XHURGfbFG3K29XsYBQPTgfBwQ7e7+nyA==",
1089+ "requires": {
1090+ "@babel/runtime": "^7.3.1",
1091+ "jss": "10.1.1",
1092+ "tiny-warning": "^1.0.2"
1093+ }
1094+ },
1095+ "jss-plugin-global": {
1096+ "version": "10.1.1",
1097+ "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.1.1.tgz",
1098+ "integrity": "sha512-VBG3wRyi3Z8S4kMhm8rZV6caYBegsk+QnQZSVmrWw6GVOT/Z4FA7eyMu5SdkorDlG/HVpHh91oFN56O4R9m2VA==",
1099+ "requires": {
1100+ "@babel/runtime": "^7.3.1",
1101+ "jss": "10.1.1"
1102+ }
1103+ },
1104+ "jss-plugin-nested": {
1105+ "version": "10.1.1",
1106+ "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.1.1.tgz",
1107+ "integrity": "sha512-ozEu7ZBSVrMYxSDplPX3H82XHNQk2DQEJ9TEyo7OVTPJ1hEieqjDFiOQOxXEj9z3PMqkylnUbvWIZRDKCFYw5Q==",
1108+ "requires": {
1109+ "@babel/runtime": "^7.3.1",
1110+ "jss": "10.1.1",
1111+ "tiny-warning": "^1.0.2"
1112+ }
1113+ },
1114+ "jss-plugin-props-sort": {
1115+ "version": "10.1.1",
1116+ "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.1.1.tgz",
1117+ "integrity": "sha512-g/joK3eTDZB4pkqpZB38257yD4LXB0X15jxtZAGbUzcKAVUHPl9Jb47Y7lYmiGsShiV4YmQRqG1p2DHMYoK91g==",
1118+ "requires": {
1119+ "@babel/runtime": "^7.3.1",
1120+ "jss": "10.1.1"
1121+ }
1122+ },
1123+ "jss-plugin-rule-value-function": {
1124+ "version": "10.1.1",
1125+ "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.1.1.tgz",
1126+ "integrity": "sha512-ClV1lvJ3laU9la1CUzaDugEcwnpjPTuJ0yGy2YtcU+gG/w9HMInD5vEv7xKAz53Bk4WiJm5uLOElSEshHyhKNw==",
1127+ "requires": {
1128+ "@babel/runtime": "^7.3.1",
1129+ "jss": "10.1.1"
1130+ }
1131+ },
1132+ "jss-plugin-rule-value-observable": {
1133+ "version": "10.1.1",
1134+ "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.1.1.tgz",
1135+ "integrity": "sha512-l1zmLfS5Ks6CrthOIVTokHkDoI01ymnwNBlciN+IlaR4UsLEQBBL0+3BfQjOPvIYRAYXxYx3G7ebUHebr8mWyA==",
1136+ "requires": {
1137+ "@babel/runtime": "^7.3.1",
1138+ "jss": "10.1.1",
1139+ "symbol-observable": "^1.2.0"
1140+ }
1141+ },
1142+ "jss-plugin-template": {
1143+ "version": "10.1.1",
1144+ "resolved": "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.1.1.tgz",
1145+ "integrity": "sha512-CPhNapLDgj6gIJOi3vj/QPohF/1OHuLQj8ZjBYqrnzCDSfYV5s2Rzp1TicFGxUb07BRLh62ymU+MgH1hbKGSTQ==",
1146+ "requires": {
1147+ "@babel/runtime": "^7.3.1",
1148+ "jss": "10.1.1",
1149+ "tiny-warning": "^1.0.2"
1150+ }
1151+ },
1152+ "jss-plugin-vendor-prefixer": {
1153+ "version": "10.1.1",
1154+ "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.1.1.tgz",
1155+ "integrity": "sha512-09MZpQ6onQrhaVSF6GHC4iYifQ7+4YC/tAP6D4ZWeZotvCMq1mHLqNKRIaqQ2lkgANjlEot2JnVi1ktu4+L4pw==",
1156+ "requires": {
1157+ "@babel/runtime": "^7.3.1",
1158+ "css-vendor": "^2.0.7",
1159+ "jss": "10.1.1"
1160+ }
1161+ },
1162+ "jss-preset-default": {
1163+ "version": "10.1.1",
1164+ "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-10.1.1.tgz",
1165+ "integrity": "sha512-YwQp/BZ8IiBwxDTQ4uPAjzI2k2njrw6RJegAPvhCB1MTmWN2oR9Dhb5aN3RtepUf/agUkewTMwQqoS6PijgVMg==",
1166+ "requires": {
1167+ "@babel/runtime": "^7.3.1",
1168+ "jss": "10.1.1",
1169+ "jss-plugin-camel-case": "10.1.1",
1170+ "jss-plugin-compose": "10.1.1",
1171+ "jss-plugin-default-unit": "10.1.1",
1172+ "jss-plugin-expand": "10.1.1",
1173+ "jss-plugin-extend": "10.1.1",
1174+ "jss-plugin-global": "10.1.1",
1175+ "jss-plugin-nested": "10.1.1",
1176+ "jss-plugin-props-sort": "10.1.1",
1177+ "jss-plugin-rule-value-function": "10.1.1",
1178+ "jss-plugin-rule-value-observable": "10.1.1",
1179+ "jss-plugin-template": "10.1.1",
1180+ "jss-plugin-vendor-prefixer": "10.1.1"
1181+ }
1182+ },
864 "log-symbols": {
1183 "log-symbols": {
865 "version": "3.0.0",
1184 "version": "3.0.0",
866 "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
1185 "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
@@ -881,6 +1200,23 @@
881 "wrap-ansi": "^5.0.0"
1200 "wrap-ansi": "^5.0.0"
882 }
1201 }
883 },
1202 },
1203+ "loose-envify": {
1204+ "version": "1.4.0",
1205+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1206+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1207+ "requires": {
1208+ "js-tokens": "^3.0.0 || ^4.0.0"
1209+ }
1210+ },
1211+ "lowlight": {
1212+ "version": "1.12.1",
1213+ "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.12.1.tgz",
1214+ "integrity": "sha512-OqaVxMGIESnawn+TU/QMV5BJLbUghUfjDWPAtFqDYDmDtr4FnB+op8xM+pR7nKlauHNUHXGt0VgWatFB8voS5w==",
1215+ "requires": {
1216+ "fault": "^1.0.2",
1217+ "highlight.js": "~9.15.0"
1218+ }
1219+ },
884 "lru-cache": {
1220 "lru-cache": {
885 "version": "5.1.1",
1221 "version": "5.1.1",
886 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1222 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -1042,6 +1378,11 @@
1042 "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
1378 "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
1043 "dev": true
1379 "dev": true
1044 },
1380 },
1381+ "object-assign": {
1382+ "version": "4.1.1",
1383+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1384+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1385+ },
1045 "on-finished": {
1386 "on-finished": {
1046 "version": "2.3.0",
1387 "version": "2.3.0",
1047 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1388 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -1085,6 +1426,19 @@
1085 "readable-stream": "^2.1.5"
1426 "readable-stream": "^2.1.5"
1086 }
1427 }
1087 },
1428 },
1429+ "parse-entities": {
1430+ "version": "1.2.2",
1431+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz",
1432+ "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==",
1433+ "requires": {
1434+ "character-entities": "^1.0.0",
1435+ "character-entities-legacy": "^1.0.0",
1436+ "character-reference-invalid": "^1.0.0",
1437+ "is-alphanumerical": "^1.0.0",
1438+ "is-decimal": "^1.0.0",
1439+ "is-hexadecimal": "^1.0.0"
1440+ }
1441+ },
1088 "parseurl": {
1442 "parseurl": {
1089 "version": "1.3.3",
1443 "version": "1.3.3",
1090 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1444 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -1113,6 +1467,14 @@
1113 "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
1467 "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
1114 "dev": true
1468 "dev": true
1115 },
1469 },
1470+ "prismjs": {
1471+ "version": "1.20.0",
1472+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.20.0.tgz",
1473+ "integrity": "sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ==",
1474+ "requires": {
1475+ "clipboard": "^2.0.0"
1476+ }
1477+ },
1116 "process-nextick-args": {
1478 "process-nextick-args": {
1117 "version": "2.0.1",
1479 "version": "2.0.1",
1118 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1480 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -1125,6 +1487,24 @@
1125 "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
1487 "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
1126 "dev": true
1488 "dev": true
1127 },
1489 },
1490+ "prop-types": {
1491+ "version": "15.7.2",
1492+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
1493+ "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
1494+ "requires": {
1495+ "loose-envify": "^1.4.0",
1496+ "object-assign": "^4.1.1",
1497+ "react-is": "^16.8.1"
1498+ }
1499+ },
1500+ "property-information": {
1501+ "version": "5.4.0",
1502+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.4.0.tgz",
1503+ "integrity": "sha512-nmMWAm/3vKFGmmOWOcdLjgq/Hlxa+hsuR/px1Lp/UGEyc5A22A6l78Shc2C0E71sPmAqglni+HrS7L7VJ7AUCA==",
1504+ "requires": {
1505+ "xtend": "^4.0.0"
1506+ }
1507+ },
1128 "proxy-addr": {
1508 "proxy-addr": {
1129 "version": "2.0.5",
1509 "version": "2.0.5",
1130 "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
1510 "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
@@ -1245,6 +1625,46 @@
1245 "unpipe": "1.0.0"
1625 "unpipe": "1.0.0"
1246 }
1626 }
1247 },
1627 },
1628+ "react-display-name": {
1629+ "version": "0.2.5",
1630+ "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.5.tgz",
1631+ "integrity": "sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg=="
1632+ },
1633+ "react-is": {
1634+ "version": "16.13.1",
1635+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
1636+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
1637+ },
1638+ "react-jss": {
1639+ "version": "10.1.1",
1640+ "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-10.1.1.tgz",
1641+ "integrity": "sha512-GCSKkyj6/bDNNgK1KtaU1FbTAKJ7CQE83p34qKpCc4tVPRi1wCfopyKot1cW/YYJizqltc2MaKzGqFK5eZhBSQ==",
1642+ "requires": {
1643+ "@babel/runtime": "^7.3.1",
1644+ "@emotion/is-prop-valid": "^0.7.3",
1645+ "css-jss": "10.1.1",
1646+ "hoist-non-react-statics": "^3.2.0",
1647+ "is-in-browser": "^1.1.3",
1648+ "jss": "10.1.1",
1649+ "jss-preset-default": "10.1.1",
1650+ "prop-types": "^15.6.0",
1651+ "shallow-equal": "^1.2.0",
1652+ "theming": "3.2.0",
1653+ "tiny-warning": "^1.0.2"
1654+ }
1655+ },
1656+ "react-syntax-highlighter": {
1657+ "version": "12.2.1",
1658+ "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-12.2.1.tgz",
1659+ "integrity": "sha512-CTsp0ZWijwKRYFg9xhkWD4DSpQqE4vb2NKVMdPAkomnILSmsNBHE0n5GuI5zB+PU3ySVvXvdt9jo+ViD9XibCA==",
1660+ "requires": {
1661+ "@babel/runtime": "^7.3.1",
1662+ "highlight.js": "~9.15.1",
1663+ "lowlight": "1.12.1",
1664+ "prismjs": "^1.8.4",
1665+ "refractor": "^2.4.1"
1666+ }
1667+ },
1248 "readable-stream": {
1668 "readable-stream": {
1249 "version": "2.3.7",
1669 "version": "2.3.7",
1250 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1670 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -1260,6 +1680,31 @@
1260 "util-deprecate": "~1.0.1"
1680 "util-deprecate": "~1.0.1"
1261 }
1681 }
1262 },
1682 },
1683+ "refractor": {
1684+ "version": "2.10.1",
1685+ "resolved": "https://registry.npmjs.org/refractor/-/refractor-2.10.1.tgz",
1686+ "integrity": "sha512-Xh9o7hQiQlDbxo5/XkOX6H+x/q8rmlmZKr97Ie1Q8ZM32IRRd3B/UxuA/yXDW79DBSXGWxm2yRTbcTVmAciJRw==",
1687+ "requires": {
1688+ "hastscript": "^5.0.0",
1689+ "parse-entities": "^1.1.2",
1690+ "prismjs": "~1.17.0"
1691+ },
1692+ "dependencies": {
1693+ "prismjs": {
1694+ "version": "1.17.1",
1695+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.17.1.tgz",
1696+ "integrity": "sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==",
1697+ "requires": {
1698+ "clipboard": "^2.0.0"
1699+ }
1700+ }
1701+ }
1702+ },
1703+ "regenerator-runtime": {
1704+ "version": "0.13.5",
1705+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
1706+ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
1707+ },
1263 "repeat-string": {
1708 "repeat-string": {
1264 "version": "1.6.1",
1709 "version": "1.6.1",
1265 "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
1710 "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
@@ -1362,6 +1807,12 @@
1362 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1807 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1363 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1808 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1364 },
1809 },
1810+ "select": {
1811+ "version": "1.1.2",
1812+ "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
1813+ "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=",
1814+ "optional": true
1815+ },
1365 "send": {
1816 "send": {
1366 "version": "0.17.1",
1817 "version": "0.17.1",
1367 "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
1818 "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@@ -1405,6 +1856,11 @@
1405 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1856 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1406 "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1857 "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1407 },
1858 },
1859+ "shallow-equal": {
1860+ "version": "1.2.1",
1861+ "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz",
1862+ "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA=="
1863+ },
1408 "shebang-command": {
1864 "shebang-command": {
1409 "version": "2.0.0",
1865 "version": "2.0.0",
1410 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1866 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -1426,6 +1882,11 @@
1426 "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1882 "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1427 "dev": true
1883 "dev": true
1428 },
1884 },
1885+ "space-separated-tokens": {
1886+ "version": "1.1.5",
1887+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
1888+ "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="
1889+ },
1429 "spago": {
1890 "spago": {
1430 "version": "0.14.0",
1891 "version": "0.14.0",
1431 "resolved": "https://registry.npmjs.org/spago/-/spago-0.14.0.tgz",
1892 "resolved": "https://registry.npmjs.org/spago/-/spago-0.14.0.tgz",
@@ -1527,6 +1988,11 @@
1527 "has-flag": "^3.0.0"
1988 "has-flag": "^3.0.0"
1528 }
1989 }
1529 },
1990 },
1991+ "symbol-observable": {
1992+ "version": "1.2.0",
1993+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
1994+ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
1995+ },
1530 "tar": {
1996 "tar": {
1531 "version": "4.4.13",
1997 "version": "4.4.13",
1532 "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
1998 "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
@@ -1542,6 +2008,17 @@
1542 "yallist": "^3.0.3"
2008 "yallist": "^3.0.3"
1543 }
2009 }
1544 },
2010 },
2011+ "theming": {
2012+ "version": "3.2.0",
2013+ "resolved": "https://registry.npmjs.org/theming/-/theming-3.2.0.tgz",
2014+ "integrity": "sha512-n0fSNYXkX63rcFBBeAthy14IcgPZLHp0OGkGZheaj64j7cBoP7INLd6+7HIXqWVjFn1M5cYSiZ1nszi+jo/Szg==",
2015+ "requires": {
2016+ "hoist-non-react-statics": "^3.3.0",
2017+ "prop-types": "^15.5.8",
2018+ "react-display-name": "^0.2.4",
2019+ "tiny-warning": "^1.0.2"
2020+ }
2021+ },
1545 "through2": {
2022 "through2": {
1546 "version": "2.0.5",
2023 "version": "2.0.5",
1547 "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
2024 "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
@@ -1552,6 +2029,17 @@
1552 "xtend": "~4.0.1"
2029 "xtend": "~4.0.1"
1553 }
2030 }
1554 },
2031 },
2032+ "tiny-emitter": {
2033+ "version": "2.1.0",
2034+ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
2035+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
2036+ "optional": true
2037+ },
2038+ "tiny-warning": {
2039+ "version": "1.0.3",
2040+ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
2041+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
2042+ },
1555 "toidentifier": {
2043 "toidentifier": {
1556 "version": "1.0.0",
2044 "version": "1.0.0",
1557 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
2045 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
@@ -1703,8 +2191,7 @@
1703 "xtend": {
2191 "xtend": {
1704 "version": "4.0.2",
2192 "version": "4.0.2",
1705 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
2193 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1706− "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
2194+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
1707− "dev": true
1708 },
2195 },
1709 "y18n": {
2196 "y18n": {
1710 "version": "4.0.0",
2197 "version": "4.0.0",
server/package.json+2−2
@@ -17,8 +17,8 @@
17 "express": "^4.17.1",
17 "express": "^4.17.1",
18 "fs-extra": "^9.0.0",
18 "fs-extra": "^9.0.0",
19 "json-parser": "^3.1.2",
19 "json-parser": "^3.1.2",
20+ "minimist": "^1.2.2",
20− "uuid": "^7.0.2",
21+ "uuid": "^7.0.2"
21− "minimist": "^1.2.2"
22 },
22 },
23 "devDependencies": {
23 "devDependencies": {
24 "purescript": "^0.13.6",
24 "purescript": "^0.13.6",