diff --git a/.gitignore b/.gitignore
index 449e2f79..ea26a5ab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,4 @@ data/
.idea
*.iml
private
+node_modules
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..8b6a38c8
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,495 @@
+{
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@cljs-oss/module-deps": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@cljs-oss/module-deps/-/module-deps-1.1.1.tgz",
+ "integrity": "sha1-YmZ/KCFk8/EParnxJLpBb9EkOfo=",
+ "requires": {
+ "JSONStream": "1.3.3",
+ "babel-traverse": "6.26.0",
+ "babylon": "6.18.0",
+ "browser-resolve": "1.11.2",
+ "cached-path-relative": "1.0.1",
+ "concat-stream": "1.5.2",
+ "defined": "1.0.0",
+ "detective": "4.7.1",
+ "duplexer2": "0.1.4",
+ "enhanced-resolve": "3.4.1",
+ "inherits": "2.0.3",
+ "konan": "1.1.0",
+ "parents": "1.0.1",
+ "readable-stream": "2.3.6",
+ "resolve": "1.7.1",
+ "stream-combiner2": "1.1.1",
+ "subarg": "1.0.0",
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "JSONStream": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz",
+ "integrity": "sha512-3Sp6WZZ/lXl+nTDoGpGWHEpTnnC6X5fnkolYZR6nwIfzbxxvA8utPWe1gCt7i0m9uVGsSz2IS8K8mJ7HmlduMg==",
+ "requires": {
+ "jsonparse": "1.3.1",
+ "through": "2.3.8"
+ }
+ },
+ "acorn": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+ "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ=="
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "requires": {
+ "core-js": "2.5.7",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "browser-resolve": {
+ "version": "1.11.2",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
+ "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=",
+ "requires": {
+ "resolve": "1.1.7"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
+ }
+ }
+ },
+ "bulma-calendar": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/bulma-calendar/-/bulma-calendar-1.3.0.tgz",
+ "integrity": "sha1-yqz7AWeSxV2t8O3BGq5vtkwlYEE=",
+ "requires": {
+ "camelcase": "4.1.0"
+ }
+ },
+ "cached-path-relative": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz",
+ "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc="
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "concat-stream": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
+ "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=",
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.0.6",
+ "typedarray": "0.0.6"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "string_decoder": "0.10.31",
+ "util-deprecate": "1.0.2"
+ }
+ }
+ }
+ },
+ "core-js": {
+ "version": "2.5.7",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
+ "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
+ },
+ "detective": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz",
+ "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==",
+ "requires": {
+ "acorn": "5.5.3",
+ "defined": "1.0.0"
+ }
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "enhanced-resolve": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
+ "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "memory-fs": "0.4.1",
+ "object-assign": "4.1.1",
+ "tapable": "0.2.8"
+ }
+ },
+ "errno": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+ "requires": {
+ "prr": "1.0.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+ },
+ "jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
+ },
+ "konan": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/konan/-/konan-1.1.0.tgz",
+ "integrity": "sha1-M3dDxLl7S9Hvi2KiSzFeuLxLIJQ=",
+ "requires": {
+ "babel-traverse": "6.26.0",
+ "babylon": "6.18.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "memory-fs": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+ "requires": {
+ "errno": "0.1.7",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "parents": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+ "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
+ "requires": {
+ "path-platform": "0.11.15"
+ }
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
+ },
+ "path-platform": {
+ "version": "0.11.15",
+ "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+ "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I="
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
+ },
+ "prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ },
+ "dependencies": {
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ }
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
+ "resolve": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "stream-combiner2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
+ "requires": {
+ "duplexer2": "0.1.4",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "subarg": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
+ "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
+ "requires": {
+ "minimist": "1.2.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ },
+ "tapable": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz",
+ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI="
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "requires": {
+ "readable-stream": "2.3.6",
+ "xtend": "4.0.1"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..534632c1
--- /dev/null
+++ b/package.json
@@ -0,0 +1,6 @@
+{
+ "dependencies": {
+ "@cljs-oss/module-deps": "^1.1.1",
+ "bulma-calendar": "^1.3.0"
+ }
+}
diff --git a/project.clj b/project.clj
index c453294a..b4a4c3ec 100644
--- a/project.clj
+++ b/project.clj
@@ -3,6 +3,7 @@
:url "http://example.com/FIXME"
:min-lein-version "2.0.0"
:dependencies [[org.clojure/clojure "1.9.0"]
+ [org.clojure/clojurescript "1.10.238"]
[compojure "1.6.0"]
[kibu/pushy "0.3.8"]
[bidi "2.1.2"]
@@ -85,6 +86,11 @@
:source-map-timestamp true
:preloads [devtools.preload]
:external-config {:devtools/config {:features-to-install :all}}
+ :foreign-libs [{ :file "node_modules/bulma-calendar/dist/bulma-calendar.js"
+ :provides ["bulma-calendar.core"]
+ :module-type :commonjs}]
+ :install-deps true
+ :infer-externs true
}}
{:id "min"
diff --git a/resources/public/css/bulma-calendar.min.css b/resources/public/css/bulma-calendar.min.css
new file mode 100644
index 00000000..96cae81a
--- /dev/null
+++ b/resources/public/css/bulma-calendar.min.css
@@ -0,0 +1 @@
+@-webkit-keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.datepicker{display:none}.datepicker.is-active{display:-webkit-box;display:-ms-flexbox;display:flex}.datepicker.is-active .calendar{position:fixed;z-index:40;min-width:20rem;max-width:20rem;position:relative;margin:0 auto;max-height:calc(100vh - 40px)}.datepicker.is-active .calendar-nav{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.datepicker .calendar{background:#fff;border:none;border-radius:2px;display:block;min-width:20rem;text-align:center;max-width:20rem}.datepicker .calendar.is-active{display:initial}.datepicker .calendar .calendar-nav{background:#00d1b2;color:#fff;border-top-left-radius:2px;border-top-right-radius:2px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:1.25rem;padding:.5em}.datepicker .calendar .calendar-nav .calendar-nav-day,.datepicker .calendar .calendar-nav .calendar-nav-month,.datepicker .calendar .calendar-nav .calendar-nav-year{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.datepicker .calendar .calendar-nav .calendar-day,.datepicker .calendar .calendar-nav .calendar-month,.datepicker .calendar .calendar-nav .calendar-year{-webkit-box-flex:1;-ms-flex:1;flex:1}.datepicker .calendar .calendar-nav .calendar-month{font-size:1.5rem}.datepicker .calendar .calendar-nav .calendar-day{font-size:2.5rem}.datepicker .calendar .calendar-nav .calendar-nav-next-month,.datepicker .calendar .calendar-nav .calendar-nav-next-year,.datepicker .calendar .calendar-nav .calendar-nav-previous-month,.datepicker .calendar .calendar-nav .calendar-nav-previous-year{-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-decoration:none;color:#fff}.datepicker .calendar .calendar-nav .calendar-nav-next-month:hover,.datepicker .calendar .calendar-nav .calendar-nav-next-year:hover,.datepicker .calendar .calendar-nav .calendar-nav-previous-month:hover,.datepicker .calendar .calendar-nav .calendar-nav-previous-year:hover{background-color:transparent}.datepicker .calendar .calendar-nav .calendar-nav-next-month:hover svg,.datepicker .calendar .calendar-nav .calendar-nav-next-year:hover svg,.datepicker .calendar .calendar-nav .calendar-nav-previous-month:hover svg,.datepicker .calendar .calendar-nav .calendar-nav-previous-year:hover svg{stroke-width:1em}.datepicker .calendar .calendar-nav .calendar-nav-next-month svg,.datepicker .calendar .calendar-nav .calendar-nav-next-year svg,.datepicker .calendar .calendar-nav .calendar-nav-previous-month svg,.datepicker .calendar .calendar-nav .calendar-nav-previous-year svg{stroke:currentColor;width:11.25px;height:18px}.datepicker .calendar .calendar-body,.datepicker .calendar .calendar-header{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.datepicker .calendar .calendar-body .calendar-date,.datepicker .calendar .calendar-header .calendar-date{-webkit-box-flex:0;-ms-flex:0 0 14.28%;flex:0 0 14.28%;max-width:14.28%}.datepicker .calendar .calendar-header{padding:1em 1em 0 1em;background:0 0;color:#fff;font-size:.75rem}.datepicker .calendar .calendar-header .calendar-date{color:#b5b5b5}.datepicker .calendar .calendar-body{padding:0 1em 1em 1em;color:#7a7a7a}.datepicker .calendar .calendar-date{border:0;padding:.4rem 0}.datepicker .calendar .calendar-date .date-item{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:.1rem solid transparent;border-radius:100%;color:#4a4a4a;cursor:pointer;height:2.2rem;line-height:1.4rem;outline:0;padding:.3rem;position:relative;text-align:center;text-decoration:none;-webkit-transition:all .2s ease;transition:all .2s ease;vertical-align:middle;white-space:nowrap;width:2.2rem}.datepicker .calendar .calendar-date .date-item.is-today{background:0 0;border-color:#00d1b2;color:#00d1b2}.datepicker .calendar .calendar-date .date-item:focus{background:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7);text-decoration:none}.datepicker .calendar .calendar-date .date-item:hover{background:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7);text-decoration:none}.datepicker .calendar .calendar-date .date-item.is-active{background:#00d1b2;border-color:#00d1b2;color:#fff}.datepicker .calendar .calendar-date.is-disabled .calendar-event,.datepicker .calendar .calendar-date.is-disabled .date-item,.datepicker .calendar .calendar-date[disabled] .calendar-event,.datepicker .calendar .calendar-date[disabled] .date-item{cursor:default;opacity:.25;pointer-events:none}.datepicker .calendar .calendar-range{position:relative}.datepicker .calendar .calendar-range::before{background:#d1fff8;content:"";height:2.2rem;left:0;position:absolute;right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.datepicker .calendar .calendar-range.calendar-range-start::before{left:50%}.datepicker .calendar .calendar-range.calendar-range-end::before{right:50%}.datepicker .calendar .calendar-range .date-item{color:#00d1b2}.datepicker .calendar.is-large{max-width:100%}.datepicker .calendar.is-large .calendar-body .calendar-date{border-bottom:none;border-right:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:11rem;padding:0}.datepicker .calendar.is-large .calendar-body .calendar-date:nth-child(7n){border-right:0}.datepicker .calendar.is-large .calendar-body .calendar-date:nth-last-child(-n+7){border-bottom:0}.datepicker .calendar.is-large .date-item{-ms-flex-item-align:end;align-self:flex-end;height:2.2rem;margin-right:.5rem;margin-top:.5rem}.datepicker .calendar.is-large .calendar-range::before{top:1.9rem}.datepicker .calendar.is-large .calendar-range.calendar-range-start::before{left:auto;width:1.9rem}.datepicker .calendar.is-large .calendar-range.calendar-range-end::before{right:1.9rem}.datepicker .calendar.is-large .calendar-events{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;line-height:1;overflow-y:auto;padding:.5rem}.datepicker .calendar.is-large .calendar-event{background-color:#7a7a7a;border-radius:2px;color:#fff;display:block;font-size:1rem;margin:.2rem auto;overflow:hidden;padding:.3rem .4rem;text-align:left;text-overflow:ellipsis;vertical-align:baseline;white-space:nowrap}.datepicker .calendar.is-large .calendar-event.is-white{background-color:#fff;color:#0a0a0a}.datepicker .calendar.is-large .calendar-event.is-black{background-color:#0a0a0a;color:#fff}.datepicker .calendar.is-large .calendar-event.is-light{background-color:#f5f5f5;color:#363636}.datepicker .calendar.is-large .calendar-event.is-dark{background-color:#363636;color:#f5f5f5}.datepicker .calendar.is-large .calendar-event.is-primary{background-color:#00d1b2;color:#fff}.datepicker .calendar.is-large .calendar-event.is-link{background-color:#3273dc;color:#fff}.datepicker .calendar.is-large .calendar-event.is-info{background-color:#209cee;color:#fff}.datepicker .calendar.is-large .calendar-event.is-success{background-color:#23d160;color:#fff}.datepicker .calendar.is-large .calendar-event.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.datepicker .calendar.is-large .calendar-event.is-danger{background-color:#ff3860;color:#fff}.calendar{background:#fff;border:none;border-radius:2px;display:block;min-width:20rem;text-align:center;max-width:20rem}.calendar.is-active{display:initial}.calendar .calendar-nav{background:#00d1b2;color:#fff;border-top-left-radius:2px;border-top-right-radius:2px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:1.25rem;padding:.5em}.calendar .calendar-nav .calendar-nav-day,.calendar .calendar-nav .calendar-nav-month,.calendar .calendar-nav .calendar-nav-year{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.calendar .calendar-nav .calendar-day,.calendar .calendar-nav .calendar-month,.calendar .calendar-nav .calendar-year{-webkit-box-flex:1;-ms-flex:1;flex:1}.calendar .calendar-nav .calendar-month{font-size:1.5rem}.calendar .calendar-nav .calendar-day{font-size:2.5rem}.calendar .calendar-nav .calendar-nav-next-month,.calendar .calendar-nav .calendar-nav-next-year,.calendar .calendar-nav .calendar-nav-previous-month,.calendar .calendar-nav .calendar-nav-previous-year{-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-decoration:none;color:#fff}.calendar .calendar-nav .calendar-nav-next-month:hover,.calendar .calendar-nav .calendar-nav-next-year:hover,.calendar .calendar-nav .calendar-nav-previous-month:hover,.calendar .calendar-nav .calendar-nav-previous-year:hover{background-color:transparent}.calendar .calendar-nav .calendar-nav-next-month:hover svg,.calendar .calendar-nav .calendar-nav-next-year:hover svg,.calendar .calendar-nav .calendar-nav-previous-month:hover svg,.calendar .calendar-nav .calendar-nav-previous-year:hover svg{stroke-width:1em}.calendar .calendar-nav .calendar-nav-next-month svg,.calendar .calendar-nav .calendar-nav-next-year svg,.calendar .calendar-nav .calendar-nav-previous-month svg,.calendar .calendar-nav .calendar-nav-previous-year svg{stroke:currentColor;width:11.25px;height:18px}.calendar .calendar-body,.calendar .calendar-header{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.calendar .calendar-body .calendar-date,.calendar .calendar-header .calendar-date{-webkit-box-flex:0;-ms-flex:0 0 14.28%;flex:0 0 14.28%;max-width:14.28%}.calendar .calendar-header{padding:1em 1em 0 1em;background:0 0;color:#fff;font-size:.75rem}.calendar .calendar-header .calendar-date{color:#b5b5b5}.calendar .calendar-body{padding:0 1em 1em 1em;color:#7a7a7a}.calendar .calendar-date{border:0;padding:.4rem 0}.calendar .calendar-date .date-item{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:.1rem solid transparent;border-radius:100%;color:#4a4a4a;cursor:pointer;height:2.2rem;line-height:1.4rem;outline:0;padding:.3rem;position:relative;text-align:center;text-decoration:none;-webkit-transition:all .2s ease;transition:all .2s ease;vertical-align:middle;white-space:nowrap;width:2.2rem}.calendar .calendar-date .date-item.is-today{background:0 0;border-color:#00d1b2;color:#00d1b2}.calendar .calendar-date .date-item:focus{background:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7);text-decoration:none}.calendar .calendar-date .date-item:hover{background:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7);text-decoration:none}.calendar .calendar-date .date-item.is-active{background:#00d1b2;border-color:#00d1b2;color:#fff}.calendar .calendar-date.is-disabled .calendar-event,.calendar .calendar-date.is-disabled .date-item,.calendar .calendar-date[disabled] .calendar-event,.calendar .calendar-date[disabled] .date-item{cursor:default;opacity:.25;pointer-events:none}.calendar .calendar-range{position:relative}.calendar .calendar-range::before{background:#d1fff8;content:"";height:2.2rem;left:0;position:absolute;right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.calendar .calendar-range.calendar-range-start::before{left:50%}.calendar .calendar-range.calendar-range-end::before{right:50%}.calendar .calendar-range .date-item{color:#00d1b2}.calendar.is-large{max-width:100%}.calendar.is-large .calendar-body .calendar-date{border-bottom:none;border-right:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:11rem;padding:0}.calendar.is-large .calendar-body .calendar-date:nth-child(7n){border-right:0}.calendar.is-large .calendar-body .calendar-date:nth-last-child(-n+7){border-bottom:0}.calendar.is-large .date-item{-ms-flex-item-align:end;align-self:flex-end;height:2.2rem;margin-right:.5rem;margin-top:.5rem}.calendar.is-large .calendar-range::before{top:1.9rem}.calendar.is-large .calendar-range.calendar-range-start::before{left:auto;width:1.9rem}.calendar.is-large .calendar-range.calendar-range-end::before{right:1.9rem}.calendar.is-large .calendar-events{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;line-height:1;overflow-y:auto;padding:.5rem}.calendar.is-large .calendar-event{background-color:#7a7a7a;border-radius:2px;color:#fff;display:block;font-size:1rem;margin:.2rem auto;overflow:hidden;padding:.3rem .4rem;text-align:left;text-overflow:ellipsis;vertical-align:baseline;white-space:nowrap}.calendar.is-large .calendar-event.is-white{background-color:#fff;color:#0a0a0a}.calendar.is-large .calendar-event.is-black{background-color:#0a0a0a;color:#fff}.calendar.is-large .calendar-event.is-light{background-color:#f5f5f5;color:#363636}.calendar.is-large .calendar-event.is-dark{background-color:#363636;color:#f5f5f5}.calendar.is-large .calendar-event.is-primary{background-color:#00d1b2;color:#fff}.calendar.is-large .calendar-event.is-link{background-color:#3273dc;color:#fff}.calendar.is-large .calendar-event.is-info{background-color:#209cee;color:#fff}.calendar.is-large .calendar-event.is-success{background-color:#23d160;color:#fff}.calendar.is-large .calendar-event.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.calendar.is-large .calendar-event.is-danger{background-color:#ff3860;color:#fff}
\ No newline at end of file
diff --git a/resources/public/index.html b/resources/public/index.html
index cc2e89e4..93ed9c7c 100644
--- a/resources/public/index.html
+++ b/resources/public/index.html
@@ -8,6 +8,7 @@
+