git.iko.soy/rowtype-yoga/psfp
on master help sign in
The foundation has been laid
commit148366ac5d795a29c3e1d0ef4ef30c1176743ba0 authorMark Eibes <mark.eibes@gmail.com> dateWed 29 Apr 2020, 10:04 (6 years ago) parent6c57a55
17 files changed+931−172
assets/icons/trianglelogo.svg+1−1 blog/.psc-ide-port+1−1 blog/gatsby-config.js−9 blog/package-lock.json+245 blog/package.json+4−1 blog/src/components/PSLayout.purs+104−92 blog/src/components/layout.js+3−6 blog/src/pages/index.mdx−1 blog/src/pages/optional.mdx+4−1 components/src/Yoga/FillInTheGaps/Component.purs+33−21 components/src/Yoga/FillInTheGaps/Logic.purs+1 components/src/Yoga/FillInTheGaps/Stories.purs+24−19 components/src/Yoga/InlineCode/Component.purs+15−11 components/src/Yoga/InlineCode/Spec.purs+1−1 components/src/Yoga/InlineCode/Stories.purs+4−4 server/package-lock.json+489−2 server/package.json+2−2
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 = {
2828 defaultLayouts: { default: path.resolve("./src/components/layout.js") }
2929 }
3030 },
31− {
32− resolve: "gatsby-plugin-web-font-loader",
33− options: {
34− custom: {
35− families: ["Rubik"],
36− urls: ["/fonts/fonts.css"]
37− }
38− }
39− },
4031 {
4132 resolve: `gatsby-plugin-alias-imports`,
4233 options: {
blog/package-lock.json+245
@@ -978,6 +978,19 @@
978978 "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
979979 "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
980980 },
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+ },
981994 "@hapi/address": {
982995 "version": "2.1.4",
983996 "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
@@ -2303,6 +2316,14 @@
23032316 "@xtuc/long": "4.2.2"
23042317 }
23052318 },
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+ },
23062327 "@xtuc/ieee754": {
23072328 "version": "1.2.0",
23082329 "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@@ -4342,6 +4363,17 @@
43424363 "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
43434364 "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
43444365 },
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+ },
43454377 "clipboardy": {
43464378 "version": "2.3.0",
43474379 "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz",
@@ -4924,6 +4956,16 @@
49244956 "timsort": "^0.3.0"
49254957 }
49264958 },
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+ },
49274969 "css-loader": {
49284970 "version": "3.5.1",
49294971 "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.1.tgz",
@@ -5665,6 +5707,12 @@
56655707 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
56665708 "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
56675709 },
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+ },
56685716 "delegates": {
56695717 "version": "1.0.0",
56705718 "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -7448,6 +7496,14 @@
74487496 "reusify": "^1.0.4"
74497497 }
74507498 },
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+ },
74517507 "faye-websocket": {
74527508 "version": "0.11.3",
74537509 "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
@@ -7738,6 +7794,11 @@
77387794 "mime-types": "^2.1.12"
77397795 }
77407796 },
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+ },
77417802 "forwarded": {
77427803 "version": "0.1.2",
77437804 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@@ -9389,6 +9450,15 @@
93899450 "slash": "^1.0.0"
93909451 }
93919452 },
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+ },
93929462 "got": {
93939463 "version": "8.3.2",
93949464 "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
@@ -9835,6 +9905,11 @@
98359905 "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
98369906 "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
98379907 },
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+ },
98389913 "hmac-drbg": {
98399914 "version": "1.0.1",
98409915 "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@@ -11311,6 +11386,16 @@
1131111386 "jss": "10.1.1"
1131211387 }
1131311388 },
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+ },
1131411399 "jss-plugin-default-unit": {
1131511400 "version": "10.1.1",
1131611401 "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.1.1.tgz",
@@ -11320,6 +11405,25 @@
1132011405 "jss": "10.1.1"
1132111406 }
1132211407 },
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+ },
1132311427 "jss-plugin-global": {
1132411428 "version": "10.1.1",
1132511429 "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.1.1.tgz",
@@ -11357,6 +11461,26 @@
1135711461 "jss": "10.1.1"
1135811462 }
1135911463 },
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+ },
1136011484 "jss-plugin-vendor-prefixer": {
1136111485 "version": "10.1.1",
1136211486 "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.1.1.tgz",
@@ -11367,6 +11491,27 @@
1136711491 "jss": "10.1.1"
1136811492 }
1136911493 },
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+ },
1137011515 "jsx-ast-utils": {
1137111516 "version": "2.2.3",
1137211517 "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz",
@@ -11819,6 +11964,15 @@
1181911964 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
1182011965 "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
1182111966 },
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+ },
1182211976 "lpad-align": {
1182311977 "version": "1.1.2",
1182411978 "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz",
@@ -14418,6 +14572,14 @@
1441814572 "utila": "~0.4"
1441914573 }
1442014574 },
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+ },
1442114583 "private": {
1442214584 "version": "0.1.8",
1442314585 "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@@ -15290,6 +15452,11 @@
1529015452 }
1529115453 }
1529215454 },
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+ },
1529315460 "react-dom": {
1529415461 "version": "16.13.1",
1529515462 "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
@@ -15360,6 +15527,24 @@
1536015527 "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
1536115528 "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
1536215529 },
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+ },
1536315548 "react-lifecycles-compat": {
1536415549 "version": "3.0.4",
1536515550 "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
@@ -15414,6 +15599,18 @@
1541415599 "@react-spring/zdog": "9.0.0-canary.809.5.f01ecc2"
1541515600 }
1541615601 },
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+ },
1541715614 "read": {
1541815615 "version": "1.0.7",
1541915616 "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
@@ -15577,6 +15774,26 @@
1557715774 "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz",
1557815775 "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw=="
1557915776 },
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+ },
1558015797 "regenerate": {
1558115798 "version": "1.4.0",
1558215799 "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
@@ -16191,6 +16408,12 @@
1619116408 }
1619216409 }
1619316410 },
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+ },
1619416417 "select-hose": {
1619516418 "version": "2.0.0",
1619616419 "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
@@ -16402,6 +16625,11 @@
1640216625 "resolved": "https://registry.npmjs.org/shallow-compare/-/shallow-compare-1.2.2.tgz",
1640316626 "integrity": "sha512-LUMFi+RppPlrHzbqmFnINTrazo0lPNwhcgzuAXVVcfy/mqPDrQmHAyz5bvV0gDAuRFrk804V0HpQ6u9sZ0tBeg=="
1640416627 },
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+ },
1640516633 "shallowequal": {
1640616634 "version": "1.1.0",
1640716635 "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
@@ -17709,6 +17937,17 @@
1770917937 "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1771017938 "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
1771117939 },
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+ },
1771217951 "through": {
1771317952 "version": "2.3.8",
1771417953 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -17751,6 +17990,12 @@
1775117990 "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
1775217991 "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
1775317992 },
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+ },
1775417999 "tiny-warning": {
1775518000 "version": "1.0.3",
1775618001 "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
blog/package.json+4−1
@@ -7,6 +7,7 @@
77 "@material-ui/styles": "^4.9.0",
88 "@mdx-js/mdx": "^1.1.5",
99 "@mdx-js/react": "^1.1.5",
10+ "@welldone-software/why-did-you-render": "^4.1.3-alpha.0",
1011 "gatsby": "^2.19.45",
1112 "gatsby-image": "^2.2.8",
1213 "gatsby-plugin-alias-imports": "^1.0.5",
@@ -27,8 +28,10 @@
2728 "react": "^16.8.6",
2829 "react-dom": "^16.8.6",
2930 "react-helmet": "^5.2.1",
31+ "react-jss": "^10.1.1",
3032 "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"
3235 },
3336 "keywords": [
3437 "gatsby"
blog/src/components/PSLayout.purs+104−92
@@ -2,19 +2,30 @@ module PSLayout where
22
33import Prelude
44
5+import Control.Monad.State (evalStateT, get, put, runStateT)
6+import Control.Monad.State as State
7+import Control.Monad.Trans.Class (lift)
58import Data.Array (foldMap)
6−import Data.Array as A
79import Data.Array as Array
810import Data.Array.NonEmpty as NEA
911import Data.Either (Either(..))
12+import Data.Foldable (fold)
13+import Data.Function.Uncurried (mkFn2)
1014import 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
1119import Data.Nullable (Nullable)
1220import Data.Nullable as Nullable
1321import Data.String as String
22+import Data.Traversable (Accum, mapAccumL)
1423import Data.Tuple.Nested ((/\))
24+import Debug.Trace (spy)
1525import Effect (Effect)
1626import Effect.Aff (launchAff_)
1727import Effect.Class (liftEffect)
28+import Effect.Class.Console (log)
1829import JSS (jss, jssClasses)
1930import Justifill (justifill)
2031import Milkis.Impl (FetchImpl)
@@ -22,7 +33,7 @@ import React.Basic (JSX, ReactComponent, fragment)
2233import React.Basic.DOM (unsafeCreateDOMComponent)
2334import React.Basic.DOM as R
2435import 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)
2637import React.Basic.Hooks as React
2738import Unsafe.Coerce (unsafeCoerce)
2839import Yoga.Box.Component as Box
@@ -67,7 +78,12 @@ type PreProps
6778 }
6879 }
6980
81+data ShowModal
82+ = ShowModal Modal.Props
83+ | HideModal
84+
7085mkLayout ∷
86+ ∀ r.
7187 FetchImpl ->
7288 Effect
7389 ( ReactComponent
@@ -77,31 +93,34 @@ mkLayout ∷
7793 )
7894mkLayout fetchImpl = do
7995 themeProvider <- mkThemeProvider
80− mdxProviderComponent <- mkMdxProviderComponent (apiCompiler fetchImpl)
96+ modal <- memo Modal.makeComponent
97+ clickAway <- memo ClickAway.makeComponent
98+ mdxProviderComponent <- memo $ mkMdxProviderComponent (apiCompiler fetchImpl)
8199 componentWithChildren "MDXLayout" \{ children, siteInfo } -> React.do
100+ maybeModalProps /\ dispatch <-
101+ useReducer Nothing case _, _ of
102+ _, ShowModal props -> Just props
103+ _, HideModal -> Nothing
82104 pure
83105 $ element themeProvider
84106 { theme: fromTheme darkTheme
85107 , children:
86− [ element mdxProviderComponent
87− { children
88− , siteInfo
89− }
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+ ]
115+ , element mdxProviderComponent
116+ { children: spy "children" children
117+ , siteInfo
118+ , showModal: dispatch <<< ShowModal
119+ }
120+ ]
90121 ]
91122 }
92123
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−
105124isQuiz ∷ JSX -> Boolean
106125isQuiz a =
107126 (unsafeCoerce a).props.mdxType == "pre"
@@ -116,21 +135,19 @@ mkMdxProviderComponent ∷
116135 ( ReactComponent
117136 { children ∷ ReactChildren JSX
118137 , siteInfo ∷ SiteQueryResult
138+ , showModal ∷ Modal.Props -> Effect Unit
119139 }
120140 )
121141mkMdxProviderComponent compiler = do
122− cssBaseline <- mkCssBaseline
123− editor <- mkCompileEditor compiler
124− fillInTheGaps <- FillInTheGaps.makeComponent
125− box <- Box.makeComponent
126− sidebar <- mkSidebar
127− header <- mkHeader
142+ cssBaseline <- memo mkCssBaseline
143+ editor <- memo $ mkCompileEditor compiler
144+ box <- memo $ Box.makeComponent
145+ sidebar <- memo mkSidebar
146+ header <- memo mkHeader
128147 yogaInlineCode <- InlineCode.makeComponent
129− modal <- Modal.makeComponent
130− clickAway <- ClickAway.makeComponent
131− h <- mkH
132− p <- mkP
133− secret <- mkSecret
148+ quiz <- memo $ mkQuiz compiler
149+ h <- memo mkH
150+ p <- memo mkP
134151 useStyles <-
135152 makeStylesJSS
136153 $ jssClasses \(theme ∷ CSSTheme) ->
@@ -142,32 +159,23 @@ mkMdxProviderComponent compiler = do
142159 , padding: "3px"
143160 , borderRadius: "3px"
144161 }
145− , flexer:
146− { display: "flex"
147− , flexDirection: "row"
148− }
149162 }
150− componentWithChildren "MDXProviderComponent" \{ children, siteInfo } -> React.do
163+ componentWithChildren "MDXProviderComponent" \{ children, siteInfo, showModal } -> React.do
151164 classes <- useStyles {}
152− visibleThrough /\ updateVisible <- useState 1
153− questions /\ updateQuestions <- useState []
154− maybeModal /\ updateModal <- useState Nothing
165+ visibleUntil /\ updateVisible <- useState 1
155166 let
156− baseline child = element cssBaseline { kids: child }
157−
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 }
167+ onFailure = showModal (justifill { title: "Failed", kids: [ R.text "Try again" ] } ∷ Modal.Props)
168+ onSuccess = updateVisible (_ + one)
169169
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
171179
172180 siteInfoJSX =
173181 R.div
@@ -177,8 +185,8 @@ mkMdxProviderComponent compiler = do
177185 , jsx box {} visibleKids
178186 ]
179187 }
180−
181− mdxComponents =
188+ mdxComponents /\ _ <-
189+ useState
182190 { h1:
183191 \props ->
184192 element h ({ level: H2, text: props.children, className: Nothing })
@@ -197,9 +205,10 @@ mkMdxProviderComponent compiler = do
197205 , inlineCode:
198206 \props -> do
199207 R.span { className: classes.code, children: props.children }
200− , pre:
201− \(props ∷ PreProps) -> do
208+ , pre: mkFn2
209+ \(props ∷ PreProps) other -> do
202210 let
211+ _ = spy "other" other
203212 childrenQ = Nullable.toMaybe props.children
204213
205214 propsQ = (_.props >>> Nullable.toMaybe) =<< childrenQ
@@ -227,20 +236,7 @@ mkMdxProviderComponent compiler = do
227236
228237 segmentsQ = parseSegments (codeQ ?|| "")
229238 case isCode, language, segmentsQ of
230− true, "purescript", Just initialSegments ->
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− ]
239+ true, "purescript", Just initialSegments -> element quiz { initialSegments, onFailure, onSuccess }
244240 true, _, _ ->
245241 element editor
246242 { initialCode: fromMaybe "" codeQ
@@ -250,20 +246,43 @@ mkMdxProviderComponent compiler = do
250246 false, _, _ -> element (unsafeCreateDOMComponent "pre") props
251247 }
252248 pure
253− $ baseline
254− [ element mdxProvider
255− { children:
256− [ siteInfoJSX
257− ]
258− , components: mdxComponents
249+ $ element mdxProvider
250+ { children: pure $ jsx cssBaseline {} [ siteInfoJSX ]
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
259285 }
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− )
267286 ]
268287
269288mkSidebar = do
@@ -271,20 +290,13 @@ mkSidebar = do
271290 useStyles <-
272291 makeStylesJSS
273292 $ jssClasses \(theme ∷ CSSTheme) ->
274− { flexer:
275− jss
276− { display: "flex"
277− , flexDirection: "row"
278− , width: "300px"
279− , height: "300px"
280− }
281− }
293+ {}
282294 component "Sidebar" \{ links } -> React.do
283295 classes <- useStyles {}
284296 pure
285297 $ element withSidebar
286298 ( justifill
287− { sidebarChildren: [ R.div_ [ R.text "hahahaha" ] ]
299+ { sidebarChildren: [ R.div_ [] ]
288300 , notSidebarChildren: [] ∷ Array JSX
289301 }
290302 )
blog/src/components/layout.js+3−6
@@ -2,7 +2,8 @@ import React from "react";
22import PropTypes from "prop-types";
33import { graphql, useStaticQuery } from "gatsby";
44import { 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");
67const fetch = typeof window !== "undefined" && window.fetch;
78
89const PSLayout = psLayout.mkLayout(fetch)();
@@ -24,8 +25,4 @@ const Layout = ({ children }) => {
2425 return <PSLayout siteInfo={siteInfo}>{children}</PSLayout>;
2526};
2627
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 @@
11import { Link } from 'gatsby'
22
3−import Layout from '../components/layout'
43import SEO from '../components/seo'
54
65<SEO title="Home" keywords={['gatsby', 'application', 'react']} />
blog/src/pages/optional.mdx+4−1
@@ -1,5 +1,6 @@
11import Layout from '../components/layout'
22import SEO from '../components/seo'
3+import { Link } from 'gatsby'
34
45<SEO title="Home" keywords={['gatsby', 'application', 'react']} />
56
@@ -37,4 +38,6 @@ incantation = cast $
3738
3839---
3940
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
22
33import Prelude
44import Data.Array as A
5−import Data.Tuple.Nested ((/\))
5+import Data.Maybe (Maybe(..))
6+import Data.Monoid (guard)
67import Effect (Effect)
78import Justifill (justifill)
89import React.Basic (JSX, ReactComponent, element)
910import React.Basic.DOM as R
1011import React.Basic.Events (handler_)
1112import React.Basic.Helpers (jsx)
12−import React.Basic.Hooks (component, useEffect, useState)
13+import React.Basic.Hooks (component)
1314import React.Basic.Hooks as React
1415import React.Basic.SyntaxHighlighter.Component (HighlighterTheme, syntaxHighlighterImpl)
1516import Yoga.Button.Component (ButtonType(..), mkButton)
17+import Yoga.Cluster.Component as Cluster
1618import Yoga.FillInTheGaps.Logic (Segment(..), complete, updateSegments)
17−import Yoga.Helpers ((?||))
19+import Yoga.Helpers (ifJustTrue, (?||))
1820import Yoga.InlineCode.Component as InlineCode
1921import Yoga.Stack.Component as Stack
20−import Yoga.Cluster.Component as Cluster
2122import Yoga.Theme.Styles (useTheme)
2223import Yoga.Theme.Syntax (mkHighlighterTheme)
2324
@@ -27,43 +28,54 @@ visibleRange arr = { start, end }
2728 start = A.findIndex (_ == [ Start ]) arr ?|| 0
2829 end = A.findIndex (_ == [ End ]) arr ?|| A.length arr
2930
30−renderSegments ∷ 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)
31+renderSegments ∷ Maybe Boolean -> HighlighterTheme -> ReactComponent InlineCode.Props -> ((Array (Array Segment) -> Array (Array Segment)) -> Effect Unit) -> Array (Array Segment) -> JSX
32+renderSegments readOnly highlighterTheme ic update arrs = R.div_ (A.mapWithIndex renderLine arrs)
3233 where
3334 { start, end } = visibleRange arrs
3435 renderLine i l = R.div_ (A.mapWithIndex (renderSegment i) l)
3536 renderSegment i j s =
3637 if between start end i then case s of
3738 Filler s' -> element syntaxHighlighterImpl { style: highlighterTheme, language: "purescript", children: s' }
38− Hole width _ ->
39+ Hole width text ->
3940 element ic
4041 $ justifill
4142 { width
42− , onSubmit: update <<< updateSegments i j
43+ , update: update <<< updateSegments i j
44+ , text
45+ , readOnly
4346 }
4447 _ -> mempty
4548 else
4649 mempty
4750
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)
4959makeComponent = do
5060 ic <- InlineCode.makeComponent
5161 btn <- mkButton
5262 stack <- Stack.makeComponent
5363 cluster <- Cluster.makeComponent
54− component "FillInTheGaps" \{ initialSegments, incantate } -> React.do
55− segments /\ modifySegments <- useState initialSegments
64+ component "FillInTheGaps" \({ updateSegments, segments, incantate, readOnly } ∷ Props) -> React.do
5665 highlighterTheme <- useTheme <#> mkHighlighterTheme
5766 pure
5867 $ jsx stack {}
59− [ renderSegments highlighterTheme ic (modifySegments) segments
60− , jsx cluster {}
61− [ R.div_
62− [ jsx btn
63− { onClick: handler_ (incantate segments)
64− , buttonType: if complete segments then HighlightedButton else DisabledButton
65− }
66− [ R.text "Incantate" ]
67− ]
68− ]
68+ [ renderSegments readOnly highlighterTheme ic updateSegments segments
69+ , if Just true == readOnly then
70+ mempty
71+ else
72+ jsx cluster {}
73+ [ R.div_
74+ [ jsx btn
75+ { onClick: handler_ incantate
76+ , buttonType: if complete segments then HighlightedButton else DisabledButton
77+ }
78+ [ R.text "Incantate" ]
79+ ]
80+ ]
6981 ]
components/src/Yoga/FillInTheGaps/Logic.purs+1
@@ -33,6 +33,7 @@ data Segment
3333 | Hole Int String
3434
3535derive instance eqSegment ∷ Eq Segment
36+derive instance ordSegment ∷ Ord Segment
3637getResult ∷ Segment -> Maybe String
3738getResult = case _ of
3839 ExpectedResult r -> Just r
components/src/Yoga/FillInTheGaps/Stories.purs+24−19
@@ -1,8 +1,14 @@
11module Yoga.FillInTheGaps.Stories where
22
33import 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 ((/\))
57import 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
612import Storybook.Decorator.FullScreen (fullScreenDecorator)
713import Storybook.React (Storybook, add, addDecorator, storiesOf)
814import Yoga.FillInTheGaps.Component as FillInTheGaps
@@ -13,9 +19,22 @@ stories ∷ Effect Storybook
1319stories = do
1420 storiesOf "FillInTheGaps" do
1521 addDecorator fullScreenDecorator
16− add "The FillInTheGaps" (FillInTheGaps.makeComponent)
17− [ { initialSegments: parseSegments codeWithHoles ?|| [], incantate: pure (pure unit) }
18− ]
22+ segRef <- Ref.new [] # lift
23+ add "The FillInTheGaps" makeWrapper
24+ [ {} ]
25+
26+makeWrapper ∷ Effect (ReactComponent {})
27+makeWrapper = do
28+ gaps <- FillInTheGaps.makeComponent
29+ component "GapsWrapper" \_ -> React.do
30+ segments /\ updateSegments <- useState (parseSegments codeWithHoles ?|| [])
31+ pure
32+ $ element gaps
33+ { segments
34+ , updateSegments
35+ , incantate: mempty
36+ , readOnly: Just false
37+ }
1938
2039codeWithHoles =
2140 """
@@ -25,22 +44,8 @@ import Grimoire
2544
2645incantation :: Effect Unit
2746--start here
47+--please say Hello World
2848incantation = cast
2949 "{-Hello World-}"
3050--end here
3151"""
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 @@
11module Yoga.InlineCode.Component where
22
33import Prelude
4−import Prelude
5−import CSS (value)
64import Data.Foldable (fold, intercalate)
75import Data.Maybe (Maybe)
8−import Data.String (trim)
6+import Data.Nullable (toNullable)
7+import Data.Nullable as Nullable
98import Data.Time.Duration (Milliseconds(..))
109import Data.Tuple.Nested ((/\))
1110import Effect (Effect)
@@ -13,12 +12,13 @@ import Effect.Aff (delay)
1312import Effect.Class (liftEffect)
1413import Foreign.Object as Obj
1514import React.Basic.DOM as R
16−import React.Basic.DOM.Events (capture, capture_, preventDefault, targetValue)
17−import React.Basic.Events (handler, handler_)
18−import React.Basic.Hooks (ReactComponent, component, useEffect, useState)
15+import React.Basic.DOM.Events (targetValue)
16+import React.Basic.Events (handler)
17+import React.Basic.Hooks (ReactComponent, component, useState)
1918import React.Basic.Hooks as React
2019import React.Basic.Hooks.Aff (useAff)
2120import Record.Extra (pick)
21+import Unsafe.Coerce (unsafeCoerce)
2222import Yoga.Helpers ((?||))
2323import Yoga.InlineCode.Styles (styles)
2424import Yoga.InlineCode.Styles as Styles
@@ -31,20 +31,22 @@ type PropsR
3131 = OptionalProps (Styles.PropsR)
3232
3333type OptionalProps r
34− = ( onSubmit ∷ String -> Effect Unit
34+ = ( update ∷ String -> Effect Unit
35+ , text ∷ Maybe String
3536 , className ∷ Maybe String
37+ , readOnly ∷ Maybe Boolean
3638 | r
3739 )
3840
3941makeComponent ∷ Effect (ReactComponent Props)
4042makeComponent = do
4143 useStyles <- makeStylesJSS styles
42− component "InlineCode" \props@{ className, onSubmit } -> React.do
43− value /\ modifyValue <- useState ""
44+ component "InlineCode" \props@{ className, text, update, readOnly } -> React.do
45+ value /\ modifyValue <- useState (text ?|| "")
4446 classes <- useStyles $ pick props
4547 useAff value do
4648 delay (200.0 # Milliseconds)
47− onSubmit value # liftEffect
49+ update value # liftEffect
4850 pure
4951 $ R.div
5052 { className: classes.form
@@ -53,8 +55,10 @@ makeComponent = do
5355 { className: intercalate " " [ classes.inlinecode, fold className ]
5456 , maxLength: props.width ?|| 10
5557 , value
58+ , readOnly: readOnly ?|| false
59+ , disabled: readOnly ?|| false
5660 , spellCheck: false
57− , autoComplete: false
61+ , autoComplete: unsafeCoerce "false"
5862 , autoCorrect: "off"
5963 , autoCapitalize: "off"
6064 , onChange:
components/src/Yoga/InlineCode/Spec.purs+1−1
@@ -60,6 +60,6 @@ mkWrapper = do
6060 pure
6161 $ element inlineCode
6262 ( justifill
63− { onSubmit: dispatch <<< InlineCodeAction
63+ { update: dispatch <<< InlineCodeAction
6464 }
6565 )
components/src/Yoga/InlineCode/Stories.purs+4−4
@@ -30,7 +30,7 @@ stories = do
3030 addDecorator fullScreenDecorator
3131 add "The InlineCode" InlineCode.makeComponent
3232 [ ( justifill
33− { onSubmit: log
33+ { update: log
3434 }
3535 )
3636 ]
@@ -38,7 +38,7 @@ stories = do
3838 [ { inside:
3939 \inlineCode ->
4040 [ R.text "hi!"
41− , element inlineCode (justifill { onSubmit: log })
41+ , element inlineCode (justifill { update: log })
4242 , R.text "hello again!"
4343 ]
4444 }
@@ -47,7 +47,7 @@ stories = do
4747 [ { inside:
4848 \inlineCode ->
4949 [ R.code_ [ R.text "main = logShow \"" ]
50− , element inlineCode (justifill { onSubmit: log })
50+ , element inlineCode (justifill { update: log })
5151 , R.code_ [ R.text "\"" ]
5252 ]
5353 }
@@ -96,7 +96,7 @@ mkRealWrapper = do
9696 $ R.div_
9797 [ R.h2_ [ R.text "Let's log some 'Magick'" ]
9898 , 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" })
100100 , fragment $ renderCode codeSuffix
101101 , R.br {}
102102 , case state of
server/package-lock.json+489−2
@@ -4,6 +4,27 @@
44 "lockfileVersion": 1,
55 "requires": true,
66 "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+ },
728 "accepts": {
829 "version": "1.3.7",
930 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
@@ -205,6 +226,21 @@
205226 "supports-color": "^5.3.0"
206227 }
207228 },
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+ },
208244 "chownr": {
209245 "version": "1.1.3",
210246 "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz",
@@ -220,6 +256,17 @@
220256 "restore-cursor": "^2.0.0"
221257 }
222258 },
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+ },
223270 "color-convert": {
224271 "version": "1.9.3",
225272 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -244,6 +291,11 @@
244291 "delayed-stream": "~1.0.0"
245292 }
246293 },
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+ },
247299 "comment-json": {
248300 "version": "2.4.1",
249301 "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-2.4.1.tgz",
@@ -337,6 +389,30 @@
337389 }
338390 }
339391 },
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+ },
340416 "cyclist": {
341417 "version": "1.0.1",
342418 "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
@@ -366,6 +442,12 @@
366442 "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
367443 "dev": true
368444 },
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+ },
369451 "depd": {
370452 "version": "1.1.2",
371453 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -528,6 +610,14 @@
528610 "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
529611 "dev": true
530612 },
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+ },
531621 "figgy-pudding": {
532622 "version": "3.5.1",
533623 "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
@@ -581,6 +671,11 @@
581671 "mime-types": "^2.1.12"
582672 }
583673 },
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+ },
584679 "forwarded": {
585680 "version": "0.1.2",
586681 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@@ -671,6 +766,15 @@
671766 "path-is-absolute": "^1.0.0"
672767 }
673768 },
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+ },
674778 "graceful-fs": {
675779 "version": "4.2.3",
676780 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
@@ -703,6 +807,35 @@
703807 "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz",
704808 "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ=="
705809 },
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+ },
706839 "http-errors": {
707840 "version": "1.7.2",
708841 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
@@ -726,6 +859,11 @@
726859 "sshpk": "^1.7.0"
727860 }
728861 },
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+ },
729867 "iconv-lite": {
730868 "version": "0.4.24",
731869 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -766,12 +904,41 @@
766904 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
767905 "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
768906 },
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+ },
769926 "is-fullwidth-code-point": {
770927 "version": "2.0.0",
771928 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
772929 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
773930 "dev": true
774931 },
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+ },
775942 "is-plain-obj": {
776943 "version": "2.1.0",
777944 "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
@@ -808,6 +975,11 @@
808975 "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
809976 "dev": true
810977 },
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+ },
811983 "jsbn": {
812984 "version": "0.1.1",
813985 "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
@@ -861,6 +1033,153 @@
8611033 "verror": "1.10.0"
8621034 }
8631035 },
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+ },
8641183 "log-symbols": {
8651184 "version": "3.0.0",
8661185 "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
@@ -881,6 +1200,23 @@
8811200 "wrap-ansi": "^5.0.0"
8821201 }
8831202 },
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+ },
8841220 "lru-cache": {
8851221 "version": "5.1.1",
8861222 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -1042,6 +1378,11 @@
10421378 "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
10431379 "dev": true
10441380 },
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+ },
10451386 "on-finished": {
10461387 "version": "2.3.0",
10471388 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -1085,6 +1426,19 @@
10851426 "readable-stream": "^2.1.5"
10861427 }
10871428 },
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+ },
10881442 "parseurl": {
10891443 "version": "1.3.3",
10901444 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -1113,6 +1467,14 @@
11131467 "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
11141468 "dev": true
11151469 },
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+ },
11161478 "process-nextick-args": {
11171479 "version": "2.0.1",
11181480 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -1125,6 +1487,24 @@
11251487 "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
11261488 "dev": true
11271489 },
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+ },
11281508 "proxy-addr": {
11291509 "version": "2.0.5",
11301510 "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
@@ -1245,6 +1625,46 @@
12451625 "unpipe": "1.0.0"
12461626 }
12471627 },
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+ },
12481668 "readable-stream": {
12491669 "version": "2.3.7",
12501670 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -1260,6 +1680,31 @@
12601680 "util-deprecate": "~1.0.1"
12611681 }
12621682 },
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+ },
12631708 "repeat-string": {
12641709 "version": "1.6.1",
12651710 "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
@@ -1362,6 +1807,12 @@
13621807 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
13631808 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
13641809 },
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+ },
13651816 "send": {
13661817 "version": "0.17.1",
13671818 "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@@ -1405,6 +1856,11 @@
14051856 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
14061857 "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
14071858 },
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+ },
14081864 "shebang-command": {
14091865 "version": "2.0.0",
14101866 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -1426,6 +1882,11 @@
14261882 "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
14271883 "dev": true
14281884 },
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+ },
14291890 "spago": {
14301891 "version": "0.14.0",
14311892 "resolved": "https://registry.npmjs.org/spago/-/spago-0.14.0.tgz",
@@ -1527,6 +1988,11 @@
15271988 "has-flag": "^3.0.0"
15281989 }
15291990 },
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+ },
15301996 "tar": {
15311997 "version": "4.4.13",
15321998 "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
@@ -1542,6 +2008,17 @@
15422008 "yallist": "^3.0.3"
15432009 }
15442010 },
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+ },
15452022 "through2": {
15462023 "version": "2.0.5",
15472024 "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
@@ -1552,6 +2029,17 @@
15522029 "xtend": "~4.0.1"
15532030 }
15542031 },
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+ },
15552043 "toidentifier": {
15562044 "version": "1.0.0",
15572045 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
@@ -1703,8 +2191,7 @@
17032191 "xtend": {
17042192 "version": "4.0.2",
17052193 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1706− "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1707− "dev": true
2194+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
17082195 },
17092196 "y18n": {
17102197 "version": "4.0.0",
server/package.json+2−2
@@ -17,8 +17,8 @@
1717 "express": "^4.17.1",
1818 "fs-extra": "^9.0.0",
1919 "json-parser": "^3.1.2",
20− "uuid": "^7.0.2",
21− "minimist": "^1.2.2"
20+ "minimist": "^1.2.2",
21+ "uuid": "^7.0.2"
2222 },
2323 "devDependencies": {
2424 "purescript": "^0.13.6",