Compare commits
38 Commits
Author | SHA1 | Date |
---|---|---|
Holger Frey | f8d6d475d1 | 7 years ago |
Holger Frey | 5cfd68e85e | 7 years ago |
Holger Frey | 0a2f7a5832 | 7 years ago |
Holger Frey | 5d79bd34d6 | 7 years ago |
Holger Frey | 8dbf43ea99 | 7 years ago |
Holger Frey | 7668ecfc88 | 7 years ago |
Holger Frey | 8503f27c66 | 7 years ago |
Holger Frey | 1c96f9b970 | 7 years ago |
Holger Frey | b19368bc2f | 7 years ago |
Holger Frey | de2dbd352a | 7 years ago |
Holger Frey | 494957aeba | 7 years ago |
Holger Frey | 329c268e37 | 7 years ago |
Holger Frey | f63e337dde | 7 years ago |
Holger Frey | bbf89ad3a5 | 7 years ago |
Holger Frey | 20032eede1 | 7 years ago |
Holger Frey | c8c0c4678a | 7 years ago |
Holger Frey | 551cc260e2 | 7 years ago |
Holger Frey | 65ad7738ff | 7 years ago |
Holger Frey | 53f36e8566 | 7 years ago |
Holger Frey | 0d83eac6c1 | 7 years ago |
Holger Frey | a21612cf0e | 7 years ago |
Holger Frey | 8f80a7ce37 | 7 years ago |
Holger Frey | 5f7f26b3b6 | 7 years ago |
Holger Frey | 2be8692625 | 7 years ago |
Holger Frey | a0b50a81d6 | 7 years ago |
Holger Frey | 8b2c6a1e24 | 7 years ago |
Holger Frey | 3b9246633a | 7 years ago |
Holger Frey | 9cc02f5e4e | 7 years ago |
Holger Frey | 04fea4e7cd | 7 years ago |
Holger Frey | 93dc403dd6 | 7 years ago |
Holger Frey | bd8e3557aa | 7 years ago |
Holger Frey | d154d74c4a | 7 years ago |
Holger Frey | 039e1d111d | 7 years ago |
Holger Frey | 8b1441dd34 | 7 years ago |
Holger Frey | 5e7702cf04 | 7 years ago |
Holger Frey | fb0dab46a4 | 7 years ago |
Holger Frey | a93b5239e5 | 7 years ago |
Holger Frey | fd712e4e5a | 7 years ago |
605 changed files with 4163 additions and 19101 deletions
@ -1,21 +0,0 @@ |
|||||||
# http://editorconfig.org |
|
||||||
|
|
||||||
root = true |
|
||||||
|
|
||||||
[*] |
|
||||||
indent_style = space |
|
||||||
indent_size = 4 |
|
||||||
trim_trailing_whitespace = true |
|
||||||
insert_final_newline = true |
|
||||||
charset = utf-8 |
|
||||||
end_of_line = lf |
|
||||||
|
|
||||||
[*.bat] |
|
||||||
indent_style = tab |
|
||||||
end_of_line = crlf |
|
||||||
|
|
||||||
[LICENSE] |
|
||||||
insert_final_newline = false |
|
||||||
|
|
||||||
[Makefile] |
|
||||||
indent_style = tab |
|
@ -1,15 +0,0 @@ |
|||||||
* Ordr2 version: |
|
||||||
* Python version: |
|
||||||
* Operating System: |
|
||||||
|
|
||||||
### Description |
|
||||||
|
|
||||||
Describe what you were trying to get done. |
|
||||||
Tell us what happened, what went wrong, and what you expected to happen. |
|
||||||
|
|
||||||
### What I Did |
|
||||||
|
|
||||||
``` |
|
||||||
Paste the command(s) you ran and the output. |
|
||||||
If there was a crash, please include the traceback here. |
|
||||||
``` |
|
@ -1,13 +0,0 @@ |
|||||||
======= |
|
||||||
Credits |
|
||||||
======= |
|
||||||
|
|
||||||
Development Lead |
|
||||||
---------------- |
|
||||||
|
|
||||||
* Holger Frey <frey@imtek.de> |
|
||||||
|
|
||||||
Contributors |
|
||||||
------------ |
|
||||||
|
|
||||||
None yet. Why not be the first? |
|
@ -1,119 +0,0 @@ |
|||||||
.. highlight:: shell |
|
||||||
|
|
||||||
============ |
|
||||||
Contributing |
|
||||||
============ |
|
||||||
|
|
||||||
Contributions are welcome, and they are greatly appreciated! Every |
|
||||||
little bit helps, and credit will always be given. |
|
||||||
|
|
||||||
You can contribute in many ways: |
|
||||||
|
|
||||||
|
|
||||||
Types of Contributions |
|
||||||
---------------------- |
|
||||||
|
|
||||||
Report Bugs |
|
||||||
~~~~~~~~~~~ |
|
||||||
|
|
||||||
Report bugs at https://git.cpi.imtek.uni-freiburg.de/holgi/ordr2/issues. |
|
||||||
|
|
||||||
If you are reporting a bug, please include: |
|
||||||
|
|
||||||
* Your operating system name and version. |
|
||||||
* Any details about your local setup that might be helpful in troubleshooting. |
|
||||||
* Detailed steps to reproduce the bug. |
|
||||||
|
|
||||||
|
|
||||||
Fix Bugs |
|
||||||
~~~~~~~~ |
|
||||||
|
|
||||||
Look through the GitHub issues for bugs. Anything tagged with "bug" |
|
||||||
and "help wanted" is open to whoever wants to implement it. |
|
||||||
|
|
||||||
|
|
||||||
Implement Features |
|
||||||
~~~~~~~~~~~~~~~~~~ |
|
||||||
|
|
||||||
Look through the GitHub issues for features. Anything tagged with "enhancement" |
|
||||||
and "help wanted" is open to whoever wants to implement it. |
|
||||||
|
|
||||||
|
|
||||||
Write Documentation |
|
||||||
~~~~~~~~~~~~~~~~~~~ |
|
||||||
|
|
||||||
Ordr2 could always use more documentation, whether as part of the |
|
||||||
official Ordr2 docs, in docstrings, or even on the web in blog posts, |
|
||||||
articles, and such. |
|
||||||
|
|
||||||
|
|
||||||
Submit Feedback |
|
||||||
~~~~~~~~~~~~~~~ |
|
||||||
|
|
||||||
The best way to send feedback is to file an issue at https://git.cpi.imtek.uni-freiburg.de/holgi/ordr2/issues. |
|
||||||
|
|
||||||
If you are proposing a feature: |
|
||||||
|
|
||||||
* Explain in detail how it would work. |
|
||||||
* Keep the scope as narrow as possible, to make it easier to implement. |
|
||||||
* Remember that this is a volunteer-driven project, and that contributions |
|
||||||
are welcome :) |
|
||||||
|
|
||||||
|
|
||||||
Get Started! |
|
||||||
------------ |
|
||||||
|
|
||||||
Ready to contribute? Here's how to set up `ordr2` for local development. |
|
||||||
|
|
||||||
1. Fork the `ordr2` repo on GitHub. |
|
||||||
2. Clone your fork locally:: |
|
||||||
|
|
||||||
$ git clone https://git.cpi.imtek.uni-freiburg.de/your_name_here/ordr2/ |
|
||||||
|
|
||||||
3. Install your local copy into a virtualenv. Assuming you have virtualenvwrapper installed, this is how you set up your fork for local development:: |
|
||||||
|
|
||||||
$ mkvirtualenv ordr2 |
|
||||||
$ cd ordr2/ |
|
||||||
$ python setup.py develop |
|
||||||
|
|
||||||
4. Create a branch for local development:: |
|
||||||
|
|
||||||
$ git checkout -b name-of-your-bugfix-or-feature |
|
||||||
|
|
||||||
Now you can make your changes locally. |
|
||||||
|
|
||||||
5. When you're done making changes, check that your changes pass flake8 and the tests, including testing other Python versions with tox:: |
|
||||||
|
|
||||||
$ flake8 ordr2 tests |
|
||||||
$ python setup.py test or py.test |
|
||||||
$ tox |
|
||||||
|
|
||||||
To get flake8 and tox, just pip install them into your virtualenv. |
|
||||||
|
|
||||||
6. Commit your changes and push your branch to GitHub:: |
|
||||||
|
|
||||||
$ git add . |
|
||||||
$ git commit -m "Your detailed description of your changes." |
|
||||||
$ git push origin name-of-your-bugfix-or-feature |
|
||||||
|
|
||||||
7. Submit a pull request through the GitHub website. |
|
||||||
|
|
||||||
|
|
||||||
Pull Request Guidelines |
|
||||||
----------------------- |
|
||||||
|
|
||||||
Before you submit a pull request, check that it meets these guidelines: |
|
||||||
|
|
||||||
1. The pull request should include tests. |
|
||||||
2. If the pull request adds functionality, the docs should be updated. Put |
|
||||||
your new functionality into a function with a docstring, and add the |
|
||||||
feature to the list in README.rst. |
|
||||||
|
|
||||||
|
|
||||||
Tips |
|
||||||
---- |
|
||||||
|
|
||||||
To run a subset of tests:: |
|
||||||
|
|
||||||
$ py.test tests.test_ordr2 |
|
||||||
|
|
@ -1,35 +0,0 @@ |
|||||||
======= |
|
||||||
History |
|
||||||
======= |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
0.1.4 (2017-10-10, php2python branch) |
|
||||||
------------------------------------- |
|
||||||
|
|
||||||
* date of order status change have a nicer format |
|
||||||
* fixed a bug in recording a status change |
|
||||||
* owner of order only notified for status change if (s)he didn't issue the change |
|
||||||
|
|
||||||
|
|
||||||
0.1.3 (2017-10-10, php2python branch) |
|
||||||
------------------------------------- |
|
||||||
|
|
||||||
* custom error page for exception handling |
|
||||||
* uncaught exceptions mailed to administrator |
|
||||||
* fixed type ahead function for selecting consumables when creating a new order |
|
||||||
* loading of google fonts now via https |
|
||||||
* multiple selections of order not available for normal users since these |
|
||||||
have not edit or delete rights for all orders |
|
||||||
|
|
||||||
|
|
||||||
0.1.1 (2017-10-05, php2python branch) |
|
||||||
------------------------------------- |
|
||||||
|
|
||||||
* First production release |
|
||||||
|
|
||||||
|
|
||||||
0.0.1 (2017-09-26, php2python branch) |
|
||||||
------------------------------------- |
|
||||||
|
|
||||||
* Start of the project |
|
@ -1,31 +0,0 @@ |
|||||||
|
|
||||||
BSD License |
|
||||||
|
|
||||||
Copyright (c) 2017, Holger Frey |
|
||||||
All rights reserved. |
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification, |
|
||||||
are permitted provided that the following conditions are met: |
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this |
|
||||||
list of conditions and the following disclaimer. |
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice, this |
|
||||||
list of conditions and the following disclaimer in the documentation and/or |
|
||||||
other materials provided with the distribution. |
|
||||||
|
|
||||||
* Neither the name of the copyright holder nor the names of its |
|
||||||
contributors may be used to endorse or promote products derived from this |
|
||||||
software without specific prior written permission. |
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
|
||||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
|
||||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
|
||||||
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
|
||||||
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
|
||||||
OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
|
|
@ -1,13 +1,2 @@ |
|||||||
include AUTHORS.rst |
include *.txt *.ini *.cfg *.rst |
||||||
include CONTRIBUTING.rst |
recursive-include ordr *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2 |
||||||
include HISTORY.rst |
|
||||||
include LICENSE |
|
||||||
include README.rst |
|
||||||
include *.ini *.cfg |
|
||||||
|
|
||||||
recursive-include tests * |
|
||||||
recursive-exclude * __pycache__ |
|
||||||
recursive-exclude * *.py[co] |
|
||||||
|
|
||||||
recursive-include docs *.rst conf.py Makefile make.bat |
|
||||||
recursive-include ordr2 *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2 |
|
||||||
|
@ -0,0 +1,13 @@ |
|||||||
|
[[source]] |
||||||
|
|
||||||
|
url = "https://pypi.python.org/simple" |
||||||
|
verify_ssl = true |
||||||
|
name = "pypi" |
||||||
|
|
||||||
|
|
||||||
|
[packages] |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[dev-packages] |
||||||
|
|
@ -1,68 +0,0 @@ |
|||||||
OLD: Ordr2 - CPI Ordering System |
|
||||||
================================ |
|
||||||
|
|
||||||
CAUTION: |
|
||||||
THIS REPO EXISTS FOR HISTORIC REASONS |
|
||||||
THE PROJECT WAS REPLACED BY Ordr3 |
|
||||||
|
|
||||||
|
|
||||||
In our chair at the University of Freiburg there are about forty people working |
|
||||||
in the lab but only four of them are accredited for the SAP ordering system |
|
||||||
used by the university - the rest has to order through them. This leads to |
|
||||||
a quite large amount of mails, post-its and calls per purchaser. To give this |
|
||||||
some better structure, our small ordering system was developed. It is actually |
|
||||||
a 'would-you-please-order-for-me-system' and disconnected from the upstream |
|
||||||
system. |
|
||||||
|
|
||||||
This is a complete rewrite of the CPI `ordering system`_ originally written in |
|
||||||
PHP. |
|
||||||
|
|
||||||
|
|
||||||
Goals |
|
||||||
----- |
|
||||||
* more information on orders: |
|
||||||
* record the status change in order in a log |
|
||||||
* add a new status "hold" if there are questions |
|
||||||
* simpler reordering of already placed orders |
|
||||||
* better tools for consumables (templates for new orders): |
|
||||||
* propose consumables on placed orders |
|
||||||
* check unused or outdated consumables |
|
||||||
* make categories editable |
|
||||||
* revamped user management: |
|
||||||
* validate email address on registration |
|
||||||
* forgot password system |
|
||||||
* make password hashing future proof |
|
||||||
* move away from PHP as a programming language (done, branch php2pyhton) |
|
||||||
* update the front end tools to current versions |
|
||||||
|
|
||||||
|
|
||||||
Notes on technologies used |
|
||||||
--------------------------- |
|
||||||
|
|
||||||
The project uses `Pyramid`_ as a web framework, especially the `traversal`_ |
|
||||||
style routing instead of the more widely spread url dispatch method. This |
|
||||||
decision was made because: |
|
||||||
|
|
||||||
* the starter of this project likes this kind of routing |
|
||||||
* it eliminates the need of defining routes separately |
|
||||||
* `row level security`_ is easy to implement since traversal works with |
|
||||||
resources from the start. |
|
||||||
|
|
||||||
The new system should have automated unit- and integration tests for all |
|
||||||
self written code, aming at 100% coverage although this might never be |
|
||||||
reached. |
|
||||||
|
|
||||||
To run a test use the ``make coverage`` command or if you'd like to test |
|
||||||
without a coverage report use ``make test`` |
|
||||||
|
|
||||||
Also the code should be documented well enough to support the current and |
|
||||||
new developers. Good Documentation is hard, so please be forgiving in this |
|
||||||
regard. A set of documents can be compiled and viewed with the ``make docs`` |
|
||||||
command. |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. _ordering system: https://ordr.cpi.imtek.uni-freiburg.de |
|
||||||
.. _Pyramid: https://trypyramid.com |
|
||||||
.. _traversal: https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/muchadoabouttraversal.html |
|
||||||
.. _row level security: https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/security.html |
|
@ -0,0 +1,36 @@ |
|||||||
|
Ordr |
||||||
|
==== |
||||||
|
|
||||||
|
This is a complete redo of the Ordr project. |
||||||
|
|
||||||
|
|
||||||
|
Getting Started |
||||||
|
--------------- |
||||||
|
|
||||||
|
- Change directory into your newly created project. |
||||||
|
|
||||||
|
cd ordr |
||||||
|
|
||||||
|
- Create a Python virtual environment. |
||||||
|
|
||||||
|
python3 -m venv env |
||||||
|
|
||||||
|
- Upgrade packaging tools. |
||||||
|
|
||||||
|
env/bin/pip install --upgrade pip setuptools |
||||||
|
|
||||||
|
- Install the project in editable mode with its testing requirements. |
||||||
|
|
||||||
|
env/bin/pip install -e ".[testing]" |
||||||
|
|
||||||
|
- Configure the database. |
||||||
|
|
||||||
|
env/bin/initialize_ordr_db development.ini |
||||||
|
|
||||||
|
- Run your project's tests. |
||||||
|
|
||||||
|
env/bin/pytest |
||||||
|
|
||||||
|
- Run your project. |
||||||
|
|
||||||
|
env/bin/pserve development.ini |
@ -1,177 +0,0 @@ |
|||||||
# Makefile for Sphinx documentation
|
|
||||||
#
|
|
||||||
|
|
||||||
# You can set these variables from the command line.
|
|
||||||
SPHINXOPTS = |
|
||||||
SPHINXBUILD = sphinx-build |
|
||||||
PAPER = |
|
||||||
BUILDDIR = _build |
|
||||||
|
|
||||||
# User-friendly check for sphinx-build
|
|
||||||
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) |
|
||||||
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) |
|
||||||
endif |
|
||||||
|
|
||||||
# Internal variables.
|
|
||||||
PAPEROPT_a4 = -D latex_paper_size=a4 |
|
||||||
PAPEROPT_letter = -D latex_paper_size=letter |
|
||||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . |
|
||||||
# the i18n builder cannot share the environment and doctrees with the others
|
|
||||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . |
|
||||||
|
|
||||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext |
|
||||||
|
|
||||||
help: |
|
||||||
@echo "Please use \`make <target>' where <target> is one of" |
|
||||||
@echo " html to make standalone HTML files" |
|
||||||
@echo " dirhtml to make HTML files named index.html in directories" |
|
||||||
@echo " singlehtml to make a single large HTML file" |
|
||||||
@echo " pickle to make pickle files" |
|
||||||
@echo " json to make JSON files" |
|
||||||
@echo " htmlhelp to make HTML files and a HTML help project" |
|
||||||
@echo " qthelp to make HTML files and a qthelp project" |
|
||||||
@echo " devhelp to make HTML files and a Devhelp project" |
|
||||||
@echo " epub to make an epub" |
|
||||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" |
|
||||||
@echo " latexpdf to make LaTeX files and run them through pdflatex" |
|
||||||
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" |
|
||||||
@echo " text to make text files" |
|
||||||
@echo " man to make manual pages" |
|
||||||
@echo " texinfo to make Texinfo files" |
|
||||||
@echo " info to make Texinfo files and run them through makeinfo" |
|
||||||
@echo " gettext to make PO message catalogs" |
|
||||||
@echo " changes to make an overview of all changed/added/deprecated items" |
|
||||||
@echo " xml to make Docutils-native XML files" |
|
||||||
@echo " pseudoxml to make pseudoxml-XML files for display purposes" |
|
||||||
@echo " linkcheck to check all external links for integrity" |
|
||||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)" |
|
||||||
|
|
||||||
clean: |
|
||||||
rm -rf $(BUILDDIR)/* |
|
||||||
|
|
||||||
html: |
|
||||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html |
|
||||||
@echo |
|
||||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html." |
|
||||||
|
|
||||||
dirhtml: |
|
||||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml |
|
||||||
@echo |
|
||||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." |
|
||||||
|
|
||||||
singlehtml: |
|
||||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml |
|
||||||
@echo |
|
||||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." |
|
||||||
|
|
||||||
pickle: |
|
||||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle |
|
||||||
@echo |
|
||||||
@echo "Build finished; now you can process the pickle files." |
|
||||||
|
|
||||||
json: |
|
||||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json |
|
||||||
@echo |
|
||||||
@echo "Build finished; now you can process the JSON files." |
|
||||||
|
|
||||||
htmlhelp: |
|
||||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp |
|
||||||
@echo |
|
||||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
|
||||||
".hhp project file in $(BUILDDIR)/htmlhelp." |
|
||||||
|
|
||||||
qthelp: |
|
||||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp |
|
||||||
@echo |
|
||||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
|
||||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:" |
|
||||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ordr2.qhcp" |
|
||||||
@echo "To view the help file:" |
|
||||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ordr2.qhc" |
|
||||||
|
|
||||||
devhelp: |
|
||||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp |
|
||||||
@echo |
|
||||||
@echo "Build finished." |
|
||||||
@echo "To view the help file:" |
|
||||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/ordr2" |
|
||||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ordr2" |
|
||||||
@echo "# devhelp" |
|
||||||
|
|
||||||
epub: |
|
||||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub |
|
||||||
@echo |
|
||||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub." |
|
||||||
|
|
||||||
latex: |
|
||||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex |
|
||||||
@echo |
|
||||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." |
|
||||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
|
||||||
"(use \`make latexpdf' here to do that automatically)." |
|
||||||
|
|
||||||
latexpdf: |
|
||||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex |
|
||||||
@echo "Running LaTeX files through pdflatex..." |
|
||||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf |
|
||||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." |
|
||||||
|
|
||||||
latexpdfja: |
|
||||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex |
|
||||||
@echo "Running LaTeX files through platex and dvipdfmx..." |
|
||||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja |
|
||||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." |
|
||||||
|
|
||||||
text: |
|
||||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text |
|
||||||
@echo |
|
||||||
@echo "Build finished. The text files are in $(BUILDDIR)/text." |
|
||||||
|
|
||||||
man: |
|
||||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man |
|
||||||
@echo |
|
||||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man." |
|
||||||
|
|
||||||
texinfo: |
|
||||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo |
|
||||||
@echo |
|
||||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." |
|
||||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
|
||||||
"(use \`make info' here to do that automatically)." |
|
||||||
|
|
||||||
info: |
|
||||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo |
|
||||||
@echo "Running Texinfo files through makeinfo..." |
|
||||||
make -C $(BUILDDIR)/texinfo info |
|
||||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." |
|
||||||
|
|
||||||
gettext: |
|
||||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale |
|
||||||
@echo |
|
||||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." |
|
||||||
|
|
||||||
changes: |
|
||||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes |
|
||||||
@echo |
|
||||||
@echo "The overview file is in $(BUILDDIR)/changes." |
|
||||||
|
|
||||||
linkcheck: |
|
||||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck |
|
||||||
@echo |
|
||||||
@echo "Link check complete; look for any errors in the above output " \
|
|
||||||
"or in $(BUILDDIR)/linkcheck/output.txt." |
|
||||||
|
|
||||||
doctest: |
|
||||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest |
|
||||||
@echo "Testing of doctests in the sources finished, look at the " \
|
|
||||||
"results in $(BUILDDIR)/doctest/output.txt." |
|
||||||
|
|
||||||
xml: |
|
||||||
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml |
|
||||||
@echo |
|
||||||
@echo "Build finished. The XML files are in $(BUILDDIR)/xml." |
|
||||||
|
|
||||||
pseudoxml: |
|
||||||
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml |
|
||||||
@echo |
|
||||||
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." |
|
@ -1,275 +0,0 @@ |
|||||||
#!/usr/bin/env python |
|
||||||
# -*- coding: utf-8 -*- |
|
||||||
# |
|
||||||
# ordr2 documentation build configuration file, created by |
|
||||||
# sphinx-quickstart on Tue Jul 9 22:26:36 2013. |
|
||||||
# |
|
||||||
# This file is execfile()d with the current directory set to its |
|
||||||
# containing dir. |
|
||||||
# |
|
||||||
# Note that not all possible configuration values are present in this |
|
||||||
# autogenerated file. |
|
||||||
# |
|
||||||
# All configuration values have a default; values that are commented out |
|
||||||
# serve to show the default. |
|
||||||
|
|
||||||
import sys |
|
||||||
import os |
|
||||||
|
|
||||||
# If extensions (or modules to document with autodoc) are in another |
|
||||||
# directory, add these directories to sys.path here. If the directory is |
|
||||||
# relative to the documentation root, use os.path.abspath to make it |
|
||||||
# absolute, like shown here. |
|
||||||
#sys.path.insert(0, os.path.abspath('.')) |
|
||||||
|
|
||||||
# Get the project root dir, which is the parent dir of this |
|
||||||
cwd = os.getcwd() |
|
||||||
project_root = os.path.dirname(cwd) |
|
||||||
|
|
||||||
# Insert the project root dir as the first element in the PYTHONPATH. |
|
||||||
# This lets us ensure that the source package is imported, and that its |
|
||||||
# version is used. |
|
||||||
sys.path.insert(0, project_root) |
|
||||||
|
|
||||||
import ordr2 |
|
||||||
|
|
||||||
# -- General configuration --------------------------------------------- |
|
||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here. |
|
||||||
#needs_sphinx = '1.0' |
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be |
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. |
|
||||||
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode'] |
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory. |
|
||||||
templates_path = ['_templates'] |
|
||||||
|
|
||||||
# The suffix of source filenames. |
|
||||||
source_suffix = '.rst' |
|
||||||
|
|
||||||
# The encoding of source files. |
|
||||||
#source_encoding = 'utf-8-sig' |
|
||||||
|
|
||||||
# The master toctree document. |
|
||||||
master_doc = 'index' |
|
||||||
|
|
||||||
# General information about the project. |
|
||||||
project = u'Ordr2' |
|
||||||
copyright = u"2017, Holger Frey" |
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement |
|
||||||
# for |version| and |release|, also used in various other places throughout |
|
||||||
# the built documents. |
|
||||||
# |
|
||||||
# The short X.Y version. |
|
||||||
version = ordr2.__version__ |
|
||||||
# The full version, including alpha/beta/rc tags. |
|
||||||
release = ordr2.__version__ |
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation |
|
||||||
# for a list of supported languages. |
|
||||||
#language = None |
|
||||||
|
|
||||||
# There are two options for replacing |today|: either, you set today to |
|
||||||
# some non-false value, then it is used: |
|
||||||
#today = '' |
|
||||||
# Else, today_fmt is used as the format for a strftime call. |
|
||||||
#today_fmt = '%B %d, %Y' |
|
||||||
|
|
||||||
# List of patterns, relative to source directory, that match files and |
|
||||||
# directories to ignore when looking for source files. |
|
||||||
exclude_patterns = ['_build'] |
|
||||||
|
|
||||||
# The reST default role (used for this markup: `text`) to use for all |
|
||||||
# documents. |
|
||||||
#default_role = None |
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text. |
|
||||||
#add_function_parentheses = True |
|
||||||
|
|
||||||
# If true, the current module name will be prepended to all description |
|
||||||
# unit titles (such as .. function::). |
|
||||||
#add_module_names = True |
|
||||||
|
|
||||||
# If true, sectionauthor and moduleauthor directives will be shown in the |
|
||||||
# output. They are ignored by default. |
|
||||||
#show_authors = False |
|
||||||
|
|
||||||
# The name of the Pygments (syntax highlighting) style to use. |
|
||||||
pygments_style = 'sphinx' |
|
||||||
|
|
||||||
# A list of ignored prefixes for module index sorting. |
|
||||||
#modindex_common_prefix = [] |
|
||||||
|
|
||||||
# If true, keep warnings as "system message" paragraphs in the built |
|
||||||
# documents. |
|
||||||
#keep_warnings = False |
|
||||||
|
|
||||||
|
|
||||||
# -- Options for HTML output ------------------------------------------- |
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. See the documentation for |
|
||||||
# a list of builtin themes. |
|
||||||
html_theme = 'default' |
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a |
|
||||||
# theme further. For a list of options available for each theme, see the |
|
||||||
# documentation. |
|
||||||
#html_theme_options = {} |
|
||||||
|
|
||||||
# Add any paths that contain custom themes here, relative to this directory. |
|
||||||
#html_theme_path = [] |
|
||||||
|
|
||||||
# The name for this set of Sphinx documents. If None, it defaults to |
|
||||||
# "<project> v<release> documentation". |
|
||||||
#html_title = None |
|
||||||
|
|
||||||
# A shorter title for the navigation bar. Default is the same as |
|
||||||
# html_title. |
|
||||||
#html_short_title = None |
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the |
|
||||||
# top of the sidebar. |
|
||||||
#html_logo = None |
|
||||||
|
|
||||||
# The name of an image file (within the static path) to use as favicon |
|
||||||
# of the docs. This file should be a Windows icon file (.ico) being |
|
||||||
# 16x16 or 32x32 pixels large. |
|
||||||
#html_favicon = None |
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) |
|
||||||
# here, relative to this directory. They are copied after the builtin |
|
||||||
# static files, so a file named "default.css" will overwrite the builtin |
|
||||||
# "default.css". |
|
||||||
html_static_path = ['_static'] |
|
||||||
|
|
||||||
# If not '', a 'Last updated on:' timestamp is inserted at every page |
|
||||||
# bottom, using the given strftime format. |
|
||||||
#html_last_updated_fmt = '%b %d, %Y' |
|
||||||
|
|
||||||
# If true, SmartyPants will be used to convert quotes and dashes to |
|
||||||
# typographically correct entities. |
|
||||||
#html_use_smartypants = True |
|
||||||
|
|
||||||
# Custom sidebar templates, maps document names to template names. |
|
||||||
#html_sidebars = {} |
|
||||||
|
|
||||||
# Additional templates that should be rendered to pages, maps page names |
|
||||||
# to template names. |
|
||||||
#html_additional_pages = {} |
|
||||||
|
|
||||||
# If false, no module index is generated. |
|
||||||
#html_domain_indices = True |
|
||||||
|
|
||||||
# If false, no index is generated. |
|
||||||
#html_use_index = True |
|
||||||
|
|
||||||
# If true, the index is split into individual pages for each letter. |
|
||||||
#html_split_index = False |
|
||||||
|
|
||||||
# If true, links to the reST sources are added to the pages. |
|
||||||
#html_show_sourcelink = True |
|
||||||
|
|
||||||
# If true, "Created using Sphinx" is shown in the HTML footer. |
|
||||||
# Default is True. |
|
||||||
#html_show_sphinx = True |
|
||||||
|
|
||||||
# If true, "(C) Copyright ..." is shown in the HTML footer. |
|
||||||
# Default is True. |
|
||||||
#html_show_copyright = True |
|
||||||
|
|
||||||
# If true, an OpenSearch description file will be output, and all pages |
|
||||||
# will contain a <link> tag referring to it. The value of this option |
|
||||||
# must be the base URL from which the finished HTML is served. |
|
||||||
#html_use_opensearch = '' |
|
||||||
|
|
||||||
# This is the file name suffix for HTML files (e.g. ".xhtml"). |
|
||||||
#html_file_suffix = None |
|
||||||
|
|
||||||
# Output file base name for HTML help builder. |
|
||||||
htmlhelp_basename = 'ordr2doc' |
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output ------------------------------------------ |
|
||||||
|
|
||||||
latex_elements = { |
|
||||||
# The paper size ('letterpaper' or 'a4paper'). |
|
||||||
#'papersize': 'letterpaper', |
|
||||||
|
|
||||||
# The font size ('10pt', '11pt' or '12pt'). |
|
||||||
#'pointsize': '10pt', |
|
||||||
|
|
||||||
# Additional stuff for the LaTeX preamble. |
|
||||||
#'preamble': '', |
|
||||||
} |
|
||||||
|
|
||||||
# Grouping the document tree into LaTeX files. List of tuples |
|
||||||
# (source start file, target name, title, author, documentclass |
|
||||||
# [howto/manual]). |
|
||||||
latex_documents = [ |
|
||||||
('index', 'ordr2.tex', |
|
||||||
u'Ordr2 Documentation', |
|
||||||
u'Holger Frey', 'manual'), |
|
||||||
] |
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at |
|
||||||
# the top of the title page. |
|
||||||
#latex_logo = None |
|
||||||
|
|
||||||
# For "manual" documents, if this is true, then toplevel headings |
|
||||||
# are parts, not chapters. |
|
||||||
#latex_use_parts = False |
|
||||||
|
|
||||||
# If true, show page references after internal links. |
|
||||||
#latex_show_pagerefs = False |
|
||||||
|
|
||||||
# If true, show URL addresses after external links. |
|
||||||
#latex_show_urls = False |
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals. |
|
||||||
#latex_appendices = [] |
|
||||||
|
|
||||||
# If false, no module index is generated. |
|
||||||
#latex_domain_indices = True |
|
||||||
|
|
||||||
|
|
||||||
# -- Options for manual page output ------------------------------------ |
|
||||||
|
|
||||||
# One entry per manual page. List of tuples |
|
||||||
# (source start file, name, description, authors, manual section). |
|
||||||
man_pages = [ |
|
||||||
('index', 'ordr2', |
|
||||||
u'Ordr2 Documentation', |
|
||||||
[u'Holger Frey'], 1) |
|
||||||
] |
|
||||||
|
|
||||||
# If true, show URL addresses after external links. |
|
||||||
#man_show_urls = False |
|
||||||
|
|
||||||
|
|
||||||
# -- Options for Texinfo output ---------------------------------------- |
|
||||||
|
|
||||||
# Grouping the document tree into Texinfo files. List of tuples |
|
||||||
# (source start file, target name, title, author, |
|
||||||
# dir menu entry, description, category) |
|
||||||
texinfo_documents = [ |
|
||||||
('index', 'ordr2', |
|
||||||
u'Ordr2 Documentation', |
|
||||||
u'Holger Frey', |
|
||||||
'ordr2', |
|
||||||
'One line description of project.', |
|
||||||
'Miscellaneous'), |
|
||||||
] |
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals. |
|
||||||
#texinfo_appendices = [] |
|
||||||
|
|
||||||
# If false, no module index is generated. |
|
||||||
#texinfo_domain_indices = True |
|
||||||
|
|
||||||
# How to display URL addresses: 'footnote', 'no', or 'inline'. |
|
||||||
#texinfo_show_urls = 'footnote' |
|
||||||
|
|
||||||
# If true, do not generate a @detailmenu in the "Top" node's menu. |
|
||||||
#texinfo_no_detailmenu = False |
|
@ -1,22 +0,0 @@ |
|||||||
Welcome to Ordr2's documentation! |
|
||||||
====================================== |
|
||||||
|
|
||||||
Contents: |
|
||||||
|
|
||||||
.. toctree:: |
|
||||||
:maxdepth: 2 |
|
||||||
|
|
||||||
readme |
|
||||||
installation |
|
||||||
usage |
|
||||||
modules |
|
||||||
contributing |
|
||||||
authors |
|
||||||
history |
|
||||||
|
|
||||||
Indices and tables |
|
||||||
================== |
|
||||||
|
|
||||||
* :ref:`genindex` |
|
||||||
* :ref:`modindex` |
|
||||||
* :ref:`search` |
|
@ -1,110 +0,0 @@ |
|||||||
.. highlight:: shell |
|
||||||
|
|
||||||
============ |
|
||||||
Installation |
|
||||||
============ |
|
||||||
|
|
||||||
|
|
||||||
From sources |
|
||||||
------------ |
|
||||||
|
|
||||||
The sources for Ordr2 can be downloaded from the `Git repo`_. |
|
||||||
|
|
||||||
You can clone the public repository: |
|
||||||
|
|
||||||
.. code-block:: console |
|
||||||
|
|
||||||
$ git clone https://git.cpi.imtek.uni-freiburg.de/holgi/ordr2 |
|
||||||
|
|
||||||
You should create a new virtual environment prior to installing and activate it |
|
||||||
|
|
||||||
.. code-block:: console |
|
||||||
|
|
||||||
$ python3 -m venv venv-ordr2 |
|
||||||
$ source venv-ordr2/bin/activate |
|
||||||
|
|
||||||
Once you have a copy of the source, you can install it with: |
|
||||||
|
|
||||||
.. code-block:: console |
|
||||||
|
|
||||||
$ pip install . |
|
||||||
|
|
||||||
.. _Git repo: https://git.cpi.imtek.uni-freiburg.de/holgi/ordr2 |
|
||||||
|
|
||||||
|
|
||||||
Stable release (CURRENTLY NOT AVAILABLE) |
|
||||||
---------------------------------------- |
|
||||||
|
|
||||||
To install Ordr2, run this command in your terminal: |
|
||||||
|
|
||||||
.. code-block:: console |
|
||||||
|
|
||||||
$ pip install ordr2 |
|
||||||
|
|
||||||
This is the preferred method to install Ordr2, as it will always install the |
|
||||||
most recent stable release. |
|
||||||
|
|
||||||
If you don't have `pip`_ installed, this `Python installation guide`_ can guide |
|
||||||
you through the process. |
|
||||||
|
|
||||||
.. _pip: https://pip.pypa.io |
|
||||||
.. _Python installation guide: http://docs.python-guide.org/en/latest/starting/installation/ |
|
||||||
|
|
||||||
|
|
||||||
Dependencies |
|
||||||
------------ |
|
||||||
|
|
||||||
These are the top-level packages that are needed by the webapp and why. They |
|
||||||
rely propably on other packages as well. |
|
||||||
|
|
||||||
deform |
|
||||||
form rendering and validation library |
|
||||||
|
|
||||||
passlib[argon2, bcrypt] |
|
||||||
password hashing library with argon2 and bcrypt support |
|
||||||
|
|
||||||
pyramid |
|
||||||
the framework for the web applicatoin |
|
||||||
|
|
||||||
pyramid_debugtoolbar |
|
||||||
debugging the web application in the browser |
|
||||||
|
|
||||||
pyramid_jinja2 |
|
||||||
Jina2 templating engine for the pyramid web framework |
|
||||||
|
|
||||||
pyramid_mailer |
|
||||||
send emails, uses the transaction manager |
|
||||||
|
|
||||||
pyramid_nacl_session |
|
||||||
Session object with encryption |
|
||||||
|
|
||||||
pyramid_tm |
|
||||||
automatic transaction management based on the request life cycle |
|
||||||
|
|
||||||
SQLAlchemy |
|
||||||
database abstraction |
|
||||||
|
|
||||||
transaction |
|
||||||
transaction management |
|
||||||
|
|
||||||
waitress |
|
||||||
wsgi server for developement |
|
||||||
|
|
||||||
zope.sqlalchemy |
|
||||||
required by pyramid_tm transaction binding |
|
||||||
|
|
||||||
|
|
||||||
For running tests |
|
||||||
~~~~~~~~~~~~~~~~~ |
|
||||||
|
|
||||||
pytest |
|
||||||
for testing python projects |
|
||||||
|
|
||||||
pytest-cov |
|
||||||
test coverage report for pytest |
|
||||||
|
|
||||||
pytest-runner |
|
||||||
required for `test` command in setup.py |
|
||||||
|
|
||||||
WebTest |
|
||||||
run functional or integration tests on the web application |
|
@ -1,242 +0,0 @@ |
|||||||
@ECHO OFF |
|
||||||
|
|
||||||
REM Command file for Sphinx documentation |
|
||||||
|
|
||||||
if "%SPHINXBUILD%" == "" ( |
|
||||||
set SPHINXBUILD=sphinx-build |
|
||||||
) |
|
||||||
set BUILDDIR=_build |
|
||||||
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . |
|
||||||
set I18NSPHINXOPTS=%SPHINXOPTS% . |
|
||||||
if NOT "%PAPER%" == "" ( |
|
||||||
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% |
|
||||||
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "" goto help |
|
||||||
|
|
||||||
if "%1" == "help" ( |
|
||||||
:help |
|
||||||
echo.Please use `make ^<target^>` where ^<target^> is one of |
|
||||||
echo. html to make standalone HTML files |
|
||||||
echo. dirhtml to make HTML files named index.html in directories |
|
||||||
echo. singlehtml to make a single large HTML file |
|
||||||
echo. pickle to make pickle files |
|
||||||
echo. json to make JSON files |
|
||||||
echo. htmlhelp to make HTML files and a HTML help project |
|
||||||
echo. qthelp to make HTML files and a qthelp project |
|
||||||
echo. devhelp to make HTML files and a Devhelp project |
|
||||||
echo. epub to make an epub |
|
||||||
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter |
|
||||||
echo. text to make text files |
|
||||||
echo. man to make manual pages |
|
||||||
echo. texinfo to make Texinfo files |
|
||||||
echo. gettext to make PO message catalogs |
|
||||||
echo. changes to make an overview over all changed/added/deprecated items |
|
||||||
echo. xml to make Docutils-native XML files |
|
||||||
echo. pseudoxml to make pseudoxml-XML files for display purposes |
|
||||||
echo. linkcheck to check all external links for integrity |
|
||||||
echo. doctest to run all doctests embedded in the documentation if enabled |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "clean" ( |
|
||||||
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i |
|
||||||
del /q /s %BUILDDIR%\* |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
|
|
||||||
%SPHINXBUILD% 2> nul |
|
||||||
if errorlevel 9009 ( |
|
||||||
echo. |
|
||||||
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx |
|
||||||
echo.installed, then set the SPHINXBUILD environment variable to point |
|
||||||
echo.to the full path of the 'sphinx-build' executable. Alternatively you |
|
||||||
echo.may add the Sphinx directory to PATH. |
|
||||||
echo. |
|
||||||
echo.If you don't have Sphinx installed, grab it from |
|
||||||
echo.http://sphinx-doc.org/ |
|
||||||
exit /b 1 |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "html" ( |
|
||||||
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished. The HTML pages are in %BUILDDIR%/html. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "dirhtml" ( |
|
||||||
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "singlehtml" ( |
|
||||||
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "pickle" ( |
|
||||||
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished; now you can process the pickle files. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "json" ( |
|
||||||
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished; now you can process the JSON files. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "htmlhelp" ( |
|
||||||
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished; now you can run HTML Help Workshop with the ^ |
|
||||||
.hhp project file in %BUILDDIR%/htmlhelp. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "qthelp" ( |
|
||||||
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished; now you can run "qcollectiongenerator" with the ^ |
|
||||||
.qhcp project file in %BUILDDIR%/qthelp, like this: |
|
||||||
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\ordr2.qhcp |
|
||||||
echo.To view the help file: |
|
||||||
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\ordr2.ghc |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "devhelp" ( |
|
||||||
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "epub" ( |
|
||||||
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished. The epub file is in %BUILDDIR%/epub. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "latex" ( |
|
||||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "latexpdf" ( |
|
||||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex |
|
||||||
cd %BUILDDIR%/latex |
|
||||||
make all-pdf |
|
||||||
cd %BUILDDIR%/.. |
|
||||||
echo. |
|
||||||
echo.Build finished; the PDF files are in %BUILDDIR%/latex. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "latexpdfja" ( |
|
||||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex |
|
||||||
cd %BUILDDIR%/latex |
|
||||||
make all-pdf-ja |
|
||||||
cd %BUILDDIR%/.. |
|
||||||
echo. |
|
||||||
echo.Build finished; the PDF files are in %BUILDDIR%/latex. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "text" ( |
|
||||||
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished. The text files are in %BUILDDIR%/text. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "man" ( |
|
||||||
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished. The manual pages are in %BUILDDIR%/man. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "texinfo" ( |
|
||||||
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "gettext" ( |
|
||||||
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished. The message catalogs are in %BUILDDIR%/locale. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "changes" ( |
|
||||||
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.The overview file is in %BUILDDIR%/changes. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "linkcheck" ( |
|
||||||
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Link check complete; look for any errors in the above output ^ |
|
||||||
or in %BUILDDIR%/linkcheck/output.txt. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "doctest" ( |
|
||||||
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Testing of doctests in the sources finished, look at the ^ |
|
||||||
results in %BUILDDIR%/doctest/output.txt. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "xml" ( |
|
||||||
%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished. The XML files are in %BUILDDIR%/xml. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
if "%1" == "pseudoxml" ( |
|
||||||
%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml |
|
||||||
if errorlevel 1 exit /b 1 |
|
||||||
echo. |
|
||||||
echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. |
|
||||||
goto end |
|
||||||
) |
|
||||||
|
|
||||||
:end |
|
@ -1,7 +0,0 @@ |
|||||||
===== |
|
||||||
Usage |
|
||||||
===== |
|
||||||
|
|
||||||
To use Ordr2 in a project:: |
|
||||||
|
|
||||||
import ordr2 |
|
@ -1,27 +1,25 @@ |
|||||||
''' Top-level package for Ordr2. ''' |
from pyramid.config import Configurator |
||||||
|
from pyramid.session import SignedCookieSessionFactory |
||||||
__author__ = 'Holger Frey' |
|
||||||
__email__ = 'frey@imtek.de' |
|
||||||
__version__ = '0.0.1' |
|
||||||
|
|
||||||
|
|
||||||
from pyramid.config import Configurator |
__version__ = '0.0.1' |
||||||
|
|
||||||
|
|
||||||
def main(global_config, **settings): |
def main(global_config, **settings): # pragma: no cover |
||||||
''' This function returns a Pyramid WSGI application. ''' |
''' This function returns a Pyramid WSGI application. ''' |
||||||
config = Configurator(settings=settings) |
config = Configurator(settings=settings) |
||||||
|
|
||||||
|
session_factory = SignedCookieSessionFactory(settings['session.secret']) |
||||||
|
config.set_session_factory(session_factory) |
||||||
|
config.set_default_csrf_options(require_csrf=settings['session.auto_csrf']) |
||||||
|
|
||||||
|
config.include('pyramid_jinja2') |
||||||
config.include('.models') |
config.include('.models') |
||||||
config.include('.resources') |
config.include('.resources') |
||||||
config.include('.schemas') |
config.include('.schemas') |
||||||
config.include('.security') |
config.include('.security') |
||||||
config.include('.session') |
|
||||||
config.include('.views') |
config.include('.views') |
||||||
|
|
||||||
# explicit include for jinja2 to enable rendering in events module |
|
||||||
config.include('pyramid_jinja2') |
|
||||||
|
|
||||||
config.scan() |
config.scan() |
||||||
|
|
||||||
return config.make_wsgi_app() |
return config.make_wsgi_app() |
@ -0,0 +1,206 @@ |
|||||||
|
''' Resources (sub) package, used to connect URLs to views ''' |
||||||
|
|
||||||
|
import deform |
||||||
|
|
||||||
|
from pyramid.security import Allow, Authenticated, Everyone, DENY_ALL |
||||||
|
|
||||||
|
from ordr.models.account import Token, TokenSubject |
||||||
|
from ordr.schemas.account import ( |
||||||
|
ChangePasswordSchema, |
||||||
|
RegistrationSchema, |
||||||
|
ResetPasswordSchema, |
||||||
|
SettingsSchema |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
from .helpers import BaseChildResource |
||||||
|
|
||||||
|
|
||||||
|
class RegistrationTokenResource(BaseChildResource): |
||||||
|
''' Resource for vaildating a new registered user's email |
||||||
|
|
||||||
|
:param pyramid.request.Request request: the current request object |
||||||
|
:param str name: the name of the resource |
||||||
|
:param parent: the parent resouce |
||||||
|
''' |
||||||
|
|
||||||
|
nav_active = 'registration' |
||||||
|
|
||||||
|
def __acl__(self): |
||||||
|
''' access controll list for the resource ''' |
||||||
|
return [(Allow, Everyone, 'register'), DENY_ALL] |
||||||
|
|
||||||
|
|
||||||
|
class RegistrationResource(BaseChildResource): |
||||||
|
''' The resource for new user registration |
||||||
|
|
||||||
|
:param pyramid.request.Request request: the current request object |
||||||
|
:param str name: the name of the resource |
||||||
|
:param parent: the parent resouce |
||||||
|
''' |
||||||
|
|
||||||
|
nav_active = 'registration' |
||||||
|
|
||||||
|
def __acl__(self): |
||||||
|
''' access controll list for the resource ''' |
||||||
|
return [(Allow, Everyone, 'register'), DENY_ALL] |
||||||
|
|
||||||
|
def __getitem__(self, key): |
||||||
|
''' returns a resource for a valid registration token ''' |
||||||
|
token = Token.retrieve(self.request, key, TokenSubject.REGISTRATION) |
||||||
|
if token is None: |
||||||
|
raise KeyError(f'Token {key} not found') |
||||||
|
return RegistrationTokenResource(name=key, parent=self, model=token) |
||||||
|
|
||||||
|
def get_registration_form(self, **kwargs): |
||||||
|
''' returns the registration form''' |
||||||
|
settings = { |
||||||
|
'buttons': ( |
||||||
|
deform.Button(name='create', title='Create Account'), |
||||||
|
deform.Button( |
||||||
|
title='Cancel', |
||||||
|
type='link', |
||||||
|
value=self.request.resource_url(self.request.root), |
||||||
|
css_class='btn btn-outline-secondary' |
||||||
|
) |
||||||
|
), |
||||||
|
} |
||||||
|
settings.update(kwargs) |
||||||
|
return self._prepare_form(RegistrationSchema, **settings) |
||||||
|
|
||||||
|
|
||||||
|
class PasswordResetTokenResource(BaseChildResource): |
||||||
|
''' Resource for the reset password link |
||||||
|
|
||||||
|
:param pyramid.request.Request request: the current request object |
||||||
|
:param str name: the name of the resource |
||||||
|
:param parent: the parent resouce |
||||||
|
''' |
||||||
|
|
||||||
|
nav_active = None |
||||||
|
|
||||||
|
def __acl__(self): |
||||||
|
''' access controll list for the resource ''' |
||||||
|
return [(Allow, Everyone, 'reset'), DENY_ALL] |
||||||
|
|
||||||
|
def get_reset_form(self, **kwargs): |
||||||
|
''' returns password reset form ''' |
||||||
|
settings = { |
||||||
|
'buttons': ( |
||||||
|
deform.Button(name='change', title='Set New Password'), |
||||||
|
deform.Button(name='cancel', title='Cancel'), |
||||||
|
) |
||||||
|
} |
||||||
|
settings.update(kwargs) |
||||||
|
return self._prepare_form(ResetPasswordSchema, **settings) |
||||||
|
|
||||||
|
|
||||||
|
class PasswordResetResource(BaseChildResource): |
||||||
|
''' The resource for resetting a forgotten password |
||||||
|
|
||||||
|
:param pyramid.request.Request request: the current request object |
||||||
|
:param str name: the name of the resource |
||||||
|
:param parent: the parent resouce |
||||||
|
''' |
||||||
|
|
||||||
|
nav_active = None |
||||||
|
|
||||||
|
def __acl__(self): |
||||||
|
''' access controll list for the resource ''' |
||||||
|
return [(Allow, Everyone, 'reset'), DENY_ALL] |
||||||
|
|
||||||
|
def __getitem__(self, key): |
||||||
|
''' returns a resource for a valid reset password token ''' |
||||||
|
token = Token.retrieve(self.request, key, TokenSubject.RESET_PASSWORD) |
||||||
|
if token is None: |
||||||
|
raise KeyError(f'Token {key} not found') |
||||||
|
return PasswordResetTokenResource(name=key, parent=self, model=token) |
||||||
|
|
||||||
|
|
||||||
|
class ChangeEmailTokenResource(BaseChildResource): |
||||||
|
''' Resource for changing the email address |
||||||
|
|
||||||
|
:param pyramid.request.Request request: the current request object |
||||||
|
:param str name: the name of the resource |
||||||
|
:param parent: the parent resouce |
||||||
|
''' |
||||||
|
|
||||||
|
nav_active = None |
||||||
|
|
||||||
|
def __acl__(self): |
||||||
|
''' access controll list for the resource ''' |
||||||
|
return [(Allow, self.model.owner.principal, 'edit'), DENY_ALL] |
||||||
|
|
||||||
|
|
||||||
|
class AccountResource(BaseChildResource): |
||||||
|
''' The resource for changing account settings and passwords |
||||||
|
|
||||||
|
:param pyramid.request.Request request: the current request object |
||||||
|
:param str name: the name of the resource |
||||||
|
:param parent: the parent resouce |
||||||
|
''' |
||||||
|
|
||||||
|
nav_active = None |
||||||
|
|
||||||
|
def __init__(self, name, parent, model=None): |
||||||
|
''' Create the resource |
||||||
|
|
||||||
|
:param str name: the name of the resource |
||||||
|
:param parent: the parent resouce |
||||||
|
:param model: optional data model for the resource |
||||||
|
|
||||||
|
If model is not set, the current user will be used |
||||||
|
''' |
||||||
|
super().__init__(name, parent, model) |
||||||
|
self.model = model or getattr(self.request, 'user', None) |
||||||
|
|
||||||
|
def __acl__(self): |
||||||
|
''' access controll list for the resource ''' |
||||||
|
return [ |
||||||
|
(Allow, Everyone, 'view'), |
||||||
|
(Allow, Everyone, 'login'), |
||||||
|
(Allow, Everyone, 'logout'), |
||||||
|
(Allow, Everyone, 'register'), |
||||||
|
(Allow, Everyone, 'reset'), |
||||||
|
(Allow, Authenticated, 'edit'), |
||||||
|
DENY_ALL |
||||||
|
] |
||||||
|
|
||||||
|
def __getitem__(self, key): |
||||||
|
''' returns a resource for child resource ''' |
||||||
|
# static child resources |
||||||
|
map = { |
||||||
|
'register': RegistrationResource, |
||||||
|
'forgot': PasswordResetResource, |
||||||
|
} |
||||||
|
if key in map: |
||||||
|
child_class = map[key] |
||||||
|
return child_class(name=key, parent=self) |
||||||
|
|
||||||
|
# change email verification |
||||||
|
token = Token.retrieve(self.request, key, TokenSubject.CHANGE_EMAIL) |
||||||
|
if token is None: |
||||||
|
raise KeyError(f'Token {key} not found') |
||||||
|
return ChangeEmailTokenResource(name=key, parent=self, model=token) |
||||||
|
|
||||||
|
def get_settings_form(self, **kwargs): |
||||||
|
''' returns the account settings form ''' |
||||||
|
settings = { |
||||||
|
'buttons': ( |
||||||
|
deform.Button(name='change', title='Change Settings'), |
||||||
|
deform.Button(name='cancel', title='Cancel'), |
||||||
|
) |
||||||
|
} |
||||||
|
settings.update(kwargs) |
||||||
|
return self._prepare_form(SettingsSchema, **settings) |
||||||
|
|
||||||
|
def get_password_form(self, **kwargs): |
||||||
|
''' returns the change password form ''' |
||||||
|
settings = { |
||||||
|
'buttons': ( |
||||||
|
deform.Button(name='change', title='Change Password'), |
||||||
|
deform.Button(name='cancel', title='Cancel'), |
||||||
|
) |
||||||
|
} |
||||||
|
settings.update(kwargs) |
||||||
|
return self._prepare_form(ChangePasswordSchema, **settings) |
@ -0,0 +1,27 @@ |
|||||||
|
''' Resources (sub) package, used to connect URLs to views ''' |
||||||
|
|
||||||
|
|
||||||
|
class BaseChildResource: |
||||||
|
|
||||||
|
def __init__(self, name, parent, model=None): |
||||||
|
''' Create a child resource |
||||||
|
|
||||||
|
:param str name: the name of the resource |
||||||
|
:param parent: the parent resouce |
||||||
|
:param model: optional data model for the resource |
||||||
|
''' |
||||||
|
self.__name__ = name |
||||||
|
self.__parent__ = parent |
||||||
|
self.request = parent.request |
||||||
|
self.model = model |
||||||
|
|
||||||
|
def __acl__(self): |
||||||
|
''' access controll list for the resource ''' |
||||||
|
raise NotImplementedError() |
||||||
|
|
||||||
|
def _prepare_form(self, schema, prefill=None, **settings): |
||||||
|
''' prepares a deform form for the resource''' |
||||||
|
form = schema.as_form(self.request, **settings) |
||||||
|
if prefill is not None: |
||||||
|
form.set_appstruct(prefill) |
||||||
|
return form |
@ -0,0 +1,101 @@ |
|||||||
|
import colander |
||||||
|
import deform |
||||||
|
|
||||||
|
from . import CSRFSchema |
||||||
|
|
||||||
|
from .validators import ( |
||||||
|
deferred_unique_email_validator, |
||||||
|
deferred_unique_username_validator, |
||||||
|
deferred_password_validator |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
# schema for user registration |
||||||
|
|
||||||
|
class RegistrationSchema(CSRFSchema): |
||||||
|
''' new user registration ''' |
||||||
|
|
||||||
|
username = colander.SchemaNode( |
||||||
|
colander.String(), |
||||||
|
widget=deform.widget.TextInputWidget( |
||||||
|
readonly=True |
||||||
|
), |
||||||
|
description='automagically generated for you', |
||||||
|
validator=deferred_unique_username_validator, |
||||||
|
oid='registration_username' |
||||||
|
) |
||||||
|
|
||||||
|
first_name = colander.SchemaNode( |
||||||
|
colander.String(), |
||||||
|
oid='registration_first_name' |
||||||
|
) |
||||||
|
|
||||||
|
last_name = colander.SchemaNode( |
||||||
|
colander.String(), |
||||||
|
oid='registration_last_name' |
||||||
|
) |
||||||
|
|
||||||
|
email = colander.SchemaNode( |
||||||
|
colander.String(), |
||||||
|
validator=deferred_unique_email_validator |
||||||
|
) |
||||||
|
|
||||||
|
password = colander.SchemaNode( |
||||||
|
colander.String(), |
||||||
|
widget=deform.widget.CheckedPasswordWidget(), |
||||||
|
validator=colander.Length(min=8) |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
class ResetPasswordSchema(CSRFSchema): |
||||||
|
''' reset a forgotten password ''' |
||||||
|
|
||||||
|
password = colander.SchemaNode( |
||||||
|
colander.String(), |
||||||
|
widget=deform.widget.CheckedPasswordWidget(), |
||||||
|
validator=colander.Length(min=8) |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
class SettingsSchema(CSRFSchema): |
||||||
|
''' new user registration ''' |
||||||
|
|
||||||
|
username = colander.SchemaNode( |
||||||
|
colander.String(), |
||||||
|
widget=deform.widget.TextInputWidget(readonly=True) |
||||||
|
) |
||||||
|
|
||||||
|
first_name = colander.SchemaNode( |
||||||
|
colander.String() |
||||||
|
) |
||||||
|
|
||||||
|
last_name = colander.SchemaNode( |
||||||
|
colander.String() |
||||||
|
) |
||||||
|
|
||||||
|
email = colander.SchemaNode( |
||||||
|
colander.String(), |
||||||
|
validator=deferred_unique_email_validator |
||||||
|
) |
||||||
|
|
||||||
|
confirmation = colander.SchemaNode( |
||||||
|
colander.String(), |
||||||
|
widget=deform.widget.PasswordWidget(), |
||||||
|
validator=deferred_password_validator |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
class ChangePasswordSchema(CSRFSchema): |
||||||
|
''' change the password ''' |
||||||
|
|
||||||
|
password = colander.SchemaNode( |
||||||
|
colander.String(), |
||||||
|
widget=deform.widget.CheckedPasswordWidget(), |
||||||
|
validator=colander.Length(min=8) |
||||||
|
) |
||||||
|
|
||||||
|
confirmation = colander.SchemaNode( |
||||||
|
colander.String(), |
||||||
|
widget=deform.widget.PasswordWidget(), |
||||||
|
validator=deferred_password_validator |
||||||
|
) |
@ -0,0 +1,97 @@ |
|||||||
|
''' User Authentication and Authorization ''' |
||||||
|
|
||||||
|
from passlib.context import CryptContext |
||||||
|
from pyramid.authentication import AuthTktAuthenticationPolicy |
||||||
|
from pyramid.authorization import ACLAuthorizationPolicy |
||||||
|
from pyramid.security import Authenticated, Everyone |
||||||
|
from pyramid.settings import aslist |
||||||
|
|
||||||
|
from ordr.models.account import User |
||||||
|
|
||||||
|
#: passlib context for hashing passwords |
||||||
|
# at least one scheme must be set in advance, will be overridden by the |
||||||
|
# settings in the .ini file. |
||||||
|
password_context = CryptContext(schemes=['argon2']) |
||||||
|
|
||||||
|
|
||||||
|
class AuthenticationPolicy(AuthTktAuthenticationPolicy): |
||||||
|
''' How to authenticate users ''' |
||||||
|
|
||||||
|
def authenticated_userid(self, request): |
||||||
|
''' returns the id of an authenticated user |
||||||
|
|
||||||
|
heavy lifting done in get_user() attached to request |
||||||
|
''' |
||||||
|
user = request.user |
||||||
|
if user is not None: |
||||||
|
return user.id |
||||||
|
|
||||||
|
def effective_principals(self, request): |
||||||
|
''' returns a list of principals for the user ''' |
||||||
|
principals = [Everyone] |
||||||
|
user = request.user |
||||||
|
if user is not None: |
||||||
|
principals.append(Authenticated) |
||||||
|
principals.extend(user.principals) |
||||||
|
return principals |
||||||
|
|
||||||
|
|
||||||
|
def get_user(request): |
||||||
|
''' retrieves the user object by the unauthenticated user id |
||||||
|
|
||||||
|
:param pyramid.request.Request request: |
||||||
|
the current request object |
||||||
|
:rtype: :class:`ordr.models.account.User` or None |
||||||
|
''' |
||||||
|
user_id = request.unauthenticated_userid |
||||||
|
if user_id is not None: |
||||||
|
user = request.dbsession.query(User).filter_by(id=user_id).first() |
||||||
|
if user and user.is_active: |
||||||
|
return user |
||||||
|
return None |
||||||
|
|
||||||
|
|
||||||
|
def crypt_context_settings_to_string(settings, prefix='passlib.'): |
||||||
|
''' returns a passlib context setting as a INI-formatted content |
||||||
|
|
||||||
|
:param dict settings: settings for the crypt context |
||||||
|
:param str prefix: prefix of the settings keys |
||||||
|
:rtype: (str) config string in INI format for CryptContext.load() |
||||||
|
|
||||||
|
This looks at first like a dump hack, but the parsing of all possible |
||||||
|
context settings is quite a task. Since passlib has a context parser |
||||||
|
included, this seems the most reliable way to do it. |
||||||
|
''' |
||||||
|
config_lines = ['[passlib]'] |
||||||
|
for ini_key, value in settings.items(): |
||||||
|
if ini_key.startswith(prefix): |
||||||
|
context_key = ini_key.replace(prefix, '') |
||||||
|
# the pyramid .ini format is different on lists |
||||||
|
# than the .ini format used by passlib. |
||||||
|
if context_key in {'schemes', 'deprecated'} and ',' not in value: |
||||||
|
value = ','.join(aslist(value)) |
||||||
|
config_lines.append(f'{context_key} = {value}') |
||||||
|
return '\n'.join(config_lines) |
||||||
|
|
||||||
|
|
||||||
|
def includeme(config): # pragma: no cover |
||||||
|
''' initializing authentication, authorization and password hash settings |
||||||
|
|
||||||
|
Activate this setup using ``config.include('ordr.security')``. |
||||||
|
''' |
||||||
|
settings = config.get_settings() |
||||||
|
|
||||||
|
# configure the passlib context manager for hashing user passwords |
||||||
|
config_str = crypt_context_settings_to_string(settings, prefix='passlib.') |
||||||
|
password_context.load(config_str) |
||||||
|
|
||||||
|
# config for authentication and authorization |
||||||
|
authn_policy = AuthenticationPolicy( |
||||||
|
settings.get('auth.secret', ''), |
||||||
|
hashalg='sha512', |
||||||
|
) |
||||||
|
config.set_authentication_policy(authn_policy) |
||||||
|
config.set_authorization_policy(ACLAuthorizationPolicy()) |
||||||
|
|
||||||
|
# attach the get_user function returned by get_user_closure() |
||||||
|
config.add_request_method(get_user, 'user', reify=True) |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
@ -0,0 +1,21 @@ |
|||||||
|
$(function() { |
||||||
|
|
||||||
|
function capitalize(s){ |
||||||
|
return s.replace( /\b./g, function(a){ return a.toUpperCase(); } ); |
||||||
|
}; |
||||||
|
|
||||||
|
function generate_user_name() { |
||||||
|
var first_name = $('#registration_first_name').val(); |
||||||
|
var last_name = $('#registration_last_name').val(); |
||||||
|
var user_name = capitalize(first_name) + capitalize(last_name); |
||||||
|
return user_name.replace( /[\s-]/g, '') |
||||||
|
}; |
||||||
|
|
||||||
|
// autocomplete of the username (registration form)
|
||||||
|
$('#registration_first_name').keyup(function () { |
||||||
|
$('#registration_username').val( generate_user_name() ); |
||||||
|
}); |
||||||
|
$('#registration_last_name').keyup(function() { |
||||||
|
$('#registration_username').val( generate_user_name() ); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,33 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h1>Forgot Your Password?</h1> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 1: Validate Account |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 2: Change Password |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-primary"> |
||||||
|
Step 3: Finished |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h3>Password Reset Succesfull</h3> |
||||||
|
<p class="mt-3">Your password has been changed.</p> |
||||||
|
<p>You can now <a href="{{ request.resource_url(request.root) }}">log in</a> again.</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,49 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h1>Forgot Your Password?</h1> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-primary"> |
||||||
|
Step 1: Validate Account |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 2: Change Password |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 3: Finished |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6 mt-3"> |
||||||
|
<p>Please enter your mail address or your username to reset your password.</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center"> |
||||||
|
<div class="col-6"> |
||||||
|
<form action="{{request.resource_url(context)}}" method="POST"> |
||||||
|
<div class="form-group form-row mt-3"> |
||||||
|
<input type="hidden" name="csrf_token" value="{{get_csrf_token()}}"> |
||||||
|
<input type="text" class="form-control {% if formerror %}is-invalid{% endif %}" id="input-username" placeholder="Mail Address or Username" name="identifier" autofocus="autofocus"> |
||||||
|
{% if formerror %} |
||||||
|
<div class="invalid-feedback"> |
||||||
|
Username or email address unknown, or account is not activated. |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
</div> |
||||||
|
<div class="form-group form-row mt-5"> |
||||||
|
<button type="submit" name="send_mail" class="btn btn-primary mr-1">Send Reset Link</button> |
||||||
|
<button type="submit" name="cancel" class="btn btn-outline-secondary">Cancel</button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,32 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h1>Forgot Your Password?</h1> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 1: Validate Account |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-primary"> |
||||||
|
Step 2: Change Password |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 3: Finished |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h3>Change your password</h3> |
||||||
|
<p class="mt-3">{{ form.render()|safe }}</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,33 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h1>Forgot Your Password?</h1> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-primary"> |
||||||
|
Step 1: Validate Account |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 2: Change Password |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 3: Finished |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h3>Verify Your Email Address</h3> |
||||||
|
<p class="mt-3">To continue the process, an email has been sent to you.</p> |
||||||
|
<p>Please follow the link in the email to verify your account.</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,41 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row mt-5"> |
||||||
|
<div class="col-8 offset-2"> |
||||||
|
<div class="jumbotron"> |
||||||
|
<h1 class="display-4">Welcome to <span class="text-primary">ordr</span>!</h1> |
||||||
|
<p class="lead">An order management system to simplify your shopping for laborartory supplies.</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row"> |
||||||
|
<div class="col-4 offset-2"> |
||||||
|
<h4 class="mb-4">Login</h4> |
||||||
|
<form action="{{ request.resource_url(context, 'login') }}" method="POST"> |
||||||
|
<div class="form-group"> |
||||||
|
<input type="hidden" name="csrf_token" value="{{get_csrf_token()}}"> |
||||||
|
<input type="text" class="form-control {% if loginerror %}is-invalid{% endif %}" id="input-username" placeholder="Username" name="username" autofocus="autofocus"> |
||||||
|
</div> |
||||||
|
<div class="form-group"> |
||||||
|
<input type="password" class="form-control {% if loginerror %}is-invalid{% endif %}" id="input-password" placeholder="Password" name="password"> |
||||||
|
{% if loginerror %} |
||||||
|
<div class="invalid-feedback"> |
||||||
|
Username and password do not match, or account is not activated. |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
</div> |
||||||
|
<button type="submit" class="btn btn-primary">Login</button> |
||||||
|
<small class="float-right mt-2"><a href="/forgot">Forgot your password?</a></small> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
<div class="col-4"> |
||||||
|
<h4 class="mb-4">Register</h4> |
||||||
|
<p> |
||||||
|
Registration is easy as 1-2-3. |
||||||
|
Just fill out the <a href="/register">form</a> and as soon as your |
||||||
|
account has been activated you can start shopping. |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,16 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h1>Change Your Password</h1> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center"> |
||||||
|
<div class="col-6"> |
||||||
|
<h3>Your password was changed successfully</h3> |
||||||
|
<p class="mt-3">You can now log in with your new password.</p> |
||||||
|
<p>Happy <a href="{{ request.resource_url(request.root) }}">ordering</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,14 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h1>Change Your Password</h1> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center"> |
||||||
|
<div class="col-6 mt-3"> |
||||||
|
{{ form.render()|safe }} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,36 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block title %} Ordr | Registration {% endblock title %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h1>Registration</h1> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 1: Registration |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 2: Validate Email |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-primary"> |
||||||
|
Step 3: Finished |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h3>Registration Completed</h3> |
||||||
|
<p class="mt-3">Thank you for verifying your email address.</p> |
||||||
|
<p>Before you can start ordering, an administrator must activate your account</p> |
||||||
|
<p>You'll receive an email when your account is activated</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,33 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block title %} Ordr | Registration {% endblock title %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h1>Registration</h1> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-primary"> |
||||||
|
Step 1: Registration |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 2: Validate Email |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 3: Finished |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
{{ form.render()|safe }} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,35 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block title %} Ordr | Registration {% endblock title %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h1>Registration</h1> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 1: Registration |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-primary"> |
||||||
|
Step 2: Validate Email |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-2"> |
||||||
|
<p class="text-secondary"> |
||||||
|
Step 3: Finished |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h3>Verify Your Email Address</h3> |
||||||
|
<p class="mt-3">To complete the registration process an email has been sent to you.</p> |
||||||
|
<p>Please follow the link in the email to verify your address and complete the registration process.</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,14 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h1>Change Settings</h1> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center"> |
||||||
|
<div class="col-6 mt-3"> |
||||||
|
{{ form.render()|safe }} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,16 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-6"> |
||||||
|
<h1>Change Settings</h1> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row justify-content-md-center"> |
||||||
|
<div class="col-6"> |
||||||
|
<h3>Your email was changed successfully</h3> |
||||||
|
<p class="mt-3">New notifications will be sent to {{request.user.email}}.</p> |
||||||
|
<p>Happy <a href="{{ request.resource_url(request.root) }}">ordering</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -0,0 +1,46 @@ |
|||||||
|
<div i18n:domain="deform" tal:omit-tag="" |
||||||
|
tal:define="oid oid|field.oid; |
||||||
|
name name|field.name; |
||||||
|
css_class css_class|field.widget.css_class; |
||||||
|
style style|field.widget.style; |
||||||
|
required required|'required' if field.required else None; |
||||||
|
was_validated True if field.get_root().error else False; |
||||||
|
is_invalid is_invalid|field.error and not field.widget.hidden and not field.typ.__class__.__name__=='Mapping'; |
||||||
|
is_valid was_validated and not is_invalid; |
||||||
|
"> |
||||||
|
${field.start_mapping()} |
||||||
|
<div> |
||||||
|
<input type="password" |
||||||
|
name="${name}" |
||||||
|
value="${field.widget.redisplay and cstruct or ''}" |
||||||
|
tal:attributes="class string: form-control ${css_class or ''} ${'is-invalid' if is_invalid else ''} ${'is-valid' if is_valid else ''}; |
||||||
|
style style; |
||||||
|
required required;" |
||||||
|
id="${oid}" |
||||||
|
i18n:attributes="placeholder" |
||||||
|
placeholder="Password"/> |
||||||
|
</div> |
||||||
|
<div class="mt-2"> |
||||||
|
<input type="password" |
||||||
|
name="${name}-confirm" |
||||||
|
value="${field.widget.redisplay and confirm or ''}" |
||||||
|
tal:attributes="class string: form-control ${css_class or ''} ${'is-invalid' if is_invalid else ''} ${'is-valid' if is_valid else ''}; |
||||||
|
style style; |
||||||
|
required required;" |
||||||
|
id="${oid}-confirm" |
||||||
|
i18n:attributes="placeholder" |
||||||
|
placeholder="Confirm Password"/> |
||||||
|
|
||||||
|
<!--! error message must directly follow input field for bootstrap 4 --> |
||||||
|
<div class="invalid-feedback" |
||||||
|
tal:define="errstr 'error-%s' % field.oid" |
||||||
|
tal:repeat="msg field.error.messages()" |
||||||
|
i18n:translate="" |
||||||
|
tal:attributes="id repeat.msg.index==0 and errstr or |
||||||
|
('%s-%s' % (errstr, repeat.msg.index))" |
||||||
|
tal:condition="is_invalid"> |
||||||
|
${msg} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
${field.end_mapping()} |
||||||
|
</div> |
@ -0,0 +1,110 @@ |
|||||||
|
<form |
||||||
|
tal:define="style style|field.widget.style; |
||||||
|
css_class css_class|string:${field.widget.css_class or field.css_class or ''}; |
||||||
|
item_template item_template|field.widget.item_template; |
||||||
|
autocomplete autocomplete|field.autocomplete; |
||||||
|
title title|field.title; |
||||||
|
errormsg errormsg|field.errormsg; |
||||||
|
description description|field.description; |
||||||
|
buttons buttons|field.buttons; |
||||||
|
use_ajax use_ajax|field.use_ajax; |
||||||
|
ajax_options ajax_options|field.ajax_options; |
||||||
|
formid formid|field.formid; |
||||||
|
action action|field.action or None; |
||||||
|
method method|field.method; |
||||||
|
col_label col_label|field.col_label; |
||||||
|
col_input col_input|field.col_input; |
||||||
|
was_validated True if field.get_root().error else False;" |
||||||
|
|
||||||
|
tal:attributes="autocomplete autocomplete; |
||||||
|
style style; |
||||||
|
class css_class; |
||||||
|
action action;" |
||||||
|
id="${formid}" |
||||||
|
method="${method}" |
||||||
|
enctype="multipart/form-data" |
||||||
|
accept-charset="utf-8" |
||||||
|
i18n:domain="deform" |
||||||
|
> |
||||||
|
|
||||||
|
<fieldset class="deform-form-fieldset"> |
||||||
|
|
||||||
|
<legend tal:condition="title">${title}}</legend> |
||||||
|
|
||||||
|
<input type="hidden" name="_charset_" /> |
||||||
|
<input type="hidden" name="__formid__" value="${formid}"/> |
||||||
|
|
||||||
|
<p class="section first" tal:condition="description"> |
||||||
|
${description} |
||||||
|
</p> |
||||||
|
|
||||||
|
<div tal:repeat="child field" |
||||||
|
tal:replace="structure child.render_template(item_template)"/> |
||||||
|
|
||||||
|
<div class="form-row deform-form-buttons"> |
||||||
|
<div class="col-${col_label}"></div> |
||||||
|
<div class="form-group col-{$col_input} mt-4"> |
||||||
|
<tal:loop tal:repeat="button buttons"> |
||||||
|
<button |
||||||
|
tal:define="btn_disposition repeat.button.start and 'btn-primary' or 'btn-default';" |
||||||
|
tal:attributes="disabled button.disabled if button.disabled else None" |
||||||
|
id="${formid+button.name}" |
||||||
|
name="${button.name}" |
||||||
|
type="${button.type}" |
||||||
|
class="btn ${button.css_class or btn_disposition}" |
||||||
|
value="${button.value}" |
||||||
|
tal:condition="button.type != 'link'"> |
||||||
|
<span tal:condition="button.icon" class="glyphicon glyphicon-${button.icon}"></span> |
||||||
|
${button.title} |
||||||
|
</button> |
||||||
|
<a |
||||||
|
tal:define="btn_disposition repeat.button.start and 'btn-primary' or 'btn-default'; |
||||||
|
btn_href button.value|''" |
||||||
|
class="btn ${button.css_class or btn_disposition}" |
||||||
|
id="${field.formid + button.name}" |
||||||
|
href="${btn_href}" |
||||||
|
tal:condition="button.type == 'link'"> |
||||||
|
<span tal:condition="button.icon" class="glyphicon glyphicon-${button.icon}"></span> |
||||||
|
${button.title} |
||||||
|
</a> |
||||||
|
</tal:loop> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</fieldset> |
||||||
|
|
||||||
|
<script type="text/javascript" tal:condition="use_ajax"> |
||||||
|
$(function() { |
||||||
|
// jquery handler for .ready() called |
||||||
|
|
||||||
|
deform.addCallback( |
||||||
|
'${formid}', |
||||||
|
function(oid) { |
||||||
|
var target = '#' + oid; |
||||||
|
var options = { |
||||||
|
target: target, |
||||||
|
replaceTarget: true, |
||||||
|
success: function() { |
||||||
|
deform.processCallbacks(); |
||||||
|
deform.focusFirstInput(target); |
||||||
|
}, |
||||||
|
beforeSerialize: function() { |
||||||
|
// See http://bit.ly/1agBs9Z (hack to fix tinymce-related ajax bug) |
||||||
|
if ('tinymce' in window) { |
||||||
|
$(tinymce.get()).each( |
||||||
|
function(i, el) { |
||||||
|
var content = el.getContent(); |
||||||
|
var editor_input = document.getElementById(el.id); |
||||||
|
editor_input.value = content; |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
var extra_options = ${ajax_options} || {}; |
||||||
|
$('#' + oid).ajaxForm($.extend(options, extra_options)); |
||||||
|
} |
||||||
|
); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
|
||||||
|
</form> |
@ -0,0 +1,55 @@ |
|||||||
|
<div tal:define="error_class error_class|field.widget.error_class; |
||||||
|
description description|field.description; |
||||||
|
title title|field.title; |
||||||
|
oid oid|field.oid; |
||||||
|
hidden hidden|field.widget.hidden; |
||||||
|
category category|field.widget.category; |
||||||
|
structural hidden or category == 'structural'; |
||||||
|
required required|'required' if field.required else None; |
||||||
|
was_validated True if field.get_root().error else False; |
||||||
|
is_invalid is_invalid|field.error and not field.widget.hidden and not field.typ.__class__.__name__=='Mapping'; |
||||||
|
col_label col_label|field.col_label; |
||||||
|
col_input col_input|field.col_input;" |
||||||
|
class="form-group form-row ${field.error and 'has-error' or ''} ${field.widget.item_css_class or ''} ${field.default_item_css_class()}" |
||||||
|
title="${description}" |
||||||
|
id="item-${oid}" |
||||||
|
tal:omit-tag="structural" |
||||||
|
i18n:domain="deform"> |
||||||
|
|
||||||
|
<label for="${oid}" |
||||||
|
class="control-label col-${col_label} col-form-label ${required and 'required' or ''}" |
||||||
|
tal:condition="not structural" |
||||||
|
id="req-${oid}" |
||||||
|
> |
||||||
|
${title} |
||||||
|
</label> |
||||||
|
<div class="col-${col_input}"> |
||||||
|
<div tal:define="input_prepend field.widget.input_prepend | None; |
||||||
|
input_append field.widget.input_append | None" |
||||||
|
tal:omit-tag="not (input_prepend or input_append)" |
||||||
|
class="input-group"> |
||||||
|
<div class="input-group-prepend" tal:condition="input_prepend"> |
||||||
|
<div class="input-group-text">${input_prepend}</div> |
||||||
|
</div> |
||||||
|
<span tal:replace="structure field.serialize(cstruct).strip()"></span> |
||||||
|
<div class="input-group-append" tal:condition="input_append"> |
||||||
|
<div class="input-group-text">${input_append}</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="invalid-feedback" |
||||||
|
tal:define="errstr 'error-%s' % field.oid" |
||||||
|
tal:repeat="msg field.error.messages()" |
||||||
|
i18n:translate="" |
||||||
|
tal:attributes="id repeat.msg.index==0 and errstr or |
||||||
|
('%s-%s' % (errstr, repeat.msg.index))" |
||||||
|
tal:condition="is_invalid"> |
||||||
|
${msg} |
||||||
|
</div> |
||||||
|
|
||||||
|
<small tal:condition="field.description and not field.widget.hidden" |
||||||
|
class="form-text text-muted" > |
||||||
|
${field.description} |
||||||
|
</small> |
||||||
|
</div> |
||||||
|
</div> |
@ -0,0 +1,18 @@ |
|||||||
|
<span tal:define="name name|field.name; |
||||||
|
css_class css_class|field.widget.css_class; |
||||||
|
oid oid|field.oid; |
||||||
|
required required|'required' if field.required else None; |
||||||
|
mask mask|field.widget.mask; |
||||||
|
mask_placeholder mask_placeholder|field.widget.mask_placeholder; |
||||||
|
style style|field.widget.style; |
||||||
|
was_validated True if field.get_root().error else False; |
||||||
|
is_invalid is_invalid|field.error and not field.widget.hidden and not field.typ.__class__.__name__=='Mapping'; |
||||||
|
is_valid was_validated and not is_invalid; |
||||||
|
" |
||||||
|
tal:omit-tag=""> |
||||||
|
<input type="password" name="${name}" value="${cstruct}" |
||||||
|
tal:attributes="class string: form-control ${css_class or ''} ${'is-invalid' if is_invalid else ''} ${'is-valid' if is_valid else ''}; |
||||||
|
style style; |
||||||
|
required required" |
||||||
|
id="${oid}"/> |
||||||
|
</span> |
@ -0,0 +1,18 @@ |
|||||||
|
<span tal:define="name name|field.name; |
||||||
|
css_class css_class|field.widget.css_class; |
||||||
|
oid oid|field.oid; |
||||||
|
required required|'required' if field.required else None; |
||||||
|
mask mask|field.widget.mask; |
||||||
|
mask_placeholder mask_placeholder|field.widget.mask_placeholder; |
||||||
|
style style|field.widget.style; |
||||||
|
was_validated True if field.get_root().error else False; |
||||||
|
is_invalid is_invalid|field.error and not field.widget.hidden and not field.typ.__class__.__name__=='Mapping'; |
||||||
|
is_valid was_validated and not is_invalid; |
||||||
|
" |
||||||
|
tal:omit-tag=""> |
||||||
|
<input type="text" name="${name}" value="${cstruct}" |
||||||
|
tal:attributes="class string: form-control ${css_class or ''} ${'is-invalid' if is_invalid else ''} ${'is-valid' if is_valid else ''}; |
||||||
|
style style; |
||||||
|
required required" |
||||||
|
id="${oid}"/> |
||||||
|
</span> |
@ -0,0 +1,14 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block title %} Ordr | Error {% endblock title %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-8"> |
||||||
|
<h1 class="mt-3">An Error has occured</h1> |
||||||
|
<p class="mt-4">The page you are looking for could not be found</p> |
||||||
|
<small class="text-secondary">404 - Page not found</small> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
||||||
|
|
@ -0,0 +1,14 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block title %} Ordr | Error {% endblock title %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="row justify-content-md-center mt-3"> |
||||||
|
<div class="col-8"> |
||||||
|
<h1 class="mt-3">An Error has occured</h1> |
||||||
|
<p class="mt-4">The link you've clicked has expired.</p> |
||||||
|
<small class="text-secondary">410 - Gone</small> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
||||||
|
|
@ -0,0 +1,82 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="{{request.locale_name}}"> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> |
||||||
|
<meta name="description" content="ordr"> |
||||||
|
<meta name="author" content="IMTEk / CPI / Holger Frey"> |
||||||
|
<link rel="shortcut icon" href="{{request.static_url('ordr:static/pyramid-16x16.png')}}"> |
||||||
|
|
||||||
|
<title>{% block title %} Ordr {% endblock title %}</title> |
||||||
|
|
||||||
|
<!-- Bootstrap core CSS --> |
||||||
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous"> |
||||||
|
|
||||||
|
<!-- Deform form renderin gcss --> |
||||||
|
{# <link rel="stylesheet" href="{{request.static_url('deform:static/css/form.css')}}" type="text/css" media="screen" /> #} |
||||||
|
|
||||||
|
<!-- Custom styles for this scaffold --> |
||||||
|
<link href="{{request.static_url('ordr:static/style.css')}}" rel="stylesheet"> |
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
<nav class="navbar navbar-dark bg-dark navbar-expand-sm"> |
||||||
|
<a class="navbar-brand text-primary" href="{{ request.resource_url(request.root) }}"><strong>ordr</strong></a> |
||||||
|
{% if not request.user %} |
||||||
|
<ul class="navbar-nav mr-auto"> |
||||||
|
<li class="nav-item {% if context.nav_active=='welcome' and request.view_name=='login' %}active{% endif %}"> |
||||||
|
<a href="{{ request.resource_url(request.root) }}" class="nav-link">Welcome</a> |
||||||
|
</li> |
||||||
|
<li class="nav-item {% if context.nav_active=='welcome' and request.view_name=='faq' %}active{% endif %}"> |
||||||
|
<a href="{{ request.resource_url(request.root, 'faq') }}" class="nav-link">FAQs</a> |
||||||
|
</li> |
||||||
|
<li class="nav-item {% if context.nav_active=='registration' %}active{% endif %}"> |
||||||
|
<a href="{{ request.resource_url(request.root, 'account', 'register') }}" class="nav-link">Register</a> |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
{% else %} |
||||||
|
<ul class="navbar-nav mr-auto"> |
||||||
|
<li class="nav-item {% if context.nav_active=='orders' %}active{% endif %}"> |
||||||
|
<a href="{{ request.resource_url(request.root, 'orders') }}" class="nav-link">Orders</a> |
||||||
|
</li> |
||||||
|
<li class="nav-item {% if context.nav_active=='welcome' and request.view_name=='faq' %}active{% endif %}"> |
||||||
|
<a href="{{ request.resource_url(request.root, 'faq') }}" class="nav-link">FAQs</a> |
||||||
|
</li> |
||||||
|
{% if 'role:admin' in request.user.principals %} |
||||||
|
<li class="nav-item {% if context.nav_active=='admin' %}active{% endif %}"> |
||||||
|
<a href="{{ request.resource_url(request.root, 'admin') }}" class="nav-link">Admin</a> |
||||||
|
</li> |
||||||
|
{% endif %} |
||||||
|
</ul> |
||||||
|
<ul class="navbar-nav"> |
||||||
|
<li class="nav-item dropdown"> |
||||||
|
<a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" > |
||||||
|
{{ request.user }} |
||||||
|
</a> |
||||||
|
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="userDropdown"> |
||||||
|
<a class="dropdown-item" href="{{ request.resource_url(request.root, 'account', 'logout') }}">Logout</a> |
||||||
|
<div class="dropdown-divider"></div> |
||||||
|
<a class="dropdown-item small" href="{{ request.resource_url(request.root, 'account', 'settings') }}">Settings</a> |
||||||
|
<a class="dropdown-item small" href="{{ request.resource_url(request.root, 'account', 'password') }}">Change Password</a> |
||||||
|
</div> |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
{% endif %} |
||||||
|
</nav> |
||||||
|
<div class="container-fluid content"> |
||||||
|
{% block content %} |
||||||
|
<p>No content</p> |
||||||
|
{% endblock content %} |
||||||
|
</div> |
||||||
|
|
||||||
|
<!-- Bootstrap core JavaScript |
||||||
|
================================================== --> |
||||||
|
<!-- Placed at the end of the document so the pages load faster --> |
||||||
|
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> |
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> |
||||||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> |
||||||
|
<script src="{{request.static_url('ordr:static/scripts.js')}}"></script> |
||||||
|
</body> |
||||||
|
|
||||||
|
</html> |
@ -0,0 +1,8 @@ |
|||||||
|
{% extends "ordr:templates/layout.jinja2" %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
<div class="content"> |
||||||
|
<h1>FAQ</h1> |
||||||
|
<p class="lead">Welcome to <span class="font-normal">Ordr</span>, a Pyramid application generated by<br><span class="font-normal">Cookiecutter</span>.</p> |
||||||
|
</div> |
||||||
|
{% endblock content %} |
@ -1,15 +1,14 @@ |
|||||||
''' views (sub) package ''' |
''' views (sub) package for ordr ''' |
||||||
|
|
||||||
|
|
||||||
def includeme(config): |
def includeme(config): # pragma: no cover |
||||||
''' |
''' |
||||||
Initialize the resources for traversal in a Pyramid app. |
Initialize the views in a Pyramid app. |
||||||
|
|
||||||
Activate this setup using ``config.include('ordr2.views')``. |
Activate this setup using ``config.include('ordr2.views')``. |
||||||
|
|
||||||
''' |
''' |
||||||
settings = config.get_settings() |
settings = config.get_settings() |
||||||
age = int(settings.get('static_views.cache_max_age', 3600)) |
age = int(settings.get('static_views.cache_max_age', 3600)) |
||||||
|
|
||||||
config.add_static_view('static', 'ordr2:static', cache_max_age=age) |
config.add_static_view('static', 'ordr:static', cache_max_age=age) |
||||||
config.add_static_view('deform', 'deform:static', cache_max_age=age) |
config.add_static_view('deform', 'deform:static', cache_max_age=age) |
@ -0,0 +1,402 @@ |
|||||||
|
''' views for user accounts |
||||||
|
|
||||||
|
This includes login, logout, registration, forgotten passwords, changing |
||||||
|
settings and passwords |
||||||
|
''' |
||||||
|
|
||||||
|
import deform |
||||||
|
|
||||||
|
from pyramid.httpexceptions import HTTPFound |
||||||
|
from pyramid.security import remember, forget |
||||||
|
from pyramid.view import view_config |
||||||
|
from sqlalchemy import func, or_ |
||||||
|
|
||||||
|
|
||||||
|
from ordr.events import ( |
||||||
|
ChangeEmailNotification, |
||||||
|
PasswordResetNotification, |
||||||
|
RegistrationNotification |
||||||
|
) |
||||||
|
from ordr.models.account import Role, TokenSubject, User |
||||||
|
|
||||||
|
|
||||||
|
# account resource root |
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.AccountResource', |
||||||
|
permission='view' |
||||||
|
) |
||||||
|
def account(context, request): |
||||||
|
''' redirect if '/account' was requested directly ''' |
||||||
|
return HTTPFound(request.resource_url(request.root)) |
||||||
|
|
||||||
|
|
||||||
|
# login and logout |
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.AccountResource', |
||||||
|
name='login', |
||||||
|
request_method='GET', |
||||||
|
permission='login', |
||||||
|
renderer='ordr:templates/account/login.jinja2', |
||||||
|
) |
||||||
|
def login(context, request): |
||||||
|
''' shows the login page ''' |
||||||
|
context.nav_active = 'welcome' |
||||||
|
return {'loginerror': False} |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.AccountResource', |
||||||
|
name='login', |
||||||
|
request_method='POST', |
||||||
|
permission='login', |
||||||
|
renderer='ordr:templates/account/login.jinja2', |
||||||
|
) |
||||||
|
def check_login(context, request): |
||||||
|
''' check user credentials ''' |
||||||
|
username = request.POST.get('username') |
||||||
|
password = request.POST.get('password') |
||||||
|
user = ( |
||||||
|
request.dbsession |
||||||
|
.query(User) |
||||||
|
.filter_by(username=username) |
||||||
|
.first() |
||||||
|
) |
||||||
|
|
||||||
|
if user and user.is_active and user.check_password(password): |
||||||
|
headers = remember(request, user.id) |
||||||
|
return HTTPFound(request.resource_url(request.root), headers=headers) |
||||||
|
|
||||||
|
context.nav_active = 'welcome' |
||||||
|
return {'loginerror': True} |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.AccountResource', |
||||||
|
name='logout', |
||||||
|
permission='logout' |
||||||
|
) |
||||||
|
def logout(context, request): |
||||||
|
''' log out of an user ''' |
||||||
|
headers = forget(request) |
||||||
|
return HTTPFound(request.resource_url(request.root), headers=headers) |
||||||
|
|
||||||
|
|
||||||
|
# registration process |
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.RegistrationResource', |
||||||
|
permission='register', |
||||||
|
request_method='GET', |
||||||
|
renderer='ordr:templates/account/registration_form.jinja2' |
||||||
|
) |
||||||
|
def registration_form(context, request): |
||||||
|
''' show registration form ''' |
||||||
|
form = context.get_registration_form() |
||||||
|
return {'form': form} |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.RegistrationResource', |
||||||
|
permission='register', |
||||||
|
request_method='POST', |
||||||
|
renderer='ordr:templates/account/registration_form.jinja2' |
||||||
|
) |
||||||
|
def registration_form_processing(context, request): |
||||||
|
''' process registration form ''' |
||||||
|
if 'create' not in request.POST: |
||||||
|
return HTTPFound(request.resource_url(request.root)) |
||||||
|
|
||||||
|
form = context.get_registration_form() |
||||||
|
data = request.POST.items() |
||||||
|
try: |
||||||
|
appstruct = form.validate(data) |
||||||
|
except deform.ValidationFailure as e: |
||||||
|
return {'form': form} |
||||||
|
|
||||||
|
# form validation successfull, create user |
||||||
|
account = User( |
||||||
|
username=appstruct['username'], |
||||||
|
first_name=appstruct['first_name'], |
||||||
|
last_name=appstruct['last_name'], |
||||||
|
email=appstruct['email'], |
||||||
|
role=Role.UNVALIDATED |
||||||
|
) |
||||||
|
account.set_password(appstruct['password']) |
||||||
|
request.dbsession.add(account) |
||||||
|
|
||||||
|
# create a verify-new-account token and send email |
||||||
|
token = account.issue_token(request, TokenSubject.REGISTRATION) |
||||||
|
notification = RegistrationNotification(request, account, {'token': token}) |
||||||
|
request.registry.notify(notification) |
||||||
|
|
||||||
|
return HTTPFound(request.resource_url(context, 'verify')) |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.RegistrationResource', |
||||||
|
name='verify', |
||||||
|
permission='register', |
||||||
|
request_method='GET', |
||||||
|
renderer='ordr:templates/account/registration_verify.jinja2' |
||||||
|
) |
||||||
|
def registration_verify_email(context, request): |
||||||
|
''' show email verification text ''' |
||||||
|
return {} |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.RegistrationTokenResource', |
||||||
|
permission='register', |
||||||
|
request_method='GET', |
||||||
|
renderer='ordr:templates/account/registration_completed.jinja2' |
||||||
|
) |
||||||
|
def registration_completed(context, request): |
||||||
|
''' registration is completed, awaiting activation by admin ''' |
||||||
|
token = context.model |
||||||
|
account = token.owner |
||||||
|
account.role = Role.NEW |
||||||
|
request.dbsession.delete(token) |
||||||
|
return {} |
||||||
|
|
||||||
|
|
||||||
|
# forgotten password process |
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.PasswordResetResource', |
||||||
|
permission='reset', |
||||||
|
request_method='GET', |
||||||
|
renderer='ordr:templates/account/forgotten_password_form.jinja2' |
||||||
|
) |
||||||
|
def forgotten_password_form(context, request): |
||||||
|
''' show forgotten password form ''' |
||||||
|
return {'formerror': False} |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.PasswordResetResource', |
||||||
|
permission='reset', |
||||||
|
request_method='POST', |
||||||
|
renderer='ordr:templates/account/forgotten_password_form.jinja2' |
||||||
|
) |
||||||
|
def forgotten_password_form_processing(context, request): |
||||||
|
''' process forgotten password form ''' |
||||||
|
if 'cancel' in request.POST: |
||||||
|
return HTTPFound(request.resource_url(request.root)) |
||||||
|
identifier = request.POST.get('identifier', '') |
||||||
|
account = ( |
||||||
|
request.dbsession |
||||||
|
.query(User) |
||||||
|
.filter(or_( |
||||||
|
func.lower(User.username) == identifier.lower(), |
||||||
|
func.lower(User.email) == identifier.lower() |
||||||
|
)) |
||||||
|
.first() |
||||||
|
) |
||||||
|
if account is None or not account.is_active: |
||||||
|
return {'formerror': True} |
||||||
|
|
||||||
|
# create a verify-new-account token and send email |
||||||
|
token = account.issue_token(request, TokenSubject.RESET_PASSWORD) |
||||||
|
notification = PasswordResetNotification( |
||||||
|
request, |
||||||
|
account, |
||||||
|
{'token': token} |
||||||
|
) |
||||||
|
request.registry.notify(notification) |
||||||
|
|
||||||
|
return HTTPFound(request.resource_url(context, 'verify')) |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.PasswordResetResource', |
||||||
|
name='verify', |
||||||
|
permission='reset', |
||||||
|
request_method='GET', |
||||||
|
renderer='ordr:templates/account/forgotten_password_verify.jinja2' |
||||||
|
) |
||||||
|
def forgotten_password_verify_email(context, request): |
||||||
|
''' show email verification text ''' |
||||||
|
return {} |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.PasswordResetResource', |
||||||
|
name='completed', |
||||||
|
permission='reset', |
||||||
|
request_method='GET', |
||||||
|
renderer='ordr:templates/account/forgotten_password_completed.jinja2' |
||||||
|
) |
||||||
|
def forgotten_password_completed(context, request): |
||||||
|
''' user is verified, process reset password form ''' |
||||||
|
return {} |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.PasswordResetTokenResource', |
||||||
|
permission='reset', |
||||||
|
request_method='GET', |
||||||
|
renderer='ordr:templates/account/forgotten_password_reset.jinja2' |
||||||
|
) |
||||||
|
def reset_password_form(context, request): |
||||||
|
''' user is verified, show reset password form ''' |
||||||
|
form = context.get_reset_form() |
||||||
|
return {'form': form} |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.PasswordResetTokenResource', |
||||||
|
permission='reset', |
||||||
|
request_method='POST', |
||||||
|
renderer='ordr:templates/account/forgotten_password_reset.jinja2' |
||||||
|
) |
||||||
|
def reset_password_form_processing(context, request): |
||||||
|
''' process the password reset form ''' |
||||||
|
if 'change' not in request.POST: |
||||||
|
return HTTPFound(request.resource_url(request.root)) |
||||||
|
|
||||||
|
form = context.get_reset_form() |
||||||
|
data = request.POST.items() |
||||||
|
try: |
||||||
|
appstruct = form.validate(data) |
||||||
|
except deform.ValidationFailure as e: |
||||||
|
return {'form': form} |
||||||
|
|
||||||
|
# set new password |
||||||
|
token = context.model |
||||||
|
account = token.owner |
||||||
|
account.set_password(appstruct['password']) |
||||||
|
request.dbsession.delete(token) |
||||||
|
|
||||||
|
return HTTPFound(request.resource_url(context.__parent__, 'completed')) |
||||||
|
|
||||||
|
|
||||||
|
# account settings |
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.AccountResource', |
||||||
|
permission='edit', |
||||||
|
name='settings', |
||||||
|
request_method='GET', |
||||||
|
renderer='ordr:templates/account/settings_form.jinja2' |
||||||
|
) |
||||||
|
def settings_form(context, request): |
||||||
|
''' show the settings form ''' |
||||||
|
prefill = { |
||||||
|
'username': request.user.username, |
||||||
|
'first_name': request.user.first_name, |
||||||
|
'last_name': request.user.last_name, |
||||||
|
'email': request.user.email, |
||||||
|
} |
||||||
|
form = context.get_settings_form(prefill=prefill) |
||||||
|
return {'form': form} |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.AccountResource', |
||||||
|
permission='edit', |
||||||
|
name='settings', |
||||||
|
request_method='POST', |
||||||
|
renderer='ordr:templates/account/settings_form.jinja2' |
||||||
|
) |
||||||
|
def settings_form_processing(context, request): |
||||||
|
''' process the settings form ''' |
||||||
|
if 'change' not in request.POST: |
||||||
|
return HTTPFound(request.resource_url(request.root)) |
||||||
|
|
||||||
|
form = context.get_settings_form() |
||||||
|
data = request.POST.items() |
||||||
|
try: |
||||||
|
appstruct = form.validate(data) |
||||||
|
except deform.ValidationFailure as e: |
||||||
|
return {'form': form} |
||||||
|
|
||||||
|
# form validation successfull, change user |
||||||
|
request.user.first_name = appstruct['first_name'] |
||||||
|
request.user.last_name = appstruct['last_name'] |
||||||
|
|
||||||
|
if appstruct['email'] == request.user.email: |
||||||
|
# email was not changed |
||||||
|
return HTTPFound(request.resource_url(request.root)) |
||||||
|
|
||||||
|
# create a verify-new-email token and send email |
||||||
|
token = request.user.issue_token( |
||||||
|
request, |
||||||
|
TokenSubject.CHANGE_EMAIL, |
||||||
|
payload={'email': appstruct['email']} |
||||||
|
) |
||||||
|
notification = ChangeEmailNotification( |
||||||
|
request, |
||||||
|
account, |
||||||
|
{'token': token}, |
||||||
|
send_to=appstruct['email'] |
||||||
|
) |
||||||
|
request.registry.notify(notification) |
||||||
|
|
||||||
|
return HTTPFound(request.resource_url(context, 'verify')) |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.ChangeEmailTokenResource', |
||||||
|
permission='edit', |
||||||
|
request_method='GET', |
||||||
|
renderer='ordr:templates/account/settings_mail_changed.jinja2' |
||||||
|
) |
||||||
|
def verify_email_change(context, request): |
||||||
|
''' show email verification text ''' |
||||||
|
payload = context.model.payload |
||||||
|
request.user.email = payload['email'] |
||||||
|
request.dbsession.delete(context.model) |
||||||
|
return {} |
||||||
|
|
||||||
|
|
||||||
|
# change password |
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.AccountResource', |
||||||
|
permission='edit', |
||||||
|
name='password', |
||||||
|
request_method='GET', |
||||||
|
renderer='ordr:templates/account/password_form.jinja2' |
||||||
|
) |
||||||
|
def password_form(context, request): |
||||||
|
''' show the change password form ''' |
||||||
|
form = context.get_password_form() |
||||||
|
return {'form': form} |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.AccountResource', |
||||||
|
permission='edit', |
||||||
|
name='password', |
||||||
|
request_method='POST', |
||||||
|
renderer='ordr:templates/account/password_form.jinja2' |
||||||
|
) |
||||||
|
def password_form_processing(context, request): |
||||||
|
''' process the change password form ''' |
||||||
|
if 'change' not in request.POST: |
||||||
|
return HTTPFound(request.resource_url(request.root)) |
||||||
|
|
||||||
|
form = context.get_password_form() |
||||||
|
data = request.POST.items() |
||||||
|
try: |
||||||
|
appstruct = form.validate(data) |
||||||
|
except deform.ValidationFailure as e: |
||||||
|
return {'form': form} |
||||||
|
|
||||||
|
# form validation successfull, change the password |
||||||
|
request.user.set_password(appstruct['password']) |
||||||
|
return HTTPFound(request.resource_url(context, 'changed')) |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.account.AccountResource', |
||||||
|
permission='edit', |
||||||
|
name='changed', |
||||||
|
request_method='GET', |
||||||
|
renderer='ordr:templates/account/password_changed.jinja2' |
||||||
|
) |
||||||
|
def password_changed(context, request): |
||||||
|
''' the password changed message ''' |
||||||
|
return {} |
@ -0,0 +1,22 @@ |
|||||||
|
from pyramid.view import notfound_view_config, view_config |
||||||
|
|
||||||
|
from ordr.models.account import TokenExpired |
||||||
|
|
||||||
|
|
||||||
|
@notfound_view_config( |
||||||
|
renderer='ordr:templates/errors/404_file_not_found.jinja2' |
||||||
|
) |
||||||
|
def notfound_view(context, request): |
||||||
|
''' display a file not found page ''' |
||||||
|
request.response.status = 404 |
||||||
|
return {} |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context=TokenExpired, |
||||||
|
renderer='ordr:templates/errors/410_token_expiry.jinja2' |
||||||
|
) |
||||||
|
def token_expired(context, request): |
||||||
|
''' display page describing expired token ''' |
||||||
|
request.response.status = 410 |
||||||
|
return {} |
@ -0,0 +1,26 @@ |
|||||||
|
from pyramid.httpexceptions import HTTPFound |
||||||
|
from pyramid.view import view_config |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.RootResource', |
||||||
|
permission='view', |
||||||
|
) |
||||||
|
def welcome(context, request): |
||||||
|
''' web root redirects ''' |
||||||
|
if request.user: |
||||||
|
redirect_to = request.resource_url(context, 'orders') |
||||||
|
else: |
||||||
|
redirect_to = request.resource_url(context, 'account', 'login') |
||||||
|
return HTTPFound(redirect_to) |
||||||
|
|
||||||
|
|
||||||
|
@view_config( |
||||||
|
context='ordr.resources.RootResource', |
||||||
|
name='faq', |
||||||
|
permission='view', |
||||||
|
renderer='ordr:templates/pages/faq.jinja2' |
||||||
|
) |
||||||
|
def faq(context, request): |
||||||
|
''' displays the FAQ page ''' |
||||||
|
return {} |
@ -1,103 +0,0 @@ |
|||||||
''' Resources for account registraion and settings ''' |
|
||||||
|
|
||||||
from datetime import datetime |
|
||||||
from pyramid.security import Allow, Authenticated, Everyone, Deny, DENY_ALL |
|
||||||
|
|
||||||
from ordr2.models.account import Token, TokenSubject |
|
||||||
from ordr2.resources.base import BaseResource |
|
||||||
|
|
||||||
|
|
||||||
class RegistrationToken(BaseResource): |
|
||||||
''' representing :class:`ordr2.models.account.Token` for registration ''' |
|
||||||
|
|
||||||
def __acl__(self): |
|
||||||
''' access controll list for the resource ''' |
|
||||||
return [ |
|
||||||
(Deny, Authenticated, 'register'), |
|
||||||
(Allow, Everyone, 'register'), |
|
||||||
DENY_ALL |
|
||||||
] |
|
||||||
|
|
||||||
|
|
||||||
class EmailVerificationToken(BaseResource): |
|
||||||
''' representing :class:`ordr2.models.account.Token` for email change ''' |
|
||||||
|
|
||||||
def __acl__(self): |
|
||||||
''' access controll list for the resource |
|
||||||
|
|
||||||
a logged in user might only access his own tokens |
|
||||||
''' |
|
||||||
# self.model is a :class:`ordr2.models.account.Token` instance |
|
||||||
return [ |
|
||||||
(Allow, self.model.owner.principal, 'settings'), |
|
||||||
DENY_ALL |
|
||||||
] |
|
||||||
|
|
||||||
|
|
||||||
class ForgottenPasswordToken(BaseResource): |
|
||||||
''' representing :class:`ordr2.models.account.Token` for password reset ''' |
|
||||||
|
|
||||||
def __acl__(self): |
|
||||||
''' access controll list for the resource ''' |
|
||||||
return [ |
|
||||||
(Allow, Everyone, 'reset password'), |
|
||||||
DENY_ALL |
|
||||||
] |
|
||||||
|
|
||||||
|
|
||||||
class AccountResource(BaseResource): |
|
||||||
''' Resouce class for account registration and settings ''' |
|
||||||
|
|
||||||
#: name of the main navigation section for template highlighting |
|
||||||
nav_section = 'account' |
|
||||||
|
|
||||||
#: mapping token subjects to token resouce classes |
|
||||||
token_resources = { |
|
||||||
TokenSubject.USER_REGISTRATION: RegistrationToken, |
|
||||||
TokenSubject.CHANGE_EMAIL: EmailVerificationToken, |
|
||||||
TokenSubject.RESET_PASSWORD: ForgottenPasswordToken |
|
||||||
} |
|
||||||
|
|
||||||
def __init__(self, name, parent, model=None): |
|
||||||
''' Create a base resource ''' |
|
||||||
# the current model is the current logged in user or None |
|
||||||
super().__init__(name, parent, parent.request.user) |
|
||||||
|
|
||||||
def __acl__(self): |
|
||||||
''' access controll list for the resource |
|
||||||
|
|
||||||
- everyone can log in our log out |
|
||||||
- authenticated users can change their settings |
|
||||||
- unauthenticated users can register |
|
||||||
|
|
||||||
''' |
|
||||||
return [ |
|
||||||
(Allow, Everyone, 'login'), |
|
||||||
(Allow, Everyone, 'logout'), |
|
||||||
(Deny, Authenticated, 'register'), |
|
||||||
(Allow, Everyone, 'register'), |
|
||||||
(Allow, Everyone, 'reset password'), |
|
||||||
(Allow, Authenticated, 'settings'), |
|
||||||
DENY_ALL |
|
||||||
] |
|
||||||
|
|
||||||
def __getitem__(self, key): |
|
||||||
''' provides the dict like interface to access child resources |
|
||||||
|
|
||||||
:param str key: |
|
||||||
token hash or path segment for a child resource |
|
||||||
:rtype: |
|
||||||
subclass of ordr2.resources.base.BaseResource |
|
||||||
:raises: |
|
||||||
KeyError if token hash or path segment is not found |
|
||||||
''' |
|
||||||
token = self.request.dbsession.query(Token).filter_by(hash=key).first() |
|
||||||
if token is None: |
|
||||||
# no token found, search for child node |
|
||||||
return super().__getitem__(key) |
|
||||||
elif token.expires < datetime.utcnow(): |
|
||||||
# token has expired, delete it |
|
||||||
self.request.dbsession.delete(token) |
|
||||||
raise KeyError(f'Token {key} has expired on {token.expires}') |
|
||||||
resource_class = self.token_resources[token.subject] |
|
||||||
return resource_class(key, self, model=token) |
|
@ -1,412 +0,0 @@ |
|||||||
''' Base resource classes ''' |
|
||||||
|
|
||||||
from sqlalchemy import asc, desc |
|
||||||
|
|
||||||
|
|
||||||
class BaseResource(object): |
|
||||||
''' Base resouce class for location aware resources |
|
||||||
|
|
||||||
:param str name: |
|
||||||
url path segment that identifies this resource in its lineage |
|
||||||
:param parent: |
|
||||||
parent resource |
|
||||||
:type parent: |
|
||||||
ordr2.resources.BaseResource |
|
||||||
:param model: |
|
||||||
(optional) a model instance represented by this resource, |
|
||||||
e.g. a database entry |
|
||||||
|
|
||||||
Provides a dict like interface for retrieving child resources used by |
|
||||||
traversal style routing in the Pyramid web framework. |
|
||||||
|
|
||||||
The ``nodes`` property is a dictionary to to match the next url path |
|
||||||
segment in traversal to a child class. |
|
||||||
For example: to return an AccountResouce when the next path segment is |
|
||||||
'account' use ``nodes = {'account': AccountResource}``. |
|
||||||
|
|
||||||
''' |
|
||||||
|
|
||||||
# __name__ and __parent__ properties for location aware resources |
|
||||||
__name__ = None |
|
||||||
__parent__ = None |
|
||||||
|
|
||||||
#: name of the main navigation section for template highlighting |
|
||||||
nav_section = None |
|
||||||
|
|
||||||
#: dict to match the next url path segment |
|
||||||
nodes = {} |
|
||||||
|
|
||||||
def __init__(self, name, parent, model=None): |
|
||||||
''' Create a base resource ''' |
|
||||||
self.__name__ = name |
|
||||||
self.__parent__ = parent |
|
||||||
self.request = parent.request #: the current request |
|
||||||
self.model = model #: a related model instance |
|
||||||
|
|
||||||
def __acl__(self): |
|
||||||
''' access controll list for the resource ''' |
|
||||||
raise NotImplementedError |
|
||||||
|
|
||||||
def __getitem__(self, key): |
|
||||||
''' provides the dict like interface to access child resources |
|
||||||
|
|
||||||
:param str key: |
|
||||||
path segment for a child resource |
|
||||||
:rtype: |
|
||||||
subclass of ordr2.resources.base.BaseResource |
|
||||||
:raises: |
|
||||||
KeyError if path segment is not found |
|
||||||
''' |
|
||||||
node_class = self.nodes[key] |
|
||||||
return node_class(key, self) |
|
||||||
|
|
||||||
|
|
||||||
class Pagination(object): |
|
||||||
''' calculates pagination information |
|
||||||
|
|
||||||
:param int current: current page number |
|
||||||
:param int count: total number of items |
|
||||||
:param int items: number of items displayed per pages |
|
||||||
:param int window_size: |
|
||||||
size of pagination window |
|
||||||
lets assume the current page is 10 and window size is 7 |
|
||||||
self.window = [7, 8, 9, 10, 11, 12, 13] |
|
||||||
''' |
|
||||||
|
|
||||||
def __init__(self, current, count, items, window_size): |
|
||||||
''' calculates pagination information |
|
||||||
|
|
||||||
:param int current: current page number |
|
||||||
:param int count: total number of items |
|
||||||
:param int items: number of items displayed per pages |
|
||||||
:param int window_size: |
|
||||||
size of pagination window |
|
||||||
lets assume the current page is 10 and window size is 7 |
|
||||||
self.window = [7, 8, 9, 10, 11, 12, 13] |
|
||||||
''' |
|
||||||
|
|
||||||
self.count = count #: total number of items |
|
||||||
self.items_per_page = items #: items displayed per page |
|
||||||
self.first = None #: number of first page |
|
||||||
self.current = None #: number of current (displayed) page |
|
||||||
self.last = None #: number of last page |
|
||||||
self.previous = None #: number of previous page |
|
||||||
self.next = None #: number of next page |
|
||||||
self.window = [] #: page window |
|
||||||
|
|
||||||
if count > 0: |
|
||||||
# only do the calculation if there are items to be paginated |
|
||||||
self.calculate(current, window_size) |
|
||||||
|
|
||||||
def calculate(self, current, window_size): |
|
||||||
# calculate number of pages |
|
||||||
pages = (self.count - 1) // self.items_per_page + 1 |
|
||||||
|
|
||||||
# set the number of the first and last page |
|
||||||
self.first = 1 |
|
||||||
self.last = max(self.first, pages) |
|
||||||
|
|
||||||
# set current, previous and next page |
|
||||||
self.current = self.is_valid(current, default=self.first) |
|
||||||
self.previous = self.is_valid(self.current - 1) |
|
||||||
self.next = self.is_valid(self.current + 1) |
|
||||||
|
|
||||||
# window calculations |
|
||||||
# example: lets assume the current page is 10 and window size is 7 |
|
||||||
# self.window = [7, 8, 9, 10, 11, 12, 13] |
|
||||||
half_window = window_size // 2 |
|
||||||
start = self.current - half_window |
|
||||||
end = self.current + half_window |
|
||||||
calculated_window = range(start, end + 1) |
|
||||||
self.window = [p for p in calculated_window if self.is_valid(p)] |
|
||||||
|
|
||||||
def is_valid(self, page, default=None): |
|
||||||
''' checks if the given page is valid, returns default if not |
|
||||||
|
|
||||||
:param int page: the page number to test |
|
||||||
:param default: the value to return if the test fails |
|
||||||
''' |
|
||||||
if self.count and (self.first <= page <= self.last): |
|
||||||
return page |
|
||||||
return default |
|
||||||
|
|
||||||
|
|
||||||
class BaseListResource(BaseResource): |
|
||||||
''' Base resorce class for listings of other resources |
|
||||||
|
|
||||||
The BaseListResource represents a view to a list of resources, like |
|
||||||
products, users, etc. This includes pagination, sorting and filtering of |
|
||||||
the resources. |
|
||||||
|
|
||||||
Inherited classes must at least set one parameter and implement three |
|
||||||
mehtods: |
|
||||||
- ``child_resource_class`` |
|
||||||
- ``set_base_query()`` |
|
||||||
The base query is used for basic filtering that should be applied in |
|
||||||
all cases; for example to filter out any products that are not in stock |
|
||||||
or ariticles in draft mode. This query is also used when traversing |
|
||||||
to child resources |
|
||||||
- ``set_filtered_query()`` |
|
||||||
The filtered query extends the base query and applies filters for a |
|
||||||
specific view, like show only blue cheeses. This query is used for |
|
||||||
calulating pagination and sorting is applied when listing child |
|
||||||
resources. |
|
||||||
- ``get_sort_by_field(sort_by)`` |
|
||||||
add a sorting instruction to the query |
|
||||||
|
|
||||||
''' |
|
||||||
|
|
||||||
#: GET key for page number |
|
||||||
get_key_page = 'p' |
|
||||||
|
|
||||||
#: GET key for items per page |
|
||||||
get_key_items_per_page = 'n' |
|
||||||
|
|
||||||
#: GET key for order by column |
|
||||||
get_key_sort_by = 'o' |
|
||||||
|
|
||||||
#: GET key for order by direction |
|
||||||
get_key_sort_dir = 'd' |
|
||||||
|
|
||||||
#: default items per page |
|
||||||
default_items_per_page = 12 |
|
||||||
|
|
||||||
#: default size of pagination window |
|
||||||
default_window_size = 7 |
|
||||||
|
|
||||||
#: default sort direction |
|
||||||
default_sort_dir = 'asc' |
|
||||||
|
|
||||||
#: default sort by |
|
||||||
default_sort_by = None |
|
||||||
|
|
||||||
#: class of child resources |
|
||||||
child_resource_class = None |
|
||||||
|
|
||||||
def __init__(self, name, parent): |
|
||||||
''' Instance creation ''' |
|
||||||
super().__init__(name, parent) |
|
||||||
|
|
||||||
self.base_query = None #: base database query |
|
||||||
self.filtered_query = None #: database query with reuest filters |
|
||||||
self.filters = {} #: applied view filters |
|
||||||
self.sort_by = None #: applied sorting filed |
|
||||||
self.sort_dir = None #: applied sorting direction |
|
||||||
self.pages = None #: pagination info |
|
||||||
|
|
||||||
self.set_base_query() |
|
||||||
self.set_filtered_query() |
|
||||||
self.calculate_pagination() |
|
||||||
|
|
||||||
def set_base_query(self): |
|
||||||
''' setup of the basic database query |
|
||||||
|
|
||||||
The base query is used for basic filtering that should be applied in |
|
||||||
all cases; for example to filter out any products that are not in stock |
|
||||||
or ariticles in draft mode. This query is also used when traversing |
|
||||||
to child resources |
|
||||||
|
|
||||||
This method must be implemented in a inherited class:: |
|
||||||
|
|
||||||
def set_base_query(self): |
|
||||||
self.base_query = ( |
|
||||||
self.request.dbsession |
|
||||||
.query(Cheeses) |
|
||||||
.filter_by(in_stock==True) |
|
||||||
) |
|
||||||
''' |
|
||||||
raise NotImplementedError |
|
||||||
|
|
||||||
def set_filtered_query(self): |
|
||||||
''' setup of the database query for a specific view |
|
||||||
|
|
||||||
the filtered query extends the base query and applies filters for a |
|
||||||
specific view, like show only blue cheeses. This query is used for |
|
||||||
calulating pagination and sorting is applied when listing child |
|
||||||
resources. |
|
||||||
|
|
||||||
This method must be implemented in a inherited class:: |
|
||||||
|
|
||||||
def set_filtered_query(self): |
|
||||||
query = self.base_query |
|
||||||
# filter by type of cheese |
|
||||||
query = self._filter_by('type', Cheese.type, query) |
|
||||||
query = self._filter_by('age', Cheeses.age, query) |
|
||||||
self.filtered_query = query |
|
||||||
|
|
||||||
''' |
|
||||||
raise NotImplementedError |
|
||||||
|
|
||||||
def get_sort_by_field(self, sort_by): |
|
||||||
''' returns the SQLalchemy model field to sort by |
|
||||||
|
|
||||||
:param str sort_by: |
|
||||||
a lowercase identifier for the field to sort by |
|
||||||
:returns: |
|
||||||
SQLalchemy model field or None |
|
||||||
|
|
||||||
This method must be implemented in a inherited class:: |
|
||||||
|
|
||||||
def get_sort_by_field(self, sort_by): |
|
||||||
if sort_by == 'type': |
|
||||||
return Cheese.type |
|
||||||
''' |
|
||||||
raise NotImplementedError |
|
||||||
|
|
||||||
def _filter_by(self, get_key, model_field, query): |
|
||||||
''' helper method to appyl a simple filter to a query |
|
||||||
|
|
||||||
it also records the filters applied to the view query in `self.filters` |
|
||||||
|
|
||||||
:param str get_key: |
|
||||||
name of the GET key to query |
|
||||||
:param model_field: |
|
||||||
field of SQLalchemy model the filter should be applied on |
|
||||||
:param query: |
|
||||||
SQLalchemy query object |
|
||||||
:returns: |
|
||||||
SQLalchemy query object with applied filter |
|
||||||
''' |
|
||||||
filter_value = self.request.GET.get(get_key, None) |
|
||||||
if filter_value: |
|
||||||
query = query.filter_by(model_field=filter_value) |
|
||||||
self.active_filters[get_key] = filter_value |
|
||||||
return query |
|
||||||
|
|
||||||
def prepare_sorted_query(self, query): |
|
||||||
''' add sorting to the query ''' |
|
||||||
|
|
||||||
# first the sorting information from request.GET is used |
|
||||||
sort_by = self.request.GET.get(self.get_key_sort_by, None) |
|
||||||
sort_field = self.get_sort_by_field(sort_by) |
|
||||||
if sort_field: |
|
||||||
direction = self.request.GET.get(self.get_key_sort_dir, 'asc') |
|
||||||
direction = 'asc' if direction.lower() == 'asc' else 'desc' |
|
||||||
sort_func = asc if direction == 'asc' else desc |
|
||||||
query = query.order_by(sort_func(sort_field)) |
|
||||||
self.sort_by = sort_by |
|
||||||
self.sort_dir = direction |
|
||||||
|
|
||||||
# default sorting is applied if not already sorted by this field |
|
||||||
if self.default_sort_by and self.sort_by != self.default_sort_by: |
|
||||||
sort_field = self.get_sort_by_field(self.default_sort_by) |
|
||||||
sort_func = asc if self.default_sort_dir == 'asc' else desc |
|
||||||
query = query.order_by(sort_func(sort_field)) |
|
||||||
if not self.sort_by: |
|
||||||
self.sort_by = self.default_sort_by |
|
||||||
self.sort_dir = self.default_sort_dir |
|
||||||
|
|
||||||
return query |
|
||||||
|
|
||||||
def calculate_pagination(self): |
|
||||||
''' calculates the pagination info ''' |
|
||||||
current_page = self._get_int(self.get_key_page, 1) |
|
||||||
items_per_page = self._get_int( |
|
||||||
self.get_key_items_per_page, |
|
||||||
self.default_items_per_page |
|
||||||
) |
|
||||||
self.pages = Pagination( |
|
||||||
current_page, |
|
||||||
self.filtered_query.count(), |
|
||||||
items_per_page, |
|
||||||
self.default_window_size |
|
||||||
) |
|
||||||
|
|
||||||
def items(self): |
|
||||||
''' returns the items of the current page as resources''' |
|
||||||
if not self.pages.count: |
|
||||||
return [] |
|
||||||
|
|
||||||
# add the sorting |
|
||||||
query = self.prepare_sorted_query(self.filtered_query) |
|
||||||
|
|
||||||
# add offset and limit limit |
|
||||||
offset = (self.pages.current - 1) * self.pages.items_per_page |
|
||||||
query = query.offset(offset).limit(self.pages.items_per_page) |
|
||||||
|
|
||||||
# return a list of resources representing the items found by the query |
|
||||||
return [ |
|
||||||
self._child_resource(item) |
|
||||||
for item |
|
||||||
in query.all() |
|
||||||
] |
|
||||||
|
|
||||||
def __getitem__(self, key): |
|
||||||
''' returns a child resource representing a sqlalchemy model ''' |
|
||||||
model = self.base_query.get(key) |
|
||||||
if model: |
|
||||||
return self._child_resource(model) |
|
||||||
return super().__getitem__(key) |
|
||||||
|
|
||||||
def _child_resource(self, item): |
|
||||||
''' helper function that returns an SQLalchemy model as resource ''' |
|
||||||
return self.child_resource_class(item.id, self, model=item) |
|
||||||
|
|
||||||
def _get_int(self, key, default): |
|
||||||
''' returns the value of GET[key] as integer or default |
|
||||||
|
|
||||||
:param str key: the key for the value of request.GET |
|
||||||
:param int default: the default value, returned if conversion fails |
|
||||||
:rtype: int |
|
||||||
''' |
|
||||||
try: |
|
||||||
return int(self.request.GET[key]) |
|
||||||
except (KeyError, ValueError, TypeError): |
|
||||||
return default |
|
||||||
|
|
||||||
def query_params(self, override=None): |
|
||||||
''' query parameters for the active filters, sorting and page |
|
||||||
|
|
||||||
:param dict override: |
|
||||||
values that override the current filter, sorting or page settings |
|
||||||
|
|
||||||
Example:: |
|
||||||
|
|
||||||
# current page, sorting, etc. |
|
||||||
current = context.query_params() |
|
||||||
current == {'p':1, 'n':12, 'o':'name', 'd':'asc', 'type':'brie'} |
|
||||||
# next page with same sorting but type filter removed |
|
||||||
next = context.query_params({'p':2, 'type': None}) |
|
||||||
next == {'p':2, 'n':12, 'o':'name', 'd':'asc'} |
|
||||||
''' |
|
||||||
params = {} |
|
||||||
if self.pages.current: |
|
||||||
params[self.get_key_page] = self.pages.current |
|
||||||
params[self.get_key_items_per_page] = self.pages.items_per_page |
|
||||||
|
|
||||||
if self.sort_by: |
|
||||||
params[self.get_key_sort_by] = self.sort_by |
|
||||||
params[self.get_key_sort_dir] = self.sort_dir |
|
||||||
|
|
||||||
for key, value in self.active_filters.items(): |
|
||||||
params[key] = value |
|
||||||
|
|
||||||
if override: |
|
||||||
params.update(override) |
|
||||||
|
|
||||||
return {k: v for k, v in params.items() if v is not None} |
|
||||||
|
|
||||||
def resource_url(self, resource, *args, override=None, **kwargs): |
|
||||||
''' resource url for a context with query parameters for current view |
|
||||||
|
|
||||||
:param resource: resource or view name to generate the url for |
|
||||||
:type resource: :class:`BaseResource` or ``str`` |
|
||||||
:param list args: elements for url construction |
|
||||||
:param dict override: overriding query params, see ``query_params()`` |
|
||||||
|
|
||||||
if the resource provided is a string, the current instance is |
|
||||||
prepended:: |
|
||||||
|
|
||||||
# this |
|
||||||
context.resoure_url('edit') |
|
||||||
# is the same as |
|
||||||
current_params = context.query_params() |
|
||||||
url = request.resource_url(context, 'edit', query=current_params) |
|
||||||
|
|
||||||
''' |
|
||||||
if isinstance(resource, str): |
|
||||||
chain = [self, resource] + args |
|
||||||
else: |
|
||||||
chain = [resource] + args |
|
||||||
kwargs['query'] = self.query_params(override) |
|
||||||
return self.request.resource_url(*chain, **kwargs) |
|
@ -1,127 +0,0 @@ |
|||||||
import colander |
|
||||||
import deform |
|
||||||
|
|
||||||
from ordr2.models import Role |
|
||||||
|
|
||||||
from . import CSRFSchema |
|
||||||
from .helpers import ( |
|
||||||
deferred_unique_email_validator, |
|
||||||
deferred_unique_username_validator, |
|
||||||
deferred_password_validator |
|
||||||
) |
|
||||||
|
|
||||||
|
|
||||||
# schema for user registration |
|
||||||
|
|
||||||
class RegistrationSchema(CSRFSchema): |
|
||||||
''' new user registration ''' |
|
||||||
|
|
||||||
username = colander.SchemaNode( |
|
||||||
colander.String(), |
|
||||||
widget=deform.widget.TextInputWidget(readonly=True), |
|
||||||
description='automagically generated for you', |
|
||||||
validator=deferred_unique_username_validator, |
|
||||||
) |
|
||||||
first_name = colander.SchemaNode( |
|
||||||
colander.String() |
|
||||||
) |
|
||||||
last_name = colander.SchemaNode( |
|
||||||
colander.String() |
|
||||||
) |
|
||||||
email = colander.SchemaNode( |
|
||||||
colander.String(), |
|
||||||
validator=deferred_unique_email_validator |
|
||||||
) |
|
||||||
password = colander.SchemaNode( |
|
||||||
colander.String(), |
|
||||||
widget=deform.widget.CheckedPasswordWidget() |
|
||||||
) |
|
||||||
|
|
||||||
@classmethod |
|
||||||
def as_form(cls, request, **override): |
|
||||||
settings = { |
|
||||||
'buttons': ('Create Account', 'Cancel'), |
|
||||||
'css_class': 'form registration' |
|
||||||
} |
|
||||||
settings.update(override) |
|
||||||
return super().as_form(request, **settings) |
|
||||||
|
|
||||||
|
|
||||||
class ResetPasswordSchema(CSRFSchema): |
|
||||||
''' reset a password ''' |
|
||||||
|
|
||||||
password = colander.SchemaNode( |
|
||||||
colander.String(), |
|
||||||
widget=deform.widget.CheckedPasswordWidget() |
|
||||||
) |
|
||||||
|
|
||||||
@classmethod |
|
||||||
def as_form(cls, request, **override): |
|
||||||
settings = { |
|
||||||
'buttons': ('Reset Password', 'Cancel'), |
|
||||||
'css_class': 'form reset-password' |
|
||||||
} |
|
||||||
settings.update(override) |
|
||||||
return super().as_form(request, **settings) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SettingsSectionGeneralSchema(colander.Schema): |
|
||||||
''' Section 'General' for account settings schema ''' |
|
||||||
|
|
||||||
username = colander.SchemaNode( |
|
||||||
colander.String(), |
|
||||||
widget=deform.widget.TextInputWidget(readonly=True), |
|
||||||
) |
|
||||||
first_name = colander.SchemaNode( |
|
||||||
colander.String() |
|
||||||
) |
|
||||||
last_name = colander.SchemaNode( |
|
||||||
colander.String() |
|
||||||
) |
|
||||||
email = colander.SchemaNode( |
|
||||||
colander.String(), |
|
||||||
validator=deferred_unique_email_validator |
|
||||||
) |
|
||||||
role = colander.SchemaNode( |
|
||||||
colander.String(), |
|
||||||
widget=deform.widget.TextInputWidget(readonly=True), |
|
||||||
) |
|
||||||
|
|
||||||
|
|
||||||
class SettingsSectionChangePasswordSchema(colander.Schema): |
|
||||||
''' Section 'Change Password' for account settings schema ''' |
|
||||||
|
|
||||||
new_password = colander.SchemaNode( |
|
||||||
colander.String(), |
|
||||||
widget=deform.widget.CheckedPasswordWidget(), |
|
||||||
missing='' |
|
||||||
) |
|
||||||
|
|
||||||
|
|
||||||
class SettingsSectionConfirmChangesSchema(colander.Schema): |
|
||||||
''' Section 'ConfirmChanges' for account settings schema ''' |
|
||||||
|
|
||||||
password = colander.SchemaNode( |
|
||||||
colander.String(), |
|
||||||
widget=deform.widget.PasswordWidget(), |
|
||||||
validator=deferred_password_validator, |
|
||||||
description='Enter your current password to confirm changes' |
|
||||||
) |
|
||||||
|
|
||||||
|
|
||||||
class AccountSettingsSchema(CSRFSchema): |
|
||||||
''' account settings schema ''' |
|
||||||
|
|
||||||
general = SettingsSectionGeneralSchema() |
|
||||||
change_password = SettingsSectionChangePasswordSchema() |
|
||||||
confirm_changes = SettingsSectionConfirmChangesSchema() |
|
||||||
|
|
||||||
@classmethod |
|
||||||
def as_form(cls, request, **override): |
|
||||||
settings = { |
|
||||||
'buttons': ('Save Settings', 'Cancel'), |
|
||||||
'css_class': 'form account-settings' |
|
||||||
} |
|
||||||
settings.update(override) |
|
||||||
return super().as_form(request, **settings) |
|
@ -1,70 +0,0 @@ |
|||||||
''' User Authentication and Authorization ''' |
|
||||||
|
|
||||||
from pyramid.authentication import AuthTktAuthenticationPolicy |
|
||||||
from pyramid.authorization import ACLAuthorizationPolicy |
|
||||||
from pyramid.security import Authenticated, Everyone |
|
||||||
|
|
||||||
from ordr2.models.account import User, passlib_context |
|
||||||
|
|
||||||
|
|
||||||
class AuthenticationPolicy(AuthTktAuthenticationPolicy): |
|
||||||
''' How to authenticate users ''' |
|
||||||
|
|
||||||
def authenticated_userid(self, request): |
|
||||||
''' returns the id of an authenticated user |
|
||||||
|
|
||||||
heavy lifting done in get_user() attached to request |
|
||||||
''' |
|
||||||
user = request.user |
|
||||||
if user is not None: |
|
||||||
return user.id |
|
||||||
|
|
||||||
def effective_principals(self, request): |
|
||||||
''' returns a list of principals for the user ''' |
|
||||||
principals = [Everyone] |
|
||||||
user = request.user |
|
||||||
if user is not None: |
|
||||||
principals.append(Authenticated) |
|
||||||
principals.append(user.principal) |
|
||||||
principals.extend(user.role_principals) |
|
||||||
return principals |
|
||||||
|
|
||||||
|
|
||||||
def get_user(request): |
|
||||||
''' retrieves the user object by the unauthenticated user id |
|
||||||
|
|
||||||
:param request: |
|
||||||
the current request object |
|
||||||
:type request: |
|
||||||
pyramid.request.Request |
|
||||||
:rtype: |
|
||||||
:class:`ordr2.models.account.User` or None |
|
||||||
''' |
|
||||||
user_id = request.unauthenticated_userid |
|
||||||
if user_id is not None: |
|
||||||
user = request.dbsession.query(User).filter_by(id=user_id).first() |
|
||||||
if user and user.is_active: |
|
||||||
return user |
|
||||||
return None |
|
||||||
|
|
||||||
|
|
||||||
def includeme(config): |
|
||||||
''' initializing authentication, authorization and password hash settings |
|
||||||
|
|
||||||
Activate this setup using ``config.include('ordr2.security')``. |
|
||||||
''' |
|
||||||
settings = config.get_settings() |
|
||||||
|
|
||||||
# configure the passlib context manager for hashing user passwords |
|
||||||
passlib_context.load_path(settings['passlib.config']) |
|
||||||
|
|
||||||
# config for authentication and authorization |
|
||||||
authn_policy = AuthenticationPolicy( |
|
||||||
settings['auth.secret'], |
|
||||||
hashalg='sha512', |
|
||||||
) |
|
||||||
config.set_authentication_policy(authn_policy) |
|
||||||
config.set_authorization_policy(ACLAuthorizationPolicy()) |
|
||||||
|
|
||||||
# attach the get_user function returned by get_user_closure() |
|
||||||
config.add_request_method(get_user, 'user', reify=True) |
|
@ -1,19 +0,0 @@ |
|||||||
''' Session configuration ''' |
|
||||||
|
|
||||||
import binascii |
|
||||||
|
|
||||||
from pyramid_nacl_session import EncryptedCookieSessionFactory |
|
||||||
|
|
||||||
|
|
||||||
def includeme(config): |
|
||||||
''' initializing session configuration |
|
||||||
|
|
||||||
Activate this setup using ``config.include('ordr2.session')``. |
|
||||||
''' |
|
||||||
|
|
||||||
settings = config.get_settings() |
|
||||||
hex_secret = settings['session.secret'].strip() |
|
||||||
secret = binascii.unhexlify(hex_secret) |
|
||||||
|
|
||||||
factory = EncryptedCookieSessionFactory(secret) |
|
||||||
config.set_session_factory(factory) |
|
@ -1,952 +0,0 @@ |
|||||||
/* Bootstrap */ |
|
||||||
|
|
||||||
@font-face { |
|
||||||
font-family: 'Icons'; |
|
||||||
src: url('../fonts/open-iconic.eot'); |
|
||||||
src: url('../fonts/open-iconic.eot?#iconic-sm') format('embedded-opentype'), url('../fonts/open-iconic.woff') format('woff'), url('../fonts/open-iconic.ttf') format('truetype'), url('../fonts/open-iconic.otf') format('opentype'), url('../fonts/open-iconic.svg#iconic-sm') format('svg'); |
|
||||||
font-weight: normal; |
|
||||||
font-style: normal; |
|
||||||
} |
|
||||||
|
|
||||||
.oi { |
|
||||||
position: relative; |
|
||||||
top: 1px; |
|
||||||
display: inline-block; |
|
||||||
speak:none; |
|
||||||
font-family: 'Icons'; |
|
||||||
font-style: normal; |
|
||||||
font-weight: normal; |
|
||||||
line-height: 1; |
|
||||||
-webkit-font-smoothing: antialiased; |
|
||||||
-moz-osx-font-smoothing: grayscale; |
|
||||||
} |
|
||||||
|
|
||||||
.oi:empty:before { |
|
||||||
width: 1em; |
|
||||||
text-align: center; |
|
||||||
box-sizing: content-box; |
|
||||||
} |
|
||||||
|
|
||||||
.oi.oi-align-center:before { |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
|
|
||||||
.oi.oi-align-left:before { |
|
||||||
text-align: left; |
|
||||||
} |
|
||||||
|
|
||||||
.oi.oi-align-right:before { |
|
||||||
text-align: right; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
.oi.oi-flip-horizontal:before { |
|
||||||
-webkit-transform: scale(-1, 1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, 1); |
|
||||||
} |
|
||||||
|
|
||||||
.oi.oi-flip-vertical:before { |
|
||||||
-webkit-transform: scale(1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(1, -1); |
|
||||||
} |
|
||||||
|
|
||||||
.oi.oi-flip-horizontal-vertical:before { |
|
||||||
-webkit-transform: scale(-1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, -1); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
.oi-account-login:before { |
|
||||||
content:'\e000'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-account-logout:before { |
|
||||||
content:'\e001'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-action-redo:before { |
|
||||||
content:'\e002'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-action-undo:before { |
|
||||||
content:'\e003'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-center:before { |
|
||||||
content:'\e004'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-left:before { |
|
||||||
content:'\e005'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-right:before { |
|
||||||
content:'\e006'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-aperture:before { |
|
||||||
content:'\e007'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-bottom:before { |
|
||||||
content:'\e008'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-bottom:before { |
|
||||||
content:'\e009'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-left:before { |
|
||||||
content:'\e00a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-right:before { |
|
||||||
content:'\e00b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-top:before { |
|
||||||
content:'\e00c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-left:before { |
|
||||||
content:'\e00d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-right:before { |
|
||||||
content:'\e00e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-bottom:before { |
|
||||||
content:'\e00f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-left:before { |
|
||||||
content:'\e010'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-right:before { |
|
||||||
content:'\e011'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-top:before { |
|
||||||
content:'\e012'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-top:before { |
|
||||||
content:'\e013'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-audio-spectrum:before { |
|
||||||
content:'\e014'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-audio:before { |
|
||||||
content:'\e015'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-badge:before { |
|
||||||
content:'\e016'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-ban:before { |
|
||||||
content:'\e017'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bar-chart:before { |
|
||||||
content:'\e018'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-basket:before { |
|
||||||
content:'\e019'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-battery-empty:before { |
|
||||||
content:'\e01a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-battery-full:before { |
|
||||||
content:'\e01b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-beaker:before { |
|
||||||
content:'\e01c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bell:before { |
|
||||||
content:'\e01d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bluetooth:before { |
|
||||||
content:'\e01e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bold:before { |
|
||||||
content:'\e01f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bolt:before { |
|
||||||
content:'\e020'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-book:before { |
|
||||||
content:'\e021'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bookmark:before { |
|
||||||
content:'\e022'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-box:before { |
|
||||||
content:'\e023'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-briefcase:before { |
|
||||||
content:'\e024'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-british-pound:before { |
|
||||||
content:'\e025'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-browser:before { |
|
||||||
content:'\e026'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-brush:before { |
|
||||||
content:'\e027'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bug:before { |
|
||||||
content:'\e028'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bullhorn:before { |
|
||||||
content:'\e029'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-calculator:before { |
|
||||||
content:'\e02a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-calendar:before { |
|
||||||
content:'\e02b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-camera-slr:before { |
|
||||||
content:'\e02c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-bottom:before { |
|
||||||
content:'\e02d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-left:before { |
|
||||||
content:'\e02e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-right:before { |
|
||||||
content:'\e02f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-top:before { |
|
||||||
content:'\e030'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cart:before { |
|
||||||
content:'\e031'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chat:before { |
|
||||||
content:'\e032'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-check:before { |
|
||||||
content:'\e033'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-bottom:before { |
|
||||||
content:'\e034'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-left:before { |
|
||||||
content:'\e035'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-right:before { |
|
||||||
content:'\e036'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-top:before { |
|
||||||
content:'\e037'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-circle-check:before { |
|
||||||
content:'\e038'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-circle-x:before { |
|
||||||
content:'\e039'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-clipboard:before { |
|
||||||
content:'\e03a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-clock:before { |
|
||||||
content:'\e03b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud-download:before { |
|
||||||
content:'\e03c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud-upload:before { |
|
||||||
content:'\e03d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud:before { |
|
||||||
content:'\e03e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloudy:before { |
|
||||||
content:'\e03f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-code:before { |
|
||||||
content:'\e040'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cog:before { |
|
||||||
content:'\e041'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-down:before { |
|
||||||
content:'\e042'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-left:before { |
|
||||||
content:'\e043'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-right:before { |
|
||||||
content:'\e044'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-up:before { |
|
||||||
content:'\e045'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-command:before { |
|
||||||
content:'\e046'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-comment-square:before { |
|
||||||
content:'\e047'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-compass:before { |
|
||||||
content:'\e048'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-contrast:before { |
|
||||||
content:'\e049'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-copywriting:before { |
|
||||||
content:'\e04a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-credit-card:before { |
|
||||||
content:'\e04b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-crop:before { |
|
||||||
content:'\e04c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dashboard:before { |
|
||||||
content:'\e04d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-data-transfer-download:before { |
|
||||||
content:'\e04e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-data-transfer-upload:before { |
|
||||||
content:'\e04f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-delete:before { |
|
||||||
content:'\e050'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dial:before { |
|
||||||
content:'\e051'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-document:before { |
|
||||||
content:'\e052'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dollar:before { |
|
||||||
content:'\e053'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-sans-left:before { |
|
||||||
content:'\e054'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-sans-right:before { |
|
||||||
content:'\e055'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-serif-left:before { |
|
||||||
content:'\e056'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-serif-right:before { |
|
||||||
content:'\e057'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-droplet:before { |
|
||||||
content:'\e058'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eject:before { |
|
||||||
content:'\e059'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-elevator:before { |
|
||||||
content:'\e05a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-ellipses:before { |
|
||||||
content:'\e05b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-envelope-closed:before { |
|
||||||
content:'\e05c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-envelope-open:before { |
|
||||||
content:'\e05d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-euro:before { |
|
||||||
content:'\e05e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-excerpt:before { |
|
||||||
content:'\e05f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-down:before { |
|
||||||
content:'\e060'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-left:before { |
|
||||||
content:'\e061'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-right:before { |
|
||||||
content:'\e062'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-up:before { |
|
||||||
content:'\e063'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-external-link:before { |
|
||||||
content:'\e064'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eye:before { |
|
||||||
content:'\e065'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eyedropper:before { |
|
||||||
content:'\e066'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-file:before { |
|
||||||
content:'\e067'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fire:before { |
|
||||||
content:'\e068'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-flag:before { |
|
||||||
content:'\e069'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-flash:before { |
|
||||||
content:'\e06a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-folder:before { |
|
||||||
content:'\e06b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fork:before { |
|
||||||
content:'\e06c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fullscreen-enter:before { |
|
||||||
content:'\e06d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fullscreen-exit:before { |
|
||||||
content:'\e06e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-globe:before { |
|
||||||
content:'\e06f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-graph:before { |
|
||||||
content:'\e070'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-four-up:before { |
|
||||||
content:'\e071'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-three-up:before { |
|
||||||
content:'\e072'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-two-up:before { |
|
||||||
content:'\e073'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-hard-drive:before { |
|
||||||
content:'\e074'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-header:before { |
|
||||||
content:'\e075'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-headphones:before { |
|
||||||
content:'\e076'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-heart:before { |
|
||||||
content:'\e077'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-home:before { |
|
||||||
content:'\e078'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-image:before { |
|
||||||
content:'\e079'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-inbox:before { |
|
||||||
content:'\e07a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-infinity:before { |
|
||||||
content:'\e07b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-info:before { |
|
||||||
content:'\e07c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-italic:before { |
|
||||||
content:'\e07d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-center:before { |
|
||||||
content:'\e07e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-left:before { |
|
||||||
content:'\e07f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-right:before { |
|
||||||
content:'\e080'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-key:before { |
|
||||||
content:'\e081'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-laptop:before { |
|
||||||
content:'\e082'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-layers:before { |
|
||||||
content:'\e083'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lightbulb:before { |
|
||||||
content:'\e084'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-link-broken:before { |
|
||||||
content:'\e085'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-link-intact:before { |
|
||||||
content:'\e086'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-list-rich:before { |
|
||||||
content:'\e087'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-list:before { |
|
||||||
content:'\e088'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-location:before { |
|
||||||
content:'\e089'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lock-locked:before { |
|
||||||
content:'\e08a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lock-unlocked:before { |
|
||||||
content:'\e08b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop-circular:before { |
|
||||||
content:'\e08c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop-square:before { |
|
||||||
content:'\e08d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop:before { |
|
||||||
content:'\e08e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-magnifying-glass:before { |
|
||||||
content:'\e08f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-map-marker:before { |
|
||||||
content:'\e090'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-map:before { |
|
||||||
content:'\e091'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-pause:before { |
|
||||||
content:'\e092'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-play:before { |
|
||||||
content:'\e093'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-record:before { |
|
||||||
content:'\e094'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-skip-backward:before { |
|
||||||
content:'\e095'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-skip-forward:before { |
|
||||||
content:'\e096'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-step-backward:before { |
|
||||||
content:'\e097'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-step-forward:before { |
|
||||||
content:'\e098'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-stop:before { |
|
||||||
content:'\e099'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-medical-cross:before { |
|
||||||
content:'\e09a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-menu:before { |
|
||||||
content:'\e09b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-microphone:before { |
|
||||||
content:'\e09c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-minus:before { |
|
||||||
content:'\e09d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-monitor:before { |
|
||||||
content:'\e09e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-moon:before { |
|
||||||
content:'\e09f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-move:before { |
|
||||||
content:'\e0a0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-musical-note:before { |
|
||||||
content:'\e0a1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-paperclip:before { |
|
||||||
content:'\e0a2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pencil:before { |
|
||||||
content:'\e0a3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-people:before { |
|
||||||
content:'\e0a4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-person:before { |
|
||||||
content:'\e0a5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-phone:before { |
|
||||||
content:'\e0a6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pie-chart:before { |
|
||||||
content:'\e0a7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pin:before { |
|
||||||
content:'\e0a8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-play-circle:before { |
|
||||||
content:'\e0a9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-plus:before { |
|
||||||
content:'\e0aa'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-power-standby:before { |
|
||||||
content:'\e0ab'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-print:before { |
|
||||||
content:'\e0ac'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-project:before { |
|
||||||
content:'\e0ad'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pulse:before { |
|
||||||
content:'\e0ae'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-puzzle-piece:before { |
|
||||||
content:'\e0af'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-question-mark:before { |
|
||||||
content:'\e0b0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rain:before { |
|
||||||
content:'\e0b1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-random:before { |
|
||||||
content:'\e0b2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-reload:before { |
|
||||||
content:'\e0b3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-both:before { |
|
||||||
content:'\e0b4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-height:before { |
|
||||||
content:'\e0b5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-width:before { |
|
||||||
content:'\e0b6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rss-alt:before { |
|
||||||
content:'\e0b7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rss:before { |
|
||||||
content:'\e0b8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-script:before { |
|
||||||
content:'\e0b9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-share-boxed:before { |
|
||||||
content:'\e0ba'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-share:before { |
|
||||||
content:'\e0bb'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-shield:before { |
|
||||||
content:'\e0bc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-signal:before { |
|
||||||
content:'\e0bd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-signpost:before { |
|
||||||
content:'\e0be'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sort-ascending:before { |
|
||||||
content:'\e0bf'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sort-descending:before { |
|
||||||
content:'\e0c0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-spreadsheet:before { |
|
||||||
content:'\e0c1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-star:before { |
|
||||||
content:'\e0c2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sun:before { |
|
||||||
content:'\e0c3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tablet:before { |
|
||||||
content:'\e0c4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tag:before { |
|
||||||
content:'\e0c5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tags:before { |
|
||||||
content:'\e0c6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-target:before { |
|
||||||
content:'\e0c7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-task:before { |
|
||||||
content:'\e0c8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-terminal:before { |
|
||||||
content:'\e0c9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-text:before { |
|
||||||
content:'\e0ca'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-thumb-down:before { |
|
||||||
content:'\e0cb'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-thumb-up:before { |
|
||||||
content:'\e0cc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-timer:before { |
|
||||||
content:'\e0cd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-transfer:before { |
|
||||||
content:'\e0ce'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-trash:before { |
|
||||||
content:'\e0cf'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-underline:before { |
|
||||||
content:'\e0d0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-bottom:before { |
|
||||||
content:'\e0d1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-center:before { |
|
||||||
content:'\e0d2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-top:before { |
|
||||||
content:'\e0d3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-video:before { |
|
||||||
content:'\e0d4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-high:before { |
|
||||||
content:'\e0d5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-low:before { |
|
||||||
content:'\e0d6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-off:before { |
|
||||||
content:'\e0d7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-warning:before { |
|
||||||
content:'\e0d8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-wifi:before { |
|
||||||
content:'\e0d9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-wrench:before { |
|
||||||
content:'\e0da'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-x:before { |
|
||||||
content:'\e0db'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-yen:before { |
|
||||||
content:'\e0dc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-zoom-in:before { |
|
||||||
content:'\e0dd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-zoom-out:before { |
|
||||||
content:'\e0de'; |
|
||||||
} |
|
@ -1,960 +0,0 @@ |
|||||||
/* Bootstrap */ |
|
||||||
|
|
||||||
/* Override Bootstrap default variable */ |
|
||||||
//@icon-font-path: "../fonts/"; |
|
||||||
|
|
||||||
@font-face { |
|
||||||
font-family: 'Icons'; |
|
||||||
src: ~"url('@{icon-font-path}open-iconic.eot')"; |
|
||||||
src: ~"url('@{icon-font-path}open-iconic.eot?#iconic-sm') format('embedded-opentype')", |
|
||||||
~"url('@{icon-font-path}open-iconic.woff') format('woff')", |
|
||||||
~"url('@{icon-font-path}open-iconic.ttf') format('truetype')", |
|
||||||
~"url('@{icon-font-path}open-iconic.svg#iconic-sm') format('svg')"; |
|
||||||
font-weight: normal; |
|
||||||
font-style: normal; |
|
||||||
} |
|
||||||
|
|
||||||
// Catchall baseclass |
|
||||||
.oi { |
|
||||||
position: relative; |
|
||||||
top: 1px; |
|
||||||
display: inline-block; |
|
||||||
font-family: 'Icons'; |
|
||||||
font-style: normal; |
|
||||||
font-weight: normal; |
|
||||||
line-height: 1; |
|
||||||
-webkit-font-smoothing: antialiased; |
|
||||||
-moz-osx-font-smoothing: grayscale; |
|
||||||
|
|
||||||
&:empty:before { |
|
||||||
width: 1em; |
|
||||||
text-align: center; |
|
||||||
box-sizing: content-box; |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-align-center:before { |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-align-left:before { |
|
||||||
text-align: left; |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-align-right:before { |
|
||||||
text-align: right; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
&.oi-flip-horizontal:before { |
|
||||||
-webkit-transform: scale(-1, 1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, 1); |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-flip-vertical:before { |
|
||||||
-webkit-transform: scale(1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(1, -1); |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-flip-horizontal-vertical:before { |
|
||||||
-webkit-transform: scale(-1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, -1); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.oi-account-login:before { |
|
||||||
content:"\e000"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-account-logout:before { |
|
||||||
content:"\e001"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-action-redo:before { |
|
||||||
content:"\e002"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-action-undo:before { |
|
||||||
content:"\e003"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-center:before { |
|
||||||
content:"\e004"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-left:before { |
|
||||||
content:"\e005"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-right:before { |
|
||||||
content:"\e006"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-aperture:before { |
|
||||||
content:"\e007"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-bottom:before { |
|
||||||
content:"\e008"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-bottom:before { |
|
||||||
content:"\e009"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-left:before { |
|
||||||
content:"\e00a"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-right:before { |
|
||||||
content:"\e00b"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-top:before { |
|
||||||
content:"\e00c"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-left:before { |
|
||||||
content:"\e00d"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-right:before { |
|
||||||
content:"\e00e"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-bottom:before { |
|
||||||
content:"\e00f"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-left:before { |
|
||||||
content:"\e010"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-right:before { |
|
||||||
content:"\e011"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-top:before { |
|
||||||
content:"\e012"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-top:before { |
|
||||||
content:"\e013"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-audio-spectrum:before { |
|
||||||
content:"\e014"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-audio:before { |
|
||||||
content:"\e015"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-badge:before { |
|
||||||
content:"\e016"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-ban:before { |
|
||||||
content:"\e017"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bar-chart:before { |
|
||||||
content:"\e018"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-basket:before { |
|
||||||
content:"\e019"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-battery-empty:before { |
|
||||||
content:"\e01a"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-battery-full:before { |
|
||||||
content:"\e01b"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-beaker:before { |
|
||||||
content:"\e01c"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bell:before { |
|
||||||
content:"\e01d"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bluetooth:before { |
|
||||||
content:"\e01e"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bold:before { |
|
||||||
content:"\e01f"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bolt:before { |
|
||||||
content:"\e020"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-book:before { |
|
||||||
content:"\e021"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bookmark:before { |
|
||||||
content:"\e022"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-box:before { |
|
||||||
content:"\e023"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-briefcase:before { |
|
||||||
content:"\e024"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-british-pound:before { |
|
||||||
content:"\e025"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-browser:before { |
|
||||||
content:"\e026"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-brush:before { |
|
||||||
content:"\e027"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bug:before { |
|
||||||
content:"\e028"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bullhorn:before { |
|
||||||
content:"\e029"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-calculator:before { |
|
||||||
content:"\e02a"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-calendar:before { |
|
||||||
content:"\e02b"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-camera-slr:before { |
|
||||||
content:"\e02c"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-bottom:before { |
|
||||||
content:"\e02d"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-left:before { |
|
||||||
content:"\e02e"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-right:before { |
|
||||||
content:"\e02f"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-top:before { |
|
||||||
content:"\e030"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cart:before { |
|
||||||
content:"\e031"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chat:before { |
|
||||||
content:"\e032"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-check:before { |
|
||||||
content:"\e033"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-bottom:before { |
|
||||||
content:"\e034"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-left:before { |
|
||||||
content:"\e035"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-right:before { |
|
||||||
content:"\e036"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-top:before { |
|
||||||
content:"\e037"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-circle-check:before { |
|
||||||
content:"\e038"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-circle-x:before { |
|
||||||
content:"\e039"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-clipboard:before { |
|
||||||
content:"\e03a"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-clock:before { |
|
||||||
content:"\e03b"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud-download:before { |
|
||||||
content:"\e03c"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud-upload:before { |
|
||||||
content:"\e03d"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud:before { |
|
||||||
content:"\e03e"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloudy:before { |
|
||||||
content:"\e03f"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-code:before { |
|
||||||
content:"\e040"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cog:before { |
|
||||||
content:"\e041"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-down:before { |
|
||||||
content:"\e042"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-left:before { |
|
||||||
content:"\e043"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-right:before { |
|
||||||
content:"\e044"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-up:before { |
|
||||||
content:"\e045"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-command:before { |
|
||||||
content:"\e046"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-comment-square:before { |
|
||||||
content:"\e047"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-compass:before { |
|
||||||
content:"\e048"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-contrast:before { |
|
||||||
content:"\e049"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-copywriting:before { |
|
||||||
content:"\e04a"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-credit-card:before { |
|
||||||
content:"\e04b"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-crop:before { |
|
||||||
content:"\e04c"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dashboard:before { |
|
||||||
content:"\e04d"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-data-transfer-download:before { |
|
||||||
content:"\e04e"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-data-transfer-upload:before { |
|
||||||
content:"\e04f"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-delete:before { |
|
||||||
content:"\e050"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dial:before { |
|
||||||
content:"\e051"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-document:before { |
|
||||||
content:"\e052"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dollar:before { |
|
||||||
content:"\e053"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-sans-left:before { |
|
||||||
content:"\e054"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-sans-right:before { |
|
||||||
content:"\e055"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-serif-left:before { |
|
||||||
content:"\e056"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-serif-right:before { |
|
||||||
content:"\e057"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-droplet:before { |
|
||||||
content:"\e058"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eject:before { |
|
||||||
content:"\e059"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-elevator:before { |
|
||||||
content:"\e05a"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-ellipses:before { |
|
||||||
content:"\e05b"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-envelope-closed:before { |
|
||||||
content:"\e05c"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-envelope-open:before { |
|
||||||
content:"\e05d"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-euro:before { |
|
||||||
content:"\e05e"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-excerpt:before { |
|
||||||
content:"\e05f"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-down:before { |
|
||||||
content:"\e060"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-left:before { |
|
||||||
content:"\e061"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-right:before { |
|
||||||
content:"\e062"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-up:before { |
|
||||||
content:"\e063"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-external-link:before { |
|
||||||
content:"\e064"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eye:before { |
|
||||||
content:"\e065"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eyedropper:before { |
|
||||||
content:"\e066"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-file:before { |
|
||||||
content:"\e067"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fire:before { |
|
||||||
content:"\e068"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-flag:before { |
|
||||||
content:"\e069"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-flash:before { |
|
||||||
content:"\e06a"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-folder:before { |
|
||||||
content:"\e06b"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fork:before { |
|
||||||
content:"\e06c"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fullscreen-enter:before { |
|
||||||
content:"\e06d"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fullscreen-exit:before { |
|
||||||
content:"\e06e"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-globe:before { |
|
||||||
content:"\e06f"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-graph:before { |
|
||||||
content:"\e070"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-four-up:before { |
|
||||||
content:"\e071"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-three-up:before { |
|
||||||
content:"\e072"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-two-up:before { |
|
||||||
content:"\e073"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-hard-drive:before { |
|
||||||
content:"\e074"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-header:before { |
|
||||||
content:"\e075"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-headphones:before { |
|
||||||
content:"\e076"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-heart:before { |
|
||||||
content:"\e077"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-home:before { |
|
||||||
content:"\e078"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-image:before { |
|
||||||
content:"\e079"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-inbox:before { |
|
||||||
content:"\e07a"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-infinity:before { |
|
||||||
content:"\e07b"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-info:before { |
|
||||||
content:"\e07c"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-italic:before { |
|
||||||
content:"\e07d"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-center:before { |
|
||||||
content:"\e07e"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-left:before { |
|
||||||
content:"\e07f"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-right:before { |
|
||||||
content:"\e080"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-key:before { |
|
||||||
content:"\e081"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-laptop:before { |
|
||||||
content:"\e082"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-layers:before { |
|
||||||
content:"\e083"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lightbulb:before { |
|
||||||
content:"\e084"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-link-broken:before { |
|
||||||
content:"\e085"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-link-intact:before { |
|
||||||
content:"\e086"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-list-rich:before { |
|
||||||
content:"\e087"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-list:before { |
|
||||||
content:"\e088"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-location:before { |
|
||||||
content:"\e089"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lock-locked:before { |
|
||||||
content:"\e08a"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lock-unlocked:before { |
|
||||||
content:"\e08b"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop-circular:before { |
|
||||||
content:"\e08c"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop-square:before { |
|
||||||
content:"\e08d"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop:before { |
|
||||||
content:"\e08e"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-magnifying-glass:before { |
|
||||||
content:"\e08f"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-map-marker:before { |
|
||||||
content:"\e090"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-map:before { |
|
||||||
content:"\e091"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-pause:before { |
|
||||||
content:"\e092"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-play:before { |
|
||||||
content:"\e093"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-record:before { |
|
||||||
content:"\e094"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-skip-backward:before { |
|
||||||
content:"\e095"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-skip-forward:before { |
|
||||||
content:"\e096"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-step-backward:before { |
|
||||||
content:"\e097"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-step-forward:before { |
|
||||||
content:"\e098"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-stop:before { |
|
||||||
content:"\e099"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-medical-cross:before { |
|
||||||
content:"\e09a"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-menu:before { |
|
||||||
content:"\e09b"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-microphone:before { |
|
||||||
content:"\e09c"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-minus:before { |
|
||||||
content:"\e09d"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-monitor:before { |
|
||||||
content:"\e09e"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-moon:before { |
|
||||||
content:"\e09f"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-move:before { |
|
||||||
content:"\e0a0"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-musical-note:before { |
|
||||||
content:"\e0a1"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-paperclip:before { |
|
||||||
content:"\e0a2"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pencil:before { |
|
||||||
content:"\e0a3"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-people:before { |
|
||||||
content:"\e0a4"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-person:before { |
|
||||||
content:"\e0a5"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-phone:before { |
|
||||||
content:"\e0a6"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pie-chart:before { |
|
||||||
content:"\e0a7"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pin:before { |
|
||||||
content:"\e0a8"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-play-circle:before { |
|
||||||
content:"\e0a9"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-plus:before { |
|
||||||
content:"\e0aa"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-power-standby:before { |
|
||||||
content:"\e0ab"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-print:before { |
|
||||||
content:"\e0ac"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-project:before { |
|
||||||
content:"\e0ad"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pulse:before { |
|
||||||
content:"\e0ae"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-puzzle-piece:before { |
|
||||||
content:"\e0af"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-question-mark:before { |
|
||||||
content:"\e0b0"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rain:before { |
|
||||||
content:"\e0b1"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-random:before { |
|
||||||
content:"\e0b2"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-reload:before { |
|
||||||
content:"\e0b3"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-both:before { |
|
||||||
content:"\e0b4"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-height:before { |
|
||||||
content:"\e0b5"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-width:before { |
|
||||||
content:"\e0b6"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rss-alt:before { |
|
||||||
content:"\e0b7"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rss:before { |
|
||||||
content:"\e0b8"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-script:before { |
|
||||||
content:"\e0b9"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-share-boxed:before { |
|
||||||
content:"\e0ba"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-share:before { |
|
||||||
content:"\e0bb"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-shield:before { |
|
||||||
content:"\e0bc"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-signal:before { |
|
||||||
content:"\e0bd"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-signpost:before { |
|
||||||
content:"\e0be"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sort-ascending:before { |
|
||||||
content:"\e0bf"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sort-descending:before { |
|
||||||
content:"\e0c0"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-spreadsheet:before { |
|
||||||
content:"\e0c1"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-star:before { |
|
||||||
content:"\e0c2"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sun:before { |
|
||||||
content:"\e0c3"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tablet:before { |
|
||||||
content:"\e0c4"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tag:before { |
|
||||||
content:"\e0c5"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tags:before { |
|
||||||
content:"\e0c6"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-target:before { |
|
||||||
content:"\e0c7"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-task:before { |
|
||||||
content:"\e0c8"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-terminal:before { |
|
||||||
content:"\e0c9"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-text:before { |
|
||||||
content:"\e0ca"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-thumb-down:before { |
|
||||||
content:"\e0cb"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-thumb-up:before { |
|
||||||
content:"\e0cc"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-timer:before { |
|
||||||
content:"\e0cd"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-transfer:before { |
|
||||||
content:"\e0ce"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-trash:before { |
|
||||||
content:"\e0cf"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-underline:before { |
|
||||||
content:"\e0d0"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-bottom:before { |
|
||||||
content:"\e0d1"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-center:before { |
|
||||||
content:"\e0d2"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-top:before { |
|
||||||
content:"\e0d3"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-video:before { |
|
||||||
content:"\e0d4"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-high:before { |
|
||||||
content:"\e0d5"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-low:before { |
|
||||||
content:"\e0d6"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-off:before { |
|
||||||
content:"\e0d7"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-warning:before { |
|
||||||
content:"\e0d8"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-wifi:before { |
|
||||||
content:"\e0d9"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-wrench:before { |
|
||||||
content:"\e0da"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-x:before { |
|
||||||
content:"\e0db"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-yen:before { |
|
||||||
content:"\e0dc"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-zoom-in:before { |
|
||||||
content:"\e0dd"; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-zoom-out:before { |
|
||||||
content:"\e0de"; |
|
||||||
} |
|
||||||
|
|
File diff suppressed because one or more lines are too long
@ -1,958 +0,0 @@ |
|||||||
/* Bootstrap */ |
|
||||||
|
|
||||||
/* Override Bootstrap default variable */ |
|
||||||
$icon-font-path: '../fonts/' !default; |
|
||||||
|
|
||||||
@font-face { |
|
||||||
font-family: 'Icons'; |
|
||||||
src: url('#{$icon-font-path}open-iconic.eot'); |
|
||||||
src: url('#{$icon-font-path}open-iconic.eot?#iconic-sm') format('embedded-opentype'), url('#{$icon-font-path}open-iconic.woff') format('woff'), url('#{$icon-font-path}open-iconic.ttf') format('truetype'), url('#{$icon-font-path}open-iconic.svg#iconic-sm') format('svg'); |
|
||||||
font-weight: normal; |
|
||||||
font-style: normal; |
|
||||||
} |
|
||||||
|
|
||||||
// Catchall baseclass |
|
||||||
.oi { |
|
||||||
position: relative; |
|
||||||
top: 1px; |
|
||||||
display: inline-block; |
|
||||||
font-family: 'Icons'; |
|
||||||
font-style: normal; |
|
||||||
font-weight: normal; |
|
||||||
line-height: 1; |
|
||||||
-webkit-font-smoothing: antialiased; |
|
||||||
-moz-osx-font-smoothing: grayscale; |
|
||||||
|
|
||||||
|
|
||||||
&:empty:before { |
|
||||||
width: 1em; |
|
||||||
text-align: center; |
|
||||||
box-sizing: content-box; |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-align-center:before { |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-align-left:before { |
|
||||||
text-align: left; |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-align-right:before { |
|
||||||
text-align: right; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
&.oi-flip-horizontal:before { |
|
||||||
-webkit-transform: scale(-1, 1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, 1); |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-flip-vertical:before { |
|
||||||
-webkit-transform: scale(1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(1, -1); |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-flip-horizontal-vertical:before { |
|
||||||
-webkit-transform: scale(-1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, -1); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.oi-account-login:before { |
|
||||||
content:'\e000'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-account-logout:before { |
|
||||||
content:'\e001'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-action-redo:before { |
|
||||||
content:'\e002'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-action-undo:before { |
|
||||||
content:'\e003'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-center:before { |
|
||||||
content:'\e004'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-left:before { |
|
||||||
content:'\e005'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-right:before { |
|
||||||
content:'\e006'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-aperture:before { |
|
||||||
content:'\e007'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-bottom:before { |
|
||||||
content:'\e008'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-bottom:before { |
|
||||||
content:'\e009'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-left:before { |
|
||||||
content:'\e00a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-right:before { |
|
||||||
content:'\e00b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-top:before { |
|
||||||
content:'\e00c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-left:before { |
|
||||||
content:'\e00d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-right:before { |
|
||||||
content:'\e00e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-bottom:before { |
|
||||||
content:'\e00f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-left:before { |
|
||||||
content:'\e010'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-right:before { |
|
||||||
content:'\e011'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-top:before { |
|
||||||
content:'\e012'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-top:before { |
|
||||||
content:'\e013'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-audio-spectrum:before { |
|
||||||
content:'\e014'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-audio:before { |
|
||||||
content:'\e015'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-badge:before { |
|
||||||
content:'\e016'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-ban:before { |
|
||||||
content:'\e017'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bar-chart:before { |
|
||||||
content:'\e018'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-basket:before { |
|
||||||
content:'\e019'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-battery-empty:before { |
|
||||||
content:'\e01a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-battery-full:before { |
|
||||||
content:'\e01b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-beaker:before { |
|
||||||
content:'\e01c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bell:before { |
|
||||||
content:'\e01d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bluetooth:before { |
|
||||||
content:'\e01e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bold:before { |
|
||||||
content:'\e01f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bolt:before { |
|
||||||
content:'\e020'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-book:before { |
|
||||||
content:'\e021'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bookmark:before { |
|
||||||
content:'\e022'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-box:before { |
|
||||||
content:'\e023'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-briefcase:before { |
|
||||||
content:'\e024'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-british-pound:before { |
|
||||||
content:'\e025'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-browser:before { |
|
||||||
content:'\e026'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-brush:before { |
|
||||||
content:'\e027'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bug:before { |
|
||||||
content:'\e028'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bullhorn:before { |
|
||||||
content:'\e029'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-calculator:before { |
|
||||||
content:'\e02a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-calendar:before { |
|
||||||
content:'\e02b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-camera-slr:before { |
|
||||||
content:'\e02c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-bottom:before { |
|
||||||
content:'\e02d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-left:before { |
|
||||||
content:'\e02e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-right:before { |
|
||||||
content:'\e02f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-top:before { |
|
||||||
content:'\e030'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cart:before { |
|
||||||
content:'\e031'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chat:before { |
|
||||||
content:'\e032'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-check:before { |
|
||||||
content:'\e033'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-bottom:before { |
|
||||||
content:'\e034'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-left:before { |
|
||||||
content:'\e035'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-right:before { |
|
||||||
content:'\e036'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-top:before { |
|
||||||
content:'\e037'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-circle-check:before { |
|
||||||
content:'\e038'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-circle-x:before { |
|
||||||
content:'\e039'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-clipboard:before { |
|
||||||
content:'\e03a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-clock:before { |
|
||||||
content:'\e03b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud-download:before { |
|
||||||
content:'\e03c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud-upload:before { |
|
||||||
content:'\e03d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud:before { |
|
||||||
content:'\e03e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloudy:before { |
|
||||||
content:'\e03f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-code:before { |
|
||||||
content:'\e040'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cog:before { |
|
||||||
content:'\e041'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-down:before { |
|
||||||
content:'\e042'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-left:before { |
|
||||||
content:'\e043'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-right:before { |
|
||||||
content:'\e044'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-up:before { |
|
||||||
content:'\e045'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-command:before { |
|
||||||
content:'\e046'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-comment-square:before { |
|
||||||
content:'\e047'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-compass:before { |
|
||||||
content:'\e048'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-contrast:before { |
|
||||||
content:'\e049'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-copywriting:before { |
|
||||||
content:'\e04a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-credit-card:before { |
|
||||||
content:'\e04b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-crop:before { |
|
||||||
content:'\e04c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dashboard:before { |
|
||||||
content:'\e04d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-data-transfer-download:before { |
|
||||||
content:'\e04e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-data-transfer-upload:before { |
|
||||||
content:'\e04f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-delete:before { |
|
||||||
content:'\e050'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dial:before { |
|
||||||
content:'\e051'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-document:before { |
|
||||||
content:'\e052'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dollar:before { |
|
||||||
content:'\e053'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-sans-left:before { |
|
||||||
content:'\e054'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-sans-right:before { |
|
||||||
content:'\e055'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-serif-left:before { |
|
||||||
content:'\e056'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-serif-right:before { |
|
||||||
content:'\e057'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-droplet:before { |
|
||||||
content:'\e058'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eject:before { |
|
||||||
content:'\e059'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-elevator:before { |
|
||||||
content:'\e05a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-ellipses:before { |
|
||||||
content:'\e05b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-envelope-closed:before { |
|
||||||
content:'\e05c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-envelope-open:before { |
|
||||||
content:'\e05d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-euro:before { |
|
||||||
content:'\e05e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-excerpt:before { |
|
||||||
content:'\e05f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-down:before { |
|
||||||
content:'\e060'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-left:before { |
|
||||||
content:'\e061'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-right:before { |
|
||||||
content:'\e062'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-up:before { |
|
||||||
content:'\e063'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-external-link:before { |
|
||||||
content:'\e064'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eye:before { |
|
||||||
content:'\e065'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eyedropper:before { |
|
||||||
content:'\e066'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-file:before { |
|
||||||
content:'\e067'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fire:before { |
|
||||||
content:'\e068'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-flag:before { |
|
||||||
content:'\e069'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-flash:before { |
|
||||||
content:'\e06a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-folder:before { |
|
||||||
content:'\e06b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fork:before { |
|
||||||
content:'\e06c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fullscreen-enter:before { |
|
||||||
content:'\e06d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fullscreen-exit:before { |
|
||||||
content:'\e06e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-globe:before { |
|
||||||
content:'\e06f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-graph:before { |
|
||||||
content:'\e070'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-four-up:before { |
|
||||||
content:'\e071'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-three-up:before { |
|
||||||
content:'\e072'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-two-up:before { |
|
||||||
content:'\e073'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-hard-drive:before { |
|
||||||
content:'\e074'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-header:before { |
|
||||||
content:'\e075'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-headphones:before { |
|
||||||
content:'\e076'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-heart:before { |
|
||||||
content:'\e077'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-home:before { |
|
||||||
content:'\e078'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-image:before { |
|
||||||
content:'\e079'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-inbox:before { |
|
||||||
content:'\e07a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-infinity:before { |
|
||||||
content:'\e07b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-info:before { |
|
||||||
content:'\e07c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-italic:before { |
|
||||||
content:'\e07d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-center:before { |
|
||||||
content:'\e07e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-left:before { |
|
||||||
content:'\e07f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-right:before { |
|
||||||
content:'\e080'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-key:before { |
|
||||||
content:'\e081'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-laptop:before { |
|
||||||
content:'\e082'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-layers:before { |
|
||||||
content:'\e083'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lightbulb:before { |
|
||||||
content:'\e084'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-link-broken:before { |
|
||||||
content:'\e085'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-link-intact:before { |
|
||||||
content:'\e086'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-list-rich:before { |
|
||||||
content:'\e087'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-list:before { |
|
||||||
content:'\e088'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-location:before { |
|
||||||
content:'\e089'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lock-locked:before { |
|
||||||
content:'\e08a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lock-unlocked:before { |
|
||||||
content:'\e08b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop-circular:before { |
|
||||||
content:'\e08c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop-square:before { |
|
||||||
content:'\e08d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop:before { |
|
||||||
content:'\e08e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-magnifying-glass:before { |
|
||||||
content:'\e08f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-map-marker:before { |
|
||||||
content:'\e090'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-map:before { |
|
||||||
content:'\e091'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-pause:before { |
|
||||||
content:'\e092'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-play:before { |
|
||||||
content:'\e093'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-record:before { |
|
||||||
content:'\e094'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-skip-backward:before { |
|
||||||
content:'\e095'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-skip-forward:before { |
|
||||||
content:'\e096'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-step-backward:before { |
|
||||||
content:'\e097'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-step-forward:before { |
|
||||||
content:'\e098'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-stop:before { |
|
||||||
content:'\e099'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-medical-cross:before { |
|
||||||
content:'\e09a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-menu:before { |
|
||||||
content:'\e09b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-microphone:before { |
|
||||||
content:'\e09c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-minus:before { |
|
||||||
content:'\e09d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-monitor:before { |
|
||||||
content:'\e09e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-moon:before { |
|
||||||
content:'\e09f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-move:before { |
|
||||||
content:'\e0a0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-musical-note:before { |
|
||||||
content:'\e0a1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-paperclip:before { |
|
||||||
content:'\e0a2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pencil:before { |
|
||||||
content:'\e0a3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-people:before { |
|
||||||
content:'\e0a4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-person:before { |
|
||||||
content:'\e0a5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-phone:before { |
|
||||||
content:'\e0a6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pie-chart:before { |
|
||||||
content:'\e0a7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pin:before { |
|
||||||
content:'\e0a8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-play-circle:before { |
|
||||||
content:'\e0a9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-plus:before { |
|
||||||
content:'\e0aa'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-power-standby:before { |
|
||||||
content:'\e0ab'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-print:before { |
|
||||||
content:'\e0ac'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-project:before { |
|
||||||
content:'\e0ad'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pulse:before { |
|
||||||
content:'\e0ae'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-puzzle-piece:before { |
|
||||||
content:'\e0af'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-question-mark:before { |
|
||||||
content:'\e0b0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rain:before { |
|
||||||
content:'\e0b1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-random:before { |
|
||||||
content:'\e0b2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-reload:before { |
|
||||||
content:'\e0b3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-both:before { |
|
||||||
content:'\e0b4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-height:before { |
|
||||||
content:'\e0b5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-width:before { |
|
||||||
content:'\e0b6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rss-alt:before { |
|
||||||
content:'\e0b7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rss:before { |
|
||||||
content:'\e0b8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-script:before { |
|
||||||
content:'\e0b9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-share-boxed:before { |
|
||||||
content:'\e0ba'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-share:before { |
|
||||||
content:'\e0bb'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-shield:before { |
|
||||||
content:'\e0bc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-signal:before { |
|
||||||
content:'\e0bd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-signpost:before { |
|
||||||
content:'\e0be'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sort-ascending:before { |
|
||||||
content:'\e0bf'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sort-descending:before { |
|
||||||
content:'\e0c0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-spreadsheet:before { |
|
||||||
content:'\e0c1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-star:before { |
|
||||||
content:'\e0c2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sun:before { |
|
||||||
content:'\e0c3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tablet:before { |
|
||||||
content:'\e0c4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tag:before { |
|
||||||
content:'\e0c5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tags:before { |
|
||||||
content:'\e0c6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-target:before { |
|
||||||
content:'\e0c7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-task:before { |
|
||||||
content:'\e0c8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-terminal:before { |
|
||||||
content:'\e0c9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-text:before { |
|
||||||
content:'\e0ca'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-thumb-down:before { |
|
||||||
content:'\e0cb'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-thumb-up:before { |
|
||||||
content:'\e0cc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-timer:before { |
|
||||||
content:'\e0cd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-transfer:before { |
|
||||||
content:'\e0ce'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-trash:before { |
|
||||||
content:'\e0cf'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-underline:before { |
|
||||||
content:'\e0d0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-bottom:before { |
|
||||||
content:'\e0d1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-center:before { |
|
||||||
content:'\e0d2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-top:before { |
|
||||||
content:'\e0d3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-video:before { |
|
||||||
content:'\e0d4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-high:before { |
|
||||||
content:'\e0d5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-low:before { |
|
||||||
content:'\e0d6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-off:before { |
|
||||||
content:'\e0d7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-warning:before { |
|
||||||
content:'\e0d8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-wifi:before { |
|
||||||
content:'\e0d9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-wrench:before { |
|
||||||
content:'\e0da'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-x:before { |
|
||||||
content:'\e0db'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-yen:before { |
|
||||||
content:'\e0dc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-zoom-in:before { |
|
||||||
content:'\e0dd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi-zoom-out:before { |
|
||||||
content:'\e0de'; |
|
||||||
} |
|
||||||
|
|
@ -1,954 +0,0 @@ |
|||||||
/* Bootstrap */ |
|
||||||
|
|
||||||
@font-face |
|
||||||
font-family 'Icons' |
|
||||||
src url('../fonts/open-iconic.eot') |
|
||||||
src url('../fonts/open-iconic.eot?#iconic-sm') format('embedded-opentype'), url('../fonts/open-iconic.woff') format('woff'), url('../fonts/open-iconic.ttf') format('truetype'), url('../fonts/open-iconic.svg#iconic-sm') format('svg') |
|
||||||
font-weight normal |
|
||||||
font-style normal |
|
||||||
|
|
||||||
|
|
||||||
// Catchall baseclass |
|
||||||
.oi |
|
||||||
position relative |
|
||||||
top 1px |
|
||||||
display inline-block |
|
||||||
font-family 'Icons' |
|
||||||
font-style normal |
|
||||||
font-weight normal |
|
||||||
line-height 1 |
|
||||||
-webkit-font-smoothing antialiased |
|
||||||
-moz-osx-font-smoothing grayscale |
|
||||||
|
|
||||||
|
|
||||||
&:empty:before |
|
||||||
width 1em |
|
||||||
text-align center |
|
||||||
box-sizing content-box |
|
||||||
|
|
||||||
&.oi-align-center:before |
|
||||||
text-align center |
|
||||||
|
|
||||||
|
|
||||||
&.oi-align-left:before |
|
||||||
text-align left |
|
||||||
|
|
||||||
|
|
||||||
&.oi-align-right:before |
|
||||||
text-align right |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
&.oi-flip-horizontal:before |
|
||||||
-webkit-transform scale(-1, 1) |
|
||||||
-ms-transform scale(-1, 1) |
|
||||||
transform scale(-1, 1) |
|
||||||
|
|
||||||
|
|
||||||
&.oi-flip-vertical:before |
|
||||||
-webkit-transform scale(1, -1) |
|
||||||
-ms-transform scale(-1, 1) |
|
||||||
transform scale(1, -1) |
|
||||||
|
|
||||||
|
|
||||||
&.oi-flip-horizontal-vertical:before |
|
||||||
-webkit-transform scale(-1, -1) |
|
||||||
-ms-transform scale(-1, 1) |
|
||||||
transform scale(-1, -1) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.oi-account-login:before { |
|
||||||
content'\e000' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-account-logout:before { |
|
||||||
content'\e001' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-action-redo:before { |
|
||||||
content'\e002' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-action-undo:before { |
|
||||||
content'\e003' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-center:before { |
|
||||||
content'\e004' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-left:before { |
|
||||||
content'\e005' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-align-right:before { |
|
||||||
content'\e006' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-aperture:before { |
|
||||||
content'\e007' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-bottom:before { |
|
||||||
content'\e008' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-bottom:before { |
|
||||||
content'\e009' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-left:before { |
|
||||||
content'\e00a' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-right:before { |
|
||||||
content'\e00b' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-circle-top:before { |
|
||||||
content'\e00c' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-left:before { |
|
||||||
content'\e00d' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-right:before { |
|
||||||
content'\e00e' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-bottom:before { |
|
||||||
content'\e00f' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-left:before { |
|
||||||
content'\e010' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-right:before { |
|
||||||
content'\e011' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-thick-top:before { |
|
||||||
content'\e012' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-arrow-top:before { |
|
||||||
content'\e013' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-audio-spectrum:before { |
|
||||||
content'\e014' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-audio:before { |
|
||||||
content'\e015' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-badge:before { |
|
||||||
content'\e016' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-ban:before { |
|
||||||
content'\e017' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bar-chart:before { |
|
||||||
content'\e018' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-basket:before { |
|
||||||
content'\e019' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-battery-empty:before { |
|
||||||
content'\e01a' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-battery-full:before { |
|
||||||
content'\e01b' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-beaker:before { |
|
||||||
content'\e01c' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bell:before { |
|
||||||
content'\e01d' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bluetooth:before { |
|
||||||
content'\e01e' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bold:before { |
|
||||||
content'\e01f' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bolt:before { |
|
||||||
content'\e020' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-book:before { |
|
||||||
content'\e021' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bookmark:before { |
|
||||||
content'\e022' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-box:before { |
|
||||||
content'\e023' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-briefcase:before { |
|
||||||
content'\e024' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-british-pound:before { |
|
||||||
content'\e025' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-browser:before { |
|
||||||
content'\e026' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-brush:before { |
|
||||||
content'\e027' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bug:before { |
|
||||||
content'\e028' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-bullhorn:before { |
|
||||||
content'\e029' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-calculator:before { |
|
||||||
content'\e02a' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-calendar:before { |
|
||||||
content'\e02b' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-camera-slr:before { |
|
||||||
content'\e02c' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-bottom:before { |
|
||||||
content'\e02d' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-left:before { |
|
||||||
content'\e02e' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-right:before { |
|
||||||
content'\e02f' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-caret-top:before { |
|
||||||
content'\e030' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cart:before { |
|
||||||
content'\e031' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chat:before { |
|
||||||
content'\e032' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-check:before { |
|
||||||
content'\e033' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-bottom:before { |
|
||||||
content'\e034' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-left:before { |
|
||||||
content'\e035' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-right:before { |
|
||||||
content'\e036' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-chevron-top:before { |
|
||||||
content'\e037' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-circle-check:before { |
|
||||||
content'\e038' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-circle-x:before { |
|
||||||
content'\e039' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-clipboard:before { |
|
||||||
content'\e03a' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-clock:before { |
|
||||||
content'\e03b' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud-download:before { |
|
||||||
content'\e03c' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud-upload:before { |
|
||||||
content'\e03d' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloud:before { |
|
||||||
content'\e03e' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cloudy:before { |
|
||||||
content'\e03f' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-code:before { |
|
||||||
content'\e040' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-cog:before { |
|
||||||
content'\e041' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-down:before { |
|
||||||
content'\e042' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-left:before { |
|
||||||
content'\e043' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-right:before { |
|
||||||
content'\e044' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-collapse-up:before { |
|
||||||
content'\e045' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-command:before { |
|
||||||
content'\e046' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-comment-square:before { |
|
||||||
content'\e047' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-compass:before { |
|
||||||
content'\e048' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-contrast:before { |
|
||||||
content'\e049' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-copywriting:before { |
|
||||||
content'\e04a' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-credit-card:before { |
|
||||||
content'\e04b' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-crop:before { |
|
||||||
content'\e04c' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dashboard:before { |
|
||||||
content'\e04d' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-data-transfer-download:before { |
|
||||||
content'\e04e' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-data-transfer-upload:before { |
|
||||||
content'\e04f' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-delete:before { |
|
||||||
content'\e050' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dial:before { |
|
||||||
content'\e051' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-document:before { |
|
||||||
content'\e052' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-dollar:before { |
|
||||||
content'\e053' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-sans-left:before { |
|
||||||
content'\e054' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-sans-right:before { |
|
||||||
content'\e055' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-serif-left:before { |
|
||||||
content'\e056' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-double-quote-serif-right:before { |
|
||||||
content'\e057' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-droplet:before { |
|
||||||
content'\e058' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eject:before { |
|
||||||
content'\e059' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-elevator:before { |
|
||||||
content'\e05a' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-ellipses:before { |
|
||||||
content'\e05b' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-envelope-closed:before { |
|
||||||
content'\e05c' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-envelope-open:before { |
|
||||||
content'\e05d' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-euro:before { |
|
||||||
content'\e05e' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-excerpt:before { |
|
||||||
content'\e05f' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-down:before { |
|
||||||
content'\e060' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-left:before { |
|
||||||
content'\e061' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-right:before { |
|
||||||
content'\e062' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-expand-up:before { |
|
||||||
content'\e063' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-external-link:before { |
|
||||||
content'\e064' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eye:before { |
|
||||||
content'\e065' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-eyedropper:before { |
|
||||||
content'\e066' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-file:before { |
|
||||||
content'\e067' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fire:before { |
|
||||||
content'\e068' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-flag:before { |
|
||||||
content'\e069' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-flash:before { |
|
||||||
content'\e06a' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-folder:before { |
|
||||||
content'\e06b' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fork:before { |
|
||||||
content'\e06c' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fullscreen-enter:before { |
|
||||||
content'\e06d' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-fullscreen-exit:before { |
|
||||||
content'\e06e' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-globe:before { |
|
||||||
content'\e06f' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-graph:before { |
|
||||||
content'\e070' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-four-up:before { |
|
||||||
content'\e071' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-three-up:before { |
|
||||||
content'\e072' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-grid-two-up:before { |
|
||||||
content'\e073' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-hard-drive:before { |
|
||||||
content'\e074' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-header:before { |
|
||||||
content'\e075' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-headphones:before { |
|
||||||
content'\e076' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-heart:before { |
|
||||||
content'\e077' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-home:before { |
|
||||||
content'\e078' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-image:before { |
|
||||||
content'\e079' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-inbox:before { |
|
||||||
content'\e07a' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-infinity:before { |
|
||||||
content'\e07b' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-info:before { |
|
||||||
content'\e07c' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-italic:before { |
|
||||||
content'\e07d' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-center:before { |
|
||||||
content'\e07e' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-left:before { |
|
||||||
content'\e07f' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-justify-right:before { |
|
||||||
content'\e080' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-key:before { |
|
||||||
content'\e081' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-laptop:before { |
|
||||||
content'\e082' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-layers:before { |
|
||||||
content'\e083' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lightbulb:before { |
|
||||||
content'\e084' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-link-broken:before { |
|
||||||
content'\e085' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-link-intact:before { |
|
||||||
content'\e086' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-list-rich:before { |
|
||||||
content'\e087' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-list:before { |
|
||||||
content'\e088' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-location:before { |
|
||||||
content'\e089' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lock-locked:before { |
|
||||||
content'\e08a' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-lock-unlocked:before { |
|
||||||
content'\e08b' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop-circular:before { |
|
||||||
content'\e08c' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop-square:before { |
|
||||||
content'\e08d' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-loop:before { |
|
||||||
content'\e08e' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-magnifying-glass:before { |
|
||||||
content'\e08f' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-map-marker:before { |
|
||||||
content'\e090' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-map:before { |
|
||||||
content'\e091' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-pause:before { |
|
||||||
content'\e092' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-play:before { |
|
||||||
content'\e093' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-record:before { |
|
||||||
content'\e094' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-skip-backward:before { |
|
||||||
content'\e095' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-skip-forward:before { |
|
||||||
content'\e096' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-step-backward:before { |
|
||||||
content'\e097' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-step-forward:before { |
|
||||||
content'\e098' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-media-stop:before { |
|
||||||
content'\e099' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-medical-cross:before { |
|
||||||
content'\e09a' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-menu:before { |
|
||||||
content'\e09b' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-microphone:before { |
|
||||||
content'\e09c' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-minus:before { |
|
||||||
content'\e09d' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-monitor:before { |
|
||||||
content'\e09e' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-moon:before { |
|
||||||
content'\e09f' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-move:before { |
|
||||||
content'\e0a0' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-musical-note:before { |
|
||||||
content'\e0a1' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-paperclip:before { |
|
||||||
content'\e0a2' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pencil:before { |
|
||||||
content'\e0a3' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-people:before { |
|
||||||
content'\e0a4' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-person:before { |
|
||||||
content'\e0a5' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-phone:before { |
|
||||||
content'\e0a6' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pie-chart:before { |
|
||||||
content'\e0a7' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pin:before { |
|
||||||
content'\e0a8' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-play-circle:before { |
|
||||||
content'\e0a9' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-plus:before { |
|
||||||
content'\e0aa' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-power-standby:before { |
|
||||||
content'\e0ab' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-print:before { |
|
||||||
content'\e0ac' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-project:before { |
|
||||||
content'\e0ad' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-pulse:before { |
|
||||||
content'\e0ae' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-puzzle-piece:before { |
|
||||||
content'\e0af' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-question-mark:before { |
|
||||||
content'\e0b0' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rain:before { |
|
||||||
content'\e0b1' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-random:before { |
|
||||||
content'\e0b2' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-reload:before { |
|
||||||
content'\e0b3' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-both:before { |
|
||||||
content'\e0b4' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-height:before { |
|
||||||
content'\e0b5' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-resize-width:before { |
|
||||||
content'\e0b6' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rss-alt:before { |
|
||||||
content'\e0b7' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-rss:before { |
|
||||||
content'\e0b8' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-script:before { |
|
||||||
content'\e0b9' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-share-boxed:before { |
|
||||||
content'\e0ba' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-share:before { |
|
||||||
content'\e0bb' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-shield:before { |
|
||||||
content'\e0bc' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-signal:before { |
|
||||||
content'\e0bd' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-signpost:before { |
|
||||||
content'\e0be' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sort-ascending:before { |
|
||||||
content'\e0bf' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sort-descending:before { |
|
||||||
content'\e0c0' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-spreadsheet:before { |
|
||||||
content'\e0c1' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-star:before { |
|
||||||
content'\e0c2' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-sun:before { |
|
||||||
content'\e0c3' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tablet:before { |
|
||||||
content'\e0c4' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tag:before { |
|
||||||
content'\e0c5' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-tags:before { |
|
||||||
content'\e0c6' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-target:before { |
|
||||||
content'\e0c7' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-task:before { |
|
||||||
content'\e0c8' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-terminal:before { |
|
||||||
content'\e0c9' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-text:before { |
|
||||||
content'\e0ca' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-thumb-down:before { |
|
||||||
content'\e0cb' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-thumb-up:before { |
|
||||||
content'\e0cc' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-timer:before { |
|
||||||
content'\e0cd' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-transfer:before { |
|
||||||
content'\e0ce' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-trash:before { |
|
||||||
content'\e0cf' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-underline:before { |
|
||||||
content'\e0d0' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-bottom:before { |
|
||||||
content'\e0d1' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-center:before { |
|
||||||
content'\e0d2' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-vertical-align-top:before { |
|
||||||
content'\e0d3' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-video:before { |
|
||||||
content'\e0d4' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-high:before { |
|
||||||
content'\e0d5' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-low:before { |
|
||||||
content'\e0d6' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-volume-off:before { |
|
||||||
content'\e0d7' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-warning:before { |
|
||||||
content'\e0d8' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-wifi:before { |
|
||||||
content'\e0d9' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-wrench:before { |
|
||||||
content'\e0da' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-x:before { |
|
||||||
content'\e0db' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-yen:before { |
|
||||||
content'\e0dc' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-zoom-in:before { |
|
||||||
content'\e0dd' |
|
||||||
} |
|
||||||
|
|
||||||
.oi-zoom-out:before { |
|
||||||
content'\e0de' |
|
||||||
} |
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,511 +0,0 @@ |
|||||||
|
|
||||||
@font-face { |
|
||||||
font-family: 'Icons'; |
|
||||||
src: url('../fonts/open-iconic.eot'); |
|
||||||
src: url('../fonts/open-iconic.eot?#iconic-sm') format('embedded-opentype'), url('../fonts/open-iconic.woff') format('woff'), url('../fonts/open-iconic.ttf') format('truetype'), url('../fonts/open-iconic.otf') format('opentype'), url('../fonts/open-iconic.svg#iconic-sm') format('svg'); |
|
||||||
font-weight: normal; |
|
||||||
font-style: normal; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph].oi-text-replace { |
|
||||||
font-size: 0; |
|
||||||
line-height: 0; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph].oi-text-replace:before { |
|
||||||
width: 1em; |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph]:before { |
|
||||||
font-family: 'Icons'; |
|
||||||
display: inline-block; |
|
||||||
speak: none; |
|
||||||
line-height: 1; |
|
||||||
vertical-align: baseline; |
|
||||||
font-weight: normal; |
|
||||||
font-style: normal; |
|
||||||
-webkit-font-smoothing: antialiased; |
|
||||||
-moz-osx-font-smoothing: grayscale; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph]:empty:before { |
|
||||||
width: 1em; |
|
||||||
text-align: center; |
|
||||||
box-sizing: content-box; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph].oi-align-left:before { |
|
||||||
text-align: left; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph].oi-align-right:before { |
|
||||||
text-align: right; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph].oi-align-center:before { |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph].oi-flip-horizontal:before { |
|
||||||
-webkit-transform: scale(-1, 1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, 1); |
|
||||||
} |
|
||||||
.oi[data-glyph].oi-flip-vertical:before { |
|
||||||
-webkit-transform: scale(1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(1, -1); |
|
||||||
} |
|
||||||
.oi[data-glyph].oi-flip-horizontal-vertical:before { |
|
||||||
-webkit-transform: scale(-1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, -1); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
.oi[data-glyph=account-login]:before { content:'\e000'; } |
|
||||||
|
|
||||||
.oi[data-glyph=account-logout]:before { content:'\e001'; } |
|
||||||
|
|
||||||
.oi[data-glyph=action-redo]:before { content:'\e002'; } |
|
||||||
|
|
||||||
.oi[data-glyph=action-undo]:before { content:'\e003'; } |
|
||||||
|
|
||||||
.oi[data-glyph=align-center]:before { content:'\e004'; } |
|
||||||
|
|
||||||
.oi[data-glyph=align-left]:before { content:'\e005'; } |
|
||||||
|
|
||||||
.oi[data-glyph=align-right]:before { content:'\e006'; } |
|
||||||
|
|
||||||
.oi[data-glyph=aperture]:before { content:'\e007'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-bottom]:before { content:'\e008'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-bottom]:before { content:'\e009'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-left]:before { content:'\e00a'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-right]:before { content:'\e00b'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-top]:before { content:'\e00c'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-left]:before { content:'\e00d'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-right]:before { content:'\e00e'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-bottom]:before { content:'\e00f'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-left]:before { content:'\e010'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-right]:before { content:'\e011'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-top]:before { content:'\e012'; } |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-top]:before { content:'\e013'; } |
|
||||||
|
|
||||||
.oi[data-glyph=audio-spectrum]:before { content:'\e014'; } |
|
||||||
|
|
||||||
.oi[data-glyph=audio]:before { content:'\e015'; } |
|
||||||
|
|
||||||
.oi[data-glyph=badge]:before { content:'\e016'; } |
|
||||||
|
|
||||||
.oi[data-glyph=ban]:before { content:'\e017'; } |
|
||||||
|
|
||||||
.oi[data-glyph=bar-chart]:before { content:'\e018'; } |
|
||||||
|
|
||||||
.oi[data-glyph=basket]:before { content:'\e019'; } |
|
||||||
|
|
||||||
.oi[data-glyph=battery-empty]:before { content:'\e01a'; } |
|
||||||
|
|
||||||
.oi[data-glyph=battery-full]:before { content:'\e01b'; } |
|
||||||
|
|
||||||
.oi[data-glyph=beaker]:before { content:'\e01c'; } |
|
||||||
|
|
||||||
.oi[data-glyph=bell]:before { content:'\e01d'; } |
|
||||||
|
|
||||||
.oi[data-glyph=bluetooth]:before { content:'\e01e'; } |
|
||||||
|
|
||||||
.oi[data-glyph=bold]:before { content:'\e01f'; } |
|
||||||
|
|
||||||
.oi[data-glyph=bolt]:before { content:'\e020'; } |
|
||||||
|
|
||||||
.oi[data-glyph=book]:before { content:'\e021'; } |
|
||||||
|
|
||||||
.oi[data-glyph=bookmark]:before { content:'\e022'; } |
|
||||||
|
|
||||||
.oi[data-glyph=box]:before { content:'\e023'; } |
|
||||||
|
|
||||||
.oi[data-glyph=briefcase]:before { content:'\e024'; } |
|
||||||
|
|
||||||
.oi[data-glyph=british-pound]:before { content:'\e025'; } |
|
||||||
|
|
||||||
.oi[data-glyph=browser]:before { content:'\e026'; } |
|
||||||
|
|
||||||
.oi[data-glyph=brush]:before { content:'\e027'; } |
|
||||||
|
|
||||||
.oi[data-glyph=bug]:before { content:'\e028'; } |
|
||||||
|
|
||||||
.oi[data-glyph=bullhorn]:before { content:'\e029'; } |
|
||||||
|
|
||||||
.oi[data-glyph=calculator]:before { content:'\e02a'; } |
|
||||||
|
|
||||||
.oi[data-glyph=calendar]:before { content:'\e02b'; } |
|
||||||
|
|
||||||
.oi[data-glyph=camera-slr]:before { content:'\e02c'; } |
|
||||||
|
|
||||||
.oi[data-glyph=caret-bottom]:before { content:'\e02d'; } |
|
||||||
|
|
||||||
.oi[data-glyph=caret-left]:before { content:'\e02e'; } |
|
||||||
|
|
||||||
.oi[data-glyph=caret-right]:before { content:'\e02f'; } |
|
||||||
|
|
||||||
.oi[data-glyph=caret-top]:before { content:'\e030'; } |
|
||||||
|
|
||||||
.oi[data-glyph=cart]:before { content:'\e031'; } |
|
||||||
|
|
||||||
.oi[data-glyph=chat]:before { content:'\e032'; } |
|
||||||
|
|
||||||
.oi[data-glyph=check]:before { content:'\e033'; } |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-bottom]:before { content:'\e034'; } |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-left]:before { content:'\e035'; } |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-right]:before { content:'\e036'; } |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-top]:before { content:'\e037'; } |
|
||||||
|
|
||||||
.oi[data-glyph=circle-check]:before { content:'\e038'; } |
|
||||||
|
|
||||||
.oi[data-glyph=circle-x]:before { content:'\e039'; } |
|
||||||
|
|
||||||
.oi[data-glyph=clipboard]:before { content:'\e03a'; } |
|
||||||
|
|
||||||
.oi[data-glyph=clock]:before { content:'\e03b'; } |
|
||||||
|
|
||||||
.oi[data-glyph=cloud-download]:before { content:'\e03c'; } |
|
||||||
|
|
||||||
.oi[data-glyph=cloud-upload]:before { content:'\e03d'; } |
|
||||||
|
|
||||||
.oi[data-glyph=cloud]:before { content:'\e03e'; } |
|
||||||
|
|
||||||
.oi[data-glyph=cloudy]:before { content:'\e03f'; } |
|
||||||
|
|
||||||
.oi[data-glyph=code]:before { content:'\e040'; } |
|
||||||
|
|
||||||
.oi[data-glyph=cog]:before { content:'\e041'; } |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-down]:before { content:'\e042'; } |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-left]:before { content:'\e043'; } |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-right]:before { content:'\e044'; } |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-up]:before { content:'\e045'; } |
|
||||||
|
|
||||||
.oi[data-glyph=command]:before { content:'\e046'; } |
|
||||||
|
|
||||||
.oi[data-glyph=comment-square]:before { content:'\e047'; } |
|
||||||
|
|
||||||
.oi[data-glyph=compass]:before { content:'\e048'; } |
|
||||||
|
|
||||||
.oi[data-glyph=contrast]:before { content:'\e049'; } |
|
||||||
|
|
||||||
.oi[data-glyph=copywriting]:before { content:'\e04a'; } |
|
||||||
|
|
||||||
.oi[data-glyph=credit-card]:before { content:'\e04b'; } |
|
||||||
|
|
||||||
.oi[data-glyph=crop]:before { content:'\e04c'; } |
|
||||||
|
|
||||||
.oi[data-glyph=dashboard]:before { content:'\e04d'; } |
|
||||||
|
|
||||||
.oi[data-glyph=data-transfer-download]:before { content:'\e04e'; } |
|
||||||
|
|
||||||
.oi[data-glyph=data-transfer-upload]:before { content:'\e04f'; } |
|
||||||
|
|
||||||
.oi[data-glyph=delete]:before { content:'\e050'; } |
|
||||||
|
|
||||||
.oi[data-glyph=dial]:before { content:'\e051'; } |
|
||||||
|
|
||||||
.oi[data-glyph=document]:before { content:'\e052'; } |
|
||||||
|
|
||||||
.oi[data-glyph=dollar]:before { content:'\e053'; } |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-sans-left]:before { content:'\e054'; } |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-sans-right]:before { content:'\e055'; } |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-serif-left]:before { content:'\e056'; } |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-serif-right]:before { content:'\e057'; } |
|
||||||
|
|
||||||
.oi[data-glyph=droplet]:before { content:'\e058'; } |
|
||||||
|
|
||||||
.oi[data-glyph=eject]:before { content:'\e059'; } |
|
||||||
|
|
||||||
.oi[data-glyph=elevator]:before { content:'\e05a'; } |
|
||||||
|
|
||||||
.oi[data-glyph=ellipses]:before { content:'\e05b'; } |
|
||||||
|
|
||||||
.oi[data-glyph=envelope-closed]:before { content:'\e05c'; } |
|
||||||
|
|
||||||
.oi[data-glyph=envelope-open]:before { content:'\e05d'; } |
|
||||||
|
|
||||||
.oi[data-glyph=euro]:before { content:'\e05e'; } |
|
||||||
|
|
||||||
.oi[data-glyph=excerpt]:before { content:'\e05f'; } |
|
||||||
|
|
||||||
.oi[data-glyph=expand-down]:before { content:'\e060'; } |
|
||||||
|
|
||||||
.oi[data-glyph=expand-left]:before { content:'\e061'; } |
|
||||||
|
|
||||||
.oi[data-glyph=expand-right]:before { content:'\e062'; } |
|
||||||
|
|
||||||
.oi[data-glyph=expand-up]:before { content:'\e063'; } |
|
||||||
|
|
||||||
.oi[data-glyph=external-link]:before { content:'\e064'; } |
|
||||||
|
|
||||||
.oi[data-glyph=eye]:before { content:'\e065'; } |
|
||||||
|
|
||||||
.oi[data-glyph=eyedropper]:before { content:'\e066'; } |
|
||||||
|
|
||||||
.oi[data-glyph=file]:before { content:'\e067'; } |
|
||||||
|
|
||||||
.oi[data-glyph=fire]:before { content:'\e068'; } |
|
||||||
|
|
||||||
.oi[data-glyph=flag]:before { content:'\e069'; } |
|
||||||
|
|
||||||
.oi[data-glyph=flash]:before { content:'\e06a'; } |
|
||||||
|
|
||||||
.oi[data-glyph=folder]:before { content:'\e06b'; } |
|
||||||
|
|
||||||
.oi[data-glyph=fork]:before { content:'\e06c'; } |
|
||||||
|
|
||||||
.oi[data-glyph=fullscreen-enter]:before { content:'\e06d'; } |
|
||||||
|
|
||||||
.oi[data-glyph=fullscreen-exit]:before { content:'\e06e'; } |
|
||||||
|
|
||||||
.oi[data-glyph=globe]:before { content:'\e06f'; } |
|
||||||
|
|
||||||
.oi[data-glyph=graph]:before { content:'\e070'; } |
|
||||||
|
|
||||||
.oi[data-glyph=grid-four-up]:before { content:'\e071'; } |
|
||||||
|
|
||||||
.oi[data-glyph=grid-three-up]:before { content:'\e072'; } |
|
||||||
|
|
||||||
.oi[data-glyph=grid-two-up]:before { content:'\e073'; } |
|
||||||
|
|
||||||
.oi[data-glyph=hard-drive]:before { content:'\e074'; } |
|
||||||
|
|
||||||
.oi[data-glyph=header]:before { content:'\e075'; } |
|
||||||
|
|
||||||
.oi[data-glyph=headphones]:before { content:'\e076'; } |
|
||||||
|
|
||||||
.oi[data-glyph=heart]:before { content:'\e077'; } |
|
||||||
|
|
||||||
.oi[data-glyph=home]:before { content:'\e078'; } |
|
||||||
|
|
||||||
.oi[data-glyph=image]:before { content:'\e079'; } |
|
||||||
|
|
||||||
.oi[data-glyph=inbox]:before { content:'\e07a'; } |
|
||||||
|
|
||||||
.oi[data-glyph=infinity]:before { content:'\e07b'; } |
|
||||||
|
|
||||||
.oi[data-glyph=info]:before { content:'\e07c'; } |
|
||||||
|
|
||||||
.oi[data-glyph=italic]:before { content:'\e07d'; } |
|
||||||
|
|
||||||
.oi[data-glyph=justify-center]:before { content:'\e07e'; } |
|
||||||
|
|
||||||
.oi[data-glyph=justify-left]:before { content:'\e07f'; } |
|
||||||
|
|
||||||
.oi[data-glyph=justify-right]:before { content:'\e080'; } |
|
||||||
|
|
||||||
.oi[data-glyph=key]:before { content:'\e081'; } |
|
||||||
|
|
||||||
.oi[data-glyph=laptop]:before { content:'\e082'; } |
|
||||||
|
|
||||||
.oi[data-glyph=layers]:before { content:'\e083'; } |
|
||||||
|
|
||||||
.oi[data-glyph=lightbulb]:before { content:'\e084'; } |
|
||||||
|
|
||||||
.oi[data-glyph=link-broken]:before { content:'\e085'; } |
|
||||||
|
|
||||||
.oi[data-glyph=link-intact]:before { content:'\e086'; } |
|
||||||
|
|
||||||
.oi[data-glyph=list-rich]:before { content:'\e087'; } |
|
||||||
|
|
||||||
.oi[data-glyph=list]:before { content:'\e088'; } |
|
||||||
|
|
||||||
.oi[data-glyph=location]:before { content:'\e089'; } |
|
||||||
|
|
||||||
.oi[data-glyph=lock-locked]:before { content:'\e08a'; } |
|
||||||
|
|
||||||
.oi[data-glyph=lock-unlocked]:before { content:'\e08b'; } |
|
||||||
|
|
||||||
.oi[data-glyph=loop-circular]:before { content:'\e08c'; } |
|
||||||
|
|
||||||
.oi[data-glyph=loop-square]:before { content:'\e08d'; } |
|
||||||
|
|
||||||
.oi[data-glyph=loop]:before { content:'\e08e'; } |
|
||||||
|
|
||||||
.oi[data-glyph=magnifying-glass]:before { content:'\e08f'; } |
|
||||||
|
|
||||||
.oi[data-glyph=map-marker]:before { content:'\e090'; } |
|
||||||
|
|
||||||
.oi[data-glyph=map]:before { content:'\e091'; } |
|
||||||
|
|
||||||
.oi[data-glyph=media-pause]:before { content:'\e092'; } |
|
||||||
|
|
||||||
.oi[data-glyph=media-play]:before { content:'\e093'; } |
|
||||||
|
|
||||||
.oi[data-glyph=media-record]:before { content:'\e094'; } |
|
||||||
|
|
||||||
.oi[data-glyph=media-skip-backward]:before { content:'\e095'; } |
|
||||||
|
|
||||||
.oi[data-glyph=media-skip-forward]:before { content:'\e096'; } |
|
||||||
|
|
||||||
.oi[data-glyph=media-step-backward]:before { content:'\e097'; } |
|
||||||
|
|
||||||
.oi[data-glyph=media-step-forward]:before { content:'\e098'; } |
|
||||||
|
|
||||||
.oi[data-glyph=media-stop]:before { content:'\e099'; } |
|
||||||
|
|
||||||
.oi[data-glyph=medical-cross]:before { content:'\e09a'; } |
|
||||||
|
|
||||||
.oi[data-glyph=menu]:before { content:'\e09b'; } |
|
||||||
|
|
||||||
.oi[data-glyph=microphone]:before { content:'\e09c'; } |
|
||||||
|
|
||||||
.oi[data-glyph=minus]:before { content:'\e09d'; } |
|
||||||
|
|
||||||
.oi[data-glyph=monitor]:before { content:'\e09e'; } |
|
||||||
|
|
||||||
.oi[data-glyph=moon]:before { content:'\e09f'; } |
|
||||||
|
|
||||||
.oi[data-glyph=move]:before { content:'\e0a0'; } |
|
||||||
|
|
||||||
.oi[data-glyph=musical-note]:before { content:'\e0a1'; } |
|
||||||
|
|
||||||
.oi[data-glyph=paperclip]:before { content:'\e0a2'; } |
|
||||||
|
|
||||||
.oi[data-glyph=pencil]:before { content:'\e0a3'; } |
|
||||||
|
|
||||||
.oi[data-glyph=people]:before { content:'\e0a4'; } |
|
||||||
|
|
||||||
.oi[data-glyph=person]:before { content:'\e0a5'; } |
|
||||||
|
|
||||||
.oi[data-glyph=phone]:before { content:'\e0a6'; } |
|
||||||
|
|
||||||
.oi[data-glyph=pie-chart]:before { content:'\e0a7'; } |
|
||||||
|
|
||||||
.oi[data-glyph=pin]:before { content:'\e0a8'; } |
|
||||||
|
|
||||||
.oi[data-glyph=play-circle]:before { content:'\e0a9'; } |
|
||||||
|
|
||||||
.oi[data-glyph=plus]:before { content:'\e0aa'; } |
|
||||||
|
|
||||||
.oi[data-glyph=power-standby]:before { content:'\e0ab'; } |
|
||||||
|
|
||||||
.oi[data-glyph=print]:before { content:'\e0ac'; } |
|
||||||
|
|
||||||
.oi[data-glyph=project]:before { content:'\e0ad'; } |
|
||||||
|
|
||||||
.oi[data-glyph=pulse]:before { content:'\e0ae'; } |
|
||||||
|
|
||||||
.oi[data-glyph=puzzle-piece]:before { content:'\e0af'; } |
|
||||||
|
|
||||||
.oi[data-glyph=question-mark]:before { content:'\e0b0'; } |
|
||||||
|
|
||||||
.oi[data-glyph=rain]:before { content:'\e0b1'; } |
|
||||||
|
|
||||||
.oi[data-glyph=random]:before { content:'\e0b2'; } |
|
||||||
|
|
||||||
.oi[data-glyph=reload]:before { content:'\e0b3'; } |
|
||||||
|
|
||||||
.oi[data-glyph=resize-both]:before { content:'\e0b4'; } |
|
||||||
|
|
||||||
.oi[data-glyph=resize-height]:before { content:'\e0b5'; } |
|
||||||
|
|
||||||
.oi[data-glyph=resize-width]:before { content:'\e0b6'; } |
|
||||||
|
|
||||||
.oi[data-glyph=rss-alt]:before { content:'\e0b7'; } |
|
||||||
|
|
||||||
.oi[data-glyph=rss]:before { content:'\e0b8'; } |
|
||||||
|
|
||||||
.oi[data-glyph=script]:before { content:'\e0b9'; } |
|
||||||
|
|
||||||
.oi[data-glyph=share-boxed]:before { content:'\e0ba'; } |
|
||||||
|
|
||||||
.oi[data-glyph=share]:before { content:'\e0bb'; } |
|
||||||
|
|
||||||
.oi[data-glyph=shield]:before { content:'\e0bc'; } |
|
||||||
|
|
||||||
.oi[data-glyph=signal]:before { content:'\e0bd'; } |
|
||||||
|
|
||||||
.oi[data-glyph=signpost]:before { content:'\e0be'; } |
|
||||||
|
|
||||||
.oi[data-glyph=sort-ascending]:before { content:'\e0bf'; } |
|
||||||
|
|
||||||
.oi[data-glyph=sort-descending]:before { content:'\e0c0'; } |
|
||||||
|
|
||||||
.oi[data-glyph=spreadsheet]:before { content:'\e0c1'; } |
|
||||||
|
|
||||||
.oi[data-glyph=star]:before { content:'\e0c2'; } |
|
||||||
|
|
||||||
.oi[data-glyph=sun]:before { content:'\e0c3'; } |
|
||||||
|
|
||||||
.oi[data-glyph=tablet]:before { content:'\e0c4'; } |
|
||||||
|
|
||||||
.oi[data-glyph=tag]:before { content:'\e0c5'; } |
|
||||||
|
|
||||||
.oi[data-glyph=tags]:before { content:'\e0c6'; } |
|
||||||
|
|
||||||
.oi[data-glyph=target]:before { content:'\e0c7'; } |
|
||||||
|
|
||||||
.oi[data-glyph=task]:before { content:'\e0c8'; } |
|
||||||
|
|
||||||
.oi[data-glyph=terminal]:before { content:'\e0c9'; } |
|
||||||
|
|
||||||
.oi[data-glyph=text]:before { content:'\e0ca'; } |
|
||||||
|
|
||||||
.oi[data-glyph=thumb-down]:before { content:'\e0cb'; } |
|
||||||
|
|
||||||
.oi[data-glyph=thumb-up]:before { content:'\e0cc'; } |
|
||||||
|
|
||||||
.oi[data-glyph=timer]:before { content:'\e0cd'; } |
|
||||||
|
|
||||||
.oi[data-glyph=transfer]:before { content:'\e0ce'; } |
|
||||||
|
|
||||||
.oi[data-glyph=trash]:before { content:'\e0cf'; } |
|
||||||
|
|
||||||
.oi[data-glyph=underline]:before { content:'\e0d0'; } |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-bottom]:before { content:'\e0d1'; } |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-center]:before { content:'\e0d2'; } |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-top]:before { content:'\e0d3'; } |
|
||||||
|
|
||||||
.oi[data-glyph=video]:before { content:'\e0d4'; } |
|
||||||
|
|
||||||
.oi[data-glyph=volume-high]:before { content:'\e0d5'; } |
|
||||||
|
|
||||||
.oi[data-glyph=volume-low]:before { content:'\e0d6'; } |
|
||||||
|
|
||||||
.oi[data-glyph=volume-off]:before { content:'\e0d7'; } |
|
||||||
|
|
||||||
.oi[data-glyph=warning]:before { content:'\e0d8'; } |
|
||||||
|
|
||||||
.oi[data-glyph=wifi]:before { content:'\e0d9'; } |
|
||||||
|
|
||||||
.oi[data-glyph=wrench]:before { content:'\e0da'; } |
|
||||||
|
|
||||||
.oi[data-glyph=x]:before { content:'\e0db'; } |
|
||||||
|
|
||||||
.oi[data-glyph=yen]:before { content:'\e0dc'; } |
|
||||||
|
|
||||||
.oi[data-glyph=zoom-in]:before { content:'\e0dd'; } |
|
||||||
|
|
||||||
.oi[data-glyph=zoom-out]:before { content:'\e0de'; } |
|
@ -1,962 +0,0 @@ |
|||||||
@iconic-font-path: '../fonts/'; |
|
||||||
|
|
||||||
@font-face { |
|
||||||
font-family: 'Icons'; |
|
||||||
src: url('@{iconic-font-path}open-iconic.eot'); |
|
||||||
src: url('@{iconic-font-path}open-iconic.eot?#iconic-sm') format('embedded-opentype'), url('@{iconic-font-path}open-iconic.woff') format('woff'), url('@{iconic-font-path}open-iconic.ttf') format('truetype'), url('@{iconic-font-path}open-iconic.otf') format('opentype'), url('@{iconic-font-path}open-iconic.svg#iconic-sm') format('svg'); |
|
||||||
font-weight: normal; |
|
||||||
font-style: normal; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph].oi-text-replace { |
|
||||||
font-size: 0; |
|
||||||
line-height: 0; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph].oi-text-replace:before { |
|
||||||
width: 1em; |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph] { |
|
||||||
&:before { |
|
||||||
position: relative; |
|
||||||
top: 1px; |
|
||||||
font-family: 'Icons'; |
|
||||||
display: inline-block; |
|
||||||
speak: none; |
|
||||||
line-height: 1; |
|
||||||
vertical-align: baseline; |
|
||||||
font-weight: normal; |
|
||||||
font-style: normal; |
|
||||||
-webkit-font-smoothing: antialiased; |
|
||||||
-moz-osx-font-smoothing: grayscale; |
|
||||||
} |
|
||||||
|
|
||||||
&:empty:before { |
|
||||||
width: 1em; |
|
||||||
text-align: center; |
|
||||||
box-sizing: content-box; |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-align-left:before { |
|
||||||
text-align: left; |
|
||||||
} |
|
||||||
&.oi-align-right:before { |
|
||||||
text-align: right; |
|
||||||
} |
|
||||||
&.oi-align-center:before { |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-flip-horizontal:before { |
|
||||||
-webkit-transform: scale(-1, 1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, 1); |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-flip-vertical:before { |
|
||||||
-webkit-transform: scale(1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(1, -1); |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-flip-horizontal-vertical:before { |
|
||||||
-webkit-transform: scale(-1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, -1); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
.oi[data-glyph=account-login]:before { |
|
||||||
content: '\e000'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=account-logout]:before { |
|
||||||
content: '\e001'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=action-redo]:before { |
|
||||||
content: '\e002'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=action-undo]:before { |
|
||||||
content: '\e003'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=align-center]:before { |
|
||||||
content: '\e004'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=align-left]:before { |
|
||||||
content: '\e005'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=align-right]:before { |
|
||||||
content: '\e006'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=aperture]:before { |
|
||||||
content: '\e007'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-bottom]:before { |
|
||||||
content: '\e008'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-bottom]:before { |
|
||||||
content: '\e009'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-left]:before { |
|
||||||
content: '\e00a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-right]:before { |
|
||||||
content: '\e00b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-top]:before { |
|
||||||
content: '\e00c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-left]:before { |
|
||||||
content: '\e00d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-right]:before { |
|
||||||
content: '\e00e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-bottom]:before { |
|
||||||
content: '\e00f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-left]:before { |
|
||||||
content: '\e010'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-right]:before { |
|
||||||
content: '\e011'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-top]:before { |
|
||||||
content: '\e012'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-top]:before { |
|
||||||
content: '\e013'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=audio-spectrum]:before { |
|
||||||
content: '\e014'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=audio]:before { |
|
||||||
content: '\e015'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=badge]:before { |
|
||||||
content: '\e016'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=ban]:before { |
|
||||||
content: '\e017'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bar-chart]:before { |
|
||||||
content: '\e018'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=basket]:before { |
|
||||||
content: '\e019'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=battery-empty]:before { |
|
||||||
content: '\e01a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=battery-full]:before { |
|
||||||
content: '\e01b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=beaker]:before { |
|
||||||
content: '\e01c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bell]:before { |
|
||||||
content: '\e01d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bluetooth]:before { |
|
||||||
content: '\e01e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bold]:before { |
|
||||||
content: '\e01f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bolt]:before { |
|
||||||
content: '\e020'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=book]:before { |
|
||||||
content: '\e021'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bookmark]:before { |
|
||||||
content: '\e022'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=box]:before { |
|
||||||
content: '\e023'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=briefcase]:before { |
|
||||||
content: '\e024'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=british-pound]:before { |
|
||||||
content: '\e025'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=browser]:before { |
|
||||||
content: '\e026'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=brush]:before { |
|
||||||
content: '\e027'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bug]:before { |
|
||||||
content: '\e028'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bullhorn]:before { |
|
||||||
content: '\e029'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=calculator]:before { |
|
||||||
content: '\e02a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=calendar]:before { |
|
||||||
content: '\e02b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=camera-slr]:before { |
|
||||||
content: '\e02c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=caret-bottom]:before { |
|
||||||
content: '\e02d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=caret-left]:before { |
|
||||||
content: '\e02e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=caret-right]:before { |
|
||||||
content: '\e02f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=caret-top]:before { |
|
||||||
content: '\e030'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cart]:before { |
|
||||||
content: '\e031'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=chat]:before { |
|
||||||
content: '\e032'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=check]:before { |
|
||||||
content: '\e033'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-bottom]:before { |
|
||||||
content: '\e034'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-left]:before { |
|
||||||
content: '\e035'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-right]:before { |
|
||||||
content: '\e036'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-top]:before { |
|
||||||
content: '\e037'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=circle-check]:before { |
|
||||||
content: '\e038'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=circle-x]:before { |
|
||||||
content: '\e039'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=clipboard]:before { |
|
||||||
content: '\e03a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=clock]:before { |
|
||||||
content: '\e03b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cloud-download]:before { |
|
||||||
content: '\e03c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cloud-upload]:before { |
|
||||||
content: '\e03d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cloud]:before { |
|
||||||
content: '\e03e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cloudy]:before { |
|
||||||
content: '\e03f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=code]:before { |
|
||||||
content: '\e040'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cog]:before { |
|
||||||
content: '\e041'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-down]:before { |
|
||||||
content: '\e042'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-left]:before { |
|
||||||
content: '\e043'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-right]:before { |
|
||||||
content: '\e044'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-up]:before { |
|
||||||
content: '\e045'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=command]:before { |
|
||||||
content: '\e046'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=comment-square]:before { |
|
||||||
content: '\e047'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=compass]:before { |
|
||||||
content: '\e048'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=contrast]:before { |
|
||||||
content: '\e049'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=copywriting]:before { |
|
||||||
content: '\e04a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=credit-card]:before { |
|
||||||
content: '\e04b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=crop]:before { |
|
||||||
content: '\e04c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=dashboard]:before { |
|
||||||
content: '\e04d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=data-transfer-download]:before { |
|
||||||
content: '\e04e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=data-transfer-upload]:before { |
|
||||||
content: '\e04f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=delete]:before { |
|
||||||
content: '\e050'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=dial]:before { |
|
||||||
content: '\e051'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=document]:before { |
|
||||||
content: '\e052'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=dollar]:before { |
|
||||||
content: '\e053'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-sans-left]:before { |
|
||||||
content: '\e054'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-sans-right]:before { |
|
||||||
content: '\e055'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-serif-left]:before { |
|
||||||
content: '\e056'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-serif-right]:before { |
|
||||||
content: '\e057'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=droplet]:before { |
|
||||||
content: '\e058'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=eject]:before { |
|
||||||
content: '\e059'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=elevator]:before { |
|
||||||
content: '\e05a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=ellipses]:before { |
|
||||||
content: '\e05b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=envelope-closed]:before { |
|
||||||
content: '\e05c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=envelope-open]:before { |
|
||||||
content: '\e05d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=euro]:before { |
|
||||||
content: '\e05e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=excerpt]:before { |
|
||||||
content: '\e05f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=expand-down]:before { |
|
||||||
content: '\e060'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=expand-left]:before { |
|
||||||
content: '\e061'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=expand-right]:before { |
|
||||||
content: '\e062'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=expand-up]:before { |
|
||||||
content: '\e063'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=external-link]:before { |
|
||||||
content: '\e064'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=eye]:before { |
|
||||||
content: '\e065'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=eyedropper]:before { |
|
||||||
content: '\e066'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=file]:before { |
|
||||||
content: '\e067'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=fire]:before { |
|
||||||
content: '\e068'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=flag]:before { |
|
||||||
content: '\e069'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=flash]:before { |
|
||||||
content: '\e06a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=folder]:before { |
|
||||||
content: '\e06b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=fork]:before { |
|
||||||
content: '\e06c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=fullscreen-enter]:before { |
|
||||||
content: '\e06d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=fullscreen-exit]:before { |
|
||||||
content: '\e06e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=globe]:before { |
|
||||||
content: '\e06f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=graph]:before { |
|
||||||
content: '\e070'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=grid-four-up]:before { |
|
||||||
content: '\e071'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=grid-three-up]:before { |
|
||||||
content: '\e072'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=grid-two-up]:before { |
|
||||||
content: '\e073'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=hard-drive]:before { |
|
||||||
content: '\e074'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=header]:before { |
|
||||||
content: '\e075'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=headphones]:before { |
|
||||||
content: '\e076'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=heart]:before { |
|
||||||
content: '\e077'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=home]:before { |
|
||||||
content: '\e078'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=image]:before { |
|
||||||
content: '\e079'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=inbox]:before { |
|
||||||
content: '\e07a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=infinity]:before { |
|
||||||
content: '\e07b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=info]:before { |
|
||||||
content: '\e07c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=italic]:before { |
|
||||||
content: '\e07d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=justify-center]:before { |
|
||||||
content: '\e07e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=justify-left]:before { |
|
||||||
content: '\e07f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=justify-right]:before { |
|
||||||
content: '\e080'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=key]:before { |
|
||||||
content: '\e081'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=laptop]:before { |
|
||||||
content: '\e082'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=layers]:before { |
|
||||||
content: '\e083'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=lightbulb]:before { |
|
||||||
content: '\e084'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=link-broken]:before { |
|
||||||
content: '\e085'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=link-intact]:before { |
|
||||||
content: '\e086'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=list-rich]:before { |
|
||||||
content: '\e087'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=list]:before { |
|
||||||
content: '\e088'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=location]:before { |
|
||||||
content: '\e089'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=lock-locked]:before { |
|
||||||
content: '\e08a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=lock-unlocked]:before { |
|
||||||
content: '\e08b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=loop-circular]:before { |
|
||||||
content: '\e08c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=loop-square]:before { |
|
||||||
content: '\e08d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=loop]:before { |
|
||||||
content: '\e08e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=magnifying-glass]:before { |
|
||||||
content: '\e08f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=map-marker]:before { |
|
||||||
content: '\e090'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=map]:before { |
|
||||||
content: '\e091'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-pause]:before { |
|
||||||
content: '\e092'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-play]:before { |
|
||||||
content: '\e093'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-record]:before { |
|
||||||
content: '\e094'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-skip-backward]:before { |
|
||||||
content: '\e095'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-skip-forward]:before { |
|
||||||
content: '\e096'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-step-backward]:before { |
|
||||||
content: '\e097'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-step-forward]:before { |
|
||||||
content: '\e098'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-stop]:before { |
|
||||||
content: '\e099'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=medical-cross]:before { |
|
||||||
content: '\e09a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=menu]:before { |
|
||||||
content: '\e09b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=microphone]:before { |
|
||||||
content: '\e09c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=minus]:before { |
|
||||||
content: '\e09d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=monitor]:before { |
|
||||||
content: '\e09e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=moon]:before { |
|
||||||
content: '\e09f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=move]:before { |
|
||||||
content: '\e0a0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=musical-note]:before { |
|
||||||
content: '\e0a1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=paperclip]:before { |
|
||||||
content: '\e0a2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=pencil]:before { |
|
||||||
content: '\e0a3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=people]:before { |
|
||||||
content: '\e0a4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=person]:before { |
|
||||||
content: '\e0a5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=phone]:before { |
|
||||||
content: '\e0a6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=pie-chart]:before { |
|
||||||
content: '\e0a7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=pin]:before { |
|
||||||
content: '\e0a8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=play-circle]:before { |
|
||||||
content: '\e0a9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=plus]:before { |
|
||||||
content: '\e0aa'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=power-standby]:before { |
|
||||||
content: '\e0ab'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=print]:before { |
|
||||||
content: '\e0ac'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=project]:before { |
|
||||||
content: '\e0ad'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=pulse]:before { |
|
||||||
content: '\e0ae'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=puzzle-piece]:before { |
|
||||||
content: '\e0af'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=question-mark]:before { |
|
||||||
content: '\e0b0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=rain]:before { |
|
||||||
content: '\e0b1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=random]:before { |
|
||||||
content: '\e0b2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=reload]:before { |
|
||||||
content: '\e0b3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=resize-both]:before { |
|
||||||
content: '\e0b4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=resize-height]:before { |
|
||||||
content: '\e0b5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=resize-width]:before { |
|
||||||
content: '\e0b6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=rss-alt]:before { |
|
||||||
content: '\e0b7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=rss]:before { |
|
||||||
content: '\e0b8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=script]:before { |
|
||||||
content: '\e0b9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=share-boxed]:before { |
|
||||||
content: '\e0ba'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=share]:before { |
|
||||||
content: '\e0bb'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=shield]:before { |
|
||||||
content: '\e0bc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=signal]:before { |
|
||||||
content: '\e0bd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=signpost]:before { |
|
||||||
content: '\e0be'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=sort-ascending]:before { |
|
||||||
content: '\e0bf'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=sort-descending]:before { |
|
||||||
content: '\e0c0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=spreadsheet]:before { |
|
||||||
content: '\e0c1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=star]:before { |
|
||||||
content: '\e0c2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=sun]:before { |
|
||||||
content: '\e0c3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=tablet]:before { |
|
||||||
content: '\e0c4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=tag]:before { |
|
||||||
content: '\e0c5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=tags]:before { |
|
||||||
content: '\e0c6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=target]:before { |
|
||||||
content: '\e0c7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=task]:before { |
|
||||||
content: '\e0c8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=terminal]:before { |
|
||||||
content: '\e0c9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=text]:before { |
|
||||||
content: '\e0ca'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=thumb-down]:before { |
|
||||||
content: '\e0cb'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=thumb-up]:before { |
|
||||||
content: '\e0cc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=timer]:before { |
|
||||||
content: '\e0cd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=transfer]:before { |
|
||||||
content: '\e0ce'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=trash]:before { |
|
||||||
content: '\e0cf'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=underline]:before { |
|
||||||
content: '\e0d0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-bottom]:before { |
|
||||||
content: '\e0d1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-center]:before { |
|
||||||
content: '\e0d2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-top]:before { |
|
||||||
content: '\e0d3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=video]:before { |
|
||||||
content: '\e0d4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=volume-high]:before { |
|
||||||
content: '\e0d5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=volume-low]:before { |
|
||||||
content: '\e0d6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=volume-off]:before { |
|
||||||
content: '\e0d7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=warning]:before { |
|
||||||
content: '\e0d8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=wifi]:before { |
|
||||||
content: '\e0d9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=wrench]:before { |
|
||||||
content: '\e0da'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=x]:before { |
|
||||||
content: '\e0db'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=yen]:before { |
|
||||||
content: '\e0dc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=zoom-in]:before { |
|
||||||
content: '\e0dd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=zoom-out]:before { |
|
||||||
content: '\e0de'; |
|
||||||
} |
|
File diff suppressed because one or more lines are too long
@ -1,963 +0,0 @@ |
|||||||
$iconic-font-path: '../fonts/' !default; |
|
||||||
|
|
||||||
@font-face { |
|
||||||
font-family: 'Icons'; |
|
||||||
src: url('#{$iconic-font-path}open-iconic.eot'); |
|
||||||
src: url('#{$iconic-font-path}open-iconic.eot?#iconic-sm') format('embedded-opentype'), url('#{$iconic-font-path}open-iconic.woff') format('woff'), url('#{$iconic-font-path}open-iconic.ttf') format('truetype'), url('#{$iconic-font-path}open-iconic.otf') format('opentype'), url('#{$iconic-font-path}open-iconic.svg#iconic-sm') format('svg'); |
|
||||||
font-weight: normal; |
|
||||||
font-style: normal; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph].oi-text-replace { |
|
||||||
font-size: 0; |
|
||||||
line-height: 0; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph].oi-text-replace:before { |
|
||||||
width: 1em; |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph] { |
|
||||||
&:before { |
|
||||||
position: relative; |
|
||||||
top: 1px; |
|
||||||
font-family: 'Icons'; |
|
||||||
display: inline-block; |
|
||||||
speak: none; |
|
||||||
line-height: 1; |
|
||||||
vertical-align: baseline; |
|
||||||
font-weight: normal; |
|
||||||
font-style: normal; |
|
||||||
-webkit-font-smoothing: antialiased; |
|
||||||
-moz-osx-font-smoothing: grayscale; |
|
||||||
} |
|
||||||
|
|
||||||
&:empty:before { |
|
||||||
width: 1em; |
|
||||||
text-align: center; |
|
||||||
box-sizing: content-box; |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-align-left:before { |
|
||||||
text-align: left; |
|
||||||
} |
|
||||||
&.oi-align-right:before { |
|
||||||
text-align: right; |
|
||||||
} |
|
||||||
&.oi-align-center:before { |
|
||||||
text-align: center; |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-flip-horizontal:before { |
|
||||||
-webkit-transform: scale(-1, 1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, 1); |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-flip-vertical:before { |
|
||||||
-webkit-transform: scale(1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(1, -1); |
|
||||||
} |
|
||||||
|
|
||||||
&.oi-flip-horizontal-vertical:before { |
|
||||||
-webkit-transform: scale(-1, -1); |
|
||||||
-ms-transform: scale(-1, 1); |
|
||||||
transform: scale(-1, -1); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
.oi[data-glyph=account-login]:before { |
|
||||||
content: '\e000'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=account-logout]:before { |
|
||||||
content: '\e001'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=action-redo]:before { |
|
||||||
content: '\e002'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=action-undo]:before { |
|
||||||
content: '\e003'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=align-center]:before { |
|
||||||
content: '\e004'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=align-left]:before { |
|
||||||
content: '\e005'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=align-right]:before { |
|
||||||
content: '\e006'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=aperture]:before { |
|
||||||
content: '\e007'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-bottom]:before { |
|
||||||
content: '\e008'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-bottom]:before { |
|
||||||
content: '\e009'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-left]:before { |
|
||||||
content: '\e00a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-right]:before { |
|
||||||
content: '\e00b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-top]:before { |
|
||||||
content: '\e00c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-left]:before { |
|
||||||
content: '\e00d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-right]:before { |
|
||||||
content: '\e00e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-bottom]:before { |
|
||||||
content: '\e00f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-left]:before { |
|
||||||
content: '\e010'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-right]:before { |
|
||||||
content: '\e011'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-top]:before { |
|
||||||
content: '\e012'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-top]:before { |
|
||||||
content: '\e013'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=audio-spectrum]:before { |
|
||||||
content: '\e014'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=audio]:before { |
|
||||||
content: '\e015'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=badge]:before { |
|
||||||
content: '\e016'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=ban]:before { |
|
||||||
content: '\e017'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bar-chart]:before { |
|
||||||
content: '\e018'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=basket]:before { |
|
||||||
content: '\e019'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=battery-empty]:before { |
|
||||||
content: '\e01a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=battery-full]:before { |
|
||||||
content: '\e01b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=beaker]:before { |
|
||||||
content: '\e01c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bell]:before { |
|
||||||
content: '\e01d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bluetooth]:before { |
|
||||||
content: '\e01e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bold]:before { |
|
||||||
content: '\e01f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bolt]:before { |
|
||||||
content: '\e020'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=book]:before { |
|
||||||
content: '\e021'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bookmark]:before { |
|
||||||
content: '\e022'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=box]:before { |
|
||||||
content: '\e023'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=briefcase]:before { |
|
||||||
content: '\e024'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=british-pound]:before { |
|
||||||
content: '\e025'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=browser]:before { |
|
||||||
content: '\e026'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=brush]:before { |
|
||||||
content: '\e027'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bug]:before { |
|
||||||
content: '\e028'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=bullhorn]:before { |
|
||||||
content: '\e029'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=calculator]:before { |
|
||||||
content: '\e02a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=calendar]:before { |
|
||||||
content: '\e02b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=camera-slr]:before { |
|
||||||
content: '\e02c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=caret-bottom]:before { |
|
||||||
content: '\e02d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=caret-left]:before { |
|
||||||
content: '\e02e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=caret-right]:before { |
|
||||||
content: '\e02f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=caret-top]:before { |
|
||||||
content: '\e030'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cart]:before { |
|
||||||
content: '\e031'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=chat]:before { |
|
||||||
content: '\e032'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=check]:before { |
|
||||||
content: '\e033'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-bottom]:before { |
|
||||||
content: '\e034'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-left]:before { |
|
||||||
content: '\e035'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-right]:before { |
|
||||||
content: '\e036'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-top]:before { |
|
||||||
content: '\e037'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=circle-check]:before { |
|
||||||
content: '\e038'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=circle-x]:before { |
|
||||||
content: '\e039'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=clipboard]:before { |
|
||||||
content: '\e03a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=clock]:before { |
|
||||||
content: '\e03b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cloud-download]:before { |
|
||||||
content: '\e03c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cloud-upload]:before { |
|
||||||
content: '\e03d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cloud]:before { |
|
||||||
content: '\e03e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cloudy]:before { |
|
||||||
content: '\e03f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=code]:before { |
|
||||||
content: '\e040'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=cog]:before { |
|
||||||
content: '\e041'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-down]:before { |
|
||||||
content: '\e042'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-left]:before { |
|
||||||
content: '\e043'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-right]:before { |
|
||||||
content: '\e044'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-up]:before { |
|
||||||
content: '\e045'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=command]:before { |
|
||||||
content: '\e046'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=comment-square]:before { |
|
||||||
content: '\e047'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=compass]:before { |
|
||||||
content: '\e048'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=contrast]:before { |
|
||||||
content: '\e049'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=copywriting]:before { |
|
||||||
content: '\e04a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=credit-card]:before { |
|
||||||
content: '\e04b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=crop]:before { |
|
||||||
content: '\e04c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=dashboard]:before { |
|
||||||
content: '\e04d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=data-transfer-download]:before { |
|
||||||
content: '\e04e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=data-transfer-upload]:before { |
|
||||||
content: '\e04f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=delete]:before { |
|
||||||
content: '\e050'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=dial]:before { |
|
||||||
content: '\e051'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=document]:before { |
|
||||||
content: '\e052'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=dollar]:before { |
|
||||||
content: '\e053'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-sans-left]:before { |
|
||||||
content: '\e054'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-sans-right]:before { |
|
||||||
content: '\e055'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-serif-left]:before { |
|
||||||
content: '\e056'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-serif-right]:before { |
|
||||||
content: '\e057'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=droplet]:before { |
|
||||||
content: '\e058'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=eject]:before { |
|
||||||
content: '\e059'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=elevator]:before { |
|
||||||
content: '\e05a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=ellipses]:before { |
|
||||||
content: '\e05b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=envelope-closed]:before { |
|
||||||
content: '\e05c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=envelope-open]:before { |
|
||||||
content: '\e05d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=euro]:before { |
|
||||||
content: '\e05e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=excerpt]:before { |
|
||||||
content: '\e05f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=expand-down]:before { |
|
||||||
content: '\e060'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=expand-left]:before { |
|
||||||
content: '\e061'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=expand-right]:before { |
|
||||||
content: '\e062'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=expand-up]:before { |
|
||||||
content: '\e063'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=external-link]:before { |
|
||||||
content: '\e064'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=eye]:before { |
|
||||||
content: '\e065'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=eyedropper]:before { |
|
||||||
content: '\e066'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=file]:before { |
|
||||||
content: '\e067'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=fire]:before { |
|
||||||
content: '\e068'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=flag]:before { |
|
||||||
content: '\e069'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=flash]:before { |
|
||||||
content: '\e06a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=folder]:before { |
|
||||||
content: '\e06b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=fork]:before { |
|
||||||
content: '\e06c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=fullscreen-enter]:before { |
|
||||||
content: '\e06d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=fullscreen-exit]:before { |
|
||||||
content: '\e06e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=globe]:before { |
|
||||||
content: '\e06f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=graph]:before { |
|
||||||
content: '\e070'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=grid-four-up]:before { |
|
||||||
content: '\e071'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=grid-three-up]:before { |
|
||||||
content: '\e072'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=grid-two-up]:before { |
|
||||||
content: '\e073'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=hard-drive]:before { |
|
||||||
content: '\e074'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=header]:before { |
|
||||||
content: '\e075'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=headphones]:before { |
|
||||||
content: '\e076'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=heart]:before { |
|
||||||
content: '\e077'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=home]:before { |
|
||||||
content: '\e078'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=image]:before { |
|
||||||
content: '\e079'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=inbox]:before { |
|
||||||
content: '\e07a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=infinity]:before { |
|
||||||
content: '\e07b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=info]:before { |
|
||||||
content: '\e07c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=italic]:before { |
|
||||||
content: '\e07d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=justify-center]:before { |
|
||||||
content: '\e07e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=justify-left]:before { |
|
||||||
content: '\e07f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=justify-right]:before { |
|
||||||
content: '\e080'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=key]:before { |
|
||||||
content: '\e081'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=laptop]:before { |
|
||||||
content: '\e082'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=layers]:before { |
|
||||||
content: '\e083'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=lightbulb]:before { |
|
||||||
content: '\e084'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=link-broken]:before { |
|
||||||
content: '\e085'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=link-intact]:before { |
|
||||||
content: '\e086'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=list-rich]:before { |
|
||||||
content: '\e087'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=list]:before { |
|
||||||
content: '\e088'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=location]:before { |
|
||||||
content: '\e089'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=lock-locked]:before { |
|
||||||
content: '\e08a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=lock-unlocked]:before { |
|
||||||
content: '\e08b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=loop-circular]:before { |
|
||||||
content: '\e08c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=loop-square]:before { |
|
||||||
content: '\e08d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=loop]:before { |
|
||||||
content: '\e08e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=magnifying-glass]:before { |
|
||||||
content: '\e08f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=map-marker]:before { |
|
||||||
content: '\e090'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=map]:before { |
|
||||||
content: '\e091'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-pause]:before { |
|
||||||
content: '\e092'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-play]:before { |
|
||||||
content: '\e093'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-record]:before { |
|
||||||
content: '\e094'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-skip-backward]:before { |
|
||||||
content: '\e095'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-skip-forward]:before { |
|
||||||
content: '\e096'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-step-backward]:before { |
|
||||||
content: '\e097'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-step-forward]:before { |
|
||||||
content: '\e098'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=media-stop]:before { |
|
||||||
content: '\e099'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=medical-cross]:before { |
|
||||||
content: '\e09a'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=menu]:before { |
|
||||||
content: '\e09b'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=microphone]:before { |
|
||||||
content: '\e09c'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=minus]:before { |
|
||||||
content: '\e09d'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=monitor]:before { |
|
||||||
content: '\e09e'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=moon]:before { |
|
||||||
content: '\e09f'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=move]:before { |
|
||||||
content: '\e0a0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=musical-note]:before { |
|
||||||
content: '\e0a1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=paperclip]:before { |
|
||||||
content: '\e0a2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=pencil]:before { |
|
||||||
content: '\e0a3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=people]:before { |
|
||||||
content: '\e0a4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=person]:before { |
|
||||||
content: '\e0a5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=phone]:before { |
|
||||||
content: '\e0a6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=pie-chart]:before { |
|
||||||
content: '\e0a7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=pin]:before { |
|
||||||
content: '\e0a8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=play-circle]:before { |
|
||||||
content: '\e0a9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=plus]:before { |
|
||||||
content: '\e0aa'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=power-standby]:before { |
|
||||||
content: '\e0ab'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=print]:before { |
|
||||||
content: '\e0ac'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=project]:before { |
|
||||||
content: '\e0ad'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=pulse]:before { |
|
||||||
content: '\e0ae'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=puzzle-piece]:before { |
|
||||||
content: '\e0af'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=question-mark]:before { |
|
||||||
content: '\e0b0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=rain]:before { |
|
||||||
content: '\e0b1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=random]:before { |
|
||||||
content: '\e0b2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=reload]:before { |
|
||||||
content: '\e0b3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=resize-both]:before { |
|
||||||
content: '\e0b4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=resize-height]:before { |
|
||||||
content: '\e0b5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=resize-width]:before { |
|
||||||
content: '\e0b6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=rss-alt]:before { |
|
||||||
content: '\e0b7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=rss]:before { |
|
||||||
content: '\e0b8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=script]:before { |
|
||||||
content: '\e0b9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=share-boxed]:before { |
|
||||||
content: '\e0ba'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=share]:before { |
|
||||||
content: '\e0bb'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=shield]:before { |
|
||||||
content: '\e0bc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=signal]:before { |
|
||||||
content: '\e0bd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=signpost]:before { |
|
||||||
content: '\e0be'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=sort-ascending]:before { |
|
||||||
content: '\e0bf'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=sort-descending]:before { |
|
||||||
content: '\e0c0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=spreadsheet]:before { |
|
||||||
content: '\e0c1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=star]:before { |
|
||||||
content: '\e0c2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=sun]:before { |
|
||||||
content: '\e0c3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=tablet]:before { |
|
||||||
content: '\e0c4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=tag]:before { |
|
||||||
content: '\e0c5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=tags]:before { |
|
||||||
content: '\e0c6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=target]:before { |
|
||||||
content: '\e0c7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=task]:before { |
|
||||||
content: '\e0c8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=terminal]:before { |
|
||||||
content: '\e0c9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=text]:before { |
|
||||||
content: '\e0ca'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=thumb-down]:before { |
|
||||||
content: '\e0cb'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=thumb-up]:before { |
|
||||||
content: '\e0cc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=timer]:before { |
|
||||||
content: '\e0cd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=transfer]:before { |
|
||||||
content: '\e0ce'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=trash]:before { |
|
||||||
content: '\e0cf'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=underline]:before { |
|
||||||
content: '\e0d0'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-bottom]:before { |
|
||||||
content: '\e0d1'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-center]:before { |
|
||||||
content: '\e0d2'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-top]:before { |
|
||||||
content: '\e0d3'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=video]:before { |
|
||||||
content: '\e0d4'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=volume-high]:before { |
|
||||||
content: '\e0d5'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=volume-low]:before { |
|
||||||
content: '\e0d6'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=volume-off]:before { |
|
||||||
content: '\e0d7'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=warning]:before { |
|
||||||
content: '\e0d8'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=wifi]:before { |
|
||||||
content: '\e0d9'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=wrench]:before { |
|
||||||
content: '\e0da'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=x]:before { |
|
||||||
content: '\e0db'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=yen]:before { |
|
||||||
content: '\e0dc'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=zoom-in]:before { |
|
||||||
content: '\e0dd'; |
|
||||||
} |
|
||||||
|
|
||||||
.oi[data-glyph=zoom-out]:before { |
|
||||||
content: '\e0de'; |
|
||||||
} |
|
||||||
|
|
@ -1,733 +0,0 @@ |
|||||||
@font-face |
|
||||||
font-family 'Icons' |
|
||||||
src url('../fonts/open-iconic.eot') |
|
||||||
src url('../fonts/open-iconic.eot?#iconic-sm') format('embedded-opentype'), url('../fonts/open-iconic.woff') format('woff'), url('../fonts/open-iconic.ttf') format('truetype'), url('../fonts/open-iconic.otf') format('opentype'), url('../fonts/open-iconic.svg#iconic-sm') format('svg') |
|
||||||
font-weight normal |
|
||||||
font-style normal |
|
||||||
|
|
||||||
|
|
||||||
.oi[data-glyph].oi-text-replace |
|
||||||
font-size 0 |
|
||||||
line-height 0 |
|
||||||
|
|
||||||
.oi[data-glyph].oi-text-replace:before |
|
||||||
width 1em |
|
||||||
text-align center |
|
||||||
|
|
||||||
.oi[data-glyph] |
|
||||||
&:before |
|
||||||
position relative |
|
||||||
top 1px |
|
||||||
font-family 'Icons' |
|
||||||
display inline-block |
|
||||||
speak none |
|
||||||
line-height 1 |
|
||||||
vertical-align baseline |
|
||||||
font-weight normal |
|
||||||
font-style normal |
|
||||||
-webkit-font-smoothing antialiased |
|
||||||
-moz-osx-font-smoothing grayscale |
|
||||||
|
|
||||||
&:empty:before |
|
||||||
width 1em |
|
||||||
text-align center |
|
||||||
box-sizing content-box |
|
||||||
|
|
||||||
&.oi-align-left:before |
|
||||||
text-align left |
|
||||||
|
|
||||||
&.oi-align-right:before |
|
||||||
text-align right |
|
||||||
|
|
||||||
&.oi-align-center:before |
|
||||||
text-align center |
|
||||||
|
|
||||||
|
|
||||||
&.oi-flip-horizontal:before |
|
||||||
-webkit-transform scale(-1, 1) |
|
||||||
-ms-transform scale(-1, 1) |
|
||||||
transform scale(-1, 1) |
|
||||||
|
|
||||||
|
|
||||||
&.oi-flip-vertical:before |
|
||||||
-webkit-transform scale(1, -1) |
|
||||||
-ms-transform scale(-1, 1) |
|
||||||
transform scale(1, -1) |
|
||||||
|
|
||||||
|
|
||||||
&.oi-flip-horizontal-vertical:before |
|
||||||
-webkit-transform scale(-1, -1) |
|
||||||
-ms-transform scale(-1, 1) |
|
||||||
transform scale(-1, -1) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.oi[data-glyph=account-login]:before |
|
||||||
content '\e000' |
|
||||||
|
|
||||||
.oi[data-glyph=account-logout]:before |
|
||||||
content '\e001' |
|
||||||
|
|
||||||
.oi[data-glyph=action-redo]:before |
|
||||||
content '\e002' |
|
||||||
|
|
||||||
.oi[data-glyph=action-undo]:before |
|
||||||
content '\e003' |
|
||||||
|
|
||||||
.oi[data-glyph=align-center]:before |
|
||||||
content '\e004' |
|
||||||
|
|
||||||
.oi[data-glyph=align-left]:before |
|
||||||
content '\e005' |
|
||||||
|
|
||||||
.oi[data-glyph=align-right]:before |
|
||||||
content '\e006' |
|
||||||
|
|
||||||
.oi[data-glyph=aperture]:before |
|
||||||
content '\e007' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-bottom]:before |
|
||||||
content '\e008' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-bottom]:before |
|
||||||
content '\e009' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-left]:before |
|
||||||
content '\e00a' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-right]:before |
|
||||||
content '\e00b' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-circle-top]:before |
|
||||||
content '\e00c' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-left]:before |
|
||||||
content '\e00d' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-right]:before |
|
||||||
content '\e00e' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-bottom]:before |
|
||||||
content '\e00f' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-left]:before |
|
||||||
content '\e010' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-right]:before |
|
||||||
content '\e011' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-thick-top]:before |
|
||||||
content '\e012' |
|
||||||
|
|
||||||
.oi[data-glyph=arrow-top]:before |
|
||||||
content '\e013' |
|
||||||
|
|
||||||
.oi[data-glyph=audio-spectrum]:before |
|
||||||
content '\e014' |
|
||||||
|
|
||||||
.oi[data-glyph=audio]:before |
|
||||||
content '\e015' |
|
||||||
|
|
||||||
.oi[data-glyph=badge]:before |
|
||||||
content '\e016' |
|
||||||
|
|
||||||
.oi[data-glyph=ban]:before |
|
||||||
content '\e017' |
|
||||||
|
|
||||||
.oi[data-glyph=bar-chart]:before |
|
||||||
content '\e018' |
|
||||||
|
|
||||||
.oi[data-glyph=basket]:before |
|
||||||
content '\e019' |
|
||||||
|
|
||||||
.oi[data-glyph=battery-empty]:before |
|
||||||
content '\e01a' |
|
||||||
|
|
||||||
.oi[data-glyph=battery-full]:before |
|
||||||
content '\e01b' |
|
||||||
|
|
||||||
.oi[data-glyph=beaker]:before |
|
||||||
content '\e01c' |
|
||||||
|
|
||||||
.oi[data-glyph=bell]:before |
|
||||||
content '\e01d' |
|
||||||
|
|
||||||
.oi[data-glyph=bluetooth]:before |
|
||||||
content '\e01e' |
|
||||||
|
|
||||||
.oi[data-glyph=bold]:before |
|
||||||
content '\e01f' |
|
||||||
|
|
||||||
.oi[data-glyph=bolt]:before |
|
||||||
content '\e020' |
|
||||||
|
|
||||||
.oi[data-glyph=book]:before |
|
||||||
content '\e021' |
|
||||||
|
|
||||||
.oi[data-glyph=bookmark]:before |
|
||||||
content '\e022' |
|
||||||
|
|
||||||
.oi[data-glyph=box]:before |
|
||||||
content '\e023' |
|
||||||
|
|
||||||
.oi[data-glyph=briefcase]:before |
|
||||||
content '\e024' |
|
||||||
|
|
||||||
.oi[data-glyph=british-pound]:before |
|
||||||
content '\e025' |
|
||||||
|
|
||||||
.oi[data-glyph=browser]:before |
|
||||||
content '\e026' |
|
||||||
|
|
||||||
.oi[data-glyph=brush]:before |
|
||||||
content '\e027' |
|
||||||
|
|
||||||
.oi[data-glyph=bug]:before |
|
||||||
content '\e028' |
|
||||||
|
|
||||||
.oi[data-glyph=bullhorn]:before |
|
||||||
content '\e029' |
|
||||||
|
|
||||||
.oi[data-glyph=calculator]:before |
|
||||||
content '\e02a' |
|
||||||
|
|
||||||
.oi[data-glyph=calendar]:before |
|
||||||
content '\e02b' |
|
||||||
|
|
||||||
.oi[data-glyph=camera-slr]:before |
|
||||||
content '\e02c' |
|
||||||
|
|
||||||
.oi[data-glyph=caret-bottom]:before |
|
||||||
content '\e02d' |
|
||||||
|
|
||||||
.oi[data-glyph=caret-left]:before |
|
||||||
content '\e02e' |
|
||||||
|
|
||||||
.oi[data-glyph=caret-right]:before |
|
||||||
content '\e02f' |
|
||||||
|
|
||||||
.oi[data-glyph=caret-top]:before |
|
||||||
content '\e030' |
|
||||||
|
|
||||||
.oi[data-glyph=cart]:before |
|
||||||
content '\e031' |
|
||||||
|
|
||||||
.oi[data-glyph=chat]:before |
|
||||||
content '\e032' |
|
||||||
|
|
||||||
.oi[data-glyph=check]:before |
|
||||||
content '\e033' |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-bottom]:before |
|
||||||
content '\e034' |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-left]:before |
|
||||||
content '\e035' |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-right]:before |
|
||||||
content '\e036' |
|
||||||
|
|
||||||
.oi[data-glyph=chevron-top]:before |
|
||||||
content '\e037' |
|
||||||
|
|
||||||
.oi[data-glyph=circle-check]:before |
|
||||||
content '\e038' |
|
||||||
|
|
||||||
.oi[data-glyph=circle-x]:before |
|
||||||
content '\e039' |
|
||||||
|
|
||||||
.oi[data-glyph=clipboard]:before |
|
||||||
content '\e03a' |
|
||||||
|
|
||||||
.oi[data-glyph=clock]:before |
|
||||||
content '\e03b' |
|
||||||
|
|
||||||
.oi[data-glyph=cloud-download]:before |
|
||||||
content '\e03c' |
|
||||||
|
|
||||||
.oi[data-glyph=cloud-upload]:before |
|
||||||
content '\e03d' |
|
||||||
|
|
||||||
.oi[data-glyph=cloud]:before |
|
||||||
content '\e03e' |
|
||||||
|
|
||||||
.oi[data-glyph=cloudy]:before |
|
||||||
content '\e03f' |
|
||||||
|
|
||||||
.oi[data-glyph=code]:before |
|
||||||
content '\e040' |
|
||||||
|
|
||||||
.oi[data-glyph=cog]:before |
|
||||||
content '\e041' |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-down]:before |
|
||||||
content '\e042' |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-left]:before |
|
||||||
content '\e043' |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-right]:before |
|
||||||
content '\e044' |
|
||||||
|
|
||||||
.oi[data-glyph=collapse-up]:before |
|
||||||
content '\e045' |
|
||||||
|
|
||||||
.oi[data-glyph=command]:before |
|
||||||
content '\e046' |
|
||||||
|
|
||||||
.oi[data-glyph=comment-square]:before |
|
||||||
content '\e047' |
|
||||||
|
|
||||||
.oi[data-glyph=compass]:before |
|
||||||
content '\e048' |
|
||||||
|
|
||||||
.oi[data-glyph=contrast]:before |
|
||||||
content '\e049' |
|
||||||
|
|
||||||
.oi[data-glyph=copywriting]:before |
|
||||||
content '\e04a' |
|
||||||
|
|
||||||
.oi[data-glyph=credit-card]:before |
|
||||||
content '\e04b' |
|
||||||
|
|
||||||
.oi[data-glyph=crop]:before |
|
||||||
content '\e04c' |
|
||||||
|
|
||||||
.oi[data-glyph=dashboard]:before |
|
||||||
content '\e04d' |
|
||||||
|
|
||||||
.oi[data-glyph=data-transfer-download]:before |
|
||||||
content '\e04e' |
|
||||||
|
|
||||||
.oi[data-glyph=data-transfer-upload]:before |
|
||||||
content '\e04f' |
|
||||||
|
|
||||||
.oi[data-glyph=delete]:before |
|
||||||
content '\e050' |
|
||||||
|
|
||||||
.oi[data-glyph=dial]:before |
|
||||||
content '\e051' |
|
||||||
|
|
||||||
.oi[data-glyph=document]:before |
|
||||||
content '\e052' |
|
||||||
|
|
||||||
.oi[data-glyph=dollar]:before |
|
||||||
content '\e053' |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-sans-left]:before |
|
||||||
content '\e054' |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-sans-right]:before |
|
||||||
content '\e055' |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-serif-left]:before |
|
||||||
content '\e056' |
|
||||||
|
|
||||||
.oi[data-glyph=double-quote-serif-right]:before |
|
||||||
content '\e057' |
|
||||||
|
|
||||||
.oi[data-glyph=droplet]:before |
|
||||||
content '\e058' |
|
||||||
|
|
||||||
.oi[data-glyph=eject]:before |
|
||||||
content '\e059' |
|
||||||
|
|
||||||
.oi[data-glyph=elevator]:before |
|
||||||
content '\e05a' |
|
||||||
|
|
||||||
.oi[data-glyph=ellipses]:before |
|
||||||
content '\e05b' |
|
||||||
|
|
||||||
.oi[data-glyph=envelope-closed]:before |
|
||||||
content '\e05c' |
|
||||||
|
|
||||||
.oi[data-glyph=envelope-open]:before |
|
||||||
content '\e05d' |
|
||||||
|
|
||||||
.oi[data-glyph=euro]:before |
|
||||||
content '\e05e' |
|
||||||
|
|
||||||
.oi[data-glyph=excerpt]:before |
|
||||||
content '\e05f' |
|
||||||
|
|
||||||
.oi[data-glyph=expand-down]:before |
|
||||||
content '\e060' |
|
||||||
|
|
||||||
.oi[data-glyph=expand-left]:before |
|
||||||
content '\e061' |
|
||||||
|
|
||||||
.oi[data-glyph=expand-right]:before |
|
||||||
content '\e062' |
|
||||||
|
|
||||||
.oi[data-glyph=expand-up]:before |
|
||||||
content '\e063' |
|
||||||
|
|
||||||
.oi[data-glyph=external-link]:before |
|
||||||
content '\e064' |
|
||||||
|
|
||||||
.oi[data-glyph=eye]:before |
|
||||||
content '\e065' |
|
||||||
|
|
||||||
.oi[data-glyph=eyedropper]:before |
|
||||||
content '\e066' |
|
||||||
|
|
||||||
.oi[data-glyph=file]:before |
|
||||||
content '\e067' |
|
||||||
|
|
||||||
.oi[data-glyph=fire]:before |
|
||||||
content '\e068' |
|
||||||
|
|
||||||
.oi[data-glyph=flag]:before |
|
||||||
content '\e069' |
|
||||||
|
|
||||||
.oi[data-glyph=flash]:before |
|
||||||
content '\e06a' |
|
||||||
|
|
||||||
.oi[data-glyph=folder]:before |
|
||||||
content '\e06b' |
|
||||||
|
|
||||||
.oi[data-glyph=fork]:before |
|
||||||
content '\e06c' |
|
||||||
|
|
||||||
.oi[data-glyph=fullscreen-enter]:before |
|
||||||
content '\e06d' |
|
||||||
|
|
||||||
.oi[data-glyph=fullscreen-exit]:before |
|
||||||
content '\e06e' |
|
||||||
|
|
||||||
.oi[data-glyph=globe]:before |
|
||||||
content '\e06f' |
|
||||||
|
|
||||||
.oi[data-glyph=graph]:before |
|
||||||
content '\e070' |
|
||||||
|
|
||||||
.oi[data-glyph=grid-four-up]:before |
|
||||||
content '\e071' |
|
||||||
|
|
||||||
.oi[data-glyph=grid-three-up]:before |
|
||||||
content '\e072' |
|
||||||
|
|
||||||
.oi[data-glyph=grid-two-up]:before |
|
||||||
content '\e073' |
|
||||||
|
|
||||||
.oi[data-glyph=hard-drive]:before |
|
||||||
content '\e074' |
|
||||||
|
|
||||||
.oi[data-glyph=header]:before |
|
||||||
content '\e075' |
|
||||||
|
|
||||||
.oi[data-glyph=headphones]:before |
|
||||||
content '\e076' |
|
||||||
|
|
||||||
.oi[data-glyph=heart]:before |
|
||||||
content '\e077' |
|
||||||
|
|
||||||
.oi[data-glyph=home]:before |
|
||||||
content '\e078' |
|
||||||
|
|
||||||
.oi[data-glyph=image]:before |
|
||||||
content '\e079' |
|
||||||
|
|
||||||
.oi[data-glyph=inbox]:before |
|
||||||
content '\e07a' |
|
||||||
|
|
||||||
.oi[data-glyph=infinity]:before |
|
||||||
content '\e07b' |
|
||||||
|
|
||||||
.oi[data-glyph=info]:before |
|
||||||
content '\e07c' |
|
||||||
|
|
||||||
.oi[data-glyph=italic]:before |
|
||||||
content '\e07d' |
|
||||||
|
|
||||||
.oi[data-glyph=justify-center]:before |
|
||||||
content '\e07e' |
|
||||||
|
|
||||||
.oi[data-glyph=justify-left]:before |
|
||||||
content '\e07f' |
|
||||||
|
|
||||||
.oi[data-glyph=justify-right]:before |
|
||||||
content '\e080' |
|
||||||
|
|
||||||
.oi[data-glyph=key]:before |
|
||||||
content '\e081' |
|
||||||
|
|
||||||
.oi[data-glyph=laptop]:before |
|
||||||
content '\e082' |
|
||||||
|
|
||||||
.oi[data-glyph=layers]:before |
|
||||||
content '\e083' |
|
||||||
|
|
||||||
.oi[data-glyph=lightbulb]:before |
|
||||||
content '\e084' |
|
||||||
|
|
||||||
.oi[data-glyph=link-broken]:before |
|
||||||
content '\e085' |
|
||||||
|
|
||||||
.oi[data-glyph=link-intact]:before |
|
||||||
content '\e086' |
|
||||||
|
|
||||||
.oi[data-glyph=list-rich]:before |
|
||||||
content '\e087' |
|
||||||
|
|
||||||
.oi[data-glyph=list]:before |
|
||||||
content '\e088' |
|
||||||
|
|
||||||
.oi[data-glyph=location]:before |
|
||||||
content '\e089' |
|
||||||
|
|
||||||
.oi[data-glyph=lock-locked]:before |
|
||||||
content '\e08a' |
|
||||||
|
|
||||||
.oi[data-glyph=lock-unlocked]:before |
|
||||||
content '\e08b' |
|
||||||
|
|
||||||
.oi[data-glyph=loop-circular]:before |
|
||||||
content '\e08c' |
|
||||||
|
|
||||||
.oi[data-glyph=loop-square]:before |
|
||||||
content '\e08d' |
|
||||||
|
|
||||||
.oi[data-glyph=loop]:before |
|
||||||
content '\e08e' |
|
||||||
|
|
||||||
.oi[data-glyph=magnifying-glass]:before |
|
||||||
content '\e08f' |
|
||||||
|
|
||||||
.oi[data-glyph=map-marker]:before |
|
||||||
content '\e090' |
|
||||||
|
|
||||||
.oi[data-glyph=map]:before |
|
||||||
content '\e091' |
|
||||||
|
|
||||||
.oi[data-glyph=media-pause]:before |
|
||||||
content '\e092' |
|
||||||
|
|
||||||
.oi[data-glyph=media-play]:before |
|
||||||
content '\e093' |
|
||||||
|
|
||||||
.oi[data-glyph=media-record]:before |
|
||||||
content '\e094' |
|
||||||
|
|
||||||
.oi[data-glyph=media-skip-backward]:before |
|
||||||
content '\e095' |
|
||||||
|
|
||||||
.oi[data-glyph=media-skip-forward]:before |
|
||||||
content '\e096' |
|
||||||
|
|
||||||
.oi[data-glyph=media-step-backward]:before |
|
||||||
content '\e097' |
|
||||||
|
|
||||||
.oi[data-glyph=media-step-forward]:before |
|
||||||
content '\e098' |
|
||||||
|
|
||||||
.oi[data-glyph=media-stop]:before |
|
||||||
content '\e099' |
|
||||||
|
|
||||||
.oi[data-glyph=medical-cross]:before |
|
||||||
content '\e09a' |
|
||||||
|
|
||||||
.oi[data-glyph=menu]:before |
|
||||||
content '\e09b' |
|
||||||
|
|
||||||
.oi[data-glyph=microphone]:before |
|
||||||
content '\e09c' |
|
||||||
|
|
||||||
.oi[data-glyph=minus]:before |
|
||||||
content '\e09d' |
|
||||||
|
|
||||||
.oi[data-glyph=monitor]:before |
|
||||||
content '\e09e' |
|
||||||
|
|
||||||
.oi[data-glyph=moon]:before |
|
||||||
content '\e09f' |
|
||||||
|
|
||||||
.oi[data-glyph=move]:before |
|
||||||
content '\e0a0' |
|
||||||
|
|
||||||
.oi[data-glyph=musical-note]:before |
|
||||||
content '\e0a1' |
|
||||||
|
|
||||||
.oi[data-glyph=paperclip]:before |
|
||||||
content '\e0a2' |
|
||||||
|
|
||||||
.oi[data-glyph=pencil]:before |
|
||||||
content '\e0a3' |
|
||||||
|
|
||||||
.oi[data-glyph=people]:before |
|
||||||
content '\e0a4' |
|
||||||
|
|
||||||
.oi[data-glyph=person]:before |
|
||||||
content '\e0a5' |
|
||||||
|
|
||||||
.oi[data-glyph=phone]:before |
|
||||||
content '\e0a6' |
|
||||||
|
|
||||||
.oi[data-glyph=pie-chart]:before |
|
||||||
content '\e0a7' |
|
||||||
|
|
||||||
.oi[data-glyph=pin]:before |
|
||||||
content '\e0a8' |
|
||||||
|
|
||||||
.oi[data-glyph=play-circle]:before |
|
||||||
content '\e0a9' |
|
||||||
|
|
||||||
.oi[data-glyph=plus]:before |
|
||||||
content '\e0aa' |
|
||||||
|
|
||||||
.oi[data-glyph=power-standby]:before |
|
||||||
content '\e0ab' |
|
||||||
|
|
||||||
.oi[data-glyph=print]:before |
|
||||||
content '\e0ac' |
|
||||||
|
|
||||||
.oi[data-glyph=project]:before |
|
||||||
content '\e0ad' |
|
||||||
|
|
||||||
.oi[data-glyph=pulse]:before |
|
||||||
content '\e0ae' |
|
||||||
|
|
||||||
.oi[data-glyph=puzzle-piece]:before |
|
||||||
content '\e0af' |
|
||||||
|
|
||||||
.oi[data-glyph=question-mark]:before |
|
||||||
content '\e0b0' |
|
||||||
|
|
||||||
.oi[data-glyph=rain]:before |
|
||||||
content '\e0b1' |
|
||||||
|
|
||||||
.oi[data-glyph=random]:before |
|
||||||
content '\e0b2' |
|
||||||
|
|
||||||
.oi[data-glyph=reload]:before |
|
||||||
content '\e0b3' |
|
||||||
|
|
||||||
.oi[data-glyph=resize-both]:before |
|
||||||
content '\e0b4' |
|
||||||
|
|
||||||
.oi[data-glyph=resize-height]:before |
|
||||||
content '\e0b5' |
|
||||||
|
|
||||||
.oi[data-glyph=resize-width]:before |
|
||||||
content '\e0b6' |
|
||||||
|
|
||||||
.oi[data-glyph=rss-alt]:before |
|
||||||
content '\e0b7' |
|
||||||
|
|
||||||
.oi[data-glyph=rss]:before |
|
||||||
content '\e0b8' |
|
||||||
|
|
||||||
.oi[data-glyph=script]:before |
|
||||||
content '\e0b9' |
|
||||||
|
|
||||||
.oi[data-glyph=share-boxed]:before |
|
||||||
content '\e0ba' |
|
||||||
|
|
||||||
.oi[data-glyph=share]:before |
|
||||||
content '\e0bb' |
|
||||||
|
|
||||||
.oi[data-glyph=shield]:before |
|
||||||
content '\e0bc' |
|
||||||
|
|
||||||
.oi[data-glyph=signal]:before |
|
||||||
content '\e0bd' |
|
||||||
|
|
||||||
.oi[data-glyph=signpost]:before |
|
||||||
content '\e0be' |
|
||||||
|
|
||||||
.oi[data-glyph=sort-ascending]:before |
|
||||||
content '\e0bf' |
|
||||||
|
|
||||||
.oi[data-glyph=sort-descending]:before |
|
||||||
content '\e0c0' |
|
||||||
|
|
||||||
.oi[data-glyph=spreadsheet]:before |
|
||||||
content '\e0c1' |
|
||||||
|
|
||||||
.oi[data-glyph=star]:before |
|
||||||
content '\e0c2' |
|
||||||
|
|
||||||
.oi[data-glyph=sun]:before |
|
||||||
content '\e0c3' |
|
||||||
|
|
||||||
.oi[data-glyph=tablet]:before |
|
||||||
content '\e0c4' |
|
||||||
|
|
||||||
.oi[data-glyph=tag]:before |
|
||||||
content '\e0c5' |
|
||||||
|
|
||||||
.oi[data-glyph=tags]:before |
|
||||||
content '\e0c6' |
|
||||||
|
|
||||||
.oi[data-glyph=target]:before |
|
||||||
content '\e0c7' |
|
||||||
|
|
||||||
.oi[data-glyph=task]:before |
|
||||||
content '\e0c8' |
|
||||||
|
|
||||||
.oi[data-glyph=terminal]:before |
|
||||||
content '\e0c9' |
|
||||||
|
|
||||||
.oi[data-glyph=text]:before |
|
||||||
content '\e0ca' |
|
||||||
|
|
||||||
.oi[data-glyph=thumb-down]:before |
|
||||||
content '\e0cb' |
|
||||||
|
|
||||||
.oi[data-glyph=thumb-up]:before |
|
||||||
content '\e0cc' |
|
||||||
|
|
||||||
.oi[data-glyph=timer]:before |
|
||||||
content '\e0cd' |
|
||||||
|
|
||||||
.oi[data-glyph=transfer]:before |
|
||||||
content '\e0ce' |
|
||||||
|
|
||||||
.oi[data-glyph=trash]:before |
|
||||||
content '\e0cf' |
|
||||||
|
|
||||||
.oi[data-glyph=underline]:before |
|
||||||
content '\e0d0' |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-bottom]:before |
|
||||||
content '\e0d1' |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-center]:before |
|
||||||
content '\e0d2' |
|
||||||
|
|
||||||
.oi[data-glyph=vertical-align-top]:before |
|
||||||
content '\e0d3' |
|
||||||
|
|
||||||
.oi[data-glyph=video]:before |
|
||||||
content '\e0d4' |
|
||||||
|
|
||||||
.oi[data-glyph=volume-high]:before |
|
||||||
content '\e0d5' |
|
||||||
|
|
||||||
.oi[data-glyph=volume-low]:before |
|
||||||
content '\e0d6' |
|
||||||
|
|
||||||
.oi[data-glyph=volume-off]:before |
|
||||||
content '\e0d7' |
|
||||||
|
|
||||||
.oi[data-glyph=warning]:before |
|
||||||
content '\e0d8' |
|
||||||
|
|
||||||
.oi[data-glyph=wifi]:before |
|
||||||
content '\e0d9' |
|
||||||
|
|
||||||
.oi[data-glyph=wrench]:before |
|
||||||
content '\e0da' |
|
||||||
|
|
||||||
.oi[data-glyph=x]:before |
|
||||||
content '\e0db' |
|
||||||
|
|
||||||
.oi[data-glyph=yen]:before |
|
||||||
content '\e0dc' |
|
||||||
|
|
||||||
.oi[data-glyph=zoom-in]:before |
|
||||||
content '\e0dd' |
|
||||||
|
|
||||||
.oi[data-glyph=zoom-out]:before |
|
||||||
content '\e0de' |
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 54 KiB |
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 391 B |
Before Width: | Height: | Size: 378 B |
Before Width: | Height: | Size: 779 B |
Some files were not shown because too many files have changed in this diff Show More
Reference in new issue