├── .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 |
--------------------------------------------------------------------------------
/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 |
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 |
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 |
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 |
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 |
19 |
--------------------------------------------------------------------------------
/public/assets/gfx/landing/chrome-square.svg:
--------------------------------------------------------------------------------
1 |
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 |
71 |
--------------------------------------------------------------------------------
/public/assets/gfx/landing/firefox-square.svg:
--------------------------------------------------------------------------------
1 |
38 |
--------------------------------------------------------------------------------
/public/assets/gfx/landing/safari-square.svg:
--------------------------------------------------------------------------------
1 |
34 |
--------------------------------------------------------------------------------
/public/assets/gfx/logo.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
37 |
--------------------------------------------------------------------------------
/public/assets/gfx/upload-form/icons/analytics.svg:
--------------------------------------------------------------------------------
1 |
16 |
--------------------------------------------------------------------------------
/public/assets/gfx/upload-form/icons/folder.svg:
--------------------------------------------------------------------------------
1 |
16 |
--------------------------------------------------------------------------------
/public/assets/gfx/upload-form/icons/links.svg:
--------------------------------------------------------------------------------
1 |
19 |
--------------------------------------------------------------------------------
/public/assets/gfx/upload-form/icons/list.svg:
--------------------------------------------------------------------------------
1 |
23 |
--------------------------------------------------------------------------------
/public/assets/gfx/upload-form/icons/trash.svg:
--------------------------------------------------------------------------------
1 |
21 |
--------------------------------------------------------------------------------
/public/assets/gfx/upload-form/icons/upload.svg:
--------------------------------------------------------------------------------
1 |
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 |
12 |
--------------------------------------------------------------------------------
/public/assets/gfx/upload-form/spinning-locker.svg:
--------------------------------------------------------------------------------
1 |
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 | [](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 | 
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 | The secret link to this folder is...
102 | https://www.sendcrypt.com/url/sh39aydyaa232sSGSdhas
103 |
104 |
105 |
106 |
107 |
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 | Type a e-mail below and we'll send a copy of your folder's link.
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 |
133 |
134 | Credits
135 |
136 |
137 |
138 |
139 |
177 |
178 |
179 |
180 |
181 |
182 |
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 = `
121 |
122 | ${message}
123 |
124 |
125 |
126 |
127 |
128 |
`;
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 |
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 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 | ${title}
275 |
276 |
277 | ${subtitle}
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 | ${title}
289 |
290 |
291 |
292 |
293 |
294 | ${content}
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
`;
307 |
308 |
309 | //inject modal into html content
310 |
311 | let modalListings = document.querySelector(".modal-listings");
312 |
313 | modalListings.innerHTML = modal;
314 |
315 | //then display it
316 | document.querySelector(".shadow-background").style.display = "block";
317 | document.querySelector(".modal-wrapper").style.display = "block";
318 |
319 | //create data representation
320 | let newModal = {
321 | id: this.id,
322 | title,
323 | subtitle,
324 | content,
325 | faIcon
326 | };
327 |
328 | //send it to our display data list.
329 | Display.list.push(newModal);
330 |
331 | };
332 |
333 | static close(id) {
334 |
335 | let modals = document.querySelectorAll(".modal-listings .modal-wrapper");
336 | let shadows = document.querySelectorAll(".shadow-background");
337 |
338 |
339 | modals.forEach((modal) => {
340 | let modalId = modal.getAttribute("data-modal-id");
341 | if (modalId == id) {
342 | modal.remove();
343 | Display.removeFromDataStructure(modalId)
344 | }
345 | });
346 |
347 | //remove background shadow
348 | shadows.forEach((shadow) => {
349 | shadow.remove();
350 | });
351 |
352 |
353 | //enable scrolling again on body
354 | Display.enableScrolling();
355 |
356 |
357 | }
358 |
359 |
360 | }
361 |
362 |
--------------------------------------------------------------------------------
/public/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/countable-web/cryptsend/5b4813c965e7cd972be255612fff7c5e69421b85/public/mstile-150x150.png
--------------------------------------------------------------------------------
/public/upload.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 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
Upload
76 |
77 |
78 |
79 |
80 |
81 |

82 |
83 |
84 | Click or drop your files here to upload.
85 | You’ll be given an unique and secure link. Don’t lose it!
86 |
87 |
88 |
89 |
90 |
91 |
My Files
92 |
93 |
94 |
95 |
96 |
97 |
98 |
102 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 | Name |
115 | Size |
116 | Type |
117 | Date |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 | Projects
126 | |
127 | 11mb |
128 | Folder |
129 | 2018-04-10 18:30 |
130 |
131 |
132 |
133 |
134 |
135 | Clients
136 | |
137 | 2mb |
138 | Folder |
139 | 2018-04-10 18:30 |
140 |
141 |
142 |
143 |
144 |
145 | Server.sql
146 | |
147 | 1mb |
148 | File |
149 | 2018-04-10 18:30 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
--------------------------------------------------------------------------------
/send.js:
--------------------------------------------------------------------------------
1 | const request = require('request')
2 | const minimist = require('minimist')
3 | const fs = require('fs');
4 | const path = require('path');
5 |
6 | const argv = minimist(process.argv.slice(2));
7 | const url = argv._[1] || process.env.SERVER || 'http://localhost:1234';
8 |
9 | var req = request.post(url, function(err, resp, body) {
10 | if (err) {
11 | console.log('Error!' + err + resp + body);
12 | } else {
13 | console.log('success' + body);
14 | }
15 | });
16 | var form = req.form();
17 | // form.append('f', fs.createReadStream(__dirname + '/' + argv._[0]), {
18 | form.append('f', fs.createReadStream(__dirname + path.sep + argv._[0]), {
19 | filename: argv._[0]
20 | });
21 |
--------------------------------------------------------------------------------
/test/api.js:
--------------------------------------------------------------------------------
1 |
2 | require('../index.js');
3 | const request = require('superagent');
4 | const assert = require('assert');
5 |
6 | describe('API', function() {
7 | it('works', function(done){
8 | assert.equal(true,true);
9 | request
10 | .get('localhost:1234/')
11 | .then(function(res) {
12 | assert.equal(res.status, 200);
13 | done();
14 | })
15 | .catch(function(err) {
16 | throw(err);
17 | });
18 | });
19 | });
20 |
21 |
--------------------------------------------------------------------------------