├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── bin ├── serve.sh └── test.sh ├── docker-compose.override.yml.prod.template ├── docker-compose.test.yml ├── docker-compose.yml ├── index.js ├── package-lock.json ├── package.json ├── public ├── _favicon.ico ├── _index.html ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── assets │ ├── Drawing.svg │ ├── css │ │ ├── alerts.css │ │ ├── animations │ │ │ ├── landing.css │ │ │ ├── scroll.css │ │ │ └── upload-form-animations.css │ │ ├── content │ │ │ ├── buttons.css │ │ │ └── icons.css │ │ ├── credits.css │ │ ├── grids │ │ │ ├── desktop-grid.css │ │ │ └── mobile-grid.css │ │ ├── landing.css │ │ ├── modal.css │ │ ├── others │ │ │ ├── cf.css │ │ │ └── normalize.css │ │ ├── section-animation.css │ │ ├── table.css │ │ └── upload-form.css │ ├── dir.css │ ├── fonts.css │ ├── fonts │ │ ├── confortaa-font │ │ │ ├── Comfortaa-Bold.woff │ │ │ ├── Comfortaa-Bold.woff2 │ │ │ ├── Comfortaa-Thin.woff │ │ │ ├── Comfortaa-Thin.woff2 │ │ │ ├── Comfortaa.woff │ │ │ ├── Comfortaa.woff2 │ │ │ └── stylesheet.css │ │ ├── custom-icons │ │ │ ├── Flaticon.eot │ │ │ ├── Flaticon.svg │ │ │ ├── Flaticon.ttf │ │ │ ├── Flaticon.woff │ │ │ ├── _flaticon.scss │ │ │ ├── file.svg │ │ │ ├── flaticon.css │ │ │ └── folder.svg │ │ ├── fontawesome-all.css │ │ ├── helvetica-neue │ │ │ ├── HelveticaNeue.woff │ │ │ ├── HelveticaNeue.woff2 │ │ │ └── stylesheet.css │ │ └── share-btn │ │ │ ├── Flaticon.eot │ │ │ ├── Flaticon.svg │ │ │ ├── Flaticon.ttf │ │ │ ├── Flaticon.woff │ │ │ ├── _flaticon.scss │ │ │ ├── flaticon.css │ │ │ └── flaticon.html │ ├── gfx │ │ ├── background.svg │ │ ├── countable-logo.png │ │ ├── custom-icons │ │ │ └── upload-icon.svg │ │ ├── landing │ │ │ ├── chrome-square.svg │ │ │ ├── countable-web.png │ │ │ ├── crypto-icon.svg │ │ │ ├── firefox-square.svg │ │ │ ├── how-it-works.svg │ │ │ ├── laptop.svg │ │ │ └── safari-square.svg │ │ ├── logo.svg │ │ ├── octocat.png │ │ ├── server.svg │ │ ├── square.png │ │ └── upload-form │ │ │ ├── cloud.svg │ │ │ ├── icons │ │ │ ├── analytics.svg │ │ │ ├── folder.svg │ │ │ ├── links.svg │ │ │ ├── list.svg │ │ │ ├── trash.svg │ │ │ └── upload.svg │ │ │ ├── laptop.png │ │ │ ├── locker.svg │ │ │ └── spinning-locker.svg │ ├── index.css │ ├── js │ │ ├── copy-clipboard.js │ │ ├── email-validation.js │ │ ├── header-animation.js │ │ ├── izimodal │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── bower.json │ │ │ ├── css │ │ │ │ ├── iziModal.css │ │ │ │ └── iziModal.min.css │ │ │ ├── js │ │ │ │ ├── iziModal.js │ │ │ │ └── iziModal.min.js │ │ │ └── package.json │ │ ├── landing-animations.js │ │ ├── modal-handler.js │ │ ├── navbar.js │ │ ├── scroll-section.js │ │ ├── upload-form-animations.js │ │ └── upload-form-handler.js │ └── webfonts │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.svg │ │ ├── fa-brands-400.ttf │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.eot │ │ ├── fa-regular-400.svg │ │ ├── fa-regular-400.ttf │ │ ├── fa-regular-400.woff │ │ ├── fa-regular-400.woff2 │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.svg │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ └── fa-solid-900.woff2 ├── credits.html ├── dir.html ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── index.html ├── js │ ├── cipher.js │ ├── classes │ │ └── Display.js │ └── dir.js ├── mstile-150x150.png └── upload.html ├── send.js ├── test └── api.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | data/* 2 | public/data 3 | docker-compose.override.yml 4 | .idea 5 | 6 | # Logs 7 | logs 8 | *.log 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (http://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # Typescript v1 declaration files 45 | typings/ 46 | 47 | # Optional npm cache directory 48 | .npm 49 | 50 | # Optional eslint cache 51 | .eslintcache 52 | 53 | # Optional REPL history 54 | .node_repl_history 55 | 56 | # Output of 'npm pack' 57 | *.tgz 58 | 59 | # Yarn Integrity file 60 | .yarn-integrity 61 | 62 | # dotenv environment variables file 63 | .env 64 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:9-alpine 2 | 3 | RUN apk update && apk upgrade && \ 4 | apk add --no-cache git 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Countable Web Productions 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CryptSend.io 2 | 3 | ### Stop leaking private data on the cloud. 4 | Share files with people you trust, and not all the cloud providers in between. Cryptsend encrypts your data on the client so no server ever sees it. Only people you send your secure web link to can access the data (so be careful with the link of course). 5 | 6 | ## Quickstart 7 | 8 | Before you start, make sure you have docker and docker-compose installed on your machine 9 | 10 | 1. Grab the repo 11 | ``` 12 | git clone git@github.com:countable-web/cryptsend.git 13 | ``` 14 | 15 | 2. Run docker setup 16 | ``` 17 | docker-compose up 18 | ``` 19 | 20 | Your site should now be running at 0.0.0.0:1234 21 | 22 | ## Concept 23 | 24 | Send files anywhere -> anywhere securely 25 | 26 | The concept is that it's 2018 and there's no really good general purpose file sharing tool. 27 | 28 | | Feature | WeTransfer etc. | FTP | email | CryptSend | 29 | | --- | --- | --- | --- | --- | 30 | | open source | no | yes | some | yes | 31 | | trustless client encryption | no | no | no | yes | 32 | | self host | no | some | some | yes | 33 | | web interface | yes | some | some | yes | 34 | | secure link / no auth | no | no | no | yes | 35 | | works with big files | some | yes | no | yes | 36 | | dependency free (javascript) | yes | some | no | yes | 37 | 38 | This would be useful for any transmission of sensitive data you don't want a trail of in emails, or for files too big for email. The closest thing I've found to this service is things like wetransfer.com but they only fill some of the above bullets. 39 | 40 | ## Discussion 41 | 42 | We manage issues and features in [Trello](https://trello.com/b/8NzklvZI/cryptsend-public), not the GitHub issues. 43 | -------------------------------------------------------------------------------- /bin/serve.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | yarn 4 | 5 | npm install 6 | node index.js 7 | -------------------------------------------------------------------------------- /bin/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | docker-compose -f docker-compose.yml -f docker-compose.test.yml up 4 | -------------------------------------------------------------------------------- /docker-compose.override.yml.prod.template: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | web: 5 | ports: 6 | - "80:1234" 7 | environment: 8 | - NODE_ENV=production 9 | - SENTRY_DSN=http://96fb5d27720b42fb94b6fc741408d540:4b700fa84dbc476d9ce6e410e33a00f4@bool.countable.ca:9000/7 10 | restart: always 11 | -------------------------------------------------------------------------------- /docker-compose.test.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | web: 5 | ports: 6 | - "80:1234" 7 | environment: 8 | - NODE_ENV=development 9 | command: ./node_modules/mocha/bin/mocha --exit 10 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | web: 5 | build: . 6 | volumes: 7 | - .:/code/ 8 | working_dir: /code/ 9 | command: bin/serve.sh 10 | ports: 11 | - 1234:1234 12 | #command: tail -f /dev/null 13 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const http = require('http'); 2 | const exec = require('child_process').exec; 3 | const formidable = require('formidable'); 4 | const fs = require('fs'); 5 | const crypto = require('crypto'); 6 | const mkdirp = require('mkdirp'); 7 | const path = require('path'); 8 | const slug = require('slug'); 9 | const raven = require('raven'); 10 | const mustache = require('mustache'); 11 | 12 | raven.config(process.env.SENTRY_DSN).install(); 13 | 14 | const server = process.env.SERVER || 'http://localhost:1234'; 15 | 16 | const base64urltok = (l) => { 17 | return crypto.randomBytes(l).toString('base64') 18 | .replace(/\//g, '-') 19 | .replace(/=/g, ''); 20 | } 21 | 22 | const mkdir = (req, res) => { 23 | var hash = 24 | base64urltok(2) + 25 | '/' + 26 | base64urltok(22); 27 | var target = 'data/' + hash; 28 | 29 | mkdirp('./' + target, err => { 30 | res.writeHead(302, { 31 | 'Location': '/dir/' + target 32 | //add other headers here... 33 | }); 34 | res.end(); 35 | }); 36 | } 37 | 38 | const upload = (req, res) => { 39 | const form = new formidable.IncomingForm(); 40 | var paths = [], 41 | ajax = false; 42 | 43 | // console.log('File path on Upload:', req.file_path); 44 | 45 | form.uploadDir = req.file_path; 46 | 47 | form.on('error', function(error) { 48 | res.end(error.message); 49 | }); 50 | 51 | form.on('fileBegin', function(name, file) { 52 | //rename the incoming file to the file's name 53 | //TODO: Possible problem when using POSIX file paths on Windows. 54 | //DONE: Using path.sep instead of "/" (which is not Windows compliant). 55 | // file.path = form.uploadDir + "/" + encodeURIComponent(file.name); 56 | // console.log('Upload Directory:', form.uploadDir); 57 | // console.log('File Name:', file.name); 58 | // console.log('Encoded File Name:', encodeURIComponent(file.name)); 59 | file.path = form.uploadDir + path.sep + encodeURIComponent(file.name); 60 | // console.log('File Path:', file.path); 61 | paths.push(file.path); 62 | }); 63 | 64 | form.on('field', function(name, value) { 65 | //TODO: There is a hidden input named ajax with a value set to 1 on the dir.html file. Why do we have to check for the field here if we know it is hardcoded (and under normal circumstances, unchangeable) in the form? 66 | if (name === 'ajax') { 67 | ajax = true; 68 | } 69 | }); 70 | 71 | form.on('end', function() { 72 | var content, contentType, success = true; 73 | if (paths.length) { 74 | // console.log('paths', paths); 75 | // New paths: 76 | var newfiles = paths.map(function(f) { 77 | return server + f.replace(/^.\/public/g, ''); 78 | }); 79 | // TODO: Whas this variable (message) initialized somewhere? Am I missing something? 80 | message = "saved to " + newfiles.join(','); 81 | } else { 82 | message = "no file uploaded"; 83 | success = false; 84 | } 85 | if (ajax) { 86 | content = JSON.stringify({ 87 | success: success, 88 | message: message, 89 | dir: form.uploadDir.replace(/^.\/public/g, '') 90 | }); 91 | contentType = 'application/json'; 92 | } else { 93 | content = message; 94 | contentType = 'text/plain'; 95 | } 96 | res.writeHead(success ? 200 : 400, { 97 | 'Content-Type': contentType 98 | }); 99 | res.write(content) 100 | res.end(); 101 | }); 102 | form.parse(req); 103 | } 104 | 105 | 106 | // Used to determine the versioning of frontend assets. 107 | exec(`git rev-parse --short HEAD`, function(err, stdout, stderr) { 108 | let version = "0"; 109 | if (err) { 110 | console.log("ERROR: When loading git version:", err); 111 | return; 112 | } 113 | if (stderr) { 114 | console.log("ERROR: stderr when loading git version:", stderr); 115 | return; 116 | } 117 | 118 | version = stdout.toString().replace(/\s/g, ''); 119 | console.log("Setting version to revision:", version); 120 | REVISION = version; 121 | }); 122 | let _version = null; // overwrite me. 123 | 124 | const ls = (req, res) => { 125 | // directoryindex. 126 | fs.readdir(req.file_path, (error, files) => { 127 | if (error) { 128 | if (error.code === 'ENOENT') { 129 | res.writeHead(404); 130 | res.end("404"); 131 | } 132 | res.writeHead(500); 133 | return res.end('error: ' + error.code + ' ..\n'); 134 | } 135 | 136 | res.writeHead(200, { 137 | 'Content-Type': 'application/json' 138 | }); 139 | return res.end(JSON.stringify(files), 'utf-8'); 140 | }) 141 | 142 | } 143 | 144 | const cat = (req, res) => { 145 | var extname = path.extname(req.file_path); 146 | var contentType = 'application/octet-stream'; 147 | switch (extname) { 148 | case '.txt': 149 | contentType = 'text/plain'; 150 | break; 151 | case '.htm': 152 | case '.html': 153 | contentType = 'text/html'; 154 | break; 155 | case '.js': 156 | contentType = 'text/javascript'; 157 | break; 158 | case '.css': 159 | contentType = 'text/css'; 160 | break; 161 | case '.png': 162 | contentType = 'image/png'; 163 | break; 164 | case '.jpg': 165 | contentType = 'image/jpg'; 166 | break; 167 | case '.svg': 168 | contentType = 'image/svg+xml'; 169 | break; 170 | } 171 | fs.readFile(req.file_path, function(error, content) { 172 | if (error) { 173 | console.error(error); 174 | if (error.code === 'ENOENT') { 175 | return http404(res); 176 | } else { 177 | res.writeHead(500); 178 | res.end('error: ' + error.code + ' ..\n'); 179 | } 180 | } else { 181 | if (extname === '.html' || extname === '.htm') { 182 | content = mustache.to_html(content.toString(), { 183 | REVISION: REVISION 184 | }); 185 | } 186 | res.writeHead(200, { 187 | 'Content-Type': contentType 188 | }); 189 | res.end(content, 'utf-8'); 190 | } 191 | }); 192 | 193 | } 194 | 195 | const http404 = (res) => { 196 | res.writeHead(404); 197 | res.end("no such file."); 198 | } 199 | 200 | const del = (req, res) => { 201 | // console.log('Path on delete', req.file_path); 202 | fs.unlink(req.file_path, (error) => { 203 | if (error) { 204 | console.error(error); 205 | if (error.code === 'ENOENT') { 206 | return http404(res); 207 | } else { 208 | res.writeHead(500); 209 | res.end('error: ' + error.code + ' ..\n'); 210 | } 211 | } else { 212 | res.writeHead(204); 213 | res.end(); 214 | } 215 | }); 216 | } 217 | 218 | http.createServer((req, res) => { 219 | 220 | var _tmp = req.url.split("?"); 221 | const query = _tmp[1]; 222 | var toks = _tmp[0].split("/"); 223 | 224 | req.file_path = toks.slice(2).join(path.sep); 225 | var command = toks[1]; 226 | 227 | if (req.method === 'DELETE') { 228 | return del(req, res); 229 | } 230 | 231 | if (req.method === 'POST') { 232 | return upload(req, res); 233 | } 234 | 235 | if (command === 'fail') { 236 | throw new Error('Test Trace'); 237 | } 238 | 239 | if (command === '') { 240 | command = 'cat'; 241 | req.file_path = `public${path.sep}index.html`; 242 | } 243 | 244 | if (command === 'ls') { 245 | 246 | if (toks[2] === 'data' && 247 | toks.length === 5 && 248 | toks[4].length > 0) { 249 | return ls(req, res); 250 | } 251 | } else if (command === 'dir') { 252 | req.file_path = `public${path.sep}dir.html`; 253 | return cat(req, res); 254 | } else if (command === 'cat') { 255 | let root = req.file_path.split(path.sep)[0]; 256 | if (root === 'data' || root === 'public') { 257 | return cat(req, res); 258 | } 259 | } else if (command === 'mkdir') { 260 | return mkdir(req, res); 261 | } 262 | return http404(res); 263 | 264 | 265 | }).listen(1234); 266 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sendcrypt", 3 | "version": "1.0.0", 4 | "description": "securely send files", 5 | "main": "index.js", 6 | "dependencies": { 7 | "formidable": "^1.1.1", 8 | "minimist": "^1.2.0", 9 | "mkdirp": "^0.5.1", 10 | "mustache": "^2.3.0", 11 | "raven": "^2.6.0", 12 | "request": "^2.83.0", 13 | "slug": "^0.9.1" 14 | }, 15 | "devDependencies": { 16 | "mocha": "^5.1.1", 17 | "superagent": "^3.8.3" 18 | }, 19 | "scripts": { 20 | "test": "mocha" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "git+ssh://git@github.com/countable-web/sendcrypt.git" 25 | }, 26 | "author": "Clark Van Oyen", 27 | "license": "MIT", 28 | "bugs": { 29 | "url": "https://github.com/countable-web/sendcrypt/issues" 30 | }, 31 | "homepage": "https://github.com/countable-web/sendcrypt#readme", 32 | "keywords": [ 33 | "send", 34 | "files", 35 | "securely" 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /public/_favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/_favicon.ico -------------------------------------------------------------------------------- /public/_index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | SendCrypt | Upload 9 | 10 | 11 |
12 | Upload Files 13 |
14 | 15 | 16 | -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/assets/Drawing.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /public/assets/css/alerts.css: -------------------------------------------------------------------------------- 1 | .box-alert { 2 | width: 100%; 3 | box-sizing: border-box; 4 | 5 | 6 | border-radius: 0.5rem; 7 | padding: .8rem; 8 | display: inline-block; 9 | float: left; 10 | font-family: Roboto, sans-serif; 11 | font-size: 0.8rem; 12 | position:relative; 13 | margin-bottom: -0.05rem; 14 | margin-top: 0.45rem; 15 | 16 | } 17 | 18 | .warning { 19 | border: solid 1px #c0760942; 20 | color: #6a4510; 21 | background-color: #FFF3CD; 22 | } 23 | 24 | .success { 25 | background-color: #D4EDDA; 26 | border: solid 1px #C3E6CB; 27 | color: #155724; 28 | } 29 | 30 | .danger { 31 | background-color: #F8D7DA; 32 | border: solid 1px #F5C6CB; 33 | color: #881C59; 34 | } 35 | 36 | .info { 37 | background-color: #D1ECF1; 38 | border: solid 1px #BEE5EB; 39 | color: #2B6C77; 40 | } 41 | 42 | 43 | 44 | 45 | .box-alert-icon { 46 | margin-right:.3rem; 47 | } 48 | 49 | .box-alert-close-icon { 50 | position: absolute; 51 | top: 0.4rem; 52 | right: 0.5rem; 53 | opacity: 0.6; 54 | font-size: 0.7rem; 55 | } 56 | 57 | .box-alert-list { 58 | padding-left: 2rem; 59 | padding-top: .5rem; 60 | margin: 0; 61 | } 62 | 63 | .box-alert-list li { 64 | margin-bottom: 0.2rem; 65 | } -------------------------------------------------------------------------------- /public/assets/css/animations/landing.css: -------------------------------------------------------------------------------- 1 | .heartbeat { 2 | -webkit-animation: heartbeat 1.5s ease-in-out infinite both; 3 | animation: heartbeat 1.5s ease-in-out infinite both; 4 | } 5 | 6 | /* ---------------------------------------------- 7 | * Generated by Animista on 2018-4-10 12:15:34 8 | * w: http://animista.net, t: @cssanimista 9 | * ---------------------------------------------- */ 10 | 11 | /** 12 | * ---------------------------------------- 13 | * animation heartbeat 14 | * ---------------------------------------- 15 | */ 16 | @-webkit-keyframes heartbeat { 17 | from { 18 | -webkit-transform: scale(1); 19 | transform: scale(1); 20 | -webkit-transform-origin: center center; 21 | transform-origin: center center; 22 | -webkit-animation-timing-function: ease-out; 23 | animation-timing-function: ease-out; 24 | } 25 | 10% { 26 | -webkit-transform: scale(0.91); 27 | transform: scale(0.91); 28 | -webkit-animation-timing-function: ease-in; 29 | animation-timing-function: ease-in; 30 | } 31 | 17% { 32 | -webkit-transform: scale(0.98); 33 | transform: scale(0.98); 34 | -webkit-animation-timing-function: ease-out; 35 | animation-timing-function: ease-out; 36 | } 37 | 33% { 38 | -webkit-transform: scale(0.87); 39 | transform: scale(0.87); 40 | -webkit-animation-timing-function: ease-in; 41 | animation-timing-function: ease-in; 42 | } 43 | 45% { 44 | -webkit-transform: scale(1); 45 | transform: scale(1); 46 | -webkit-animation-timing-function: ease-out; 47 | animation-timing-function: ease-out; 48 | } 49 | } 50 | @keyframes heartbeat { 51 | from { 52 | -webkit-transform: scale(1); 53 | transform: scale(1); 54 | -webkit-transform-origin: center center; 55 | transform-origin: center center; 56 | -webkit-animation-timing-function: ease-out; 57 | animation-timing-function: ease-out; 58 | } 59 | 10% { 60 | -webkit-transform: scale(0.91); 61 | transform: scale(0.91); 62 | -webkit-animation-timing-function: ease-in; 63 | animation-timing-function: ease-in; 64 | } 65 | 17% { 66 | -webkit-transform: scale(0.98); 67 | transform: scale(0.98); 68 | -webkit-animation-timing-function: ease-out; 69 | animation-timing-function: ease-out; 70 | } 71 | 33% { 72 | -webkit-transform: scale(0.87); 73 | transform: scale(0.87); 74 | -webkit-animation-timing-function: ease-in; 75 | animation-timing-function: ease-in; 76 | } 77 | 45% { 78 | -webkit-transform: scale(1); 79 | transform: scale(1); 80 | -webkit-animation-timing-function: ease-out; 81 | animation-timing-function: ease-out; 82 | } 83 | } 84 | 85 | 86 | /* ------------------------------------------------------------| 87 | | SLIDE DOWN ANIMATIONS 88 | *-------------------------------------------------------------*/ 89 | 90 | .slider { 91 | overflow-y: hidden; 92 | max-height: 500px; /* approximate max height */ 93 | 94 | transition-property: all; 95 | transition-duration: .5s; 96 | transition-timing-function: cubic-bezier(0, 1, 0.5, 1); 97 | } 98 | 99 | .slider.closed { 100 | max-height: 0; 101 | } -------------------------------------------------------------------------------- /public/assets/css/animations/scroll.css: -------------------------------------------------------------------------------- 1 | .scroll-downs { 2 | position: absolute; 3 | 4 | right: 0; 5 | bottom: 10vh; 6 | left: 0; 7 | margin: auto; 8 | 9 | width: 34px; 10 | height: 55px; 11 | z-index:9999; 12 | } 13 | 14 | .mousey { 15 | width: 3px; 16 | padding: 10px 15px; 17 | height: 35px; 18 | border: 2px solid #fff; 19 | border-radius: 25px; 20 | opacity: 0.75; 21 | box-sizing: content-box; 22 | } 23 | 24 | .scroller { 25 | width: 3px; 26 | height: 10px; 27 | border-radius: 25%; 28 | background-color: #fff; 29 | animation-name: scroll; 30 | animation-duration: 2.2s; 31 | animation-timing-function: cubic-bezier(.15, .41, .69, .94); 32 | animation-iteration-count: infinite; 33 | } 34 | 35 | @keyframes scroll { 36 | 0% { 37 | opacity: 0; 38 | } 39 | 10% { 40 | transform: translateY(0); 41 | opacity: 1; 42 | } 43 | 100% { 44 | transform: translateY(15px); 45 | opacity: 0; 46 | } 47 | } -------------------------------------------------------------------------------- /public/assets/css/animations/upload-form-animations.css: -------------------------------------------------------------------------------- 1 | .rotate-center { 2 | -webkit-animation: rotate-center 0.6s ease-in-out both; 3 | animation: rotate-center 0.6s ease-in-out both; 4 | } 5 | 6 | /* ---------------------------------------------- 7 | * Generated by Animista on 2018-5-3 18:44:36 8 | * w: http://animista.net, t: @cssanimista 9 | * ---------------------------------------------- */ 10 | 11 | /** 12 | * ---------------------------------------- 13 | * animation rotate-center 14 | * ---------------------------------------- 15 | */ 16 | @-webkit-keyframes rotate-center { 17 | 0% { 18 | -webkit-transform: rotate(0); 19 | transform: rotate(0); 20 | } 21 | 100% { 22 | -webkit-transform: rotate(360deg); 23 | transform: rotate(360deg); 24 | } 25 | } 26 | @keyframes rotate-center { 27 | 0% { 28 | -webkit-transform: rotate(0); 29 | transform: rotate(0); 30 | } 31 | 100% { 32 | -webkit-transform: rotate(360deg); 33 | transform: rotate(360deg); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /public/assets/css/content/buttons.css: -------------------------------------------------------------------------------- 1 | .btn-link { 2 | text-decoration: none; 3 | color:inherit; 4 | } 5 | 6 | .btn-or { 7 | font-family: "Comfortaa Light", sans-serif; 8 | font-size:.9rem; 9 | opacity:.8; 10 | padding-left:1rem; 11 | padding-right:1rem; 12 | color:#41464C; 13 | } 14 | 15 | .btn { 16 | font-size: 1rem; 17 | font-family: 'Helvetica Neue', serif; 18 | font-weight: normal; 19 | text-align: center; 20 | padding: 0.7rem 0.5rem; 21 | color: white; 22 | display: inline-block; 23 | 24 | } 25 | 26 | .btn a { 27 | text-decoration: none; 28 | color: inherit; 29 | text-underline: none; 30 | display: block; 31 | box-sizing: border-box; 32 | margin: 0; 33 | padding: 0; 34 | } 35 | 36 | .btn-center { 37 | margin: 0 auto; 38 | } 39 | 40 | .btn-primary { 41 | background-color: #355FF2; 42 | padding-left:3rem; 43 | padding-right:3rem; 44 | } 45 | 46 | 47 | 48 | .btn-cta { 49 | background-color: #F13E41; 50 | padding-left:3rem; 51 | padding-right:3rem; 52 | } 53 | 54 | 55 | /*MOBILE ONLY CODE*/ 56 | @media screen and (max-width: 700px) { 57 | 58 | .btn-cta { 59 | padding-left: 1.5rem; 60 | padding-right: 1.5rem; 61 | } 62 | } 63 | 64 | /*DESKTOP ONLY CODE*/ 65 | 66 | @media screen and (min-width: 700px) { 67 | 68 | .btn-cta { 69 | padding-left:3rem; 70 | padding-right:3rem; 71 | } 72 | } 73 | 74 | 75 | 76 | 77 | .btn-cta:hover { 78 | background-color: #B52F31; 79 | -webkit-transition-duration: 0.4s; /* Safari */ 80 | transition-duration: 0.4s; 81 | } 82 | 83 | .btn-shadow:hover { 84 | 85 | box-shadow: 0 12px 16px 0 rgba(0, 0, 0, 0.1), 0 17px 50px 0 rgba(0, 0, 0, 0.19); 86 | -webkit-transition-duration: 0.4s; /* Safari */ 87 | transition-duration: 0.4s; 88 | } 89 | 90 | .btn-small { 91 | } 92 | 93 | 94 | 95 | 96 | /* ------------------------------------------------------------| 97 | | CUSTOM BUTTON CODE 98 | *-------------------------------------------------------------*/ 99 | 100 | /*DESKTOP ONLY CODE*/ 101 | 102 | @media screen and (min-width: 1080px) { 103 | 104 | #btn-get-started { 105 | display: inline-block; 106 | float:right; 107 | } 108 | } 109 | 110 | 111 | #btn-cta-landing { 112 | margin-top:2rem; 113 | } 114 | 115 | -------------------------------------------------------------------------------- /public/assets/css/content/icons.css: -------------------------------------------------------------------------------- 1 | .custom-icon { 2 | width:1rem; 3 | height:1rem; 4 | display: inline; 5 | margin-bottom:-0.2rem; 6 | margin-left:.3rem; 7 | } -------------------------------------------------------------------------------- /public/assets/css/credits.css: -------------------------------------------------------------------------------- 1 | ul li { 2 | margin-top:1rem; 3 | } 4 | ul { 5 | list-style: none; 6 | padding:0; 7 | margin:0; 8 | } 9 | a { 10 | color:inherit; 11 | } -------------------------------------------------------------------------------- /public/assets/css/grids/desktop-grid.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | @media screen and (min-width: 1080px) { 4 | 5 | 6 | .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { 7 | float:left; 8 | 9 | } 10 | .col-md-1 { 11 | width: 8.33%; 12 | } 13 | .col-md-2 { 14 | width: 16.66%; 15 | 16 | } 17 | .col-md-3 { 18 | width: 25%; 19 | } 20 | .col-md-4 { 21 | width: 33.33% ; 22 | } 23 | .col-md-5 { 24 | width: 41.66%; 25 | } 26 | .col-md-6 { 27 | width: 50%; 28 | } 29 | .col-md-7{ 30 | width: 58.33%; 31 | } 32 | .col-md-8 { 33 | width: 66.66%; 34 | } 35 | .col-md-9 { 36 | width: 75%; 37 | } 38 | .col-md-10 { 39 | width: 83.33%; 40 | } 41 | .col-md-11 { 42 | width: 91.66%; 43 | } 44 | 45 | .col-md-12 { 46 | width: 100%; 47 | } 48 | 49 | 50 | } -------------------------------------------------------------------------------- /public/assets/css/grids/mobile-grid.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | @media screen and (max-width: 1080px) { 4 | 5 | 6 | .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { 7 | float:left; 8 | 9 | } 10 | .col-sm-1 { 11 | width: 8.33%; 12 | } 13 | .col-sm-2 { 14 | width: 16.66%; 15 | 16 | } 17 | .col-sm-3 { 18 | width: 25%; 19 | } 20 | .col-sm-4 { 21 | width: 33.33% ; 22 | } 23 | .col-sm-5 { 24 | width: 41.66%; 25 | } 26 | .col-sm-6 { 27 | width: 50%; 28 | } 29 | .col-sm-7{ 30 | width: 58.33%; 31 | } 32 | .col-sm-8 { 33 | width: 66.66%; 34 | } 35 | .col-sm-9 { 36 | width: 75%; 37 | } 38 | .col-sm-10 { 39 | width: 83.33%; 40 | } 41 | .col-sm-11 { 42 | width: 91.66%; 43 | } 44 | 45 | .col-sm-12 { 46 | width: 100%; 47 | } 48 | 49 | 50 | } -------------------------------------------------------------------------------- /public/assets/css/landing.css: -------------------------------------------------------------------------------- 1 | /* ------------------------------------------------------------| 2 | | MAIN STRUCTURES 3 | *-------------------------------------------------------------*/ 4 | body { 5 | overflow-x: hidden; 6 | background-color: white; 7 | } 8 | 9 | /* ------------------------------------------------------------| 10 | | NAVBAR 11 | *-------------------------------------------------------------*/ 12 | 13 | header { 14 | font-family: 'Helvetica Neue', sans-serif; 15 | display: inline-block; 16 | float: left; 17 | position: fixed; 18 | top:0; 19 | left:0; 20 | z-index: 999; 21 | width: 100%; 22 | /*border: solid 1px hotpink;*/ 23 | box-sizing: border-box; 24 | } 25 | 26 | nav { 27 | display: inline-block; 28 | float: left; 29 | background-color: white; 30 | box-sizing: border-box; 31 | width: 100%; 32 | 33 | } 34 | 35 | .sendcrypt-logo { 36 | width: 180px; 37 | height: 23px; 38 | margin-top: 1.1rem; 39 | margin-bottom: 1rem; 40 | 41 | z-index: 999; 42 | } 43 | 44 | .logo-wrapper{ 45 | position:relative; 46 | 47 | } 48 | 49 | .alpha-logo { 50 | font-family: "Comfortaa Light", sans-serif; 51 | position: absolute; 52 | top: -1.7rem; 53 | left: 11.5rem; 54 | font-size: 0.7rem; 55 | opacity: 1; 56 | color: #848484; 57 | } 58 | 59 | .alpha-disclaimer { 60 | font-size:1rem; 61 | color:silver; 62 | opacity:.8; 63 | text-align: center; 64 | display: block; 65 | margin:0 auto; 66 | padding-top:1rem; 67 | 68 | } 69 | 70 | /*DESKTOP ONLY CODE*/ 71 | 72 | @media screen and (min-width: 700px) { 73 | 74 | .alpha-disclaimer { 75 | width:40%; 76 | } 77 | } 78 | 79 | 80 | /*MOBILE ONLY CODE*/ 81 | @media screen and (max-width: 700px) { 82 | 83 | .alpha-disclaimer { 84 | width:100%; 85 | } 86 | } 87 | 88 | 89 | 90 | .navbar-menu { 91 | font-size: .9rem; 92 | padding: 0; 93 | margin: 0; 94 | display: inline-block; 95 | float: right; 96 | box-sizing: border-box; 97 | } 98 | 99 | .navbar-menu li { 100 | display: inline-block; 101 | float: left; 102 | padding: 1.3rem; 103 | box-sizing: border-box; 104 | } 105 | 106 | .navbar-menu li a { 107 | text-decoration: none; 108 | color: inherit; 109 | text-underline: none; 110 | } 111 | 112 | .navbar-item-active { 113 | border-bottom: .3rem solid #355FF2; 114 | 115 | } 116 | 117 | .navbar-menu-icon { 118 | position: absolute; 119 | top: 1rem; 120 | right: 1.7rem; 121 | font-size: 1.6rem; 122 | color: #262626; 123 | } 124 | 125 | /*DESKTOP ONLY CODE*/ 126 | 127 | @media screen and (min-width: 1080px) { 128 | 129 | .desktop-only { 130 | display: block; 131 | } 132 | 133 | .mobile-only { 134 | display: none; 135 | } 136 | 137 | 138 | } 139 | 140 | 141 | @media screen and (min-width: 760px) { 142 | 143 | .ipad-above-only { 144 | display:block; 145 | } 146 | } 147 | @media screen and (max-width: 760px) { 148 | 149 | .ipad-above-only { 150 | display:none; 151 | } 152 | } 153 | 154 | 155 | /*MOBILE ONLY CODE*/ 156 | @media screen and (max-width: 1080px) { 157 | 158 | 159 | 160 | .desktop-only { 161 | display: none; 162 | } 163 | 164 | .mobile-only { 165 | display: block; 166 | } 167 | 168 | } 169 | 170 | /* NAVBAR MENU MOBILE =========================================== */ 171 | 172 | .navbar-menu-mobile { 173 | font-size: .9rem; 174 | padding: 0; 175 | margin: 0; 176 | display: inline-block; 177 | float: left; 178 | box-sizing: border-box; 179 | width: 100%; 180 | background-color: white; 181 | 182 | } 183 | 184 | .navbar-menu-mobile li { 185 | 186 | display: inline-block; 187 | float: left; 188 | padding: .8rem; 189 | box-sizing: border-box; 190 | text-align: center; 191 | min-width: 100%; 192 | } 193 | 194 | .navbar-menu-mobile li:hover { 195 | background-color: #F7F7F7; 196 | } 197 | 198 | .navbar-menu-mobile li a { 199 | min-width: 100%; 200 | text-decoration: none; 201 | color: inherit; 202 | text-underline: none; 203 | text-align: center; 204 | } 205 | 206 | /* ------------------------------------------------------------| 207 | | MAIN (Landing CTA) 208 | *-------------------------------------------------------------*/ 209 | 210 | main { 211 | background-color: white; 212 | height: auto; 213 | position: relative; 214 | 215 | } 216 | 217 | .main-section-svg { 218 | padding-top: 4rem; 219 | display: inline-block; 220 | float: left; 221 | box-sizing: border-box; 222 | position:relative; 223 | } 224 | 225 | /* MAIN SECTION CONTENT =========================================== */ 226 | .main-section { 227 | width: 100vw; 228 | height: 100vh; 229 | background: url('../gfx/background.svg') no-repeat center; 230 | background-size: cover; 231 | position: relative; 232 | background-color: #1E1E1E; 233 | } 234 | 235 | .main-section-title { 236 | 237 | width: 100vw; 238 | height: auto; 239 | text-align: center; 240 | font-size: 3.4rem; 241 | font-family: 'Comfortaa', sans-serif; 242 | color: white; 243 | z-index: 3; 244 | left: 0; 245 | position: absolute; 246 | box-sizing: border-box; 247 | 248 | } 249 | 250 | .main-section-subtitle { 251 | font-family: "Comfortaa Light", sans-serif; 252 | font-size: 1.1rem; 253 | font-weight: normal; 254 | display: block; 255 | margin-top: .5rem; 256 | 257 | } 258 | 259 | /*MOBILE ONLY CODE*/ 260 | @media screen and (max-width: 1080px) { 261 | 262 | .main-section-title { 263 | top: calc(77.2vh / 2); 264 | font-size: 2.5rem; 265 | padding-left: 2rem; 266 | padding-right: 2rem; 267 | 268 | } 269 | } 270 | 271 | @media screen and (device-aspect-ratio: 40/71) { 272 | .main-section-title { 273 | top: calc(51.2vh / 2); 274 | } 275 | 276 | } 277 | 278 | 279 | 280 | 281 | /*DESKTOP ONLY CODE*/ 282 | 283 | @media screen and (min-width: 1080px) { 284 | .main-section-title { 285 | top: 35vh; 286 | } 287 | 288 | .main-section-subtitle { 289 | font-size: 1.2rem; 290 | 291 | } 292 | 293 | } 294 | 295 | /* HEADER IMG ANIMATIONS =========================================== */ 296 | 297 | .square { 298 | background-image: url('../gfx/square.png'); 299 | background-repeat: no-repeat; 300 | background-size: cover; 301 | background-position: center; 302 | 303 | z-index: 1; 304 | position: absolute; 305 | top: 10rem; 306 | left: 5rem; 307 | width: 215px; 308 | height: 126px; 309 | 310 | } 311 | 312 | #server, #server2 { 313 | position: absolute; 314 | width: 10rem; 315 | z-index: 2; 316 | } 317 | 318 | /*MOBILE ONLY CODE*/ 319 | @media screen and (max-width: 1080px) { 320 | #server { 321 | max-height: 10rem; 322 | top: 15vh; 323 | left: 53vw; 324 | } 325 | 326 | #server2 { 327 | max-height: 10rem; 328 | top: 48vh; 329 | left: 4vw; 330 | } 331 | 332 | .square { 333 | transform: scale(0.5); 334 | } 335 | } 336 | 337 | /*DESKTOP ONLY CODE*/ 338 | 339 | @media screen and (min-width: 1080px) { 340 | 341 | #server { 342 | max-height: 15rem; 343 | top: 14vh; 344 | left: 71vw; 345 | } 346 | 347 | #server2 { 348 | max-height: 15rem; 349 | top: 48vh; 350 | left: 4vw; 351 | } 352 | 353 | .square { 354 | transform: scale(0.8); 355 | } 356 | } 357 | 358 | /* ------------------------------------------------------------| 359 | | SECTIONS 360 | *-------------------------------------------------------------*/ 361 | 362 | /* First Section =========================================== */ 363 | 364 | .section-first { 365 | display: inline-block; 366 | float: left; 367 | background-color: white; 368 | width: 100%; 369 | min-height: 30rem; 370 | height: auto; 371 | box-sizing: border-box; 372 | 373 | /*border: solid 1px yellowgreen;*/ 374 | } 375 | 376 | .section-first-header { 377 | background-color: #1E1E1E; 378 | color: white; 379 | font-family: Comfortaa, sans-serif; 380 | font-size: 1.7rem; 381 | padding: 1rem 1rem 3rem; 382 | font-weight: bolder; 383 | text-align: center; 384 | margin-top: -0.1rem; 385 | box-sizing: border-box; 386 | } 387 | 388 | .section-first-content { 389 | color: #495F7F; 390 | font-size: 1rem; 391 | font-family: "Comfortaa Light", sans-serif; 392 | padding: 1rem; 393 | text-align: center; 394 | 395 | box-sizing: border-box; 396 | height: auto; 397 | } 398 | 399 | .section-first-table { 400 | box-sizing: border-box; 401 | padding-left:1rem; 402 | margin-top:3.7rem; 403 | /*border: solid 1px hotpink;*/ 404 | 405 | 406 | } 407 | 408 | .section-table-img { 409 | min-width: 100%; 410 | height: auto; 411 | box-sizing: border-box; 412 | min-height:230px; 413 | /*min-height: 10rem;*/ 414 | } 415 | 416 | .section-divisor { 417 | height: 1rem; 418 | border-top: 1px solid #3A3A3A; 419 | background-color: white; 420 | opacity: .2; 421 | margin-top: 3rem; 422 | margin-bottom: 3rem; 423 | } 424 | 425 | /* Section left or right =========================================== */ 426 | 427 | section { 428 | display: inline-block; 429 | float: left; 430 | 431 | min-height: 15.8rem; 432 | height: auto; 433 | box-sizing: border-box; 434 | background-color: white; 435 | padding-top:.5rem; 436 | 437 | /*border: solid 1px blue;*/ 438 | } 439 | 440 | .section-title { 441 | font-size: 1.7rem; 442 | font-weight: bolder; 443 | color: #3A3A3A; 444 | text-align: center; 445 | 446 | font-family: "Comfortaa", sans-serif; 447 | 448 | } 449 | 450 | 451 | 452 | 453 | .section-content { 454 | color: #41464C; 455 | font-size: .9rem; 456 | line-height: 1.8; 457 | font-family: "Comfortaa Light", sans-serif !important; 458 | 459 | text-align: center; 460 | margin-top: 2rem; 461 | margin-bottom:2rem; 462 | box-sizing: border-box; 463 | height: auto; 464 | } 465 | 466 | .section-content a { 467 | color:#0f3c4b; 468 | font-weight: bolder; 469 | text-decoration: underline; 470 | 471 | } 472 | 473 | 474 | .section-img img { 475 | 476 | padding-top: 1rem; 477 | padding-bottom: 2rem; 478 | 479 | margin: 0 auto; 480 | display: block; 481 | margin-top:-2rem; 482 | max-width: 280px; 483 | height: auto; 484 | } 485 | 486 | .how-it-works-img img { 487 | padding-top: 1rem; 488 | padding-bottom: 2rem; 489 | 490 | margin: 0 auto; 491 | display: block; 492 | 493 | max-width: 400px; 494 | height: auto; 495 | } 496 | 497 | .web-crypto-svg { 498 | /*max-width: 150px !important;*/ 499 | padding-top:5rem !important; 500 | } 501 | 502 | .potential-risks-list{ 503 | list-style-type: none; 504 | 505 | } 506 | 507 | 508 | 509 | /*MOBILE ONLY CODE*/ 510 | @media screen and (max-width: 1080px) { 511 | 512 | .how-it-works-img img { 513 | padding-top:4.5rem; 514 | } 515 | 516 | .section-img img { 517 | padding-top: 4.5rem; 518 | } 519 | .section-content { 520 | padding-right:.5rem !important; 521 | padding-left:.5rem !important; 522 | } 523 | } 524 | 525 | 526 | 527 | /*DESKTOP ONLY CODE*/ 528 | 529 | @media screen and (min-width: 1080px) { 530 | 531 | #how-it-works-title { 532 | margin-top:5rem; 533 | } 534 | 535 | .section-align-left { 536 | text-align: left; 537 | } 538 | 539 | .section-align-right { 540 | text-align: right; 541 | } 542 | 543 | .section-float-left { 544 | display: inline-block; 545 | float: left; 546 | } 547 | 548 | .section-float-right { 549 | display: inline-block; 550 | float: right; 551 | } 552 | 553 | .section-first-header { 554 | text-align: left; 555 | } 556 | 557 | .section-first-content { 558 | text-align: left; 559 | } 560 | 561 | } 562 | 563 | /* Open Source Section =========================================== */ 564 | 565 | 566 | 567 | 568 | /* Crossbrowser platform =========================================== */ 569 | 570 | .cross-browser-icon-wrapper { 571 | 572 | /*border: solid 1px hotpink;*/ 573 | box-sizing: border-box; 574 | 575 | width:100%; 576 | text-align: center; 577 | margin:0 auto; 578 | display: block; 579 | } 580 | 581 | .cross-browser-title { 582 | font-family: "Comfortaa Light", sans-serif; 583 | font-weight: bold; 584 | font-size: 1.2rem; 585 | color: #333333; 586 | padding: 1rem; 587 | display: block; 588 | width: 100%; 589 | /*border: solid 1px hotpink;*/ 590 | box-sizing: border-box; 591 | text-align: center; 592 | margin-top: 0.8rem; 593 | } 594 | 595 | .crossbrowser-icon { 596 | display: inline-block; 597 | 598 | max-width: 67px; 599 | max-height: 67px; 600 | margin-top:.8rem; 601 | 602 | } 603 | 604 | /*IPHONE 6 > ONLY CODE*/ 605 | 606 | @media screen and (min-width: 375px) { 607 | 608 | .crossbrowser-icon:nth-of-type(2) { 609 | padding-left:1.5rem; 610 | padding-right:1.5rem; 611 | } 612 | } 613 | 614 | 615 | 616 | 617 | /* ------------------------------------------------------------| 618 | | WRAPPER 619 | *-------------------------------------------------------------*/ 620 | 621 | .wrapper { 622 | /*border: solid 1px hotpink;*/ 623 | box-sizing: border-box; 624 | display: block; 625 | 626 | } 627 | 628 | /*MOBILE ONLY CODE*/ 629 | @media screen and (max-width: 1080px) { 630 | 631 | .wrapper { 632 | padding-left: 2rem; 633 | padding-right: 2rem; 634 | } 635 | } 636 | 637 | /*DESKTOP ONLY CODE*/ 638 | 639 | @media screen and (min-width: 1080px) { 640 | 641 | .wrapper { 642 | padding-left: 13rem; 643 | padding-right: 13rem; 644 | } 645 | } 646 | 647 | @media only screen 648 | and (min-device-width : 1080px) 649 | and (max-device-width : 1400px) { 650 | .wrapper { 651 | padding-left: 6rem; 652 | padding-right: 6rem; 653 | } 654 | } 655 | 656 | /* ------------------------------------------------------------| 657 | | FOOTER 658 | *-------------------------------------------------------------*/ 659 | 660 | footer { 661 | margin-top: 4rem; 662 | font-family: "Comfortaa", sans-serif; 663 | background-color: #1E1E1E; 664 | display: inline-block; 665 | float: left; 666 | /*border: solid 1px hotpink;*/ 667 | box-sizing: border-box; 668 | height: auto; 669 | } 670 | 671 | footer a { 672 | color: inherit; 673 | text-decoration: none; 674 | text-underline: none; 675 | } 676 | 677 | footer p { 678 | margin: 0 auto; 679 | text-align: center; 680 | color: #787878; 681 | padding: 1rem; 682 | font-size: 1rem; 683 | 684 | } 685 | 686 | -------------------------------------------------------------------------------- /public/assets/css/modal.css: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | z-index: -2; 4 | } 5 | 6 | /* Main modal structure =========================================== */ 7 | 8 | .modal-wrapper { 9 | position: fixed; 10 | top: 21.3vh; 11 | 12 | /*always center box on position fixed*/ 13 | left: 50%; 14 | transform: translateX(-50%); 15 | z-index: 1; 16 | height: auto; 17 | } 18 | 19 | .modal { 20 | border: solid 1px #41464cc2; 21 | box-sizing: border-box; 22 | 23 | background-color: white; 24 | border-radius: 0.4rem; 25 | font-family: Comfortaa, sans-serif; 26 | 27 | /* Positioning =========================================== */ 28 | display: inline-block; 29 | float: left; 30 | 31 | /* Shadow =========================================== */ 32 | -webkit-box-shadow: 6px 6px 2px 0px rgba(0, 0, 0, 0.16); 33 | -moz-box-shadow: 6px 6px 2px 0px rgba(0, 0, 0, 0.16); 34 | box-shadow: 6px 6px 2px 0px rgba(0, 0, 0, 0.16); 35 | 36 | padding-bottom: 1rem; 37 | 38 | } 39 | 40 | .shadow-background { 41 | width: 100vw; 42 | height: 100vh; 43 | background-color: black; 44 | opacity: .5; 45 | position: absolute; 46 | top: 0; 47 | left: 0; 48 | z-index: 1; 49 | } 50 | 51 | /*DESKTOP ONLY CODE*/ 52 | 53 | @media screen and (min-width: 700px) { 54 | .modal-small { 55 | width: 60vw; 56 | } 57 | 58 | } 59 | 60 | /*MOBILE ONLY CODE*/ 61 | @media screen and (max-width: 700px) { 62 | 63 | .modal-small { 64 | width: 80vw; 65 | 66 | } 67 | } 68 | 69 | /* Title and subtitle =========================================== */ 70 | 71 | .modal-title-section { 72 | background-color: #495F7F; 73 | width: 100%; 74 | height: 5rem; 75 | padding: 1.2rem; 76 | box-sizing: border-box; 77 | border-top-right-radius: 0.4rem; 78 | border-top-left-radius: 0.4rem; 79 | 80 | display: inline-block; 81 | float: left; 82 | 83 | } 84 | 85 | .modal-title { 86 | display: inline-block; 87 | float: left; 88 | width: 100%; 89 | color: white; 90 | font-size: 1.4rem; 91 | padding-left: 4.6rem; 92 | box-sizing: border-box; 93 | } 94 | 95 | /*MOBILE ONLY CODE*/ 96 | @media screen and (max-width: 1080px) { 97 | 98 | .modal-title { 99 | text-align: center; 100 | padding-left: 0; 101 | box-sizing: border-box; 102 | margin-top: 0.5rem; 103 | } 104 | 105 | } 106 | 107 | .modal-subtitle { 108 | display: inline-block; 109 | float: left; 110 | 111 | color: silver; 112 | font-size: 0.8rem; 113 | margin-top: 0.3rem; 114 | opacity: .5; 115 | padding-left: 4.6rem; 116 | } 117 | 118 | /* Icons =========================================== */ 119 | 120 | .modal-icon { 121 | position: absolute; 122 | top: 1.3rem; 123 | left: 1.9rem; 124 | color: white; 125 | opacity: .5; 126 | font-size: 2.4rem; 127 | } 128 | 129 | .modal-close-icon { 130 | position: absolute; 131 | top: 0.6rem; 132 | right: 0.8rem; 133 | color: white; 134 | opacity: .5; 135 | font-size: 1rem; 136 | } 137 | 138 | /* Modal Content =========================================== */ 139 | 140 | .modal-content { 141 | /* border: solid 1px hotpink; */ 142 | box-sizing: border-box; 143 | display: inline-block; 144 | float: left; 145 | padding-left: 0.7rem; 146 | padding-right: 1rem; 147 | margin-top: 1.2rem; 148 | font-family: 'Comfortaa Light', sans-serif; 149 | height: auto; 150 | width: 100%; 151 | } 152 | 153 | #btn-send-email { 154 | margin: 0 auto; 155 | display: block; 156 | width: 15%; 157 | } 158 | 159 | .modal-content-description { 160 | display: inline-block; 161 | float: left; 162 | font-size: .8rem; 163 | padding-left: 1.1rem; 164 | 165 | margin: 0; 166 | 167 | box-sizing: border-box; 168 | width: 100%; 169 | } 170 | 171 | .modal-content-description p { 172 | padding: 0; 173 | box-sizing: border-box; 174 | font-size: 0.9rem; 175 | margin-top: 0; 176 | margin-bottom: 1rem; 177 | } 178 | 179 | .modal-content-folder-link { 180 | display: inline-block; 181 | float:left; 182 | width:100%; 183 | font-size:1rem; 184 | font-weight: bolder; 185 | 186 | 187 | border: solid 1px hotpink; 188 | box-sizing: border-box; 189 | overflow-wrap: break-word ; 190 | 191 | } 192 | 193 | .folder-link-icon { 194 | 195 | display: inline-block; 196 | float: left; 197 | color: #333333; 198 | font-size: 1.2rem; 199 | box-sizing: border-box; 200 | padding-left: 0.9rem; 201 | padding-top: -1.1rem; 202 | margin-top: -0.2rem; 203 | } 204 | 205 | .modal-input { 206 | 207 | box-sizing: border-box; 208 | margin-right: 2rem; 209 | width: 98.8%; 210 | height: 2.3rem; 211 | border-radius: 0.2rem; 212 | margin-bottom: 1rem; 213 | color: #41464cab; 214 | font-family: Comfortaa, sans-serif; 215 | font-size: 1.1rem; 216 | padding-left: 0.7rem; 217 | border: 1px solid #33333326; 218 | 219 | } 220 | 221 | .modal-input:active { 222 | outline-color: #355FF2; 223 | } 224 | 225 | .modal-input:focus { 226 | outline-color: #355FF2; 227 | } 228 | 229 | /* Desktop & Mobile only code =========================================== */ 230 | 231 | /*DESKTOP ONLY CODE*/ 232 | 233 | @media screen and (min-width: 1080px) { 234 | 235 | .desktop-only { 236 | display: block; 237 | } 238 | 239 | .mobile-only { 240 | display: none; 241 | } 242 | 243 | } 244 | 245 | /*MOBILE ONLY CODE*/ 246 | @media screen and (max-width: 1080px) { 247 | 248 | .desktop-only { 249 | display: none; 250 | } 251 | 252 | .mobile-only { 253 | display: block; 254 | } 255 | 256 | } 257 | 258 | /* Prevent scrolling =========================================== */ 259 | 260 | .stop-scrolling { 261 | height: 100%; 262 | overflow: hidden; 263 | } -------------------------------------------------------------------------------- /public/assets/css/others/cf.css: -------------------------------------------------------------------------------- 1 | /** 2 | * For modern browsers 3 | * 1. The space content is one way to avoid an Opera bug when the 4 | * contenteditable attribute is included anywhere else in the document. 5 | * Otherwise it causes space to appear at the top and bottom of elements 6 | * that are clearfixed. 7 | * 2. The use of `table` rather than `block` is only necessary if using 8 | * `:before` to contain the top-margins of child elements. 9 | */ 10 | .cf:before, 11 | .cf:after { 12 | content: " "; /* 1 */ 13 | display: table; /* 2 */ 14 | } 15 | 16 | .cf:after { 17 | clear: both; 18 | } 19 | 20 | /** 21 | * For IE 6/7 only 22 | * Include this rule to trigger hasLayout and contain floats. 23 | */ 24 | .cf { 25 | *zoom: 1; 26 | } -------------------------------------------------------------------------------- /public/assets/css/others/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /* Document 4 | ========================================================================== */ 5 | 6 | /** 7 | * 1. Correct the line height in all browsers. 8 | * 2. Prevent adjustments of font size after orientation changes in iOS. 9 | */ 10 | 11 | html { 12 | line-height: 1.15; /* 1 */ 13 | -webkit-text-size-adjust: 100%; /* 2 */ 14 | } 15 | 16 | /* Sections 17 | ========================================================================== */ 18 | 19 | /** 20 | * Remove the margin in all browsers. 21 | */ 22 | 23 | body { 24 | margin: 0; 25 | } 26 | 27 | /** 28 | * Correct the font size and margin on `h1` elements within `section` and 29 | * `article` contexts in Chrome, Firefox, and Safari. 30 | */ 31 | 32 | h1 { 33 | font-size: 2em; 34 | margin: 0.67em 0; 35 | } 36 | 37 | /* Grouping content 38 | ========================================================================== */ 39 | 40 | /** 41 | * 1. Add the correct box sizing in Firefox. 42 | * 2. Show the overflow in Edge and IE. 43 | */ 44 | 45 | hr { 46 | box-sizing: content-box; /* 1 */ 47 | height: 0; /* 1 */ 48 | overflow: visible; /* 2 */ 49 | } 50 | 51 | /** 52 | * 1. Correct the inheritance and scaling of font size in all browsers. 53 | * 2. Correct the odd `em` font sizing in all browsers. 54 | */ 55 | 56 | pre { 57 | font-family: monospace, monospace; /* 1 */ 58 | font-size: 1em; /* 2 */ 59 | } 60 | 61 | /* Text-level semantics 62 | ========================================================================== */ 63 | 64 | /** 65 | * Remove the gray background on active links in IE 10. 66 | */ 67 | 68 | a { 69 | background-color: transparent; 70 | } 71 | 72 | /** 73 | * 1. Remove the bottom border in Chrome 57- 74 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 75 | */ 76 | 77 | abbr[title] { 78 | border-bottom: none; /* 1 */ 79 | text-decoration: underline; /* 2 */ 80 | text-decoration: underline dotted; /* 2 */ 81 | } 82 | 83 | /** 84 | * Add the correct font weight in Chrome, Edge, and Safari. 85 | */ 86 | 87 | b, 88 | strong { 89 | font-weight: bolder; 90 | } 91 | 92 | /** 93 | * 1. Correct the inheritance and scaling of font size in all browsers. 94 | * 2. Correct the odd `em` font sizing in all browsers. 95 | */ 96 | 97 | code, 98 | kbd, 99 | samp { 100 | font-family: monospace, monospace; /* 1 */ 101 | font-size: 1em; /* 2 */ 102 | } 103 | 104 | /** 105 | * Add the correct font size in all browsers. 106 | */ 107 | 108 | small { 109 | font-size: 80%; 110 | } 111 | 112 | /** 113 | * Prevent `sub` and `sup` elements from affecting the line height in 114 | * all browsers. 115 | */ 116 | 117 | sub, 118 | sup { 119 | font-size: 75%; 120 | line-height: 0; 121 | position: relative; 122 | vertical-align: baseline; 123 | } 124 | 125 | sub { 126 | bottom: -0.25em; 127 | } 128 | 129 | sup { 130 | top: -0.5em; 131 | } 132 | 133 | /* Embedded content 134 | ========================================================================== */ 135 | 136 | /** 137 | * Remove the border on images inside links in IE 10. 138 | */ 139 | 140 | img { 141 | border-style: none; 142 | } 143 | 144 | /* Forms 145 | ========================================================================== */ 146 | 147 | /** 148 | * 1. Change the font styles in all browsers. 149 | * 2. Remove the margin in Firefox and Safari. 150 | */ 151 | 152 | button, 153 | input, 154 | optgroup, 155 | select, 156 | textarea { 157 | font-family: inherit; /* 1 */ 158 | font-size: 100%; /* 1 */ 159 | line-height: 1.15; /* 1 */ 160 | margin: 0; /* 2 */ 161 | } 162 | 163 | /** 164 | * Show the overflow in IE. 165 | * 1. Show the overflow in Edge. 166 | */ 167 | 168 | button, 169 | input { /* 1 */ 170 | overflow: visible; 171 | } 172 | 173 | /** 174 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 175 | * 1. Remove the inheritance of text transform in Firefox. 176 | */ 177 | 178 | button, 179 | select { /* 1 */ 180 | text-transform: none; 181 | } 182 | 183 | /** 184 | * Correct the inability to style clickable types in iOS and Safari. 185 | */ 186 | 187 | button, 188 | [type="button"], 189 | [type="reset"], 190 | [type="submit"] { 191 | -webkit-appearance: button; 192 | } 193 | 194 | /** 195 | * Remove the inner border and padding in Firefox. 196 | */ 197 | 198 | button::-moz-focus-inner, 199 | [type="button"]::-moz-focus-inner, 200 | [type="reset"]::-moz-focus-inner, 201 | [type="submit"]::-moz-focus-inner { 202 | border-style: none; 203 | padding: 0; 204 | } 205 | 206 | /** 207 | * Restore the focus styles unset by the previous rule. 208 | */ 209 | 210 | button:-moz-focusring, 211 | [type="button"]:-moz-focusring, 212 | [type="reset"]:-moz-focusring, 213 | [type="submit"]:-moz-focusring { 214 | outline: 1px dotted ButtonText; 215 | } 216 | 217 | /** 218 | * Correct the padding in Firefox. 219 | */ 220 | 221 | fieldset { 222 | padding: 0.35em 0.75em 0.625em; 223 | } 224 | 225 | /** 226 | * 1. Correct the text wrapping in Edge and IE. 227 | * 2. Correct the color inheritance from `fieldset` elements in IE. 228 | * 3. Remove the padding so developers are not caught out when they zero out 229 | * `fieldset` elements in all browsers. 230 | */ 231 | 232 | legend { 233 | box-sizing: border-box; /* 1 */ 234 | color: inherit; /* 2 */ 235 | display: table; /* 1 */ 236 | max-width: 100%; /* 1 */ 237 | padding: 0; /* 3 */ 238 | white-space: normal; /* 1 */ 239 | } 240 | 241 | /** 242 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. 243 | */ 244 | 245 | progress { 246 | vertical-align: baseline; 247 | } 248 | 249 | /** 250 | * Remove the default vertical scrollbar in IE 10+. 251 | */ 252 | 253 | textarea { 254 | overflow: auto; 255 | } 256 | 257 | /** 258 | * 1. Add the correct box sizing in IE 10. 259 | * 2. Remove the padding in IE 10. 260 | */ 261 | 262 | [type="checkbox"], 263 | [type="radio"] { 264 | box-sizing: border-box; /* 1 */ 265 | padding: 0; /* 2 */ 266 | } 267 | 268 | /** 269 | * Correct the cursor style of increment and decrement buttons in Chrome. 270 | */ 271 | 272 | [type="number"]::-webkit-inner-spin-button, 273 | [type="number"]::-webkit-outer-spin-button { 274 | height: auto; 275 | } 276 | 277 | /** 278 | * 1. Correct the odd appearance in Chrome and Safari. 279 | * 2. Correct the outline style in Safari. 280 | */ 281 | 282 | [type="search"] { 283 | -webkit-appearance: textfield; /* 1 */ 284 | outline-offset: -2px; /* 2 */ 285 | } 286 | 287 | /** 288 | * Remove the inner padding in Chrome and Safari on macOS. 289 | */ 290 | 291 | [type="search"]::-webkit-search-decoration { 292 | -webkit-appearance: none; 293 | } 294 | 295 | /** 296 | * 1. Correct the inability to style clickable types in iOS and Safari. 297 | * 2. Change font properties to `inherit` in Safari. 298 | */ 299 | 300 | ::-webkit-file-upload-button { 301 | -webkit-appearance: button; /* 1 */ 302 | font: inherit; /* 2 */ 303 | } 304 | 305 | /* Interactive 306 | ========================================================================== */ 307 | 308 | /* 309 | * Add the correct display in Edge, IE 10+, and Firefox. 310 | */ 311 | 312 | details { 313 | display: block; 314 | } 315 | 316 | /* 317 | * Add the correct display in all browsers. 318 | */ 319 | 320 | summary { 321 | display: list-item; 322 | } 323 | 324 | /* Misc 325 | ========================================================================== */ 326 | 327 | /** 328 | * Add the correct display in IE 10+. 329 | */ 330 | 331 | template { 332 | display: none; 333 | } 334 | 335 | /** 336 | * Add the correct display in IE 10. 337 | */ 338 | 339 | [hidden] { 340 | display: none; 341 | } -------------------------------------------------------------------------------- /public/assets/css/section-animation.css: -------------------------------------------------------------------------------- 1 | .server { 2 | display: none; 3 | } 4 | 5 | #SERVER { 6 | display: none; 7 | } -------------------------------------------------------------------------------- /public/assets/css/table.css: -------------------------------------------------------------------------------- 1 | .features-table{ 2 | width: 100%; 3 | border-collapse: collapse; /*ALERT*/ 4 | font-family: "Helvetica Neue", sans-serif; 5 | } 6 | 7 | .features-table tr td { 8 | width:20%; 9 | } 10 | 11 | .features-table thead { 12 | text-align: center; 13 | background-color: #FFFFFF; 14 | font-weight: bold; 15 | padding:1rem; 16 | } 17 | 18 | .features-table thead tr th { 19 | border-top:1px #edf0eb solid; 20 | border-bottom:1px #edf0eb solid; 21 | font-size:.7rem; 22 | padding: .5rem .3rem; 23 | } 24 | 25 | .features-table thead tr th:first-child { 26 | border-left:1px #edf0eb solid; 27 | } 28 | .features-table thead tr th:last-child { 29 | border-right:1px #edf0eb solid; 30 | } 31 | 32 | .features-table tbody tr:last-child td { 33 | border-bottom:1px #edf0eb solid; 34 | } 35 | 36 | /*caption {*/ 37 | /*caption-side: top; !*ALERT*!*/ 38 | /*background-color: black;*/ 39 | /*color: white;*/ 40 | /*padding: 1rem;*/ 41 | /*font-style: italic;*/ 42 | /*text-align: center;*/ 43 | /*}*/ 44 | 45 | .features-table td { 46 | width: 33.33%; 47 | padding: .5rem; 48 | text-align: center; 49 | font-size:.7rem; 50 | } 51 | .features-table td:first-child { 52 | border-left:1px #edf0eb solid; 53 | } 54 | .features-table td:last-child { 55 | border-right:1px #edf0eb solid; 56 | } 57 | 58 | /*tr:nth-child(even) {*/ 59 | /*background-color: silver;*/ 60 | /*}*/ 61 | 62 | .features-table tr:nth-of-type(even) { 63 | background-color: #F7F7F7; 64 | } 65 | 66 | .blue-row { 67 | color:#355FF2; 68 | } -------------------------------------------------------------------------------- /public/assets/css/upload-form.css: -------------------------------------------------------------------------------- 1 | html, main, body { 2 | background-color: #1E1E1E; 3 | } 4 | 5 | /* Not part of the upload form per se, but because the progress bar itself is the main (and only) feedback for the whole uploading process I thought this is close enough to define "progress bar-related rules" here. */ 6 | 7 | /* TODO: Add more style to the progress bar. */ 8 | 9 | .progressbar-wrapper { 10 | margin-bottom: 2rem; 11 | text-align: center; 12 | } 13 | 14 | progress:not([value]) { 15 | display: none; 16 | } 17 | 18 | progress[value] { 19 | width: 60%; 20 | height: 20px; 21 | } 22 | 23 | input[type="file"]:active,input[type="file"]:focus, 24 | .box__file:active, .box__file:focus{ 25 | outline-style: none; 26 | } 27 | 28 | a { 29 | color: inherit; 30 | text-decoration: none; 31 | } 32 | 33 | main { 34 | margin-top: 3.7rem; 35 | } 36 | 37 | .panel-wrapper { 38 | padding-left: 2rem; 39 | padding-right: 2rem; 40 | 41 | } 42 | 43 | .upload-main-panel { 44 | background-color: white; 45 | border-radius: 1rem; 46 | padding-bottom: 3rem; 47 | padding-top: 1.5rem; 48 | margin: 1rem; 49 | 50 | } 51 | 52 | /*MOBILE ONLY CODE*/ 53 | @media screen and (max-width: 1080px) { 54 | 55 | .panel-wrapper { 56 | padding-left: 1rem; 57 | padding-right: 1rem; 58 | } 59 | 60 | .upload-main-panel { 61 | 62 | padding-bottom: 1.5rem; 63 | padding-top: .5rem; 64 | 65 | } 66 | } 67 | 68 | /*DESKTOP ONLY CODE*/ 69 | 70 | @media screen and (min-width: 1080px) { 71 | 72 | .upload-main-panel { 73 | margin: 2.5rem 13rem; 74 | } 75 | 76 | } 77 | 78 | .upload-main-title { 79 | font-family: "Helvetica Neue", sans-serif; 80 | font-size: 1.3rem; 81 | color: #3A3A3A; 82 | padding-top: 1rem; 83 | display: inline-block; 84 | float: left; 85 | padding-bottom: .4rem; 86 | 87 | } 88 | 89 | .upload-main-hor-bar { 90 | display: inline-block; 91 | float: left; 92 | width: 100%; 93 | height: 1px; 94 | background-color: #E5E5E5; 95 | 96 | } 97 | 98 | .upload-drop-area { 99 | 100 | height: auto; 101 | margin-top: 1rem; 102 | box-sizing: border-box; 103 | 104 | border: dashed #BABABA 3px; 105 | border-radius: .7rem; 106 | display: inline-block; 107 | float: left; 108 | width: 100% !important; 109 | 110 | } 111 | 112 | .upload-drop-area:hover { 113 | background-color: #F9F9F9; 114 | } 115 | 116 | .cloud-wrapper { 117 | 118 | box-sizing: border-box; 119 | width: 100%; 120 | height: auto; 121 | position: relative; 122 | 123 | } 124 | 125 | .upload-cloud-img { 126 | margin: 0 auto; 127 | display: block; 128 | max-width: 186px; 129 | padding: 1rem; 130 | } 131 | 132 | 133 | .upload-spinning-locker { 134 | position: absolute; 135 | top: 3.9rem; 136 | left: 0; 137 | right: 0; 138 | margin-left: auto; 139 | margin-right: auto; 140 | max-width: 59.8px; 141 | opacity: .8; 142 | width: 100%; 143 | } 144 | 145 | .upload-locker { 146 | position: absolute; 147 | top: 4.9rem; 148 | left: 0; 149 | right: 0; 150 | margin-left: auto; 151 | margin-right: auto; 152 | max-width: 21.5px; 153 | opacity: 0.6; 154 | width: 100%; 155 | } 156 | 157 | .upload-drop-area-description { 158 | font-family: Quicksand, sans-serif; 159 | font-size: 1rem; 160 | text-align: center; 161 | padding-bottom: 1rem; 162 | padding-left: .5rem; 163 | padding-right: .5rem; 164 | color: #727272; 165 | } 166 | 167 | .upload-icon-copy { 168 | color: #727272; 169 | 170 | } 171 | 172 | .upload-form-icon { 173 | font-size: 1rem; 174 | margin-right: .4rem; 175 | padding: .5rem; 176 | display: block; 177 | } 178 | 179 | .upload-form-icon:hover { 180 | cursor: pointer; 181 | color: #355FF2; 182 | } 183 | 184 | .upload-file-actions .upload-form-icon { 185 | margin-left: 0.5rem; 186 | 187 | } 188 | 189 | /*MOBILE ONLY CODE*/ 190 | @media screen and (max-width: 1080px) { 191 | 192 | .upload-file-actions .upload-form-icon { 193 | margin: 0 auto; 194 | display: inline-block; 195 | width: 100%; 196 | text-align: center; 197 | margin-left: -.5rem; 198 | 199 | } 200 | 201 | .upload-form-actions { 202 | font-size: .9rem; 203 | display: block; 204 | margin: 0 auto; 205 | } 206 | 207 | } 208 | 209 | .flaticon-envelope, .flaticon-link { 210 | margin-left: -1rem; 211 | } 212 | 213 | .files-area { 214 | box-sizing: border-box; 215 | 216 | padding-top: .5rem; 217 | } 218 | 219 | .files-area-button { 220 | font-family: "Helvetica Neue", sans-serif; 221 | font-size: .8rem; 222 | box-sizing: border-box; 223 | /*border: solid 1px hotpink;*/ 224 | text-align: center; 225 | margin: auto 0; 226 | display: block; 227 | 228 | } 229 | 230 | .upload-panel-icon { 231 | max-width: 16px; 232 | max-height: 16px; 233 | } 234 | 235 | /* TABLE =========================================== */ 236 | 237 | .upload-table { 238 | 239 | border-collapse: collapse; /*ALERT*/ 240 | font-family: "Helvetica Neue", sans-serif; 241 | font-size: .7rem; 242 | margin-top: 2rem; 243 | 244 | width: 100%; 245 | 246 | } 247 | 248 | /* File Listing Table =========================================== */ 249 | 250 | .file-name { 251 | font-size: 0.7rem; 252 | display: inline-block; 253 | width: 85%; 254 | overflow-wrap: break-word; 255 | box-sizing: border-box; 256 | font-weight: bolder; 257 | margin-bottom: .4rem; 258 | } 259 | 260 | .upload-panel-icon { 261 | margin-right: 0.2rem; 262 | margin-left: .5rem; 263 | } 264 | 265 | /*DESKTOP ONLY CODE*/ 266 | 267 | @media screen and (min-width: 1080px) { 268 | 269 | .file-name { 270 | font-size: 0.9rem !important; 271 | 272 | } 273 | } 274 | 275 | @media screen and (device-aspect-ratio: 40/71) { 276 | .file-name { 277 | font-size: 0.7rem; 278 | 279 | } 280 | } 281 | 282 | /*MOBILE ONLY CODE*/ 283 | @media screen and (max-width: 1080px) { 284 | 285 | .file-name { 286 | width: 70%; 287 | 288 | } 289 | 290 | th { 291 | text-align: center !important; 292 | } 293 | 294 | td { 295 | padding-left: 0 !important; 296 | padding-right: 0 !important; 297 | padding-top: .3rem; 298 | padding-bottom: .3rem; 299 | } 300 | 301 | } 302 | 303 | thead { 304 | text-align: center; 305 | background-color: white; 306 | } 307 | 308 | th { 309 | border: 1px solid #E8E8E8; 310 | 311 | padding: .5rem; 312 | text-align: left; 313 | } 314 | 315 | tr { 316 | width: 100%; 317 | 318 | } 319 | 320 | td { 321 | 322 | padding: .75rem; 323 | border: 1px solid #E8E8E8; 324 | 325 | text-align: left; 326 | width: 25%; 327 | } 328 | 329 | tr:hover { 330 | background-color: #F9F9F9; 331 | } 332 | 333 | tr:nth-of-type(even) { 334 | background-color: #F4F4F4; 335 | } 336 | 337 | 338 | .option-link:hover { 339 | color: #355FF2; 340 | } 341 | 342 | /* Footer =========================================== */ 343 | 344 | footer { 345 | margin-top: 0 !important; 346 | } 347 | 348 | .footer-countable-logo { 349 | max-width:64px; 350 | opacity:.5; 351 | margin-top:-3rem; 352 | } 353 | 354 | 355 | 356 | /* ALERTS LIST =========================================== */ 357 | 358 | .alerts-list { 359 | position: fixed; 360 | bottom: 0; 361 | right: 0; 362 | width: 30%; 363 | /*border: solid 1px hotpink;*/ 364 | box-sizing: border-box; 365 | padding: .5rem; 366 | z-index: 999; 367 | } 368 | 369 | 370 | /*MOBILE ONLY CODE*/ 371 | @media screen and (max-width: 1080px) { 372 | .alerts-list { 373 | position: fixed; 374 | left: 50%; 375 | transform: translateX(-50%); 376 | width:100%; 377 | } 378 | } 379 | -------------------------------------------------------------------------------- /public/assets/dir.css: -------------------------------------------------------------------------------- 1 | html, main, body { 2 | background-color: #1E1E1E; 3 | } 4 | 5 | .hidden { 6 | display: none; 7 | } 8 | 9 | .dir-upload-wrapper { 10 | border-radius: 1rem; 11 | padding: .5rem; 12 | box-sizing: border-box; 13 | width: 100%; 14 | z-index: 0; 15 | } 16 | 17 | .container { 18 | background-color: #fff; 19 | border-radius: 1rem; 20 | margin: 0 auto; 21 | padding-bottom: 2rem; 22 | } 23 | 24 | .box.is-success .box__success { 25 | margin-bottom: 2.5rem; 26 | } 27 | 28 | .box__message > p { 29 | font-size: 1.2rem; 30 | } 31 | 32 | .dir-files-wrapper { 33 | padding: 1.5rem 5% 0; 34 | border-top: 1px solid #1E1E1E; 35 | } 36 | 37 | .files-list { 38 | margin: 0; 39 | padding: 0; 40 | list-style-type: none; 41 | } 42 | 43 | .files-list > li { 44 | line-height: 2; 45 | cursor: pointer; 46 | border: 1px solid #fff; 47 | margin-bottom: 1px; 48 | } 49 | 50 | .files-list > li > a { 51 | display: block; 52 | float: left; 53 | box-sizing: border-box; 54 | width: 80%; 55 | border: 1px solid #eee; 56 | border-right: none; 57 | text-decoration: none; 58 | color: #000; 59 | } 60 | 61 | .files-list > li:nth-child(2n) > a { 62 | background-color: #eee; 63 | } 64 | 65 | .files-list > li > a:hover { 66 | border-color: #bbb; 67 | } 68 | 69 | .files-list > li > div { 70 | display: block; 71 | float: right; 72 | box-sizing: border-box; 73 | width: 20%; 74 | background-color: #bbb; 75 | border: 1px solid #bbb; 76 | font-variant: small-caps; 77 | } 78 | 79 | .files-list > li > div:hover { 80 | background-color: #3A3A3A; 81 | color: #fff; 82 | } 83 | 84 | #del-feedback { 85 | position: fixed; 86 | bottom: 0; 87 | left: 0; 88 | right: 0; 89 | text-align: center; 90 | background-color: #4BB543; 91 | line-height: 3; 92 | color: black; 93 | } 94 | 95 | .dir-files-wrapper > div:first-child { 96 | float: left; 97 | line-height: 2; 98 | width: 80%; 99 | background-color: #eee; 100 | font-variant: small-caps; 101 | border-top-left-radius: 1rem; 102 | border-top-right-radius: 1rem; 103 | border: 1px solid #fff; 104 | box-sizing: border-box; 105 | color: black; 106 | } 107 | 108 | #ls { 109 | clear: both; 110 | } 111 | 112 | /* CLEARFIX */ 113 | 114 | .cf:before, 115 | .cf:after { 116 | content: " "; 117 | display: table; 118 | } 119 | 120 | .cf:after { 121 | clear: both; 122 | } 123 | 124 | #share-link-wrapper > a { 125 | margin-top: .3rem; 126 | padding: 1rem; 127 | font-variant: small-caps; 128 | display: block; 129 | border-bottom-right-radius: 1rem; 130 | border-bottom-left-radius: 1rem; 131 | background-color: #eee; 132 | color: #000; 133 | text-decoration: none; 134 | } 135 | 136 | #share-link-wrapper > a:hover { 137 | color: #fff; 138 | background-color: #3A3A3A; 139 | } 140 | 141 | /* Original style (with some small modifications): */ 142 | 143 | html { 144 | } 145 | 146 | body { 147 | font-family: Roboto, sans-serif; 148 | 149 | color: #3A3A3A; 150 | } 151 | 152 | /*MOBILE ONLY CODE*/ 153 | @media screen and (max-width: 1080px) { 154 | 155 | body { 156 | padding-left: 0rem; 157 | padding-right: 0rem; 158 | } 159 | } 160 | 161 | /*DESKTOP ONLY CODE*/ 162 | 163 | @media screen and (min-width: 1080px) { 164 | 165 | body { 166 | padding-left: 2rem; 167 | padding-right: 2rem; 168 | } 169 | } 170 | 171 | .container { 172 | width: 100%; 173 | text-align: center; 174 | } 175 | 176 | .container h1 { 177 | font-size: 42px; 178 | font-weight: 300; 179 | color: #0f3c4b; 180 | margin-bottom: 40px; 181 | } 182 | 183 | .container h1 a:hover, 184 | .container h1 a:focus { 185 | color: #39bfd3; 186 | } 187 | 188 | .container nav { 189 | margin-bottom: 40px; 190 | } 191 | 192 | .container nav a { 193 | border-bottom: 2px solid #c8dadf; 194 | display: inline-block; 195 | padding: 4px 8px; 196 | margin: 0 5px; 197 | } 198 | 199 | .container nav a.is-selected { 200 | font-weight: 700; 201 | color: #39bfd3; 202 | border-bottom-color: currentColor; 203 | } 204 | 205 | .container nav a:not( .is-selected ):hover, 206 | .container nav a:not( .is-selected ):focus { 207 | border-bottom-color: #0f3c4b; 208 | } 209 | 210 | .secure-link { 211 | text-decoration: underline; 212 | font-weight: bold; 213 | cursor: pointer; 214 | } 215 | 216 | .box { 217 | font-size: 1.25rem; /* 20 */ 218 | /*background-color: #f8f8f8;*/ 219 | /*position: relative;*/ 220 | /*padding: 100px 20px;*/ 221 | /*border: solid 1px hotpink;*/ 222 | box-sizing: border-box; 223 | display: inline-block; 224 | padding-top: 1rem; 225 | padding-bottom: 1rem; 226 | 227 | height: inherit; 228 | 229 | } 230 | 231 | .box.has-advanced-upload { 232 | 233 | width: inherit; 234 | 235 | } 236 | 237 | .box.is-dragover { 238 | outline-offset: -20px; 239 | outline-color: #c8dadf; 240 | background-color: #fff; 241 | } 242 | 243 | .box__dragndrop, 244 | .box__icon { 245 | display: none; 246 | } 247 | 248 | .box.has-advanced-upload .box__dragndrop { 249 | display: inline; 250 | } 251 | 252 | .box.has-advanced-upload .box__icon { 253 | width: 100%; 254 | height: 80px; 255 | fill: #92b0b3; 256 | display: block; 257 | margin-bottom: 40px; 258 | } 259 | 260 | .box.is-uploading .box__input, 261 | .box.is-success .box__input, 262 | .box.is-error .box__input { 263 | display: none; 264 | } 265 | 266 | .box__uploading, 267 | .box__success, 268 | .box__error { 269 | display: none; 270 | } 271 | 272 | .box.is-uploading .box__uploading, 273 | .box.is-success .box__success, 274 | .box.is-error .box__error { 275 | display: block; 276 | /*position: absolute;*/ 277 | /*top: 50%;*/ 278 | right: 0; 279 | left: 0; 280 | margin-top: 2rem; 281 | 282 | -webkit-transform: translateY(-50%); 283 | transform: translateY(-50%); 284 | } 285 | 286 | .box__uploading { 287 | font-style: italic; 288 | } 289 | 290 | .box__success { 291 | -webkit-animation: appear-from-inside .25s ease-in-out; 292 | animation: appear-from-inside .25s ease-in-out; 293 | } 294 | 295 | @-webkit-keyframes appear-from-inside { 296 | from { 297 | -webkit-transform: translateY(-50%) scale(0); 298 | } 299 | 75% { 300 | -webkit-transform: translateY(-50%) scale(1.1); 301 | } 302 | to { 303 | -webkit-transform: translateY(-50%) scale(1); 304 | } 305 | } 306 | 307 | @keyframes appear-from-inside { 308 | from { 309 | transform: translateY(-50%) scale(0); 310 | } 311 | 75% { 312 | transform: translateY(-50%) scale(1.1); 313 | } 314 | to { 315 | transform: translateY(-50%) scale(1); 316 | } 317 | } 318 | 319 | .box__success, .box__message, .box__error { 320 | text-align: center; 321 | } 322 | 323 | .box__restart { 324 | font-weight: 700; 325 | } 326 | 327 | .box__restart:focus, 328 | .box__restart:hover { 329 | color: #39bfd3; 330 | } 331 | 332 | .box__file:active, .box__file:focus { 333 | outline: none; 334 | } 335 | 336 | .box__file { 337 | 338 | box-sizing: border-box; 339 | z-index: -1 !important; 340 | } 341 | 342 | .js .box__file { 343 | width: 0.1px; 344 | height: 0.1px; 345 | opacity: 0; 346 | overflow: hidden; 347 | /*position: absolute;*/ 348 | z-index: -1; 349 | } 350 | 351 | .js .box__file + label { 352 | max-width: 80%; 353 | text-overflow: ellipsis; 354 | white-space: nowrap; 355 | cursor: pointer; 356 | display: block; 357 | overflow: hidden; 358 | /*border: solid 1px hotpink;*/ 359 | box-sizing: border-box; 360 | 361 | margin: 0 auto; 362 | text-align: center; 363 | 364 | } 365 | 366 | .js .box__file + label:hover strong, 367 | .box__file:focus + label strong, 368 | .box__file.has-focus + label strong { 369 | color: #39bfd3; 370 | } 371 | 372 | .js .box__file:focus + label, 373 | .js .box__file.has-focus + label { 374 | outline: 1px dotted #000; 375 | outline: -webkit-focus-ring-color auto 5px; 376 | } 377 | 378 | .js .box__file + label * { 379 | /* pointer-events: none; */ /* in case of FastClick lib use */ 380 | } 381 | 382 | .no-js .box__file + label { 383 | display: none; 384 | } 385 | 386 | .no-js .box__button { 387 | display: block; 388 | } 389 | 390 | .box__button { 391 | font-weight: 700; 392 | color: #e5edf1; 393 | background-color: #39bfd3; 394 | display: none; 395 | padding: 8px 16px; 396 | margin: 40px auto 0; 397 | } 398 | 399 | .box__button:hover, 400 | .box__button:focus { 401 | background-color: #0f3c4b; 402 | } 403 | -------------------------------------------------------------------------------- /public/assets/fonts.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto'; 4 | font-style: italic; 5 | font-weight: 300; 6 | src: local('Roboto Light Italic'), local('Roboto-LightItalic'), url(https://fonts.gstatic.com/s/roboto/v18/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* cyrillic */ 10 | @font-face { 11 | font-family: 'Roboto'; 12 | font-style: italic; 13 | font-weight: 300; 14 | src: local('Roboto Light Italic'), local('Roboto-LightItalic'), url(https://fonts.gstatic.com/s/roboto/v18/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2) format('woff2'); 15 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 16 | } 17 | /* greek-ext */ 18 | @font-face { 19 | font-family: 'Roboto'; 20 | font-style: italic; 21 | font-weight: 300; 22 | src: local('Roboto Light Italic'), local('Roboto-LightItalic'), url(https://fonts.gstatic.com/s/roboto/v18/KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2) format('woff2'); 23 | unicode-range: U+1F00-1FFF; 24 | } 25 | /* greek */ 26 | @font-face { 27 | font-family: 'Roboto'; 28 | font-style: italic; 29 | font-weight: 300; 30 | src: local('Roboto Light Italic'), local('Roboto-LightItalic'), url(https://fonts.gstatic.com/s/roboto/v18/KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2) format('woff2'); 31 | unicode-range: U+0370-03FF; 32 | } 33 | /* vietnamese */ 34 | @font-face { 35 | font-family: 'Roboto'; 36 | font-style: italic; 37 | font-weight: 300; 38 | src: local('Roboto Light Italic'), local('Roboto-LightItalic'), url(https://fonts.gstatic.com/s/roboto/v18/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2) format('woff2'); 39 | unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; 40 | } 41 | /* latin-ext */ 42 | @font-face { 43 | font-family: 'Roboto'; 44 | font-style: italic; 45 | font-weight: 300; 46 | src: local('Roboto Light Italic'), local('Roboto-LightItalic'), url(https://fonts.gstatic.com/s/roboto/v18/KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2) format('woff2'); 47 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 48 | } 49 | /* latin */ 50 | @font-face { 51 | font-family: 'Roboto'; 52 | font-style: italic; 53 | font-weight: 300; 54 | src: local('Roboto Light Italic'), local('Roboto-LightItalic'), url(https://fonts.gstatic.com/s/roboto/v18/KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2) format('woff2'); 55 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 56 | } 57 | /* cyrillic-ext */ 58 | @font-face { 59 | font-family: 'Roboto'; 60 | font-style: normal; 61 | font-weight: 300; 62 | src: local('Roboto Light'), local('Roboto-Light'), url(https://fonts.gstatic.com/s/roboto/v18/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2) format('woff2'); 63 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 64 | } 65 | /* cyrillic */ 66 | @font-face { 67 | font-family: 'Roboto'; 68 | font-style: normal; 69 | font-weight: 300; 70 | src: local('Roboto Light'), local('Roboto-Light'), url(https://fonts.gstatic.com/s/roboto/v18/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2) format('woff2'); 71 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 72 | } 73 | /* greek-ext */ 74 | @font-face { 75 | font-family: 'Roboto'; 76 | font-style: normal; 77 | font-weight: 300; 78 | src: local('Roboto Light'), local('Roboto-Light'), url(https://fonts.gstatic.com/s/roboto/v18/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2) format('woff2'); 79 | unicode-range: U+1F00-1FFF; 80 | } 81 | /* greek */ 82 | @font-face { 83 | font-family: 'Roboto'; 84 | font-style: normal; 85 | font-weight: 300; 86 | src: local('Roboto Light'), local('Roboto-Light'), url(https://fonts.gstatic.com/s/roboto/v18/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2) format('woff2'); 87 | unicode-range: U+0370-03FF; 88 | } 89 | /* vietnamese */ 90 | @font-face { 91 | font-family: 'Roboto'; 92 | font-style: normal; 93 | font-weight: 300; 94 | src: local('Roboto Light'), local('Roboto-Light'), url(https://fonts.gstatic.com/s/roboto/v18/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2) format('woff2'); 95 | unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; 96 | } 97 | /* latin-ext */ 98 | @font-face { 99 | font-family: 'Roboto'; 100 | font-style: normal; 101 | font-weight: 300; 102 | src: local('Roboto Light'), local('Roboto-Light'), url(https://fonts.gstatic.com/s/roboto/v18/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2) format('woff2'); 103 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 104 | } 105 | /* latin */ 106 | @font-face { 107 | font-family: 'Roboto'; 108 | font-style: normal; 109 | font-weight: 300; 110 | src: local('Roboto Light'), local('Roboto-Light'), url(https://fonts.gstatic.com/s/roboto/v18/KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format('woff2'); 111 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 112 | } 113 | /* cyrillic-ext */ 114 | @font-face { 115 | font-family: 'Roboto'; 116 | font-style: normal; 117 | font-weight: 400; 118 | src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2'); 119 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 120 | } 121 | /* cyrillic */ 122 | @font-face { 123 | font-family: 'Roboto'; 124 | font-style: normal; 125 | font-weight: 400; 126 | src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2'); 127 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 128 | } 129 | /* greek-ext */ 130 | @font-face { 131 | font-family: 'Roboto'; 132 | font-style: normal; 133 | font-weight: 400; 134 | src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2'); 135 | unicode-range: U+1F00-1FFF; 136 | } 137 | /* greek */ 138 | @font-face { 139 | font-family: 'Roboto'; 140 | font-style: normal; 141 | font-weight: 400; 142 | src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2'); 143 | unicode-range: U+0370-03FF; 144 | } 145 | /* vietnamese */ 146 | @font-face { 147 | font-family: 'Roboto'; 148 | font-style: normal; 149 | font-weight: 400; 150 | src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2'); 151 | unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; 152 | } 153 | /* latin-ext */ 154 | @font-face { 155 | font-family: 'Roboto'; 156 | font-style: normal; 157 | font-weight: 400; 158 | src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2'); 159 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 160 | } 161 | /* latin */ 162 | @font-face { 163 | font-family: 'Roboto'; 164 | font-style: normal; 165 | font-weight: 400; 166 | src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v18/KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2'); 167 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 168 | } 169 | -------------------------------------------------------------------------------- /public/assets/fonts/confortaa-font/Comfortaa-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/confortaa-font/Comfortaa-Bold.woff -------------------------------------------------------------------------------- /public/assets/fonts/confortaa-font/Comfortaa-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/confortaa-font/Comfortaa-Bold.woff2 -------------------------------------------------------------------------------- /public/assets/fonts/confortaa-font/Comfortaa-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/confortaa-font/Comfortaa-Thin.woff -------------------------------------------------------------------------------- /public/assets/fonts/confortaa-font/Comfortaa-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/confortaa-font/Comfortaa-Thin.woff2 -------------------------------------------------------------------------------- /public/assets/fonts/confortaa-font/Comfortaa.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/confortaa-font/Comfortaa.woff -------------------------------------------------------------------------------- /public/assets/fonts/confortaa-font/Comfortaa.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/confortaa-font/Comfortaa.woff2 -------------------------------------------------------------------------------- /public/assets/fonts/confortaa-font/stylesheet.css: -------------------------------------------------------------------------------- 1 | /* This stylesheet generated by Transfonter (https://transfonter.org) on April 25, 2018 8:27 PM */ 2 | 3 | @font-face { 4 | font-family: 'Comfortaa Light'; 5 | src: url('Comfortaa-Thin.woff2') format('woff2'), 6 | url('Comfortaa-Thin.woff') format('woff'); 7 | font-weight: 100; 8 | font-style: normal; 9 | } 10 | 11 | @font-face { 12 | font-family: 'Comfortaa'; 13 | src: url('Comfortaa.woff2') format('woff2'), 14 | url('Comfortaa.woff') format('woff'); 15 | font-weight: normal; 16 | font-style: normal; 17 | } 18 | 19 | @font-face { 20 | font-family: 'Comfortaa'; 21 | src: url('Comfortaa-Bold.woff2') format('woff2'), 22 | url('Comfortaa-Bold.woff') format('woff'); 23 | font-weight: bold; 24 | font-style: normal; 25 | } 26 | -------------------------------------------------------------------------------- /public/assets/fonts/custom-icons/Flaticon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/custom-icons/Flaticon.eot -------------------------------------------------------------------------------- /public/assets/fonts/custom-icons/Flaticon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/custom-icons/Flaticon.ttf -------------------------------------------------------------------------------- /public/assets/fonts/custom-icons/Flaticon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/custom-icons/Flaticon.woff -------------------------------------------------------------------------------- /public/assets/fonts/custom-icons/_flaticon.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Flaticon icon font: Flaticon 3 | Creation date: 12/04/2018 07:18 4 | */ 5 | 6 | @font-face { 7 | font-family: "Flaticon"; 8 | src: url("Flaticon.eot"); 9 | src: url("Flaticon.eot?#iefix") format("embedded-opentype"), 10 | url("Flaticon.woff") format("woff"), 11 | url("Flaticon.ttf") format("truetype"), 12 | url("Flaticon.svg#Flaticon") format("svg"); 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | 17 | @media screen and (-webkit-min-device-pixel-ratio:0) { 18 | @font-face { 19 | font-family: "Flaticon"; 20 | src: url("Flaticon.svg#Flaticon") format("svg"); 21 | } 22 | } 23 | 24 | .fi:before{ 25 | display: inline-block; 26 | font-family: "Flaticon"; 27 | font-style: normal; 28 | font-weight: normal; 29 | font-variant: normal; 30 | line-height: 1; 31 | text-decoration: inherit; 32 | text-rendering: optimizeLegibility; 33 | text-transform: none; 34 | -moz-osx-font-smoothing: grayscale; 35 | -webkit-font-smoothing: antialiased; 36 | font-smoothing: antialiased; 37 | } 38 | 39 | .flaticon-copy-documents-option:before { content: "\f100"; } 40 | .flaticon-add-a-folder-interface-symbol-of-stroke:before { content: "\f101"; } 41 | .flaticon-safari-logo:before { content: "\f102"; } 42 | .flaticon-link:before { content: "\f103"; } 43 | .flaticon-upload-1:before { content: "\f104"; } 44 | .flaticon-folder:before { content: "\f105"; } 45 | .flaticon-garbage:before { content: "\f106"; } 46 | .flaticon-key:before { content: "\f107"; } 47 | .flaticon-chrome:before { content: "\f108"; } 48 | .flaticon-list:before { content: "\f109"; } 49 | .flaticon-envelope:before { content: "\f10a"; } 50 | .flaticon-tick:before { content: "\f10b"; } 51 | .flaticon-timeline:before { content: "\f10c"; } 52 | .flaticon-close:before { content: "\f10d"; } 53 | .flaticon-firefox-logotype:before { content: "\f10e"; } 54 | 55 | $font-Flaticon-copy-documents-option: "\f100"; 56 | $font-Flaticon-add-a-folder-interface-symbol-of-stroke: "\f101"; 57 | $font-Flaticon-safari-logo: "\f102"; 58 | $font-Flaticon-link: "\f103"; 59 | $font-Flaticon-upload-1: "\f104"; 60 | $font-Flaticon-folder: "\f105"; 61 | $font-Flaticon-garbage: "\f106"; 62 | $font-Flaticon-key: "\f107"; 63 | $font-Flaticon-chrome: "\f108"; 64 | $font-Flaticon-list: "\f109"; 65 | $font-Flaticon-envelope: "\f10a"; 66 | $font-Flaticon-tick: "\f10b"; 67 | $font-Flaticon-timeline: "\f10c"; 68 | $font-Flaticon-close: "\f10d"; 69 | $font-Flaticon-firefox-logotype: "\f10e"; -------------------------------------------------------------------------------- /public/assets/fonts/custom-icons/file.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | Asset 3 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /public/assets/fonts/custom-icons/flaticon.css: -------------------------------------------------------------------------------- 1 | /* 2 | Flaticon icon font: Flaticon 3 | Creation date: 12/04/2018 07:18 4 | */ 5 | 6 | @font-face { 7 | font-family: "Flaticon"; 8 | src: url("./Flaticon.eot"); 9 | src: url("./Flaticon.eot?#iefix") format("embedded-opentype"), 10 | url("./Flaticon.woff") format("woff"), 11 | url("./Flaticon.ttf") format("truetype"), 12 | url("./Flaticon.svg#Flaticon") format("svg"); 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | 17 | @media screen and (-webkit-min-device-pixel-ratio:0) { 18 | @font-face { 19 | font-family: "Flaticon"; 20 | src: url("./Flaticon.svg#Flaticon") format("svg"); 21 | } 22 | } 23 | 24 | [class^="flaticon-"]:before, [class*=" flaticon-"]:before, 25 | [class^="flaticon-"]:after, [class*=" flaticon-"]:after { 26 | font-family: Flaticon; 27 | font-size: 20px; 28 | font-style: normal; 29 | margin-left: 20px; 30 | } 31 | 32 | .flaticon-copy-documents-option:before { content: "\f100"; } 33 | .flaticon-add-a-folder-interface-symbol-of-stroke:before { content: "\f101"; } 34 | .flaticon-safari-logo:before { content: "\f102"; } 35 | .flaticon-link:before { content: "\f103"; } 36 | .flaticon-upload-1:before { content: "\f104"; } 37 | .flaticon-folder:before { content: "\f105"; } 38 | .flaticon-garbage:before { content: "\f106"; } 39 | .flaticon-key:before { content: "\f107"; } 40 | .flaticon-chrome:before { content: "\f108"; } 41 | .flaticon-list:before { content: "\f109"; } 42 | .flaticon-envelope:before { content: "\f10a"; } 43 | .flaticon-tick:before { content: "\f10b"; } 44 | .flaticon-timeline:before { content: "\f10c"; } 45 | .flaticon-close:before { content: "\f10d"; } 46 | .flaticon-firefox-logotype:before { content: "\f10e"; } -------------------------------------------------------------------------------- /public/assets/fonts/custom-icons/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /public/assets/fonts/helvetica-neue/HelveticaNeue.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/helvetica-neue/HelveticaNeue.woff -------------------------------------------------------------------------------- /public/assets/fonts/helvetica-neue/HelveticaNeue.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/helvetica-neue/HelveticaNeue.woff2 -------------------------------------------------------------------------------- /public/assets/fonts/helvetica-neue/stylesheet.css: -------------------------------------------------------------------------------- 1 | /* This stylesheet generated by Transfonter (https://transfonter.org) on April 4, 2018 4:29 AM */ 2 | 3 | @font-face { 4 | font-family: 'Helvetica Neue'; 5 | src: url('HelveticaNeue.woff2') format('woff2'), 6 | url('HelveticaNeue.woff') format('woff'); 7 | font-weight: normal; 8 | font-style: normal; 9 | } 10 | -------------------------------------------------------------------------------- /public/assets/fonts/share-btn/Flaticon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/share-btn/Flaticon.eot -------------------------------------------------------------------------------- /public/assets/fonts/share-btn/Flaticon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by FontForge 20160405 at Mon May 7 05:06:15 2018 9 | By Apache 10 | Copyright (c) 2018, Apache 11 | 12 | 13 | 14 | 27 | 28 | 30 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /public/assets/fonts/share-btn/Flaticon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/share-btn/Flaticon.ttf -------------------------------------------------------------------------------- /public/assets/fonts/share-btn/Flaticon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/fonts/share-btn/Flaticon.woff -------------------------------------------------------------------------------- /public/assets/fonts/share-btn/_flaticon.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Flaticon icon font: Flaticon 3 | Creation date: 07/05/2018 05:06 4 | */ 5 | 6 | @font-face { 7 | font-family: "Flaticon"; 8 | src: url("./Flaticon.eot"); 9 | src: url("./Flaticon.eot?#iefix") format("embedded-opentype"), 10 | url("./Flaticon.woff") format("woff"), 11 | url("./Flaticon.ttf") format("truetype"), 12 | url("./Flaticon.svg#Flaticon") format("svg"); 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | 17 | @media screen and (-webkit-min-device-pixel-ratio:0) { 18 | @font-face { 19 | font-family: "Flaticon"; 20 | src: url("./Flaticon.svg#Flaticon") format("svg"); 21 | } 22 | } 23 | 24 | .fi:before{ 25 | display: inline-block; 26 | font-family: "Flaticon"; 27 | font-style: normal; 28 | font-weight: normal; 29 | font-variant: normal; 30 | line-height: 1; 31 | text-decoration: inherit; 32 | text-rendering: optimizeLegibility; 33 | text-transform: none; 34 | -moz-osx-font-smoothing: grayscale; 35 | -webkit-font-smoothing: antialiased; 36 | font-smoothing: antialiased; 37 | } 38 | 39 | .flaticon-arrows:before { content: "\f100"; } 40 | 41 | $font-Flaticon-arrows: "\f100"; -------------------------------------------------------------------------------- /public/assets/fonts/share-btn/flaticon.css: -------------------------------------------------------------------------------- 1 | /* 2 | Flaticon icon font: Flaticon 3 | Creation date: 07/05/2018 05:06 4 | */ 5 | 6 | @font-face { 7 | font-family: "Flaticon"; 8 | src: url("./Flaticon.eot"); 9 | src: url("./Flaticon.eot?#iefix") format("embedded-opentype"), 10 | url("./Flaticon.woff") format("woff"), 11 | url("./Flaticon.ttf") format("truetype"), 12 | url("./Flaticon.svg#Flaticon") format("svg"); 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | 17 | @media screen and (-webkit-min-device-pixel-ratio:0) { 18 | @font-face { 19 | font-family: "Flaticon"; 20 | src: url("./Flaticon.svg#Flaticon") format("svg"); 21 | } 22 | } 23 | 24 | [class^="flaticon-"]:before, [class*=" flaticon-"]:before, 25 | [class^="flaticon-"]:after, [class*=" flaticon-"]:after { 26 | font-family: Flaticon; 27 | font-size: 20px; 28 | font-style: normal; 29 | margin-left: 20px; 30 | } 31 | 32 | .flaticon-arrows:before { content: "\f100"; } -------------------------------------------------------------------------------- /public/assets/gfx/background.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | Asset 4 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /public/assets/gfx/countable-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/gfx/countable-logo.png -------------------------------------------------------------------------------- /public/assets/gfx/custom-icons/upload-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | Asset 5 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/assets/gfx/landing/chrome-square.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 19 | 20 | Asset 6 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /public/assets/gfx/landing/countable-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/gfx/landing/countable-web.png -------------------------------------------------------------------------------- /public/assets/gfx/landing/crypto-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 29 | 30 | crypto-icon 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /public/assets/gfx/landing/firefox-square.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 19 | 20 | Asset 7 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /public/assets/gfx/landing/safari-square.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 19 | 20 | Asset 8 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /public/assets/gfx/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | Asset 9 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /public/assets/gfx/octocat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/gfx/octocat.png -------------------------------------------------------------------------------- /public/assets/gfx/server.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | 29 | Asset 1 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /public/assets/gfx/square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/gfx/square.png -------------------------------------------------------------------------------- /public/assets/gfx/upload-form/cloud.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 23 | 24 | cloud-upload 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /public/assets/gfx/upload-form/icons/analytics.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | Asset 5 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /public/assets/gfx/upload-form/icons/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | Asset 4 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /public/assets/gfx/upload-form/icons/links.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | Asset 7 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/assets/gfx/upload-form/icons/list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | Asset 6 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /public/assets/gfx/upload-form/icons/trash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | Asset 8 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /public/assets/gfx/upload-form/icons/upload.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | Asset 3 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/assets/gfx/upload-form/laptop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/gfx/upload-form/laptop.png -------------------------------------------------------------------------------- /public/assets/gfx/upload-form/locker.svg: -------------------------------------------------------------------------------- 1 | 2 | locker 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/gfx/upload-form/spinning-locker.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | spinning-locker 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/assets/index.css: -------------------------------------------------------------------------------- 1 | html, main, body { 2 | background-color: #1E1E1E; 3 | } 4 | 5 | body { 6 | font-family: "Helvetica Neue", sans-serif; 7 | } 8 | 9 | .index-upload-wrapper { 10 | text-align: center; 11 | padding: 5rem 5%; 12 | } 13 | 14 | .upload-button { 15 | display: inline-block; 16 | text-decoration: none; 17 | color: #1E1E1E; 18 | background: #eee; 19 | padding: 1rem 10%; 20 | border-radius: 1rem; 21 | font-size: 2.5rem; 22 | font-variant: small-caps; 23 | } 24 | 25 | .upload-button:hover { 26 | background: #bbb; 27 | } 28 | -------------------------------------------------------------------------------- /public/assets/js/copy-clipboard.js: -------------------------------------------------------------------------------- 1 | function copyToClipboard(url) { 2 | let $temp = $(""); 3 | $("body").append($temp); 4 | $temp.val($(element).text()).select(); 5 | document.execCommand("copy"); 6 | $temp.remove(); 7 | } -------------------------------------------------------------------------------- /public/assets/js/email-validation.js: -------------------------------------------------------------------------------- 1 | function validateEmail(email) { 2 | let re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 3 | return re.test(String(email).toLowerCase()); 4 | } -------------------------------------------------------------------------------- /public/assets/js/header-animation.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | //store square positions 4 | let squares = [ 5 | // {id: 0, top: 16, left: 11.2}, 6 | // {id: 1, top: 24, left: 23}, 7 | // {id: 2, top: 33, left: 44}, 8 | // {id: 3, top: 45, left: 12}, 9 | // {id: 4, top: 66, left: 33}, 10 | ]; 11 | 12 | let windowWidth = window.innerWidth; 13 | let windowHeight = window.innerHeight; 14 | 15 | // console.log(windowWidth) 16 | 17 | let square_container = { 18 | max_width: windowWidth, 19 | max_height: 300 20 | }; 21 | 22 | 23 | //generate random position squares (inside square container) 24 | for (let i = 0; i < 30; i++) { 25 | let newSquare = { 26 | id: i, 27 | top: Math.floor(Math.random() * square_container.max_height) + 'px', 28 | left: Math.floor(Math.random() * square_container.max_width) + 'px', 29 | }; 30 | squares.push(newSquare); 31 | } 32 | 33 | // console.log(squares); 34 | 35 | 36 | //create squares on image 37 | 38 | for (let i = 0; i < squares.length; i++) { 39 | 40 | $(".squares").append(` 41 | 42 | `); 43 | } 44 | 45 | 46 | //when all the squares are added, show them 47 | 48 | function squaresInit() { 49 | squaresInterval = setInterval(() => { 50 | 51 | $(".square").fadeOut(); 52 | //pickup random square and fade in and fade out 53 | let n = Math.floor(Math.random() * squares.length); 54 | let otherSquares = $(`.square[data-id!=${n}]`); //assure that other squares are not visible 55 | let animatedSquare = $(`.square[data-id=${n}]`); 56 | // console.log(`Animating square ${n}`); 57 | otherSquares.fadeOut(); 58 | animatedSquare.fadeToggle(1000); 59 | 60 | 61 | }, 1000) 62 | 63 | } 64 | squaresInit(); 65 | 66 | 67 | //we should only start the interval if the window is on focus, otherwise, all squares will be triggered at once (bug) 68 | $(window).focus(function () { 69 | squaresInit(); 70 | }).blur(function () { 71 | $(".square").fadeOut(); 72 | clearInterval(squaresInterval); 73 | }); 74 | 75 | 76 | }); -------------------------------------------------------------------------------- /public/assets/js/izimodal/LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /public/assets/js/izimodal/README.md: -------------------------------------------------------------------------------- 1 | # [iziModal](http://izimodal.dolce.ninja) 2 | [![CDNJS](https://img.shields.io/cdnjs/v/izimodal.svg)](https://cdnjs.com/libraries/izimodal) 3 | 4 | Elegant, responsive, flexible and lightweight modal plugin with jQuery. 5 | 6 | [**izimodal**.marcelodolce.com](http://izimodal.marcelodolce.com) 7 | 8 | ![capa](http://i.imgur.com/UneCF3L.gif) 9 | 10 | [logo]: http://i.imgur.com/hCYIhep.png "Check icon" 11 | 12 | [new]: http://i.imgur.com/41zuVDk.png "New label" 13 | [bug]: http://i.imgur.com/92lu4ln.png "Bug label" 14 | 15 | Fast | Responsive | Animated | Lightweight | Customizable | History | Group Mode | Retina 16 | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: 17 | ![alt text][logo] | ![alt text][logo] | ![alt text][logo] | ![alt text][logo] | ![alt text][logo] | ![alt text][logo] | ![alt text][logo] | ![alt text][logo] 18 | 19 | 20 | - All modern browsers are supported (Tested in Chrome, Firefox, Opera, Safari, IE9+ and Edge). 21 | - Bugs? create an issue [here](https://github.com/dolce/iziModal/issues). 22 | 23 | 24 | ___ 25 | - ### [Changelog](http://izimodal.marcelodolce.com/#Changelog) 26 | - ### [Iframe](http://izimodal.marcelodolce.com/#Iframe) 27 | - ### [Ajax](http://izimodal.marcelodolce.com/#Ajax) 28 | - ### [DataAttributes](http://izimodal.marcelodolce.com/#DataAttributes) 29 | - ### [Options](http://izimodal.marcelodolce.com/#Options) 30 | - ### [Methods](http://izimodal.marcelodolce.com/#Methods) 31 | - ### [Events](http://izimodal.marcelodolce.com/#Events) 32 | - ### [Use](http://izimodal.marcelodolce.com/#Start) 33 | ___ 34 | #### [CDNJS](https://cdnjs.com/libraries/izimodal) 35 | https://cdnjs.com/libraries/izimodal 36 | 37 | #### [npm](https://www.npmjs.com/package/izimodal) 38 | ``` 39 | npm install izimodal --save 40 | ``` 41 | 42 | #### bower 43 | ``` 44 | bower install izimodal --save 45 | ``` 46 | 47 | #### [GEM](https://github.com/elitenomad/izimodal) 48 | ``` 49 | gem install izimodal 50 | ``` 51 | 52 | 53 | 54 | Donations 55 | --------- 56 | 57 | If you liked this plugin, you can donate to support it: 58 | 59 | - http://izimodal.marcelodolce.com#Donations 60 | -------------------------------------------------------------------------------- /public/assets/js/izimodal/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "izimodal", 3 | "description": "Elegant, responsive, flexible and lightweight modal plugin with jQuery.", 4 | "main": [ 5 | "js/iziModal.js", 6 | "css/iziModal.css" 7 | ], 8 | "authors": [ 9 | { 10 | "name": "Marcelo Dolce", 11 | "email": "dolcemarcelo@gmail.com", 12 | "homepage": "http://marcelodolce.com" 13 | } 14 | ], 15 | "license": "Apache-2.0", 16 | "keywords": [ 17 | "izimodal", 18 | "jQuery", 19 | "modal", 20 | "lightbox", 21 | "iframe", 22 | "alert", 23 | "box", 24 | "javascript", 25 | "js" 26 | ], 27 | "homepage": "http://izimodal.marcelodolce.com", 28 | "ignore": [ 29 | "**/.*", 30 | "node_modules", 31 | "bower_components", 32 | "test", 33 | "tests" 34 | ], 35 | "dependencies": { 36 | "jquery": "~2" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /public/assets/js/izimodal/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_from": "izimodal", 3 | "_id": "izimodal@1.5.1", 4 | "_inBundle": false, 5 | "_integrity": "sha512-DqqGUd741tAqJnWZMQRgixlgtSB6tb/HhfddmlsFWE5P7sckF2SmKVyyttpAdBdN5LUzQiF/R/+IjJw0TS5oTA==", 6 | "_location": "/izimodal", 7 | "_phantomChildren": {}, 8 | "_requested": { 9 | "type": "tag", 10 | "registry": true, 11 | "raw": "izimodal", 12 | "name": "izimodal", 13 | "escapedName": "izimodal", 14 | "rawSpec": "", 15 | "saveSpec": null, 16 | "fetchSpec": "latest" 17 | }, 18 | "_requiredBy": [ 19 | "#USER", 20 | "/" 21 | ], 22 | "_resolved": "https://registry.npmjs.org/izimodal/-/izimodal-1.5.1.tgz", 23 | "_shasum": "a49145030d8d9edfc60dfc35ae1758e4cf8502f1", 24 | "_spec": "izimodal", 25 | "_where": "C:\\Users\\joaop\\Desktop\\sendcrypt-tests-master", 26 | "author": { 27 | "name": "Marcelo Dolce", 28 | "email": "dolcemarcelo@gmail.com" 29 | }, 30 | "bugs": { 31 | "url": "https://github.com/dolce/iziModal/issues" 32 | }, 33 | "bundleDependencies": false, 34 | "dependencies": { 35 | "jquery": "~2" 36 | }, 37 | "deprecated": false, 38 | "description": "Elegant, responsive, flexible and lightweight modal plugin with jQuery.", 39 | "homepage": "https://github.com/dolce/iziModal#readme", 40 | "keywords": [ 41 | "izimodal", 42 | "jQuery", 43 | "modal", 44 | "lightbox", 45 | "iframe", 46 | "alert", 47 | "javascript", 48 | "js" 49 | ], 50 | "license": "Apache-2.0", 51 | "main": "js/iziModal.js", 52 | "name": "izimodal", 53 | "repository": { 54 | "type": "git", 55 | "url": "git+https://github.com/dolce/iziModal.git" 56 | }, 57 | "version": "1.5.1" 58 | } 59 | -------------------------------------------------------------------------------- /public/assets/js/landing-animations.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | 3 | $(".octocat").on("mouseenter",function(){ 4 | 5 | $(this).addClass("heartbeat"); 6 | 7 | 8 | }).on("mouseleave",function(){ 9 | 10 | $(this).removeClass("heartbeat"); 11 | 12 | }) 13 | 14 | 15 | }); -------------------------------------------------------------------------------- /public/assets/js/modal-handler.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | $("#modal").iziModal({ 3 | title: '', 4 | subtitle: '', 5 | headerColor: '#495F7F', 6 | background: null, 7 | theme: '', // light 8 | icon: null, 9 | iconText: null, 10 | iconColor: '', 11 | rtl: false, 12 | width: 600, 13 | top: null, 14 | bottom: null, 15 | borderBottom: true, 16 | padding: 0, 17 | radius: 3, 18 | zindex: 999, 19 | iframe: false, 20 | iframeHeight: 400, 21 | iframeURL: null, 22 | focusInput: true, 23 | group: '', 24 | loop: false, 25 | arrowKeys: true, 26 | navigateCaption: true, 27 | navigateArrows: true, // Boolean, 'closeToModal', 'closeScreenEdge' 28 | history: false, 29 | restoreDefaultContent: false, 30 | autoOpen: 0, // Boolean, Number 31 | bodyOverflow: false, 32 | fullscreen: false, 33 | openFullscreen: false, 34 | closeOnEscape: true, 35 | closeButton: true, 36 | appendTo: 'body', // or false 37 | appendToOverlay: 'body', // or false 38 | overlay: true, 39 | overlayClose: true, 40 | overlayColor: 'rgba(0, 0, 0, 0.4)', 41 | timeout: false, 42 | timeoutProgressbar: false, 43 | pauseOnHover: false, 44 | timeoutProgressbarColor: 'rgba(255,255,255,0.5)', 45 | transitionIn: 'comingIn', 46 | transitionOut: 'comingOut', 47 | transitionInOverlay: 'fadeIn', 48 | transitionOutOverlay: 'fadeOut', 49 | onFullscreen: function () { 50 | }, 51 | onResize: function () { 52 | }, 53 | onOpening: function () { 54 | }, 55 | onOpened: function () { 56 | }, 57 | onClosing: function () { 58 | }, 59 | onClosed: function () { 60 | }, 61 | afterRender: function () { 62 | } 63 | }); 64 | 65 | 66 | /* COPY URL TO CLIPBOARD =========================================== */ 67 | 68 | 69 | function copyUrl() { 70 | $("#copy-url").on("click", function () { 71 | 72 | let url = $("#url"); 73 | 74 | 75 | //copy url content to clipboard 76 | copyToClipboard(url); 77 | 78 | //show status to user. 79 | let status = $(".status"); 80 | 81 | status.text("Item copied to clipboard!"); 82 | status.fadeIn(500); 83 | 84 | setTimeout(() => { 85 | status.fadeOut(500) 86 | 87 | 88 | }, 3000); 89 | 90 | 91 | }); 92 | } 93 | 94 | $("#get-link-btn").on('click', function (event) { 95 | event.preventDefault(); 96 | 97 | let modal = $("#modal"); 98 | 99 | let modalContent = ` 100 | 101 | 102 | 108 | 109 | `; 110 | modal.iziModal('setTitle', 'Copy your URL'); 111 | modal.iziModal('setSubtitle', 'Store it somewhere safe'); 112 | $("#modal .modal-content").html(modalContent); 113 | $("#copy-url").unbind("click");//avoid multiclick event stacking 114 | copyUrl(); //we should call this function here, since its a dynamic generated content 115 | 116 | $('#modal').iziModal('open'); 117 | }); 118 | 119 | 120 | /* SHARING LINK AT EMAIL =========================================== */ 121 | 122 | $("#send-email-btn").on('click', function (event) { 123 | event.preventDefault(); 124 | 125 | let modal = $("#modal"); 126 | 127 | let modalContent = ` 128 | 129 | 130 | 131 | 132 | 143 | 144 | 145 | 146 | 147 | `; 148 | modal.iziModal('setTitle', 'E-mail your link'); 149 | modal.iziModal('setSubtitle', 'To yourself or someone else'); 150 | 151 | $("#btn-send-email").unbind("click"); 152 | 153 | $("#modal .modal-content").html(modalContent); 154 | sendEmail(); 155 | $('#modal').iziModal('open'); 156 | }); 157 | 158 | //sending e-mail 159 | 160 | function sendEmail() { 161 | $("#btn-send-email").on("click", function () { 162 | 163 | let email = $("#myEmail").val(); 164 | 165 | if (!validateEmail(email)) { 166 | alert("Error: Invalid e-mail"); 167 | return false; 168 | } 169 | 170 | 171 | alert("Sending e-mail"); 172 | 173 | 174 | }); 175 | 176 | } 177 | 178 | 179 | }); 180 | 181 | -------------------------------------------------------------------------------- /public/assets/js/navbar.js: -------------------------------------------------------------------------------- 1 | // $(function() { 2 | // $(".navbar-menu-icon").on('click',function(){ 3 | // $("#menu-mobile").slideToggle(); 4 | // }) 5 | // }); 6 | 7 | document.addEventListener('DOMContentLoaded', function () { 8 | 9 | 10 | //Navbar slide down effect on vanillaJS 11 | let menuIcon = document.querySelector(".navbar-menu-icon"); 12 | let menu = document.querySelector("#menu-mobile"); 13 | 14 | menuIcon.addEventListener("click", function () { 15 | // console.log("beginning slidedown"); 16 | 17 | menu.classList.toggle("closed"); 18 | 19 | 20 | }); 21 | 22 | 23 | }, false); -------------------------------------------------------------------------------- /public/assets/js/scroll-section.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | 3 | 4 | 5 | 6 | /* ------------------------------------------------------------| 7 | | SCROLL ANIMATIONS 8 | *-------------------------------------------------------------*/ 9 | 10 | function changeActiveClass(element) { 11 | let windowWidth = $(document).width(); 12 | 13 | $(".navbar-menu li").removeClass("navbar-item-active"); //remove all present classes 14 | 15 | if(windowWidth >= 1080) { //change navbar classes on mobile only 16 | 17 | 18 | element.addClass('navbar-item-active');//add class to this item only 19 | } 20 | } 21 | 22 | 23 | /* FEATURES =========================================== */ 24 | $(".menu-features").on('click',function(){ 25 | 26 | $('html, body').animate({ 27 | scrollTop: $("#section-features").offset().top - 50 28 | }, 1000); 29 | 30 | changeActiveClass($(this)); 31 | 32 | }); 33 | 34 | /* OPEN SOURCE SECTION =========================================== */ 35 | $(".menu-open-source").on('click',function(){ 36 | 37 | $('html, body').animate({ 38 | scrollTop: $("#section-open-source").offset().top - 50 39 | }, 1000); 40 | changeActiveClass($(this)); 41 | }); 42 | 43 | /* OPEN SOURCE SECTION =========================================== */ 44 | $(".menu-how-it-works").on('click',function(){ 45 | 46 | $('html, body').animate({ 47 | scrollTop: $("#section-how-it-works").offset().top - 100 48 | }, 1000); 49 | changeActiveClass($(this)); 50 | }); 51 | 52 | /* OPEN SOURCE SECTION =========================================== */ 53 | $(".menu-web-crypto").on('click',function(){ 54 | 55 | $('html, body').animate({ 56 | scrollTop: $("#section-web-crypto").offset().top - 100 57 | }, 1000); 58 | changeActiveClass($(this)); 59 | }); 60 | 61 | 62 | // /* ABOUT US SECTION =========================================== */ 63 | 64 | //menu navigation deactivated for this feature, since it would break navigation (navbar) 65 | // $(".menu-about-us").on('click',function(){ 66 | // 67 | // $('html, body').animate({ 68 | // scrollTop: $("#section-about-us").offset().top - 50 69 | // }, 1000); 70 | // changeActiveClass($(this)); 71 | // }); 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | }); -------------------------------------------------------------------------------- /public/assets/js/upload-form-animations.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', function () { 2 | 3 | let spinningLocker = document.querySelector(".upload-spinning-locker"); 4 | 5 | spinningLocker.addEventListener('mouseenter', function () { 6 | 7 | if (spinningLocker.classList.contains("rotate-center")) { 8 | spinningLocker.classList.remove("rotate-center") 9 | } else { 10 | spinningLocker.classList.add("rotate-center"); 11 | } 12 | 13 | 14 | }); 15 | 16 | 17 | }, false); -------------------------------------------------------------------------------- /public/assets/js/upload-form-handler.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', function () { 2 | 3 | let sectionUpload = document.querySelector(".dir-upload-wrapper"); 4 | let uploadForm = document.querySelector("#upload-form"); 5 | let uploadBtn = document.querySelector("#file"); 6 | 7 | sectionUpload.addEventListener('click', function (e) { 8 | 9 | // console.log("section Upload triggered"); 10 | 11 | // console.log(e.eventPhase); 12 | 13 | 14 | //lets trigger an upload action 15 | // [cvo] disabled this for the moment, it makes everythin' trigger an upload. 16 | // uploadBtn.click(); 17 | 18 | }) 19 | 20 | 21 | 22 | 23 | uploadBtn.addEventListener("click",function(){ 24 | 25 | }); 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | },true); 34 | -------------------------------------------------------------------------------- /public/assets/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /public/assets/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /public/assets/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /public/assets/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /public/assets/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /public/assets/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /public/assets/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /public/assets/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /public/assets/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /public/assets/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /public/assets/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /public/assets/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/assets/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /public/credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | SendCrypt 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
56 | 57 | 98 | 99 | 120 | 121 |
122 | 123 | 124 |
125 | 126 | 127 | 128 |
129 | 130 | 131 | 132 | 183 | 184 | 185 |
186 | 187 | 188 |
189 | 190 | 191 |
192 | 193 | 194 | 195 | 196 | 197 |
198 |
199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 |
229 | 230 | 231 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/favicon.ico -------------------------------------------------------------------------------- /public/js/cipher.js: -------------------------------------------------------------------------------- 1 | const encryptFiles = async ([files, hashKey]) => { 2 | let key = null; 3 | if (!hashKey) { 4 | key = await window.crypto.subtle.generateKey( 5 | { 6 | name: "AES-GCM", 7 | length: 256, 8 | }, 9 | true, 10 | ["encrypt", "decrypt"] 11 | ); 12 | const keydata = await window.crypto.subtle.exportKey( 13 | "jwk", 14 | key 15 | ); 16 | hashKey = keydata.k; 17 | } else { 18 | key = await window.crypto.subtle.importKey( 19 | "jwk", 20 | { 21 | kty: "oct", 22 | k: hashKey, 23 | alg: "A256GCM", 24 | ext: true, 25 | }, 26 | { 27 | name: "AES-GCM", 28 | }, 29 | false, 30 | ["encrypt", "decrypt"] 31 | ); 32 | } 33 | return new Promise((resolve, reject) => { 34 | let encryptedFiles = {}; 35 | for (const file of files) { 36 | const reader = new FileReader(); 37 | reader.onload = async (e) => { 38 | const iv = window.crypto.getRandomValues(new Uint8Array(12)); 39 | const encryptedFile = await window.crypto.subtle.encrypt( 40 | { 41 | name: "AES-GCM", 42 | iv: iv 43 | }, 44 | key, 45 | e.target.result 46 | ); 47 | encryptedFiles[file.name] = new Blob([iv.buffer, encryptedFile], {type:"application/octet-stream"}); 48 | if (Object.keys(encryptedFiles).length === files.length) { 49 | resolve([encryptedFiles, hashKey]); 50 | } 51 | } 52 | reader.readAsArrayBuffer(file); 53 | } 54 | }); 55 | }; 56 | 57 | const decryptFile = async (file) => { 58 | const key = await window.crypto.subtle.importKey( 59 | "jwk", 60 | { 61 | kty: "oct", 62 | k: window.location.hash.slice(1), 63 | alg: "A256GCM", 64 | ext: true, 65 | }, 66 | { 67 | name: "AES-GCM", 68 | }, 69 | false, 70 | ["encrypt", "decrypt"] 71 | ); 72 | 73 | return new Promise((resolve, reject) => { 74 | const reader = new FileReader(); 75 | reader.onload = async (e) => { 76 | const iv = e.target.result.slice(0,12); 77 | const data = e.target.result.slice(12); 78 | const decryptedFileRaw = await window.crypto.subtle.decrypt( 79 | { 80 | name: "AES-GCM", 81 | iv: iv 82 | }, 83 | key, 84 | data 85 | ); 86 | resolve(window.URL.createObjectURL(new Blob([decryptedFileRaw]))); 87 | } 88 | reader.readAsArrayBuffer(file); 89 | }); 90 | }; 91 | -------------------------------------------------------------------------------- /public/js/classes/Display.js: -------------------------------------------------------------------------------- 1 | class Display { 2 | constructor(id) { 3 | Display.instances++; 4 | this.id = Display.instances; 5 | 6 | 7 | } 8 | 9 | static copyLinkClipboard() { 10 | 11 | let folderLink = window.location.href; 12 | navigator.clipboard.writeText(folderLink).then(function () { 13 | 14 | let copiedAlert = new Alert().showMessage("success", "Your link was copied to clipboard. Press CTRL + C to share it"); 15 | 16 | 17 | }, function (err) { 18 | let copiedAlert = new Alert().showMessage("danger", "An error occurred while trying to copy your folder link to clipboard. Try doing it manually."); 19 | 20 | }); 21 | 22 | } 23 | 24 | static disableScrolling() { 25 | let body = document.querySelector("body").classList.add("stop-scrolling"); 26 | } 27 | 28 | static enableScrolling() { 29 | let body = document.querySelector("body").classList.remove("stop-scrolling"); 30 | } 31 | 32 | static removeFromDataStructure(id) { 33 | //removes element from data structure 34 | Display.list = Display.list.filter((element) => { 35 | return element.id != id; 36 | 37 | }); 38 | } 39 | 40 | 41 | static numberOfDisplays() { 42 | return Display.instances; 43 | } 44 | } 45 | 46 | //static variables 47 | Display.instances = 0; 48 | Display.list = []; 49 | 50 | 51 | class Alert extends Display { 52 | constructor(id) { 53 | super(id); // super call parent constructor methods 54 | 55 | setTimeout(() => { //we wrap this into a setTimeout so the close button element has time to be created 56 | this.close();//it will add click events to them 57 | 58 | //auto-close after some seconds 59 | this.destroy(this.id, true, 5000); 60 | 61 | }, 1); 62 | 63 | } 64 | 65 | 66 | /* Closing Event =========================================== */ 67 | close() { 68 | 69 | //Close action 70 | let closeElements = document.querySelectorAll(".box-alert-close-icon"); 71 | for (let closeElement of closeElements) { 72 | closeElement.addEventListener('click', function (e) { 73 | let alert = e.currentTarget.parentElement 74 | alert.remove(); 75 | let alertId = alert.getAttribute("data-alert-id"); 76 | Display.removeFromDataStructure(alertId); 77 | }); 78 | } 79 | } 80 | 81 | 82 | /* Destroying alert =========================================== */ 83 | destroy(id, delayed = false, timeout = null) { 84 | function destroyMe() { 85 | let boxAlerts = document.querySelectorAll(".box-alert"); 86 | 87 | boxAlerts.forEach((alert) => { 88 | if (alert.getAttribute("data-alert-id") == id) { 89 | alert.remove(); 90 | Display.removeFromDataStructure(id); 91 | 92 | } 93 | }); 94 | } 95 | 96 | if (delayed) { 97 | setTimeout(() => { 98 | destroyMe(); 99 | }, timeout) 100 | } else { 101 | destroyMe(); 102 | } 103 | 104 | 105 | } 106 | 107 | 108 | showMessage(type, message) { 109 | 110 | //Font awesome icon references 111 | let typeIcon = { 112 | "warning": "fa-exclamation-triangle", 113 | "success": "fas fa-check-circle", 114 | "danger": "fas fa-exclamation-circle", 115 | "info": "fas fa-info-circle" 116 | }; 117 | 118 | 119 | //create our alert html content 120 | let alert = ` `; 129 | 130 | //add message to alerts list 131 | let alertsList = document.querySelector(".alerts-list"); 132 | alertsList.innerHTML += alert; 133 | 134 | //make it visible 135 | for (let alert of alertsList.children) { 136 | if (alert.getAttribute("data-alert-id") == this.id) { 137 | alert.style.display = "block"; 138 | } 139 | } 140 | 141 | //data structure representation 142 | let alertData = { 143 | id: this.id, 144 | type, 145 | message 146 | }; 147 | 148 | //send it to our display data list. 149 | Display.list.push(alertData); 150 | 151 | 152 | } 153 | } 154 | 155 | 156 | class FileListing extends Display { 157 | 158 | constructor(id) { 159 | super(id); // super call parent constructor methods 160 | 161 | } 162 | 163 | addFileRow(icon, filename, size, type) { 164 | 165 | let fileRow = ` 166 | 167 | file 168 | ${filename} 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | ` 179 | 180 | return fileRow; 181 | 182 | } 183 | 184 | 185 | } 186 | 187 | 188 | class Modal extends Display { 189 | 190 | constructor(id) { 191 | super(id); 192 | 193 | 194 | //Add close on esc key event => close ALL modals 195 | document.addEventListener('keyup', function (e) { 196 | if (e.keyCode == 27) { 197 | let modals = document.querySelectorAll(".modal-listings .modal-wrapper"); 198 | 199 | modals.forEach((modal) => { 200 | let modalId = modal.getAttribute("data-modal-id"); 201 | 202 | Modal.close(modalId); 203 | }); 204 | 205 | 206 | this.close(this.id); 207 | } 208 | }); 209 | 210 | 211 | //auto-add click event to close icon 212 | 213 | setTimeout(() => { 214 | 215 | 216 | let closeIcons = document.querySelectorAll(".modal-close-icon"); 217 | 218 | 219 | closeIcons.forEach((icon) => { 220 | 221 | icon.addEventListener('click', function (e) { 222 | 223 | let modalId = e.currentTarget.parentElement.parentElement.parentElement.getAttribute("data-modal-id"); 224 | 225 | Modal.close(modalId); 226 | 227 | }); 228 | 229 | }); 230 | 231 | 232 | let shadow = document.querySelector(".shadow-background "); 233 | 234 | shadow.addEventListener("click", function (e) { 235 | 236 | 237 | //remove modal 238 | this.nextElementSibling.remove(); 239 | 240 | //self destroy 241 | this.remove(); 242 | 243 | Display.enableScrolling(); 244 | 245 | 246 | }) 247 | 248 | 249 | }, 1); 250 | 251 | 252 | } 253 | 254 | 255 | open(title, subtitle, content, faIcon) { 256 | 257 | //prevent body from scrolling 258 | Display.disableScrolling(); 259 | 260 | 261 | //prepare modal boilerplane 262 | 263 | let modal = ` 264 | 265 |