Compare commits
72 Commits
Author | SHA1 | Date |
---|---|---|
Holger Frey | c6bdf65223 | 5 years ago |
Holger Frey | ab499958f0 | 7 years ago |
Holger Frey | 7045164de6 | 7 years ago |
Holger Frey | 9359620a71 | 7 years ago |
Holger Frey | c361f0f71d | 7 years ago |
Holger Frey | 511e5d0c25 | 7 years ago |
Holger Frey | e53788559f | 7 years ago |
Holger Frey | ab07076c95 | 7 years ago |
Holger Frey | 96c1717eac | 7 years ago |
Holger Frey | 62af585175 | 7 years ago |
Holger Frey | 9bc85121ab | 7 years ago |
Holger Frey | c5180a6c57 | 7 years ago |
Holger Frey | 57d0b4b373 | 7 years ago |
Holger Frey | 57c6b175cd | 7 years ago |
Holger Frey | e64001ce87 | 7 years ago |
Holger Frey | d881ea2a07 | 7 years ago |
Holger Frey | b23c214df1 | 7 years ago |
Holger Frey | eb32a8a474 | 7 years ago |
Holger Frey | e974070585 | 7 years ago |
Holger Frey | 8d4df465c2 | 7 years ago |
Holger Frey | b8a0cd008b | 7 years ago |
Holger Frey | 40401472be | 7 years ago |
Holger Frey | 0a752eacd9 | 7 years ago |
Holger Frey | a66bf5ac12 | 7 years ago |
Holger Frey | 16516be8ef | 7 years ago |
Holger Frey | 353c6a8f12 | 7 years ago |
Holger Frey | d8dd9f629b | 7 years ago |
Holger Frey | ff7aca94ce | 7 years ago |
Holger Frey | c127fe6816 | 7 years ago |
Holger Frey | 8514aab1c0 | 7 years ago |
Holger Frey | ee172bc7f5 | 7 years ago |
Holger Frey | 85a99b1d6a | 7 years ago |
Holger Frey | 9def414339 | 7 years ago |
Holger Frey | 7dd317226e | 7 years ago |
Holger Frey | f2d33f50ba | 7 years ago |
Holger Frey | 21e33b3a3d | 7 years ago |
Holger Frey | eaa229256a | 7 years ago |
Holger Frey | 290b864d17 | 7 years ago |
Holger Frey | 9ee42880e9 | 7 years ago |
Holger Frey | f535ece7ca | 7 years ago |
Holger Frey | 7158d10549 | 7 years ago |
Holger Frey | aec2641290 | 7 years ago |
Holger Frey | 900f5a3b30 | 7 years ago |
Holger Frey | 52a594b3be | 7 years ago |
Holger Frey | 15ff848305 | 7 years ago |
Holger Frey | 9ad8058597 | 7 years ago |
Holger Frey | 5fbc2dd4f0 | 7 years ago |
Holger Frey | 301195a053 | 7 years ago |
Holger Frey | 686873c39c | 7 years ago |
Holger Frey | 54dd4a0492 | 7 years ago |
Holger Frey | 9e6b0a43d4 | 7 years ago |
Holger Frey | 4cef970410 | 7 years ago |
Holger Frey | fe02f10cd8 | 7 years ago |
Holger Frey | 8d9e320f0a | 7 years ago |
Holger Frey | 43fbb56177 | 7 years ago |
Holger Frey | 052cb29acf | 7 years ago |
Holger Frey | 5c537e57a0 | 7 years ago |
Holger Frey | e49f7890a2 | 7 years ago |
Holger Frey | d50d977dc3 | 7 years ago |
Holger Frey | ac9b484229 | 7 years ago |
Holger Frey | 393698b365 | 7 years ago |
Holger Frey | 000d5582dd | 7 years ago |
Holger Frey | fdf0208c89 | 7 years ago |
Holger Frey | b1870658a9 | 7 years ago |
Holger Frey | 03470644dd | 7 years ago |
Holger Frey | 4b41dad890 | 7 years ago |
Holger Frey | 83e697bc0b | 7 years ago |
Holger Frey | edfc33d9ad | 7 years ago |
Holger Frey | 41c156f56a | 7 years ago |
Holger Frey | f96a30be7e | 7 years ago |
Holger Frey | 63268b397b | 7 years ago |
Holger Frey | 113d20face | 7 years ago |
@ -0,0 +1,21 @@ |
|||||||
|
# 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 |
@ -0,0 +1,15 @@ |
|||||||
|
* 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. |
||||||
|
``` |
@ -0,0 +1,13 @@ |
|||||||
|
======= |
||||||
|
Credits |
||||||
|
======= |
||||||
|
|
||||||
|
Development Lead |
||||||
|
---------------- |
||||||
|
|
||||||
|
* Holger Frey <frey@imtek.de> |
||||||
|
|
||||||
|
Contributors |
||||||
|
------------ |
||||||
|
|
||||||
|
None yet. Why not be the first? |
@ -0,0 +1,119 @@ |
|||||||
|
.. 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 |
||||||
|
|
@ -0,0 +1,35 @@ |
|||||||
|
======= |
||||||
|
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 |
@ -0,0 +1,31 @@ |
|||||||
|
|
||||||
|
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,2 +1,13 @@ |
|||||||
include *.txt *.ini *.cfg *.rst |
include AUTHORS.rst |
||||||
recursive-include ordr *.ico *.png *.css *.gif *.jpg *.pt *.txt *.mak *.mako *.js *.html *.xml *.jinja2 |
include CONTRIBUTING.rst |
||||||
|
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 |
||||||
|
@ -1,13 +0,0 @@ |
|||||||
[[source]] |
|
||||||
|
|
||||||
url = "https://pypi.python.org/simple" |
|
||||||
verify_ssl = true |
|
||||||
name = "pypi" |
|
||||||
|
|
||||||
|
|
||||||
[packages] |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[dev-packages] |
|
||||||
|
|
@ -0,0 +1,68 @@ |
|||||||
|
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 |
@ -1,36 +0,0 @@ |
|||||||
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 |
|
@ -0,0 +1,177 @@ |
|||||||
|
# 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." |
@ -0,0 +1,275 @@ |
|||||||
|
#!/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 |
@ -0,0 +1,22 @@ |
|||||||
|
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` |
@ -0,0 +1,110 @@ |
|||||||
|
.. 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 |
@ -0,0 +1,242 @@ |
|||||||
|
@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 |
@ -0,0 +1,7 @@ |
|||||||
|
===== |
||||||
|
Usage |
||||||
|
===== |
||||||
|
|
||||||
|
To use Ordr2 in a project:: |
||||||
|
|
||||||
|
import ordr2 |
@ -1,206 +0,0 @@ |
|||||||
''' 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) |
|
@ -1,27 +0,0 @@ |
|||||||
''' 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 |
|
@ -1,101 +0,0 @@ |
|||||||
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 |
|
||||||
) |
|
@ -1,97 +0,0 @@ |
|||||||
''' 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) |
|
@ -1,21 +0,0 @@ |
|||||||
$(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() ); |
|
||||||
}); |
|
||||||
}); |
|
@ -1,33 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,49 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,32 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,33 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,41 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,16 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,14 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,36 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,33 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,35 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,14 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,16 +0,0 @@ |
|||||||
{% 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 %} |
|
@ -1,46 +0,0 @@ |
|||||||
<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> |
|
@ -1,110 +0,0 @@ |
|||||||
<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> |
|
@ -1,55 +0,0 @@ |
|||||||
<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> |
|
@ -1,18 +0,0 @@ |
|||||||
<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> |
|
@ -1,18 +0,0 @@ |
|||||||
<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> |
|
@ -1,14 +0,0 @@ |
|||||||
{% 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 %} |
|
||||||
|
|
@ -1,14 +0,0 @@ |
|||||||
{% 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 %} |
|
||||||
|
|
@ -1,82 +0,0 @@ |
|||||||
<!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> |
|
@ -1,8 +0,0 @@ |
|||||||
{% 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,402 +0,0 @@ |
|||||||
''' 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 {} |
|
@ -1,22 +0,0 @@ |
|||||||
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 {} |
|
@ -1,26 +0,0 @@ |
|||||||
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,25 +1,27 @@ |
|||||||
from pyramid.config import Configurator |
''' Top-level package for Ordr2. ''' |
||||||
from pyramid.session import SignedCookieSessionFactory |
|
||||||
|
|
||||||
|
|
||||||
|
__author__ = 'Holger Frey' |
||||||
|
__email__ = 'frey@imtek.de' |
||||||
__version__ = '0.0.1' |
__version__ = '0.0.1' |
||||||
|
|
||||||
|
|
||||||
def main(global_config, **settings): # pragma: no cover |
from pyramid.config import Configurator |
||||||
|
|
||||||
|
|
||||||
|
def main(global_config, **settings): |
||||||
''' 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,103 @@ |
|||||||
|
''' 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) |
@ -0,0 +1,412 @@ |
|||||||
|
''' 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) |
@ -0,0 +1,127 @@ |
|||||||
|
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) |
@ -0,0 +1,70 @@ |
|||||||
|
''' 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) |
@ -0,0 +1,19 @@ |
|||||||
|
''' 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) |
@ -0,0 +1,952 @@ |
|||||||
|
/* 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'; |
||||||
|
} |
@ -0,0 +1,960 @@ |
|||||||
|
/* 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"; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,958 @@ |
|||||||
|
/* 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'; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,954 @@ |
|||||||
|
/* 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' |
||||||
|
} |
||||||
|
|
@ -0,0 +1,511 @@ |
|||||||
|
|
||||||
|
@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'; } |
@ -0,0 +1,962 @@ |
|||||||
|
@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'; |
||||||
|
} |
@ -0,0 +1,963 @@ |
|||||||
|
$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'; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,733 @@ |
|||||||
|
@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' |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 391 B |
After Width: | Height: | Size: 378 B |
After Width: | Height: | Size: 779 B |
After Width: | Height: | Size: 760 B |
After Width: | Height: | Size: 218 B |
After Width: | Height: | Size: 214 B |
After Width: | Height: | Size: 212 B |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 524 B |