From 793d788706a7a35adb53fb0d22c6b629a9c1d215 Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Thu, 26 May 2022 14:34:40 -0400 Subject: [PATCH 001/142] Preserve whitespace in the editor --- static/custom.css | 1 + templates/index.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/static/custom.css b/static/custom.css index 677fc028..0fc761fb 100644 --- a/static/custom.css +++ b/static/custom.css @@ -4,6 +4,7 @@ body { chunk { color: #ffffff; + white-space: pre-wrap; } #gametext.adventure action { diff --git a/templates/index.html b/templates/index.html index 92b70753..887305c6 100644 --- a/templates/index.html +++ b/templates/index.html @@ -9,7 +9,7 @@ - + From f2558e39d911ad1e6827b73077f81f1f812d188c Mon Sep 17 00:00:00 2001 From: Gnome Ann <> Date: Tue, 31 May 2022 13:25:41 -0400 Subject: [PATCH 002/142] Fix JAX UnexpectedTracerError --- tpu_mtj_backend.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tpu_mtj_backend.py b/tpu_mtj_backend.py index fb2dc7ae..80709784 100644 --- a/tpu_mtj_backend.py +++ b/tpu_mtj_backend.py @@ -519,7 +519,7 @@ class PenalizingCausalTransformer(CausalTransformer): compiling_callback() numseqs = numseqs_aux.shape[0] # These are the tokens that we don't want the AI to ever write - self.badwords = jnp.array(vars.badwordsids).squeeze() + badwords = jnp.array(vars.badwordsids).squeeze() @hk.transform def generate_sample(context, ctx_length): # Give the initial context to the transformer @@ -577,7 +577,7 @@ class PenalizingCausalTransformer(CausalTransformer): # Remove any tokens in the badwords list by setting # their logits to negative infinity which effectively # makes their probabilities of being chosen zero - logits = logits.at[self.badwords].set(-jnp.inf) + logits = logits.at[badwords].set(-jnp.inf) # Use the sampler (kobold_sample_static) to pick one token # based on the logits array as a 0D uint32 array # (higher logit means higher probability of being @@ -1101,9 +1101,9 @@ def load_model(path: str, driver_version="tpu_driver0.1_dev20210607", hf_checkpo tpu_address = tpu_address.replace("grpc://", "") tpu_address_without_port = tpu_address.split(':', 1)[0] url = f'http://{tpu_address_without_port}:8475/requestversion/{driver_version}' + requests.post(url) config.FLAGS.jax_xla_backend = "tpu_driver" config.FLAGS.jax_backend_target = "grpc://" + tpu_address - requests.post(url) spinner.terminate() print() From 0eb9f8a8791173d54cd7592d7101a3d9d123d5de Mon Sep 17 00:00:00 2001 From: vfbd Date: Wed, 22 Jun 2022 19:16:24 -0400 Subject: [PATCH 003/142] Account for lnheader in budget calculation --- aiserver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aiserver.py b/aiserver.py index 8779a70a..4081bd79 100644 --- a/aiserver.py +++ b/aiserver.py @@ -3376,9 +3376,9 @@ def calcsubmitbudget(actionlen, winfo, mem, anotetxt, actions, submission=None, raise OverflowError("The author's note in your story is too long. Please either write a shorter author's note or increase the Max Tokens setting. If you are using a soft prompt, additionally consider using a smaller soft prompt.") if(vars.useprompt): - budget = vars.max_length - lnsp - lnprompt - lnmem - lnanote - lnwi - vars.genamt - budget_deduction + budget = vars.max_length - lnheader - lnsp - lnprompt - lnmem - lnanote - lnwi - vars.genamt - budget_deduction else: - budget = vars.max_length - lnsp - lnmem - lnanote - lnwi - vars.genamt - budget_deduction + budget = vars.max_length - lnheader - lnsp - lnmem - lnanote - lnwi - vars.genamt - budget_deduction lnsubmission = len(tokenizer.encode(utils.encodenewlines(vars.comregex_ai.sub('', submission)), max_length=int(2e9), truncation=True)) if submission is not None else 0 maybe_lnprompt = lnprompt if vars.useprompt and actionlen > 0 else 0 From 3da885d408a2727bfca5d454b60ca856d4f5b19a Mon Sep 17 00:00:00 2001 From: vfbd Date: Thu, 23 Jun 2022 15:02:43 -0400 Subject: [PATCH 004/142] GPT-NeoX HF model badwords fix --- aiserver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aiserver.py b/aiserver.py index 4081bd79..ebaa0da5 100644 --- a/aiserver.py +++ b/aiserver.py @@ -976,7 +976,7 @@ if(vars.model not in ["InferKit", "Colab", "OAI", "GooseAI" , "ReadOnly", "TPUMe if(vars.model_type == "opt"): vars.badwordsids = vars.badwordsids_opt - if(vars.model_type == "neox"): + if(vars.model_type == "gpt_neox"): vars.badwordsids = vars.badwordsids_neox if(not vars.use_colab_tpu and vars.model not in ["InferKit", "Colab", "OAI", "GooseAI" , "ReadOnly", "TPUMeshTransformerGPTJ", "TPUMeshTransformerGPTNeoX"]): @@ -1886,7 +1886,7 @@ else: import tpu_mtj_backend if(vars.model_type == "opt"): tpu_mtj_backend.pad_token_id = 1 - elif(vars.model == "TPUMeshTransformerGPTNeoX" or vars.model_type == "neox"): + elif(vars.model == "TPUMeshTransformerGPTNeoX" or vars.model_type == "gpt_neox"): tpu_mtj_backend.pad_token_id = 2 tpu_mtj_backend.vars = vars tpu_mtj_backend.warper_callback = tpumtjgenerate_warper_callback From c3af92e9af750823580a033033a8ecd5fa5e6009 Mon Sep 17 00:00:00 2001 From: henk717 Date: Fri, 24 Jun 2022 10:43:06 +0200 Subject: [PATCH 005/142] Koboldai.org | New NeoX | Cloudflare --- colab/TPU.ipynb | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/colab/TPU.ipynb b/colab/TPU.ipynb index 89f53af2..b4a450d0 100644 --- a/colab/TPU.ipynb +++ b/colab/TPU.ipynb @@ -67,7 +67,7 @@ "#@title <-- Click this to start KoboldAI\n", "Model = \"Nerys 13B\" #@param [\"Nerys 13B\", \"Janeway 13B\", \"Shinen 13B\", \"Skein 6B\", \"Janeway 6B\", \"Adventure 6B\", \"Shinen 6B\", \"Lit 6B\", \"NeoX 20B\", \"facebook/opt-13b\", \"KoboldAI/fairseq-dense-13B\", \"EleutherAI/gpt-j-6B\"] {allow-input: true}\n", "Version = \"Official\" #@param [\"Official\", \"United\"] {allow-input: true}\n", - "Provider = \"Localtunnel\" #@param [\"Localtunnel\", \"Cloudflare\"]\n", + "Provider = \"Cloudflare\" #@param [\"Localtunnel\", \"Cloudflare\"]\n", "\n", "import os\n", "try:\n", @@ -93,13 +93,9 @@ " path = \"\"\n", " download = \"\"\n", "elif Model == \"NeoX 20B\":\n", - " Model = \"TPUMeshTransformerGPTNeoX\"\n", - " path = \" -p gpt-neox-20b-jax\"\n", - " location = \"colab\"\n", - " download = \" -a https://storage.henk.tech/KoboldAI/neox-20b.txt\"\n", - " extract = \"\"\n", - " Drive = \"Unextracted (Less Space)\"\n", - " ![[ -f /content/drive/MyDrive/KoboldAI/settings/gpt-neox-20b-jax.settings ]] || echo -e \"{\\n \\\"apikey\\\": \\\"\\\",\\n \\\"andepth\\\": 3,\\n \\\"temp\\\": 0.5,\\n \\\"top_p\\\": 0.9,\\n \\\"top_k\\\": 0,\\n \\\"tfs\\\": 1.0,\\n \\\"rep_pen\\\": 1.03,\\n \\\"genamt\\\": 80,\\n \\\"max_length\\\": 2048,\\n \\\"ikgen\\\": 200,\\n \\\"formatoptns\\\": {\\n \\\"frmttriminc\\\": true,\\n \\\"frmtrmblln\\\": false,\\n \\\"frmtrmspch\\\": false,\\n \\\"frmtadsnsp\\\": false\\n },\\n \\\"numseqs\\\": 1,\\n \\\"widepth\\\": 3,\\n \\\"useprompt\\\": true,\\n \\\"adventure\\\": false\\n}\" > /content/drive/MyDrive/KoboldAI/settings/gpt-neox-20b-jax.settings\n", + " Model = \"EleutherAI/gpt-neox-20b\"\n", + " path = \"\"\n", + " download = \"\"\n", "elif Model == \"Skein 6B\":\n", " Model = \"KoboldAI/GPT-J-6B-Skein\"\n", " path = \"\"\n", @@ -137,7 +133,7 @@ "else:\n", " tunnel = \"\"\n", "\n", - "!wget https://henk.tech/ckds -O - | bash /dev/stdin $path$download -m $Model -g $Version $tunnel" + "!wget https://koboldai.org/ckds -O - | bash /dev/stdin $path$download -m $Model -g $Version $tunnel" ] }, { From 27e16aecf270cd7c6e344f81327bc5c3c091c0cd Mon Sep 17 00:00:00 2001 From: henk717 Date: Fri, 24 Jun 2022 14:03:58 +0200 Subject: [PATCH 006/142] Model Cleaner (suggested by Shrinkarom) --- colab/TPU.ipynb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/colab/TPU.ipynb b/colab/TPU.ipynb index b4a450d0..ee4bdac5 100644 --- a/colab/TPU.ipynb +++ b/colab/TPU.ipynb @@ -181,12 +181,25 @@ "- KoboldAI uses Google Drive to store your files and settings, if you wish to upload a softprompt or userscript this can be done directly on the Google Drive website. You can also use this to download backups of your KoboldAI related files or upload models of your own.\n", "- Don't want to save your stories on Google Drive for privacy reasons? Do not use KoboldAI's save function and instead click Download as .json, this will automatically download the story to your own computer without ever touching Google's harddrives. You can load this back trough the Load from file option.\n", "- Google shut your instance down unexpectedly? You can still make use of the Download as .json button to recover your story as long as you did not close the KoboldAI window. You can then load this back up in your next session.\n", - "- Done with KoboldAI? Go to the Runtime menu, click on Manage Sessions and terminate your open sessions that you no longer need. This trick can help you maintain higher priority towards getting a TPU.\n", - "- Models stored on Google Drive typically load faster than models we need to download from the internet." + "- Done with KoboldAI? Go to the Runtime menu, click on Manage Sessions and terminate your open sessions that you no longer need. This trick can help you maintain higher priority towards getting a TPU." ], "metadata": { "id": "i0-9ARA3c4Fx" } + }, + { + "cell_type": "code", + "source": [ + "#@title Model Cleaner\n", + "#@markdown Out of space? Run this to remove all cached models (Google Drive models are not effected).\n", + "!rm /content/KoboldAI-Client/cache/*\n" + ], + "metadata": { + "cellView": "form", + "id": "QQZSmoNol04V" + }, + "execution_count": null, + "outputs": [] } ], "metadata": { From 4b16600e49a24f9d43c16d9517eb0acfc9539313 Mon Sep 17 00:00:00 2001 From: vfbd Date: Fri, 24 Jun 2022 12:03:35 -0400 Subject: [PATCH 007/142] Clean up whitespace at the end of actions when loading story Specifically, we merge blank actions into the next action and we move whitespace at the end of non-blank actions to the beginning of the next action. --- aiserver.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/aiserver.py b/aiserver.py index c4123eaa..e4cfbd33 100644 --- a/aiserver.py +++ b/aiserver.py @@ -5473,7 +5473,8 @@ def loadRequest(loadpath, filename=None): for text in js['actions']: vars.actions_metadata[i] = {'Selected Text': text, 'Alternative Text': []} i+=1 - + + footer = "" if(len(vars.prompt.strip()) == 0): while(len(actions)): @@ -5483,9 +5484,25 @@ def loadRequest(loadpath, filename=None): break else: vars.gamestarted = False + vars.prompt = vars.prompt.lstrip() + ln = len(vars.prompt.rstrip()) + footer += vars.prompt[ln:] + vars.prompt = vars.prompt[:ln] if(vars.gamestarted): for s in actions: - vars.actions.append(s) + if(len(s.strip()) == 0): + # If this action only contains whitespace, we merge it with the next action + footer += s + continue + vars.actions.append(footer + s) + footer = "" + # If there is trailing whitespace at the end of an action, we move that whitespace to the beginning of the next action + ln = len(vars.actions[vars.actions.get_last_key()].rstrip()) + footer += vars.actions[vars.actions.get_last_key()][ln:] + vars.actions[vars.actions.get_last_key()] = vars.actions[vars.actions.get_last_key()][:ln] + if(len(vars.actions) == 0): + vars.gamestarted = False + # Try not to break older save files if("authorsnote" in js): From 8be09644278ec89d956cef6c0a4d02733a2c6be3 Mon Sep 17 00:00:00 2001 From: Henk Date: Fri, 24 Jun 2022 18:29:06 +0200 Subject: [PATCH 008/142] AIDG Import Fix --- aiserver.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/aiserver.py b/aiserver.py index ebaa0da5..5187c28a 100644 --- a/aiserver.py +++ b/aiserver.py @@ -101,9 +101,9 @@ mainmenu = [ ["Adventure Models", "adventurelist", ""], ["Novel Models", "novellist", ""], ["NSFW Models", "nsfwlist", ""], + ["Untuned OPT", "optlist", ""], ["Untuned GPT-Neo/J", "gptneolist", ""], ["Untuned Fairseq Dense", "fsdlist", ""], - ["Untuned OPT", "optlist", ""], ["Untuned XGLM", "xglmlist", ""], ["Untuned GPT2", "gpt2list", ""], ["Online Services", "apilist", ""], @@ -167,6 +167,7 @@ gpt2list = [ ] optlist = [ + ["OPT 66B", "facebook/opt-66b", "128GB"], ["OPT 30B", "facebook/opt-30b", "64GB"], ["OPT 13B", "facebook/opt-13b", "32GB"], ["OPT 6.7B", "facebook/opt-6.7b", "16GB"], @@ -5357,6 +5358,11 @@ def importAidgRequest(id): vars.submission = "" vars.lastctx = "" + if not vars.memory: + vars.memory = "" + if not vars.authornote: + vars.authornote = "" + num = 0 for wi in js["worldInfos"]: vars.worldinfo.append({ From 6e138db1c0be03768e1c1297668260614011b9e1 Mon Sep 17 00:00:00 2001 From: vfbd Date: Fri, 24 Jun 2022 12:44:00 -0400 Subject: [PATCH 009/142] Clean up whitespace in the editor as well --- static/application.js | 45 +++++++++++++++++++++++++++++++++++++++++-- templates/index.html | 2 +- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/static/application.js b/static/application.js index b5c1a585..5b9820d2 100644 --- a/static/application.js +++ b/static/application.js @@ -1717,7 +1717,7 @@ function applyChunkDeltas(nodes) { var selected_chunks = buildChunkSetFromNodeArray(getSelectedNodes()); for(var i = 0; i < chunks.length; i++) { var chunk = document.getElementById("n" + chunks[i]); - if(chunk && formatChunkInnerText(chunk).length != 0 && chunks[i] != '0') { + if(chunk && formatChunkInnerText(chunk).trim().length != 0 && chunks[i] != '0') { if(!selected_chunks.has(chunks[i])) { modified_chunks.delete(chunks[i]); socket.send({'cmd': 'inlineedit', 'chunk': chunks[i], 'data': formatChunkInnerText(chunk)}); @@ -1726,7 +1726,7 @@ function applyChunkDeltas(nodes) { } else { if(!selected_chunks.has(chunks[i])) { modified_chunks.delete(chunks[i]); - socket.send({'cmd': 'inlineedit', 'chunk': chunks[i], 'data': ''}); + socket.send({'cmd': 'inlineedit', 'chunk': chunks[i], 'data': formatChunkInnerText(chunk)}); } empty_chunks.add(chunks[i]); } @@ -1858,6 +1858,46 @@ function highlightEditingChunks() { } } +function cleanupChunkWhitespace() { + // Merge empty chunks with the next chunk + var chunks = Array.from(empty_chunks); + chunks.sort(function(e) {parseInt(e)}); + for(var i = 0; i < chunks.length; i++) { + var original_chunk = document.getElementById("n" + chunks[i]); + original_chunk.innerText = footer + original_chunk.innerText; + footer = ""; + var chunk = original_chunk.nextSibling; + while(chunk) { + if(chunk.tagName === "CHUNK") { + break; + } + chunk = chunk.nextSibling; + } + if(chunk) { + chunk.innerText = original_chunk.innerText + chunk.innerText; + } + original_chunk.innerText = ""; + } + // Move whitespace at the end of non-empty chunks into the beginning of the next non-empty chunk + var chunks = Array.from(modified_chunks); + chunks.sort(function(e) {parseInt(e)}); + for(var i = 0; i < chunks.length; i++) { + var original_chunk = document.getElementById("n" + chunks[i]); + var chunk = original_chunk.nextSibling; + while(chunk) { + if(chunk.tagName === "CHUNK" && !empty_chunks.has(chunk.getAttribute("n"))) { + break; + } + chunk = chunk.nextSibling; + } + var ln = original_chunk.innerText.trimEnd().length; + if (chunk) { + chunk.innerText = original_chunk.innerText.substring(ln) + chunk.innerText; + } + original_chunk.innerText = original_chunk.innerText.substring(0, ln); + } +} + // This gets run every time the text in a chunk is edited // or a chunk is deleted function chunkOnDOMMutate(mutations, observer) { @@ -1936,6 +1976,7 @@ function chunkOnFocusOut(event) { if(document.activeElement === game_text[0] || game_text[0].contains(document.activeElement)) { return; } + cleanupChunkWhitespace(); syncAllModifiedChunks(true); setTimeout(function() { var blurred = game_text[0] !== document.activeElement; diff --git a/templates/index.html b/templates/index.html index 6acab35f..e2457a68 100644 --- a/templates/index.html +++ b/templates/index.html @@ -17,7 +17,7 @@ - + {% if flaskwebgui %} From 2495b9380d450cfacc2557d0edda475ec8cc6408 Mon Sep 17 00:00:00 2001 From: henk717 Date: Sat, 25 Jun 2022 13:08:30 +0200 Subject: [PATCH 010/142] Nerys V2 --- colab/TPU.ipynb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/colab/TPU.ipynb b/colab/TPU.ipynb index ee4bdac5..9c349728 100644 --- a/colab/TPU.ipynb +++ b/colab/TPU.ipynb @@ -32,7 +32,9 @@ "\n", "Further down the page you can find descriptions of the models, and tips to get the most out of your Google Colab experience.\n", "\n", - "Make sure to keep this page open while you are using KoboldAI, and check back regularly to see if you got a Captcha. Failure to complete the captcha's in time can result in termination of your session or a lower priority towards the TPUs." + "Make sure to keep this page open while you are using KoboldAI, and check back regularly to see if you got a Captcha. Failure to complete the captcha's in time can result in termination of your session or a lower priority towards the TPUs.\n", + "\n", + "Firefox users need to disable the enhanced tracking protection or use a different browser in order to be able to use Google Colab without errors (This is not something we can do anything about, the cookie blocker breaks the Google Drive integration because it uses different domains)." ], "metadata": { "id": "zrLGxVCEaqZx" @@ -65,7 +67,7 @@ "#@markdown You can find a description of the models below along with instructions on how to start KoboldAI.\n", "\n", "#@title <-- Click this to start KoboldAI\n", - "Model = \"Nerys 13B\" #@param [\"Nerys 13B\", \"Janeway 13B\", \"Shinen 13B\", \"Skein 6B\", \"Janeway 6B\", \"Adventure 6B\", \"Shinen 6B\", \"Lit 6B\", \"NeoX 20B\", \"facebook/opt-13b\", \"KoboldAI/fairseq-dense-13B\", \"EleutherAI/gpt-j-6B\"] {allow-input: true}\n", + "Model = \"Nerys 13B V2\" #@param [\"Nerys 13B V2\", \"Janeway 13B\", \"Shinen 13B\", \"Skein 6B\", \"Janeway 6B\", \"Adventure 6B\", \"Shinen 6B\", \"Lit 6B\", \"NeoX 20B\", \"facebook/opt-13b\", \"KoboldAI/fairseq-dense-13B\", \"EleutherAI/gpt-j-6B\"] {allow-input: true}\n", "Version = \"Official\" #@param [\"Official\", \"United\"] {allow-input: true}\n", "Provider = \"Cloudflare\" #@param [\"Localtunnel\", \"Cloudflare\"]\n", "\n", @@ -84,8 +86,8 @@ " Model = \"KoboldAI/fairseq-dense-13B-Janeway\"\n", " path = \"\"\n", " download = \"\"\n", - "elif Model == \"Nerys 13B\":\n", - " Model = \"KoboldAI/fairseq-dense-13B-Nerys\"\n", + "elif Model == \"Nerys 13B V2 \":\n", + " Model = \"KoboldAI/fairseq-dense-13B-Nerys-v2\"\n", " path = \"\"\n", " download = \"\"\n", "elif Model == \"Shinen 13B\":\n", From a2d2ea0735f211d3f4b8252661a8d36d56c18be7 Mon Sep 17 00:00:00 2001 From: henk717 Date: Sat, 25 Jun 2022 13:14:27 +0200 Subject: [PATCH 011/142] Typo Fix --- colab/TPU.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/colab/TPU.ipynb b/colab/TPU.ipynb index 9c349728..ec3f84db 100644 --- a/colab/TPU.ipynb +++ b/colab/TPU.ipynb @@ -86,7 +86,7 @@ " Model = \"KoboldAI/fairseq-dense-13B-Janeway\"\n", " path = \"\"\n", " download = \"\"\n", - "elif Model == \"Nerys 13B V2 \":\n", + "elif Model == \"Nerys 13B V2\":\n", " Model = \"KoboldAI/fairseq-dense-13B-Nerys-v2\"\n", " path = \"\"\n", " download = \"\"\n", From ecc6ee947451088621f532484816a038544ad683 Mon Sep 17 00:00:00 2001 From: Henk Date: Sat, 25 Jun 2022 13:47:49 +0200 Subject: [PATCH 012/142] Nerys V2 --- aiserver.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aiserver.py b/aiserver.py index 5187c28a..fb759f7f 100644 --- a/aiserver.py +++ b/aiserver.py @@ -122,8 +122,9 @@ adventurelist= [ ] novellist= [ - ["Nerys FSD 13B (Hybrid)", "KoboldAI/fairseq-dense-13B-Nerys", "32GB"], + ["Nerys FSD 13B V2 (Hybrid)", "KoboldAI/fairseq-dense-13B-Nerys-V2", "32GB"], ["Janeway FSD 13B", "KoboldAI/fairseq-dense-13B-Janeway", "32GB"], + ["Nerys FSD 13B (Hybrid)", "KoboldAI/fairseq-dense-13B-Nerys", "32GB"], ["Janeway FSD 6.7B", "KoboldAI/fairseq-dense-6.7B-Janeway", "16GB"], ["Janeway Neo 6B", "KoboldAI/GPT-J-6B-Janeway", "16GB"], ["Janeway Neo 2.7B", "KoboldAI/GPT-Neo-2.7B-Janeway", "8GB"], From 9e7eb80db4aa4787eebbac861ac255f718c7eed1 Mon Sep 17 00:00:00 2001 From: Henk Date: Sat, 25 Jun 2022 14:03:19 +0200 Subject: [PATCH 013/142] Nerys V2 part 2 --- aiserver.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aiserver.py b/aiserver.py index fb759f7f..08046290 100644 --- a/aiserver.py +++ b/aiserver.py @@ -111,6 +111,7 @@ mainmenu = [ ] adventurelist= [ + ["Nerys FSD 13B V2 (Hybrid)", "KoboldAI/fairseq-dense-13B-Nerys-v2", "32GB"], ["Nerys FSD 13B (Hybrid)", "KoboldAI/fairseq-dense-13B-Nerys", "32GB"], ["Skein 6B", "KoboldAI/GPT-J-6B-Skein", "16GB"], ["Adventure 6B", "KoboldAI/GPT-J-6B-Adventure", "16GB"], @@ -122,7 +123,7 @@ adventurelist= [ ] novellist= [ - ["Nerys FSD 13B V2 (Hybrid)", "KoboldAI/fairseq-dense-13B-Nerys-V2", "32GB"], + ["Nerys FSD 13B V2 (Hybrid)", "KoboldAI/fairseq-dense-13B-Nerys-v2", "32GB"], ["Janeway FSD 13B", "KoboldAI/fairseq-dense-13B-Janeway", "32GB"], ["Nerys FSD 13B (Hybrid)", "KoboldAI/fairseq-dense-13B-Nerys", "32GB"], ["Janeway FSD 6.7B", "KoboldAI/fairseq-dense-6.7B-Janeway", "16GB"], From 151407a001651c70f49a0c659957d80a36ec2a8a Mon Sep 17 00:00:00 2001 From: vfbd Date: Sun, 26 Jun 2022 13:02:22 -0400 Subject: [PATCH 014/142] Don't add sentence spacing if submission is empty When you retry, it actually sends an empty submission, so if you have add sentence spacing on, retrying could add an extra action with a single space. --- utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utils.py b/utils.py index 430e729b..3c5d2a1e 100644 --- a/utils.py +++ b/utils.py @@ -104,6 +104,9 @@ def removespecialchars(txt, vars=None): # If the next action follows a sentence closure, add a space #==================================================================# def addsentencespacing(txt, vars): + # Don't add sentence spacing if submission is empty or starts with whitespace + if(len(txt) == 0 or len(txt) != len(txt.lstrip())): + return txt # Get last character of last action if(len(vars.actions) > 0): if(len(vars.actions[vars.actions.get_last_key()]) > 0): From b99d1449c942286113df3c98ba7dd99137fcae64 Mon Sep 17 00:00:00 2001 From: vfbd Date: Sun, 26 Jun 2022 13:15:55 -0400 Subject: [PATCH 015/142] Remove trailing whitespace from submissions --- aiserver.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aiserver.py b/aiserver.py index 69b40119..91057d5c 100644 --- a/aiserver.py +++ b/aiserver.py @@ -3495,6 +3495,7 @@ def actionsubmit(data, actionmode=0, force_submit=False, force_prompt_gen=False, if(not vars.gamestarted): vars.submission = data execute_inmod() + vars.submission = re.sub(r"[^\S\r\n]*([\r\n]*)$", r"\1", vars.submission) # Remove trailing whitespace, excluding newlines data = vars.submission if(not force_submit and len(data.strip()) == 0): assert False @@ -3553,6 +3554,7 @@ def actionsubmit(data, actionmode=0, force_submit=False, force_prompt_gen=False, data = applyinputformatting(data) vars.submission = data execute_inmod() + vars.submission = re.sub(r"[^\S\r\n]*([\r\n]*)$", r"\1", vars.submission) # Remove trailing whitespace, excluding newlines data = vars.submission # Dont append submission if it's a blank/continue action if(data != ""): From ae41ad298cc54a1ef9972cef57dd25455b07f9fe Mon Sep 17 00:00:00 2001 From: vfbd Date: Sun, 26 Jun 2022 13:40:58 -0400 Subject: [PATCH 016/142] Make sure editor changes are applied before submitting --- static/application.js | 3 ++- templates/index.html | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/static/application.js b/static/application.js index 5b9820d2..a7a10016 100644 --- a/static/application.js +++ b/static/application.js @@ -891,6 +891,7 @@ function dosubmit(disallow_abort) { if((disallow_abort || gamestate !== "wait") && !memorymode && !gamestarted && ((!adventure || !action_mode) && txt.trim().length == 0)) { return; } + chunkOnFocusOut("override"); input_text.val(""); hideMessage(); hidegenseqs(); @@ -1969,7 +1970,7 @@ function chunkOnKeyDownSelectionChange(event) { // This gets run when you defocus the editor by clicking // outside of the editor or by pressing escape or tab function chunkOnFocusOut(event) { - if(!gametext_bound || !allowedit || event.target !== game_text[0]) { + if(event !== "override" && (!gametext_bound || !allowedit || event.target !== game_text[0])) { return; } setTimeout(function() { diff --git a/templates/index.html b/templates/index.html index 2603dec2..9cc53626 100644 --- a/templates/index.html +++ b/templates/index.html @@ -17,7 +17,7 @@ - + {% if flaskwebgui %} From e30abd209f16fd8640dc9be7238bb421eca269e0 Mon Sep 17 00:00:00 2001 From: vfbd Date: Sun, 26 Jun 2022 14:04:16 -0400 Subject: [PATCH 017/142] Preserve whitespace in the editor (cherry picked from commit 793d788706a7a35adb53fb0d22c6b629a9c1d215) --- static/custom.css | 1 + 1 file changed, 1 insertion(+) diff --git a/static/custom.css b/static/custom.css index 640cb8db..2b6db54d 100644 --- a/static/custom.css +++ b/static/custom.css @@ -4,6 +4,7 @@ body { chunk { color: #ffffff; + white-space: pre-wrap; } #gametext.adventure action { From 2a4d37ce6024a0b4cc5f8544757185fd40f6d79f Mon Sep 17 00:00:00 2001 From: vfbd Date: Sun, 26 Jun 2022 14:04:36 -0400 Subject: [PATCH 018/142] Clean up whitespace at the end of actions when loading story Specifically, we merge blank actions into the next action and we move whitespace at the end of non-blank actions to the beginning of the next action. (cherry picked from commit 4b16600e49a24f9d43c16d9517eb0acfc9539313) --- aiserver.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/aiserver.py b/aiserver.py index 08046290..57eac4e4 100644 --- a/aiserver.py +++ b/aiserver.py @@ -5090,7 +5090,8 @@ def loadRequest(loadpath, filename=None): for text in js['actions']: vars.actions_metadata[i] = {'Selected Text': text, 'Alternative Text': []} i+=1 - + + footer = "" if(len(vars.prompt.strip()) == 0): while(len(actions)): @@ -5100,9 +5101,25 @@ def loadRequest(loadpath, filename=None): break else: vars.gamestarted = False + vars.prompt = vars.prompt.lstrip() + ln = len(vars.prompt.rstrip()) + footer += vars.prompt[ln:] + vars.prompt = vars.prompt[:ln] if(vars.gamestarted): for s in actions: - vars.actions.append(s) + if(len(s.strip()) == 0): + # If this action only contains whitespace, we merge it with the next action + footer += s + continue + vars.actions.append(footer + s) + footer = "" + # If there is trailing whitespace at the end of an action, we move that whitespace to the beginning of the next action + ln = len(vars.actions[vars.actions.get_last_key()].rstrip()) + footer += vars.actions[vars.actions.get_last_key()][ln:] + vars.actions[vars.actions.get_last_key()] = vars.actions[vars.actions.get_last_key()][:ln] + if(len(vars.actions) == 0): + vars.gamestarted = False + # Try not to break older save files if("authorsnote" in js): From 9d09ae5feada79e61b7db45655bcb600daa95ac3 Mon Sep 17 00:00:00 2001 From: vfbd Date: Sun, 26 Jun 2022 14:05:04 -0400 Subject: [PATCH 019/142] Clean up whitespace in the editor as well (cherry picked from commit 6e138db1c0be03768e1c1297668260614011b9e1) --- static/application.js | 45 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/static/application.js b/static/application.js index 3cddea87..7ae7aee1 100644 --- a/static/application.js +++ b/static/application.js @@ -1609,7 +1609,7 @@ function applyChunkDeltas(nodes) { var selected_chunks = buildChunkSetFromNodeArray(getSelectedNodes()); for(var i = 0; i < chunks.length; i++) { var chunk = document.getElementById("n" + chunks[i]); - if(chunk && formatChunkInnerText(chunk).length != 0 && chunks[i] != '0') { + if(chunk && formatChunkInnerText(chunk).trim().length != 0 && chunks[i] != '0') { if(!selected_chunks.has(chunks[i])) { modified_chunks.delete(chunks[i]); socket.send({'cmd': 'inlineedit', 'chunk': chunks[i], 'data': formatChunkInnerText(chunk)}); @@ -1618,7 +1618,7 @@ function applyChunkDeltas(nodes) { } else { if(!selected_chunks.has(chunks[i])) { modified_chunks.delete(chunks[i]); - socket.send({'cmd': 'inlineedit', 'chunk': chunks[i], 'data': ''}); + socket.send({'cmd': 'inlineedit', 'chunk': chunks[i], 'data': formatChunkInnerText(chunk)}); } empty_chunks.add(chunks[i]); } @@ -1750,6 +1750,46 @@ function highlightEditingChunks() { } } +function cleanupChunkWhitespace() { + // Merge empty chunks with the next chunk + var chunks = Array.from(empty_chunks); + chunks.sort(function(e) {parseInt(e)}); + for(var i = 0; i < chunks.length; i++) { + var original_chunk = document.getElementById("n" + chunks[i]); + original_chunk.innerText = footer + original_chunk.innerText; + footer = ""; + var chunk = original_chunk.nextSibling; + while(chunk) { + if(chunk.tagName === "CHUNK") { + break; + } + chunk = chunk.nextSibling; + } + if(chunk) { + chunk.innerText = original_chunk.innerText + chunk.innerText; + } + original_chunk.innerText = ""; + } + // Move whitespace at the end of non-empty chunks into the beginning of the next non-empty chunk + var chunks = Array.from(modified_chunks); + chunks.sort(function(e) {parseInt(e)}); + for(var i = 0; i < chunks.length; i++) { + var original_chunk = document.getElementById("n" + chunks[i]); + var chunk = original_chunk.nextSibling; + while(chunk) { + if(chunk.tagName === "CHUNK" && !empty_chunks.has(chunk.getAttribute("n"))) { + break; + } + chunk = chunk.nextSibling; + } + var ln = original_chunk.innerText.trimEnd().length; + if (chunk) { + chunk.innerText = original_chunk.innerText.substring(ln) + chunk.innerText; + } + original_chunk.innerText = original_chunk.innerText.substring(0, ln); + } +} + // This gets run every time the text in a chunk is edited // or a chunk is deleted function chunkOnDOMMutate(mutations, observer) { @@ -1828,6 +1868,7 @@ function chunkOnFocusOut(event) { if(document.activeElement === game_text[0] || game_text[0].contains(document.activeElement)) { return; } + cleanupChunkWhitespace(); syncAllModifiedChunks(true); setTimeout(function() { var blurred = game_text[0] !== document.activeElement; From 6ba7429eead8a3f882b5fb7949ffb7157949cf37 Mon Sep 17 00:00:00 2001 From: vfbd Date: Sun, 26 Jun 2022 14:06:18 -0400 Subject: [PATCH 020/142] Don't add sentence spacing if submission is empty When you retry, it actually sends an empty submission, so if you have add sentence spacing on, retrying could add an extra action with a single space. (cherry picked from commit 151407a001651c70f49a0c659957d80a36ec2a8a) --- utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utils.py b/utils.py index 96606269..e6d7d12b 100644 --- a/utils.py +++ b/utils.py @@ -91,6 +91,9 @@ def removespecialchars(txt, vars=None): # If the next action follows a sentence closure, add a space #==================================================================# def addsentencespacing(txt, vars): + # Don't add sentence spacing if submission is empty or starts with whitespace + if(len(txt) == 0 or len(txt) != len(txt.lstrip())): + return txt # Get last character of last action if(len(vars.actions) > 0): if(len(vars.actions[vars.actions.get_last_key()]) > 0): From ebba79fed6ce957d1d3079b400eb301b7f49d078 Mon Sep 17 00:00:00 2001 From: vfbd Date: Sun, 26 Jun 2022 14:06:34 -0400 Subject: [PATCH 021/142] Remove trailing whitespace from submissions (cherry picked from commit b99d1449c942286113df3c98ba7dd99137fcae64) --- aiserver.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aiserver.py b/aiserver.py index 57eac4e4..728f8201 100644 --- a/aiserver.py +++ b/aiserver.py @@ -3110,6 +3110,7 @@ def actionsubmit(data, actionmode=0, force_submit=False, force_prompt_gen=False, if(not vars.gamestarted): vars.submission = data execute_inmod() + vars.submission = re.sub(r"[^\S\r\n]*([\r\n]*)$", r"\1", vars.submission) # Remove trailing whitespace, excluding newlines data = vars.submission if(not force_submit and len(data.strip()) == 0): assert False @@ -3168,6 +3169,7 @@ def actionsubmit(data, actionmode=0, force_submit=False, force_prompt_gen=False, data = applyinputformatting(data) vars.submission = data execute_inmod() + vars.submission = re.sub(r"[^\S\r\n]*([\r\n]*)$", r"\1", vars.submission) # Remove trailing whitespace, excluding newlines data = vars.submission # Dont append submission if it's a blank/continue action if(data != ""): From 6576f5c01df693a561da12eede7ec8a7fc2b26ba Mon Sep 17 00:00:00 2001 From: vfbd Date: Sun, 26 Jun 2022 14:06:57 -0400 Subject: [PATCH 022/142] Make sure editor changes are applied before submitting (cherry picked from commit ae41ad298cc54a1ef9972cef57dd25455b07f9fe) --- static/application.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/static/application.js b/static/application.js index 7ae7aee1..4faf3922 100644 --- a/static/application.js +++ b/static/application.js @@ -881,6 +881,7 @@ function dosubmit(disallow_abort) { if((disallow_abort || gamestate !== "wait") && !memorymode && !gamestarted && ((!adventure || !action_mode) && txt.trim().length == 0)) { return; } + chunkOnFocusOut("override"); input_text.val(""); hideMessage(); hidegenseqs(); @@ -1861,7 +1862,7 @@ function chunkOnKeyDownSelectionChange(event) { // This gets run when you defocus the editor by clicking // outside of the editor or by pressing escape or tab function chunkOnFocusOut(event) { - if(!gametext_bound || !allowedit || event.target !== game_text[0]) { + if(event !== "override" && (!gametext_bound || !allowedit || event.target !== game_text[0])) { return; } setTimeout(function() { From 46678931b21f5497420cf5ad627eb05084a55312 Mon Sep 17 00:00:00 2001 From: Henk Date: Sun, 26 Jun 2022 20:27:21 +0200 Subject: [PATCH 023/142] Better sentence spacing --- aiserver.py | 2 +- utils.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aiserver.py b/aiserver.py index 91057d5c..5732128f 100644 --- a/aiserver.py +++ b/aiserver.py @@ -300,7 +300,7 @@ class vars: hascuda = False # Whether torch has detected CUDA on the system usegpu = False # Whether to launch pipeline with GPU support custmodpth = "" # Filesystem location of custom model to run - formatoptns = {'frmttriminc': True, 'frmtrmblln': False, 'frmtrmspch': False, 'frmtadsnsp': False, 'singleline': False} # Container for state of formatting options + formatoptns = {'frmttriminc': True, 'frmtrmblln': False, 'frmtrmspch': False, 'frmtadsnsp': True, 'singleline': False} # Container for state of formatting options importnum = -1 # Selection on import popup list importjs = {} # Temporary storage for import data loadselect = "" # Temporary storage for story filename to load diff --git a/utils.py b/utils.py index 3c5d2a1e..dc2c97d0 100644 --- a/utils.py +++ b/utils.py @@ -119,7 +119,7 @@ def addsentencespacing(txt, vars): else: action = vars.prompt lastchar = action[-1] if len(action) else "" - if(lastchar == "." or lastchar == "!" or lastchar == "?" or lastchar == "," or lastchar == ";" or lastchar == ":"): + if(lastchar != " "): txt = " " + txt return txt From edd6dd7cd71a83c63b791aba66d6778d269a5053 Mon Sep 17 00:00:00 2001 From: ebolam Date: Mon, 27 Jun 2022 10:12:54 -0400 Subject: [PATCH 024/142] Fix for saved breakmodel settings on custom models Fix for unit tests with new disk breakmodel --- aiserver.py | 14 +++++++++++--- test_aiserver.py | 14 ++++++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/aiserver.py b/aiserver.py index 5732128f..ad6e7fd6 100644 --- a/aiserver.py +++ b/aiserver.py @@ -1149,8 +1149,12 @@ def get_model_info(model, directory=""): breakmodel = False else: breakmodel = True - if path.exists("settings/{}.breakmodel".format(model.replace("/", "_"))): - with open("settings/{}.breakmodel".format(model.replace("/", "_")), "r") as file: + if model in ["NeoCustom", "GPT2Custom"]: + filename = "settings/{}.breakmodel".format(os.path.basename(os.path.normpath(directory))) + else: + filename = "settings/{}.breakmodel".format(model.replace("/", "_")) + if path.exists(filename): + with open(filename, "r") as file: data = file.read().split("\n")[:2] if len(data) < 2: data.append("0") @@ -3245,7 +3249,11 @@ def get_message(msg): if gpu_layers == msg['gpu_layers'] and disk_layers == msg['disk_layers']: changed = False if changed: - f = open("settings/" + vars.model.replace('/', '_') + ".breakmodel", "w") + if vars.model in ["NeoCustom", "GPT2Custom"]: + filename = "settings/{}.breakmodel".format(os.path.basename(os.path.normpath(vars.custmodpth))) + else: + filename = "settings/{}.breakmodel".format(vars.model.replace('/', '_')) + f = open(filename, "w") f.write(msg['gpu_layers'] + '\n' + msg['disk_layers']) f.close() vars.colaburl = msg['url'] + "/request" diff --git a/test_aiserver.py b/test_aiserver.py index 855b71f5..b9bf4606 100644 --- a/test_aiserver.py +++ b/test_aiserver.py @@ -125,7 +125,7 @@ def test_load_model_from_web_ui(client_data, model, expected_load_options): assert response['url'] == expected_load_options['url'] #Now send the load - socketio_client.emit('message',{'cmd': 'load_model', 'use_gpu': True, 'key': '', 'gpu_layers': '', 'url': '', 'online_model': ''}) + socketio_client.emit('message',{'cmd': 'load_model', 'use_gpu': True, 'key': '', 'gpu_layers': str(expected_load_options['layer_count']), 'disk_layers': '0', 'url': '', 'online_model': ''}) #wait until the game state turns back to start state = 'wait' start_time = time.time() @@ -208,11 +208,17 @@ def test_back_redo(client_data): response = socketio_client.get_received()[0]['args'][0] assert response == {'cmd': 'errmsg', 'data': 'Cannot delete the prompt.'} socketio_client.emit('message',{'cmd': 'redo', 'data': ''}) - socketio_client.emit('message',{'cmd': 'redo', 'data': ''}) + response = socketio_client.get_received() + assert response == [{'name': 'from_server', 'args': [{'cmd': 'updatescreen', 'gamestarted': True, 'data': 'Niko the kobold stalked carefully down the alley, his small scaly figure obscured by a dusky cloak that fluttered lightly in the cold winter breeze. Holding up his tail to keep it from dragging in the dirty snow that covered the cobblestone, he waited patiently for the butcher to turn his attention from his stall so that he could pilfer his next meal: a tender-looking chicken. He crouched just slightly as he neared the stall to ensure that no one was watching, not that anyone would be dumb enough to hassle a small kobold. What else was there for a lowly kobold to'}], 'namespace': '/'}, + {'name': 'from_server', 'args': [{'cmd': 'texteffect', 'data': 1}], 'namespace': '/'}] socketio_client.emit('message',{'cmd': 'redo', 'data': ''}) response = socketio_client.get_received() - assert response == [{'name': 'from_server', 'args': [{'cmd': 'updatescreen', 'gamestarted': True, 'data': 'Niko the kobold stalked carefully down the alley, his small scaly figure obscured by a dusky cloak that fluttered lightly in the cold winter breeze. Holding up his tail to keep it from dragging in the dirty snow that covered the cobblestone, he waited patiently for the butcher to turn his attention from his stall so that he could pilfer his next meal: a tender-looking chicken. He crouched just slightly as he neared the stall to ensure that no one was watching, not that anyone would be dumb enough to hassle a small kobold. What else was there for a lowly kobold to'}], 'namespace': '/'}, {'name': 'from_server', 'args': [{'cmd': 'texteffect', 'data': 1}], 'namespace': '/'}, {'name': 'from_server', 'args': [{'cmd': 'updatechunk', 'data': {'index': 2, 'html': ' do in a city? All that Niko needed to know was'}}], 'namespace': '/'}, {'name': 'from_server', 'args': [{'cmd': 'texteffect', 'data': 2}], 'namespace': '/'}, {'name': 'from_server', 'args': [{'cmd': 'updatechunk', 'data': {'index': 3, 'html': ' where to find the chicken and then how to make off with it.

A soft thud caused Niko to quickly lift his head. Standing behind the stall where the butcher had been cutting his chicken,
'}}], 'namespace': '/'}, {'name': 'from_server', 'args': [{'cmd': 'texteffect', 'data': 3}], 'namespace': '/'}] - + assert response == [{'name': 'from_server', 'args': [{'cmd': 'updatechunk', 'data': {'index': 2, 'html': ' do in a city? All that Niko needed to know was'}}], 'namespace': '/'}, + {'name': 'from_server', 'args': [{'cmd': 'texteffect', 'data': 2}], 'namespace': '/'}] + socketio_client.emit('message',{'cmd': 'redo', 'data': ''}) + response = socketio_client.get_received() + assert response == [{'name': 'from_server', 'args': [{'cmd': 'updatechunk', 'data': {'index': 3, 'html': ' where to find the chicken and then how to make off with it.

A soft thud caused Niko to quickly lift his head. Standing behind the stall where the butcher had been cutting his chicken,
'}}], 'namespace': '/'}, + {'name': 'from_server', 'args': [{'cmd': 'texteffect', 'data': 3}], 'namespace': '/'}] From cba38bf3e498245f80470ea136a179c71f410ca0 Mon Sep 17 00:00:00 2001 From: Henk Date: Tue, 28 Jun 2022 15:17:32 +0200 Subject: [PATCH 025/142] Automatically update requirements --- install_requirements.bat | 7 +------ update-koboldai.bat | 8 ++++++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/install_requirements.bat b/install_requirements.bat index cd7b0aef..772c5e28 100644 --- a/install_requirements.bat +++ b/install_requirements.bat @@ -1,16 +1,11 @@ @echo off title KoboldAI Runtime Installer (MicroMamba) -echo Please choose one of the following transformers options -echo 1. Official Transformers (Recommended) -echo 2. Finetune Transformers (For old 6B models) -echo. + echo Errors? Rerun this as admin so it can add the needed LongPathsEnabled registery tweak. echo Installer failed or crashed? Run it again so it can continue. echo Only Windows 10 and higher officially supported, older Windows installations can't handle the paths. echo. -SET /P B=Type the number of the desired option and then press ENTER: - Reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v "LongPathsEnabled" /t REG_DWORD /d "1" /f 2>nul cd /D %~dp0 diff --git a/update-koboldai.bat b/update-koboldai.bat index 26e9ec17..5ce40985 100644 --- a/update-koboldai.bat +++ b/update-koboldai.bat @@ -1,6 +1,5 @@ @echo off -%~d0 -cd %~dp0 +cd /d %~dp0 TITLE KoboldAI - Updater SET /P M= Date: Tue, 28 Jun 2022 16:23:21 +0200 Subject: [PATCH 026/142] Standalone Docker KoboldAI United now has a working official docker available at henk717/koboldai:united . In the spirit of our project, this commit open sources the files used to build the docker. docker-helper.sh is in the main folder, so that it is not overwritten during updates. Instead this file is copied by the Dockerfile and should be updated trough container updates. --- docker-standalone/Dockerfile | 8 +++++ docker-standalone/Readme.txt | 9 ++++++ docker-standalone/docker-helper.sh | 47 ++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 docker-standalone/Dockerfile create mode 100644 docker-standalone/Readme.txt create mode 100644 docker-standalone/docker-helper.sh diff --git a/docker-standalone/Dockerfile b/docker-standalone/Dockerfile new file mode 100644 index 00000000..6e13ce0e --- /dev/null +++ b/docker-standalone/Dockerfile @@ -0,0 +1,8 @@ +FROM debian +RUN apt update && apt install wget aria2 git bzip2 -y +RUN git clone https://github.com/henk717/koboldai /opt/koboldai +WORKDIR /opt/koboldai +RUN ./install_requirements.sh cuda +COPY docker-helper.sh /opt/koboldai/docker-helper.sh +EXPOSE 5000/tcp +CMD /opt/koboldai/docker-helper.sh diff --git a/docker-standalone/Readme.txt b/docker-standalone/Readme.txt new file mode 100644 index 00000000..fe574d63 --- /dev/null +++ b/docker-standalone/Readme.txt @@ -0,0 +1,9 @@ +These are the source files for the official versions of the standalone docker and are provided for completeness. +Using these files you will not use any of the local modifications you make, instead it will use the latest github version of KoboldAI as the basis. + +If you wish to run KoboldAI containerised with access to the local directory you can do so using docker-cuda.sh or docker-rocm.sh instead. + +We do not support ROCm in the standalone docker as it is intended for cloud deployment on CUDA systems. +If you wish to build a ROCm version instead, you can do so by modifying the Dockerfile and changing the install_requirements.sh from cuda to rocm. + +Similarly you need to modify the Dockerfile to specify which branch of KoboldAI the docker is being built for. \ No newline at end of file diff --git a/docker-standalone/docker-helper.sh b/docker-standalone/docker-helper.sh new file mode 100644 index 00000000..30107e8a --- /dev/null +++ b/docker-standalone/docker-helper.sh @@ -0,0 +1,47 @@ +#!/bin/bash +cd /opt/koboldai +git pull +#./install_requirements.sh cuda + +if [[ ! -v KOBOLDAI_DATADIR ]];then + mkdir /content + KOBOLDAI_DATADIR=/content +fi + +mkdir $KOBOLDAI_DATADIR/stories +if [[ ! -v KOBOLDAI_MODELDIR ]];then + mkdir $KOBOLDAI_MODELDIR/models +fi +mkdir $KOBOLDAI_DATADIR/settings +mkdir $KOBOLDAI_DATADIR/softprompts +mkdir $KOBOLDAI_DATADIR/userscripts +#mkdir $KOBOLDAI_MODELDIR/cache + +cp -rn stories/* $KOBOLDAI_DATADIR/stories/ +cp -rn userscripts/* $KOBOLDAI_DATADIR/userscripts/ +cp -rn softprompts/* $KOBOLDAI_DATADIR/softprompts/ + +rm stories +rm -rf stories/ +rm userscripts +rm -rf userscripts/ +rm softprompts +rm -rf softprompts/ + +if [[ ! -v KOBOLDAI_MODELDIR ]];then + rm models + rm -rf models/ + #rm cache + #rm -rf cache/ +fi + +ln -s $KOBOLDAI_DATADIR/stories/ stories +ln -s $KOBOLDAI_DATADIR/settings/ settings +ln -s $KOBOLDAI_DATADIR/softprompts/ softprompts +ln -s $KOBOLDAI_DATADIR/userscripts/ userscripts +if [[ ! -v KOBOLDAI_MODELDIR ]];then + ln -s $KOBOLDAI_MODELDIR/models/ models + #ln -s $KOBOLDAI_MODELDIR/cache/ cache +fi + +PYTHONUNBUFFERED=1 ./play.sh --remote --quiet --override_delete --override_rename From 496f6dcf3f8e8a1df662b7ec505dc80bb684d307 Mon Sep 17 00:00:00 2001 From: Henk Date: Tue, 28 Jun 2022 16:28:00 +0200 Subject: [PATCH 027/142] Add docker usage info --- docker-standalone/Readme.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docker-standalone/Readme.txt b/docker-standalone/Readme.txt index fe574d63..9b698f90 100644 --- a/docker-standalone/Readme.txt +++ b/docker-standalone/Readme.txt @@ -6,4 +6,12 @@ If you wish to run KoboldAI containerised with access to the local directory you We do not support ROCm in the standalone docker as it is intended for cloud deployment on CUDA systems. If you wish to build a ROCm version instead, you can do so by modifying the Dockerfile and changing the install_requirements.sh from cuda to rocm. -Similarly you need to modify the Dockerfile to specify which branch of KoboldAI the docker is being built for. \ No newline at end of file +Similarly you need to modify the Dockerfile to specify which branch of KoboldAI the docker is being built for. + +Usage: +This docker will automatically assume the persistent volume is mounted to /content and will by default not store models there. +The following environment variables exist to adjust the behavior if desired. + +KOBOLDAI_DATADIR=/content , this can be used to specify a different default location for your stories, settings, userscripts, etc in case your provider does not let you change the mounted folder path. +KOBOLDAI_MODELDIR= , This variable can be used to make model storage persistent, it can be the same location as your datadir but this is not required. +KOBOLDAI_ARGS= , This variable is built in KoboldAI and can be used to override the default launch options. Right now the docker by default will launch in remote mode, with output hidden from the logs and file management enabled. \ No newline at end of file From d55b4d9bbc5375a49e6cad2608ab8e0ad309c1f9 Mon Sep 17 00:00:00 2001 From: vfbd Date: Tue, 28 Jun 2022 12:18:57 -0400 Subject: [PATCH 028/142] Fix the cleanupChunkWhitespace function --- static/application.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/static/application.js b/static/application.js index 4faf3922..e8f3d4e9 100644 --- a/static/application.js +++ b/static/application.js @@ -1757,8 +1757,6 @@ function cleanupChunkWhitespace() { chunks.sort(function(e) {parseInt(e)}); for(var i = 0; i < chunks.length; i++) { var original_chunk = document.getElementById("n" + chunks[i]); - original_chunk.innerText = footer + original_chunk.innerText; - footer = ""; var chunk = original_chunk.nextSibling; while(chunk) { if(chunk.tagName === "CHUNK") { From 048bd0ff3b9b1f145c3d2be9e77fa9cebfc6edfb Mon Sep 17 00:00:00 2001 From: vfbd Date: Tue, 28 Jun 2022 13:21:05 -0400 Subject: [PATCH 029/142] Add support for setting the RNG seed and full determinism --- aiserver.py | 45 +++++++++++++++++++++++++++++++++++++++++++ gensettings.py | 11 +++++++++++ static/application.js | 3 +++ tpu_mtj_backend.py | 20 +++++++++++++++++-- 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/aiserver.py b/aiserver.py index ad6e7fd6..94aa3b60 100644 --- a/aiserver.py +++ b/aiserver.py @@ -238,6 +238,9 @@ class vars: tfs = 1.0 # Default generator tfs (tail-free sampling) typical = 1.0 # Default generator typical sampling threshold numseqs = 1 # Number of sequences to ask the generator to create + full_determinism = False # Whether or not full determinism is enabled + seed_specified = False # Whether or not the current RNG seed was specified by the user (in their settings file) + seed = None # The current RNG seed (as an int), or None if unknown gamestarted = False # Whether the game has started (disables UI elements) gamesaved = True # Whether or not current game is saved serverstarted = False # Whether or not the Flask server has started @@ -785,8 +788,13 @@ def savesettings(): js["nopromptgen"] = vars.nopromptgen js["rngpersist"] = vars.rngpersist js["nogenmod"] = vars.nogenmod + js["fulldeterminism"] = vars.full_determinism js["autosave"] = vars.autosave js["welcome"] = vars.welcome + + if(vars.seed_specified): + js["seed"] = vars.seed + js["newlinemode"] = vars.newlinemode js["antemplate"] = vars.setauthornotetemplate @@ -886,12 +894,20 @@ def processsettings(js): vars.rngpersist = js["rngpersist"] if("nogenmod" in js): vars.nogenmod = js["nogenmod"] + if("fulldeterminism" in js): + vars.full_determinism = js["fulldeterminism"] if("autosave" in js): vars.autosave = js["autosave"] if("newlinemode" in js): vars.newlinemode = js["newlinemode"] if("welcome" in js): vars.welcome = js["welcome"] + + if("seed" in js): + vars.seed = js["seed"] + vars.seed_specified = True + else: + vars.seed_specified = False if("antemplate" in js): vars.setauthornotetemplate = js["antemplate"] @@ -3383,6 +3399,10 @@ def get_message(msg): vars.nogenmod = msg['data'] settingschanged() refresh_settings() + elif(msg['cmd'] == 'setfulldeterminism'): + vars.full_determinism = msg['data'] + settingschanged() + refresh_settings() elif(not vars.host and msg['cmd'] == 'importwi'): wiimportrequest() elif(msg['cmd'] == 'debug'): @@ -3942,6 +3962,9 @@ def calcsubmit(txt): #==================================================================# def _generate(txt, minimum, maximum, found_entries): + if(vars.full_determinism): + torch.manual_seed(vars.seed) + gen_in = torch.tensor(txt, dtype=torch.long)[None] if(vars.sp is not None): soft_tokens = torch.arange( @@ -4282,6 +4305,9 @@ def sendtocolab(txt, min, max): # Send text to TPU mesh transformer backend #==================================================================# def tpumtjgenerate(txt, minimum, maximum, found_entries=None): + if(vars.full_determinism): + tpu_mtj_backend.set_rng_seed(vars.seed) + vars.generated_tkns = 0 if(found_entries is None): @@ -4567,6 +4593,7 @@ def refresh_settings(): emit('from_server', {'cmd': 'updatenopromptgen', 'data': vars.nopromptgen}, broadcast=True) emit('from_server', {'cmd': 'updaterngpersist', 'data': vars.rngpersist}, broadcast=True) emit('from_server', {'cmd': 'updatenogenmod', 'data': vars.nogenmod}, broadcast=True) + emit('from_server', {'cmd': 'updatefulldeterminism', 'data': vars.full_determinism}, broadcast=True) emit('from_server', {'cmd': 'updatefrmttriminc', 'data': vars.formatoptns["frmttriminc"]}, broadcast=True) emit('from_server', {'cmd': 'updatefrmtrmblln', 'data': vars.formatoptns["frmtrmblln"]}, broadcast=True) @@ -5987,9 +6014,27 @@ def final_startup(): }, ).start() + # Set the initial RNG seed + if(vars.seed is not None): + if(vars.use_colab_tpu): + if(vars.seed_specified): + __import__("tpu_mtj_backend").set_rng_seed(vars.seed) + else: + __import__("tpu_mtj_backend").randomize_rng_seed() + else: + if(vars.seed_specified): + __import__("torch").manual_seed(vars.seed) + else: + __import__("torch").seed() + vars.seed = __import__("tpu_mtj_backend").get_rng_seed() if vars.use_colab_tpu else __import__("torch").initial_seed() + def send_debug(): if vars.debug: debug_info = "" + try: + debug_info = "{}Seed: {} ({})\n".format(debug_info, repr(__import__("tpu_mtj_backend").get_rng_seed() if vars.use_colab_tpu else __import__("torch").initial_seed()), "specified by user in settings file" if vars.seed_specified else "randomly generated") + except: + pass try: debug_info = "{}Newline Mode: {}\n".format(debug_info, vars.newlinemode) except: diff --git a/gensettings.py b/gensettings.py index b3007c91..3d188b16 100644 --- a/gensettings.py +++ b/gensettings.py @@ -230,6 +230,17 @@ gensettingstf = [ "default": 0, "tooltip": "Disables userscript generation modifiers." }, + { + "uitype": "toggle", + "unit": "bool", + "label": "Full Determinism", + "id": "setfulldeterminism", + "min": 0, + "max": 1, + "step": 1, + "default": 0, + "tooltip": "Causes generation to be fully deterministic -- the model will always output the same thing as long as your story, settings and RNG seed are the same. If this is off, only the sequence of outputs that the model makes will be deterministic." + }, { "uitype": "toggle", "unit": "bool", diff --git a/static/application.js b/static/application.js index a7a10016..d91f6029 100644 --- a/static/application.js +++ b/static/application.js @@ -2606,6 +2606,9 @@ $(document).ready(function(){ } else if(msg.cmd == "updatenogenmod") { // Update toggle state $("#setnogenmod").prop('checked', msg.data).change(); + } else if(msg.cmd == "updatefulldeterminism") { + // Update toggle state + $("#setfulldeterminism").prop('checked', msg.data).change(); } else if(msg.cmd == "runs_remotely") { remote = true; hide([button_savetofile, button_import, button_importwi]); diff --git a/tpu_mtj_backend.py b/tpu_mtj_backend.py index bc168f36..8daa8dee 100644 --- a/tpu_mtj_backend.py +++ b/tpu_mtj_backend.py @@ -56,6 +56,22 @@ from mesh_transformer.util import to_bf16 params: Dict[str, Any] = {} +__seed = random.randrange(sys.maxsize) +rng = random.Random(__seed) + + +def get_rng_seed(): + return __seed + +def set_rng_seed(seed: int): + global __seed, rng + rng = random.Random(seed) + __seed = seed + return seed + +def randomize_rng_seed(): + return set_rng_seed(random.randrange(sys.maxsize)) + def warper_callback(logits) -> np.array: raise NotImplementedError("`tpu_mtj_backend.warper_callback()` needs to be defined") @@ -728,7 +744,7 @@ class PenalizingCausalTransformer(CausalTransformer): assert not return_logits assert gen_length.ndim == 1 assert soft_embeddings is not None - key = hk.PRNGSequence(random.randint(0, 2 ** 60)) + key = hk.PRNGSequence(rng.randint(0, 2 ** 60)) batch_size = ctx.shape[0] self.batch_size = batch_size _numseqs_aux = jnp.empty((batch_size, numseqs), dtype=np.uint32) @@ -776,7 +792,7 @@ class PenalizingCausalTransformer(CausalTransformer): return sample_data, n_generated, regeneration_required, halt def generate_static(self, ctx, ctx_length, gen_length, numseqs, sampler_options, return_logits=False, soft_embeddings=None): assert not return_logits - key = hk.PRNGSequence(random.randint(0, 2 ** 60)) + key = hk.PRNGSequence(rng.randint(0, 2 ** 60)) batch_size = ctx.shape[0] self.batch_size = batch_size started_compiling_callback() From 58418c4aa5de64ab24aedf9dd4dc535b4a0487c8 Mon Sep 17 00:00:00 2001 From: ebolam Date: Thu, 30 Jun 2022 09:44:04 -0400 Subject: [PATCH 030/142] Basic file browser with edit and delete functionality Can be shown by going to /popup_test in a second tab. --- aiserver.py | 179 ++- requirements.txt | 3 +- requirements_mtj.txt | 1 + static/application.js | 181 +++ static/custom.css | 91 +- .../open-iconic/css/open-iconic-bootstrap.css | 952 +++++++++++ .../css/open-iconic-bootstrap.less | 960 +++++++++++ .../css/open-iconic-bootstrap.min.css | 1 + .../css/open-iconic-bootstrap.scss | 958 +++++++++++ .../css/open-iconic-bootstrap.styl | 954 +++++++++++ .../css/open-iconic-foundation.css | 1395 ++++++++++++++++ .../css/open-iconic-foundation.less | 1397 ++++++++++++++++ .../css/open-iconic-foundation.min.css | 1 + .../css/open-iconic-foundation.scss | 1398 +++++++++++++++++ .../css/open-iconic-foundation.styl | 1392 ++++++++++++++++ static/open-iconic/css/open-iconic.css | 511 ++++++ static/open-iconic/css/open-iconic.less | 962 ++++++++++++ static/open-iconic/css/open-iconic.min.css | 1 + static/open-iconic/css/open-iconic.scss | 963 ++++++++++++ static/open-iconic/css/open-iconic.styl | 733 +++++++++ static/open-iconic/fonts/open-iconic.eot | Bin 0 -> 28196 bytes static/open-iconic/fonts/open-iconic.otf | Bin 0 -> 20996 bytes static/open-iconic/fonts/open-iconic.svg | 543 +++++++ static/open-iconic/fonts/open-iconic.ttf | Bin 0 -> 28028 bytes static/open-iconic/fonts/open-iconic.woff | Bin 0 -> 14984 bytes templates/index.html | 18 +- 26 files changed, 13587 insertions(+), 7 deletions(-) create mode 100644 static/open-iconic/css/open-iconic-bootstrap.css create mode 100644 static/open-iconic/css/open-iconic-bootstrap.less create mode 100644 static/open-iconic/css/open-iconic-bootstrap.min.css create mode 100644 static/open-iconic/css/open-iconic-bootstrap.scss create mode 100644 static/open-iconic/css/open-iconic-bootstrap.styl create mode 100644 static/open-iconic/css/open-iconic-foundation.css create mode 100644 static/open-iconic/css/open-iconic-foundation.less create mode 100644 static/open-iconic/css/open-iconic-foundation.min.css create mode 100644 static/open-iconic/css/open-iconic-foundation.scss create mode 100644 static/open-iconic/css/open-iconic-foundation.styl create mode 100644 static/open-iconic/css/open-iconic.css create mode 100644 static/open-iconic/css/open-iconic.less create mode 100644 static/open-iconic/css/open-iconic.min.css create mode 100644 static/open-iconic/css/open-iconic.scss create mode 100644 static/open-iconic/css/open-iconic.styl create mode 100644 static/open-iconic/fonts/open-iconic.eot create mode 100644 static/open-iconic/fonts/open-iconic.otf create mode 100644 static/open-iconic/fonts/open-iconic.svg create mode 100644 static/open-iconic/fonts/open-iconic.ttf create mode 100644 static/open-iconic/fonts/open-iconic.woff diff --git a/aiserver.py b/aiserver.py index 94aa3b60..b6b219fa 100644 --- a/aiserver.py +++ b/aiserver.py @@ -7,7 +7,7 @@ # External packages import eventlet -eventlet.monkey_patch(all=True, thread=False) +eventlet.monkey_patch(all=True, thread=False, os=False) import os os.system("") __file__ = os.path.dirname(os.path.realpath(__file__)) @@ -370,11 +370,15 @@ log.setLevel(logging.ERROR) # Start flask & SocketIO print("{0}Initializing Flask... {1}".format(colors.PURPLE, colors.END), end="") -from flask import Flask, render_template, Response, request, copy_current_request_context, send_from_directory +from flask import Flask, render_template, Response, request, copy_current_request_context, send_from_directory, session from flask_socketio import SocketIO, emit +from flask_session import Session +import secrets app = Flask(__name__, root_path=os.getcwd()) -app.config['SECRET KEY'] = 'secret!' +app.secret_key = secrets.token_hex() +app.config['SESSION_TYPE'] = 'filesystem' app.config['TEMPLATES_AUTO_RELOAD'] = True +Session(app) socketio = SocketIO(app, async_method="eventlet") print("{0}OK!{1}".format(colors.GREEN, colors.END)) @@ -464,7 +468,7 @@ def check_if_dir_is_model(path): if os.path.exists(path): try: from transformers import AutoConfig - model_config = AutoConfig.from_pretrained(path, revision=vars.revision, cache_dir="cache") + model_config = AutoConfig.from_pretrained(path) except: return False return True @@ -6066,6 +6070,173 @@ def send_debug(): emit('from_server', {'cmd': 'debug_info', 'data': debug_info}, broadcast=True) +#==================================================================# +# File Popup options +#==================================================================# +@app.route("/popup_test") +def popup_test(): + file_popup("Test Popup", "./", "return_event_name", folder_only=False, editable=True, deleteable=True, jailed=False, item_check=check_if_dir_is_model) + return "ok" + +@socketio.on('popup_change_folder') +def popup_change_folder(data): + print("Doing popup change folder: {}".format(data)) + if 'popup_jailed_dir' not in session: + print("Someone is trying to get at files in your server. Blocked.") + return + if session['popup_jailed_dir'] is None: + get_files_folders(data) + elif session['popup_jailed_dir'] in data: + get_files_folders(data) + else: + print("User is trying to get at files in your server outside the jail. Blocked. Jailed Dir: {} Requested Dir: {}".format(session['popup_jailed_dir'], data)) + +@socketio.on('popup_delete') +def popup_delete(data): + if 'popup_deletable' not in session: + print("Someone is trying to delete a file in your server. Blocked.") + return + if not session['popup_deletable']: + print("Someone is trying to delete a file in your server. Blocked.") + return + + if session['popup_jailed_dir'] is None: + import shutil + if os.path.isdir(data): + shutil.rmtree(data) + else: + os.remove(data) + path = os.path.abspath(data).replace("\\", "/") + if path[-1] == "/": + path = path[:-1] + path = "/".join(path.split("/")[:-1]) + get_files_folders(path) + elif session['popup_jailed_dir'] in data: + import shutil + if os.path.isdir(data): + shutil.rmtree(data) + else: + os.remove(data) + path = os.path.abspath(data).replace("\\", "/") + if path[-1] == "/": + path = path[:-1] + path = "/".join(path.split("/")[:-1]) + get_files_folders(path) + else: + print("User is trying to delete files in your server outside the jail. Blocked. Jailed Dir: {} Requested Dir: {}".format(session['popup_jailed_dir'], data)) + +@socketio.on('popup_edit') +def popup_edit(data): + if 'popup_editable' not in session: + print("Someone is trying to edit a file in your server. Blocked.") + return + if not session['popup_editable']: + print("Someone is trying to edit a file in your server. Blocked.") + return + + if session['popup_jailed_dir'] is None: + emit("popup_edit_file", {"file": data, "text": open(data, 'r').read()}); + elif session['popup_jailed_dir'] in data: + emit("popup_edit_file", {"file": data, "text": open(data, 'r').read()}); + else: + print("User is trying to delete files in your server outside the jail. Blocked. Jailed Dir: {} Requested Dir: {}".format(session['popup_jailed_dir'], data)) + +@socketio.on('popup_change_file') +def popup_change_file(data): + if 'popup_editable' not in session: + print("Someone is trying to edit a file in your server. Blocked.") + return + if not session['popup_editable']: + print("Someone is trying to edit a file in your server. Blocked.") + return + + if session['popup_jailed_dir'] is None: + with open(data['file'], 'w') as f: + f.write(data['data']) + elif session['popup_jailed_dir'] in data['file']: + with open(data['file'], 'w') as f: + f.write(data['data']) + else: + print("User is trying to delete files in your server outside the jail. Blocked. Jailed Dir: {} Requested Dir: {}".format(session['popup_jailed_dir'], data)) + +def file_popup(popup_title, starting_folder, return_event, jailed=True, folder_only=True, deleteable=False, editable=False, show_breadcrumbs=True, item_check=None, show_hidden=False): + #starting_folder = The folder we're going to get folders and/or items from + #return_event = the socketio event that will be emitted when the load button is clicked + #jailed = if set to true will look for the session variable jailed_folder and prevent navigation outside of that folder + #folder_only = will only show folders, no files + #deletable = will show the delete icons/methods. + #editable = will show the edit icons/methods + #show_breadcrumbs = will show the breadcrumbs at the top of the screen + #item_check will call this function to check if the item is valid as a selection if not none. Will pass absolute directory as only argument to function + #show_hidden = ... really, you have to ask? + if jailed: + session['popup_jailed_dir'] = os.path.abspath(starting_folder).replace("\\", "/") + else: + session['popup_jailed_dir'] = None + session['popup_deletable'] = deleteable + session['popup_editable'] = editable + session['popup_show_hidden'] = show_hidden + session['popup_item_check'] = item_check + session['popup_folder_only'] = folder_only + session['popup_show_breadcrumbs'] = show_breadcrumbs + + socketio.emit("load_popup", {"popup_title": popup_title, "call_back": return_event, "deleteable": deleteable, "editable": editable}, broadcast=True) + + get_files_folders(starting_folder) + + +def get_files_folders(starting_folder): + import stat + item_check = session['popup_item_check'] + show_breadcrumbs = session['popup_show_breadcrumbs'] + show_hidden = session['popup_show_hidden'] + folder_only = session['popup_folder_only'] + + if starting_folder == 'This PC': + breadcrumbs = [['This PC', 'This PC']] + items = [["{}:/".format(chr(i)), "{}:\\".format(chr(i))] for i in range(65, 91) if os.path.exists("{}:".format(chr(i)))] + else: + path = os.path.abspath(starting_folder).replace("\\", "/") + if path[-1] == "/": + path = path[:-1] + breadcrumbs = [] + for i in range(len(path.split("/"))): + breadcrumbs.append(["/".join(path.split("/")[:i+1]), + path.split("/")[i]]) + if len(breadcrumbs) == 1: + breadcrumbs = [["{}:/".format(chr(i)), "{}:\\".format(chr(i))] for i in range(65, 91) if os.path.exists("{}:".format(chr(i)))] + else: + if len([["{}:/".format(chr(i)), "{}:\\".format(chr(i))] for i in range(65, 91) if os.path.exists("{}:".format(chr(i)))]) > 0: + breadcrumbs.insert(0, ['This PC', 'This PC']) + folders = [] + files = [] + base_path = os.path.abspath(starting_folder).replace("\\", "/") + for item in os.listdir(base_path): + item_full_path = os.path.join(base_path, item).replace("\\", "/") + if hasattr(os.stat(item_full_path), "st_file_attributes"): + hidden = bool(os.stat(item_full_path).st_file_attributes & stat.FILE_ATTRIBUTE_HIDDEN) + else: + hidden = item[0] == "." + if item_check is None: + valid_selection = True + else: + valid_selection = item_check(item_full_path) + + if (show_hidden and hidden) or not hidden: + if os.path.isdir(os.path.join(base_path, item)): + folders.append([True, item_full_path, item, valid_selection]) + else: + files.append([False, item_full_path, item, valid_selection]) + items = folders + if not folder_only: + items += files + + socketio.emit("popup_items", items, broadcast=True, include_self=True) + if show_breadcrumbs: + socketio.emit("popup_breadcrumbs", breadcrumbs, broadcast=True) + + + #==================================================================# # Final startup commands to launch Flask app #==================================================================# diff --git a/requirements.txt b/requirements.txt index 13fdd7cd..6d6d1d64 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,4 +11,5 @@ markdown bleach==4.1.0 sentencepiece protobuf -accelerate \ No newline at end of file +accelerate +flask-session \ No newline at end of file diff --git a/requirements_mtj.txt b/requirements_mtj.txt index 0f723a49..d80604f6 100644 --- a/requirements_mtj.txt +++ b/requirements_mtj.txt @@ -16,3 +16,4 @@ eventlet lupa==1.10 markdown bleach==4.1.0 +flask-session \ No newline at end of file diff --git a/static/application.js b/static/application.js index 7da45e9f..a1654f6f 100644 --- a/static/application.js +++ b/static/application.js @@ -2121,6 +2121,10 @@ $(document).ready(function(){ // Connect to SocketIO server socket = io.connect(window.document.origin, {transports: ['polling', 'websocket'], closeOnBeforeunload: false}); + socket.on('load_popup', function(data){load_popup(data);}); + socket.on('popup_items', function(data){popup_items(data);}); + socket.on('popup_breadcrumbs', function(data){popup_breadcrumbs(data);}); + socket.on('popup_edit_file', function(data){popup_edit_file(data);}); socket.on('from_server', function(msg) { //console.log(msg); @@ -3139,3 +3143,180 @@ $(document).ready(function(){ } }); }); + + + +var popup_deleteable = false; +var popup_editable = false; + +function load_popup(data) { + console.log(data); + popup_deleteable = data.deleteable; + popup_editable = data.editable; + var popup = document.getElementById("popup"); + var popup_list = document.getElementById("popup_list"); + //first, let's clear out our existing data + while (popup_list.firstChild) { + popup_list.removeChild(popup_list.firstChild); + } + var breadcrumbs = document.getElementById('popup_breadcrumbs'); + while (breadcrumbs.firstChild) { + breadcrumbs.removeChild(breadcrumbs.firstChild); + } + + popup.classList.remove("hidden"); + + //adjust accept button + var accept = document.getElementById("popup_accept"); + accept.classList.add("btn-secondary"); + accept.classList.remove("btn-primary"); + accept.setAttribute("emit", data.call_back); + accept.setAttribute("selected_value", ""); + accept.onclick = function () { + socket.emit(this.emit, this.getAttribute("selected_value")); + document.getElementById("popup").classList.add("hidden"); + }; + + //adjust cancel button + var cancel = document.getElementById("popup_cancel"); + cancel.onclick = function () { + document.getElementById("popup").classList.add("hidden"); + }; +} + +function popup_items(data) { + var popup_list = document.getElementById('popup_list'); + //first, let's clear out our existing data + while (popup_list.firstChild) { + popup_list.removeChild(popup_list.firstChild); + } + + for (item of data) { + var list_item = document.createElement("span"); + list_item.classList.add("item"); + + //create the folder icon + var folder_icon = document.createElement("span"); + folder_icon.classList.add("folder_icon"); + if (item[0]) { + folder_icon.classList.add("oi"); + folder_icon.setAttribute('data-glyph', "folder"); + } + list_item.append(folder_icon); + + //create the edit icon + var edit_icon = document.createElement("span"); + edit_icon.classList.add("edit_icon"); + if ((popup_editable) && !(item[0])) { + edit_icon.classList.add("oi"); + edit_icon.setAttribute('data-glyph', "pencil"); + edit_icon.id = item[1]; + edit_icon.onclick = function () { + socket.emit("popup_edit", this.id); + }; + } + list_item.append(edit_icon); + + //create the delete icon + var delete_icon = document.createElement("span"); + delete_icon.classList.add("delete_icon"); + if (popup_deleteable) { + delete_icon.classList.add("oi"); + delete_icon.setAttribute('data-glyph', "x"); + delete_icon.id = item[1]; + delete_icon.setAttribute("folder", item[0]); + delete_icon.onclick = function () { + if (this.getAttribute("folder") == "true") { + if (window.confirm("Do you really want to delete this folder and ALL files under it?")) { + socket.emit("popup_delete", this.id); + } + } else { + if (window.confirm("Do you really want to delete this file?")) { + socket.emit("popup_delete", this.id); + } + } + }; + } + list_item.append(delete_icon); + + //create the actual item + var popup_item = document.createElement("span"); + popup_item.classList.add("file"); + popup_item.id = item[1]; + popup_item.setAttribute("folder", item[0]); + popup_item.setAttribute("valid", item[3]); + popup_item.textContent = item[2]; + popup_item.onclick = function () { + var accept = document.getElementById("popup_accept"); + if (this.getAttribute("valid") == "true") { + accept.classList.remove("btn-secondary"); + accept.classList.add("btn-primary"); + accept.setAttribute("selected_value", this.id); + } else { + console.log("not valid"); + accept.setAttribute("selected_value", ""); + accept.classList.add("btn-secondary"); + accept.classList.remove("btn-primary"); + if (this.getAttribute("folder") == "true") { + console.log("folder"); + socket.emit("popup_change_folder", this.id); + } + } + }; + list_item.append(popup_item); + + + popup_list.append(list_item); + + + } +} + +function popup_breadcrumbs(data) { + var breadcrumbs = document.getElementById('popup_breadcrumbs') + while (breadcrumbs.firstChild) { + breadcrumbs.removeChild(breadcrumbs.firstChild); + } + + for (item of data) { + var button = document.createElement("button"); + button.id = item[0]; + button.textContent = item[1]; + button.classList.add("breadcrumbitem"); + button.onclick = function () { + socket.emit("popup_change_folder", this.id); + }; + breadcrumbs.append(button); + var span = document.createElement("span"); + span.textContent = "\\"; + breadcrumbs.append(span); + } +} + +function popup_edit_file(data) { + var popup_list = document.getElementById('popup_list'); + //first, let's clear out our existing data + while (popup_list.firstChild) { + popup_list.removeChild(popup_list.firstChild); + } + var accept = document.getElementById("popup_accept"); + accept.setAttribute("selected_value", ""); + accept.onclick = function () { + var textarea = document.getElementById("filecontents"); + socket.emit("popup_change_file", {"file": textarea.getAttribute("filename"), "data": textarea.value}); + document.getElementById("popup").classList.add("hidden"); + }; + + var textarea = document.createElement("textarea"); + textarea.classList.add("fullwidth"); + textarea.rows = 25; + textarea.id = "filecontents" + textarea.setAttribute("filename", data.file); + textarea.value = data.text; + textarea.onblur = function () { + var accept = document.getElementById("popup_accept"); + accept.classList.remove("disabled"); + }; + popup_list.append(textarea); + +} diff --git a/static/custom.css b/static/custom.css index 6bb8dae6..22c1078b 100644 --- a/static/custom.css +++ b/static/custom.css @@ -291,7 +291,7 @@ body.connected #formatmenu, #formatmenu.always-available { align-items: center; } -#popup { +#popup_old { width: 75%; min-width: 500px; max-width: 1000px; @@ -1546,4 +1546,93 @@ body.connected .popupfooter, .popupfooter.always-available { .change .menubar3 { transform: translate(0px, -6px) rotate(45deg); +} + + +/*---------------------------------- Popup -------------------------------------------------*/ +.new_popup { + position: absolute; + top: 10vh; + left: 10%; + z-index: 999; + width: 80%; + height: 80vh; + background-color: black; + display: flex; + flex-direction: column; + background-color: #474B4F; + color: white; +} + +.new_popup .title { + width: 100%; + background-color: #337AB7; + text-align: center; + font-size: 1.3em; +} + +.new_popup .popup_list_area { + height: 70vh; + overflow-x: hidden; +} +.new_popup .item { + width: 100%; + background-color: #262626; + padding: 2px; + display: grid; + grid-template-areas: "folder_icon delete_icon edit_icon file"; + grid-template-columns: 20px 20px 20px auto; + +} + +.new_popup .item .folder_icon { + grid-area: folder_icon; +} + +.new_popup .item .edit_icon { + grid-area: edit_icon; +} + +.new_popup .item .delete_icon { + grid-area: delete_icon; +} + +.new_popup .item .file { + grid-area: file; +} + +.new_popup .item .file:hover { + background-color: #688f1f; +} + +.new_popup .popup_load_cancel { + text-align: center; + background-color: #285070; +} + +.popup_load_cancel_button { + vertical-align: bottom; + display: inline; +} + +.popup_load_cancel_button.btn-secondary { + color: rgb(51, 51, 51); + background-color: #686c68; +} + +.breadcrumbitem { + padding: 5px 10px 5px 10px; + color: #ffffff; + background-color: transparent; + border: none; + + -moz-transition: background-color 0.25s ease-in; + -o-transition: background-color 0.25s ease-in; + -webkit-transition: background-color 0.25s ease-in; + transition: background-color 0.25s ease-in; +} + +.breadcrumbitem:hover { + cursor: pointer; + background-color: #688f1f; } \ No newline at end of file diff --git a/static/open-iconic/css/open-iconic-bootstrap.css b/static/open-iconic/css/open-iconic-bootstrap.css new file mode 100644 index 00000000..56c4e5f3 --- /dev/null +++ b/static/open-iconic/css/open-iconic-bootstrap.css @@ -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'; +} diff --git a/static/open-iconic/css/open-iconic-bootstrap.less b/static/open-iconic/css/open-iconic-bootstrap.less new file mode 100644 index 00000000..fc3fe341 --- /dev/null +++ b/static/open-iconic/css/open-iconic-bootstrap.less @@ -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"; +} + diff --git a/static/open-iconic/css/open-iconic-bootstrap.min.css b/static/open-iconic/css/open-iconic-bootstrap.min.css new file mode 100644 index 00000000..4664f2e8 --- /dev/null +++ b/static/open-iconic/css/open-iconic-bootstrap.min.css @@ -0,0 +1 @@ +@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:400;font-style:normal}.oi{position:relative;top:1px;display:inline-block;speak:none;font-family:Icons;font-style:normal;font-weight:400;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'} \ No newline at end of file diff --git a/static/open-iconic/css/open-iconic-bootstrap.scss b/static/open-iconic/css/open-iconic-bootstrap.scss new file mode 100644 index 00000000..18f01e26 --- /dev/null +++ b/static/open-iconic/css/open-iconic-bootstrap.scss @@ -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'; +} + diff --git a/static/open-iconic/css/open-iconic-bootstrap.styl b/static/open-iconic/css/open-iconic-bootstrap.styl new file mode 100644 index 00000000..0afa2548 --- /dev/null +++ b/static/open-iconic/css/open-iconic-bootstrap.styl @@ -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' +} + diff --git a/static/open-iconic/css/open-iconic-foundation.css b/static/open-iconic/css/open-iconic-foundation.css new file mode 100644 index 00000000..905a8212 --- /dev/null +++ b/static/open-iconic/css/open-iconic-foundation.css @@ -0,0 +1,1395 @@ +/* Foundation */ + +@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; +} + + +.fi-account-login:before, + +.fi-account-logout:before, + +.fi-action-redo:before, + +.fi-action-undo:before, + +.fi-align-center:before, + +.fi-align-left:before, + +.fi-align-right:before, + +.fi-aperture:before, + +.fi-arrow-bottom:before, + +.fi-arrow-circle-bottom:before, + +.fi-arrow-circle-left:before, + +.fi-arrow-circle-right:before, + +.fi-arrow-circle-top:before, + +.fi-arrow-left:before, + +.fi-arrow-right:before, + +.fi-arrow-thick-bottom:before, + +.fi-arrow-thick-left:before, + +.fi-arrow-thick-right:before, + +.fi-arrow-thick-top:before, + +.fi-arrow-top:before, + +.fi-audio-spectrum:before, + +.fi-audio:before, + +.fi-badge:before, + +.fi-ban:before, + +.fi-bar-chart:before, + +.fi-basket:before, + +.fi-battery-empty:before, + +.fi-battery-full:before, + +.fi-beaker:before, + +.fi-bell:before, + +.fi-bluetooth:before, + +.fi-bold:before, + +.fi-bolt:before, + +.fi-book:before, + +.fi-bookmark:before, + +.fi-box:before, + +.fi-briefcase:before, + +.fi-british-pound:before, + +.fi-browser:before, + +.fi-brush:before, + +.fi-bug:before, + +.fi-bullhorn:before, + +.fi-calculator:before, + +.fi-calendar:before, + +.fi-camera-slr:before, + +.fi-caret-bottom:before, + +.fi-caret-left:before, + +.fi-caret-right:before, + +.fi-caret-top:before, + +.fi-cart:before, + +.fi-chat:before, + +.fi-check:before, + +.fi-chevron-bottom:before, + +.fi-chevron-left:before, + +.fi-chevron-right:before, + +.fi-chevron-top:before, + +.fi-circle-check:before, + +.fi-circle-x:before, + +.fi-clipboard:before, + +.fi-clock:before, + +.fi-cloud-download:before, + +.fi-cloud-upload:before, + +.fi-cloud:before, + +.fi-cloudy:before, + +.fi-code:before, + +.fi-cog:before, + +.fi-collapse-down:before, + +.fi-collapse-left:before, + +.fi-collapse-right:before, + +.fi-collapse-up:before, + +.fi-command:before, + +.fi-comment-square:before, + +.fi-compass:before, + +.fi-contrast:before, + +.fi-copywriting:before, + +.fi-credit-card:before, + +.fi-crop:before, + +.fi-dashboard:before, + +.fi-data-transfer-download:before, + +.fi-data-transfer-upload:before, + +.fi-delete:before, + +.fi-dial:before, + +.fi-document:before, + +.fi-dollar:before, + +.fi-double-quote-sans-left:before, + +.fi-double-quote-sans-right:before, + +.fi-double-quote-serif-left:before, + +.fi-double-quote-serif-right:before, + +.fi-droplet:before, + +.fi-eject:before, + +.fi-elevator:before, + +.fi-ellipses:before, + +.fi-envelope-closed:before, + +.fi-envelope-open:before, + +.fi-euro:before, + +.fi-excerpt:before, + +.fi-expand-down:before, + +.fi-expand-left:before, + +.fi-expand-right:before, + +.fi-expand-up:before, + +.fi-external-link:before, + +.fi-eye:before, + +.fi-eyedropper:before, + +.fi-file:before, + +.fi-fire:before, + +.fi-flag:before, + +.fi-flash:before, + +.fi-folder:before, + +.fi-fork:before, + +.fi-fullscreen-enter:before, + +.fi-fullscreen-exit:before, + +.fi-globe:before, + +.fi-graph:before, + +.fi-grid-four-up:before, + +.fi-grid-three-up:before, + +.fi-grid-two-up:before, + +.fi-hard-drive:before, + +.fi-header:before, + +.fi-headphones:before, + +.fi-heart:before, + +.fi-home:before, + +.fi-image:before, + +.fi-inbox:before, + +.fi-infinity:before, + +.fi-info:before, + +.fi-italic:before, + +.fi-justify-center:before, + +.fi-justify-left:before, + +.fi-justify-right:before, + +.fi-key:before, + +.fi-laptop:before, + +.fi-layers:before, + +.fi-lightbulb:before, + +.fi-link-broken:before, + +.fi-link-intact:before, + +.fi-list-rich:before, + +.fi-list:before, + +.fi-location:before, + +.fi-lock-locked:before, + +.fi-lock-unlocked:before, + +.fi-loop-circular:before, + +.fi-loop-square:before, + +.fi-loop:before, + +.fi-magnifying-glass:before, + +.fi-map-marker:before, + +.fi-map:before, + +.fi-media-pause:before, + +.fi-media-play:before, + +.fi-media-record:before, + +.fi-media-skip-backward:before, + +.fi-media-skip-forward:before, + +.fi-media-step-backward:before, + +.fi-media-step-forward:before, + +.fi-media-stop:before, + +.fi-medical-cross:before, + +.fi-menu:before, + +.fi-microphone:before, + +.fi-minus:before, + +.fi-monitor:before, + +.fi-moon:before, + +.fi-move:before, + +.fi-musical-note:before, + +.fi-paperclip:before, + +.fi-pencil:before, + +.fi-people:before, + +.fi-person:before, + +.fi-phone:before, + +.fi-pie-chart:before, + +.fi-pin:before, + +.fi-play-circle:before, + +.fi-plus:before, + +.fi-power-standby:before, + +.fi-print:before, + +.fi-project:before, + +.fi-pulse:before, + +.fi-puzzle-piece:before, + +.fi-question-mark:before, + +.fi-rain:before, + +.fi-random:before, + +.fi-reload:before, + +.fi-resize-both:before, + +.fi-resize-height:before, + +.fi-resize-width:before, + +.fi-rss-alt:before, + +.fi-rss:before, + +.fi-script:before, + +.fi-share-boxed:before, + +.fi-share:before, + +.fi-shield:before, + +.fi-signal:before, + +.fi-signpost:before, + +.fi-sort-ascending:before, + +.fi-sort-descending:before, + +.fi-spreadsheet:before, + +.fi-star:before, + +.fi-sun:before, + +.fi-tablet:before, + +.fi-tag:before, + +.fi-tags:before, + +.fi-target:before, + +.fi-task:before, + +.fi-terminal:before, + +.fi-text:before, + +.fi-thumb-down:before, + +.fi-thumb-up:before, + +.fi-timer:before, + +.fi-transfer:before, + +.fi-trash:before, + +.fi-underline:before, + +.fi-vertical-align-bottom:before, + +.fi-vertical-align-center:before, + +.fi-vertical-align-top:before, + +.fi-video:before, + +.fi-volume-high:before, + +.fi-volume-low:before, + +.fi-volume-off:before, + +.fi-warning:before, + +.fi-wifi:before, + +.fi-wrench:before, + +.fi-x:before, + +.fi-yen:before, + +.fi-zoom-in:before, + +.fi-zoom-out:before + { + font-family: 'Icons'; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + display: inline-block; + text-decoration: inherit; +} + + +[class*='fi-'].oi-align-center:before { + text-align: center; +} + +[class*='fi-'].oi-align-left:before { + text-align: left; +} + +[class*='fi-'].oi-align-right:before { + text-align: right; +} + + +[class*='fi-'].oi-flip-horizontal:before { + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} + +[class*='fi-'].oi-flip-vertical:before { + -webkit-transform: scale(1, -1); + -ms-transform: scale(-1, 1); + transform: scale(1, -1); +} + +[class*='fi-'].oi-flip-horizontal-vertical:before { + -webkit-transform: scale(-1, -1); + -ms-transform: scale(-1, 1); + transform: scale(-1, -1); +} + + + +.fi-account-login:before { + content:'\e000'; +} + +.fi-account-logout:before { + content:'\e001'; +} + +.fi-action-redo:before { + content:'\e002'; +} + +.fi-action-undo:before { + content:'\e003'; +} + +.fi-align-center:before { + content:'\e004'; +} + +.fi-align-left:before { + content:'\e005'; +} + +.fi-align-right:before { + content:'\e006'; +} + +.fi-aperture:before { + content:'\e007'; +} + +.fi-arrow-bottom:before { + content:'\e008'; +} + +.fi-arrow-circle-bottom:before { + content:'\e009'; +} + +.fi-arrow-circle-left:before { + content:'\e00a'; +} + +.fi-arrow-circle-right:before { + content:'\e00b'; +} + +.fi-arrow-circle-top:before { + content:'\e00c'; +} + +.fi-arrow-left:before { + content:'\e00d'; +} + +.fi-arrow-right:before { + content:'\e00e'; +} + +.fi-arrow-thick-bottom:before { + content:'\e00f'; +} + +.fi-arrow-thick-left:before { + content:'\e010'; +} + +.fi-arrow-thick-right:before { + content:'\e011'; +} + +.fi-arrow-thick-top:before { + content:'\e012'; +} + +.fi-arrow-top:before { + content:'\e013'; +} + +.fi-audio-spectrum:before { + content:'\e014'; +} + +.fi-audio:before { + content:'\e015'; +} + +.fi-badge:before { + content:'\e016'; +} + +.fi-ban:before { + content:'\e017'; +} + +.fi-bar-chart:before { + content:'\e018'; +} + +.fi-basket:before { + content:'\e019'; +} + +.fi-battery-empty:before { + content:'\e01a'; +} + +.fi-battery-full:before { + content:'\e01b'; +} + +.fi-beaker:before { + content:'\e01c'; +} + +.fi-bell:before { + content:'\e01d'; +} + +.fi-bluetooth:before { + content:'\e01e'; +} + +.fi-bold:before { + content:'\e01f'; +} + +.fi-bolt:before { + content:'\e020'; +} + +.fi-book:before { + content:'\e021'; +} + +.fi-bookmark:before { + content:'\e022'; +} + +.fi-box:before { + content:'\e023'; +} + +.fi-briefcase:before { + content:'\e024'; +} + +.fi-british-pound:before { + content:'\e025'; +} + +.fi-browser:before { + content:'\e026'; +} + +.fi-brush:before { + content:'\e027'; +} + +.fi-bug:before { + content:'\e028'; +} + +.fi-bullhorn:before { + content:'\e029'; +} + +.fi-calculator:before { + content:'\e02a'; +} + +.fi-calendar:before { + content:'\e02b'; +} + +.fi-camera-slr:before { + content:'\e02c'; +} + +.fi-caret-bottom:before { + content:'\e02d'; +} + +.fi-caret-left:before { + content:'\e02e'; +} + +.fi-caret-right:before { + content:'\e02f'; +} + +.fi-caret-top:before { + content:'\e030'; +} + +.fi-cart:before { + content:'\e031'; +} + +.fi-chat:before { + content:'\e032'; +} + +.fi-check:before { + content:'\e033'; +} + +.fi-chevron-bottom:before { + content:'\e034'; +} + +.fi-chevron-left:before { + content:'\e035'; +} + +.fi-chevron-right:before { + content:'\e036'; +} + +.fi-chevron-top:before { + content:'\e037'; +} + +.fi-circle-check:before { + content:'\e038'; +} + +.fi-circle-x:before { + content:'\e039'; +} + +.fi-clipboard:before { + content:'\e03a'; +} + +.fi-clock:before { + content:'\e03b'; +} + +.fi-cloud-download:before { + content:'\e03c'; +} + +.fi-cloud-upload:before { + content:'\e03d'; +} + +.fi-cloud:before { + content:'\e03e'; +} + +.fi-cloudy:before { + content:'\e03f'; +} + +.fi-code:before { + content:'\e040'; +} + +.fi-cog:before { + content:'\e041'; +} + +.fi-collapse-down:before { + content:'\e042'; +} + +.fi-collapse-left:before { + content:'\e043'; +} + +.fi-collapse-right:before { + content:'\e044'; +} + +.fi-collapse-up:before { + content:'\e045'; +} + +.fi-command:before { + content:'\e046'; +} + +.fi-comment-square:before { + content:'\e047'; +} + +.fi-compass:before { + content:'\e048'; +} + +.fi-contrast:before { + content:'\e049'; +} + +.fi-copywriting:before { + content:'\e04a'; +} + +.fi-credit-card:before { + content:'\e04b'; +} + +.fi-crop:before { + content:'\e04c'; +} + +.fi-dashboard:before { + content:'\e04d'; +} + +.fi-data-transfer-download:before { + content:'\e04e'; +} + +.fi-data-transfer-upload:before { + content:'\e04f'; +} + +.fi-delete:before { + content:'\e050'; +} + +.fi-dial:before { + content:'\e051'; +} + +.fi-document:before { + content:'\e052'; +} + +.fi-dollar:before { + content:'\e053'; +} + +.fi-double-quote-sans-left:before { + content:'\e054'; +} + +.fi-double-quote-sans-right:before { + content:'\e055'; +} + +.fi-double-quote-serif-left:before { + content:'\e056'; +} + +.fi-double-quote-serif-right:before { + content:'\e057'; +} + +.fi-droplet:before { + content:'\e058'; +} + +.fi-eject:before { + content:'\e059'; +} + +.fi-elevator:before { + content:'\e05a'; +} + +.fi-ellipses:before { + content:'\e05b'; +} + +.fi-envelope-closed:before { + content:'\e05c'; +} + +.fi-envelope-open:before { + content:'\e05d'; +} + +.fi-euro:before { + content:'\e05e'; +} + +.fi-excerpt:before { + content:'\e05f'; +} + +.fi-expand-down:before { + content:'\e060'; +} + +.fi-expand-left:before { + content:'\e061'; +} + +.fi-expand-right:before { + content:'\e062'; +} + +.fi-expand-up:before { + content:'\e063'; +} + +.fi-external-link:before { + content:'\e064'; +} + +.fi-eye:before { + content:'\e065'; +} + +.fi-eyedropper:before { + content:'\e066'; +} + +.fi-file:before { + content:'\e067'; +} + +.fi-fire:before { + content:'\e068'; +} + +.fi-flag:before { + content:'\e069'; +} + +.fi-flash:before { + content:'\e06a'; +} + +.fi-folder:before { + content:'\e06b'; +} + +.fi-fork:before { + content:'\e06c'; +} + +.fi-fullscreen-enter:before { + content:'\e06d'; +} + +.fi-fullscreen-exit:before { + content:'\e06e'; +} + +.fi-globe:before { + content:'\e06f'; +} + +.fi-graph:before { + content:'\e070'; +} + +.fi-grid-four-up:before { + content:'\e071'; +} + +.fi-grid-three-up:before { + content:'\e072'; +} + +.fi-grid-two-up:before { + content:'\e073'; +} + +.fi-hard-drive:before { + content:'\e074'; +} + +.fi-header:before { + content:'\e075'; +} + +.fi-headphones:before { + content:'\e076'; +} + +.fi-heart:before { + content:'\e077'; +} + +.fi-home:before { + content:'\e078'; +} + +.fi-image:before { + content:'\e079'; +} + +.fi-inbox:before { + content:'\e07a'; +} + +.fi-infinity:before { + content:'\e07b'; +} + +.fi-info:before { + content:'\e07c'; +} + +.fi-italic:before { + content:'\e07d'; +} + +.fi-justify-center:before { + content:'\e07e'; +} + +.fi-justify-left:before { + content:'\e07f'; +} + +.fi-justify-right:before { + content:'\e080'; +} + +.fi-key:before { + content:'\e081'; +} + +.fi-laptop:before { + content:'\e082'; +} + +.fi-layers:before { + content:'\e083'; +} + +.fi-lightbulb:before { + content:'\e084'; +} + +.fi-link-broken:before { + content:'\e085'; +} + +.fi-link-intact:before { + content:'\e086'; +} + +.fi-list-rich:before { + content:'\e087'; +} + +.fi-list:before { + content:'\e088'; +} + +.fi-location:before { + content:'\e089'; +} + +.fi-lock-locked:before { + content:'\e08a'; +} + +.fi-lock-unlocked:before { + content:'\e08b'; +} + +.fi-loop-circular:before { + content:'\e08c'; +} + +.fi-loop-square:before { + content:'\e08d'; +} + +.fi-loop:before { + content:'\e08e'; +} + +.fi-magnifying-glass:before { + content:'\e08f'; +} + +.fi-map-marker:before { + content:'\e090'; +} + +.fi-map:before { + content:'\e091'; +} + +.fi-media-pause:before { + content:'\e092'; +} + +.fi-media-play:before { + content:'\e093'; +} + +.fi-media-record:before { + content:'\e094'; +} + +.fi-media-skip-backward:before { + content:'\e095'; +} + +.fi-media-skip-forward:before { + content:'\e096'; +} + +.fi-media-step-backward:before { + content:'\e097'; +} + +.fi-media-step-forward:before { + content:'\e098'; +} + +.fi-media-stop:before { + content:'\e099'; +} + +.fi-medical-cross:before { + content:'\e09a'; +} + +.fi-menu:before { + content:'\e09b'; +} + +.fi-microphone:before { + content:'\e09c'; +} + +.fi-minus:before { + content:'\e09d'; +} + +.fi-monitor:before { + content:'\e09e'; +} + +.fi-moon:before { + content:'\e09f'; +} + +.fi-move:before { + content:'\e0a0'; +} + +.fi-musical-note:before { + content:'\e0a1'; +} + +.fi-paperclip:before { + content:'\e0a2'; +} + +.fi-pencil:before { + content:'\e0a3'; +} + +.fi-people:before { + content:'\e0a4'; +} + +.fi-person:before { + content:'\e0a5'; +} + +.fi-phone:before { + content:'\e0a6'; +} + +.fi-pie-chart:before { + content:'\e0a7'; +} + +.fi-pin:before { + content:'\e0a8'; +} + +.fi-play-circle:before { + content:'\e0a9'; +} + +.fi-plus:before { + content:'\e0aa'; +} + +.fi-power-standby:before { + content:'\e0ab'; +} + +.fi-print:before { + content:'\e0ac'; +} + +.fi-project:before { + content:'\e0ad'; +} + +.fi-pulse:before { + content:'\e0ae'; +} + +.fi-puzzle-piece:before { + content:'\e0af'; +} + +.fi-question-mark:before { + content:'\e0b0'; +} + +.fi-rain:before { + content:'\e0b1'; +} + +.fi-random:before { + content:'\e0b2'; +} + +.fi-reload:before { + content:'\e0b3'; +} + +.fi-resize-both:before { + content:'\e0b4'; +} + +.fi-resize-height:before { + content:'\e0b5'; +} + +.fi-resize-width:before { + content:'\e0b6'; +} + +.fi-rss-alt:before { + content:'\e0b7'; +} + +.fi-rss:before { + content:'\e0b8'; +} + +.fi-script:before { + content:'\e0b9'; +} + +.fi-share-boxed:before { + content:'\e0ba'; +} + +.fi-share:before { + content:'\e0bb'; +} + +.fi-shield:before { + content:'\e0bc'; +} + +.fi-signal:before { + content:'\e0bd'; +} + +.fi-signpost:before { + content:'\e0be'; +} + +.fi-sort-ascending:before { + content:'\e0bf'; +} + +.fi-sort-descending:before { + content:'\e0c0'; +} + +.fi-spreadsheet:before { + content:'\e0c1'; +} + +.fi-star:before { + content:'\e0c2'; +} + +.fi-sun:before { + content:'\e0c3'; +} + +.fi-tablet:before { + content:'\e0c4'; +} + +.fi-tag:before { + content:'\e0c5'; +} + +.fi-tags:before { + content:'\e0c6'; +} + +.fi-target:before { + content:'\e0c7'; +} + +.fi-task:before { + content:'\e0c8'; +} + +.fi-terminal:before { + content:'\e0c9'; +} + +.fi-text:before { + content:'\e0ca'; +} + +.fi-thumb-down:before { + content:'\e0cb'; +} + +.fi-thumb-up:before { + content:'\e0cc'; +} + +.fi-timer:before { + content:'\e0cd'; +} + +.fi-transfer:before { + content:'\e0ce'; +} + +.fi-trash:before { + content:'\e0cf'; +} + +.fi-underline:before { + content:'\e0d0'; +} + +.fi-vertical-align-bottom:before { + content:'\e0d1'; +} + +.fi-vertical-align-center:before { + content:'\e0d2'; +} + +.fi-vertical-align-top:before { + content:'\e0d3'; +} + +.fi-video:before { + content:'\e0d4'; +} + +.fi-volume-high:before { + content:'\e0d5'; +} + +.fi-volume-low:before { + content:'\e0d6'; +} + +.fi-volume-off:before { + content:'\e0d7'; +} + +.fi-warning:before { + content:'\e0d8'; +} + +.fi-wifi:before { + content:'\e0d9'; +} + +.fi-wrench:before { + content:'\e0da'; +} + +.fi-x:before { + content:'\e0db'; +} + +.fi-yen:before { + content:'\e0dc'; +} + +.fi-zoom-in:before { + content:'\e0dd'; +} + +.fi-zoom-out:before { + content:'\e0de'; +} + diff --git a/static/open-iconic/css/open-iconic-foundation.less b/static/open-iconic/css/open-iconic-foundation.less new file mode 100644 index 00000000..deabf26f --- /dev/null +++ b/static/open-iconic/css/open-iconic-foundation.less @@ -0,0 +1,1397 @@ +/* Foundation */ + +/* Font path 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.otf') format('opentype'), url('@{icon-font-path}open-iconic.svg#iconic-sm') format('svg'); + font-weight: normal; + font-style: normal; +} + + +.fi-account-login:before, + +.fi-account-logout:before, + +.fi-action-redo:before, + +.fi-action-undo:before, + +.fi-align-center:before, + +.fi-align-left:before, + +.fi-align-right:before, + +.fi-aperture:before, + +.fi-arrow-bottom:before, + +.fi-arrow-circle-bottom:before, + +.fi-arrow-circle-left:before, + +.fi-arrow-circle-right:before, + +.fi-arrow-circle-top:before, + +.fi-arrow-left:before, + +.fi-arrow-right:before, + +.fi-arrow-thick-bottom:before, + +.fi-arrow-thick-left:before, + +.fi-arrow-thick-right:before, + +.fi-arrow-thick-top:before, + +.fi-arrow-top:before, + +.fi-audio-spectrum:before, + +.fi-audio:before, + +.fi-badge:before, + +.fi-ban:before, + +.fi-bar-chart:before, + +.fi-basket:before, + +.fi-battery-empty:before, + +.fi-battery-full:before, + +.fi-beaker:before, + +.fi-bell:before, + +.fi-bluetooth:before, + +.fi-bold:before, + +.fi-bolt:before, + +.fi-book:before, + +.fi-bookmark:before, + +.fi-box:before, + +.fi-briefcase:before, + +.fi-british-pound:before, + +.fi-browser:before, + +.fi-brush:before, + +.fi-bug:before, + +.fi-bullhorn:before, + +.fi-calculator:before, + +.fi-calendar:before, + +.fi-camera-slr:before, + +.fi-caret-bottom:before, + +.fi-caret-left:before, + +.fi-caret-right:before, + +.fi-caret-top:before, + +.fi-cart:before, + +.fi-chat:before, + +.fi-check:before, + +.fi-chevron-bottom:before, + +.fi-chevron-left:before, + +.fi-chevron-right:before, + +.fi-chevron-top:before, + +.fi-circle-check:before, + +.fi-circle-x:before, + +.fi-clipboard:before, + +.fi-clock:before, + +.fi-cloud-download:before, + +.fi-cloud-upload:before, + +.fi-cloud:before, + +.fi-cloudy:before, + +.fi-code:before, + +.fi-cog:before, + +.fi-collapse-down:before, + +.fi-collapse-left:before, + +.fi-collapse-right:before, + +.fi-collapse-up:before, + +.fi-command:before, + +.fi-comment-square:before, + +.fi-compass:before, + +.fi-contrast:before, + +.fi-copywriting:before, + +.fi-credit-card:before, + +.fi-crop:before, + +.fi-dashboard:before, + +.fi-data-transfer-download:before, + +.fi-data-transfer-upload:before, + +.fi-delete:before, + +.fi-dial:before, + +.fi-document:before, + +.fi-dollar:before, + +.fi-double-quote-sans-left:before, + +.fi-double-quote-sans-right:before, + +.fi-double-quote-serif-left:before, + +.fi-double-quote-serif-right:before, + +.fi-droplet:before, + +.fi-eject:before, + +.fi-elevator:before, + +.fi-ellipses:before, + +.fi-envelope-closed:before, + +.fi-envelope-open:before, + +.fi-euro:before, + +.fi-excerpt:before, + +.fi-expand-down:before, + +.fi-expand-left:before, + +.fi-expand-right:before, + +.fi-expand-up:before, + +.fi-external-link:before, + +.fi-eye:before, + +.fi-eyedropper:before, + +.fi-file:before, + +.fi-fire:before, + +.fi-flag:before, + +.fi-flash:before, + +.fi-folder:before, + +.fi-fork:before, + +.fi-fullscreen-enter:before, + +.fi-fullscreen-exit:before, + +.fi-globe:before, + +.fi-graph:before, + +.fi-grid-four-up:before, + +.fi-grid-three-up:before, + +.fi-grid-two-up:before, + +.fi-hard-drive:before, + +.fi-header:before, + +.fi-headphones:before, + +.fi-heart:before, + +.fi-home:before, + +.fi-image:before, + +.fi-inbox:before, + +.fi-infinity:before, + +.fi-info:before, + +.fi-italic:before, + +.fi-justify-center:before, + +.fi-justify-left:before, + +.fi-justify-right:before, + +.fi-key:before, + +.fi-laptop:before, + +.fi-layers:before, + +.fi-lightbulb:before, + +.fi-link-broken:before, + +.fi-link-intact:before, + +.fi-list-rich:before, + +.fi-list:before, + +.fi-location:before, + +.fi-lock-locked:before, + +.fi-lock-unlocked:before, + +.fi-loop-circular:before, + +.fi-loop-square:before, + +.fi-loop:before, + +.fi-magnifying-glass:before, + +.fi-map-marker:before, + +.fi-map:before, + +.fi-media-pause:before, + +.fi-media-play:before, + +.fi-media-record:before, + +.fi-media-skip-backward:before, + +.fi-media-skip-forward:before, + +.fi-media-step-backward:before, + +.fi-media-step-forward:before, + +.fi-media-stop:before, + +.fi-medical-cross:before, + +.fi-menu:before, + +.fi-microphone:before, + +.fi-minus:before, + +.fi-monitor:before, + +.fi-moon:before, + +.fi-move:before, + +.fi-musical-note:before, + +.fi-paperclip:before, + +.fi-pencil:before, + +.fi-people:before, + +.fi-person:before, + +.fi-phone:before, + +.fi-pie-chart:before, + +.fi-pin:before, + +.fi-play-circle:before, + +.fi-plus:before, + +.fi-power-standby:before, + +.fi-print:before, + +.fi-project:before, + +.fi-pulse:before, + +.fi-puzzle-piece:before, + +.fi-question-mark:before, + +.fi-rain:before, + +.fi-random:before, + +.fi-reload:before, + +.fi-resize-both:before, + +.fi-resize-height:before, + +.fi-resize-width:before, + +.fi-rss-alt:before, + +.fi-rss:before, + +.fi-script:before, + +.fi-share-boxed:before, + +.fi-share:before, + +.fi-shield:before, + +.fi-signal:before, + +.fi-signpost:before, + +.fi-sort-ascending:before, + +.fi-sort-descending:before, + +.fi-spreadsheet:before, + +.fi-star:before, + +.fi-sun:before, + +.fi-tablet:before, + +.fi-tag:before, + +.fi-tags:before, + +.fi-target:before, + +.fi-task:before, + +.fi-terminal:before, + +.fi-text:before, + +.fi-thumb-down:before, + +.fi-thumb-up:before, + +.fi-timer:before, + +.fi-transfer:before, + +.fi-trash:before, + +.fi-underline:before, + +.fi-vertical-align-bottom:before, + +.fi-vertical-align-center:before, + +.fi-vertical-align-top:before, + +.fi-video:before, + +.fi-volume-high:before, + +.fi-volume-low:before, + +.fi-volume-off:before, + +.fi-warning:before, + +.fi-wifi:before, + +.fi-wrench:before, + +.fi-x:before, + +.fi-yen:before, + +.fi-zoom-in:before, + +.fi-zoom-out:before + { + font-family: 'Icons'; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + display: inline-block; + text-decoration: inherit; +} + +[class*='fi-'].oi-align-center:before { + text-align: center; +} + +[class*='fi-'].oi-align-left:before { + text-align: left; +} + +[class*='fi-'].oi-align-right:before { + text-align: right; +} + + +[class*='fi-'].oi-flip-horizontal:before { + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} + +[class*='fi-'].oi-flip-vertical:before { + -webkit-transform: scale(1, -1); + -ms-transform: scale(-1, 1); + transform: scale(1, -1); +} + +[class*='fi-'].oi-flip-horizontal-vertical:before { + -webkit-transform: scale(-1, -1); + -ms-transform: scale(-1, 1); + transform: scale(-1, -1); +} + + + +.fi-account-login:before { + content:'\e000'; +} + +.fi-account-logout:before { + content:'\e001'; +} + +.fi-action-redo:before { + content:'\e002'; +} + +.fi-action-undo:before { + content:'\e003'; +} + +.fi-align-center:before { + content:'\e004'; +} + +.fi-align-left:before { + content:'\e005'; +} + +.fi-align-right:before { + content:'\e006'; +} + +.fi-aperture:before { + content:'\e007'; +} + +.fi-arrow-bottom:before { + content:'\e008'; +} + +.fi-arrow-circle-bottom:before { + content:'\e009'; +} + +.fi-arrow-circle-left:before { + content:'\e00a'; +} + +.fi-arrow-circle-right:before { + content:'\e00b'; +} + +.fi-arrow-circle-top:before { + content:'\e00c'; +} + +.fi-arrow-left:before { + content:'\e00d'; +} + +.fi-arrow-right:before { + content:'\e00e'; +} + +.fi-arrow-thick-bottom:before { + content:'\e00f'; +} + +.fi-arrow-thick-left:before { + content:'\e010'; +} + +.fi-arrow-thick-right:before { + content:'\e011'; +} + +.fi-arrow-thick-top:before { + content:'\e012'; +} + +.fi-arrow-top:before { + content:'\e013'; +} + +.fi-audio-spectrum:before { + content:'\e014'; +} + +.fi-audio:before { + content:'\e015'; +} + +.fi-badge:before { + content:'\e016'; +} + +.fi-ban:before { + content:'\e017'; +} + +.fi-bar-chart:before { + content:'\e018'; +} + +.fi-basket:before { + content:'\e019'; +} + +.fi-battery-empty:before { + content:'\e01a'; +} + +.fi-battery-full:before { + content:'\e01b'; +} + +.fi-beaker:before { + content:'\e01c'; +} + +.fi-bell:before { + content:'\e01d'; +} + +.fi-bluetooth:before { + content:'\e01e'; +} + +.fi-bold:before { + content:'\e01f'; +} + +.fi-bolt:before { + content:'\e020'; +} + +.fi-book:before { + content:'\e021'; +} + +.fi-bookmark:before { + content:'\e022'; +} + +.fi-box:before { + content:'\e023'; +} + +.fi-briefcase:before { + content:'\e024'; +} + +.fi-british-pound:before { + content:'\e025'; +} + +.fi-browser:before { + content:'\e026'; +} + +.fi-brush:before { + content:'\e027'; +} + +.fi-bug:before { + content:'\e028'; +} + +.fi-bullhorn:before { + content:'\e029'; +} + +.fi-calculator:before { + content:'\e02a'; +} + +.fi-calendar:before { + content:'\e02b'; +} + +.fi-camera-slr:before { + content:'\e02c'; +} + +.fi-caret-bottom:before { + content:'\e02d'; +} + +.fi-caret-left:before { + content:'\e02e'; +} + +.fi-caret-right:before { + content:'\e02f'; +} + +.fi-caret-top:before { + content:'\e030'; +} + +.fi-cart:before { + content:'\e031'; +} + +.fi-chat:before { + content:'\e032'; +} + +.fi-check:before { + content:'\e033'; +} + +.fi-chevron-bottom:before { + content:'\e034'; +} + +.fi-chevron-left:before { + content:'\e035'; +} + +.fi-chevron-right:before { + content:'\e036'; +} + +.fi-chevron-top:before { + content:'\e037'; +} + +.fi-circle-check:before { + content:'\e038'; +} + +.fi-circle-x:before { + content:'\e039'; +} + +.fi-clipboard:before { + content:'\e03a'; +} + +.fi-clock:before { + content:'\e03b'; +} + +.fi-cloud-download:before { + content:'\e03c'; +} + +.fi-cloud-upload:before { + content:'\e03d'; +} + +.fi-cloud:before { + content:'\e03e'; +} + +.fi-cloudy:before { + content:'\e03f'; +} + +.fi-code:before { + content:'\e040'; +} + +.fi-cog:before { + content:'\e041'; +} + +.fi-collapse-down:before { + content:'\e042'; +} + +.fi-collapse-left:before { + content:'\e043'; +} + +.fi-collapse-right:before { + content:'\e044'; +} + +.fi-collapse-up:before { + content:'\e045'; +} + +.fi-command:before { + content:'\e046'; +} + +.fi-comment-square:before { + content:'\e047'; +} + +.fi-compass:before { + content:'\e048'; +} + +.fi-contrast:before { + content:'\e049'; +} + +.fi-copywriting:before { + content:'\e04a'; +} + +.fi-credit-card:before { + content:'\e04b'; +} + +.fi-crop:before { + content:'\e04c'; +} + +.fi-dashboard:before { + content:'\e04d'; +} + +.fi-data-transfer-download:before { + content:'\e04e'; +} + +.fi-data-transfer-upload:before { + content:'\e04f'; +} + +.fi-delete:before { + content:'\e050'; +} + +.fi-dial:before { + content:'\e051'; +} + +.fi-document:before { + content:'\e052'; +} + +.fi-dollar:before { + content:'\e053'; +} + +.fi-double-quote-sans-left:before { + content:'\e054'; +} + +.fi-double-quote-sans-right:before { + content:'\e055'; +} + +.fi-double-quote-serif-left:before { + content:'\e056'; +} + +.fi-double-quote-serif-right:before { + content:'\e057'; +} + +.fi-droplet:before { + content:'\e058'; +} + +.fi-eject:before { + content:'\e059'; +} + +.fi-elevator:before { + content:'\e05a'; +} + +.fi-ellipses:before { + content:'\e05b'; +} + +.fi-envelope-closed:before { + content:'\e05c'; +} + +.fi-envelope-open:before { + content:'\e05d'; +} + +.fi-euro:before { + content:'\e05e'; +} + +.fi-excerpt:before { + content:'\e05f'; +} + +.fi-expand-down:before { + content:'\e060'; +} + +.fi-expand-left:before { + content:'\e061'; +} + +.fi-expand-right:before { + content:'\e062'; +} + +.fi-expand-up:before { + content:'\e063'; +} + +.fi-external-link:before { + content:'\e064'; +} + +.fi-eye:before { + content:'\e065'; +} + +.fi-eyedropper:before { + content:'\e066'; +} + +.fi-file:before { + content:'\e067'; +} + +.fi-fire:before { + content:'\e068'; +} + +.fi-flag:before { + content:'\e069'; +} + +.fi-flash:before { + content:'\e06a'; +} + +.fi-folder:before { + content:'\e06b'; +} + +.fi-fork:before { + content:'\e06c'; +} + +.fi-fullscreen-enter:before { + content:'\e06d'; +} + +.fi-fullscreen-exit:before { + content:'\e06e'; +} + +.fi-globe:before { + content:'\e06f'; +} + +.fi-graph:before { + content:'\e070'; +} + +.fi-grid-four-up:before { + content:'\e071'; +} + +.fi-grid-three-up:before { + content:'\e072'; +} + +.fi-grid-two-up:before { + content:'\e073'; +} + +.fi-hard-drive:before { + content:'\e074'; +} + +.fi-header:before { + content:'\e075'; +} + +.fi-headphones:before { + content:'\e076'; +} + +.fi-heart:before { + content:'\e077'; +} + +.fi-home:before { + content:'\e078'; +} + +.fi-image:before { + content:'\e079'; +} + +.fi-inbox:before { + content:'\e07a'; +} + +.fi-infinity:before { + content:'\e07b'; +} + +.fi-info:before { + content:'\e07c'; +} + +.fi-italic:before { + content:'\e07d'; +} + +.fi-justify-center:before { + content:'\e07e'; +} + +.fi-justify-left:before { + content:'\e07f'; +} + +.fi-justify-right:before { + content:'\e080'; +} + +.fi-key:before { + content:'\e081'; +} + +.fi-laptop:before { + content:'\e082'; +} + +.fi-layers:before { + content:'\e083'; +} + +.fi-lightbulb:before { + content:'\e084'; +} + +.fi-link-broken:before { + content:'\e085'; +} + +.fi-link-intact:before { + content:'\e086'; +} + +.fi-list-rich:before { + content:'\e087'; +} + +.fi-list:before { + content:'\e088'; +} + +.fi-location:before { + content:'\e089'; +} + +.fi-lock-locked:before { + content:'\e08a'; +} + +.fi-lock-unlocked:before { + content:'\e08b'; +} + +.fi-loop-circular:before { + content:'\e08c'; +} + +.fi-loop-square:before { + content:'\e08d'; +} + +.fi-loop:before { + content:'\e08e'; +} + +.fi-magnifying-glass:before { + content:'\e08f'; +} + +.fi-map-marker:before { + content:'\e090'; +} + +.fi-map:before { + content:'\e091'; +} + +.fi-media-pause:before { + content:'\e092'; +} + +.fi-media-play:before { + content:'\e093'; +} + +.fi-media-record:before { + content:'\e094'; +} + +.fi-media-skip-backward:before { + content:'\e095'; +} + +.fi-media-skip-forward:before { + content:'\e096'; +} + +.fi-media-step-backward:before { + content:'\e097'; +} + +.fi-media-step-forward:before { + content:'\e098'; +} + +.fi-media-stop:before { + content:'\e099'; +} + +.fi-medical-cross:before { + content:'\e09a'; +} + +.fi-menu:before { + content:'\e09b'; +} + +.fi-microphone:before { + content:'\e09c'; +} + +.fi-minus:before { + content:'\e09d'; +} + +.fi-monitor:before { + content:'\e09e'; +} + +.fi-moon:before { + content:'\e09f'; +} + +.fi-move:before { + content:'\e0a0'; +} + +.fi-musical-note:before { + content:'\e0a1'; +} + +.fi-paperclip:before { + content:'\e0a2'; +} + +.fi-pencil:before { + content:'\e0a3'; +} + +.fi-people:before { + content:'\e0a4'; +} + +.fi-person:before { + content:'\e0a5'; +} + +.fi-phone:before { + content:'\e0a6'; +} + +.fi-pie-chart:before { + content:'\e0a7'; +} + +.fi-pin:before { + content:'\e0a8'; +} + +.fi-play-circle:before { + content:'\e0a9'; +} + +.fi-plus:before { + content:'\e0aa'; +} + +.fi-power-standby:before { + content:'\e0ab'; +} + +.fi-print:before { + content:'\e0ac'; +} + +.fi-project:before { + content:'\e0ad'; +} + +.fi-pulse:before { + content:'\e0ae'; +} + +.fi-puzzle-piece:before { + content:'\e0af'; +} + +.fi-question-mark:before { + content:'\e0b0'; +} + +.fi-rain:before { + content:'\e0b1'; +} + +.fi-random:before { + content:'\e0b2'; +} + +.fi-reload:before { + content:'\e0b3'; +} + +.fi-resize-both:before { + content:'\e0b4'; +} + +.fi-resize-height:before { + content:'\e0b5'; +} + +.fi-resize-width:before { + content:'\e0b6'; +} + +.fi-rss-alt:before { + content:'\e0b7'; +} + +.fi-rss:before { + content:'\e0b8'; +} + +.fi-script:before { + content:'\e0b9'; +} + +.fi-share-boxed:before { + content:'\e0ba'; +} + +.fi-share:before { + content:'\e0bb'; +} + +.fi-shield:before { + content:'\e0bc'; +} + +.fi-signal:before { + content:'\e0bd'; +} + +.fi-signpost:before { + content:'\e0be'; +} + +.fi-sort-ascending:before { + content:'\e0bf'; +} + +.fi-sort-descending:before { + content:'\e0c0'; +} + +.fi-spreadsheet:before { + content:'\e0c1'; +} + +.fi-star:before { + content:'\e0c2'; +} + +.fi-sun:before { + content:'\e0c3'; +} + +.fi-tablet:before { + content:'\e0c4'; +} + +.fi-tag:before { + content:'\e0c5'; +} + +.fi-tags:before { + content:'\e0c6'; +} + +.fi-target:before { + content:'\e0c7'; +} + +.fi-task:before { + content:'\e0c8'; +} + +.fi-terminal:before { + content:'\e0c9'; +} + +.fi-text:before { + content:'\e0ca'; +} + +.fi-thumb-down:before { + content:'\e0cb'; +} + +.fi-thumb-up:before { + content:'\e0cc'; +} + +.fi-timer:before { + content:'\e0cd'; +} + +.fi-transfer:before { + content:'\e0ce'; +} + +.fi-trash:before { + content:'\e0cf'; +} + +.fi-underline:before { + content:'\e0d0'; +} + +.fi-vertical-align-bottom:before { + content:'\e0d1'; +} + +.fi-vertical-align-center:before { + content:'\e0d2'; +} + +.fi-vertical-align-top:before { + content:'\e0d3'; +} + +.fi-video:before { + content:'\e0d4'; +} + +.fi-volume-high:before { + content:'\e0d5'; +} + +.fi-volume-low:before { + content:'\e0d6'; +} + +.fi-volume-off:before { + content:'\e0d7'; +} + +.fi-warning:before { + content:'\e0d8'; +} + +.fi-wifi:before { + content:'\e0d9'; +} + +.fi-wrench:before { + content:'\e0da'; +} + +.fi-x:before { + content:'\e0db'; +} + +.fi-yen:before { + content:'\e0dc'; +} + +.fi-zoom-in:before { + content:'\e0dd'; +} + +.fi-zoom-out:before { + content:'\e0de'; +} + diff --git a/static/open-iconic/css/open-iconic-foundation.min.css b/static/open-iconic/css/open-iconic-foundation.min.css new file mode 100644 index 00000000..bd124297 --- /dev/null +++ b/static/open-iconic/css/open-iconic-foundation.min.css @@ -0,0 +1 @@ +@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:400;font-style:normal}.fi-account-login:before,.fi-account-logout:before,.fi-action-redo:before,.fi-action-undo:before,.fi-align-center:before,.fi-align-left:before,.fi-align-right:before,.fi-aperture:before,.fi-arrow-bottom:before,.fi-arrow-circle-bottom:before,.fi-arrow-circle-left:before,.fi-arrow-circle-right:before,.fi-arrow-circle-top:before,.fi-arrow-left:before,.fi-arrow-right:before,.fi-arrow-thick-bottom:before,.fi-arrow-thick-left:before,.fi-arrow-thick-right:before,.fi-arrow-thick-top:before,.fi-arrow-top:before,.fi-audio-spectrum:before,.fi-audio:before,.fi-badge:before,.fi-ban:before,.fi-bar-chart:before,.fi-basket:before,.fi-battery-empty:before,.fi-battery-full:before,.fi-beaker:before,.fi-bell:before,.fi-bluetooth:before,.fi-bold:before,.fi-bolt:before,.fi-book:before,.fi-bookmark:before,.fi-box:before,.fi-briefcase:before,.fi-british-pound:before,.fi-browser:before,.fi-brush:before,.fi-bug:before,.fi-bullhorn:before,.fi-calculator:before,.fi-calendar:before,.fi-camera-slr:before,.fi-caret-bottom:before,.fi-caret-left:before,.fi-caret-right:before,.fi-caret-top:before,.fi-cart:before,.fi-chat:before,.fi-check:before,.fi-chevron-bottom:before,.fi-chevron-left:before,.fi-chevron-right:before,.fi-chevron-top:before,.fi-circle-check:before,.fi-circle-x:before,.fi-clipboard:before,.fi-clock:before,.fi-cloud-download:before,.fi-cloud-upload:before,.fi-cloud:before,.fi-cloudy:before,.fi-code:before,.fi-cog:before,.fi-collapse-down:before,.fi-collapse-left:before,.fi-collapse-right:before,.fi-collapse-up:before,.fi-command:before,.fi-comment-square:before,.fi-compass:before,.fi-contrast:before,.fi-copywriting:before,.fi-credit-card:before,.fi-crop:before,.fi-dashboard:before,.fi-data-transfer-download:before,.fi-data-transfer-upload:before,.fi-delete:before,.fi-dial:before,.fi-document:before,.fi-dollar:before,.fi-double-quote-sans-left:before,.fi-double-quote-sans-right:before,.fi-double-quote-serif-left:before,.fi-double-quote-serif-right:before,.fi-droplet:before,.fi-eject:before,.fi-elevator:before,.fi-ellipses:before,.fi-envelope-closed:before,.fi-envelope-open:before,.fi-euro:before,.fi-excerpt:before,.fi-expand-down:before,.fi-expand-left:before,.fi-expand-right:before,.fi-expand-up:before,.fi-external-link:before,.fi-eye:before,.fi-eyedropper:before,.fi-file:before,.fi-fire:before,.fi-flag:before,.fi-flash:before,.fi-folder:before,.fi-fork:before,.fi-fullscreen-enter:before,.fi-fullscreen-exit:before,.fi-globe:before,.fi-graph:before,.fi-grid-four-up:before,.fi-grid-three-up:before,.fi-grid-two-up:before,.fi-hard-drive:before,.fi-header:before,.fi-headphones:before,.fi-heart:before,.fi-home:before,.fi-image:before,.fi-inbox:before,.fi-infinity:before,.fi-info:before,.fi-italic:before,.fi-justify-center:before,.fi-justify-left:before,.fi-justify-right:before,.fi-key:before,.fi-laptop:before,.fi-layers:before,.fi-lightbulb:before,.fi-link-broken:before,.fi-link-intact:before,.fi-list-rich:before,.fi-list:before,.fi-location:before,.fi-lock-locked:before,.fi-lock-unlocked:before,.fi-loop-circular:before,.fi-loop-square:before,.fi-loop:before,.fi-magnifying-glass:before,.fi-map-marker:before,.fi-map:before,.fi-media-pause:before,.fi-media-play:before,.fi-media-record:before,.fi-media-skip-backward:before,.fi-media-skip-forward:before,.fi-media-step-backward:before,.fi-media-step-forward:before,.fi-media-stop:before,.fi-medical-cross:before,.fi-menu:before,.fi-microphone:before,.fi-minus:before,.fi-monitor:before,.fi-moon:before,.fi-move:before,.fi-musical-note:before,.fi-paperclip:before,.fi-pencil:before,.fi-people:before,.fi-person:before,.fi-phone:before,.fi-pie-chart:before,.fi-pin:before,.fi-play-circle:before,.fi-plus:before,.fi-power-standby:before,.fi-print:before,.fi-project:before,.fi-pulse:before,.fi-puzzle-piece:before,.fi-question-mark:before,.fi-rain:before,.fi-random:before,.fi-reload:before,.fi-resize-both:before,.fi-resize-height:before,.fi-resize-width:before,.fi-rss-alt:before,.fi-rss:before,.fi-script:before,.fi-share-boxed:before,.fi-share:before,.fi-shield:before,.fi-signal:before,.fi-signpost:before,.fi-sort-ascending:before,.fi-sort-descending:before,.fi-spreadsheet:before,.fi-star:before,.fi-sun:before,.fi-tablet:before,.fi-tag:before,.fi-tags:before,.fi-target:before,.fi-task:before,.fi-terminal:before,.fi-text:before,.fi-thumb-down:before,.fi-thumb-up:before,.fi-timer:before,.fi-transfer:before,.fi-trash:before,.fi-underline:before,.fi-vertical-align-bottom:before,.fi-vertical-align-center:before,.fi-vertical-align-top:before,.fi-video:before,.fi-volume-high:before,.fi-volume-low:before,.fi-volume-off:before,.fi-warning:before,.fi-wifi:before,.fi-wrench:before,.fi-x:before,.fi-yen:before,.fi-zoom-in:before,.fi-zoom-out:before{font-family:Icons;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;text-decoration:inherit}[class*=fi-].oi-align-center:before{text-align:center}[class*=fi-].oi-align-left:before{text-align:left}[class*=fi-].oi-align-right:before{text-align:right}[class*=fi-].oi-flip-horizontal:before{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}[class*=fi-].oi-flip-vertical:before{-webkit-transform:scale(1,-1);-ms-transform:scale(-1,1);transform:scale(1,-1)}[class*=fi-].oi-flip-horizontal-vertical:before{-webkit-transform:scale(-1,-1);-ms-transform:scale(-1,1);transform:scale(-1,-1)}.fi-account-login:before{content:'\e000'}.fi-account-logout:before{content:'\e001'}.fi-action-redo:before{content:'\e002'}.fi-action-undo:before{content:'\e003'}.fi-align-center:before{content:'\e004'}.fi-align-left:before{content:'\e005'}.fi-align-right:before{content:'\e006'}.fi-aperture:before{content:'\e007'}.fi-arrow-bottom:before{content:'\e008'}.fi-arrow-circle-bottom:before{content:'\e009'}.fi-arrow-circle-left:before{content:'\e00a'}.fi-arrow-circle-right:before{content:'\e00b'}.fi-arrow-circle-top:before{content:'\e00c'}.fi-arrow-left:before{content:'\e00d'}.fi-arrow-right:before{content:'\e00e'}.fi-arrow-thick-bottom:before{content:'\e00f'}.fi-arrow-thick-left:before{content:'\e010'}.fi-arrow-thick-right:before{content:'\e011'}.fi-arrow-thick-top:before{content:'\e012'}.fi-arrow-top:before{content:'\e013'}.fi-audio-spectrum:before{content:'\e014'}.fi-audio:before{content:'\e015'}.fi-badge:before{content:'\e016'}.fi-ban:before{content:'\e017'}.fi-bar-chart:before{content:'\e018'}.fi-basket:before{content:'\e019'}.fi-battery-empty:before{content:'\e01a'}.fi-battery-full:before{content:'\e01b'}.fi-beaker:before{content:'\e01c'}.fi-bell:before{content:'\e01d'}.fi-bluetooth:before{content:'\e01e'}.fi-bold:before{content:'\e01f'}.fi-bolt:before{content:'\e020'}.fi-book:before{content:'\e021'}.fi-bookmark:before{content:'\e022'}.fi-box:before{content:'\e023'}.fi-briefcase:before{content:'\e024'}.fi-british-pound:before{content:'\e025'}.fi-browser:before{content:'\e026'}.fi-brush:before{content:'\e027'}.fi-bug:before{content:'\e028'}.fi-bullhorn:before{content:'\e029'}.fi-calculator:before{content:'\e02a'}.fi-calendar:before{content:'\e02b'}.fi-camera-slr:before{content:'\e02c'}.fi-caret-bottom:before{content:'\e02d'}.fi-caret-left:before{content:'\e02e'}.fi-caret-right:before{content:'\e02f'}.fi-caret-top:before{content:'\e030'}.fi-cart:before{content:'\e031'}.fi-chat:before{content:'\e032'}.fi-check:before{content:'\e033'}.fi-chevron-bottom:before{content:'\e034'}.fi-chevron-left:before{content:'\e035'}.fi-chevron-right:before{content:'\e036'}.fi-chevron-top:before{content:'\e037'}.fi-circle-check:before{content:'\e038'}.fi-circle-x:before{content:'\e039'}.fi-clipboard:before{content:'\e03a'}.fi-clock:before{content:'\e03b'}.fi-cloud-download:before{content:'\e03c'}.fi-cloud-upload:before{content:'\e03d'}.fi-cloud:before{content:'\e03e'}.fi-cloudy:before{content:'\e03f'}.fi-code:before{content:'\e040'}.fi-cog:before{content:'\e041'}.fi-collapse-down:before{content:'\e042'}.fi-collapse-left:before{content:'\e043'}.fi-collapse-right:before{content:'\e044'}.fi-collapse-up:before{content:'\e045'}.fi-command:before{content:'\e046'}.fi-comment-square:before{content:'\e047'}.fi-compass:before{content:'\e048'}.fi-contrast:before{content:'\e049'}.fi-copywriting:before{content:'\e04a'}.fi-credit-card:before{content:'\e04b'}.fi-crop:before{content:'\e04c'}.fi-dashboard:before{content:'\e04d'}.fi-data-transfer-download:before{content:'\e04e'}.fi-data-transfer-upload:before{content:'\e04f'}.fi-delete:before{content:'\e050'}.fi-dial:before{content:'\e051'}.fi-document:before{content:'\e052'}.fi-dollar:before{content:'\e053'}.fi-double-quote-sans-left:before{content:'\e054'}.fi-double-quote-sans-right:before{content:'\e055'}.fi-double-quote-serif-left:before{content:'\e056'}.fi-double-quote-serif-right:before{content:'\e057'}.fi-droplet:before{content:'\e058'}.fi-eject:before{content:'\e059'}.fi-elevator:before{content:'\e05a'}.fi-ellipses:before{content:'\e05b'}.fi-envelope-closed:before{content:'\e05c'}.fi-envelope-open:before{content:'\e05d'}.fi-euro:before{content:'\e05e'}.fi-excerpt:before{content:'\e05f'}.fi-expand-down:before{content:'\e060'}.fi-expand-left:before{content:'\e061'}.fi-expand-right:before{content:'\e062'}.fi-expand-up:before{content:'\e063'}.fi-external-link:before{content:'\e064'}.fi-eye:before{content:'\e065'}.fi-eyedropper:before{content:'\e066'}.fi-file:before{content:'\e067'}.fi-fire:before{content:'\e068'}.fi-flag:before{content:'\e069'}.fi-flash:before{content:'\e06a'}.fi-folder:before{content:'\e06b'}.fi-fork:before{content:'\e06c'}.fi-fullscreen-enter:before{content:'\e06d'}.fi-fullscreen-exit:before{content:'\e06e'}.fi-globe:before{content:'\e06f'}.fi-graph:before{content:'\e070'}.fi-grid-four-up:before{content:'\e071'}.fi-grid-three-up:before{content:'\e072'}.fi-grid-two-up:before{content:'\e073'}.fi-hard-drive:before{content:'\e074'}.fi-header:before{content:'\e075'}.fi-headphones:before{content:'\e076'}.fi-heart:before{content:'\e077'}.fi-home:before{content:'\e078'}.fi-image:before{content:'\e079'}.fi-inbox:before{content:'\e07a'}.fi-infinity:before{content:'\e07b'}.fi-info:before{content:'\e07c'}.fi-italic:before{content:'\e07d'}.fi-justify-center:before{content:'\e07e'}.fi-justify-left:before{content:'\e07f'}.fi-justify-right:before{content:'\e080'}.fi-key:before{content:'\e081'}.fi-laptop:before{content:'\e082'}.fi-layers:before{content:'\e083'}.fi-lightbulb:before{content:'\e084'}.fi-link-broken:before{content:'\e085'}.fi-link-intact:before{content:'\e086'}.fi-list-rich:before{content:'\e087'}.fi-list:before{content:'\e088'}.fi-location:before{content:'\e089'}.fi-lock-locked:before{content:'\e08a'}.fi-lock-unlocked:before{content:'\e08b'}.fi-loop-circular:before{content:'\e08c'}.fi-loop-square:before{content:'\e08d'}.fi-loop:before{content:'\e08e'}.fi-magnifying-glass:before{content:'\e08f'}.fi-map-marker:before{content:'\e090'}.fi-map:before{content:'\e091'}.fi-media-pause:before{content:'\e092'}.fi-media-play:before{content:'\e093'}.fi-media-record:before{content:'\e094'}.fi-media-skip-backward:before{content:'\e095'}.fi-media-skip-forward:before{content:'\e096'}.fi-media-step-backward:before{content:'\e097'}.fi-media-step-forward:before{content:'\e098'}.fi-media-stop:before{content:'\e099'}.fi-medical-cross:before{content:'\e09a'}.fi-menu:before{content:'\e09b'}.fi-microphone:before{content:'\e09c'}.fi-minus:before{content:'\e09d'}.fi-monitor:before{content:'\e09e'}.fi-moon:before{content:'\e09f'}.fi-move:before{content:'\e0a0'}.fi-musical-note:before{content:'\e0a1'}.fi-paperclip:before{content:'\e0a2'}.fi-pencil:before{content:'\e0a3'}.fi-people:before{content:'\e0a4'}.fi-person:before{content:'\e0a5'}.fi-phone:before{content:'\e0a6'}.fi-pie-chart:before{content:'\e0a7'}.fi-pin:before{content:'\e0a8'}.fi-play-circle:before{content:'\e0a9'}.fi-plus:before{content:'\e0aa'}.fi-power-standby:before{content:'\e0ab'}.fi-print:before{content:'\e0ac'}.fi-project:before{content:'\e0ad'}.fi-pulse:before{content:'\e0ae'}.fi-puzzle-piece:before{content:'\e0af'}.fi-question-mark:before{content:'\e0b0'}.fi-rain:before{content:'\e0b1'}.fi-random:before{content:'\e0b2'}.fi-reload:before{content:'\e0b3'}.fi-resize-both:before{content:'\e0b4'}.fi-resize-height:before{content:'\e0b5'}.fi-resize-width:before{content:'\e0b6'}.fi-rss-alt:before{content:'\e0b7'}.fi-rss:before{content:'\e0b8'}.fi-script:before{content:'\e0b9'}.fi-share-boxed:before{content:'\e0ba'}.fi-share:before{content:'\e0bb'}.fi-shield:before{content:'\e0bc'}.fi-signal:before{content:'\e0bd'}.fi-signpost:before{content:'\e0be'}.fi-sort-ascending:before{content:'\e0bf'}.fi-sort-descending:before{content:'\e0c0'}.fi-spreadsheet:before{content:'\e0c1'}.fi-star:before{content:'\e0c2'}.fi-sun:before{content:'\e0c3'}.fi-tablet:before{content:'\e0c4'}.fi-tag:before{content:'\e0c5'}.fi-tags:before{content:'\e0c6'}.fi-target:before{content:'\e0c7'}.fi-task:before{content:'\e0c8'}.fi-terminal:before{content:'\e0c9'}.fi-text:before{content:'\e0ca'}.fi-thumb-down:before{content:'\e0cb'}.fi-thumb-up:before{content:'\e0cc'}.fi-timer:before{content:'\e0cd'}.fi-transfer:before{content:'\e0ce'}.fi-trash:before{content:'\e0cf'}.fi-underline:before{content:'\e0d0'}.fi-vertical-align-bottom:before{content:'\e0d1'}.fi-vertical-align-center:before{content:'\e0d2'}.fi-vertical-align-top:before{content:'\e0d3'}.fi-video:before{content:'\e0d4'}.fi-volume-high:before{content:'\e0d5'}.fi-volume-low:before{content:'\e0d6'}.fi-volume-off:before{content:'\e0d7'}.fi-warning:before{content:'\e0d8'}.fi-wifi:before{content:'\e0d9'}.fi-wrench:before{content:'\e0da'}.fi-x:before{content:'\e0db'}.fi-yen:before{content:'\e0dc'}.fi-zoom-in:before{content:'\e0dd'}.fi-zoom-out:before{content:'\e0de'} \ No newline at end of file diff --git a/static/open-iconic/css/open-iconic-foundation.scss b/static/open-iconic/css/open-iconic-foundation.scss new file mode 100644 index 00000000..fe471389 --- /dev/null +++ b/static/open-iconic/css/open-iconic-foundation.scss @@ -0,0 +1,1398 @@ +/* Foundation */ + +/* Font path 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.otf') format('opentype'), url('#{$icon-font-path}open-iconic.svg#iconic-sm') format('svg'); + font-weight: normal; + font-style: normal; +} + + +.fi-account-login:before, + +.fi-account-logout:before, + +.fi-action-redo:before, + +.fi-action-undo:before, + +.fi-align-center:before, + +.fi-align-left:before, + +.fi-align-right:before, + +.fi-aperture:before, + +.fi-arrow-bottom:before, + +.fi-arrow-circle-bottom:before, + +.fi-arrow-circle-left:before, + +.fi-arrow-circle-right:before, + +.fi-arrow-circle-top:before, + +.fi-arrow-left:before, + +.fi-arrow-right:before, + +.fi-arrow-thick-bottom:before, + +.fi-arrow-thick-left:before, + +.fi-arrow-thick-right:before, + +.fi-arrow-thick-top:before, + +.fi-arrow-top:before, + +.fi-audio-spectrum:before, + +.fi-audio:before, + +.fi-badge:before, + +.fi-ban:before, + +.fi-bar-chart:before, + +.fi-basket:before, + +.fi-battery-empty:before, + +.fi-battery-full:before, + +.fi-beaker:before, + +.fi-bell:before, + +.fi-bluetooth:before, + +.fi-bold:before, + +.fi-bolt:before, + +.fi-book:before, + +.fi-bookmark:before, + +.fi-box:before, + +.fi-briefcase:before, + +.fi-british-pound:before, + +.fi-browser:before, + +.fi-brush:before, + +.fi-bug:before, + +.fi-bullhorn:before, + +.fi-calculator:before, + +.fi-calendar:before, + +.fi-camera-slr:before, + +.fi-caret-bottom:before, + +.fi-caret-left:before, + +.fi-caret-right:before, + +.fi-caret-top:before, + +.fi-cart:before, + +.fi-chat:before, + +.fi-check:before, + +.fi-chevron-bottom:before, + +.fi-chevron-left:before, + +.fi-chevron-right:before, + +.fi-chevron-top:before, + +.fi-circle-check:before, + +.fi-circle-x:before, + +.fi-clipboard:before, + +.fi-clock:before, + +.fi-cloud-download:before, + +.fi-cloud-upload:before, + +.fi-cloud:before, + +.fi-cloudy:before, + +.fi-code:before, + +.fi-cog:before, + +.fi-collapse-down:before, + +.fi-collapse-left:before, + +.fi-collapse-right:before, + +.fi-collapse-up:before, + +.fi-command:before, + +.fi-comment-square:before, + +.fi-compass:before, + +.fi-contrast:before, + +.fi-copywriting:before, + +.fi-credit-card:before, + +.fi-crop:before, + +.fi-dashboard:before, + +.fi-data-transfer-download:before, + +.fi-data-transfer-upload:before, + +.fi-delete:before, + +.fi-dial:before, + +.fi-document:before, + +.fi-dollar:before, + +.fi-double-quote-sans-left:before, + +.fi-double-quote-sans-right:before, + +.fi-double-quote-serif-left:before, + +.fi-double-quote-serif-right:before, + +.fi-droplet:before, + +.fi-eject:before, + +.fi-elevator:before, + +.fi-ellipses:before, + +.fi-envelope-closed:before, + +.fi-envelope-open:before, + +.fi-euro:before, + +.fi-excerpt:before, + +.fi-expand-down:before, + +.fi-expand-left:before, + +.fi-expand-right:before, + +.fi-expand-up:before, + +.fi-external-link:before, + +.fi-eye:before, + +.fi-eyedropper:before, + +.fi-file:before, + +.fi-fire:before, + +.fi-flag:before, + +.fi-flash:before, + +.fi-folder:before, + +.fi-fork:before, + +.fi-fullscreen-enter:before, + +.fi-fullscreen-exit:before, + +.fi-globe:before, + +.fi-graph:before, + +.fi-grid-four-up:before, + +.fi-grid-three-up:before, + +.fi-grid-two-up:before, + +.fi-hard-drive:before, + +.fi-header:before, + +.fi-headphones:before, + +.fi-heart:before, + +.fi-home:before, + +.fi-image:before, + +.fi-inbox:before, + +.fi-infinity:before, + +.fi-info:before, + +.fi-italic:before, + +.fi-justify-center:before, + +.fi-justify-left:before, + +.fi-justify-right:before, + +.fi-key:before, + +.fi-laptop:before, + +.fi-layers:before, + +.fi-lightbulb:before, + +.fi-link-broken:before, + +.fi-link-intact:before, + +.fi-list-rich:before, + +.fi-list:before, + +.fi-location:before, + +.fi-lock-locked:before, + +.fi-lock-unlocked:before, + +.fi-loop-circular:before, + +.fi-loop-square:before, + +.fi-loop:before, + +.fi-magnifying-glass:before, + +.fi-map-marker:before, + +.fi-map:before, + +.fi-media-pause:before, + +.fi-media-play:before, + +.fi-media-record:before, + +.fi-media-skip-backward:before, + +.fi-media-skip-forward:before, + +.fi-media-step-backward:before, + +.fi-media-step-forward:before, + +.fi-media-stop:before, + +.fi-medical-cross:before, + +.fi-menu:before, + +.fi-microphone:before, + +.fi-minus:before, + +.fi-monitor:before, + +.fi-moon:before, + +.fi-move:before, + +.fi-musical-note:before, + +.fi-paperclip:before, + +.fi-pencil:before, + +.fi-people:before, + +.fi-person:before, + +.fi-phone:before, + +.fi-pie-chart:before, + +.fi-pin:before, + +.fi-play-circle:before, + +.fi-plus:before, + +.fi-power-standby:before, + +.fi-print:before, + +.fi-project:before, + +.fi-pulse:before, + +.fi-puzzle-piece:before, + +.fi-question-mark:before, + +.fi-rain:before, + +.fi-random:before, + +.fi-reload:before, + +.fi-resize-both:before, + +.fi-resize-height:before, + +.fi-resize-width:before, + +.fi-rss-alt:before, + +.fi-rss:before, + +.fi-script:before, + +.fi-share-boxed:before, + +.fi-share:before, + +.fi-shield:before, + +.fi-signal:before, + +.fi-signpost:before, + +.fi-sort-ascending:before, + +.fi-sort-descending:before, + +.fi-spreadsheet:before, + +.fi-star:before, + +.fi-sun:before, + +.fi-tablet:before, + +.fi-tag:before, + +.fi-tags:before, + +.fi-target:before, + +.fi-task:before, + +.fi-terminal:before, + +.fi-text:before, + +.fi-thumb-down:before, + +.fi-thumb-up:before, + +.fi-timer:before, + +.fi-transfer:before, + +.fi-trash:before, + +.fi-underline:before, + +.fi-vertical-align-bottom:before, + +.fi-vertical-align-center:before, + +.fi-vertical-align-top:before, + +.fi-video:before, + +.fi-volume-high:before, + +.fi-volume-low:before, + +.fi-volume-off:before, + +.fi-warning:before, + +.fi-wifi:before, + +.fi-wrench:before, + +.fi-x:before, + +.fi-yen:before, + +.fi-zoom-in:before, + +.fi-zoom-out:before + { + font-family: 'Icons'; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + display: inline-block; + text-decoration: inherit; +} + + +[class*='fi-'].oi-align-center:before { + text-align: center; +} + +[class*='fi-'].oi-align-left:before { + text-align: left; +} + +[class*='fi-'].oi-align-right:before { + text-align: right; +} + + +[class*='fi-'].oi-flip-horizontal:before { + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} + +[class*='fi-'].oi-flip-vertical:before { + -webkit-transform: scale(1, -1); + -ms-transform: scale(-1, 1); + transform: scale(1, -1); +} + +[class*='fi-'].oi-flip-horizontal-vertical:before { + -webkit-transform: scale(-1, -1); + -ms-transform: scale(-1, 1); + transform: scale(-1, -1); +} + + + +.fi-account-login:before { + content:'\e000'; +} + +.fi-account-logout:before { + content:'\e001'; +} + +.fi-action-redo:before { + content:'\e002'; +} + +.fi-action-undo:before { + content:'\e003'; +} + +.fi-align-center:before { + content:'\e004'; +} + +.fi-align-left:before { + content:'\e005'; +} + +.fi-align-right:before { + content:'\e006'; +} + +.fi-aperture:before { + content:'\e007'; +} + +.fi-arrow-bottom:before { + content:'\e008'; +} + +.fi-arrow-circle-bottom:before { + content:'\e009'; +} + +.fi-arrow-circle-left:before { + content:'\e00a'; +} + +.fi-arrow-circle-right:before { + content:'\e00b'; +} + +.fi-arrow-circle-top:before { + content:'\e00c'; +} + +.fi-arrow-left:before { + content:'\e00d'; +} + +.fi-arrow-right:before { + content:'\e00e'; +} + +.fi-arrow-thick-bottom:before { + content:'\e00f'; +} + +.fi-arrow-thick-left:before { + content:'\e010'; +} + +.fi-arrow-thick-right:before { + content:'\e011'; +} + +.fi-arrow-thick-top:before { + content:'\e012'; +} + +.fi-arrow-top:before { + content:'\e013'; +} + +.fi-audio-spectrum:before { + content:'\e014'; +} + +.fi-audio:before { + content:'\e015'; +} + +.fi-badge:before { + content:'\e016'; +} + +.fi-ban:before { + content:'\e017'; +} + +.fi-bar-chart:before { + content:'\e018'; +} + +.fi-basket:before { + content:'\e019'; +} + +.fi-battery-empty:before { + content:'\e01a'; +} + +.fi-battery-full:before { + content:'\e01b'; +} + +.fi-beaker:before { + content:'\e01c'; +} + +.fi-bell:before { + content:'\e01d'; +} + +.fi-bluetooth:before { + content:'\e01e'; +} + +.fi-bold:before { + content:'\e01f'; +} + +.fi-bolt:before { + content:'\e020'; +} + +.fi-book:before { + content:'\e021'; +} + +.fi-bookmark:before { + content:'\e022'; +} + +.fi-box:before { + content:'\e023'; +} + +.fi-briefcase:before { + content:'\e024'; +} + +.fi-british-pound:before { + content:'\e025'; +} + +.fi-browser:before { + content:'\e026'; +} + +.fi-brush:before { + content:'\e027'; +} + +.fi-bug:before { + content:'\e028'; +} + +.fi-bullhorn:before { + content:'\e029'; +} + +.fi-calculator:before { + content:'\e02a'; +} + +.fi-calendar:before { + content:'\e02b'; +} + +.fi-camera-slr:before { + content:'\e02c'; +} + +.fi-caret-bottom:before { + content:'\e02d'; +} + +.fi-caret-left:before { + content:'\e02e'; +} + +.fi-caret-right:before { + content:'\e02f'; +} + +.fi-caret-top:before { + content:'\e030'; +} + +.fi-cart:before { + content:'\e031'; +} + +.fi-chat:before { + content:'\e032'; +} + +.fi-check:before { + content:'\e033'; +} + +.fi-chevron-bottom:before { + content:'\e034'; +} + +.fi-chevron-left:before { + content:'\e035'; +} + +.fi-chevron-right:before { + content:'\e036'; +} + +.fi-chevron-top:before { + content:'\e037'; +} + +.fi-circle-check:before { + content:'\e038'; +} + +.fi-circle-x:before { + content:'\e039'; +} + +.fi-clipboard:before { + content:'\e03a'; +} + +.fi-clock:before { + content:'\e03b'; +} + +.fi-cloud-download:before { + content:'\e03c'; +} + +.fi-cloud-upload:before { + content:'\e03d'; +} + +.fi-cloud:before { + content:'\e03e'; +} + +.fi-cloudy:before { + content:'\e03f'; +} + +.fi-code:before { + content:'\e040'; +} + +.fi-cog:before { + content:'\e041'; +} + +.fi-collapse-down:before { + content:'\e042'; +} + +.fi-collapse-left:before { + content:'\e043'; +} + +.fi-collapse-right:before { + content:'\e044'; +} + +.fi-collapse-up:before { + content:'\e045'; +} + +.fi-command:before { + content:'\e046'; +} + +.fi-comment-square:before { + content:'\e047'; +} + +.fi-compass:before { + content:'\e048'; +} + +.fi-contrast:before { + content:'\e049'; +} + +.fi-copywriting:before { + content:'\e04a'; +} + +.fi-credit-card:before { + content:'\e04b'; +} + +.fi-crop:before { + content:'\e04c'; +} + +.fi-dashboard:before { + content:'\e04d'; +} + +.fi-data-transfer-download:before { + content:'\e04e'; +} + +.fi-data-transfer-upload:before { + content:'\e04f'; +} + +.fi-delete:before { + content:'\e050'; +} + +.fi-dial:before { + content:'\e051'; +} + +.fi-document:before { + content:'\e052'; +} + +.fi-dollar:before { + content:'\e053'; +} + +.fi-double-quote-sans-left:before { + content:'\e054'; +} + +.fi-double-quote-sans-right:before { + content:'\e055'; +} + +.fi-double-quote-serif-left:before { + content:'\e056'; +} + +.fi-double-quote-serif-right:before { + content:'\e057'; +} + +.fi-droplet:before { + content:'\e058'; +} + +.fi-eject:before { + content:'\e059'; +} + +.fi-elevator:before { + content:'\e05a'; +} + +.fi-ellipses:before { + content:'\e05b'; +} + +.fi-envelope-closed:before { + content:'\e05c'; +} + +.fi-envelope-open:before { + content:'\e05d'; +} + +.fi-euro:before { + content:'\e05e'; +} + +.fi-excerpt:before { + content:'\e05f'; +} + +.fi-expand-down:before { + content:'\e060'; +} + +.fi-expand-left:before { + content:'\e061'; +} + +.fi-expand-right:before { + content:'\e062'; +} + +.fi-expand-up:before { + content:'\e063'; +} + +.fi-external-link:before { + content:'\e064'; +} + +.fi-eye:before { + content:'\e065'; +} + +.fi-eyedropper:before { + content:'\e066'; +} + +.fi-file:before { + content:'\e067'; +} + +.fi-fire:before { + content:'\e068'; +} + +.fi-flag:before { + content:'\e069'; +} + +.fi-flash:before { + content:'\e06a'; +} + +.fi-folder:before { + content:'\e06b'; +} + +.fi-fork:before { + content:'\e06c'; +} + +.fi-fullscreen-enter:before { + content:'\e06d'; +} + +.fi-fullscreen-exit:before { + content:'\e06e'; +} + +.fi-globe:before { + content:'\e06f'; +} + +.fi-graph:before { + content:'\e070'; +} + +.fi-grid-four-up:before { + content:'\e071'; +} + +.fi-grid-three-up:before { + content:'\e072'; +} + +.fi-grid-two-up:before { + content:'\e073'; +} + +.fi-hard-drive:before { + content:'\e074'; +} + +.fi-header:before { + content:'\e075'; +} + +.fi-headphones:before { + content:'\e076'; +} + +.fi-heart:before { + content:'\e077'; +} + +.fi-home:before { + content:'\e078'; +} + +.fi-image:before { + content:'\e079'; +} + +.fi-inbox:before { + content:'\e07a'; +} + +.fi-infinity:before { + content:'\e07b'; +} + +.fi-info:before { + content:'\e07c'; +} + +.fi-italic:before { + content:'\e07d'; +} + +.fi-justify-center:before { + content:'\e07e'; +} + +.fi-justify-left:before { + content:'\e07f'; +} + +.fi-justify-right:before { + content:'\e080'; +} + +.fi-key:before { + content:'\e081'; +} + +.fi-laptop:before { + content:'\e082'; +} + +.fi-layers:before { + content:'\e083'; +} + +.fi-lightbulb:before { + content:'\e084'; +} + +.fi-link-broken:before { + content:'\e085'; +} + +.fi-link-intact:before { + content:'\e086'; +} + +.fi-list-rich:before { + content:'\e087'; +} + +.fi-list:before { + content:'\e088'; +} + +.fi-location:before { + content:'\e089'; +} + +.fi-lock-locked:before { + content:'\e08a'; +} + +.fi-lock-unlocked:before { + content:'\e08b'; +} + +.fi-loop-circular:before { + content:'\e08c'; +} + +.fi-loop-square:before { + content:'\e08d'; +} + +.fi-loop:before { + content:'\e08e'; +} + +.fi-magnifying-glass:before { + content:'\e08f'; +} + +.fi-map-marker:before { + content:'\e090'; +} + +.fi-map:before { + content:'\e091'; +} + +.fi-media-pause:before { + content:'\e092'; +} + +.fi-media-play:before { + content:'\e093'; +} + +.fi-media-record:before { + content:'\e094'; +} + +.fi-media-skip-backward:before { + content:'\e095'; +} + +.fi-media-skip-forward:before { + content:'\e096'; +} + +.fi-media-step-backward:before { + content:'\e097'; +} + +.fi-media-step-forward:before { + content:'\e098'; +} + +.fi-media-stop:before { + content:'\e099'; +} + +.fi-medical-cross:before { + content:'\e09a'; +} + +.fi-menu:before { + content:'\e09b'; +} + +.fi-microphone:before { + content:'\e09c'; +} + +.fi-minus:before { + content:'\e09d'; +} + +.fi-monitor:before { + content:'\e09e'; +} + +.fi-moon:before { + content:'\e09f'; +} + +.fi-move:before { + content:'\e0a0'; +} + +.fi-musical-note:before { + content:'\e0a1'; +} + +.fi-paperclip:before { + content:'\e0a2'; +} + +.fi-pencil:before { + content:'\e0a3'; +} + +.fi-people:before { + content:'\e0a4'; +} + +.fi-person:before { + content:'\e0a5'; +} + +.fi-phone:before { + content:'\e0a6'; +} + +.fi-pie-chart:before { + content:'\e0a7'; +} + +.fi-pin:before { + content:'\e0a8'; +} + +.fi-play-circle:before { + content:'\e0a9'; +} + +.fi-plus:before { + content:'\e0aa'; +} + +.fi-power-standby:before { + content:'\e0ab'; +} + +.fi-print:before { + content:'\e0ac'; +} + +.fi-project:before { + content:'\e0ad'; +} + +.fi-pulse:before { + content:'\e0ae'; +} + +.fi-puzzle-piece:before { + content:'\e0af'; +} + +.fi-question-mark:before { + content:'\e0b0'; +} + +.fi-rain:before { + content:'\e0b1'; +} + +.fi-random:before { + content:'\e0b2'; +} + +.fi-reload:before { + content:'\e0b3'; +} + +.fi-resize-both:before { + content:'\e0b4'; +} + +.fi-resize-height:before { + content:'\e0b5'; +} + +.fi-resize-width:before { + content:'\e0b6'; +} + +.fi-rss-alt:before { + content:'\e0b7'; +} + +.fi-rss:before { + content:'\e0b8'; +} + +.fi-script:before { + content:'\e0b9'; +} + +.fi-share-boxed:before { + content:'\e0ba'; +} + +.fi-share:before { + content:'\e0bb'; +} + +.fi-shield:before { + content:'\e0bc'; +} + +.fi-signal:before { + content:'\e0bd'; +} + +.fi-signpost:before { + content:'\e0be'; +} + +.fi-sort-ascending:before { + content:'\e0bf'; +} + +.fi-sort-descending:before { + content:'\e0c0'; +} + +.fi-spreadsheet:before { + content:'\e0c1'; +} + +.fi-star:before { + content:'\e0c2'; +} + +.fi-sun:before { + content:'\e0c3'; +} + +.fi-tablet:before { + content:'\e0c4'; +} + +.fi-tag:before { + content:'\e0c5'; +} + +.fi-tags:before { + content:'\e0c6'; +} + +.fi-target:before { + content:'\e0c7'; +} + +.fi-task:before { + content:'\e0c8'; +} + +.fi-terminal:before { + content:'\e0c9'; +} + +.fi-text:before { + content:'\e0ca'; +} + +.fi-thumb-down:before { + content:'\e0cb'; +} + +.fi-thumb-up:before { + content:'\e0cc'; +} + +.fi-timer:before { + content:'\e0cd'; +} + +.fi-transfer:before { + content:'\e0ce'; +} + +.fi-trash:before { + content:'\e0cf'; +} + +.fi-underline:before { + content:'\e0d0'; +} + +.fi-vertical-align-bottom:before { + content:'\e0d1'; +} + +.fi-vertical-align-center:before { + content:'\e0d2'; +} + +.fi-vertical-align-top:before { + content:'\e0d3'; +} + +.fi-video:before { + content:'\e0d4'; +} + +.fi-volume-high:before { + content:'\e0d5'; +} + +.fi-volume-low:before { + content:'\e0d6'; +} + +.fi-volume-off:before { + content:'\e0d7'; +} + +.fi-warning:before { + content:'\e0d8'; +} + +.fi-wifi:before { + content:'\e0d9'; +} + +.fi-wrench:before { + content:'\e0da'; +} + +.fi-x:before { + content:'\e0db'; +} + +.fi-yen:before { + content:'\e0dc'; +} + +.fi-zoom-in:before { + content:'\e0dd'; +} + +.fi-zoom-out:before { + content:'\e0de'; +} + diff --git a/static/open-iconic/css/open-iconic-foundation.styl b/static/open-iconic/css/open-iconic-foundation.styl new file mode 100644 index 00000000..a52637ab --- /dev/null +++ b/static/open-iconic/css/open-iconic-foundation.styl @@ -0,0 +1,1392 @@ +/* Foundation */ + +@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 + + + +.fi-account-loginbefore, + +.fi-account-logoutbefore, + +.fi-action-redobefore, + +.fi-action-undobefore, + +.fi-align-centerbefore, + +.fi-align-leftbefore, + +.fi-align-rightbefore, + +.fi-aperturebefore, + +.fi-arrow-bottombefore, + +.fi-arrow-circle-bottombefore, + +.fi-arrow-circle-leftbefore, + +.fi-arrow-circle-rightbefore, + +.fi-arrow-circle-topbefore, + +.fi-arrow-leftbefore, + +.fi-arrow-rightbefore, + +.fi-arrow-thick-bottombefore, + +.fi-arrow-thick-leftbefore, + +.fi-arrow-thick-rightbefore, + +.fi-arrow-thick-topbefore, + +.fi-arrow-topbefore, + +.fi-audio-spectrumbefore, + +.fi-audiobefore, + +.fi-badgebefore, + +.fi-banbefore, + +.fi-bar-chartbefore, + +.fi-basketbefore, + +.fi-battery-emptybefore, + +.fi-battery-fullbefore, + +.fi-beakerbefore, + +.fi-bellbefore, + +.fi-bluetoothbefore, + +.fi-boldbefore, + +.fi-boltbefore, + +.fi-bookbefore, + +.fi-bookmarkbefore, + +.fi-boxbefore, + +.fi-briefcasebefore, + +.fi-british-poundbefore, + +.fi-browserbefore, + +.fi-brushbefore, + +.fi-bugbefore, + +.fi-bullhornbefore, + +.fi-calculatorbefore, + +.fi-calendarbefore, + +.fi-camera-slrbefore, + +.fi-caret-bottombefore, + +.fi-caret-leftbefore, + +.fi-caret-rightbefore, + +.fi-caret-topbefore, + +.fi-cartbefore, + +.fi-chatbefore, + +.fi-checkbefore, + +.fi-chevron-bottombefore, + +.fi-chevron-leftbefore, + +.fi-chevron-rightbefore, + +.fi-chevron-topbefore, + +.fi-circle-checkbefore, + +.fi-circle-xbefore, + +.fi-clipboardbefore, + +.fi-clockbefore, + +.fi-cloud-downloadbefore, + +.fi-cloud-uploadbefore, + +.fi-cloudbefore, + +.fi-cloudybefore, + +.fi-codebefore, + +.fi-cogbefore, + +.fi-collapse-downbefore, + +.fi-collapse-leftbefore, + +.fi-collapse-rightbefore, + +.fi-collapse-upbefore, + +.fi-commandbefore, + +.fi-comment-squarebefore, + +.fi-compassbefore, + +.fi-contrastbefore, + +.fi-copywritingbefore, + +.fi-credit-cardbefore, + +.fi-cropbefore, + +.fi-dashboardbefore, + +.fi-data-transfer-downloadbefore, + +.fi-data-transfer-uploadbefore, + +.fi-deletebefore, + +.fi-dialbefore, + +.fi-documentbefore, + +.fi-dollarbefore, + +.fi-double-quote-sans-leftbefore, + +.fi-double-quote-sans-rightbefore, + +.fi-double-quote-serif-leftbefore, + +.fi-double-quote-serif-rightbefore, + +.fi-dropletbefore, + +.fi-ejectbefore, + +.fi-elevatorbefore, + +.fi-ellipsesbefore, + +.fi-envelope-closedbefore, + +.fi-envelope-openbefore, + +.fi-eurobefore, + +.fi-excerptbefore, + +.fi-expand-downbefore, + +.fi-expand-leftbefore, + +.fi-expand-rightbefore, + +.fi-expand-upbefore, + +.fi-external-linkbefore, + +.fi-eyebefore, + +.fi-eyedropperbefore, + +.fi-filebefore, + +.fi-firebefore, + +.fi-flagbefore, + +.fi-flashbefore, + +.fi-folderbefore, + +.fi-forkbefore, + +.fi-fullscreen-enterbefore, + +.fi-fullscreen-exitbefore, + +.fi-globebefore, + +.fi-graphbefore, + +.fi-grid-four-upbefore, + +.fi-grid-three-upbefore, + +.fi-grid-two-upbefore, + +.fi-hard-drivebefore, + +.fi-headerbefore, + +.fi-headphonesbefore, + +.fi-heartbefore, + +.fi-homebefore, + +.fi-imagebefore, + +.fi-inboxbefore, + +.fi-infinitybefore, + +.fi-infobefore, + +.fi-italicbefore, + +.fi-justify-centerbefore, + +.fi-justify-leftbefore, + +.fi-justify-rightbefore, + +.fi-keybefore, + +.fi-laptopbefore, + +.fi-layersbefore, + +.fi-lightbulbbefore, + +.fi-link-brokenbefore, + +.fi-link-intactbefore, + +.fi-list-richbefore, + +.fi-listbefore, + +.fi-locationbefore, + +.fi-lock-lockedbefore, + +.fi-lock-unlockedbefore, + +.fi-loop-circularbefore, + +.fi-loop-squarebefore, + +.fi-loopbefore, + +.fi-magnifying-glassbefore, + +.fi-map-markerbefore, + +.fi-mapbefore, + +.fi-media-pausebefore, + +.fi-media-playbefore, + +.fi-media-recordbefore, + +.fi-media-skip-backwardbefore, + +.fi-media-skip-forwardbefore, + +.fi-media-step-backwardbefore, + +.fi-media-step-forwardbefore, + +.fi-media-stopbefore, + +.fi-medical-crossbefore, + +.fi-menubefore, + +.fi-microphonebefore, + +.fi-minusbefore, + +.fi-monitorbefore, + +.fi-moonbefore, + +.fi-movebefore, + +.fi-musical-notebefore, + +.fi-paperclipbefore, + +.fi-pencilbefore, + +.fi-peoplebefore, + +.fi-personbefore, + +.fi-phonebefore, + +.fi-pie-chartbefore, + +.fi-pinbefore, + +.fi-play-circlebefore, + +.fi-plusbefore, + +.fi-power-standbybefore, + +.fi-printbefore, + +.fi-projectbefore, + +.fi-pulsebefore, + +.fi-puzzle-piecebefore, + +.fi-question-markbefore, + +.fi-rainbefore, + +.fi-randombefore, + +.fi-reloadbefore, + +.fi-resize-bothbefore, + +.fi-resize-heightbefore, + +.fi-resize-widthbefore, + +.fi-rss-altbefore, + +.fi-rssbefore, + +.fi-scriptbefore, + +.fi-share-boxedbefore, + +.fi-sharebefore, + +.fi-shieldbefore, + +.fi-signalbefore, + +.fi-signpostbefore, + +.fi-sort-ascendingbefore, + +.fi-sort-descendingbefore, + +.fi-spreadsheetbefore, + +.fi-starbefore, + +.fi-sunbefore, + +.fi-tabletbefore, + +.fi-tagbefore, + +.fi-tagsbefore, + +.fi-targetbefore, + +.fi-taskbefore, + +.fi-terminalbefore, + +.fi-textbefore, + +.fi-thumb-downbefore, + +.fi-thumb-upbefore, + +.fi-timerbefore, + +.fi-transferbefore, + +.fi-trashbefore, + +.fi-underlinebefore, + +.fi-vertical-align-bottombefore, + +.fi-vertical-align-centerbefore, + +.fi-vertical-align-topbefore, + +.fi-videobefore, + +.fi-volume-highbefore, + +.fi-volume-lowbefore, + +.fi-volume-offbefore, + +.fi-warningbefore, + +.fi-wifibefore, + +.fi-wrenchbefore, + +.fi-xbefore, + +.fi-yenbefore, + +.fi-zoom-inbefore, + +.fi-zoom-outbefore + + font-family 'Icons' + font-style normal + font-weight normal + font-variant normal + text-transform none + line-height 1 + -webkit-font-smoothing antialiased + -moz-osx-font-smoothing grayscale + display inline-block + text-decoration inherit + + +[class*='fi-'].oi-align-center:before + text-align center + + +[class*='fi-'].oi-align-left:before + text-align left + + +[class*='fi-'].oi-align-right:before + text-align right + + + +[class*='fi-'].oi-flip-horizontal:before + -webkit-transform scale(-1, 1) + -ms-transform scale(-1, 1) + transform scale(-1, 1) + + +[class*='fi-'].oi-flip-vertical:before + -webkit-transform scale(1, -1) + -ms-transform scale(-1, 1) + transform scale(1, -1) + + +[class*='fi-'].oi-flip-horizontal-vertical:before + -webkit-transform scale(-1, -1) + -ms-transform scale(-1, 1) + transform scale(-1, -1) + + +.fi-account-login:before + content'\e000' + + +.fi-account-logout:before + content'\e001' + + +.fi-action-redo:before + content'\e002' + + +.fi-action-undo:before + content'\e003' + + +.fi-align-center:before + content'\e004' + + +.fi-align-left:before + content'\e005' + + +.fi-align-right:before + content'\e006' + + +.fi-aperture:before + content'\e007' + + +.fi-arrow-bottom:before + content'\e008' + + +.fi-arrow-circle-bottom:before + content'\e009' + + +.fi-arrow-circle-left:before + content'\e00a' + + +.fi-arrow-circle-right:before + content'\e00b' + + +.fi-arrow-circle-top:before + content'\e00c' + + +.fi-arrow-left:before + content'\e00d' + + +.fi-arrow-right:before + content'\e00e' + + +.fi-arrow-thick-bottom:before + content'\e00f' + + +.fi-arrow-thick-left:before + content'\e010' + + +.fi-arrow-thick-right:before + content'\e011' + + +.fi-arrow-thick-top:before + content'\e012' + + +.fi-arrow-top:before + content'\e013' + + +.fi-audio-spectrum:before + content'\e014' + + +.fi-audio:before + content'\e015' + + +.fi-badge:before + content'\e016' + + +.fi-ban:before + content'\e017' + + +.fi-bar-chart:before + content'\e018' + + +.fi-basket:before + content'\e019' + + +.fi-battery-empty:before + content'\e01a' + + +.fi-battery-full:before + content'\e01b' + + +.fi-beaker:before + content'\e01c' + + +.fi-bell:before + content'\e01d' + + +.fi-bluetooth:before + content'\e01e' + + +.fi-bold:before + content'\e01f' + + +.fi-bolt:before + content'\e020' + + +.fi-book:before + content'\e021' + + +.fi-bookmark:before + content'\e022' + + +.fi-box:before + content'\e023' + + +.fi-briefcase:before + content'\e024' + + +.fi-british-pound:before + content'\e025' + + +.fi-browser:before + content'\e026' + + +.fi-brush:before + content'\e027' + + +.fi-bug:before + content'\e028' + + +.fi-bullhorn:before + content'\e029' + + +.fi-calculator:before + content'\e02a' + + +.fi-calendar:before + content'\e02b' + + +.fi-camera-slr:before + content'\e02c' + + +.fi-caret-bottom:before + content'\e02d' + + +.fi-caret-left:before + content'\e02e' + + +.fi-caret-right:before + content'\e02f' + + +.fi-caret-top:before + content'\e030' + + +.fi-cart:before + content'\e031' + + +.fi-chat:before + content'\e032' + + +.fi-check:before + content'\e033' + + +.fi-chevron-bottom:before + content'\e034' + + +.fi-chevron-left:before + content'\e035' + + +.fi-chevron-right:before + content'\e036' + + +.fi-chevron-top:before + content'\e037' + + +.fi-circle-check:before + content'\e038' + + +.fi-circle-x:before + content'\e039' + + +.fi-clipboard:before + content'\e03a' + + +.fi-clock:before + content'\e03b' + + +.fi-cloud-download:before + content'\e03c' + + +.fi-cloud-upload:before + content'\e03d' + + +.fi-cloud:before + content'\e03e' + + +.fi-cloudy:before + content'\e03f' + + +.fi-code:before + content'\e040' + + +.fi-cog:before + content'\e041' + + +.fi-collapse-down:before + content'\e042' + + +.fi-collapse-left:before + content'\e043' + + +.fi-collapse-right:before + content'\e044' + + +.fi-collapse-up:before + content'\e045' + + +.fi-command:before + content'\e046' + + +.fi-comment-square:before + content'\e047' + + +.fi-compass:before + content'\e048' + + +.fi-contrast:before + content'\e049' + + +.fi-copywriting:before + content'\e04a' + + +.fi-credit-card:before + content'\e04b' + + +.fi-crop:before + content'\e04c' + + +.fi-dashboard:before + content'\e04d' + + +.fi-data-transfer-download:before + content'\e04e' + + +.fi-data-transfer-upload:before + content'\e04f' + + +.fi-delete:before + content'\e050' + + +.fi-dial:before + content'\e051' + + +.fi-document:before + content'\e052' + + +.fi-dollar:before + content'\e053' + + +.fi-double-quote-sans-left:before + content'\e054' + + +.fi-double-quote-sans-right:before + content'\e055' + + +.fi-double-quote-serif-left:before + content'\e056' + + +.fi-double-quote-serif-right:before + content'\e057' + + +.fi-droplet:before + content'\e058' + + +.fi-eject:before + content'\e059' + + +.fi-elevator:before + content'\e05a' + + +.fi-ellipses:before + content'\e05b' + + +.fi-envelope-closed:before + content'\e05c' + + +.fi-envelope-open:before + content'\e05d' + + +.fi-euro:before + content'\e05e' + + +.fi-excerpt:before + content'\e05f' + + +.fi-expand-down:before + content'\e060' + + +.fi-expand-left:before + content'\e061' + + +.fi-expand-right:before + content'\e062' + + +.fi-expand-up:before + content'\e063' + + +.fi-external-link:before + content'\e064' + + +.fi-eye:before + content'\e065' + + +.fi-eyedropper:before + content'\e066' + + +.fi-file:before + content'\e067' + + +.fi-fire:before + content'\e068' + + +.fi-flag:before + content'\e069' + + +.fi-flash:before + content'\e06a' + + +.fi-folder:before + content'\e06b' + + +.fi-fork:before + content'\e06c' + + +.fi-fullscreen-enter:before + content'\e06d' + + +.fi-fullscreen-exit:before + content'\e06e' + + +.fi-globe:before + content'\e06f' + + +.fi-graph:before + content'\e070' + + +.fi-grid-four-up:before + content'\e071' + + +.fi-grid-three-up:before + content'\e072' + + +.fi-grid-two-up:before + content'\e073' + + +.fi-hard-drive:before + content'\e074' + + +.fi-header:before + content'\e075' + + +.fi-headphones:before + content'\e076' + + +.fi-heart:before + content'\e077' + + +.fi-home:before + content'\e078' + + +.fi-image:before + content'\e079' + + +.fi-inbox:before + content'\e07a' + + +.fi-infinity:before + content'\e07b' + + +.fi-info:before + content'\e07c' + + +.fi-italic:before + content'\e07d' + + +.fi-justify-center:before + content'\e07e' + + +.fi-justify-left:before + content'\e07f' + + +.fi-justify-right:before + content'\e080' + + +.fi-key:before + content'\e081' + + +.fi-laptop:before + content'\e082' + + +.fi-layers:before + content'\e083' + + +.fi-lightbulb:before + content'\e084' + + +.fi-link-broken:before + content'\e085' + + +.fi-link-intact:before + content'\e086' + + +.fi-list-rich:before + content'\e087' + + +.fi-list:before + content'\e088' + + +.fi-location:before + content'\e089' + + +.fi-lock-locked:before + content'\e08a' + + +.fi-lock-unlocked:before + content'\e08b' + + +.fi-loop-circular:before + content'\e08c' + + +.fi-loop-square:before + content'\e08d' + + +.fi-loop:before + content'\e08e' + + +.fi-magnifying-glass:before + content'\e08f' + + +.fi-map-marker:before + content'\e090' + + +.fi-map:before + content'\e091' + + +.fi-media-pause:before + content'\e092' + + +.fi-media-play:before + content'\e093' + + +.fi-media-record:before + content'\e094' + + +.fi-media-skip-backward:before + content'\e095' + + +.fi-media-skip-forward:before + content'\e096' + + +.fi-media-step-backward:before + content'\e097' + + +.fi-media-step-forward:before + content'\e098' + + +.fi-media-stop:before + content'\e099' + + +.fi-medical-cross:before + content'\e09a' + + +.fi-menu:before + content'\e09b' + + +.fi-microphone:before + content'\e09c' + + +.fi-minus:before + content'\e09d' + + +.fi-monitor:before + content'\e09e' + + +.fi-moon:before + content'\e09f' + + +.fi-move:before + content'\e0a0' + + +.fi-musical-note:before + content'\e0a1' + + +.fi-paperclip:before + content'\e0a2' + + +.fi-pencil:before + content'\e0a3' + + +.fi-people:before + content'\e0a4' + + +.fi-person:before + content'\e0a5' + + +.fi-phone:before + content'\e0a6' + + +.fi-pie-chart:before + content'\e0a7' + + +.fi-pin:before + content'\e0a8' + + +.fi-play-circle:before + content'\e0a9' + + +.fi-plus:before + content'\e0aa' + + +.fi-power-standby:before + content'\e0ab' + + +.fi-print:before + content'\e0ac' + + +.fi-project:before + content'\e0ad' + + +.fi-pulse:before + content'\e0ae' + + +.fi-puzzle-piece:before + content'\e0af' + + +.fi-question-mark:before + content'\e0b0' + + +.fi-rain:before + content'\e0b1' + + +.fi-random:before + content'\e0b2' + + +.fi-reload:before + content'\e0b3' + + +.fi-resize-both:before + content'\e0b4' + + +.fi-resize-height:before + content'\e0b5' + + +.fi-resize-width:before + content'\e0b6' + + +.fi-rss-alt:before + content'\e0b7' + + +.fi-rss:before + content'\e0b8' + + +.fi-script:before + content'\e0b9' + + +.fi-share-boxed:before + content'\e0ba' + + +.fi-share:before + content'\e0bb' + + +.fi-shield:before + content'\e0bc' + + +.fi-signal:before + content'\e0bd' + + +.fi-signpost:before + content'\e0be' + + +.fi-sort-ascending:before + content'\e0bf' + + +.fi-sort-descending:before + content'\e0c0' + + +.fi-spreadsheet:before + content'\e0c1' + + +.fi-star:before + content'\e0c2' + + +.fi-sun:before + content'\e0c3' + + +.fi-tablet:before + content'\e0c4' + + +.fi-tag:before + content'\e0c5' + + +.fi-tags:before + content'\e0c6' + + +.fi-target:before + content'\e0c7' + + +.fi-task:before + content'\e0c8' + + +.fi-terminal:before + content'\e0c9' + + +.fi-text:before + content'\e0ca' + + +.fi-thumb-down:before + content'\e0cb' + + +.fi-thumb-up:before + content'\e0cc' + + +.fi-timer:before + content'\e0cd' + + +.fi-transfer:before + content'\e0ce' + + +.fi-trash:before + content'\e0cf' + + +.fi-underline:before + content'\e0d0' + + +.fi-vertical-align-bottom:before + content'\e0d1' + + +.fi-vertical-align-center:before + content'\e0d2' + + +.fi-vertical-align-top:before + content'\e0d3' + + +.fi-video:before + content'\e0d4' + + +.fi-volume-high:before + content'\e0d5' + + +.fi-volume-low:before + content'\e0d6' + + +.fi-volume-off:before + content'\e0d7' + + +.fi-warning:before + content'\e0d8' + + +.fi-wifi:before + content'\e0d9' + + +.fi-wrench:before + content'\e0da' + + +.fi-x:before + content'\e0db' + + +.fi-yen:before + content'\e0dc' + + +.fi-zoom-in:before + content'\e0dd' + + +.fi-zoom-out:before + content'\e0de' + + diff --git a/static/open-iconic/css/open-iconic.css b/static/open-iconic/css/open-iconic.css new file mode 100644 index 00000000..301a138c --- /dev/null +++ b/static/open-iconic/css/open-iconic.css @@ -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'; } diff --git a/static/open-iconic/css/open-iconic.less b/static/open-iconic/css/open-iconic.less new file mode 100644 index 00000000..d505e9f2 --- /dev/null +++ b/static/open-iconic/css/open-iconic.less @@ -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'; +} diff --git a/static/open-iconic/css/open-iconic.min.css b/static/open-iconic/css/open-iconic.min.css new file mode 100644 index 00000000..1f6afb82 --- /dev/null +++ b/static/open-iconic/css/open-iconic.min.css @@ -0,0 +1 @@ +@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:400;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:400;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'} \ No newline at end of file diff --git a/static/open-iconic/css/open-iconic.scss b/static/open-iconic/css/open-iconic.scss new file mode 100644 index 00000000..e03d979f --- /dev/null +++ b/static/open-iconic/css/open-iconic.scss @@ -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'; +} + diff --git a/static/open-iconic/css/open-iconic.styl b/static/open-iconic/css/open-iconic.styl new file mode 100644 index 00000000..f541bc2d --- /dev/null +++ b/static/open-iconic/css/open-iconic.styl @@ -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' diff --git a/static/open-iconic/fonts/open-iconic.eot b/static/open-iconic/fonts/open-iconic.eot new file mode 100644 index 0000000000000000000000000000000000000000..f98177dbf711863eff7c90f84d5d419d02d99ba8 GIT binary patch literal 28196 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 f%X4~$E_2;^J#ifP;CI~=<%5iE_!YyhznS + + + + +Created by FontForge 20120731 at Tue Jul 1 20:39:22 2014 + By P.J. Onori +Created by P.J. Onori with FontForge 2.0 (http://fontforge.sf.net) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/open-iconic/fonts/open-iconic.ttf b/static/open-iconic/fonts/open-iconic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fab604866cd5e55ef4525ea22e420c411f510b01 GIT binary patch literal 28028 zcmdtKd3;;feJ6U)xmZaM3$bwn2@oW}1>CTclqiYRLQA$5Y6)oBGM7s&UL;16CB=~) zH%=W_6UVZgVeQ0|xQgR(6Hfyvk(0O_J9V>Qn%H&oG)e0>@i>{hWS-onNvmm7eN1S+ zzjH1~P?8h3Z~l59fphM;=bq(ve&@HJt1v}T9Lj@=s?4rmzvGs>e#M?e$-DSAY}wuu zPnxz(DGIB>^~Cf&le3EBXMcd}6Zj5KA3GXEIX;t*;HP5m?7n+mKJ@c`Tz^VYD(~Jm zd1MylPFz2T)UxmH5A7ZOe}4HVio)j=WvpiZ%%sNt@lV$&%8rY;pWcrG(tJLATS5ef5?>;m=`T3U~TdOF!ucQC(+%tJ%mOWkhLq)lj+7BL_yl3W< z|K$8OuAf04Cua{GIr?|bL{U+0Z%`D&^z7l8*&pAf{=TBzgX+qM@uk@--(Pw5FDd=Y zzv;PiF*WcaJFOVej)kLlWmcx_K_#l7Hdl-))s-Jiaq+Wt?>bHS=G)5KZ>d2Pj^cL) zspv_s6cktVJbfGVdn<57wHg$I5=3giAFkhi>*`hfDp#)t<$c^@rlkfMM*)4yKjpoZ zm;e7O&j~k_zvW&)&a7B2n1DOHt25zBxS|PHxb6pE|LkYEcj28n_7e#qH3-ZzD|Xba zuyCr&LatB>-zH{GA;V(qa?!?47iYCXp*YJ<^ZA9f8oR8`&1u?oZB#99!|V;=FIv_H zHB=}yp=sKjTsBRN!=aeIVp3RFXLZmQUKG&EInIE&niKmm!2v$!20ko9;D~#VS11nc$`+=KtG~yf>$N>ebwp;yRE`v zGH}Jv)#<|c{rH;oR1LoSw#IV{&!ba4$LBE(`n=!v1WX7n_@h>+xl&r**uQ0L1!}B7 zt%+QDbF_1>eooBQh?%++pHi_R?rNvaVp0_&7C-Jcx2Da0VHnH(`yji@Q4AK*~y%C}@R$UciWpw&Fz=BN&REs|Hb5 z;$@}9KzIq9aGHV#O5h8E}wr4JV`QcE{(tKyortc-Ac zv8~hc$>PQ3trZG48duddZHX0S*S59PQlWs6zK{7a+O3K5cJSm-tA>$kafivtXzwF&by768I+`}rql(K|3%uZ`sLDML~eis`agzI^b!&%^)q#exy z{uPQ>X;RvWcC-W=e9lS}(GIuYlzx?4YHksgUImQXzoMzdf+Q*$Kg_9fyOSJZs$*<<+E(%oGdnwYpO{(HB(_-7zv zf{W|>&!PC0imz2WsU5X!4}vIr{4C;UXb`h{hi!c4o#Kn{u+t~=S@!wOPZV$8Jb5y& z2B{D?Kb}81xtV=Fdw=ovEV7czOS)@RtV$L75Hy$i0P=${%0+O6L9*X{n_ULtT`Uma zcpe2nR-kN&c4Mx7aJ`5UC-`?oL-n;aHU{{!w7-%2v5+p0DI98!q+H=t!kzY;Lk8jw z9$!4Yk|kTp^6XKUi`{*~_MqmmFZ`|Dqdj=ZUUQlSi+|q{2y_IPLnLaD+1c-X(xDa4 z*gYOQJE*Z**8?vU0$$A%qWMuB6`;a#{Ho zt(sfqBHoMjtCFy>n+Y~b9K*m+LKs3S=}r*hvY}^>Jv{vG+rtlQg~72wVC>ju4rR7% z$sGF3*uqQggM&0jfww#&+H;~s;H}GHHxf>{6Grf~aLOFbL^J-3H)Hl@=HhJ6PkvH7 z8{f2PZf?^i$TM?l@X8ZUUAdwcfOZf$EZYxWC7`sT-KIvruTtPDUw=L zK&%PU2IwJhOkYnG7;3ptY2dV;w43plfJ`Z{ovO3g_gK62-G8vEK~3AYZ{eI3GQtww z@naTIz&YGdTO;7iFb!-NY#O#Y?0Lu^g&BK5+2eYB9kt&Chy zfn`Q4M6*FP82LQSjArinLqVwK=$geu>6<*q=jB~2_&j$6Ca}PZ|3b3InB*GPsR8WC zdaR*a?n&0fd}iig5CvB;D?tY9&>S72HQ@i#6f+u&|KzB3ZAsgz*zsapcJtE*H?CND z(=BR1jTz0wKd7>$x43E@tfF{qbN1lV&EbE1ts7D9GGDu?OG5h7FYwkgf$VxLUl*#P#m;wC zHy9Wj9BCPLIK2U%W3wr4q*}&xM$b{3ll^&h&^+u5hcn=JN7hh-m1 zUgY!Eg_o@Ci6@G-`&Hk0cZbvNW=`vi*luVYA0ZEs-s1)rt%np7R@|$dpbgX{mqGDrvr8pyH$VUJ#p{eOwmGZp&nc8YPIm z*Gqe^tGyMQPwYJa8z?`>2;_3sX zzCdyw-DiScxfm(eg1j!u3zB9pwPDrk6lbXw+0Ifwq8%#>vD54{>7}xcq{~ehO9(P< zALw#-N2Ix$ldJ~$!4UT~G4MeLq#}SSf<4y5q~rirF2v3jJ*|iQU?^1886#}I!lG_d zy_LnY6<*bzuBw=0M&@l~+a$}X0^=JH6Hh1O9908c; zM24g{$zMn|S**+aX1^KBA#1BaN`;`eysqH2ZYzW2g4@MeR3kJH8QJdA7^F_c%u#cc zmXKPcMWmFrIxV;^*H-~nwrliPJmz0iUom!V^aVD&sCQ=N^)>B~OnXf`8B7acfS?sM zmz3BmqjPhm|D_g7CAdXH6XO%~$OS3Oav@MHWMv=`v3~r7K+uWp8xx>F#1a-+V=~Qv zF`Fvw#f$dJO~t?4#4h8)Ub%1#ziJRv9mOb#dp8scdT}K`RcWVwm*fsJ=wJ=-+Y5Wh zGJU7C+glS}pWhtmVI_r!+kTVJ|0Z8Nt2IYPTY8;k8V}vL`9e!*w5``x2K!p@dCP@J zqnH~wX@C(UGlzwx3v(o{l^9}fkQ-uq0ZwKx(D*cab^n>pe(Nic3yZ&MI5y^bY@=#m zChiT)6$*16H3+kob7x;&O`PP)cwb`d*sjCS9UuZw1#tWlj0FyOKb%#EBWezp zhTw;O0^xfl3+sJ9S}43FdcO5a0lN@{qts`ip!YX)1!5)OjlKwvrS4OW{UP*~#rX;) zLrhdQof|3+jUA&&@p;+iP!1Gv*WqPju2dQ^X0J`?3GTQb93RXd05g{0xYX{I58ra< zxsHL3+B2+|0JqcwWX>adoK4B}{xgMZ`yyPBV^*P;I)DpR6~ul(>sW%pJYe>Rqpbslp0X^vu63MFpo-IU6@N$SCoJNeMx8o)D97z!m@tlv(mI$ z_AG!vnmwd~S*c6Nr=`uUyzkPujZ5P;`h{gy@;nS%@0}F40_I7`LvmCU{JmdUsjOGF zD6ZA^jT?rC1_x4ou{Mulf>DEz2bSiv6fL2=39bdS7w9i&4y4JXSQw%|!el_I9Z4Q$ zDG01&A!rFgAP3Afg8NXMc4GO(m%!D$adxC5fK3AAxq__%vqFqG8iev2JRu*qp@Q62 zfsQZ1C?)F0siXs&TJQ_8rz^0}Objx#D+!&*3+C6HBEhQw1xxi?E8e|SfZ(UwmBEXM z-nk+5LH4QfkP#RTmL(%kiReXDqq~HZ*U&u@<+Kk8UVSa)6Kpn4BkiDNptUIDJ=SY@ zkBcBzYMiV{WwxV*=RsldIPBMY8zuXlUxEGF<1E?hVZYXuO{sF?wJ0zat_j%kx*L8!tfj+p%JQRk~3}w^rf?yJY zV*aWYrv`*%%l5>JXW1UopyOI`2*sdC8Wo|OnqPt!t+O9|CrR+?>x$HS#99MhC8K(2 ztxNDSC)1fhPHLFk45>^sQo2`KrV{UaMSyb7V^>v+&%V1B#*MK-)2&Wo$pGuMh#??- z+z~K1Z#9v)+g`idzW#bVq1{gMoUr|qNgVcP>@oPGNQ;2&gN*d=zAY>uP$%G?qB$?& znJS(q+O69ljM647X$7?cVnO&T+z#}dTz3P!v*_0-o^!(wrnZ&|G}6Dq_LPY(g6PNI zDl5^)A=|6O>OzmUsWc9Nn`{cOo`#dH{)|vzg>p(T)qv(28GVPgfc0(R^Y45C`{3jk z>T)^vff3@4BL`@XVqJxtWK=AQ4deCDx>mdFRTV_l$&Uk@0RAA#w-SjGUnp%cc6wng zBttUz3)V#z9g-ypia;Rj1pHGUpea|MCNrcm2%6F;>`Bn~;(lO%I2D0PEi9;hV_O|{aD zG1j=HZ0Bz@2u7Al4yhUFui#VCE=icjV$D@;{Qkf@_DBwYjSE z@S!s+2@6-AIdr(Qs<<)W9Xp22I@sW81Nda{lRBinMQvcmvc4D} zLItj=PwpZ>n%0P559kRR$zm|JUk0@#-)zO#%47#`7_zwdl2=Xt!c9Pe*D}}|AjerQ zSP+{a>434-Yiz}?7I-fQ38W)|0rEo`T{eJzko;$_w15_n{Aa|Ner3bK;auwcn7 zxeVbVCyG*_N#y3{=jP@k*ikeVv6rAH&cn8{Xj_C90qGUeiw7c17z>i|lF2F>$|NGG zFl^?G=caFSZhrNtCbr30Jnv@h&bMy;*x_A!?!5cO^i{?EZD*nOm1baR{Lbv5ag7`~ zoA1lsvs+u;qCND-)US|#M873|N!As}KR)pK63>MEvy5i~s2TlB_7w8{(;Aj&1IcNN zAM~-r$Nn{PC0fHWl|TF5vZ0hKf0u0d-g2pwEq|L_`u^ogj2cV2#AB?2SJ*2o0=ED* zL{5Nvli2|hJ;Dug8es@&;u^Geaw7soNFmp*NZ3jGRS(Qa0oVHAJ**PA7H>2(F}oq$ zOy-CoQ%U@a#>sm~*h2PD$fRlZM11<@b$u;XtI5A**Td^JeEhZzE|+R+?;gEHdq^0b z3Ki820dJ#Sa9chfO08aR_L^Y{2RpcEEkB)iT#W{No=m1waKkbWTZrM=(#$fcZch%=s7o$M7zP?Z2(a; zB$=R);Sl8umil$6&d!xy{U7 zTUQUS8Qxr6ke7R>^aAXYC7e;gu_0d=q+9}5vm3<^{F*cC(ti4K+YnD2cX6hz4P z!uKNNd&!H<2{pmgL?(!72E_9eo zSG~XB4RmEhJ~vdTc1F5Iz6)NG+)&>wj$`oJ3_5Pd}~f^(Nh*@hrj7 z1gjn9B;`XFAPDnS$e(eAGO&FCD06e{GT<^xUOjOsFK*CArCIO>xBjqf3eVHCV)IgC z)Cd(6FN(%!EKBsu49#*U_V2b0(dBldRNYQLU(#_1KMyUGDW*?jv_%{gXX~s6RWmv zu4+v?2YNR>)Xx2Z#@@bq#+n*kRaHjMTE^5$lUwb7HQaAh(-zfgc3OR~RF&doVs1y+ zYOwn~7HDPFBkNgnMPpjER{0JDeIo;&8ne5-(Gd%^RaRHkR(Sm;V`Y`On!E3*XtG(D zN%d5jDt&6Cd~JwZQ#_fJ-TjR0kx*c~A^yrF#gUQwv1DUFM*E(|dMFi}xyUNZGLT0Id4ixx*U!xSYmhON8Q9@Isb_MOI zQfk3JD!$fO=e3)Nzajpi%y{b(9$e{YDJi0EKIaBSdfpp=|29`w<6gMa%?EXb(p|hj z1d45PlmE8(mfL+nS0HtI1^h{XUeyu3f_MXOgizX{x1_`sI)|1btjHi?WVtC_kpmw- zwit{nag?!sX^y-0lUF8{0{=MR_U%(oxug#5u4*_^P~05cHzr zYmrc$uR`El99|uAB#`Sm5{0vh#o}=cSo9X ziN3x>U{y!QDt1I90Tl4u>VbjPC!RT>C)$dwE0VpvN%|ry;iJc6k^JP7G_m9uGYQ5i z42LNMx?n_*M~Dds3jtGw%WxJZM4&fb^Xc-Z&@90ZE#n}xH|H^K?F2PgiU8cPzG*X;t<{~s@Ewc#f%^JAcM5Di|8`8 zt)i0RFNzmsgatb-<1vb}%dhXOu5I)p%B$7pyVM&>MF{e|PB~fa2F@KDSj3l;*s{#GqTM7HF%D=1OirTVkeS`pN&nEGQGf zH<%OJD%}g%OE8$*N;K~M+ek?Ek@QZ=K{797A#g_8M^L@QFL6qlBUVX~c4TH2DRftS z1b-$Ond~tXaYJ&gcXf4ltPN6Z17uhyqG1h+MJQWB&(EN5FpJ-r7h+IAP&slo!ADEf z^Tt`kgNZ7TUv8XYs6w97>53j_Vr6P8kqpd!*b?5bt9S~%0;F7}5P?W(7@-wX9l%d=znfr%CJ4UDvf z0&J@Ey?1+whJ!}P_Nt|w7QO*-LIrHK39dq6`Js5_95n~<#OEk<95W@!_{x=n7RMK2 zd8s`CD?jlZ8z-IvKWGYV0Z@q$6U`BC@J7k43WpDZLn-k5GBQOQAcsyg#4r*Ipio9c zP+$$N7F9%~gOi2PZd0A$HRN;fm=U9+Z&pMvM508voY3C|NIgC}UlXe^X}0PW9j;EB zW;EY2{`hNb&z+~i*UqTH*B;-s)r8xfu8tMeHqBsd#}mbSPv42dG;f?)T7UHI6#fpc zOW2-;t-#I^I0!>aiG{+{EbLCg0>xx-lp4&R%$|PWU@&Owy#L-OvL|mAf~roRAr4^Y z_z~mXO}wZx+En9mn8_apw4m8}L#<#dTp$Ta(Oj@2*=@;o21_yny8b=XdlV?<*`^&veDfVWp&KJeGyLt_=znKkl`P~Kc#4@ z499g_ddY_YQ55{%%4XPZk^pu>Y4Mg>6C}e||^>sa*Z2KnZ52N|HnG0$F z`G&|dLRS0Ictm~a3n*_t;UX(CV)#q#-_~f>Ap_1oY%e$hAj8a(^$`M0)JOvzCB)@7lNe+IIY1- zo=lq;gL3r412BA%8V3g(5H3WXE?B&%CiB@X!h+g;(Ew(SARSWTIs%W~6~~^P9c+)^ z^_Yjx8wT4Ah*(CPG7k;>8HMV^Nv9KvU;N;6)priIw-4S~{oKL04BsKRE&4jp z09c=gfI(1c!91En)k2qA3?+ukYH6&bZ%DawSqSkJ5R`@I5i5=O1kY9(I9#+r45iUP zB*og3@Clru@mxKxR$w12o=IT3g<2?Bpk~bJyY$?eRc&v4^tnq<^7&P3p1b5b@#LlF zKKcgmhVVezd;C~u8|f(wVMmD+h#?X>0T}j1$-^FId&mw4vM2uWBWPghg3?lZ0&fCn z&neo2W=)zNoR=wsdFjG6WPs_B;xzpA#sBsDdd}d?wo2 zxy~oXeDy!@moVoT`iN2=iZp{$KdYD@q7d+772=l>3u#7Jq#sw@4>KUdK*s*)*};K< zD=qs*TPD`sYBt+z%vTy%Ah5Hscqz^j$umjo(RKH4{n;~HnGa{`Ag*0*8Qs@1xo!{K z>rTr*H*RZ0%vka7lBW~Nr0s*K`pnO^GN+^oa?hy3My}H&3Nk`qUpOUBgK5&b3{E6+ z1b$sN1C6!8lia9u5RHvA)p}i3A|8Yh5rQ&ArxZ2i&@$Pmg~)GS)XhrwQ{d@{8!^!554>LAvO5K>rXuKdhv6bW;n7<)3zPK z9EB}PoDri~XFAj55uweCwy3afX9&4U5x#ErIu1m|-LNbCo{*2!V9DHo01S3noRFa4 zmL)qd+1Y()yBa6JRO!b-=tdf_B0aA;%39@dFt(?zrud^7*7o2FuRZ?ZY33~M`@4&2 zoCQ&fM_Bv5JKe87^!RJrnDehLUF^7Ty>8dJ`m~_0!iPw9on>ct#GZDUqb^B=WcclE zLQ5i36wFmZR>(p~#lDuOb@Vej1qc+vdV-@T(1@19Uc_KX*q1^@T3xM+_Gpm*MLTjc z2(jGH%jq^$TTovd-6P$T4r}T*LK2IFu@GcS@Ed6>R7H$mjpV0v3QWbukrt99M3;=z zIfCS4%8*R`;85Eh$RNqC)}hGI=xfEdUIQvYJY~w}rcL+JVc)@h;ik<^eW%ABf9X5yRtP?g%n=#HJ^ukG6EmyxUY=0CxJ|y&w}&`CR3b!1<_R2-3!m}wu(y%k+T+m zZY>n7tj>zrP}_RkjV>F=*m{c3SoFD4e1=87T0&n67J{Z=6Q)_163G85zB0H_ z(Au8}+P-+khxyz%%_9z{L=g$8nz%U7zo^<6@lATSdmFMx z=dG$^7oYz?@vE($YK=UsHGF;dO)NW7{HKxJpJ>gdK2|UKk!QvFLEoBmTqB7Jhkz08 z;EiX7I1r9d8V5om&}x$?k_S_^Uem`#Y=r0kg^X z3srSmOE<*@&%MXpYait~Q35z~@=dZ|1J0yBSuS+P9D>(@7K@?U4HT;ads=450zws` zlRP+siGytb_CG(cX0WrP*tznTr1iQwGKO|lpKDWheV}UV-mO)E z`u?^Qh11sQ;s<08&r4-__E|l6m~NEfcoSQzI+C`&Rjc}J%>y@!_+c9fCBocXAf``O z((HmO!?LTgy-zes*t$ul2_w{1@^hTkF~i86N+8%3NGkltgNSp$Vf?4QZ1NQfwcWwz zoJS=im`4^#ef% z$Fjp-9N{ieN`jAgn#Q)oYbum#!N+`Vd!;zz=!zSB)!2%>C5-TE3Nu5Bt$3ET|L`M) zXNrIO?CUI2`11W@$1sSG{IK|=v(GZmGg|S@*YE$bb_|;Hk{nP0nn*DTz};Yj-$Q{( zz+HFTK<#&Pvt}$20%^zDIukuy*M=p+L9mCer!h%P-&e-=Dcd zd-&&%Ja*|rBpHlgj|u+pQLG^Fgs0ZF-fP0 zO@ev6y&&wQSBe*fbS*A;q+Og71>FE3$v#kx^PGr*cUK6y0jdBVRWixKEt3ur`eK8^ zZLsMlAoyCWsW{XWi*bq`Tz|LI_4ZRB*-*~!M`06>G@)GEH8S_T(q2FxHq1xZ-*MKR z+Dd|UN{^ZLE``^G0$t{$BoUA^*&jm(}czG*v{jdvpQ*XlUZ*!1?F zZ|g~=dbWN0t)|8!3%Btt_g#2mV@s1UYkEa`}7TW_;u$D?h#yiIX# zP2f=Z$+;+Ci{KMi885SW&_!riG61xao5WJRr(K1GuPAc@k!@df< z3%=;Jt5;-`y)a9{Dk)=z;fpSFUJ1>r6c=1l4NAn|+VawM=|20g5UYPIez{8|#h;6i zC25S&gR~dEU0y?0N4N?VZVr2W9e@7{jA2)adP41?rJgqjDNB!`AOM`^3=%+y;A7fL%L+^HAY0{O1?gW7mBC+sS zg;MolS0cwW+7k1NNA#tF?!UXJZYP>`?JAVE^eRRW-GGoGzksjj8MI7=*yAdty{o?6`3 z+}LcNSuA^;WQ5+|)84wapH#SqzEiC_i_dx- zjS+`+ZbKP<$(S&knbTN=Jsm2i;1j}%F5-)EDifq!+RugY{F<|e4p2bM$0=euDO_O5 zUY1OQ1=9XaVGS2k!Z^$YvIkILEwt;w&k1)u2#!Yf1CmC_a7MOz8LYwfET&k2()xj4 z5=L7tc&c$;P_VkiJ_u1FDHR+_y#E5?T72IV*dGgPN!2A0hgj9vF$yy;*F&)9Dj_9? zF(>TxNK2r`h0P-Ps8n!ivxM}6<&-y;<;mYghm~Kn@=1{te=HN>_rXc)Vk1s5{}cf@ zGA)oMOnNY!AB6u)JW|pdk|;Z&6@f?g#G)-t4RtzCq4VYRZU-o97>h_T4w({DhDe6_ zrx5eBEUma;E$}J)6yKsBF{%Pa3qokUP$7RY%2)6j6?`@8ZYb@VMptxJ9x2AC(?r0D z-dRC!odBFd4PGZ10{|y7UErMqh!>&}EQeJ&+(-^8dK4Ji1iVaXO0NhL$H6hxHaHA#NfZiL> z0@~PuBecS%LHj)lr5vv)0Zo9xI!q@FGDCDoBSNoIAmYF_4-Y>~azSfk>LVYSQkx@n zHEVY6TvJn58|vr`*3ukF2(GC8qc_ghS~ZjFu20P^kE00*-yN+t;&?1_ zAL@M@ukB`etEERI*cM*gv-V3slWmsB; z*hOEK8nYN!M5Px6s4QY&04kWm!Y=nVt96?jFEJqLh)Ba?`@hECw1N}Yp?$x*s-k4u z6PkN8U5%Hfkq#gA>FyeK{EaWB9{u`P9!q^OcWF8`x_jrw^b5KcbkErC-DCF@FAnYO z>Dl?qlKvxLr;?wGBIPU>8ta5DgI>qxO$ZW7=0lSEVL>Kafuc(iJQ{RN7ADmv_I30Y z-)_h?1h8-1PZVDgasV_c+(bmm88%cvxwm2AvEJ{#OL$FRY15;&?SiL5a(5$gS(n{$yiNQiv|mJiq2XmbB6LtV%ZnFb z>e8>l6tQsyO~HCE`Z%MYC3qJ>TO<6Ou-m=2pHm1lh?%FL47`gAx(K)w!rD>^;rFx{ z_bvK84O?!7-}5`fZ*JRQcd04CA_RuK_IPd^Vor1)=su$*hNlmJHLdVl)RFQ1-KbT< znX)lb3|hy(c8qiw_kD~_gd31|_P38LE#Gy(YM<(?_)+Q($BO@@R07lRS@wQUc^A=0St)(r{b2RV>%P}q%j>+K{O@Y# zy~au9*WJSyMVX%7unzF6{JHXc`FO$4m(BOR>Xko3d7L#{_8gVH-)FCF>;L36jbRzA z%hwZm{o{l8$){wMTa^>algc-hpTqZfGn-lxVE@EzyqRbDX0Gx3_$T>`U}Med z4)vH?P=9H#8Fm>SFnrPQKMn61W5yxl9^=!-ADV)uoav`#pE+m#l=)}o%NCQR#?oOq zVVSeMX!*Y7rqtF@l3^cDs7b=m7|sWD<7`BVym{@Y&&Rs z#&)sFR5elcVAa!A->UitdyD;;{fzwu`w#6!N7}L3vDfi2$1{$-f2db8eJy$^Z|K7%jf zyV-Zx_oT1jd)MFWf3n6`^JL8%wQaR4YA0$xTKmP?AJi7>R@CjU`)b|y>)xunTyLvy zsb5jQqh70jp#JIlUo|KVS#Zz?8_qWr19br{@QJ`nfxm5RZd~1XTjQr1Uv2zlQ*+a? zrf&v^f+vD!gD(ev82nYJF?3t#Oz2yopElPu4>wOVpKAVU^Sj}i@agcY;h(nHTQ;`L zwmjYPot7)D$=3T?pKg6KVu-AdJQ?}xNHIDTor<1_J|F#WZ8dG{+h*HdZKuFn;+sEJ z_9GI3K3x2g4>MhPx5z87i~Y$W9UfL5*7FRWr~j(wDGKBN)$^*-!Ups_PD8RIdfuqm z*=O`T-k!r=g*3$sBoz}z$vlGv;=ky54r|8$t>;x`RQZ*jHz?KY4n1#F8rc1M-lX{0 z7nKp^Fy8h&sT{?xrUaEK)H#6sar_>|%!4>ja|q=}MS2+T z2Ae@y9QAvVwxPyR{LLx@uvPUad-b}M%DUak5tMeLg&EX?GCp#6X7cEa7M%J}aBKI* z?%4w(UQ9batSpXD>?kQfc>*z1;_Aj-rj5 zlxfismg1)ALkE!@&`T&)4xsD+(%&}n0gQg9m>13SZUK=#lu>z~(gnL)7iQUud=d>U z8`wZ_=fR@~j@~_^^#uoleO;NZcyAwSUEiFtSW!`Sp^L)+#sM*M>ZDu$261!d@R0+D z4hH+W@rUa}fanZH*R_0Nhh}FEc9mu)u~E7D5XO0<&reZ^Q^1Tfl^O6xCll;d7Q8X8 zf>kPOm34s524K!j%*Lufn;guEXr*fAW*+8cKG=b3SS_n#^$Y>PA9Iw!Sf-uimhgA*f1Mm zYuP%so^4>G>?XDmFD$;9-NH7rEo>{>#>Uuowu9|tyVwU{IODvpM#M>`C?% z`!xFudz$?R_F48h_6++Yc9wmfJUnc=!^5d1n*1oz7+3E^S%u4%ksW{ z-Z#nnrg+~p@6&kS4DZ{^$5T9>=J5=VXL-Dz$0vDwipQsUT;uT> z9^cCoy*$weuQE?0cp}LYDV|94M207_Jkie+lRPoS6Vp7Q@x%;I?B&T`p6uhvI8P>c zGRc!E1YPlDh9|Q;+0T=cJUPXa(>$s1f@<6PbJ`~=BX4XgXW~4Q;F%=PqgQ9Fd}@kMP4g*@PtEYDy?nZtPxtZZ zIG;}N=_H>{@#!?5&hY6hpYG?=lYDxLPfzn{jZe?;>AhU*w`~4l|1WJN*uYz)E%B3gjC&tIe>+`I0d_0_2w&rHW$Gh@sEVwS1 zH?&S-K*o`+xx6tvoHvDsG5qm7o9N0LVquIcsGT!T4F~Ct>^xsFl2<0y<<*W5N=JgH zf~U~(xn5)IscpH5t@V>*@|#un=G|;W9iN26)56 zlXFPd2MoSSKc1O1cJf5ZDb?O3z_inc)p6R#&A`I ztFF8Q%{T=}f`Gs@hMl*MOaxC&1oL(Ptt;=0ZQ7ALXVBJ;x8$p4!Y8`&uGpq+xlP+; zVSNbYZc$zxJEu5CcIM7G93y!)Ih=QN5`qG4htJvQrwTuL=EF*;ty^>F2x|eX;Zs;# z>b4^k#$%;?y}VD40PpGUIA*c|aRt$vF2nIrF6a%5O4FjRHJr-Oc@Vq02`8y|qBUpq9 zTC_=|`F298&RD*qGv9&j5(B1g07~6(zl0~VVWLyNwFdB|E8n%a2F#a_b>x}1S3tSD z94gCi^~8cHG0tApVe78nuAl-p92S);zOM>eyLKp?J=ep$m`NYzje*|qkqKb!WVS0G zk9GT3bmbGjt12*T8r73n3dPqN><(_Aoe2=$bn4WG@CHzV9OyOZ9ky$NAyN|kr$9n{ zz<&ITDtYTj=gg_@a4@*y6xvEJ-41rkHu46viCV$@1a0Qk+j3vwK{Z(a6}%9?P=mY~HN@&3D2JDSMB;$3hqQyx(+$sivU$77&VM~1hOELt5AbK}O zbQpwJ05n-qoVQ^227~Lv8>ll{t$qPAnt%>bWk;?%xB^U%Mywa2u_ch3T5)v~ZY{D^ zxlq?5*F;!f8H}+jKcJ6bq_i{>#CNX+Txlr>W8q*oL2W&#?uzm5bDhkCjkjX47^}Hd zymGNv)Gj@`tjPYLas1& zMK?By9OD`g3lQiEz|xCYmQXO-Y| zQ;g6tKMJsJjGb4MHOOp2hEe9`*m)*OZb3$rY^FNHxV44qP-ZLDq0Ba_LzywEGla}` zszaF_REIJ3CWBKf2?R|71YVQ|0s(nD@ zsOp`ueE(wAyXZnxy<6m{>OCSyRS(AU1B+D;(S@iwD{@rzgCa*&568X&|7J-t8t%+n zX7Xyw))T~Px)cc5g)s;q?2{nMQly?erx=GJFm%Y&vMl`uxQA7g=s8tcd#;5&vJJxG tBe`>`w)R|vu3oY{2>a6NN2Vb$p$g>T@pFo;#)kMsZl literal 0 HcmV?d00001 diff --git a/static/open-iconic/fonts/open-iconic.woff b/static/open-iconic/fonts/open-iconic.woff new file mode 100644 index 0000000000000000000000000000000000000000..f9309988aeab3868040d3b322658902098eba27f GIT binary patch literal 14984 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 literal 0 HcmV?d00001 diff --git a/templates/index.html b/templates/index.html index 9cc53626..20764ac3 100644 --- a/templates/index.html +++ b/templates/index.html @@ -9,6 +9,7 @@ + @@ -209,7 +210,7 @@

+ + + From accbaea99157944e689b8a77bf84c8eb9ddfb4a0 Mon Sep 17 00:00:00 2001 From: vfbd Date: Thu, 30 Jun 2022 11:08:22 -0400 Subject: [PATCH 031/142] Fix a problem where a story with only the prompt cannot be edited --- static/application.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/static/application.js b/static/application.js index e8f3d4e9..5667d80a 100644 --- a/static/application.js +++ b/static/application.js @@ -1728,7 +1728,9 @@ function deleteEmptyChunks() { modified_chunks.delete(chunks[i]); socket.send({'cmd': 'inlineedit', 'chunk': chunks[i], 'data': formatChunkInnerText(document.getElementById("n0"))}); } - saved_prompt = formatChunkInnerText($("#n0")[0]); + if(gamestarted) { + saved_prompt = formatChunkInnerText($("#n0")[0]); + } } function highlightEditingChunks() { @@ -1752,10 +1754,15 @@ function highlightEditingChunks() { } function cleanupChunkWhitespace() { + unbindGametext(); + // Merge empty chunks with the next chunk var chunks = Array.from(empty_chunks); chunks.sort(function(e) {parseInt(e)}); for(var i = 0; i < chunks.length; i++) { + if(chunks[i] == "0") { + continue; + } var original_chunk = document.getElementById("n" + chunks[i]); var chunk = original_chunk.nextSibling; while(chunk) { @@ -1766,6 +1773,9 @@ function cleanupChunkWhitespace() { } if(chunk) { chunk.innerText = original_chunk.innerText + chunk.innerText; + if(original_chunk.innerText.length != 0 && !modified_chunks.has(chunk.getAttribute("n"))) { + modified_chunks.add(chunk.getAttribute("n")); + } } original_chunk.innerText = ""; } @@ -1784,9 +1794,14 @@ function cleanupChunkWhitespace() { var ln = original_chunk.innerText.trimEnd().length; if (chunk) { chunk.innerText = original_chunk.innerText.substring(ln) + chunk.innerText; + if(ln != original_chunk.innerText.length && !modified_chunks.has(chunk.getAttribute("n"))) { + modified_chunks.add(chunk.getAttribute("n")); + } } original_chunk.innerText = original_chunk.innerText.substring(0, ln); } + + bindGametext(); } // This gets run every time the text in a chunk is edited From ce5f4d3dda775d24c3ebe23894fb3d3460cd1976 Mon Sep 17 00:00:00 2001 From: vfbd Date: Thu, 30 Jun 2022 11:31:54 -0400 Subject: [PATCH 032/142] Click on blank part of editor to defocus in Chromium based browsers In Chromium based browsers you can now click the blank part of the editor to submit changes. This is to maintain consistency with the editor behaviour in Firefox which already did this when you clicked on the blank part of the editor. --- static/application.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/static/application.js b/static/application.js index 5667d80a..235434d7 100644 --- a/static/application.js +++ b/static/application.js @@ -2510,6 +2510,12 @@ $(document).ready(function(){ chunkOnFocusOut ); mutation_observer = new MutationObserver(chunkOnDOMMutate); + $("#gamescreen").on('click', function(e) { + if(this !== e.target) { + return; + } + document.activeElement.blur(); + }); // This is required for the editor to work correctly in Firefox on desktop // because the gods of HTML and JavaScript say so From cccf8296fcce3486f3a9a0a2bc0e7858f331da43 Mon Sep 17 00:00:00 2001 From: vfbd Date: Thu, 30 Jun 2022 12:03:39 -0400 Subject: [PATCH 033/142] Fix enter key sometimes putting two newlines in editor This happens when, in a Chromium-based browser, you try to insert a newline at the end of the last action of your story. --- static/application.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/static/application.js b/static/application.js index 235434d7..1572e3bb 100644 --- a/static/application.js +++ b/static/application.js @@ -1420,9 +1420,14 @@ function chunkOnTextInput(event) { // to put the
back in the right place var br = $("#_EDITOR_LINEBREAK_")[0]; if(br.parentNode === game_text[0]) { + var parent = br.previousSibling; if(br.previousSibling.nodeType !== 1) { + parent = br.previousSibling.previousSibling; br.previousSibling.previousSibling.appendChild(br.previousSibling); } + if(parent.lastChild.tagName === "BR") { + parent.lastChild.remove(); // Chrome also inserts an extra
in this case for some reason so we need to remove it + } br.previousSibling.appendChild(br); r.selectNodeContents(br.parentNode); s.removeAllRanges(); From 1ff0a4b9a96f64807b042e5ddd8c50f30c837f2e Mon Sep 17 00:00:00 2001 From: vfbd Date: Thu, 30 Jun 2022 12:23:06 -0400 Subject: [PATCH 034/142] Submit button now waits for inlineedit/inlinedelete commands --- static/application.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/static/application.js b/static/application.js index 1572e3bb..ab534a02 100644 --- a/static/application.js +++ b/static/application.js @@ -126,6 +126,7 @@ var adventure = false; var chatmode = false; var sliders_throttle = getThrottle(200); +var submit_throttle = null; //=================================================================// // METHODS @@ -882,6 +883,17 @@ function dosubmit(disallow_abort) { return; } chunkOnFocusOut("override"); + // Wait for editor changes to be applied before submitting + submit_throttle = getThrottle(70); + submit_throttle.txt = txt; + submit_throttle.disallow_abort = disallow_abort; + submit_throttle(0, _dosubmit); +} + +function _dosubmit() { + var txt = submit_throttle.txt; + var disallow_abort = submit_throttle.disallow_abort; + submit_throttle = null; input_text.val(""); hideMessage(); hidegenseqs(); @@ -1619,12 +1631,18 @@ function applyChunkDeltas(nodes) { if(!selected_chunks.has(chunks[i])) { modified_chunks.delete(chunks[i]); socket.send({'cmd': 'inlineedit', 'chunk': chunks[i], 'data': formatChunkInnerText(chunk)}); + if(submit_throttle !== null) { + submit_throttle(0, _dosubmit); + } } empty_chunks.delete(chunks[i]); } else { if(!selected_chunks.has(chunks[i])) { modified_chunks.delete(chunks[i]); socket.send({'cmd': 'inlineedit', 'chunk': chunks[i], 'data': formatChunkInnerText(chunk)}); + if(submit_throttle !== null) { + submit_throttle(0, _dosubmit); + } } empty_chunks.add(chunks[i]); } @@ -1646,6 +1664,9 @@ function syncAllModifiedChunks(including_selected_chunks=false) { empty_chunks.delete(chunks[i]); } socket.send({'cmd': 'inlineedit', 'chunk': chunks[i], 'data': data}); + if(submit_throttle !== null) { + submit_throttle(0, _dosubmit); + } } } } @@ -1698,10 +1719,16 @@ function restorePrompt() { if(this.innerText.trim().length) { saved_prompt = this.innerText.trim(); socket.send({'cmd': 'inlinedelete', 'data': this.getAttribute("n")}); + if(submit_throttle !== null) { + submit_throttle(0, _dosubmit); + } this.parentNode.removeChild(this); return false; } socket.send({'cmd': 'inlinedelete', 'data': this.getAttribute("n")}); + if(submit_throttle !== null) { + submit_throttle(0, _dosubmit); + } this.parentNode.removeChild(this); }); } @@ -1716,6 +1743,9 @@ function restorePrompt() { modified_chunks.delete('0'); empty_chunks.delete('0'); socket.send({'cmd': 'inlineedit', 'chunk': '0', 'data': saved_prompt}); + if(submit_throttle !== null) { + submit_throttle(0, _dosubmit); + } } function deleteEmptyChunks() { @@ -1727,11 +1757,17 @@ function deleteEmptyChunks() { restorePrompt(); } else { socket.send({'cmd': 'inlinedelete', 'data': chunks[i]}); + if(submit_throttle !== null) { + submit_throttle(0, _dosubmit); + } } } if(modified_chunks.has('0')) { modified_chunks.delete(chunks[i]); socket.send({'cmd': 'inlineedit', 'chunk': chunks[i], 'data': formatChunkInnerText(document.getElementById("n0"))}); + if(submit_throttle !== null) { + submit_throttle(0, _dosubmit); + } } if(gamestarted) { saved_prompt = formatChunkInnerText($("#n0")[0]); From 97e0df45d77aa728b9f4419b2c842e51212fea85 Mon Sep 17 00:00:00 2001 From: ebolam Date: Thu, 30 Jun 2022 15:57:27 -0400 Subject: [PATCH 035/142] File Dialog complete --- aiserver.py | 51 +++++++++++++++++++-- static/application.js | 103 ++++++++++++++++++++++++++++++++++-------- static/custom.css | 16 ++++++- templates/index.html | 8 +++- 4 files changed, 151 insertions(+), 27 deletions(-) diff --git a/aiserver.py b/aiserver.py index b6b219fa..2f7f680e 100644 --- a/aiserver.py +++ b/aiserver.py @@ -6075,9 +6075,32 @@ def send_debug(): #==================================================================# @app.route("/popup_test") def popup_test(): - file_popup("Test Popup", "./", "return_event_name", folder_only=False, editable=True, deleteable=True, jailed=False, item_check=check_if_dir_is_model) + file_popup("Test Popup", "./", "return_event_name", renameable=True, folder_only=False, editable=True, deleteable=True, jailed=False, item_check=check_if_dir_is_model) return "ok" +@socketio.on('upload_file') +def upload_file(data): + print("upload_file {}".format(data['filename'])) + if 'current_folder' in session: + path = os.path.join(session['current_folder'], data['filename']) + print("Want to save to {}".format(path)) + if 'popup_jailed_dir' not in session: + print("Someone is trying to upload a file to your server. Blocked.") + elif session['popup_jailed_dir'] is None: + if os.path.exists(path): + emit("error_popup", "The file already exists. Please delete it or rename the file before uploading", room="UI_2"); + else: + with open(path, "wb") as f: + f.write(data['data']) + get_files_folders(session['current_folder']) + elif session['popup_jailed_dir'] in session['current_folder']: + if os.path.exists(path): + emit("error_popup", "The file already exists. Please delete it or rename the file before uploading", room="UI_2"); + else: + with open(path, "wb") as f: + f.write(data['data']) + get_files_folders(session['current_folder']) + @socketio.on('popup_change_folder') def popup_change_folder(data): print("Doing popup change folder: {}".format(data)) @@ -6091,6 +6114,25 @@ def popup_change_folder(data): else: print("User is trying to get at files in your server outside the jail. Blocked. Jailed Dir: {} Requested Dir: {}".format(session['popup_jailed_dir'], data)) +@socketio.on('popup_rename') +def popup_rename(data): + if 'popup_renameable' not in session: + print("Someone is trying to rename a file in your server. Blocked.") + return + if not session['popup_renameable']: + print("Someone is trying to rename a file in your server. Blocked.") + return + + if session['popup_jailed_dir'] is None: + os.rename(data['file'], data['new_name']) + get_files_folders(os.path.dirname(data['file'])) + elif session['popup_jailed_dir'] in data: + os.rename(data['file'], data['new_name']) + get_files_folders(os.path.dirname(data['file'])) + else: + print("User is trying to rename files in your server outside the jail. Blocked. Jailed Dir: {} Requested Dir: {}".format(session['popup_jailed_dir'], data['file'])) + + @socketio.on('popup_delete') def popup_delete(data): if 'popup_deletable' not in session: @@ -6159,7 +6201,7 @@ def popup_change_file(data): else: print("User is trying to delete files in your server outside the jail. Blocked. Jailed Dir: {} Requested Dir: {}".format(session['popup_jailed_dir'], data)) -def file_popup(popup_title, starting_folder, return_event, jailed=True, folder_only=True, deleteable=False, editable=False, show_breadcrumbs=True, item_check=None, show_hidden=False): +def file_popup(popup_title, starting_folder, return_event, upload=True, jailed=True, folder_only=True, renameable=False, deleteable=False, editable=False, show_breadcrumbs=True, item_check=None, show_hidden=False): #starting_folder = The folder we're going to get folders and/or items from #return_event = the socketio event that will be emitted when the load button is clicked #jailed = if set to true will look for the session variable jailed_folder and prevent navigation outside of that folder @@ -6174,19 +6216,22 @@ def file_popup(popup_title, starting_folder, return_event, jailed=True, folder_o else: session['popup_jailed_dir'] = None session['popup_deletable'] = deleteable + session['popup_renameable'] = renameable session['popup_editable'] = editable session['popup_show_hidden'] = show_hidden session['popup_item_check'] = item_check session['popup_folder_only'] = folder_only session['popup_show_breadcrumbs'] = show_breadcrumbs + session['upload'] = upload - socketio.emit("load_popup", {"popup_title": popup_title, "call_back": return_event, "deleteable": deleteable, "editable": editable}, broadcast=True) + socketio.emit("load_popup", {"popup_title": popup_title, "call_back": return_event, "renameable": renameable, "deleteable": deleteable, "editable": editable, 'upload': upload}, broadcast=True) get_files_folders(starting_folder) def get_files_folders(starting_folder): import stat + session['current_folder'] = starting_folder item_check = session['popup_item_check'] show_breadcrumbs = session['popup_show_breadcrumbs'] show_hidden = session['popup_show_hidden'] diff --git a/static/application.js b/static/application.js index a1654f6f..fc55a848 100644 --- a/static/application.js +++ b/static/application.js @@ -2125,6 +2125,7 @@ $(document).ready(function(){ socket.on('popup_items', function(data){popup_items(data);}); socket.on('popup_breadcrumbs', function(data){popup_breadcrumbs(data);}); socket.on('popup_edit_file', function(data){popup_edit_file(data);}); + socket.on('error_popup', function(data){error_popup(data);}); socket.on('from_server', function(msg) { //console.log(msg); @@ -3148,12 +3149,15 @@ $(document).ready(function(){ var popup_deleteable = false; var popup_editable = false; +var popup_renameable = false; function load_popup(data) { - console.log(data); popup_deleteable = data.deleteable; popup_editable = data.editable; + popup_renameable = data.renameable; var popup = document.getElementById("popup"); + var popup_title = document.getElementById("popup_title"); + popup_title.textContent = data.popup_title; var popup_list = document.getElementById("popup_list"); //first, let's clear out our existing data while (popup_list.firstChild) { @@ -3164,24 +3168,48 @@ function load_popup(data) { breadcrumbs.removeChild(breadcrumbs.firstChild); } + if (data.upload) { + const dropArea = document.getElementById('popup_list'); + dropArea.addEventListener('dragover', (event) => { + event.stopPropagation(); + event.preventDefault(); + // Style the drag-and-drop as a "copy file" operation. + event.dataTransfer.dropEffect = 'copy'; + }); + + dropArea.addEventListener('drop', (event) => { + event.stopPropagation(); + event.preventDefault(); + const fileList = event.dataTransfer.files; + for (file of fileList) { + reader = new FileReader(); + reader.onload = function (event) { + socket.emit("upload_file", {'filename': file.name, "data": event.target.result}); + }; + reader.readAsArrayBuffer(file); + } + }); + } else { + + } + popup.classList.remove("hidden"); //adjust accept button - var accept = document.getElementById("popup_accept"); - accept.classList.add("btn-secondary"); - accept.classList.remove("btn-primary"); - accept.setAttribute("emit", data.call_back); - accept.setAttribute("selected_value", ""); - accept.onclick = function () { - socket.emit(this.emit, this.getAttribute("selected_value")); - document.getElementById("popup").classList.add("hidden"); - }; + if (data.call_back == "") { + document.getElementById("popup_load_cancel").classList.add("hidden"); + } else { + document.getElementById("popup_load_cancel").classList.remove("hidden"); + var accept = document.getElementById("popup_accept"); + accept.classList.add("disabled"); + accept.setAttribute("emit", data.call_back); + accept.setAttribute("selected_value", ""); + accept.onclick = function () { + socket.emit(this.emit, this.getAttribute("selected_value")); + document.getElementById("popup").classList.add("hidden"); + }; + } - //adjust cancel button - var cancel = document.getElementById("popup_cancel"); - cancel.onclick = function () { - document.getElementById("popup").classList.add("hidden"); - }; } function popup_items(data) { @@ -3190,6 +3218,7 @@ function popup_items(data) { while (popup_list.firstChild) { popup_list.removeChild(popup_list.firstChild); } + document.getElementById('popup_upload_input').value = ""; for (item of data) { var list_item = document.createElement("span"); @@ -3209,7 +3238,8 @@ function popup_items(data) { edit_icon.classList.add("edit_icon"); if ((popup_editable) && !(item[0])) { edit_icon.classList.add("oi"); - edit_icon.setAttribute('data-glyph', "pencil"); + edit_icon.setAttribute('data-glyph', "spreadsheet"); + edit_icon.title = "Edit" edit_icon.id = item[1]; edit_icon.onclick = function () { socket.emit("popup_edit", this.id); @@ -3217,12 +3247,31 @@ function popup_items(data) { } list_item.append(edit_icon); + //create the rename icon + var rename_icon = document.createElement("span"); + rename_icon.classList.add("rename_icon"); + if ((popup_renameable) && !(item[0])) { + rename_icon.classList.add("oi"); + rename_icon.setAttribute('data-glyph', "pencil"); + rename_icon.title = "Rename" + rename_icon.id = item[1]; + rename_icon.setAttribute("filename", item[2]); + rename_icon.onclick = function () { + var new_name = prompt("Please enter new filename for \n"+ this.getAttribute("filename")); + if (new_name != null) { + socket.emit("popup_rename", {"file": this.id, "new_name": new_name}); + } + }; + } + list_item.append(rename_icon); + //create the delete icon var delete_icon = document.createElement("span"); delete_icon.classList.add("delete_icon"); if (popup_deleteable) { delete_icon.classList.add("oi"); delete_icon.setAttribute('data-glyph', "x"); + delete_icon.title = "Delete" delete_icon.id = item[1]; delete_icon.setAttribute("folder", item[0]); delete_icon.onclick = function () { @@ -3249,14 +3298,12 @@ function popup_items(data) { popup_item.onclick = function () { var accept = document.getElementById("popup_accept"); if (this.getAttribute("valid") == "true") { - accept.classList.remove("btn-secondary"); - accept.classList.add("btn-primary"); + accept.classList.remove("disabled"); accept.setAttribute("selected_value", this.id); } else { console.log("not valid"); accept.setAttribute("selected_value", ""); - accept.classList.add("btn-secondary"); - accept.classList.remove("btn-primary"); + accept.classList.add("disabled"); if (this.getAttribute("folder") == "true") { console.log("folder"); socket.emit("popup_change_folder", this.id); @@ -3320,3 +3367,19 @@ function popup_edit_file(data) { popup_list.append(textarea); } + +function error_popup(data) { + alert(data); +} + +function upload_file(file_box) { + var fileList = file_box.files; + for (file of fileList) { + reader = new FileReader(); + reader.onload = function (event) { + socket.emit("upload_file", {'filename': file.name, "data": event.target.result}); + }; + reader.readAsArrayBuffer(file); + } +} + diff --git a/static/custom.css b/static/custom.css index 22c1078b..10ed2dc6 100644 --- a/static/custom.css +++ b/static/custom.css @@ -1580,8 +1580,8 @@ body.connected .popupfooter, .popupfooter.always-available { background-color: #262626; padding: 2px; display: grid; - grid-template-areas: "folder_icon delete_icon edit_icon file"; - grid-template-columns: 20px 20px 20px auto; + grid-template-areas: "folder_icon delete_icon edit_icon rename_icon file"; + grid-template-columns: 20px 20px 20px 20px auto; } @@ -1593,6 +1593,10 @@ body.connected .popupfooter, .popupfooter.always-available { grid-area: edit_icon; } +.new_popup .item .rename_icon { + grid-area: rename_icon; +} + .new_popup .item .delete_icon { grid-area: delete_icon; } @@ -1605,6 +1609,14 @@ body.connected .popupfooter, .popupfooter.always-available { background-color: #688f1f; } +.new_popup textarea { + grid-area: textarea; + background-color: #404040; + color: white; + resize: none; + width: 100%; +} + .new_popup .popup_load_cancel { text-align: center; background-color: #285070; diff --git a/templates/index.html b/templates/index.html index 20764ac3..97d381b8 100644 --- a/templates/index.html +++ b/templates/index.html @@ -483,9 +483,13 @@ - From 813540fe9b2ea977fdfa4625ad295b1d6454ac9f Mon Sep 17 00:00:00 2001 From: ebolam Date: Thu, 30 Jun 2022 19:13:05 -0400 Subject: [PATCH 036/142] Added folder browser for softprompts and userscripts --- aiserver.py | 35 ++++++++++++++++++++++++++++------- static/application.js | 6 ++++-- templates/index.html | 4 ++-- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/aiserver.py b/aiserver.py index 2f7f680e..9bebbc3a 100644 --- a/aiserver.py +++ b/aiserver.py @@ -6070,36 +6070,57 @@ def send_debug(): emit('from_server', {'cmd': 'debug_info', 'data': debug_info}, broadcast=True) +#==================================================================# +# Load file browser for soft prompts +#==================================================================# +@socketio.on('show_folder_soft_prompt') +def show_folder_soft_prompt(data): + file_popup("Load Softprompt", "./softprompts", "", renameable=True, folder_only=False, editable=False, deleteable=True, jailed=True, item_check=None) + +#==================================================================# +# Load file browser for user scripts +#==================================================================# +@socketio.on('show_folder_usersripts') +def show_folder_usersripts(data): + file_popup("Load Softprompt", "./userscripts", "", renameable=True, folder_only=False, editable=False, deleteable=True, jailed=True, item_check=None) + + + #==================================================================# # File Popup options #==================================================================# -@app.route("/popup_test") -def popup_test(): - file_popup("Test Popup", "./", "return_event_name", renameable=True, folder_only=False, editable=True, deleteable=True, jailed=False, item_check=check_if_dir_is_model) - return "ok" @socketio.on('upload_file') def upload_file(data): print("upload_file {}".format(data['filename'])) + print('current_folder' in session) + print('popup_jailed_dir' not in session) + print(session['popup_jailed_dir']) + print(session['current_folder']) if 'current_folder' in session: - path = os.path.join(session['current_folder'], data['filename']) - print("Want to save to {}".format(path)) + path = os.path.abspath(os.path.join(session['current_folder'], data['filename']).replace("\\", "/")).replace("\\", "/") + print(path) + print(os.path.exists(path)) if 'popup_jailed_dir' not in session: print("Someone is trying to upload a file to your server. Blocked.") elif session['popup_jailed_dir'] is None: if os.path.exists(path): + print("popup error") emit("error_popup", "The file already exists. Please delete it or rename the file before uploading", room="UI_2"); else: with open(path, "wb") as f: f.write(data['data']) get_files_folders(session['current_folder']) + print("saved") elif session['popup_jailed_dir'] in session['current_folder']: if os.path.exists(path): + print("popup error") emit("error_popup", "The file already exists. Please delete it or rename the file before uploading", room="UI_2"); else: with open(path, "wb") as f: f.write(data['data']) get_files_folders(session['current_folder']) + print("saved") @socketio.on('popup_change_folder') def popup_change_folder(data): @@ -6231,7 +6252,7 @@ def file_popup(popup_title, starting_folder, return_event, upload=True, jailed=T def get_files_folders(starting_folder): import stat - session['current_folder'] = starting_folder + session['current_folder'] = os.path.abspath(starting_folder).replace("\\", "/") item_check = session['popup_item_check'] show_breadcrumbs = session['popup_show_breadcrumbs'] show_hidden = session['popup_show_hidden'] diff --git a/static/application.js b/static/application.js index fc55a848..c89364b4 100644 --- a/static/application.js +++ b/static/application.js @@ -3152,6 +3152,8 @@ var popup_editable = false; var popup_renameable = false; function load_popup(data) { + document.getElementById('spcontainer').classList.add('hidden'); + document.getElementById('uscontainer').classList.add('hidden'); popup_deleteable = data.deleteable; popup_editable = data.editable; popup_renameable = data.renameable; @@ -3197,9 +3199,9 @@ function load_popup(data) { //adjust accept button if (data.call_back == "") { - document.getElementById("popup_load_cancel").classList.add("hidden"); + document.getElementById("popup_accept").classList.add("hidden"); } else { - document.getElementById("popup_load_cancel").classList.remove("hidden"); + document.getElementById("popup_accept").classList.remove("hidden"); var accept = document.getElementById("popup_accept"); accept.classList.add("disabled"); accept.setAttribute("emit", data.call_back); diff --git a/templates/index.html b/templates/index.html index 97d381b8..fa131a57 100644 --- a/templates/index.html +++ b/templates/index.html @@ -339,7 +339,7 @@