diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..5d35cab --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,89 @@ +env: + browser: true + es2021: true +extends: + - 'eslint:recommended' + - 'plugin:@typescript-eslint/recommended' +parser: '@typescript-eslint/parser' +parserOptions: + ecmaVersion: 12 + sourceType: module +plugins: + - '@typescript-eslint' + - react +rules: + "@typescript-eslint/ban-ts-comment": off + "@typescript-eslint/no-empty-function": off + indent: + - error + - 4 + - SwitchCase: 1 + linebreak-style: + - error + - unix + quotes: + - error + - double + semi: + - error + - never + react/jsx-pascal-case: error + react/jsx-closing-bracket-location: error + react/jsx-closing-tag-location: error + no-multi-spaces: error + react/jsx-tag-spacing: error + react/jsx-boolean-value: error + react/jsx-wrap-multilines: error + react/self-closing-comp: error + prefer-const: error + no-const-assign: error + no-var: error + array-callback-return: error + prefer-template: error + template-curly-spacing: error + no-useless-escape: error + wrap-iife: error + no-loop-func: error + default-param-last: error + space-before-function-paren: + - error + - never + space-before-blocks: error + no-param-reassign: error + function-paren-newline: error + comma-dangle: + - error + - always-multiline + arrow-spacing: error + arrow-parens: error + arrow-body-style: error + no-confusing-arrow: error + implicit-arrow-linebreak: error + no-duplicate-imports: error + object-curly-newline: error + dot-notation: error + one-var: + - error + - never + no-multi-assign: error + no-plusplus: error + operator-linebreak: error + eqeqeq: error + no-case-declarations: error + no-nested-ternary: error + no-unneeded-ternary: error + no-mixed-operators: error + nonblock-statement-body-position: error + brace-style: error + keyword-spacing: error + space-infix-ops: error + eol-last: error + newline-per-chained-call: error + no-whitespace-before-property: error + space-in-parens: error + array-bracket-spacing: error + key-spacing: error + no-trailing-spaces: error + comma-style: error + radix: error + no-new-wrappers: error diff --git a/package.json b/package.json index 6f9019b..27fa25e 100755 --- a/package.json +++ b/package.json @@ -5,7 +5,11 @@ "devDependencies": { "@types/jest": "26.0.20", "@types/node": "14.14.20", + "@typescript-eslint/eslint-plugin": "^4.19.0", + "@typescript-eslint/parser": "^4.19.0", "aphrodite": "^2.4.0", + "eslint": "^7.22.0", + "eslint-plugin-react": "^7.23.1", "normalize.css": "^8.0.1", "solid-js": "^0.23.11", "solid-scripts": "0.0.50", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 269ee1a..8707532 100755 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,7 +3,11 @@ dependencies: devDependencies: '@types/jest': 26.0.20 '@types/node': 14.14.20 + '@typescript-eslint/eslint-plugin': 4.19.0_dd8049005b20625afbdfeb351963a396 + '@typescript-eslint/parser': 4.19.0_eslint@7.22.0+typescript@4.1.3 aphrodite: 2.4.0 + eslint: 7.22.0 + eslint-plugin-react: 7.23.1_eslint@7.22.0 normalize.css: 8.0.1 solid-js: 0.23.11 solid-scripts: 0.0.50 @@ -1010,6 +1014,22 @@ packages: dev: true resolution: integrity: sha512-kUlWZHQkll+lOlYdj7dg8XwziO9WALkfG2dAXLITZMB8gO99CXQBH5W/HleXC3YwWFWXVxe1UClMk/2qsB9oAw== + /@eslint/eslintrc/0.4.0: + dependencies: + ajv: 6.12.6 + debug: 4.3.1 + espree: 7.3.1 + globals: 12.4.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + minimatch: 3.0.4 + strip-json-comments: 3.1.1 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== /@hapi/address/2.1.4: deprecated: Moved to 'npm install @sideway/address' dev: true @@ -1251,12 +1271,36 @@ packages: node: '>=4' resolution: integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + /@nodelib/fs.scandir/2.1.4: + dependencies: + '@nodelib/fs.stat': 2.0.4 + run-parallel: 1.2.0 + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== /@nodelib/fs.stat/1.1.3: dev: true engines: node: '>= 6' resolution: integrity: sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + /@nodelib/fs.stat/2.0.4: + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + /@nodelib/fs.walk/1.2.6: + dependencies: + '@nodelib/fs.scandir': 2.1.4 + fastq: 1.11.0 + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== /@sinonjs/commons/1.8.2: dependencies: type-detect: 4.0.8 @@ -1338,6 +1382,10 @@ packages: dev: true resolution: integrity: sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + /@types/json-schema/7.0.7: + dev: true + resolution: + integrity: sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== /@types/minimatch/3.0.3: dev: true resolution: @@ -1376,6 +1424,111 @@ packages: dev: true resolution: integrity: sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw== + /@typescript-eslint/eslint-plugin/4.19.0_dd8049005b20625afbdfeb351963a396: + dependencies: + '@typescript-eslint/experimental-utils': 4.19.0_eslint@7.22.0+typescript@4.1.3 + '@typescript-eslint/parser': 4.19.0_eslint@7.22.0+typescript@4.1.3 + '@typescript-eslint/scope-manager': 4.19.0 + debug: 4.3.1 + eslint: 7.22.0 + functional-red-black-tree: 1.0.1 + lodash: 4.17.21 + regexpp: 3.1.0 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.1.3 + typescript: 4.1.3 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + '@typescript-eslint/parser': ^4.0.0 + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + resolution: + integrity: sha512-CRQNQ0mC2Pa7VLwKFbrGVTArfdVDdefS+gTw0oC98vSI98IX5A8EVH4BzJ2FOB0YlCmm8Im36Elad/Jgtvveaw== + /@typescript-eslint/experimental-utils/4.19.0_eslint@7.22.0+typescript@4.1.3: + dependencies: + '@types/json-schema': 7.0.7 + '@typescript-eslint/scope-manager': 4.19.0 + '@typescript-eslint/types': 4.19.0 + '@typescript-eslint/typescript-estree': 4.19.0_typescript@4.1.3 + eslint: 7.22.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + eslint: '*' + typescript: '*' + resolution: + integrity: sha512-9/23F1nnyzbHKuoTqFN1iXwN3bvOm/PRIXSBR3qFAYotK/0LveEOHr5JT1WZSzcD6BESl8kPOG3OoDRKO84bHA== + /@typescript-eslint/parser/4.19.0_eslint@7.22.0+typescript@4.1.3: + dependencies: + '@typescript-eslint/scope-manager': 4.19.0 + '@typescript-eslint/types': 4.19.0 + '@typescript-eslint/typescript-estree': 4.19.0_typescript@4.1.3 + debug: 4.3.1 + eslint: 7.22.0 + typescript: 4.1.3 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + resolution: + integrity: sha512-/uabZjo2ZZhm66rdAu21HA8nQebl3lAIDcybUoOxoI7VbZBYavLIwtOOmykKCJy+Xq6Vw6ugkiwn8Js7D6wieA== + /@typescript-eslint/scope-manager/4.19.0: + dependencies: + '@typescript-eslint/types': 4.19.0 + '@typescript-eslint/visitor-keys': 4.19.0 + dev: true + engines: + node: ^8.10.0 || ^10.13.0 || >=11.10.1 + resolution: + integrity: sha512-GGy4Ba/hLXwJXygkXqMzduqOMc+Na6LrJTZXJWVhRrSuZeXmu8TAnniQVKgj8uTRKe4igO2ysYzH+Np879G75g== + /@typescript-eslint/types/4.19.0: + dev: true + engines: + node: ^8.10.0 || ^10.13.0 || >=11.10.1 + resolution: + integrity: sha512-A4iAlexVvd4IBsSTNxdvdepW0D4uR/fwxDrKUa+iEY9UWvGREu2ZyB8ylTENM1SH8F7bVC9ac9+si3LWNxcBuA== + /@typescript-eslint/typescript-estree/4.19.0_typescript@4.1.3: + dependencies: + '@typescript-eslint/types': 4.19.0 + '@typescript-eslint/visitor-keys': 4.19.0 + debug: 4.3.1 + globby: 11.0.3 + is-glob: 4.0.1 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.1.3 + typescript: 4.1.3 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + resolution: + integrity: sha512-3xqArJ/A62smaQYRv2ZFyTA+XxGGWmlDYrsfZG68zJeNbeqRScnhf81rUVa6QG4UgzHnXw5VnMT5cg75dQGDkA== + /@typescript-eslint/visitor-keys/4.19.0: + dependencies: + '@typescript-eslint/types': 4.19.0 + eslint-visitor-keys: 2.0.0 + dev: true + engines: + node: ^8.10.0 || ^10.13.0 || >=11.10.1 + resolution: + integrity: sha512-aGPS6kz//j7XLSlgpzU2SeTqHPsmRYxFztj2vPuMMFJXZudpRSehE3WCV+BaxwZFvfAqMoSd86TEuM0PQ59E/A== /@webassemblyjs/ast/1.9.0: dependencies: '@webassemblyjs/helper-module-context': 1.9.0 @@ -1531,6 +1684,14 @@ packages: dev: true resolution: integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + /acorn-jsx/5.3.1_acorn@7.4.1: + dependencies: + acorn: 7.4.1 + dev: true + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + resolution: + integrity: sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== /acorn-walk/7.2.0: dev: true engines: @@ -1591,6 +1752,15 @@ packages: dev: true resolution: integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + /ajv/7.2.3: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + resolution: + integrity: sha512-idv5WZvKVXDqKralOImQgPM9v6WOdLNa0IY3B3doOjw/YxRGT8I+allIJ6kd7Uaj+SF1xZUSU+nPM5aDNBVtnw== /alphanum-sort/1.0.2: dev: true resolution: @@ -1601,6 +1771,12 @@ packages: node: '>=6' resolution: integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + /ansi-colors/4.1.1: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== /ansi-escapes/3.2.0: dev: true engines: @@ -1728,6 +1904,18 @@ packages: dev: true resolution: integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + /array-includes/3.1.3: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + get-intrinsic: 1.1.1 + is-string: 1.0.5 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== /array-union/1.0.2: dependencies: array-uniq: 1.0.3 @@ -1736,6 +1924,12 @@ packages: node: '>=0.10.0' resolution: integrity: sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + /array-union/2.1.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== /array-uniq/1.0.3: dev: true engines: @@ -1748,6 +1942,17 @@ packages: node: '>=0.10.0' resolution: integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + /array.prototype.flatmap/1.2.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + function-bind: 1.1.1 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== /arrify/1.0.1: dev: true engines: @@ -1792,6 +1997,12 @@ packages: node: '>=0.10.0' resolution: integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + /astral-regex/2.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== /async-each/1.0.3: dev: true resolution: @@ -2319,7 +2530,7 @@ packages: /call-bind/1.0.2: dependencies: function-bind: 1.1.1 - get-intrinsic: 1.0.2 + get-intrinsic: 1.1.1 dev: true resolution: integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -3335,6 +3546,14 @@ packages: node: '>=4' resolution: integrity: sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + /dir-glob/3.0.1: + dependencies: + path-type: 4.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== /dns-equal/1.0.0: dev: true resolution: @@ -3352,6 +3571,22 @@ packages: dev: true resolution: integrity: sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + /doctrine/2.1.0: + dependencies: + esutils: 2.0.3 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + /doctrine/3.0.0: + dependencies: + esutils: 2.0.3 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== /dom-converter/0.2.0: dependencies: utila: 0.4.0 @@ -3507,6 +3742,14 @@ packages: node: '>=6.9.0' resolution: integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + /enquirer/2.3.6: + dependencies: + ansi-colors: 4.1.1 + dev: true + engines: + node: '>=8.6' + resolution: + integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== /entities/1.1.2: dev: true resolution: @@ -3546,6 +3789,29 @@ packages: node: '>= 0.4' resolution: integrity: sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== + /es-abstract/1.18.0: + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + is-callable: 1.2.3 + is-negative-zero: 2.0.1 + is-regex: 1.1.2 + is-string: 1.0.5 + object-inspect: 1.9.0 + object-keys: 1.1.1 + object.assign: 4.1.2 + string.prototype.trimend: 1.0.4 + string.prototype.trimstart: 1.0.4 + unbox-primitive: 1.0.1 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== /es-abstract/1.18.0-next.1: dependencies: es-to-primitive: 1.2.1 @@ -3567,7 +3833,7 @@ packages: integrity: sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== /es-to-primitive/1.2.1: dependencies: - is-callable: 1.2.2 + is-callable: 1.2.3 is-date-object: 1.0.2 is-symbol: 1.0.3 dev: true @@ -3611,6 +3877,28 @@ packages: source-map: 0.6.1 resolution: integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + /eslint-plugin-react/7.23.1_eslint@7.22.0: + dependencies: + array-includes: 3.1.3 + array.prototype.flatmap: 1.2.4 + doctrine: 2.1.0 + eslint: 7.22.0 + has: 1.0.3 + jsx-ast-utils: 3.2.0 + minimatch: 3.0.4 + object.entries: 1.1.3 + object.fromentries: 2.0.4 + object.values: 1.1.3 + prop-types: 15.7.2 + resolve: 2.0.0-next.3 + string.prototype.matchall: 4.0.4 + dev: true + engines: + node: '>=4' + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 + resolution: + integrity: sha512-MvFGhZjI8Z4HusajmSw0ougGrq3Gs4vT/0WgwksZgf5RrLrRa2oYAw56okU4tZJl8+j7IYNuTM+2RnFEuTSdRQ== /eslint-scope/4.0.3: dependencies: esrecurse: 4.3.0 @@ -3620,6 +3908,90 @@ packages: node: '>=4.0.0' resolution: integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + /eslint-scope/5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + engines: + node: '>=8.0.0' + resolution: + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + /eslint-utils/2.1.0: + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + /eslint-visitor-keys/1.3.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + /eslint-visitor-keys/2.0.0: + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + /eslint/7.22.0: + dependencies: + '@babel/code-frame': 7.12.11 + '@eslint/eslintrc': 0.4.0 + ajv: 6.12.6 + chalk: 4.1.0 + cross-spawn: 7.0.3 + debug: 4.3.1 + doctrine: 3.0.0 + enquirer: 2.3.6 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.0.0 + espree: 7.3.1 + esquery: 1.4.0 + esutils: 2.0.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 13.7.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.1 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash: 4.17.21 + minimatch: 3.0.4 + natural-compare: 1.4.0 + optionator: 0.9.1 + progress: 2.0.3 + regexpp: 3.1.0 + semver: 7.3.5 + strip-ansi: 6.0.0 + strip-json-comments: 3.1.1 + table: 6.0.7 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + hasBin: true + resolution: + integrity: sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg== + /espree/7.3.1: + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.1_acorn@7.4.1 + eslint-visitor-keys: 1.3.0 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== /esprima/4.0.1: dev: true engines: @@ -3627,6 +3999,14 @@ packages: hasBin: true resolution: integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + /esquery/1.4.0: + dependencies: + estraverse: 5.2.0 + dev: true + engines: + node: '>=0.10' + resolution: + integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== /esrecurse/4.3.0: dependencies: estraverse: 5.2.0 @@ -3871,6 +4251,19 @@ packages: node: '>=4.0.0' resolution: integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + /fast-glob/3.2.5: + dependencies: + '@nodelib/fs.stat': 2.0.4 + '@nodelib/fs.walk': 1.2.6 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.2 + picomatch: 2.2.2 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== /fast-json-stable-stringify/2.1.0: dev: true resolution: @@ -3879,6 +4272,12 @@ packages: dev: true resolution: integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + /fastq/1.11.0: + dependencies: + reusify: 1.0.4 + dev: true + resolution: + integrity: sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== /faye-websocket/0.11.3: dependencies: websocket-driver: 0.7.4 @@ -3905,6 +4304,14 @@ packages: node: '>=4' resolution: integrity: sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + /file-entry-cache/6.0.1: + dependencies: + flat-cache: 3.0.4 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== /file-loader/3.0.1_webpack@4.46.0: dependencies: loader-utils: 1.4.0 @@ -4006,6 +4413,19 @@ packages: node: '>=8' resolution: integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + /flat-cache/3.0.4: + dependencies: + flatted: 3.1.1 + rimraf: 3.0.2 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + /flatted/3.1.1: + dev: true + resolution: + integrity: sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== /flatten/1.0.3: dev: true resolution: @@ -4170,6 +4590,10 @@ packages: dev: true resolution: integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + /functional-red-black-tree/1.0.1: + dev: true + resolution: + integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= /gensync/1.0.0-beta.2: dev: true engines: @@ -4182,14 +4606,14 @@ packages: node: 6.* || 8.* || >= 10.* resolution: integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - /get-intrinsic/1.0.2: + /get-intrinsic/1.1.1: dependencies: function-bind: 1.1.1 has: 1.0.3 - has-symbols: 1.0.1 + has-symbols: 1.0.2 dev: true resolution: - integrity: sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== + integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== /get-own-enumerable-property-symbols/3.0.2: dev: true resolution: @@ -4244,6 +4668,14 @@ packages: optional: true resolution: integrity: sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + /glob-parent/5.1.2: + dependencies: + is-glob: 4.0.1 + dev: true + engines: + node: '>= 6' + resolution: + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== /glob-to-regexp/0.3.0: dev: true resolution: @@ -4283,6 +4715,35 @@ packages: node: '>=4' resolution: integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + /globals/12.4.0: + dependencies: + type-fest: 0.8.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + /globals/13.7.0: + dependencies: + type-fest: 0.20.2 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA== + /globby/11.0.3: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.5 + ignore: 5.1.8 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== /globby/6.1.0: dependencies: array-union: 1.0.2 @@ -4355,6 +4816,10 @@ packages: node: '>=0.10.0' resolution: integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + /has-bigints/1.0.1: + dev: true + resolution: + integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== /has-flag/3.0.0: dev: true engines: @@ -4373,6 +4838,12 @@ packages: node: '>= 0.4' resolution: integrity: sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + /has-symbols/1.0.2: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== /has-value/0.3.1: dependencies: get-value: 2.0.6 @@ -4658,6 +5129,18 @@ packages: dev: true resolution: integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + /ignore/4.0.6: + dev: true + engines: + node: '>= 4' + resolution: + integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + /ignore/5.1.8: + dev: true + engines: + node: '>= 4' + resolution: + integrity: sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== /immer/1.10.0: dev: true resolution: @@ -4778,6 +5261,16 @@ packages: node: '>=6' resolution: integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + /internal-slot/1.0.3: + dependencies: + get-intrinsic: 1.1.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== /ip-regex/2.1.0: dev: true engines: @@ -4838,6 +5331,10 @@ packages: dev: true resolution: integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + /is-bigint/1.0.1: + dev: true + resolution: + integrity: sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== /is-binary-path/1.0.1: dependencies: binary-extensions: 1.13.1 @@ -4855,6 +5352,14 @@ packages: optional: true resolution: integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + /is-boolean-object/1.1.0: + dependencies: + call-bind: 1.0.2 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== /is-buffer/1.1.6: dev: true resolution: @@ -4865,6 +5370,12 @@ packages: node: '>= 0.4' resolution: integrity: sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + /is-callable/1.2.3: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== /is-ci/2.0.0: dependencies: ci-info: 2.0.0 @@ -5004,6 +5515,12 @@ packages: node: '>= 0.4' resolution: integrity: sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + /is-number-object/1.0.4: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== /is-number/3.0.0: dependencies: kind-of: 3.2.2 @@ -5078,6 +5595,15 @@ packages: node: '>= 0.4' resolution: integrity: sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + /is-regex/1.1.2: + dependencies: + call-bind: 1.0.2 + has-symbols: 1.0.2 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== /is-regexp/1.0.0: dev: true engines: @@ -5106,6 +5632,12 @@ packages: node: '>=8' resolution: integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + /is-string/1.0.5: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== /is-svg/3.0.0: dependencies: html-comment-regex: 1.1.2 @@ -5116,7 +5648,7 @@ packages: integrity: sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== /is-symbol/1.0.3: dependencies: - has-symbols: 1.0.1 + has-symbols: 1.0.2 dev: true engines: node: '>= 0.4' @@ -5742,10 +6274,18 @@ packages: dev: true resolution: integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + /json-schema-traverse/1.0.0: + dev: true + resolution: + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== /json-schema/0.2.3: dev: true resolution: integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + /json-stable-stringify-without-jsonify/1.0.1: + dev: true + resolution: + integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= /json-stable-stringify/1.0.1: dependencies: jsonify: 0.0.0 @@ -5805,6 +6345,15 @@ packages: '0': node >=0.6.0 resolution: integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + /jsx-ast-utils/3.2.0: + dependencies: + array-includes: 3.1.3 + object.assign: 4.1.2 + dev: true + engines: + node: '>=4.0' + resolution: + integrity: sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== /killable/1.0.1: dev: true resolution: @@ -5871,6 +6420,15 @@ packages: node: '>= 0.8.0' resolution: integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + /levn/0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== /lines-and-columns/1.1.6: dev: true resolution: @@ -5970,12 +6528,23 @@ packages: dev: true resolution: integrity: sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + /lodash/4.17.21: + dev: true + resolution: + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== /loglevel/1.7.1: dev: true engines: node: '>= 0.6.0' resolution: integrity: sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + /loose-envify/1.4.0: + dependencies: + js-tokens: 4.0.0 + dev: true + hasBin: true + resolution: + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== /lower-case/1.1.4: dev: true resolution: @@ -6541,7 +7110,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - has-symbols: 1.0.1 + has-symbols: 1.0.2 object-keys: 1.1.1 dev: true engines: @@ -6552,13 +7121,24 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.18.0-next.1 + es-abstract: 1.18.0 has: 1.0.3 dev: true engines: node: '>= 0.4' resolution: integrity: sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== + /object.fromentries/2.0.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + has: 1.0.3 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== /object.getownpropertydescriptors/2.1.1: dependencies: call-bind: 1.0.2 @@ -6588,6 +7168,17 @@ packages: node: '>= 0.4' resolution: integrity: sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== + /object.values/1.1.3: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + has: 1.0.3 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== /obuf/1.1.2: dev: true resolution: @@ -6667,6 +7258,19 @@ packages: node: '>= 0.8.0' resolution: integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + /optionator/0.9.1: + dependencies: + deep-is: 0.1.3 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== /original/1.0.2: dependencies: url-parse: 1.4.7 @@ -7725,6 +8329,12 @@ packages: node: '>= 0.8.0' resolution: integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + /prelude-ls/1.2.1: + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== /prepend-http/1.0.4: dev: true engines: @@ -7765,6 +8375,12 @@ packages: node: '>= 0.6.0' resolution: integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + /progress/2.0.3: + dev: true + engines: + node: '>=0.4.0' + resolution: + integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== /promise-inflight/1.0.1: dev: true resolution: @@ -7784,6 +8400,14 @@ packages: node: '>= 6' resolution: integrity: sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + /prop-types/15.7.2: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + resolution: + integrity: sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== /proxy-addr/2.0.6: dependencies: forwarded: 0.1.2 @@ -7892,6 +8516,10 @@ packages: dev: true resolution: integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + /queue-microtask/1.2.3: + dev: true + resolution: + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== /raf/3.4.1: dependencies: performance-now: 2.1.0 @@ -7977,6 +8605,10 @@ packages: dev: true resolution: integrity: sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw== + /react-is/16.13.1: + dev: true + resolution: + integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== /react-is/17.0.1: dev: true resolution: @@ -8095,6 +8727,21 @@ packages: node: '>= 0.4' resolution: integrity: sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + /regexp.prototype.flags/1.3.1: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + /regexpp/3.1.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== /regexpu-core/4.7.1: dependencies: regenerate: 1.4.2 @@ -8210,6 +8857,12 @@ packages: node: '>=0.10.0' resolution: integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + /require-from-string/2.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== /require-main-filename/2.0.0: dev: true resolution: @@ -8264,6 +8917,13 @@ packages: dev: true resolution: integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + /resolve/2.0.0-next.3: + dependencies: + is-core-module: 2.2.0 + path-parse: 1.0.6 + dev: true + resolution: + integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== /restore-cursor/2.0.0: dependencies: onetime: 2.0.1 @@ -8285,6 +8945,13 @@ packages: node: '>= 4' resolution: integrity: sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + /reusify/1.0.4: + dev: true + engines: + iojs: '>=1.0.0' + node: '>=0.10.0' + resolution: + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== /rgb-regex/1.0.1: dev: true resolution: @@ -8326,6 +8993,12 @@ packages: node: '>=0.12.0' resolution: integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + /run-parallel/1.2.0: + dependencies: + queue-microtask: 1.2.3 + dev: true + resolution: + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== /run-queue/1.0.3: dependencies: aproba: 1.2.0 @@ -8480,6 +9153,15 @@ packages: hasBin: true resolution: integrity: sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + /semver/7.3.5: + dependencies: + lru-cache: 6.0.0 + dev: true + engines: + node: '>=10' + hasBin: true + resolution: + integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== /send/0.17.1: dependencies: debug: 2.6.9 @@ -8611,6 +9293,14 @@ packages: optional: true resolution: integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + /side-channel/1.0.4: + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + object-inspect: 1.9.0 + dev: true + resolution: + integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== /signal-exit/3.0.3: dev: true resolution: @@ -8637,6 +9327,16 @@ packages: node: '>=8' resolution: integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + /slice-ansi/4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== /snapdragon-node/2.1.1: dependencies: define-property: 1.0.0 @@ -9003,6 +9703,28 @@ packages: node: '>=8' resolution: integrity: sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + /string-width/4.2.2: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + /string.prototype.matchall/4.0.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.18.0 + has-symbols: 1.0.2 + internal-slot: 1.0.3 + regexp.prototype.flags: 1.3.1 + side-channel: 1.0.4 + dev: true + resolution: + integrity: sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== /string.prototype.trimend/1.0.3: dependencies: call-bind: 1.0.2 @@ -9010,6 +9732,13 @@ packages: dev: true resolution: integrity: sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== + /string.prototype.trimend/1.0.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + resolution: + integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== /string.prototype.trimstart/1.0.3: dependencies: call-bind: 1.0.2 @@ -9017,6 +9746,13 @@ packages: dev: true resolution: integrity: sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + /string.prototype.trimstart/1.0.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + resolution: + integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== /string_decoder/1.1.1: dependencies: safe-buffer: 5.1.2 @@ -9098,6 +9834,12 @@ packages: node: '>=6' resolution: integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + /strip-json-comments/3.1.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== /style-loader/1.3.0_webpack@4.46.0: dependencies: loader-utils: 2.0.0 @@ -9184,6 +9926,17 @@ packages: dev: true resolution: integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + /table/6.0.7: + dependencies: + ajv: 7.2.3 + lodash: 4.17.21 + slice-ansi: 4.0.0 + string-width: 4.2.2 + dev: true + engines: + node: '>=10.0.0' + resolution: + integrity: sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== /tapable/1.1.3: dev: true engines: @@ -9394,6 +10147,17 @@ packages: dev: true resolution: integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + /tsutils/3.21.0_typescript@4.1.3: + dependencies: + tslib: 1.14.1 + typescript: 4.1.3 + dev: true + engines: + node: '>= 6' + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + resolution: + integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== /tty-browserify/0.0.0: dev: true resolution: @@ -9416,6 +10180,14 @@ packages: node: '>= 0.8.0' resolution: integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + /type-check/0.4.0: + dependencies: + prelude-ls: 1.2.1 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== /type-detect/4.0.8: dev: true engines: @@ -9428,6 +10200,12 @@ packages: node: '>=8' resolution: integrity: sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + /type-fest/0.20.2: + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== /type-fest/0.6.0: dev: true engines: @@ -9476,6 +10254,15 @@ packages: hasBin: true resolution: integrity: sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== + /unbox-primitive/1.0.1: + dependencies: + function-bind: 1.1.1 + has-bigints: 1.0.1 + has-symbols: 1.0.2 + which-boxed-primitive: 1.0.2 + dev: true + resolution: + integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== /unicode-canonical-property-names-ecmascript/1.0.4: dev: true engines: @@ -9683,6 +10470,10 @@ packages: optional: true resolution: integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + /v8-compile-cache/2.3.0: + dev: true + resolution: + integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== /v8-to-istanbul/7.1.0: dependencies: '@types/istanbul-lib-coverage': 2.0.3 @@ -9951,6 +10742,16 @@ packages: node: '>=10' resolution: integrity: sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== + /which-boxed-primitive/1.0.2: + dependencies: + is-bigint: 1.0.1 + is-boolean-object: 1.1.0 + is-number-object: 1.0.4 + is-string: 1.0.5 + is-symbol: 1.0.3 + dev: true + resolution: + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== /which-module/2.0.0: dev: true resolution: @@ -10251,7 +11052,11 @@ packages: specifiers: '@types/jest': 26.0.20 '@types/node': 14.14.20 + '@typescript-eslint/eslint-plugin': ^4.19.0 + '@typescript-eslint/parser': ^4.19.0 aphrodite: ^2.4.0 + eslint: ^7.22.0 + eslint-plugin-react: ^7.23.1 normalize.css: ^8.0.1 solid-js: ^0.23.11 solid-scripts: 0.0.50 diff --git a/src/App.tsx b/src/App.tsx index 813c8df..9374cfc 100755 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,43 +1,44 @@ -import { BarraSuperior } from "./BarraSuperior"; -import { ContenedorHorarios } from "./ContenedorHorarios/ContenedorHorarios"; -import { Wallpaper } from "./Wallpaper"; -import { Show, createSignal } from "solid-js"; -import { css } from "aphrodite"; -import { estilosGlobales } from "./Estilos"; -import { Creditos } from "./Creditos"; +import { BarraSuperior } from "./BarraSuperior" +import { ContenedorHorarios } from "./ContenedorHorarios/ContenedorHorarios" +import { Wallpaper } from "./Wallpaper" +import { Show, createSignal } from "solid-js" +import { css } from "aphrodite" +import { estilosGlobales } from "./Estilos" +import { Creditos } from "./Creditos" function App() { /// @ts-ignore - const soportaBackdropFilter = document.body.style.backdropFilter !== undefined; - const mostrarMensajeBackdropFilterRaw = localStorage.getItem("mensaje-backdrop-filter-oculto") !== undefined; + const soportaBackdropFilter = document.body.style.backdropFilter !== undefined + const mostrarMensajeBackdropFilterRaw = localStorage.getItem("mensaje-backdrop-filter-oculto") !== undefined - const [mostrarMensajeBackdropFilter, setMostrarMensaje] = createSignal(mostrarMensajeBackdropFilterRaw); + const [mostrarMensajeBackdropFilter, setMostrarMensaje] = createSignal(mostrarMensajeBackdropFilterRaw) const ocultarMensajeBackdropFilter = () => { - setMostrarMensaje(false); - localStorage.setItem("mensaje-backdrop-filter-oculto", "true"); - }; + setMostrarMensaje(false) + localStorage.setItem("mensaje-backdrop-filter-oculto", "true") + } return (
- - + +
Tu navegador no soporta "backdrop-filter". Este es solo un efecto visual, no afecta la funcionalidad de la página.  - No volver a mostrar.
-
- - +
+ +
- ); + ) } -export default App; +export default App diff --git a/src/BarraSuperior.tsx b/src/BarraSuperior.tsx index b0685b2..221c5ac 100755 --- a/src/BarraSuperior.tsx +++ b/src/BarraSuperior.tsx @@ -1,101 +1,107 @@ -import { estilosGlobales } from "./Estilos"; -import { StyleSheet, css } from "aphrodite"; -import { numWallpaper, setNumWallpaper } from "./Store"; +import { estilosGlobales } from "./Estilos" +import { StyleSheet, css } from "aphrodite" +import { numWallpaper, setNumWallpaper } from "./Store" -const totalWallpapers = 5; +const totalWallpapers = 5 const e = StyleSheet.create({ contCambiador: { - userSelect: "none" + userSelect: "none", }, boton: { cursor: "pointer", textDecoration: "underline", "::before": { fontSize: "1rem", - transform: "translateY(0.2rem)" - } + transform: "translateY(0.2rem)", + }, }, botonDesactivado: { cursor: "not-allowed", - textDecoration: "none" + textDecoration: "none", }, botonLeft: { paddingRight: "0.5rem", - marginRight: "0.25rem" + marginRight: "0.25rem", }, botonRight: { paddingLeft: "0.5rem", - marginRight: "0.25rem" - } -}); + marginRight: "0.25rem", + }, +}) const retrocederWallpaper = () => { - const num = numWallpaper(); + const num = numWallpaper() if (num > 0) { - setNumWallpaper(num - 1); - localStorage.setItem("num-img", (num - 1).toString()); + setNumWallpaper(num - 1) + localStorage.setItem("num-img", (num - 1).toString()) } else { - setNumWallpaper(totalWallpapers); - localStorage.setItem("num-img", (totalWallpapers).toString()); + setNumWallpaper(totalWallpapers) + localStorage.setItem("num-img", (totalWallpapers).toString()) } -}; +} const avanzarWallpaper = () => { - const num = numWallpaper(); + const num = numWallpaper() if (num < totalWallpapers) { - setNumWallpaper(num + 1); - localStorage.setItem("num-img", (num + 1).toString()); + setNumWallpaper(num + 1) + localStorage.setItem("num-img", (num + 1).toString()) } else { - setNumWallpaper(0); - localStorage.setItem("num-img", (0).toString()); + setNumWallpaper(0) + localStorage.setItem("num-img", (0).toString()) } -}; +} function CambiadorImg() { - return
- - - Img. {numWallpaper() + 1} - - -
; + return ( +
+ + + Img. {numWallpaper() + 1} + + +
+ ) } const estilos = StyleSheet.create({ tituloPrincipal: { - fontWeight: "bold" - } -}); + fontWeight: "bold", + }, +}) export function BarraSuperior() { - return
- - Horarios Unsa - - - GitHub - - - - 2021-A - Ingeniería de Sistemas -
; + return ( +
+ + Horarios Unsa + + + GitHub + + + + 2021-A + Ingeniería de Sistemas +
+ ) } diff --git a/src/ContenedorHorarios/BotonIcono.tsx b/src/ContenedorHorarios/BotonIcono.tsx index bc83dd2..e416db0 100644 --- a/src/ContenedorHorarios/BotonIcono.tsx +++ b/src/ContenedorHorarios/BotonIcono.tsx @@ -1,5 +1,5 @@ -import { css } from "aphrodite"; -import { estilosGlobales } from "../Estilos"; +import { css } from "aphrodite" +import { estilosGlobales } from "../Estilos" interface BotonMaxMinProps { icono: string, @@ -8,16 +8,18 @@ interface BotonMaxMinProps { } export function BotonIcono(props: BotonMaxMinProps) { - return
- -
+ return ( +
+ +
+ ) } diff --git a/src/ContenedorHorarios/BotonMaxMin.tsx b/src/ContenedorHorarios/BotonMaxMin.tsx index 5d9313a..f418ba5 100644 --- a/src/ContenedorHorarios/BotonMaxMin.tsx +++ b/src/ContenedorHorarios/BotonMaxMin.tsx @@ -1,6 +1,6 @@ -import { css } from "aphrodite"; -import { estilosGlobales } from "../Estilos"; -import { EstadoLayout } from "./ContenedorHorarios"; +import { css } from "aphrodite" +import { estilosGlobales } from "../Estilos" +import { EstadoLayout } from "./ContenedorHorarios" interface BotonMaxMinProps { fnMaximizar: () => void, @@ -10,30 +10,33 @@ interface BotonMaxMinProps { } export function BotonMaxMin(props: BotonMaxMinProps) { - const horariosMax = () => props.estadoActualLayout() === props.estadoLayoutMax; + const horariosMax = () => props.estadoActualLayout() === props.estadoLayoutMax - const tituloBoton = () => horariosMax() ? "Minimizar" : "Maximizar"; - const iconoBoton = () => horariosMax() ? "ph-arrows-in" : "ph-arrows-out"; + const tituloBoton = () => (horariosMax() ? "Minimizar" : "Maximizar") + const iconoBoton = () => (horariosMax() ? "ph-arrows-in" : "ph-arrows-out") const funcionBoton = () => { - const estaMaximizado = horariosMax(); + const estaMaximizado = horariosMax() if (estaMaximizado) { - props.fnMinimizar(); + props.fnMinimizar() } else { - props.fnMaximizar(); + props.fnMaximizar() } - }; + } - return
- -
+ return ( +
+ +
+ ) } diff --git a/src/ContenedorHorarios/ContenedorHorarios.tsx b/src/ContenedorHorarios/ContenedorHorarios.tsx index c0e0d16..a241270 100755 --- a/src/ContenedorHorarios/ContenedorHorarios.tsx +++ b/src/ContenedorHorarios/ContenedorHorarios.tsx @@ -1,7 +1,7 @@ -import YAML from "yaml"; -import { css, StyleSheet } from "aphrodite"; -import { MiHorario } from "./MiHorario"; -import { Horarios } from "./Horarios"; +import YAML from "yaml" +import { css, StyleSheet } from "aphrodite" +import { MiHorario } from "./MiHorario" +import { Horarios } from "./Horarios" import { Anios, Cursos, @@ -10,126 +10,131 @@ import { DatosHorario, DatosHorarioRaw, DatosGrupo, - ListaCursosUsuario -} from "../types/DatosHorario"; -import { estilosGlobales } from "../Estilos"; -import { batch, createEffect, createMemo, createSignal, createState, Show } from "solid-js"; -import { useListaCursos } from "./useListaCursos"; + ListaCursosUsuario, +} from "../types/DatosHorario" +import { estilosGlobales } from "../Estilos" +import { batch, createEffect, createMemo, createSignal, createState, Show } from "solid-js" +import { useListaCursos } from "./useListaCursos" -const datosPromise = (async () => { - const file = await fetch("/horarios/2020_2_fps_ingenieriadesistemas.yaml"); - const text = await file.text(); - const datosRaw = YAML.parse(text) as DatosHorarioRaw; +const datosPromise = (async() => { + const file = await fetch("/horarios/2020_2_fps_ingenieriadesistemas.yaml") + const text = await file.text() + const datosRaw = YAML.parse(text) as DatosHorarioRaw // Agregar los campos faltantes a DatosHorarioRaw para que sea DatosHorario const datos: DatosHorario = { ...datosRaw, - años: {} - }; + años: {}, + } const anios: Anios = {} for (const [nombreAnio, anio] of Object.entries(datosRaw.años)) { - const anioData: Cursos = {}; + const anioData: Cursos = {} for (const [nombreCurso, curso] of Object.entries(anio)) { - const gruposTeoria: { [k: string]: DatosGrupo } = {}; + const gruposTeoria: { [k: string]: DatosGrupo } = {} for (const [key, data] of Object.entries(curso.Teoria)) { - gruposTeoria[key] = Object.assign({seleccionado: false}, data); + gruposTeoria[key] = Object.assign({seleccionado: false}, data) } - const gruposLab: { [k: string]: DatosGrupo } = {}; + const gruposLab: { [k: string]: DatosGrupo } = {} for (const [key, data] of Object.entries(curso.Laboratorio ?? {})) { - gruposLab[key] = Object.assign({seleccionado: false}, data); + gruposLab[key] = Object.assign({seleccionado: false}, data) } anioData[nombreCurso] = { ...curso, oculto: false, Teoria: gruposTeoria, - Laboratorio: gruposLab - }; + Laboratorio: gruposLab, + } } - anios[nombreAnio] = anioData; + anios[nombreAnio] = anioData } - datos.años = anios; - return datos; -})(); + datos.años = anios + return datos +})() -const ElemCargando = () => +const ElemCargando = () => (
Recuperando horarios...
+) export type EstadoLayout = "MaxPersonal" | "Normal" | "MaxHorarios"; const { listaCursos: cursosUsuario, setListaCursos: setCursosUsuarios, - agregarCursoALista: agregarCursoUsuario -} = useListaCursos(); + agregarCursoALista: agregarCursoUsuario, +} = useListaCursos() export function ContenedorHorarios() { - const [datosCargados, setDatosCargados] = createSignal(false); - const [datos, setDatos] = createSignal(null); - const [estadoLayout, setEstadoLayout] = createSignal( - localStorage.getItem("estadoLayout") as EstadoLayout || "Normal" - ); + const [datosCargados, setDatosCargados] = createSignal(false) + const [datos, setDatos] = createSignal(null) + const [estadoLayout, setEstadoLayout] = ( + createSignal(localStorage.getItem("estadoLayout") as EstadoLayout || "Normal") + ) const e = createMemo(() => { - let templateColumns = ""; + let templateColumns = "" switch (estadoLayout()) { case "MaxHorarios": { - templateColumns = "4rem auto"; - break; + templateColumns = "4rem auto" + break } case "MaxPersonal": { - templateColumns = "auto 4rem"; - break; + templateColumns = "auto 4rem" + break } case "Normal": { templateColumns = "50% 50%" } } - localStorage.setItem("estadoLayout", estadoLayout()); + localStorage.setItem("estadoLayout", estadoLayout()) return StyleSheet.create({ contenedor: { display: "grid", - gridTemplateColumns: templateColumns - } - }); - }); + gridTemplateColumns: templateColumns, + }, + }) + }) - createEffect(async () => { - const datos = await datosPromise; + createEffect(async() => { + const datos = await datosPromise batch(() => { - setDatos(datos); - setDatosCargados(true); - }); - }); + setDatos(datos) + setDatosCargados(true) + }) + }) - return
-
- -
-
- - agregarCursoUsuario(JSON.parse(JSON.stringify(c)))} - listaCursosUsuario={cursosUsuario} - setCursosUsuarios={setCursosUsuarios} + return ( +
+
+ - +
+
+ + agregarCursoUsuario(JSON.parse(JSON.stringify(c)))} + listaCursosUsuario={cursosUsuario} + setCursosUsuarios={setCursosUsuarios} + /> + +
-
; + ) } diff --git a/src/ContenedorHorarios/CursosElem.tsx b/src/ContenedorHorarios/CursosElem.tsx index bb57baa..6b4b629 100755 --- a/src/ContenedorHorarios/CursosElem.tsx +++ b/src/ContenedorHorarios/CursosElem.tsx @@ -1,32 +1,32 @@ -import { Cursos, CursoRaw, DatosGrupo, ListaCursosUsuario, Curso } from "../types/DatosHorario"; -import { createEffect, createMemo, For, SetStateFunction } from "solid-js"; -import { StyleSheet, css } from "aphrodite"; -import { estilosGlobales } from "../Estilos"; +import { Cursos, CursoRaw, DatosGrupo, ListaCursosUsuario, Curso } from "../types/DatosHorario" +import { createEffect, createMemo, For, SetStateFunction } from "solid-js" +import { StyleSheet, css } from "aphrodite" +import { estilosGlobales } from "../Estilos" const e = StyleSheet.create({ inline: { - display: "inline-block" + display: "inline-block", }, lineaTexto: { - marginBottom: "0.5rem" + marginBottom: "0.5rem", }, tablaGrupos: { whiteSpace: "pre", borderCollapse: "collapse", - borderSpacing: 0 + borderSpacing: 0, }, contenedorCurso: { display: "inline-block", - verticalAlign: "top" + verticalAlign: "top", }, cursoOculto: { - display: "none" + display: "none", }, botonTexto: { padding: "0.25rem 0.35rem", - borderRadius: "5px" - } -}); + borderRadius: "5px", + }, +}) interface Props { dataAnio: Cursos, @@ -50,23 +50,30 @@ interface PropsIndicadorGrupo { } function IndicadorGrupo(props: PropsIndicadorGrupo) { - const id = `${props.idParcial}_${props.esLab ? 'L' : 'T'}_${props.nombre}`; - return props.setIdHover(id)} - onMouseLeave={() => props.setIdHover("")} - onClick={props.onClick} - > - {props.esLab ? "L" : ""}{props.nombre} - + const id = `${props.idParcial}_${props.esLab ? "L" : "T"}_${props.nombre}` + return ( + props.setIdHover(id)} + onMouseLeave={() => props.setIdHover("")} + onClick={props.onClick} + > + {props.esLab ? "L" : ""}{props.nombre} + + ) } -const agruparProfesores = (datos: { [k: string]: DatosGrupo }, indiceCurso: number, esLab: boolean, setCursosUsuarios: FnSetCursosUsuarios) => { - const profesores: { [k: string]: [string, () => void][] } = {}; +const agruparProfesores = ( + datos: { [k: string]: DatosGrupo }, + indiceCurso: number, + esLab: boolean, + setCursosUsuarios: FnSetCursosUsuarios, +) => { + const profesores: { [k: string]: [string, () => void][] } = {} for (const [grupo, datosGrupo] of Object.entries(datos)) { - const nombreProfesor = datosGrupo.Docente; + const nombreProfesor = datosGrupo.Docente if (!profesores[nombreProfesor]) { - profesores[nombreProfesor] = []; + profesores[nombreProfesor] = [] } profesores[nombreProfesor].push([ grupo, @@ -78,133 +85,136 @@ const agruparProfesores = (datos: { [k: string]: DatosGrupo }, indiceCurso: numb /// @ts-ignore grupo, "seleccionado", - x => !x - ); - } - ]); + (x) => !x, + ) + }, + ]) } - return profesores; -}; + return profesores +} export function CursosElem(props: Props) { - const anio = () => props.anioActual().substring(0, props.anioActual().indexOf(" ")); + const anio = () => props.anioActual().substring(0, props.anioActual().indexOf(" ")) const claseCursoNoAgregado = css( e.contenedorCurso, - estilosGlobales.contenedor - ); + estilosGlobales.contenedor, + ) const claseCursoAgregado = css( e.contenedorCurso, estilosGlobales.contenedor, !props.esCursoMiHorario && estilosGlobales.contenedorCursorActivo, - ); + ) - const claseCursoOculto = css(e.cursoOculto); + const claseCursoOculto = css(e.cursoOculto) - return <> - - {([indiceCurso, datosCurso]) => { + return ( + <> + + {([indiceCurso, datosCurso]) => { - const idCurso = `${anio()}_${datosCurso.abreviado}`; + const idCurso = `${anio()}_${datosCurso.abreviado}` - const cursoAgregadoMemo = createMemo( - () => props.listaCursosUsuario.cursos.find(x => { - return x.nombre === datosCurso.nombre && !x.oculto - }) !== undefined, - undefined, - (x, y) => x === y - ); + const cursoAgregadoMemo = createMemo( + () => props.listaCursosUsuario.cursos.find((x) => x.nombre === datosCurso.nombre && !x.oculto) !== undefined, + undefined, + (x, y) => x === y, + ) - const tituloMemo = createMemo(() => cursoAgregadoMemo() - ? `Remover de mi horario` - : `Agregar a mi horario` - ); + const tituloMemo = createMemo(() => (cursoAgregadoMemo() + ? "Remover de mi horario" + : "Agregar a mi horario")) - const claseMemo = createMemo(() => { - if (props.esCursoMiHorario && datosCurso.oculto) { - return claseCursoOculto - } - return cursoAgregadoMemo() - ? claseCursoAgregado - : claseCursoNoAgregado - }); + const claseMemo = createMemo(() => { + if (props.esCursoMiHorario && datosCurso.oculto) { + return claseCursoOculto + } + return cursoAgregadoMemo() + ? claseCursoAgregado + : claseCursoNoAgregado + }) - const profesoresTeoria = createMemo(() => agruparProfesores( - datosCurso.Teoria, - parseInt(indiceCurso), - false, - props.setCursosUsuarios - )); - const profesoresLab = createMemo(() => agruparProfesores( - datosCurso.Laboratorio ?? {}, - parseInt(indiceCurso), - true, - props.setCursosUsuarios - )); + const profesoresTeoria = createMemo(() => agruparProfesores( + datosCurso.Teoria, + Number(indiceCurso), + false, + props.setCursosUsuarios, + )) + const profesoresLab = createMemo(() => agruparProfesores( + datosCurso.Laboratorio ?? {}, + Number(indiceCurso), + true, + props.setCursosUsuarios, + )) - return
-
props.setIdHover(idCurso)} - onMouseLeave={() => props.setIdHover("")} - > - {datosCurso.abreviado} - {datosCurso.nombre} -
- - - - - {([profesor, grupos]) => { - return + +
- - {profesor}  - - - {([x, fnOnClick]) => - +
props.setIdHover(idCurso)} + onMouseLeave={() => props.setIdHover("")} + > + {datosCurso.abreviado} - {datosCurso.nombre} +
+ + + + + {([profesor, grupos]) => ( + + )} - - }} - - - - - {([profesor, grupos]) => { - return + + {([profesor, grupos]) => ( + + )} - - }} - - - -
+ + {profesor}  + + + {([x, fnOnClick]) => ( + - } + /> + ) + } + +
- - {profesor}  - - - {([x, fnOnClick]) => - +
+ + {profesor}  + + + {([x, fnOnClick]) => ( + - } + /> + ) + } + +
- props.fnAgregarCurso(datosCurso)} - > - {tituloMemo} - - - }} -
- ; +
+ props.fnAgregarCurso(datosCurso)} + > + {tituloMemo} + +
+ ) + }} +
+ + ) } diff --git a/src/ContenedorHorarios/Horarios.tsx b/src/ContenedorHorarios/Horarios.tsx index 9ef822c..048b593 100755 --- a/src/ContenedorHorarios/Horarios.tsx +++ b/src/ContenedorHorarios/Horarios.tsx @@ -1,12 +1,12 @@ -import { Curso, Cursos, DatosHorario, ListaCursosUsuario } from "../types/DatosHorario"; -import { batch, createMemo, createSignal, For, Match, SetStateFunction, Switch, untrack } from "solid-js"; -import { css } from "aphrodite"; -import { estilosGlobales } from "../Estilos"; -import { Tabla } from "./Tabla"; -import { CursosElem } from "./CursosElem"; -import { EstadoLayout } from "./ContenedorHorarios"; -import { BotonMaxMin } from "./BotonMaxMin"; -import { useListaCursos } from "./useListaCursos"; +import { Curso, Cursos, DatosHorario, ListaCursosUsuario } from "../types/DatosHorario" +import { batch, createMemo, createSignal, For, Match, SetStateFunction, Switch, untrack } from "solid-js" +import { css } from "aphrodite" +import { estilosGlobales } from "../Estilos" +import { Tabla } from "./Tabla" +import { CursosElem } from "./CursosElem" +import { EstadoLayout } from "./ContenedorHorarios" +import { BotonMaxMin } from "./BotonMaxMin" +import { useListaCursos } from "./useListaCursos" interface HorariosProps { data: DatosHorario, @@ -20,107 +20,116 @@ interface HorariosProps { const { setListaCursos, agregarCursoALista, - eliminarCursosDeLista -} = useListaCursos(); + eliminarCursosDeLista, +} = useListaCursos() export function Horarios(props: HorariosProps) { - const [anioActual, setAnioActual] = createSignal("1er año"); + const [anioActual, setAnioActual] = createSignal("1er año") // ID que indica cuales celdas resaltar. - const [idHover, setIdHover] = createSignal(""); + const [idHover, setIdHover] = createSignal("") - const elAnios = - {([nombre]) => { - const clases = createMemo(() => { - const vAnio = anioActual(); - return css( - estilosGlobales.contenedor, - estilosGlobales.inlineBlock, - estilosGlobales.contenedorCursor, - estilosGlobales.contenedorCursorSoft, - nombre === vAnio && estilosGlobales.contenedorCursorActivo - ); - }); + const elAnios = ( + + {([nombre]) => { + const clases = createMemo(() => { + const vAnio = anioActual() + return css( + estilosGlobales.contenedor, + estilosGlobales.inlineBlock, + estilosGlobales.contenedorCursor, + estilosGlobales.contenedorCursorSoft, + nombre === vAnio && estilosGlobales.contenedorCursorActivo, + ) + }) - return
setAnioActual(nombre)}> - {nombre} -
- }} -
; + return ( +
setAnioActual(nombre)}> + {nombre} +
+ ) + }} +
+ ) const dataTabla = createMemo(() => { - const anio = anioActual(); - const obj: Cursos = {}; + const anio = anioActual() + const obj: Cursos = {} untrack(() => { - const cursos = props.data.años[anio]; + const cursos = props.data.años[anio] batch(() => { - eliminarCursosDeLista(); + eliminarCursosDeLista() - let i = 0; + let i = 0 for (const [, curso] of Object.entries(cursos)) { // El curso devuelto por esta fun. es reactivo - obj[i] = agregarCursoALista(curso); - i++; + obj[i] = agregarCursoALista(curso) + i += 1 } - }); - }); + }) + }) - return obj; - }); + return obj + }) - const fnMaximizar = () => props.setEstadoLayout("MaxHorarios"); - const fnMinimizar = () => props.setEstadoLayout("Normal"); - const estadoActualLayout = () => props.estadoLayout; + const fnMaximizar = () => props.setEstadoLayout("MaxHorarios") + const fnMinimizar = () => props.setEstadoLayout("Normal") + const estadoActualLayout = () => props.estadoLayout - return
- - -
-
- Horarios disponibles + return ( +
+ + +
+
+ Horarios disponibles +
-
- {elAnios} - | - -
-
- -
-
- +
+ +
+
+ +
+ + + -
- - - - - + + -
; +
+ ) } diff --git a/src/ContenedorHorarios/MiHorario.tsx b/src/ContenedorHorarios/MiHorario.tsx index dd88efe..7909a68 100755 --- a/src/ContenedorHorarios/MiHorario.tsx +++ b/src/ContenedorHorarios/MiHorario.tsx @@ -1,13 +1,13 @@ -import { estilosGlobales } from "../Estilos"; -import { StyleSheet, css } from "aphrodite"; -import { Tabla } from "./Tabla"; -import { mostrarDescansos } from "../Store"; -import { EstadoLayout } from "./ContenedorHorarios"; -import { Switch, Match, For, createMemo, createSignal, SetStateFunction } from "solid-js"; -import { BotonMaxMin } from "./BotonMaxMin"; -import { BotonIcono } from "./BotonIcono"; -import { Curso, Cursos, ListaCursosUsuario } from "../types/DatosHorario"; -import { CursosElem } from "./CursosElem"; +import { estilosGlobales } from "../Estilos" +import { StyleSheet, css } from "aphrodite" +import { Tabla } from "./Tabla" +import { mostrarDescansos } from "../Store" +import { EstadoLayout } from "./ContenedorHorarios" +import { Switch, Match, For, createMemo, createSignal, SetStateFunction } from "solid-js" +import { BotonMaxMin } from "./BotonMaxMin" +import { BotonIcono } from "./BotonIcono" +import { Curso, Cursos, ListaCursosUsuario } from "../types/DatosHorario" +import { CursosElem } from "./CursosElem" interface MiHorarioProps { estadoLayout: EstadoLayout, @@ -25,111 +25,117 @@ const e = StyleSheet.create({ "::before": { fontSize: "1rem", // transform: "translateY(0.2rem)", - textDecoration: "none" - } - } -}); + textDecoration: "none", + }, + }, +}) export function MiHorario(props: MiHorarioProps) { - const [idHover, setIdHover] = createSignal(""); + const [idHover, setIdHover] = createSignal("") const datosMiHorario = createMemo(() => { - const obj: Cursos = {}; + const obj: Cursos = {} props.cursosUsuario.cursos.forEach((x, i) => { - obj[i] = x; - }); - return obj; - }); + obj[i] = x + }) + return obj + }) - const fnMaximizar = () => props.setEstadoLayout("MaxPersonal"); - const fnMinimizar = () => props.setEstadoLayout("Normal"); - const estadoActualLayout = () => props.estadoLayout; + const fnMaximizar = () => props.setEstadoLayout("MaxPersonal") + const fnMinimizar = () => props.setEstadoLayout("Normal") + const estadoActualLayout = () => props.estadoLayout /* TODO: En barra superior colocar todos los horarios. En barra inferior el horario actual. Al hacer click en un horario de la barra superior, llevarlo al inicio de la lista. */ - return
- - + return ( +
+ + -
-
+
+
Mi horario +
-
-
-
- Mi horario +
+
+ Mi horario +
+ | + {}} + /> + {}} + /> + {}} + /> + {}} + /> + | +
- | - { - }} + +
+ +
+ + "Mi horario"} + dataAnio={datosMiHorario()} + fnAgregarCurso={props.fnAgregarCurso} + listaCursosUsuario={props.cursosUsuario} + idHover={idHover} + setIdHover={setIdHover} + esCursoMiHorario + setCursosUsuarios={props.setCursosUsuarios} /> - { - }} - /> - { - }} - /> - { - }} - /> - | + + -
- -
- -
- - "Mi horario"} - dataAnio={datosMiHorario()} - fnAgregarCurso={props.fnAgregarCurso} - listaCursosUsuario={props.cursosUsuario} - idHover={idHover} - setIdHover={setIdHover} - esCursoMiHorario={true} - setCursosUsuarios={props.setCursosUsuarios} - /> - - - - - -
; + + +
+ ) } diff --git a/src/ContenedorHorarios/Tabla.tsx b/src/ContenedorHorarios/Tabla.tsx index aba9333..1182a63 100755 --- a/src/ContenedorHorarios/Tabla.tsx +++ b/src/ContenedorHorarios/Tabla.tsx @@ -1,31 +1,30 @@ -import { StyleSheet, css } from "aphrodite"; -import { createEffect, createMemo, createSignal, createState, For, SetStateFunction } from "solid-js"; -import { estilosGlobales } from "../Estilos"; -import { Cursos, Curso, ListaCursosUsuario } from "../types/DatosHorario"; -import { Dia, dias, horas } from "../Store"; -import { DataProcesada } from "../types/DatosHorario"; -import { FilaTabla } from "./Tabla/FilaTabla"; +import { StyleSheet, css } from "aphrodite" +import { createMemo, For, SetStateFunction } from "solid-js" +import { estilosGlobales } from "../Estilos" +import { Cursos, ListaCursosUsuario, DataProcesada } from "../types/DatosHorario" +import { Dia, dias, horas } from "../Store" +import { FilaTabla } from "./Tabla/FilaTabla" export const coloresBorde = Object.freeze([ "rgba(33,150,243,1)", "rgba(255,214,0 ,1)", "rgba(236,64,122 ,1)", "rgba(29,233,182 ,1)", - "rgba(244,67,54,1)" -]); + "rgba(244,67,54,1)", +]) export const diaANum = (d: Dia) => { switch (d) { case "Lunes": - return 0; + return 0 case "Martes": - return 1; + return 1 case "Miercoles": - return 2; + return 2 case "Jueves": - return 3; + return 3 case "Viernes": - return 4; + return 4 } } @@ -40,7 +39,7 @@ const e = StyleSheet.create({ minHeight: "1.5rem", ":hover": { // backgroundColor: "rgba(200, 200, 200, 0.25)" - } + }, }, filaBorde: { position: "absolute", @@ -48,65 +47,65 @@ const e = StyleSheet.create({ height: "1px", width: "100%", backgroundColor: "rgba(200, 200, 200, 0.25)", - zIndex: 1 + zIndex: 1, }, celdaHora: { textAlign: "center", width: "4rem", padding: "0.25rem 0", position: "absolute", - top: "-0.75rem" + top: "-0.75rem", }, celdaComun: { width: "20%", textAlign: "center", padding: "0 0.5rem", - boxSizing: "border-box" + boxSizing: "border-box", }, celdaDia: { - padding: "0.3rem 0" + padding: "0.3rem 0", }, celdaCurso: { display: "inline-block", padding: "0.25rem 0.35rem", cursor: "pointer", borderRadius: "5px", - transition: "background-color 100ms" + transition: "background-color 100ms", }, celdaCursoActiva: { - backgroundColor: "rgba(200, 200, 200, 0.25)" + backgroundColor: "rgba(200, 200, 200, 0.25)", }, celdaCursoTeoria: { - fontWeight: "bold" - } -}); + fontWeight: "bold", + }, +}) type FnSetCursosUsuarios = SetStateFunction; const procesarAnio = (data: Cursos, anio: string, version: number, setCursosUsuarios: FnSetCursosUsuarios) => { - const obj: DataProcesada = {}; + const obj: DataProcesada = {} for (const [indiceCurso, curso] of Object.entries(data)) { - if (curso.oculto) continue; + if (curso.oculto) continue - const nombreAbreviado = curso.abreviado; + const nombreAbreviado = curso.abreviado for (const [grupoStr, grupo] of Object.entries(curso.Teoria)) { for (const hora of grupo.Horas) { - const dia = hora.substring(0, 2); - const horas = hora.substring(2, 4); - const minutos = hora.substr(4); + const dia = hora.substring(0, 2) + const horas = hora.substring(2, 4) + const minutos = hora.substr(4) - const horaCompleta = horas + ":" + minutos; + const horaCompleta = `${horas}:${minutos}` - const id = `${version}_${anio}_${nombreAbreviado}_T_${grupoStr}`; + const id = `${version}_${anio}_${nombreAbreviado}_T_${grupoStr}` if (!(horaCompleta in obj)) { - obj[horaCompleta] = {}; + obj[horaCompleta] = {} } if (!(dia in obj[horaCompleta])) { - obj[horaCompleta][dia] = []; + obj[horaCompleta][dia] = [] } obj[horaCompleta][dia].push({ @@ -116,28 +115,28 @@ const procesarAnio = (data: Cursos, anio: string, version: number, setCursosUsua datosGrupo: grupo, fnSeleccionar: () => { /// @ts-ignore - setCursosUsuarios("cursos", indiceCurso, "Teoria", grupoStr, "seleccionado", x => !x); - } - }); + setCursosUsuarios("cursos", indiceCurso, "Teoria", grupoStr, "seleccionado", (x) => !x) + }, + }) } } for (const [grupoStr, grupo] of Object.entries(curso.Laboratorio ?? {})) { for (const hora of grupo.Horas) { - const dia = hora.substring(0, 2); - const horas = hora.substring(2, 4); - const minutos = hora.substr(4); + const dia = hora.substring(0, 2) + const horas = hora.substring(2, 4) + const minutos = hora.substr(4) - const horaCompleta = horas + ":" + minutos; + const horaCompleta = `${horas}:${minutos}` - const id = `${version}_${anio}_${nombreAbreviado}_L_${grupoStr}`; + const id = `${version}_${anio}_${nombreAbreviado}_L_${grupoStr}` if (!(horaCompleta in obj)) { - obj[horaCompleta] = {}; + obj[horaCompleta] = {} } if (!(dia in obj[horaCompleta])) { - obj[horaCompleta][dia] = []; + obj[horaCompleta][dia] = [] } obj[horaCompleta][dia].push({ @@ -147,14 +146,14 @@ const procesarAnio = (data: Cursos, anio: string, version: number, setCursosUsua datosGrupo: grupo, fnSeleccionar: () => { /// @ts-ignore - setCursosUsuarios("cursos", indiceCurso, "Laboratorio", grupoStr, "seleccionado", x => !x); - } - }); + setCursosUsuarios("cursos", indiceCurso, "Laboratorio", grupoStr, "seleccionado", (x) => !x) + }, + }) } } } - return obj; + return obj } interface Props { @@ -167,35 +166,40 @@ interface Props { } export function Tabla(props: Props) { - const anio = () => props.anio.substring(0, props.anio.indexOf(" ")); - const data = createMemo(() => procesarAnio(props.data, anio(), props.version, props.setCursosUsuarios)); - const idHover = props.idHover; - const setIdHover = props.setIdHover; + const anio = () => props.anio.substring(0, props.anio.indexOf(" ")) + const data = createMemo(() => procesarAnio(props.data, anio(), props.version, props.setCursosUsuarios)) + const idHover = props.idHover + const setIdHover = props.setIdHover const celdas = createMemo(() => { // Hace reaccionar a la reactividad de Solid - props.data; - return - {hora => { - return - }} - - }); - - return
-
- - {dia => -
- {dia} -
- } + props.data + return ( + + {(hora) => ( + + )} + ) + }) + + return ( +
+
+ + {(dia) => ( +
+ {dia} +
+ )} +
+
+ {celdas()}
- {celdas()} -
-} \ No newline at end of file + ) +} diff --git a/src/ContenedorHorarios/Tabla/CeldaFila.tsx b/src/ContenedorHorarios/Tabla/CeldaFila.tsx index 61b0871..e195422 100755 --- a/src/ContenedorHorarios/Tabla/CeldaFila.tsx +++ b/src/ContenedorHorarios/Tabla/CeldaFila.tsx @@ -1,8 +1,8 @@ -import { StyleSheet, css } from "aphrodite"; -import { estilosGlobales } from "../../Estilos"; -import { For, createSignal, createMemo, createEffect, SetStateFunction } from "solid-js"; -import { Dia } from "../../Store"; -import { DatosGrupo, ListaCursosUsuario } from "../../types/DatosHorario"; +import { StyleSheet, css } from "aphrodite" +import { estilosGlobales } from "../../Estilos" +import { For, createSignal, createMemo, createEffect, SetStateFunction } from "solid-js" +import { Dia } from "../../Store" +import { DatosGrupo, ListaCursosUsuario } from "../../types/DatosHorario" const e = StyleSheet.create({ celdaComun: { @@ -10,7 +10,7 @@ const e = StyleSheet.create({ textAlign: "center", padding: "0 0.7rem", boxSizing: "border-box", - userSelect: "none" + userSelect: "none", }, celdaCurso: { display: "inline-block", @@ -23,39 +23,42 @@ const e = StyleSheet.create({ // color: "#151515" }, celdaCursoTeoria: { - fontWeight: "bold" + fontWeight: "bold", }, celdaCursoLab: { - fontStyle: "italic" - } -}); + fontStyle: "italic", + }, + celdaSeleccionada: { + textDecoration: "underline", + }, +}) const eColores = StyleSheet.create({ lunes: { - backgroundColor: "rgba(33,150,243,1)" + backgroundColor: "rgba(33,150,243,1)", }, martes: { backgroundColor: "rgba(255,214,0 ,1)", - color: "#151515" + color: "#151515", }, miercoles: { - backgroundColor: "rgba(236,64,122 ,1)" + backgroundColor: "rgba(236,64,122 ,1)", }, jueves: { backgroundColor: "rgba(29,233,182 ,1)", - color: "#151515" + color: "#151515", }, viernes: { - backgroundColor: "rgba(244,67,54,1)" - } -}); + backgroundColor: "rgba(244,67,54,1)", + }, +}) const clasesColores = { Lunes: css(eColores.lunes), Martes: css(eColores.martes), Miercoles: css(eColores.miercoles), Jueves: css(eColores.jueves), - Viernes: css(eColores.viernes) + Viernes: css(eColores.viernes), } interface Props { @@ -79,64 +82,68 @@ interface Props { setIdHover: (v: string) => string, fnResaltarFila: () => void, fnDesresaltarFila: () => void, - dia: Dia + dia: Dia, } +const claseSeldaSeleccionada = css(e.celdaSeleccionada) + export function CeldaFila(props: Props) { - const datos = props.datos; - const idHover = props.idHover; - const setIdHover = props.setIdHover; + const datos = props.datos + const idHover = props.idHover + const setIdHover = props.setIdHover - const fnOnMouseEnter = (id: string) => setIdHover(id); - const fnOnMouseLeave = () => setIdHover(""); + const fnOnMouseEnter = (id: string) => setIdHover(id) + const fnOnMouseLeave = () => setIdHover("") - return
- - {datos => { - const id = datos.id; - const txt = datos.txt; - const esLab = datos.esLab; - const fnSeleccionar = datos.fnSeleccionar; + return ( +
+ + {(datos) => { + const id = datos.id + const txt = datos.txt + const esLab = datos.esLab + const fnSeleccionar = datos.fnSeleccionar - const [estabaResaltado, setEstabaResaltado] = createSignal(false); + const [estabaResaltado, setEstabaResaltado] = createSignal(false) - const estaSeleccionado = createMemo(() => { - return datos.datosGrupo.seleccionado; - }); + const estaSeleccionado = createMemo(() => datos.datosGrupo.seleccionado) - const clases = createMemo( - () => { - const clases = [ - e.celdaCurso, - esLab ? e.celdaCursoLab : e.celdaCursoTeoria, - estaSeleccionado() && estilosGlobales.contenedorCursorActivo - ]; - let adicional = ""; - const idHoverS = idHover(); - if (idHoverS !== "" && id.search(idHoverS) !== -1) { - props.fnResaltarFila(); - clases.push(e.celdaCursoActiva); - adicional = clasesColores[props.dia]; + const clases = createMemo( + () => { + const clases = [ + e.celdaCurso, + esLab ? e.celdaCursoLab : e.celdaCursoTeoria, + estaSeleccionado() && e.celdaSeleccionada, + ] + let adicional = "" + const idHoverS = idHover() + if (idHoverS !== "" && id.search(idHoverS) !== -1) { + props.fnResaltarFila() + clases.push(e.celdaCursoActiva) + adicional = clasesColores[props.dia] - setEstabaResaltado(true); - } else if (estabaResaltado()) { - props.fnDesresaltarFila(); - setEstabaResaltado(false); - } - return css(...clases) + " " + adicional; - }, - undefined, - (x, y) => x === y - ); + setEstabaResaltado(true) + } else if (estabaResaltado()) { + props.fnDesresaltarFila() + setEstabaResaltado(false) + } + return `${css(...clases)} ${adicional}` + }, + undefined, + (x, y) => x === y, + ) - return fnOnMouseEnter(id)} - onMouseLeave={fnOnMouseLeave} - onClick={fnSeleccionar} - > - {txt} - ; - }} - -
-} \ No newline at end of file + return ( + fnOnMouseEnter(id)} + onMouseLeave={fnOnMouseLeave} + onClick={fnSeleccionar} + > + {txt} + + ) + }} +
+
+ ) +} diff --git a/src/ContenedorHorarios/Tabla/FilaTabla.tsx b/src/ContenedorHorarios/Tabla/FilaTabla.tsx index 591c306..1ef7f75 100755 --- a/src/ContenedorHorarios/Tabla/FilaTabla.tsx +++ b/src/ContenedorHorarios/Tabla/FilaTabla.tsx @@ -1,10 +1,10 @@ -import { StyleSheet, css } from "aphrodite"; -import { estilosGlobales } from "../../Estilos"; -import { For, createSignal, createMemo, createState, createEffect, State, SetStateFunction } from "solid-js"; -import { Dia, dias } from "../../Store"; -import { CeldaFila } from "./CeldaFila"; -import { DataProcesada, ListaCursosUsuario } from "../../types/DatosHorario"; -import { coloresBorde, diaANum } from "../Tabla"; +import { StyleSheet, css } from "aphrodite" +import { estilosGlobales } from "../../Estilos" +import { For, createSignal, createMemo, createState, createEffect, State, SetStateFunction } from "solid-js" +import { Dia, dias } from "../../Store" +import { CeldaFila } from "./CeldaFila" +import { DataProcesada, ListaCursosUsuario } from "../../types/DatosHorario" +import { coloresBorde, diaANum } from "../Tabla" const e = StyleSheet.create({ celdaHora: { @@ -12,13 +12,13 @@ const e = StyleSheet.create({ width: "3rem", padding: "0.25rem 0", position: "absolute", - top: "-0.75rem" + top: "-0.75rem", }, filaResaltado: { position: "absolute", zIndex: -1, height: "100%", - transform: "translateX(-1.5rem)" + transform: "translateX(-1.5rem)", }, fila: { position: "relative", @@ -30,7 +30,7 @@ const e = StyleSheet.create({ minHeight: "1.2rem", ":hover": { // backgroundColor: "rgba(200, 200, 200, 0.25)" - } + }, }, filaBorde: { position: "absolute", @@ -38,17 +38,17 @@ const e = StyleSheet.create({ height: "1px", width: "100%", backgroundColor: "rgba(200, 200, 200, 0.25)", - zIndex: -1 + zIndex: -1, }, celdaResaltado: { height: "101%", width: "5px", - display: "inline-block" + display: "inline-block", }, celdaResaltadoTransparente: { - backgroundColor: "transparent" - } -}); + backgroundColor: "transparent", + }, +}) const [diasResaltados, setDiasResaltados] = createState({ Lunes: 0, @@ -56,7 +56,7 @@ const [diasResaltados, setDiasResaltados] = createState({ Miercoles: 0, Jueves: 0, Viernes: 0, -} as { [k: string]: number }); +} as { [k: string]: number }) interface Props { hora: string, @@ -65,12 +65,10 @@ interface Props { setIdHover: (v: string) => string } -const diasFilter = createMemo(() => { - return Object.entries(diasResaltados) - .filter(x => x[1] > 0) - .map(x => x[0] as Dia) - .sort((x, y) => diaANum(x) > diaANum(y) ? 1 : -1); -}); +const diasFilter = createMemo(() => Object.entries(diasResaltados) + .filter((x) => x[1] > 0) + .map((x) => x[0] as Dia) + .sort((x, y) => (diaANum(x) > diaANum(y) ? 1 : -1))) const useDiasResaltados: () => [ State<{ [k: string]: boolean }>, @@ -83,64 +81,76 @@ const useDiasResaltados: () => [ Miercoles: false, Jueves: false, Viernes: false, - } as { [k: string]: boolean }); + } as { [k: string]: boolean }) const fnResaltar = (d: Dia) => { - setDiasResaltadosLocal(d, true); - setDiasResaltados(d, v => v + 1); - }; + setDiasResaltadosLocal(d, true) + setDiasResaltados(d, (v) => v + 1) + } const fnDesresaltar = (d: Dia) => { - setDiasResaltadosLocal(d, false); - setDiasResaltados(d, v => v - 1); - }; + setDiasResaltadosLocal(d, false) + setDiasResaltados(d, (v) => v - 1) + } - return [diasResaltadosLocal, fnResaltar, fnDesresaltar]; -}; + return [diasResaltadosLocal, fnResaltar, fnDesresaltar] +} export function FilaTabla(props: Props) { - const [diasResaltadosLocal, fnResaltar, fnDesresaltar] = useDiasResaltados(); + const [diasResaltadosLocal, fnResaltar, fnDesresaltar] = useDiasResaltados() - const hora = props.hora; - const data = props.data; + const hora = props.hora + const data = props.data - return
-
- {hora.substring(0, 5)} -
-
-
-
-
-
-
-
+ return ( +
+
+ {hora.substring(0, 5)}
- - {dia => { - const diaStr = dia.substring(0, 2); - const horaStr = hora.substring(0, 5); - - const datos = data?.[horaStr]?.[diaStr] ?? []; - - return fnResaltar(dia)} - fnDesresaltarFila={() => fnDesresaltar(dia)} - dia={dia} +
+
+
- }} - -
+
+
+
+
+
+ + {(dia) => { + const diaStr = dia.substring(0, 2) + const horaStr = hora.substring(0, 5) + + const datos = data?.[horaStr]?.[diaStr] ?? [] + + return ( + fnResaltar(dia)} + fnDesresaltarFila={() => fnDesresaltar(dia)} + dia={dia} + /> + ) + }} + +
+
-
; -} \ No newline at end of file + ) +} diff --git a/src/ContenedorHorarios/TablaObserver.ts b/src/ContenedorHorarios/TablaObserver.ts new file mode 100644 index 0000000..b732d30 --- /dev/null +++ b/src/ContenedorHorarios/TablaObserver.ts @@ -0,0 +1,70 @@ +/** + * - Normal + * - Oculto - Otro grupo seleccionado + * - Seleccionado - Cursor ensima + * - Resaltado - Grupo seleccionado + * - ResaltadoSeleccionado - Grupo seleccionado y cursor encima + * - ResaltadoOculto - Otro grupo seleccionado y cursor encima + */ +import { createMemo, createState, SetStateFunction, State } from "solid-js"; + +type EstadoCelda = + | "Normal" + | "Oculto" + | "Seleccionado" + | "Resaltado" + | "ResaltadoSeleccionado" + | "ResaltadoOculto" + +interface Datos { + anio?: string, + curso?: string, + esLab?: boolean, + grupo?: string +} + +export class TablaObserver { + + private readonly resaltado: State + private readonly setResaltado: SetStateFunction + private gruposSeleccionados = {} + + constructor() { + const [resaltado, setResaltado] = createState({ + anio: undefined, + curso: undefined, + esLab: undefined, + grupo: undefined + }); + this.resaltado = resaltado; + this.setResaltado = setResaltado; + } + + // Cada celda se registra dando estos datos + // Devuelve un memo con un valor de EstadoCelda, + // el cual cada celda sabra como manejar + registrar(anio: string, cursoAbreviado: string, esLab: boolean, grupo: string) { + const fn = () => { + + }; + + const memo = createMemo( + fn, + undefined, + (x, y) => x === y + ); + } + + resaltar(id: string) { + + } + + quitarResaltado() { + this.setResaltado({ + anio: undefined, + curso: undefined, + esLab: undefined, + grupo: undefined + }); + } +} diff --git a/src/ContenedorHorarios/useListaCursos.ts b/src/ContenedorHorarios/useListaCursos.ts index 591ec6f..1783b96 100644 --- a/src/ContenedorHorarios/useListaCursos.ts +++ b/src/ContenedorHorarios/useListaCursos.ts @@ -1,5 +1,5 @@ -import { createState, SetStateFunction, State } from "solid-js"; -import { Curso, ListaCursosUsuario } from "../types/DatosHorario"; +import { createState, SetStateFunction, State } from "solid-js" +import { Curso, ListaCursosUsuario } from "../types/DatosHorario" interface ReturnType { listaCursos: State, @@ -11,31 +11,31 @@ interface ReturnType { export const useListaCursos = (): ReturnType => { const [listaCursos, setListaCursos] = createState({ sigIndice: 0, - cursos: [] - }); + cursos: [], + }) const agregarCursoALista = (curso: Curso): Curso => { // Si el horario ya se habia agregado, ocultarlo - const cursoActualIndex = listaCursos.cursos.findIndex(x => x.nombre === curso.nombre); + const cursoActualIndex = listaCursos.cursos.findIndex((x) => x.nombre === curso.nombre) if (cursoActualIndex !== -1) { - setListaCursos("cursos", cursoActualIndex, "oculto", x => !x); - return listaCursos.cursos[cursoActualIndex]; + setListaCursos("cursos", cursoActualIndex, "oculto", (x) => !x) + return listaCursos.cursos[cursoActualIndex] } else { - setListaCursos("cursos", listaCursos.sigIndice, curso); - setListaCursos("sigIndice", x => x + 1); - return listaCursos.cursos[listaCursos.sigIndice - 1]; + setListaCursos("cursos", listaCursos.sigIndice, curso) + setListaCursos("sigIndice", (x) => x + 1) + return listaCursos.cursos[listaCursos.sigIndice - 1] } - }; + } const eliminarCursosDeLista = () => { - setListaCursos("cursos", []); - setListaCursos("sigIndice", 0); - }; + setListaCursos("cursos", []) + setListaCursos("sigIndice", 0) + } return { listaCursos, setListaCursos, agregarCursoALista, - eliminarCursosDeLista - }; -}; + eliminarCursosDeLista, + } +} diff --git a/src/Creditos.tsx b/src/Creditos.tsx index b9a56e9..97debc0 100644 --- a/src/Creditos.tsx +++ b/src/Creditos.tsx @@ -1,15 +1,17 @@ -import { StyleSheet, css } from "aphrodite"; +import { StyleSheet, css } from "aphrodite" const e = StyleSheet.create({ creditos: { textAlign: "center", paddingTop: "7.5rem", - paddingBottom: "1rem" - } -}); + paddingBottom: "1rem", + }, +}) export function Creditos() { - return
- Desarrollado por Fernando Araoz con TypeScript, JSX y Solid.js. -
-} \ No newline at end of file + return ( +
+ Desarrollado por Fernando Araoz con TypeScript, JSX y Solid.js. +
+ ) +} diff --git a/src/Estilos.ts b/src/Estilos.ts index d7daf57..6b19278 100755 --- a/src/Estilos.ts +++ b/src/Estilos.ts @@ -1,4 +1,4 @@ -import {StyleSheet} from "aphrodite"; +import {StyleSheet} from "aphrodite" export const estilosGlobales = StyleSheet.create({ contenedor: { @@ -7,7 +7,7 @@ export const estilosGlobales = StyleSheet.create({ borderRadius: "10px", backdropFilter: "blur(40px)", backgroundColor: "rgba(100, 100, 100, 0.25)", - color: "var(--color-texto)" + color: "var(--color-texto)", }, contenedorCursor: { cursor: "pointer", @@ -15,27 +15,27 @@ export const estilosGlobales = StyleSheet.create({ transition: "background-color 200ms", textDecoration: "underline solid white 2px", ":hover": { - backgroundColor: "rgba(200, 200, 200, 0.3)" - } + backgroundColor: "rgba(200, 200, 200, 0.3)", + }, }, contenedorCursorSoft: { - textDecoration: "underline rgba(255, 255, 255, 0.4)" + textDecoration: "underline rgba(255, 255, 255, 0.4)", }, contenedorCursorActivo: { - backgroundColor: "rgba(200, 200, 200, 0.3)" + backgroundColor: "rgba(200, 200, 200, 0.3)", }, contenedorPhospor: { padding: "0.5rem 0.65rem", - transform: "translateY(0.2rem)" + transform: "translateY(0.2rem)", }, inlineBlock: { - display: "inline-block" + display: "inline-block", }, botonPhospor: { "::before": { fontSize: "1.25rem", // transform: "translateY(0.2rem)", textDecoration: "underline rgba(255, 255, 255, 0.4)", - } + }, }, -}); +}) diff --git a/src/Store.ts b/src/Store.ts index 3fee18d..da9b0fd 100755 --- a/src/Store.ts +++ b/src/Store.ts @@ -1,4 +1,4 @@ -import { createSignal, createEffect } from "solid-js"; +import { createSignal} from "solid-js" enum ModoColor { Claro, @@ -8,7 +8,7 @@ enum ModoColor { export type Dia = "Lunes" | "Martes" | "Miercoles" | "Jueves" | "Viernes"; -export const dias: Dia[] = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"]; +export const dias: Dia[] = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"] export const horas = [ "07:00 - 07:50", "07:50 - 08:40", @@ -30,17 +30,17 @@ export const horas = [ "18:30 - 19:20", "19:20 - 20:10", "20:10 - 21:00", - "21:00 - 21:00" -]; + "21:00 - 21:00", +] export const horasDescanso = [ "08:40 - 08:50", "10:30 - 10:40", "15:40 - 15:50", - "17:30 - 17:40" -]; + "17:30 - 17:40", +] -const numImgGuardado = parseInt(localStorage.getItem("num-img") ?? "3"); +const numImgGuardado = Number(localStorage.getItem("num-img") ?? "3") -export const [modoColor, setModoColor] = createSignal(ModoColor.Oscuro); -export const [numWallpaper, setNumWallpaper] = createSignal(numImgGuardado); -export const [mostrarDescansos, setMostrarDescansos] = createSignal(true); +export const [modoColor, setModoColor] = createSignal(ModoColor.Oscuro) +export const [numWallpaper, setNumWallpaper] = createSignal(numImgGuardado) +export const [mostrarDescansos, setMostrarDescansos] = createSignal(true) diff --git a/src/Wallpaper.tsx b/src/Wallpaper.tsx index ccb59eb..3d525bb 100755 --- a/src/Wallpaper.tsx +++ b/src/Wallpaper.tsx @@ -1,12 +1,12 @@ -import { StyleSheet, css } from "aphrodite"; -import { numWallpaper } from "./Store"; -import { createEffect, createState } from "solid-js"; +import { StyleSheet, css } from "aphrodite" +import { numWallpaper } from "./Store" +import { createEffect, createState } from "solid-js" -const duracionTransicion = 250; +const duracionTransicion = 250 export function Wallpaper() { /// @ts-ignore - const soportaBackdropFilter = document.body.style.backdropFilter !== undefined; + const soportaBackdropFilter = document.body.style.backdropFilter !== undefined const estilos = StyleSheet.create({ contenedorCover: { @@ -16,7 +16,7 @@ export function Wallpaper() { top: "0", left: "0", backgroundColor: "#212121", - zIndex: -1 + zIndex: -1, }, cover: { width: "100vw", @@ -25,43 +25,45 @@ export function Wallpaper() { backgroundSize: "cover", zIndex: -1, transition: `opacity ${duracionTransicion}ms`, - filter: soportaBackdropFilter? "": "blur(40px)" + filter: soportaBackdropFilter ? "" : "blur(40px)", }, coverTransicion: { - opacity: 0 - } - }); + opacity: 0, + }, + }) const [estilosRaw, setEstilosRaw] = createState({ - "background-image": `none`, - opacity: 1 - }); + "background-image": "none", + opacity: 1, + }) createEffect(() => { - const numImg = numWallpaper(); - setEstilosRaw("opacity", 0); + const numImg = numWallpaper() + setEstilosRaw("opacity", 0) - const promesa250ms = new Promise(resolve => { - setTimeout(resolve, duracionTransicion); - }); + const promesa250ms = new Promise((resolve) => { + setTimeout(resolve, duracionTransicion) + }) - const url = `/img/wall${numImg}.webp`; - const img = new Image(); - img.addEventListener("load", async () => { - await promesa250ms; + const url = `/img/wall${numImg}.webp` + const img = new Image() + img.addEventListener("load", async() => { + await promesa250ms setEstilosRaw({ "background-image": `url('${url}')`, - opacity: 1 - }); - }); - img.src = url; - }); + opacity: 1, + }) + }) + img.src = url + }) - return
-
-
+ return ( +
+
+
+ ) } diff --git a/src/index.tsx b/src/index.tsx index d545069..ac16ac6 100755 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,7 +1,7 @@ -import "solid-js"; -import { render } from 'solid-js/web'; -import App from './App'; -import "normalize.css"; -import "./styles/global.css"; +import "solid-js" +import { render } from "solid-js/web" +import App from "./App" +import "normalize.css" +import "./styles/global.css" -render(App, document.getElementById('root') as Node); +render(App, document.getElementById("root") as Node) diff --git a/src/types/DatosHorario.ts b/src/types/DatosHorario.ts index 02d5761..3eb6c34 100755 --- a/src/types/DatosHorario.ts +++ b/src/types/DatosHorario.ts @@ -74,4 +74,4 @@ export interface DataProcesada { fnSeleccionar: () => void }[] } -} \ No newline at end of file +}