diff --git a/.gitignore b/.gitignore index 8e166d0..403adbc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,9 @@ -# Node Modules +.DS_Store node_modules +/dist -# Local ENV files + +# local env files .env.local .env.*.local @@ -11,7 +13,7 @@ yarn-debug.log* yarn-error.log* pnpm-debug.log* -# Editor Directories/Files +# Editor directories and files .idea .vscode *.suo @@ -19,10 +21,3 @@ pnpm-debug.log* *.njsproj *.sln *.sw? -.DS_Store - -yarn.lock - -# Custom -.env -config/config.json \ No newline at end of file diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..e1cf688 --- /dev/null +++ b/config/config.json @@ -0,0 +1,26 @@ +{ + "development": { + "username": "troplo_watchdogs", + "password": "Hum%r4T3g#*@W7F65wz%", + "database": "troplo_watchdogs", + "host": "192.168.0.13", + "dialect": "mysql", + "logging": false + }, + "test": { + "username": "troplo_watchdogs", + "password": "Hum%r4T3g#*@W7F65wz%", + "database": "troplo_watchdogs", + "host": "192.168.0.13", + "dialect": "mysql", + "logging": false + }, + "production": { + "username": "troplo_watchdogs", + "password": "Hum%r4T3g#*@W7F65wz%", + "database": "troplo_watchdogs", + "host": "192.168.0.13", + "dialect": "mysql", + "logging": false + } +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..970656f --- /dev/null +++ b/index.js @@ -0,0 +1,142 @@ +const crc32 = require('js-crc').crc32; + +const fs = require("fs"); +const glob = require("glob"); +const { File } = require("./models") +const {Op} = require("sequelize"); +const express = require('express') +const os = require("os"); +const moment = require("moment"); +const app = express() +const port = 34895 +const fsPromises = require("fs").promises +const readdir = fsPromises.readdir +const nodePath = require("path") +const path = require("path"); +const stat = fsPromises.stat +async function list(depot, path) { + try { + let root + if(depot === "wd1") { + root = "/root/depots/" + depot + } else if(depot === "wdl-2450") { + root = "/root/depots/wdl-2450-main" + } else { + return {success: false, message: "Depot not found."} + } + let code = depot + let dirs = [], + files = []; + + if (path[path.length - 1] !== "/") { + path += "/"; + } + + let filePath = nodePath.join(root + path); + console.log(filePath) + if (filePath.startsWith(root)) { + let items = await readdir(root + path, { withFileTypes: true }); + + for (let item of items) { + let isFile = item.isFile(), + isDir = item.isDirectory(); + + if (!isFile && !isDir) { + continue; + } + + let result = { + type: isFile ? "file" : "dir", + path: path + item.name, + }; + + result.basename = result.name = nodePath.basename(result.path); + + if (isFile) { + let fileStat = await stat(root + result.path); + result.size = fileStat.size; + result.extension = nodePath.extname(result.path).slice(1); + result.name = nodePath.basename(result.path, "." + result.extension); + files.push(result); + } else { + result.path += "/"; + dirs.push(result); + } + } + + return dirs.concat(files); + } else { + return {success: false, message: "Folder was not found in the depot"} + } + } catch (err) { + console.error(err); + } +} + +app.get('/api/v1/browser/:depot/list', async(req, res) => { + try { + let result = await list(req.params.depot, req.query.path); + return res.json(result); + } catch (e){ + console.log(e) + res.json({success: false, message: "Something went wrong."}) + } +}) + +app.get('/api/v1/browser/:depot/download', async(req, res) => { + try { + let root + if(req.params.depot === "wd1") { + root = "/root/depots/" + req.params.depot + "/" + } else if(req.params.depot === "wdl-2450") { + root = "M:/" + } else { + return {success: false, message: "Depot not found."} + } + let file = root + req.query.path + let fileTest = fs.readFileSync(file, 'utf8') + let filePath = nodePath.join(file); + console.log(filePath) + if (filePath.startsWith(root)) { + res.download(file, file.name) + } else { + res.status(400) + res.json({success: false, message: "Something went wrong."}) + } + } catch (e){ + console.log(e) + res.status(400) + res.json({success: false, message: "Something went wrong."}) + } +}) + +app.get('/api/v1/dl/:id', async(req, res) => { + try { + const find = await File.findOne({ + where: { + id: req.params.id + } + }) + if (find) { + if (find.fileObject) { + let file = find.path.replace(/^.*[\\\/]/, '') + res.download("/root/depots/" + find.project + "/" + find.path, file) + } + } else { + res.json({success: false, message: "This hash, or definition does not yet exist in our database."}) + } + } catch (e){ + console.log(e) + res.json({success: false, message: "Something went wrong while retrieving this file."}) + } +}) + +app.get('/', async(req, res) => { + res.redirect('https://discord.gg/WKXjxj6kRN') +}) + +app.listen(port, () => { + console.log(`Nexus API running at http://localhost:${port}`) +}) + +module.exports = app; diff --git a/migrations/20210924121330-files.js b/migrations/20210924121330-files.js new file mode 100644 index 0000000..e8447ad --- /dev/null +++ b/migrations/20210924121330-files.js @@ -0,0 +1,30 @@ +'use strict'; +module.exports = { + up: async(queryInterface, Sequelize) => { + await queryInterface.createTable('files', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.BIGINT + }, + crc32: Sequelize.STRING, + fnv32: Sequelize.STRING, + fnv64: Sequelize.STRING, + path: Sequelize.STRING, + project: { + type: Sequelize.STRING, + defaultValue: "wd1Retail" + }, + createdAt: { + type: Sequelize.DATE + }, + updatedAt: { + type: Sequelize.DATE + } + }); + }, + down: async(queryInterface, Sequelize) => { + await queryInterface.dropTable('files'); + } +}; \ No newline at end of file diff --git a/migrations/20210924132702-definition.js b/migrations/20210924132702-definition.js new file mode 100644 index 0000000..831d9c0 --- /dev/null +++ b/migrations/20210924132702-definition.js @@ -0,0 +1,48 @@ +module.exports = { + up(queryInterface, Sequelize) { + return Promise.all([ + queryInterface.addColumn( + 'files', + 'definition', + { + type: Sequelize.TEXT, + }, + ), + queryInterface.addColumn( + 'files', + 'fnv32Rev', + { + type: Sequelize.STRING, + }, + ), + queryInterface.addColumn( + 'files', + 'fnv64Rev', + { + type: Sequelize.STRING, + }, + ), + queryInterface.addColumn( + 'files', + 'crc32Rev', + { + type: Sequelize.STRING, + }, + ), + queryInterface.addColumn( + 'files', + 'fileObject', + { + type: Sequelize.JSON, + }, + ), + queryInterface.addColumn( + 'files', + 'otherProperties', + { + type: Sequelize.JSON, + }, + ), + ]); + }, +} \ No newline at end of file diff --git a/models/files.js b/models/files.js new file mode 100644 index 0000000..5a23404 --- /dev/null +++ b/models/files.js @@ -0,0 +1,44 @@ +'use strict'; +const { + Model, DATE +} = require('sequelize'); + +module.exports = (sequelize, DataTypes) => { + class File extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + + } + } + File.init({ + crc32: DataTypes.STRING, + fnv32: DataTypes.STRING, + fnv64: DataTypes.STRING, + path: DataTypes.STRING, + project: { + type: DataTypes.STRING, + defaultValue: "wd1Retail" + }, + createdAt: { + type: DataTypes.DATE + }, + updatedAt: { + type: DataTypes.DATE + }, + definition: DataTypes.TEXT, + fnv32Rev: DataTypes.STRING, + fnv64Rev: DataTypes.STRING, + crc32Rev: DataTypes.STRING, + fileObject: DataTypes.JSON, + otherProperties: DataTypes.JSON + }, { + sequelize, + modelName: 'File', + }); + + return File; +}; \ No newline at end of file diff --git a/models/index.js b/models/index.js new file mode 100644 index 0000000..4f8171f --- /dev/null +++ b/models/index.js @@ -0,0 +1,37 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const Sequelize = require('sequelize'); +const basename = path.basename(__filename); +const env = process.env.NODE_ENV || 'development'; +const config = require(__dirname + '/../config/config.json')[env]; +const db = {}; + +let sequelize; +if (config.use_env_variable) { + sequelize = new Sequelize(process.env[config.use_env_variable], config); +} else { + sequelize = new Sequelize(config.database, config.username, config.password, config); +} + +fs + .readdirSync(__dirname) + .filter(file => { + return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); + }) + .forEach(file => { + const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); + db[model.name] = model; + }); + +Object.keys(db).forEach(modelName => { + if (db[modelName].associate) { + db[modelName].associate(db); + } +}); + +db.sequelize = sequelize; +db.Sequelize = Sequelize; + +module.exports = db; diff --git a/package.json b/package.json index 5a86df1..2f9b872 100644 --- a/package.json +++ b/package.json @@ -1,41 +1,11 @@ { - "name": "jays-host", - "version": "1.0.0", - "description": "A ShareX photo gallery.", - "main": "index.js", - "scripts": { - "serve": "nodemon --ignore ./ui/" - }, - "author": "Troplo", - "license": "Internal use only.", - "private": true, "dependencies": { - "@discordjs/rest": "^0.1.0-canary.0", - "axios": "^0.21.1", - "bcryptjs": "^2.4.3", - "body-parser": "^1.19.0", - "btcpay": "^0.2.5", - "btoa": "^1.2.1", - "cloudflare": "^2.8.0", - "cors": "^2.8.5", - "crypto-random-string": "3.3.1", - "discord.js": "^13.1.0", - "dotenv": "^10.0.0", "express": "^4.17.1", - "express-autosanitizer": "^1.0.2", - "form-data": "^4.0.0", - "helmet": "^4.6.0", - "is-valid-domain": "^0.1.2", - "jsonwebtoken": "^8.5.1", - "jw-paginate": "^1.0.4", - "microstats": "^0.1.2", + "glob": "^7.2.0", + "js-crc": "^0.2.0", "moment": "^2.29.1", - "multer": "^1.4.2", - "mysql2": "^2.2.5", - "nodemon": "^2.0.12", - "sequelize": "^6.6.5", - "sequelize-cli": "^6.2.0", - "speakeasy": "^2.0.0", - "whois": "^2.13.5" + "mysql2": "^2.3.0", + "sequelize": "^6.6.5" } } + diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js index 8ad90db..3391da1 100644 --- a/ui/.eslintrc.js +++ b/ui/.eslintrc.js @@ -4,7 +4,7 @@ module.exports = { node: true }, 'extends': [ - 'plugin:vue/essential', + 'plugin:vue/vue3-essential', 'eslint:recommended' ], parserOptions: { diff --git a/ui/package.json b/ui/package.json index d819e5c..20fd121 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,34 +1,35 @@ { "name": "ui", - "version": "1.0.0", + "version": "0.1.0", "private": true, "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", - "lint": "vue-cli-service lint", - "postinstall": "patch-package" + "lint": "vue-cli-service lint" }, "dependencies": { + "@mdi/font": "5.9.55", "core-js": "^3.6.5", - "patch-package": "^6.4.7", - "register-service-worker": "^1.7.1", - "vue": "^2.6.11", - "vue-router": "^3.2.0", - "vuetify": "^2.4.0" + "roboto-fontface": "*", + "vue": "^3.0.0", + "vue-router": "^4.0.0-0", + "vuetify": "^3.0.0-alpha.0", + "vuex": "^4.0.0-0", + "webfontloader": "^1.0.0" }, "devDependencies": { "@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-eslint": "~4.5.0", - "@vue/cli-plugin-pwa": "~4.5.0", "@vue/cli-plugin-router": "~4.5.0", - "@vue/cli-service": "~4.5.0", + "@vue/cli-plugin-vuex": "~4.5.0", + "@vue/cli-service": "~5.0.0-beta.3", + "@vue/compiler-sfc": "^3.0.0", "babel-eslint": "^10.1.0", "eslint": "^6.7.2", - "eslint-plugin-vue": "^6.2.2", - "sass": "~1.32.0", + "eslint-plugin-vue": "^7.0.0", + "sass": "^1.38.0", "sass-loader": "^10.0.0", - "vue-cli-plugin-vuetify": "~2.4.2", - "vue-template-compiler": "^2.6.11", - "vuetify-loader": "^1.7.0" + "vue-cli-plugin-vuetify": "~2.4.3", + "vuetify-loader": "^2.0.0-alpha.0" } } diff --git a/ui/patches/vuetify+2.5.8.patch b/ui/patches/vuetify+2.5.8.patch deleted file mode 100644 index 6bf4e99..0000000 --- a/ui/patches/vuetify+2.5.8.patch +++ /dev/null @@ -1,425 +0,0 @@ -diff --git a/node_modules/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.sass b/node_modules/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.sass -index ee4419a..6d1ba3d 100644 ---- a/node_modules/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.sass -+++ b/node_modules/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.sass -@@ -9,7 +9,7 @@ - background-color: map-get($material, 'dividers') - - .v-divider -- border-color: map-get($material, 'dividers') -+ width: 0 - - // Block - .v-navigation-drawer -diff --git a/node_modules/vuetify/src/styles/settings/_variables.scss b/node_modules/vuetify/src/styles/settings/_variables.scss -index f5cc26b..6b998f1 100644 ---- a/node_modules/vuetify/src/styles/settings/_variables.scss -+++ b/node_modules/vuetify/src/styles/settings/_variables.scss -@@ -2,23 +2,24 @@ - - $color-pack: true !default; - --$body-font-family: 'Roboto', sans-serif !default; -+$body-font-family: 'Montserrat', sans-serif !default; - $font-size-root: 16px !default; - $line-height-root: 1.5 !default; - $border-radius-root: 4px !default; - - $rounded: () !default; - $rounded: map-deep-merge( -- ( -- 0: 0, -- 'sm': $border-radius-root / 2, -- null: $border-radius-root, -- 'lg': $border-radius-root * 2, -- 'xl': $border-radius-root * 6, -- 'pill': 9999px, -- 'circle': 50% -- ), -- $rounded -+ ( -+ 0: 0, -+ 'sm': $border-radius-root / 2, -+ null: $border-radius-root, -+ 'lg': $border-radius-root * 2, -+ 'xl': $border-radius-root * 3, -+ 'xxl': $border-radius-root * 6, -+ 'pill': 9999px, -+ 'circle': 50% -+ ), -+ $rounded - ); - - $spacer: 4px !default; -@@ -39,14 +40,14 @@ $negative-spacers: () !default; - - $grid-breakpoints: () !default; - $grid-breakpoints: map-deep-merge( -- ( -- 'xs': 0, -- 'sm': 600px, -- 'md': 960px, -- 'lg': 1280px - 16px, -- 'xl': 1920px - 16px -- ), -- $grid-breakpoints -+ ( -+ 'xs': 0, -+ 'sm': 600px, -+ 'md': 960px, -+ 'lg': 1280px - 16px, -+ 'xl': 1920px - 16px -+ ), -+ $grid-breakpoints - ); - - $grid-gutter: $spacer * 6 !default; -@@ -57,191 +58,191 @@ $container-padding-x: $grid-gutter / 2 !default; - - $grid-gutters: () !default; - $grid-gutters: map-deep-merge( -- ( -- 'xs': $grid-gutter / 12, -- 'sm': $grid-gutter / 6, -- 'md': $grid-gutter / 3, -- 'lg': $grid-gutter * 2/3, -- 'xl': $grid-gutter -- ), -- $grid-gutters -+ ( -+ 'xs': $grid-gutter / 12, -+ 'sm': $grid-gutter / 6, -+ 'md': $grid-gutter / 3, -+ 'lg': $grid-gutter * 2/3, -+ 'xl': $grid-gutter -+ ), -+ $grid-gutters - ); - - $container-max-widths: () !default; - $container-max-widths: map-deep-merge( -- ( -- 'md': map-get($grid-breakpoints, 'md') * 0.9375, -- 'lg': map-get($grid-breakpoints, 'lg') * 0.9375, -- 'xl': map-get($grid-breakpoints, 'xl') * 0.9375 -- ), -- $container-max-widths -+ ( -+ 'md': map-get($grid-breakpoints, 'md') * 0.9375, -+ 'lg': map-get($grid-breakpoints, 'lg') * 0.9375, -+ 'xl': map-get($grid-breakpoints, 'xl') * 0.9375 -+ ), -+ $container-max-widths - ); - - $display-breakpoints: () !default; - $display-breakpoints: map-deep-merge( -- ( -- 'print-only': 'only print', -- 'screen-only': 'only screen', -- 'xs-only': 'only screen and (max-width: #{map-get($grid-breakpoints, 'sm') - 1})', -- 'sm-only': 'only screen and (min-width: #{map-get($grid-breakpoints, 'sm')}) and (max-width: #{map-get($grid-breakpoints, 'md') - 1})', -- 'sm-and-down': 'only screen and (max-width: #{map-get($grid-breakpoints, 'md') - 1})', -- 'sm-and-up': 'only screen and (min-width: #{map-get($grid-breakpoints, 'sm')})', -- 'md-only': 'only screen and (min-width: #{map-get($grid-breakpoints, 'md')}) and (max-width: #{map-get($grid-breakpoints, 'lg') - 1})', -- 'md-and-down': 'only screen and (max-width: #{map-get($grid-breakpoints, 'lg') - 1})', -- 'md-and-up': 'only screen and (min-width: #{map-get($grid-breakpoints, 'md')})', -- 'lg-only': 'only screen and (min-width: #{map-get($grid-breakpoints, 'lg')}) and (max-width: #{map-get($grid-breakpoints, 'xl') - 1})', -- 'lg-and-down': 'only screen and (max-width: #{map-get($grid-breakpoints, 'xl') - 1})', -- 'lg-and-up': 'only screen and (min-width: #{map-get($grid-breakpoints, 'lg')})', -- 'xl-only': 'only screen and (min-width: #{map-get($grid-breakpoints, 'xl')})' -- ), -- $display-breakpoints -+ ( -+ 'print-only': 'only print', -+ 'screen-only': 'only screen', -+ 'xs-only': 'only screen and (max-width: #{map-get($grid-breakpoints, 'sm') - 1})', -+ 'sm-only': 'only screen and (min-width: #{map-get($grid-breakpoints, 'sm')}) and (max-width: #{map-get($grid-breakpoints, 'md') - 1})', -+ 'sm-and-down': 'only screen and (max-width: #{map-get($grid-breakpoints, 'md') - 1})', -+ 'sm-and-up': 'only screen and (min-width: #{map-get($grid-breakpoints, 'sm')})', -+ 'md-only': 'only screen and (min-width: #{map-get($grid-breakpoints, 'md')}) and (max-width: #{map-get($grid-breakpoints, 'lg') - 1})', -+ 'md-and-down': 'only screen and (max-width: #{map-get($grid-breakpoints, 'lg') - 1})', -+ 'md-and-up': 'only screen and (min-width: #{map-get($grid-breakpoints, 'md')})', -+ 'lg-only': 'only screen and (min-width: #{map-get($grid-breakpoints, 'lg')}) and (max-width: #{map-get($grid-breakpoints, 'xl') - 1})', -+ 'lg-and-down': 'only screen and (max-width: #{map-get($grid-breakpoints, 'xl') - 1})', -+ 'lg-and-up': 'only screen and (min-width: #{map-get($grid-breakpoints, 'lg')})', -+ 'xl-only': 'only screen and (min-width: #{map-get($grid-breakpoints, 'xl')})' -+ ), -+ $display-breakpoints - ); - - $font-weights: () !default; - $font-weights: map-deep-merge( -- ( -- 'thin': 100, -- 'light': 300, -- 'regular': 400, -- 'medium': 500, -- 'bold': 700, -- 'black': 900 -- ), -- $font-weights -+ ( -+ 'thin': 100, -+ 'light': 300, -+ 'regular': 400, -+ 'medium': 500, -+ 'bold': 700, -+ 'black': 900 -+ ), -+ $font-weights - ); - - $heading-font-family: $body-font-family !default; - - $headings: () !default; - $headings: map-deep-merge( -- ( -- 'h1': ( -- 'size': 6rem, -- 'weight': 300, -- 'line-height': 6rem, -- 'letter-spacing': -.015625em, -- 'font-family': $heading-font-family, -- 'text-transform': false -- ), -- 'h2': ( -- 'size': 3.75rem, -- 'weight': 300, -- 'line-height': 3.75rem, -- 'letter-spacing': -.0083333333em, -- 'font-family': $heading-font-family, -- 'text-transform': false -- ), -- 'h3': ( -- 'size': 3rem, -- 'weight': 400, -- 'line-height': 3.125rem, -- 'letter-spacing': normal, -- 'font-family': $heading-font-family, -- 'text-transform': false -- ), -- 'h4': ( -- 'size': 2.125rem, -- 'weight': 400, -- 'line-height': 2.5rem, -- 'letter-spacing': .0073529412em, -- 'font-family': $heading-font-family, -- 'text-transform': false -- ), -- 'h5': ( -- 'size': 1.5rem, -- 'weight': 400, -- 'line-height': 2rem, -- 'letter-spacing': normal, -- 'font-family': $heading-font-family, -- 'text-transform': false -- ), -- 'h6': ( -- 'size': 1.25rem, -- 'weight': 500, -- 'line-height': 2rem, -- 'letter-spacing': .0125em, -- 'font-family': $heading-font-family, -- 'text-transform': false -- ), -- 'subtitle-1': ( -- 'size': 1rem, -- 'weight': normal, -- 'line-height': 1.75rem, -- 'letter-spacing': .009375em, -- 'font-family': $body-font-family, -- 'text-transform': false -- ), -- 'subtitle-2': ( -- 'size': .875rem, -- 'weight': 500, -- 'line-height': 1.375rem, -- 'letter-spacing': .0071428571em, -- 'font-family': $body-font-family, -- 'text-transform': false -- ), -- 'body-1': ( -- 'size': 1rem, -- 'weight': 400, -- 'line-height': 1.5rem, -- 'letter-spacing': .03125em, -- 'font-family': $body-font-family, -- 'text-transform': false -- ), -- 'body-2': ( -- 'size': .875rem, -- 'weight': 400, -- 'line-height': 1.25rem, -- 'letter-spacing': .0178571429em, -- 'font-family': $body-font-family, -- 'text-transform': false -- ), -- 'button': ( -- 'size': .875rem, -- 'weight': 500, -- 'line-height': 2.25rem, -- 'letter-spacing': .0892857143em, -- 'font-family': $body-font-family, -- 'text-transform': uppercase -- ), -- 'caption': ( -- 'size': .75rem, -- 'weight': 400, -- 'line-height': 1.25rem, -- 'letter-spacing': .0333333333em, -- 'font-family': $body-font-family, -- 'text-transform': false -- ), -- 'overline': ( -- 'size': .75rem, -- 'weight': 500, -- 'line-height': 2rem, -- 'letter-spacing': .1666666667em, -- 'font-family': $body-font-family, -- 'text-transform': uppercase -- ) -- ), -- $headings -+ ( -+ 'h1': ( -+ 'size': 6rem, -+ 'weight': 300, -+ 'line-height': 6rem, -+ 'letter-spacing': -.015625em, -+ 'font-family': $heading-font-family, -+ 'text-transform': false -+ ), -+ 'h2': ( -+ 'size': 3.75rem, -+ 'weight': 300, -+ 'line-height': 3.75rem, -+ 'letter-spacing': -.0083333333em, -+ 'font-family': $heading-font-family, -+ 'text-transform': false -+ ), -+ 'h3': ( -+ 'size': 3rem, -+ 'weight': 400, -+ 'line-height': 3.125rem, -+ 'letter-spacing': normal, -+ 'font-family': $heading-font-family, -+ 'text-transform': false -+ ), -+ 'h4': ( -+ 'size': 2.125rem, -+ 'weight': 400, -+ 'line-height': 2.5rem, -+ 'letter-spacing': .0073529412em, -+ 'font-family': $heading-font-family, -+ 'text-transform': false -+ ), -+ 'h5': ( -+ 'size': 1.5rem, -+ 'weight': 400, -+ 'line-height': 2rem, -+ 'letter-spacing': normal, -+ 'font-family': $heading-font-family, -+ 'text-transform': false -+ ), -+ 'h6': ( -+ 'size': 1.25rem, -+ 'weight': 500, -+ 'line-height': 2rem, -+ 'letter-spacing': .0125em, -+ 'font-family': $heading-font-family, -+ 'text-transform': false -+ ), -+ 'subtitle-1': ( -+ 'size': 1rem, -+ 'weight': normal, -+ 'line-height': 1.75rem, -+ 'letter-spacing': .009375em, -+ 'font-family': $body-font-family, -+ 'text-transform': false -+ ), -+ 'subtitle-2': ( -+ 'size': .875rem, -+ 'weight': 500, -+ 'line-height': 1.375rem, -+ 'letter-spacing': .0071428571em, -+ 'font-family': $body-font-family, -+ 'text-transform': false -+ ), -+ 'body-1': ( -+ 'size': 1rem, -+ 'weight': 400, -+ 'line-height': 1.5rem, -+ 'letter-spacing': .03125em, -+ 'font-family': $body-font-family, -+ 'text-transform': false -+ ), -+ 'body-2': ( -+ 'size': .875rem, -+ 'weight': 400, -+ 'line-height': 1.25rem, -+ 'letter-spacing': .0178571429em, -+ 'font-family': $body-font-family, -+ 'text-transform': false -+ ), -+ 'button': ( -+ 'size': .875rem, -+ 'weight': 500, -+ 'line-height': 2.25rem, -+ 'letter-spacing': .0892857143em, -+ 'font-family': $body-font-family, -+ 'text-transform': uppercase -+ ), -+ 'caption': ( -+ 'size': .75rem, -+ 'weight': 400, -+ 'line-height': 1.25rem, -+ 'letter-spacing': .0333333333em, -+ 'font-family': $body-font-family, -+ 'text-transform': false -+ ), -+ 'overline': ( -+ 'size': .75rem, -+ 'weight': 500, -+ 'line-height': 2rem, -+ 'letter-spacing': .1666666667em, -+ 'font-family': $body-font-family, -+ 'text-transform': uppercase -+ ) -+ ), -+ $headings - ); - - $typography: () !default; - @each $type, $values in $headings { - $typography: map-deep-merge( -- $typography, -- (#{$type}: map-values($values)) -+ $typography, -+ (#{$type}: map-values($values)) - ); - } - - $transition: () !default; - $transition: map-deep-merge( -- ( -- 'fast-out-slow-in': cubic-bezier(0.4, 0, 0.2, 1), -- 'linear-out-slow-in': cubic-bezier(0, 0, 0.2, 1), -- 'fast-out-linear-in': cubic-bezier(0.4, 0, 1, 1), -- 'ease-in-out': cubic-bezier(0.4, 0, 0.6, 1), -- 'fast-in-fast-out': cubic-bezier(0.25, 0.8, 0.25, 1), -- 'swing': cubic-bezier(0.25, 0.8, 0.5, 1) -- ), -- $transition -+ ( -+ 'fast-out-slow-in': cubic-bezier(0.4, 0, 0.2, 1), -+ 'linear-out-slow-in': cubic-bezier(0, 0, 0.2, 1), -+ 'fast-out-linear-in': cubic-bezier(0.4, 0, 1, 1), -+ 'ease-in-out': cubic-bezier(0.4, 0, 0.6, 1), -+ 'fast-in-fast-out': cubic-bezier(0.25, 0.8, 0.25, 1), -+ 'swing': cubic-bezier(0.25, 0.8, 0.5, 1) -+ ), -+ $transition - ); - $primary-transition: 0.3s map-get($transition, 'swing') !default; - $secondary-transition: 0.2s map-get($transition, 'ease-in-out') !default; diff --git a/ui/public/img/icons/android-chrome-192x192.png b/ui/public/img/icons/android-chrome-192x192.png deleted file mode 100644 index b02aa64..0000000 Binary files a/ui/public/img/icons/android-chrome-192x192.png and /dev/null differ diff --git a/ui/public/img/icons/android-chrome-512x512.png b/ui/public/img/icons/android-chrome-512x512.png deleted file mode 100644 index 06088b0..0000000 Binary files a/ui/public/img/icons/android-chrome-512x512.png and /dev/null differ diff --git a/ui/public/img/icons/android-chrome-maskable-192x192.png b/ui/public/img/icons/android-chrome-maskable-192x192.png deleted file mode 100644 index 791e9c8..0000000 Binary files a/ui/public/img/icons/android-chrome-maskable-192x192.png and /dev/null differ diff --git a/ui/public/img/icons/android-chrome-maskable-512x512.png b/ui/public/img/icons/android-chrome-maskable-512x512.png deleted file mode 100644 index 5f2098e..0000000 Binary files a/ui/public/img/icons/android-chrome-maskable-512x512.png and /dev/null differ diff --git a/ui/public/img/icons/apple-touch-icon-120x120.png b/ui/public/img/icons/apple-touch-icon-120x120.png deleted file mode 100644 index 1427cf6..0000000 Binary files a/ui/public/img/icons/apple-touch-icon-120x120.png and /dev/null differ diff --git a/ui/public/img/icons/apple-touch-icon-152x152.png b/ui/public/img/icons/apple-touch-icon-152x152.png deleted file mode 100644 index f24d454..0000000 Binary files a/ui/public/img/icons/apple-touch-icon-152x152.png and /dev/null differ diff --git a/ui/public/img/icons/apple-touch-icon-180x180.png b/ui/public/img/icons/apple-touch-icon-180x180.png deleted file mode 100644 index 404e192..0000000 Binary files a/ui/public/img/icons/apple-touch-icon-180x180.png and /dev/null differ diff --git a/ui/public/img/icons/apple-touch-icon-60x60.png b/ui/public/img/icons/apple-touch-icon-60x60.png deleted file mode 100644 index cf10a56..0000000 Binary files a/ui/public/img/icons/apple-touch-icon-60x60.png and /dev/null differ diff --git a/ui/public/img/icons/apple-touch-icon-76x76.png b/ui/public/img/icons/apple-touch-icon-76x76.png deleted file mode 100644 index c500769..0000000 Binary files a/ui/public/img/icons/apple-touch-icon-76x76.png and /dev/null differ diff --git a/ui/public/img/icons/apple-touch-icon.png b/ui/public/img/icons/apple-touch-icon.png deleted file mode 100644 index 03c0c5d..0000000 Binary files a/ui/public/img/icons/apple-touch-icon.png and /dev/null differ diff --git a/ui/public/img/icons/favicon-16x16.png b/ui/public/img/icons/favicon-16x16.png deleted file mode 100644 index 42af009..0000000 Binary files a/ui/public/img/icons/favicon-16x16.png and /dev/null differ diff --git a/ui/public/img/icons/favicon-32x32.png b/ui/public/img/icons/favicon-32x32.png deleted file mode 100644 index 46ca04d..0000000 Binary files a/ui/public/img/icons/favicon-32x32.png and /dev/null differ diff --git a/ui/public/img/icons/msapplication-icon-144x144.png b/ui/public/img/icons/msapplication-icon-144x144.png deleted file mode 100644 index 7808237..0000000 Binary files a/ui/public/img/icons/msapplication-icon-144x144.png and /dev/null differ diff --git a/ui/public/img/icons/mstile-150x150.png b/ui/public/img/icons/mstile-150x150.png deleted file mode 100644 index 3b37a43..0000000 Binary files a/ui/public/img/icons/mstile-150x150.png and /dev/null differ diff --git a/ui/public/img/icons/safari-pinned-tab.svg b/ui/public/img/icons/safari-pinned-tab.svg deleted file mode 100644 index e44c0d5..0000000 --- a/ui/public/img/icons/safari-pinned-tab.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/ui/public/index.html b/ui/public/index.html index bc51465..4123528 100644 --- a/ui/public/index.html +++ b/ui/public/index.html @@ -6,8 +6,6 @@ <%= htmlWebpackPlugin.options.title %> - -