Browse Source

commit project thus far

mm-logging
lza_menace 7 months ago
parent
commit
9c0638da7a
110 changed files with 50119 additions and 2 deletions
  1. +3
    -0
      .gitignore
  2. +2
    -2
      README.md
  3. +7
    -0
      bin/dev
  4. +5
    -0
      bin/setup
  5. +44
    -0
      bin/setup.sh
  6. +7
    -0
      bin/shell
  7. +14
    -0
      docker-compose.yaml
  8. +5
    -0
      requirements.txt
  9. +0
    -0
      wowstash/__init__.py
  10. +2
    -0
      wowstash/blueprints/__init__.py
  11. +5
    -0
      wowstash/blueprints/account/__init__.py
  12. +29
    -0
      wowstash/blueprints/account/routes.py
  13. +5
    -0
      wowstash/blueprints/authentication/__init__.py
  14. +44
    -0
      wowstash/blueprints/authentication/routes.py
  15. +40
    -0
      wowstash/config.example.py
  16. +0
    -0
      wowstash/library/__init__.py
  17. +48
    -0
      wowstash/library/info.py
  18. +47
    -0
      wowstash/library/jsonrpc.py
  19. +117
    -0
      wowstash/library/wownero.py
  20. +51
    -0
      wowstash/run.py
  21. BIN
      wowstash/static/.DS_Store
  22. BIN
      wowstash/static/css/Catamaran-Black.ttf
  23. BIN
      wowstash/static/css/Catamaran-Bold.ttf
  24. BIN
      wowstash/static/css/Catamaran-ExtraBold.ttf
  25. BIN
      wowstash/static/css/Catamaran-ExtraLight.ttf
  26. BIN
      wowstash/static/css/Catamaran-Light.ttf
  27. BIN
      wowstash/static/css/Catamaran-Medium.ttf
  28. BIN
      wowstash/static/css/Catamaran-Regular.ttf
  29. BIN
      wowstash/static/css/Catamaran-SemiBold.ttf
  30. BIN
      wowstash/static/css/Catamaran-Thin.ttf
  31. BIN
      wowstash/static/css/Lato-Regular.ttf
  32. BIN
      wowstash/static/css/Muli-Regular.ttf
  33. +495
    -0
      wowstash/static/css/new-age.css
  34. BIN
      wowstash/static/favicon.ico
  35. BIN
      wowstash/static/img/.DS_Store
  36. BIN
      wowstash/static/img/bg-pattern.png
  37. BIN
      wowstash/static/img/wow-treasure-chest.png
  38. +42
    -0
      wowstash/static/js/new-age.js
  39. +1567
    -0
      wowstash/static/vendor/bootstrap/css/bootstrap-grid.css
  40. +7
    -0
      wowstash/static/vendor/bootstrap/css/bootstrap-grid.min.css
  41. +342
    -0
      wowstash/static/vendor/bootstrap/css/bootstrap-reboot.css
  42. +8
    -0
      wowstash/static/vendor/bootstrap/css/bootstrap-reboot.min.css
  43. +8975
    -0
      wowstash/static/vendor/bootstrap/css/bootstrap.css
  44. +1
    -0
      wowstash/static/vendor/bootstrap/css/bootstrap.css.map
  45. +7
    -0
      wowstash/static/vendor/bootstrap/css/bootstrap.min.css
  46. +1
    -0
      wowstash/static/vendor/bootstrap/css/bootstrap.min.css.map
  47. +6328
    -0
      wowstash/static/vendor/bootstrap/js/bootstrap.bundle.js
  48. +1
    -0
      wowstash/static/vendor/bootstrap/js/bootstrap.bundle.js.map
  49. +7
    -0
      wowstash/static/vendor/bootstrap/js/bootstrap.bundle.min.js
  50. +1
    -0
      wowstash/static/vendor/bootstrap/js/bootstrap.bundle.min.js.map
  51. +3894
    -0
      wowstash/static/vendor/bootstrap/js/bootstrap.js
  52. +1
    -0
      wowstash/static/vendor/bootstrap/js/bootstrap.js.map
  53. +7
    -0
      wowstash/static/vendor/bootstrap/js/bootstrap.min.js
  54. +1
    -0
      wowstash/static/vendor/bootstrap/js/bootstrap.min.js.map
  55. +2337
    -0
      wowstash/static/vendor/font-awesome/css/font-awesome.css
  56. +7
    -0
      wowstash/static/vendor/font-awesome/css/font-awesome.css.map
  57. +4
    -0
      wowstash/static/vendor/font-awesome/css/font-awesome.min.css
  58. BIN
      wowstash/static/vendor/font-awesome/fonts/FontAwesome.otf
  59. BIN
      wowstash/static/vendor/font-awesome/fonts/fontawesome-webfont.eot
  60. +2671
    -0
      wowstash/static/vendor/font-awesome/fonts/fontawesome-webfont.svg
  61. BIN
      wowstash/static/vendor/font-awesome/fonts/fontawesome-webfont.ttf
  62. BIN
      wowstash/static/vendor/font-awesome/fonts/fontawesome-webfont.woff
  63. BIN
      wowstash/static/vendor/font-awesome/fonts/fontawesome-webfont.woff2
  64. +34
    -0
      wowstash/static/vendor/font-awesome/less/animated.less
  65. +25
    -0
      wowstash/static/vendor/font-awesome/less/bordered-pulled.less
  66. +12
    -0
      wowstash/static/vendor/font-awesome/less/core.less
  67. +6
    -0
      wowstash/static/vendor/font-awesome/less/fixed-width.less
  68. +18
    -0
      wowstash/static/vendor/font-awesome/less/font-awesome.less
  69. +789
    -0
      wowstash/static/vendor/font-awesome/less/icons.less
  70. +13
    -0
      wowstash/static/vendor/font-awesome/less/larger.less
  71. +19
    -0
      wowstash/static/vendor/font-awesome/less/list.less
  72. +60
    -0
      wowstash/static/vendor/font-awesome/less/mixins.less
  73. +15
    -0
      wowstash/static/vendor/font-awesome/less/path.less
  74. +20
    -0
      wowstash/static/vendor/font-awesome/less/rotated-flipped.less
  75. +5
    -0
      wowstash/static/vendor/font-awesome/less/screen-reader.less
  76. +20
    -0
      wowstash/static/vendor/font-awesome/less/stacked.less
  77. +800
    -0
      wowstash/static/vendor/font-awesome/less/variables.less
  78. +34
    -0
      wowstash/static/vendor/font-awesome/scss/_animated.scss
  79. +25
    -0
      wowstash/static/vendor/font-awesome/scss/_bordered-pulled.scss
  80. +12
    -0
      wowstash/static/vendor/font-awesome/scss/_core.scss
  81. +6
    -0
      wowstash/static/vendor/font-awesome/scss/_fixed-width.scss
  82. +789
    -0
      wowstash/static/vendor/font-awesome/scss/_icons.scss
  83. +13
    -0
      wowstash/static/vendor/font-awesome/scss/_larger.scss
  84. +19
    -0
      wowstash/static/vendor/font-awesome/scss/_list.scss
  85. +60
    -0
      wowstash/static/vendor/font-awesome/scss/_mixins.scss
  86. +15
    -0
      wowstash/static/vendor/font-awesome/scss/_path.scss
  87. +20
    -0
      wowstash/static/vendor/font-awesome/scss/_rotated-flipped.scss
  88. +5
    -0
      wowstash/static/vendor/font-awesome/scss/_screen-reader.scss
  89. +20
    -0
      wowstash/static/vendor/font-awesome/scss/_stacked.scss
  90. +800
    -0
      wowstash/static/vendor/font-awesome/scss/_variables.scss
  91. +18
    -0
      wowstash/static/vendor/font-awesome/scss/font-awesome.scss
  92. +59
    -0
      wowstash/static/vendor/jquery-easing/jquery.easing.compatibility.js
  93. +166
    -0
      wowstash/static/vendor/jquery-easing/jquery.easing.js
  94. +1
    -0
      wowstash/static/vendor/jquery-easing/jquery.easing.min.js
  95. +10364
    -0
      wowstash/static/vendor/jquery/jquery.js
  96. +2
    -0
      wowstash/static/vendor/jquery/jquery.min.js
  97. +1
    -0
      wowstash/static/vendor/jquery/jquery.min.map
  98. +8269
    -0
      wowstash/static/vendor/jquery/jquery.slim.js
  99. +2
    -0
      wowstash/static/vendor/jquery/jquery.slim.min.js
  100. +1
    -0
      wowstash/static/vendor/jquery/jquery.slim.min.map

+ 3
- 0
.gitignore View File

@ -129,3 +129,6 @@ dmypy.json
# Pyre type checker
.pyre/
config.py
data
.DS_Store

+ 2
- 2
README.md View File

@ -1,3 +1,3 @@
# wownero-web-wallet
# wowstash
A shitty web wallet for noobs who can't use a CLI.
A web wallet for noobs who can't use a CLI.

+ 7
- 0
bin/dev View File

@ -0,0 +1,7 @@
#!/bin/bash
source .venv/bin/activate
export FLASK_APP=wowstash/run.py
export FLASK_SECRETS=config.py
export FLASK_DEBUG=1
flask run

+ 5
- 0
bin/setup View File

@ -0,0 +1,5 @@
#!/bin/bash
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt

+ 44
- 0
bin/setup.sh View File

@ -0,0 +1,44 @@
echo -e "[+] Creating directories"
mkdir -p data/secrets data/wallets
if [[ ! -f "data/secrets/pass" ]];
then
echo -e "[+] Creating new wallet secret"
openssl rand -base64 32 > data/secrets/pass
fi
# echo -e "[+] Running wallet CLI"
# docker run --rm -it --name monero-wallet \
# -v ~/git/lzahq/wownero-web-wallet/data:/data \
# -p 8080:8080 \
# --entrypoint "monero-wallet-cli" wownero-web-wallet \
# --daemon-address crypto.int.lzahq.tech:38081 \
# --stagenet \
# --generate-new-wallet /data/wallets/lza-stage \
# --use-english-language-names \
# --password-file /data/secrets/pass \
# --mnemonic-language english \
# --restore-height 461618
# echo -e "[+] Running wallet RPC"
# docker run --rm -it --name monero-wallet \
# -v ~/git/lzahq/wownero-web-wallet/data:/data \
# -p 8080:8080 \
# --entrypoint "monero-wallet-rpc" wownero-web-wallet \
# --daemon-address crypto.int.lzahq.tech:38081 \
# --stagenet \
# --non-interactive \
# --generate-from-json /data/wallet.json \
# --disable-rpc-login \
# --rpc-bind-port 8080
# docker run --rm -it --name monero-wallet \
# -v ~/git/lzahq/wownero-web-wallet/data:/data \
# -p 8080:8080 \
# --entrypoint "monero-wallet-rpc" wownero-web-wallet \
# --daemon-address crypto.int.lzahq.tech:38081 \
# --stagenet \
# --non-interactive \
# --wallet-file /data/wallets/lza-stage \
# --password-file /data/secrets/pass \
# --rpc-bind-port 8080

+ 7
- 0
bin/shell View File

@ -0,0 +1,7 @@
#!/bin/bash
source .venv/bin/activate
export FLASK_APP=wowstash/run.py
export FLASK_SECRETS=config.py
export FLASK_DEBUG=1
flask eviscerate

+ 14
- 0
docker-compose.yaml View File

@ -0,0 +1,14 @@
version: '3'
services:
db:
image: postgres:9.6.15-alpine
ports:
- 5432:5432
environment:
POSTGRES_PASSWORD: ${DB_PASS}
POSTGRES_USER: ${DB_USER}
POSTGRES_DB: ${DB_NAME}
redis:
image: redis:latest
ports:
- 6379:6379

+ 5
- 0
requirements.txt View File

@ -0,0 +1,5 @@
Flask
psycopg2-binary
redis
flask_session
requests

+ 0
- 0
wowstash/__init__.py View File


+ 2
- 0
wowstash/blueprints/__init__.py View File

@ -0,0 +1,2 @@
from .account import account_bp
from .authentication import authentication_bp

+ 5
- 0
wowstash/blueprints/account/__init__.py View File

@ -0,0 +1,5 @@
from flask import Blueprint
account_bp = Blueprint("account", __name__)
from . import routes

+ 29
- 0
wowstash/blueprints/account/routes.py View File

@ -0,0 +1,29 @@
from flask import request, render_template, session
from flask import redirect, url_for, current_app
from wallet.blueprints.account import account_bp
from wallet.library.daemon import daemon
from wallet.library.wallet import wallet
@account_bp.route("/account")
def overview():
if session.get("public_address"):
return render_template("account.html",
session_data=session,
h=daemon.get_height(),
wallet=wallet)
else:
return redirect(url_for("index"))
@account_bp.route("/account/wallet")
def connect_wallet():
if session.get("public_address"):
wallet.init(host=current_app.config['DAEMON_HOST'],
port=current_app.config['DAEMON_PORT'],
public_view_key=session['public_view_key'],
wallet_password=session['wallet_password'],
mnemonic_seed=session['seed'],
restore_height=daemon.get_height(),
path=current_app.config['BINARY_PATH'])
return redirect(url_for("account.overview"))
else:
return redirect(url_for("index"))

+ 5
- 0
wowstash/blueprints/authentication/__init__.py View File

@ -0,0 +1,5 @@
from flask import Blueprint
authentication_bp = Blueprint("authentication", __name__)
from . import routes

+ 44
- 0
wowstash/blueprints/authentication/routes.py View File

@ -0,0 +1,44 @@
from flask import request, render_template, session, redirect, url_for
from wallet.blueprints.authentication import authentication_bp
from wallet.library.daemon import daemon
from wallet.library.wallet import wallet
from monero.seed import Seed
from binascii import hexlify
from datetime import datetime
from os import urandom
@authentication_bp.route("/login", methods=["GET", "POST"])
def login():
error = None
if request.method == "POST":
if request.form.get('seed'):
try:
seed = Seed(str(request.form['seed']))
session['seed'] = seed.phrase
session['start_time'] = datetime.utcnow()
session['public_address'] = seed.public_address()
session['private_spend_key'] = seed.secret_spend_key()
session['public_spend_key'] = seed.public_spend_key()
session['private_view_key'] = seed.secret_view_key()
session['public_view_key'] = seed.public_view_key()
session['wallet_password'] = hexlify(urandom(64))
if request.form.get('persistence'):
session['wallet_persistence'] = "Enabled"
else:
session['wallet_persistence'] = "Disabled"
return redirect(url_for('account.overview'))
except AssertionError:
error = "Invalid seed checksum"
except Exception as e:
error = "Invalid seed {0}".format(e)
else:
error = "Must provide a seed"
return render_template("login.html", error=error)
@authentication_bp.route("/logout")
def logout():
session.clear()
return redirect(url_for('index'))

+ 40
- 0
wowstash/config.example.py View File

@ -0,0 +1,40 @@
# Site meta
SITE_NAME = 'WOW Stash'
# Daemon
DAEMON_PROTO = 'http'
DAEMON_HOST = 'node.suchwow.xyz'
DAEMON_PORT = 34568
DAEMON_USER = ''
DAEMON_PASS = ''
# Wallet
WALLET_PROTO = 'http'
WALLET_HOST = 'localhost'
WALLET_PORT = 8888
WALLET_USER = 'yyyyy'
WALLET_PASS = 'xxxxx'
# Security
PASSWORD_SALT = 'salt here' # database salts
SECRET_KEY = 'secret session key here' # encrypts the session token
# Session
PERMANENT_SESSION_LIFETIME = 1800 # 30 minute session expiry
SESSION_TYPE = 'redis'
SESSION_COOKIE_NAME = 'wowstash'
SESSION_COOKIE_SECURE = False
SESSION_USE_SIGNER = True
SESSION_PERMANENT = True
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
# Development
TEMPLATES_AUTO_RELOAD = True
# Social
SOCIAL = {
'envelope': 'mailto:admin@domain.co',
'twitter': 'https://twitter.com/your_twitter_handle',
'comment-dots': 'https://webchat.freenode.net/?room=#wownero'
}

+ 0
- 0
wowstash/library/__init__.py View File


+ 48
- 0
wowstash/library/info.py View File

@ -0,0 +1,48 @@
from json import loads as json_loads
from json import dumps as json_dumps
from requests import get as r_get
from datetime import timedelta
from redis import Redis
from wowstash import config
class CoinInfo(object):
def __init__(self):
self.redis = Redis(host=config.REDIS_HOST, port=config.REDIS_PORT)
def store_info(self, info):
self.redis.setex(
"info",
timedelta(minutes=15),
value=info
)
def get_info(self):
info = self.redis.get("info")
if info:
return json_loads(info)
else:
data = {
'localization': False,
'tickers': False,
'market_data': True,
'community_data': False,
'developer_data': False,
'sparkline': False
}
headers = {'accept': 'application/json'}
url = 'https://api.coingecko.com/api/v3/coins/wownero'
r = r_get(url, headers=headers, data=data)
info = {
'genesis_date': r.json()['genesis_date'],
'market_cap_rank': r.json()['market_cap_rank'],
'current_price': r.json()['market_data']['current_price']['usd'],
'market_cap': r.json()['market_data']['market_cap']['usd'],
'market_cap_rank': r.json()['market_data']['market_cap_rank'],
'total_volume': r.json()['market_data']['total_volume']['usd'],
'last_updated': r.json()['last_updated']
}
self.store_info(json_dumps(info))
return info
info = CoinInfo()

+ 47
- 0
wowstash/library/jsonrpc.py View File

@ -0,0 +1,47 @@
import json
import requests
from wowstash import config
class JSONRPC(object):
def __init__(self, proto, host, port, username='', password=''):
self.endpoint = '{}://{}:{}/'.format(
proto, host, port
)
self.auth = requests.auth.HTTPDigestAuth(
username, password
)
def make_rpc(self, method, params={}, json_rpc=True):
if json_rpc:
endpoint = self.endpoint + "json_rpc"
else:
endpoint = self.endpoint + method
try:
r = requests.get(
endpoint,
data=json.dumps({'method': method, 'params': params}),
auth=self.auth
)
if 'result' in r.json():
return r.json()['result']
elif 'error' in r.json():
return r.json()['error']
else:
return r.json()
except:
return {}
class Wallet(JSONRPC):
def height(self):
return self.make_rpc('get_height', {})
class Daemon(JSONRPC):
def info(self):
return self.make_rpc('get_info', {}, json_rpc=False)
def height(self):
return self.make_rpc('get_height', {}, json_rpc=False)
daemon = Daemon(proto=config.DAEMON_PROTO, host=config.DAEMON_HOST, port=config.DAEMON_PORT)

+ 117
- 0
wowstash/library/wownero.py View File

@ -0,0 +1,117 @@
import requests
import six
import json
import operator
from tipbot import config
from decimal import Decimal
PICOWOW = Decimal('0.00000000001')
class Wallet(object):
def __init__(self):
self.host = config.WALLET_HOST
self.port = config.WALLET_PORT
self.proto = config.WALLET_PROTO
self.username = config.WALLET_USER
self.password = config.WALLET_PASS
self.endpoint = '{}://{}:{}/json_rpc'.format(
self.proto, self.host, self.port
)
self.auth = requests.auth.HTTPDigestAuth(
self.username, self.password
)
try:
r = self.height()
height = r['height']
self.connected = True
except:
self.connected = False
def make_wallet_rpc(self, method, params={}):
r = requests.get(
self.endpoint,
data=json.dumps({'method': method, 'params': params}),
auth=self.auth
)
# print(r.status_code)
if 'error' in r.json():
return r.json()['error']
else:
return r.json()['result']
def height(self):
return self.make_wallet_rpc('get_height', {})
def spend_key(self):
return self.make_wallet_rpc('query_key', {'key_type': 'spend_key'})['key']
def view_key(self):
return self.make_wallet_rpc('query_key', {'key_type': 'view_key'})['key']
def seed(self):
return self.make_wallet_rpc('query_key', {'key_type': 'mnemonic'})['key']
def accounts(self):
accounts = []
_accounts = self.make_wallet_rpc('get_accounts')
idx = 0
self.master_address = _accounts['subaddress_accounts'][0]['base_address']
for _acc in _accounts['subaddress_accounts']:
assert idx == _acc['account_index']
accounts.append(_acc['account_index'])
idx += 1
return accounts
def new_account(self, label=None):
_account = self.make_wallet_rpc('create_account', {'label': label})
return _account['account_index']
def addresses(self, account, addr_indices=None):
qdata = {'account_index': account}
if addr_indices:
qdata['address_index'] = addr_indices
_addresses = self.make_wallet_rpc('get_address', qdata)
addresses = [None] * (max(map(operator.itemgetter('address_index'), _addresses['addresses'])) + 1)
for _addr in _addresses['addresses']:
addresses[_addr['address_index']] = _addr['address']
return addresses
def new_address(self, account, label=None):
data = {'account_index': account, 'label': label}
_address = self.make_wallet_rpc('create_address', data)
return (_address['address_index'], _address['address'])
def balances(self, account):
data = {'account_index': account}
_balance = self.make_wallet_rpc('get_balance', data)
return (from_atomic(_balance['balance']), from_atomic(_balance['unlocked_balance']))
def transfer(self, dest_address, amount, priority, account):
data = {
'account_index': account,
'destinations': [{'address': dest_address, 'amount': to_atomic(amount)}],
'priority': priority,
'unlock_time': 0,
'get_tx_key': True,
'get_tx_hex': True,
'new_algorithm': True,
'do_not_relay': False,
'ring_size': 22
}
transfer = self.make_wallet_rpc('transfer', data)
return transfer
def to_atomic(amount):
if not isinstance(amount, (Decimal, float) + six.integer_types):
raise ValueError("Amount '{}' doesn't have numeric type. Only Decimal, int, long and "
"float (not recommended) are accepted as amounts.")
return int(amount * 10**11)
def from_atomic(amount):
return (Decimal(amount) * PICOWOW).quantize(PICOWOW)
def as_wownero(amount):
return Decimal(amount).quantize(PICOWOW)

+ 51
- 0
wowstash/run.py View File

@ -0,0 +1,51 @@
from flask import Flask, jsonify, request, make_response, render_template, session, redirect, url_for, escape
from flask_session import Session
from datetime import timedelta, datetime
from redis import Redis
from wowstash.library.jsonrpc import daemon
from wowstash.library.info import info
from wowstash import config
# from wowstash.blueprints.account import account_bp
# from wowstash.blueprints.authentication import authentication_bp
# Setup app
app = Flask(__name__)
app.config.from_envvar('FLASK_SECRETS')
app.secret_key = app.config['SECRET_KEY']
# Setup sessions
app.config['SESSION_REDIS'] = Redis(
host=app.config['REDIS_HOST'],
port=app.config['REDIS_PORT']
)
sess = Session()
sess.init_app(app)
# app.register_blueprint(account_bp)
# app.register_blueprint(authentication_bp)
@app.route('/')
def index():
return render_template('home.html', node=daemon.info(), info=info.get_info())
@app.route('/health')
def health():
print(dir(info.redis))
return make_response(jsonify({
'cache': info.redis.ping(),
'db': False
}), 200)
@app.errorhandler(404)
def not_found(error):
return make_response(jsonify({
'error': 'Page not found'
}), 404)
@app.cli.command('eviscerate')
def eviscerate():
print('Eviscerate the proletariat')
if __name__ == '__main__':
app.run()

BIN
wowstash/static/.DS_Store View File


BIN
wowstash/static/css/Catamaran-Black.ttf View File


BIN
wowstash/static/css/Catamaran-Bold.ttf View File


BIN
wowstash/static/css/Catamaran-ExtraBold.ttf View File


BIN
wowstash/static/css/Catamaran-ExtraLight.ttf View File


BIN
wowstash/static/css/Catamaran-Light.ttf View File


BIN
wowstash/static/css/Catamaran-Medium.ttf View File


BIN
wowstash/static/css/Catamaran-Regular.ttf View File


BIN
wowstash/static/css/Catamaran-SemiBold.ttf View File


BIN
wowstash/static/css/Catamaran-Thin.ttf View File


BIN
wowstash/static/css/Lato-Regular.ttf View File


BIN
wowstash/static/css/Muli-Regular.ttf View File


+ 495
- 0
wowstash/static/css/new-age.css View File

@ -0,0 +1,495 @@
@font-face { font-family: Catamaran; font-weight: 200; src: url('Catamaran-ExtraLight.ttf'); }
@font-face { font-family: Catamaran; font-weight: 300; src: url('Catamaran-Light.ttf'); }
@font-face { font-family: Catamaran; font-weight: 400; src: url('Catamaran-Regular.ttf'); }
@font-face { font-family: Catamaran; font-weight: 500; src: url('Catamaran-Medium.ttf'); }
@font-face { font-family: Catamaran; font-weight: 600; src: url('Catamaran-SemiBold.ttf'); }
@font-face { font-family: Catamaran; font-weight: 700; src: url('Catamaran-Bold.ttf'); }
@font-face { font-family: Catamaran; font-weight: 800; src: url('Catamaran-ExtraBold.ttf'); }
@font-face { font-family: Catamaran; font-weight: 900; src: url('Catamaran-Black.ttf'); }
@font-face { font-family: Lato; font-weight: 400; src: url('Lato-Regular.ttf'); }
@font-face { font-family: Muli; font-weight: 400; src: url('Muli-Regular.ttf'); }
html,
body {
width: 100%;
height: 100%;
}
body {
font-family: 'Muli', 'Helvetica', 'Arial', 'sans-serif';
}
a {
color: #fdcc52;
-webkit-transition: all .35s;
-moz-transition: all .35s;
transition: all .35s;
}
a:hover, a:focus {
color: #fcbd20;
}
hr {
max-width: 100px;
margin: 25px auto 0;
border-width: 1px;
border-color: rgba(34, 34, 34, 0.1);
}
hr.light {
border-color: white;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Catamaran', 'Helvetica', 'Arial', 'sans-serif';
font-weight: 200;
letter-spacing: 1px;
}
p {
font-size: 18px;
line-height: 1.5;
margin-bottom: 20px;
}
section {
padding: 100px 0;
}
section h2 {
font-size: 50px;
}
#mainNav {
border-color: rgba(34, 34, 34, 0.05);
background-color: white;
-webkit-transition: all .35s;
-moz-transition: all .35s;
transition: all .35s;
font-family: 'Catamaran', 'Helvetica', 'Arial', 'sans-serif';
font-weight: 200;
letter-spacing: 1px;
}
#mainNav .navbar-brand {
color: white;
font-family: 'Catamaran', 'Helvetica', 'Arial', 'sans-serif';
font-weight: 200;
letter-spacing: 1px;
}
#mainNav .navbar-brand:hover, #mainNav .navbar-brand:focus {
color: #fcbd20;
}
#mainNav .navbar-toggler {
font-size: 12px;
padding: 8px 10px;
color: #222222;
}
#mainNav .navbar-nav > li > a {
font-size: 11px;
font-family: 'Lato', 'Helvetica', 'Arial', 'sans-serif';
letter-spacing: 2px;
text-transform: uppercase;
}
#mainNav .navbar-nav > li > a.active {
color: rgb(255, 102, 0) !important;
background-color: transparent;
}
#mainNav .navbar-nav > li > a.active:hover {
background-color: transparent;
}
#mainNav .navbar-nav > li > a,
#mainNav .navbar-nav > li > a:focus {
color: #222222;
}
#mainNav .navbar-nav > li > a:hover,
#mainNav .navbar-nav > li > a:focus:hover {
color: #fdcc52;
}
@media (min-width: 992px) {
#mainNav {
border-color: transparent;
background-color: transparent;
}
#mainNav .navbar-brand {
color: fade(white, 70%);
}
#mainNav .navbar-brand:hover, #mainNav .navbar-brand:focus {
color: white;
}
#mainNav .navbar-nav > li > a,
#mainNav .navbar-nav > li > a:focus {
color: rgba(255, 255, 255, 0.7);
}
#mainNav .navbar-nav > li > a:hover,
#mainNav .navbar-nav > li > a:focus:hover {
color: white;
}
#mainNav.navbar-shrink {
border-color: rgba(34, 34, 34, 0.1);
background-color: white;
}
#mainNav.navbar-shrink .navbar-brand {
color: #222222;
}
#mainNav.navbar-shrink .navbar-brand:hover, #mainNav.navbar-shrink .navbar-brand:focus {
color: rgb(76, 76, 76);
}
#mainNav.navbar-shrink .navbar-nav > li > a,
#mainNav.navbar-shrink .navbar-nav > li > a:focus {
color: #222222;
}
#mainNav.navbar-shrink .navbar-nav > li > a:hover,
#mainNav.navbar-shrink .navbar-nav > li > a:focus:hover {
color: rgb(255, 102, 0);
}
}
header.masthead {
position: relative;
width: 100%;
padding-top: 150px;
padding-bottom: 100px;
color: white;
background: url("../img/bg-pattern.png"), rgb(76, 76, 76);
background: url("../img/bg-pattern.png"), -webkit-linear-gradient(to right, rgb(235, 74, 206), rgb(76, 76, 76));
background: url("../img/bg-pattern.png"), linear-gradient(to right, rgb(235, 74, 206), rgb(76, 76, 76));
}
/* pink - 255, 42,212 */
/* gold - 255,204,0 */
header.masthead .header-content {
max-width: 500px;
margin-bottom: 100px;
text-align: center;
}
header.masthead .header-content h1 {
font-size: 30px;
}
header.masthead .device-container {
max-width: 325px;
margin-right: auto;
margin-left: auto;
}
header.masthead .device-container .screen img {
border-radius: 3px;
}
@media (min-width: 992px) {
header.masthead {
height: 100vh;
min-height: 775px;
padding-top: 0;
padding-bottom: 0;
}
header.masthead .header-content {
margin-bottom: 0;
text-align: left;
}
header.masthead .header-content h1 {
font-size: 50px;
}
header.masthead .device-container {
max-width: 325px;
}
}
section.download {
position: relative;
padding: 150px 0;
}
section.download h2 {
font-size: 50px;
margin-top: 0;
}
section.download .badges .badge-link {
display: block;
margin-bottom: 25px;
}
section.download .badges .badge-link:last-child {
margin-bottom: 0;
}
section.download .badges .badge-link img {
height: 60px;
}
@media (min-width: 768px) {
section.download .badges .badge-link {
display: inline-block;
margin-bottom: 0;
}
}
@media (min-width: 768px) {
section.download h2 {
font-size: 70px;
}
}
section.section1 .section-heading {
margin-bottom: 100px;
}
section.section1 .section-heading h2 {
margin-top: 0;
}
section.section1 .section-heading p {
margin-bottom: 0;
}
section.section1 .device-container,
section.section1 .feature-item {
max-width: 325px;
margin: 0 auto;
}
section.section1 .device-container {
margin-bottom: 100px;
}
@media (min-width: 992px) {
section.section1 .device-container {
margin-bottom: 0;
}
}
section.section1 .feature-item {
padding-top: 50px;
padding-bottom: 50px;
text-align: center;
}
section.section1 .feature-item h3 {
font-size: 30px;
}
section.section1 .feature-item i {
font-size: 80px;
display: block;
margin-bottom: 15px;
background: -webkit-linear-gradient(to left, #7b4397, #dc2430);
background: linear-gradient(to left, #7b4397, #dc2430);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
section.cta {
position: relative;
padding: 250px 0;
background-image: url("../img/bg-cta.jpg");
background-position: center;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
}
section.cta .cta-content {
position: relative;
z-index: 1;
}
section.cta .cta-content h2 {
font-size: 50px;
max-width: 450px;
margin-top: 0;
margin-bottom: 25px;
color: white;
}
@media (min-width: 768px) {
section.cta .cta-content h2 {
font-size: 80px;
}
}
section.cta .overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
}
section.section2 {
text-align: center;
color: white;
background: url("../img/bg-pattern.png"), rgb(76, 76, 76);
background: url("../img/bg-pattern.png"), -webkit-linear-gradient(to left, rgb(235, 74, 206), rgb(76, 76, 76));
background: url("../img/bg-pattern.png"), linear-gradient(to left, rgb(235, 74, 206), rgb(76, 76, 76));
}
section.section2 h2 {
margin-top: 0;
margin-bottom: 25px;
}
section.section2 h2 i {
color: #dd4b39;
}
section.section2 ul.list-social {
margin-bottom: 0;
}
section.section2 ul.list-social li a {
font-size: 40px;
line-height: 80px;
display: block;
width: 80px;
height: 80px;
color: white;
border-radius: 100%;
}
section.section2 ul.list-social li.social-twitter a {
background-color: #1da1f2;
}
section.section2 ul.list-social li.social-twitter a:hover {
background-color: #0d95e8;
}
section.section2 ul.list-social li.social-facebook a {
background-color: #3b5998;
}
section.section2 ul.list-social li.social-facebook a:hover {
background-color: #344e86;
}
section.section2 ul.list-social li.social-google-plus a {
background-color: #dd4b39;
}
section.section2 ul.list-social li.social-google-plus a:hover {
background-color: #d73925;
}
footer {
padding: 25px 0;
text-align: center;
color: rgba(255, 255, 255, 0.3);
background-color: #222222;
}
footer p {
font-size: 12px;
margin: 0;
}
footer ul {
margin-bottom: 0;
}
footer ul li a {
font-size: 12px;
color: rgba(255, 255, 255, 0.3);
}
footer ul li a:hover, footer ul li a:focus, footer ul li a:active, footer ul li a.active {
text-decoration: none;
}
.bg-primary {
color: white;
background: rgb(240, 102, 0);
background: -webkit-linear-gradient(to left, rgb(255, 102, 0), rgb(76, 76, 76));
background: linear-gradient(to left, rgb(255, 102, 0), rgb(76, 76, 76));
}
.text-primary {
color: #fdcc52;
}
.no-gutter > [class*='col-'] {
padding-right: 0;
padding-left: 0;
}
.btn-outline {
color: white;
border: 1px solid;
border-color: white;
}
.btn-outline:hover, .btn-outline:focus, .btn-outline:active, .btn-outline.active {
color: white;
border-color: rgb(76, 76, 76);
background-color: rgb(76, 76, 76);
}
.btn-outline-inverse {
color: white;
border: 1px solid;
border-color: rgb(76, 76, 76);
background-color: rgb(76, 76, 76);
}
.btn-outline-inverse:hover, .btn-outline-inverse:focus, .btn-outline-inverse:active, .btn-outline-inverse.active {
color: rgb(76, 76, 76);
border: 1px solid;
border-color: rgb(76, 76, 76);
background-color: white;
}
.btn {
border-radius: 300px;
font-family: 'Lato', 'Helvetica', 'Arial', 'sans-serif';
letter-spacing: 2px;
text-transform: uppercase;
}
.btn-xl {
font-size: 11px;
padding: 15px 45px;
}
.row {
text-align: center;
}
.fp-row {
margin: 3em 0;
}
.center {
text-align: center;
}
.small {
font-size: .9em;
word-wrap: break-word;
}
.list-inline-item {
margin: 1em 2em 0 2em;
}
.list-inline-item i {
color: rgb(76, 76, 76);
}

BIN
wowstash/static/favicon.ico View File

Before After
Width: 32  |  Height: 32  |  Size: 975 B

BIN
wowstash/static/img/.DS_Store View File


BIN
wowstash/static/img/bg-pattern.png View File

Before After
Width: 67  |  Height: 100  |  Size: 633 B

BIN
wowstash/static/img/wow-treasure-chest.png View File

Before After
Width: 720  |  Height: 775  |  Size: 112 KiB

+ 42
- 0
wowstash/static/js/new-age.js View File

@ -0,0 +1,42 @@
(function($) {
"use strict"; // Start of use strict
// Smooth scrolling using jQuery easing
$('a.js-scroll-trigger[href*="#"]:not([href="#"])').click(function() {
if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) {
var target = $(this.hash);
target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
if (target.length) {
$('html, body').animate({
scrollTop: (target.offset().top - 48)
}, 1000, "easeInOutExpo");
return false;
}
}
});
// Closes responsive menu when a scroll trigger link is clicked
$('.js-scroll-trigger').click(function() {
$('.navbar-collapse').collapse('hide');
});
// Activate scrollspy to add active class to navbar items on scroll
$('body').scrollspy({
target: '#mainNav',
offset: 54
});
// Collapse Navbar
var navbarCollapse = function() {
if ($("#mainNav").offset().top > 100) {
$("#mainNav").addClass("navbar-shrink");
} else {
$("#mainNav").removeClass("navbar-shrink");
}
};
// Collapse now if page is not at top
navbarCollapse();
// Collapse the navbar when page is scrolled
$(window).scroll(navbarCollapse);
})(jQuery); // End of use strict

+ 1567
- 0
wowstash/static/vendor/bootstrap/css/bootstrap-grid.css
File diff suppressed because it is too large
View File


+ 7
- 0
wowstash/static/vendor/bootstrap/css/bootstrap-grid.min.css
File diff suppressed because it is too large
View File


+ 342
- 0
wowstash/static/vendor/bootstrap/css/bootstrap-reboot.css View File

@ -0,0 +1,342 @@
/*!
* Bootstrap Reboot v4.0.0-beta.2 (https://getbootstrap.com)
* Copyright 2011-2017 The Bootstrap Authors
* Copyright 2011-2017 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
-ms-overflow-style: scrollbar;
-webkit-tap-highlight-color: transparent;
}
@-ms-viewport {
width: device-width;
}
article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {
display: block;
}
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
text-align: left;
background-color: #fff;
}
[tabindex="-1"]:focus {
outline: none !important;
}
hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
margin-bottom: 0.5rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-original-title] {
text-decoration: underline;
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
border-bottom: 0;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: .5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
dfn {
font-style: italic;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -.25em;
}
sup {
top: -.5em;
}
a {
color: #007bff;
text-decoration: none;
background-color: transparent;
-webkit-text-decoration-skip: objects;
}
a:hover {
color: #0056b3;
text-decoration: underline;
}
a:not([href]):not([tabindex]) {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):focus {
outline: 0;
}
pre,
code,
kbd,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
pre {
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
-ms-overflow-style: scrollbar;
}
figure {
margin: 0 0 1rem;
}
img {
vertical-align: middle;
border-style: none;
}
svg:not(:root) {
overflow: hidden;
}
a,
area,
button,
[role="button"],
input:not([type="range"]),
label,
select,
summary,
textarea {
-ms-touch-action: manipulation;
touch-action: manipulation;
}
table {
border-collapse: collapse;
}
caption {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
color: #868e96;
text-align: left;
caption-side: bottom;
}
th {
text-align: inherit;
}
label {
display: inline-block;
margin-bottom: .5rem;
}
button {
border-radius: 0;
}
button:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
button,
html [type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
input[type="radio"],
input[type="checkbox"] {
box-sizing: border-box;
padding: 0;
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
-webkit-appearance: listbox;
}
textarea {
overflow: auto;
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
max-width: 100%;
padding: 0;
margin-bottom: .5rem;
font-size: 1.5rem;
line-height: inherit;
color: inherit;
white-space: normal;
}
progress {
vertical-align: baseline;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
outline-offset: -2px;
-webkit-appearance: none;
}
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
summary {
display: list-item;
}
template {
display: none;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */

+ 8
- 0
wowstash/static/vendor/bootstrap/css/bootstrap-reboot.min.css View File

@ -0,0 +1,8 @@
/*!
* Bootstrap Reboot v4.0.0-beta.2 (https://getbootstrap.com)
* Copyright 2011-2017 The Bootstrap Authors
* Copyright 2011-2017 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input:not([type=range]),label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.min.css.map */

+ 8975
- 0
wowstash/static/vendor/bootstrap/css/bootstrap.css
File diff suppressed because it is too large
View File


+ 1
- 0
wowstash/static/vendor/bootstrap/css/bootstrap.css.map
File diff suppressed because it is too large
View File


+ 7
- 0
wowstash/static/vendor/bootstrap/css/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 1
- 0
wowstash/static/vendor/bootstrap/css/bootstrap.min.css.map
File diff suppressed because it is too large
View File


+ 6328
- 0
wowstash/static/vendor/bootstrap/js/bootstrap.bundle.js
File diff suppressed because it is too large
View File


+ 1
- 0
wowstash/static/vendor/bootstrap/js/bootstrap.bundle.js.map
File diff suppressed because it is too large
View File


+ 7
- 0
wowstash/static/vendor/bootstrap/js/bootstrap.bundle.min.js
File diff suppressed because it is too large
View File


+ 1
- 0
wowstash/static/vendor/bootstrap/js/bootstrap.bundle.min.js.map
File diff suppressed because it is too large
View File


+ 3894
- 0
wowstash/static/vendor/bootstrap/js/bootstrap.js
File diff suppressed because it is too large
View File


+ 1
- 0
wowstash/static/vendor/bootstrap/js/bootstrap.js.map
File diff suppressed because it is too large
View File


+ 7
- 0
wowstash/static/vendor/bootstrap/js/bootstrap.min.js
File diff suppressed because it is too large
View File


+ 1
- 0
wowstash/static/vendor/bootstrap/js/bootstrap.min.js.map
File diff suppressed because it is too large
View File


+ 2337
- 0
wowstash/static/vendor/font-awesome/css/font-awesome.css
File diff suppressed because it is too large
View File


+ 7
- 0
wowstash/static/vendor/font-awesome/css/font-awesome.css.map
File diff suppressed because it is too large
View File


+ 4
- 0
wowstash/static/vendor/font-awesome/css/font-awesome.min.css
File diff suppressed because it is too large
View File


BIN
wowstash/static/vendor/font-awesome/fonts/FontAwesome.otf View File


BIN
wowstash/static/vendor/font-awesome/fonts/fontawesome-webfont.eot View File


+ 2671
- 0
wowstash/static/vendor/font-awesome/fonts/fontawesome-webfont.svg
File diff suppressed because it is too large
View File


BIN
wowstash/static/vendor/font-awesome/fonts/fontawesome-webfont.ttf View File


BIN
wowstash/static/vendor/font-awesome/fonts/fontawesome-webfont.woff View File


BIN
wowstash/static/vendor/font-awesome/fonts/fontawesome-webfont.woff2 View File


+ 34
- 0
wowstash/static/vendor/font-awesome/less/animated.less View File

@ -0,0 +1,34 @@
// Animated Icons
// --------------------------
.@{fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.@{fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}

+ 25
- 0
wowstash/static/vendor/font-awesome/less/bordered-pulled.less View File

@ -0,0 +1,25 @@
// Bordered & Pulled
// -------------------------
.@{fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em @fa-border-color;
border-radius: .1em;
}
.@{fa-css-prefix}-pull-left { float: left; }
.@{fa-css-prefix}-pull-right { float: right; }
.@{fa-css-prefix} {
&.@{fa-css-prefix}-pull-left { margin-right: .3em; }
&.@{fa-css-prefix}-pull-right { margin-left: .3em; }
}
/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
.@{fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}

+ 12
- 0
wowstash/static/vendor/font-awesome/less/core.less View File

@ -0,0 +1,12 @@
// Base Class Definition
// -------------------------
.@{fa-css-prefix} {
display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}

+ 6
- 0
wowstash/static/vendor/font-awesome/less/fixed-width.less View File

@ -0,0 +1,6 @@
// Fixed Width Icons
// -------------------------
.@{fa-css-prefix}-fw {
width: (18em / 14);
text-align: center;
}

+ 18
- 0
wowstash/static/vendor/font-awesome/less/font-awesome.less View File

@ -0,0 +1,18 @@
/*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
@import "variables.less";
@import "mixins.less";
@import "path.less";
@import "core.less";
@import "larger.less";
@import "fixed-width.less";
@import "list.less";
@import "bordered-pulled.less";
@import "animated.less";
@import "rotated-flipped.less";
@import "stacked.less";
@import "icons.less";
@import "screen-reader.less";

+ 789
- 0
wowstash/static/vendor/font-awesome/less/icons.less View File

@ -0,0 +1,789 @@
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }
.@{fa-css-prefix}-music:before { content: @fa-var-music; }
.@{fa-css-prefix}-search:before { content: @fa-var-search; }
.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }
.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }
.@{fa-css-prefix}-star:before { content: @fa-var-star; }
.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }
.@{fa-css-prefix}-user:before { content: @fa-var-user; }
.@{fa-css-prefix}-film:before { content: @fa-var-film; }
.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }
.@{fa-css-prefix}-th:before { content: @fa-var-th; }
.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
.@{fa-css-prefix}-check:before { content: @fa-var-check; }
.@{fa-css-prefix}-remove:before,
.@{fa-css-prefix}-close:before,
.@{fa-css-prefix}-times:before { content: @fa-var-times; }
.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }
.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }
.@{fa-css-prefix}-gear:before,
.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }
.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }
.@{fa-css-prefix}-home:before { content: @fa-var-home; }
.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }
.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }
.@{fa-css-prefix}-road:before { content: @fa-var-road; }
.@{fa-css-prefix}-download:before { content: @fa-var-download; }
.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }
.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }
.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }
.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }
.@{fa-css-prefix}-rotate-right:before,
.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }
.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }
.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }
.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }
.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }
.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }
.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }
.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }
.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }
.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }
.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }
.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }
.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }
.@{fa-css-prefix}-book:before { content: @fa-var-book; }
.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }
.@{fa-css-prefix}-print:before { content: @fa-var-print; }
.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }
.@{fa-css-prefix}-font:before { content: @fa-var-font; }
.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }
.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }
.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }
.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }
.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }
.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }
.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }
.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }