├── .gitignore ├── .htaccess ├── Chartbuilder_README.md ├── LICENSE ├── README.md ├── app_config.py ├── etc ├── __init__.py ├── default_labels.csv ├── default_milestones.csv ├── default_tickets.csv └── github.py ├── examples ├── 2012-01-gr-diesel-cars-300-eu.csv ├── 2012-01-gr-diesel-cars-300-us.csv ├── 2012-01-gr-diesel-cars-300.gif ├── 2012-01-gr-jobs-lost-millions-462.csv ├── 2012-01-gr-jobs-lost-millions-462.gif ├── 2012-02-gr-avg-expend-natural-gas-300.csv └── 2012-02-gr-avg-expend-natural-gas-300.gif ├── fabfile.py ├── gzip_types.txt ├── gzip_www.py ├── requirements.txt └── www ├── assets ├── npr-apps-logo.png └── seamus-crop.png ├── css ├── arrow.gif ├── bootstrap.min.css ├── chartbuilder.css ├── chosen-sprite.png ├── chosen-sprite@2x.png ├── chosen.css ├── colorPicker.css ├── gneisschart.css ├── main.css └── normalize.css ├── fonts ├── font-awesome │ ├── css │ │ ├── font-awesome-ie7.css │ │ ├── font-awesome-ie7.min.css │ │ ├── font-awesome.css │ │ └── font-awesome.min.css │ ├── font │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ └── fontawesome-webfont.woff │ ├── less │ │ ├── bootstrap.less │ │ ├── core.less │ │ ├── extras.less │ │ ├── font-awesome-ie7.less │ │ ├── font-awesome.less │ │ ├── icons.less │ │ ├── mixins.less │ │ ├── path.less │ │ └── variables.less │ └── scss │ │ ├── _bootstrap.scss │ │ ├── _core.scss │ │ ├── _extras.scss │ │ ├── _icons.scss │ │ ├── _mixins.scss │ │ ├── _path.scss │ │ ├── _variables.scss │ │ ├── font-awesome-ie7.scss │ │ └── font-awesome.scss ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.svg ├── glyphicons-halflings-regular.ttf └── glyphicons-halflings-regular.woff ├── index.html └── js ├── chartbuilder.js ├── gneisschart.js └── lib ├── StackBlur.js ├── bootstrap.min.js ├── canvg.js ├── chosen.jquery.min.js ├── csvkit.js ├── d3.v2.js ├── jquery.colorPicker.js ├── jquery.js ├── modernizr.js └── rgbcolor.js /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[co] 2 | *.sw[op] 3 | 4 | # Packages 5 | *.egg 6 | *.egg-info 7 | dist 8 | build 9 | eggs 10 | parts 11 | bin 12 | var 13 | sdist 14 | develop-eggs 15 | .installed.cfg 16 | 17 | # Installer logs 18 | pip-log.txt 19 | 20 | # Unit test / coverage reports 21 | .coverage 22 | .tox 23 | 24 | #Translations 25 | *.mo 26 | 27 | #Mr Developer 28 | .mr.developer.cfg 29 | 30 | .DS_store 31 | .gzip 32 | 33 | node_modules 34 | www/*.html 35 | www/css/*.less.css 36 | www/js/templates.js 37 | www/js/app_config.js 38 | confs/rendered/* 39 | data/copy.xls 40 | tumblr-theme.html 41 | -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | 2 | FileETag None 3 | 4 | Header unset ETag 5 | Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" 6 | Header set Pragma "no-cache" 7 | Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT" 8 | 9 | -------------------------------------------------------------------------------- /Chartbuilder_README.md: -------------------------------------------------------------------------------- 1 | Chartbuilder / Gneisschart 2 | ========================== 3 | 4 | Chartbuilder / Gneisschart is a D3.js based front-end charting application that facilitates easy creation of simple beautiful charts. 5 | 6 | Chartbuilder is the user and export interface. Gneisschart is the charting framework. 7 | 8 | What Chartbuilder is not 9 | ------------------------- 10 | + A replacement for Excel 11 | + A replacement for Google Spreadsheet 12 | + A data analysis tool 13 | + A data transformation tool 14 | 15 | What Chartbuilder is 16 | -------------------- 17 | Chartbuilder is the final step in charting. Paste data into it and export an svg or png chart in a style that has been predefined. 18 | 19 | How to use Chartbuilder 20 | ------------------------ 21 | ###Getting started 22 | If you are not interested in customizing the styles of your charts use the hosted version: http://quartz.github.io/Chartbuilder/ 23 | 24 | Alternatively: 25 | 26 | 1. [Download source](https://github.com/Quartz/Chartbuilder/archive/master.zip) (and unzip) 27 | 3. from the terminal navigate to the source folder (on a Mac: `cd ~/Downloads/Chartbuilder-master/`) 28 | 4. run `python -m SimpleHTTPServer` 29 | 5. Open Google Chrome, Apple Safari, or Opera and navigate to [http://localhost:8000/](http://localhost:8000/) 30 | 31 | 32 | ####Charting time Series Data 33 | 1. Find some time series data (may I suggest [this](https://docs.google.com/a/qz.com/spreadsheet/ccc?key=0AtrPfe-ScVhJdGg0a2hKZU1JaWZ4ZGMxY3NKbWozYUE#gid=0)) 34 | 2. Make sure the first column is your dates, and the heading on the first column is "date" 35 | 3. Copy and paste into chart builder 36 | 37 | ####Charting ordinal series data 38 | 1. Find some ordinal series data (may I suggest [this](https://docs.google.com/a/qz.com/spreadsheet/ccc?key=0AtrPfe-ScVhJdDZrODFnM3Q1TTlfSHA2Z3lrSjJrUmc#gid=0)) 39 | 2. Make sure the first column are your categories, and the heading on the first column _isn't_ "date" 40 | 3. Copy and paste into chartbuilder 41 | 42 | ####Finishing up 43 | _steps 2-4 are optional_ 44 | 45 | 1. Pick your series types 46 | 2. Set a title 47 | 3. Set your units using the axis prefix and suffix field 48 | 4. Adjust your max and min (if you so choose) 49 | 4. Add a credit line and/or a source line 50 | 6. Click create chart 51 | 7. Select to download an svg or png 52 | 53 | ###Examples of charts made with Chartbuilder 54 | ####Line charts 55 | 56 | 57 | 58 | ####Column charts 59 | 60 | 61 | 62 | 63 | ####Bar grids 64 | 65 | 66 | 67 | 68 | ####Mixed 69 | 70 | 71 | 72 | Deploying Chartbuilder 73 | ------------------------ 74 | ChartBuilder is meant to be deployed by an organization and then customized for the design consistency of that organization so that the reporters or other people in that organization can make charts. 75 | 76 | ###Deploying 77 | ChartBuild is an HTML/CSS/JS application. You can easy copy, fork, and install the files wherever. It can be easily put up on Github Pages. 78 | 79 | ###Configuration 80 | Once you deploy it, configuring is either through CSS overrides, custom HTML, or Javascript configuration. 81 | 82 | ####Chart configuration 83 | Chart configuration is handled by passing a configuration object through to `ChartBuilder.start()`. 84 | 85 | ChartBuilder.start({ 86 | colors: ["#ff4cf4","#ffb3ff","#e69ce6","#cc87cc","#b373b3","#995f99"], 87 | creditline: 'NewsPost Inc.' 88 | }); 89 | 90 | You can see all the configuration options in the [Gneisschart.js library](https://github.com/Quartz/Chartbuilder/blob/master/js/gneisschart.js). 91 | 92 | ###Getting started 93 | 94 | Why Chartbuilder / Gneisschart 95 | ----------------- 96 | + You're a writer, blogger, reporter who hates the way screenshotted research reports and excel charts look in your stories 97 | + You're a graphic designer or graphics editor spending too much time making simple charts in the same style 98 | + You're a developer at an organization looking to add consistency to employee generated charts 99 | 100 | Chartbuilder was created to speed workflow in a newsroom and give reporters more responsibility over their content. It allows someone to create simple graphics quickly within a pre-specified style guide without needing specialized design software. 101 | 102 | The output formats are can be used anywhere images and svgs are accepted. There's no need for CMS integration or complex back end systems. 103 | 104 | There are fewer excuses to use screenshots from analyst reports or charts in Excel. 105 | 106 | More about that here http://yanofsky.info/demos/chartbuilder/slides/ 107 | 108 | Gneisschart was created to assist in the above as well as establish the starting point for a touch focused responsive charting library. 109 | 110 | ###Styling the chart 111 | Chart styles are contained in `css/gneisschart.css`. The color palette is defined in the configuration object 112 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Quartz 4 | Modifications by NPR, 2014 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy of 7 | this software and associated documentation files (the "Software"), to deal in 8 | the Software without restriction, including without limitation the rights to 9 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 10 | the Software, and to permit persons to whom the Software is furnished to do so, 11 | subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 18 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 19 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 20 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | nprapps Chartbuilder fork 2 | ========================= 3 | 4 | This is our fork of Quartz's Chartbuilder project. We'll be customizing it beyond the scope of a normal downstream fork. 5 | 6 | For the original Chartbuilder README see `Chartbuilder_README.md`. 7 | -------------------------------------------------------------------------------- /app_config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ 4 | Project-wide application configuration. 5 | 6 | DO NOT STORE SECRETS, PASSWORDS, ETC. IN THIS FILE. 7 | They will be exposed to users. Use environment variables instead. 8 | """ 9 | 10 | import os 11 | 12 | """ 13 | NAMES 14 | """ 15 | # Project name used for display 16 | PROJECT_NAME = 'chartbuilder' 17 | 18 | # Project name in urls 19 | # Use dashes, not underscores! 20 | PROJECT_SLUG = 'charts' 21 | 22 | # The name of the repository containing the source 23 | REPOSITORY_NAME = 'Chartbuilder' 24 | REPOSITORY_URL = 'git@github.com:nprapps/%s.git' % REPOSITORY_NAME 25 | REPOSITORY_ALT_URL = None # 'git@bitbucket.org:nprapps/%s.git' % REPOSITORY_NAME' 26 | 27 | # The name to be used in paths on the server 28 | PROJECT_FILENAME = 'chartbuilder' 29 | 30 | """ 31 | DEPLOYMENT 32 | """ 33 | FILE_SERVER = '10.36.1.8' 34 | 35 | # These variables will be set at runtime. See configure_targets() below 36 | DEBUG = True 37 | 38 | def configure_targets(deployment_target): 39 | """ 40 | Configure deployment targets. Abstracted so this can be 41 | overriden for rendering before deployment. 42 | """ 43 | global DEBUG 44 | global DEPLOYMENT_TARGET 45 | 46 | if deployment_target == 'production': 47 | DEBUG = False 48 | elif deployment_target == 'staging': 49 | DEBUG = True 50 | else: 51 | DEBUG = True 52 | 53 | DEPLOYMENT_TARGET = deployment_target 54 | 55 | """ 56 | Run automated configuration 57 | """ 58 | DEPLOYMENT_TARGET = os.environ.get('DEPLOYMENT_TARGET', None) 59 | 60 | configure_targets(DEPLOYMENT_TARGET) 61 | 62 | -------------------------------------------------------------------------------- /etc/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/etc/__init__.py -------------------------------------------------------------------------------- /etc/default_labels.csv: -------------------------------------------------------------------------------- 1 | name,color 2 | Priority: Critical,e10c02 3 | Priority: High,ff9900 4 | Priority: Normal,ffff00 5 | Priority: Low,02d7e1 6 | Blocked,e102d8 7 | Launch TODO,02e10c 8 | Project Management,bfdadc 9 | -------------------------------------------------------------------------------- /etc/default_milestones.csv: -------------------------------------------------------------------------------- 1 | title 2 | Iteration 1 3 | Backlog 4 | -------------------------------------------------------------------------------- /etc/default_tickets.csv: -------------------------------------------------------------------------------- 1 | title,body,labels 2 | Update ad tags,,Launch TODO 3 | Update Facebook Open Graph tags,,Launch TODO 4 | Update Twitter Card tags,,Launch TODO 5 | Update Twitter/Facebook links,,Launch TODO 6 | Get npr.org redirect (short URL),,Launch TODO 7 | Create Seamus shell page and request redirect,,Launch TODO 8 | Update widget analytics with project name,,Launch TODO 9 | Browser testing: IE9,, 10 | Browser testing: IE10,, 11 | Browser testing: Latest Firefox,, 12 | Browser testing: Latest Chrome,, 13 | Browser testing: Desktop Safari,, 14 | Device testing: iPhone Safari,, 15 | Device testing: iPhone Chrome/Webkit,, 16 | Device testing: iPad,, 17 | Device testing: Android phone,, 18 | Device testing: Android tablet,, 19 | Data download,, 20 | Link to repo,, 21 | Ad,, 22 | Double-check analytics code,,Launch TODO 23 | DevOps: Enable scout monitor for //test/,,Launch TODO 24 | Write the team blog post,,Launch TODO 25 | Update master sitemaps index and redeploy,,Launch TODO 26 | Email Emerson in marketing,,Launch TODO 27 | Schedule iteration reviews,,Project Management 28 | Schedule sprint planning meetings,,Project Management 29 | Schedule sprint retrospectives,,Project Management 30 | Setup Hipchat service hook on github,, 31 | -------------------------------------------------------------------------------- /etc/github.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import csv 4 | import getpass 5 | import json 6 | import re 7 | 8 | import requests 9 | from requests.auth import HTTPBasicAuth 10 | 11 | def get_auth(): 12 | """ 13 | Construct a basic auth object from a username and password 14 | """ 15 | username = raw_input('Username:') 16 | password = getpass.getpass('Password:') 17 | 18 | auth = HTTPBasicAuth(username, password) 19 | 20 | # Test auth by requesting repo events 21 | response = requests.get('https://api.github.com/notifications', auth=auth) 22 | 23 | if response.status_code == 401: 24 | raise Exception('Invalid username or password') 25 | 26 | return auth 27 | 28 | def get_repo_path(): 29 | """ 30 | Extract the repository url from the gitconfig file. 31 | """ 32 | with open('.git/config') as f: 33 | gitconfig = f.read() 34 | 35 | match = re.search('(git@github.com:|https://github.com/)(.+)/(.+).git', gitconfig) 36 | repo_username = match.group(2) 37 | repo_name = match.group(3) 38 | 39 | return '%s/%s' % (repo_username, repo_name) 40 | 41 | def delete_existing_labels(auth): 42 | """ 43 | Delete labels currently on the repository 44 | """ 45 | url = 'https://api.github.com/repos/%s/labels' % get_repo_path() 46 | 47 | response = requests.get(url, auth=auth) 48 | labels = json.loads(response.content) 49 | 50 | print 'Deleting %i labels' % len(labels) 51 | 52 | for label in labels: 53 | print 'Deleting label %s' % label['name'] 54 | 55 | requests.delete(url + '/' + label['name'], auth=auth) 56 | 57 | def create_labels(auth, filename='etc/default_labels.csv'): 58 | """ 59 | Creates labels in Github issues. 60 | """ 61 | url = 'https://api.github.com/repos/%s/labels' % get_repo_path() 62 | 63 | with open(filename) as f: 64 | labels = list(csv.DictReader(f)) 65 | 66 | print 'Creating %i labels' % len(labels) 67 | 68 | for label in labels: 69 | print 'Creating label "%s"' % label['name'] 70 | data = json.dumps(label) 71 | 72 | requests.post(url, data=data, auth=auth) 73 | 74 | def create_tickets(auth, filename='etc/default_tickets.csv'): 75 | """ 76 | Creates tickets in Github issues. 77 | """ 78 | url = 'https://api.github.com/repos/%s/issues' % get_repo_path() 79 | 80 | with open(filename) as f: 81 | tickets = list(csv.DictReader(f)) 82 | 83 | print 'Creating %i tickets' % len(tickets) 84 | 85 | for ticket in tickets: 86 | print 'Creating ticket "%s"' % ticket['title'] 87 | 88 | if ticket['labels']: 89 | ticket['labels'] = ticket['labels'].split(',') 90 | else: 91 | ticket['labels'] = [] 92 | 93 | ticket['labels'].append('Default Ticket') 94 | 95 | data = json.dumps(ticket) 96 | 97 | requests.post(url, data=data, auth=auth) 98 | 99 | def create_milestones(auth, filename='etc/default_milestones.csv'): 100 | """ 101 | Creates milestones in Github issues. 102 | """ 103 | url = 'https://api.github.com/repos/%s/milestones' % get_repo_path() 104 | 105 | with open(filename) as f: 106 | milestones = list(csv.DictReader(f)) 107 | 108 | print 'Creating %i milestones' % len(milestones) 109 | 110 | for milestone in milestones: 111 | print 'Creating milestone "%s"' % milestone['title'] 112 | 113 | data = json.dumps(milestone) 114 | 115 | requests.post(url, data=data, auth=auth) 116 | 117 | -------------------------------------------------------------------------------- /examples/2012-01-gr-diesel-cars-300-eu.csv: -------------------------------------------------------------------------------- 1 | Year,Percent 2 | 2006,51.2 3 | 2007,53.6 4 | 2008,52.9 5 | 2009,46.1 6 | 2010,52.0 7 | 2011,55.8 8 | -------------------------------------------------------------------------------- /examples/2012-01-gr-diesel-cars-300-us.csv: -------------------------------------------------------------------------------- 1 | Year,Percent 2 | 2006,3.4 3 | 2007,3.0 4 | 2008,2.2 5 | 2009,2.1 6 | 2010,2.4 7 | 2011,2.6 8 | -------------------------------------------------------------------------------- /examples/2012-01-gr-diesel-cars-300.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/examples/2012-01-gr-diesel-cars-300.gif -------------------------------------------------------------------------------- /examples/2012-01-gr-jobs-lost-millions-462.csv: -------------------------------------------------------------------------------- 1 | Industry,Change Jan. '08-Feb. '10,Change since Feb '10 2 | Manufacturing,-2.25,0.3 3 | Construction,-1.9,0 4 | Retail,-1.25,0.3 5 | Admin.,-1.1,0.4 6 | Leisure and Hospitality,-0.65,0.35 7 | Finance,-0.55,-0.05 8 | Professional Services,-0.4,0.3 9 | Transportation,-0.35,0.2 10 | State & local gov't,-0.1,0.45 11 | Private education,0.15,0.15 12 | Federal*,0.2,-0.05 13 | Health care,0.6,0.55 -------------------------------------------------------------------------------- /examples/2012-01-gr-jobs-lost-millions-462.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/examples/2012-01-gr-jobs-lost-millions-462.gif -------------------------------------------------------------------------------- /examples/2012-02-gr-avg-expend-natural-gas-300.csv: -------------------------------------------------------------------------------- 1 | Fiscal Year,Price 2 | '06-'07,820 3 | '07-'08,860 4 | '08-'09,890 5 | '09-'10,750 6 | '10-'11,725 7 | '11-'12,643 -------------------------------------------------------------------------------- /examples/2012-02-gr-avg-expend-natural-gas-300.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/examples/2012-02-gr-avg-expend-natural-gas-300.gif -------------------------------------------------------------------------------- /fabfile.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from fabric.api import * 4 | 5 | import app_config 6 | 7 | """ 8 | Deployment 9 | 10 | Changes to deployment requires a full-stack test. Deployment 11 | has two primary functions: Pushing flat files to S3 and deploying 12 | code to a remote server if required. 13 | """ 14 | def _deploy_to_file_server(path='www'): 15 | local('rm -rf %s/live-data' % path) 16 | local('rm -rf %s/sitemap.xml' % path) 17 | 18 | local('rsync -vr %s/ visadmin@%s:~/www/%s' % (path, app_config.FILE_SERVER, app_config.PROJECT_SLUG)) 19 | 20 | def assets_down(path='www/assets'): 21 | """ 22 | Download assets folder from s3 to www/assets 23 | """ 24 | local('aws s3 sync s3://%s/%s/ %s/ --acl "public-read" --cache-control "max-age=5" --region "us-east-1"' % (app_config.ASSETS_S3_BUCKET, app_config.PROJECT_SLUG, path)) 25 | 26 | def assets_up(path='www/assets'): 27 | """ 28 | Upload www/assets folder to s3 29 | """ 30 | _confirm("You are about to replace the copy of the folder on the server with your own copy. Are you sure?") 31 | 32 | local('aws s3 sync %s/ s3://%s/%s/ --acl "public-read" --cache-control "max-age=5" --region "us-east-1" --delete' % ( 33 | path, 34 | app_config.ASSETS_S3_BUCKET, 35 | app_config.PROJECT_SLUG 36 | )) 37 | 38 | def assets_rm(path): 39 | """ 40 | remove an asset from s3 and locally 41 | """ 42 | file_list = glob(path) 43 | 44 | if len(file_list) > 0: 45 | 46 | _confirm("You are about to destroy %s files. Are you sure?" % len(file_list)) 47 | 48 | with settings(warn_only=True): 49 | 50 | for file_path in file_list: 51 | 52 | local('aws s3 rm s3://%s/%s/%s --region "us-east-1"' % ( 53 | app_config.ASSETS_S3_BUCKET, 54 | app_config.PROJECT_SLUG, 55 | file_path.replace('www/assets/', '') 56 | )) 57 | 58 | local('rm -rf %s' % path) 59 | 60 | def _gzip(in_path='www', out_path='.gzip'): 61 | """ 62 | Gzips everything in www and puts it all in gzip 63 | """ 64 | local('python gzip_www.py %s %s' % (in_path, out_path)) 65 | 66 | def deploy(remote='origin'): 67 | """ 68 | Deploy the latest app to S3 and, if configured, to our servers. 69 | """ 70 | _deploy_to_file_server('www') 71 | 72 | """ 73 | Destruction 74 | 75 | Changes to destruction require setup/deploy to a test host in order to test. 76 | Destruction should remove all files related to the project from both a remote 77 | host and S3. 78 | """ 79 | def _confirm(message): 80 | answer = prompt(message, default="Not at all") 81 | 82 | if answer.lower() not in ('y', 'yes', 'buzz off', 'screw you'): 83 | exit() 84 | 85 | def shiva_the_destroyer(): 86 | """ 87 | Deletes the app from s3 88 | """ 89 | _confirm("You are about to destroy everything deployed to %s for this project.\nDo you know what you're doing?" % app_config.DEPLOYMENT_TARGET) 90 | 91 | # Not updated for fileserver 92 | -------------------------------------------------------------------------------- /gzip_types.txt: -------------------------------------------------------------------------------- 1 | *.html 2 | *.js 3 | *.json 4 | *.css 5 | *.xml 6 | -------------------------------------------------------------------------------- /gzip_www.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from fnmatch import fnmatch 4 | import gzip 5 | import os 6 | import shutil 7 | import sys 8 | 9 | class FakeTime: 10 | def time(self): 11 | return 1261130520.0 12 | 13 | # Hack to override gzip's time implementation 14 | # See: http://stackoverflow.com/questions/264224/setting-the-gzip-timestamp-from-python 15 | gzip.time = FakeTime() 16 | 17 | 18 | def compress(file_path): 19 | f_in = open(file_path, 'rb') 20 | contents = f_in.readlines() 21 | f_in.close() 22 | f_out = gzip.open(file_path, 'wb') 23 | f_out.writelines(contents) 24 | f_out.close() 25 | 26 | 27 | def main(): 28 | in_path = sys.argv[1] 29 | out_path = sys.argv[2] 30 | 31 | with open('gzip_types.txt') as f: 32 | gzip_globs = [glob.strip() for glob in f] 33 | 34 | if os.path.isdir(in_path): 35 | shutil.rmtree(out_path, ignore_errors=True) 36 | shutil.copytree(in_path, out_path) 37 | 38 | for path, dirs, files in os.walk(sys.argv[2]): 39 | for filename in files: 40 | if not any([fnmatch(filename, glob) for glob in gzip_globs]): 41 | continue 42 | 43 | file_path = os.path.join(path, filename) 44 | 45 | compress(file_path) 46 | else: 47 | if not any([fnmatch(in_path, glob) for glob in gzip_globs]): 48 | return 49 | 50 | try: 51 | os.remove(out_path) 52 | except OSError: 53 | pass 54 | 55 | shutil.copy(in_path, out_path) 56 | 57 | compress(out_path) 58 | 59 | 60 | if __name__ == '__main__': 61 | main() 62 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Fabric==1.4.3 2 | awscli==1.2.10 3 | bcdoc==0.12.0 4 | botocore==0.30.0 5 | colorama==0.2.5 6 | docutils==0.11 7 | jmespath==0.2.1 8 | ply==3.4 9 | pyasn1==0.1.7 10 | pycrypto==2.6 11 | python-dateutil==2.2 12 | requests==1.1.0 13 | rsa==3.1.2 14 | six==1.5.2 15 | ssh==1.7.14 16 | wsgiref==0.1.2 17 | -------------------------------------------------------------------------------- /www/assets/npr-apps-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/assets/npr-apps-logo.png -------------------------------------------------------------------------------- /www/assets/seamus-crop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/assets/seamus-crop.png -------------------------------------------------------------------------------- /www/css/arrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/css/arrow.gif -------------------------------------------------------------------------------- /www/css/chartbuilder.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 50px; 3 | } 4 | 5 | h2 { 6 | font-size: 24px; 7 | margin-top: 20px; 8 | } 9 | nav ul { 10 | list-style: none; 11 | margin: 0; 12 | padding: 0; 13 | } 14 | nav ul li { 15 | float: left; 16 | height: 44px; 17 | line-height: 44px; 18 | margin-left: 22px; 19 | font-size: 12px; 20 | } 21 | nav ul li:first-child { 22 | margin-left: 0; 23 | } 24 | nav a, 25 | nav a:link, 26 | nav a:visited { 27 | color: #6d8ac4; 28 | font-weight: bold; 29 | text-transform: lowercase; 30 | } 31 | nav a:hover, 32 | nav a:active { 33 | color: #bccae5; 34 | } 35 | nav .site-links { 36 | float: left; 37 | margin-left: 30px; 38 | } 39 | nav .site-links-2 { 40 | float: right; 41 | margin-right: 120px; 42 | } 43 | nav .npr { 44 | width: 61px; 45 | } 46 | nav .npr img { 47 | margin: -2px 0 0 0; 48 | width: 100%; 49 | height: auto; 50 | } 51 | 52 | nav.tools { 53 | background: #222; 54 | margin: 0; 55 | padding: 25px 30px; 56 | color: #eee; 57 | height: auto; 58 | position: fixed; 59 | top: 0; 60 | width: 100%; 61 | z-index: 100; 62 | } 63 | nav.tools h1 { 64 | display: inline-block; 65 | text-transform: uppercase; 66 | font-weight: normal; 67 | -webkit-font-smoothing: antialiased; 68 | font-family: "Gotham SSm", Arial, Helvetica, sans-serif; 69 | line-height: 32px; 70 | margin: 0; 71 | } 72 | nav.tools h1 span.help { 73 | font-size: 14px; 74 | margin-left: 11px; 75 | opacity: 0.7; 76 | text-transform: none; 77 | } 78 | nav.tools h1 span.help i { 79 | margin-right: 5px; 80 | } 81 | nav.tools a { 82 | font-weight: normal; 83 | -webkit-font-smoothing: antialiased; 84 | color: #eee; 85 | } 86 | nav.tools a:hover { 87 | opacity: 0.7; 88 | color: #eee; 89 | } 90 | nav.tools img { 91 | height: 20px; 92 | width: auto; 93 | border: 1px solid #eee; 94 | margin-right: 5px; 95 | } 96 | nav.tools a.toolkit-link { 97 | float: right; 98 | line-height: 32px; 99 | font-size: 16px; 100 | } 101 | nav.tools a.toolkit-link:hover { 102 | color: #eee; 103 | } 104 | .generator nav.tools { 105 | display: block; 106 | } 107 | header { 108 | padding: 22px 30px; 109 | } 110 | header:before, 111 | header:after { 112 | content: " "; 113 | /* 1 */ 114 | display: table; 115 | /* 2 */ 116 | } 117 | header:after { 118 | clear: both; 119 | } 120 | header:before, 121 | header:after { 122 | content: " "; 123 | /* 1 */ 124 | display: table; 125 | /* 2 */ 126 | } 127 | header:after { 128 | clear: both; 129 | } 130 | header h1 { 131 | float: left; 132 | font-size: 24px; 133 | margin: 0; 134 | } 135 | header h2 { 136 | font: 15px "Gotham SSm", "Century Gothic", Arial, Helvetica, sans-serif; 137 | color: #666; 138 | margin: 9px 0 0 11px; 139 | font-size: 14px; 140 | float: left; 141 | display: none; 142 | } 143 | 144 | 145 | .btn-lg, 146 | .glyphicon { 147 | -webkit-font-smoothing: antialiased; 148 | } 149 | 150 | .btn .glyphicon { 151 | margin-right: 5px; 152 | } 153 | 154 | #main-wrapper { 155 | /* display: table;*/ 156 | } 157 | 158 | #chart-column, 159 | #main { 160 | /* display: table-cell;*/ 161 | vertical-align: top; 162 | } 163 | 164 | #chart-column { 165 | width: 331px; 166 | padding: 15px; 167 | position: fixed; 168 | overflow: hidden; 169 | height: 100%; 170 | background: #fff; 171 | border-right: 1px solid #ddd; 172 | } 173 | 174 | #chart-column p { 175 | margin-top: 15px; 176 | } 177 | 178 | #main { 179 | padding: 0 0 60px 330px; 180 | } 181 | 182 | #canvas, #favicanvas { 183 | display: none; 184 | } 185 | 186 | 187 | .navbar-brand { 188 | text-transform: uppercase; 189 | font-size: 24px; 190 | } 191 | 192 | .navbar-right { 193 | margin: 9px 15px 6px; 194 | } 195 | 196 | 197 | #rightAxisControls .form-control { 198 | width: 100px; 199 | } 200 | 201 | .step-header { 202 | background: #333; 203 | color: #fff; 204 | border-radius: 36px; 205 | display: inline-block; 206 | width: 36px; 207 | height: 36px; 208 | text-align: center; 209 | line-height: 36px; 210 | font-size: 18px; 211 | } 212 | 213 | .seriesItemGroup { 214 | margin-bottom: 5px; 215 | } 216 | 217 | .seriesItemGroup label { 218 | line-height: 25px; 219 | } 220 | 221 | div.colorPicker-picker { 222 | float: left; 223 | margin-right: 25px; 224 | } 225 | 226 | #previous-charts { 227 | border-top: none; 228 | background: #f5f5f5; 229 | padding-top: 15px; 230 | } 231 | 232 | #import { 233 | position: relative; 234 | } 235 | 236 | #import h2 { 237 | margin-top: 0; 238 | } 239 | 240 | #import > div { 241 | margin-top: 0; 242 | } 243 | 244 | #reset-form { 245 | position: absolute; 246 | top: 15px; 247 | right: 15px; 248 | } 249 | 250 | .series-colors.control-label { 251 | padding-top: 0; 252 | } 253 | 254 | .control-instructions { 255 | padding-top: 10px; 256 | } 257 | 258 | #csvInput { 259 | margin-bottom: 10px; 260 | } 261 | 262 | #transpose-data { 263 | margin-bottom: 10px; 264 | } 265 | 266 | #typePicker { 267 | margin-bottom: 10px; 268 | } 269 | 270 | #chart-options .text-muted { 271 | font-weight: normal; 272 | } 273 | 274 | #download-modal { 275 | padding-top: 15%; 276 | } 277 | 278 | .row > .col-md-12 { 279 | border-top: 1px solid #e5e5e5; 280 | padding-top: 10px; 281 | margin-top: 40px; 282 | } 283 | 284 | .row:first-child > .col-md-12 { 285 | border-top: none; 286 | margin-top: 0; 287 | } 288 | 289 | .modal-backdrop.fade.in { 290 | opacity: 0.8; 291 | } 292 | 293 | #font-sample { 294 | font-family: 'HelveticaNeueW01-57Cn','Gotham SSm',Helvetica, sans-serif; 295 | display: none; 296 | } 297 | 298 | #export .help-block { 299 | color: #b94a48; 300 | } 301 | -------------------------------------------------------------------------------- /www/css/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/css/chosen-sprite.png -------------------------------------------------------------------------------- /www/css/chosen-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/css/chosen-sprite@2x.png -------------------------------------------------------------------------------- /www/css/chosen.css: -------------------------------------------------------------------------------- 1 | /* @group Base */ 2 | .chosen-container { 3 | position: relative; 4 | display: inline-block; 5 | vertical-align: middle; 6 | font-size: 13px; 7 | zoom: 1; 8 | *display: inline; 9 | -webkit-user-select: none; 10 | -moz-user-select: none; 11 | user-select: none; 12 | } 13 | .chosen-container .chosen-drop { 14 | position: absolute; 15 | top: 100%; 16 | left: -9999px; 17 | z-index: 1010; 18 | -webkit-box-sizing: border-box; 19 | -moz-box-sizing: border-box; 20 | box-sizing: border-box; 21 | width: 100%; 22 | border: 1px solid #aaa; 23 | border-top: 0; 24 | background: #fff; 25 | box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); 26 | } 27 | .chosen-container.chosen-with-drop .chosen-drop { 28 | left: 0; 29 | } 30 | .chosen-container a { 31 | cursor: pointer; 32 | } 33 | 34 | /* @end */ 35 | /* @group Single Chosen */ 36 | .chosen-container-single .chosen-single { 37 | position: relative; 38 | display: block; 39 | overflow: hidden; 40 | padding: 0 0 0 8px; 41 | height: 23px; 42 | border: 1px solid #aaa; 43 | border-radius: 5px; 44 | background-color: #fff; 45 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4)); 46 | background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); 47 | background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); 48 | background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); 49 | background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); 50 | background-clip: padding-box; 51 | box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1); 52 | color: #444; 53 | text-decoration: none; 54 | white-space: nowrap; 55 | line-height: 24px; 56 | } 57 | .chosen-container-single .chosen-default { 58 | color: #999; 59 | } 60 | .chosen-container-single .chosen-single span { 61 | display: block; 62 | overflow: hidden; 63 | margin-right: 26px; 64 | text-overflow: ellipsis; 65 | white-space: nowrap; 66 | } 67 | .chosen-container-single .chosen-single-with-deselect span { 68 | margin-right: 38px; 69 | } 70 | .chosen-container-single .chosen-single abbr { 71 | position: absolute; 72 | top: 6px; 73 | right: 26px; 74 | display: block; 75 | width: 12px; 76 | height: 12px; 77 | background: url('chosen-sprite.png') -42px 1px no-repeat; 78 | font-size: 1px; 79 | } 80 | .chosen-container-single .chosen-single abbr:hover { 81 | background-position: -42px -10px; 82 | } 83 | .chosen-container-single.chosen-disabled .chosen-single abbr:hover { 84 | background-position: -42px -10px; 85 | } 86 | .chosen-container-single .chosen-single div { 87 | position: absolute; 88 | top: 0; 89 | right: 0; 90 | display: block; 91 | width: 18px; 92 | height: 100%; 93 | } 94 | .chosen-container-single .chosen-single div b { 95 | display: block; 96 | width: 100%; 97 | height: 100%; 98 | background: url('chosen-sprite.png') no-repeat 0px 2px; 99 | } 100 | .chosen-container-single .chosen-search { 101 | position: relative; 102 | z-index: 1010; 103 | margin: 0; 104 | padding: 3px 4px; 105 | white-space: nowrap; 106 | } 107 | .chosen-container-single .chosen-search input[type="text"] { 108 | -webkit-box-sizing: border-box; 109 | -moz-box-sizing: border-box; 110 | box-sizing: border-box; 111 | margin: 1px 0; 112 | padding: 4px 20px 4px 5px; 113 | width: 100%; 114 | height: auto; 115 | outline: 0; 116 | border: 1px solid #aaa; 117 | background: white url('chosen-sprite.png') no-repeat 100% -20px; 118 | background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); 119 | background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); 120 | background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); 121 | background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%); 122 | background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%); 123 | font-size: 1em; 124 | font-family: sans-serif; 125 | line-height: normal; 126 | border-radius: 0; 127 | } 128 | .chosen-container-single .chosen-drop { 129 | margin-top: -1px; 130 | border-radius: 0 0 4px 4px; 131 | background-clip: padding-box; 132 | } 133 | .chosen-container-single.chosen-container-single-nosearch .chosen-search { 134 | position: absolute; 135 | left: -9999px; 136 | } 137 | 138 | /* @end */ 139 | /* @group Results */ 140 | .chosen-container .chosen-results { 141 | position: relative; 142 | overflow-x: hidden; 143 | overflow-y: auto; 144 | margin: 0 4px 4px 0; 145 | padding: 0 0 0 4px; 146 | max-height: 240px; 147 | -webkit-overflow-scrolling: touch; 148 | } 149 | .chosen-container .chosen-results li { 150 | display: none; 151 | margin: 0; 152 | padding: 5px 6px; 153 | list-style: none; 154 | line-height: 15px; 155 | } 156 | .chosen-container .chosen-results li.active-result { 157 | display: list-item; 158 | cursor: pointer; 159 | } 160 | .chosen-container .chosen-results li.disabled-result { 161 | display: list-item; 162 | color: #ccc; 163 | cursor: default; 164 | } 165 | .chosen-container .chosen-results li.highlighted { 166 | background-color: #3875d7; 167 | background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); 168 | background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%); 169 | background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%); 170 | background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%); 171 | background-image: linear-gradient(#3875d7 20%, #2a62bc 90%); 172 | color: #fff; 173 | } 174 | .chosen-container .chosen-results li.no-results { 175 | display: list-item; 176 | background: #f4f4f4; 177 | } 178 | .chosen-container .chosen-results li.group-result { 179 | display: list-item; 180 | font-weight: bold; 181 | cursor: default; 182 | } 183 | .chosen-container .chosen-results li.group-option { 184 | padding-left: 15px; 185 | } 186 | .chosen-container .chosen-results li em { 187 | font-style: normal; 188 | text-decoration: underline; 189 | } 190 | 191 | /* @end */ 192 | /* @group Multi Chosen */ 193 | .chosen-container-multi .chosen-choices { 194 | position: relative; 195 | overflow: hidden; 196 | -webkit-box-sizing: border-box; 197 | -moz-box-sizing: border-box; 198 | box-sizing: border-box; 199 | margin: 0; 200 | padding: 0; 201 | width: 100%; 202 | height: auto !important; 203 | height: 1%; 204 | border: 1px solid #aaa; 205 | background-color: #fff; 206 | background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); 207 | background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); 208 | background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); 209 | background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%); 210 | background-image: linear-gradient(#eeeeee 1%, #ffffff 15%); 211 | cursor: text; 212 | } 213 | .chosen-container-multi .chosen-choices li { 214 | float: left; 215 | list-style: none; 216 | } 217 | .chosen-container-multi .chosen-choices li.search-field { 218 | margin: 0; 219 | padding: 0; 220 | white-space: nowrap; 221 | } 222 | .chosen-container-multi .chosen-choices li.search-field input[type="text"] { 223 | margin: 1px 0; 224 | padding: 5px; 225 | height: 15px; 226 | outline: 0; 227 | border: 0 !important; 228 | background: transparent !important; 229 | box-shadow: none; 230 | color: #666; 231 | font-size: 100%; 232 | font-family: sans-serif; 233 | line-height: normal; 234 | border-radius: 0; 235 | } 236 | .chosen-container-multi .chosen-choices li.search-field .default { 237 | color: #999; 238 | } 239 | .chosen-container-multi .chosen-choices li.search-choice { 240 | position: relative; 241 | margin: 3px 0 3px 5px; 242 | padding: 3px 20px 3px 5px; 243 | border: 1px solid #aaa; 244 | border-radius: 3px; 245 | background-color: #e4e4e4; 246 | background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); 247 | background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 248 | background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 249 | background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 250 | background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 251 | background-clip: padding-box; 252 | box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05); 253 | color: #333; 254 | line-height: 13px; 255 | cursor: default; 256 | } 257 | .chosen-container-multi .chosen-choices li.search-choice .search-choice-close { 258 | position: absolute; 259 | top: 4px; 260 | right: 3px; 261 | display: block; 262 | width: 12px; 263 | height: 12px; 264 | background: url('chosen-sprite.png') -42px 1px no-repeat; 265 | font-size: 1px; 266 | } 267 | .chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { 268 | background-position: -42px -10px; 269 | } 270 | .chosen-container-multi .chosen-choices li.search-choice-disabled { 271 | padding-right: 5px; 272 | border: 1px solid #ccc; 273 | background-color: #e4e4e4; 274 | background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); 275 | background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 276 | background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 277 | background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 278 | background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 279 | color: #666; 280 | } 281 | .chosen-container-multi .chosen-choices li.search-choice-focus { 282 | background: #d4d4d4; 283 | } 284 | .chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close { 285 | background-position: -42px -10px; 286 | } 287 | .chosen-container-multi .chosen-results { 288 | margin: 0; 289 | padding: 0; 290 | } 291 | .chosen-container-multi .chosen-drop .result-selected { 292 | display: list-item; 293 | color: #ccc; 294 | cursor: default; 295 | } 296 | 297 | /* @end */ 298 | /* @group Active */ 299 | .chosen-container-active .chosen-single { 300 | border: 1px solid #5897fb; 301 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); 302 | } 303 | .chosen-container-active.chosen-with-drop .chosen-single { 304 | border: 1px solid #aaa; 305 | -moz-border-radius-bottomright: 0; 306 | border-bottom-right-radius: 0; 307 | -moz-border-radius-bottomleft: 0; 308 | border-bottom-left-radius: 0; 309 | background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff)); 310 | background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%); 311 | background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%); 312 | background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%); 313 | background-image: linear-gradient(#eeeeee 20%, #ffffff 80%); 314 | box-shadow: 0 1px 0 #fff inset; 315 | } 316 | .chosen-container-active.chosen-with-drop .chosen-single div { 317 | border-left: none; 318 | background: transparent; 319 | } 320 | .chosen-container-active.chosen-with-drop .chosen-single div b { 321 | background-position: -18px 2px; 322 | } 323 | .chosen-container-active .chosen-choices { 324 | border: 1px solid #5897fb; 325 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); 326 | } 327 | .chosen-container-active .chosen-choices li.search-field input[type="text"] { 328 | color: #111 !important; 329 | } 330 | 331 | /* @end */ 332 | /* @group Disabled Support */ 333 | .chosen-disabled { 334 | opacity: 0.5 !important; 335 | cursor: default; 336 | } 337 | .chosen-disabled .chosen-single { 338 | cursor: default; 339 | } 340 | .chosen-disabled .chosen-choices .search-choice .search-choice-close { 341 | cursor: default; 342 | } 343 | 344 | /* @end */ 345 | /* @group Right to Left */ 346 | .chosen-rtl { 347 | text-align: right; 348 | } 349 | .chosen-rtl .chosen-single { 350 | overflow: visible; 351 | padding: 0 8px 0 0; 352 | } 353 | .chosen-rtl .chosen-single span { 354 | margin-right: 0; 355 | margin-left: 26px; 356 | direction: rtl; 357 | } 358 | .chosen-rtl .chosen-single-with-deselect span { 359 | margin-left: 38px; 360 | } 361 | .chosen-rtl .chosen-single div { 362 | right: auto; 363 | left: 3px; 364 | } 365 | .chosen-rtl .chosen-single abbr { 366 | right: auto; 367 | left: 26px; 368 | } 369 | .chosen-rtl .chosen-choices li { 370 | float: right; 371 | } 372 | .chosen-rtl .chosen-choices li.search-field input[type="text"] { 373 | direction: rtl; 374 | } 375 | .chosen-rtl .chosen-choices li.search-choice { 376 | margin: 3px 5px 3px 0; 377 | padding: 3px 5px 3px 19px; 378 | } 379 | .chosen-rtl .chosen-choices li.search-choice .search-choice-close { 380 | right: auto; 381 | left: 4px; 382 | } 383 | .chosen-rtl.chosen-container-single-nosearch .chosen-search, 384 | .chosen-rtl .chosen-drop { 385 | left: 9999px; 386 | } 387 | .chosen-rtl.chosen-container-single .chosen-results { 388 | margin: 0 0 4px 4px; 389 | padding: 0 4px 0 0; 390 | } 391 | .chosen-rtl .chosen-results li.group-option { 392 | padding-right: 15px; 393 | padding-left: 0; 394 | } 395 | .chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { 396 | border-right: none; 397 | } 398 | .chosen-rtl .chosen-search input[type="text"] { 399 | padding: 4px 5px 4px 20px; 400 | background: white url('chosen-sprite.png') no-repeat -30px -20px; 401 | background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); 402 | background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%); 403 | background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%); 404 | background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%); 405 | background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%); 406 | direction: rtl; 407 | } 408 | .chosen-rtl.chosen-container-single .chosen-single div b { 409 | background-position: 6px 2px; 410 | } 411 | .chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b { 412 | background-position: -12px 2px; 413 | } 414 | 415 | /* @end */ 416 | /* @group Retina compatibility */ 417 | @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) { 418 | .chosen-rtl .chosen-search input[type="text"], 419 | .chosen-container-single .chosen-single abbr, 420 | .chosen-container-single .chosen-single div b, 421 | .chosen-container-single .chosen-search input[type="text"], 422 | .chosen-container-multi .chosen-choices .search-choice .search-choice-close, 423 | .chosen-container .chosen-results-scroll-down span, 424 | .chosen-container .chosen-results-scroll-up span { 425 | background-image: url('chosen-sprite@2x.png') !important; 426 | background-size: 52px 37px !important; 427 | background-repeat: no-repeat !important; 428 | } 429 | } 430 | /* @end */ 431 | -------------------------------------------------------------------------------- /www/css/colorPicker.css: -------------------------------------------------------------------------------- 1 | div.colorPicker-picker { 2 | height: 25px; 3 | width: 25px; 4 | padding: 0 25px 0 0 !important; 5 | border: none; 6 | background: none; 7 | cursor: pointer; 8 | line-height: 25px; 9 | margin-right: 25px; 10 | position: relative; 11 | } 12 | 13 | div.colorPicker-picker:after { 14 | content: ' '; 15 | background: url('http://media.npr.org/chrome_svg/chevron-small.svg'); 16 | background-size: 95%; 17 | display: block; 18 | width: 15px; 19 | height: 8px; 20 | position: absolute; 21 | right: -18px; 22 | top: 7px; 23 | 24 | } 25 | 26 | div.colorPicker-palette { 27 | width: 140px; 28 | position: absolute; 29 | border: 1px solid #ccc; 30 | background-color: #EFEFEF; 31 | padding: 1px; 32 | z-index: 9999; 33 | -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.3); 34 | -moz-box-shadow: 0 1px 10px rgba(0,0,0,.3); 35 | box-shadow: 0 1px 10px rgba(0,0,0,.3); 36 | } 37 | div.colorPicker_hexWrap {width: 100%; float:left } 38 | div.colorPicker_hexWrap label {font-size: 95%; color: #2F2F2F; margin: 5px 2px; width: 25%} 39 | div.colorPicker_hexWrap input {margin: 5px 2px; padding: 0; font-size: 95%; border: 1px solid #000; width: 65%; } 40 | 41 | div.colorPicker-swatch { 42 | height: 25px; 43 | width: 25px; 44 | margin: 1px; 45 | float: left; 46 | cursor: pointer; 47 | line-height: 12px; 48 | border: none; 49 | } 50 | -------------------------------------------------------------------------------- /www/css/gneisschart.css: -------------------------------------------------------------------------------- 1 | svg #ground { 2 | fill: #fff; 3 | stroke: none; 4 | } 5 | 6 | svg .axis line { 7 | fill: none; 8 | stroke-width: 1px; 9 | shape-rendering: crispEdges; 10 | } 11 | 12 | svg #baseline g.zero line { 13 | stroke: #222; 14 | shape-rendering: crispEdges; 15 | fill: none; 16 | stroke-width: 1px; 17 | } 18 | 19 | svg #xAxis line { 20 | stroke: #666; 21 | } 22 | 23 | svg #xAxis{ 24 | fill: #666666; 25 | } 26 | 27 | svg .axis path { 28 | stroke: none; 29 | fill: none; 30 | } 31 | 32 | svg #yAxis .tick { 33 | stroke: #e5e5e5; 34 | stroke-dasharray: 2; 35 | } 36 | 37 | svg #yAxis .zero .tick { 38 | stroke: #666; 39 | stroke-dasharray: 0; 40 | } 41 | 42 | svg #baseline text, 43 | svg .axis text, 44 | svg .bar text { 45 | font-family: 'HelveticaNeueW01-57Cn','Gotham SSm',Helvetica, sans-serif; 46 | font-size: 15px; 47 | fill: #333; 48 | } 49 | 50 | svg .legendItem text { 51 | font-family: 'HelveticaNeueW01-57Cn','Gotham SSm',Helvetica, sans-serif; 52 | font-size: 15px; 53 | } 54 | 55 | svg text.metaText { 56 | font-family: 'HelveticaNeueW01-57Cn','Gotham SSm',Helvetica, sans-serif; 57 | font-size: 15px; 58 | text-rendering: optimizeLegibility; 59 | } 60 | 61 | svg text.barLabel, 62 | svg text.bargridLabel { 63 | font-family: 'HelveticaNeueW01-57Cn','Gotham SSm',Helvetica, sans-serif; 64 | font-size: 15px 65 | } 66 | 67 | svg #titleLine { 68 | font-family: 'HelveticaNeueW01-77BdCn 692722','Gotham SSm',Helvetica, sans-serif; 69 | -webkit-font-smoothing: antialiased; 70 | font-size: 17px; 71 | fill: #333; 72 | } 73 | 74 | svg .bar rect { 75 | shape-rendering: crispEdges; 76 | } 77 | -------------------------------------------------------------------------------- /www/css/main.css: -------------------------------------------------------------------------------- 1 | /* 2 | * HTML5 Boilerplate 3 | * 4 | * What follows is the result of much research on cross-browser styling. 5 | * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal, 6 | * Kroc Camen, and the H5BP dev community and team. 7 | */ 8 | 9 | /* ========================================================================== 10 | Base styles: opinionated defaults 11 | ========================================================================== */ 12 | 13 | html, 14 | button, 15 | input, 16 | select, 17 | textarea { 18 | color: #222; 19 | } 20 | 21 | body { 22 | font-size: 1em; 23 | line-height: 1.4; 24 | } 25 | 26 | /* 27 | * Remove text-shadow in selection highlight: h5bp.com/i 28 | * These selection rule sets have to be separate. 29 | * Customize the background color to match your design. 30 | */ 31 | 32 | ::-moz-selection { 33 | background: #b3d4fc; 34 | text-shadow: none; 35 | } 36 | 37 | ::selection { 38 | background: #b3d4fc; 39 | text-shadow: none; 40 | } 41 | 42 | /* 43 | * A better looking default horizontal rule 44 | */ 45 | 46 | hr { 47 | display: block; 48 | height: 1px; 49 | border: 0; 50 | border-top: 1px solid #ccc; 51 | margin: 1em 0; 52 | padding: 0; 53 | } 54 | 55 | /* 56 | * Remove the gap between images and the bottom of their containers: h5bp.com/i/440 57 | */ 58 | 59 | img { 60 | vertical-align: middle; 61 | } 62 | 63 | /* 64 | * Remove default fieldset styles. 65 | */ 66 | 67 | fieldset { 68 | border: 0; 69 | margin: 0; 70 | padding: 0; 71 | } 72 | 73 | /* 74 | * Allow only vertical resizing of textareas. 75 | */ 76 | 77 | textarea { 78 | resize: vertical; 79 | } 80 | 81 | /* ========================================================================== 82 | Chrome Frame prompt 83 | ========================================================================== */ 84 | 85 | .chromeframe { 86 | margin: 0.2em 0; 87 | background: #ccc; 88 | color: #000; 89 | padding: 0.2em 0; 90 | } 91 | 92 | /* ========================================================================== 93 | Author's custom styles 94 | ========================================================================== */ 95 | .main-wrapper { 96 | margin-top: 40px; 97 | } 98 | 99 | #chart-column { 100 | background: #eee !important; 101 | } 102 | 103 | .navbar { 104 | padding-top: 20px; 105 | padding-left: 65px; 106 | min-height: 89px !important; 107 | color: #eeeeee; 108 | margin-bottom: 0 !important; 109 | } 110 | 111 | .navbar, .navbar-brand, .navbar a { 112 | color: #eeeeee !important; 113 | } 114 | 115 | .navbar-brand { 116 | font-size: 36px !important; 117 | } 118 | 119 | .navbar-text { 120 | margin-left: 15px !important; 121 | } 122 | 123 | a:hover { 124 | color: #555; 125 | text-decoration: none; 126 | } 127 | 128 | .icon-wrapper { 129 | position: fixed; 130 | top: 0; 131 | left: 0; 132 | padding: 30px 15px 0 15px; 133 | min-height: 89px !important; 134 | border-style: solid; 135 | border-color: #eeeeee; 136 | border-width: 0 1px 0 0; 137 | font-size: 35px; 138 | } 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | /* ========================================================================== 152 | Helper classes 153 | ========================================================================== */ 154 | 155 | /* 156 | * Image replacement 157 | */ 158 | 159 | .ir { 160 | background-color: transparent; 161 | border: 0; 162 | overflow: hidden; 163 | /* IE 6/7 fallback */ 164 | *text-indent: -9999px; 165 | } 166 | 167 | .ir:before { 168 | content: ""; 169 | display: block; 170 | width: 0; 171 | height: 150%; 172 | } 173 | 174 | /* 175 | * Hide from both screenreaders and browsers: h5bp.com/u 176 | */ 177 | 178 | .hidden { 179 | display: none !important; 180 | visibility: hidden; 181 | } 182 | 183 | /* 184 | * Hide only visually, but have it available for screenreaders: h5bp.com/v 185 | */ 186 | 187 | .visuallyhidden { 188 | border: 0; 189 | clip: rect(0 0 0 0); 190 | height: 1px; 191 | margin: -1px; 192 | overflow: hidden; 193 | padding: 0; 194 | position: absolute; 195 | width: 1px; 196 | } 197 | 198 | /* 199 | * Extends the .visuallyhidden class to allow the element to be focusable 200 | * when navigated to via the keyboard: h5bp.com/p 201 | */ 202 | 203 | .visuallyhidden.focusable:active, 204 | .visuallyhidden.focusable:focus { 205 | clip: auto; 206 | height: auto; 207 | margin: 0; 208 | overflow: visible; 209 | position: static; 210 | width: auto; 211 | } 212 | 213 | /* 214 | * Hide visually and from screenreaders, but maintain layout 215 | */ 216 | 217 | .invisible { 218 | visibility: hidden; 219 | } 220 | 221 | /* 222 | * Clearfix: contain floats 223 | * 224 | * For modern browsers 225 | * 1. The space content is one way to avoid an Opera bug when the 226 | * `contenteditable` attribute is included anywhere else in the document. 227 | * Otherwise it causes space to appear at the top and bottom of elements 228 | * that receive the `clearfix` class. 229 | * 2. The use of `table` rather than `block` is only necessary if using 230 | * `:before` to contain the top-margins of child elements. 231 | */ 232 | 233 | .clearfix:before, 234 | .clearfix:after { 235 | content: " "; /* 1 */ 236 | display: table; /* 2 */ 237 | } 238 | 239 | .clearfix:after { 240 | clear: both; 241 | } 242 | 243 | /* 244 | * For IE 6/7 only 245 | * Include this rule to trigger hasLayout and contain floats. 246 | */ 247 | 248 | .clearfix { 249 | *zoom: 1; 250 | } 251 | 252 | /* ========================================================================== 253 | EXAMPLE Media Queries for Responsive Design. 254 | These examples override the primary ('mobile first') styles. 255 | Modify as content requires. 256 | ========================================================================== */ 257 | 258 | @media only screen and (min-width: 35em) { 259 | /* Style adjustments for viewports that meet the condition */ 260 | } 261 | 262 | @media print, 263 | (-o-min-device-pixel-ratio: 5/4), 264 | (-webkit-min-device-pixel-ratio: 1.25), 265 | (min-resolution: 120dpi) { 266 | /* Style adjustments for high resolution devices */ 267 | } 268 | 269 | /* ========================================================================== 270 | Print styles. 271 | Inlined to avoid required HTTP connection: h5bp.com/r 272 | ========================================================================== */ 273 | 274 | @media print { 275 | * { 276 | background: transparent !important; 277 | color: #000 !important; /* Black prints faster: h5bp.com/s */ 278 | box-shadow: none !important; 279 | text-shadow: none !important; 280 | } 281 | 282 | a, 283 | a:visited { 284 | text-decoration: underline; 285 | } 286 | 287 | a[href]:after { 288 | content: " (" attr(href) ")"; 289 | } 290 | 291 | abbr[title]:after { 292 | content: " (" attr(title) ")"; 293 | } 294 | 295 | /* 296 | * Don't show links for images, or javascript/internal links 297 | */ 298 | 299 | .ir a:after, 300 | a[href^="javascript:"]:after, 301 | a[href^="#"]:after { 302 | content: ""; 303 | } 304 | 305 | pre, 306 | blockquote { 307 | border: 1px solid #999; 308 | page-break-inside: avoid; 309 | } 310 | 311 | thead { 312 | display: table-header-group; /* h5bp.com/t */ 313 | } 314 | 315 | tr, 316 | img { 317 | page-break-inside: avoid; 318 | } 319 | 320 | img { 321 | max-width: 100% !important; 322 | } 323 | 324 | @page { 325 | margin: 0.5cm; 326 | } 327 | 328 | p, 329 | h2, 330 | h3 { 331 | orphans: 3; 332 | widows: 3; 333 | } 334 | 335 | h2, 336 | h3 { 337 | page-break-after: avoid; 338 | } 339 | } 340 | -------------------------------------------------------------------------------- /www/css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v1.1.1 | MIT License | git.io/normalize */ 2 | 3 | /* ========================================================================== 4 | HTML5 display definitions 5 | ========================================================================== */ 6 | 7 | /** 8 | * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3. 9 | */ 10 | 11 | article, 12 | aside, 13 | details, 14 | figcaption, 15 | figure, 16 | footer, 17 | header, 18 | hgroup, 19 | main, 20 | nav, 21 | section, 22 | summary { 23 | display: block; 24 | } 25 | 26 | /** 27 | * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. 28 | */ 29 | 30 | audio, 31 | canvas, 32 | video { 33 | display: inline-block; 34 | *display: inline; 35 | *zoom: 1; 36 | } 37 | 38 | /** 39 | * Prevent modern browsers from displaying `audio` without controls. 40 | * Remove excess height in iOS 5 devices. 41 | */ 42 | 43 | audio:not([controls]) { 44 | display: none; 45 | height: 0; 46 | } 47 | 48 | /** 49 | * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. 50 | * Known issue: no IE 6 support. 51 | */ 52 | 53 | [hidden] { 54 | display: none; 55 | } 56 | 57 | /* ========================================================================== 58 | Base 59 | ========================================================================== */ 60 | 61 | /** 62 | * 1. Prevent system color scheme's background color being used in Firefox, IE, 63 | * and Opera. 64 | * 2. Prevent system color scheme's text color being used in Firefox, IE, and 65 | * Opera. 66 | * 3. Correct text resizing oddly in IE 6/7 when body `font-size` is set using 67 | * `em` units. 68 | * 4. Prevent iOS text size adjust after orientation change, without disabling 69 | * user zoom. 70 | */ 71 | 72 | html { 73 | background: #fff; /* 1 */ 74 | color: #000; /* 2 */ 75 | font-size: 100%; /* 3 */ 76 | -webkit-text-size-adjust: 100%; /* 4 */ 77 | -ms-text-size-adjust: 100%; /* 4 */ 78 | } 79 | 80 | /** 81 | * Address `font-family` inconsistency between `textarea` and other form 82 | * elements. 83 | */ 84 | 85 | html, 86 | button, 87 | input, 88 | select, 89 | textarea { 90 | font-family: sans-serif; 91 | } 92 | 93 | /** 94 | * Address margins handled incorrectly in IE 6/7. 95 | */ 96 | 97 | body { 98 | margin: 0; 99 | } 100 | 101 | /* ========================================================================== 102 | Links 103 | ========================================================================== */ 104 | 105 | /** 106 | * Address `outline` inconsistency between Chrome and other browsers. 107 | */ 108 | 109 | a:focus { 110 | outline: thin dotted; 111 | } 112 | 113 | /** 114 | * Improve readability when focused and also mouse hovered in all browsers. 115 | */ 116 | 117 | a:active, 118 | a:hover { 119 | outline: 0; 120 | } 121 | 122 | /* ========================================================================== 123 | Typography 124 | ========================================================================== */ 125 | 126 | /** 127 | * Address font sizes and margins set differently in IE 6/7. 128 | * Address font sizes within `section` and `article` in Firefox 4+, Safari 5, 129 | * and Chrome. 130 | */ 131 | 132 | h1 { 133 | font-size: 2em; 134 | margin: 0.67em 0; 135 | } 136 | 137 | h2 { 138 | font-size: 1.5em; 139 | margin: 0.83em 0; 140 | } 141 | 142 | h3 { 143 | font-size: 1.17em; 144 | margin: 1em 0; 145 | } 146 | 147 | h4 { 148 | font-size: 1em; 149 | margin: 1.33em 0; 150 | } 151 | 152 | h5 { 153 | font-size: 0.83em; 154 | margin: 1.67em 0; 155 | } 156 | 157 | h6 { 158 | font-size: 0.67em; 159 | margin: 2.33em 0; 160 | } 161 | 162 | /** 163 | * Address styling not present in IE 7/8/9, Safari 5, and Chrome. 164 | */ 165 | 166 | abbr[title] { 167 | border-bottom: 1px dotted; 168 | } 169 | 170 | /** 171 | * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. 172 | */ 173 | 174 | b, 175 | strong { 176 | font-weight: bold; 177 | } 178 | 179 | blockquote { 180 | margin: 1em 40px; 181 | } 182 | 183 | /** 184 | * Address styling not present in Safari 5 and Chrome. 185 | */ 186 | 187 | dfn { 188 | font-style: italic; 189 | } 190 | 191 | /** 192 | * Address differences between Firefox and other browsers. 193 | * Known issue: no IE 6/7 normalization. 194 | */ 195 | 196 | hr { 197 | -moz-box-sizing: content-box; 198 | box-sizing: content-box; 199 | height: 0; 200 | } 201 | 202 | /** 203 | * Address styling not present in IE 6/7/8/9. 204 | */ 205 | 206 | mark { 207 | background: #ff0; 208 | color: #000; 209 | } 210 | 211 | /** 212 | * Address margins set differently in IE 6/7. 213 | */ 214 | 215 | p, 216 | pre { 217 | margin: 1em 0; 218 | } 219 | 220 | /** 221 | * Correct font family set oddly in IE 6, Safari 4/5, and Chrome. 222 | */ 223 | 224 | code, 225 | kbd, 226 | pre, 227 | samp { 228 | font-family: monospace, serif; 229 | _font-family: 'courier new', monospace; 230 | font-size: 1em; 231 | } 232 | 233 | /** 234 | * Improve readability of pre-formatted text in all browsers. 235 | */ 236 | 237 | pre { 238 | white-space: pre; 239 | white-space: pre-wrap; 240 | word-wrap: break-word; 241 | } 242 | 243 | /** 244 | * Address CSS quotes not supported in IE 6/7. 245 | */ 246 | 247 | q { 248 | quotes: none; 249 | } 250 | 251 | /** 252 | * Address `quotes` property not supported in Safari 4. 253 | */ 254 | 255 | q:before, 256 | q:after { 257 | content: ''; 258 | content: none; 259 | } 260 | 261 | /** 262 | * Address inconsistent and variable font size in all browsers. 263 | */ 264 | 265 | small { 266 | font-size: 80%; 267 | } 268 | 269 | /** 270 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 271 | */ 272 | 273 | sub, 274 | sup { 275 | font-size: 75%; 276 | line-height: 0; 277 | position: relative; 278 | vertical-align: baseline; 279 | } 280 | 281 | sup { 282 | top: -0.5em; 283 | } 284 | 285 | sub { 286 | bottom: -0.25em; 287 | } 288 | 289 | /* ========================================================================== 290 | Lists 291 | ========================================================================== */ 292 | 293 | /** 294 | * Address margins set differently in IE 6/7. 295 | */ 296 | 297 | dl, 298 | menu, 299 | ol, 300 | ul { 301 | margin: 1em 0; 302 | } 303 | 304 | dd { 305 | margin: 0 0 0 40px; 306 | } 307 | 308 | /** 309 | * Address paddings set differently in IE 6/7. 310 | */ 311 | 312 | menu, 313 | ol, 314 | ul { 315 | padding: 0 0 0 40px; 316 | } 317 | 318 | /** 319 | * Correct list images handled incorrectly in IE 7. 320 | */ 321 | 322 | nav ul, 323 | nav ol { 324 | list-style: none; 325 | list-style-image: none; 326 | } 327 | 328 | /* ========================================================================== 329 | Embedded content 330 | ========================================================================== */ 331 | 332 | /** 333 | * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. 334 | * 2. Improve image quality when scaled in IE 7. 335 | */ 336 | 337 | img { 338 | border: 0; /* 1 */ 339 | -ms-interpolation-mode: bicubic; /* 2 */ 340 | } 341 | 342 | /** 343 | * Correct overflow displayed oddly in IE 9. 344 | */ 345 | 346 | svg:not(:root) { 347 | overflow: hidden; 348 | } 349 | 350 | /* ========================================================================== 351 | Figures 352 | ========================================================================== */ 353 | 354 | /** 355 | * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. 356 | */ 357 | 358 | figure { 359 | margin: 0; 360 | } 361 | 362 | /* ========================================================================== 363 | Forms 364 | ========================================================================== */ 365 | 366 | /** 367 | * Correct margin displayed oddly in IE 6/7. 368 | */ 369 | 370 | form { 371 | margin: 0; 372 | } 373 | 374 | /** 375 | * Define consistent border, margin, and padding. 376 | */ 377 | 378 | fieldset { 379 | border: 1px solid #c0c0c0; 380 | margin: 0 2px; 381 | padding: 0.35em 0.625em 0.75em; 382 | } 383 | 384 | /** 385 | * 1. Correct color not being inherited in IE 6/7/8/9. 386 | * 2. Correct text not wrapping in Firefox 3. 387 | * 3. Correct alignment displayed oddly in IE 6/7. 388 | */ 389 | 390 | legend { 391 | border: 0; /* 1 */ 392 | padding: 0; 393 | white-space: normal; /* 2 */ 394 | *margin-left: -7px; /* 3 */ 395 | } 396 | 397 | /** 398 | * 1. Correct font size not being inherited in all browsers. 399 | * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, 400 | * and Chrome. 401 | * 3. Improve appearance and consistency in all browsers. 402 | */ 403 | 404 | button, 405 | input, 406 | select, 407 | textarea { 408 | font-size: 100%; /* 1 */ 409 | margin: 0; /* 2 */ 410 | vertical-align: baseline; /* 3 */ 411 | *vertical-align: middle; /* 3 */ 412 | } 413 | 414 | /** 415 | * Address Firefox 3+ setting `line-height` on `input` using `!important` in 416 | * the UA stylesheet. 417 | */ 418 | 419 | button, 420 | input { 421 | line-height: normal; 422 | } 423 | 424 | /** 425 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 426 | * All other form control elements do not inherit `text-transform` values. 427 | * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. 428 | * Correct `select` style inheritance in Firefox 4+ and Opera. 429 | */ 430 | 431 | button, 432 | select { 433 | text-transform: none; 434 | } 435 | 436 | /** 437 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 438 | * and `video` controls. 439 | * 2. Correct inability to style clickable `input` types in iOS. 440 | * 3. Improve usability and consistency of cursor style between image-type 441 | * `input` and others. 442 | * 4. Remove inner spacing in IE 7 without affecting normal text inputs. 443 | * Known issue: inner spacing remains in IE 6. 444 | */ 445 | 446 | button, 447 | html input[type="button"], /* 1 */ 448 | input[type="reset"], 449 | input[type="submit"] { 450 | -webkit-appearance: button; /* 2 */ 451 | cursor: pointer; /* 3 */ 452 | *overflow: visible; /* 4 */ 453 | } 454 | 455 | /** 456 | * Re-set default cursor for disabled elements. 457 | */ 458 | 459 | button[disabled], 460 | html input[disabled] { 461 | cursor: default; 462 | } 463 | 464 | /** 465 | * 1. Address box sizing set to content-box in IE 8/9. 466 | * 2. Remove excess padding in IE 8/9. 467 | * 3. Remove excess padding in IE 7. 468 | * Known issue: excess padding remains in IE 6. 469 | */ 470 | 471 | input[type="checkbox"], 472 | input[type="radio"] { 473 | box-sizing: border-box; /* 1 */ 474 | padding: 0; /* 2 */ 475 | *height: 13px; /* 3 */ 476 | *width: 13px; /* 3 */ 477 | } 478 | 479 | /** 480 | * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 481 | * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome 482 | * (include `-moz` to future-proof). 483 | */ 484 | 485 | input[type="search"] { 486 | -webkit-appearance: textfield; /* 1 */ 487 | -moz-box-sizing: content-box; 488 | -webkit-box-sizing: content-box; /* 2 */ 489 | box-sizing: content-box; 490 | } 491 | 492 | /** 493 | * Remove inner padding and search cancel button in Safari 5 and Chrome 494 | * on OS X. 495 | */ 496 | 497 | input[type="search"]::-webkit-search-cancel-button, 498 | input[type="search"]::-webkit-search-decoration { 499 | -webkit-appearance: none; 500 | } 501 | 502 | /** 503 | * Remove inner padding and border in Firefox 3+. 504 | */ 505 | 506 | button::-moz-focus-inner, 507 | input::-moz-focus-inner { 508 | border: 0; 509 | padding: 0; 510 | } 511 | 512 | /** 513 | * 1. Remove default vertical scrollbar in IE 6/7/8/9. 514 | * 2. Improve readability and alignment in all browsers. 515 | */ 516 | 517 | textarea { 518 | overflow: auto; /* 1 */ 519 | vertical-align: top; /* 2 */ 520 | } 521 | 522 | /* ========================================================================== 523 | Tables 524 | ========================================================================== */ 525 | 526 | /** 527 | * Remove most spacing between table cells. 528 | */ 529 | 530 | table { 531 | border-collapse: collapse; 532 | border-spacing: 0; 533 | } 534 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/font/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/fonts/font-awesome/font/FontAwesome.otf -------------------------------------------------------------------------------- /www/fonts/font-awesome/font/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/fonts/font-awesome/font/fontawesome-webfont.eot -------------------------------------------------------------------------------- /www/fonts/font-awesome/font/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/fonts/font-awesome/font/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /www/fonts/font-awesome/font/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/fonts/font-awesome/font/fontawesome-webfont.woff -------------------------------------------------------------------------------- /www/fonts/font-awesome/less/bootstrap.less: -------------------------------------------------------------------------------- 1 | /* BOOTSTRAP SPECIFIC CLASSES 2 | * -------------------------- */ 3 | 4 | /* Bootstrap 2.0 sprites.less reset */ 5 | [class^="icon-"], 6 | [class*=" icon-"] { 7 | display: inline; 8 | width: auto; 9 | height: auto; 10 | line-height: normal; 11 | vertical-align: baseline; 12 | background-image: none; 13 | background-position: 0% 0%; 14 | background-repeat: repeat; 15 | margin-top: 0; 16 | } 17 | 18 | /* more sprites.less reset */ 19 | .icon-white, 20 | .nav-pills > .active > a > [class^="icon-"], 21 | .nav-pills > .active > a > [class*=" icon-"], 22 | .nav-list > .active > a > [class^="icon-"], 23 | .nav-list > .active > a > [class*=" icon-"], 24 | .navbar-inverse .nav > .active > a > [class^="icon-"], 25 | .navbar-inverse .nav > .active > a > [class*=" icon-"], 26 | .dropdown-menu > li > a:hover > [class^="icon-"], 27 | .dropdown-menu > li > a:hover > [class*=" icon-"], 28 | .dropdown-menu > .active > a > [class^="icon-"], 29 | .dropdown-menu > .active > a > [class*=" icon-"], 30 | .dropdown-submenu:hover > a > [class^="icon-"], 31 | .dropdown-submenu:hover > a > [class*=" icon-"] { 32 | background-image: none; 33 | } 34 | 35 | 36 | /* keeps Bootstrap styles with and without icons the same */ 37 | .btn, .nav { 38 | [class^="icon-"], 39 | [class*=" icon-"] { 40 | // display: inline; 41 | &.icon-large { line-height: .9em; } 42 | &.icon-spin { display: inline-block; } 43 | } 44 | } 45 | .nav-tabs, .nav-pills { 46 | [class^="icon-"], 47 | [class*=" icon-"] { 48 | &, &.icon-large { line-height: .9em; } 49 | } 50 | } 51 | .btn { 52 | [class^="icon-"], 53 | [class*=" icon-"] { 54 | &.pull-left, &.pull-right { 55 | &.icon-2x { margin-top: .18em; } 56 | } 57 | &.icon-spin.icon-large { line-height: .8em; } 58 | } 59 | } 60 | .btn.btn-small { 61 | [class^="icon-"], 62 | [class*=" icon-"] { 63 | &.pull-left, &.pull-right { 64 | &.icon-2x { margin-top: .25em; } 65 | } 66 | } 67 | } 68 | .btn.btn-large { 69 | [class^="icon-"], 70 | [class*=" icon-"] { 71 | margin-top: 0; // overrides bootstrap default 72 | &.pull-left, &.pull-right { 73 | &.icon-2x { margin-top: .05em; } 74 | } 75 | &.pull-left.icon-2x { margin-right: .2em; } 76 | &.pull-right.icon-2x { margin-left: .2em; } 77 | } 78 | } 79 | 80 | /* Fixes alignment in nav lists */ 81 | .nav-list [class^="icon-"], 82 | .nav-list [class*=" icon-"] { 83 | line-height: inherit; 84 | } 85 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | /* FONT AWESOME CORE 2 | * -------------------------- */ 3 | 4 | [class^="icon-"], 5 | [class*=" icon-"] { 6 | .icon-FontAwesome(); 7 | } 8 | 9 | [class^="icon-"]:before, 10 | [class*=" icon-"]:before { 11 | text-decoration: inherit; 12 | display: inline-block; 13 | speak: none; 14 | } 15 | 16 | /* makes the font 33% larger relative to the icon container */ 17 | .icon-large:before { 18 | vertical-align: -10%; 19 | font-size: 4/3em; 20 | } 21 | 22 | /* makes sure icons active on rollover in links */ 23 | a { 24 | [class^="icon-"], 25 | [class*=" icon-"] { 26 | display: inline; 27 | } 28 | } 29 | 30 | /* increased font size for icon-large */ 31 | [class^="icon-"], 32 | [class*=" icon-"] { 33 | &.icon-fixed-width { 34 | display: inline-block; 35 | width: 16/14em; 36 | text-align: right; 37 | padding-right: 4/14em; 38 | &.icon-large { 39 | width: 20/14em; 40 | } 41 | } 42 | } 43 | 44 | .icons-ul { 45 | margin-left: @icons-li-width; 46 | list-style-type: none; 47 | 48 | > li { position: relative; } 49 | 50 | .icon-li { 51 | position: absolute; 52 | left: -@icons-li-width; 53 | width: @icons-li-width; 54 | text-align: center; 55 | line-height: inherit; 56 | } 57 | } 58 | 59 | // allows usage of the hide class directly on font awesome icons 60 | [class^="icon-"], 61 | [class*=" icon-"] { 62 | &.hide { 63 | display: none; 64 | } 65 | } 66 | 67 | .icon-muted { color: @iconMuted; } 68 | .icon-light { color: @iconLight; } 69 | .icon-dark { color: @iconDark; } 70 | 71 | // Icon Borders 72 | // ------------------------- 73 | 74 | .icon-border { 75 | border: solid 1px @borderColor; 76 | padding: .2em .25em .15em; 77 | .border-radius(3px); 78 | } 79 | 80 | // Icon Sizes 81 | // ------------------------- 82 | 83 | .icon-2x { 84 | font-size: 2em; 85 | &.icon-border { 86 | border-width: 2px; 87 | .border-radius(4px); 88 | } 89 | } 90 | .icon-3x { 91 | font-size: 3em; 92 | &.icon-border { 93 | border-width: 3px; 94 | .border-radius(5px); 95 | } 96 | } 97 | .icon-4x { 98 | font-size: 4em; 99 | &.icon-border { 100 | border-width: 4px; 101 | .border-radius(6px); 102 | } 103 | } 104 | 105 | .icon-5x { 106 | font-size: 5em; 107 | &.icon-border { 108 | border-width: 5px; 109 | .border-radius(7px); 110 | } 111 | } 112 | 113 | 114 | // Floats & Margins 115 | // ------------------------- 116 | 117 | // Quick floats 118 | .pull-right { float: right; } 119 | .pull-left { float: left; } 120 | 121 | [class^="icon-"], 122 | [class*=" icon-"] { 123 | &.pull-left { 124 | margin-right: .3em; 125 | } 126 | &.pull-right { 127 | margin-left: .3em; 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/less/extras.less: -------------------------------------------------------------------------------- 1 | /* EXTRAS 2 | * -------------------------- */ 3 | 4 | /* Stacked and layered icon */ 5 | .icon-stack(); 6 | 7 | /* Animated rotating icon */ 8 | .icon-spin { 9 | display: inline-block; 10 | -moz-animation: spin 2s infinite linear; 11 | -o-animation: spin 2s infinite linear; 12 | -webkit-animation: spin 2s infinite linear; 13 | animation: spin 2s infinite linear; 14 | } 15 | 16 | /* Prevent stack and spinners from being taken inline when inside a link */ 17 | a .icon-stack, 18 | a .icon-spin { 19 | display: inline-block; 20 | text-decoration: none; 21 | } 22 | 23 | @-moz-keyframes spin { 24 | 0% { -moz-transform: rotate(0deg); } 25 | 100% { -moz-transform: rotate(359deg); } 26 | } 27 | @-webkit-keyframes spin { 28 | 0% { -webkit-transform: rotate(0deg); } 29 | 100% { -webkit-transform: rotate(359deg); } 30 | } 31 | @-o-keyframes spin { 32 | 0% { -o-transform: rotate(0deg); } 33 | 100% { -o-transform: rotate(359deg); } 34 | } 35 | @-ms-keyframes spin { 36 | 0% { -ms-transform: rotate(0deg); } 37 | 100% { -ms-transform: rotate(359deg); } 38 | } 39 | @keyframes spin { 40 | 0% { transform: rotate(0deg); } 41 | 100% { transform: rotate(359deg); } 42 | } 43 | 44 | /* Icon rotations and mirroring */ 45 | .icon-rotate-90:before { 46 | -webkit-transform: rotate(90deg); 47 | -moz-transform: rotate(90deg); 48 | -ms-transform: rotate(90deg); 49 | -o-transform: rotate(90deg); 50 | transform: rotate(90deg); 51 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); 52 | } 53 | 54 | .icon-rotate-180:before { 55 | -webkit-transform: rotate(180deg); 56 | -moz-transform: rotate(180deg); 57 | -ms-transform: rotate(180deg); 58 | -o-transform: rotate(180deg); 59 | transform: rotate(180deg); 60 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); 61 | } 62 | 63 | .icon-rotate-270:before { 64 | -webkit-transform: rotate(270deg); 65 | -moz-transform: rotate(270deg); 66 | -ms-transform: rotate(270deg); 67 | -o-transform: rotate(270deg); 68 | transform: rotate(270deg); 69 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); 70 | } 71 | 72 | .icon-flip-horizontal:before { 73 | -webkit-transform: scale(-1, 1); 74 | -moz-transform: scale(-1, 1); 75 | -ms-transform: scale(-1, 1); 76 | -o-transform: scale(-1, 1); 77 | transform: scale(-1, 1); 78 | } 79 | 80 | .icon-flip-vertical:before { 81 | -webkit-transform: scale(1, -1); 82 | -moz-transform: scale(1, -1); 83 | -ms-transform: scale(1, -1); 84 | -o-transform: scale(1, -1); 85 | transform: scale(1, -1); 86 | } 87 | 88 | /* ensure rotation occurs inside anchor tags */ 89 | a { 90 | .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical { 91 | &:before { display: inline-block; } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 3.2.1 3 | * the iconic font designed for Bootstrap 4 | * ------------------------------------------------------------------------------ 5 | * The full suite of pictographic icons, examples, and documentation can be 6 | * found at http://fontawesome.io. Stay up to date on Twitter at 7 | * http://twitter.com/fontawesome. 8 | * 9 | * License 10 | * ------------------------------------------------------------------------------ 11 | * - The Font Awesome font is licensed under SIL OFL 1.1 - 12 | * http://scripts.sil.org/OFL 13 | * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - 14 | * http://opensource.org/licenses/mit-license.html 15 | * - Font Awesome documentation licensed under CC BY 3.0 - 16 | * http://creativecommons.org/licenses/by/3.0/ 17 | * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: 18 | * "Font Awesome by Dave Gandy - http://fontawesome.io" 19 | * 20 | * Author - Dave Gandy 21 | * ------------------------------------------------------------------------------ 22 | * Email: dave@fontawesome.io 23 | * Twitter: http://twitter.com/davegandy 24 | * Work: Lead Product Designer @ Kyruus - http://kyruus.com 25 | */ 26 | 27 | @import "variables.less"; 28 | @import "mixins.less"; 29 | @import "path.less"; 30 | @import "core.less"; 31 | @import "bootstrap.less"; 32 | @import "extras.less"; 33 | @import "icons.less"; 34 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/less/icons.less: -------------------------------------------------------------------------------- 1 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen 2 | readers do not read off random characters that represent icons */ 3 | 4 | .icon-glass:before { content: @glass; } 5 | .icon-music:before { content: @music; } 6 | .icon-search:before { content: @search; } 7 | .icon-envelope-alt:before { content: @envelope-alt; } 8 | .icon-heart:before { content: @heart; } 9 | .icon-star:before { content: @star; } 10 | .icon-star-empty:before { content: @star-empty; } 11 | .icon-user:before { content: @user; } 12 | .icon-film:before { content: @film; } 13 | .icon-th-large:before { content: @th-large; } 14 | .icon-th:before { content: @th; } 15 | .icon-th-list:before { content: @th-list; } 16 | .icon-ok:before { content: @ok; } 17 | .icon-remove:before { content: @remove; } 18 | .icon-zoom-in:before { content: @zoom-in; } 19 | .icon-zoom-out:before { content: @zoom-out; } 20 | .icon-power-off:before, 21 | .icon-off:before { content: @off; } 22 | .icon-signal:before { content: @signal; } 23 | .icon-gear:before, 24 | .icon-cog:before { content: @cog; } 25 | .icon-trash:before { content: @trash; } 26 | .icon-home:before { content: @home; } 27 | .icon-file-alt:before { content: @file-alt; } 28 | .icon-time:before { content: @time; } 29 | .icon-road:before { content: @road; } 30 | .icon-download-alt:before { content: @download-alt; } 31 | .icon-download:before { content: @download; } 32 | .icon-upload:before { content: @upload; } 33 | .icon-inbox:before { content: @inbox; } 34 | .icon-play-circle:before { content: @play-circle; } 35 | .icon-rotate-right:before, 36 | .icon-repeat:before { content: @repeat; } 37 | .icon-refresh:before { content: @refresh; } 38 | .icon-list-alt:before { content: @list-alt; } 39 | .icon-lock:before { content: @lock; } 40 | .icon-flag:before { content: @flag; } 41 | .icon-headphones:before { content: @headphones; } 42 | .icon-volume-off:before { content: @volume-off; } 43 | .icon-volume-down:before { content: @volume-down; } 44 | .icon-volume-up:before { content: @volume-up; } 45 | .icon-qrcode:before { content: @qrcode; } 46 | .icon-barcode:before { content: @barcode; } 47 | .icon-tag:before { content: @tag; } 48 | .icon-tags:before { content: @tags; } 49 | .icon-book:before { content: @book; } 50 | .icon-bookmark:before { content: @bookmark; } 51 | .icon-print:before { content: @print; } 52 | .icon-camera:before { content: @camera; } 53 | .icon-font:before { content: @font; } 54 | .icon-bold:before { content: @bold; } 55 | .icon-italic:before { content: @italic; } 56 | .icon-text-height:before { content: @text-height; } 57 | .icon-text-width:before { content: @text-width; } 58 | .icon-align-left:before { content: @align-left; } 59 | .icon-align-center:before { content: @align-center; } 60 | .icon-align-right:before { content: @align-right; } 61 | .icon-align-justify:before { content: @align-justify; } 62 | .icon-list:before { content: @list; } 63 | .icon-indent-left:before { content: @indent-left; } 64 | .icon-indent-right:before { content: @indent-right; } 65 | .icon-facetime-video:before { content: @facetime-video; } 66 | .icon-picture:before { content: @picture; } 67 | .icon-pencil:before { content: @pencil; } 68 | .icon-map-marker:before { content: @map-marker; } 69 | .icon-adjust:before { content: @adjust; } 70 | .icon-tint:before { content: @tint; } 71 | .icon-edit:before { content: @edit; } 72 | .icon-share:before { content: @share; } 73 | .icon-check:before { content: @check; } 74 | .icon-move:before { content: @move; } 75 | .icon-step-backward:before { content: @step-backward; } 76 | .icon-fast-backward:before { content: @fast-backward; } 77 | .icon-backward:before { content: @backward; } 78 | .icon-play:before { content: @play; } 79 | .icon-pause:before { content: @pause; } 80 | .icon-stop:before { content: @stop; } 81 | .icon-forward:before { content: @forward; } 82 | .icon-fast-forward:before { content: @fast-forward; } 83 | .icon-step-forward:before { content: @step-forward; } 84 | .icon-eject:before { content: @eject; } 85 | .icon-chevron-left:before { content: @chevron-left; } 86 | .icon-chevron-right:before { content: @chevron-right; } 87 | .icon-plus-sign:before { content: @plus-sign; } 88 | .icon-minus-sign:before { content: @minus-sign; } 89 | .icon-remove-sign:before { content: @remove-sign; } 90 | .icon-ok-sign:before { content: @ok-sign; } 91 | .icon-question-sign:before { content: @question-sign; } 92 | .icon-info-sign:before { content: @info-sign; } 93 | .icon-screenshot:before { content: @screenshot; } 94 | .icon-remove-circle:before { content: @remove-circle; } 95 | .icon-ok-circle:before { content: @ok-circle; } 96 | .icon-ban-circle:before { content: @ban-circle; } 97 | .icon-arrow-left:before { content: @arrow-left; } 98 | .icon-arrow-right:before { content: @arrow-right; } 99 | .icon-arrow-up:before { content: @arrow-up; } 100 | .icon-arrow-down:before { content: @arrow-down; } 101 | .icon-mail-forward:before, 102 | .icon-share-alt:before { content: @share-alt; } 103 | .icon-resize-full:before { content: @resize-full; } 104 | .icon-resize-small:before { content: @resize-small; } 105 | .icon-plus:before { content: @plus; } 106 | .icon-minus:before { content: @minus; } 107 | .icon-asterisk:before { content: @asterisk; } 108 | .icon-exclamation-sign:before { content: @exclamation-sign; } 109 | .icon-gift:before { content: @gift; } 110 | .icon-leaf:before { content: @leaf; } 111 | .icon-fire:before { content: @fire; } 112 | .icon-eye-open:before { content: @eye-open; } 113 | .icon-eye-close:before { content: @eye-close; } 114 | .icon-warning-sign:before { content: @warning-sign; } 115 | .icon-plane:before { content: @plane; } 116 | .icon-calendar:before { content: @calendar; } 117 | .icon-random:before { content: @random; } 118 | .icon-comment:before { content: @comment; } 119 | .icon-magnet:before { content: @magnet; } 120 | .icon-chevron-up:before { content: @chevron-up; } 121 | .icon-chevron-down:before { content: @chevron-down; } 122 | .icon-retweet:before { content: @retweet; } 123 | .icon-shopping-cart:before { content: @shopping-cart; } 124 | .icon-folder-close:before { content: @folder-close; } 125 | .icon-folder-open:before { content: @folder-open; } 126 | .icon-resize-vertical:before { content: @resize-vertical; } 127 | .icon-resize-horizontal:before { content: @resize-horizontal; } 128 | .icon-bar-chart:before { content: @bar-chart; } 129 | .icon-twitter-sign:before { content: @twitter-sign; } 130 | .icon-facebook-sign:before { content: @facebook-sign; } 131 | .icon-camera-retro:before { content: @camera-retro; } 132 | .icon-key:before { content: @key; } 133 | .icon-gears:before, 134 | .icon-cogs:before { content: @cogs; } 135 | .icon-comments:before { content: @comments; } 136 | .icon-thumbs-up-alt:before { content: @thumbs-up-alt; } 137 | .icon-thumbs-down-alt:before { content: @thumbs-down-alt; } 138 | .icon-star-half:before { content: @star-half; } 139 | .icon-heart-empty:before { content: @heart-empty; } 140 | .icon-signout:before { content: @signout; } 141 | .icon-linkedin-sign:before { content: @linkedin-sign; } 142 | .icon-pushpin:before { content: @pushpin; } 143 | .icon-external-link:before { content: @external-link; } 144 | .icon-signin:before { content: @signin; } 145 | .icon-trophy:before { content: @trophy; } 146 | .icon-github-sign:before { content: @github-sign; } 147 | .icon-upload-alt:before { content: @upload-alt; } 148 | .icon-lemon:before { content: @lemon; } 149 | .icon-phone:before { content: @phone; } 150 | .icon-unchecked:before, 151 | .icon-check-empty:before { content: @check-empty; } 152 | .icon-bookmark-empty:before { content: @bookmark-empty; } 153 | .icon-phone-sign:before { content: @phone-sign; } 154 | .icon-twitter:before { content: @twitter; } 155 | .icon-facebook:before { content: @facebook; } 156 | .icon-github:before { content: @github; } 157 | .icon-unlock:before { content: @unlock; } 158 | .icon-credit-card:before { content: @credit-card; } 159 | .icon-rss:before { content: @rss; } 160 | .icon-hdd:before { content: @hdd; } 161 | .icon-bullhorn:before { content: @bullhorn; } 162 | .icon-bell:before { content: @bell; } 163 | .icon-certificate:before { content: @certificate; } 164 | .icon-hand-right:before { content: @hand-right; } 165 | .icon-hand-left:before { content: @hand-left; } 166 | .icon-hand-up:before { content: @hand-up; } 167 | .icon-hand-down:before { content: @hand-down; } 168 | .icon-circle-arrow-left:before { content: @circle-arrow-left; } 169 | .icon-circle-arrow-right:before { content: @circle-arrow-right; } 170 | .icon-circle-arrow-up:before { content: @circle-arrow-up; } 171 | .icon-circle-arrow-down:before { content: @circle-arrow-down; } 172 | .icon-globe:before { content: @globe; } 173 | .icon-wrench:before { content: @wrench; } 174 | .icon-tasks:before { content: @tasks; } 175 | .icon-filter:before { content: @filter; } 176 | .icon-briefcase:before { content: @briefcase; } 177 | .icon-fullscreen:before { content: @fullscreen; } 178 | .icon-group:before { content: @group; } 179 | .icon-link:before { content: @link; } 180 | .icon-cloud:before { content: @cloud; } 181 | .icon-beaker:before { content: @beaker; } 182 | .icon-cut:before { content: @cut; } 183 | .icon-copy:before { content: @copy; } 184 | .icon-paperclip:before, 185 | .icon-paper-clip:before { content: @paper-clip; } 186 | .icon-save:before { content: @save; } 187 | .icon-sign-blank:before { content: @sign-blank; } 188 | .icon-reorder:before { content: @reorder; } 189 | .icon-list-ul:before { content: @list-ul; } 190 | .icon-list-ol:before { content: @list-ol; } 191 | .icon-strikethrough:before { content: @strikethrough; } 192 | .icon-underline:before { content: @underline; } 193 | .icon-table:before { content: @table; } 194 | .icon-magic:before { content: @magic; } 195 | .icon-truck:before { content: @truck; } 196 | .icon-pinterest:before { content: @pinterest; } 197 | .icon-pinterest-sign:before { content: @pinterest-sign; } 198 | .icon-google-plus-sign:before { content: @google-plus-sign; } 199 | .icon-google-plus:before { content: @google-plus; } 200 | .icon-money:before { content: @money; } 201 | .icon-caret-down:before { content: @caret-down; } 202 | .icon-caret-up:before { content: @caret-up; } 203 | .icon-caret-left:before { content: @caret-left; } 204 | .icon-caret-right:before { content: @caret-right; } 205 | .icon-columns:before { content: @columns; } 206 | .icon-sort:before { content: @sort; } 207 | .icon-sort-down:before { content: @sort-down; } 208 | .icon-sort-up:before { content: @sort-up; } 209 | .icon-envelope:before { content: @envelope; } 210 | .icon-linkedin:before { content: @linkedin; } 211 | .icon-rotate-left:before, 212 | .icon-undo:before { content: @undo; } 213 | .icon-legal:before { content: @legal; } 214 | .icon-dashboard:before { content: @dashboard; } 215 | .icon-comment-alt:before { content: @comment-alt; } 216 | .icon-comments-alt:before { content: @comments-alt; } 217 | .icon-bolt:before { content: @bolt; } 218 | .icon-sitemap:before { content: @sitemap; } 219 | .icon-umbrella:before { content: @umbrella; } 220 | .icon-paste:before { content: @paste; } 221 | .icon-lightbulb:before { content: @lightbulb; } 222 | .icon-exchange:before { content: @exchange; } 223 | .icon-cloud-download:before { content: @cloud-download; } 224 | .icon-cloud-upload:before { content: @cloud-upload; } 225 | .icon-user-md:before { content: @user-md; } 226 | .icon-stethoscope:before { content: @stethoscope; } 227 | .icon-suitcase:before { content: @suitcase; } 228 | .icon-bell-alt:before { content: @bell-alt; } 229 | .icon-coffee:before { content: @coffee; } 230 | .icon-food:before { content: @food; } 231 | .icon-file-text-alt:before { content: @file-text-alt; } 232 | .icon-building:before { content: @building; } 233 | .icon-hospital:before { content: @hospital; } 234 | .icon-ambulance:before { content: @ambulance; } 235 | .icon-medkit:before { content: @medkit; } 236 | .icon-fighter-jet:before { content: @fighter-jet; } 237 | .icon-beer:before { content: @beer; } 238 | .icon-h-sign:before { content: @h-sign; } 239 | .icon-plus-sign-alt:before { content: @plus-sign-alt; } 240 | .icon-double-angle-left:before { content: @double-angle-left; } 241 | .icon-double-angle-right:before { content: @double-angle-right; } 242 | .icon-double-angle-up:before { content: @double-angle-up; } 243 | .icon-double-angle-down:before { content: @double-angle-down; } 244 | .icon-angle-left:before { content: @angle-left; } 245 | .icon-angle-right:before { content: @angle-right; } 246 | .icon-angle-up:before { content: @angle-up; } 247 | .icon-angle-down:before { content: @angle-down; } 248 | .icon-desktop:before { content: @desktop; } 249 | .icon-laptop:before { content: @laptop; } 250 | .icon-tablet:before { content: @tablet; } 251 | .icon-mobile-phone:before { content: @mobile-phone; } 252 | .icon-circle-blank:before { content: @circle-blank; } 253 | .icon-quote-left:before { content: @quote-left; } 254 | .icon-quote-right:before { content: @quote-right; } 255 | .icon-spinner:before { content: @spinner; } 256 | .icon-circle:before { content: @circle; } 257 | .icon-mail-reply:before, 258 | .icon-reply:before { content: @reply; } 259 | .icon-github-alt:before { content: @github-alt; } 260 | .icon-folder-close-alt:before { content: @folder-close-alt; } 261 | .icon-folder-open-alt:before { content: @folder-open-alt; } 262 | .icon-expand-alt:before { content: @expand-alt; } 263 | .icon-collapse-alt:before { content: @collapse-alt; } 264 | .icon-smile:before { content: @smile; } 265 | .icon-frown:before { content: @frown; } 266 | .icon-meh:before { content: @meh; } 267 | .icon-gamepad:before { content: @gamepad; } 268 | .icon-keyboard:before { content: @keyboard; } 269 | .icon-flag-alt:before { content: @flag-alt; } 270 | .icon-flag-checkered:before { content: @flag-checkered; } 271 | .icon-terminal:before { content: @terminal; } 272 | .icon-code:before { content: @code; } 273 | .icon-reply-all:before { content: @reply-all; } 274 | .icon-mail-reply-all:before { content: @mail-reply-all; } 275 | .icon-star-half-full:before, 276 | .icon-star-half-empty:before { content: @star-half-empty; } 277 | .icon-location-arrow:before { content: @location-arrow; } 278 | .icon-crop:before { content: @crop; } 279 | .icon-code-fork:before { content: @code-fork; } 280 | .icon-unlink:before { content: @unlink; } 281 | .icon-question:before { content: @question; } 282 | .icon-info:before { content: @info; } 283 | .icon-exclamation:before { content: @exclamation; } 284 | .icon-superscript:before { content: @superscript; } 285 | .icon-subscript:before { content: @subscript; } 286 | .icon-eraser:before { content: @eraser; } 287 | .icon-puzzle-piece:before { content: @puzzle-piece; } 288 | .icon-microphone:before { content: @microphone; } 289 | .icon-microphone-off:before { content: @microphone-off; } 290 | .icon-shield:before { content: @shield; } 291 | .icon-calendar-empty:before { content: @calendar-empty; } 292 | .icon-fire-extinguisher:before { content: @fire-extinguisher; } 293 | .icon-rocket:before { content: @rocket; } 294 | .icon-maxcdn:before { content: @maxcdn; } 295 | .icon-chevron-sign-left:before { content: @chevron-sign-left; } 296 | .icon-chevron-sign-right:before { content: @chevron-sign-right; } 297 | .icon-chevron-sign-up:before { content: @chevron-sign-up; } 298 | .icon-chevron-sign-down:before { content: @chevron-sign-down; } 299 | .icon-html5:before { content: @html5; } 300 | .icon-css3:before { content: @css3; } 301 | .icon-anchor:before { content: @anchor; } 302 | .icon-unlock-alt:before { content: @unlock-alt; } 303 | .icon-bullseye:before { content: @bullseye; } 304 | .icon-ellipsis-horizontal:before { content: @ellipsis-horizontal; } 305 | .icon-ellipsis-vertical:before { content: @ellipsis-vertical; } 306 | .icon-rss-sign:before { content: @rss-sign; } 307 | .icon-play-sign:before { content: @play-sign; } 308 | .icon-ticket:before { content: @ticket; } 309 | .icon-minus-sign-alt:before { content: @minus-sign-alt; } 310 | .icon-check-minus:before { content: @check-minus; } 311 | .icon-level-up:before { content: @level-up; } 312 | .icon-level-down:before { content: @level-down; } 313 | .icon-check-sign:before { content: @check-sign; } 314 | .icon-edit-sign:before { content: @edit-sign; } 315 | .icon-external-link-sign:before { content: @external-link-sign; } 316 | .icon-share-sign:before { content: @share-sign; } 317 | .icon-compass:before { content: @compass; } 318 | .icon-collapse:before { content: @collapse; } 319 | .icon-collapse-top:before { content: @collapse-top; } 320 | .icon-expand:before { content: @expand; } 321 | .icon-euro:before, 322 | .icon-eur:before { content: @eur; } 323 | .icon-gbp:before { content: @gbp; } 324 | .icon-dollar:before, 325 | .icon-usd:before { content: @usd; } 326 | .icon-rupee:before, 327 | .icon-inr:before { content: @inr; } 328 | .icon-yen:before, 329 | .icon-jpy:before { content: @jpy; } 330 | .icon-renminbi:before, 331 | .icon-cny:before { content: @cny; } 332 | .icon-won:before, 333 | .icon-krw:before { content: @krw; } 334 | .icon-bitcoin:before, 335 | .icon-btc:before { content: @btc; } 336 | .icon-file:before { content: @file; } 337 | .icon-file-text:before { content: @file-text; } 338 | .icon-sort-by-alphabet:before { content: @sort-by-alphabet; } 339 | .icon-sort-by-alphabet-alt:before { content: @sort-by-alphabet-alt; } 340 | .icon-sort-by-attributes:before { content: @sort-by-attributes; } 341 | .icon-sort-by-attributes-alt:before { content: @sort-by-attributes-alt; } 342 | .icon-sort-by-order:before { content: @sort-by-order; } 343 | .icon-sort-by-order-alt:before { content: @sort-by-order-alt; } 344 | .icon-thumbs-up:before { content: @thumbs-up; } 345 | .icon-thumbs-down:before { content: @thumbs-down; } 346 | .icon-youtube-sign:before { content: @youtube-sign; } 347 | .icon-youtube:before { content: @youtube; } 348 | .icon-xing:before { content: @xing; } 349 | .icon-xing-sign:before { content: @xing-sign; } 350 | .icon-youtube-play:before { content: @youtube-play; } 351 | .icon-dropbox:before { content: @dropbox; } 352 | .icon-stackexchange:before { content: @stackexchange; } 353 | .icon-instagram:before { content: @instagram; } 354 | .icon-flickr:before { content: @flickr; } 355 | .icon-adn:before { content: @adn; } 356 | .icon-bitbucket:before { content: @bitbucket; } 357 | .icon-bitbucket-sign:before { content: @bitbucket-sign; } 358 | .icon-tumblr:before { content: @tumblr; } 359 | .icon-tumblr-sign:before { content: @tumblr-sign; } 360 | .icon-long-arrow-down:before { content: @long-arrow-down; } 361 | .icon-long-arrow-up:before { content: @long-arrow-up; } 362 | .icon-long-arrow-left:before { content: @long-arrow-left; } 363 | .icon-long-arrow-right:before { content: @long-arrow-right; } 364 | .icon-apple:before { content: @apple; } 365 | .icon-windows:before { content: @windows; } 366 | .icon-android:before { content: @android; } 367 | .icon-linux:before { content: @linux; } 368 | .icon-dribbble:before { content: @dribbble; } 369 | .icon-skype:before { content: @skype; } 370 | .icon-foursquare:before { content: @foursquare; } 371 | .icon-trello:before { content: @trello; } 372 | .icon-female:before { content: @female; } 373 | .icon-male:before { content: @male; } 374 | .icon-gittip:before { content: @gittip; } 375 | .icon-sun:before { content: @sun; } 376 | .icon-moon:before { content: @moon; } 377 | .icon-archive:before { content: @archive; } 378 | .icon-bug:before { content: @bug; } 379 | .icon-vk:before { content: @vk; } 380 | .icon-weibo:before { content: @weibo; } 381 | .icon-renren:before { content: @renren; } 382 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .icon(@icon) { 5 | .icon-FontAwesome(); 6 | content: @icon; 7 | } 8 | 9 | .icon-FontAwesome() { 10 | font-family: FontAwesome; 11 | font-weight: normal; 12 | font-style: normal; 13 | text-decoration: inherit; 14 | -webkit-font-smoothing: antialiased; 15 | *margin-right: .3em; // fixes ie7 issues 16 | } 17 | 18 | .border-radius(@radius) { 19 | -webkit-border-radius: @radius; 20 | -moz-border-radius: @radius; 21 | border-radius: @radius; 22 | } 23 | 24 | .icon-stack(@width: 2em, @height: 2em, @top-font-size: 1em, @base-font-size: 2em) { 25 | .icon-stack { 26 | position: relative; 27 | display: inline-block; 28 | width: @width; 29 | height: @height; 30 | line-height: @width; 31 | vertical-align: -35%; 32 | [class^="icon-"], 33 | [class*=" icon-"] { 34 | display: block; 35 | text-align: center; 36 | position: absolute; 37 | width: 100%; 38 | height: 100%; 39 | font-size: @top-font-size; 40 | line-height: inherit; 41 | *line-height: @height; 42 | } 43 | .icon-stack-base { 44 | font-size: @base-font-size; 45 | *line-height: @height / @base-font-size; 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{FontAwesomePath}/fontawesome-webfont.eot?v=@{FontAwesomeVersion}'); 7 | src: url('@{FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=@{FontAwesomeVersion}') format('embedded-opentype'), 8 | url('@{FontAwesomePath}/fontawesome-webfont.woff?v=@{FontAwesomeVersion}') format('woff'), 9 | url('@{FontAwesomePath}/fontawesome-webfont.ttf?v=@{FontAwesomeVersion}') format('truetype'), 10 | url('@{FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=@{FontAwesomeVersion}') format('svg'); 11 | // src: url('@{FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/less/variables.less: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | @FontAwesomePath: "../font"; 5 | //@FontAwesomePath: "//netdna.bootstrapcdn.com/font-awesome/3.2.1/font"; // for referencing Bootstrap CDN font files directly 6 | @FontAwesomeVersion: "3.2.1"; 7 | @borderColor: #eee; 8 | @iconMuted: #eee; 9 | @iconLight: #fff; 10 | @iconDark: #333; 11 | @icons-li-width: 30/14em; 12 | 13 | 14 | @glass: "\f000"; 15 | 16 | @music: "\f001"; 17 | 18 | @search: "\f002"; 19 | 20 | @envelope-alt: "\f003"; 21 | 22 | @heart: "\f004"; 23 | 24 | @star: "\f005"; 25 | 26 | @star-empty: "\f006"; 27 | 28 | @user: "\f007"; 29 | 30 | @film: "\f008"; 31 | 32 | @th-large: "\f009"; 33 | 34 | @th: "\f00a"; 35 | 36 | @th-list: "\f00b"; 37 | 38 | @ok: "\f00c"; 39 | 40 | @remove: "\f00d"; 41 | 42 | @zoom-in: "\f00e"; 43 | 44 | @zoom-out: "\f010"; 45 | 46 | @off: "\f011"; 47 | 48 | @signal: "\f012"; 49 | 50 | @cog: "\f013"; 51 | 52 | @trash: "\f014"; 53 | 54 | @home: "\f015"; 55 | 56 | @file-alt: "\f016"; 57 | 58 | @time: "\f017"; 59 | 60 | @road: "\f018"; 61 | 62 | @download-alt: "\f019"; 63 | 64 | @download: "\f01a"; 65 | 66 | @upload: "\f01b"; 67 | 68 | @inbox: "\f01c"; 69 | 70 | @play-circle: "\f01d"; 71 | 72 | @repeat: "\f01e"; 73 | 74 | @refresh: "\f021"; 75 | 76 | @list-alt: "\f022"; 77 | 78 | @lock: "\f023"; 79 | 80 | @flag: "\f024"; 81 | 82 | @headphones: "\f025"; 83 | 84 | @volume-off: "\f026"; 85 | 86 | @volume-down: "\f027"; 87 | 88 | @volume-up: "\f028"; 89 | 90 | @qrcode: "\f029"; 91 | 92 | @barcode: "\f02a"; 93 | 94 | @tag: "\f02b"; 95 | 96 | @tags: "\f02c"; 97 | 98 | @book: "\f02d"; 99 | 100 | @bookmark: "\f02e"; 101 | 102 | @print: "\f02f"; 103 | 104 | @camera: "\f030"; 105 | 106 | @font: "\f031"; 107 | 108 | @bold: "\f032"; 109 | 110 | @italic: "\f033"; 111 | 112 | @text-height: "\f034"; 113 | 114 | @text-width: "\f035"; 115 | 116 | @align-left: "\f036"; 117 | 118 | @align-center: "\f037"; 119 | 120 | @align-right: "\f038"; 121 | 122 | @align-justify: "\f039"; 123 | 124 | @list: "\f03a"; 125 | 126 | @indent-left: "\f03b"; 127 | 128 | @indent-right: "\f03c"; 129 | 130 | @facetime-video: "\f03d"; 131 | 132 | @picture: "\f03e"; 133 | 134 | @pencil: "\f040"; 135 | 136 | @map-marker: "\f041"; 137 | 138 | @adjust: "\f042"; 139 | 140 | @tint: "\f043"; 141 | 142 | @edit: "\f044"; 143 | 144 | @share: "\f045"; 145 | 146 | @check: "\f046"; 147 | 148 | @move: "\f047"; 149 | 150 | @step-backward: "\f048"; 151 | 152 | @fast-backward: "\f049"; 153 | 154 | @backward: "\f04a"; 155 | 156 | @play: "\f04b"; 157 | 158 | @pause: "\f04c"; 159 | 160 | @stop: "\f04d"; 161 | 162 | @forward: "\f04e"; 163 | 164 | @fast-forward: "\f050"; 165 | 166 | @step-forward: "\f051"; 167 | 168 | @eject: "\f052"; 169 | 170 | @chevron-left: "\f053"; 171 | 172 | @chevron-right: "\f054"; 173 | 174 | @plus-sign: "\f055"; 175 | 176 | @minus-sign: "\f056"; 177 | 178 | @remove-sign: "\f057"; 179 | 180 | @ok-sign: "\f058"; 181 | 182 | @question-sign: "\f059"; 183 | 184 | @info-sign: "\f05a"; 185 | 186 | @screenshot: "\f05b"; 187 | 188 | @remove-circle: "\f05c"; 189 | 190 | @ok-circle: "\f05d"; 191 | 192 | @ban-circle: "\f05e"; 193 | 194 | @arrow-left: "\f060"; 195 | 196 | @arrow-right: "\f061"; 197 | 198 | @arrow-up: "\f062"; 199 | 200 | @arrow-down: "\f063"; 201 | 202 | @share-alt: "\f064"; 203 | 204 | @resize-full: "\f065"; 205 | 206 | @resize-small: "\f066"; 207 | 208 | @plus: "\f067"; 209 | 210 | @minus: "\f068"; 211 | 212 | @asterisk: "\f069"; 213 | 214 | @exclamation-sign: "\f06a"; 215 | 216 | @gift: "\f06b"; 217 | 218 | @leaf: "\f06c"; 219 | 220 | @fire: "\f06d"; 221 | 222 | @eye-open: "\f06e"; 223 | 224 | @eye-close: "\f070"; 225 | 226 | @warning-sign: "\f071"; 227 | 228 | @plane: "\f072"; 229 | 230 | @calendar: "\f073"; 231 | 232 | @random: "\f074"; 233 | 234 | @comment: "\f075"; 235 | 236 | @magnet: "\f076"; 237 | 238 | @chevron-up: "\f077"; 239 | 240 | @chevron-down: "\f078"; 241 | 242 | @retweet: "\f079"; 243 | 244 | @shopping-cart: "\f07a"; 245 | 246 | @folder-close: "\f07b"; 247 | 248 | @folder-open: "\f07c"; 249 | 250 | @resize-vertical: "\f07d"; 251 | 252 | @resize-horizontal: "\f07e"; 253 | 254 | @bar-chart: "\f080"; 255 | 256 | @twitter-sign: "\f081"; 257 | 258 | @facebook-sign: "\f082"; 259 | 260 | @camera-retro: "\f083"; 261 | 262 | @key: "\f084"; 263 | 264 | @cogs: "\f085"; 265 | 266 | @comments: "\f086"; 267 | 268 | @thumbs-up-alt: "\f087"; 269 | 270 | @thumbs-down-alt: "\f088"; 271 | 272 | @star-half: "\f089"; 273 | 274 | @heart-empty: "\f08a"; 275 | 276 | @signout: "\f08b"; 277 | 278 | @linkedin-sign: "\f08c"; 279 | 280 | @pushpin: "\f08d"; 281 | 282 | @external-link: "\f08e"; 283 | 284 | @signin: "\f090"; 285 | 286 | @trophy: "\f091"; 287 | 288 | @github-sign: "\f092"; 289 | 290 | @upload-alt: "\f093"; 291 | 292 | @lemon: "\f094"; 293 | 294 | @phone: "\f095"; 295 | 296 | @check-empty: "\f096"; 297 | 298 | @bookmark-empty: "\f097"; 299 | 300 | @phone-sign: "\f098"; 301 | 302 | @twitter: "\f099"; 303 | 304 | @facebook: "\f09a"; 305 | 306 | @github: "\f09b"; 307 | 308 | @unlock: "\f09c"; 309 | 310 | @credit-card: "\f09d"; 311 | 312 | @rss: "\f09e"; 313 | 314 | @hdd: "\f0a0"; 315 | 316 | @bullhorn: "\f0a1"; 317 | 318 | @bell: "\f0a2"; 319 | 320 | @certificate: "\f0a3"; 321 | 322 | @hand-right: "\f0a4"; 323 | 324 | @hand-left: "\f0a5"; 325 | 326 | @hand-up: "\f0a6"; 327 | 328 | @hand-down: "\f0a7"; 329 | 330 | @circle-arrow-left: "\f0a8"; 331 | 332 | @circle-arrow-right: "\f0a9"; 333 | 334 | @circle-arrow-up: "\f0aa"; 335 | 336 | @circle-arrow-down: "\f0ab"; 337 | 338 | @globe: "\f0ac"; 339 | 340 | @wrench: "\f0ad"; 341 | 342 | @tasks: "\f0ae"; 343 | 344 | @filter: "\f0b0"; 345 | 346 | @briefcase: "\f0b1"; 347 | 348 | @fullscreen: "\f0b2"; 349 | 350 | @group: "\f0c0"; 351 | 352 | @link: "\f0c1"; 353 | 354 | @cloud: "\f0c2"; 355 | 356 | @beaker: "\f0c3"; 357 | 358 | @cut: "\f0c4"; 359 | 360 | @copy: "\f0c5"; 361 | 362 | @paper-clip: "\f0c6"; 363 | 364 | @save: "\f0c7"; 365 | 366 | @sign-blank: "\f0c8"; 367 | 368 | @reorder: "\f0c9"; 369 | 370 | @list-ul: "\f0ca"; 371 | 372 | @list-ol: "\f0cb"; 373 | 374 | @strikethrough: "\f0cc"; 375 | 376 | @underline: "\f0cd"; 377 | 378 | @table: "\f0ce"; 379 | 380 | @magic: "\f0d0"; 381 | 382 | @truck: "\f0d1"; 383 | 384 | @pinterest: "\f0d2"; 385 | 386 | @pinterest-sign: "\f0d3"; 387 | 388 | @google-plus-sign: "\f0d4"; 389 | 390 | @google-plus: "\f0d5"; 391 | 392 | @money: "\f0d6"; 393 | 394 | @caret-down: "\f0d7"; 395 | 396 | @caret-up: "\f0d8"; 397 | 398 | @caret-left: "\f0d9"; 399 | 400 | @caret-right: "\f0da"; 401 | 402 | @columns: "\f0db"; 403 | 404 | @sort: "\f0dc"; 405 | 406 | @sort-down: "\f0dd"; 407 | 408 | @sort-up: "\f0de"; 409 | 410 | @envelope: "\f0e0"; 411 | 412 | @linkedin: "\f0e1"; 413 | 414 | @undo: "\f0e2"; 415 | 416 | @legal: "\f0e3"; 417 | 418 | @dashboard: "\f0e4"; 419 | 420 | @comment-alt: "\f0e5"; 421 | 422 | @comments-alt: "\f0e6"; 423 | 424 | @bolt: "\f0e7"; 425 | 426 | @sitemap: "\f0e8"; 427 | 428 | @umbrella: "\f0e9"; 429 | 430 | @paste: "\f0ea"; 431 | 432 | @lightbulb: "\f0eb"; 433 | 434 | @exchange: "\f0ec"; 435 | 436 | @cloud-download: "\f0ed"; 437 | 438 | @cloud-upload: "\f0ee"; 439 | 440 | @user-md: "\f0f0"; 441 | 442 | @stethoscope: "\f0f1"; 443 | 444 | @suitcase: "\f0f2"; 445 | 446 | @bell-alt: "\f0f3"; 447 | 448 | @coffee: "\f0f4"; 449 | 450 | @food: "\f0f5"; 451 | 452 | @file-text-alt: "\f0f6"; 453 | 454 | @building: "\f0f7"; 455 | 456 | @hospital: "\f0f8"; 457 | 458 | @ambulance: "\f0f9"; 459 | 460 | @medkit: "\f0fa"; 461 | 462 | @fighter-jet: "\f0fb"; 463 | 464 | @beer: "\f0fc"; 465 | 466 | @h-sign: "\f0fd"; 467 | 468 | @plus-sign-alt: "\f0fe"; 469 | 470 | @double-angle-left: "\f100"; 471 | 472 | @double-angle-right: "\f101"; 473 | 474 | @double-angle-up: "\f102"; 475 | 476 | @double-angle-down: "\f103"; 477 | 478 | @angle-left: "\f104"; 479 | 480 | @angle-right: "\f105"; 481 | 482 | @angle-up: "\f106"; 483 | 484 | @angle-down: "\f107"; 485 | 486 | @desktop: "\f108"; 487 | 488 | @laptop: "\f109"; 489 | 490 | @tablet: "\f10a"; 491 | 492 | @mobile-phone: "\f10b"; 493 | 494 | @circle-blank: "\f10c"; 495 | 496 | @quote-left: "\f10d"; 497 | 498 | @quote-right: "\f10e"; 499 | 500 | @spinner: "\f110"; 501 | 502 | @circle: "\f111"; 503 | 504 | @reply: "\f112"; 505 | 506 | @github-alt: "\f113"; 507 | 508 | @folder-close-alt: "\f114"; 509 | 510 | @folder-open-alt: "\f115"; 511 | 512 | @expand-alt: "\f116"; 513 | 514 | @collapse-alt: "\f117"; 515 | 516 | @smile: "\f118"; 517 | 518 | @frown: "\f119"; 519 | 520 | @meh: "\f11a"; 521 | 522 | @gamepad: "\f11b"; 523 | 524 | @keyboard: "\f11c"; 525 | 526 | @flag-alt: "\f11d"; 527 | 528 | @flag-checkered: "\f11e"; 529 | 530 | @terminal: "\f120"; 531 | 532 | @code: "\f121"; 533 | 534 | @reply-all: "\f122"; 535 | 536 | @mail-reply-all: "\f122"; 537 | 538 | @star-half-empty: "\f123"; 539 | 540 | @location-arrow: "\f124"; 541 | 542 | @crop: "\f125"; 543 | 544 | @code-fork: "\f126"; 545 | 546 | @unlink: "\f127"; 547 | 548 | @question: "\f128"; 549 | 550 | @info: "\f129"; 551 | 552 | @exclamation: "\f12a"; 553 | 554 | @superscript: "\f12b"; 555 | 556 | @subscript: "\f12c"; 557 | 558 | @eraser: "\f12d"; 559 | 560 | @puzzle-piece: "\f12e"; 561 | 562 | @microphone: "\f130"; 563 | 564 | @microphone-off: "\f131"; 565 | 566 | @shield: "\f132"; 567 | 568 | @calendar-empty: "\f133"; 569 | 570 | @fire-extinguisher: "\f134"; 571 | 572 | @rocket: "\f135"; 573 | 574 | @maxcdn: "\f136"; 575 | 576 | @chevron-sign-left: "\f137"; 577 | 578 | @chevron-sign-right: "\f138"; 579 | 580 | @chevron-sign-up: "\f139"; 581 | 582 | @chevron-sign-down: "\f13a"; 583 | 584 | @html5: "\f13b"; 585 | 586 | @css3: "\f13c"; 587 | 588 | @anchor: "\f13d"; 589 | 590 | @unlock-alt: "\f13e"; 591 | 592 | @bullseye: "\f140"; 593 | 594 | @ellipsis-horizontal: "\f141"; 595 | 596 | @ellipsis-vertical: "\f142"; 597 | 598 | @rss-sign: "\f143"; 599 | 600 | @play-sign: "\f144"; 601 | 602 | @ticket: "\f145"; 603 | 604 | @minus-sign-alt: "\f146"; 605 | 606 | @check-minus: "\f147"; 607 | 608 | @level-up: "\f148"; 609 | 610 | @level-down: "\f149"; 611 | 612 | @check-sign: "\f14a"; 613 | 614 | @edit-sign: "\f14b"; 615 | 616 | @external-link-sign: "\f14c"; 617 | 618 | @share-sign: "\f14d"; 619 | 620 | @compass: "\f14e"; 621 | 622 | @collapse: "\f150"; 623 | 624 | @collapse-top: "\f151"; 625 | 626 | @expand: "\f152"; 627 | 628 | @eur: "\f153"; 629 | 630 | @gbp: "\f154"; 631 | 632 | @usd: "\f155"; 633 | 634 | @inr: "\f156"; 635 | 636 | @jpy: "\f157"; 637 | 638 | @cny: "\f158"; 639 | 640 | @krw: "\f159"; 641 | 642 | @btc: "\f15a"; 643 | 644 | @file: "\f15b"; 645 | 646 | @file-text: "\f15c"; 647 | 648 | @sort-by-alphabet: "\f15d"; 649 | 650 | @sort-by-alphabet-alt: "\f15e"; 651 | 652 | @sort-by-attributes: "\f160"; 653 | 654 | @sort-by-attributes-alt: "\f161"; 655 | 656 | @sort-by-order: "\f162"; 657 | 658 | @sort-by-order-alt: "\f163"; 659 | 660 | @thumbs-up: "\f164"; 661 | 662 | @thumbs-down: "\f165"; 663 | 664 | @youtube-sign: "\f166"; 665 | 666 | @youtube: "\f167"; 667 | 668 | @xing: "\f168"; 669 | 670 | @xing-sign: "\f169"; 671 | 672 | @youtube-play: "\f16a"; 673 | 674 | @dropbox: "\f16b"; 675 | 676 | @stackexchange: "\f16c"; 677 | 678 | @instagram: "\f16d"; 679 | 680 | @flickr: "\f16e"; 681 | 682 | @adn: "\f170"; 683 | 684 | @bitbucket: "\f171"; 685 | 686 | @bitbucket-sign: "\f172"; 687 | 688 | @tumblr: "\f173"; 689 | 690 | @tumblr-sign: "\f174"; 691 | 692 | @long-arrow-down: "\f175"; 693 | 694 | @long-arrow-up: "\f176"; 695 | 696 | @long-arrow-left: "\f177"; 697 | 698 | @long-arrow-right: "\f178"; 699 | 700 | @apple: "\f179"; 701 | 702 | @windows: "\f17a"; 703 | 704 | @android: "\f17b"; 705 | 706 | @linux: "\f17c"; 707 | 708 | @dribbble: "\f17d"; 709 | 710 | @skype: "\f17e"; 711 | 712 | @foursquare: "\f180"; 713 | 714 | @trello: "\f181"; 715 | 716 | @female: "\f182"; 717 | 718 | @male: "\f183"; 719 | 720 | @gittip: "\f184"; 721 | 722 | @sun: "\f185"; 723 | 724 | @moon: "\f186"; 725 | 726 | @archive: "\f187"; 727 | 728 | @bug: "\f188"; 729 | 730 | @vk: "\f189"; 731 | 732 | @weibo: "\f18a"; 733 | 734 | @renren: "\f18b"; 735 | 736 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/scss/_bootstrap.scss: -------------------------------------------------------------------------------- 1 | /* BOOTSTRAP SPECIFIC CLASSES 2 | * -------------------------- */ 3 | 4 | /* Bootstrap 2.0 sprites.less reset */ 5 | [class^="icon-"], 6 | [class*=" icon-"] { 7 | display: inline; 8 | width: auto; 9 | height: auto; 10 | line-height: normal; 11 | vertical-align: baseline; 12 | background-image: none; 13 | background-position: 0% 0%; 14 | background-repeat: repeat; 15 | margin-top: 0; 16 | } 17 | 18 | /* more sprites.less reset */ 19 | .icon-white, 20 | .nav-pills > .active > a > [class^="icon-"], 21 | .nav-pills > .active > a > [class*=" icon-"], 22 | .nav-list > .active > a > [class^="icon-"], 23 | .nav-list > .active > a > [class*=" icon-"], 24 | .navbar-inverse .nav > .active > a > [class^="icon-"], 25 | .navbar-inverse .nav > .active > a > [class*=" icon-"], 26 | .dropdown-menu > li > a:hover > [class^="icon-"], 27 | .dropdown-menu > li > a:hover > [class*=" icon-"], 28 | .dropdown-menu > .active > a > [class^="icon-"], 29 | .dropdown-menu > .active > a > [class*=" icon-"], 30 | .dropdown-submenu:hover > a > [class^="icon-"], 31 | .dropdown-submenu:hover > a > [class*=" icon-"] { 32 | background-image: none; 33 | } 34 | 35 | 36 | /* keeps Bootstrap styles with and without icons the same */ 37 | .btn, .nav { 38 | [class^="icon-"], 39 | [class*=" icon-"] { 40 | // display: inline; 41 | &.icon-large { line-height: .9em; } 42 | &.icon-spin { display: inline-block; } 43 | } 44 | } 45 | .nav-tabs, .nav-pills { 46 | [class^="icon-"], 47 | [class*=" icon-"] { 48 | &, &.icon-large { line-height: .9em; } 49 | } 50 | } 51 | .btn { 52 | [class^="icon-"], 53 | [class*=" icon-"] { 54 | &.pull-left, &.pull-right { 55 | &.icon-2x { margin-top: .18em; } 56 | } 57 | &.icon-spin.icon-large { line-height: .8em; } 58 | } 59 | } 60 | .btn.btn-small { 61 | [class^="icon-"], 62 | [class*=" icon-"] { 63 | &.pull-left, &.pull-right { 64 | &.icon-2x { margin-top: .25em; } 65 | } 66 | } 67 | } 68 | .btn.btn-large { 69 | [class^="icon-"], 70 | [class*=" icon-"] { 71 | margin-top: 0; // overrides bootstrap default 72 | &.pull-left, &.pull-right { 73 | &.icon-2x { margin-top: .05em; } 74 | } 75 | &.pull-left.icon-2x { margin-right: .2em; } 76 | &.pull-right.icon-2x { margin-left: .2em; } 77 | } 78 | } 79 | 80 | /* Fixes alignment in nav lists */ 81 | .nav-list [class^="icon-"], 82 | .nav-list [class*=" icon-"] { 83 | line-height: inherit; 84 | } 85 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | /* FONT AWESOME CORE 2 | * -------------------------- */ 3 | 4 | [class^="icon-"], 5 | [class*=" icon-"] { 6 | @include icon-FontAwesome(); 7 | } 8 | 9 | [class^="icon-"]:before, 10 | [class*=" icon-"]:before { 11 | text-decoration: inherit; 12 | display: inline-block; 13 | speak: none; 14 | } 15 | 16 | /* makes the font 33% larger relative to the icon container */ 17 | .icon-large:before { 18 | vertical-align: -10%; 19 | font-size: (4em/3); 20 | } 21 | 22 | /* makes sure icons active on rollover in links */ 23 | a { 24 | [class^="icon-"], 25 | [class*=" icon-"] { 26 | display: inline; 27 | } 28 | } 29 | 30 | /* increased font size for icon-large */ 31 | [class^="icon-"], 32 | [class*=" icon-"] { 33 | &.icon-fixed-width { 34 | display: inline-block; 35 | width: (16em/14); 36 | text-align: right; 37 | padding-right: (4em/14); 38 | &.icon-large { 39 | width: (20em/14); 40 | } 41 | } 42 | } 43 | 44 | .icons-ul { 45 | margin-left: $icons-li-width; 46 | list-style-type: none; 47 | 48 | > li { position: relative; } 49 | 50 | .icon-li { 51 | position: absolute; 52 | left: -$icons-li-width; 53 | width: $icons-li-width; 54 | text-align: center; 55 | line-height: inherit; 56 | } 57 | } 58 | 59 | // allows usage of the hide class directly on font awesome icons 60 | [class^="icon-"], 61 | [class*=" icon-"] { 62 | &.hide { 63 | display: none; 64 | } 65 | } 66 | 67 | .icon-muted { color: $iconMuted; } 68 | .icon-light { color: $iconLight; } 69 | .icon-dark { color: $iconDark; } 70 | 71 | // Icon Borders 72 | // ------------------------- 73 | 74 | .icon-border { 75 | border: solid 1px $borderColor; 76 | padding: .2em .25em .15em; 77 | @include border-radius(3px); 78 | } 79 | 80 | // Icon Sizes 81 | // ------------------------- 82 | 83 | .icon-2x { 84 | font-size: 2em; 85 | &.icon-border { 86 | border-width: 2px; 87 | @include border-radius(4px); 88 | } 89 | } 90 | .icon-3x { 91 | font-size: 3em; 92 | &.icon-border { 93 | border-width: 3px; 94 | @include border-radius(5px); 95 | } 96 | } 97 | .icon-4x { 98 | font-size: 4em; 99 | &.icon-border { 100 | border-width: 4px; 101 | @include border-radius(6px); 102 | } 103 | } 104 | 105 | .icon-5x { 106 | font-size: 5em; 107 | &.icon-border { 108 | border-width: 5px; 109 | @include border-radius(7px); 110 | } 111 | } 112 | 113 | 114 | // Floats & Margins 115 | // ------------------------- 116 | 117 | // Quick floats 118 | .pull-right { float: right; } 119 | .pull-left { float: left; } 120 | 121 | [class^="icon-"], 122 | [class*=" icon-"] { 123 | &.pull-left { 124 | margin-right: .3em; 125 | } 126 | &.pull-right { 127 | margin-left: .3em; 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/scss/_extras.scss: -------------------------------------------------------------------------------- 1 | /* EXTRAS 2 | * -------------------------- */ 3 | 4 | /* Stacked and layered icon */ 5 | @include icon-stack(); 6 | 7 | /* Animated rotating icon */ 8 | .icon-spin { 9 | display: inline-block; 10 | -moz-animation: spin 2s infinite linear; 11 | -o-animation: spin 2s infinite linear; 12 | -webkit-animation: spin 2s infinite linear; 13 | animation: spin 2s infinite linear; 14 | } 15 | 16 | /* Prevent stack and spinners from being taken inline when inside a link */ 17 | a .icon-stack, 18 | a .icon-spin { 19 | display: inline-block; 20 | text-decoration: none; 21 | } 22 | 23 | @-moz-keyframes spin { 24 | 0% { -moz-transform: rotate(0deg); } 25 | 100% { -moz-transform: rotate(359deg); } 26 | } 27 | @-webkit-keyframes spin { 28 | 0% { -webkit-transform: rotate(0deg); } 29 | 100% { -webkit-transform: rotate(359deg); } 30 | } 31 | @-o-keyframes spin { 32 | 0% { -o-transform: rotate(0deg); } 33 | 100% { -o-transform: rotate(359deg); } 34 | } 35 | @-ms-keyframes spin { 36 | 0% { -ms-transform: rotate(0deg); } 37 | 100% { -ms-transform: rotate(359deg); } 38 | } 39 | @keyframes spin { 40 | 0% { transform: rotate(0deg); } 41 | 100% { transform: rotate(359deg); } 42 | } 43 | 44 | /* Icon rotations and mirroring */ 45 | .icon-rotate-90:before { 46 | -webkit-transform: rotate(90deg); 47 | -moz-transform: rotate(90deg); 48 | -ms-transform: rotate(90deg); 49 | -o-transform: rotate(90deg); 50 | transform: rotate(90deg); 51 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); 52 | } 53 | 54 | .icon-rotate-180:before { 55 | -webkit-transform: rotate(180deg); 56 | -moz-transform: rotate(180deg); 57 | -ms-transform: rotate(180deg); 58 | -o-transform: rotate(180deg); 59 | transform: rotate(180deg); 60 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); 61 | } 62 | 63 | .icon-rotate-270:before { 64 | -webkit-transform: rotate(270deg); 65 | -moz-transform: rotate(270deg); 66 | -ms-transform: rotate(270deg); 67 | -o-transform: rotate(270deg); 68 | transform: rotate(270deg); 69 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); 70 | } 71 | 72 | .icon-flip-horizontal:before { 73 | -webkit-transform: scale(-1, 1); 74 | -moz-transform: scale(-1, 1); 75 | -ms-transform: scale(-1, 1); 76 | -o-transform: scale(-1, 1); 77 | transform: scale(-1, 1); 78 | } 79 | 80 | .icon-flip-vertical:before { 81 | -webkit-transform: scale(1, -1); 82 | -moz-transform: scale(1, -1); 83 | -ms-transform: scale(1, -1); 84 | -o-transform: scale(1, -1); 85 | transform: scale(1, -1); 86 | } 87 | 88 | /* ensure rotation occurs inside anchor tags */ 89 | a { 90 | .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical { 91 | &:before { display: inline-block; } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/scss/_icons.scss: -------------------------------------------------------------------------------- 1 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen 2 | * readers do not read off random characters that represent icons */ 3 | 4 | .icon-glass:before { content: $glass; } 5 | .icon-music:before { content: $music; } 6 | .icon-search:before { content: $search; } 7 | .icon-envelope-alt:before { content: $envelope-alt; } 8 | .icon-heart:before { content: $heart; } 9 | .icon-star:before { content: $star; } 10 | .icon-star-empty:before { content: $star-empty; } 11 | .icon-user:before { content: $user; } 12 | .icon-film:before { content: $film; } 13 | .icon-th-large:before { content: $th-large; } 14 | .icon-th:before { content: $th; } 15 | .icon-th-list:before { content: $th-list; } 16 | .icon-ok:before { content: $ok; } 17 | .icon-remove:before { content: $remove; } 18 | .icon-zoom-in:before { content: $zoom-in; } 19 | .icon-zoom-out:before { content: $zoom-out; } 20 | .icon-power-off:before, 21 | .icon-off:before { content: $off; } 22 | .icon-signal:before { content: $signal; } 23 | .icon-gear:before, 24 | .icon-cog:before { content: $cog; } 25 | .icon-trash:before { content: $trash; } 26 | .icon-home:before { content: $home; } 27 | .icon-file-alt:before { content: $file-alt; } 28 | .icon-time:before { content: $time; } 29 | .icon-road:before { content: $road; } 30 | .icon-download-alt:before { content: $download-alt; } 31 | .icon-download:before { content: $download; } 32 | .icon-upload:before { content: $upload; } 33 | .icon-inbox:before { content: $inbox; } 34 | .icon-play-circle:before { content: $play-circle; } 35 | .icon-rotate-right:before, 36 | .icon-repeat:before { content: $repeat; } 37 | .icon-refresh:before { content: $refresh; } 38 | .icon-list-alt:before { content: $list-alt; } 39 | .icon-lock:before { content: $lock; } 40 | .icon-flag:before { content: $flag; } 41 | .icon-headphones:before { content: $headphones; } 42 | .icon-volume-off:before { content: $volume-off; } 43 | .icon-volume-down:before { content: $volume-down; } 44 | .icon-volume-up:before { content: $volume-up; } 45 | .icon-qrcode:before { content: $qrcode; } 46 | .icon-barcode:before { content: $barcode; } 47 | .icon-tag:before { content: $tag; } 48 | .icon-tags:before { content: $tags; } 49 | .icon-book:before { content: $book; } 50 | .icon-bookmark:before { content: $bookmark; } 51 | .icon-print:before { content: $print; } 52 | .icon-camera:before { content: $camera; } 53 | .icon-font:before { content: $font; } 54 | .icon-bold:before { content: $bold; } 55 | .icon-italic:before { content: $italic; } 56 | .icon-text-height:before { content: $text-height; } 57 | .icon-text-width:before { content: $text-width; } 58 | .icon-align-left:before { content: $align-left; } 59 | .icon-align-center:before { content: $align-center; } 60 | .icon-align-right:before { content: $align-right; } 61 | .icon-align-justify:before { content: $align-justify; } 62 | .icon-list:before { content: $list; } 63 | .icon-indent-left:before { content: $indent-left; } 64 | .icon-indent-right:before { content: $indent-right; } 65 | .icon-facetime-video:before { content: $facetime-video; } 66 | .icon-picture:before { content: $picture; } 67 | .icon-pencil:before { content: $pencil; } 68 | .icon-map-marker:before { content: $map-marker; } 69 | .icon-adjust:before { content: $adjust; } 70 | .icon-tint:before { content: $tint; } 71 | .icon-edit:before { content: $edit; } 72 | .icon-share:before { content: $share; } 73 | .icon-check:before { content: $check; } 74 | .icon-move:before { content: $move; } 75 | .icon-step-backward:before { content: $step-backward; } 76 | .icon-fast-backward:before { content: $fast-backward; } 77 | .icon-backward:before { content: $backward; } 78 | .icon-play:before { content: $play; } 79 | .icon-pause:before { content: $pause; } 80 | .icon-stop:before { content: $stop; } 81 | .icon-forward:before { content: $forward; } 82 | .icon-fast-forward:before { content: $fast-forward; } 83 | .icon-step-forward:before { content: $step-forward; } 84 | .icon-eject:before { content: $eject; } 85 | .icon-chevron-left:before { content: $chevron-left; } 86 | .icon-chevron-right:before { content: $chevron-right; } 87 | .icon-plus-sign:before { content: $plus-sign; } 88 | .icon-minus-sign:before { content: $minus-sign; } 89 | .icon-remove-sign:before { content: $remove-sign; } 90 | .icon-ok-sign:before { content: $ok-sign; } 91 | .icon-question-sign:before { content: $question-sign; } 92 | .icon-info-sign:before { content: $info-sign; } 93 | .icon-screenshot:before { content: $screenshot; } 94 | .icon-remove-circle:before { content: $remove-circle; } 95 | .icon-ok-circle:before { content: $ok-circle; } 96 | .icon-ban-circle:before { content: $ban-circle; } 97 | .icon-arrow-left:before { content: $arrow-left; } 98 | .icon-arrow-right:before { content: $arrow-right; } 99 | .icon-arrow-up:before { content: $arrow-up; } 100 | .icon-arrow-down:before { content: $arrow-down; } 101 | .icon-mail-forward:before, 102 | .icon-share-alt:before { content: $share-alt; } 103 | .icon-resize-full:before { content: $resize-full; } 104 | .icon-resize-small:before { content: $resize-small; } 105 | .icon-plus:before { content: $plus; } 106 | .icon-minus:before { content: $minus; } 107 | .icon-asterisk:before { content: $asterisk; } 108 | .icon-exclamation-sign:before { content: $exclamation-sign; } 109 | .icon-gift:before { content: $gift; } 110 | .icon-leaf:before { content: $leaf; } 111 | .icon-fire:before { content: $fire; } 112 | .icon-eye-open:before { content: $eye-open; } 113 | .icon-eye-close:before { content: $eye-close; } 114 | .icon-warning-sign:before { content: $warning-sign; } 115 | .icon-plane:before { content: $plane; } 116 | .icon-calendar:before { content: $calendar; } 117 | .icon-random:before { content: $random; } 118 | .icon-comment:before { content: $comment; } 119 | .icon-magnet:before { content: $magnet; } 120 | .icon-chevron-up:before { content: $chevron-up; } 121 | .icon-chevron-down:before { content: $chevron-down; } 122 | .icon-retweet:before { content: $retweet; } 123 | .icon-shopping-cart:before { content: $shopping-cart; } 124 | .icon-folder-close:before { content: $folder-close; } 125 | .icon-folder-open:before { content: $folder-open; } 126 | .icon-resize-vertical:before { content: $resize-vertical; } 127 | .icon-resize-horizontal:before { content: $resize-horizontal; } 128 | .icon-bar-chart:before { content: $bar-chart; } 129 | .icon-twitter-sign:before { content: $twitter-sign; } 130 | .icon-facebook-sign:before { content: $facebook-sign; } 131 | .icon-camera-retro:before { content: $camera-retro; } 132 | .icon-key:before { content: $key; } 133 | .icon-gears:before, 134 | .icon-cogs:before { content: $cogs; } 135 | .icon-comments:before { content: $comments; } 136 | .icon-thumbs-up-alt:before { content: $thumbs-up-alt; } 137 | .icon-thumbs-down-alt:before { content: $thumbs-down-alt; } 138 | .icon-star-half:before { content: $star-half; } 139 | .icon-heart-empty:before { content: $heart-empty; } 140 | .icon-signout:before { content: $signout; } 141 | .icon-linkedin-sign:before { content: $linkedin-sign; } 142 | .icon-pushpin:before { content: $pushpin; } 143 | .icon-external-link:before { content: $external-link; } 144 | .icon-signin:before { content: $signin; } 145 | .icon-trophy:before { content: $trophy; } 146 | .icon-github-sign:before { content: $github-sign; } 147 | .icon-upload-alt:before { content: $upload-alt; } 148 | .icon-lemon:before { content: $lemon; } 149 | .icon-phone:before { content: $phone; } 150 | .icon-unchecked:before, 151 | .icon-check-empty:before { content: $check-empty; } 152 | .icon-bookmark-empty:before { content: $bookmark-empty; } 153 | .icon-phone-sign:before { content: $phone-sign; } 154 | .icon-twitter:before { content: $twitter; } 155 | .icon-facebook:before { content: $facebook; } 156 | .icon-github:before { content: $github; } 157 | .icon-unlock:before { content: $unlock; } 158 | .icon-credit-card:before { content: $credit-card; } 159 | .icon-rss:before { content: $rss; } 160 | .icon-hdd:before { content: $hdd; } 161 | .icon-bullhorn:before { content: $bullhorn; } 162 | .icon-bell:before { content: $bell; } 163 | .icon-certificate:before { content: $certificate; } 164 | .icon-hand-right:before { content: $hand-right; } 165 | .icon-hand-left:before { content: $hand-left; } 166 | .icon-hand-up:before { content: $hand-up; } 167 | .icon-hand-down:before { content: $hand-down; } 168 | .icon-circle-arrow-left:before { content: $circle-arrow-left; } 169 | .icon-circle-arrow-right:before { content: $circle-arrow-right; } 170 | .icon-circle-arrow-up:before { content: $circle-arrow-up; } 171 | .icon-circle-arrow-down:before { content: $circle-arrow-down; } 172 | .icon-globe:before { content: $globe; } 173 | .icon-wrench:before { content: $wrench; } 174 | .icon-tasks:before { content: $tasks; } 175 | .icon-filter:before { content: $filter; } 176 | .icon-briefcase:before { content: $briefcase; } 177 | .icon-fullscreen:before { content: $fullscreen; } 178 | .icon-group:before { content: $group; } 179 | .icon-link:before { content: $link; } 180 | .icon-cloud:before { content: $cloud; } 181 | .icon-beaker:before { content: $beaker; } 182 | .icon-cut:before { content: $cut; } 183 | .icon-copy:before { content: $copy; } 184 | .icon-paperclip:before, 185 | .icon-paper-clip:before { content: $paper-clip; } 186 | .icon-save:before { content: $save; } 187 | .icon-sign-blank:before { content: $sign-blank; } 188 | .icon-reorder:before { content: $reorder; } 189 | .icon-list-ul:before { content: $list-ul; } 190 | .icon-list-ol:before { content: $list-ol; } 191 | .icon-strikethrough:before { content: $strikethrough; } 192 | .icon-underline:before { content: $underline; } 193 | .icon-table:before { content: $table; } 194 | .icon-magic:before { content: $magic; } 195 | .icon-truck:before { content: $truck; } 196 | .icon-pinterest:before { content: $pinterest; } 197 | .icon-pinterest-sign:before { content: $pinterest-sign; } 198 | .icon-google-plus-sign:before { content: $google-plus-sign; } 199 | .icon-google-plus:before { content: $google-plus; } 200 | .icon-money:before { content: $money; } 201 | .icon-caret-down:before { content: $caret-down; } 202 | .icon-caret-up:before { content: $caret-up; } 203 | .icon-caret-left:before { content: $caret-left; } 204 | .icon-caret-right:before { content: $caret-right; } 205 | .icon-columns:before { content: $columns; } 206 | .icon-sort:before { content: $sort; } 207 | .icon-sort-down:before { content: $sort-down; } 208 | .icon-sort-up:before { content: $sort-up; } 209 | .icon-envelope:before { content: $envelope; } 210 | .icon-linkedin:before { content: $linkedin; } 211 | .icon-rotate-left:before, 212 | .icon-undo:before { content: $undo; } 213 | .icon-legal:before { content: $legal; } 214 | .icon-dashboard:before { content: $dashboard; } 215 | .icon-comment-alt:before { content: $comment-alt; } 216 | .icon-comments-alt:before { content: $comments-alt; } 217 | .icon-bolt:before { content: $bolt; } 218 | .icon-sitemap:before { content: $sitemap; } 219 | .icon-umbrella:before { content: $umbrella; } 220 | .icon-paste:before { content: $paste; } 221 | .icon-lightbulb:before { content: $lightbulb; } 222 | .icon-exchange:before { content: $exchange; } 223 | .icon-cloud-download:before { content: $cloud-download; } 224 | .icon-cloud-upload:before { content: $cloud-upload; } 225 | .icon-user-md:before { content: $user-md; } 226 | .icon-stethoscope:before { content: $stethoscope; } 227 | .icon-suitcase:before { content: $suitcase; } 228 | .icon-bell-alt:before { content: $bell-alt; } 229 | .icon-coffee:before { content: $coffee; } 230 | .icon-food:before { content: $food; } 231 | .icon-file-text-alt:before { content: $file-text-alt; } 232 | .icon-building:before { content: $building; } 233 | .icon-hospital:before { content: $hospital; } 234 | .icon-ambulance:before { content: $ambulance; } 235 | .icon-medkit:before { content: $medkit; } 236 | .icon-fighter-jet:before { content: $fighter-jet; } 237 | .icon-beer:before { content: $beer; } 238 | .icon-h-sign:before { content: $h-sign; } 239 | .icon-plus-sign-alt:before { content: $plus-sign-alt; } 240 | .icon-double-angle-left:before { content: $double-angle-left; } 241 | .icon-double-angle-right:before { content: $double-angle-right; } 242 | .icon-double-angle-up:before { content: $double-angle-up; } 243 | .icon-double-angle-down:before { content: $double-angle-down; } 244 | .icon-angle-left:before { content: $angle-left; } 245 | .icon-angle-right:before { content: $angle-right; } 246 | .icon-angle-up:before { content: $angle-up; } 247 | .icon-angle-down:before { content: $angle-down; } 248 | .icon-desktop:before { content: $desktop; } 249 | .icon-laptop:before { content: $laptop; } 250 | .icon-tablet:before { content: $tablet; } 251 | .icon-mobile-phone:before { content: $mobile-phone; } 252 | .icon-circle-blank:before { content: $circle-blank; } 253 | .icon-quote-left:before { content: $quote-left; } 254 | .icon-quote-right:before { content: $quote-right; } 255 | .icon-spinner:before { content: $spinner; } 256 | .icon-circle:before { content: $circle; } 257 | .icon-mail-reply:before, 258 | .icon-reply:before { content: $reply; } 259 | .icon-github-alt:before { content: $github-alt; } 260 | .icon-folder-close-alt:before { content: $folder-close-alt; } 261 | .icon-folder-open-alt:before { content: $folder-open-alt; } 262 | .icon-expand-alt:before { content: $expand-alt; } 263 | .icon-collapse-alt:before { content: $collapse-alt; } 264 | .icon-smile:before { content: $smile; } 265 | .icon-frown:before { content: $frown; } 266 | .icon-meh:before { content: $meh; } 267 | .icon-gamepad:before { content: $gamepad; } 268 | .icon-keyboard:before { content: $keyboard; } 269 | .icon-flag-alt:before { content: $flag-alt; } 270 | .icon-flag-checkered:before { content: $flag-checkered; } 271 | .icon-terminal:before { content: $terminal; } 272 | .icon-code:before { content: $code; } 273 | .icon-reply-all:before { content: $reply-all; } 274 | .icon-mail-reply-all:before { content: $mail-reply-all; } 275 | .icon-star-half-full:before, 276 | .icon-star-half-empty:before { content: $star-half-empty; } 277 | .icon-location-arrow:before { content: $location-arrow; } 278 | .icon-crop:before { content: $crop; } 279 | .icon-code-fork:before { content: $code-fork; } 280 | .icon-unlink:before { content: $unlink; } 281 | .icon-question:before { content: $question; } 282 | .icon-info:before { content: $info; } 283 | .icon-exclamation:before { content: $exclamation; } 284 | .icon-superscript:before { content: $superscript; } 285 | .icon-subscript:before { content: $subscript; } 286 | .icon-eraser:before { content: $eraser; } 287 | .icon-puzzle-piece:before { content: $puzzle-piece; } 288 | .icon-microphone:before { content: $microphone; } 289 | .icon-microphone-off:before { content: $microphone-off; } 290 | .icon-shield:before { content: $shield; } 291 | .icon-calendar-empty:before { content: $calendar-empty; } 292 | .icon-fire-extinguisher:before { content: $fire-extinguisher; } 293 | .icon-rocket:before { content: $rocket; } 294 | .icon-maxcdn:before { content: $maxcdn; } 295 | .icon-chevron-sign-left:before { content: $chevron-sign-left; } 296 | .icon-chevron-sign-right:before { content: $chevron-sign-right; } 297 | .icon-chevron-sign-up:before { content: $chevron-sign-up; } 298 | .icon-chevron-sign-down:before { content: $chevron-sign-down; } 299 | .icon-html5:before { content: $html5; } 300 | .icon-css3:before { content: $css3; } 301 | .icon-anchor:before { content: $anchor; } 302 | .icon-unlock-alt:before { content: $unlock-alt; } 303 | .icon-bullseye:before { content: $bullseye; } 304 | .icon-ellipsis-horizontal:before { content: $ellipsis-horizontal; } 305 | .icon-ellipsis-vertical:before { content: $ellipsis-vertical; } 306 | .icon-rss-sign:before { content: $rss-sign; } 307 | .icon-play-sign:before { content: $play-sign; } 308 | .icon-ticket:before { content: $ticket; } 309 | .icon-minus-sign-alt:before { content: $minus-sign-alt; } 310 | .icon-check-minus:before { content: $check-minus; } 311 | .icon-level-up:before { content: $level-up; } 312 | .icon-level-down:before { content: $level-down; } 313 | .icon-check-sign:before { content: $check-sign; } 314 | .icon-edit-sign:before { content: $edit-sign; } 315 | .icon-external-link-sign:before { content: $external-link-sign; } 316 | .icon-share-sign:before { content: $share-sign; } 317 | .icon-compass:before { content: $compass; } 318 | .icon-collapse:before { content: $collapse; } 319 | .icon-collapse-top:before { content: $collapse-top; } 320 | .icon-expand:before { content: $expand; } 321 | .icon-euro:before, 322 | .icon-eur:before { content: $eur; } 323 | .icon-gbp:before { content: $gbp; } 324 | .icon-dollar:before, 325 | .icon-usd:before { content: $usd; } 326 | .icon-rupee:before, 327 | .icon-inr:before { content: $inr; } 328 | .icon-yen:before, 329 | .icon-jpy:before { content: $jpy; } 330 | .icon-renminbi:before, 331 | .icon-cny:before { content: $cny; } 332 | .icon-won:before, 333 | .icon-krw:before { content: $krw; } 334 | .icon-bitcoin:before, 335 | .icon-btc:before { content: $btc; } 336 | .icon-file:before { content: $file; } 337 | .icon-file-text:before { content: $file-text; } 338 | .icon-sort-by-alphabet:before { content: $sort-by-alphabet; } 339 | .icon-sort-by-alphabet-alt:before { content: $sort-by-alphabet-alt; } 340 | .icon-sort-by-attributes:before { content: $sort-by-attributes; } 341 | .icon-sort-by-attributes-alt:before { content: $sort-by-attributes-alt; } 342 | .icon-sort-by-order:before { content: $sort-by-order; } 343 | .icon-sort-by-order-alt:before { content: $sort-by-order-alt; } 344 | .icon-thumbs-up:before { content: $thumbs-up; } 345 | .icon-thumbs-down:before { content: $thumbs-down; } 346 | .icon-youtube-sign:before { content: $youtube-sign; } 347 | .icon-youtube:before { content: $youtube; } 348 | .icon-xing:before { content: $xing; } 349 | .icon-xing-sign:before { content: $xing-sign; } 350 | .icon-youtube-play:before { content: $youtube-play; } 351 | .icon-dropbox:before { content: $dropbox; } 352 | .icon-stackexchange:before { content: $stackexchange; } 353 | .icon-instagram:before { content: $instagram; } 354 | .icon-flickr:before { content: $flickr; } 355 | .icon-adn:before { content: $adn; } 356 | .icon-bitbucket:before { content: $bitbucket; } 357 | .icon-bitbucket-sign:before { content: $bitbucket-sign; } 358 | .icon-tumblr:before { content: $tumblr; } 359 | .icon-tumblr-sign:before { content: $tumblr-sign; } 360 | .icon-long-arrow-down:before { content: $long-arrow-down; } 361 | .icon-long-arrow-up:before { content: $long-arrow-up; } 362 | .icon-long-arrow-left:before { content: $long-arrow-left; } 363 | .icon-long-arrow-right:before { content: $long-arrow-right; } 364 | .icon-apple:before { content: $apple; } 365 | .icon-windows:before { content: $windows; } 366 | .icon-android:before { content: $android; } 367 | .icon-linux:before { content: $linux; } 368 | .icon-dribbble:before { content: $dribbble; } 369 | .icon-skype:before { content: $skype; } 370 | .icon-foursquare:before { content: $foursquare; } 371 | .icon-trello:before { content: $trello; } 372 | .icon-female:before { content: $female; } 373 | .icon-male:before { content: $male; } 374 | .icon-gittip:before { content: $gittip; } 375 | .icon-sun:before { content: $sun; } 376 | .icon-moon:before { content: $moon; } 377 | .icon-archive:before { content: $archive; } 378 | .icon-bug:before { content: $bug; } 379 | .icon-vk:before { content: $vk; } 380 | .icon-weibo:before { content: $weibo; } 381 | .icon-renren:before { content: $renren; } 382 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin icon($icon) { 5 | @include icon-FontAwesome(); 6 | content: $icon; 7 | } 8 | 9 | @mixin icon-FontAwesome() { 10 | font-family: FontAwesome; 11 | font-weight: normal; 12 | font-style: normal; 13 | text-decoration: inherit; 14 | -webkit-font-smoothing: antialiased; 15 | *margin-right: .3em; // fixes ie7 issues 16 | } 17 | 18 | @mixin border-radius($radius) { 19 | -webkit-border-radius: $radius; 20 | -moz-border-radius: $radius; 21 | border-radius: $radius; 22 | } 23 | 24 | @mixin icon-stack($width: 2em, $height: 2em, $top-font-size: 1em, $base-font-size: 2em) { 25 | .icon-stack { 26 | position: relative; 27 | display: inline-block; 28 | width: $width; 29 | height: $height; 30 | line-height: $width; 31 | vertical-align: -35%; 32 | [class^="icon-"], 33 | [class*=" icon-"] { 34 | display: block; 35 | text-align: center; 36 | position: absolute; 37 | width: 100%; 38 | height: 100%; 39 | font-size: $top-font-size; 40 | line-height: inherit; 41 | *line-height: $height; 42 | } 43 | .icon-stack-base { 44 | font-size: $base-font-size; 45 | *line-height: #{$height / $base-font-size}em; 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?v=#{$FontAwesomeVersion}'); 7 | src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=#{$FontAwesomeVersion}') format('embedded-opentype'), 8 | url('#{$FontAwesomePath}/fontawesome-webfont.woff?v=#{$FontAwesomeVersion}') format('woff'), 9 | url('#{$FontAwesomePath}/fontawesome-webfont.ttf?v=#{$FontAwesomeVersion}') format('truetype'), 10 | url('#{$FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=#{$FontAwesomeVersion}') format('svg'); 11 | // src: url('#{$FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | $FontAwesomePath: "../font" !default; 5 | $FontAwesomeVersion: "3.2.1" !default; 6 | $borderColor: #eeeeee !default; 7 | $iconMuted: #eeeeee !default; 8 | $iconLight: white !default; 9 | $iconDark: #333333 !default; 10 | $icons-li-width: (30em/14); 11 | 12 | 13 | $glass: "\f000"; 14 | 15 | $music: "\f001"; 16 | 17 | $search: "\f002"; 18 | 19 | $envelope-alt: "\f003"; 20 | 21 | $heart: "\f004"; 22 | 23 | $star: "\f005"; 24 | 25 | $star-empty: "\f006"; 26 | 27 | $user: "\f007"; 28 | 29 | $film: "\f008"; 30 | 31 | $th-large: "\f009"; 32 | 33 | $th: "\f00a"; 34 | 35 | $th-list: "\f00b"; 36 | 37 | $ok: "\f00c"; 38 | 39 | $remove: "\f00d"; 40 | 41 | $zoom-in: "\f00e"; 42 | 43 | $zoom-out: "\f010"; 44 | 45 | $off: "\f011"; 46 | 47 | $signal: "\f012"; 48 | 49 | $cog: "\f013"; 50 | 51 | $trash: "\f014"; 52 | 53 | $home: "\f015"; 54 | 55 | $file-alt: "\f016"; 56 | 57 | $time: "\f017"; 58 | 59 | $road: "\f018"; 60 | 61 | $download-alt: "\f019"; 62 | 63 | $download: "\f01a"; 64 | 65 | $upload: "\f01b"; 66 | 67 | $inbox: "\f01c"; 68 | 69 | $play-circle: "\f01d"; 70 | 71 | $repeat: "\f01e"; 72 | 73 | $refresh: "\f021"; 74 | 75 | $list-alt: "\f022"; 76 | 77 | $lock: "\f023"; 78 | 79 | $flag: "\f024"; 80 | 81 | $headphones: "\f025"; 82 | 83 | $volume-off: "\f026"; 84 | 85 | $volume-down: "\f027"; 86 | 87 | $volume-up: "\f028"; 88 | 89 | $qrcode: "\f029"; 90 | 91 | $barcode: "\f02a"; 92 | 93 | $tag: "\f02b"; 94 | 95 | $tags: "\f02c"; 96 | 97 | $book: "\f02d"; 98 | 99 | $bookmark: "\f02e"; 100 | 101 | $print: "\f02f"; 102 | 103 | $camera: "\f030"; 104 | 105 | $font: "\f031"; 106 | 107 | $bold: "\f032"; 108 | 109 | $italic: "\f033"; 110 | 111 | $text-height: "\f034"; 112 | 113 | $text-width: "\f035"; 114 | 115 | $align-left: "\f036"; 116 | 117 | $align-center: "\f037"; 118 | 119 | $align-right: "\f038"; 120 | 121 | $align-justify: "\f039"; 122 | 123 | $list: "\f03a"; 124 | 125 | $indent-left: "\f03b"; 126 | 127 | $indent-right: "\f03c"; 128 | 129 | $facetime-video: "\f03d"; 130 | 131 | $picture: "\f03e"; 132 | 133 | $pencil: "\f040"; 134 | 135 | $map-marker: "\f041"; 136 | 137 | $adjust: "\f042"; 138 | 139 | $tint: "\f043"; 140 | 141 | $edit: "\f044"; 142 | 143 | $share: "\f045"; 144 | 145 | $check: "\f046"; 146 | 147 | $move: "\f047"; 148 | 149 | $step-backward: "\f048"; 150 | 151 | $fast-backward: "\f049"; 152 | 153 | $backward: "\f04a"; 154 | 155 | $play: "\f04b"; 156 | 157 | $pause: "\f04c"; 158 | 159 | $stop: "\f04d"; 160 | 161 | $forward: "\f04e"; 162 | 163 | $fast-forward: "\f050"; 164 | 165 | $step-forward: "\f051"; 166 | 167 | $eject: "\f052"; 168 | 169 | $chevron-left: "\f053"; 170 | 171 | $chevron-right: "\f054"; 172 | 173 | $plus-sign: "\f055"; 174 | 175 | $minus-sign: "\f056"; 176 | 177 | $remove-sign: "\f057"; 178 | 179 | $ok-sign: "\f058"; 180 | 181 | $question-sign: "\f059"; 182 | 183 | $info-sign: "\f05a"; 184 | 185 | $screenshot: "\f05b"; 186 | 187 | $remove-circle: "\f05c"; 188 | 189 | $ok-circle: "\f05d"; 190 | 191 | $ban-circle: "\f05e"; 192 | 193 | $arrow-left: "\f060"; 194 | 195 | $arrow-right: "\f061"; 196 | 197 | $arrow-up: "\f062"; 198 | 199 | $arrow-down: "\f063"; 200 | 201 | $share-alt: "\f064"; 202 | 203 | $resize-full: "\f065"; 204 | 205 | $resize-small: "\f066"; 206 | 207 | $plus: "\f067"; 208 | 209 | $minus: "\f068"; 210 | 211 | $asterisk: "\f069"; 212 | 213 | $exclamation-sign: "\f06a"; 214 | 215 | $gift: "\f06b"; 216 | 217 | $leaf: "\f06c"; 218 | 219 | $fire: "\f06d"; 220 | 221 | $eye-open: "\f06e"; 222 | 223 | $eye-close: "\f070"; 224 | 225 | $warning-sign: "\f071"; 226 | 227 | $plane: "\f072"; 228 | 229 | $calendar: "\f073"; 230 | 231 | $random: "\f074"; 232 | 233 | $comment: "\f075"; 234 | 235 | $magnet: "\f076"; 236 | 237 | $chevron-up: "\f077"; 238 | 239 | $chevron-down: "\f078"; 240 | 241 | $retweet: "\f079"; 242 | 243 | $shopping-cart: "\f07a"; 244 | 245 | $folder-close: "\f07b"; 246 | 247 | $folder-open: "\f07c"; 248 | 249 | $resize-vertical: "\f07d"; 250 | 251 | $resize-horizontal: "\f07e"; 252 | 253 | $bar-chart: "\f080"; 254 | 255 | $twitter-sign: "\f081"; 256 | 257 | $facebook-sign: "\f082"; 258 | 259 | $camera-retro: "\f083"; 260 | 261 | $key: "\f084"; 262 | 263 | $cogs: "\f085"; 264 | 265 | $comments: "\f086"; 266 | 267 | $thumbs-up-alt: "\f087"; 268 | 269 | $thumbs-down-alt: "\f088"; 270 | 271 | $star-half: "\f089"; 272 | 273 | $heart-empty: "\f08a"; 274 | 275 | $signout: "\f08b"; 276 | 277 | $linkedin-sign: "\f08c"; 278 | 279 | $pushpin: "\f08d"; 280 | 281 | $external-link: "\f08e"; 282 | 283 | $signin: "\f090"; 284 | 285 | $trophy: "\f091"; 286 | 287 | $github-sign: "\f092"; 288 | 289 | $upload-alt: "\f093"; 290 | 291 | $lemon: "\f094"; 292 | 293 | $phone: "\f095"; 294 | 295 | $check-empty: "\f096"; 296 | 297 | $bookmark-empty: "\f097"; 298 | 299 | $phone-sign: "\f098"; 300 | 301 | $twitter: "\f099"; 302 | 303 | $facebook: "\f09a"; 304 | 305 | $github: "\f09b"; 306 | 307 | $unlock: "\f09c"; 308 | 309 | $credit-card: "\f09d"; 310 | 311 | $rss: "\f09e"; 312 | 313 | $hdd: "\f0a0"; 314 | 315 | $bullhorn: "\f0a1"; 316 | 317 | $bell: "\f0a2"; 318 | 319 | $certificate: "\f0a3"; 320 | 321 | $hand-right: "\f0a4"; 322 | 323 | $hand-left: "\f0a5"; 324 | 325 | $hand-up: "\f0a6"; 326 | 327 | $hand-down: "\f0a7"; 328 | 329 | $circle-arrow-left: "\f0a8"; 330 | 331 | $circle-arrow-right: "\f0a9"; 332 | 333 | $circle-arrow-up: "\f0aa"; 334 | 335 | $circle-arrow-down: "\f0ab"; 336 | 337 | $globe: "\f0ac"; 338 | 339 | $wrench: "\f0ad"; 340 | 341 | $tasks: "\f0ae"; 342 | 343 | $filter: "\f0b0"; 344 | 345 | $briefcase: "\f0b1"; 346 | 347 | $fullscreen: "\f0b2"; 348 | 349 | $group: "\f0c0"; 350 | 351 | $link: "\f0c1"; 352 | 353 | $cloud: "\f0c2"; 354 | 355 | $beaker: "\f0c3"; 356 | 357 | $cut: "\f0c4"; 358 | 359 | $copy: "\f0c5"; 360 | 361 | $paper-clip: "\f0c6"; 362 | 363 | $save: "\f0c7"; 364 | 365 | $sign-blank: "\f0c8"; 366 | 367 | $reorder: "\f0c9"; 368 | 369 | $list-ul: "\f0ca"; 370 | 371 | $list-ol: "\f0cb"; 372 | 373 | $strikethrough: "\f0cc"; 374 | 375 | $underline: "\f0cd"; 376 | 377 | $table: "\f0ce"; 378 | 379 | $magic: "\f0d0"; 380 | 381 | $truck: "\f0d1"; 382 | 383 | $pinterest: "\f0d2"; 384 | 385 | $pinterest-sign: "\f0d3"; 386 | 387 | $google-plus-sign: "\f0d4"; 388 | 389 | $google-plus: "\f0d5"; 390 | 391 | $money: "\f0d6"; 392 | 393 | $caret-down: "\f0d7"; 394 | 395 | $caret-up: "\f0d8"; 396 | 397 | $caret-left: "\f0d9"; 398 | 399 | $caret-right: "\f0da"; 400 | 401 | $columns: "\f0db"; 402 | 403 | $sort: "\f0dc"; 404 | 405 | $sort-down: "\f0dd"; 406 | 407 | $sort-up: "\f0de"; 408 | 409 | $envelope: "\f0e0"; 410 | 411 | $linkedin: "\f0e1"; 412 | 413 | $undo: "\f0e2"; 414 | 415 | $legal: "\f0e3"; 416 | 417 | $dashboard: "\f0e4"; 418 | 419 | $comment-alt: "\f0e5"; 420 | 421 | $comments-alt: "\f0e6"; 422 | 423 | $bolt: "\f0e7"; 424 | 425 | $sitemap: "\f0e8"; 426 | 427 | $umbrella: "\f0e9"; 428 | 429 | $paste: "\f0ea"; 430 | 431 | $lightbulb: "\f0eb"; 432 | 433 | $exchange: "\f0ec"; 434 | 435 | $cloud-download: "\f0ed"; 436 | 437 | $cloud-upload: "\f0ee"; 438 | 439 | $user-md: "\f0f0"; 440 | 441 | $stethoscope: "\f0f1"; 442 | 443 | $suitcase: "\f0f2"; 444 | 445 | $bell-alt: "\f0f3"; 446 | 447 | $coffee: "\f0f4"; 448 | 449 | $food: "\f0f5"; 450 | 451 | $file-text-alt: "\f0f6"; 452 | 453 | $building: "\f0f7"; 454 | 455 | $hospital: "\f0f8"; 456 | 457 | $ambulance: "\f0f9"; 458 | 459 | $medkit: "\f0fa"; 460 | 461 | $fighter-jet: "\f0fb"; 462 | 463 | $beer: "\f0fc"; 464 | 465 | $h-sign: "\f0fd"; 466 | 467 | $plus-sign-alt: "\f0fe"; 468 | 469 | $double-angle-left: "\f100"; 470 | 471 | $double-angle-right: "\f101"; 472 | 473 | $double-angle-up: "\f102"; 474 | 475 | $double-angle-down: "\f103"; 476 | 477 | $angle-left: "\f104"; 478 | 479 | $angle-right: "\f105"; 480 | 481 | $angle-up: "\f106"; 482 | 483 | $angle-down: "\f107"; 484 | 485 | $desktop: "\f108"; 486 | 487 | $laptop: "\f109"; 488 | 489 | $tablet: "\f10a"; 490 | 491 | $mobile-phone: "\f10b"; 492 | 493 | $circle-blank: "\f10c"; 494 | 495 | $quote-left: "\f10d"; 496 | 497 | $quote-right: "\f10e"; 498 | 499 | $spinner: "\f110"; 500 | 501 | $circle: "\f111"; 502 | 503 | $reply: "\f112"; 504 | 505 | $github-alt: "\f113"; 506 | 507 | $folder-close-alt: "\f114"; 508 | 509 | $folder-open-alt: "\f115"; 510 | 511 | $expand-alt: "\f116"; 512 | 513 | $collapse-alt: "\f117"; 514 | 515 | $smile: "\f118"; 516 | 517 | $frown: "\f119"; 518 | 519 | $meh: "\f11a"; 520 | 521 | $gamepad: "\f11b"; 522 | 523 | $keyboard: "\f11c"; 524 | 525 | $flag-alt: "\f11d"; 526 | 527 | $flag-checkered: "\f11e"; 528 | 529 | $terminal: "\f120"; 530 | 531 | $code: "\f121"; 532 | 533 | $reply-all: "\f122"; 534 | 535 | $mail-reply-all: "\f122"; 536 | 537 | $star-half-empty: "\f123"; 538 | 539 | $location-arrow: "\f124"; 540 | 541 | $crop: "\f125"; 542 | 543 | $code-fork: "\f126"; 544 | 545 | $unlink: "\f127"; 546 | 547 | $question: "\f128"; 548 | 549 | $info: "\f129"; 550 | 551 | $exclamation: "\f12a"; 552 | 553 | $superscript: "\f12b"; 554 | 555 | $subscript: "\f12c"; 556 | 557 | $eraser: "\f12d"; 558 | 559 | $puzzle-piece: "\f12e"; 560 | 561 | $microphone: "\f130"; 562 | 563 | $microphone-off: "\f131"; 564 | 565 | $shield: "\f132"; 566 | 567 | $calendar-empty: "\f133"; 568 | 569 | $fire-extinguisher: "\f134"; 570 | 571 | $rocket: "\f135"; 572 | 573 | $maxcdn: "\f136"; 574 | 575 | $chevron-sign-left: "\f137"; 576 | 577 | $chevron-sign-right: "\f138"; 578 | 579 | $chevron-sign-up: "\f139"; 580 | 581 | $chevron-sign-down: "\f13a"; 582 | 583 | $html5: "\f13b"; 584 | 585 | $css3: "\f13c"; 586 | 587 | $anchor: "\f13d"; 588 | 589 | $unlock-alt: "\f13e"; 590 | 591 | $bullseye: "\f140"; 592 | 593 | $ellipsis-horizontal: "\f141"; 594 | 595 | $ellipsis-vertical: "\f142"; 596 | 597 | $rss-sign: "\f143"; 598 | 599 | $play-sign: "\f144"; 600 | 601 | $ticket: "\f145"; 602 | 603 | $minus-sign-alt: "\f146"; 604 | 605 | $check-minus: "\f147"; 606 | 607 | $level-up: "\f148"; 608 | 609 | $level-down: "\f149"; 610 | 611 | $check-sign: "\f14a"; 612 | 613 | $edit-sign: "\f14b"; 614 | 615 | $external-link-sign: "\f14c"; 616 | 617 | $share-sign: "\f14d"; 618 | 619 | $compass: "\f14e"; 620 | 621 | $collapse: "\f150"; 622 | 623 | $collapse-top: "\f151"; 624 | 625 | $expand: "\f152"; 626 | 627 | $eur: "\f153"; 628 | 629 | $gbp: "\f154"; 630 | 631 | $usd: "\f155"; 632 | 633 | $inr: "\f156"; 634 | 635 | $jpy: "\f157"; 636 | 637 | $cny: "\f158"; 638 | 639 | $krw: "\f159"; 640 | 641 | $btc: "\f15a"; 642 | 643 | $file: "\f15b"; 644 | 645 | $file-text: "\f15c"; 646 | 647 | $sort-by-alphabet: "\f15d"; 648 | 649 | $sort-by-alphabet-alt: "\f15e"; 650 | 651 | $sort-by-attributes: "\f160"; 652 | 653 | $sort-by-attributes-alt: "\f161"; 654 | 655 | $sort-by-order: "\f162"; 656 | 657 | $sort-by-order-alt: "\f163"; 658 | 659 | $thumbs-up: "\f164"; 660 | 661 | $thumbs-down: "\f165"; 662 | 663 | $youtube-sign: "\f166"; 664 | 665 | $youtube: "\f167"; 666 | 667 | $xing: "\f168"; 668 | 669 | $xing-sign: "\f169"; 670 | 671 | $youtube-play: "\f16a"; 672 | 673 | $dropbox: "\f16b"; 674 | 675 | $stackexchange: "\f16c"; 676 | 677 | $instagram: "\f16d"; 678 | 679 | $flickr: "\f16e"; 680 | 681 | $adn: "\f170"; 682 | 683 | $bitbucket: "\f171"; 684 | 685 | $bitbucket-sign: "\f172"; 686 | 687 | $tumblr: "\f173"; 688 | 689 | $tumblr-sign: "\f174"; 690 | 691 | $long-arrow-down: "\f175"; 692 | 693 | $long-arrow-up: "\f176"; 694 | 695 | $long-arrow-left: "\f177"; 696 | 697 | $long-arrow-right: "\f178"; 698 | 699 | $apple: "\f179"; 700 | 701 | $windows: "\f17a"; 702 | 703 | $android: "\f17b"; 704 | 705 | $linux: "\f17c"; 706 | 707 | $dribbble: "\f17d"; 708 | 709 | $skype: "\f17e"; 710 | 711 | $foursquare: "\f180"; 712 | 713 | $trello: "\f181"; 714 | 715 | $female: "\f182"; 716 | 717 | $male: "\f183"; 718 | 719 | $gittip: "\f184"; 720 | 721 | $sun: "\f185"; 722 | 723 | $moon: "\f186"; 724 | 725 | $archive: "\f187"; 726 | 727 | $bug: "\f188"; 728 | 729 | $vk: "\f189"; 730 | 731 | $weibo: "\f18a"; 732 | 733 | $renren: "\f18b"; 734 | 735 | -------------------------------------------------------------------------------- /www/fonts/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 3.2.1 3 | * the iconic font designed for Bootstrap 4 | * ------------------------------------------------------------------------------ 5 | * The full suite of pictographic icons, examples, and documentation can be 6 | * found at http://fontawesome.io. Stay up to date on Twitter at 7 | * http://twitter.com/fontawesome. 8 | * 9 | * License 10 | * ------------------------------------------------------------------------------ 11 | * - The Font Awesome font is licensed under SIL OFL 1.1 - 12 | * http://scripts.sil.org/OFL 13 | * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - 14 | * http://opensource.org/licenses/mit-license.html 15 | * - Font Awesome documentation licensed under CC BY 3.0 - 16 | * http://creativecommons.org/licenses/by/3.0/ 17 | * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: 18 | * "Font Awesome by Dave Gandy - http://fontawesome.io" 19 | * 20 | * Author - Dave Gandy 21 | * ------------------------------------------------------------------------------ 22 | * Email: dave@fontawesome.io 23 | * Twitter: http://twitter.com/davegandy 24 | * Work: Lead Product Designer @ Kyruus - http://kyruus.com 25 | */ 26 | 27 | @import "variables"; 28 | @import "mixins"; 29 | @import "path"; 30 | @import "core"; 31 | @import "bootstrap"; 32 | @import "extras"; 33 | @import "icons"; 34 | -------------------------------------------------------------------------------- /www/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /www/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /www/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nprapps/Chartbuilder/734eb1d77f5690ce1c9feb4c088076f25f2715d1/www/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /www/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Chartbuilder 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 67 |
68 |
69 |
70 |
71 | 72 | 73 |
74 |

Not getting the results you need? Email nprapps@npr.org for help or to request a custom chart!

75 | 76 |
77 |
78 |
79 |
80 | 81 |
82 |
83 | 84 |
85 | 86 | 87 |
88 |
89 |
90 | 91 |
92 |
93 | 94 |
95 | 96 |
97 |
98 | 99 |
100 |
101 |

1 Import Data

102 | 103 |
104 |
105 | 106 |

Copy and paste cells from your spreadsheet into the text field below.

107 |

Data could not be parsed.

108 | 109 | Swap rows and columns 110 | 111 |

Verify your data appears correct in this table. The first column will become labels for the horizontal axis. Remaining columns will be plotted on the vertical axis. (Except on bar charts.)

112 |
113 | 114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |

2 Chart Options

122 |
123 | 124 |
125 | 126 |
127 |

128 | 129 |
130 |
131 | 132 |
133 | 138 |
139 |
140 |
141 | 142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |

3 Vertical Axis Options

150 |
151 |
152 | 153 |
154 | 155 |
156 |

157 |

The space between the axis lines, e.g. 0.25, 5, 100.

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 |

4 Export

195 | 196 |
197 |

198 |
199 |
200 |
201 |
202 |

5 Add to Seamus

203 | 204 |
    205 |
  • Open the Seamus story editor and add an image by selecting "image" in the assets drawer.
  • 206 |
  • Click "browse" and locate the image you downloaded.
  • 207 |
  • Select the custom crop and expand the crop box to fit the entire image, including the title.
  • 208 |
  • Make sure "enlargement" is set to none, set the primary crop to "custom" and click "perform crop."
  • 209 |
210 |

211 |
    212 |
  • Click "next" and add a source and caption for your chart. Always credit your data source!
  • 213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 | 221 | This only exists to force the fonts to load. 222 | 223 | 224 | 225 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | -------------------------------------------------------------------------------- /www/js/lib/StackBlur.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | StackBlur - a fast almost Gaussian Blur For Canvas 4 | 5 | Version: 0.5 6 | Author: Mario Klingemann 7 | Contact: mario@quasimondo.com 8 | Website: http://www.quasimondo.com/StackBlurForCanvas 9 | Twitter: @quasimondo 10 | 11 | In case you find this class useful - especially in commercial projects - 12 | I am not totally unhappy for a small donation to my PayPal account 13 | mario@quasimondo.de 14 | 15 | Or support me on flattr: 16 | https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript 17 | 18 | Copyright (c) 2010 Mario Klingemann 19 | 20 | Permission is hereby granted, free of charge, to any person 21 | obtaining a copy of this software and associated documentation 22 | files (the "Software"), to deal in the Software without 23 | restriction, including without limitation the rights to use, 24 | copy, modify, merge, publish, distribute, sublicense, and/or sell 25 | copies of the Software, and to permit persons to whom the 26 | Software is furnished to do so, subject to the following 27 | conditions: 28 | 29 | The above copyright notice and this permission notice shall be 30 | included in all copies or substantial portions of the Software. 31 | 32 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 33 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 34 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 35 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 36 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 37 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 38 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 39 | OTHER DEALINGS IN THE SOFTWARE. 40 | */ 41 | 42 | var mul_table = [ 43 | 512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512, 44 | 454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512, 45 | 482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456, 46 | 437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512, 47 | 497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328, 48 | 320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456, 49 | 446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335, 50 | 329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512, 51 | 505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405, 52 | 399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328, 53 | 324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271, 54 | 268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456, 55 | 451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388, 56 | 385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335, 57 | 332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292, 58 | 289,287,285,282,280,278,275,273,271,269,267,265,263,261,259]; 59 | 60 | 61 | var shg_table = [ 62 | 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 63 | 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 64 | 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 65 | 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 66 | 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 67 | 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 68 | 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 69 | 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 70 | 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 71 | 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 72 | 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 73 | 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 74 | 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 75 | 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 76 | 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 77 | 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 ]; 78 | 79 | function premultiplyAlpha(imageData) 80 | { 81 | var pixels = imageData.data; 82 | var size = imageData.width * imageData.height * 4; 83 | 84 | for (var i=0; i> shg_sum; 247 | pixels[yi+1] = (g_sum * mul_sum) >> shg_sum; 248 | pixels[yi+2] = (b_sum * mul_sum) >> shg_sum; 249 | pixels[yi+3] = (a_sum * mul_sum) >> shg_sum; 250 | 251 | r_sum -= r_out_sum; 252 | g_sum -= g_out_sum; 253 | b_sum -= b_out_sum; 254 | a_sum -= a_out_sum; 255 | 256 | r_out_sum -= stackIn.r; 257 | g_out_sum -= stackIn.g; 258 | b_out_sum -= stackIn.b; 259 | a_out_sum -= stackIn.a; 260 | 261 | p = ( yw + ( ( p = x + radius + 1 ) < widthMinus1 ? p : widthMinus1 ) ) << 2; 262 | 263 | r_in_sum += ( stackIn.r = pixels[p]); 264 | g_in_sum += ( stackIn.g = pixels[p+1]); 265 | b_in_sum += ( stackIn.b = pixels[p+2]); 266 | a_in_sum += ( stackIn.a = pixels[p+3]); 267 | 268 | r_sum += r_in_sum; 269 | g_sum += g_in_sum; 270 | b_sum += b_in_sum; 271 | a_sum += a_in_sum; 272 | 273 | stackIn = stackIn.next; 274 | 275 | r_out_sum += ( pr = stackOut.r ); 276 | g_out_sum += ( pg = stackOut.g ); 277 | b_out_sum += ( pb = stackOut.b ); 278 | a_out_sum += ( pa = stackOut.a ); 279 | 280 | r_in_sum -= pr; 281 | g_in_sum -= pg; 282 | b_in_sum -= pb; 283 | a_in_sum -= pa; 284 | 285 | stackOut = stackOut.next; 286 | 287 | yi += 4; 288 | } 289 | yw += width; 290 | } 291 | 292 | 293 | for ( x = 0; x < width; x++ ) 294 | { 295 | g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0; 296 | 297 | yi = x << 2; 298 | r_out_sum = radiusPlus1 * ( pr = pixels[yi]); 299 | g_out_sum = radiusPlus1 * ( pg = pixels[yi+1]); 300 | b_out_sum = radiusPlus1 * ( pb = pixels[yi+2]); 301 | a_out_sum = radiusPlus1 * ( pa = pixels[yi+3]); 302 | 303 | r_sum += sumFactor * pr; 304 | g_sum += sumFactor * pg; 305 | b_sum += sumFactor * pb; 306 | a_sum += sumFactor * pa; 307 | 308 | stack = stackStart; 309 | 310 | for( i = 0; i < radiusPlus1; i++ ) 311 | { 312 | stack.r = pr; 313 | stack.g = pg; 314 | stack.b = pb; 315 | stack.a = pa; 316 | stack = stack.next; 317 | } 318 | 319 | yp = width; 320 | 321 | for( i = 1; i <= radius; i++ ) 322 | { 323 | yi = ( yp + x ) << 2; 324 | 325 | r_sum += ( stack.r = ( pr = pixels[yi])) * ( rbs = radiusPlus1 - i ); 326 | g_sum += ( stack.g = ( pg = pixels[yi+1])) * rbs; 327 | b_sum += ( stack.b = ( pb = pixels[yi+2])) * rbs; 328 | a_sum += ( stack.a = ( pa = pixels[yi+3])) * rbs; 329 | 330 | r_in_sum += pr; 331 | g_in_sum += pg; 332 | b_in_sum += pb; 333 | a_in_sum += pa; 334 | 335 | stack = stack.next; 336 | 337 | if( i < heightMinus1 ) 338 | { 339 | yp += width; 340 | } 341 | } 342 | 343 | yi = x; 344 | stackIn = stackStart; 345 | stackOut = stackEnd; 346 | for ( y = 0; y < height; y++ ) 347 | { 348 | p = yi << 2; 349 | pixels[p] = (r_sum * mul_sum) >> shg_sum; 350 | pixels[p+1] = (g_sum * mul_sum) >> shg_sum; 351 | pixels[p+2] = (b_sum * mul_sum) >> shg_sum; 352 | pixels[p+3] = (a_sum * mul_sum) >> shg_sum; 353 | 354 | r_sum -= r_out_sum; 355 | g_sum -= g_out_sum; 356 | b_sum -= b_out_sum; 357 | a_sum -= a_out_sum; 358 | 359 | r_out_sum -= stackIn.r; 360 | g_out_sum -= stackIn.g; 361 | b_out_sum -= stackIn.b; 362 | a_out_sum -= stackIn.a; 363 | 364 | p = ( x + (( ( p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1 ) * width )) << 2; 365 | 366 | r_sum += ( r_in_sum += ( stackIn.r = pixels[p])); 367 | g_sum += ( g_in_sum += ( stackIn.g = pixels[p+1])); 368 | b_sum += ( b_in_sum += ( stackIn.b = pixels[p+2])); 369 | a_sum += ( a_in_sum += ( stackIn.a = pixels[p+3])); 370 | 371 | stackIn = stackIn.next; 372 | 373 | r_out_sum += ( pr = stackOut.r ); 374 | g_out_sum += ( pg = stackOut.g ); 375 | b_out_sum += ( pb = stackOut.b ); 376 | a_out_sum += ( pa = stackOut.a ); 377 | 378 | r_in_sum -= pr; 379 | g_in_sum -= pg; 380 | b_in_sum -= pb; 381 | a_in_sum -= pa; 382 | 383 | stackOut = stackOut.next; 384 | 385 | yi += width; 386 | } 387 | } 388 | 389 | unpremultiplyAlpha(imageData); 390 | 391 | context.putImageData( imageData, top_x, top_y ); 392 | } 393 | 394 | 395 | function stackBlurCanvasRGB( id, top_x, top_y, width, height, radius ) 396 | { 397 | if ( isNaN(radius) || radius < 1 ) return; 398 | radius |= 0; 399 | 400 | var canvas = document.getElementById( id ); 401 | var context = canvas.getContext("2d"); 402 | var imageData; 403 | 404 | try { 405 | try { 406 | imageData = context.getImageData( top_x, top_y, width, height ); 407 | } catch(e) { 408 | 409 | // NOTE: this part is supposedly only needed if you want to work with local files 410 | // so it might be okay to remove the whole try/catch block and just use 411 | // imageData = context.getImageData( top_x, top_y, width, height ); 412 | try { 413 | netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); 414 | imageData = context.getImageData( top_x, top_y, width, height ); 415 | } catch(e) { 416 | alert("Cannot access local image"); 417 | throw new Error("unable to access local image data: " + e); 418 | return; 419 | } 420 | } 421 | } catch(e) { 422 | alert("Cannot access image"); 423 | throw new Error("unable to access image data: " + e); 424 | } 425 | 426 | var pixels = imageData.data; 427 | 428 | var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, 429 | r_out_sum, g_out_sum, b_out_sum, 430 | r_in_sum, g_in_sum, b_in_sum, 431 | pr, pg, pb, rbs; 432 | 433 | var div = radius + radius + 1; 434 | var w4 = width << 2; 435 | var widthMinus1 = width - 1; 436 | var heightMinus1 = height - 1; 437 | var radiusPlus1 = radius + 1; 438 | var sumFactor = radiusPlus1 * ( radiusPlus1 + 1 ) / 2; 439 | 440 | var stackStart = new BlurStack(); 441 | var stack = stackStart; 442 | for ( i = 1; i < div; i++ ) 443 | { 444 | stack = stack.next = new BlurStack(); 445 | if ( i == radiusPlus1 ) var stackEnd = stack; 446 | } 447 | stack.next = stackStart; 448 | var stackIn = null; 449 | var stackOut = null; 450 | 451 | yw = yi = 0; 452 | 453 | var mul_sum = mul_table[radius]; 454 | var shg_sum = shg_table[radius]; 455 | 456 | for ( y = 0; y < height; y++ ) 457 | { 458 | r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0; 459 | 460 | r_out_sum = radiusPlus1 * ( pr = pixels[yi] ); 461 | g_out_sum = radiusPlus1 * ( pg = pixels[yi+1] ); 462 | b_out_sum = radiusPlus1 * ( pb = pixels[yi+2] ); 463 | 464 | r_sum += sumFactor * pr; 465 | g_sum += sumFactor * pg; 466 | b_sum += sumFactor * pb; 467 | 468 | stack = stackStart; 469 | 470 | for( i = 0; i < radiusPlus1; i++ ) 471 | { 472 | stack.r = pr; 473 | stack.g = pg; 474 | stack.b = pb; 475 | stack = stack.next; 476 | } 477 | 478 | for( i = 1; i < radiusPlus1; i++ ) 479 | { 480 | p = yi + (( widthMinus1 < i ? widthMinus1 : i ) << 2 ); 481 | r_sum += ( stack.r = ( pr = pixels[p])) * ( rbs = radiusPlus1 - i ); 482 | g_sum += ( stack.g = ( pg = pixels[p+1])) * rbs; 483 | b_sum += ( stack.b = ( pb = pixels[p+2])) * rbs; 484 | 485 | r_in_sum += pr; 486 | g_in_sum += pg; 487 | b_in_sum += pb; 488 | 489 | stack = stack.next; 490 | } 491 | 492 | 493 | stackIn = stackStart; 494 | stackOut = stackEnd; 495 | for ( x = 0; x < width; x++ ) 496 | { 497 | pixels[yi] = (r_sum * mul_sum) >> shg_sum; 498 | pixels[yi+1] = (g_sum * mul_sum) >> shg_sum; 499 | pixels[yi+2] = (b_sum * mul_sum) >> shg_sum; 500 | 501 | r_sum -= r_out_sum; 502 | g_sum -= g_out_sum; 503 | b_sum -= b_out_sum; 504 | 505 | r_out_sum -= stackIn.r; 506 | g_out_sum -= stackIn.g; 507 | b_out_sum -= stackIn.b; 508 | 509 | p = ( yw + ( ( p = x + radius + 1 ) < widthMinus1 ? p : widthMinus1 ) ) << 2; 510 | 511 | r_in_sum += ( stackIn.r = pixels[p]); 512 | g_in_sum += ( stackIn.g = pixels[p+1]); 513 | b_in_sum += ( stackIn.b = pixels[p+2]); 514 | 515 | r_sum += r_in_sum; 516 | g_sum += g_in_sum; 517 | b_sum += b_in_sum; 518 | 519 | stackIn = stackIn.next; 520 | 521 | r_out_sum += ( pr = stackOut.r ); 522 | g_out_sum += ( pg = stackOut.g ); 523 | b_out_sum += ( pb = stackOut.b ); 524 | 525 | r_in_sum -= pr; 526 | g_in_sum -= pg; 527 | b_in_sum -= pb; 528 | 529 | stackOut = stackOut.next; 530 | 531 | yi += 4; 532 | } 533 | yw += width; 534 | } 535 | 536 | 537 | for ( x = 0; x < width; x++ ) 538 | { 539 | g_in_sum = b_in_sum = r_in_sum = g_sum = b_sum = r_sum = 0; 540 | 541 | yi = x << 2; 542 | r_out_sum = radiusPlus1 * ( pr = pixels[yi]); 543 | g_out_sum = radiusPlus1 * ( pg = pixels[yi+1]); 544 | b_out_sum = radiusPlus1 * ( pb = pixels[yi+2]); 545 | 546 | r_sum += sumFactor * pr; 547 | g_sum += sumFactor * pg; 548 | b_sum += sumFactor * pb; 549 | 550 | stack = stackStart; 551 | 552 | for( i = 0; i < radiusPlus1; i++ ) 553 | { 554 | stack.r = pr; 555 | stack.g = pg; 556 | stack.b = pb; 557 | stack = stack.next; 558 | } 559 | 560 | yp = width; 561 | 562 | for( i = 1; i <= radius; i++ ) 563 | { 564 | yi = ( yp + x ) << 2; 565 | 566 | r_sum += ( stack.r = ( pr = pixels[yi])) * ( rbs = radiusPlus1 - i ); 567 | g_sum += ( stack.g = ( pg = pixels[yi+1])) * rbs; 568 | b_sum += ( stack.b = ( pb = pixels[yi+2])) * rbs; 569 | 570 | r_in_sum += pr; 571 | g_in_sum += pg; 572 | b_in_sum += pb; 573 | 574 | stack = stack.next; 575 | 576 | if( i < heightMinus1 ) 577 | { 578 | yp += width; 579 | } 580 | } 581 | 582 | yi = x; 583 | stackIn = stackStart; 584 | stackOut = stackEnd; 585 | for ( y = 0; y < height; y++ ) 586 | { 587 | p = yi << 2; 588 | pixels[p] = (r_sum * mul_sum) >> shg_sum; 589 | pixels[p+1] = (g_sum * mul_sum) >> shg_sum; 590 | pixels[p+2] = (b_sum * mul_sum) >> shg_sum; 591 | 592 | r_sum -= r_out_sum; 593 | g_sum -= g_out_sum; 594 | b_sum -= b_out_sum; 595 | 596 | r_out_sum -= stackIn.r; 597 | g_out_sum -= stackIn.g; 598 | b_out_sum -= stackIn.b; 599 | 600 | p = ( x + (( ( p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1 ) * width )) << 2; 601 | 602 | r_sum += ( r_in_sum += ( stackIn.r = pixels[p])); 603 | g_sum += ( g_in_sum += ( stackIn.g = pixels[p+1])); 604 | b_sum += ( b_in_sum += ( stackIn.b = pixels[p+2])); 605 | 606 | stackIn = stackIn.next; 607 | 608 | r_out_sum += ( pr = stackOut.r ); 609 | g_out_sum += ( pg = stackOut.g ); 610 | b_out_sum += ( pb = stackOut.b ); 611 | 612 | r_in_sum -= pr; 613 | g_in_sum -= pg; 614 | b_in_sum -= pb; 615 | 616 | stackOut = stackOut.next; 617 | 618 | yi += width; 619 | } 620 | } 621 | 622 | context.putImageData( imageData, top_x, top_y ); 623 | 624 | } 625 | 626 | function BlurStack() 627 | { 628 | this.r = 0; 629 | this.g = 0; 630 | this.b = 0; 631 | this.a = 0; 632 | this.next = null; 633 | } 634 | -------------------------------------------------------------------------------- /www/js/lib/csvkit.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | this.CSVKit = {}; 3 | 4 | /* Utils */ 5 | 6 | var ctor = function() {}; 7 | var inherits = function(child, parent){ 8 | ctor.prototype = parent.prototype; 9 | child.prototype = new ctor(); 10 | child.prototype.constructor = child; 11 | }; 12 | 13 | /* CSVKit.Reader */ 14 | 15 | CSVKit.Reader = function(options) { 16 | options = options || {}; 17 | 18 | this.separator = options.separator || ','; 19 | this.quote_char = options.quote_char || '"'; 20 | this.escape_char = options.escape_char || '"'; 21 | this.column_names = options.column_names || []; 22 | this.columns_from_header = 'columns_from_header' in options ? options.columns_from_header : true; 23 | this.nested_quotes = 'nested_quotes' in options ? options.nested_quotes : false; 24 | this.rows = []; 25 | 26 | this.state = { 27 | rows: 0, 28 | open_record: [], 29 | open_field: '', 30 | last_char: '', 31 | in_quoted_field: false 32 | }; 33 | }; 34 | 35 | CSVKit.Reader.prototype.parse = function(data) { 36 | if (this.state.open_record.length === 0) { 37 | if (data.charCodeAt(0) === 0xFEFF) { 38 | data = data.slice(1); 39 | } 40 | } 41 | 42 | for (var i = 0; i < data.length; i++) { 43 | var c = data.charAt(i), next_char; 44 | switch (c) { 45 | // escape and separator may be the same char, typically '"' 46 | case this.escape_char: 47 | case this.quote_char: 48 | var is_escape = false; 49 | 50 | if (c === this.escape_char) { 51 | next_char = data.charAt(i + 1); 52 | 53 | if (this._is_escapable(next_char)) { 54 | this._add_character(next_char); 55 | i++; 56 | is_escape = true; 57 | } 58 | } 59 | if (!is_escape && (c === this.quote_char)) { 60 | if (this.state.open_field && !this.state.in_quoted_field) { 61 | this.state.in_quoted_field = true; 62 | break; 63 | } 64 | 65 | if (this.state.in_quoted_field) { 66 | // closing quote should be followed by separator unless the nested quotes option is set 67 | next_char = data.charAt(i + 1); 68 | 69 | if (next_char && next_char !== '\r' && next_char != '\n' && next_char !== this.separator && this.nested_quotes !== true) { 70 | throw new Error("separator expected after a closing quote; found " + next_char); 71 | } else { 72 | this.state.in_quoted_field = false; 73 | } 74 | } else if (this.state.open_field === '') { 75 | this.state.in_quoted_field = true; 76 | } 77 | } 78 | 79 | break; 80 | case this.separator: 81 | if (this.state.in_quoted_field) { 82 | this._add_character(c); 83 | } else { 84 | this._add_field(); 85 | } 86 | break; 87 | case '\n': 88 | // handle CRLF sequence 89 | if (!this.state.in_quoted_field && (this.state.last_char === '\r')) { 90 | break; 91 | } 92 | case '\r': 93 | if (this.state.in_quoted_field) { 94 | this._add_character(c); 95 | } else { 96 | this._add_field(); 97 | this._add_record(); 98 | } 99 | break; 100 | default: 101 | this._add_character(c); 102 | } 103 | 104 | this.state.last_char = c; 105 | } 106 | 107 | if (this.state.in_quoted_field) { 108 | throw new Error("Input stream ended but closing quotes expected"); 109 | } else { 110 | if (this.state.open_field) { 111 | this._add_field(); 112 | } 113 | 114 | if (this.state.open_record.length > 0) { 115 | this._add_record(); 116 | } 117 | } 118 | }; 119 | 120 | CSVKit.Reader.prototype._is_escapable = function(c) { 121 | if ((c === this.escape_char) || (c === this.quote_char)) { 122 | return true; 123 | } 124 | return false; 125 | }; 126 | 127 | CSVKit.Reader.prototype._add_character = function(c) { 128 | this.state.open_field += c; 129 | }; 130 | 131 | CSVKit.Reader.prototype._add_field = function() { 132 | this.state.open_record.push(this.state.open_field); 133 | this.state.open_field = ''; 134 | this.state.in_quoted_field = false; 135 | }; 136 | 137 | CSVKit.Reader.prototype._add_record = function() { 138 | if (this.columns_from_header && this.state.rows === 0) { 139 | this.column_names = this.state.open_record; 140 | } else { 141 | this.rows.push(this._serialize_record(this.state.open_record)); 142 | } 143 | 144 | this.state.rows++; 145 | this.state.open_record = []; 146 | this.state.open_field = ''; 147 | this.state.in_quoted_field = false; 148 | }; 149 | 150 | CSVKit.Reader.prototype._serialize_record = function(record) { 151 | return record; 152 | }; 153 | 154 | /* CSVKit.ObjectReader */ 155 | 156 | CSVKit.ObjectReader = function(options) { 157 | CSVKit.Reader.call(this, options); 158 | }; 159 | inherits(CSVKit.ObjectReader, CSVKit.Reader); 160 | 161 | CSVKit.ObjectReader.prototype._serialize_record = function(record) { 162 | var obj = {}; 163 | 164 | for (var i = 0; i < this.column_names.length; i++) { 165 | obj[this.column_names[i]] = record[i]; 166 | } 167 | 168 | return obj; 169 | }; 170 | 171 | /* CSVKit.Writer */ 172 | 173 | CSVKit.Writer = function(options) { 174 | options = options || {}; 175 | 176 | this.separator = options.separator || ','; 177 | this.quote_char = options.quote_char || '"'; 178 | this.escape_char = options.escape_char || '"'; 179 | this.quote_all = options.quote_all || false; 180 | this.newline = '\n'; 181 | 182 | CSVKit.Writer.prototype.write = function(rows) { 183 | var formatted_rows = []; 184 | 185 | for (var i = 0; i < rows.length; i++) { 186 | formatted_rows.push(this._serialize_row(rows[i])); 187 | } 188 | 189 | return formatted_rows.join(this.newline); 190 | }; 191 | 192 | CSVKit.Writer.prototype._serialize_row = function(row) { 193 | var formatted_cells = []; 194 | 195 | for (var i = 0; i < row.length; i++) { 196 | formatted_cells.push(this._serialize_cell(row[i])); 197 | } 198 | 199 | return formatted_cells.join(this.separator); 200 | }; 201 | 202 | CSVKit.Writer.prototype._serialize_cell = function(cell) { 203 | if (cell.indexOf(this.quote_char) >= 0) { 204 | cell = cell.replace(new RegExp(this.quote_char, 'g'), this.escape_char + this.quote_char); 205 | } 206 | 207 | if (this.quote_all || cell.indexOf(this.separator) >= 0 || cell.indexOf(this.newline) >= 0) { 208 | return this.quote_char + cell + this.quote_char; 209 | } 210 | 211 | return cell; 212 | }; 213 | } 214 | 215 | /* CSVKit.ObjectWriter */ 216 | 217 | CSVKit.ObjectWriter = function(options) { 218 | CSVKit.Writer.call(this, options); 219 | 220 | if (!('column_names' in options)) { 221 | throw "The column_names option is required."; 222 | } 223 | 224 | this.column_names = options.column_names; 225 | }; 226 | inherits(CSVKit.ObjectWriter, CSVKit.Writer); 227 | 228 | CSVKit.ObjectWriter.prototype.write = function(rows) { 229 | var header = {}; 230 | 231 | for (var i = 0; i < this.column_names.length; i++) { 232 | header[this.column_names[i]] = this.column_names[i]; 233 | } 234 | 235 | rows.splice(0, 0, header); 236 | 237 | return CSVKit.Writer.prototype.write.call(this, rows); 238 | } 239 | 240 | CSVKit.ObjectWriter.prototype._serialize_row = function(row) { 241 | var cells = []; 242 | 243 | for (var i = 0; i < this.column_names.length; i++) { 244 | cells.push(row[this.column_names[i]]); 245 | } 246 | 247 | return CSVKit.Writer.prototype._serialize_row.call(this, cells); 248 | }; 249 | 250 | }).call(this); 251 | -------------------------------------------------------------------------------- /www/js/lib/jquery.colorPicker.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Really Simple Color Picker in jQuery 3 | * 4 | * Licensed under the MIT (MIT-LICENSE.txt) licenses. 5 | * 6 | * Copyright (c) 2008-2012 7 | * Lakshan Perera (www.laktek.com) & Daniel Lacy (daniellacy.com) 8 | * 9 | * Permission is hereby granted, free of charge, to any person obtaining a copy 10 | * of this software and associated documentation files (the "Software"), to 11 | * deal in the Software without restriction, including without limitation the 12 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 13 | * sell copies of the Software, and to permit persons to whom the Software is 14 | * furnished to do so, subject to the following conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be included in 17 | * all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 24 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 25 | * IN THE SOFTWARE. 26 | */ 27 | 28 | (function ($) { 29 | /** 30 | * Create a couple private variables. 31 | **/ 32 | var selectorOwner, 33 | activePalette, 34 | cItterate = 0, 35 | templates = { 36 | control : $('
 
'), 37 | palette : $('
'), 38 | swatch : $('
 
'), 39 | hexLabel: $(''), 40 | hexField: $('') 41 | }, 42 | transparent = "transparent", 43 | lastColor; 44 | 45 | /** 46 | * Create our colorPicker function 47 | **/ 48 | $.fn.colorPicker = function (options) { 49 | 50 | return this.each(function () { 51 | // Setup time. Clone new elements from our templates, set some IDs, make shortcuts, jazzercise. 52 | var element = $(this), 53 | opts = $.extend({}, $.fn.colorPicker.defaults, options), 54 | defaultColor = $.fn.colorPicker.toHex( 55 | (element.val().length > 0) ? element.val() : opts.pickerDefault 56 | ), 57 | newControl = templates.control.clone(), 58 | newPalette = templates.palette.clone().attr('id', 'colorPicker_palette-' + cItterate), 59 | newHexLabel = templates.hexLabel.clone(), 60 | newHexField = templates.hexField.clone(), 61 | paletteId = newPalette[0].id, 62 | swatch, controlText; 63 | 64 | 65 | /** 66 | * Build a color palette. 67 | **/ 68 | $.each(opts.colors, function (i) { 69 | swatch = templates.swatch.clone(); 70 | 71 | if (opts.colors[i] === transparent) { 72 | swatch.addClass(transparent).text('X'); 73 | $.fn.colorPicker.bindPalette(newHexField, swatch, transparent); 74 | } else { 75 | swatch.css("background-color", "#" + this); 76 | $.fn.colorPicker.bindPalette(newHexField, swatch); 77 | } 78 | swatch.appendTo(newPalette); 79 | }); 80 | 81 | 82 | newHexLabel.attr('for', 'colorPicker_hex-' + cItterate); 83 | 84 | newHexField.attr({ 85 | 'id' : 'colorPicker_hex-' + cItterate, 86 | 'value' : defaultColor 87 | }); 88 | 89 | newHexField.bind("keydown", function (event) { 90 | if (event.keyCode === 13) { 91 | var hexColor = $.fn.colorPicker.toHex($(this).val()); 92 | $.fn.colorPicker.changeColor(hexColor ? hexColor : element.val()); 93 | } 94 | if (event.keyCode === 27) { 95 | $.fn.colorPicker.hidePalette(); 96 | } 97 | }); 98 | 99 | newHexField.bind("keyup", function (event) { 100 | var hexColor = $.fn.colorPicker.toHex($(event.target).val()); 101 | $.fn.colorPicker.previewColor(hexColor ? hexColor : element.val()); 102 | }); 103 | 104 | $('
').append(newHexLabel).appendTo(newPalette); 105 | 106 | newPalette.find('.colorPicker_hexWrap').append(newHexField); 107 | if (opts.showHexField === false) { 108 | newHexField.hide(); 109 | newHexLabel.hide(); 110 | } 111 | 112 | $("body").append(newPalette); 113 | 114 | newPalette.hide(); 115 | 116 | 117 | /** 118 | * Build replacement interface for original color input. 119 | **/ 120 | newControl.css("background-color", defaultColor); 121 | 122 | newControl.bind("click", function () { 123 | if( element.is( ':not(:disabled)' ) ) { 124 | $.fn.colorPicker.togglePalette($('#' + paletteId), $(this)); 125 | } 126 | }); 127 | 128 | // Bind the palette toggling to the input label 129 | element.prev().bind("click", function () { 130 | if( element.is( ':not(:disabled)' ) ) { 131 | $.fn.colorPicker.togglePalette($('#' + paletteId), $(newControl)); 132 | } 133 | }); 134 | 135 | if( options && options.onColorChange ) { 136 | newControl.data('onColorChange', options.onColorChange); 137 | } else { 138 | newControl.data('onColorChange', function() {} ); 139 | } 140 | 141 | if (controlText = element.data('text')) 142 | newControl.html(controlText) 143 | 144 | element.after(newControl); 145 | 146 | element.bind("change", function () { 147 | element.next(".colorPicker-picker").css( 148 | "background-color", $.fn.colorPicker.toHex($(this).val()) 149 | ); 150 | }); 151 | 152 | element.val(defaultColor); 153 | 154 | // Hide the original input. 155 | if (element[0].tagName.toLowerCase() === 'input') { 156 | try { 157 | element.attr('type', 'hidden') 158 | } catch(err) { // oldIE doesn't allow changing of input.type 159 | element.css('visibility', 'hidden').css('position', 'absolute') 160 | } 161 | } else { 162 | element.hide(); 163 | } 164 | 165 | cItterate++; 166 | }); 167 | }; 168 | 169 | /** 170 | * Extend colorPicker with... all our functionality. 171 | **/ 172 | $.extend(true, $.fn.colorPicker, { 173 | /** 174 | * Return a Hex color, convert an RGB value and return Hex, or return false. 175 | * 176 | * Inspired by http://code.google.com/p/jquery-color-utils 177 | **/ 178 | toHex : function (color) { 179 | // If we have a standard or shorthand Hex color, return that value. 180 | if (color.match(/[0-9A-F]{6}|[0-9A-F]{3}$/i)) { 181 | return (color.charAt(0) === "#") ? color : ("#" + color); 182 | 183 | // Alternatively, check for RGB color, then convert and return it as Hex. 184 | } else if (color.match(/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/)) { 185 | var c = ([parseInt(RegExp.$1, 10), parseInt(RegExp.$2, 10), parseInt(RegExp.$3, 10)]), 186 | pad = function (str) { 187 | if (str.length < 2) { 188 | for (var i = 0, len = 2 - str.length; i < len; i++) { 189 | str = '0' + str; 190 | } 191 | } 192 | 193 | return str; 194 | }; 195 | 196 | if (c.length === 3) { 197 | var r = pad(c[0].toString(16)), 198 | g = pad(c[1].toString(16)), 199 | b = pad(c[2].toString(16)); 200 | 201 | return '#' + r + g + b; 202 | } 203 | 204 | // Otherwise we wont do anything. 205 | } else { 206 | return false; 207 | 208 | } 209 | }, 210 | 211 | /** 212 | * Check whether user clicked on the selector or owner. 213 | **/ 214 | checkMouse : function (event, paletteId) { 215 | var selector = activePalette, 216 | selectorParent = $(event.target).parents("#" + selector.attr('id')).length; 217 | 218 | if (event.target === $(selector)[0] || event.target === selectorOwner[0] || event.target === selectorOwner.siblings('label')[0] || event.target === selectorOwner.siblings('label')[0].outerHTML || selectorParent > 0) { 219 | return; 220 | } 221 | 222 | $.fn.colorPicker.hidePalette(); 223 | }, 224 | 225 | /** 226 | * Hide the color palette modal. 227 | **/ 228 | hidePalette : function () { 229 | $(document).unbind("mousedown", $.fn.colorPicker.checkMouse); 230 | 231 | $('.colorPicker-palette').hide(); 232 | }, 233 | 234 | /** 235 | * Show the color palette modal. 236 | **/ 237 | showPalette : function (palette) { 238 | var hexColor = selectorOwner.prev("input").val(); 239 | 240 | palette.css({ 241 | top: selectorOwner.offset().top + (selectorOwner.outerHeight()), 242 | left: selectorOwner.offset().left 243 | }); 244 | 245 | $("#color_value").val(hexColor); 246 | 247 | palette.show(); 248 | 249 | $(document).bind("mousedown", $.fn.colorPicker.checkMouse); 250 | }, 251 | 252 | /** 253 | * Toggle visibility of the colorPicker palette. 254 | **/ 255 | togglePalette : function (palette, origin) { 256 | // selectorOwner is the clicked .colorPicker-picker. 257 | if (origin) { 258 | selectorOwner = origin; 259 | } 260 | 261 | activePalette = palette; 262 | 263 | if (activePalette.is(':visible')) { 264 | $.fn.colorPicker.hidePalette(); 265 | 266 | } else { 267 | $.fn.colorPicker.showPalette(palette); 268 | 269 | } 270 | }, 271 | 272 | /** 273 | * Update the input with a newly selected color. 274 | **/ 275 | changeColor : function (value) { 276 | selectorOwner.css("background-color", value); 277 | selectorOwner.prev("input").val(value).change(); 278 | 279 | $.fn.colorPicker.hidePalette(); 280 | 281 | selectorOwner.data('onColorChange').call(selectorOwner, $(selectorOwner).prev("input").attr("id"), value); 282 | }, 283 | 284 | 285 | /** 286 | * Preview the input with a newly selected color. 287 | **/ 288 | previewColor : function (value) { 289 | selectorOwner.css("background-color", value); 290 | }, 291 | 292 | /** 293 | * Bind events to the color palette swatches. 294 | */ 295 | bindPalette : function (paletteInput, element, color) { 296 | color = color ? color : $.fn.colorPicker.toHex(element.css("background-color")); 297 | 298 | element.bind({ 299 | click : function (ev) { 300 | lastColor = color; 301 | 302 | $.fn.colorPicker.changeColor(color); 303 | }, 304 | mouseover : function (ev) { 305 | lastColor = paletteInput.val(); 306 | 307 | $(this).css("border-color", "#598FEF"); 308 | 309 | paletteInput.val(color); 310 | 311 | $.fn.colorPicker.previewColor(color); 312 | }, 313 | mouseout : function (ev) { 314 | $(this).css("border-color", "#000"); 315 | 316 | paletteInput.val(selectorOwner.css("background-color")); 317 | 318 | paletteInput.val(lastColor); 319 | 320 | $.fn.colorPicker.previewColor(lastColor); 321 | } 322 | }); 323 | } 324 | }); 325 | 326 | /** 327 | * Default colorPicker options. 328 | * 329 | * These are publibly available for global modification using a setting such as: 330 | * 331 | * $.fn.colorPicker.defaults.colors = ['151337', '111111'] 332 | * 333 | * They can also be applied on a per-bound element basis like so: 334 | * 335 | * $('#element1').colorPicker({pickerDefault: 'efefef', transparency: true}); 336 | * $('#element2').colorPicker({pickerDefault: '333333', colors: ['333333', '111111']}); 337 | * 338 | **/ 339 | $.fn.colorPicker.defaults = { 340 | // colorPicker default selected color. 341 | pickerDefault : "FFFFFF", 342 | 343 | // Default color set. 344 | colors : [ 345 | '000000', '993300', '333300', '000080', '333399', '333333', '800000', 'FF6600', 346 | '808000', '008000', '008080', '0000FF', '666699', '808080', 'FF0000', 'FF9900', 347 | '99CC00', '339966', '33CCCC', '3366FF', '800080', '999999', 'FF00FF', 'FFCC00', 348 | 'FFFF00', '00FF00', '00FFFF', '00CCFF', '993366', 'C0C0C0', 'FF99CC', 'FFCC99', 349 | 'FFFF99', 'CCFFFF', '99CCFF', 'FFFFFF' 350 | ], 351 | 352 | // If we want to simply add more colors to the default set, use addColors. 353 | addColors : [], 354 | 355 | // Show hex field 356 | showHexField: true 357 | }; 358 | 359 | })(jQuery); 360 | -------------------------------------------------------------------------------- /www/js/lib/rgbcolor.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A class to parse color values 3 | * @author Stoyan Stefanov 4 | * @link http://www.phpied.com/rgb-color-parser-in-javascript/ 5 | * @license Use it if you like it 6 | */ 7 | function RGBColor(color_string) 8 | { 9 | this.ok = false; 10 | 11 | // strip any leading # 12 | if (color_string.charAt(0) == '#') { // remove # if any 13 | color_string = color_string.substr(1,6); 14 | } 15 | 16 | color_string = color_string.replace(/ /g,''); 17 | color_string = color_string.toLowerCase(); 18 | 19 | // before getting into regexps, try simple matches 20 | // and overwrite the input 21 | var simple_colors = { 22 | aliceblue: 'f0f8ff', 23 | antiquewhite: 'faebd7', 24 | aqua: '00ffff', 25 | aquamarine: '7fffd4', 26 | azure: 'f0ffff', 27 | beige: 'f5f5dc', 28 | bisque: 'ffe4c4', 29 | black: '000000', 30 | blanchedalmond: 'ffebcd', 31 | blue: '0000ff', 32 | blueviolet: '8a2be2', 33 | brown: 'a52a2a', 34 | burlywood: 'deb887', 35 | cadetblue: '5f9ea0', 36 | chartreuse: '7fff00', 37 | chocolate: 'd2691e', 38 | coral: 'ff7f50', 39 | cornflowerblue: '6495ed', 40 | cornsilk: 'fff8dc', 41 | crimson: 'dc143c', 42 | cyan: '00ffff', 43 | darkblue: '00008b', 44 | darkcyan: '008b8b', 45 | darkgoldenrod: 'b8860b', 46 | darkgray: 'a9a9a9', 47 | darkgreen: '006400', 48 | darkkhaki: 'bdb76b', 49 | darkmagenta: '8b008b', 50 | darkolivegreen: '556b2f', 51 | darkorange: 'ff8c00', 52 | darkorchid: '9932cc', 53 | darkred: '8b0000', 54 | darksalmon: 'e9967a', 55 | darkseagreen: '8fbc8f', 56 | darkslateblue: '483d8b', 57 | darkslategray: '2f4f4f', 58 | darkturquoise: '00ced1', 59 | darkviolet: '9400d3', 60 | deeppink: 'ff1493', 61 | deepskyblue: '00bfff', 62 | dimgray: '696969', 63 | dodgerblue: '1e90ff', 64 | feldspar: 'd19275', 65 | firebrick: 'b22222', 66 | floralwhite: 'fffaf0', 67 | forestgreen: '228b22', 68 | fuchsia: 'ff00ff', 69 | gainsboro: 'dcdcdc', 70 | ghostwhite: 'f8f8ff', 71 | gold: 'ffd700', 72 | goldenrod: 'daa520', 73 | gray: '808080', 74 | green: '008000', 75 | greenyellow: 'adff2f', 76 | honeydew: 'f0fff0', 77 | hotpink: 'ff69b4', 78 | indianred : 'cd5c5c', 79 | indigo : '4b0082', 80 | ivory: 'fffff0', 81 | khaki: 'f0e68c', 82 | lavender: 'e6e6fa', 83 | lavenderblush: 'fff0f5', 84 | lawngreen: '7cfc00', 85 | lemonchiffon: 'fffacd', 86 | lightblue: 'add8e6', 87 | lightcoral: 'f08080', 88 | lightcyan: 'e0ffff', 89 | lightgoldenrodyellow: 'fafad2', 90 | lightgrey: 'd3d3d3', 91 | lightgreen: '90ee90', 92 | lightpink: 'ffb6c1', 93 | lightsalmon: 'ffa07a', 94 | lightseagreen: '20b2aa', 95 | lightskyblue: '87cefa', 96 | lightslateblue: '8470ff', 97 | lightslategray: '778899', 98 | lightsteelblue: 'b0c4de', 99 | lightyellow: 'ffffe0', 100 | lime: '00ff00', 101 | limegreen: '32cd32', 102 | linen: 'faf0e6', 103 | magenta: 'ff00ff', 104 | maroon: '800000', 105 | mediumaquamarine: '66cdaa', 106 | mediumblue: '0000cd', 107 | mediumorchid: 'ba55d3', 108 | mediumpurple: '9370d8', 109 | mediumseagreen: '3cb371', 110 | mediumslateblue: '7b68ee', 111 | mediumspringgreen: '00fa9a', 112 | mediumturquoise: '48d1cc', 113 | mediumvioletred: 'c71585', 114 | midnightblue: '191970', 115 | mintcream: 'f5fffa', 116 | mistyrose: 'ffe4e1', 117 | moccasin: 'ffe4b5', 118 | navajowhite: 'ffdead', 119 | navy: '000080', 120 | oldlace: 'fdf5e6', 121 | olive: '808000', 122 | olivedrab: '6b8e23', 123 | orange: 'ffa500', 124 | orangered: 'ff4500', 125 | orchid: 'da70d6', 126 | palegoldenrod: 'eee8aa', 127 | palegreen: '98fb98', 128 | paleturquoise: 'afeeee', 129 | palevioletred: 'd87093', 130 | papayawhip: 'ffefd5', 131 | peachpuff: 'ffdab9', 132 | peru: 'cd853f', 133 | pink: 'ffc0cb', 134 | plum: 'dda0dd', 135 | powderblue: 'b0e0e6', 136 | purple: '800080', 137 | red: 'ff0000', 138 | rosybrown: 'bc8f8f', 139 | royalblue: '4169e1', 140 | saddlebrown: '8b4513', 141 | salmon: 'fa8072', 142 | sandybrown: 'f4a460', 143 | seagreen: '2e8b57', 144 | seashell: 'fff5ee', 145 | sienna: 'a0522d', 146 | silver: 'c0c0c0', 147 | skyblue: '87ceeb', 148 | slateblue: '6a5acd', 149 | slategray: '708090', 150 | snow: 'fffafa', 151 | springgreen: '00ff7f', 152 | steelblue: '4682b4', 153 | tan: 'd2b48c', 154 | teal: '008080', 155 | thistle: 'd8bfd8', 156 | tomato: 'ff6347', 157 | turquoise: '40e0d0', 158 | violet: 'ee82ee', 159 | violetred: 'd02090', 160 | wheat: 'f5deb3', 161 | white: 'ffffff', 162 | whitesmoke: 'f5f5f5', 163 | yellow: 'ffff00', 164 | yellowgreen: '9acd32' 165 | }; 166 | for (var key in simple_colors) { 167 | if (color_string == key) { 168 | color_string = simple_colors[key]; 169 | } 170 | } 171 | // emd of simple type-in colors 172 | 173 | // array of color definition objects 174 | var color_defs = [ 175 | { 176 | re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, 177 | example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'], 178 | process: function (bits){ 179 | return [ 180 | parseInt(bits[1]), 181 | parseInt(bits[2]), 182 | parseInt(bits[3]) 183 | ]; 184 | } 185 | }, 186 | { 187 | re: /^(\w{2})(\w{2})(\w{2})$/, 188 | example: ['#00ff00', '336699'], 189 | process: function (bits){ 190 | return [ 191 | parseInt(bits[1], 16), 192 | parseInt(bits[2], 16), 193 | parseInt(bits[3], 16) 194 | ]; 195 | } 196 | }, 197 | { 198 | re: /^(\w{1})(\w{1})(\w{1})$/, 199 | example: ['#fb0', 'f0f'], 200 | process: function (bits){ 201 | return [ 202 | parseInt(bits[1] + bits[1], 16), 203 | parseInt(bits[2] + bits[2], 16), 204 | parseInt(bits[3] + bits[3], 16) 205 | ]; 206 | } 207 | } 208 | ]; 209 | 210 | // search through the definitions to find a match 211 | for (var i = 0; i < color_defs.length; i++) { 212 | var re = color_defs[i].re; 213 | var processor = color_defs[i].process; 214 | var bits = re.exec(color_string); 215 | if (bits) { 216 | channels = processor(bits); 217 | this.r = channels[0]; 218 | this.g = channels[1]; 219 | this.b = channels[2]; 220 | this.ok = true; 221 | } 222 | 223 | } 224 | 225 | // validate/cleanup values 226 | this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r); 227 | this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g); 228 | this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b); 229 | 230 | // some getters 231 | this.toRGB = function () { 232 | return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')'; 233 | } 234 | this.toHex = function () { 235 | var r = this.r.toString(16); 236 | var g = this.g.toString(16); 237 | var b = this.b.toString(16); 238 | if (r.length == 1) r = '0' + r; 239 | if (g.length == 1) g = '0' + g; 240 | if (b.length == 1) b = '0' + b; 241 | return '#' + r + g + b; 242 | } 243 | 244 | // help 245 | this.getHelpXML = function () { 246 | 247 | var examples = new Array(); 248 | // add regexps 249 | for (var i = 0; i < color_defs.length; i++) { 250 | var example = color_defs[i].example; 251 | for (var j = 0; j < example.length; j++) { 252 | examples[examples.length] = example[j]; 253 | } 254 | } 255 | // add type-in colors 256 | for (var sc in simple_colors) { 257 | examples[examples.length] = sc; 258 | } 259 | 260 | var xml = document.createElement('ul'); 261 | xml.setAttribute('id', 'rgbcolor-examples'); 262 | for (var i = 0; i < examples.length; i++) { 263 | try { 264 | var list_item = document.createElement('li'); 265 | var list_color = new RGBColor(examples[i]); 266 | var example_div = document.createElement('div'); 267 | example_div.style.cssText = 268 | 'margin: 3px; ' 269 | + 'border: 1px solid black; ' 270 | + 'background:' + list_color.toHex() + '; ' 271 | + 'color:' + list_color.toHex() 272 | ; 273 | example_div.appendChild(document.createTextNode('test')); 274 | var list_item_value = document.createTextNode( 275 | ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex() 276 | ); 277 | list_item.appendChild(example_div); 278 | list_item.appendChild(list_item_value); 279 | xml.appendChild(list_item); 280 | 281 | } catch(e){} 282 | } 283 | return xml; 284 | 285 | } 286 | 287 | } 288 | --------------------------------------------------------------------------------