summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Stanley <fungi@yuggoth.org>2018-02-01 18:37:58 +0000
committerJeremy Stanley <fungi@yuggoth.org>2018-02-01 18:37:58 +0000
commit98ed431f6c33906c8b08e2c2246dd32cc0ba0fd4 (patch)
tree52b0e7b10787257fab69086dff5e01cf122eaaef
parentc3f36f3d6f3a65a810c6b7bc676d69a972c36058 (diff)
Convert Arcana files from DOS to UNIX line endings
Switch all the Arcana text/HTML/CSS/JS files which used CR+LF line endings to plain LF like other files in the repository, for consistency and ease of maintenance. Some files had mixed line endings, so fix them as well. Also clean up a handful of mixed tab+space indents in www/index.html along with one line which had only whitespace characters on it. This change makes no edits to file content other than whitespace. Change-Id: I5f1b9269112a7147bf682658f4884171bad13d72
Notes
Notes (review): Code-Review+2: James E. Blair <corvus@inaugust.com> Code-Review+2: Tobias Henkel <tobias.henkel@bmw.de> Workflow+1: James E. Blair <corvus@inaugust.com> Verified+2: Zuul Submitted-by: Zuul Submitted-at: Fri, 02 Feb 2018 21:48:26 +0000 Reviewed-on: https://review.openstack.org/540082 Project: openstack-infra/zuul-website Branch: refs/heads/master
-rw-r--r--LICENSE.txt126
-rw-r--r--www/assets/js/ie/backgroundsize.min.htc12
-rw-r--r--www/assets/js/jquery.dropotron.min.js2
-rw-r--r--www/assets/js/main.js170
-rw-r--r--www/assets/js/skel.min.js2
-rw-r--r--www/assets/js/util.js1172
-rw-r--r--www/assets/sass/ie9.scss44
-rw-r--r--www/assets/sass/libs/_functions.scss66
-rw-r--r--www/assets/sass/libs/_mixins.scss794
-rw-r--r--www/assets/sass/libs/_skel.scss1172
-rw-r--r--www/assets/sass/libs/_vars.scss64
-rw-r--r--www/index.html388
12 files changed, 2006 insertions, 2006 deletions
diff --git a/LICENSE.txt b/LICENSE.txt
index d447b56..856b578 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,63 +1,63 @@
1Creative Commons Attribution 3.0 Unported 1Creative Commons Attribution 3.0 Unported
2http://creativecommons.org/licenses/by/3.0/ 2http://creativecommons.org/licenses/by/3.0/
3 3
4License 4License
5 5
6THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. 6THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
7 7
8BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. 8BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
9 9
101. Definitions 101. Definitions
11 11
12 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. 12 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.
13 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. 13 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License.
14 3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. 14 3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership.
15 4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. 15 4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.
16 5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. 16 5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast.
17 6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. 17 6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work.
18 7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. 18 7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
19 8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. 19 8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images.
20 9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. 20 9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.
21 21
222. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. 222. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws.
23 23
243. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: 243. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
25 25
26 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; 26 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections;
27 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; 27 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";
28 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, 28 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and,
29 4. to Distribute and Publicly Perform Adaptations. 29 4. to Distribute and Publicly Perform Adaptations.
30 5. 30 5.
31 31
32 For the avoidance of doubt: 32 For the avoidance of doubt:
33 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; 33 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License;
34 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, 34 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and,
35 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. 35 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License.
36 36
37The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. 37The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved.
38 38
394. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: 394. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
40 40
41 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. 41 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested.
42 2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. 42 2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.
43 3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. 43 3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise.
44 44
455. Representations, Warranties and Disclaimer 455. Representations, Warranties and Disclaimer
46 46
47UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. 47UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
48 48
496. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 496. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
50 50
517. Termination 517. Termination
52 52
53 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. 53 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
54 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. 54 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
55 55
568. Miscellaneous 568. Miscellaneous
57 57
58 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. 58 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
59 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. 59 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
60 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. 60 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
61 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. 61 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
62 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. 62 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
63 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. 63 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law.
diff --git a/www/assets/js/ie/backgroundsize.min.htc b/www/assets/js/ie/backgroundsize.min.htc
index 3d9960d..9b2592e 100644
--- a/www/assets/js/ie/backgroundsize.min.htc
+++ b/www/assets/js/ie/backgroundsize.min.htc
@@ -1,7 +1,7 @@
1<component lightWeight="true"> 1<component lightWeight="true">
2<attach event="onpropertychange" onevent="handlePropertychange()" /> 2<attach event="onpropertychange" onevent="handlePropertychange()" />
3<attach event="ondetach" onevent="restore()" /> 3<attach event="ondetach" onevent="restore()" />
4<attach event="onresize" for="window" onevent="handleResize()" /> 4<attach event="onresize" for="window" onevent="handleResize()" />
5<script type="text/javascript"> 5<script type="text/javascript">
6var rsrc=/url\(["']?(.*?)["']?\)/,positions={top:0,left:0,bottom:1,right:1,center:0.5},doc=element.document;init(); function init(){var b=doc.createElement("div"),a=doc.createElement("img"),c,d;b.style.position="absolute";b.style.zIndex=-1;b.style.top=0;b.style.right=0;b.style.left=0;b.style.bottom=0;b.style.overflow="hidden";a.style.position="absolute";a.style.width=a.style.width="auto";b.appendChild(a);element.insertBefore(b,element.firstChild);d=[element.currentStyle.backgroundPositionX,element.currentStyle.backgroundPositionY];element.bgsExpando=c={wrapper:b,img:a,backgroundSize:element.currentStyle["background-size"], backgroundPositionX:positions[d[0]]||parseFloat(d[0])/100,backgroundPositionY:positions[d[1]]||parseFloat(d[1])/100};"auto"==element.currentStyle.zIndex&&(element.style.zIndex=0);"static"==element.currentStyle.position&&(element.style.position="relative");refreshDisplay(element,c)&&(refreshDimensions(element,c),refreshBackgroundImage(element,c,function(){updateBackground(element,c)}))} function refreshDisplay(b,a){var c=b.currentStyle.display;c!=a.display&&(a.display=c,a.somethingChanged=!0);return"none"!=c}function refreshDimensions(b,a){var c=b.offsetWidth-(parseFloat(b.currentStyle.borderLeftWidth)||0)-(parseFloat(b.currentStyle.borderRightWidth)||0),d=b.offsetHeight-(parseFloat(b.currentStyle.borderTopWidth)||0)-(parseFloat(b.currentStyle.borderBottomWidth)||0);if(c!=a.innerWidth||d!=a.innerHeight)a.innerWidth=c,a.innerHeight=d,a.somethingChanged=!0} function refreshBackgroundImage(b,a,c){var d=a.img,e=(rsrc.exec(b.currentStyle.backgroundImage)||[])[1];if(e&&e!=a.backgroundSrc){a.backgroundSrc=e;a.somethingChanged=!0;d.onload=function(){var b=d.width,e=d.height;1==b&&1==e||(a.imgWidth=b,a.imgHeight=e,a.constrain=!1,c(),d.style.visibility="visible",d.onload=null)};d.style.visibility="hidden";d.src=a.backgroundSrc;if(d.readyState||d.complete)d.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",d.src=a.backgroundSrc;a.ignoreNextPropertyChange= !0;b.style.backgroundImage="none"}else c()} function updateBackground(b,a){if(a.somethingChanged){var c=a.img,d=a.innerWidth/a.innerHeight,e=a.imgWidth/a.imgHeight,f=a.constrain;"contain"==a.backgroundSize?e>d?(a.constrain=d="width",e=Math.floor((a.innerHeight-a.innerWidth/e)*a.backgroundPositionY),c.style.top=e+"px",d!=f&&(c.style.width="100%",c.style.height="auto",c.style.left=0)):(a.constrain=d="height",e=Math.floor((a.innerWidth-a.innerHeight*e)*a.backgroundPositionX),c.style.left=e+"px",d!=f&&(c.style.width="auto",c.style.height="100%", c.style.top=0)):"cover"==a.backgroundSize&&(e>d?(a.constrain=d="height",e=Math.floor((a.innerHeight*e-a.innerWidth)*a.backgroundPositionX),c.style.left=-e+"px",d!=f&&(c.style.width="auto",c.style.height="100%",c.style.top=0)):(a.constrain=d="width",e=Math.floor((a.innerWidth/e-a.innerHeight)*a.backgroundPositionY),c.style.top=-e+"px",d!=f&&(c.style.width="100%",c.style.height="auto",c.style.left=0)));a.somethingChanged=!1}} function handlePropertychange(){var b=element.bgsExpando;b.ignoreNextPropertyChange?b.ignoreNextPropertyChange=!1:refreshDisplay(element,b)&&(refreshDimensions(element,b),refreshBackgroundImage(element,b,function(){updateBackground(element,b)}))}function handleResize(){var b=element.bgsExpando;"none"!=b.display&&(refreshDimensions(element,b),updateBackground(element,b))} function restore(){var b=element.bgsExpando;try{element.style.backgroundImage="url('"+b.backgroundSrc+"')",element.removeChild(b.wrapper),element.bgsExpando=null}catch(a){}}; 6var rsrc=/url\(["']?(.*?)["']?\)/,positions={top:0,left:0,bottom:1,right:1,center:0.5},doc=element.document;init(); function init(){var b=doc.createElement("div"),a=doc.createElement("img"),c,d;b.style.position="absolute";b.style.zIndex=-1;b.style.top=0;b.style.right=0;b.style.left=0;b.style.bottom=0;b.style.overflow="hidden";a.style.position="absolute";a.style.width=a.style.width="auto";b.appendChild(a);element.insertBefore(b,element.firstChild);d=[element.currentStyle.backgroundPositionX,element.currentStyle.backgroundPositionY];element.bgsExpando=c={wrapper:b,img:a,backgroundSize:element.currentStyle["background-size"], backgroundPositionX:positions[d[0]]||parseFloat(d[0])/100,backgroundPositionY:positions[d[1]]||parseFloat(d[1])/100};"auto"==element.currentStyle.zIndex&&(element.style.zIndex=0);"static"==element.currentStyle.position&&(element.style.position="relative");refreshDisplay(element,c)&&(refreshDimensions(element,c),refreshBackgroundImage(element,c,function(){updateBackground(element,c)}))} function refreshDisplay(b,a){var c=b.currentStyle.display;c!=a.display&&(a.display=c,a.somethingChanged=!0);return"none"!=c}function refreshDimensions(b,a){var c=b.offsetWidth-(parseFloat(b.currentStyle.borderLeftWidth)||0)-(parseFloat(b.currentStyle.borderRightWidth)||0),d=b.offsetHeight-(parseFloat(b.currentStyle.borderTopWidth)||0)-(parseFloat(b.currentStyle.borderBottomWidth)||0);if(c!=a.innerWidth||d!=a.innerHeight)a.innerWidth=c,a.innerHeight=d,a.somethingChanged=!0} function refreshBackgroundImage(b,a,c){var d=a.img,e=(rsrc.exec(b.currentStyle.backgroundImage)||[])[1];if(e&&e!=a.backgroundSrc){a.backgroundSrc=e;a.somethingChanged=!0;d.onload=function(){var b=d.width,e=d.height;1==b&&1==e||(a.imgWidth=b,a.imgHeight=e,a.constrain=!1,c(),d.style.visibility="visible",d.onload=null)};d.style.visibility="hidden";d.src=a.backgroundSrc;if(d.readyState||d.complete)d.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",d.src=a.backgroundSrc;a.ignoreNextPropertyChange= !0;b.style.backgroundImage="none"}else c()} function updateBackground(b,a){if(a.somethingChanged){var c=a.img,d=a.innerWidth/a.innerHeight,e=a.imgWidth/a.imgHeight,f=a.constrain;"contain"==a.backgroundSize?e>d?(a.constrain=d="width",e=Math.floor((a.innerHeight-a.innerWidth/e)*a.backgroundPositionY),c.style.top=e+"px",d!=f&&(c.style.width="100%",c.style.height="auto",c.style.left=0)):(a.constrain=d="height",e=Math.floor((a.innerWidth-a.innerHeight*e)*a.backgroundPositionX),c.style.left=e+"px",d!=f&&(c.style.width="auto",c.style.height="100%", c.style.top=0)):"cover"==a.backgroundSize&&(e>d?(a.constrain=d="height",e=Math.floor((a.innerHeight*e-a.innerWidth)*a.backgroundPositionX),c.style.left=-e+"px",d!=f&&(c.style.width="auto",c.style.height="100%",c.style.top=0)):(a.constrain=d="width",e=Math.floor((a.innerWidth/e-a.innerHeight)*a.backgroundPositionY),c.style.top=-e+"px",d!=f&&(c.style.width="100%",c.style.height="auto",c.style.left=0)));a.somethingChanged=!1}} function handlePropertychange(){var b=element.bgsExpando;b.ignoreNextPropertyChange?b.ignoreNextPropertyChange=!1:refreshDisplay(element,b)&&(refreshDimensions(element,b),refreshBackgroundImage(element,b,function(){updateBackground(element,b)}))}function handleResize(){var b=element.bgsExpando;"none"!=b.display&&(refreshDimensions(element,b),updateBackground(element,b))} function restore(){var b=element.bgsExpando;try{element.style.backgroundImage="url('"+b.backgroundSrc+"')",element.removeChild(b.wrapper),element.bgsExpando=null}catch(a){}};
7</script> \ No newline at end of file 7</script> \ No newline at end of file
diff --git a/www/assets/js/jquery.dropotron.min.js b/www/assets/js/jquery.dropotron.min.js
index b992170..7b14e2b 100644
--- a/www/assets/js/jquery.dropotron.min.js
+++ b/www/assets/js/jquery.dropotron.min.js
@@ -1,2 +1,2 @@
1/* jquery.dropotron.js v1.4.3 | (c) @ajlkn | github.com/ajlkn/jquery.dropotron | MIT licensed */ 1/* jquery.dropotron.js v1.4.3 | (c) @ajlkn | github.com/ajlkn/jquery.dropotron | MIT licensed */
2!function(e){e.fn.disableSelection_dropotron=function(){return e(this).css("user-select","none").css("-khtml-user-select","none").css("-moz-user-select","none").css("-o-user-select","none").css("-webkit-user-select","none")},e.fn.dropotron=function(t){if(0==this.length)return e(this);if(this.length>1)for(var o=0;o<this.length;o++)e(this[o]).dropotron(t);return e.dropotron(e.extend({selectorParent:e(this)},t))},e.dropotron=function(t){var o=e.extend({selectorParent:null,baseZIndex:1e3,menuClass:"dropotron",expandMode:"hover",hoverDelay:150,hideDelay:250,openerClass:"opener",openerActiveClass:"active",submenuClassPrefix:"level-",mode:"fade",speed:"fast",easing:"swing",alignment:"left",offsetX:0,offsetY:0,globalOffsetY:0,IEOffsetX:0,IEOffsetY:0,noOpenerFade:!0,detach:!0,cloneOnDetach:!0},t),n=o.selectorParent,s=n.find("ul"),i=e("body"),a=e("body,html"),l=e(window),r=!1,d=null,c=null;n.on("doCollapseAll",function(){s.trigger("doCollapse")}),s.each(function(){var t=e(this),n=t.parent();o.hideDelay>0&&t.add(n).on("mouseleave",function(e){window.clearTimeout(c),c=window.setTimeout(function(){t.trigger("doCollapse")},o.hideDelay)}),t.disableSelection_dropotron().hide().addClass(o.menuClass).css("position","absolute").on("mouseenter",function(e){window.clearTimeout(c)}).on("doExpand",function(){if(t.is(":visible"))return!1;window.clearTimeout(c),s.each(function(){var t=e(this);e.contains(t.get(0),n.get(0))||t.trigger("doCollapse")});var i,a,d,f,u=n.offset(),p=n.position(),h=(n.parent().position(),n.outerWidth()),g=t.outerWidth(),v=t.css("z-index")==o.baseZIndex;if(v){switch(i=o.detach?u:p,f=i.top+n.outerHeight()+o.globalOffsetY,a=o.alignment,t.removeClass("left").removeClass("right").removeClass("center"),o.alignment){case"right":d=i.left-g+h,0>d&&(d=i.left,a="left");break;case"center":d=i.left-Math.floor((g-h)/2),0>d?(d=i.left,a="left"):d+g>l.width()&&(d=i.left-g+h,a="right");break;case"left":default:d=i.left,d+g>l.width()&&(d=i.left-g+h,a="right")}t.addClass(a)}else switch("relative"==n.css("position")||"absolute"==n.css("position")?(f=o.offsetY,d=-1*p.left):(f=p.top+o.offsetY,d=0),o.alignment){case"right":d+=-1*n.parent().outerWidth()+o.offsetX;break;case"center":case"left":default:d+=n.parent().outerWidth()+o.offsetX}navigator.userAgent.match(/MSIE ([0-9]+)\./)&&RegExp.$1<8&&(d+=o.IEOffsetX,f+=o.IEOffsetY),t.css("left",d+"px").css("top",f+"px").css("opacity","0.01").show();var C=!1;switch(d="relative"==n.css("position")||"absolute"==n.css("position")?-1*p.left:0,t.offset().left<0?(d+=n.parent().outerWidth()-o.offsetX,C=!0):t.offset().left+g>l.width()&&(d+=-1*n.parent().outerWidth()-o.offsetX,C=!0),C&&t.css("left",d+"px"),t.hide().css("opacity","1"),o.mode){case"zoom":r=!0,n.addClass(o.openerActiveClass),t.animate({width:"toggle",height:"toggle"},o.speed,o.easing,function(){r=!1});break;case"slide":r=!0,n.addClass(o.openerActiveClass),t.animate({height:"toggle"},o.speed,o.easing,function(){r=!1});break;case"fade":if(r=!0,v&&!o.noOpenerFade){var C;C="slow"==o.speed?80:"fast"==o.speed?40:Math.floor(o.speed/2),n.fadeTo(C,.01,function(){n.addClass(o.openerActiveClass),n.fadeTo(o.speed,1),t.fadeIn(o.speed,function(){r=!1})})}else n.addClass(o.openerActiveClass),n.fadeTo(o.speed,1),t.fadeIn(o.speed,function(){r=!1});break;case"instant":default:n.addClass(o.openerActiveClass),t.show()}return!1}).on("doCollapse",function(){return t.is(":visible")?(t.hide(),n.removeClass(o.openerActiveClass),t.find("."+o.openerActiveClass).removeClass(o.openerActiveClass),t.find("ul").hide(),!1):!1}).on("doToggle",function(e){return t.is(":visible")?t.trigger("doCollapse"):t.trigger("doExpand"),!1}),n.disableSelection_dropotron().addClass("opener").css("cursor","pointer").on("click touchend",function(e){r||(e.preventDefault(),e.stopPropagation(),t.trigger("doToggle"))}),"hover"==o.expandMode&&n.hover(function(e){r||(d=window.setTimeout(function(){t.trigger("doExpand")},o.hoverDelay))},function(e){window.clearTimeout(d)})}),s.find("a").css("display","block").on("click touchend",function(t){r||e(this).attr("href").length<1&&t.preventDefault()}),n.find("li").css("white-space","nowrap").each(function(){var t=e(this),o=t.children("a"),s=t.children("ul"),i=o.attr("href");o.on("click touchend",function(e){0==i.length||"#"==i?e.preventDefault():e.stopPropagation()}),o.length>0&&0==s.length&&t.on("click touchend",function(e){r||(n.trigger("doCollapseAll"),e.stopPropagation())})}),n.children("li").each(function(){var t,n=e(this),s=n.children("ul");if(s.length>0){o.detach&&(o.cloneOnDetach&&(t=s.clone(),t.attr("class","").hide().appendTo(s.parent())),s.detach().appendTo(i));for(var a=o.baseZIndex,l=1,r=s;r.length>0;l++)r.css("z-index",a++),o.submenuClassPrefix&&r.addClass(o.submenuClassPrefix+(a-1-o.baseZIndex)),r=r.find("> li > ul")}}),l.on("scroll",function(){n.trigger("doCollapseAll")}).on("keypress",function(e){r||27!=e.keyCode||(e.preventDefault(),n.trigger("doCollapseAll"))}),a.on("click touchend",function(){r||n.trigger("doCollapseAll")})}}(jQuery); 2!function(e){e.fn.disableSelection_dropotron=function(){return e(this).css("user-select","none").css("-khtml-user-select","none").css("-moz-user-select","none").css("-o-user-select","none").css("-webkit-user-select","none")},e.fn.dropotron=function(t){if(0==this.length)return e(this);if(this.length>1)for(var o=0;o<this.length;o++)e(this[o]).dropotron(t);return e.dropotron(e.extend({selectorParent:e(this)},t))},e.dropotron=function(t){var o=e.extend({selectorParent:null,baseZIndex:1e3,menuClass:"dropotron",expandMode:"hover",hoverDelay:150,hideDelay:250,openerClass:"opener",openerActiveClass:"active",submenuClassPrefix:"level-",mode:"fade",speed:"fast",easing:"swing",alignment:"left",offsetX:0,offsetY:0,globalOffsetY:0,IEOffsetX:0,IEOffsetY:0,noOpenerFade:!0,detach:!0,cloneOnDetach:!0},t),n=o.selectorParent,s=n.find("ul"),i=e("body"),a=e("body,html"),l=e(window),r=!1,d=null,c=null;n.on("doCollapseAll",function(){s.trigger("doCollapse")}),s.each(function(){var t=e(this),n=t.parent();o.hideDelay>0&&t.add(n).on("mouseleave",function(e){window.clearTimeout(c),c=window.setTimeout(function(){t.trigger("doCollapse")},o.hideDelay)}),t.disableSelection_dropotron().hide().addClass(o.menuClass).css("position","absolute").on("mouseenter",function(e){window.clearTimeout(c)}).on("doExpand",function(){if(t.is(":visible"))return!1;window.clearTimeout(c),s.each(function(){var t=e(this);e.contains(t.get(0),n.get(0))||t.trigger("doCollapse")});var i,a,d,f,u=n.offset(),p=n.position(),h=(n.parent().position(),n.outerWidth()),g=t.outerWidth(),v=t.css("z-index")==o.baseZIndex;if(v){switch(i=o.detach?u:p,f=i.top+n.outerHeight()+o.globalOffsetY,a=o.alignment,t.removeClass("left").removeClass("right").removeClass("center"),o.alignment){case"right":d=i.left-g+h,0>d&&(d=i.left,a="left");break;case"center":d=i.left-Math.floor((g-h)/2),0>d?(d=i.left,a="left"):d+g>l.width()&&(d=i.left-g+h,a="right");break;case"left":default:d=i.left,d+g>l.width()&&(d=i.left-g+h,a="right")}t.addClass(a)}else switch("relative"==n.css("position")||"absolute"==n.css("position")?(f=o.offsetY,d=-1*p.left):(f=p.top+o.offsetY,d=0),o.alignment){case"right":d+=-1*n.parent().outerWidth()+o.offsetX;break;case"center":case"left":default:d+=n.parent().outerWidth()+o.offsetX}navigator.userAgent.match(/MSIE ([0-9]+)\./)&&RegExp.$1<8&&(d+=o.IEOffsetX,f+=o.IEOffsetY),t.css("left",d+"px").css("top",f+"px").css("opacity","0.01").show();var C=!1;switch(d="relative"==n.css("position")||"absolute"==n.css("position")?-1*p.left:0,t.offset().left<0?(d+=n.parent().outerWidth()-o.offsetX,C=!0):t.offset().left+g>l.width()&&(d+=-1*n.parent().outerWidth()-o.offsetX,C=!0),C&&t.css("left",d+"px"),t.hide().css("opacity","1"),o.mode){case"zoom":r=!0,n.addClass(o.openerActiveClass),t.animate({width:"toggle",height:"toggle"},o.speed,o.easing,function(){r=!1});break;case"slide":r=!0,n.addClass(o.openerActiveClass),t.animate({height:"toggle"},o.speed,o.easing,function(){r=!1});break;case"fade":if(r=!0,v&&!o.noOpenerFade){var C;C="slow"==o.speed?80:"fast"==o.speed?40:Math.floor(o.speed/2),n.fadeTo(C,.01,function(){n.addClass(o.openerActiveClass),n.fadeTo(o.speed,1),t.fadeIn(o.speed,function(){r=!1})})}else n.addClass(o.openerActiveClass),n.fadeTo(o.speed,1),t.fadeIn(o.speed,function(){r=!1});break;case"instant":default:n.addClass(o.openerActiveClass),t.show()}return!1}).on("doCollapse",function(){return t.is(":visible")?(t.hide(),n.removeClass(o.openerActiveClass),t.find("."+o.openerActiveClass).removeClass(o.openerActiveClass),t.find("ul").hide(),!1):!1}).on("doToggle",function(e){return t.is(":visible")?t.trigger("doCollapse"):t.trigger("doExpand"),!1}),n.disableSelection_dropotron().addClass("opener").css("cursor","pointer").on("click touchend",function(e){r||(e.preventDefault(),e.stopPropagation(),t.trigger("doToggle"))}),"hover"==o.expandMode&&n.hover(function(e){r||(d=window.setTimeout(function(){t.trigger("doExpand")},o.hoverDelay))},function(e){window.clearTimeout(d)})}),s.find("a").css("display","block").on("click touchend",function(t){r||e(this).attr("href").length<1&&t.preventDefault()}),n.find("li").css("white-space","nowrap").each(function(){var t=e(this),o=t.children("a"),s=t.children("ul"),i=o.attr("href");o.on("click touchend",function(e){0==i.length||"#"==i?e.preventDefault():e.stopPropagation()}),o.length>0&&0==s.length&&t.on("click touchend",function(e){r||(n.trigger("doCollapseAll"),e.stopPropagation())})}),n.children("li").each(function(){var t,n=e(this),s=n.children("ul");if(s.length>0){o.detach&&(o.cloneOnDetach&&(t=s.clone(),t.attr("class","").hide().appendTo(s.parent())),s.detach().appendTo(i));for(var a=o.baseZIndex,l=1,r=s;r.length>0;l++)r.css("z-index",a++),o.submenuClassPrefix&&r.addClass(o.submenuClassPrefix+(a-1-o.baseZIndex)),r=r.find("> li > ul")}}),l.on("scroll",function(){n.trigger("doCollapseAll")}).on("keypress",function(e){r||27!=e.keyCode||(e.preventDefault(),n.trigger("doCollapseAll"))}),a.on("click touchend",function(){r||n.trigger("doCollapseAll")})}}(jQuery);
diff --git a/www/assets/js/main.js b/www/assets/js/main.js
index ba78d4c..b9f64d1 100644
--- a/www/assets/js/main.js
+++ b/www/assets/js/main.js
@@ -1,86 +1,86 @@
1/* 1/*
2 Arcana by HTML5 UP 2 Arcana by HTML5 UP
3 html5up.net | @ajlkn 3 html5up.net | @ajlkn
4 Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 4 Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
5*/ 5*/
6 6
7(function($) { 7(function($) {
8 8
9 skel.breakpoints({ 9 skel.breakpoints({
10 wide: '(max-width: 1680px)', 10 wide: '(max-width: 1680px)',
11 normal: '(max-width: 1280px)', 11 normal: '(max-width: 1280px)',
12 narrow: '(max-width: 980px)', 12 narrow: '(max-width: 980px)',
13 narrower: '(max-width: 840px)', 13 narrower: '(max-width: 840px)',
14 mobile: '(max-width: 736px)', 14 mobile: '(max-width: 736px)',
15 mobilep: '(max-width: 480px)' 15 mobilep: '(max-width: 480px)'
16 }); 16 });
17 17
18 $(function() { 18 $(function() {
19 19
20 var $window = $(window), 20 var $window = $(window),
21 $body = $('body'); 21 $body = $('body');
22 22
23 // Disable animations/transitions until the page has loaded. 23 // Disable animations/transitions until the page has loaded.
24 $body.addClass('is-loading'); 24 $body.addClass('is-loading');
25 25
26 $window.on('load', function() { 26 $window.on('load', function() {
27 $body.removeClass('is-loading'); 27 $body.removeClass('is-loading');
28 }); 28 });
29 29
30 // Fix: Placeholder polyfill. 30 // Fix: Placeholder polyfill.
31 $('form').placeholder(); 31 $('form').placeholder();
32 32
33 // Prioritize "important" elements on narrower. 33 // Prioritize "important" elements on narrower.
34 skel.on('+narrower -narrower', function() { 34 skel.on('+narrower -narrower', function() {
35 $.prioritize( 35 $.prioritize(
36 '.important\\28 narrower\\29', 36 '.important\\28 narrower\\29',
37 skel.breakpoint('narrower').active 37 skel.breakpoint('narrower').active
38 ); 38 );
39 }); 39 });
40 40
41 // Dropdowns. 41 // Dropdowns.
42 $('#nav > ul').dropotron({ 42 $('#nav > ul').dropotron({
43 offsetY: -15, 43 offsetY: -15,
44 hoverDelay: 0, 44 hoverDelay: 0,
45 alignment: 'center' 45 alignment: 'center'
46 }); 46 });
47 47
48 // Off-Canvas Navigation. 48 // Off-Canvas Navigation.
49 49
50 // Title Bar. 50 // Title Bar.
51 $( 51 $(
52 '<div id="titleBar">' + 52 '<div id="titleBar">' +
53 '<a href="#navPanel" class="toggle"></a>' + 53 '<a href="#navPanel" class="toggle"></a>' +
54 '<span class="title">' + $('#logo').html() + '</span>' + 54 '<span class="title">' + $('#logo').html() + '</span>' +
55 '</div>' 55 '</div>'
56 ) 56 )
57 .appendTo($body); 57 .appendTo($body);
58 58
59 // Navigation Panel. 59 // Navigation Panel.
60 $( 60 $(
61 '<div id="navPanel">' + 61 '<div id="navPanel">' +
62 '<nav>' + 62 '<nav>' +
63 $('#nav').navList() + 63 $('#nav').navList() +
64 '</nav>' + 64 '</nav>' +
65 '</div>' 65 '</div>'
66 ) 66 )
67 .appendTo($body) 67 .appendTo($body)
68 .panel({ 68 .panel({
69 delay: 500, 69 delay: 500,
70 hideOnClick: true, 70 hideOnClick: true,
71 hideOnSwipe: true, 71 hideOnSwipe: true,
72 resetScroll: true, 72 resetScroll: true,
73 resetForms: true, 73 resetForms: true,
74 side: 'left', 74 side: 'left',
75 target: $body, 75 target: $body,
76 visibleClass: 'navPanel-visible' 76 visibleClass: 'navPanel-visible'
77 }); 77 });
78 78
79 // Fix: Remove navPanel transitions on WP<10 (poor/buggy performance). 79 // Fix: Remove navPanel transitions on WP<10 (poor/buggy performance).
80 if (skel.vars.os == 'wp' && skel.vars.osVersion < 10) 80 if (skel.vars.os == 'wp' && skel.vars.osVersion < 10)
81 $('#titleBar, #navPanel, #page-wrapper') 81 $('#titleBar, #navPanel, #page-wrapper')
82 .css('transition', 'none'); 82 .css('transition', 'none');
83 83
84 }); 84 });
85 85
86})(jQuery); \ No newline at end of file 86})(jQuery); \ No newline at end of file
diff --git a/www/assets/js/skel.min.js b/www/assets/js/skel.min.js
index 0e7633a..6ca4bf1 100644
--- a/www/assets/js/skel.min.js
+++ b/www/assets/js/skel.min.js
@@ -1,2 +1,2 @@
1/* skel.js v3.0.1 | (c) skel.io | MIT licensed */ 1/* skel.js v3.0.1 | (c) skel.io | MIT licensed */
2var skel=function(){"use strict";var t={breakpointIds:null,events:{},isInit:!1,obj:{attachments:{},breakpoints:{},head:null,states:{}},sd:"/",state:null,stateHandlers:{},stateId:"",vars:{},DOMReady:null,indexOf:null,isArray:null,iterate:null,matchesMedia:null,extend:function(e,n){t.iterate(n,function(i){t.isArray(n[i])?(t.isArray(e[i])||(e[i]=[]),t.extend(e[i],n[i])):"object"==typeof n[i]?("object"!=typeof e[i]&&(e[i]={}),t.extend(e[i],n[i])):e[i]=n[i]})},newStyle:function(t){var e=document.createElement("style");return e.type="text/css",e.innerHTML=t,e},_canUse:null,canUse:function(e){t._canUse||(t._canUse=document.createElement("div"));var n=t._canUse.style,i=e.charAt(0).toUpperCase()+e.slice(1);return e in n||"Moz"+i in n||"Webkit"+i in n||"O"+i in n||"ms"+i in n},on:function(e,n){var i=e.split(/[\s]+/);return t.iterate(i,function(e){var a=i[e];if(t.isInit){if("init"==a)return void n();if("change"==a)n();else{var r=a.charAt(0);if("+"==r||"!"==r){var o=a.substring(1);if(o in t.obj.breakpoints)if("+"==r&&t.obj.breakpoints[o].active)n();else if("!"==r&&!t.obj.breakpoints[o].active)return void n()}}}t.events[a]||(t.events[a]=[]),t.events[a].push(n)}),t},trigger:function(e){return t.events[e]&&0!=t.events[e].length?(t.iterate(t.events[e],function(n){t.events[e][n]()}),t):void 0},breakpoint:function(e){return t.obj.breakpoints[e]},breakpoints:function(e){function n(t,e){this.name=this.id=t,this.media=e,this.active=!1,this.wasActive=!1}return n.prototype.matches=function(){return t.matchesMedia(this.media)},n.prototype.sync=function(){this.wasActive=this.active,this.active=this.matches()},t.iterate(e,function(i){t.obj.breakpoints[i]=new n(i,e[i])}),window.setTimeout(function(){t.poll()},0),t},addStateHandler:function(e,n){t.stateHandlers[e]=n},callStateHandler:function(e){var n=t.stateHandlers[e]();t.iterate(n,function(e){t.state.attachments.push(n[e])})},changeState:function(e){t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].sync()}),t.vars.lastStateId=t.stateId,t.stateId=e,t.breakpointIds=t.stateId===t.sd?[]:t.stateId.substring(1).split(t.sd),t.obj.states[t.stateId]?t.state=t.obj.states[t.stateId]:(t.obj.states[t.stateId]={attachments:[]},t.state=t.obj.states[t.stateId],t.iterate(t.stateHandlers,t.callStateHandler)),t.detachAll(t.state.attachments),t.attachAll(t.state.attachments),t.vars.stateId=t.stateId,t.vars.state=t.state,t.trigger("change"),t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].active?t.obj.breakpoints[e].wasActive||t.trigger("+"+e):t.obj.breakpoints[e].wasActive&&t.trigger("-"+e)})},generateStateConfig:function(e,n){var i={};return t.extend(i,e),t.iterate(t.breakpointIds,function(e){t.extend(i,n[t.breakpointIds[e]])}),i},getStateId:function(){var e="";return t.iterate(t.obj.breakpoints,function(n){var i=t.obj.breakpoints[n];i.matches()&&(e+=t.sd+i.id)}),e},poll:function(){var e="";e=t.getStateId(),""===e&&(e=t.sd),e!==t.stateId&&t.changeState(e)},_attach:null,attach:function(e){var n=t.obj.head,i=e.element;return i.parentNode&&i.parentNode.tagName?!1:(t._attach||(t._attach=n.firstChild),n.insertBefore(i,t._attach.nextSibling),e.permanent&&(t._attach=i),!0)},attachAll:function(e){var n=[];t.iterate(e,function(t){n[e[t].priority]||(n[e[t].priority]=[]),n[e[t].priority].push(e[t])}),n.reverse(),t.iterate(n,function(e){t.iterate(n[e],function(i){t.attach(n[e][i])})})},detach:function(t){var e=t.element;return t.permanent||!e.parentNode||e.parentNode&&!e.parentNode.tagName?!1:(e.parentNode.removeChild(e),!0)},detachAll:function(e){var n={};t.iterate(e,function(t){n[e[t].id]=!0}),t.iterate(t.obj.attachments,function(e){e in n||t.detach(t.obj.attachments[e])})},attachment:function(e){return e in t.obj.attachments?t.obj.attachments[e]:null},newAttachment:function(e,n,i,a){return t.obj.attachments[e]={id:e,element:n,priority:i,permanent:a}},init:function(){t.initMethods(),t.initVars(),t.initEvents(),t.obj.head=document.getElementsByTagName("head")[0],t.isInit=!0,t.trigger("init")},initEvents:function(){t.on("resize",function(){t.poll()}),t.on("orientationChange",function(){t.poll()}),t.DOMReady(function(){t.trigger("ready")}),window.onload&&t.on("load",window.onload),window.onload=function(){t.trigger("load")},window.onresize&&t.on("resize",window.onresize),window.onresize=function(){t.trigger("resize")},window.onorientationchange&&t.on("orientationChange",window.onorientationchange),window.onorientationchange=function(){t.trigger("orientationChange")}},initMethods:function(){document.addEventListener?!function(e,n){t.DOMReady=n()}("domready",function(){function t(t){for(r=1;t=n.shift();)t()}var e,n=[],i=document,a="DOMContentLoaded",r=/^loaded|^c/.test(i.readyState);return i.addEventListener(a,e=function(){i.removeEventListener(a,e),t()}),function(t){r?t():n.push(t)}}):!function(e,n){t.DOMReady=n()}("domready",function(t){function e(t){for(h=1;t=i.shift();)t()}var n,i=[],a=!1,r=document,o=r.documentElement,s=o.doScroll,c="DOMContentLoaded",d="addEventListener",u="onreadystatechange",l="readyState",f=s?/^loaded|^c/:/^loaded|c/,h=f.test(r[l]);return r[d]&&r[d](c,n=function(){r.removeEventListener(c,n,a),e()},a),s&&r.attachEvent(u,n=function(){/^c/.test(r[l])&&(r.detachEvent(u,n),e())}),t=s?function(e){self!=top?h?e():i.push(e):function(){try{o.doScroll("left")}catch(n){return setTimeout(function(){t(e)},50)}e()}()}:function(t){h?t():i.push(t)}}),Array.prototype.indexOf?t.indexOf=function(t,e){return t.indexOf(e)}:t.indexOf=function(t,e){if("string"==typeof t)return t.indexOf(e);var n,i,a=e?e:0;if(!this)throw new TypeError;if(i=this.length,0===i||a>=i)return-1;for(0>a&&(a=i-Math.abs(a)),n=a;i>n;n++)if(this[n]===t)return n;return-1},Array.isArray?t.isArray=function(t){return Array.isArray(t)}:t.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)},Object.keys?t.iterate=function(t,e){if(!t)return[];var n,i=Object.keys(t);for(n=0;i[n]&&e(i[n],t[i[n]])!==!1;n++);}:t.iterate=function(t,e){if(!t)return[];var n;for(n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&e(n,t[n])===!1)break},window.matchMedia?t.matchesMedia=function(t){return""==t?!0:window.matchMedia(t).matches}:window.styleMedia||window.media?t.matchesMedia=function(t){if(""==t)return!0;var e=window.styleMedia||window.media;return e.matchMedium(t||"all")}:window.getComputedStyle?t.matchesMedia=function(t){if(""==t)return!0;var e=document.createElement("style"),n=document.getElementsByTagName("script")[0],i=null;e.type="text/css",e.id="matchmediajs-test",n.parentNode.insertBefore(e,n),i="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle;var a="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=a:e.textContent=a,"1px"===i.width}:t.matchesMedia=function(t){if(""==t)return!0;var e,n,i,a,r={"min-width":null,"max-width":null},o=!1;for(i=t.split(/\s+and\s+/),e=0;e<i.length;e++)n=i[e],"("==n.charAt(0)&&(n=n.substring(1,n.length-1),a=n.split(/:\s+/),2==a.length&&(r[a[0].replace(/^\s+|\s+$/g,"")]=parseInt(a[1]),o=!0));if(!o)return!1;var s=document.documentElement.clientWidth,c=document.documentElement.clientHeight;return null!==r["min-width"]&&s<r["min-width"]||null!==r["max-width"]&&s>r["max-width"]||null!==r["min-height"]&&c<r["min-height"]||null!==r["max-height"]&&c>r["max-height"]?!1:!0},navigator.userAgent.match(/MSIE ([0-9]+)/)&&RegExp.$1<9&&(t.newStyle=function(t){var e=document.createElement("span");return e.innerHTML='&nbsp;<style type="text/css">'+t+"</style>",e})},initVars:function(){var e,n,i,a=navigator.userAgent;e="other",n=0,i=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(RegExp.$1),!1):void 0}),t.vars.browser=e,t.vars.browserVersion=n,e="other",n=0,i=[["ios",/([0-9_]+) like Mac OS X/,function(t){return t.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(t){return 0}],["wp",/Windows Phone ([0-9\.]+)/,null],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(t){return t.replace("_",".").replace("_","")}],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(i[2]?i[2](RegExp.$1):RegExp.$1),!1):void 0}),t.vars.os=e,t.vars.osVersion=n,t.vars.IEVersion="ie"==t.vars.browser?t.vars.browserVersion:99,t.vars.touch="wp"==t.vars.os?navigator.msMaxTouchPoints>0:!!("ontouchstart"in window),t.vars.mobile="wp"==t.vars.os||"android"==t.vars.os||"ios"==t.vars.os||"bb"==t.vars.os}};return t.init(),t}();!function(t,e){"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?module.exports=e():t.skel=e()}(this,function(){return skel}); 2var skel=function(){"use strict";var t={breakpointIds:null,events:{},isInit:!1,obj:{attachments:{},breakpoints:{},head:null,states:{}},sd:"/",state:null,stateHandlers:{},stateId:"",vars:{},DOMReady:null,indexOf:null,isArray:null,iterate:null,matchesMedia:null,extend:function(e,n){t.iterate(n,function(i){t.isArray(n[i])?(t.isArray(e[i])||(e[i]=[]),t.extend(e[i],n[i])):"object"==typeof n[i]?("object"!=typeof e[i]&&(e[i]={}),t.extend(e[i],n[i])):e[i]=n[i]})},newStyle:function(t){var e=document.createElement("style");return e.type="text/css",e.innerHTML=t,e},_canUse:null,canUse:function(e){t._canUse||(t._canUse=document.createElement("div"));var n=t._canUse.style,i=e.charAt(0).toUpperCase()+e.slice(1);return e in n||"Moz"+i in n||"Webkit"+i in n||"O"+i in n||"ms"+i in n},on:function(e,n){var i=e.split(/[\s]+/);return t.iterate(i,function(e){var a=i[e];if(t.isInit){if("init"==a)return void n();if("change"==a)n();else{var r=a.charAt(0);if("+"==r||"!"==r){var o=a.substring(1);if(o in t.obj.breakpoints)if("+"==r&&t.obj.breakpoints[o].active)n();else if("!"==r&&!t.obj.breakpoints[o].active)return void n()}}}t.events[a]||(t.events[a]=[]),t.events[a].push(n)}),t},trigger:function(e){return t.events[e]&&0!=t.events[e].length?(t.iterate(t.events[e],function(n){t.events[e][n]()}),t):void 0},breakpoint:function(e){return t.obj.breakpoints[e]},breakpoints:function(e){function n(t,e){this.name=this.id=t,this.media=e,this.active=!1,this.wasActive=!1}return n.prototype.matches=function(){return t.matchesMedia(this.media)},n.prototype.sync=function(){this.wasActive=this.active,this.active=this.matches()},t.iterate(e,function(i){t.obj.breakpoints[i]=new n(i,e[i])}),window.setTimeout(function(){t.poll()},0),t},addStateHandler:function(e,n){t.stateHandlers[e]=n},callStateHandler:function(e){var n=t.stateHandlers[e]();t.iterate(n,function(e){t.state.attachments.push(n[e])})},changeState:function(e){t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].sync()}),t.vars.lastStateId=t.stateId,t.stateId=e,t.breakpointIds=t.stateId===t.sd?[]:t.stateId.substring(1).split(t.sd),t.obj.states[t.stateId]?t.state=t.obj.states[t.stateId]:(t.obj.states[t.stateId]={attachments:[]},t.state=t.obj.states[t.stateId],t.iterate(t.stateHandlers,t.callStateHandler)),t.detachAll(t.state.attachments),t.attachAll(t.state.attachments),t.vars.stateId=t.stateId,t.vars.state=t.state,t.trigger("change"),t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].active?t.obj.breakpoints[e].wasActive||t.trigger("+"+e):t.obj.breakpoints[e].wasActive&&t.trigger("-"+e)})},generateStateConfig:function(e,n){var i={};return t.extend(i,e),t.iterate(t.breakpointIds,function(e){t.extend(i,n[t.breakpointIds[e]])}),i},getStateId:function(){var e="";return t.iterate(t.obj.breakpoints,function(n){var i=t.obj.breakpoints[n];i.matches()&&(e+=t.sd+i.id)}),e},poll:function(){var e="";e=t.getStateId(),""===e&&(e=t.sd),e!==t.stateId&&t.changeState(e)},_attach:null,attach:function(e){var n=t.obj.head,i=e.element;return i.parentNode&&i.parentNode.tagName?!1:(t._attach||(t._attach=n.firstChild),n.insertBefore(i,t._attach.nextSibling),e.permanent&&(t._attach=i),!0)},attachAll:function(e){var n=[];t.iterate(e,function(t){n[e[t].priority]||(n[e[t].priority]=[]),n[e[t].priority].push(e[t])}),n.reverse(),t.iterate(n,function(e){t.iterate(n[e],function(i){t.attach(n[e][i])})})},detach:function(t){var e=t.element;return t.permanent||!e.parentNode||e.parentNode&&!e.parentNode.tagName?!1:(e.parentNode.removeChild(e),!0)},detachAll:function(e){var n={};t.iterate(e,function(t){n[e[t].id]=!0}),t.iterate(t.obj.attachments,function(e){e in n||t.detach(t.obj.attachments[e])})},attachment:function(e){return e in t.obj.attachments?t.obj.attachments[e]:null},newAttachment:function(e,n,i,a){return t.obj.attachments[e]={id:e,element:n,priority:i,permanent:a}},init:function(){t.initMethods(),t.initVars(),t.initEvents(),t.obj.head=document.getElementsByTagName("head")[0],t.isInit=!0,t.trigger("init")},initEvents:function(){t.on("resize",function(){t.poll()}),t.on("orientationChange",function(){t.poll()}),t.DOMReady(function(){t.trigger("ready")}),window.onload&&t.on("load",window.onload),window.onload=function(){t.trigger("load")},window.onresize&&t.on("resize",window.onresize),window.onresize=function(){t.trigger("resize")},window.onorientationchange&&t.on("orientationChange",window.onorientationchange),window.onorientationchange=function(){t.trigger("orientationChange")}},initMethods:function(){document.addEventListener?!function(e,n){t.DOMReady=n()}("domready",function(){function t(t){for(r=1;t=n.shift();)t()}var e,n=[],i=document,a="DOMContentLoaded",r=/^loaded|^c/.test(i.readyState);return i.addEventListener(a,e=function(){i.removeEventListener(a,e),t()}),function(t){r?t():n.push(t)}}):!function(e,n){t.DOMReady=n()}("domready",function(t){function e(t){for(h=1;t=i.shift();)t()}var n,i=[],a=!1,r=document,o=r.documentElement,s=o.doScroll,c="DOMContentLoaded",d="addEventListener",u="onreadystatechange",l="readyState",f=s?/^loaded|^c/:/^loaded|c/,h=f.test(r[l]);return r[d]&&r[d](c,n=function(){r.removeEventListener(c,n,a),e()},a),s&&r.attachEvent(u,n=function(){/^c/.test(r[l])&&(r.detachEvent(u,n),e())}),t=s?function(e){self!=top?h?e():i.push(e):function(){try{o.doScroll("left")}catch(n){return setTimeout(function(){t(e)},50)}e()}()}:function(t){h?t():i.push(t)}}),Array.prototype.indexOf?t.indexOf=function(t,e){return t.indexOf(e)}:t.indexOf=function(t,e){if("string"==typeof t)return t.indexOf(e);var n,i,a=e?e:0;if(!this)throw new TypeError;if(i=this.length,0===i||a>=i)return-1;for(0>a&&(a=i-Math.abs(a)),n=a;i>n;n++)if(this[n]===t)return n;return-1},Array.isArray?t.isArray=function(t){return Array.isArray(t)}:t.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)},Object.keys?t.iterate=function(t,e){if(!t)return[];var n,i=Object.keys(t);for(n=0;i[n]&&e(i[n],t[i[n]])!==!1;n++);}:t.iterate=function(t,e){if(!t)return[];var n;for(n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&e(n,t[n])===!1)break},window.matchMedia?t.matchesMedia=function(t){return""==t?!0:window.matchMedia(t).matches}:window.styleMedia||window.media?t.matchesMedia=function(t){if(""==t)return!0;var e=window.styleMedia||window.media;return e.matchMedium(t||"all")}:window.getComputedStyle?t.matchesMedia=function(t){if(""==t)return!0;var e=document.createElement("style"),n=document.getElementsByTagName("script")[0],i=null;e.type="text/css",e.id="matchmediajs-test",n.parentNode.insertBefore(e,n),i="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle;var a="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=a:e.textContent=a,"1px"===i.width}:t.matchesMedia=function(t){if(""==t)return!0;var e,n,i,a,r={"min-width":null,"max-width":null},o=!1;for(i=t.split(/\s+and\s+/),e=0;e<i.length;e++)n=i[e],"("==n.charAt(0)&&(n=n.substring(1,n.length-1),a=n.split(/:\s+/),2==a.length&&(r[a[0].replace(/^\s+|\s+$/g,"")]=parseInt(a[1]),o=!0));if(!o)return!1;var s=document.documentElement.clientWidth,c=document.documentElement.clientHeight;return null!==r["min-width"]&&s<r["min-width"]||null!==r["max-width"]&&s>r["max-width"]||null!==r["min-height"]&&c<r["min-height"]||null!==r["max-height"]&&c>r["max-height"]?!1:!0},navigator.userAgent.match(/MSIE ([0-9]+)/)&&RegExp.$1<9&&(t.newStyle=function(t){var e=document.createElement("span");return e.innerHTML='&nbsp;<style type="text/css">'+t+"</style>",e})},initVars:function(){var e,n,i,a=navigator.userAgent;e="other",n=0,i=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(RegExp.$1),!1):void 0}),t.vars.browser=e,t.vars.browserVersion=n,e="other",n=0,i=[["ios",/([0-9_]+) like Mac OS X/,function(t){return t.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(t){return 0}],["wp",/Windows Phone ([0-9\.]+)/,null],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(t){return t.replace("_",".").replace("_","")}],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(i[2]?i[2](RegExp.$1):RegExp.$1),!1):void 0}),t.vars.os=e,t.vars.osVersion=n,t.vars.IEVersion="ie"==t.vars.browser?t.vars.browserVersion:99,t.vars.touch="wp"==t.vars.os?navigator.msMaxTouchPoints>0:!!("ontouchstart"in window),t.vars.mobile="wp"==t.vars.os||"android"==t.vars.os||"ios"==t.vars.os||"bb"==t.vars.os}};return t.init(),t}();!function(t,e){"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?module.exports=e():t.skel=e()}(this,function(){return skel});
diff --git a/www/assets/js/util.js b/www/assets/js/util.js
index bdb8e9f..ecf7b37 100644
--- a/www/assets/js/util.js
+++ b/www/assets/js/util.js
@@ -1,587 +1,587 @@
1(function($) { 1(function($) {
2 2
3 /** 3 /**
4 * Generate an indented list of links from a nav. Meant for use with panel(). 4 * Generate an indented list of links from a nav. Meant for use with panel().
5 * @return {jQuery} jQuery object. 5 * @return {jQuery} jQuery object.
6 */ 6 */
7 $.fn.navList = function() { 7 $.fn.navList = function() {
8 8
9 var $this = $(this); 9 var $this = $(this);
10 $a = $this.find('a'), 10 $a = $this.find('a'),
11 b = []; 11 b = [];
12 12
13 $a.each(function() { 13 $a.each(function() {
14 14
15 var $this = $(this), 15 var $this = $(this),
16 indent = Math.max(0, $this.parents('li').length - 1), 16 indent = Math.max(0, $this.parents('li').length - 1),
17 href = $this.attr('href'), 17 href = $this.attr('href'),
18 target = $this.attr('target'); 18 target = $this.attr('target');
19 19
20 b.push( 20 b.push(
21 '<a ' + 21 '<a ' +
22 'class="link depth-' + indent + '"' + 22 'class="link depth-' + indent + '"' +
23 ( (typeof target !== 'undefined' && target != '') ? ' target="' + target + '"' : '') + 23 ( (typeof target !== 'undefined' && target != '') ? ' target="' + target + '"' : '') +
24 ( (typeof href !== 'undefined' && href != '') ? ' href="' + href + '"' : '') + 24 ( (typeof href !== 'undefined' && href != '') ? ' href="' + href + '"' : '') +
25 '>' + 25 '>' +
26 '<span class="indent-' + indent + '"></span>' + 26 '<span class="indent-' + indent + '"></span>' +
27 $this.text() + 27 $this.text() +
28 '</a>' 28 '</a>'
29 ); 29 );
30 30
31 }); 31 });
32 32
33 return b.join(''); 33 return b.join('');
34 34
35 }; 35 };
36 36
37 /** 37 /**
38 * Panel-ify an element. 38 * Panel-ify an element.
39 * @param {object} userConfig User config. 39 * @param {object} userConfig User config.
40 * @return {jQuery} jQuery object. 40 * @return {jQuery} jQuery object.
41 */ 41 */
42 $.fn.panel = function(userConfig) { 42 $.fn.panel = function(userConfig) {
43 43
44 // No elements? 44 // No elements?
45 if (this.length == 0) 45 if (this.length == 0)
46 return $this; 46 return $this;
47 47
48 // Multiple elements? 48 // Multiple elements?
49 if (this.length > 1) { 49 if (this.length > 1) {
50 50
51 for (var i=0; i < this.length; i++) 51 for (var i=0; i < this.length; i++)
52 $(this[i]).panel(userConfig); 52 $(this[i]).panel(userConfig);
53 53
54 return $this; 54 return $this;
55 55
56 } 56 }
57 57
58 // Vars. 58 // Vars.
59 var $this = $(this), 59 var $this = $(this),
60 $body = $('body'), 60 $body = $('body'),
61 $window = $(window), 61 $window = $(window),
62 id = $this.attr('id'), 62 id = $this.attr('id'),
63 config; 63 config;
64 64
65 // Config. 65 // Config.
66 config = $.extend({ 66 config = $.extend({
67 67
68 // Delay. 68 // Delay.
69 delay: 0, 69 delay: 0,
70 70
71 // Hide panel on link click. 71 // Hide panel on link click.
72 hideOnClick: false, 72 hideOnClick: false,
73 73
74 // Hide panel on escape keypress. 74 // Hide panel on escape keypress.
75 hideOnEscape: false, 75 hideOnEscape: false,
76 76
77 // Hide panel on swipe. 77 // Hide panel on swipe.
78 hideOnSwipe: false, 78 hideOnSwipe: false,
79 79
80 // Reset scroll position on hide. 80 // Reset scroll position on hide.
81 resetScroll: false, 81 resetScroll: false,
82 82
83 // Reset forms on hide. 83 // Reset forms on hide.
84 resetForms: false, 84 resetForms: false,
85 85
86 // Side of viewport the panel will appear. 86 // Side of viewport the panel will appear.
87 side: null, 87 side: null,
88 88
89 // Target element for "class". 89 // Target element for "class".
90 target: $this, 90 target: $this,
91 91
92 // Class to toggle. 92 // Class to toggle.
93 visibleClass: 'visible' 93 visibleClass: 'visible'
94 94
95 }, userConfig); 95 }, userConfig);
96 96
97 // Expand "target" if it's not a jQuery object already. 97 // Expand "target" if it's not a jQuery object already.
98 if (typeof config.target != 'jQuery') 98 if (typeof config.target != 'jQuery')
99 config.target = $(config.target); 99 config.target = $(config.target);
100 100
101 // Panel. 101 // Panel.
102 102
103 // Methods. 103 // Methods.
104 $this._hide = function(event) { 104 $this._hide = function(event) {
105 105
106 // Already hidden? Bail. 106 // Already hidden? Bail.
107 if (!config.target.hasClass(config.visibleClass)) 107 if (!config.target.hasClass(config.visibleClass))
108 return; 108 return;
109 109
110 // If an event was provided, cancel it. 110 // If an event was provided, cancel it.
111 if (event) { 111 if (event) {
112 112
113 event.preventDefault(); 113 event.preventDefault();
114 event.stopPropagation(); 114 event.stopPropagation();
115 115
116 } 116 }
117 117
118 // Hide. 118 // Hide.
119 config.target.removeClass(config.visibleClass); 119 config.target.removeClass(config.visibleClass);
120 120
121 // Post-hide stuff. 121 // Post-hide stuff.
122 window.setTimeout(function() { 122 window.setTimeout(function() {
123 123
124 // Reset scroll position. 124 // Reset scroll position.
125 if (config.resetScroll) 125 if (config.resetScroll)
126 $this.scrollTop(0); 126 $this.scrollTop(0);
127 127
128 // Reset forms. 128 // Reset forms.
129 if (config.resetForms) 129 if (config.resetForms)
130 $this.find('form').each(function() { 130 $this.find('form').each(function() {
131 this.reset(); 131 this.reset();
132 }); 132 });
133 133
134 }, config.delay); 134 }, config.delay);
135 135
136 }; 136 };
137 137
138 // Vendor fixes. 138 // Vendor fixes.
139 $this 139 $this
140 .css('-ms-overflow-style', '-ms-autohiding-scrollbar') 140 .css('-ms-overflow-style', '-ms-autohiding-scrollbar')
141 .css('-webkit-overflow-scrolling', 'touch'); 141 .css('-webkit-overflow-scrolling', 'touch');
142 142
143 // Hide on click. 143 // Hide on click.
144 if (config.hideOnClick) { 144 if (config.hideOnClick) {
145 145
146 $this.find('a') 146 $this.find('a')
147 .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); 147 .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)');
148 148
149 $this 149 $this
150 .on('click', 'a', function(event) { 150 .on('click', 'a', function(event) {
151 151
152 var $a = $(this), 152 var $a = $(this),
153 href = $a.attr('href'), 153 href = $a.attr('href'),
154 target = $a.attr('target'); 154 target = $a.attr('target');
155 155
156 if (!href || href == '#' || href == '' || href == '#' + id) 156 if (!href || href == '#' || href == '' || href == '#' + id)
157 return; 157 return;
158 158
159 // Cancel original event. 159 // Cancel original event.
160 event.preventDefault(); 160 event.preventDefault();
161 event.stopPropagation(); 161 event.stopPropagation();
162 162
163 // Hide panel. 163 // Hide panel.
164 $this._hide(); 164 $this._hide();
165 165
166 // Redirect to href. 166 // Redirect to href.
167 window.setTimeout(function() { 167 window.setTimeout(function() {
168 168
169 if (target == '_blank') 169 if (target == '_blank')
170 window.open(href); 170 window.open(href);
171 else 171 else
172 window.location.href = href; 172 window.location.href = href;
173 173
174 }, config.delay + 10); 174 }, config.delay + 10);
175 175
176 }); 176 });
177 177
178 } 178 }
179 179
180 // Event: Touch stuff. 180 // Event: Touch stuff.
181 $this.on('touchstart', function(event) { 181 $this.on('touchstart', function(event) {
182 182
183 $this.touchPosX = event.originalEvent.touches[0].pageX; 183 $this.touchPosX = event.originalEvent.touches[0].pageX;
184 $this.touchPosY = event.originalEvent.touches[0].pageY; 184 $this.touchPosY = event.originalEvent.touches[0].pageY;
185 185
186 }) 186 })
187 187
188 $this.on('touchmove', function(event) { 188 $this.on('touchmove', function(event) {
189 189
190 if ($this.touchPosX === null 190 if ($this.touchPosX === null
191 || $this.touchPosY === null) 191 || $this.touchPosY === null)
192 return; 192 return;
193 193
194 var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX, 194 var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX,
195 diffY = $this.touchPosY - event.originalEvent.touches[0].pageY, 195 diffY = $this.touchPosY - event.originalEvent.touches[0].pageY,
196 th = $this.outerHeight(), 196 th = $this.outerHeight(),
197 ts = ($this.get(0).scrollHeight - $this.scrollTop()); 197 ts = ($this.get(0).scrollHeight - $this.scrollTop());
198 198
199 // Hide on swipe? 199 // Hide on swipe?
200 if (config.hideOnSwipe) { 200 if (config.hideOnSwipe) {
201 201
202 var result = false, 202 var result = false,
203 boundary = 20, 203 boundary = 20,
204 delta = 50; 204 delta = 50;
205 205
206 switch (config.side) { 206 switch (config.side) {
207 207
208 case 'left': 208 case 'left':
209 result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta); 209 result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta);
210 break; 210 break;
211 211
212 case 'right': 212 case 'right':
213 result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta)); 213 result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta));
214 break; 214 break;
215 215
216 case 'top': 216 case 'top':
217 result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta); 217 result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta);
218 break; 218 break;
219 219
220 case 'bottom': 220 case 'bottom':
221 result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta)); 221 result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta));
222 break; 222 break;
223 223
224 default: 224 default:
225 break; 225 break;
226 226
227 } 227 }
228 228
229 if (result) { 229 if (result) {
230 230
231 $this.touchPosX = null; 231 $this.touchPosX = null;
232 $this.touchPosY = null; 232 $this.touchPosY = null;
233 $this._hide(); 233 $this._hide();
234 234
235 return false; 235 return false;
236 236
237 } 237 }
238 238
239 } 239 }
240 240
241 // Prevent vertical scrolling past the top or bottom. 241 // Prevent vertical scrolling past the top or bottom.
242 if (($this.scrollTop() < 0 && diffY < 0) 242 if (($this.scrollTop() < 0 && diffY < 0)
243 || (ts > (th - 2) && ts < (th + 2) && diffY > 0)) { 243 || (ts > (th - 2) && ts < (th + 2) && diffY > 0)) {
244 244
245 event.preventDefault(); 245 event.preventDefault();
246 event.stopPropagation(); 246 event.stopPropagation();
247 247
248 } 248 }
249 249
250 }); 250 });
251 251
252 // Event: Prevent certain events inside the panel from bubbling. 252 // Event: Prevent certain events inside the panel from bubbling.
253 $this.on('click touchend touchstart touchmove', function(event) { 253 $this.on('click touchend touchstart touchmove', function(event) {
254 event.stopPropagation(); 254 event.stopPropagation();
255 }); 255 });
256 256
257 // Event: Hide panel if a child anchor tag pointing to its ID is clicked. 257 // Event: Hide panel if a child anchor tag pointing to its ID is clicked.
258 $this.on('click', 'a[href="#' + id + '"]', function(event) { 258 $this.on('click', 'a[href="#' + id + '"]', function(event) {
259 259
260 event.preventDefault(); 260 event.preventDefault();
261 event.stopPropagation(); 261 event.stopPropagation();
262 262
263 config.target.removeClass(config.visibleClass); 263 config.target.removeClass(config.visibleClass);
264 264
265 }); 265 });
266 266
267 // Body. 267 // Body.
268 268
269 // Event: Hide panel on body click/tap. 269 // Event: Hide panel on body click/tap.
270 $body.on('click touchend', function(event) { 270 $body.on('click touchend', function(event) {
271 $this._hide(event); 271 $this._hide(event);
272 }); 272 });
273 273
274 // Event: Toggle. 274 // Event: Toggle.
275 $body.on('click', 'a[href="#' + id + '"]', function(event) { 275 $body.on('click', 'a[href="#' + id + '"]', function(event) {
276 276
277 event.preventDefault(); 277 event.preventDefault();
278 event.stopPropagation(); 278 event.stopPropagation();
279 279
280 config.target.toggleClass(config.visibleClass); 280 config.target.toggleClass(config.visibleClass);
281 281
282 }); 282 });
283 283
284 // Window. 284 // Window.
285 285
286 // Event: Hide on ESC. 286 // Event: Hide on ESC.
287 if (config.hideOnEscape) 287 if (config.hideOnEscape)
288 $window.on('keydown', function(event) { 288 $window.on('keydown', function(event) {
289 289
290 if (event.keyCode == 27) 290 if (event.keyCode == 27)
291 $this._hide(event); 291 $this._hide(event);
292 292
293 }); 293 });
294 294
295 return $this; 295 return $this;
296 296
297 }; 297 };
298 298
299 /** 299 /**
300 * Apply "placeholder" attribute polyfill to one or more forms. 300 * Apply "placeholder" attribute polyfill to one or more forms.
301 * @return {jQuery} jQuery object. 301 * @return {jQuery} jQuery object.
302 */ 302 */
303 $.fn.placeholder = function() { 303 $.fn.placeholder = function() {
304 304
305 // Browser natively supports placeholders? Bail. 305 // Browser natively supports placeholders? Bail.
306 if (typeof (document.createElement('input')).placeholder != 'undefined') 306 if (typeof (document.createElement('input')).placeholder != 'undefined')
307 return $(this); 307 return $(this);
308 308
309 // No elements? 309 // No elements?
310 if (this.length == 0) 310 if (this.length == 0)
311 return $this; 311 return $this;
312 312
313 // Multiple elements? 313 // Multiple elements?
314 if (this.length > 1) { 314 if (this.length > 1) {
315 315
316 for (var i=0; i < this.length; i++) 316 for (var i=0; i < this.length; i++)
317 $(this[i]).placeholder(); 317 $(this[i]).placeholder();
318 318
319 return $this; 319 return $this;
320 320
321 } 321 }
322 322
323 // Vars. 323 // Vars.
324 var $this = $(this); 324 var $this = $(this);
325 325
326 // Text, TextArea. 326 // Text, TextArea.
327 $this.find('input[type=text],textarea') 327 $this.find('input[type=text],textarea')
328 .each(function() { 328 .each(function() {
329 329
330 var i = $(this); 330 var i = $(this);
331 331
332 if (i.val() == '' 332 if (i.val() == ''
333 || i.val() == i.attr('placeholder')) 333 || i.val() == i.attr('placeholder'))
334 i 334 i
335 .addClass('polyfill-placeholder') 335 .addClass('polyfill-placeholder')
336 .val(i.attr('placeholder')); 336 .val(i.attr('placeholder'));
337 337
338 }) 338 })
339 .on('blur', function() { 339 .on('blur', function() {
340 340
341 var i = $(this); 341 var i = $(this);
342 342
343 if (i.attr('name').match(/-polyfill-field$/)) 343 if (i.attr('name').match(/-polyfill-field$/))
344 return; 344 return;
345 345
346 if (i.val() == '') 346 if (i.val() == '')
347 i 347 i
348 .addClass('polyfill-placeholder') 348 .addClass('polyfill-placeholder')
349 .val(i.attr('placeholder')); 349 .val(i.attr('placeholder'));
350 350
351 }) 351 })
352 .on('focus', function() { 352 .on('focus', function() {
353 353
354 var i = $(this); 354 var i = $(this);
355 355
356 if (i.attr('name').match(/-polyfill-field$/)) 356 if (i.attr('name').match(/-polyfill-field$/))
357 return; 357 return;
358 358
359 if (i.val() == i.attr('placeholder')) 359 if (i.val() == i.attr('placeholder'))
360 i 360 i
361 .removeClass('polyfill-placeholder') 361 .removeClass('polyfill-placeholder')
362 .val(''); 362 .val('');
363 363
364 }); 364 });
365 365
366 // Password. 366 // Password.
367 $this.find('input[type=password]') 367 $this.find('input[type=password]')
368 .each(function() { 368 .each(function() {
369 369
370 var i = $(this); 370 var i = $(this);
371 var x = $( 371 var x = $(
372 $('<div>') 372 $('<div>')
373 .append(i.clone()) 373 .append(i.clone())
374 .remove() 374 .remove()
375 .html() 375 .html()
376 .replace(/type="password"/i, 'type="text"') 376 .replace(/type="password"/i, 'type="text"')
377 .replace(/type=password/i, 'type=text') 377 .replace(/type=password/i, 'type=text')
378 ); 378 );
379 379
380 if (i.attr('id') != '') 380 if (i.attr('id') != '')
381 x.attr('id', i.attr('id') + '-polyfill-field'); 381 x.attr('id', i.attr('id') + '-polyfill-field');
382 382
383 if (i.attr('name') != '') 383 if (i.attr('name') != '')
384 x.attr('name', i.attr('name') + '-polyfill-field'); 384 x.attr('name', i.attr('name') + '-polyfill-field');
385 385
386 x.addClass('polyfill-placeholder') 386 x.addClass('polyfill-placeholder')
387 .val(x.attr('placeholder')).insertAfter(i); 387 .val(x.attr('placeholder')).insertAfter(i);
388 388
389 if (i.val() == '') 389 if (i.val() == '')
390 i.hide(); 390 i.hide();
391 else 391 else
392 x.hide(); 392 x.hide();
393 393
394 i 394 i
395 .on('blur', function(event) { 395 .on('blur', function(event) {
396 396
397 event.preventDefault(); 397 event.preventDefault();
398 398
399 var x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); 399 var x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]');
400 400
401 if (i.val() == '') { 401 if (i.val() == '') {
402 402
403 i.hide(); 403 i.hide();
404 x.show(); 404 x.show();
405 405
406 } 406 }
407 407
408 }); 408 });
409 409
410 x 410 x
411 .on('focus', function(event) { 411 .on('focus', function(event) {
412 412
413 event.preventDefault(); 413 event.preventDefault();
414 414
415 var i = x.parent().find('input[name=' + x.attr('name').replace('-polyfill-field', '') + ']'); 415 var i = x.parent().find('input[name=' + x.attr('name').replace('-polyfill-field', '') + ']');
416 416
417 x.hide(); 417 x.hide();
418 418
419 i 419 i
420 .show() 420 .show()
421 .focus(); 421 .focus();
422 422
423 }) 423 })
424 .on('keypress', function(event) { 424 .on('keypress', function(event) {
425 425
426 event.preventDefault(); 426 event.preventDefault();
427 x.val(''); 427 x.val('');
428 428
429 }); 429 });
430 430
431 }); 431 });
432 432
433 // Events. 433 // Events.
434 $this 434 $this
435 .on('submit', function() { 435 .on('submit', function() {
436 436
437 $this.find('input[type=text],input[type=password],textarea') 437 $this.find('input[type=text],input[type=password],textarea')
438 .each(function(event) { 438 .each(function(event) {
439 439
440 var i = $(this); 440 var i = $(this);
441 441
442 if (i.attr('name').match(/-polyfill-field$/)) 442 if (i.attr('name').match(/-polyfill-field$/))
443 i.attr('name', ''); 443 i.attr('name', '');
444 444
445 if (i.val() == i.attr('placeholder')) { 445 if (i.val() == i.attr('placeholder')) {
446 446
447 i.removeClass('polyfill-placeholder'); 447 i.removeClass('polyfill-placeholder');
448 i.val(''); 448 i.val('');
449 449
450 } 450 }
451 451
452 }); 452 });
453 453
454 }) 454 })
455 .on('reset', function(event) { 455 .on('reset', function(event) {
456 456
457 event.preventDefault(); 457 event.preventDefault();
458 458
459 $this.find('select') 459 $this.find('select')
460 .val($('option:first').val()); 460 .val($('option:first').val());
461 461
462 $this.find('input,textarea') 462 $this.find('input,textarea')
463 .each(function() { 463 .each(function() {
464 464
465 var i = $(this), 465 var i = $(this),
466 x; 466 x;
467 467
468 i.removeClass('polyfill-placeholder'); 468 i.removeClass('polyfill-placeholder');
469 469
470 switch (this.type) { 470 switch (this.type) {
471 471
472 case 'submit': 472 case 'submit':
473 case 'reset': 473 case 'reset':
474 break; 474 break;
475 475
476 case 'password': 476 case 'password':
477 i.val(i.attr('defaultValue')); 477 i.val(i.attr('defaultValue'));
478 478
479 x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); 479 x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]');
480 480
481 if (i.val() == '') { 481 if (i.val() == '') {
482 i.hide(); 482 i.hide();
483 x.show(); 483 x.show();
484 } 484 }
485 else { 485 else {
486 i.show(); 486 i.show();
487 x.hide(); 487 x.hide();
488 } 488 }
489 489
490 break; 490 break;
491 491
492 case 'checkbox': 492 case 'checkbox':
493 case 'radio': 493 case 'radio':
494 i.attr('checked', i.attr('defaultValue')); 494 i.attr('checked', i.attr('defaultValue'));
495 break; 495 break;
496 496
497 case 'text': 497 case 'text':
498 case 'textarea': 498 case 'textarea':
499 i.val(i.attr('defaultValue')); 499 i.val(i.attr('defaultValue'));
500 500
501 if (i.val() == '') { 501 if (i.val() == '') {
502 i.addClass('polyfill-placeholder'); 502 i.addClass('polyfill-placeholder');
503 i.val(i.attr('placeholder')); 503 i.val(i.attr('placeholder'));
504 } 504 }
505 505
506 break; 506 break;
507 507
508 default: 508 default:
509 i.val(i.attr('defaultValue')); 509 i.val(i.attr('defaultValue'));
510 break; 510 break;
511 511
512 } 512 }
513 }); 513 });
514 514
515 }); 515 });
516 516
517 return $this; 517 return $this;
518 518
519 }; 519 };
520 520
521 /** 521 /**
522 * Moves elements to/from the first positions of their respective parents. 522 * Moves elements to/from the first positions of their respective parents.
523 * @param {jQuery} $elements Elements (or selector) to move. 523 * @param {jQuery} $elements Elements (or selector) to move.
524 * @param {bool} condition If true, moves elements to the top. Otherwise, moves elements back to their original locations. 524 * @param {bool} condition If true, moves elements to the top. Otherwise, moves elements back to their original locations.
525 */ 525 */
526 $.prioritize = function($elements, condition) { 526 $.prioritize = function($elements, condition) {
527 527
528 var key = '__prioritize'; 528 var key = '__prioritize';
529 529
530 // Expand $elements if it's not already a jQuery object. 530 // Expand $elements if it's not already a jQuery object.
531 if (typeof $elements != 'jQuery') 531 if (typeof $elements != 'jQuery')
532 $elements = $($elements); 532 $elements = $($elements);
533 533
534 // Step through elements. 534 // Step through elements.
535 $elements.each(function() { 535 $elements.each(function() {
536 536
537 var $e = $(this), $p, 537 var $e = $(this), $p,
538 $parent = $e.parent(); 538 $parent = $e.parent();
539 539
540 // No parent? Bail. 540 // No parent? Bail.
541 if ($parent.length == 0) 541 if ($parent.length == 0)
542 return; 542 return;
543 543
544 // Not moved? Move it. 544 // Not moved? Move it.
545 if (!$e.data(key)) { 545 if (!$e.data(key)) {
546 546
547 // Condition is false? Bail. 547 // Condition is false? Bail.
548 if (!condition) 548 if (!condition)
549 return; 549 return;
550 550
551 // Get placeholder (which will serve as our point of reference for when this element needs to move back). 551 // Get placeholder (which will serve as our point of reference for when this element needs to move back).
552 $p = $e.prev(); 552 $p = $e.prev();
553 553
554 // Couldn't find anything? Means this element's already at the top, so bail. 554 // Couldn't find anything? Means this element's already at the top, so bail.
555 if ($p.length == 0) 555 if ($p.length == 0)
556 return; 556 return;
557 557
558 // Move element to top of parent. 558 // Move element to top of parent.
559 $e.prependTo($parent); 559 $e.prependTo($parent);
560 560
561 // Mark element as moved. 561 // Mark element as moved.
562 $e.data(key, $p); 562 $e.data(key, $p);
563 563
564 } 564 }
565 565
566 // Moved already? 566 // Moved already?
567 else { 567 else {
568 568
569 // Condition is true? Bail. 569 // Condition is true? Bail.
570 if (condition) 570 if (condition)
571 return; 571 return;
572 572
573 $p = $e.data(key); 573 $p = $e.data(key);
574 574
575 // Move element back to its original location (using our placeholder). 575 // Move element back to its original location (using our placeholder).
576 $e.insertAfter($p); 576 $e.insertAfter($p);
577 577
578 // Unmark element as moved. 578 // Unmark element as moved.
579 $e.removeData(key); 579 $e.removeData(key);
580 580
581 } 581 }
582 582
583 }); 583 });
584 584
585 }; 585 };
586 586
587})(jQuery); \ No newline at end of file 587})(jQuery); \ No newline at end of file
diff --git a/www/assets/sass/ie9.scss b/www/assets/sass/ie9.scss
index 73c9733..32c9d7b 100644
--- a/www/assets/sass/ie9.scss
+++ b/www/assets/sass/ie9.scss
@@ -1,23 +1,23 @@
1@import 'libs/vars'; 1@import 'libs/vars';
2@import 'libs/functions'; 2@import 'libs/functions';
3@import 'libs/mixins'; 3@import 'libs/mixins';
4 4
5/* 5/*
6 Arcana by HTML5 UP 6 Arcana by HTML5 UP
7 html5up.net | @ajlkn 7 html5up.net | @ajlkn
8 Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 8 Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
9*/ 9*/
10 10
11/* Header */ 11/* Header */
12 12
13 #nav { 13 #nav {
14 > ul { 14 > ul {
15 > li { 15 > li {
16 &.current { 16 &.current {
17 &:before { 17 &:before {
18 display: none; 18 display: none;
19 } 19 }
20 } 20 }
21 } 21 }
22 } 22 }
23 } \ No newline at end of file 23 } \ No newline at end of file
diff --git a/www/assets/sass/libs/_functions.scss b/www/assets/sass/libs/_functions.scss
index 0e08c1a..3b834f5 100644
--- a/www/assets/sass/libs/_functions.scss
+++ b/www/assets/sass/libs/_functions.scss
@@ -1,34 +1,34 @@
1/// Gets a duration value. 1/// Gets a duration value.
2/// @param {string} $keys Key(s). 2/// @param {string} $keys Key(s).
3/// @return {string} Value. 3/// @return {string} Value.
4@function _duration($keys...) { 4@function _duration($keys...) {
5 @return val($duration, $keys...); 5 @return val($duration, $keys...);
6} 6}
7 7
8/// Gets a font value. 8/// Gets a font value.
9/// @param {string} $keys Key(s). 9/// @param {string} $keys Key(s).
10/// @return {string} Value. 10/// @return {string} Value.
11@function _font($keys...) { 11@function _font($keys...) {
12 @return val($font, $keys...); 12 @return val($font, $keys...);
13} 13}
14 14
15/// Gets a misc value. 15/// Gets a misc value.
16/// @param {string} $keys Key(s). 16/// @param {string} $keys Key(s).
17/// @return {string} Value. 17/// @return {string} Value.
18@function _misc($keys...) { 18@function _misc($keys...) {
19 @return val($misc, $keys...); 19 @return val($misc, $keys...);
20} 20}
21 21
22/// Gets a palette value. 22/// Gets a palette value.
23/// @param {string} $keys Key(s). 23/// @param {string} $keys Key(s).
24/// @return {string} Value. 24/// @return {string} Value.
25@function _palette($keys...) { 25@function _palette($keys...) {
26 @return val($palette, $keys...); 26 @return val($palette, $keys...);
27} 27}
28 28
29/// Gets a size value. 29/// Gets a size value.
30/// @param {string} $keys Key(s). 30/// @param {string} $keys Key(s).
31/// @return {string} Value. 31/// @return {string} Value.
32@function _size($keys...) { 32@function _size($keys...) {
33 @return val($size, $keys...); 33 @return val($size, $keys...);
34} \ No newline at end of file 34} \ No newline at end of file
diff --git a/www/assets/sass/libs/_mixins.scss b/www/assets/sass/libs/_mixins.scss
index d4bf3c8..ab6191f 100644
--- a/www/assets/sass/libs/_mixins.scss
+++ b/www/assets/sass/libs/_mixins.scss
@@ -1,398 +1,398 @@
1/// Makes an element's :before pseudoelement a FontAwesome icon. 1/// Makes an element's :before pseudoelement a FontAwesome icon.
2/// @param {string} $content Optional content value to use. 2/// @param {string} $content Optional content value to use.
3/// @param {string} $where Optional pseudoelement to target (before or after). 3/// @param {string} $where Optional pseudoelement to target (before or after).
4@mixin icon($content: false, $where: before) { 4@mixin icon($content: false, $where: before) {
5 5
6 text-decoration: none; 6 text-decoration: none;
7 7
8 &:#{$where} { 8 &:#{$where} {
9 9
10 @if $content { 10 @if $content {
11 content: $content; 11 content: $content;
12 } 12 }
13 13
14 -moz-osx-font-smoothing: grayscale; 14 -moz-osx-font-smoothing: grayscale;
15 -webkit-font-smoothing: antialiased; 15 -webkit-font-smoothing: antialiased;
16 font-family: FontAwesome; 16 font-family: FontAwesome;
17 font-style: normal; 17 font-style: normal;
18 font-weight: normal; 18 font-weight: normal;
19 text-transform: none !important; 19 text-transform: none !important;
20 20
21 } 21 }
22 22
23} 23}
24 24
25/// Applies padding to an element, taking the current element-margin value into account. 25/// Applies padding to an element, taking the current element-margin value into account.
26/// @param {mixed} $tb Top/bottom padding. 26/// @param {mixed} $tb Top/bottom padding.
27/// @param {mixed} $lr Left/right padding. 27/// @param {mixed} $lr Left/right padding.
28/// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left) 28/// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left)
29/// @param {bool} $important If true, adds !important. 29/// @param {bool} $important If true, adds !important.
30@mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) { 30@mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) {
31 31
32 @if $important { 32 @if $important {
33 $important: '!important'; 33 $important: '!important';
34 } 34 }
35 35
36 $x: 0.1em; 36 $x: 0.1em;
37 37
38 @if unit(_size(element-margin)) == 'rem' { 38 @if unit(_size(element-margin)) == 'rem' {
39 $x: 0.1rem; 39 $x: 0.1rem;
40 } 40 }
41 41
42 padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max($x, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important}; 42 padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max($x, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important};
43 43
44} 44}
45 45
46/// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp). 46/// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp).
47/// @param {string} $svg SVG data URL. 47/// @param {string} $svg SVG data URL.
48/// @return {string} Encoded SVG data URL. 48/// @return {string} Encoded SVG data URL.
49@function svg-url($svg) { 49@function svg-url($svg) {
50 50
51 $svg: str-replace($svg, '"', '\''); 51 $svg: str-replace($svg, '"', '\'');
52 $svg: str-replace($svg, '%', '%25'); 52 $svg: str-replace($svg, '%', '%25');
53 $svg: str-replace($svg, '<', '%3C'); 53 $svg: str-replace($svg, '<', '%3C');
54 $svg: str-replace($svg, '>', '%3E'); 54 $svg: str-replace($svg, '>', '%3E');
55 $svg: str-replace($svg, '&', '%26'); 55 $svg: str-replace($svg, '&', '%26');
56 $svg: str-replace($svg, '#', '%23'); 56 $svg: str-replace($svg, '#', '%23');
57 $svg: str-replace($svg, '{', '%7B'); 57 $svg: str-replace($svg, '{', '%7B');
58 $svg: str-replace($svg, '}', '%7D'); 58 $svg: str-replace($svg, '}', '%7D');
59 $svg: str-replace($svg, ';', '%3B'); 59 $svg: str-replace($svg, ';', '%3B');
60 60
61 @return url("data:image/svg+xml;charset=utf8,#{$svg}"); 61 @return url("data:image/svg+xml;charset=utf8,#{$svg}");
62 62
63} 63}
64 64
65/// Initializes base flexgrid classes. 65/// Initializes base flexgrid classes.
66/// @param {string} $vertical-align Vertical alignment of cells. 66/// @param {string} $vertical-align Vertical alignment of cells.
67/// @param {string} $horizontal-align Horizontal alignment of cells. 67/// @param {string} $horizontal-align Horizontal alignment of cells.
68@mixin flexgrid-base($vertical-align: null, $horizontal-align: null) { 68@mixin flexgrid-base($vertical-align: null, $horizontal-align: null) {
69 69
70 // Grid. 70 // Grid.
71 @include vendor('display', 'flex'); 71 @include vendor('display', 'flex');
72 @include vendor('flex-wrap', 'wrap'); 72 @include vendor('flex-wrap', 'wrap');
73 73
74 // Vertical alignment. 74 // Vertical alignment.
75 @if ($vertical-align == top) { 75 @if ($vertical-align == top) {
76 @include vendor('align-items', 'flex-start'); 76 @include vendor('align-items', 'flex-start');
77 } 77 }
78 @else if ($vertical-align == bottom) { 78 @else if ($vertical-align == bottom) {
79 @include vendor('align-items', 'flex-end'); 79 @include vendor('align-items', 'flex-end');
80 } 80 }
81 @else if ($vertical-align == center) { 81 @else if ($vertical-align == center) {
82 @include vendor('align-items', 'center'); 82 @include vendor('align-items', 'center');
83 } 83 }
84 @else { 84 @else {
85 @include vendor('align-items', 'stretch'); 85 @include vendor('align-items', 'stretch');
86 } 86 }
87 87
88 // Horizontal alignment. 88 // Horizontal alignment.
89 @if ($horizontal-align != null) { 89 @if ($horizontal-align != null) {
90 text-align: $horizontal-align; 90 text-align: $horizontal-align;
91 } 91 }
92 92
93 // Cells. 93 // Cells.
94 > * { 94 > * {
95 @include vendor('flex-shrink', '1'); 95 @include vendor('flex-shrink', '1');
96 @include vendor('flex-grow', '0'); 96 @include vendor('flex-grow', '0');
97 } 97 }
98 98
99} 99}
100 100
101/// Sets up flexgrid columns. 101/// Sets up flexgrid columns.
102/// @param {integer} $columns Columns. 102/// @param {integer} $columns Columns.
103@mixin flexgrid-columns($columns) { 103@mixin flexgrid-columns($columns) {
104 104
105 > * { 105 > * {
106 $cell-width: 100% / $columns; 106 $cell-width: 100% / $columns;
107 width: #{$cell-width}; 107 width: #{$cell-width};
108 } 108 }
109 109
110} 110}
111 111
112/// Sets up flexgrid gutters. 112/// Sets up flexgrid gutters.
113/// @param {integer} $columns Columns. 113/// @param {integer} $columns Columns.
114/// @param {number} $gutters Gutters. 114/// @param {number} $gutters Gutters.
115@mixin flexgrid-gutters($columns, $gutters) { 115@mixin flexgrid-gutters($columns, $gutters) {
116 116
117 // Apply padding. 117 // Apply padding.
118 > * { 118 > * {
119 $cell-width: 100% / $columns; 119 $cell-width: 100% / $columns;
120 120
121 padding: ($gutters * 0.5); 121 padding: ($gutters * 0.5);
122 width: $cell-width; 122 width: $cell-width;
123 } 123 }
124 124
125} 125}
126 126
127/// Sets up flexgrid gutters (flush). 127/// Sets up flexgrid gutters (flush).
128/// @param {integer} $columns Columns. 128/// @param {integer} $columns Columns.
129/// @param {number} $gutters Gutters. 129/// @param {number} $gutters Gutters.
130@mixin flexgrid-gutters-flush($columns, $gutters) { 130@mixin flexgrid-gutters-flush($columns, $gutters) {
131 131
132 // Apply padding. 132 // Apply padding.
133 > * { 133 > * {
134 $cell-width: 100% / $columns; 134 $cell-width: 100% / $columns;
135 $cell-width-pad: $gutters / $columns; 135 $cell-width-pad: $gutters / $columns;
136 136
137 padding: ($gutters * 0.5); 137 padding: ($gutters * 0.5);
138 width: calc(#{$cell-width} + #{$cell-width-pad}); 138 width: calc(#{$cell-width} + #{$cell-width-pad});
139 } 139 }
140 140
141 // Clear top/bottom gutters. 141 // Clear top/bottom gutters.
142 > :nth-child(-n + #{$columns}) { 142 > :nth-child(-n + #{$columns}) {
143 padding-top: 0; 143 padding-top: 0;
144 } 144 }
145 145
146 > :nth-last-child(-n + #{$columns}) { 146 > :nth-last-child(-n + #{$columns}) {
147 padding-bottom: 0; 147 padding-bottom: 0;
148 } 148 }
149 149
150 // Clear left/right gutters. 150 // Clear left/right gutters.
151 > :nth-child(#{$columns}n + 1) { 151 > :nth-child(#{$columns}n + 1) {
152 padding-left: 0; 152 padding-left: 0;
153 } 153 }
154 154
155 > :nth-child(#{$columns}n) { 155 > :nth-child(#{$columns}n) {
156 padding-right: 0; 156 padding-right: 0;
157 } 157 }
158 158
159 // Adjust widths of leftmost and rightmost cells. 159 // Adjust widths of leftmost and rightmost cells.
160 > :nth-child(#{$columns}n + 1), 160 > :nth-child(#{$columns}n + 1),
161 > :nth-child(#{$columns}n) { 161 > :nth-child(#{$columns}n) {
162 $cell-width: 100% / $columns; 162 $cell-width: 100% / $columns;
163 $cell-width-pad: ($gutters / $columns) - ($gutters / 2); 163 $cell-width-pad: ($gutters / $columns) - ($gutters / 2);
164 164
165 width: calc(#{$cell-width} + #{$cell-width-pad}); 165 width: calc(#{$cell-width} + #{$cell-width-pad});
166 } 166 }
167 167
168} 168}
169 169
170/// Reset flexgrid gutters (flush only). 170/// Reset flexgrid gutters (flush only).
171/// Used to override a previous set of flexgrid gutter classes. 171/// Used to override a previous set of flexgrid gutter classes.
172/// @param {integer} $columns Columns. 172/// @param {integer} $columns Columns.
173/// @param {number} $gutters Gutters. 173/// @param {number} $gutters Gutters.
174/// @param {integer} $prev-columns Previous columns. 174/// @param {integer} $prev-columns Previous columns.
175@mixin flexgrid-gutters-flush-reset($columns, $gutters, $prev-columns) { 175@mixin flexgrid-gutters-flush-reset($columns, $gutters, $prev-columns) {
176 176
177 // Apply padding. 177 // Apply padding.
178 > * { 178 > * {
179 $cell-width: 100% / $prev-columns; 179 $cell-width: 100% / $prev-columns;
180 $cell-width-pad: $gutters / $prev-columns; 180 $cell-width-pad: $gutters / $prev-columns;
181 181
182 padding: ($gutters * 0.5); 182 padding: ($gutters * 0.5);
183 width: calc(#{$cell-width} + #{$cell-width-pad}); 183 width: calc(#{$cell-width} + #{$cell-width-pad});
184 } 184 }
185 185
186 // Clear top/bottom gutters. 186 // Clear top/bottom gutters.
187 > :nth-child(-n + #{$prev-columns}) { 187 > :nth-child(-n + #{$prev-columns}) {
188 padding-top: ($gutters * 0.5); 188 padding-top: ($gutters * 0.5);
189 } 189 }
190 190
191 > :nth-last-child(-n + #{$prev-columns}) { 191 > :nth-last-child(-n + #{$prev-columns}) {
192 padding-bottom: ($gutters * 0.5); 192 padding-bottom: ($gutters * 0.5);
193 } 193 }
194 194
195 // Clear left/right gutters. 195 // Clear left/right gutters.
196 > :nth-child(#{$prev-columns}n + 1) { 196 > :nth-child(#{$prev-columns}n + 1) {
197 padding-left: ($gutters * 0.5); 197 padding-left: ($gutters * 0.5);
198 } 198 }
199 199
200 > :nth-child(#{$prev-columns}n) { 200 > :nth-child(#{$prev-columns}n) {
201 padding-right: ($gutters * 0.5); 201 padding-right: ($gutters * 0.5);
202 } 202 }
203 203
204 // Adjust widths of leftmost and rightmost cells. 204 // Adjust widths of leftmost and rightmost cells.
205 > :nth-child(#{$prev-columns}n + 1), 205 > :nth-child(#{$prev-columns}n + 1),
206 > :nth-child(#{$prev-columns}n) { 206 > :nth-child(#{$prev-columns}n) {
207 $cell-width: 100% / $columns; 207 $cell-width: 100% / $columns;
208 $cell-width-pad: $gutters / $columns; 208 $cell-width-pad: $gutters / $columns;
209 209
210 padding: ($gutters * 0.5); 210 padding: ($gutters * 0.5);
211 width: calc(#{$cell-width} + #{$cell-width-pad}); 211 width: calc(#{$cell-width} + #{$cell-width-pad});
212 } 212 }
213 213
214} 214}
215 215
216/// Adds debug styles to current flexgrid element. 216/// Adds debug styles to current flexgrid element.
217@mixin flexgrid-debug() { 217@mixin flexgrid-debug() {
218 218
219 box-shadow: 0 0 0 1px red; 219 box-shadow: 0 0 0 1px red;
220 220
221 > * { 221 > * {
222 box-shadow: inset 0 0 0 1px blue; 222 box-shadow: inset 0 0 0 1px blue;
223 position: relative; 223 position: relative;
224 224
225 > * { 225 > * {
226 position: relative; 226 position: relative;
227 box-shadow: inset 0 0 0 1px green; 227 box-shadow: inset 0 0 0 1px green;
228 } 228 }
229 } 229 }
230 230
231} 231}
232 232
233/// Initializes the current element as a flexgrid. 233/// Initializes the current element as a flexgrid.
234/// @param {integer} $columns Columns (optional). 234/// @param {integer} $columns Columns (optional).
235/// @param {number} $gutters Gutters (optional). 235/// @param {number} $gutters Gutters (optional).
236/// @param {bool} $flush If true, clears padding around the very edge of the grid. 236/// @param {bool} $flush If true, clears padding around the very edge of the grid.
237@mixin flexgrid($settings: ()) { 237@mixin flexgrid($settings: ()) {
238 238
239 // Settings. 239 // Settings.
240 240
241 // Debug. 241 // Debug.
242 $debug: false; 242 $debug: false;
243 243
244 @if (map-has-key($settings, 'debug')) { 244 @if (map-has-key($settings, 'debug')) {
245 $debug: map-get($settings, 'debug'); 245 $debug: map-get($settings, 'debug');
246 } 246 }
247 247
248 // Vertical align. 248 // Vertical align.
249 $vertical-align: null; 249 $vertical-align: null;
250 250
251 @if (map-has-key($settings, 'vertical-align')) { 251 @if (map-has-key($settings, 'vertical-align')) {
252 $vertical-align: map-get($settings, 'vertical-align'); 252 $vertical-align: map-get($settings, 'vertical-align');
253 } 253 }
254 254
255 // Horizontal align. 255 // Horizontal align.
256 $horizontal-align: null; 256 $horizontal-align: null;
257 257
258 @if (map-has-key($settings, 'horizontal-align')) { 258 @if (map-has-key($settings, 'horizontal-align')) {
259 $horizontal-align: map-get($settings, 'horizontal-align'); 259 $horizontal-align: map-get($settings, 'horizontal-align');
260 } 260 }
261 261
262 // Columns. 262 // Columns.
263 $columns: null; 263 $columns: null;
264 264
265 @if (map-has-key($settings, 'columns')) { 265 @if (map-has-key($settings, 'columns')) {
266 $columns: map-get($settings, 'columns'); 266 $columns: map-get($settings, 'columns');
267 } 267 }
268 268
269 // Gutters. 269 // Gutters.
270 $gutters: 0; 270 $gutters: 0;
271 271
272 @if (map-has-key($settings, 'gutters')) { 272 @if (map-has-key($settings, 'gutters')) {
273 $gutters: map-get($settings, 'gutters'); 273 $gutters: map-get($settings, 'gutters');
274 } 274 }
275 275
276 // Flush. 276 // Flush.
277 $flush: true; 277 $flush: true;
278 278
279 @if (map-has-key($settings, 'flush')) { 279 @if (map-has-key($settings, 'flush')) {
280 $flush: map-get($settings, 'flush'); 280 $flush: map-get($settings, 'flush');
281 } 281 }
282 282
283 // Initialize base grid. 283 // Initialize base grid.
284 @include flexgrid-base($vertical-align, $horizontal-align); 284 @include flexgrid-base($vertical-align, $horizontal-align);
285 285
286 // Debug? 286 // Debug?
287 @if ($debug) { 287 @if ($debug) {
288 @include flexgrid-debug; 288 @include flexgrid-debug;
289 } 289 }
290 290
291 // Columns specified? 291 // Columns specified?
292 @if ($columns != null) { 292 @if ($columns != null) {
293 293
294 // Initialize columns. 294 // Initialize columns.
295 @include flexgrid-columns($columns); 295 @include flexgrid-columns($columns);
296 296
297 // Gutters specified? 297 // Gutters specified?
298 @if ($gutters > 0) { 298 @if ($gutters > 0) {
299 299
300 // Flush gutters? 300 // Flush gutters?
301 @if ($flush) { 301 @if ($flush) {
302 302
303 // Initialize gutters (flush). 303 // Initialize gutters (flush).
304 @include flexgrid-gutters-flush($columns, $gutters); 304 @include flexgrid-gutters-flush($columns, $gutters);
305 305
306 } 306 }
307 307
308 // Otherwise ... 308 // Otherwise ...
309 @else { 309 @else {
310 310
311 // Initialize gutters. 311 // Initialize gutters.
312 @include flexgrid-gutters($columns, $gutters); 312 @include flexgrid-gutters($columns, $gutters);
313 313
314 } 314 }
315 315
316 } 316 }
317 317
318 } 318 }
319 319
320} 320}
321 321
322/// Resizes a previously-initialized grid. 322/// Resizes a previously-initialized grid.
323/// @param {integer} $columns Columns. 323/// @param {integer} $columns Columns.
324/// @param {number} $gutters Gutters (optional). 324/// @param {number} $gutters Gutters (optional).
325/// @param {list} $reset A list of previously-initialized grid columns (only if $flush is true). 325/// @param {list} $reset A list of previously-initialized grid columns (only if $flush is true).
326/// @param {bool} $flush If true, clears padding around the very edge of the grid. 326/// @param {bool} $flush If true, clears padding around the very edge of the grid.
327@mixin flexgrid-resize($settings: ()) { 327@mixin flexgrid-resize($settings: ()) {
328 328
329 // Settings. 329 // Settings.
330 330
331 // Columns. 331 // Columns.
332 $columns: 1; 332 $columns: 1;
333 333
334 @if (map-has-key($settings, 'columns')) { 334 @if (map-has-key($settings, 'columns')) {
335 $columns: map-get($settings, 'columns'); 335 $columns: map-get($settings, 'columns');
336 } 336 }
337 337
338 // Gutters. 338 // Gutters.
339 $gutters: 0; 339 $gutters: 0;
340 340
341 @if (map-has-key($settings, 'gutters')) { 341 @if (map-has-key($settings, 'gutters')) {
342 $gutters: map-get($settings, 'gutters'); 342 $gutters: map-get($settings, 'gutters');
343 } 343 }
344 344
345 // Previous columns. 345 // Previous columns.
346 $prev-columns: false; 346 $prev-columns: false;
347 347
348 @if (map-has-key($settings, 'prev-columns')) { 348 @if (map-has-key($settings, 'prev-columns')) {
349 $prev-columns: map-get($settings, 'prev-columns'); 349 $prev-columns: map-get($settings, 'prev-columns');
350 } 350 }
351 351
352 // Flush. 352 // Flush.
353 $flush: true; 353 $flush: true;
354 354
355 @if (map-has-key($settings, 'flush')) { 355 @if (map-has-key($settings, 'flush')) {
356 $flush: map-get($settings, 'flush'); 356 $flush: map-get($settings, 'flush');
357 } 357 }
358 358
359 // Resize columns. 359 // Resize columns.
360 @include flexgrid-columns($columns); 360 @include flexgrid-columns($columns);
361 361
362 // Gutters specified? 362 // Gutters specified?
363 @if ($gutters > 0) { 363 @if ($gutters > 0) {
364 364
365 // Flush gutters? 365 // Flush gutters?
366 @if ($flush) { 366 @if ($flush) {
367 367
368 // Previous columns specified? 368 // Previous columns specified?
369 @if ($prev-columns) { 369 @if ($prev-columns) {
370 370
371 // Convert to list if it isn't one already. 371 // Convert to list if it isn't one already.
372 @if (type-of($prev-columns) != list) { 372 @if (type-of($prev-columns) != list) {
373 $prev-columns: ($prev-columns); 373 $prev-columns: ($prev-columns);
374 } 374 }
375 375
376 // Step through list of previous columns and reset them. 376 // Step through list of previous columns and reset them.
377 @each $x in $prev-columns { 377 @each $x in $prev-columns {
378 @include flexgrid-gutters-flush-reset($columns, $gutters, $x); 378 @include flexgrid-gutters-flush-reset($columns, $gutters, $x);
379 } 379 }
380 380
381 } 381 }
382 382
383 // Resize gutters (flush). 383 // Resize gutters (flush).
384 @include flexgrid-gutters-flush($columns, $gutters); 384 @include flexgrid-gutters-flush($columns, $gutters);
385 385
386 } 386 }
387 387
388 // Otherwise ... 388 // Otherwise ...
389 @else { 389 @else {
390 390
391 // Resize gutters. 391 // Resize gutters.
392 @include flexgrid-gutters($columns, $gutters); 392 @include flexgrid-gutters($columns, $gutters);
393 393
394 } 394 }
395 395
396 } 396 }
397 397
398} \ No newline at end of file 398} \ No newline at end of file
diff --git a/www/assets/sass/libs/_skel.scss b/www/assets/sass/libs/_skel.scss
index f5e0dcd..33fdccb 100644
--- a/www/assets/sass/libs/_skel.scss
+++ b/www/assets/sass/libs/_skel.scss
@@ -1,587 +1,587 @@
1// skel.scss v3.0.2-dev | (c) skel.io | MIT licensed */ 1// skel.scss v3.0.2-dev | (c) skel.io | MIT licensed */
2 2
3// Vars. 3// Vars.
4 4
5 /// Breakpoints. 5 /// Breakpoints.
6 /// @var {list} 6 /// @var {list}
7 $breakpoints: () !global; 7 $breakpoints: () !global;
8 8
9 /// Vendor prefixes. 9 /// Vendor prefixes.
10 /// @var {list} 10 /// @var {list}
11 $vendor-prefixes: ( 11 $vendor-prefixes: (
12 '-moz-', 12 '-moz-',
13 '-webkit-', 13 '-webkit-',
14 '-ms-', 14 '-ms-',
15 '' 15 ''
16 ); 16 );
17 17
18 /// Properties that should be vendorized. 18 /// Properties that should be vendorized.
19 /// @var {list} 19 /// @var {list}
20 $vendor-properties: ( 20 $vendor-properties: (
21 'align-content', 21 'align-content',
22 'align-items', 22 'align-items',
23 'align-self', 23 'align-self',
24 'animation', 24 'animation',
25 'animation-delay', 25 'animation-delay',
26 'animation-direction', 26 'animation-direction',
27 'animation-duration', 27 'animation-duration',
28 'animation-fill-mode', 28 'animation-fill-mode',
29 'animation-iteration-count', 29 'animation-iteration-count',
30 'animation-name', 30 'animation-name',
31 'animation-play-state', 31 'animation-play-state',
32 'animation-timing-function', 32 'animation-timing-function',
33 'appearance', 33 'appearance',
34 'backface-visibility', 34 'backface-visibility',
35 'box-sizing', 35 'box-sizing',
36 'filter', 36 'filter',
37 'flex', 37 'flex',
38 'flex-basis', 38 'flex-basis',
39 'flex-direction', 39 'flex-direction',
40 'flex-flow', 40 'flex-flow',
41 'flex-grow', 41 'flex-grow',
42 'flex-shrink', 42 'flex-shrink',
43 'flex-wrap', 43 'flex-wrap',
44 'justify-content', 44 'justify-content',
45 'object-fit', 45 'object-fit',
46 'object-position', 46 'object-position',
47 'order', 47 'order',
48 'perspective', 48 'perspective',
49 'pointer-events', 49 'pointer-events',
50 'transform', 50 'transform',
51 'transform-origin', 51 'transform-origin',
52 'transform-style', 52 'transform-style',
53 'transition', 53 'transition',
54 'transition-delay', 54 'transition-delay',
55 'transition-duration', 55 'transition-duration',
56 'transition-property', 56 'transition-property',
57 'transition-timing-function', 57 'transition-timing-function',
58 'user-select' 58 'user-select'
59 ); 59 );
60 60
61 /// Values that should be vendorized. 61 /// Values that should be vendorized.
62 /// @var {list} 62 /// @var {list}
63 $vendor-values: ( 63 $vendor-values: (
64 'filter', 64 'filter',
65 'flex', 65 'flex',
66 'linear-gradient', 66 'linear-gradient',
67 'radial-gradient', 67 'radial-gradient',
68 'transform' 68 'transform'
69 ); 69 );
70 70
71// Functions. 71// Functions.
72 72
73 /// Removes a specific item from a list. 73 /// Removes a specific item from a list.
74 /// @author Hugo Giraudel 74 /// @author Hugo Giraudel
75 /// @param {list} $list List. 75 /// @param {list} $list List.
76 /// @param {integer} $index Index. 76 /// @param {integer} $index Index.
77 /// @return {list} Updated list. 77 /// @return {list} Updated list.
78 @function remove-nth($list, $index) { 78 @function remove-nth($list, $index) {
79 79
80 $result: null; 80 $result: null;
81 81
82 @if type-of($index) != number { 82 @if type-of($index) != number {
83 @warn "$index: #{quote($index)} is not a number for `remove-nth`."; 83 @warn "$index: #{quote($index)} is not a number for `remove-nth`.";
84 } 84 }
85 @else if $index == 0 { 85 @else if $index == 0 {
86 @warn "List index 0 must be a non-zero integer for `remove-nth`."; 86 @warn "List index 0 must be a non-zero integer for `remove-nth`.";
87 } 87 }
88 @else if abs($index) > length($list) { 88 @else if abs($index) > length($list) {
89 @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; 89 @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`.";
90 } 90 }
91 @else { 91 @else {
92 92
93 $result: (); 93 $result: ();
94 $index: if($index < 0, length($list) + $index + 1, $index); 94 $index: if($index < 0, length($list) + $index + 1, $index);
95 95
96 @for $i from 1 through length($list) { 96 @for $i from 1 through length($list) {
97 97
98 @if $i != $index { 98 @if $i != $index {
99 $result: append($result, nth($list, $i)); 99 $result: append($result, nth($list, $i));
100 } 100 }
101 101
102 } 102 }
103 103
104 } 104 }
105 105
106 @return $result; 106 @return $result;
107 107
108 } 108 }
109 109
110 /// Replaces a substring within another string. 110 /// Replaces a substring within another string.
111 /// @author Hugo Giraudel 111 /// @author Hugo Giraudel
112 /// @param {string} $string String. 112 /// @param {string} $string String.
113 /// @param {string} $search Substring. 113 /// @param {string} $search Substring.
114 /// @param {string} $replace Replacement. 114 /// @param {string} $replace Replacement.
115 /// @return {string} Updated string. 115 /// @return {string} Updated string.
116 @function str-replace($string, $search, $replace: '') { 116 @function str-replace($string, $search, $replace: '') {
117 117
118 $index: str-index($string, $search); 118 $index: str-index($string, $search);
119 119
120 @if $index { 120 @if $index {
121 @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); 121 @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
122 } 122 }
123 123
124 @return $string; 124 @return $string;
125 125
126 } 126 }
127 127
128 /// Replaces a substring within each string in a list. 128 /// Replaces a substring within each string in a list.
129 /// @param {list} $strings List of strings. 129 /// @param {list} $strings List of strings.
130 /// @param {string} $search Substring. 130 /// @param {string} $search Substring.
131 /// @param {string} $replace Replacement. 131 /// @param {string} $replace Replacement.
132 /// @return {list} Updated list of strings. 132 /// @return {list} Updated list of strings.
133 @function str-replace-all($strings, $search, $replace: '') { 133 @function str-replace-all($strings, $search, $replace: '') {
134 134
135 @each $string in $strings { 135 @each $string in $strings {
136 $strings: set-nth($strings, index($strings, $string), str-replace($string, $search, $replace)); 136 $strings: set-nth($strings, index($strings, $string), str-replace($string, $search, $replace));
137 } 137 }
138 138
139 @return $strings; 139 @return $strings;
140 140
141 } 141 }
142 142
143 /// Gets a value from a map. 143 /// Gets a value from a map.
144 /// @author Hugo Giraudel 144 /// @author Hugo Giraudel
145 /// @param {map} $map Map. 145 /// @param {map} $map Map.
146 /// @param {string} $keys Key(s). 146 /// @param {string} $keys Key(s).
147 /// @return {string} Value. 147 /// @return {string} Value.
148 @function val($map, $keys...) { 148 @function val($map, $keys...) {
149 149
150 @if nth($keys, 1) == null { 150 @if nth($keys, 1) == null {
151 $keys: remove-nth($keys, 1); 151 $keys: remove-nth($keys, 1);
152 } 152 }
153 153
154 @each $key in $keys { 154 @each $key in $keys {
155 $map: map-get($map, $key); 155 $map: map-get($map, $key);
156 } 156 }
157 157
158 @return $map; 158 @return $map;
159 159
160 } 160 }
161 161
162// Mixins. 162// Mixins.
163 163
164 /// Sets the global box model. 164 /// Sets the global box model.
165 /// @param {string} $model Model (default is content). 165 /// @param {string} $model Model (default is content).
166 @mixin boxModel($model: 'content') { 166 @mixin boxModel($model: 'content') {
167 167
168 $x: $model + '-box'; 168 $x: $model + '-box';
169 169
170 *, *:before, *:after { 170 *, *:before, *:after {
171 -moz-box-sizing: #{$x}; 171 -moz-box-sizing: #{$x};
172 -webkit-box-sizing: #{$x}; 172 -webkit-box-sizing: #{$x};
173 box-sizing: #{$x}; 173 box-sizing: #{$x};
174 } 174 }
175 175
176 } 176 }
177 177
178 /// Wraps @content in a @media block using a given breakpoint. 178 /// Wraps @content in a @media block using a given breakpoint.
179 /// @param {string} $breakpoint Breakpoint. 179 /// @param {string} $breakpoint Breakpoint.
180 /// @param {map} $queries Additional queries. 180 /// @param {map} $queries Additional queries.
181 @mixin breakpoint($breakpoint: null, $queries: null) { 181 @mixin breakpoint($breakpoint: null, $queries: null) {
182 182
183 $query: 'screen'; 183 $query: 'screen';
184 184
185 // Breakpoint. 185 // Breakpoint.
186 @if $breakpoint and map-has-key($breakpoints, $breakpoint) { 186 @if $breakpoint and map-has-key($breakpoints, $breakpoint) {
187 $query: $query + ' and ' + map-get($breakpoints, $breakpoint); 187 $query: $query + ' and ' + map-get($breakpoints, $breakpoint);
188 } 188 }
189 189
190 // Queries. 190 // Queries.
191 @if $queries { 191 @if $queries {
192 @each $k, $v in $queries { 192 @each $k, $v in $queries {
193 $query: $query + ' and (' + $k + ':' + $v + ')'; 193 $query: $query + ' and (' + $k + ':' + $v + ')';
194 } 194 }
195 } 195 }
196 196
197 @media #{$query} { 197 @media #{$query} {
198 @content; 198 @content;
199 } 199 }
200 200
201 } 201 }
202 202
203 /// Wraps @content in a @media block targeting a specific orientation. 203 /// Wraps @content in a @media block targeting a specific orientation.
204 /// @param {string} $orientation Orientation. 204 /// @param {string} $orientation Orientation.
205 @mixin orientation($orientation) { 205 @mixin orientation($orientation) {
206 @media screen and (orientation: #{$orientation}) { 206 @media screen and (orientation: #{$orientation}) {
207 @content; 207 @content;
208 } 208 }
209 } 209 }
210 210
211 /// Utility mixin for containers. 211 /// Utility mixin for containers.
212 /// @param {mixed} $width Width. 212 /// @param {mixed} $width Width.
213 @mixin containers($width) { 213 @mixin containers($width) {
214 214
215 // Locked? 215 // Locked?
216 $lock: false; 216 $lock: false;
217 217
218 @if length($width) == 2 { 218 @if length($width) == 2 {
219 $width: nth($width, 1); 219 $width: nth($width, 1);
220 $lock: true; 220 $lock: true;
221 } 221 }
222 222
223 // Modifiers. 223 // Modifiers.
224 .container.\31 25\25 { width: 100%; max-width: $width * 1.25; min-width: $width; } 224 .container.\31 25\25 { width: 100%; max-width: $width * 1.25; min-width: $width; }
225 .container.\37 5\25 { width: $width * 0.75; } 225 .container.\37 5\25 { width: $width * 0.75; }
226 .container.\35 0\25 { width: $width * 0.5; } 226 .container.\35 0\25 { width: $width * 0.5; }
227 .container.\32 5\25 { width: $width * 0.25; } 227 .container.\32 5\25 { width: $width * 0.25; }
228 228
229 // Main class. 229 // Main class.
230 .container { 230 .container {
231 @if $lock { 231 @if $lock {
232 width: $width !important; 232 width: $width !important;
233 } 233 }
234 @else { 234 @else {
235 width: $width; 235 width: $width;
236 } 236 }
237 } 237 }
238 238
239 } 239 }
240 240
241 /// Utility mixin for grid. 241 /// Utility mixin for grid.
242 /// @param {list} $gutters Column and row gutters (default is 40px). 242 /// @param {list} $gutters Column and row gutters (default is 40px).
243 /// @param {string} $breakpointName Optional breakpoint name. 243 /// @param {string} $breakpointName Optional breakpoint name.
244 @mixin grid($gutters: 40px, $breakpointName: null) { 244 @mixin grid($gutters: 40px, $breakpointName: null) {
245 245
246 // Gutters. 246 // Gutters.
247 @include grid-gutters($gutters); 247 @include grid-gutters($gutters);
248 @include grid-gutters($gutters, \32 00\25, 2); 248 @include grid-gutters($gutters, \32 00\25, 2);
249 @include grid-gutters($gutters, \31 50\25, 1.5); 249 @include grid-gutters($gutters, \31 50\25, 1.5);
250 @include grid-gutters($gutters, \35 0\25, 0.5); 250 @include grid-gutters($gutters, \35 0\25, 0.5);
251 @include grid-gutters($gutters, \32 5\25, 0.25); 251 @include grid-gutters($gutters, \32 5\25, 0.25);
252 252
253 // Cells. 253 // Cells.
254 $x: ''; 254 $x: '';
255 255
256 @if $breakpointName { 256 @if $breakpointName {
257 $x: '\\28' + $breakpointName + '\\29'; 257 $x: '\\28' + $breakpointName + '\\29';
258 } 258 }
259 259
260 .\31 2u#{$x}, .\31 2u\24#{$x} { width: 100%; clear: none; margin-left: 0; } 260 .\31 2u#{$x}, .\31 2u\24#{$x} { width: 100%; clear: none; margin-left: 0; }
261 .\31 1u#{$x}, .\31 1u\24#{$x} { width: 91.6666666667%; clear: none; margin-left: 0; } 261 .\31 1u#{$x}, .\31 1u\24#{$x} { width: 91.6666666667%; clear: none; margin-left: 0; }
262 .\31 0u#{$x}, .\31 0u\24#{$x} { width: 83.3333333333%; clear: none; margin-left: 0; } 262 .\31 0u#{$x}, .\31 0u\24#{$x} { width: 83.3333333333%; clear: none; margin-left: 0; }
263 .\39 u#{$x}, .\39 u\24#{$x} { width: 75%; clear: none; margin-left: 0; } 263 .\39 u#{$x}, .\39 u\24#{$x} { width: 75%; clear: none; margin-left: 0; }
264 .\38 u#{$x}, .\38 u\24#{$x} { width: 66.6666666667%; clear: none; margin-left: 0; } 264 .\38 u#{$x}, .\38 u\24#{$x} { width: 66.6666666667%; clear: none; margin-left: 0; }
265 .\37 u#{$x}, .\37 u\24#{$x} { width: 58.3333333333%; clear: none; margin-left: 0; } 265 .\37 u#{$x}, .\37 u\24#{$x} { width: 58.3333333333%; clear: none; margin-left: 0; }
266 .\36 u#{$x}, .\36 u\24#{$x} { width: 50%; clear: none; margin-left: 0; } 266 .\36 u#{$x}, .\36 u\24#{$x} { width: 50%; clear: none; margin-left: 0; }
267 .\35 u#{$x}, .\35 u\24#{$x} { width: 41.6666666667%; clear: none; margin-left: 0; } 267 .\35 u#{$x}, .\35 u\24#{$x} { width: 41.6666666667%; clear: none; margin-left: 0; }
268 .\34 u#{$x}, .\34 u\24#{$x} { width: 33.3333333333%; clear: none; margin-left: 0; } 268 .\34 u#{$x}, .\34 u\24#{$x} { width: 33.3333333333%; clear: none; margin-left: 0; }
269 .\33 u#{$x}, .\33 u\24#{$x} { width: 25%; clear: none; margin-left: 0; } 269 .\33 u#{$x}, .\33 u\24#{$x} { width: 25%; clear: none; margin-left: 0; }
270 .\32 u#{$x}, .\32 u\24#{$x} { width: 16.6666666667%; clear: none; margin-left: 0; } 270 .\32 u#{$x}, .\32 u\24#{$x} { width: 16.6666666667%; clear: none; margin-left: 0; }
271 .\31 u#{$x}, .\31 u\24#{$x} { width: 8.3333333333%; clear: none; margin-left: 0; } 271 .\31 u#{$x}, .\31 u\24#{$x} { width: 8.3333333333%; clear: none; margin-left: 0; }
272 272
273 .\31 2u\24#{$x} + *, 273 .\31 2u\24#{$x} + *,
274 .\31 1u\24#{$x} + *, 274 .\31 1u\24#{$x} + *,
275 .\31 0u\24#{$x} + *, 275 .\31 0u\24#{$x} + *,
276 .\39 u\24#{$x} + *, 276 .\39 u\24#{$x} + *,
277 .\38 u\24#{$x} + *, 277 .\38 u\24#{$x} + *,
278 .\37 u\24#{$x} + *, 278 .\37 u\24#{$x} + *,
279 .\36 u\24#{$x} + *, 279 .\36 u\24#{$x} + *,
280 .\35 u\24#{$x} + *, 280 .\35 u\24#{$x} + *,
281 .\34 u\24#{$x} + *, 281 .\34 u\24#{$x} + *,
282 .\33 u\24#{$x} + *, 282 .\33 u\24#{$x} + *,
283 .\32 u\24#{$x} + *, 283 .\32 u\24#{$x} + *,
284 .\31 u\24#{$x} + * { 284 .\31 u\24#{$x} + * {
285 clear: left; 285 clear: left;
286 } 286 }
287 287
288 .\-11u#{$x} { margin-left: 91.6666666667% } 288 .\-11u#{$x} { margin-left: 91.6666666667% }
289 .\-10u#{$x} { margin-left: 83.3333333333% } 289 .\-10u#{$x} { margin-left: 83.3333333333% }
290 .\-9u#{$x} { margin-left: 75% } 290 .\-9u#{$x} { margin-left: 75% }
291 .\-8u#{$x} { margin-left: 66.6666666667% } 291 .\-8u#{$x} { margin-left: 66.6666666667% }
292 .\-7u#{$x} { margin-left: 58.3333333333% } 292 .\-7u#{$x} { margin-left: 58.3333333333% }
293 .\-6u#{$x} { margin-left: 50% } 293 .\-6u#{$x} { margin-left: 50% }
294 .\-5u#{$x} { margin-left: 41.6666666667% } 294 .\-5u#{$x} { margin-left: 41.6666666667% }
295 .\-4u#{$x} { margin-left: 33.3333333333% } 295 .\-4u#{$x} { margin-left: 33.3333333333% }
296 .\-3u#{$x} { margin-left: 25% } 296 .\-3u#{$x} { margin-left: 25% }
297 .\-2u#{$x} { margin-left: 16.6666666667% } 297 .\-2u#{$x} { margin-left: 16.6666666667% }
298 .\-1u#{$x} { margin-left: 8.3333333333% } 298 .\-1u#{$x} { margin-left: 8.3333333333% }
299 299
300 } 300 }
301 301
302 /// Utility mixin for grid. 302 /// Utility mixin for grid.
303 /// @param {list} $gutters Gutters. 303 /// @param {list} $gutters Gutters.
304 /// @param {string} $class Optional class name. 304 /// @param {string} $class Optional class name.
305 /// @param {integer} $multiplier Multiplier (default is 1). 305 /// @param {integer} $multiplier Multiplier (default is 1).
306 @mixin grid-gutters($gutters, $class: null, $multiplier: 1) { 306 @mixin grid-gutters($gutters, $class: null, $multiplier: 1) {
307 307
308 // Expand gutters if it's not a list. 308 // Expand gutters if it's not a list.
309 @if length($gutters) == 1 { 309 @if length($gutters) == 1 {
310 $gutters: ($gutters, 0); 310 $gutters: ($gutters, 0);
311 } 311 }
312 312
313 // Get column and row gutter values. 313 // Get column and row gutter values.
314 $c: nth($gutters, 1); 314 $c: nth($gutters, 1);
315 $r: nth($gutters, 2); 315 $r: nth($gutters, 2);
316 316
317 // Get class (if provided). 317 // Get class (if provided).
318 $x: ''; 318 $x: '';
319 319
320 @if $class { 320 @if $class {
321 $x: '.' + $class; 321 $x: '.' + $class;
322 } 322 }
323 323
324 // Default. 324 // Default.
325 .row#{$x} > * { padding: ($r * $multiplier) 0 0 ($c * $multiplier); } 325 .row#{$x} > * { padding: ($r * $multiplier) 0 0 ($c * $multiplier); }
326 .row#{$x} { margin: ($r * $multiplier * -1) 0 -1px ($c * $multiplier * -1); } 326 .row#{$x} { margin: ($r * $multiplier * -1) 0 -1px ($c * $multiplier * -1); }
327 327
328 // Uniform. 328 // Uniform.
329 .row.uniform#{$x} > * { padding: ($c * $multiplier) 0 0 ($c * $multiplier); } 329 .row.uniform#{$x} > * { padding: ($c * $multiplier) 0 0 ($c * $multiplier); }
330 .row.uniform#{$x} { margin: ($c * $multiplier * -1) 0 -1px ($c * $multiplier * -1); } 330 .row.uniform#{$x} { margin: ($c * $multiplier * -1) 0 -1px ($c * $multiplier * -1); }
331 331
332 } 332 }
333 333
334 /// Wraps @content in vendorized keyframe blocks. 334 /// Wraps @content in vendorized keyframe blocks.
335 /// @param {string} $name Name. 335 /// @param {string} $name Name.
336 @mixin keyframes($name) { 336 @mixin keyframes($name) {
337 337
338 @-moz-keyframes #{$name} { @content; } 338 @-moz-keyframes #{$name} { @content; }
339 @-webkit-keyframes #{$name} { @content; } 339 @-webkit-keyframes #{$name} { @content; }
340 @-ms-keyframes #{$name} { @content; } 340 @-ms-keyframes #{$name} { @content; }
341 @keyframes #{$name} { @content; } 341 @keyframes #{$name} { @content; }
342 342
343 } 343 }
344 344
345 /// 345 ///
346 /// Sets breakpoints. 346 /// Sets breakpoints.
347 /// @param {map} $x Breakpoints. 347 /// @param {map} $x Breakpoints.
348 /// 348 ///
349 @mixin skel-breakpoints($x: ()) { 349 @mixin skel-breakpoints($x: ()) {
350 $breakpoints: $x !global; 350 $breakpoints: $x !global;
351 } 351 }
352 352
353 /// 353 ///
354 /// Initializes layout module. 354 /// Initializes layout module.
355 /// @param {map} config Config. 355 /// @param {map} config Config.
356 /// 356 ///
357 @mixin skel-layout($config: ()) { 357 @mixin skel-layout($config: ()) {
358 358
359 // Config. 359 // Config.
360 $configPerBreakpoint: (); 360 $configPerBreakpoint: ();
361 361
362 $z: map-get($config, 'breakpoints'); 362 $z: map-get($config, 'breakpoints');
363 363
364 @if $z { 364 @if $z {
365 $configPerBreakpoint: $z; 365 $configPerBreakpoint: $z;
366 } 366 }
367 367
368 // Reset. 368 // Reset.
369 $x: map-get($config, 'reset'); 369 $x: map-get($config, 'reset');
370 370
371 @if $x { 371 @if $x {
372 372
373 /* Reset */ 373 /* Reset */
374 374
375 @include reset($x); 375 @include reset($x);
376 376
377 } 377 }
378 378
379 // Box model. 379 // Box model.
380 $x: map-get($config, 'boxModel'); 380 $x: map-get($config, 'boxModel');
381 381
382 @if $x { 382 @if $x {
383 383
384 /* Box Model */ 384 /* Box Model */
385 385
386 @include boxModel($x); 386 @include boxModel($x);
387 387
388 } 388 }
389 389
390 // Containers. 390 // Containers.
391 $containers: map-get($config, 'containers'); 391 $containers: map-get($config, 'containers');
392 392
393 @if $containers { 393 @if $containers {
394 394
395 /* Containers */ 395 /* Containers */
396 396
397 .container { 397 .container {
398 margin-left: auto; 398 margin-left: auto;
399 margin-right: auto; 399 margin-right: auto;
400 } 400 }
401 401
402 // Use default is $containers is just "true". 402 // Use default is $containers is just "true".
403 @if $containers == true { 403 @if $containers == true {
404 $containers: 960px; 404 $containers: 960px;
405 } 405 }
406 406
407 // Apply base. 407 // Apply base.
408 @include containers($containers); 408 @include containers($containers);
409 409
410 // Apply per-breakpoint. 410 // Apply per-breakpoint.
411 @each $name in map-keys($breakpoints) { 411 @each $name in map-keys($breakpoints) {
412 412
413 // Get/use breakpoint setting if it exists. 413 // Get/use breakpoint setting if it exists.
414 $x: map-get($configPerBreakpoint, $name); 414 $x: map-get($configPerBreakpoint, $name);
415 415
416 // Per-breakpoint config exists? 416 // Per-breakpoint config exists?
417 @if $x { 417 @if $x {
418 $y: map-get($x, 'containers'); 418 $y: map-get($x, 'containers');
419 419
420 // Setting exists? Use it. 420 // Setting exists? Use it.
421 @if $y { 421 @if $y {
422 $containers: $y; 422 $containers: $y;
423 } 423 }
424 424
425 } 425 }
426 426
427 // Create @media block. 427 // Create @media block.
428 @media screen and #{map-get($breakpoints, $name)} { 428 @media screen and #{map-get($breakpoints, $name)} {
429 @include containers($containers); 429 @include containers($containers);
430 } 430 }
431 431
432 } 432 }
433 433
434 } 434 }
435 435
436 // Grid. 436 // Grid.
437 $grid: map-get($config, 'grid'); 437 $grid: map-get($config, 'grid');
438 438
439 @if $grid { 439 @if $grid {
440 440
441 /* Grid */ 441 /* Grid */
442 442
443 // Use defaults if $grid is just "true". 443 // Use defaults if $grid is just "true".
444 @if $grid == true { 444 @if $grid == true {
445 $grid: (); 445 $grid: ();
446 } 446 }
447 447
448 // Sub-setting: Gutters. 448 // Sub-setting: Gutters.
449 $grid-gutters: 40px; 449 $grid-gutters: 40px;
450 $x: map-get($grid, 'gutters'); 450 $x: map-get($grid, 'gutters');
451 451
452 @if $x { 452 @if $x {
453 $grid-gutters: $x; 453 $grid-gutters: $x;
454 } 454 }
455 455
456 // Rows. 456 // Rows.
457 .row { 457 .row {
458 border-bottom: solid 1px transparent; 458 border-bottom: solid 1px transparent;
459 -moz-box-sizing: border-box; 459 -moz-box-sizing: border-box;
460 -webkit-box-sizing: border-box; 460 -webkit-box-sizing: border-box;
461 box-sizing: border-box; 461 box-sizing: border-box;
462 } 462 }
463 463
464 .row > * { 464 .row > * {
465 float: left; 465 float: left;
466 -moz-box-sizing: border-box; 466 -moz-box-sizing: border-box;
467 -webkit-box-sizing: border-box; 467 -webkit-box-sizing: border-box;
468 box-sizing: border-box; 468 box-sizing: border-box;
469 } 469 }
470 470
471 .row:after, .row:before { 471 .row:after, .row:before {
472 content: ''; 472 content: '';
473 display: block; 473 display: block;
474 clear: both; 474 clear: both;
475 height: 0; 475 height: 0;
476 } 476 }
477 477
478 .row.uniform > * > :first-child { 478 .row.uniform > * > :first-child {
479 margin-top: 0; 479 margin-top: 0;
480 } 480 }
481 481
482 .row.uniform > * > :last-child { 482 .row.uniform > * > :last-child {
483 margin-bottom: 0; 483 margin-bottom: 0;
484 } 484 }
485 485
486 // Gutters (0%). 486 // Gutters (0%).
487 @include grid-gutters($grid-gutters, \30 \25, 0); 487 @include grid-gutters($grid-gutters, \30 \25, 0);
488 488
489 // Apply base. 489 // Apply base.
490 @include grid($grid-gutters); 490 @include grid($grid-gutters);
491 491
492 // Apply per-breakpoint. 492 // Apply per-breakpoint.
493 @each $name in map-keys($breakpoints) { 493 @each $name in map-keys($breakpoints) {
494 494
495 // Get/use breakpoint setting if it exists. 495 // Get/use breakpoint setting if it exists.
496 $x: map-get($configPerBreakpoint, $name); 496 $x: map-get($configPerBreakpoint, $name);
497 497
498 // Per-breakpoint config exists? 498 // Per-breakpoint config exists?
499 @if $x { 499 @if $x {
500 $y: map-get($x, 'grid'); 500 $y: map-get($x, 'grid');
501 501
502 // Setting exists? 502 // Setting exists?
503 @if $y { 503 @if $y {
504 504
505 // Sub-setting: Gutters. 505 // Sub-setting: Gutters.
506 $x: map-get($y, 'gutters'); 506 $x: map-get($y, 'gutters');
507 507
508 @if $x { 508 @if $x {
509 $grid-gutters: $x; 509 $grid-gutters: $x;
510 } 510 }
511 511
512 } 512 }
513 513
514 } 514 }
515 515
516 // Create @media block. 516 // Create @media block.
517 @media screen and #{map-get($breakpoints, $name)} { 517 @media screen and #{map-get($breakpoints, $name)} {
518 @include grid($grid-gutters, $name); 518 @include grid($grid-gutters, $name);
519 } 519 }
520 520
521 } 521 }
522 522
523 } 523 }
524 524
525 } 525 }
526 526
527 /// Resets browser styles. 527 /// Resets browser styles.
528 /// @param {string} $mode Mode (default is 'normalize'). 528 /// @param {string} $mode Mode (default is 'normalize').
529 @mixin reset($mode: 'normalize') { 529 @mixin reset($mode: 'normalize') {
530 530
531 @if $mode == 'normalize' { 531 @if $mode == 'normalize' {
532 532
533 // normalize.css v3.0.2 | MIT License | git.io/normalize 533 // normalize.css v3.0.2 | MIT License | git.io/normalize
534 html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0} 534 html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}
535 535
536 } 536 }
537 @else if $mode == 'full' { 537 @else if $mode == 'full' {
538 538
539 // meyerweb.com/eric/tools/css/reset v2.0 | 20110126 | License: none (public domain) 539 // meyerweb.com/eric/tools/css/reset v2.0 | 20110126 | License: none (public domain)
540 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}table{border-collapse:collapse;border-spacing:0;}body{-webkit-text-size-adjust:none} 540 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}table{border-collapse:collapse;border-spacing:0;}body{-webkit-text-size-adjust:none}
541 541
542 } 542 }
543 543
544 } 544 }
545 545
546 /// Vendorizes a declaration's property and/or value(s). 546 /// Vendorizes a declaration's property and/or value(s).
547 /// @param {string} $property Property. 547 /// @param {string} $property Property.
548 /// @param {mixed} $value String/list of value(s). 548 /// @param {mixed} $value String/list of value(s).
549 @mixin vendor($property, $value) { 549 @mixin vendor($property, $value) {
550 550
551 // Determine if property should expand. 551 // Determine if property should expand.
552 $expandProperty: index($vendor-properties, $property); 552 $expandProperty: index($vendor-properties, $property);
553 553
554 // Determine if value should expand (and if so, add '-prefix-' placeholder). 554 // Determine if value should expand (and if so, add '-prefix-' placeholder).
555 $expandValue: false; 555 $expandValue: false;
556 556
557 @each $x in $value { 557 @each $x in $value {
558 @each $y in $vendor-values { 558 @each $y in $vendor-values {
559 @if $y == str-slice($x, 1, str-length($y)) { 559 @if $y == str-slice($x, 1, str-length($y)) {
560 560
561 $value: set-nth($value, index($value, $x), '-prefix-' + $x); 561 $value: set-nth($value, index($value, $x), '-prefix-' + $x);
562 $expandValue: true; 562 $expandValue: true;
563 563
564 } 564 }
565 } 565 }
566 } 566 }
567 567
568 // Expand property? 568 // Expand property?
569 @if $expandProperty { 569 @if $expandProperty {
570 @each $vendor in $vendor-prefixes { 570 @each $vendor in $vendor-prefixes {
571 #{$vendor}#{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; 571 #{$vendor}#{$property}: #{str-replace-all($value, '-prefix-', $vendor)};
572 } 572 }
573 } 573 }
574 574
575 // Expand just the value? 575 // Expand just the value?
576 @elseif $expandValue { 576 @elseif $expandValue {
577 @each $vendor in $vendor-prefixes { 577 @each $vendor in $vendor-prefixes {
578 #{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; 578 #{$property}: #{str-replace-all($value, '-prefix-', $vendor)};
579 } 579 }
580 } 580 }
581 581
582 // Neither? Treat them as a normal declaration. 582 // Neither? Treat them as a normal declaration.
583 @else { 583 @else {
584 #{$property}: #{$value}; 584 #{$property}: #{$value};
585 } 585 }
586 586
587 } \ No newline at end of file 587 } \ No newline at end of file
diff --git a/www/assets/sass/libs/_vars.scss b/www/assets/sass/libs/_vars.scss
index 5eb4ac6..1181ed1 100644
--- a/www/assets/sass/libs/_vars.scss
+++ b/www/assets/sass/libs/_vars.scss
@@ -1,33 +1,33 @@
1// Misc. 1// Misc.
2 $misc: ( 2 $misc: (
3 z-index-base: 10000 3 z-index-base: 10000
4 ); 4 );
5 5
6// Duration. 6// Duration.
7 $duration: ( 7 $duration: (
8 navPanel: 0.5s 8 navPanel: 0.5s
9 ); 9 );
10 10
11// Size. 11// Size.
12 $size: ( 12 $size: (
13 navPanel: 275px, 13 navPanel: 275px,
14 radius: 5px 14 radius: 5px
15 ); 15 );
16 16
17// Font. 17// Font.
18 $font: ( 18 $font: (
19 ); 19 );
20 20
21// Palette. 21// Palette.
22 $palette: ( 22 $palette: (
23 bg: #f7f7f7, 23 bg: #f7f7f7,
24 fg: #474747, 24 fg: #474747,
25 fg-bold: #4c4c4c, 25 fg-bold: #4c4c4c,
26 fg-light: #999, 26 fg-light: #999,
27 border: #e0e0e0, 27 border: #e0e0e0,
28 28
29 accent: ( 29 accent: (
30 bg: #37c0fb, 30 bg: #37c0fb,
31 fg: #fff 31 fg: #fff
32 ) 32 )
33 ); \ No newline at end of file 33 ); \ No newline at end of file
diff --git a/www/index.html b/www/index.html
index 498d995..31114a4 100644
--- a/www/index.html
+++ b/www/index.html
@@ -1,194 +1,194 @@
1<!DOCTYPE HTML> 1<!DOCTYPE HTML>
2<!-- 2<!--
3 Arcana by HTML5 UP 3 Arcana by HTML5 UP
4 html5up.net | @ajlkn 4 html5up.net | @ajlkn
5 Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) 5 Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
6--> 6-->
7<html> 7<html>
8 <head> 8 <head>
9 <title>Zuul: Cross-Project CI/CD with Ansible</title> 9 <title>Zuul: Cross-Project CI/CD with Ansible</title>
10 <meta charset="utf-8" /> 10 <meta charset="utf-8" />
11 <meta name="viewport" content="width=device-width, initial-scale=1" /> 11 <meta name="viewport" content="width=device-width, initial-scale=1" />
12 <!--[if lte IE 8]><script src="assets/js/ie/html5shiv.js"></script><![endif]--> 12 <!--[if lte IE 8]><script src="assets/js/ie/html5shiv.js"></script><![endif]-->
13 <link rel="stylesheet" href="assets/css/main.css" /> 13 <link rel="stylesheet" href="assets/css/main.css" />
14 <!--[if lte IE 8]><link rel="stylesheet" href="assets/css/ie8.css" /><![endif]--> 14 <!--[if lte IE 8]><link rel="stylesheet" href="assets/css/ie8.css" /><![endif]-->
15 <!--[if lte IE 9]><link rel="stylesheet" href="assets/css/ie9.css" /><![endif]--> 15 <!--[if lte IE 9]><link rel="stylesheet" href="assets/css/ie9.css" /><![endif]-->
16 </head> 16 </head>
17 <body> 17 <body>
18 <div id="page-wrapper"> 18 <div id="page-wrapper">
19 19
20 <!-- Header --> 20 <!-- Header -->
21 <div id="header"> 21 <div id="header">
22 22
23 <!-- Logo --> 23 <!-- Logo -->
24 <h1><a href="index.html" id="logo">Zuul</a></h1> 24 <h1><a href="index.html" id="logo">Zuul</a></h1>
25 25
26 <!-- Nav 26 <!-- Nav
27 <nav id="nav"> 27 <nav id="nav">
28 <ul> 28 <ul>
29 <li class="current"><a href="index.html">Home</a></li> 29 <li class="current"><a href="index.html">Home</a></li>
30 <li> 30 <li>
31 <a href="#">Dropdown</a> 31 <a href="#">Dropdown</a>
32 <ul> 32 <ul>
33 <li><a href="#">Lorem dolor</a></li> 33 <li><a href="#">Lorem dolor</a></li>
34 <li><a href="#">Magna phasellus</a></li> 34 <li><a href="#">Magna phasellus</a></li>
35 <li><a href="#">Etiam sed tempus</a></li> 35 <li><a href="#">Etiam sed tempus</a></li>
36 <li> 36 <li>
37 <a href="#">Submenu</a> 37 <a href="#">Submenu</a>
38 <ul> 38 <ul>
39 <li><a href="#">Lorem dolor</a></li> 39 <li><a href="#">Lorem dolor</a></li>
40 <li><a href="#">Phasellus magna</a></li> 40 <li><a href="#">Phasellus magna</a></li>
41 <li><a href="#">Magna phasellus</a></li> 41 <li><a href="#">Magna phasellus</a></li>
42 <li><a href="#">Etiam nisl</a></li> 42 <li><a href="#">Etiam nisl</a></li>
43 <li><a href="#">Veroeros feugiat</a></li> 43 <li><a href="#">Veroeros feugiat</a></li>
44 </ul> 44 </ul>
45 </li> 45 </li>
46 <li><a href="#">Veroeros feugiat</a></li> 46 <li><a href="#">Veroeros feugiat</a></li>
47 </ul> 47 </ul>
48 </li> 48 </li>
49 <li><a href="left-sidebar.html">Left Sidebar</a></li> 49 <li><a href="left-sidebar.html">Left Sidebar</a></li>
50 <li><a href="right-sidebar.html">Right Sidebar</a></li> 50 <li><a href="right-sidebar.html">Right Sidebar</a></li>
51 <li><a href="two-sidebar.html">Two Sidebar</a></li> 51 <li><a href="two-sidebar.html">Two Sidebar</a></li>
52 <li><a href="no-sidebar.html">No Sidebar</a></li> 52 <li><a href="no-sidebar.html">No Sidebar</a></li>
53 </ul> 53 </ul>
54 </nav> 54 </nav>
55 --> 55 -->
56 </div> 56 </div>
57 57
58 <!-- Banner --> 58 <!-- Banner -->
59 <section id="banner"> 59 <section id="banner">
60 <header> 60 <header>
61 <h2>Cross-Project CI/CD with Ansible</h2> 61 <h2>Cross-Project CI/CD with Ansible</h2>
62 </header> 62 </header>
63 </section> 63 </section>
64 64
65 <!-- Highlights --> 65 <!-- Highlights -->
66 <section class="wrapper style1"> 66 <section class="wrapper style1">
67 <div class="container"> 67 <div class="container">
68 <div class="row 200%"> 68 <div class="row 200%">
69 <section class="4u 12u(narrower)"> 69 <section class="4u 12u(narrower)">
70 <div class="box highlight"> 70 <div class="box highlight">
71 <i class="icon major fa-gears"></i> 71 <i class="icon major fa-gears"></i>
72 <h3>Project Gating</h3> 72 <h3>Project Gating</h3>
73 <p>Keep your builds evergreen by automatically merging changes only if they pass tests.</p> 73 <p>Keep your builds evergreen by automatically merging changes only if they pass tests.</p>
74 </div> 74 </div>
75 </section> 75 </section>
76 <section class="4u 12u(narrower)"> 76 <section class="4u 12u(narrower)">
77 <div class="box highlight"> 77 <div class="box highlight">
78 <i class="icon major fa-pencil"></i> 78 <i class="icon major fa-pencil"></i>
79 <h3>CI/CD with Ansible</h3> 79 <h3>CI/CD with Ansible</h3>
80 <p>Use the same Ansible to deploy your system and run your tests.</p> 80 <p>Use the same Ansible to deploy your system and run your tests.</p>
81 </div> 81 </div>
82 </section> 82 </section>
83 <section class="4u 12u(narrower)"> 83 <section class="4u 12u(narrower)">
84 <div class="box highlight"> 84 <div class="box highlight">
85 <i class="icon major fa-wrench"></i> 85 <i class="icon major fa-wrench"></i>
86 <h3>Cross-Project Dependencies</h3> 86 <h3>Cross-Project Dependencies</h3>
87 <p>Easily test changes to multiple systems together before landing a single patch.</p> 87 <p>Easily test changes to multiple systems together before landing a single patch.</p>
88 </div> 88 </div>
89 </section> 89 </section>
90 </div> 90 </div>
91 </div> 91 </div>
92 </section> 92 </section>
93 93
94 <!-- Gigantic Heading --> 94 <!-- Gigantic Heading -->
95 <section class="wrapper style2"> 95 <section class="wrapper style2">
96 <div class="container"> 96 <div class="container">
97 <header class="major"> 97 <header class="major">
98 <h2>Tested at scale</h2> 98 <h2>Tested at scale</h2>
99 <p>Zuul powers some of the largest Open Source development efforts</p> 99 <p>Zuul powers some of the largest Open Source development efforts</p>
100 </header> 100 </header>
101 </div> 101 </div>
102 </section> 102 </section>
103 103
104 <!-- Posts --> 104 <!-- Posts -->
105 <section class="wrapper style1"> 105 <section class="wrapper style1">
106 <div class="container"> 106 <div class="container">
107 <div class="row"> 107 <div class="row">
108 <section class="6u 12u(narrower)"> 108 <section class="6u 12u(narrower)">
109 <div class="box post"> 109 <div class="box post">
110 <a href="https://git.openstack.org/cgit/openstack-infra/zuul/tree/" class="image left"><img src="images/code.png" alt="" /></a> 110 <a href="https://git.openstack.org/cgit/openstack-infra/zuul/tree/" class="image left"><img src="images/code.png" alt="" /></a>
111 <div class="inner"> 111 <div class="inner">
112 <h3>Get the Source</h3> 112 <h3>Get the Source</h3>
113 <p>Zuul is Free and Open Source Software. Download the source from <a href="https://git.openstack.org/cgit/openstack-infra/zuul/tree/">git.openstack.org</a> or install it from <a href="https://pypi.python.org/pypi/zuul/">PyPI</a></p> 113 <p>Zuul is Free and Open Source Software. Download the source from <a href="https://git.openstack.org/cgit/openstack-infra/zuul/tree/">git.openstack.org</a> or install it from <a href="https://pypi.python.org/pypi/zuul/">PyPI</a></p>
114 </div> 114 </div>
115 </div> 115 </div>
116 </section> 116 </section>
117 <section class="6u 12u(narrower)"> 117 <section class="6u 12u(narrower)">
118 <div class="box post"> 118 <div class="box post">
119 <a href="#" class="image left"><img src="images/docs.png" alt="" /></a> 119 <a href="#" class="image left"><img src="images/docs.png" alt="" /></a>
120 <div class="inner"> 120 <div class="inner">
121 <h3>Read the Docs</h3> 121 <h3>Read the Docs</h3>
122 <p>Zuul has extensive <a href="https://docs.openstack.org/infra/zuul/">documentation</a>.</p> 122 <p>Zuul has extensive <a href="https://docs.openstack.org/infra/zuul/">documentation</a>.</p>
123 </div> 123 </div>
124 </div> 124 </div>
125 </section> 125 </section>
126 </div> 126 </div>
127 <div class="row"> 127 <div class="row">
128 <section class="6u 12u(narrower)"> 128 <section class="6u 12u(narrower)">
129 <div class="box post"> 129 <div class="box post">
130 <a href="#" class="image left"><img src="images/lists.png" alt="" /></a> 130 <a href="#" class="image left"><img src="images/lists.png" alt="" /></a>
131 <div class="inner"> 131 <div class="inner">
132 <h3>Join the Mailing List</h3> 132 <h3>Join the Mailing List</h3>
133 <p>Zuul has <a href="http://lists.zuul-ci.org/cgi-bin/mailman/listinfo">mailing lists</a> for announcements and discussions.</p> 133 <p>Zuul has <a href="http://lists.zuul-ci.org/cgi-bin/mailman/listinfo">mailing lists</a> for announcements and discussions.</p>
134 </div> 134 </div>
135 </div> 135 </div>
136 </section> 136 </section>
137 <section class="6u 12u(narrower)"> 137 <section class="6u 12u(narrower)">
138 <div class="box post"> 138 <div class="box post">
139 <a href="#" class="image left"><img src="images/irc.png" alt="" /></a> 139 <a href="#" class="image left"><img src="images/irc.png" alt="" /></a>
140 <div class="inner"> 140 <div class="inner">
141 <h3>Chat on IRC</h3> 141 <h3>Chat on IRC</h3>
142 <p>Join <a href="http://webchat.freenode.net/?channels=%23zuul">#zuul</a> on FreeNode</p> 142 <p>Join <a href="http://webchat.freenode.net/?channels=%23zuul">#zuul</a> on FreeNode</p>
143 </div> 143 </div>
144 </div> 144 </div>
145 </section> 145 </section>
146 </div> 146 </div>
147 </div> 147 </div>
148 </section> 148 </section>
149 149
150 <!-- Footer --> 150 <!-- Footer -->
151 <div id="footer"> 151 <div id="footer">
152 <div class="container"> 152 <div class="container">
153 <div class="row"> 153 <div class="row">
154 <section class="3u 6u(narrower) 12u$(mobilep)"> 154 <section class="3u 6u(narrower) 12u$(mobilep)">
155 <h3>Get Zuul</h3> 155 <h3>Get Zuul</h3>
156 <ul class="links"> 156 <ul class="links">
157 <li><a href="https://git.openstack.org/cgit/openstack-infra/zuul">Source</a></li> 157 <li><a href="https://git.openstack.org/cgit/openstack-infra/zuul">Source</a></li>
158 <li><a href="https://pypi.python.org/pypi/zuul/">Install</a></li> 158 <li><a href="https://pypi.python.org/pypi/zuul/">Install</a></li>
159 <li><a href="https://docs.openstack.org/infra/zuul/">Documentation</a></li> 159 <li><a href="https://docs.openstack.org/infra/zuul/">Documentation</a></li>
160 </ul> 160 </ul>
161 </section> 161 </section>
162 <section class="3u 6u$(narrower) 12u$(mobilep)"> 162 <section class="3u 6u$(narrower) 12u$(mobilep)">
163 <h3>Get Involved</h3> 163 <h3>Get Involved</h3>
164 <ul class="links"> 164 <ul class="links">
165 <li><a href="http://lists.zuul-ci.org/cgi-bin/mailman/listinfo">Mailing lists</a></li> 165 <li><a href="http://lists.zuul-ci.org/cgi-bin/mailman/listinfo">Mailing lists</a></li>
166 <li><a href="http://webchat.freenode.net/?channels=%23zuul">IRC</a> #zuul on Freenode</li> 166 <li><a href="http://webchat.freenode.net/?channels=%23zuul">IRC</a> #zuul on Freenode</li>
167 <li><a href="https://storyboard.openstack.org/#!/project/679">Bugs</a></li> 167 <li><a href="https://storyboard.openstack.org/#!/project/679">Bugs</a></li>
168 <li><a href="https://review.openstack.org/#/q/status:open+project:openstack-infra/zuul">Code Review</a></li> 168 <li><a href="https://review.openstack.org/#/q/status:open+project:openstack-infra/zuul">Code Review</a></li>
169 </ul> 169 </ul>
170 </section> 170 </section>
171 </div> 171 </div>
172 </div> 172 </div>
173 173
174 <!-- Copyright --> 174 <!-- Copyright -->
175 <div class="copyright"> 175 <div class="copyright">
176 <ul class="menu"> 176 <ul class="menu">
177 <li>&copy; Zuul Contributors. Licensed under Creative Commons Attribution 3.0</li><li>Title image by James E. Blair</li><li>Design based on Arcana from: <a href="http://html5up.net">HTML5 UP</a></li> 177 <li>&copy; Zuul Contributors. Licensed under Creative Commons Attribution 3.0</li><li>Title image by James E. Blair</li><li>Design based on Arcana from: <a href="http://html5up.net">HTML5 UP</a></li>
178 </ul> 178 </ul>
179 </div> 179 </div>
180 180
181 </div> 181 </div>
182 182
183 </div> 183 </div>
184 184
185 <!-- Scripts --> 185 <!-- Scripts -->
186 <script src="assets/js/jquery.min.js"></script> 186 <script src="assets/js/jquery.min.js"></script>
187 <script src="assets/js/jquery.dropotron.min.js"></script> 187 <script src="assets/js/jquery.dropotron.min.js"></script>
188 <script src="assets/js/skel.min.js"></script> 188 <script src="assets/js/skel.min.js"></script>
189 <script src="assets/js/util.js"></script> 189 <script src="assets/js/util.js"></script>
190 <!--[if lte IE 8]><script src="assets/js/ie/respond.min.js"></script><![endif]--> 190 <!--[if lte IE 8]><script src="assets/js/ie/respond.min.js"></script><![endif]-->
191 <script src="assets/js/main.js"></script> 191 <script src="assets/js/main.js"></script>
192 192
193 </body> 193 </body>
194</html> 194</html>