├── .gitignore ├── README.md ├── bin ├── .gitignore ├── app.py ├── deploy.sh └── staticpycon │ ├── __init__.py │ ├── _colorama_compat.py │ ├── _vendor │ ├── README.md │ ├── __init__.py │ └── scss │ │ ├── __init__.py │ │ ├── __main__.py │ │ ├── ast.py │ │ ├── calculator.py │ │ ├── compiler.py │ │ ├── config.py │ │ ├── cssdefs.py │ │ ├── errors.py │ │ ├── extension │ │ ├── __init__.py │ │ ├── api.py │ │ ├── bootstrap.py │ │ ├── compass │ │ │ ├── __init__.py │ │ │ ├── gradients.py │ │ │ ├── helpers.py │ │ │ ├── images.py │ │ │ ├── layouts.py │ │ │ └── sprites.py │ │ ├── core.py │ │ ├── extra.py │ │ └── fonts.py │ │ ├── grammar │ │ ├── __init__.py │ │ ├── expression.g │ │ ├── expression.py │ │ └── scanner.py │ │ ├── legacy.py │ │ ├── namespace.py │ │ ├── rule.py │ │ ├── scss_meta.py │ │ ├── selector.py │ │ ├── setup.py │ │ ├── source.py │ │ ├── tool.py │ │ ├── types.py │ │ └── util.py │ ├── cachebuster.py │ ├── gen.py │ └── util.py ├── bower.json ├── bower_components ├── bourbon │ ├── .bower.json │ ├── .npmignore │ ├── LICENSE │ ├── bower.json │ ├── dist │ │ ├── _bourbon-deprecated-upcoming.scss │ │ ├── _bourbon.scss │ │ ├── addons │ │ │ ├── _button.scss │ │ │ ├── _clearfix.scss │ │ │ ├── _directional-values.scss │ │ │ ├── _ellipsis.scss │ │ │ ├── _font-family.scss │ │ │ ├── _hide-text.scss │ │ │ ├── _html5-input-types.scss │ │ │ ├── _position.scss │ │ │ ├── _prefixer.scss │ │ │ ├── _retina-image.scss │ │ │ ├── _size.scss │ │ │ ├── _timing-functions.scss │ │ │ ├── _triangle.scss │ │ │ └── _word-wrap.scss │ │ ├── css3 │ │ │ ├── _animation.scss │ │ │ ├── _appearance.scss │ │ │ ├── _backface-visibility.scss │ │ │ ├── _background-image.scss │ │ │ ├── _background.scss │ │ │ ├── _border-image.scss │ │ │ ├── _border-radius.scss │ │ │ ├── _box-sizing.scss │ │ │ ├── _calc.scss │ │ │ ├── _columns.scss │ │ │ ├── _filter.scss │ │ │ ├── _flex-box.scss │ │ │ ├── _font-face.scss │ │ │ ├── _font-feature-settings.scss │ │ │ ├── _hidpi-media-query.scss │ │ │ ├── _hyphens.scss │ │ │ ├── _image-rendering.scss │ │ │ ├── _keyframes.scss │ │ │ ├── _linear-gradient.scss │ │ │ ├── _perspective.scss │ │ │ ├── _placeholder.scss │ │ │ ├── _radial-gradient.scss │ │ │ ├── _transform.scss │ │ │ ├── _transition.scss │ │ │ └── _user-select.scss │ │ ├── functions │ │ │ ├── _assign.scss │ │ │ ├── _color-lightness.scss │ │ │ ├── _flex-grid.scss │ │ │ ├── _golden-ratio.scss │ │ │ ├── _grid-width.scss │ │ │ ├── _modular-scale.scss │ │ │ ├── _px-to-em.scss │ │ │ ├── _px-to-rem.scss │ │ │ ├── _strip-units.scss │ │ │ ├── _tint-shade.scss │ │ │ ├── _transition-property-name.scss │ │ │ └── _unpack.scss │ │ ├── helpers │ │ │ ├── _convert-units.scss │ │ │ ├── _gradient-positions-parser.scss │ │ │ ├── _is-num.scss │ │ │ ├── _linear-angle-parser.scss │ │ │ ├── _linear-gradient-parser.scss │ │ │ ├── _linear-positions-parser.scss │ │ │ ├── _linear-side-corner-parser.scss │ │ │ ├── _radial-arg-parser.scss │ │ │ ├── _radial-gradient-parser.scss │ │ │ ├── _radial-positions-parser.scss │ │ │ ├── _render-gradients.scss │ │ │ ├── _shape-size-stripper.scss │ │ │ └── _str-to-num.scss │ │ └── settings │ │ │ ├── _asset-pipeline.scss │ │ │ ├── _prefixer.scss │ │ │ └── _px-to-em.scss │ ├── package.json │ └── readme.md ├── font-awesome │ ├── .bower.json │ ├── .gitignore │ ├── .npmignore │ ├── bower.json │ ├── css │ │ ├── font-awesome.css │ │ └── font-awesome.min.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ └── fontawesome-webfont.woff │ ├── less │ │ ├── bordered-pulled.less │ │ ├── core.less │ │ ├── extras.less │ │ ├── fixed-width.less │ │ ├── font-awesome.less │ │ ├── icons.less │ │ ├── larger.less │ │ ├── list.less │ │ ├── mixins.less │ │ ├── path.less │ │ ├── rotated-flipped.less │ │ ├── spinning.less │ │ ├── stacked.less │ │ └── variables.less │ └── scss │ │ ├── _bordered-pulled.scss │ │ ├── _core.scss │ │ ├── _extras.scss │ │ ├── _fixed-width.scss │ │ ├── _icons.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _path.scss │ │ ├── _rotated-flipped.scss │ │ ├── _spinning.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ └── font-awesome.scss ├── neat │ ├── .bower.json │ ├── .rspec │ ├── .travis.yml │ ├── LICENSE │ ├── README.md │ ├── app │ │ └── assets │ │ │ └── stylesheets │ │ │ ├── _neat-helpers.scss │ │ │ ├── _neat.scss │ │ │ ├── functions │ │ │ ├── _new-breakpoint.scss │ │ │ └── _private.scss │ │ │ ├── grid │ │ │ ├── _box-sizing.scss │ │ │ ├── _direction-context.scss │ │ │ ├── _display-context.scss │ │ │ ├── _fill-parent.scss │ │ │ ├── _media.scss │ │ │ ├── _omega.scss │ │ │ ├── _outer-container.scss │ │ │ ├── _pad.scss │ │ │ ├── _private.scss │ │ │ ├── _row.scss │ │ │ ├── _shift.scss │ │ │ ├── _span-columns.scss │ │ │ ├── _to-deprecate.scss │ │ │ └── _visual-grid.scss │ │ │ └── settings │ │ │ ├── _disable-warnings.scss │ │ │ ├── _grid.scss │ │ │ └── _visual-grid.scss │ ├── bower.json │ └── sache.json └── normalize.css │ ├── .bower.json │ ├── LICENSE.md │ ├── README.md │ ├── bower.json │ └── normalize.css ├── deploy.py ├── fabfile.py ├── requirements.txt ├── sass ├── _base.scss ├── _colors.scss ├── _donators.scss ├── _footer.scss ├── _intro.scss ├── _media-late.scss ├── _media.scss ├── _nav.scss ├── _normalize.scss ├── _person.scss ├── _prettify.scss ├── _reset.scss ├── _schedule.scss ├── _speakers.scss ├── _sponsorpage.scss ├── _sponsors.scss ├── _typography.scss ├── _volunteers.scss ├── app.scss └── helpers │ ├── _fontawesome-mixin.scss │ └── _list-functions.scss └── src ├── asset ├── fonts │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ └── fontawesome-webfont.woff ├── img │ └── favicon.ico └── js │ ├── base.js │ ├── bootstrap-3.0.3.min.js │ ├── jquery-1.10.2.min.js │ └── prettify-1.0.min.js ├── base ├── _base.html ├── _disqus.html ├── _footer.html ├── _ga.html ├── _index-begin-cn.html ├── _index-begin-en.html ├── _nav.html ├── _schedule.html └── _toc.html ├── beijing.html ├── data ├── _agenda.yaml ├── _donators.yaml ├── _message.yaml ├── _nav.yaml ├── _site.yaml ├── _speakers.yaml ├── _sponsors.yaml └── _volunteers.yaml ├── donators.html ├── guangzhou.html ├── hangzhou.html ├── index.html ├── proposals.html ├── shanghai.html ├── speechmaker.html ├── sponsor_com.html ├── sponsors.html ├── suzhou.html ├── tshirt.html ├── volunteers.html └── zhuhai.html /.gitignore: -------------------------------------------------------------------------------- 1 | .hg/ 2 | .hg 3 | .hgignore 4 | bin/hook-deploy-by-git.sh 5 | 6 | out/ 7 | out 8 | .python-version 9 | _stuff/ 10 | _darft/ 11 | 12 | *.py[cod] 13 | 14 | # C extensions 15 | *.so 16 | 17 | # Packages 18 | *.egg 19 | *.egg-info 20 | dist 21 | build 22 | eggs 23 | parts 24 | var 25 | sdist 26 | develop-eggs 27 | .installed.cfg 28 | lib 29 | lib64 30 | __pycache__ 31 | 32 | # Installer logs 33 | pip-log.txt 34 | 35 | # Unit test / coverage reports 36 | .coverage 37 | .tox 38 | nosetests.xml 39 | 40 | # Translations 41 | *.mo 42 | 43 | # Mr Developer 44 | .mr.developer.cfg 45 | .project 46 | .pydevproject 47 | 48 | # virtualenvs 49 | venv-*/ 50 | test/ 51 | 52 | # don't ignore bin/ but do ignore bin/pubconf.py 53 | bin/pubconf.py 54 | -------------------------------------------------------------------------------- /bin/.gitignore: -------------------------------------------------------------------------------- 1 | pubconf.py 2 | *.pyc 3 | -------------------------------------------------------------------------------- /bin/app.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #encoding:utf8 3 | 4 | from __future__ import unicode_literals, absolute_import, print_function 5 | 6 | import sys 7 | import os 8 | import thread 9 | 10 | from SimpleHTTPServer import SimpleHTTPRequestHandler 11 | from SocketServer import TCPServer 12 | 13 | from staticpycon import gen 14 | from staticpycon import util 15 | 16 | 17 | def serve(): 18 | print("Listening on 0.0.0.0:8080 ...") 19 | server = TCPServer(('0.0.0.0', 8080), SimpleHTTPRequestHandler) 20 | os.chdir(gen.SITE_DIR) 21 | server.serve_forever() 22 | 23 | 24 | def run(start_server=False, sass_only=False, debug=False): 25 | if not sass_only and start_server: 26 | thread.start_new_thread(serve, ()) 27 | 28 | if sass_only: 29 | gen.render_scss(debug=debug) 30 | else: 31 | gen.gen(start_server=start_server, debug=debug) 32 | 33 | 34 | if __name__ == "__main__": 35 | # 如果命令行参数含有-g则只生成网页,不启动自动生成服务 36 | # 如果含有 --sass 则只编译样式 37 | # 如果含有 -d 则不 minify CSS 38 | sass_only = '--sass' in sys.argv 39 | debug = '-d' in sys.argv 40 | start_server = not '-g' in sys.argv 41 | 42 | util.setup_logging() 43 | 44 | run(start_server=start_server, sass_only=sass_only, debug=debug) 45 | -------------------------------------------------------------------------------- /bin/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # base incoming hooks API auto deploy new content from gitcafe 3 | ### changelog:: 4 | # 141022:ZQ creat base hook-deploy-by-git.sh 5 | #=========================================================== var defines 6 | VER="deploy.sh v14.10.22" 7 | DATE=`date "+%y%m%d"` 8 | #NOW=$(date +"%Y-%m-%d") 9 | GIT="/usr/bin/git" 10 | PY="/usr/bin/python" 11 | #=========================================================== path defines 12 | LOGF="/opt/logs/$DATE-cron-deploy.log" 13 | RESPATH="/opt/www/staticpycon" 14 | #=========================================================== action defines 15 | echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" >> $LOGF 16 | echo "###::$VER Hooks log 4 auto pull+gen from gitcafe" >> $LOGF 17 | echo "###::run@" `date +"%Y/%m/%d %H:%M:%S"` >> $LOGF 18 | echo "<<< trigging crontab tasks" >> $LOGF 19 | 20 | cd $RESPATH 21 | #pwd >> $LOGF 2>&1 22 | $PY deploy.py >> $LOGF 2>&1 23 | 24 | echo "###::end@" `date +"%Y/%m/%d %H:%M:%S"` >> $LOGF 25 | echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >> $LOGF 26 | #=========================================================== action DONE 27 | #exit 0 28 | -------------------------------------------------------------------------------- /bin/staticpycon/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyConChina/staticpycon/fe43b3f5080582f1c575d036ee4d4565987d83b0/bin/staticpycon/__init__.py -------------------------------------------------------------------------------- /bin/staticpycon/_colorama_compat.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #encoding:utf8 3 | 4 | from __future__ import unicode_literals, absolute_import, print_function 5 | 6 | __all__ = [ 7 | 'colorama', 8 | ] 9 | 10 | try: 11 | import colorama 12 | except ImportError: 13 | # just stub out ANSI control codes 14 | class colorama(object): 15 | class Style(object): 16 | DIM = RESET_ALL = '' 17 | 18 | class Fore(object): 19 | BLACK = RED = GREEN = YELLOW = BLUE = MAGENTA = CYAN = WHITE = '' 20 | RESET = '' 21 | 22 | @staticmethod 23 | def init(): 24 | pass 25 | 26 | 27 | # vim:set ai et ts=4 sts=4 fenc=utf-8: 28 | -------------------------------------------------------------------------------- /bin/staticpycon/_vendor/README.md: -------------------------------------------------------------------------------- 1 | # 携带二次修改的第三方库 2 | 3 | ## 说明 4 | 5 | * 仿照 [pip 的解决方案][pip-vendor]设置 6 | * PyPI 的版本能正常工作的库不要放进来 7 | * 一旦有正常版本进入 PyPI, 最好把这里的库去掉, track upstream 是美德 8 | 9 | 10 | 11 | ## 当前内容 12 | 13 | * [pyScss][vendored-scss]: 上游版本功能不全, 且有不兼容行为. 14 | 15 | 16 | [pip-vendor]: https://github.com/pypa/pip/tree/develop/pip/_vendor 17 | [scss]: https://github.com/xen0n/pyScss/commit/4afdc0a6db77d86c4500ddca9a36813b20c58b50 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /bin/staticpycon/_vendor/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | from __future__ import absolute_import 5 | 6 | import sys 7 | import os 8 | 9 | 10 | # prepend this directory to sys.path, for proper discovery and overriding of 11 | # vendored libs 12 | sys.path.insert(0, os.path.dirname(__file__)) 13 | 14 | 15 | # vim:set ai et ts=4 sw=4 sts=4 fenc=utf-8: 16 | -------------------------------------------------------------------------------- /bin/staticpycon/_vendor/scss/__init__.py: -------------------------------------------------------------------------------- 1 | #-*- coding: utf-8 -*- 2 | """ 3 | pyScss, a Scss compiler for Python 4 | 5 | @author German M. Bravo (Kronuz) 6 | @version 1.2.0 alpha 7 | @see https://github.com/Kronuz/pyScss 8 | @copyright (c) 2012-2013 German M. Bravo (Kronuz) 9 | @license MIT License 10 | http://www.opensource.org/licenses/mit-license.php 11 | 12 | pyScss compiles Scss, a superset of CSS that is more powerful, elegant and 13 | easier to maintain than plain-vanilla CSS. The library acts as a CSS source code 14 | preprocesor which allows you to use variables, nested rules, mixins, andhave 15 | inheritance of rules, all with a CSS-compatible syntax which the preprocessor 16 | then compiles to standard CSS. 17 | 18 | Scss, as an extension of CSS, helps keep large stylesheets well-organized. It 19 | borrows concepts and functionality from projects such as OOCSS and other similar 20 | frameworks like as Sass. It's build on top of the original PHP xCSS codebase 21 | structure but it's been completely rewritten, many bugs have been fixed and it 22 | has been extensively extended to support almost the full range of Sass' Scss 23 | syntax and functionality. 24 | 25 | Bits of code in pyScss come from various projects: 26 | Compass: 27 | (c) 2009 Christopher M. Eppstein 28 | http://compass-style.org/ 29 | Sass: 30 | (c) 2006-2009 Hampton Catlin and Nathan Weizenbaum 31 | http://sass-lang.com/ 32 | xCSS: 33 | (c) 2010 Anton Pawlik 34 | http://xcss.antpaw.org/docs/ 35 | 36 | """ 37 | from __future__ import absolute_import 38 | from __future__ import print_function 39 | from __future__ import unicode_literals 40 | from __future__ import division 41 | 42 | from scss.scss_meta import BUILD_INFO, PROJECT, VERSION, REVISION, URL, AUTHOR, AUTHOR_EMAIL, LICENSE 43 | 44 | __project__ = PROJECT 45 | __version__ = VERSION 46 | __author__ = AUTHOR + ' <' + AUTHOR_EMAIL + '>' 47 | __license__ = LICENSE 48 | 49 | 50 | import logging 51 | 52 | log = logging.getLogger(__name__) 53 | 54 | 55 | # Helpful re-exports 56 | from scss.compiler import Compiler 57 | 58 | # Backwards compatibility 59 | from scss.legacy import Scss 60 | # TODO surely there are others. what do our own django docs say...? 61 | 62 | 63 | __all__ = ['Compiler'] 64 | -------------------------------------------------------------------------------- /bin/staticpycon/_vendor/scss/__main__.py: -------------------------------------------------------------------------------- 1 | import scss.tool 2 | 3 | scss.tool.main() 4 | -------------------------------------------------------------------------------- /bin/staticpycon/_vendor/scss/config.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | 3 | ################################################################################ 4 | # Configuration: 5 | DEBUG = False 6 | VERBOSITY = 1 7 | 8 | import os 9 | PROJECT_ROOT = os.path.normpath(os.path.dirname(os.path.abspath(__file__))) 10 | 11 | # Sass @import load_paths: 12 | LOAD_PATHS = os.path.join(PROJECT_ROOT, 'sass/frameworks') 13 | 14 | # Assets path, where new sprite files are created (defaults to STATIC_ROOT + '/assets'): 15 | ASSETS_ROOT = None 16 | # Cache files path, where cache files are saved (defaults to ASSETS_ROOT): 17 | CACHE_ROOT = None 18 | # Assets path, where new sprite files are created: 19 | STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') 20 | FONTS_ROOT = None # default: STATIC_ROOT 21 | IMAGES_ROOT = None # default: STATIC_ROOT 22 | 23 | # Urls for the static and assets: 24 | ASSETS_URL = 'static/assets/' 25 | STATIC_URL = 'static/' 26 | FONTS_URL = None # default: STATIC_URL 27 | IMAGES_URL = None # default: STATIC_URL 28 | 29 | # Rendering style. Available values are 'nested', 'expanded', 'compact', 'compressed' and 'legacy' (defaults to 'nested'): 30 | STYLE = 'nested' 31 | 32 | # Use a different scope inside control structures create a scope (defaults to create new scopes for control structures, same as Sass): 33 | CONTROL_SCOPING = True 34 | 35 | # Throw fatal errors when finding undefined variables: 36 | FATAL_UNDEFINED = True 37 | 38 | SPRTE_MAP_DIRECTION = 'vertical' 39 | -------------------------------------------------------------------------------- /bin/staticpycon/_vendor/scss/extension/__init__.py: -------------------------------------------------------------------------------- 1 | """Support for compiler extensions, which can affect the compile process and 2 | inject their own functions and values. 3 | """ 4 | from __future__ import absolute_import 5 | from __future__ import division 6 | from __future__ import print_function 7 | 8 | # Re-export 9 | from .api import Cache 10 | from .api import Extension 11 | from .api import NamespaceAdapterExtension 12 | 13 | 14 | __all__ = ['Cache', 'Extension', 'NamespaceAdapterExtension'] 15 | -------------------------------------------------------------------------------- /bin/staticpycon/_vendor/scss/extension/api.py: -------------------------------------------------------------------------------- 1 | """Support for extending the Sass compiler.""" 2 | from __future__ import absolute_import 3 | from __future__ import division 4 | from __future__ import print_function 5 | 6 | 7 | _no_default = object() 8 | 9 | 10 | class Cache(object): 11 | """Serves as a local memory cache storage for extensions usage. 12 | """ 13 | _cache = {} 14 | 15 | def __init__(self, prefix=None): 16 | self.prefix = prefix 17 | 18 | def get(self, key, default=None): 19 | try: 20 | return self.__class__._cache[self.prefix][key] 21 | except KeyError: 22 | if default is _no_default: 23 | raise 24 | return default 25 | 26 | def set(self, key, value): 27 | self.__class__._cache.setdefault(self.prefix, {})[key] = value 28 | 29 | def clear_cache(self, key=None): 30 | if key: 31 | try: 32 | del self.__class__._cache[self.prefix][key] 33 | except KeyError: 34 | pass 35 | else: 36 | self.__class__._cache.clear() 37 | 38 | def __len__(self): 39 | return len(self.__class__._cache.setdefault(self.prefix, {})) 40 | 41 | def __iter__(self): 42 | return iter(self.__class__._cache.setdefault(self.prefix, {})) 43 | 44 | def __getitem__(self, key): 45 | return self.get(key, _no_default) 46 | 47 | def __setitem__(self, key, value): 48 | return self.set(key, value) 49 | 50 | def __delitem__(self, key): 51 | self.clear_cache(key) 52 | 53 | 54 | class Extension(object): 55 | """An extension to the Sass compile process. Subclass to add your own 56 | behavior. 57 | 58 | Methods are hooks, called by the compiler at certain points. Each 59 | extension is considered in the order it's provided. 60 | """ 61 | 62 | # TODO unsure how this could work given that we'd have to load modules for 63 | # it to be available 64 | name = None 65 | """A unique name for this extension, which will allow it to be referenced 66 | from the command line. 67 | """ 68 | 69 | namespace = None 70 | """An optional :class:`scss.namespace.Namespace` that will be injected into 71 | the compiler. 72 | """ 73 | 74 | def __init__(self): 75 | pass 76 | 77 | def __repr__(self): 78 | return "<{0}>".format(type(self).__name__) 79 | 80 | def handle_import(self, name, compilation, rule): 81 | """Attempt to resolve an import. Called once for every Sass string 82 | listed in an ``@import`` statement. Imports that Sass dictates should 83 | be converted to plain CSS imports do NOT trigger this hook. 84 | 85 | So this:: 86 | 87 | @import url(foo), "bar", "baz"; 88 | 89 | would call `handle_import` twice: once with "bar", once with "baz". 90 | 91 | Return a :class:`scss.source.SourceFile` if you want to handle the 92 | import, or None if you don't. (This method returns None by default, so 93 | if you don't care about hooking imports, just don't implement it.) 94 | This method is tried on every registered `Extension` in order, until 95 | one of them returns successfully. 96 | 97 | A good example is the core Sass import machinery, which is implemented 98 | with this hook; see the source code of the core extension. 99 | """ 100 | pass 101 | 102 | 103 | class NamespaceAdapterExtension(Extension): 104 | """Trivial wrapper that adapts a bare :class:`scss.namespace.Namespace` 105 | into a full extension. 106 | """ 107 | 108 | def __init__(self, namespace): 109 | self.namespace = namespace 110 | -------------------------------------------------------------------------------- /bin/staticpycon/_vendor/scss/extension/bootstrap.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | from __future__ import print_function 3 | from __future__ import unicode_literals 4 | from __future__ import division 5 | 6 | from scss.extension import Extension 7 | from scss.extension.compass.helpers import _font_url 8 | from scss.extension.compass.images import _image_url 9 | from scss.namespace import Namespace 10 | 11 | 12 | class BootstrapExtension(Extension): 13 | name = 'bootstrap' 14 | namespace = Namespace() 15 | 16 | ns = BootstrapExtension.namespace 17 | 18 | 19 | @ns.declare 20 | def twbs_font_path(path): 21 | return _font_url(path, False, True, False) 22 | 23 | 24 | @ns.declare 25 | def twbs_image_path(path): 26 | return _image_url(path, False, True, None, None, False, None, None, None, None) 27 | -------------------------------------------------------------------------------- /bin/staticpycon/_vendor/scss/grammar/__init__.py: -------------------------------------------------------------------------------- 1 | """Grammar and parser plumbing for Sass. Much of this is generated or compiled 2 | in some fashion. 3 | """ 4 | from .scanner import NoMoreTokens 5 | from .scanner import Parser 6 | from .scanner import Scanner 7 | from .scanner import locate_blocks 8 | 9 | __all__ = ('NoMoreTokens', 'Parser', 'Scanner', 'locate_blocks') 10 | -------------------------------------------------------------------------------- /bin/staticpycon/_vendor/scss/scss_meta.py: -------------------------------------------------------------------------------- 1 | #-*- coding: utf-8 -*- 2 | """ 3 | pyScss, a Scss compiler for Python 4 | 5 | @author German M. Bravo (Kronuz) 6 | @version 1.2.0 alpha 7 | @see https://github.com/Kronuz/pyScss 8 | @copyright (c) 2012-2013 German M. Bravo (Kronuz) 9 | @license MIT License 10 | http://www.opensource.org/licenses/mit-license.php 11 | 12 | pyScss compiles Scss, a superset of CSS that is more powerful, elegant and 13 | easier to maintain than plain-vanilla CSS. The library acts as a CSS source code 14 | preprocesor which allows you to use variables, nested rules, mixins, andhave 15 | inheritance of rules, all with a CSS-compatible syntax which the preprocessor 16 | then compiles to standard CSS. 17 | 18 | Scss, as an extension of CSS, helps keep large stylesheets well-organized. It 19 | borrows concepts and functionality from projects such as OOCSS and other similar 20 | frameworks like as Sass. It's build on top of the original PHP xCSS codebase 21 | structure but it's been completely rewritten, many bugs have been fixed and it 22 | has been extensively extended to support almost the full range of Sass' Scss 23 | syntax and functionality. 24 | 25 | Bits of code in pyScss come from various projects: 26 | Compass: 27 | (c) 2009 Christopher M. Eppstein 28 | http://compass-style.org/ 29 | Sass: 30 | (c) 2006-2009 Hampton Catlin and Nathan Weizenbaum 31 | http://sass-lang.com/ 32 | xCSS: 33 | (c) 2010 Anton Pawlik 34 | http://xcss.antpaw.org/docs/ 35 | 36 | This file defines Meta data, according to PEP314 37 | (http://www.python.org/dev/peps/pep-0314/) which is common to both pyScss 38 | and setup.py distutils. 39 | 40 | We create this here so this information can be compatible with BOTH 41 | Python 2.x and Python 3.x so setup.py can use it when building pyScss 42 | for both Py3.x and Py2.x 43 | 44 | """ 45 | from __future__ import unicode_literals 46 | 47 | import sys 48 | 49 | VERSION_INFO = (1, 3, 2) 50 | DATE_INFO = (2014, 10, 17) # YEAR, MONTH, DAY 51 | VERSION = '.'.join(str(i) for i in VERSION_INFO) 52 | REVISION = '%04d%02d%02d' % DATE_INFO 53 | BUILD_INFO = "pyScss v" + VERSION + " (" + REVISION + ")" 54 | AUTHOR = "German M. Bravo (Kronuz)" 55 | AUTHOR_EMAIL = 'german.mb@gmail.com' 56 | URL = 'http://github.com/Kronuz/pyScss' 57 | DOWNLOAD_URL = 'http://github.com/Kronuz/pyScss/tarball/v' + VERSION 58 | LICENSE = "MIT" 59 | PROJECT = "pyScss" 60 | -------------------------------------------------------------------------------- /bin/staticpycon/_vendor/scss/setup.py: -------------------------------------------------------------------------------- 1 | from distutils.core import setup, Extension 2 | 3 | setup(name='pyScss', 4 | version='1.1.1', 5 | description='pyScss', 6 | ext_modules=[ 7 | Extension( 8 | '_scss', 9 | sources=['src/_scss.c', 'src/block_locator.c', 'src/scanner.c'], 10 | libraries=['pcre'], 11 | optional=True 12 | ) 13 | ] 14 | ) 15 | -------------------------------------------------------------------------------- /bin/staticpycon/cachebuster.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #encoding:utf8 3 | 4 | from __future__ import unicode_literals, absolute_import, print_function 5 | 6 | import time 7 | 8 | 9 | def gen_cachebuster_qs(): 10 | '''生成可直接附着在静态资源 URL 之后的 cachebuster query string. 11 | 12 | 内容即为构建开始时间的 Unix 时间戳. 13 | 14 | ''' 15 | 16 | return '?_t={}'.format(int(time.time())) 17 | 18 | 19 | # vim:set ai et ts=4 sts=4 fenc=utf-8: 20 | -------------------------------------------------------------------------------- /bin/staticpycon/util.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #encoding:utf8 3 | 4 | from __future__ import unicode_literals, absolute_import 5 | 6 | import os 7 | import errno 8 | import logging 9 | 10 | from ._colorama_compat import colorama 11 | 12 | 13 | # http://stackoverflow.com/a/600612/596531 14 | def mkdirp(path): 15 | '''``mkdir -p`` for Python.''' 16 | 17 | try: 18 | os.makedirs(path) 19 | except OSError as e: 20 | if e.errno == errno.EEXIST and os.path.isdir(path): 21 | pass 22 | else: 23 | raise 24 | 25 | 26 | def setup_logging(): 27 | # scss compiler output 28 | logging.getLogger('scss.compiler').addHandler(SCSSMessagesHandler()) 29 | 30 | 31 | # formatter for pyScss messages 32 | class SCSSMessagesFormatter(logging.Formatter): 33 | '''Formatter for pyScss outputs.''' 34 | 35 | FMT_WARNING = ( 36 | colorama.Style.DIM 37 | + colorama.Fore.CYAN 38 | + 'scss ' 39 | + colorama.Fore.YELLOW 40 | + 'warn ' 41 | + colorama.Style.RESET_ALL 42 | + '%s' 43 | ) 44 | 45 | def format(self, record): 46 | if record.levelno == logging.WARNING: 47 | return self.FMT_WARNING % (record.msg, ) 48 | 49 | return super(SCSSMessagesFormatter, self).format(record) 50 | 51 | 52 | class SCSSMessagesHandler(logging.StreamHandler): 53 | '''Logging handler for pyScss.''' 54 | 55 | def __init__(self, *args, **kwargs): 56 | super(SCSSMessagesHandler, self).__init__(*args, **kwargs) 57 | 58 | # use custom formatter 59 | self.setFormatter(SCSSMessagesFormatter()) 60 | 61 | 62 | # vim:set ai et ts=4 sw=4 sts=4 fenc=utf-8: 63 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "staticpycon", 3 | "version": "0.0.0", 4 | "authors": [ 5 | "PyConChina" 6 | ], 7 | "description": "Static site for PyCon China", 8 | "main": "bin/app.py", 9 | "keywords": [ 10 | "python", 11 | "pycon" 12 | ], 13 | "license": "pending", 14 | "homepage": "http://cn.pycon.org/", 15 | "private": true, 16 | "dependencies": { 17 | "font-awesome": "~4.2.0", 18 | "bourbon": "~4.0.2", 19 | "neat": "~1.7.0", 20 | "normalize.css": "~3.0.2" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /bower_components/bourbon/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bourbon", 3 | "homepage": "http://bourbon.io/", 4 | "version": "4.0.2", 5 | "main": "dist/_bourbon.scss", 6 | "ignore": [ 7 | "app", 8 | "bin", 9 | "features", 10 | "lib", 11 | ".gitignore", 12 | "Gemfile", 13 | "Gemfile.lock", 14 | "Rakefile", 15 | "bourbon.gemspec" 16 | ], 17 | "_release": "4.0.2", 18 | "_resolution": { 19 | "type": "version", 20 | "tag": "v4.0.2", 21 | "commit": "216bef68de9f9e0a8a8f4f17c2676b19400a64a1" 22 | }, 23 | "_source": "git://github.com/thoughtbot/bourbon.git", 24 | "_target": ">=4.0", 25 | "_originalSource": "bourbon" 26 | } -------------------------------------------------------------------------------- /bower_components/bourbon/.npmignore: -------------------------------------------------------------------------------- 1 | app/ 2 | bin/ 3 | features/ 4 | lib/ 5 | bower.json 6 | bourbon.gemspec 7 | Rakefile 8 | Gemfile.lock 9 | Gemfile -------------------------------------------------------------------------------- /bower_components/bourbon/LICENSE: -------------------------------------------------------------------------------- 1 | LICENSE 2 | 3 | The MIT License 4 | 5 | Copyright (c) 2011-2013 thoughtbot, inc. 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in 15 | all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /bower_components/bourbon/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bourbon", 3 | "homepage": "http://bourbon.io/", 4 | "version": "4.0.2", 5 | "main": "dist/_bourbon.scss", 6 | "ignore": [ 7 | "app", 8 | "bin", 9 | "features", 10 | "lib", 11 | ".gitignore", 12 | "Gemfile", 13 | "Gemfile.lock", 14 | "Rakefile", 15 | "bourbon.gemspec" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/_bourbon-deprecated-upcoming.scss: -------------------------------------------------------------------------------- 1 | //************************************************************************// 2 | // These mixins/functions are deprecated 3 | // They will be removed in the next MAJOR version release 4 | //************************************************************************// 5 | @mixin inline-block { 6 | display: inline-block; 7 | @warn "inline-block mixin is deprecated and will be removed in the next major version release"; 8 | } 9 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/_bourbon.scss: -------------------------------------------------------------------------------- 1 | // Settings 2 | @import "settings/prefixer"; 3 | @import "settings/px-to-em"; 4 | @import "settings/asset-pipeline"; 5 | 6 | // Custom Helpers 7 | @import "helpers/convert-units"; 8 | @import "helpers/gradient-positions-parser"; 9 | @import "helpers/is-num"; 10 | @import "helpers/linear-angle-parser"; 11 | @import "helpers/linear-gradient-parser"; 12 | @import "helpers/linear-positions-parser"; 13 | @import "helpers/linear-side-corner-parser"; 14 | @import "helpers/radial-arg-parser"; 15 | @import "helpers/radial-positions-parser"; 16 | @import "helpers/radial-gradient-parser"; 17 | @import "helpers/render-gradients"; 18 | @import "helpers/shape-size-stripper"; 19 | @import "helpers/str-to-num"; 20 | 21 | // Custom Functions 22 | @import "functions/assign"; 23 | @import "functions/color-lightness"; 24 | @import "functions/flex-grid"; 25 | @import "functions/golden-ratio"; 26 | @import "functions/grid-width"; 27 | @import "functions/modular-scale"; 28 | @import "functions/px-to-em"; 29 | @import "functions/px-to-rem"; 30 | @import "functions/strip-units"; 31 | @import "functions/tint-shade"; 32 | @import "functions/transition-property-name"; 33 | @import "functions/unpack"; 34 | 35 | // CSS3 Mixins 36 | @import "css3/animation"; 37 | @import "css3/appearance"; 38 | @import "css3/backface-visibility"; 39 | @import "css3/background"; 40 | @import "css3/background-image"; 41 | @import "css3/border-image"; 42 | @import "css3/border-radius"; 43 | @import "css3/box-sizing"; 44 | @import "css3/calc"; 45 | @import "css3/columns"; 46 | @import "css3/filter"; 47 | @import "css3/flex-box"; 48 | @import "css3/font-face"; 49 | @import "css3/font-feature-settings"; 50 | @import "css3/hyphens"; 51 | @import "css3/hidpi-media-query"; 52 | @import "css3/image-rendering"; 53 | @import "css3/keyframes"; 54 | @import "css3/linear-gradient"; 55 | @import "css3/perspective"; 56 | @import "css3/radial-gradient"; 57 | @import "css3/transform"; 58 | @import "css3/transition"; 59 | @import "css3/user-select"; 60 | @import "css3/placeholder"; 61 | 62 | // Addons & other mixins 63 | @import "addons/button"; 64 | @import "addons/clearfix"; 65 | @import "addons/directional-values"; 66 | @import "addons/ellipsis"; 67 | @import "addons/font-family"; 68 | @import "addons/hide-text"; 69 | @import "addons/html5-input-types"; 70 | @import "addons/position"; 71 | @import "addons/prefixer"; 72 | @import "addons/retina-image"; 73 | @import "addons/size"; 74 | @import "addons/timing-functions"; 75 | @import "addons/triangle"; 76 | @import "addons/word-wrap"; 77 | 78 | // Soon to be deprecated Mixins 79 | @import "bourbon-deprecated-upcoming"; 80 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_clearfix.scss: -------------------------------------------------------------------------------- 1 | // Modern micro clearfix provides an easy way to contain floats without adding additional markup. 2 | // 3 | // Example usage: 4 | // 5 | // // Contain all floats within .wrapper 6 | // .wrapper { 7 | // @include clearfix; 8 | // .content, 9 | // .sidebar { 10 | // float : left; 11 | // } 12 | // } 13 | 14 | @mixin clearfix { 15 | &:after { 16 | content:""; 17 | display:table; 18 | clear:both; 19 | } 20 | } 21 | 22 | // Acknowledgements 23 | // Beat *that* clearfix: [Thierry Koblentz](http://www.css-101.org/articles/clearfix/latest-new-clearfix-so-far.php) 24 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_directional-values.scss: -------------------------------------------------------------------------------- 1 | // directional-property mixins are shorthands 2 | // for writing properties like the following 3 | // 4 | // @include margin(null 0 10px); 5 | // ------ 6 | // margin-right: 0; 7 | // margin-bottom: 10px; 8 | // margin-left: 0; 9 | // 10 | // - or - 11 | // 12 | // @include border-style(dotted null); 13 | // ------ 14 | // border-top-style: dotted; 15 | // border-bottom-style: dotted; 16 | // 17 | // ------ 18 | // 19 | // Note: You can also use false instead of null 20 | 21 | @function collapse-directionals($vals) { 22 | $output: null; 23 | 24 | $A: nth( $vals, 1 ); 25 | $B: if( length($vals) < 2, $A, nth($vals, 2)); 26 | $C: if( length($vals) < 3, $A, nth($vals, 3)); 27 | $D: if( length($vals) < 2, $A, nth($vals, if( length($vals) < 4, 2, 4) )); 28 | 29 | @if $A == 0 { $A: 0 } 30 | @if $B == 0 { $B: 0 } 31 | @if $C == 0 { $C: 0 } 32 | @if $D == 0 { $D: 0 } 33 | 34 | @if $A == $B and $A == $C and $A == $D { $output: $A } 35 | @else if $A == $C and $B == $D { $output: $A $B } 36 | @else if $B == $D { $output: $A $B $C } 37 | @else { $output: $A $B $C $D } 38 | 39 | @return $output; 40 | } 41 | 42 | @function contains-falsy($list) { 43 | @each $item in $list { 44 | @if not $item { 45 | @return true; 46 | } 47 | } 48 | 49 | @return false; 50 | } 51 | 52 | @mixin directional-property($pre, $suf, $vals) { 53 | // Property Names 54 | $top: $pre + "-top" + if($suf, "-#{$suf}", ""); 55 | $bottom: $pre + "-bottom" + if($suf, "-#{$suf}", ""); 56 | $left: $pre + "-left" + if($suf, "-#{$suf}", ""); 57 | $right: $pre + "-right" + if($suf, "-#{$suf}", ""); 58 | $all: $pre + if($suf, "-#{$suf}", ""); 59 | 60 | $vals: collapse-directionals($vals); 61 | 62 | @if contains-falsy($vals) { 63 | @if nth($vals, 1) { #{$top}: nth($vals, 1); } 64 | 65 | @if length($vals) == 1 { 66 | @if nth($vals, 1) { #{$right}: nth($vals, 1); } 67 | } @else { 68 | @if nth($vals, 2) { #{$right}: nth($vals, 2); } 69 | } 70 | 71 | // prop: top/bottom right/left 72 | @if length($vals) == 2 { 73 | @if nth($vals, 1) { #{$bottom}: nth($vals, 1); } 74 | @if nth($vals, 2) { #{$left}: nth($vals, 2); } 75 | 76 | // prop: top right/left bottom 77 | } @else if length($vals) == 3 { 78 | @if nth($vals, 3) { #{$bottom}: nth($vals, 3); } 79 | @if nth($vals, 2) { #{$left}: nth($vals, 2); } 80 | 81 | // prop: top right bottom left 82 | } @else if length($vals) == 4 { 83 | @if nth($vals, 3) { #{$bottom}: nth($vals, 3); } 84 | @if nth($vals, 4) { #{$left}: nth($vals, 4); } 85 | } 86 | 87 | // prop: top/right/bottom/left 88 | } @else { 89 | #{$all}: $vals; 90 | } 91 | } 92 | 93 | @mixin margin($vals...) { 94 | @include directional-property(margin, false, $vals...); 95 | } 96 | 97 | @mixin padding($vals...) { 98 | @include directional-property(padding, false, $vals...); 99 | } 100 | 101 | @mixin border-style($vals...) { 102 | @include directional-property(border, style, $vals...); 103 | } 104 | 105 | @mixin border-color($vals...) { 106 | @include directional-property(border, color, $vals...); 107 | } 108 | 109 | @mixin border-width($vals...) { 110 | @include directional-property(border, width, $vals...); 111 | } 112 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_ellipsis.scss: -------------------------------------------------------------------------------- 1 | @mixin ellipsis($width: 100%) { 2 | display: inline-block; 3 | max-width: $width; 4 | overflow: hidden; 5 | text-overflow: ellipsis; 6 | white-space: nowrap; 7 | } 8 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_font-family.scss: -------------------------------------------------------------------------------- 1 | $georgia: Georgia, Cambria, "Times New Roman", Times, serif; 2 | $helvetica: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; 3 | $lucida-grande: "Lucida Grande", Tahoma, Verdana, Arial, sans-serif; 4 | $monospace: "Bitstream Vera Sans Mono", Consolas, Courier, monospace; 5 | $verdana: Verdana, Geneva, sans-serif; 6 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_hide-text.scss: -------------------------------------------------------------------------------- 1 | @mixin hide-text { 2 | overflow: hidden; 3 | 4 | &:before { 5 | content: ""; 6 | display: block; 7 | width: 0; 8 | height: 100%; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_html5-input-types.scss: -------------------------------------------------------------------------------- 1 | //************************************************************************// 2 | // Generate a variable ($all-text-inputs) with a list of all html5 3 | // input types that have a text-based input, excluding textarea. 4 | // http://diveintohtml5.org/forms.html 5 | //************************************************************************// 6 | $inputs-list: 'input[type="email"]', 7 | 'input[type="number"]', 8 | 'input[type="password"]', 9 | 'input[type="search"]', 10 | 'input[type="tel"]', 11 | 'input[type="text"]', 12 | 'input[type="url"]', 13 | 14 | // Webkit & Gecko may change the display of these in the future 15 | 'input[type="color"]', 16 | 'input[type="date"]', 17 | 'input[type="datetime"]', 18 | 'input[type="datetime-local"]', 19 | 'input[type="month"]', 20 | 'input[type="time"]', 21 | 'input[type="week"]'; 22 | 23 | // Bare inputs 24 | //************************************************************************// 25 | $all-text-inputs: assign-inputs($inputs-list); 26 | 27 | // Hover Pseudo-class 28 | //************************************************************************// 29 | $all-text-inputs-hover: assign-inputs($inputs-list, hover); 30 | 31 | // Focus Pseudo-class 32 | //************************************************************************// 33 | $all-text-inputs-focus: assign-inputs($inputs-list, focus); 34 | 35 | 36 | 37 | // You must use interpolation on the variable: 38 | // #{$all-text-inputs} 39 | // #{$all-text-inputs-hover} 40 | // #{$all-text-inputs-focus} 41 | 42 | // Example 43 | //************************************************************************// 44 | // #{$all-text-inputs}, textarea { 45 | // border: 1px solid red; 46 | // } 47 | 48 | 49 | 50 | //************************************************************************// 51 | // Generate a variable ($all-button-inputs) with a list of all html5 52 | // input types that have a button-based input, excluding button. 53 | //************************************************************************// 54 | $inputs-button-list: 'input[type="button"]', 55 | 'input[type="reset"]', 56 | 'input[type="submit"]'; 57 | 58 | // Bare inputs 59 | //************************************************************************// 60 | $all-button-inputs: assign-inputs($inputs-button-list); 61 | 62 | // Hover Pseudo-class 63 | //************************************************************************// 64 | $all-button-inputs-hover: assign-inputs($inputs-button-list, hover); 65 | 66 | // Focus Pseudo-class 67 | //************************************************************************// 68 | $all-button-inputs-focus: assign-inputs($inputs-button-list, focus); 69 | 70 | // Active Pseudo-class 71 | //************************************************************************// 72 | $all-button-inputs-active: assign-inputs($inputs-button-list, active); 73 | 74 | 75 | 76 | // You must use interpolation on the variable: 77 | // #{$all-button-inputs} 78 | // #{$all-button-inputs-hover} 79 | // #{$all-button-inputs-focus} 80 | // #{$all-button-inputs-active} 81 | 82 | // Example 83 | //************************************************************************// 84 | // #{$all-button-inputs}, button { 85 | // border: 1px solid red; 86 | // } 87 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_position.scss: -------------------------------------------------------------------------------- 1 | @mixin position ($position: relative, $coordinates: null null null null) { 2 | 3 | @if type-of($position) == list { 4 | $coordinates: $position; 5 | $position: relative; 6 | } 7 | 8 | $coordinates: unpack($coordinates); 9 | 10 | $top: nth($coordinates, 1); 11 | $right: nth($coordinates, 2); 12 | $bottom: nth($coordinates, 3); 13 | $left: nth($coordinates, 4); 14 | 15 | position: $position; 16 | 17 | @if ($top and $top == auto) or (type-of($top) == number) { 18 | top: $top; 19 | } 20 | 21 | @if ($right and $right == auto) or (type-of($right) == number) { 22 | right: $right; 23 | } 24 | 25 | @if ($bottom and $bottom == auto) or (type-of($bottom) == number) { 26 | bottom: $bottom; 27 | } 28 | 29 | @if ($left and $left == auto) or (type-of($left) == number) { 30 | left: $left; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_prefixer.scss: -------------------------------------------------------------------------------- 1 | //************************************************************************// 2 | // Example: @include prefixer(border-radius, $radii, webkit ms spec); 3 | //************************************************************************// 4 | // Variables located in /settings/_prefixer.scss 5 | 6 | @mixin prefixer ($property, $value, $prefixes) { 7 | @each $prefix in $prefixes { 8 | @if $prefix == webkit { 9 | @if $prefix-for-webkit { 10 | -webkit-#{$property}: $value; 11 | } 12 | } 13 | @else if $prefix == moz { 14 | @if $prefix-for-mozilla { 15 | -moz-#{$property}: $value; 16 | } 17 | } 18 | @else if $prefix == ms { 19 | @if $prefix-for-microsoft { 20 | -ms-#{$property}: $value; 21 | } 22 | } 23 | @else if $prefix == o { 24 | @if $prefix-for-opera { 25 | -o-#{$property}: $value; 26 | } 27 | } 28 | @else if $prefix == spec { 29 | @if $prefix-for-spec { 30 | #{$property}: $value; 31 | } 32 | } 33 | @else { 34 | @warn "Unrecognized prefix: #{$prefix}"; 35 | } 36 | } 37 | } 38 | 39 | @mixin disable-prefix-for-all() { 40 | $prefix-for-webkit: false !global; 41 | $prefix-for-mozilla: false !global; 42 | $prefix-for-microsoft: false !global; 43 | $prefix-for-opera: false !global; 44 | $prefix-for-spec: false !global; 45 | } 46 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_retina-image.scss: -------------------------------------------------------------------------------- 1 | @mixin retina-image($filename, $background-size, $extension: png, $retina-filename: null, $retina-suffix: _2x, $asset-pipeline: $asset-pipeline) { 2 | @if $asset-pipeline { 3 | background-image: image-url("#{$filename}.#{$extension}"); 4 | } 5 | @else { 6 | background-image: url("#{$filename}.#{$extension}"); 7 | } 8 | 9 | @include hidpi { 10 | @if $asset-pipeline { 11 | @if $retina-filename { 12 | background-image: image-url("#{$retina-filename}.#{$extension}"); 13 | } 14 | @else { 15 | background-image: image-url("#{$filename}#{$retina-suffix}.#{$extension}"); 16 | } 17 | } 18 | 19 | @else { 20 | @if $retina-filename { 21 | background-image: url("#{$retina-filename}.#{$extension}"); 22 | } 23 | @else { 24 | background-image: url("#{$filename}#{$retina-suffix}.#{$extension}"); 25 | } 26 | } 27 | 28 | background-size: $background-size; 29 | 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_size.scss: -------------------------------------------------------------------------------- 1 | @mixin size($size) { 2 | $height: nth($size, 1); 3 | $width: $height; 4 | 5 | @if length($size) > 1 { 6 | $height: nth($size, 2); 7 | } 8 | 9 | @if $height == auto or (type-of($height) == number and not unitless($height)) { 10 | height: $height; 11 | } 12 | 13 | @if $width == auto or (type-of($width) == number and not unitless($width)) { 14 | width: $width; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_timing-functions.scss: -------------------------------------------------------------------------------- 1 | // CSS cubic-bezier timing functions. Timing functions courtesy of jquery.easie (github.com/jaukia/easie) 2 | // Timing functions are the same as demo'ed here: http://jqueryui.com/resources/demos/effect/easing.html 3 | 4 | // EASE IN 5 | $ease-in-quad: cubic-bezier(0.550, 0.085, 0.680, 0.530); 6 | $ease-in-cubic: cubic-bezier(0.550, 0.055, 0.675, 0.190); 7 | $ease-in-quart: cubic-bezier(0.895, 0.030, 0.685, 0.220); 8 | $ease-in-quint: cubic-bezier(0.755, 0.050, 0.855, 0.060); 9 | $ease-in-sine: cubic-bezier(0.470, 0.000, 0.745, 0.715); 10 | $ease-in-expo: cubic-bezier(0.950, 0.050, 0.795, 0.035); 11 | $ease-in-circ: cubic-bezier(0.600, 0.040, 0.980, 0.335); 12 | $ease-in-back: cubic-bezier(0.600, -0.280, 0.735, 0.045); 13 | 14 | // EASE OUT 15 | $ease-out-quad: cubic-bezier(0.250, 0.460, 0.450, 0.940); 16 | $ease-out-cubic: cubic-bezier(0.215, 0.610, 0.355, 1.000); 17 | $ease-out-quart: cubic-bezier(0.165, 0.840, 0.440, 1.000); 18 | $ease-out-quint: cubic-bezier(0.230, 1.000, 0.320, 1.000); 19 | $ease-out-sine: cubic-bezier(0.390, 0.575, 0.565, 1.000); 20 | $ease-out-expo: cubic-bezier(0.190, 1.000, 0.220, 1.000); 21 | $ease-out-circ: cubic-bezier(0.075, 0.820, 0.165, 1.000); 22 | $ease-out-back: cubic-bezier(0.175, 0.885, 0.320, 1.275); 23 | 24 | // EASE IN OUT 25 | $ease-in-out-quad: cubic-bezier(0.455, 0.030, 0.515, 0.955); 26 | $ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1.000); 27 | $ease-in-out-quart: cubic-bezier(0.770, 0.000, 0.175, 1.000); 28 | $ease-in-out-quint: cubic-bezier(0.860, 0.000, 0.070, 1.000); 29 | $ease-in-out-sine: cubic-bezier(0.445, 0.050, 0.550, 0.950); 30 | $ease-in-out-expo: cubic-bezier(1.000, 0.000, 0.000, 1.000); 31 | $ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.150, 0.860); 32 | $ease-in-out-back: cubic-bezier(0.680, -0.550, 0.265, 1.550); 33 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_triangle.scss: -------------------------------------------------------------------------------- 1 | @mixin triangle ($size, $color, $direction) { 2 | height: 0; 3 | width: 0; 4 | 5 | $width: nth($size, 1); 6 | $height: nth($size, length($size)); 7 | 8 | $foreground-color: nth($color, 1); 9 | $background-color: if(length($color) == 2, nth($color, 2), transparent); 10 | 11 | @if ($direction == up) or ($direction == down) or ($direction == right) or ($direction == left) { 12 | 13 | $width: $width / 2; 14 | $height: if(length($size) > 1, $height, $height/2); 15 | 16 | @if $direction == up { 17 | border-left: $width solid $background-color; 18 | border-right: $width solid $background-color; 19 | border-bottom: $height solid $foreground-color; 20 | 21 | } @else if $direction == right { 22 | border-top: $width solid $background-color; 23 | border-bottom: $width solid $background-color; 24 | border-left: $height solid $foreground-color; 25 | 26 | } @else if $direction == down { 27 | border-left: $width solid $background-color; 28 | border-right: $width solid $background-color; 29 | border-top: $height solid $foreground-color; 30 | 31 | } @else if $direction == left { 32 | border-top: $width solid $background-color; 33 | border-bottom: $width solid $background-color; 34 | border-right: $height solid $foreground-color; 35 | } 36 | } 37 | 38 | @else if ($direction == up-right) or ($direction == up-left) { 39 | border-top: $height solid $foreground-color; 40 | 41 | @if $direction == up-right { 42 | border-left: $width solid $background-color; 43 | 44 | } @else if $direction == up-left { 45 | border-right: $width solid $background-color; 46 | } 47 | } 48 | 49 | @else if ($direction == down-right) or ($direction == down-left) { 50 | border-bottom: $height solid $foreground-color; 51 | 52 | @if $direction == down-right { 53 | border-left: $width solid $background-color; 54 | 55 | } @else if $direction == down-left { 56 | border-right: $width solid $background-color; 57 | } 58 | } 59 | 60 | @else if ($direction == inset-up) { 61 | border-width: $height $width; 62 | border-style: solid; 63 | border-color: $background-color $background-color $foreground-color; 64 | } 65 | 66 | @else if ($direction == inset-down) { 67 | border-width: $height $width; 68 | border-style: solid; 69 | border-color: $foreground-color $background-color $background-color; 70 | } 71 | 72 | @else if ($direction == inset-right) { 73 | border-width: $width $height; 74 | border-style: solid; 75 | border-color: $background-color $background-color $background-color $foreground-color; 76 | } 77 | 78 | @else if ($direction == inset-left) { 79 | border-width: $width $height; 80 | border-style: solid; 81 | border-color: $background-color $foreground-color $background-color $background-color; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/addons/_word-wrap.scss: -------------------------------------------------------------------------------- 1 | @mixin word-wrap($wrap: break-word) { 2 | word-wrap: $wrap; 3 | 4 | @if $wrap == break-word { 5 | overflow-wrap: break-word; 6 | word-break: break-all; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_animation.scss: -------------------------------------------------------------------------------- 1 | // http://www.w3.org/TR/css3-animations/#the-animation-name-property- 2 | // Each of these mixins support comma separated lists of values, which allows different transitions for individual properties to be described in a single style rule. Each value in the list corresponds to the value at that same position in the other properties. 3 | 4 | // Official animation shorthand property. 5 | @mixin animation ($animations...) { 6 | @include prefixer(animation, $animations, webkit moz spec); 7 | } 8 | 9 | // Individual Animation Properties 10 | @mixin animation-name ($names...) { 11 | @include prefixer(animation-name, $names, webkit moz spec); 12 | } 13 | 14 | 15 | @mixin animation-duration ($times...) { 16 | @include prefixer(animation-duration, $times, webkit moz spec); 17 | } 18 | 19 | 20 | @mixin animation-timing-function ($motions...) { 21 | // ease | linear | ease-in | ease-out | ease-in-out 22 | @include prefixer(animation-timing-function, $motions, webkit moz spec); 23 | } 24 | 25 | 26 | @mixin animation-iteration-count ($values...) { 27 | // infinite | 28 | @include prefixer(animation-iteration-count, $values, webkit moz spec); 29 | } 30 | 31 | 32 | @mixin animation-direction ($directions...) { 33 | // normal | alternate 34 | @include prefixer(animation-direction, $directions, webkit moz spec); 35 | } 36 | 37 | 38 | @mixin animation-play-state ($states...) { 39 | // running | paused 40 | @include prefixer(animation-play-state, $states, webkit moz spec); 41 | } 42 | 43 | 44 | @mixin animation-delay ($times...) { 45 | @include prefixer(animation-delay, $times, webkit moz spec); 46 | } 47 | 48 | 49 | @mixin animation-fill-mode ($modes...) { 50 | // none | forwards | backwards | both 51 | @include prefixer(animation-fill-mode, $modes, webkit moz spec); 52 | } 53 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_appearance.scss: -------------------------------------------------------------------------------- 1 | @mixin appearance ($value) { 2 | @include prefixer(appearance, $value, webkit moz ms o spec); 3 | } 4 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_backface-visibility.scss: -------------------------------------------------------------------------------- 1 | //************************************************************************// 2 | // Backface-visibility mixin 3 | //************************************************************************// 4 | @mixin backface-visibility($visibility) { 5 | @include prefixer(backface-visibility, $visibility, webkit spec); 6 | } 7 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_background-image.scss: -------------------------------------------------------------------------------- 1 | //************************************************************************// 2 | // Background-image property for adding multiple background images with 3 | // gradients, or for stringing multiple gradients together. 4 | //************************************************************************// 5 | 6 | @mixin background-image($images...) { 7 | $webkit-images: (); 8 | $spec-images: (); 9 | 10 | @each $image in $images { 11 | $webkit-image: (); 12 | $spec-image: (); 13 | 14 | @if (type-of($image) == string) { 15 | $url-str: str-slice($image, 0, 3); 16 | $gradient-type: str-slice($image, 0, 6); 17 | 18 | @if $url-str == "url" { 19 | $webkit-image: $image; 20 | $spec-image: $image; 21 | } 22 | 23 | @else if $gradient-type == "linear" { 24 | $gradients: _linear-gradient-parser($image); 25 | $webkit-image: map-get($gradients, webkit-image); 26 | $spec-image: map-get($gradients, spec-image); 27 | } 28 | 29 | @else if $gradient-type == "radial" { 30 | $gradients: _radial-gradient-parser($image); 31 | $webkit-image: map-get($gradients, webkit-image); 32 | $spec-image: map-get($gradients, spec-image); 33 | } 34 | } 35 | 36 | $webkit-images: append($webkit-images, $webkit-image, comma); 37 | $spec-images: append($spec-images, $spec-image, comma); 38 | } 39 | 40 | background-image: $webkit-images; 41 | background-image: $spec-images; 42 | } 43 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_background.scss: -------------------------------------------------------------------------------- 1 | //************************************************************************// 2 | // Background property for adding multiple backgrounds using shorthand 3 | // notation. 4 | //************************************************************************// 5 | 6 | @mixin background($backgrounds...) { 7 | $webkit-backgrounds: (); 8 | $spec-backgrounds: (); 9 | 10 | @each $background in $backgrounds { 11 | $webkit-background: (); 12 | $spec-background: (); 13 | $background-type: type-of($background); 14 | 15 | @if $background-type == string or list { 16 | $background-str: if($background-type == list, nth($background, 1), $background); 17 | 18 | $url-str: str-slice($background-str, 0, 3); 19 | $gradient-type: str-slice($background-str, 0, 6); 20 | 21 | @if $url-str == "url" { 22 | $webkit-background: $background; 23 | $spec-background: $background; 24 | } 25 | 26 | @else if $gradient-type == "linear" { 27 | $gradients: _linear-gradient-parser("#{$background}"); 28 | $webkit-background: map-get($gradients, webkit-image); 29 | $spec-background: map-get($gradients, spec-image); 30 | } 31 | 32 | @else if $gradient-type == "radial" { 33 | $gradients: _radial-gradient-parser("#{$background}"); 34 | $webkit-background: map-get($gradients, webkit-image); 35 | $spec-background: map-get($gradients, spec-image); 36 | } 37 | 38 | @else { 39 | $webkit-background: $background; 40 | $spec-background: $background; 41 | } 42 | } 43 | 44 | @else { 45 | $webkit-background: $background; 46 | $spec-background: $background; 47 | } 48 | 49 | $webkit-backgrounds: append($webkit-backgrounds, $webkit-background, comma); 50 | $spec-backgrounds: append($spec-backgrounds, $spec-background, comma); 51 | } 52 | 53 | background: $webkit-backgrounds; 54 | background: $spec-backgrounds; 55 | } 56 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_border-image.scss: -------------------------------------------------------------------------------- 1 | @mixin border-image($borders...) { 2 | $webkit-borders: (); 3 | $spec-borders: (); 4 | 5 | @each $border in $borders { 6 | $webkit-border: (); 7 | $spec-border: (); 8 | $border-type: type-of($border); 9 | 10 | @if $border-type == string or list { 11 | $border-str: if($border-type == list, nth($border, 1), $border); 12 | 13 | $url-str: str-slice($border-str, 0, 3); 14 | $gradient-type: str-slice($border-str, 0, 6); 15 | 16 | @if $url-str == "url" { 17 | $webkit-border: $border; 18 | $spec-border: $border; 19 | } 20 | 21 | @else if $gradient-type == "linear" { 22 | $gradients: _linear-gradient-parser("#{$border}"); 23 | $webkit-border: map-get($gradients, webkit-image); 24 | $spec-border: map-get($gradients, spec-image); 25 | } 26 | 27 | @else if $gradient-type == "radial" { 28 | $gradients: _radial-gradient-parser("#{$border}"); 29 | $webkit-border: map-get($gradients, webkit-image); 30 | $spec-border: map-get($gradients, spec-image); 31 | } 32 | 33 | @else { 34 | $webkit-border: $border; 35 | $spec-border: $border; 36 | } 37 | } 38 | 39 | @else { 40 | $webkit-border: $border; 41 | $spec-border: $border; 42 | } 43 | 44 | $webkit-borders: append($webkit-borders, $webkit-border, comma); 45 | $spec-borders: append($spec-borders, $spec-border, comma); 46 | } 47 | 48 | -webkit-border-image: $webkit-borders; 49 | border-image: $spec-borders; 50 | border-style: solid; 51 | } 52 | 53 | //Examples: 54 | // @include border-image(url("image.png")); 55 | // @include border-image(url("image.png") 20 stretch); 56 | // @include border-image(linear-gradient(45deg, orange, yellow)); 57 | // @include border-image(linear-gradient(45deg, orange, yellow) stretch); 58 | // @include border-image(linear-gradient(45deg, orange, yellow) 20 30 40 50 stretch round); 59 | // @include border-image(radial-gradient(top, cover, orange, yellow, orange)); 60 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_border-radius.scss: -------------------------------------------------------------------------------- 1 | //************************************************************************// 2 | // Shorthand Border-radius mixins 3 | //************************************************************************// 4 | @mixin border-top-radius($radii) { 5 | @include prefixer(border-top-left-radius, $radii, spec); 6 | @include prefixer(border-top-right-radius, $radii, spec); 7 | } 8 | 9 | @mixin border-bottom-radius($radii) { 10 | @include prefixer(border-bottom-left-radius, $radii, spec); 11 | @include prefixer(border-bottom-right-radius, $radii, spec); 12 | } 13 | 14 | @mixin border-left-radius($radii) { 15 | @include prefixer(border-top-left-radius, $radii, spec); 16 | @include prefixer(border-bottom-left-radius, $radii, spec); 17 | } 18 | 19 | @mixin border-right-radius($radii) { 20 | @include prefixer(border-top-right-radius, $radii, spec); 21 | @include prefixer(border-bottom-right-radius, $radii, spec); 22 | } 23 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_box-sizing.scss: -------------------------------------------------------------------------------- 1 | @mixin box-sizing ($box) { 2 | // content-box | border-box | inherit 3 | @include prefixer(box-sizing, $box, webkit moz spec); 4 | } 5 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_calc.scss: -------------------------------------------------------------------------------- 1 | @mixin calc($property, $value) { 2 | #{$property}: -webkit-calc(#{$value}); 3 | #{$property}: calc(#{$value}); 4 | } 5 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_columns.scss: -------------------------------------------------------------------------------- 1 | @mixin columns($arg: auto) { 2 | // || 3 | @include prefixer(columns, $arg, webkit moz spec); 4 | } 5 | 6 | @mixin column-count($int: auto) { 7 | // auto || integer 8 | @include prefixer(column-count, $int, webkit moz spec); 9 | } 10 | 11 | @mixin column-gap($length: normal) { 12 | // normal || length 13 | @include prefixer(column-gap, $length, webkit moz spec); 14 | } 15 | 16 | @mixin column-fill($arg: auto) { 17 | // auto || length 18 | @include prefixer(column-fill, $arg, webkit moz spec); 19 | } 20 | 21 | @mixin column-rule($arg) { 22 | // || || 23 | @include prefixer(column-rule, $arg, webkit moz spec); 24 | } 25 | 26 | @mixin column-rule-color($color) { 27 | @include prefixer(column-rule-color, $color, webkit moz spec); 28 | } 29 | 30 | @mixin column-rule-style($style: none) { 31 | // none | hidden | dashed | dotted | double | groove | inset | inset | outset | ridge | solid 32 | @include prefixer(column-rule-style, $style, webkit moz spec); 33 | } 34 | 35 | @mixin column-rule-width ($width: none) { 36 | @include prefixer(column-rule-width, $width, webkit moz spec); 37 | } 38 | 39 | @mixin column-span($arg: none) { 40 | // none || all 41 | @include prefixer(column-span, $arg, webkit moz spec); 42 | } 43 | 44 | @mixin column-width($length: auto) { 45 | // auto || length 46 | @include prefixer(column-width, $length, webkit moz spec); 47 | } 48 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_filter.scss: -------------------------------------------------------------------------------- 1 | @mixin filter($function: none) { 2 | // [ 3 | @include prefixer(perspective, $depth, webkit moz spec); 4 | } 5 | 6 | @mixin perspective-origin($value: 50% 50%) { 7 | @include prefixer(perspective-origin, $value, webkit moz spec); 8 | } 9 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_placeholder.scss: -------------------------------------------------------------------------------- 1 | @mixin placeholder { 2 | $placeholders: ":-webkit-input" ":-moz" "-moz" "-ms-input"; 3 | @each $placeholder in $placeholders { 4 | &:#{$placeholder}-placeholder { 5 | @content; 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_radial-gradient.scss: -------------------------------------------------------------------------------- 1 | // Requires Sass 3.1+ 2 | @mixin radial-gradient($G1, $G2, 3 | $G3: null, $G4: null, 4 | $G5: null, $G6: null, 5 | $G7: null, $G8: null, 6 | $G9: null, $G10: null, 7 | $pos: null, 8 | $shape-size: null, 9 | $fallback: null) { 10 | 11 | $data: _radial-arg-parser($G1, $G2, $pos, $shape-size); 12 | $G1: nth($data, 1); 13 | $G2: nth($data, 2); 14 | $pos: nth($data, 3); 15 | $shape-size: nth($data, 4); 16 | 17 | $full: $G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10; 18 | 19 | // Strip deprecated cover/contain for spec 20 | $shape-size-spec: _shape-size-stripper($shape-size); 21 | 22 | // Set $G1 as the default fallback color 23 | $first-color: nth($full, 1); 24 | $fallback-color: nth($first-color, 1); 25 | 26 | @if (type-of($fallback) == color) or ($fallback == "transparent") { 27 | $fallback-color: $fallback; 28 | } 29 | 30 | // Add Commas and spaces 31 | $shape-size: if($shape-size, '#{$shape-size}, ', null); 32 | $pos: if($pos, '#{$pos}, ', null); 33 | $pos-spec: if($pos, 'at #{$pos}', null); 34 | $shape-size-spec: if(($shape-size-spec != ' ') and ($pos == null), '#{$shape-size-spec}, ', '#{$shape-size-spec} '); 35 | 36 | background-color: $fallback-color; 37 | background-image: -webkit-radial-gradient(unquote(#{$pos}#{$shape-size}#{$full})); 38 | background-image: unquote("radial-gradient(#{$shape-size-spec}#{$pos-spec}#{$full})"); 39 | } 40 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_transform.scss: -------------------------------------------------------------------------------- 1 | @mixin transform($property: none) { 2 | // none | 3 | @include prefixer(transform, $property, webkit moz ms o spec); 4 | } 5 | 6 | @mixin transform-origin($axes: 50%) { 7 | // x-axis - left | center | right | length | % 8 | // y-axis - top | center | bottom | length | % 9 | // z-axis - length 10 | @include prefixer(transform-origin, $axes, webkit moz ms o spec); 11 | } 12 | 13 | @mixin transform-style ($style: flat) { 14 | @include prefixer(transform-style, $style, webkit moz ms o spec); 15 | } 16 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_transition.scss: -------------------------------------------------------------------------------- 1 | // Shorthand mixin. Supports multiple parentheses-deliminated values for each variable. 2 | // Example: @include transition (all 2s ease-in-out); 3 | // @include transition (opacity 1s ease-in 2s, width 2s ease-out); 4 | // @include transition-property (transform, opacity); 5 | 6 | @mixin transition ($properties...) { 7 | // Fix for vendor-prefix transform property 8 | $needs-prefixes: false; 9 | $webkit: (); 10 | $moz: (); 11 | $spec: (); 12 | 13 | // Create lists for vendor-prefixed transform 14 | @each $list in $properties { 15 | @if nth($list, 1) == "transform" { 16 | $needs-prefixes: true; 17 | $list1: -webkit-transform; 18 | $list2: -moz-transform; 19 | $list3: (); 20 | 21 | @each $var in $list { 22 | $list3: join($list3, $var); 23 | 24 | @if $var != "transform" { 25 | $list1: join($list1, $var); 26 | $list2: join($list2, $var); 27 | } 28 | } 29 | 30 | $webkit: append($webkit, $list1); 31 | $moz: append($moz, $list2); 32 | $spec: append($spec, $list3); 33 | } 34 | 35 | // Create lists for non-prefixed transition properties 36 | @else { 37 | $webkit: append($webkit, $list, comma); 38 | $moz: append($moz, $list, comma); 39 | $spec: append($spec, $list, comma); 40 | } 41 | } 42 | 43 | @if $needs-prefixes { 44 | -webkit-transition: $webkit; 45 | -moz-transition: $moz; 46 | transition: $spec; 47 | } 48 | @else { 49 | @if length($properties) >= 1 { 50 | @include prefixer(transition, $properties, webkit moz spec); 51 | } 52 | 53 | @else { 54 | $properties: all 0.15s ease-out 0s; 55 | @include prefixer(transition, $properties, webkit moz spec); 56 | } 57 | } 58 | } 59 | 60 | @mixin transition-property ($properties...) { 61 | -webkit-transition-property: transition-property-names($properties, 'webkit'); 62 | -moz-transition-property: transition-property-names($properties, 'moz'); 63 | transition-property: transition-property-names($properties, false); 64 | } 65 | 66 | @mixin transition-duration ($times...) { 67 | @include prefixer(transition-duration, $times, webkit moz spec); 68 | } 69 | 70 | @mixin transition-timing-function ($motions...) { 71 | // ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier() 72 | @include prefixer(transition-timing-function, $motions, webkit moz spec); 73 | } 74 | 75 | @mixin transition-delay ($times...) { 76 | @include prefixer(transition-delay, $times, webkit moz spec); 77 | } 78 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/css3/_user-select.scss: -------------------------------------------------------------------------------- 1 | @mixin user-select($arg: none) { 2 | @include prefixer(user-select, $arg, webkit moz ms spec); 3 | } 4 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_assign.scss: -------------------------------------------------------------------------------- 1 | @function assign-inputs($inputs, $pseudo: null) { 2 | $list : (); 3 | 4 | @each $input in $inputs { 5 | $input: unquote($input); 6 | $input: if($pseudo, $input + ":" + $pseudo, $input); 7 | $list: append($list, $input, comma); 8 | } 9 | 10 | @return $list; 11 | } -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_color-lightness.scss: -------------------------------------------------------------------------------- 1 | // Programatically determines whether a color is light or dark 2 | // Returns a boolean 3 | // More details here http://robots.thoughtbot.com/closer-look-color-lightness 4 | 5 | @function is-light($hex-color) { 6 | $-local-red: red(rgba($hex-color, 1.0)); 7 | $-local-green: green(rgba($hex-color, 1.0)); 8 | $-local-blue: blue(rgba($hex-color, 1.0)); 9 | 10 | $-local-lightness: ($-local-red * 0.2126 + $-local-green * 0.7152 + $-local-blue * 0.0722) / 255; 11 | 12 | @return $-local-lightness > .6; 13 | } 14 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_flex-grid.scss: -------------------------------------------------------------------------------- 1 | // Flexible grid 2 | @function flex-grid($columns, $container-columns: $fg-max-columns) { 3 | $width: $columns * $fg-column + ($columns - 1) * $fg-gutter; 4 | $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; 5 | @return percentage($width / $container-width); 6 | } 7 | 8 | // Flexible gutter 9 | @function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) { 10 | $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; 11 | @return percentage($gutter / $container-width); 12 | } 13 | 14 | // The $fg-column, $fg-gutter and $fg-max-columns variables must be defined in your base stylesheet to properly use the flex-grid function. 15 | // This function takes the fluid grid equation (target / context = result) and uses columns to help define each. 16 | // 17 | // The calculation presumes that your column structure will be missing the last gutter: 18 | // 19 | // -- column -- gutter -- column -- gutter -- column 20 | // 21 | // $fg-column: 60px; // Column Width 22 | // $fg-gutter: 25px; // Gutter Width 23 | // $fg-max-columns: 12; // Total Columns For Main Container 24 | // 25 | // div { 26 | // width: flex-grid(4); // returns (315px / 995px) = 31.65829%; 27 | // margin-left: flex-gutter(); // returns (25px / 995px) = 2.51256%; 28 | // 29 | // p { 30 | // width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%; 31 | // float: left; 32 | // margin: flex-gutter(4); // returns (25px / 315px) = 7.936508%; 33 | // } 34 | // 35 | // blockquote { 36 | // float: left; 37 | // width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%; 38 | // } 39 | // } -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_golden-ratio.scss: -------------------------------------------------------------------------------- 1 | @function golden-ratio($value, $increment) { 2 | @return modular-scale($value, $increment, $golden) 3 | } 4 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_grid-width.scss: -------------------------------------------------------------------------------- 1 | @function grid-width($n) { 2 | @return $n * $gw-column + ($n - 1) * $gw-gutter; 3 | } 4 | 5 | // The $gw-column and $gw-gutter variables must be defined in your base stylesheet to properly use the grid-width function. 6 | // 7 | // $gw-column: 100px; // Column Width 8 | // $gw-gutter: 40px; // Gutter Width 9 | // 10 | // div { 11 | // width: grid-width(4); // returns 520px; 12 | // margin-left: $gw-gutter; // returns 40px; 13 | // } 14 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_modular-scale.scss: -------------------------------------------------------------------------------- 1 | // Scaling Variables 2 | $golden: 1.618; 3 | $minor-second: 1.067; 4 | $major-second: 1.125; 5 | $minor-third: 1.2; 6 | $major-third: 1.25; 7 | $perfect-fourth: 1.333; 8 | $augmented-fourth: 1.414; 9 | $perfect-fifth: 1.5; 10 | $minor-sixth: 1.6; 11 | $major-sixth: 1.667; 12 | $minor-seventh: 1.778; 13 | $major-seventh: 1.875; 14 | $octave: 2; 15 | $major-tenth: 2.5; 16 | $major-eleventh: 2.667; 17 | $major-twelfth: 3; 18 | $double-octave: 4; 19 | 20 | @function modular-scale($value, $increment, $ratio) { 21 | $v1: nth($value, 1); 22 | $v2: nth($value, length($value)); 23 | $value: $v1; 24 | 25 | // scale $v2 to just above $v1 26 | @while $v2 > $v1 { 27 | $v2: ($v2 / $ratio); // will be off-by-1 28 | } 29 | @while $v2 < $v1 { 30 | $v2: ($v2 * $ratio); // will fix off-by-1 31 | } 32 | 33 | // check AFTER scaling $v2 to prevent double-counting corner-case 34 | $double-stranded: $v2 > $v1; 35 | 36 | @if $increment > 0 { 37 | @for $i from 1 through $increment { 38 | @if $double-stranded and ($v1 * $ratio) > $v2 { 39 | $value: $v2; 40 | $v2: ($v2 * $ratio); 41 | } @else { 42 | $v1: ($v1 * $ratio); 43 | $value: $v1; 44 | } 45 | } 46 | } 47 | 48 | @if $increment < 0 { 49 | // adjust $v2 to just below $v1 50 | @if $double-stranded { 51 | $v2: ($v2 / $ratio); 52 | } 53 | 54 | @for $i from $increment through -1 { 55 | @if $double-stranded and ($v1 / $ratio) < $v2 { 56 | $value: $v2; 57 | $v2: ($v2 / $ratio); 58 | } @else { 59 | $v1: ($v1 / $ratio); 60 | $value: $v1; 61 | } 62 | } 63 | } 64 | 65 | @return $value; 66 | } 67 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_px-to-em.scss: -------------------------------------------------------------------------------- 1 | // Convert pixels to ems 2 | // eg. for a relational value of 12px write em(12) when the parent is 16px 3 | // if the parent is another value say 24px write em(12, 24) 4 | 5 | @function em($pxval, $base: $em-base) { 6 | @if not unitless($pxval) { 7 | $pxval: strip-units($pxval); 8 | } 9 | @if not unitless($base) { 10 | $base: strip-units($base); 11 | } 12 | @return ($pxval / $base) * 1em; 13 | } 14 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_px-to-rem.scss: -------------------------------------------------------------------------------- 1 | // Convert pixels to rems 2 | // eg. for a relational value of 12px write rem(12) 3 | // Assumes $em-base is the font-size of 4 | 5 | @function rem($pxval) { 6 | @if not unitless($pxval) { 7 | $pxval: strip-units($pxval); 8 | } 9 | 10 | $base: $em-base; 11 | @if not unitless($base) { 12 | $base: strip-units($base); 13 | } 14 | @return ($pxval / $base) * 1rem; 15 | } 16 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_strip-units.scss: -------------------------------------------------------------------------------- 1 | // Srtips the units from a value. e.g. 12px -> 12 2 | 3 | @function strip-units($val) { 4 | @return ($val / ($val * 0 + 1)); 5 | } 6 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_tint-shade.scss: -------------------------------------------------------------------------------- 1 | // Add percentage of white to a color 2 | @function tint($color, $percent){ 3 | @return mix(white, $color, $percent); 4 | } 5 | 6 | // Add percentage of black to a color 7 | @function shade($color, $percent){ 8 | @return mix(black, $color, $percent); 9 | } 10 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_transition-property-name.scss: -------------------------------------------------------------------------------- 1 | // Return vendor-prefixed property names if appropriate 2 | // Example: transition-property-names((transform, color, background), moz) -> -moz-transform, color, background 3 | //************************************************************************// 4 | @function transition-property-names($props, $vendor: false) { 5 | $new-props: (); 6 | 7 | @each $prop in $props { 8 | $new-props: append($new-props, transition-property-name($prop, $vendor), comma); 9 | } 10 | 11 | @return $new-props; 12 | } 13 | 14 | @function transition-property-name($prop, $vendor: false) { 15 | // put other properties that need to be prefixed here aswell 16 | @if $vendor and $prop == transform { 17 | @return unquote('-'+$vendor+'-'+$prop); 18 | } 19 | @else { 20 | @return $prop; 21 | } 22 | } -------------------------------------------------------------------------------- /bower_components/bourbon/dist/functions/_unpack.scss: -------------------------------------------------------------------------------- 1 | // Convert shorthand to the 4-value syntax 2 | 3 | @function unpack($shorthand) { 4 | @if length($shorthand) == 1 { 5 | @return nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1); 6 | } 7 | @else if length($shorthand) == 2 { 8 | @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 1) nth($shorthand, 2); 9 | } 10 | @else if length($shorthand) == 3 { 11 | @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 3) nth($shorthand, 2); 12 | } 13 | @else { 14 | @return $shorthand; 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_convert-units.scss: -------------------------------------------------------------------------------- 1 | //************************************************************************// 2 | // Helper function for str-to-num fn. 3 | // Source: http://sassmeister.com/gist/9647408 4 | //************************************************************************// 5 | @function _convert-units($number, $unit) { 6 | $strings: 'px' 'cm' 'mm' '%' 'ch' 'pica' 'in' 'em' 'rem' 'pt' 'pc' 'ex' 'vw' 'vh' 'vmin' 'vmax', 'deg', 'rad', 'grad', 'turn'; 7 | $units: 1px 1cm 1mm 1% 1ch 1pica 1in 1em 1rem 1pt 1pc 1ex 1vw 1vh 1vmin 1vmax, 1deg, 1rad, 1grad, 1turn; 8 | $index: index($strings, $unit); 9 | 10 | @if not $index { 11 | @warn "Unknown unit `#{$unit}`."; 12 | @return false; 13 | } 14 | @return $number * nth($units, $index); 15 | } 16 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_gradient-positions-parser.scss: -------------------------------------------------------------------------------- 1 | @function _gradient-positions-parser($gradient-type, $gradient-positions) { 2 | @if $gradient-positions 3 | and ($gradient-type == linear) 4 | and (type-of($gradient-positions) != color) { 5 | $gradient-positions: _linear-positions-parser($gradient-positions); 6 | } 7 | @else if $gradient-positions 8 | and ($gradient-type == radial) 9 | and (type-of($gradient-positions) != color) { 10 | $gradient-positions: _radial-positions-parser($gradient-positions); 11 | } 12 | @return $gradient-positions; 13 | } 14 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_is-num.scss: -------------------------------------------------------------------------------- 1 | //************************************************************************// 2 | // Helper for linear-gradient-parser 3 | //************************************************************************// 4 | @function _is-num($char) { 5 | $values: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 0 1 2 3 4 5 6 7 8 9; 6 | $index: index($values, $char); 7 | @return if($index, true, false); 8 | } 9 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_linear-angle-parser.scss: -------------------------------------------------------------------------------- 1 | // Private function for linear-gradient-parser 2 | @function _linear-angle-parser($image, $first-val, $prefix, $suffix) { 3 | $offset: null; 4 | $unit-short: str-slice($first-val, str-length($first-val) - 2, str-length($first-val)); 5 | $unit-long: str-slice($first-val, str-length($first-val) - 3, str-length($first-val)); 6 | 7 | @if ($unit-long == "grad") or 8 | ($unit-long == "turn") { 9 | $offset: if($unit-long == "grad", -100grad * 3, -0.75turn); 10 | } 11 | 12 | @else if ($unit-short == "deg") or 13 | ($unit-short == "rad") { 14 | $offset: if($unit-short == "deg", -90 * 3, 1.6rad); 15 | } 16 | 17 | @if $offset { 18 | $num: _str-to-num($first-val); 19 | 20 | @return ( 21 | webkit-image: -webkit- + $prefix + ($offset - $num) + $suffix, 22 | spec-image: $image 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_linear-gradient-parser.scss: -------------------------------------------------------------------------------- 1 | @function _linear-gradient-parser($image) { 2 | $image: unquote($image); 3 | $gradients: (); 4 | $start: str-index($image, "("); 5 | $end: str-index($image, ","); 6 | $first-val: str-slice($image, $start + 1, $end - 1); 7 | 8 | $prefix: str-slice($image, 0, $start); 9 | $suffix: str-slice($image, $end, str-length($image)); 10 | 11 | $has-multiple-vals: str-index($first-val, " "); 12 | $has-single-position: unquote(_position-flipper($first-val) + ""); 13 | $has-angle: _is-num(str-slice($first-val, 0, 0)); 14 | 15 | @if $has-multiple-vals { 16 | $gradients: _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals); 17 | } 18 | 19 | @else if $has-single-position != "" { 20 | $pos: unquote($has-single-position + ""); 21 | 22 | $gradients: ( 23 | webkit-image: -webkit- + $image, 24 | spec-image: $prefix + "to " + $pos + $suffix 25 | ); 26 | } 27 | 28 | @else if $has-angle { 29 | // Rotate degree for webkit 30 | $gradients: _linear-angle-parser($image, $first-val, $prefix, $suffix); 31 | } 32 | 33 | @else { 34 | $gradients: ( 35 | webkit-image: -webkit- + $image, 36 | spec-image: $image 37 | ); 38 | } 39 | 40 | @return $gradients; 41 | } 42 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_linear-positions-parser.scss: -------------------------------------------------------------------------------- 1 | @function _linear-positions-parser($pos) { 2 | $type: type-of(nth($pos, 1)); 3 | $spec: null; 4 | $degree: null; 5 | $side: null; 6 | $corner: null; 7 | $length: length($pos); 8 | // Parse Side and corner positions 9 | @if ($length > 1) { 10 | @if nth($pos, 1) == "to" { // Newer syntax 11 | $side: nth($pos, 2); 12 | 13 | @if $length == 2 { // eg. to top 14 | // Swap for backwards compatability 15 | $degree: _position-flipper(nth($pos, 2)); 16 | } 17 | @else if $length == 3 { // eg. to top left 18 | $corner: nth($pos, 3); 19 | } 20 | } 21 | @else if $length == 2 { // Older syntax ("top left") 22 | $side: _position-flipper(nth($pos, 1)); 23 | $corner: _position-flipper(nth($pos, 2)); 24 | } 25 | 26 | @if ("#{$side} #{$corner}" == "left top") or ("#{$side} #{$corner}" == "top left") { 27 | $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); 28 | } 29 | @else if ("#{$side} #{$corner}" == "right top") or ("#{$side} #{$corner}" == "top right") { 30 | $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); 31 | } 32 | @else if ("#{$side} #{$corner}" == "right bottom") or ("#{$side} #{$corner}" == "bottom right") { 33 | $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); 34 | } 35 | @else if ("#{$side} #{$corner}" == "left bottom") or ("#{$side} #{$corner}" == "bottom left") { 36 | $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); 37 | } 38 | $spec: to $side $corner; 39 | } 40 | @else if $length == 1 { 41 | // Swap for backwards compatability 42 | @if $type == string { 43 | $degree: $pos; 44 | $spec: to _position-flipper($pos); 45 | } 46 | @else { 47 | $degree: -270 - $pos; //rotate the gradient opposite from spec 48 | $spec: $pos; 49 | } 50 | } 51 | $degree: unquote($degree + ","); 52 | $spec: unquote($spec + ","); 53 | @return $degree $spec; 54 | } 55 | 56 | @function _position-flipper($pos) { 57 | @return if($pos == left, right, null) 58 | if($pos == right, left, null) 59 | if($pos == top, bottom, null) 60 | if($pos == bottom, top, null); 61 | } 62 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_linear-side-corner-parser.scss: -------------------------------------------------------------------------------- 1 | // Private function for linear-gradient-parser 2 | @function _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals) { 3 | $val-1: str-slice($first-val, 0, $has-multiple-vals - 1 ); 4 | $val-2: str-slice($first-val, $has-multiple-vals + 1, str-length($first-val)); 5 | $val-3: null; 6 | $has-val-3: str-index($val-2, " "); 7 | 8 | @if $has-val-3 { 9 | $val-3: str-slice($val-2, $has-val-3 + 1, str-length($val-2)); 10 | $val-2: str-slice($val-2, 0, $has-val-3 - 1); 11 | } 12 | 13 | $pos: _position-flipper($val-1) _position-flipper($val-2) _position-flipper($val-3); 14 | $pos: unquote($pos + ""); 15 | 16 | // Use old spec for webkit 17 | @if $val-1 == "to" { 18 | @return ( 19 | webkit-image: -webkit- + $prefix + $pos + $suffix, 20 | spec-image: $image 21 | ); 22 | } 23 | 24 | // Bring the code up to spec 25 | @else { 26 | @return ( 27 | webkit-image: -webkit- + $image, 28 | spec-image: $prefix + "to " + $pos + $suffix 29 | ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_radial-arg-parser.scss: -------------------------------------------------------------------------------- 1 | @function _radial-arg-parser($G1, $G2, $pos, $shape-size) { 2 | @each $value in $G1, $G2 { 3 | $first-val: nth($value, 1); 4 | $pos-type: type-of($first-val); 5 | $spec-at-index: null; 6 | 7 | // Determine if spec was passed to mixin 8 | @if type-of($value) == list { 9 | $spec-at-index: if(index($value, at), index($value, at), false); 10 | } 11 | @if $spec-at-index { 12 | @if $spec-at-index > 1 { 13 | @for $i from 1 through ($spec-at-index - 1) { 14 | $shape-size: $shape-size nth($value, $i); 15 | } 16 | @for $i from ($spec-at-index + 1) through length($value) { 17 | $pos: $pos nth($value, $i); 18 | } 19 | } 20 | @else if $spec-at-index == 1 { 21 | @for $i from ($spec-at-index + 1) through length($value) { 22 | $pos: $pos nth($value, $i); 23 | } 24 | } 25 | $G1: null; 26 | } 27 | 28 | // If not spec calculate correct values 29 | @else { 30 | @if ($pos-type != color) or ($first-val != "transparent") { 31 | @if ($pos-type == number) 32 | or ($first-val == "center") 33 | or ($first-val == "top") 34 | or ($first-val == "right") 35 | or ($first-val == "bottom") 36 | or ($first-val == "left") { 37 | 38 | $pos: $value; 39 | 40 | @if $pos == $G1 { 41 | $G1: null; 42 | } 43 | } 44 | 45 | @else if 46 | ($first-val == "ellipse") 47 | or ($first-val == "circle") 48 | or ($first-val == "closest-side") 49 | or ($first-val == "closest-corner") 50 | or ($first-val == "farthest-side") 51 | or ($first-val == "farthest-corner") 52 | or ($first-val == "contain") 53 | or ($first-val == "cover") { 54 | 55 | $shape-size: $value; 56 | 57 | @if $value == $G1 { 58 | $G1: null; 59 | } 60 | 61 | @else if $value == $G2 { 62 | $G2: null; 63 | } 64 | } 65 | } 66 | } 67 | } 68 | @return $G1, $G2, $pos, $shape-size; 69 | } 70 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_radial-gradient-parser.scss: -------------------------------------------------------------------------------- 1 | @function _radial-gradient-parser($image) { 2 | $image: unquote($image); 3 | $gradients: (); 4 | $start: str-index($image, "("); 5 | $end: str-index($image, ","); 6 | $first-val: str-slice($image, $start + 1, $end - 1); 7 | 8 | $prefix: str-slice($image, 0, $start); 9 | $suffix: str-slice($image, $end, str-length($image)); 10 | 11 | $is-spec-syntax: str-index($first-val, "at"); 12 | 13 | @if $is-spec-syntax and $is-spec-syntax > 1 { 14 | $keyword: str-slice($first-val, 1, $is-spec-syntax - 2); 15 | $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val)); 16 | $pos: append($pos, $keyword, comma); 17 | 18 | $gradients: ( 19 | webkit-image: -webkit- + $prefix + $pos + $suffix, 20 | spec-image: $image 21 | ) 22 | } 23 | 24 | @else if $is-spec-syntax == 1 { 25 | $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val)); 26 | 27 | $gradients: ( 28 | webkit-image: -webkit- + $prefix + $pos + $suffix, 29 | spec-image: $image 30 | ) 31 | } 32 | 33 | @else if str-index($image, "cover") or str-index($image, "contain") { 34 | @warn "Radial-gradient needs to be updated to conform to latest spec."; 35 | 36 | $gradients: ( 37 | webkit-image: null, 38 | spec-image: $image 39 | ) 40 | } 41 | 42 | @else { 43 | $gradients: ( 44 | webkit-image: -webkit- + $image, 45 | spec-image: $image 46 | ) 47 | } 48 | 49 | @return $gradients; 50 | } 51 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_radial-positions-parser.scss: -------------------------------------------------------------------------------- 1 | @function _radial-positions-parser($gradient-pos) { 2 | $shape-size: nth($gradient-pos, 1); 3 | $pos: nth($gradient-pos, 2); 4 | $shape-size-spec: _shape-size-stripper($shape-size); 5 | 6 | $pre-spec: unquote(if($pos, "#{$pos}, ", null)) 7 | unquote(if($shape-size, "#{$shape-size},", null)); 8 | $pos-spec: if($pos, "at #{$pos}", null); 9 | 10 | $spec: "#{$shape-size-spec} #{$pos-spec}"; 11 | 12 | // Add comma 13 | @if ($spec != ' ') { 14 | $spec: "#{$spec}," 15 | } 16 | 17 | @return $pre-spec $spec; 18 | } 19 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_render-gradients.scss: -------------------------------------------------------------------------------- 1 | // User for linear and radial gradients within background-image or border-image properties 2 | 3 | @function _render-gradients($gradient-positions, $gradients, $gradient-type, $vendor: false) { 4 | $pre-spec: null; 5 | $spec: null; 6 | $vendor-gradients: null; 7 | @if $gradient-type == linear { 8 | @if $gradient-positions { 9 | $pre-spec: nth($gradient-positions, 1); 10 | $spec: nth($gradient-positions, 2); 11 | } 12 | } 13 | @else if $gradient-type == radial { 14 | $pre-spec: nth($gradient-positions, 1); 15 | $spec: nth($gradient-positions, 2); 16 | } 17 | 18 | @if $vendor { 19 | $vendor-gradients: -#{$vendor}-#{$gradient-type}-gradient(#{$pre-spec} $gradients); 20 | } 21 | @else if $vendor == false { 22 | $vendor-gradients: "#{$gradient-type}-gradient(#{$spec} #{$gradients})"; 23 | $vendor-gradients: unquote($vendor-gradients); 24 | } 25 | @return $vendor-gradients; 26 | } 27 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_shape-size-stripper.scss: -------------------------------------------------------------------------------- 1 | @function _shape-size-stripper($shape-size) { 2 | $shape-size-spec: null; 3 | @each $value in $shape-size { 4 | @if ($value == "cover") or ($value == "contain") { 5 | $value: null; 6 | } 7 | $shape-size-spec: "#{$shape-size-spec} #{$value}"; 8 | } 9 | @return $shape-size-spec; 10 | } 11 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/helpers/_str-to-num.scss: -------------------------------------------------------------------------------- 1 | //************************************************************************// 2 | // Helper function for linear/radial-gradient-parsers. 3 | // Source: http://sassmeister.com/gist/9647408 4 | //************************************************************************// 5 | @function _str-to-num($string) { 6 | // Matrices 7 | $strings: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'; 8 | $numbers: 0 1 2 3 4 5 6 7 8 9; 9 | 10 | // Result 11 | $result: 0; 12 | $divider: 0; 13 | $minus: false; 14 | 15 | // Looping through all characters 16 | @for $i from 1 through str-length($string) { 17 | $character: str-slice($string, $i, $i); 18 | $index: index($strings, $character); 19 | 20 | @if $character == '-' { 21 | $minus: true; 22 | } 23 | 24 | @else if $character == '.' { 25 | $divider: 1; 26 | } 27 | 28 | @else { 29 | @if not $index { 30 | $result: if($minus, $result * -1, $result); 31 | @return _convert-units($result, str-slice($string, $i)); 32 | } 33 | 34 | $number: nth($numbers, $index); 35 | 36 | @if $divider == 0 { 37 | $result: $result * 10; 38 | } 39 | 40 | @else { 41 | // Move the decimal dot to the left 42 | $divider: $divider * 10; 43 | $number: $number / $divider; 44 | } 45 | 46 | $result: $result + $number; 47 | } 48 | } 49 | @return if($minus, $result * -1, $result); 50 | } 51 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/settings/_asset-pipeline.scss: -------------------------------------------------------------------------------- 1 | $asset-pipeline: false !default; 2 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/settings/_prefixer.scss: -------------------------------------------------------------------------------- 1 | // Variable settings for /addons/prefixer.scss 2 | $prefix-for-webkit: true !default; 3 | $prefix-for-mozilla: true !default; 4 | $prefix-for-microsoft: true !default; 5 | $prefix-for-opera: true !default; 6 | $prefix-for-spec: true !default; // required for keyframe mixin 7 | -------------------------------------------------------------------------------- /bower_components/bourbon/dist/settings/_px-to-em.scss: -------------------------------------------------------------------------------- 1 | $em-base: 16px !default; 2 | -------------------------------------------------------------------------------- /bower_components/bourbon/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bourbon", 3 | "version": "4.0.2", 4 | "description": "A simple and lightweight mixin library for Sass.", 5 | "main": "dist/_bourbon.scss", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thoughtbot/bourbon" 12 | }, 13 | "keywords": [ 14 | "scss", 15 | "css", 16 | "mixins" 17 | ], 18 | "author": "Thoughtbot", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/thoughtbot/bourbon/issues" 22 | }, 23 | "homepage": "https://github.com/thoughtbot/bourbon" 24 | } 25 | -------------------------------------------------------------------------------- /bower_components/font-awesome/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "font-awesome", 3 | "description": "Font Awesome", 4 | "version": "4.2.0", 5 | "keywords": [], 6 | "homepage": "http://fontawesome.io", 7 | "dependencies": {}, 8 | "devDependencies": {}, 9 | "license": [ 10 | "OFL-1.1", 11 | "MIT", 12 | "CC-BY-3.0" 13 | ], 14 | "main": [ 15 | "./css/font-awesome.css", 16 | "./fonts/*" 17 | ], 18 | "ignore": [ 19 | "*/.*", 20 | "*.json", 21 | "src", 22 | "*.yml", 23 | "Gemfile", 24 | "Gemfile.lock", 25 | "*.md" 26 | ], 27 | "_release": "4.2.0", 28 | "_resolution": { 29 | "type": "version", 30 | "tag": "v4.2.0", 31 | "commit": "0b924144a95a54fa738d0450ff66c1dabd11ae74" 32 | }, 33 | "_source": "git://github.com/FortAwesome/Font-Awesome.git", 34 | "_target": "~4.2.0", 35 | "_originalSource": "font-awesome", 36 | "_direct": true 37 | } -------------------------------------------------------------------------------- /bower_components/font-awesome/.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.egg-info 3 | *.db 4 | *.db.old 5 | *.swp 6 | *.db-journal 7 | 8 | .coverage 9 | .DS_Store 10 | .installed.cfg 11 | _gh_pages/* 12 | 13 | .idea/* 14 | .svn/* 15 | src/website/static/* 16 | src/website/media/* 17 | 18 | bin 19 | cfcache 20 | develop-eggs 21 | dist 22 | downloads 23 | eggs 24 | parts 25 | tmp 26 | .sass-cache 27 | node_modules 28 | 29 | src/website/settingslocal.py 30 | stunnel.log 31 | 32 | .ruby-version 33 | -------------------------------------------------------------------------------- /bower_components/font-awesome/.npmignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.egg-info 3 | *.db 4 | *.db.old 5 | *.swp 6 | *.db-journal 7 | 8 | .coverage 9 | .DS_Store 10 | .installed.cfg 11 | _gh_pages/* 12 | 13 | .idea/* 14 | .svn/* 15 | src/website/static/* 16 | src/website/media/* 17 | 18 | bin 19 | cfcache 20 | develop-eggs 21 | dist 22 | downloads 23 | eggs 24 | parts 25 | tmp 26 | .sass-cache 27 | node_modules 28 | 29 | src/website/settingslocal.py 30 | stunnel.log 31 | 32 | .ruby-version 33 | 34 | # don't need these in the npm package. 35 | src/ 36 | _config.yml 37 | bower.json 38 | component.json 39 | composer.json 40 | CONTRIBUTING.md 41 | Gemfile 42 | Gemfile.lock 43 | -------------------------------------------------------------------------------- /bower_components/font-awesome/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "font-awesome", 3 | "description": "Font Awesome", 4 | "version": "4.2.0", 5 | "keywords": [], 6 | "homepage": "http://fontawesome.io", 7 | "dependencies": {}, 8 | "devDependencies": {}, 9 | "license": ["OFL-1.1", "MIT", "CC-BY-3.0"], 10 | "main": [ 11 | "./css/font-awesome.css", 12 | "./fonts/*" 13 | ], 14 | "ignore": [ 15 | "*/.*", 16 | "*.json", 17 | "src", 18 | "*.yml", 19 | "Gemfile", 20 | "Gemfile.lock", 21 | "*.md" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /bower_components/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyConChina/staticpycon/fe43b3f5080582f1c575d036ee4d4565987d83b0/bower_components/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /bower_components/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyConChina/staticpycon/fe43b3f5080582f1c575d036ee4d4565987d83b0/bower_components/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /bower_components/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyConChina/staticpycon/fe43b3f5080582f1c575d036ee4d4565987d83b0/bower_components/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /bower_components/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyConChina/staticpycon/fe43b3f5080582f1c575d036ee4d4565987d83b0/bower_components/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /bower_components/font-awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .pull-right { float: right; } 11 | .pull-left { float: left; } 12 | 13 | .@{fa-css-prefix} { 14 | &.pull-left { margin-right: .3em; } 15 | &.pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /bower_components/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | -------------------------------------------------------------------------------- /bower_components/font-awesome/less/extras.less: -------------------------------------------------------------------------------- 1 | // Extras 2 | // -------------------------- 3 | -------------------------------------------------------------------------------- /bower_components/font-awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /bower_components/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "spinning.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | -------------------------------------------------------------------------------- /bower_components/font-awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /bower_components/font-awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /bower_components/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | 13 | .fa-icon-rotate(@degrees, @rotation) { 14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); 15 | -webkit-transform: rotate(@degrees); 16 | -ms-transform: rotate(@degrees); 17 | transform: rotate(@degrees); 18 | } 19 | 20 | .fa-icon-flip(@horiz, @vert, @rotation) { 21 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); 22 | -webkit-transform: scale(@horiz, @vert); 23 | -ms-transform: scale(@horiz, @vert); 24 | transform: scale(@horiz, @vert); 25 | } 26 | -------------------------------------------------------------------------------- /bower_components/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 9 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 10 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 11 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /bower_components/font-awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /bower_components/font-awesome/less/spinning.less: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | @-webkit-keyframes fa-spin { 10 | 0% { 11 | -webkit-transform: rotate(0deg); 12 | transform: rotate(0deg); 13 | } 14 | 100% { 15 | -webkit-transform: rotate(359deg); 16 | transform: rotate(359deg); 17 | } 18 | } 19 | 20 | @keyframes fa-spin { 21 | 0% { 22 | -webkit-transform: rotate(0deg); 23 | transform: rotate(0deg); 24 | } 25 | 100% { 26 | -webkit-transform: rotate(359deg); 27 | transform: rotate(359deg); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /bower_components/font-awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .pull-right { float: right; } 11 | .pull-left { float: left; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.pull-left { margin-right: .3em; } 15 | &.pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/_extras.scss: -------------------------------------------------------------------------------- 1 | /* EXTRAS 2 | * -------------------------- */ 3 | 4 | /* Stacked and layered icon */ 5 | 6 | /* Animated rotating icon */ 7 | .#{$fa-css-prefix}-spin { 8 | -webkit-animation: spin 2s infinite linear; 9 | -moz-animation: spin 2s infinite linear; 10 | -o-animation: spin 2s infinite linear; 11 | animation: spin 2s infinite linear; 12 | } 13 | 14 | @-moz-keyframes spin { 15 | 0% { -moz-transform: rotate(0deg); } 16 | 100% { -moz-transform: rotate(359deg); } 17 | } 18 | @-webkit-keyframes spin { 19 | 0% { -webkit-transform: rotate(0deg); } 20 | 100% { -webkit-transform: rotate(359deg); } 21 | } 22 | @-o-keyframes spin { 23 | 0% { -o-transform: rotate(0deg); } 24 | 100% { -o-transform: rotate(359deg); } 25 | } 26 | @-ms-keyframes spin { 27 | 0% { -ms-transform: rotate(0deg); } 28 | 100% { -ms-transform: rotate(359deg); } 29 | } 30 | @keyframes spin { 31 | 0% { transform: rotate(0deg); } 32 | 100% { transform: rotate(359deg); } 33 | } 34 | 35 | 36 | // Icon rotations & flipping 37 | // ------------------------- 38 | 39 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 40 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 41 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 42 | 43 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 44 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 45 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | 13 | @mixin fa-icon-rotate($degrees, $rotation) { 14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 15 | -webkit-transform: rotate($degrees); 16 | -ms-transform: rotate($degrees); 17 | transform: rotate($degrees); 18 | } 19 | 20 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 21 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 22 | -webkit-transform: scale($horiz, $vert); 23 | -ms-transform: scale($horiz, $vert); 24 | transform: scale($horiz, $vert); 25 | } 26 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 9 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 10 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 11 | //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/_spinning.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | @-webkit-keyframes fa-spin { 10 | 0% { 11 | -webkit-transform: rotate(0deg); 12 | transform: rotate(0deg); 13 | } 14 | 100% { 15 | -webkit-transform: rotate(359deg); 16 | transform: rotate(359deg); 17 | } 18 | } 19 | 20 | @keyframes fa-spin { 21 | 0% { 22 | -webkit-transform: rotate(0deg); 23 | transform: rotate(0deg); 24 | } 25 | 100% { 26 | -webkit-transform: rotate(359deg); 27 | transform: rotate(359deg); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /bower_components/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "spinning"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | -------------------------------------------------------------------------------- /bower_components/neat/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "neat", 3 | "version": "1.7.0", 4 | "homepage": "http://neat.bourbon.io/", 5 | "main": "app/assets/stylesheets/_neat.scss", 6 | "ignore": [ 7 | "bin", 8 | "lib", 9 | ".gitignore", 10 | "Gemfile", 11 | "Gemfile.lock", 12 | "Rakefile", 13 | "neat.gemspec", 14 | "CONTRIBUTING.md", 15 | "NEWS.md", 16 | "test", 17 | "spec" 18 | ], 19 | "dependencies": { 20 | "bourbon": ">=4.0" 21 | }, 22 | "_release": "1.7.0", 23 | "_resolution": { 24 | "type": "version", 25 | "tag": "v1.7.0", 26 | "commit": "b3a0dbc3ce2787f6a13fb2b6661ca190f6fbca99" 27 | }, 28 | "_source": "git://github.com/thoughtbot/neat.git", 29 | "_target": "~1.7.0", 30 | "_originalSource": "neat", 31 | "_direct": true 32 | } -------------------------------------------------------------------------------- /bower_components/neat/.rspec: -------------------------------------------------------------------------------- 1 | --color 2 | --format documentation 3 | -------------------------------------------------------------------------------- /bower_components/neat/.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | rvm: 2.0.0 3 | notifications: 4 | slack: 5 | secure: ROE+Zo+A6JmTjxCRGG539YaoEcLrsInEIrTDQMgtn5ucLaiPiau96VO+GJ4MyxZm2M5qlSRMFCxb3jFexCRVZctuUF2hFcXVi6a/+JGhMmYLd6XMNezhlxWwOoSx6ufSAlrlXEalsdnkzqVHuH2Y50ao/3slNo58DdLoaRJiGAc= 6 | -------------------------------------------------------------------------------- /bower_components/neat/LICENSE: -------------------------------------------------------------------------------- 1 | LICENSE 2 | 3 | The MIT License 4 | 5 | Copyright (c) 2012-2014 thoughtbot, inc. 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in 15 | all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/_neat-helpers.scss: -------------------------------------------------------------------------------- 1 | // Functions 2 | @import "functions/private"; 3 | @import "functions/new-breakpoint"; 4 | 5 | // Settings 6 | @import "settings/grid"; 7 | @import "settings/visual-grid"; 8 | @import "settings/disable-warnings"; 9 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/_neat.scss: -------------------------------------------------------------------------------- 1 | /* Neat 1.7.0 2 | * http://neat.bourbon.io 3 | * Copyright 2012-2014 thoughtbot, inc. 4 | * MIT License */ 5 | 6 | // Helpers 7 | @import "neat-helpers"; 8 | 9 | // Grid 10 | @import "grid/private"; 11 | @import "grid/box-sizing"; 12 | @import "grid/omega"; 13 | @import "grid/outer-container"; 14 | @import "grid/span-columns"; 15 | @import "grid/row"; 16 | @import "grid/shift"; 17 | @import "grid/pad"; 18 | @import "grid/fill-parent"; 19 | @import "grid/media"; 20 | @import "grid/to-deprecate"; 21 | @import "grid/visual-grid"; 22 | @import "grid/display-context"; 23 | @import "grid/direction-context"; 24 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/functions/_new-breakpoint.scss: -------------------------------------------------------------------------------- 1 | /// Returns a media context (media query / grid context) that can be stored in a variable and passed to `media()` as a single-keyword argument. Media contexts defined using `new-breakpoint` are used by the visual grid, as long as they are defined before importing Neat. 2 | /// 3 | /// @param {List} $query 4 | /// A list of media query features and values. Each `$feature` should have a corresponding `$value`. 5 | /// 6 | /// If there is only a single `$value` in `$query`, `$default-feature` is going to be used. 7 | /// 8 | /// The number of total columns in the grid can be set by passing `$columns` at the end of the list (overrides `$total-columns`). For a list of valid values for `$feature`, click [here](http://www.w3.org/TR/css3-mediaqueries/#media1). 9 | /// 10 | /// @param {Number (unitless)} $total-columns ($grid-columns) 11 | /// - Number of columns to use in the new grid context. Can be set as a shorthand in the first parameter. 12 | /// 13 | /// @example scss - Usage 14 | /// $mobile: new-breakpoint(max-width 480px 4); 15 | /// 16 | /// .element { 17 | /// @include media($mobile) { 18 | /// @include span-columns(4); 19 | /// } 20 | /// } 21 | /// 22 | /// @example css - CSS Output 23 | /// @media screen and (max-width: 480px) { 24 | /// .element { 25 | /// display: block; 26 | /// float: left; 27 | /// margin-right: 7.42297%; 28 | /// width: 100%; 29 | /// } 30 | /// .element:last-child { 31 | /// margin-right: 0; 32 | /// } 33 | /// } 34 | 35 | @function new-breakpoint($query: $feature $value $columns, $total-columns: $grid-columns) { 36 | @if length($query) == 1 { 37 | $query: $default-feature nth($query, 1) $total-columns; 38 | } 39 | 40 | @else if is-even(length($query)) { 41 | $query: append($query, $total-columns); 42 | } 43 | 44 | @if not belongs-to($query, $visual-grid-breakpoints) { 45 | $visual-grid-breakpoints: append($visual-grid-breakpoints, $query, comma) !global; 46 | } 47 | 48 | @return $query; 49 | } 50 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/functions/_private.scss: -------------------------------------------------------------------------------- 1 | // Checks if a number is even 2 | @function is-even($int) { 3 | @return $int % 2 == 0 4 | } 5 | 6 | // Checks if an element belongs to a list or not 7 | @function belongs-to($tested-item, $list) { 8 | @return not not-belongs-to($tested-item, $list); 9 | } 10 | 11 | @function not-belongs-to($tested-item, $list) { 12 | @return not index($list, $tested-item); 13 | } 14 | 15 | // Contains display value 16 | @function contains-display-value($query) { 17 | @return belongs-to(table, $query) 18 | or belongs-to(block, $query) 19 | or belongs-to(inline-block, $query) 20 | or belongs-to(inline, $query); 21 | } 22 | 23 | // Parses the first argument of span-columns() 24 | @function container-span($span: $span) { 25 | @if length($span) == 3 { 26 | $container-columns: nth($span, 3); 27 | @return $container-columns; 28 | } @else if length($span) == 2 { 29 | $container-columns: nth($span, 2); 30 | @return $container-columns; 31 | } 32 | 33 | @return $grid-columns; 34 | } 35 | 36 | @function container-shift($shift: $shift) { 37 | $parent-columns: $grid-columns !default !global; 38 | 39 | @if length($shift) == 3 { 40 | $container-columns: nth($shift, 3); 41 | @return $container-columns; 42 | } @else if length($shift) == 2 { 43 | $container-columns: nth($shift, 2); 44 | @return $container-columns; 45 | } 46 | 47 | @return $parent-columns; 48 | } 49 | 50 | // Generates a striped background 51 | @function gradient-stops($grid-columns, $color: $visual-grid-color) { 52 | $transparent: rgba(0,0,0,0); 53 | 54 | $column-width: flex-grid(1, $grid-columns); 55 | $gutter-width: flex-gutter($grid-columns); 56 | $column-offset: $column-width; 57 | 58 | $values: ($transparent 0, $color 0); 59 | 60 | @for $i from 1 to $grid-columns*2 { 61 | @if is-even($i) { 62 | $values: append($values, $transparent $column-offset, comma); 63 | $values: append($values, $color $column-offset, comma); 64 | $column-offset: $column-offset + $column-width; 65 | } @else { 66 | $values: append($values, $color $column-offset, comma); 67 | $values: append($values, $transparent $column-offset, comma); 68 | $column-offset: $column-offset + $gutter-width; 69 | } 70 | } 71 | 72 | @return $values; 73 | } 74 | 75 | // Layout direction 76 | @function get-direction($layout, $default) { 77 | $direction: null; 78 | 79 | @if to-upper-case($layout) == "LTR" or to-upper-case($layout) == "RTL" { 80 | $direction: direction-from-layout($layout); 81 | } @else { 82 | $direction: direction-from-layout($default); 83 | } 84 | 85 | @return $direction; 86 | } 87 | 88 | @function direction-from-layout($layout) { 89 | $direction: null; 90 | 91 | @if to-upper-case($layout) == "LTR" { 92 | $direction: right; 93 | } @else { 94 | $direction: left; 95 | } 96 | 97 | @return $direction; 98 | } 99 | 100 | @function get-opposite-direction($direction) { 101 | $opposite-direction: left; 102 | 103 | @if $direction == "left" { 104 | $opposite-direction: right; 105 | } 106 | 107 | @return $opposite-direction; 108 | } 109 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_box-sizing.scss: -------------------------------------------------------------------------------- 1 | @if $border-box-sizing == true { 2 | html { // http://bit.ly/1qk2tVR 3 | @include box-sizing(border-box); 4 | } 5 | 6 | * { 7 | &, &:before, &:after { 8 | @include box-sizing(inherit); 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_direction-context.scss: -------------------------------------------------------------------------------- 1 | /// Changes the direction property used by other mixins called in the code block argument. 2 | /// 3 | /// @param {String} $direction (left-to-right) 4 | /// Layout direction to be used within the block. Can be `left-to-right` or `right-to-left`. 5 | /// 6 | /// @example scss - Usage 7 | /// @include direction(right-to-left) { 8 | /// .right-to-left-block { 9 | /// @include span-columns(6); 10 | /// } 11 | /// } 12 | /// 13 | /// @example css - CSS Output 14 | /// .right-to-left-block { 15 | /// float: right; 16 | /// ... 17 | /// } 18 | 19 | @mixin direction-context($direction: left-to-right) { 20 | $scope-direction: $layout-direction; 21 | 22 | @if to-lower-case($direction) == "left-to-right" { 23 | $layout-direction: LTR !global; 24 | } @else if to-lower-case($direction) == "right-to-left" { 25 | $layout-direction: RTL !global; 26 | } 27 | 28 | @content; 29 | 30 | $layout-direction: $scope-direction !global; 31 | } 32 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_display-context.scss: -------------------------------------------------------------------------------- 1 | /// Changes the display property used by other mixins called in the code block argument. 2 | /// 3 | /// @param {String} $display (block) 4 | /// Display value to be used within the block. Can be `table` or `block`. 5 | /// 6 | /// @example scss 7 | /// @include display(table) { 8 | /// .display-table { 9 | /// @include span-columns(6); 10 | /// } 11 | /// } 12 | /// 13 | /// @example css 14 | /// .display-table { 15 | /// display: table-cell; 16 | /// ... 17 | /// } 18 | 19 | @mixin display-context($display: block) { 20 | $scope-display: $container-display-table; 21 | $container-display-table: $display == table !global; 22 | 23 | @content; 24 | 25 | $container-display-table: $scope-display !global; 26 | } 27 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_fill-parent.scss: -------------------------------------------------------------------------------- 1 | /// Forces the element to fill its parent container. 2 | /// 3 | /// @example scss - Usage 4 | /// .element { 5 | /// @include fill-parent; 6 | /// } 7 | /// 8 | /// @example css - CSS Output 9 | /// .element { 10 | /// width: 100%; 11 | /// -webkit-box-sizing: border-box; 12 | /// -moz-box-sizing: border-box; 13 | /// box-sizing: border-box; 14 | /// } 15 | 16 | @mixin fill-parent() { 17 | width: 100%; 18 | 19 | @if $border-box-sizing == false { 20 | @include box-sizing(border-box); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_media.scss: -------------------------------------------------------------------------------- 1 | /// Outputs a media-query block with an optional grid context (the total number of columns used in the grid). 2 | /// 3 | /// @param {List} $query 4 | /// A list of media query features and values, where each `$feature` should have a corresponding `$value`. 5 | /// For a list of valid values for `$feature`, click [here](http://www.w3.org/TR/css3-mediaqueries/#media1). 6 | /// 7 | /// If there is only a single `$value` in `$query`, `$default-feature` is going to be used. 8 | /// 9 | /// The number of total columns in the grid can be set by passing `$columns` at the end of the list (overrides `$total-columns`). 10 | /// 11 | /// 12 | /// @param {Number (unitless)} $total-columns ($grid-columns) 13 | /// - Number of columns to use in the new grid context. Can be set as a shorthand in the first parameter. 14 | /// 15 | /// @example scss - Usage 16 | /// .responsive-element { 17 | /// @include media(769px) { 18 | /// @include span-columns(6); 19 | /// } 20 | /// } 21 | /// 22 | /// .new-context-element { 23 | /// @include media(min-width 320px max-width 480px, 6) { 24 | /// @include span-columns(6); 25 | /// } 26 | /// } 27 | /// 28 | /// @example css - CSS Output 29 | /// @media screen and (min-width: 769px) { 30 | /// .responsive-element { 31 | /// display: block; 32 | /// float: left; 33 | /// margin-right: 2.35765%; 34 | /// width: 48.82117%; 35 | /// } 36 | /// 37 | /// .responsive-element:last-child { 38 | /// margin-right: 0; 39 | /// } 40 | /// } 41 | /// 42 | /// @media screen and (min-width: 320px) and (max-width: 480px) { 43 | /// .new-context-element { 44 | /// display: block; 45 | /// float: left; 46 | /// margin-right: 4.82916%; 47 | /// width: 100%; 48 | /// } 49 | /// 50 | /// .new-context-element:last-child { 51 | /// margin-right: 0; 52 | /// } 53 | /// } 54 | 55 | @mixin media($query: $feature $value $columns, $total-columns: $grid-columns) { 56 | @if length($query) == 1 { 57 | @media screen and ($default-feature: nth($query, 1)) { 58 | $default-grid-columns: $grid-columns; 59 | $grid-columns: $total-columns !global; 60 | @content; 61 | $grid-columns: $default-grid-columns !global; 62 | } 63 | } 64 | 65 | @else { 66 | $loop-to: length($query); 67 | $media-query: 'screen and '; 68 | $default-grid-columns: $grid-columns; 69 | $grid-columns: $total-columns !global; 70 | 71 | @if not is-even(length($query)) { 72 | $grid-columns: nth($query, $loop-to) !global; 73 | $loop-to: $loop-to - 1; 74 | } 75 | 76 | $i: 1; 77 | @while $i <= $loop-to { 78 | $media-query: $media-query + '(' + nth($query, $i) + ': ' + nth($query, $i + 1) + ') '; 79 | 80 | @if ($i + 1) != $loop-to { 81 | $media-query: $media-query + 'and '; 82 | } 83 | 84 | $i: $i + 2; 85 | } 86 | 87 | @media #{$media-query} { 88 | @content; 89 | $grid-columns: $default-grid-columns !global; 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_omega.scss: -------------------------------------------------------------------------------- 1 | /// Removes the element's gutter margin, regardless of its position in the grid hierarchy or display property. It can target a specific element, or every `nth-child` occurrence. Works only with `block` layouts. 2 | /// 3 | /// @param {List} $query (block) 4 | /// List of arguments. Supported arguments are `nth-child` selectors (targets a specific pseudo element) and `auto` (targets `last-child`). 5 | /// 6 | /// When passed an `nth-child` argument of type `*n` with `block` display, the omega mixin automatically adds a clear to the `*n+1` th element. Note that composite arguments such as `2n+1` do not support this feature. 7 | /// 8 | /// **Deprecation warning**: The omega mixin will no longer take a `$direction` argument. To change the layout direction, use `row($direction)` or set `$default-layout-direction` instead. 9 | /// 10 | /// @example scss - Usage 11 | /// .element { 12 | /// @include omega; 13 | /// } 14 | /// 15 | /// .nth-element { 16 | /// @include omega(4n); 17 | /// } 18 | /// 19 | /// @example css - CSS Output 20 | /// .element { 21 | /// margin-right: 0; 22 | /// } 23 | /// 24 | /// .nth-element:nth-child(4n) { 25 | /// margin-right: 0; 26 | /// } 27 | /// 28 | /// .nth-element:nth-child(4n+1) { 29 | /// clear: left; 30 | /// } 31 | 32 | @mixin omega($query: block, $direction: default) { 33 | $table: belongs-to(table, $query); 34 | $auto: belongs-to(auto, $query); 35 | 36 | @if $direction != default { 37 | @include -neat-warn("The omega mixin will no longer take a $direction argument. To change the layout direction, use the direction(){...} mixin."); 38 | } @else { 39 | $direction: get-direction($layout-direction, $default-layout-direction); 40 | } 41 | 42 | @if $table { 43 | @include -neat-warn("The omega mixin no longer removes padding in table layouts."); 44 | } 45 | 46 | @if length($query) == 1 { 47 | @if $auto { 48 | &:last-child { 49 | margin-#{$direction}: 0; 50 | } 51 | } 52 | 53 | @else if contains-display-value($query) and $table == false { 54 | margin-#{$direction}: 0; 55 | } 56 | 57 | @else { 58 | @include nth-child($query, $direction); 59 | } 60 | } 61 | 62 | @else if length($query) == 2 { 63 | @if $auto { 64 | &:last-child { 65 | margin-#{$direction}: 0; 66 | } 67 | } 68 | 69 | @else { 70 | @include nth-child(nth($query, 1), $direction); 71 | } 72 | } 73 | 74 | @else { 75 | @include -neat-warn("Too many arguments passed to the omega() mixin."); 76 | } 77 | } 78 | 79 | @mixin nth-child($query, $direction) { 80 | $opposite-direction: get-opposite-direction($direction); 81 | 82 | &:nth-child(#{$query}) { 83 | margin-#{$direction}: 0; 84 | } 85 | 86 | @if type-of($query) == number { 87 | &:nth-child(#{$query}+1) { 88 | clear: $opposite-direction; 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_outer-container.scss: -------------------------------------------------------------------------------- 1 | /// Makes an element a outer container by centring it in the viewport, clearing its floats, and setting its `max-width`. 2 | /// Although optional, using `outer-container` is recommended. The mixin can be called on more than one element per page, as long as they are not nested. 3 | /// 4 | /// @param {Number (unit)} $local-max-width ($max-width) 5 | /// Max width to be applied to the element. Can be a percentage or a measure. 6 | /// 7 | /// @example scss - Usage 8 | /// .element { 9 | /// @include outer-container(100%); 10 | /// } 11 | /// 12 | /// @example css - CSS Output 13 | /// .element { 14 | /// *zoom: 1; 15 | /// max-width: 100%; 16 | /// margin-left: auto; 17 | /// margin-right: auto; 18 | /// } 19 | /// 20 | /// .element:before, .element:after { 21 | /// content: " "; 22 | /// display: table; 23 | /// } 24 | /// 25 | /// .element:after { 26 | /// clear: both; 27 | /// } 28 | 29 | @mixin outer-container($local-max-width: $max-width) { 30 | @include clearfix; 31 | max-width: $local-max-width; 32 | margin: { 33 | left: auto; 34 | right: auto; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_pad.scss: -------------------------------------------------------------------------------- 1 | /// Adds padding to the element. 2 | /// 3 | /// @param {List} $padding (flex-gutter()) 4 | /// A list of padding value(s) to use. Passing `default` in the list will result in using the gutter width as a padding value. 5 | /// 6 | /// @example scss - Usage 7 | /// .element { 8 | /// @include pad(30px -20px 10px default); 9 | /// } 10 | /// 11 | /// @example css - CSS Output 12 | /// .element { 13 | /// padding: 30px -20px 10px 2.35765%; 14 | /// } 15 | 16 | @mixin pad($padding: flex-gutter()) { 17 | $padding-list: null; 18 | @each $value in $padding { 19 | $value: if($value == 'default', flex-gutter(), $value); 20 | $padding-list: join($padding-list, $value); 21 | } 22 | padding: $padding-list; 23 | } 24 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_private.scss: -------------------------------------------------------------------------------- 1 | $parent-columns: $grid-columns !default; 2 | $fg-column: $column; 3 | $fg-gutter: $gutter; 4 | $fg-max-columns: $grid-columns; 5 | $container-display-table: false !default; 6 | $layout-direction: LTR !default; 7 | 8 | @function flex-grid($columns, $container-columns: $fg-max-columns) { 9 | $width: $columns * $fg-column + ($columns - 1) * $fg-gutter; 10 | $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; 11 | @return percentage($width / $container-width); 12 | } 13 | 14 | @function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) { 15 | $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; 16 | @return percentage($gutter / $container-width); 17 | } 18 | 19 | @function grid-width($n) { 20 | @return $n * $gw-column + ($n - 1) * $gw-gutter; 21 | } 22 | 23 | @function get-parent-columns($columns) { 24 | @if $columns != $grid-columns { 25 | $parent-columns: $columns !global; 26 | } @else { 27 | $parent-columns: $grid-columns !global; 28 | } 29 | 30 | @return $parent-columns; 31 | } 32 | 33 | @function is-display-table($container-is-display-table, $display) { 34 | @return $container-is-display-table == true or $display == table; 35 | } 36 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_row.scss: -------------------------------------------------------------------------------- 1 | /// Designates the element as a row of columns in the grid layout. It clears the floats on the element and sets its display property. Rows can't be nested, but there can be more than one row element—with different display properties—per layout. 2 | /// 3 | /// @param {String} $display (default) 4 | /// Sets the display property of the element and the display context that will be used by its children. Can be `block` or `table`. 5 | /// 6 | /// @param {String} $direction ($default-layout-direction) 7 | /// Sets the layout direction. Can be `LTR` (left-to-right) or `RTL` (right-to-left). 8 | /// 9 | /// @example scss - Usage 10 | /// .element { 11 | /// @include row(); 12 | /// } 13 | /// 14 | /// @example css - CSS Output 15 | /// .element { 16 | /// *zoom: 1; 17 | /// display: block; 18 | /// } 19 | /// 20 | /// .element:before, .element:after { 21 | /// content: " "; 22 | /// display: table; 23 | /// } 24 | /// 25 | /// .element:after { 26 | /// clear: both; 27 | /// } 28 | 29 | @mixin row($display: default, $direction: $default-layout-direction) { 30 | @if $direction != $default-layout-direction { 31 | @include -neat-warn("The $direction argument will be deprecated in future versions in favor of the direction(){...} mixin."); 32 | } 33 | 34 | $layout-direction: $direction !global; 35 | 36 | @if $display != default { 37 | @include -neat-warn("The $display argument will be deprecated in future versions in favor of the display(){...} mixin."); 38 | } 39 | 40 | @if $display == table { 41 | display: table; 42 | @include fill-parent; 43 | table-layout: fixed; 44 | $container-display-table: true !global; 45 | } 46 | 47 | @else { 48 | @include clearfix; 49 | display: block; 50 | $container-display-table: false !global; 51 | } 52 | } 53 | 54 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_shift.scss: -------------------------------------------------------------------------------- 1 | /// Translates an element horizontally by a number of columns. Positive arguments shift the element to the active layout direction, while negative ones shift it to the opposite direction. 2 | /// 3 | /// @param {Number (unitless)} $n-columns (1) 4 | /// Number of columns by which the element shifts. 5 | /// 6 | /// @example scss - Usage 7 | /// .element { 8 | /// @include shift(-3); 9 | /// } 10 | /// 11 | /// @example css - CSS output 12 | /// .element { 13 | /// margin-left: -25.58941%; 14 | /// } 15 | 16 | @mixin shift($n-columns: 1) { 17 | @include shift-in-context($n-columns); 18 | } 19 | 20 | /// Translates an element horizontally by a number of columns, in a specific nesting context. 21 | /// 22 | /// @param {List} $shift 23 | /// A list containing the number of columns to shift (`$columns`) and the number of columns of the parent element (`$container-columns`). 24 | /// 25 | /// The two values can be separated with any string such as `of`, `/`, etc. 26 | /// 27 | /// @example scss - Usage 28 | /// .element { 29 | /// @include shift(-3 of 6); 30 | /// } 31 | /// 32 | /// @example css - CSS output 33 | /// .element { 34 | /// margin-left: -52.41458%; 35 | /// } 36 | 37 | @mixin shift-in-context($shift: $columns of $container-columns) { 38 | $n-columns: nth($shift, 1); 39 | $parent-columns: container-shift($shift) !global; 40 | 41 | $direction: get-direction($layout-direction, $default-layout-direction); 42 | $opposite-direction: get-opposite-direction($direction); 43 | 44 | margin-#{$opposite-direction}: $n-columns * flex-grid(1, $parent-columns) + $n-columns * flex-gutter($parent-columns); 45 | 46 | // Reset nesting context 47 | $parent-columns: $grid-columns !global; 48 | } 49 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_span-columns.scss: -------------------------------------------------------------------------------- 1 | /// Specifies the number of columns an element should span. If the selector is nested the number of columns of its parent element should be passed as an argument as well. 2 | /// 3 | /// @param {List} $span 4 | /// A list containing `$columns`, the unitless number of columns the element spans (required), and `$container-columns`, the number of columns the parent element spans (optional). 5 | /// 6 | /// If only one value is passed, it is assumed that it's `$columns` and that that `$container-columns` is equal to `$grid-columns`, the total number of columns in the grid. 7 | /// 8 | /// The values can be separated with any string such as `of`, `/`, etc. 9 | /// 10 | /// @param {String} $display (block) 11 | /// Sets the display property of the element. By default it sets the display propert of the element to `block`. 12 | /// 13 | /// If passed `block-collapse`, it also removes the margin gutter by adding it to the element width. 14 | /// 15 | /// If passed `table`, it sets the display property to `table-cell` and calculates the width of the element without taking gutters into consideration. The result does not align with the block-based grid. 16 | /// 17 | /// @example scss - Usage 18 | /// .element { 19 | /// @include span-columns(6); 20 | /// 21 | /// .nested-element { 22 | /// @include span-columns(2 of 6); 23 | /// } 24 | /// } 25 | /// 26 | /// @example css - CSS Output 27 | /// .element { 28 | /// display: block; 29 | /// float: left; 30 | /// margin-right: 2.35765%; 31 | /// width: 48.82117%; 32 | /// } 33 | /// 34 | /// .element:last-child { 35 | /// margin-right: 0; 36 | /// } 37 | /// 38 | /// .element .nested-element { 39 | /// display: block; 40 | /// float: left; 41 | /// margin-right: 4.82916%; 42 | /// width: 30.11389%; 43 | /// } 44 | /// 45 | /// .element .nested-element:last-child { 46 | /// margin-right: 0; 47 | /// } 48 | 49 | @mixin span-columns($span: $columns of $container-columns, $display: block) { 50 | $columns: nth($span, 1); 51 | $container-columns: container-span($span); 52 | 53 | $parent-columns: get-parent-columns($container-columns) !global; 54 | 55 | $direction: get-direction($layout-direction, $default-layout-direction); 56 | $opposite-direction: get-opposite-direction($direction); 57 | 58 | $display-table: is-display-table($container-display-table, $display); 59 | 60 | @if $display-table { 61 | display: table-cell; 62 | width: percentage($columns / $container-columns); 63 | } @else { 64 | float: #{$opposite-direction}; 65 | 66 | @if $display != no-display { 67 | display: block; 68 | } 69 | 70 | @if $display == collapse { 71 | @include -neat-warn("The 'collapse' argument will be deprecated. Use 'block-collapse' instead."); 72 | } 73 | 74 | @if $display == collapse or $display == block-collapse { 75 | width: flex-grid($columns, $container-columns) + flex-gutter($container-columns); 76 | 77 | &:last-child { 78 | width: flex-grid($columns, $container-columns); 79 | } 80 | 81 | } @else { 82 | margin-#{$direction}: flex-gutter($container-columns); 83 | width: flex-grid($columns, $container-columns); 84 | 85 | &:last-child { 86 | margin-#{$direction}: 0; 87 | } 88 | } 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_to-deprecate.scss: -------------------------------------------------------------------------------- 1 | @mixin breakpoint($query:$feature $value $columns, $total-columns: $grid-columns) { 2 | @include -neat-warn("The breakpoint() mixin was renamed to media() in Neat 1.0. Please update your project with the new syntax before the next version bump."); 3 | 4 | @if length($query) == 1 { 5 | @media screen and ($default-feature: nth($query, 1)) { 6 | $default-grid-columns: $grid-columns; 7 | $grid-columns: $total-columns; 8 | @content; 9 | $grid-columns: $default-grid-columns; 10 | } 11 | } 12 | 13 | @else if length($query) == 2 { 14 | @media screen and (nth($query, 1): nth($query, 2)) { 15 | $default-grid-columns: $grid-columns; 16 | $grid-columns: $total-columns; 17 | @content; 18 | $grid-columns: $default-grid-columns; 19 | } 20 | } 21 | 22 | @else if length($query) == 3 { 23 | @media screen and (nth($query, 1): nth($query, 2)) { 24 | $default-grid-columns: $grid-columns; 25 | $grid-columns: nth($query, 3); 26 | @content; 27 | $grid-columns: $default-grid-columns; 28 | } 29 | } 30 | 31 | @else if length($query) == 4 { 32 | @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) { 33 | $default-grid-columns: $grid-columns; 34 | $grid-columns: $total-columns; 35 | @content; 36 | $grid-columns: $default-grid-columns; 37 | } 38 | } 39 | 40 | @else if length($query) == 5 { 41 | @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) { 42 | $default-grid-columns: $grid-columns; 43 | $grid-columns: nth($query, 5); 44 | @content; 45 | $grid-columns: $default-grid-columns; 46 | } 47 | } 48 | 49 | @else { 50 | @include -neat-warn("Wrong number of arguments for breakpoint(). Read the documentation for more details."); 51 | } 52 | } 53 | 54 | @mixin nth-omega($nth, $display: block, $direction: default) { 55 | @include -neat-warn("The nth-omega() mixin is deprecated. Please use omega() instead."); 56 | @include omega($nth $display, $direction); 57 | } 58 | 59 | /// Resets the active display property to `block`. Particularly useful when changing the display property in a single row. 60 | /// 61 | /// @example scss - Usage 62 | /// .element { 63 | /// @include row(table); 64 | /// // Context changed to table display 65 | /// } 66 | /// 67 | /// @include reset-display; 68 | /// // Context is reset to block display 69 | 70 | @mixin reset-display { 71 | $container-display-table: false !global; 72 | @include -neat-warn("Resetting $display will be deprecated in future versions in favor of the display(){...} mixin."); 73 | } 74 | 75 | /// Resets the active layout direction to the default value set in `$default-layout-direction`. Particularly useful when changing the layout direction in a single row. 76 | /// 77 | /// @example scss - Usage 78 | /// .element { 79 | /// @include row($direction: RTL); 80 | /// // Context changed to right-to-left 81 | /// } 82 | /// 83 | /// @include reset-layout-direction; 84 | /// // Context is reset to left-to-right 85 | 86 | @mixin reset-layout-direction { 87 | $layout-direction: $default-layout-direction !global; 88 | @include -neat-warn("Resetting $direction will be deprecated in future versions in favor of the direction(){...} mixin."); 89 | } 90 | 91 | /// Resets both the active layout direction and the active display property. 92 | /// 93 | /// @example scss - Usage 94 | /// .element { 95 | /// @include row(table, RTL); 96 | /// // Context changed to table table and right-to-left 97 | /// } 98 | /// 99 | /// @include reset-all; 100 | /// // Context is reset to block display and left-to-right 101 | 102 | @mixin reset-all { 103 | @include reset-display; 104 | @include reset-layout-direction; 105 | } 106 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/grid/_visual-grid.scss: -------------------------------------------------------------------------------- 1 | @mixin grid-column-gradient($values...) { 2 | background-image: -webkit-linear-gradient(left, $values); 3 | background-image: -moz-linear-gradient(left, $values); 4 | background-image: -ms-linear-gradient(left, $values); 5 | background-image: -o-linear-gradient(left, $values); 6 | background-image: unquote("linear-gradient(to left, #{$values})"); 7 | } 8 | 9 | @if $visual-grid == true or $visual-grid == yes { 10 | body:before { 11 | content: ''; 12 | display: inline-block; 13 | @include grid-column-gradient(gradient-stops($grid-columns)); 14 | height: 100%; 15 | left: 0; 16 | margin: 0 auto; 17 | max-width: $max-width; 18 | opacity: $visual-grid-opacity; 19 | position: fixed; 20 | right: 0; 21 | width: 100%; 22 | pointer-events: none; 23 | 24 | @if $visual-grid-index == back { 25 | z-index: -1; 26 | } 27 | 28 | @else if $visual-grid-index == front { 29 | z-index: 9999; 30 | } 31 | 32 | @each $breakpoint in $visual-grid-breakpoints { 33 | @if $breakpoint { 34 | @include media($breakpoint) { 35 | @include grid-column-gradient(gradient-stops($grid-columns)); 36 | } 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/settings/_disable-warnings.scss: -------------------------------------------------------------------------------- 1 | /// Disable all deprecation warnings. Defaults to `false`. Set with a `!global` flag. 2 | /// 3 | /// @type Bool 4 | 5 | $disable-warnings: false !default; 6 | 7 | @mixin -neat-warn($message) { 8 | @if $disable-warnings == false { 9 | @warn "#{$message}"; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/settings/_grid.scss: -------------------------------------------------------------------------------- 1 | /// Sets the relative width of a single grid column. The unit used should be the same one used to define `$gutter`. To learn more about golden-ratio() see [Bourbon docs](http://bourbon.io/docs/#golden-ratio). Set with a `!global` flag. 2 | /// 3 | /// @type Number (Unit) 4 | 5 | $column: golden-ratio(1em, 3) !default; 6 | 7 | /// Sets the relative width of a single grid gutter. The unit used should be the same one used to define `$column`. To learn more about golden-ratio() see [Bourbon docs](http://bourbon.io/docs/#golden-ratio). Set with the `!global` flag. 8 | /// 9 | /// @type Number (Unit) 10 | 11 | $gutter: golden-ratio(1em, 1) !default; 12 | 13 | /// Sets the total number of columns in the grid. Its value can be overridden inside a media query using the `media()` mixin. Set with the `!global` flag. 14 | /// 15 | /// @type Number (Unitless) 16 | 17 | $grid-columns: 12 !default; 18 | 19 | /// Sets the max-width property of the element that includes `outer-container()`. To learn more about `em()` see [Bourbon docs](http://bourbon.io/docs/#px-to-em). Set with the `!global` flag. 20 | /// 21 | /// @type Number (Unit) 22 | /// 23 | $max-width: em(1088) !default; 24 | 25 | /// When set to true, it sets the box-sizing property of all elements to `border-box`. Set with a `!global` flag. 26 | /// 27 | /// @type Bool 28 | /// 29 | /// @example css - CSS Output 30 | /// html { 31 | /// -webkit-box-sizing: border-box; 32 | /// -moz-box-sizing: border-box; 33 | /// box-sizing: border-box; } 34 | /// 35 | /// *, *:before, *:after { 36 | /// -webkit-box-sizing: inherit; 37 | /// -moz-box-sizing: inherit; 38 | /// box-sizing: inherit; 39 | /// } 40 | 41 | $border-box-sizing: true !default; 42 | 43 | /// Sets the default [media feature](http://www.w3.org/TR/css3-mediaqueries/#media) that `media()` and `new-breakpoint()` revert to when only a breakpoint value is passed. Set with a `!global` flag. 44 | /// 45 | /// @type String 46 | 47 | $default-feature: min-width; // Default @media feature for the breakpoint() mixin 48 | 49 | ///Sets the default layout direction of the grid. Can be `LTR` or `RTL`. Set with a `!global` flag. 50 | /// 51 | ///@type String 52 | 53 | $default-layout-direction: LTR !default; 54 | -------------------------------------------------------------------------------- /bower_components/neat/app/assets/stylesheets/settings/_visual-grid.scss: -------------------------------------------------------------------------------- 1 | /// Displays the visual grid when set to true. The overlaid grid may be few pixels off depending on the browser's rendering engine and pixel rounding algorithm. Set with the `!global` flag. 2 | /// 3 | /// @type Bool 4 | 5 | $visual-grid: false !default; 6 | 7 | /// Sets the visual grid color. Set with `!global` flag. 8 | /// 9 | /// @type Color 10 | 11 | $visual-grid-color: #EEE !default; 12 | 13 | /// Sets the `z-index` property of the visual grid. Can be `back` (behind content) or `front` (in front of content). Set with `!global` flag. 14 | /// 15 | /// @type String 16 | 17 | $visual-grid-index: back !default; 18 | 19 | /// Sets the opacity property of the visual grid. Set with `!global` flag. 20 | /// 21 | /// @type Number (unitless) 22 | 23 | $visual-grid-opacity: 0.4 !default; 24 | 25 | $visual-grid-breakpoints: () !default; 26 | -------------------------------------------------------------------------------- /bower_components/neat/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "neat", 3 | "version": "1.7.0", 4 | "homepage": "http://neat.bourbon.io/", 5 | "main": "app/assets/stylesheets/_neat.scss", 6 | "ignore": [ 7 | "bin", 8 | "lib", 9 | ".gitignore", 10 | "Gemfile", 11 | "Gemfile.lock", 12 | "Rakefile", 13 | "neat.gemspec", 14 | "CONTRIBUTING.md", 15 | "NEWS.md", 16 | "test", 17 | "spec" 18 | ], 19 | "dependencies": { 20 | "bourbon": ">=4.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /bower_components/neat/sache.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Neat", 3 | "description": "A lightweight, semantic grid framework built on top of Bourbon", 4 | "tags": ["neat", "grid", "layout", "columns", "semantic", "media-queries", "media", "queries", "bourbon"] 5 | } 6 | -------------------------------------------------------------------------------- /bower_components/normalize.css/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "normalize-css", 3 | "version": "3.0.2", 4 | "main": "normalize.css", 5 | "author": "Nicolas Gallagher", 6 | "ignore": [ 7 | "CHANGELOG.md", 8 | "CONTRIBUTING.md", 9 | "component.json", 10 | "package.json", 11 | "test.html" 12 | ], 13 | "homepage": "https://github.com/necolas/normalize.css", 14 | "_release": "3.0.2", 15 | "_resolution": { 16 | "type": "version", 17 | "tag": "3.0.2", 18 | "commit": "2334aed3efee9f4dd2297c4e6f4c0021b3279c7a" 19 | }, 20 | "_source": "https://github.com/necolas/normalize.css.git", 21 | "_target": "~3.0.2", 22 | "_originalSource": "normalize.css", 23 | "_direct": true 24 | } -------------------------------------------------------------------------------- /bower_components/normalize.css/LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) Nicolas Gallagher and Jonathan Neal 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 7 | of the Software, and to permit persons to whom the Software is furnished to do 8 | so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /bower_components/normalize.css/README.md: -------------------------------------------------------------------------------- 1 | # normalize.css v3 2 | 3 | Normalize.css is a customisable CSS file that makes browsers render all 4 | elements more consistently and in line with modern standards. 5 | 6 | The project relies on researching the differences between default browser 7 | styles in order to precisely target only the styles that need or benefit from 8 | normalizing. 9 | 10 | [View the test file](http://necolas.github.io/normalize.css/latest/test.html) 11 | 12 | ## Install 13 | 14 | * [npm](http://npmjs.org/): `npm install --save normalize.css` 15 | * [Component(1)](https://github.com/component/component/): `component install necolas/normalize.css` 16 | * [Bower](http://bower.io/): `bower install --save normalize.css` 17 | * [Download](http://necolas.github.io/normalize.css/latest/normalize.css). 18 | 19 | No other styles should come before Normalize.css. 20 | 21 | It is recommended that you include the `normalize.css` file as untouched 22 | library code. 23 | 24 | ## What does it do? 25 | 26 | * Preserves useful defaults, unlike many CSS resets. 27 | * Normalizes styles for a wide range of elements. 28 | * Corrects bugs and common browser inconsistencies. 29 | * Improves usability with subtle improvements. 30 | * Explains what code does using detailed comments. 31 | 32 | ## Browser support 33 | 34 | * Google Chrome (latest) 35 | * Mozilla Firefox (latest) 36 | * Mozilla Firefox 4 37 | * Opera (latest) 38 | * Apple Safari 6+ 39 | * Internet Explorer 8+ 40 | 41 | [Normalize.css v1 provides legacy browser 42 | support](https://github.com/necolas/normalize.css/tree/v1) (IE 6+, Safari 4+), 43 | but is no longer actively developed. 44 | 45 | ## Extended details 46 | 47 | Additional detail and explanation of the esoteric parts of normalize.css. 48 | 49 | #### `pre, code, kbd, samp` 50 | 51 | The `font-family: monospace, monospace` hack fixes the inheritance and scaling 52 | of font-size for preformated text. The duplication of `monospace` is 53 | intentional. [Source](http://en.wikipedia.org/wiki/User:Davidgothberg/Test59). 54 | 55 | #### `sub, sup` 56 | 57 | Normally, using `sub` or `sup` affects the line-box height of text in all 58 | browsers. [Source](http://gist.github.com/413930). 59 | 60 | #### `svg:not(:root)` 61 | 62 | Adding `overflow: hidden` fixes IE9's SVG rendering. Earlier versions of IE 63 | don't support SVG, so we can safely use the `:not()` and `:root` selectors that 64 | modern browsers use in the default UA stylesheets to apply this style. [SVG 65 | Mailing List discussion](http://lists.w3.org/Archives/Public/public-svg-wg/2008JulSep/0339.html) 66 | 67 | #### `input[type="search"]` 68 | 69 | The search input is not fully stylable by default. In Chrome and Safari on 70 | OSX/iOS you can't control `font`, `padding`, `border`, or `background`. In 71 | Chrome and Safari on Windows you can't control `border` properly. It will apply 72 | `border-width` but will only show a border color (which cannot be controlled) 73 | for the outer 1px of that border. Applying `-webkit-appearance: textfield` 74 | addresses these issues without removing the benefits of search inputs (e.g. 75 | showing past searches). 76 | 77 | #### `legend` 78 | 79 | Adding `border: 0` corrects an IE 8–11 bug where `color` (yes, `color`) is not 80 | inherited by `legend`. 81 | 82 | ## Contributing 83 | 84 | Please read the CONTRIBUTING.md 85 | 86 | ## Acknowledgements 87 | 88 | Normalize.css is a project by [Nicolas Gallagher](https://github.com/necolas), 89 | co-created with [Jonathan Neal](https://github.com/jonathantneal). 90 | -------------------------------------------------------------------------------- /bower_components/normalize.css/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "normalize-css", 3 | "version": "3.0.2", 4 | "main": "normalize.css", 5 | "author": "Nicolas Gallagher", 6 | "ignore": [ 7 | "CHANGELOG.md", 8 | "CONTRIBUTING.md", 9 | "component.json", 10 | "package.json", 11 | "test.html" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /deploy.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | '''deploy support 5 | - 141028 upgrade usage 'app.py -g' 6 | - 141010 usage 'gen.py' 7 | ''' 8 | 9 | pipe = os.popen("git pull origin master").read() 10 | 11 | if 'up-to-date' in pipe: 12 | sys.exit(1) 13 | else: 14 | os.system("python ./bin/app.py -g ") 15 | -------------------------------------------------------------------------------- /fabfile.py: -------------------------------------------------------------------------------- 1 | from fabric.api import * 2 | import fabric.contrib.project as project 3 | import os 4 | 5 | local_settings = os.path.expanduser( 6 | os.path.join(os.path.dirname(__file__), 'local_settings.py')) 7 | if os.path.exists(local_settings): 8 | execfile(local_settings) 9 | # Local path configuration (can be absolute or relative to fabfile) 10 | ######################################### 11 | # deploy for 7niu CDN 12 | ######################################### 13 | #env.input_path = 'docs' 14 | env.deploy_path = 'out' 15 | DEPLOY_PATH = env.deploy_path 16 | 17 | def build(): 18 | local('python bin/app.py -g') 19 | 20 | def pub2hub(): 21 | build() 22 | local('cd {deploy_path} && ' 23 | 'git status && ' 24 | 'git add . && ' 25 | 'git commit -am \'upgraded from local. by StaticPyCon\' && ' 26 | 'git push'.format(**env) 27 | ) 28 | 29 | ######################################### 30 | # deploy for gitcafe-pages 31 | ######################################### 32 | ''' 33 | def pub2cafe(): 34 | build() 35 | local('cd {deploy_path} && ' 36 | 'git status && ' 37 | 'git add . && ' 38 | 'git commit -am \'upgraded from local. by StaticPyCon\' && ' 39 | 'git push origin gitcafe-pages'.format(**env) 40 | ) 41 | ''' 42 | # 141013 ZQ appended new actions for pub. through gitcafe-pages 43 | '''depend on: 44 | 0. ACL for https://gitcafe.com/PyConChina/PyConChina 45 | 1. re-link staticpycon/out -> ../7niu.pyconcn/2014/ 46 | 2. editor ../7niu.pyconcn/2014/.git/config appended like 47 | ... 48 | 49 | env.qiniu = '/opt/bin/7niu_package_darwin_amd64/qrsync' 50 | env.qiniu_conf = '../7niu-pycon.json' 51 | env.qiniu_path = '../7niu.pyconcn' 52 | def put7niu(): 53 | local('cd {qiniu_path} && ' 54 | 'pwd && ' 55 | 'python gen4idx.py ./ footer-7niu.html zoomquiet && ' 56 | '{qiniu} {qiniu_conf}&& ' 57 | 'pwd '.format(**env) 58 | ) 59 | 60 | [branch "gitcafe-pages"] 61 | remote = cafe 62 | merge = refs/heads/gitcafe-pages 63 | ... 64 | 65 | confirmed all OK this flow: 66 | 67 | - fixed some src/data/*.md 68 | - python bin/app.py -g 69 | - cd out 70 | - git ci -am "commit log some" 71 | - git pu 72 | 73 | so the daily working just: 74 | 75 | $ fab pub2cafe 76 | 77 | ''' 78 | # Remote server configuration 79 | # deploy for upstream pycon-statics hosts 80 | #env.roledefs = { 81 | # 'smirrors': ['obp:9022' 82 | # , 'root@PyConSS1' 83 | # , 'root@PyConSS3' 84 | # ] 85 | # } 86 | #env.out_dir = '/opt/www/PyConChina/' 87 | # 88 | #@roles('smirrors') 89 | #def sync2upstreams(): 90 | # with cd('{out_dir}'.format(**env)): 91 | # run('uname -a') 92 | # run('pwd') 93 | # run("git status" ) 94 | # run("git pull" ) 95 | ######################################### 96 | # deploy for upstream pycon-statics hosts 97 | ######################################### 98 | #env.roledefs = { 99 | # 'smirror': ['gw2obp'] 100 | # } 101 | #env.static_site = '/opt/www/staticpycon' 102 | 103 | #@roles('smirror') 104 | #def sync4upstream(): 105 | # local('ssh gw2obp uname -a ; ' 106 | # 'cat {static_site}/deploy.py ; ' 107 | # 'cd {static_site} ; ' 108 | # 'python {static_site}/deploy.py'.format(**env) 109 | # ) 110 | 111 | 112 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | staticjinja==0.3.0 2 | mkdocs>=0.9 3 | #pyScss>=1.3.2 -- vendored; see bin/staticpycon/_vendor 4 | colorama>=0.3.2 5 | 6 | # pyScss 依赖关系 7 | six 8 | 9 | # Python < 3.4: 10 | enum34 11 | pathlib 12 | 13 | # Python < 2.7: 14 | # ordereddict 15 | -------------------------------------------------------------------------------- /sass/_base.scss: -------------------------------------------------------------------------------- 1 | html { 2 | background-color: $page-bg; 3 | color: $page-fg; 4 | } 5 | 6 | .container { 7 | @include outer-container; 8 | } 9 | 10 | 11 | // logo 12 | .pycon-logo { 13 | display: block; 14 | margin: 2.5em auto; 15 | 16 | // 屏幕很窄的情况下也不要溢出, 否则会造成水平滚动条的 17 | // 这里对最大宽度的要求本质上并不是属于某一特定体验的, 所以不放在 media 18 | // 块里面. 19 | max-width: 100%; 20 | 21 | @include media($mobile) { 22 | // 跟内容部分一致的留白 23 | padding: 0 1em; 24 | } 25 | } 26 | 27 | 28 | // 内容模块 29 | .page__module { 30 | @include clearfix; 31 | 32 | position: relative; // 以防万一 33 | width: 100%; 34 | } 35 | 36 | .section__content { 37 | @include outer-container; 38 | 39 | overflow: hidden; 40 | } 41 | 42 | // Disqus 模块属于内容性质, 限制宽度 43 | .page__disqus { 44 | @include outer-container; 45 | } 46 | 47 | 48 | // 各种标题 49 | .title-common { 50 | width: 100%; 51 | text-align: center; 52 | } 53 | 54 | .section__title--index-common { 55 | @extend .title-common; 56 | 57 | color: $index-title-fg; 58 | 59 | padding: 0.1em 0; 60 | 61 | font-size: 250%; 62 | font-weight: 700; 63 | } 64 | 65 | .section__title--index { 66 | @extend .section__title--index-common; 67 | 68 | background-color: $index-title-bg; 69 | } 70 | 71 | .section__title--subpage-header { 72 | @extend .section__title--index-common; 73 | 74 | // 无意间的发现: 没有 logo 分开 navbar 和页面标题的话, 会导致整个 header 的 75 | // 配色酷似乌克兰的国旗... 76 | // workaround possible political implications 77 | &:before, 78 | &:after { 79 | color: $index-title-bg; 80 | } 81 | 82 | &:before { 83 | content: '['; 84 | padding-right: 0.5em; 85 | } 86 | 87 | &:after { 88 | content: ']'; 89 | padding-left: 0.5em; 90 | } 91 | } 92 | 93 | .section__title { 94 | @extend .title-common; 95 | 96 | background-color: $section-title-bg; 97 | color: $section-title-fg; 98 | 99 | padding: 0.1em 0; 100 | 101 | font-size: 200%; 102 | font-weight: 600; 103 | } 104 | 105 | // 子标题 106 | .title-subsection { 107 | line-height: 1; 108 | 109 | @include media($wide) { 110 | position: absolute; 111 | top: 0.5em; 112 | left: 0; 113 | 114 | font-size: 400%; 115 | font-weight: 600; 116 | 117 | // alpha-hint 也显得太浓了... 118 | color: rgba(#000, $alpha-divider); 119 | 120 | // 显得略不严肃... 关掉 121 | // @include transform(rotate(-15deg)); 122 | // @include transform-origin(25% 75%); 123 | } 124 | 125 | @include media($non-wide) { 126 | display: inline-block; 127 | font-size: 150%; 128 | font-weight: 500; 129 | text-align: left; 130 | 131 | color: $text-secondary-color; 132 | 133 | margin: 0 0 1em; 134 | padding: 0.5em 2em 0.1em 0.5em; 135 | 136 | border-bottom: 1px solid rgba(#000, $alpha-divider); 137 | } 138 | } 139 | 140 | @mixin subsection-container { 141 | position: relative; 142 | 143 | // clip 掉旋转出容器的那部分标题 144 | overflow: hidden; 145 | } 146 | 147 | 148 | // 一些 Bootstrap 残留 149 | .sr-only { 150 | border: 0 none; 151 | clip: rect(0px, 0px, 0px, 0px); 152 | height: 1px; 153 | margin: -1px; 154 | overflow: hidden; 155 | padding: 0; 156 | position: absolute; 157 | width: 1px; 158 | } 159 | 160 | 161 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 162 | -------------------------------------------------------------------------------- /sass/_colors.scss: -------------------------------------------------------------------------------- 1 | $python-blue: #52b0ff; // Light Blue 300: #4fc3f7 2 | $python-yellow: #ffe052; // Yellow 400: #ffee58 3 | 4 | // 文字颜色设定 5 | $text-base-color: #000; 6 | 7 | // 内容透明度层次, from Material Design 8 | $alpha-main: 0.87; 9 | $alpha-secondary: 0.54; 10 | $alpha-hint: 0.26; 11 | $alpha-divider: 0.12; 12 | 13 | $text-color: rgba($text-base-color, $alpha-main); 14 | $text-secondary-color: rgba($text-base-color, $alpha-secondary); 15 | 16 | $page-bg: #fafafa; 17 | $page-fg: $text-color; 18 | 19 | $nav-bg: $python-blue; 20 | $nav-fg: #fff; 21 | 22 | $index-title-bg: $python-yellow; 23 | $index-title-fg: $text-color; 24 | 25 | $section-title-bg: rgba(#000, $alpha-divider); 26 | $section-title-fg: #212121; // Grey 900 27 | 28 | $brand-success: #8bc34a; // Light Green 500 29 | 30 | 31 | // 赞助模块 32 | $sponsor-diamond-bg: #fff; 33 | $sponsor-platinum-bg: #fafafa; // Grey 50 34 | $sponsor-gold-bg: #ffecb3; // Amber 100 35 | $sponsor-silver-bg: #e0e0e0; // Grey 300 36 | $sponsor-bronze-bg: #d7ccc8; // Brown 100 37 | $sponsor-partner-bg: $page-bg; 38 | 39 | 40 | // 名片 41 | $person-card-bg: #f5f5f5; // Grey 100 42 | $person-card-border-color: #e0e0e0; // Grey 300 43 | $person-card-shadow-color: rgba(0, 0, 0, 0.125); 44 | 45 | 46 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 47 | -------------------------------------------------------------------------------- /sass/_donators.scss: -------------------------------------------------------------------------------- 1 | // 捐助者列表 2 | // 排序说明文字 3 | .mod-donators__orderby { 4 | display: block; 5 | 6 | color: $text-secondary-color; 7 | 8 | margin: 2em 0 0; 9 | 10 | text-align: center; 11 | } 12 | 13 | 14 | // 列表容器 15 | .mod-donators__container { 16 | @include outer-container; 17 | 18 | margin: 2em 0; 19 | } 20 | 21 | .mod-donators__list { 22 | text-align: center; 23 | 24 | @include media($wide) { 25 | @include span-columns(10); 26 | @include shift(1); 27 | } 28 | 29 | @include media($narrow) { 30 | @include span-columns(4); 31 | @include shift(1); 32 | } 33 | 34 | @include media($mobile) { 35 | @include span-columns(4); 36 | } 37 | } 38 | 39 | // 捐助者元素 40 | .mod-donators__person { 41 | padding: 0.5em 0; 42 | 43 | border-bottom: 1px solid rgba(0, 0, 0, 0.12); 44 | 45 | @include media($wide) { 46 | @include span-columns(2 of 10); 47 | @include omega(5n); 48 | 49 | &:hover { 50 | box-shadow: 0 0.5em 1em rgba(0, 0, 0, 0.12); 51 | } 52 | } 53 | 54 | @include media($narrow) { 55 | @include span-columns(1); 56 | @include omega(6n); 57 | } 58 | 59 | @include media($mobile) { 60 | @include span-columns(1); 61 | @include omega(4n); 62 | } 63 | } 64 | 65 | 66 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 67 | -------------------------------------------------------------------------------- /sass/_footer.scss: -------------------------------------------------------------------------------- 1 | // footer 样式 2 | .page__footer { 3 | border-top-width: 3px; 4 | border-top-style: solid; 5 | border-top-color: $python-blue; 6 | 7 | // 给有能力的浏览器看象征着 Python 双色 logo 的 border 背景图案! 8 | @include border-image( 9 | linear-gradient( 10 | to right, 11 | $python-blue 0%, 12 | $python-blue 50%, 13 | $python-yellow 50%, 14 | $python-yellow 15 | ) 16 | 3 0 0 0 17 | ); 18 | 19 | color: rgba(#fff, 0.87); 20 | 21 | // pyScss bug, 不能正确渲染 22 | // 只好注释掉 23 | // @include linear-gradient( 24 | // to bottom, 25 | // rgba(0, 0, 0, 0.12) 0%, 26 | // rgba(0, 0, 0, 0) 20%, 27 | // rgba(0, 0, 0, 0) 100%, 28 | // $fallback: #424242 29 | // ); 30 | background-color: #424242; 31 | 32 | padding: 1em 0; 33 | 34 | font-family: $font-family-monospace; 35 | font-size: 75%; 36 | text-align: center; 37 | } 38 | 39 | 40 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 41 | -------------------------------------------------------------------------------- /sass/_media-late.scss: -------------------------------------------------------------------------------- 1 | // 由于 pyScss bug 断点定义必须出现在 Neat 引入之后: see _media.scss 2 | $narrow: new-breakpoint(min-width $mobile-breakpoint + 1px max-width $narrow-breakpoint 6); 3 | $mobile: new-breakpoint(max-width $mobile-breakpoint 4); 4 | $wide: min-width $narrow-breakpoint + 1px; 5 | 6 | $non-mobile: min-width $mobile-breakpoint + 1px; 7 | $non-wide: max-width $narrow-breakpoint; 8 | 9 | 10 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 11 | -------------------------------------------------------------------------------- /sass/_media.scss: -------------------------------------------------------------------------------- 1 | // RWD 布局断点 2 | // 设计的正常桌面版体验太宽... 那就在 1366px 断掉好了 3 | // 这是在 Firefox 响应式设计视图试验的结果 4 | $narrow-breakpoint: 1366px; 5 | $mobile-breakpoint: 768px; 6 | 7 | // 实际上 pyScss 的 @function 实现完全坏掉了 (必须先定义才能用), 所以 8 | // 不可能支持 visual grid... 而且断点定义必须出现在 Neat 之后. 嘛... 9 | // 那部分代码放到 _media-late.scss 了 10 | 11 | // grid 布局调试设置 12 | $visual-grid: false; 13 | $visual-grid-color: #000; 14 | $visual-grid-opacity: 0.05; 15 | $visual-grid-index: front; 16 | 17 | 18 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 19 | -------------------------------------------------------------------------------- /sass/_normalize.scss: -------------------------------------------------------------------------------- 1 | ../bower_components/normalize.css/normalize.css -------------------------------------------------------------------------------- /sass/_person.scss: -------------------------------------------------------------------------------- 1 | // 名片 (media object) 2 | // 容器 3 | @mixin person-container { 4 | // 为了让每一行的名片高度统一, Flexbox 搞起 5 | // oldIE 是什么, 可以吃吗? 6 | @include media($non-mobile) { 7 | .browser-modern & { 8 | @include display(flex); 9 | @include flex-wrap(wrap); 10 | } 11 | } 12 | } 13 | 14 | 15 | // 名片 16 | .person { 17 | @include clearfix; 18 | 19 | // 名片外观 20 | @include media($non-mobile) { 21 | background-color: $person-card-bg; 22 | 23 | border: 1px solid $person-card-border-color; 24 | box-shadow: 0 0.5em 1em $person-card-shadow-color; 25 | 26 | margin-bottom: 2em; 27 | padding: 1em; 28 | } 29 | 30 | @include media($mobile) { 31 | border-bottom: 1px solid $person-card-border-color; 32 | padding: 1em; 33 | 34 | &:hover { 35 | background-color: $person-card-bg; 36 | } 37 | 38 | &:last-child { 39 | border-bottom: none; 40 | } 41 | } 42 | 43 | // 布局 44 | @include media($wide) { 45 | .browser-modern & { 46 | @include flex(0 0 flex-grid(6)); 47 | 48 | &:nth-child(2n) { 49 | margin-left: flex-gutter(); 50 | } 51 | } 52 | 53 | .browser-ie & { 54 | @include span-columns(6); 55 | @include omega(2n); 56 | } 57 | } 58 | 59 | @include media($narrow) { 60 | .browser-modern & { 61 | @include flex(0 0 flex-grid(3, 6)); 62 | 63 | &:nth-child(2n) { 64 | margin-left: flex-gutter(6); 65 | } 66 | } 67 | 68 | .browser-ie & { 69 | @include span-columns(6); 70 | @include omega(2n); 71 | } 72 | } 73 | 74 | @include media($mobile) { 75 | @include span-columns(4); 76 | } 77 | } 78 | 79 | .person__name { 80 | font-size: 125%; 81 | font-weight: 600; 82 | 83 | margin-bottom: 0.5em; 84 | } 85 | 86 | // 头像 87 | // 说是 link, 实际上还承担着固定尺寸容器的作用 88 | // TODO: 重构 89 | $avatar-size: 80px; 90 | .person__avatar-link { 91 | float: left; 92 | margin-right: 1em; 93 | 94 | width: $avatar-size; 95 | height: $avatar-size; 96 | 97 | // 头像图片宽度撑不满容器的话, 也要居中显示 98 | text-align: center; 99 | } 100 | 101 | .person__avatar { 102 | display: inline-block; 103 | 104 | max-width: $avatar-size; 105 | max-height: $avatar-size; 106 | 107 | border-radius: 0.5em; 108 | } 109 | 110 | // 介绍文字 111 | // .person__intro { 112 | // color: $text-secondary-color; 113 | 114 | // .person:hover > .person__desc > & { 115 | // color: inherit; 116 | // } 117 | // } 118 | 119 | 120 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 121 | -------------------------------------------------------------------------------- /sass/_prettify.scss: -------------------------------------------------------------------------------- 1 | .com { color: #93a1a1; } 2 | .lit { color: #195f91; } 3 | .pun, .opn, .clo { color: #93a1a1; } 4 | .fun { color: #dc322f; } 5 | .str, .atv { color: #D14; } 6 | .kwd, .prettyprint .tag { color: #1e347b; } 7 | .typ, .atn, .dec, .var { color: teal; } 8 | .pln { color: #48484c; } 9 | 10 | .prettyprint { 11 | padding: 8px; 12 | } 13 | .prettyprint.linenums { 14 | -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 15 | -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 16 | box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; 17 | } 18 | 19 | /* Specify class=linenums on a pre to get line numbering */ 20 | ol.linenums { 21 | margin: 0 0 0 33px; /* IE indents via margin-left */ 22 | } 23 | ol.linenums li { 24 | padding-left: 12px; 25 | color: #bebec5; 26 | line-height: 20px; 27 | text-shadow: 0 1px 0 #fff; 28 | } 29 | -------------------------------------------------------------------------------- /sass/_reset.scss: -------------------------------------------------------------------------------- 1 | html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a, 2 | abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike, 3 | strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend, 4 | table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed, 5 | figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary, 6 | time,mark,audio,video { 7 | margin: 0; 8 | padding: 0; 9 | border: 0; 10 | font-size: 100%; 11 | font: inherit; 12 | vertical-align:baseline; 13 | } 14 | 15 | article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section { 16 | display: block; 17 | } 18 | 19 | table { 20 | border-collapse: collapse; 21 | border-spacing: 0; 22 | } 23 | 24 | a,ins { 25 | text-decoration:none; 26 | } 27 | 28 | del { 29 | text-decoration:line-through; 30 | } 31 | 32 | ol,ul { 33 | list-style:none; 34 | } 35 | 36 | caption,th { 37 | text-align:left; 38 | } 39 | 40 | h1,h2,h3,h4,h5,h6 { 41 | font-size: 100%; 42 | font-weight:normal; 43 | } 44 | 45 | blockquote,q { 46 | quotes:none; 47 | } 48 | 49 | blockquote:before,blockquote:after,q:before,q:after { 50 | content:''; 51 | content:none; 52 | } 53 | 54 | abbr,acronym { 55 | font-variant:normal; 56 | } 57 | 58 | legend { 59 | color:#000; 60 | } 61 | 62 | a { 63 | color:inherit; 64 | } 65 | 66 | 67 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 68 | -------------------------------------------------------------------------------- /sass/_speakers.scss: -------------------------------------------------------------------------------- 1 | // 讲师模块样式 2 | // 讲师列表 3 | .mod-speakers__content { 4 | @include outer-container; 5 | @include person-container; 6 | @include clearfix; 7 | } 8 | 9 | // 各城市讲师容器 10 | .mod-speakers__city { 11 | @include subsection-container; 12 | 13 | @include media($wide) { 14 | padding: 2em 0; 15 | 16 | border-bottom: 1px solid rgba(0, 0, 0, 0.12); 17 | 18 | &:last-child { 19 | border-bottom: none; 20 | } 21 | } 22 | 23 | @include media($non-wide) { 24 | padding: 1em 0 0; 25 | } 26 | } 27 | 28 | // 城市名称小标题 29 | .mod-speakers__city__name { 30 | @extend .title-subsection; 31 | 32 | white-space: pre-wrap; 33 | 34 | &:after { 35 | @include media($wide) { 36 | html[lang='cn'] & { 37 | content: '\A讲师'; 38 | } 39 | } 40 | 41 | @include media($non-wide) { 42 | html[lang='cn'] & { 43 | content: '讲师'; 44 | } 45 | } 46 | 47 | font-weight: 200; 48 | } 49 | } 50 | 51 | 52 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 53 | -------------------------------------------------------------------------------- /sass/_sponsorpage.scss: -------------------------------------------------------------------------------- 1 | // 赞助页面样式 2 | // 布局 3 | .sponsorpage__text, 4 | .sponsorpage__list { 5 | @include outer-container; 6 | 7 | padding: 2em 0; 8 | } 9 | 10 | 11 | // 赞助等级标题 12 | .sponsorpage__level { 13 | @extend .section__title; 14 | } 15 | 16 | .sponsorpage__level--diamond { 17 | // 不够显眼 18 | // background-color: $sponsor-diamond-bg; 19 | } 20 | 21 | .sponsorpage__level--platinum { 22 | // 同上 23 | // background-color: $sponsor-platinum-bg; 24 | } 25 | 26 | .sponsorpage__level--gold { 27 | background-color: $sponsor-gold-bg; 28 | } 29 | 30 | .sponsorpage__level--silver { 31 | background-color: $sponsor-silver-bg; 32 | } 33 | 34 | .sponsorpage__level--bronze { 35 | background-color: $sponsor-bronze-bg; 36 | } 37 | 38 | .sponsorpage__level--partner { 39 | // 同钻石, 白金 40 | // background-color: $sponsor-partner-bg; 41 | } 42 | 43 | 44 | // 单篇赞助商资料 45 | .sponsorpage__item { 46 | @include clearfix; 47 | 48 | padding: 2em 0; 49 | } 50 | 51 | // logo 链接 52 | .sponsorpage__item__logo-link { 53 | @include span-columns(3); 54 | 55 | text-align: center; 56 | } 57 | 58 | // logo 图像 59 | .sponsorpage__item__logo { 60 | display: inline-block; 61 | 62 | max-width: 100%; 63 | } 64 | 65 | 66 | // 介绍文字 67 | .sponsorpage__item__desc { 68 | @include span-columns(9); 69 | @include omega; 70 | } 71 | 72 | 73 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 74 | -------------------------------------------------------------------------------- /sass/_sponsors.scss: -------------------------------------------------------------------------------- 1 | // 赞助模块样式 2 | // 模块 3 | .mod-sponsors__subsec { 4 | @include subsection-container; 5 | } 6 | 7 | .mod-sponsors__subsec--diamond { 8 | @extend .mod-sponsors__subsec; 9 | 10 | background-color: $sponsor-diamond-bg; 11 | } 12 | 13 | .mod-sponsors__subsec--platinum { 14 | @extend .mod-sponsors__subsec; 15 | 16 | background-color: $sponsor-platinum-bg; 17 | } 18 | 19 | .mod-sponsors__subsec--gold { 20 | @extend .mod-sponsors__subsec; 21 | 22 | background-color: $sponsor-gold-bg; 23 | } 24 | 25 | .mod-sponsors__subsec--silver { 26 | @extend .mod-sponsors__subsec; 27 | 28 | background-color: $sponsor-silver-bg; 29 | } 30 | 31 | .mod-sponsors__subsec--bronze { 32 | @extend .mod-sponsors__subsec; 33 | 34 | background-color: $sponsor-bronze-bg; 35 | } 36 | 37 | .mod-sponsors__subsec--partner { 38 | @extend .mod-sponsors__subsec; 39 | 40 | background-color: $sponsor-partner-bg; 41 | } 42 | 43 | 44 | // 赞助等级标题 45 | .mod-sponsors__level { 46 | @extend .title-subsection; 47 | 48 | // 虽然是半透明的, 也要防止挡住赞助商 logo 的可能性 49 | // TODO: 重构 z-index 使其受统一管理? 50 | z-index: 100; 51 | } 52 | 53 | 54 | // 赞助链接容器 55 | .mod-sponsors__content { 56 | // 居中排列 inline-block 的赞助 logo 57 | text-align: center; 58 | 59 | @include media($non-mobile) { 60 | // 上下: 目的很明显 61 | // 左右: 左侧需要给赞助等级的元素留出一些空白 62 | padding: 2em 6em; 63 | } 64 | 65 | @include media($mobile) { 66 | // 移动体验下左右是不需要留白的, 留了反而会在非常窄的屏幕下造成不对齐 67 | padding: 2em 0; 68 | } 69 | } 70 | 71 | 72 | // 赞助链接 73 | .sponsor__link { 74 | // 完美的居中~ (不光整体居中, 每一行里也垂直居中) 75 | // 其实不用 flexbox 也能做到 :-P, 只是需要和容器元素配合罢了, 还会影响 76 | // display 属性, 这里无所谓 77 | display: inline-block; 78 | 79 | margin: 0.5em 1em; 80 | 81 | // 垂直居中 82 | vertical-align: middle; 83 | } 84 | 85 | // 赞助图像 86 | .sponsor__img { 87 | display: block; 88 | 89 | // 不要被赞助等级标题挡住 90 | z-index: 200; 91 | 92 | // 个别一些赞助商 logo 在深色背景表现不佳... 93 | // 只好统一给一些框 94 | padding: 0.25em; 95 | background-color: #fff; 96 | box-shadow: 0 0.5em 1em rgba(0, 0, 0, 0.25); 97 | } 98 | 99 | .sponsor-gold, 100 | .sponsor-silver, 101 | .sponsor-bronze { 102 | max-height: 60px; 103 | max-width: 200px; 104 | } 105 | 106 | .sponsor-diamond { 107 | @extend .sponsor__img; 108 | } 109 | 110 | .sponsor-platinum { 111 | @extend .sponsor__img; 112 | } 113 | 114 | .sponsor-gold { 115 | @extend .sponsor__img; 116 | } 117 | 118 | .sponsor-silver { 119 | @extend .sponsor__img; 120 | } 121 | 122 | .sponsor-bronze { 123 | @extend .sponsor__img; 124 | } 125 | 126 | .sponsor-partner { 127 | @extend .sponsor__img; 128 | } 129 | 130 | 131 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 132 | -------------------------------------------------------------------------------- /sass/_typography.scss: -------------------------------------------------------------------------------- 1 | $body-font-size: 1em !default; 2 | $body-font-weight: 200 !default; 3 | $body-line-height: 1.5 !default; 4 | 5 | $helvetica-without-fallback: remove-last($helvetica); 6 | 7 | $sans-prefer-font-family-western: ( 8 | "Source Sans Pro" 9 | ) !default; 10 | 11 | $sans-font-family-western: join( 12 | $sans-prefer-font-family-western, 13 | $helvetica-without-fallback, 14 | 'comma' 15 | ) !default; 16 | 17 | $sans-font-family-chinese: ( 18 | "Source Han Sans SC" 19 | "WenQuanYi Micro Hei" 20 | "Microsoft YaHei" 21 | SimSun 22 | ) !default; 23 | 24 | $sans-font-family: join( 25 | $sans-font-family-western, 26 | $sans-font-family-chinese, 27 | 'comma' 28 | ), 29 | sans-serif !default; 30 | 31 | $body-font-family: $sans-font-family; 32 | 33 | $font-family-monospace-western: ( 34 | 'Source Code Pro', 35 | 'Inconsolata', 36 | 'DejaVu Sans Mono', 37 | 'Menlo', 38 | 'Monaco', 39 | 'Consolas', 40 | 'Courier New' 41 | ) !default; 42 | 43 | $font-family-monospace-chinese: $sans-font-family-chinese !default; 44 | $font-family-monospace: join( 45 | $font-family-monospace-western, 46 | $font-family-monospace-chinese, 47 | 'comma' 48 | ), 49 | monospace !default; 50 | 51 | 52 | // 全局设定 53 | body { 54 | font: $body-font-weight $body-font-size $body-font-family; 55 | line-height: $body-line-height; 56 | } 57 | 58 | 59 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 60 | -------------------------------------------------------------------------------- /sass/_volunteers.scss: -------------------------------------------------------------------------------- 1 | // 志愿者页面样式 2 | // 说明文字 3 | .volunteers__text { 4 | @include outer-container; 5 | 6 | padding: 1.5em 0; 7 | } 8 | 9 | 10 | // Pythoneer 释义文字 11 | .volunteers__pythoneer { 12 | // 不能放在容器上, 会改变 $max-width (单位是 em) 的大小的 13 | font-size: 125%; 14 | } 15 | 16 | 17 | // 列表 18 | .volunteers__list { 19 | @include outer-container; 20 | @include person-container; 21 | 22 | padding: 2em 0; 23 | } 24 | 25 | 26 | // 各种链接 27 | .volunteers__link { 28 | display: block; 29 | 30 | &:before { 31 | margin-right: 0.5em; 32 | } 33 | } 34 | 35 | .volunteers__link--github { 36 | @extend .volunteers__link; 37 | 38 | &:before { 39 | @include fa-inplace($fa-var-github); 40 | } 41 | } 42 | 43 | .volunteers__link--weibo { 44 | @extend .volunteers__link; 45 | 46 | &:before { 47 | @include fa-inplace($fa-var-weibo); 48 | } 49 | } 50 | 51 | .volunteers__link--blog { 52 | @extend .volunteers__link; 53 | 54 | &:before { 55 | @include fa-inplace($fa-var-home); 56 | } 57 | } 58 | 59 | 60 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 61 | -------------------------------------------------------------------------------- /sass/app.scss: -------------------------------------------------------------------------------- 1 | @import 'bourbon'; 2 | 3 | @import 'helpers/list-functions'; 4 | 5 | @import 'media'; 6 | @import 'neat'; 7 | @import 'media-late'; 8 | 9 | // 在项目里暂时不要用 variables 和 path 两个名字命名样式文件, 会跟 fa 10 | // 冲突的. 我们不引入整个 fa, 而仅仅使用它的上述组件, 可以大幅缩小 CSS 体积, 11 | // 而上游没有用单独的目录存放不同模块, 代价即是必须在我们这一侧避免的名字冲突. 12 | // mixins 没有占用, 本来我可以用它避免一点 code duplication 的, 但为了减少 13 | // 输出的重复属性我还是复制了一份改掉了 14 | @import 'variables'; // fa 15 | 16 | @import 'normalize'; 17 | @import 'reset'; 18 | // @import 'font-awesome'; 19 | @import 'path'; // fa 20 | 21 | @import 'helpers/fontawesome-mixin'; 22 | 23 | @import 'colors'; 24 | @import 'typography'; 25 | 26 | @import 'base'; 27 | @import 'nav'; 28 | @import 'intro'; 29 | @import 'sponsors'; 30 | @import 'person'; 31 | @import 'speakers'; 32 | @import 'donators'; 33 | @import 'sponsorpage'; 34 | @import 'schedule'; 35 | @import 'volunteers'; 36 | @import 'footer'; 37 | 38 | 39 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 40 | -------------------------------------------------------------------------------- /sass/helpers/_fontawesome-mixin.scss: -------------------------------------------------------------------------------- 1 | // simple mixin for accessing FontAwesome directly without axtra tags 2 | @mixin fa-inplace($fa-var, $font-size: inherit, $force-line-height: true) { 3 | // font-awesome/scss/_core.scss 4 | display: inline-block; 5 | 6 | @if $force-line-height == 'true' or $force-line-height == 'yes' { 7 | @if $font-size == 'inherit' { 8 | font: normal normal normal 14px/1 FontAwesome; 9 | font-size: inherit; 10 | } @else { 11 | font: normal normal normal $font-size/1 FontAwesome; 12 | } 13 | } @else { 14 | @if $font-size == 'inherit' { 15 | font: normal normal normal 14px FontAwesome; 16 | font-size: inherit; 17 | } @else { 18 | font: normal normal normal $font-size FontAwesome; 19 | } 20 | line-height: inherit; 21 | } 22 | 23 | text-rendering: auto; 24 | -webkit-font-smoothing: antialiased; 25 | -moz-osx-font-smoothing: grayscale; 26 | 27 | // font-awesome/scss/_icons.scss 28 | content: $fa-var; 29 | } 30 | 31 | 32 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 33 | -------------------------------------------------------------------------------- /sass/helpers/_list-functions.scss: -------------------------------------------------------------------------------- 1 | // taken from http://hugogiraudel.com/2013/08/08/advanced-sass-list-functions/ 2 | @function remove-nth($list, $index) { 3 | $result: null; 4 | 5 | @if type-of($index) != number { 6 | @warn "$index: #{quote($index)} is not a number for `remove-nth`."; 7 | } 8 | 9 | @else if $index == 0 { 10 | @warn "List index 0 must be a non-zero integer for `remove-nth`."; 11 | } 12 | 13 | @else if abs($index) > length($list) { 14 | @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; 15 | } 16 | 17 | @else { 18 | $result: (); 19 | $index: if($index < 0, length($list) + $index + 1, $index); 20 | 21 | @for $i from 1 through length($list) { 22 | @if $i != $index { 23 | $result: append($result, nth($list, $i)); 24 | } 25 | } 26 | } 27 | 28 | @return $result; 29 | } 30 | 31 | 32 | @function remove-last($list) { 33 | @return remove-nth($list, length($list)); 34 | } 35 | 36 | 37 | // vim:set ai et ts=2 sw=2 sts=2 fenc=utf-8: 38 | -------------------------------------------------------------------------------- /src/asset/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyConChina/staticpycon/fe43b3f5080582f1c575d036ee4d4565987d83b0/src/asset/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/asset/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyConChina/staticpycon/fe43b3f5080582f1c575d036ee4d4565987d83b0/src/asset/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/asset/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyConChina/staticpycon/fe43b3f5080582f1c575d036ee4d4565987d83b0/src/asset/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/asset/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyConChina/staticpycon/fe43b3f5080582f1c575d036ee4d4565987d83b0/src/asset/img/favicon.ico -------------------------------------------------------------------------------- /src/asset/js/base.js: -------------------------------------------------------------------------------- 1 | /* test for IE */ 2 | var isIE = function() { 3 | var ua = navigator.userAgent; 4 | 5 | // yeah, even IE11 is not modern enough by our standard. 6 | // anyone dare disagree? why not put up some flexboxes first... 7 | return /MSIE/.test(ua) || /Trident/.test(ua); 8 | }; 9 | 10 | $(document).ready(function() { 11 | if (isIE()) { 12 | $('html').removeClass('browser-modern').addClass('browser-ie'); 13 | } 14 | }); 15 | 16 | /* Prettyify */ 17 | $( document ).ready(function() { 18 | prettyPrint(); 19 | }); 20 | 21 | 22 | /* Scrollspy */ 23 | var navHeight = $('.navbar').outerHeight(true) + 10 24 | 25 | $('body').scrollspy({ 26 | target: '.bs-sidebar', 27 | offset: navHeight 28 | }) 29 | 30 | 31 | /* Prevent disabled links from causing a page reload */ 32 | $("li.disabled a").click(function() { 33 | event.preventDefault(); 34 | }); 35 | 36 | 37 | /* Adjust the scroll height of anchors to compensate for the fixed navbar */ 38 | window.disableShift = false; 39 | var shiftWindow = function() { 40 | if (window.disableShift) { 41 | window.disableShift = false; 42 | } else { 43 | /* If we're at the bottom of the page, don't erronously scroll up */ 44 | var scrolledToBottomOfPage = ( 45 | (window.innerHeight + window.scrollY) >= document.body.offsetHeight 46 | ); 47 | if (!scrolledToBottomOfPage) { 48 | scrollBy(0, -60); 49 | }; 50 | }; 51 | }; 52 | if (location.hash) {shiftWindow();} 53 | window.addEventListener("hashchange", shiftWindow); 54 | 55 | 56 | /* Deal with clicks on nav links that do not change the current anchor link. */ 57 | $("ul.nav a" ).click(function() { 58 | var href = this.href; 59 | var suffix = location.hash; 60 | var matchesCurrentHash = (href.indexOf(suffix, href.length - suffix.length) !== -1); 61 | if (location.hash && matchesCurrentHash) { 62 | /* Force a single 'hashchange' event to occur after the click event */ 63 | window.disableShift = true; 64 | location.hash=''; 65 | }; 66 | }); 67 | -------------------------------------------------------------------------------- /src/base/_base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {% if page_description %}{% endif %} 8 | {% if site.author %}{% endif %} 9 | {% if canonical_url %}{% endif %} 10 | 11 | 12 | {{ page_title }} - PyCon 2015 China 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | {% include "base/_nav.html" %} 25 | {% block content %}{% endblock %} 26 |
{% include "base/_disqus.html" %}
27 |
{% include "base/_footer.html" %}
28 | 29 | 30 | 31 | 32 | 33 | 34 | {% include "base/_ga.html" %} 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/base/_disqus.html: -------------------------------------------------------------------------------- 1 |
2 | 13 | 14 | 15 | comments powered by Disqus 16 | -------------------------------------------------------------------------------- /src/base/_footer.html: -------------------------------------------------------------------------------- 1 |

2 | Copyright © 2014, PyConChina 3 |
4 | Contact : 5 | support@pychina.org 6 | | Discuss : 7 | pyconchinese@googlegroups.com 8 |
9 | Built by CPyUG 10 | with staticpycon, 11 | staticjinja, 12 | Bootstrap, 13 | pyScss, 14 | Bourbon, 15 | Neat. 16 |
CDN provider: 17 | 18 | 19 | 20 | ; DVCS provider: 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 |

29 | -------------------------------------------------------------------------------- /src/base/_ga.html: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /src/base/_index-begin-cn.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | PyCon大会就是现在相当火的开源编程语言Python的全球性的盛会,PyConChina 是由 CPyUG(华蠎用户组)获得授权举办的中国PyCon年会. 迄今已是第五届, 由PyChina.org发起,CPyUG/TopGeek 等社区协同,在2015年 9月12日(上海),9月13日(广州),9月19日(北京)分别举办; 无论您偏好哪种编程语言, 都欢迎来参加这场完全由Python中国社区组织的欢乐集会! 4 | 5 |
6 | 7 |

↓大会报名↓通道↓

8 | 16 | 17 |

苦短衫 2015 版

18 | 21 | 22 |
23 | 24 |
25 |
26 | 27 | 37 | -------------------------------------------------------------------------------- /src/base/_index-begin-en.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | PyCon, the party of world-wide Pythoneers! 4 | Supported by PSF(Python Software Foundation) 5 | this is the fifth year of PyCon China. 6 | Organized by CPyUG(Chinese Python User Group), PyCon China will be held simultaneously in 7 | Shanghai/Beijing/Guangzhou this year! 8 |
9 |
10 | 11 |
12 |

SIGN UP

13 | 18 |
19 | 20 |
21 |

CONTACT

22 | 26 |
27 | 28 | -------------------------------------------------------------------------------- /src/base/_nav.html: -------------------------------------------------------------------------------- 1 | {% macro nav_a(nav_item) %} 2 | {% if nav_item.url_external %} 3 | {{ nav_item.title }} 4 | {% else %} 5 | {{ nav_item.title }} 6 | {% endif %} 7 | {% endmacro %} 8 | 9 | 54 | -------------------------------------------------------------------------------- /src/base/_toc.html: -------------------------------------------------------------------------------- 1 | {% if toc %} 2 | 12 | {% endif %} 13 | -------------------------------------------------------------------------------- /src/beijing.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_beijing %} 3 | 4 | {% block content %} 5 | {% if agenda.beijing %} 6 | {% set schedule = agenda.beijing %} 7 | {% set schedule_title = page_title %} 8 | {% include "base/_schedule.html" %} 9 | {% endif %} 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /src/data/_donators.yaml: -------------------------------------------------------------------------------- 1 | - tolerious 2 | - hackergodness 3 | - tolerious 4 | - wgjak47 5 | - 小郭 6 | - TonyZhao 7 | - 肥三 8 | - 何威威 9 | - 老杜 10 | - 海诺者 11 | - Cuble 12 | - 支支 13 | - 田杰 14 | - Touch叉叉 15 | - 韡 16 | - 王不泽 17 | - 麦片先生 18 | - Syberstan 19 | - 路奇 20 | - Mustang 21 | - onlyice 22 | - lix 23 | - 斌雷 24 | - 李明东 25 | - halfcrazy 26 | - lastmayday 27 | - mozillazg 28 | - 小勇紫夜 29 | - 李落 30 | - Qing 31 | - 代少飞 32 | - 小罗哥 33 | - FrankXu 34 | - Kimi Nomaka 35 | - 太阳大人 36 | - SkyLothar 37 | - 黄福江 38 | - lx 39 | - 夏忠武(Xia Wood) -------------------------------------------------------------------------------- /src/data/_nav.yaml: -------------------------------------------------------------------------------- 1 | - title: 讲师 2 | title_en: SPEECH 3 | url: "speechmaker.html" 4 | url_en: "en/speechmaker.html" 5 | - title: 赞助 6 | title_en: SUPPORT 7 | children: 8 | - title: 厂商 9 | title_en: SPONSORS 10 | url: "sponsor_com.html" 11 | url_en: "en/sponsor_com.html" 12 | - title: T裇 13 | title_en: TEE 14 | url: "tshirt.html" 15 | url_en: "en/tshirt.html" 16 | - title: 私人 17 | title_en: DONATOR 18 | url: "donators.html" 19 | url_en: "en/donators.html" 20 | - title: 日程 21 | title_en: SCHEDULE 22 | children: 23 | - title: 上海 24 | title_en: SHANGHAI 25 | url: "shanghai.html" 26 | url_en: "en/shanghai.html" 27 | - title: 广州 28 | title_en: GUANGZHOU 29 | url: "guangzhou.html" 30 | url_en: "en/guangzhou.html" 31 | - title: 北京 32 | title_en: BEIJING 33 | url: "beijing.html" 34 | url_en: "en/beijing.html" 35 | - title: 杭州 36 | title_en: HANGZHOU 37 | url: "hangzhou.html" 38 | url_en: "en/hangzhou.html" 39 | - title: 志愿 40 | title_en: VOLUNTEERS 41 | url: "volunteers.html" 42 | url_en: "en/volunteers.html" 43 | - title: 往届 44 | title_en: HISTORY 45 | children: 46 | - title: '2011' 47 | url: "http://cn.pycon.org/2011" 48 | url_external: 1 49 | - title: '2012' 50 | url: "http://cn.pycon.org/2012" 51 | url_external: 1 52 | - title: '2013' 53 | url: "http://cn.pycon.org/2013" 54 | url_external: 1 55 | - title: '2014' 56 | url: "http://cn.pycon.org/2014" 57 | url_external: 1 58 | - title: EN 59 | title_en: 中文 60 | url: "en/index.html" 61 | url_en: "index.html" 62 | -------------------------------------------------------------------------------- /src/data/_site.yaml: -------------------------------------------------------------------------------- 1 | name: PyConChina2015 2 | description: Python中国2015大会官方网站 3 | description_en: The official site for PyCon China 2015 4 | author: support@PyChina.org 5 | url: http://cn.pycon.org/2015/ 6 | home_url: "./" 7 | home_url_en: "./en/" 8 | base_url: "." 9 | base_url_en: ".." 10 | -------------------------------------------------------------------------------- /src/data/_volunteers.yaml: -------------------------------------------------------------------------------- 1 | - 2 | name: StingChen(陈世欣) 3 | role: organizer 4 | role_organizer: 1 5 | intro: 永泰红磡养老产业投资集团的信息技术总监;在14年的互联网生涯后,投身到到永泰红磡养老产业投资集团做夕阳事业,跨界发展. 他是TopGeek技术社区的创办人也是上海GDG的负责人,并参与CPyUG社区的管理. 还发起PMCamp产品经理社区,儿童社区乐创园等 6 | avatar: http://dn-pyconcn.qbox.me/images/volunteer/chenshixin_2013.png?imageView2/2/h/80 7 | blog: http://sting.topgeek.org/ 8 | weibo: http://weibo.com/stingchen 9 | - 10 | name: Zoom.Quiet (大妈) 11 | name_en: Zoom.Quiet (大妈) 12 | role: organizer 13 | role_organizer: 1 14 | avatar: http://dn-pyconcn.qbox.me/images/volunteer/zhouqi.png?imageView2/2/h/80 15 | intro: Python 中文社区创始人 / 管理员,热心于python社区的公益事业,大家熟知的社区"大妈";OBP及蟒营工程设计者 /主持人;参与并主持各种线上 / 线下活动,主持编撰了 "可爱的Python";坚持用 Pythonic 感化国人进入 FLOSS世界进行学习 / 分享 / 创造!目前就职于猎豹移动. 16 | intro_en: One of originator for CPyUG(China Python User Group) / administrator; Enthusiastic python community welfare, well-known community "DAMA"; OBP and PythoniCamp project designer / manager; attend and originator all kinds of online / offline tech evnets, presided compiled "lovely Python"; keeping usage Pythonic to reclaim people entering the FLOSS world learning / sharing / innovate! currently work for CMCM. 17 | blog: http://zoomquiet.io/ 18 | weibo: http://weibo.com/zoomquiet 19 | -------------------------------------------------------------------------------- /src/donators.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_sponsors %} 3 | 4 | {% block content %} 5 | 6 |

{{ message.donators }}

7 |
8 | {{ message.donators_orderby }} 9 | {% if donators %} 10 |
11 |
    12 | {% for donator in donators %} 13 |
  1. {{ donator }}
  2. 14 | {% endfor %} 15 |
16 |
17 | {% endif %} 18 |
19 | 20 | 21 | 22 | {% endblock %} 23 | -------------------------------------------------------------------------------- /src/guangzhou.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_guangzhou %} 3 | 4 | {% block content %} 5 | {% if agenda.guangzhou %} 6 | {% set schedule = agenda.guangzhou %} 7 | {% set schedule_title = page_title %} 8 | {% include "base/_schedule.html" %} 9 | {% endif %} 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /src/hangzhou.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_hangzhou %} 3 | 4 | {% block content %} 5 | {% if agenda.hangzhou %} 6 | {% set schedule = agenda.hangzhou %} 7 | {% set schedule_title = page_title %} 8 | {% include "base/_schedule.html" %} 9 | {% endif %} 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /src/proposals.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_proposals %} 3 | 4 | {% block content %} 5 | 6 | 7 | 8 | {% endblock %} -------------------------------------------------------------------------------- /src/shanghai.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_shanghai %} 3 | 4 | {% block content %} 5 | {% if agenda.shanghai %} 6 | {% set schedule = agenda.shanghai %} 7 | {% set schedule_title = page_title %} 8 | {% include "base/_schedule.html" %} 9 |
10 |

{{ message.video_and_slides }}

11 |
12 |
13 |
14 | {% endif %} 15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /src/speechmaker.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_speechmaker %} 3 | 4 | {% block content %} 5 | 6 | 7 | {% if speakers %} 8 | {# render logic #} 9 | {% set global_proposals = selectspeakers(speakers, 'global') %} 10 | {% set beijing_proposals = selectspeakers(speakers, 'beijing') %} 11 | {% set shanghai_proposals = selectspeakers(speakers, 'shanghai') %} 12 | {% set guangzhou_proposals = selectspeakers(speakers, 'guangzhou') %} 13 | {% macro proposal_list(some_proposals, city_name) -%} 14 |
15 |

{{ city_name }}

16 |
17 | {% for proposal in some_proposals %} 18 |
19 | 20 | {{ proposal.name }} 22 | 23 |
24 |

{{ proposal.name }}

25 |

{{ proposal.intro }}

26 |
27 |
28 | {% endfor %} 29 |
30 |
31 | {%- endmacro %} 32 | {# presentation #} 33 |
34 |

{{ message.speechmaker }}

35 | 36 | {{ proposal_list(global_proposals, message.global) }} 37 | {{ proposal_list(shanghai_proposals, message.shanghai) }} 38 | {{ proposal_list(guangzhou_proposals, message.guangzhou) }} 39 | {{ proposal_list(beijing_proposals, message.beijing) }} 40 |
41 | {% endif %} 42 | 43 | {% endblock %} 44 | -------------------------------------------------------------------------------- /src/sponsor_com.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_sponsors %} 3 | 4 | {% block content %} 5 | 6 |

{{ message.sponsors }}

7 |

{{ message.sponsors_hint }}

8 | 9 | {% if sponsors %} 10 | {# render logic #} 11 | {% set customization_sponsors = sponsors | selectattr('level_customization') %} 12 | 13 | {% set diamond_sponsors = sponsors | selectattr('level_diamond') %} 14 | {% set platinum_sponsors = sponsors | selectattr('level_platinum') %} 15 | {% set gold_sponsors = sponsors | selectattr('level_gold') %} 16 | {% set silver_sponsors = sponsors | selectattr('level_silver') %} 17 | {% set bronze_sponsors = sponsors | selectattr('level_bronze') %} 18 | {% set partner_sponsors = sponsors | selectattr('level_partner') %} 19 | {% macro sponsors_list(some_sponsors, sponsors_level, sponsors_level_id) %} 20 |
21 |

{{ sponsors_level }}

22 |
23 | {% for sponsor in some_sponsors %} 24 | 30 | {% endfor %} 31 |
32 | {% endmacro %} 33 | {{ sponsors_list(customization_sponsors, message.sponsors_customization, 'customization') }} 34 | 35 | {{ sponsors_list(diamond_sponsors, message.sponsors_diamond, 'diamond') }} 36 | {{ sponsors_list(platinum_sponsors, message.sponsors_platinum, 'platinum') }} 37 | {{ sponsors_list(gold_sponsors, message.sponsors_gold, 'gold') }} 38 | {{ sponsors_list(silver_sponsors, message.sponsors_silver, 'silver') }} 39 | {{ sponsors_list(bronze_sponsors, message.sponsors_bronze, 'bronze') }} 40 | {{ sponsors_list(partner_sponsors, message.sponsors_partner, 'partner') }} 41 | {% endif %} 42 | 43 | {% endblock %} 44 | -------------------------------------------------------------------------------- /src/sponsors.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_sponsors %} 3 | 4 | {% block content %} 5 | 6 |

{{ message.sponsors }}

7 |

{{ message.sponsors_hint }}

8 | 9 | {% if sponsors %} 10 | {# render logic #} 11 | {% set diamond_sponsors = sponsors | selectattr('level_diamond') %} 12 | {% set platinum_sponsors = sponsors | selectattr('level_platinum') %} 13 | {% set gold_sponsors = sponsors | selectattr('level_gold') %} 14 | {% set silver_sponsors = sponsors | selectattr('level_silver') %} 15 | {% set bronze_sponsors = sponsors | selectattr('level_bronze') %} 16 | {% set partner_sponsors = sponsors | selectattr('level_partner') %} 17 | {% macro sponsors_list(some_sponsors, sponsors_level, sponsors_level_id) %} 18 |
19 |

{{ sponsors_level }}

20 |
21 | {% for sponsor in some_sponsors %} 22 | 28 | {% endfor %} 29 |
30 | {% endmacro %} 31 | {{ sponsors_list(diamond_sponsors, message.sponsors_diamond, 'diamond') }} 32 | {{ sponsors_list(platinum_sponsors, message.sponsors_platinum, 'platinum') }} 33 | {{ sponsors_list(gold_sponsors, message.sponsors_gold, 'gold') }} 34 | {{ sponsors_list(silver_sponsors, message.sponsors_silver, 'silver') }} 35 | {{ sponsors_list(bronze_sponsors, message.sponsors_bronze, 'bronze') }} 36 | {{ sponsors_list(partner_sponsors, message.sponsors_partner, 'partner') }} 37 | {% endif %} 38 | 39 | {% endblock %} 40 | -------------------------------------------------------------------------------- /src/suzhou.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_suzhou %} 3 | 4 | {% block content %} 5 | {% if agenda.suzhou %} 6 | {% set schedule = agenda.suzhou %} 7 | {% set schedule_title = page_title %} 8 | {% include "base/_schedule.html" %} 9 | {% endif %} 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /src/tshirt.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_tshirt %} 3 | 4 | {% block content %} 5 | 6 | 7 | 8 | {% endblock %} -------------------------------------------------------------------------------- /src/volunteers.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_volunteers %} 3 | 4 | {% block content %} 5 | 6 | {% if volunteers %} 7 | {# render logic #} 8 | {% set organizer_volunteers = volunteers | selectattr("role_organizer") %} 9 | {% set technician_volunteers = volunteers | selectattr("role_technician") %} 10 | {% set conference_volunteers = volunteers | selectattr("role_conference") %} 11 | {% macro volunteer_link(name, link) %} 12 | {% if link %} 13 | {{ link }} 14 | {% endif %} 15 | {% endmacro %} 16 | {% macro volunteer_list(some_volunteers) %} 17 |
18 | {% for volunteer in some_volunteers %} 19 |
20 | 21 | {{ volunteer.name }} 23 | 24 |
25 |

{{ volunteer.name }}

26 |

27 | {{ volunteer.intro }} 28 | {{ volunteer_link("github", volunteer.github) }} 29 | {{ volunteer_link("weibo", volunteer.weibo) }} 30 | {{ volunteer_link("blog", volunteer.blog) }} 31 |

32 |
33 |
34 | {% endfor %} 35 |
36 | {% endmacro %} 37 | {# presentation #} 38 |

{{ message.volunteers }}

39 |
40 |

{{ message.pythoneer }}

41 |
42 |
43 |

{{ message.organizers }}

44 | {{ volunteer_list(organizer_volunteers) }} 45 |
46 |
47 |

{{ message.technicians }}

48 | {{ volunteer_list(technician_volunteers) }} 49 |
50 |
51 |

{{ message.conference }}

52 | {{ volunteer_list(conference_volunteers) }} 53 |
54 | {% endif %} 55 | 56 | {% endblock %} 57 | -------------------------------------------------------------------------------- /src/zhuhai.html: -------------------------------------------------------------------------------- 1 | {% extends "base/_base.html" %} 2 | {% set page_title = message.page_title_zhuhai %} 3 | 4 | {% block content %} 5 | {% if agenda.zhuhai %} 6 | {% set schedule = agenda.zhuhai %} 7 | {% set schedule_title = page_title %} 8 | {% include "base/_schedule.html" %} 9 | {% endif %} 10 | {% endblock %} 11 | --------------------------------------------------------------------------------