diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..70f5ed3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,20 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = tab +indent_size = 4 +tab_width = 4 + +[*.{json,txt,js}] +indent_style = space +indent_size = 2 + +[*.txt] +end_of_line = crlf diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..e3578aa --- /dev/null +++ b/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "standard" +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c016021 --- /dev/null +++ b/.gitignore @@ -0,0 +1,170 @@ +# Created by https://www.gitignore.io/api/node,sublimetext,windows,macos,sass + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +### Sass ### +.sass-cache/ +*.css.map +*.sass.map +*.scss.map + +### SublimeText ### +# Cache files for Sublime Text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache + +# Workspace files are user-specific +*.sublime-workspace + +# Project files should be checked into the repository, unless a significant +# proportion of contributors will probably not be using Sublime Text +# *.sublime-project + +# SFTP configuration file +sftp-config.json + +# Package control specific files +Package Control.last-run +Package Control.ca-list +Package Control.ca-bundle +Package Control.system-ca-bundle +Package Control.cache/ +Package Control.ca-certs/ +Package Control.merged-ca-bundle +Package Control.user-ca-bundle +oscrypto-ca-bundle.crt +bh_unicode_properties.cache + +# Sublime-github package stores a github token in this file +# https://packagecontrol.io/packages/sublime-github +GitHub.sublime-settings + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + + +# End of https://www.gitignore.io/api/node,sublimetext,windows,macos,sass diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 0000000..3dce7a2 --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,8 @@ +"rules": { + "block-no-empty": true, + "color-hex-case": "lower", + "color-hex-length": "short", + "color-no-invalid-hex": true, + "declaration-colon-space-after": "always", + "max-empty-lines": 2 +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ed369a4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# CHANGELOG.md + +## 1.0.0 (Apr 16, 2019) + +First release diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5f37774 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2b020bb --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# xVOWL + +Landing page for new project idea. diff --git a/credits.md b/credits.md new file mode 100644 index 0000000..26349f6 --- /dev/null +++ b/credits.md @@ -0,0 +1,13 @@ +# Solid + +A landing page template. + +* [Getting started](#getting-started) + +## Getting started +* First, ensure that node.js & npm are both installed. If not, choose your OS and installation method from [this page](https://nodejs.org/en/download/package-manager/) and follow the instructions. +* This template requires Node 14 to work. You can handle multiple node versions with [NVM](https://github.com/nvm-sh/nvm) +* Next, use your command line to enter your project directory. +* This template comes with a ready-to-use package file called `package-sample.json`. You just need to rename it to `package.json`, then run `npm install` to install all of the dependencies into your project. + +You're ready to go! Run any task by typing `npm run task` (where "task" is the name of the task in the `"scripts"` object). The most useful task for rapid development is `watch`. It will start a new server, open up a browser and watch for any SCSS or JS changes in the `src` directory; once it compiles those changes, the browser will automatically inject the changed file(s)! diff --git a/dist/css/style.css b/dist/css/style.css new file mode 100644 index 0000000..5d57470 --- /dev/null +++ b/dist/css/style.css @@ -0,0 +1,3 @@ +html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}body{background:#1D2026;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}hr{border:0;display:block;height:1px;background:#242830;margin-top:24px;margin-bottom:24px}ul,ol{margin-top:0;margin-bottom:24px;padding-left:24px}ul{list-style:disc}ol{list-style:decimal}li>ul,li>ol{margin-bottom:0}dl{margin-top:0;margin-bottom:24px}dt{font-weight:600}dd{margin-left:24px;margin-bottom:24px}img{height:auto;max-width:100%;vertical-align:middle}figure{margin:24px 0}figcaption{font-size:16px;line-height:24px;padding:8px 0}img,svg{display:block}table{border-collapse:collapse;margin-bottom:24px;width:100%}tr{border-bottom:1px solid #242830}th{text-align:left}th,td{padding:10px 16px}th:first-child,td:first-child{padding-left:0}th:last-child,td:last-child{padding-right:0}html{font-size:20px;line-height:30px}body{color:#8A94A7;font-size:1rem}body,button,input,select,textarea{font-family:"IBM Plex Sans", sans-serif}a{color:#8A94A7;text-decoration:underline}a:hover,a:active{outline:0;text-decoration:none}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{clear:both;color:#fff;font-weight:600}h1,.h1{font-size:38px;line-height:48px;letter-spacing:0px}@media (min-width: 641px){h1,.h1{font-size:44px;line-height:54px;letter-spacing:0px}}h2,.h2{font-size:32px;line-height:42px;letter-spacing:0px}@media (min-width: 641px){h2,.h2{font-size:38px;line-height:48px;letter-spacing:0px}}h3,.h3,blockquote{font-size:24px;line-height:34px;letter-spacing:0px}@media (min-width: 641px){h3,.h3,blockquote{font-size:32px;line-height:42px;letter-spacing:0px}}h4,h5,h6,.h4,.h5,.h6{font-size:20px;line-height:30px;letter-spacing:-0.1px}@media (min-width: 641px){h4,h5,h6,.h4,.h5,.h6{font-size:24px;line-height:34px;letter-spacing:0px}}@media (max-width: 640px){.h1-mobile{font-size:38px;line-height:48px;letter-spacing:0px}.h2-mobile{font-size:32px;line-height:42px;letter-spacing:0px}.h3-mobile{font-size:24px;line-height:34px;letter-spacing:0px}.h4-mobile,.h5-mobile,.h6-mobile{font-size:20px;line-height:30px;letter-spacing:-0.1px}}.text-light h1,.text-light h2,.text-light h3,.text-light h4,.text-light h5,.text-light h6,.text-light .h1,.text-light .h2,.text-light .h3,.text-light .h4,.text-light .h5,.text-light .h6{color:!important}.text-sm{font-size:18px;line-height:28px;letter-spacing:-0.1px}.text-xs{font-size:16px;line-height:24px;letter-spacing:-0.1px}h1,h2,.h1,.h2{margin-top:48px;margin-bottom:16px}h3,.h3{margin-top:36px;margin-bottom:12px}h4,h5,h6,.h4,.h5,.h6{margin-top:24px;margin-bottom:4px}p{margin-top:0;margin-bottom:24px}dfn,cite,em,i{font-style:italic}blockquote{color:#3B404C;font-style:italic;margin-top:24px;margin-bottom:24px;margin-left:24px}blockquote::before{content:"\201C"}blockquote::after{content:"\201D"}blockquote p{display:inline}address{color:#8A94A7;border-width:1px 0;border-style:solid;border-color:#242830;padding:24px 0;margin:0 0 24px}pre,pre h1,pre h2,pre h3,pre h4,pre h5,pre h6,pre .h1,pre .h2,pre .h3,pre .h4,pre .h5,pre .h6{font-family:"Courier 10 Pitch", Courier, monospace}pre,code,kbd,tt,var{background:#1D2026}pre{font-size:16px;line-height:24px;margin-bottom:1.6em;max-width:100%;overflow:auto;padding:24px;margin-top:24px;margin-bottom:24px}code,kbd,tt,var{font-family:Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace;font-size:16px;padding:2px 4px}abbr,acronym{cursor:help}mark,ins{text-decoration:none}small{font-size:18px;line-height:28px;letter-spacing:-0.1px}b,strong{font-weight:600}button,input,select,textarea,label{font-size:20px;line-height:30px}.container,.container-sm{width:100%;margin:0 auto;padding-left:16px;padding-right:16px}@media (min-width: 481px){.container,.container-sm{padding-left:24px;padding-right:24px}}.container{max-width:1128px}.container-sm{max-width:848px}.container .container-sm{max-width:800px;padding-left:0;padding-right:0}.screen-reader-text{clip:rect(1px, 1px, 1px, 1px);position:absolute !important;height:1px;width:1px;overflow:hidden;word-wrap:normal !important}.screen-reader-text:focus{border-radius:2px;box-shadow:0 0 2px 2px rgba(0,0,0,0.6);clip:auto !important;display:block;font-size:14px;letter-spacing:0px;font-weight:600;line-height:16px;text-decoration:none;text-transform:uppercase;background-color:#1D2026;color:#0270D7 !important;border:none;height:auto;left:8px;padding:16px 32px;top:8px;width:auto;z-index:100000}.list-reset{list-style:none;padding:0}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-primary{color:#0270D7}.has-top-divider{position:relative}.has-top-divider::before{content:'';position:absolute;top:0;left:0;width:100%;display:block;height:1px;background:#242830}.has-bottom-divider{position:relative}.has-bottom-divider::after{content:'';position:absolute;bottom:0;left:0;width:100%;display:block;height:1px;background:#242830}.m-0{margin:0}.mt-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.m-8{margin:8px}.mt-8{margin-top:8px}.mr-8{margin-right:8px}.mb-8{margin-bottom:8px}.ml-8{margin-left:8px}.m-16{margin:16px}.mt-16{margin-top:16px}.mr-16{margin-right:16px}.mb-16{margin-bottom:16px}.ml-16{margin-left:16px}.m-24{margin:24px}.mt-24{margin-top:24px}.mr-24{margin-right:24px}.mb-24{margin-bottom:24px}.ml-24{margin-left:24px}.m-32{margin:32px}.mt-32{margin-top:32px}.mr-32{margin-right:32px}.mb-32{margin-bottom:32px}.ml-32{margin-left:32px}.m-40{margin:40px}.mt-40{margin-top:40px}.mr-40{margin-right:40px}.mb-40{margin-bottom:40px}.ml-40{margin-left:40px}.m-48{margin:48px}.mt-48{margin-top:48px}.mr-48{margin-right:48px}.mb-48{margin-bottom:48px}.ml-48{margin-left:48px}.m-56{margin:56px}.mt-56{margin-top:56px}.mr-56{margin-right:56px}.mb-56{margin-bottom:56px}.ml-56{margin-left:56px}.m-64{margin:64px}.mt-64{margin-top:64px}.mr-64{margin-right:64px}.mb-64{margin-bottom:64px}.ml-64{margin-left:64px}.p-0{padding:0}.pt-0{padding-top:0}.pr-0{padding-right:0}.pb-0{padding-bottom:0}.pl-0{padding-left:0}.p-8{padding:8px}.pt-8{padding-top:8px}.pr-8{padding-right:8px}.pb-8{padding-bottom:8px}.pl-8{padding-left:8px}.p-16{padding:16px}.pt-16{padding-top:16px}.pr-16{padding-right:16px}.pb-16{padding-bottom:16px}.pl-16{padding-left:16px}.p-24{padding:24px}.pt-24{padding-top:24px}.pr-24{padding-right:24px}.pb-24{padding-bottom:24px}.pl-24{padding-left:24px}.p-32{padding:32px}.pt-32{padding-top:32px}.pr-32{padding-right:32px}.pb-32{padding-bottom:32px}.pl-32{padding-left:32px}.p-40{padding:40px}.pt-40{padding-top:40px}.pr-40{padding-right:40px}.pb-40{padding-bottom:40px}.pl-40{padding-left:40px}.p-48{padding:48px}.pt-48{padding-top:48px}.pr-48{padding-right:48px}.pb-48{padding-bottom:48px}.pl-48{padding-left:48px}.p-56{padding:56px}.pt-56{padding-top:56px}.pr-56{padding-right:56px}.pb-56{padding-bottom:56px}.pl-56{padding-left:56px}.p-64{padding:64px}.pt-64{padding-top:64px}.pr-64{padding-right:64px}.pb-64{padding-bottom:64px}.pl-64{padding-left:64px}.sr .has-animations .is-revealing{visibility:hidden}.has-animations .anime-element{visibility:hidden}.anime-ready .has-animations .anime-element{visibility:visible}.input,.textarea{background-color:#fff;border-width:1px;border-style:solid;border-color:#242830;border-radius:2px;color:#8A94A7;max-width:100%;width:100%}.input::-moz-placeholder, .textarea::-moz-placeholder{color:#3B404C}.input::placeholder,.textarea::placeholder{color:#3B404C}.input::-ms-input-placeholder,.textarea::-ms-input-placeholder{color:#3B404C}.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:#3B404C}.input:hover,.textarea:hover{border-color:#191c21}.input:active,.input:focus,.textarea:active,.textarea:focus{outline:none;border-color:#242830}.input[disabled],.textarea[disabled]{cursor:not-allowed;background-color:#1D2026;border-color:#1D2026}.input{-moz-appearance:none;-webkit-appearance:none;font-size:16px;letter-spacing:-0.1px;line-height:20px;padding:13px 16px;height:48px;box-shadow:none}.input .inline-input{display:inline;width:auto}.textarea{display:block;min-width:100%;resize:vertical}.textarea .inline-textarea{display:inline;width:auto}.field-grouped>.control:not(:last-child){margin-bottom:8px}@media (min-width: 641px){.field-grouped{display:flex}.field-grouped>.control{flex-shrink:0}.field-grouped>.control.control-expanded{flex-grow:1;flex-shrink:1}.field-grouped>.control:not(:last-child){margin-bottom:0;margin-right:8px}}.button{display:inline-flex;font-size:14px;letter-spacing:0px;font-weight:600;line-height:16px;text-decoration:none !important;text-transform:uppercase;background-color:#242830;color:#fff !important;border:none;border-radius:2px;cursor:pointer;justify-content:center;padding:16px 32px;height:48px;text-align:center;white-space:nowrap}.button:hover{background:#262a33}.button:active{outline:0}.button::before{border-radius:2px}.button-sm{padding:8px 24px;height:32px}.button-primary{background:#097dea;background:linear-gradient(65deg, #0270D7 0, #0F8AFD 100%)}.button-primary:hover{background:#0982f4;background:linear-gradient(65deg, #0275e1 0, #198ffd 100%)}.button-block{display:flex}.button-block{display:flex;width:100%}@media (max-width: 640px){.button-wide-mobile{width:100%;max-width:280px}}.site-header{padding:24px 0}.site-header-inner{position:relative;display:flex;justify-content:space-between;align-items:center}.header-links{display:inline-flex}.header-links li{display:inline-flex}.header-links a:not(.button){font-size:16px;line-height:24px;letter-spacing:-0.1px;font-weight:600;color:#8A94A7;text-transform:uppercase;text-decoration:none;line-height:16px;padding:8px 24px}@media (min-width: 641px){.site-header{position:relative}.site-header::before{content:'';position:absolute;top:0;left:0;width:100%;height:700px;background:#242830;background:linear-gradient(80deg, rgba(36,40,48,0.5) 0%, rgba(36,40,48,0) 100%);transform-origin:0;transform:skewY(-12deg)}}.hero{text-align:center;padding-top:48px;padding-bottom:88px}.hero-copy{position:relative;z-index:1}.hero-cta{margin-bottom:40px}.hero-figure{position:relative}.hero-figure svg{width:100%;height:auto}.hero-figure::before,.hero-figure::after{content:'';position:absolute;background-repeat:no-repeat;background-size:100%}.has-animations .hero-figure::before,.has-animations .hero-figure::after{opacity:0;transition:opacity 2s ease}.anime-ready .has-animations .hero-figure::before,.anime-ready .has-animations .hero-figure::after{opacity:1}.hero-figure::before{top:-57.8%;left:-1.3%;width:152.84%;height:178.78%;background-image:url("../images/hero-back-illustration.svg")}.hero-figure::after{top:-35.6%;left:99.6%;width:57.2%;height:87.88%;background-image:url("../images/hero-top-illustration.svg")}.hero-figure-box{position:absolute;top:0;will-change:transform}.hero-figure-box-01,.hero-figure-box-02,.hero-figure-box-03,.hero-figure-box-04,.hero-figure-box-08,.hero-figure-box-09{overflow:hidden}.hero-figure-box-01::before,.hero-figure-box-02::before,.hero-figure-box-03::before,.hero-figure-box-04::before,.hero-figure-box-08::before,.hero-figure-box-09::before{content:'';position:absolute;top:0;bottom:0;left:0;right:0;transform-origin:100% 100%}.hero-figure-box-01{left:103.2%;top:41.9%;width:28.03%;height:37.37%;background:linear-gradient(to left top, #00BFFB, rgba(0,191,251,0));transform:rotateZ(45deg)}.hero-figure-box-01::before{background:linear-gradient(to left, #15181D 0%, rgba(21,24,29,0) 60%);transform:rotateZ(45deg) scale(1.5)}.hero-figure-box-02{left:61.3%;top:64.1%;width:37.87%;height:50.50%;background:linear-gradient(to left top, #0270D7, rgba(2,112,215,0));transform:rotateZ(-45deg)}.hero-figure-box-02::before{background:linear-gradient(to top, #15181D 0%, rgba(21,24,29,0) 60%);transform:rotateZ(-45deg) scale(1.5)}.hero-figure-box-03{left:87.7%;top:-56.8%;width:56.81%;height:75.75%;background:linear-gradient(to left top, #00BFFB, rgba(0,191,251,0))}.hero-figure-box-03::before{background:linear-gradient(to left, #15181D 0%, rgba(21,24,29,0) 60%);transform:rotateZ(45deg) scale(1.5)}.hero-figure-box-04{left:54.9%;top:-8%;width:45.45%;height:60.60%;background:linear-gradient(to left top, #0270D7, rgba(2,112,215,0));transform:rotateZ(-135deg)}.hero-figure-box-04::before{background:linear-gradient(to top, rgba(255,255,255,0.24) 0%, rgba(255,255,255,0) 60%);transform:rotateZ(-45deg) scale(1.5)}.hero-figure-box-05,.hero-figure-box-06,.hero-figure-box-07{background-color:#242830;box-shadow:-20px 32px 64px rgba(0,0,0,0.25)}.hero-figure-box-05{left:17.4%;top:13.3%;width:64%;height:73.7%;transform:perspective(500px) rotateY(-15deg) rotateX(8deg) rotateZ(-1deg)}.hero-figure-box-06{left:65.5%;top:6.3%;width:30.3%;height:40.4%;transform:rotateZ(20deg)}.hero-figure-box-07{left:1.9%;top:42.4%;width:12.12%;height:16.16%;transform:rotateZ(20deg)}.hero-figure-box-08{left:27.1%;top:81.6%;width:19.51%;height:26.01%;background:#0270D7;transform:rotateZ(-22deg)}.hero-figure-box-08::before{background:linear-gradient(to left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.48) 100%);transform:rotateZ(45deg) scale(1.5)}.hero-figure-box-09{left:42.6%;top:-17.9%;width:6.63%;height:8.83%;background:#00BFFB;transform:rotateZ(-52deg)}.hero-figure-box-09::before{background:linear-gradient(to left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.64) 100%);transform:rotateZ(45deg) scale(1.5)}.hero-figure-box-10{left:-3.8%;top:4.3%;width:3.03%;height:4.04%;background:rgba(0,191,251,0.32);transform:rotateZ(-50deg)}@media (max-width: 640px){.hero-cta{max-width:280px;margin-left:auto;margin-right:auto}.hero-cta .button{display:flex}.hero-cta .button+.button{margin-top:16px}.hero-figure::after,.hero-figure-box-03,.hero-figure-box-04,.hero-figure-box-09{display:none}}@media (min-width: 641px){.hero{text-align:left;padding-top:64px;padding-bottom:88px}.hero-inner{display:flex;justify-content:space-between;align-items:center}.hero-copy{padding-right:64px;min-width:552px;width:552px}.hero-cta{margin:0}.hero-cta .button{min-width:170px}.hero-cta .button:first-child{margin-right:16px}.hero-figure svg{width:auto}}.features-wrap{display:flex;flex-wrap:wrap;justify-content:space-evenly;margin-right:-32px;margin-left:-32px}.features-wrap:first-of-type{margin-top:-16px}.features-wrap:last-of-type{margin-bottom:-16px}.feature{padding:16px 32px;width:380px;max-width:380px;flex-grow:1}.feature-inner{height:100%}.feature-icon{display:flex;justify-content:center}@media (min-width: 641px){.features-wrap:first-of-type{margin-top:-24px}.features-wrap:last-of-type{margin-bottom:-24px}.feature{padding:32px 32px}}.pricing-header{margin-bottom:48px}.pricing-tables-wrap{display:flex;flex-wrap:wrap;justify-content:center;margin-right:-12px;margin-left:-12px}.pricing-tables-wrap:first-child{margin-top:-12px}.pricing-tables-wrap:last-child{margin-bottom:-12px}.pricing-table{position:relative;padding:12px;width:368px;max-width:368px;flex-grow:1}.pricing-table::before{content:'';position:absolute;left:50%;width:200%;max-width:200%;height:435px;background-repeat:no-repeat;background-position:center;background-size:100%;bottom:18.8%;transform:translateX(-50%);background-image:url("../images/pricing-illustration.svg")}.pricing-table-header,.pricing-table-features-title,.pricing-table-features li{border-bottom:1px solid rgba(138,148,167,0.24)}.pricing-table-inner{position:relative;display:flex;flex-wrap:wrap;background:#2C3039;padding:24px;height:100%}.pricing-table-inner>*{position:relative;width:100%}.pricing-table-inner::before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:0 24px 48px rgba(21,24,29,0.24);mix-blend-mode:multiply}.pricing-table-price-currency{color:#8A94A7}.pricing-table-features-title{color:#fff;font-weight:700}.pricing-table-features li{display:flex;align-items:center;padding:14px 0}.pricing-table-features li::before{content:'';width:16px;height:12px;margin-right:16px;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUuNiA2LjRMMS42IDQgMCA1LjYgNS42IDEyIDE2IDEuNiAxNC40IDB6IiBmaWxsPSIjMDJDQkIxIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=);background-repeat:no-repeat}.pricing-table-cta{align-self:flex-end}@media (min-width: 641px){.pricing .section-paragraph{padding-left:90px;padding-right:90px}.pricing-header{margin-bottom:52px}}.cta{text-align:center}.cta .section-inner{padding:48px 16px}.cta .section-title{margin-bottom:40px}.cta-inner{position:relative;background:#15181D;overflow:hidden}.cta-inner::before{content:'';position:absolute;right:98px;top:-117px;width:160px;height:187px;background-image:url("../images/cta-illustration.svg");background-repeat:no-repeat}.cta-inner>*{position:relative}@media (min-width: 641px){.cta{text-align:left}.cta .section-inner{padding:64px 32px}.cta .section-title{margin-bottom:0;padding-right:24px}.cta-inner{display:flex;align-items:center;justify-content:space-between}}.is-boxed{background:#242830}.body-wrap{background:#1D2026;overflow:hidden;display:flex;flex-direction:column;min-height:100vh}.boxed-container{max-width:1440px;margin:0 auto;box-shadow:0 24px 48px rgba(21,24,29,0.24);mix-blend-mode:multiply;mix-blend-mode:normal}main{flex:1 0 auto}.section-inner{position:relative;padding-top:48px;padding-bottom:48px}@media (min-width: 641px){.section-inner{padding-top:88px;padding-bottom:88px}}.site-footer{font-size:14px;line-height:22px;letter-spacing:0px}.site-footer a{color:#8A94A7;text-decoration:none}.site-footer a:hover,.site-footer a:active{text-decoration:underline}.site-footer-inner{position:relative;display:flex;flex-wrap:wrap;padding-top:48px;padding-bottom:48px}.footer-brand,.footer-links,.footer-social-links,.footer-copyright{flex:none;width:100%;display:inline-flex;justify-content:center}.footer-brand,.footer-links,.footer-social-links{margin-bottom:24px}.footer-social-links li{display:inline-flex}.footer-social-links li+li{margin-left:16px}.footer-social-links li a{padding:8px}.footer-links li+li{margin-left:24px}@media (min-width: 641px){.site-footer{margin-top:20px}.site-footer-inner{justify-content:space-between;padding-top:64px;padding-bottom:64px}.footer-brand,.footer-links,.footer-social-links,.footer-copyright{flex:50%}.footer-brand,.footer-copyright{justify-content:flex-start}.footer-links,.footer-social-links{justify-content:flex-end}.footer-links{order:1;margin-bottom:0}} + +/*# sourceMappingURL=data:application/json;base64,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QWdCLENBQUMsa0JBQWtCLENBQUMsZUFBZSxhQUFhLENBQUMsb0JBQW9CLENBQUMsMkNBQTJDLHlCQUF5QixDQUFDLG1CQUFtQixpQkFBaUIsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLG1FQUFtRSxTQUFTLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixDQUFDLGlEQUFpRCxrQkFBa0IsQ0FBQyx3QkFBd0IsbUJBQW1CLENBQUMsMkJBQTJCLGdCQUFnQixDQUFDLDBCQUEwQixXQUFXLENBQUMsb0JBQW9CLGdCQUFnQixDQUFDLDBCQUEwQixhQUFhLGVBQWUsQ0FBQyxtQkFBbUIsNkJBQTZCLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsbUVBQW1FLFFBQVEsQ0FBQyxnQ0FBZ0MsMEJBQTBCLENBQUMsbUNBQW1DLHdCQUF3QixDQUFDLGNBQWMsT0FBTyxDQUFDLGVBQWUsQ0FBQyIsImZpbGUiOiJzdHlsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJodG1se2xpbmUtaGVpZ2h0OjEuMTU7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJX1ib2R5e21hcmdpbjowfWFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixuYXYsc2VjdGlvbntkaXNwbGF5OmJsb2NrfWgxe2ZvbnQtc2l6ZToyZW07bWFyZ2luOjAuNjdlbSAwfWZpZ2NhcHRpb24sZmlndXJlLG1haW57ZGlzcGxheTpibG9ja31maWd1cmV7bWFyZ2luOjFlbSA0MHB4fWhye2JveC1zaXppbmc6Y29udGVudC1ib3g7aGVpZ2h0OjA7b3ZlcmZsb3c6dmlzaWJsZX1wcmV7Zm9udC1mYW1pbHk6bW9ub3NwYWNlLCBtb25vc3BhY2U7Zm9udC1zaXplOjFlbX1he2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC10ZXh0LWRlY29yYXRpb24tc2tpcDpvYmplY3RzfWFiYnJbdGl0bGVde2JvcmRlci1ib3R0b206bm9uZTt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmUgZG90dGVkfWIsc3Ryb25ne2ZvbnQtd2VpZ2h0OmluaGVyaXR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWNvZGUsa2JkLHNhbXB7Zm9udC1mYW1pbHk6bW9ub3NwYWNlLCBtb25vc3BhY2U7Zm9udC1zaXplOjFlbX1kZm57Zm9udC1zdHlsZTppdGFsaWN9bWFya3tiYWNrZ3JvdW5kLWNvbG9yOiNmZjA7Y29sb3I6IzAwMH1zbWFsbHtmb250LXNpemU6ODAlfXN1YixzdXB7Zm9udC1zaXplOjc1JTtsaW5lLWhlaWdodDowO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfXN1Yntib3R0b206LTAuMjVlbX1zdXB7dG9wOi0wLjVlbX1hdWRpbyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9ja31hdWRpbzpub3QoW2NvbnRyb2xzXSl7ZGlzcGxheTpub25lO2hlaWdodDowfWltZ3tib3JkZXItc3R5bGU6bm9uZX1zdmc6bm90KDpyb290KXtvdmVyZmxvdzpoaWRkZW59YnV0dG9uLGlucHV0LG9wdGdyb3VwLHNlbGVjdCx0ZXh0YXJlYXtmb250LWZhbWlseTpzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMDAlO2xpbmUtaGVpZ2h0OjEuMTU7bWFyZ2luOjB9YnV0dG9uLGlucHV0e292ZXJmbG93OnZpc2libGV9YnV0dG9uLHNlbGVjdHt0ZXh0LXRyYW5zZm9ybTpub25lfWJ1dHRvbixodG1sIFt0eXBlPVwiYnV0dG9uXCJdLFt0eXBlPVwicmVzZXRcIl0sW3R5cGU9XCJzdWJtaXRcIl17LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbn1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsW3R5cGU9XCJidXR0b25cIl06Oi1tb3otZm9jdXMtaW5uZXIsW3R5cGU9XCJyZXNldFwiXTo6LW1vei1mb2N1cy1pbm5lcixbdHlwZT1cInN1Ym1pdFwiXTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXItc3R5bGU6bm9uZTtwYWRkaW5nOjB9YnV0dG9uOi1tb3otZm9jdXNyaW5nLFt0eXBlPVwiYnV0dG9uXCJdOi1tb3otZm9jdXNyaW5nLFt0eXBlPVwicmVzZXRcIl06LW1vei1mb2N1c3JpbmcsW3R5cGU9XCJzdWJtaXRcIl06LW1vei1mb2N1c3Jpbmd7b3V0bGluZToxcHggZG90dGVkIEJ1dHRvblRleHR9ZmllbGRzZXR7cGFkZGluZzowLjM1ZW0gMC43NWVtIDAuNjI1ZW19bGVnZW5ke2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb2xvcjppbmhlcml0O2Rpc3BsYXk6dGFibGU7bWF4LXdpZHRoOjEwMCU7cGFkZGluZzowO3doaXRlLXNwYWNlOm5vcm1hbH1wcm9ncmVzc3tkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX10ZXh0YXJlYXtvdmVyZmxvdzphdXRvfVt0eXBlPVwiY2hlY2tib3hcIl0sW3R5cGU9XCJyYWRpb1wiXXtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzowfVt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfVt0eXBlPVwic2VhcmNoXCJdey13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7b3V0bGluZS1vZmZzZXQ6LTJweH1bdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbixbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX06Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b247Zm9udDppbmhlcml0fWRldGFpbHMsbWVudXtkaXNwbGF5OmJsb2NrfXN1bW1hcnl7ZGlzcGxheTpsaXN0LWl0ZW19Y2FudmFze2Rpc3BsYXk6aW5saW5lLWJsb2NrfXRlbXBsYXRle2Rpc3BsYXk6bm9uZX1baGlkZGVuXXtkaXNwbGF5Om5vbmV9aHRtbHtib3gtc2l6aW5nOmJvcmRlci1ib3h9KiwqOmJlZm9yZSwqOmFmdGVye2JveC1zaXppbmc6aW5oZXJpdH1ib2R5e2JhY2tncm91bmQ6IzFEMjAyNjstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGU7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZH1ocntib3JkZXI6MDtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojMjQyODMwO21hcmdpbi10b3A6MjRweDttYXJnaW4tYm90dG9tOjI0cHh9dWwsb2x7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MjRweDtwYWRkaW5nLWxlZnQ6MjRweH11bHtsaXN0LXN0eWxlOmRpc2N9b2x7bGlzdC1zdHlsZTpkZWNpbWFsfWxpPnVsLGxpPm9se21hcmdpbi1ib3R0b206MH1kbHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToyNHB4fWR0e2ZvbnQtd2VpZ2h0OjYwMH1kZHttYXJnaW4tbGVmdDoyNHB4O21hcmdpbi1ib3R0b206MjRweH1pbWd7aGVpZ2h0OmF1dG87bWF4LXdpZHRoOjEwMCU7dmVydGljYWwtYWxpZ246bWlkZGxlfWZpZ3VyZXttYXJnaW46MjRweCAwfWZpZ2NhcHRpb257Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MjRweDtwYWRkaW5nOjhweCAwfWltZyxzdmd7ZGlzcGxheTpibG9ja310YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7bWFyZ2luLWJvdHRvbToyNHB4O3dpZHRoOjEwMCV9dHJ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzI0MjgzMH10aHt0ZXh0LWFsaWduOmxlZnR9dGgsdGR7cGFkZGluZzoxMHB4IDE2cHh9dGg6Zmlyc3QtY2hpbGQsdGQ6Zmlyc3QtY2hpbGR7cGFkZGluZy1sZWZ0OjB9dGg6bGFzdC1jaGlsZCx0ZDpsYXN0LWNoaWxke3BhZGRpbmctcmlnaHQ6MH1odG1se2ZvbnQtc2l6ZToyMHB4O2xpbmUtaGVpZ2h0OjMwcHh9Ym9keXtjb2xvcjojOEE5NEE3O2ZvbnQtc2l6ZToxcmVtfWJvZHksYnV0dG9uLGlucHV0LHNlbGVjdCx0ZXh0YXJlYXtmb250LWZhbWlseTpcIklCTSBQbGV4IFNhbnNcIiwgc2Fucy1zZXJpZn1he2NvbG9yOiM4QTk0QTc7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1hOmhvdmVyLGE6YWN0aXZle291dGxpbmU6MDt0ZXh0LWRlY29yYXRpb246bm9uZX1oMSxoMixoMyxoNCxoNSxoNiwuaDEsLmgyLC5oMywuaDQsLmg1LC5oNntjbGVhcjpib3RoO2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6NjAwfWgxLC5oMXtmb250LXNpemU6MzhweDtsaW5lLWhlaWdodDo0OHB4O2xldHRlci1zcGFjaW5nOjBweH1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpe2gxLC5oMXtmb250LXNpemU6NDRweDtsaW5lLWhlaWdodDo1NHB4O2xldHRlci1zcGFjaW5nOjBweH19aDIsLmgye2ZvbnQtc2l6ZTozMnB4O2xpbmUtaGVpZ2h0OjQycHg7bGV0dGVyLXNwYWNpbmc6MHB4fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7aDIsLmgye2ZvbnQtc2l6ZTozOHB4O2xpbmUtaGVpZ2h0OjQ4cHg7bGV0dGVyLXNwYWNpbmc6MHB4fX1oMywuaDMsYmxvY2txdW90ZXtmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDozNHB4O2xldHRlci1zcGFjaW5nOjBweH1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpe2gzLC5oMyxibG9ja3F1b3Rle2ZvbnQtc2l6ZTozMnB4O2xpbmUtaGVpZ2h0OjQycHg7bGV0dGVyLXNwYWNpbmc6MHB4fX1oNCxoNSxoNiwuaDQsLmg1LC5oNntmb250LXNpemU6MjBweDtsaW5lLWhlaWdodDozMHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpe2g0LGg1LGg2LC5oNCwuaDUsLmg2e2ZvbnQtc2l6ZToyNHB4O2xpbmUtaGVpZ2h0OjM0cHg7bGV0dGVyLXNwYWNpbmc6MHB4fX1AbWVkaWEgKG1heC13aWR0aDogNjQwcHgpey5oMS1tb2JpbGV7Zm9udC1zaXplOjM4cHg7bGluZS1oZWlnaHQ6NDhweDtsZXR0ZXItc3BhY2luZzowcHh9LmgyLW1vYmlsZXtmb250LXNpemU6MzJweDtsaW5lLWhlaWdodDo0MnB4O2xldHRlci1zcGFjaW5nOjBweH0uaDMtbW9iaWxle2ZvbnQtc2l6ZToyNHB4O2xpbmUtaGVpZ2h0OjM0cHg7bGV0dGVyLXNwYWNpbmc6MHB4fS5oNC1tb2JpbGUsLmg1LW1vYmlsZSwuaDYtbW9iaWxle2ZvbnQtc2l6ZToyMHB4O2xpbmUtaGVpZ2h0OjMwcHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fX0udGV4dC1saWdodCBoMSwudGV4dC1saWdodCBoMiwudGV4dC1saWdodCBoMywudGV4dC1saWdodCBoNCwudGV4dC1saWdodCBoNSwudGV4dC1saWdodCBoNiwudGV4dC1saWdodCAuaDEsLnRleHQtbGlnaHQgLmgyLC50ZXh0LWxpZ2h0IC5oMywudGV4dC1saWdodCAuaDQsLnRleHQtbGlnaHQgLmg1LC50ZXh0LWxpZ2h0IC5oNntjb2xvcjohaW1wb3J0YW50fS50ZXh0LXNte2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjI4cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fS50ZXh0LXhze2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjI0cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fWgxLGgyLC5oMSwuaDJ7bWFyZ2luLXRvcDo0OHB4O21hcmdpbi1ib3R0b206MTZweH1oMywuaDN7bWFyZ2luLXRvcDozNnB4O21hcmdpbi1ib3R0b206MTJweH1oNCxoNSxoNiwuaDQsLmg1LC5oNnttYXJnaW4tdG9wOjI0cHg7bWFyZ2luLWJvdHRvbTo0cHh9cHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToyNHB4fWRmbixjaXRlLGVtLGl7Zm9udC1zdHlsZTppdGFsaWN9YmxvY2txdW90ZXtjb2xvcjojM0I0MDRDO2ZvbnQtc3R5bGU6aXRhbGljO21hcmdpbi10b3A6MjRweDttYXJnaW4tYm90dG9tOjI0cHg7bWFyZ2luLWxlZnQ6MjRweH1ibG9ja3F1b3RlOjpiZWZvcmV7Y29udGVudDpcIlxcMjAxQ1wifWJsb2NrcXVvdGU6OmFmdGVye2NvbnRlbnQ6XCJcXDIwMURcIn1ibG9ja3F1b3RlIHB7ZGlzcGxheTppbmxpbmV9YWRkcmVzc3tjb2xvcjojOEE5NEE3O2JvcmRlci13aWR0aDoxcHggMDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOiMyNDI4MzA7cGFkZGluZzoyNHB4IDA7bWFyZ2luOjAgMCAyNHB4fXByZSxwcmUgaDEscHJlIGgyLHByZSBoMyxwcmUgaDQscHJlIGg1LHByZSBoNixwcmUgLmgxLHByZSAuaDIscHJlIC5oMyxwcmUgLmg0LHByZSAuaDUscHJlIC5oNntmb250LWZhbWlseTpcIkNvdXJpZXIgMTAgUGl0Y2hcIiwgQ291cmllciwgbW9ub3NwYWNlfXByZSxjb2RlLGtiZCx0dCx2YXJ7YmFja2dyb3VuZDojMUQyMDI2fXByZXtmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyNHB4O21hcmdpbi1ib3R0b206MS42ZW07bWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3c6YXV0bztwYWRkaW5nOjI0cHg7bWFyZ2luLXRvcDoyNHB4O21hcmdpbi1ib3R0b206MjRweH1jb2RlLGtiZCx0dCx2YXJ7Zm9udC1mYW1pbHk6TW9uYWNvLCBDb25zb2xhcywgXCJBbmRhbGUgTW9ub1wiLCBcIkRlamFWdSBTYW5zIE1vbm9cIiwgbW9ub3NwYWNlO2ZvbnQtc2l6ZToxNnB4O3BhZGRpbmc6MnB4IDRweH1hYmJyLGFjcm9ueW17Y3Vyc29yOmhlbHB9bWFyayxpbnN7dGV4dC1kZWNvcmF0aW9uOm5vbmV9c21hbGx7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MjhweDtsZXR0ZXItc3BhY2luZzotMC4xcHh9YixzdHJvbmd7Zm9udC13ZWlnaHQ6NjAwfWJ1dHRvbixpbnB1dCxzZWxlY3QsdGV4dGFyZWEsbGFiZWx7Zm9udC1zaXplOjIwcHg7bGluZS1oZWlnaHQ6MzBweH0uY29udGFpbmVyLC5jb250YWluZXItc217d2lkdGg6MTAwJTttYXJnaW46MCBhdXRvO3BhZGRpbmctbGVmdDoxNnB4O3BhZGRpbmctcmlnaHQ6MTZweH1AbWVkaWEgKG1pbi13aWR0aDogNDgxcHgpey5jb250YWluZXIsLmNvbnRhaW5lci1zbXtwYWRkaW5nLWxlZnQ6MjRweDtwYWRkaW5nLXJpZ2h0OjI0cHh9fS5jb250YWluZXJ7bWF4LXdpZHRoOjExMjhweH0uY29udGFpbmVyLXNte21heC13aWR0aDo4NDhweH0uY29udGFpbmVyIC5jb250YWluZXItc217bWF4LXdpZHRoOjgwMHB4O3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MH0uc2NyZWVuLXJlYWRlci10ZXh0e2NsaXA6cmVjdCgxcHgsIDFweCwgMXB4LCAxcHgpO3Bvc2l0aW9uOmFic29sdXRlICFpbXBvcnRhbnQ7aGVpZ2h0OjFweDt3aWR0aDoxcHg7b3ZlcmZsb3c6aGlkZGVuO3dvcmQtd3JhcDpub3JtYWwgIWltcG9ydGFudH0uc2NyZWVuLXJlYWRlci10ZXh0OmZvY3Vze2JvcmRlci1yYWRpdXM6MnB4O2JveC1zaGFkb3c6MCAwIDJweCAycHggcmdiYSgwLDAsMCwwLjYpO2NsaXA6YXV0byAhaW1wb3J0YW50O2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjE0cHg7bGV0dGVyLXNwYWNpbmc6MHB4O2ZvbnQtd2VpZ2h0OjYwMDtsaW5lLWhlaWdodDoxNnB4O3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtiYWNrZ3JvdW5kLWNvbG9yOiMxRDIwMjY7Y29sb3I6IzAyNzBENyAhaW1wb3J0YW50O2JvcmRlcjpub25lO2hlaWdodDphdXRvO2xlZnQ6OHB4O3BhZGRpbmc6MTZweCAzMnB4O3RvcDo4cHg7d2lkdGg6YXV0bzt6LWluZGV4OjEwMDAwMH0ubGlzdC1yZXNldHtsaXN0LXN0eWxlOm5vbmU7cGFkZGluZzowfS50ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0udGV4dC1yaWdodHt0ZXh0LWFsaWduOnJpZ2h0fS50ZXh0LXByaW1hcnl7Y29sb3I6IzAyNzBEN30uaGFzLXRvcC1kaXZpZGVye3Bvc2l0aW9uOnJlbGF0aXZlfS5oYXMtdG9wLWRpdmlkZXI6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiMyNDI4MzB9Lmhhcy1ib3R0b20tZGl2aWRlcntwb3NpdGlvbjpyZWxhdGl2ZX0uaGFzLWJvdHRvbS1kaXZpZGVyOjphZnRlcntjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO2xlZnQ6MDt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiMyNDI4MzB9Lm0tMHttYXJnaW46MH0ubXQtMHttYXJnaW4tdG9wOjB9Lm1yLTB7bWFyZ2luLXJpZ2h0OjB9Lm1iLTB7bWFyZ2luLWJvdHRvbTowfS5tbC0we21hcmdpbi1sZWZ0OjB9Lm0tOHttYXJnaW46OHB4fS5tdC04e21hcmdpbi10b3A6OHB4fS5tci04e21hcmdpbi1yaWdodDo4cHh9Lm1iLTh7bWFyZ2luLWJvdHRvbTo4cHh9Lm1sLTh7bWFyZ2luLWxlZnQ6OHB4fS5tLTE2e21hcmdpbjoxNnB4fS5tdC0xNnttYXJnaW4tdG9wOjE2cHh9Lm1yLTE2e21hcmdpbi1yaWdodDoxNnB4fS5tYi0xNnttYXJnaW4tYm90dG9tOjE2cHh9Lm1sLTE2e21hcmdpbi1sZWZ0OjE2cHh9Lm0tMjR7bWFyZ2luOjI0cHh9Lm10LTI0e21hcmdpbi10b3A6MjRweH0ubXItMjR7bWFyZ2luLXJpZ2h0OjI0cHh9Lm1iLTI0e21hcmdpbi1ib3R0b206MjRweH0ubWwtMjR7bWFyZ2luLWxlZnQ6MjRweH0ubS0zMnttYXJnaW46MzJweH0ubXQtMzJ7bWFyZ2luLXRvcDozMnB4fS5tci0zMnttYXJnaW4tcmlnaHQ6MzJweH0ubWItMzJ7bWFyZ2luLWJvdHRvbTozMnB4fS5tbC0zMnttYXJnaW4tbGVmdDozMnB4fS5tLTQwe21hcmdpbjo0MHB4fS5tdC00MHttYXJnaW4tdG9wOjQwcHh9Lm1yLTQwe21hcmdpbi1yaWdodDo0MHB4fS5tYi00MHttYXJnaW4tYm90dG9tOjQwcHh9Lm1sLTQwe21hcmdpbi1sZWZ0OjQwcHh9Lm0tNDh7bWFyZ2luOjQ4cHh9Lm10LTQ4e21hcmdpbi10b3A6NDhweH0ubXItNDh7bWFyZ2luLXJpZ2h0OjQ4cHh9Lm1iLTQ4e21hcmdpbi1ib3R0b206NDhweH0ubWwtNDh7bWFyZ2luLWxlZnQ6NDhweH0ubS01NnttYXJnaW46NTZweH0ubXQtNTZ7bWFyZ2luLXRvcDo1NnB4fS5tci01NnttYXJnaW4tcmlnaHQ6NTZweH0ubWItNTZ7bWFyZ2luLWJvdHRvbTo1NnB4fS5tbC01NnttYXJnaW4tbGVmdDo1NnB4fS5tLTY0e21hcmdpbjo2NHB4fS5tdC02NHttYXJnaW4tdG9wOjY0cHh9Lm1yLTY0e21hcmdpbi1yaWdodDo2NHB4fS5tYi02NHttYXJnaW4tYm90dG9tOjY0cHh9Lm1sLTY0e21hcmdpbi1sZWZ0OjY0cHh9LnAtMHtwYWRkaW5nOjB9LnB0LTB7cGFkZGluZy10b3A6MH0ucHItMHtwYWRkaW5nLXJpZ2h0OjB9LnBiLTB7cGFkZGluZy1ib3R0b206MH0ucGwtMHtwYWRkaW5nLWxlZnQ6MH0ucC04e3BhZGRpbmc6OHB4fS5wdC04e3BhZGRpbmctdG9wOjhweH0ucHItOHtwYWRkaW5nLXJpZ2h0OjhweH0ucGItOHtwYWRkaW5nLWJvdHRvbTo4cHh9LnBsLTh7cGFkZGluZy1sZWZ0OjhweH0ucC0xNntwYWRkaW5nOjE2cHh9LnB0LTE2e3BhZGRpbmctdG9wOjE2cHh9LnByLTE2e3BhZGRpbmctcmlnaHQ6MTZweH0ucGItMTZ7cGFkZGluZy1ib3R0b206MTZweH0ucGwtMTZ7cGFkZGluZy1sZWZ0OjE2cHh9LnAtMjR7cGFkZGluZzoyNHB4fS5wdC0yNHtwYWRkaW5nLXRvcDoyNHB4fS5wci0yNHtwYWRkaW5nLXJpZ2h0OjI0cHh9LnBiLTI0e3BhZGRpbmctYm90dG9tOjI0cHh9LnBsLTI0e3BhZGRpbmctbGVmdDoyNHB4fS5wLTMye3BhZGRpbmc6MzJweH0ucHQtMzJ7cGFkZGluZy10b3A6MzJweH0ucHItMzJ7cGFkZGluZy1yaWdodDozMnB4fS5wYi0zMntwYWRkaW5nLWJvdHRvbTozMnB4fS5wbC0zMntwYWRkaW5nLWxlZnQ6MzJweH0ucC00MHtwYWRkaW5nOjQwcHh9LnB0LTQwe3BhZGRpbmctdG9wOjQwcHh9LnByLTQwe3BhZGRpbmctcmlnaHQ6NDBweH0ucGItNDB7cGFkZGluZy1ib3R0b206NDBweH0ucGwtNDB7cGFkZGluZy1sZWZ0OjQwcHh9LnAtNDh7cGFkZGluZzo0OHB4fS5wdC00OHtwYWRkaW5nLXRvcDo0OHB4fS5wci00OHtwYWRkaW5nLXJpZ2h0OjQ4cHh9LnBiLTQ4e3BhZGRpbmctYm90dG9tOjQ4cHh9LnBsLTQ4e3BhZGRpbmctbGVmdDo0OHB4fS5wLTU2e3BhZGRpbmc6NTZweH0ucHQtNTZ7cGFkZGluZy10b3A6NTZweH0ucHItNTZ7cGFkZGluZy1yaWdodDo1NnB4fS5wYi01NntwYWRkaW5nLWJvdHRvbTo1NnB4fS5wbC01NntwYWRkaW5nLWxlZnQ6NTZweH0ucC02NHtwYWRkaW5nOjY0cHh9LnB0LTY0e3BhZGRpbmctdG9wOjY0cHh9LnByLTY0e3BhZGRpbmctcmlnaHQ6NjRweH0ucGItNjR7cGFkZGluZy1ib3R0b206NjRweH0ucGwtNjR7cGFkZGluZy1sZWZ0OjY0cHh9LnNyIC5oYXMtYW5pbWF0aW9ucyAuaXMtcmV2ZWFsaW5ne3Zpc2liaWxpdHk6aGlkZGVufS5oYXMtYW5pbWF0aW9ucyAuYW5pbWUtZWxlbWVudHt2aXNpYmlsaXR5OmhpZGRlbn0uYW5pbWUtcmVhZHkgLmhhcy1hbmltYXRpb25zIC5hbmltZS1lbGVtZW50e3Zpc2liaWxpdHk6dmlzaWJsZX0uaW5wdXQsLnRleHRhcmVhe2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItd2lkdGg6MXB4O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6IzI0MjgzMDtib3JkZXItcmFkaXVzOjJweDtjb2xvcjojOEE5NEE3O21heC13aWR0aDoxMDAlO3dpZHRoOjEwMCV9LmlucHV0OjpwbGFjZWhvbGRlciwudGV4dGFyZWE6OnBsYWNlaG9sZGVye2NvbG9yOiMzQjQwNEN9LmlucHV0OjotbXMtaW5wdXQtcGxhY2Vob2xkZXIsLnRleHRhcmVhOjotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6IzNCNDA0Q30uaW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyLC50ZXh0YXJlYTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6IzNCNDA0Q30uaW5wdXQ6aG92ZXIsLnRleHRhcmVhOmhvdmVye2JvcmRlci1jb2xvcjojMTkxYzIxfS5pbnB1dDphY3RpdmUsLmlucHV0OmZvY3VzLC50ZXh0YXJlYTphY3RpdmUsLnRleHRhcmVhOmZvY3Vze291dGxpbmU6bm9uZTtib3JkZXItY29sb3I6IzI0MjgzMH0uaW5wdXRbZGlzYWJsZWRdLC50ZXh0YXJlYVtkaXNhYmxlZF17Y3Vyc29yOm5vdC1hbGxvd2VkO2JhY2tncm91bmQtY29sb3I6IzFEMjAyNjtib3JkZXItY29sb3I6IzFEMjAyNn0uaW5wdXR7LW1vei1hcHBlYXJhbmNlOm5vbmU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7Zm9udC1zaXplOjE2cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4O2xpbmUtaGVpZ2h0OjIwcHg7cGFkZGluZzoxM3B4IDE2cHg7aGVpZ2h0OjQ4cHg7Ym94LXNoYWRvdzpub25lfS5pbnB1dCAuaW5saW5lLWlucHV0e2Rpc3BsYXk6aW5saW5lO3dpZHRoOmF1dG99LnRleHRhcmVhe2Rpc3BsYXk6YmxvY2s7bWluLXdpZHRoOjEwMCU7cmVzaXplOnZlcnRpY2FsfS50ZXh0YXJlYSAuaW5saW5lLXRleHRhcmVhe2Rpc3BsYXk6aW5saW5lO3dpZHRoOmF1dG99LmZpZWxkLWdyb3VwZWQ+LmNvbnRyb2w6bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOjhweH1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5maWVsZC1ncm91cGVke2Rpc3BsYXk6ZmxleH0uZmllbGQtZ3JvdXBlZD4uY29udHJvbHtmbGV4LXNocmluazowfS5maWVsZC1ncm91cGVkPi5jb250cm9sLmNvbnRyb2wtZXhwYW5kZWR7ZmxleC1ncm93OjE7ZmxleC1zaHJpbms6MX0uZmllbGQtZ3JvdXBlZD4uY29udHJvbDpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1ib3R0b206MDttYXJnaW4tcmlnaHQ6OHB4fX0uYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWZsZXg7Zm9udC1zaXplOjE0cHg7bGV0dGVyLXNwYWNpbmc6MHB4O2ZvbnQtd2VpZ2h0OjYwMDtsaW5lLWhlaWdodDoxNnB4O3RleHQtZGVjb3JhdGlvbjpub25lICFpbXBvcnRhbnQ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2JhY2tncm91bmQtY29sb3I6IzI0MjgzMDtjb2xvcjojZmZmICFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czoycHg7Y3Vyc29yOnBvaW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOjE2cHggMzJweDtoZWlnaHQ6NDhweDt0ZXh0LWFsaWduOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXB9LmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOiMyNjJhMzN9LmJ1dHRvbjphY3RpdmV7b3V0bGluZTowfS5idXR0b246OmJlZm9yZXtib3JkZXItcmFkaXVzOjJweH0uYnV0dG9uLXNte3BhZGRpbmc6OHB4IDI0cHg7aGVpZ2h0OjMycHh9LmJ1dHRvbi1wcmltYXJ5e2JhY2tncm91bmQ6IzA5N2RlYTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg2NWRlZywgIzAyNzBENyAwLCAjMEY4QUZEIDEwMCUpfS5idXR0b24tcHJpbWFyeTpob3ZlcntiYWNrZ3JvdW5kOiMwOTgyZjQ7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNjVkZWcsICMwMjc1ZTEgMCwgIzE5OGZmZCAxMDAlKX0uYnV0dG9uLWJsb2Nre2Rpc3BsYXk6ZmxleH0uYnV0dG9uLWJsb2Nre2Rpc3BsYXk6ZmxleDt3aWR0aDoxMDAlfUBtZWRpYSAobWF4LXdpZHRoOiA2NDBweCl7LmJ1dHRvbi13aWRlLW1vYmlsZXt3aWR0aDoxMDAlO21heC13aWR0aDoyODBweH19LnNpdGUtaGVhZGVye3BhZGRpbmc6MjRweCAwfS5zaXRlLWhlYWRlci1pbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyfS5oZWFkZXItbGlua3N7ZGlzcGxheTppbmxpbmUtZmxleH0uaGVhZGVyLWxpbmtzIGxpe2Rpc3BsYXk6aW5saW5lLWZsZXh9LmhlYWRlci1saW5rcyBhOm5vdCguYnV0dG9uKXtmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyNHB4O2xldHRlci1zcGFjaW5nOi0wLjFweDtmb250LXdlaWdodDo2MDA7Y29sb3I6IzhBOTRBNzt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bGluZS1oZWlnaHQ6MTZweDtwYWRkaW5nOjhweCAyNHB4fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LnNpdGUtaGVhZGVye3Bvc2l0aW9uOnJlbGF0aXZlfS5zaXRlLWhlYWRlcjo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjcwMHB4O2JhY2tncm91bmQ6IzI0MjgzMDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg4MGRlZywgcmdiYSgzNiw0MCw0OCwwLjUpIDAlLCByZ2JhKDM2LDQwLDQ4LDApIDEwMCUpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjowO3RyYW5zZm9ybS1vcmlnaW46MDstd2Via2l0LXRyYW5zZm9ybTpza2V3WSgtMTJkZWcpO3RyYW5zZm9ybTpza2V3WSgtMTJkZWcpfX0uaGVyb3t0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nLXRvcDo0OHB4O3BhZGRpbmctYm90dG9tOjg4cHh9Lmhlcm8tY29weXtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9Lmhlcm8tY3Rhe21hcmdpbi1ib3R0b206NDBweH0uaGVyby1maWd1cmV7cG9zaXRpb246cmVsYXRpdmV9Lmhlcm8tZmlndXJlIHN2Z3t3aWR0aDoxMDAlO2hlaWdodDphdXRvfS5oZXJvLWZpZ3VyZTo6YmVmb3JlLC5oZXJvLWZpZ3VyZTo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1zaXplOjEwMCV9Lmhhcy1hbmltYXRpb25zIC5oZXJvLWZpZ3VyZTo6YmVmb3JlLC5oYXMtYW5pbWF0aW9ucyAuaGVyby1maWd1cmU6OmFmdGVye29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMnMgZWFzZX0uYW5pbWUtcmVhZHkgLmhhcy1hbmltYXRpb25zIC5oZXJvLWZpZ3VyZTo6YmVmb3JlLC5hbmltZS1yZWFkeSAuaGFzLWFuaW1hdGlvbnMgLmhlcm8tZmlndXJlOjphZnRlcntvcGFjaXR5OjF9Lmhlcm8tZmlndXJlOjpiZWZvcmV7dG9wOi01Ny44JTtsZWZ0Oi0xLjMlO3dpZHRoOjE1Mi44NCU7aGVpZ2h0OjE3OC43OCU7YmFja2dyb3VuZC1pbWFnZTp1cmwoXCIuLi9pbWFnZXMvaGVyby1iYWNrLWlsbHVzdHJhdGlvbi5zdmdcIil9Lmhlcm8tZmlndXJlOjphZnRlcnt0b3A6LTM1LjYlO2xlZnQ6OTkuNiU7d2lkdGg6NTcuMiU7aGVpZ2h0Ojg3Ljg4JTtiYWNrZ3JvdW5kLWltYWdlOnVybChcIi4uL2ltYWdlcy9oZXJvLXRvcC1pbGx1c3RyYXRpb24uc3ZnXCIpfS5oZXJvLWZpZ3VyZS1ib3h7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7d2lsbC1jaGFuZ2U6dHJhbnNmb3JtfS5oZXJvLWZpZ3VyZS1ib3gtMDEsLmhlcm8tZmlndXJlLWJveC0wMiwuaGVyby1maWd1cmUtYm94LTAzLC5oZXJvLWZpZ3VyZS1ib3gtMDQsLmhlcm8tZmlndXJlLWJveC0wOCwuaGVyby1maWd1cmUtYm94LTA5e292ZXJmbG93OmhpZGRlbn0uaGVyby1maWd1cmUtYm94LTAxOjpiZWZvcmUsLmhlcm8tZmlndXJlLWJveC0wMjo6YmVmb3JlLC5oZXJvLWZpZ3VyZS1ib3gtMDM6OmJlZm9yZSwuaGVyby1maWd1cmUtYm94LTA0OjpiZWZvcmUsLmhlcm8tZmlndXJlLWJveC0wODo6YmVmb3JlLC5oZXJvLWZpZ3VyZS1ib3gtMDk6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3RyYW5zZm9ybS1vcmlnaW46MTAwJSAxMDAlfS5oZXJvLWZpZ3VyZS1ib3gtMDF7bGVmdDoxMDMuMiU7dG9wOjQxLjklO3dpZHRoOjI4LjAzJTtoZWlnaHQ6MzcuMzclO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQgdG9wLCAjMDBCRkZCLCByZ2JhKDAsMTkxLDI1MSwwKSk7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpfS5oZXJvLWZpZ3VyZS1ib3gtMDE6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCAjMTUxODFEIDAlLCByZ2JhKDIxLDI0LDI5LDApIDYwJSk7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpIHNjYWxlKDEuNSl9Lmhlcm8tZmlndXJlLWJveC0wMntsZWZ0OjYxLjMlO3RvcDo2NC4xJTt3aWR0aDozNy44NyU7aGVpZ2h0OjUwLjUwJTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0IHRvcCwgIzAyNzBENywgcmdiYSgyLDExMiwyMTUsMCkpO3RyYW5zZm9ybTpyb3RhdGVaKC00NWRlZyl9Lmhlcm8tZmlndXJlLWJveC0wMjo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHRvcCwgIzE1MTgxRCAwJSwgcmdiYSgyMSwyNCwyOSwwKSA2MCUpO3RyYW5zZm9ybTpyb3RhdGVaKC00NWRlZykgc2NhbGUoMS41KX0uaGVyby1maWd1cmUtYm94LTAze2xlZnQ6ODcuNyU7dG9wOi01Ni44JTt3aWR0aDo1Ni44MSU7aGVpZ2h0Ojc1Ljc1JTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0IHRvcCwgIzAwQkZGQiwgcmdiYSgwLDE5MSwyNTEsMCkpfS5oZXJvLWZpZ3VyZS1ib3gtMDM6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCAjMTUxODFEIDAlLCByZ2JhKDIxLDI0LDI5LDApIDYwJSk7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpIHNjYWxlKDEuNSl9Lmhlcm8tZmlndXJlLWJveC0wNHtsZWZ0OjU0LjklO3RvcDotOCU7d2lkdGg6NDUuNDUlO2hlaWdodDo2MC42MCU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCB0b3AsICMwMjcwRDcsIHJnYmEoMiwxMTIsMjE1LDApKTt0cmFuc2Zvcm06cm90YXRlWigtMTM1ZGVnKX0uaGVyby1maWd1cmUtYm94LTA0OjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gdG9wLCByZ2JhKDI1NSwyNTUsMjU1LDAuMjQpIDAlLCByZ2JhKDI1NSwyNTUsMjU1LDApIDYwJSk7dHJhbnNmb3JtOnJvdGF0ZVooLTQ1ZGVnKSBzY2FsZSgxLjUpfS5oZXJvLWZpZ3VyZS1ib3gtMDUsLmhlcm8tZmlndXJlLWJveC0wNiwuaGVyby1maWd1cmUtYm94LTA3e2JhY2tncm91bmQtY29sb3I6IzI0MjgzMDtib3gtc2hhZG93Oi0yMHB4IDMycHggNjRweCByZ2JhKDAsMCwwLDAuMjUpfS5oZXJvLWZpZ3VyZS1ib3gtMDV7bGVmdDoxNy40JTt0b3A6MTMuMyU7d2lkdGg6NjQlO2hlaWdodDo3My43JTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNTAwcHgpIHJvdGF0ZVkoLTE1ZGVnKSByb3RhdGVYKDhkZWcpIHJvdGF0ZVooLTFkZWcpfS5oZXJvLWZpZ3VyZS1ib3gtMDZ7bGVmdDo2NS41JTt0b3A6Ni4zJTt3aWR0aDozMC4zJTtoZWlnaHQ6NDAuNCU7dHJhbnNmb3JtOnJvdGF0ZVooMjBkZWcpfS5oZXJvLWZpZ3VyZS1ib3gtMDd7bGVmdDoxLjklO3RvcDo0Mi40JTt3aWR0aDoxMi4xMiU7aGVpZ2h0OjE2LjE2JTt0cmFuc2Zvcm06cm90YXRlWigyMGRlZyl9Lmhlcm8tZmlndXJlLWJveC0wOHtsZWZ0OjI3LjElO3RvcDo4MS42JTt3aWR0aDoxOS41MSU7aGVpZ2h0OjI2LjAxJTtiYWNrZ3JvdW5kOiMwMjcwRDc7dHJhbnNmb3JtOnJvdGF0ZVooLTIyZGVnKX0uaGVyby1maWd1cmUtYm94LTA4OjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgcmdiYSgyNTUsMjU1LDI1NSwwKSAwJSwgcmdiYSgyNTUsMjU1LDI1NSwwLjQ4KSAxMDAlKTt0cmFuc2Zvcm06cm90YXRlWig0NWRlZykgc2NhbGUoMS41KX0uaGVyby1maWd1cmUtYm94LTA5e2xlZnQ6NDIuNiU7dG9wOi0xNy45JTt3aWR0aDo2LjYzJTtoZWlnaHQ6OC44MyU7YmFja2dyb3VuZDojMDBCRkZCO3RyYW5zZm9ybTpyb3RhdGVaKC01MmRlZyl9Lmhlcm8tZmlndXJlLWJveC0wOTo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQsIHJnYmEoMjU1LDI1NSwyNTUsMCkgMCUsIHJnYmEoMjU1LDI1NSwyNTUsMC42NCkgMTAwJSk7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpIHNjYWxlKDEuNSl9Lmhlcm8tZmlndXJlLWJveC0xMHtsZWZ0Oi0zLjglO3RvcDo0LjMlO3dpZHRoOjMuMDMlO2hlaWdodDo0LjA0JTtiYWNrZ3JvdW5kOnJnYmEoMCwxOTEsMjUxLDAuMzIpO3RyYW5zZm9ybTpyb3RhdGVaKC01MGRlZyl9QG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KXsuaGVyby1jdGF7bWF4LXdpZHRoOjI4MHB4O21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99Lmhlcm8tY3RhIC5idXR0b257ZGlzcGxheTpmbGV4fS5oZXJvLWN0YSAuYnV0dG9uKy5idXR0b257bWFyZ2luLXRvcDoxNnB4fS5oZXJvLWZpZ3VyZTo6YWZ0ZXIsLmhlcm8tZmlndXJlLWJveC0wMywuaGVyby1maWd1cmUtYm94LTA0LC5oZXJvLWZpZ3VyZS1ib3gtMDl7ZGlzcGxheTpub25lfX1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5oZXJve3RleHQtYWxpZ246bGVmdDtwYWRkaW5nLXRvcDo2NHB4O3BhZGRpbmctYm90dG9tOjg4cHh9Lmhlcm8taW5uZXJ7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcn0uaGVyby1jb3B5e3BhZGRpbmctcmlnaHQ6NjRweDttaW4td2lkdGg6NTUycHg7d2lkdGg6NTUycHh9Lmhlcm8tY3Rhe21hcmdpbjowfS5oZXJvLWN0YSAuYnV0dG9ue21pbi13aWR0aDoxNzBweH0uaGVyby1jdGEgLmJ1dHRvbjpmaXJzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MTZweH0uaGVyby1maWd1cmUgc3Zne3dpZHRoOmF1dG99fS5mZWF0dXJlcy13cmFwe2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtZXZlbmx5O21hcmdpbi1yaWdodDotMzJweDttYXJnaW4tbGVmdDotMzJweH0uZmVhdHVyZXMtd3JhcDpmaXJzdC1vZi10eXBle21hcmdpbi10b3A6LTE2cHh9LmZlYXR1cmVzLXdyYXA6bGFzdC1vZi10eXBle21hcmdpbi1ib3R0b206LTE2cHh9LmZlYXR1cmV7cGFkZGluZzoxNnB4IDMycHg7d2lkdGg6MzgwcHg7bWF4LXdpZHRoOjM4MHB4O2ZsZXgtZ3JvdzoxfS5mZWF0dXJlLWlubmVye2hlaWdodDoxMDAlfS5mZWF0dXJlLWljb257ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXJ9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuZmVhdHVyZXMtd3JhcDpmaXJzdC1vZi10eXBle21hcmdpbi10b3A6LTI0cHh9LmZlYXR1cmVzLXdyYXA6bGFzdC1vZi10eXBle21hcmdpbi1ib3R0b206LTI0cHh9LmZlYXR1cmV7cGFkZGluZzozMnB4IDMycHh9fS5wcmljaW5nLWhlYWRlcnttYXJnaW4tYm90dG9tOjQ4cHh9LnByaWNpbmctdGFibGVzLXdyYXB7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luLXJpZ2h0Oi0xMnB4O21hcmdpbi1sZWZ0Oi0xMnB4fS5wcmljaW5nLXRhYmxlcy13cmFwOmZpcnN0LWNoaWxke21hcmdpbi10b3A6LTEycHh9LnByaWNpbmctdGFibGVzLXdyYXA6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOi0xMnB4fS5wcmljaW5nLXRhYmxle3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6MTJweDt3aWR0aDozNjhweDttYXgtd2lkdGg6MzY4cHg7ZmxleC1ncm93OjF9LnByaWNpbmctdGFibGU6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO3dpZHRoOjIwMCU7bWF4LXdpZHRoOjIwMCU7aGVpZ2h0OjQzNXB4O2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtiYWNrZ3JvdW5kLXNpemU6MTAwJTtib3R0b206MTguOCU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtiYWNrZ3JvdW5kLWltYWdlOnVybChcIi4uL2ltYWdlcy9wcmljaW5nLWlsbHVzdHJhdGlvbi5zdmdcIil9LnByaWNpbmctdGFibGUtaGVhZGVyLC5wcmljaW5nLXRhYmxlLWZlYXR1cmVzLXRpdGxlLC5wcmljaW5nLXRhYmxlLWZlYXR1cmVzIGxpe2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMTM4LDE0OCwxNjcsMC4yNCl9LnByaWNpbmctdGFibGUtaW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2JhY2tncm91bmQ6IzJDMzAzOTtwYWRkaW5nOjI0cHg7aGVpZ2h0OjEwMCV9LnByaWNpbmctdGFibGUtaW5uZXI+Kntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlfS5wcmljaW5nLXRhYmxlLWlubmVyOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtib3gtc2hhZG93OjAgMjRweCA0OHB4IHJnYmEoMjEsMjQsMjksMC4yNCk7bWl4LWJsZW5kLW1vZGU6bXVsdGlwbHl9LnByaWNpbmctdGFibGUtcHJpY2UtY3VycmVuY3l7Y29sb3I6IzhBOTRBN30ucHJpY2luZy10YWJsZS1mZWF0dXJlcy10aXRsZXtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjcwMH0ucHJpY2luZy10YWJsZS1mZWF0dXJlcyBsaXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO3BhZGRpbmc6MTRweCAwfS5wcmljaW5nLXRhYmxlLWZlYXR1cmVzIGxpOjpiZWZvcmV7Y29udGVudDonJzt3aWR0aDoxNnB4O2hlaWdodDoxMnB4O21hcmdpbi1yaWdodDoxNnB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU1UWWlJR2hsYVdkb2REMGlNVElpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRVdU5pQTJMalJNTVM0MklEUWdNQ0ExTGpZZ05TNDJJREV5SURFMklERXVOaUF4TkM0MElEQjZJaUJtYVd4c1BTSWpNREpEUWtJeElpQm1hV3hzTFhKMWJHVTlJbVYyWlc1dlpHUWlMejQ4TDNOMlp6ND0pO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdH0ucHJpY2luZy10YWJsZS1jdGF7YWxpZ24tc2VsZjpmbGV4LWVuZH1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5wcmljaW5nIC5zZWN0aW9uLXBhcmFncmFwaHtwYWRkaW5nLWxlZnQ6OTBweDtwYWRkaW5nLXJpZ2h0OjkwcHh9LnByaWNpbmctaGVhZGVye21hcmdpbi1ib3R0b206NTJweH19LmN0YXt0ZXh0LWFsaWduOmNlbnRlcn0uY3RhIC5zZWN0aW9uLWlubmVye3BhZGRpbmc6NDhweCAxNnB4fS5jdGEgLnNlY3Rpb24tdGl0bGV7bWFyZ2luLWJvdHRvbTo0MHB4fS5jdGEtaW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDojMTUxODFEO292ZXJmbG93OmhpZGRlbn0uY3RhLWlubmVyOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDo5OHB4O3RvcDotMTE3cHg7d2lkdGg6MTYwcHg7aGVpZ2h0OjE4N3B4O2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiLi4vaW1hZ2VzL2N0YS1pbGx1c3RyYXRpb24uc3ZnXCIpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdH0uY3RhLWlubmVyPip7cG9zaXRpb246cmVsYXRpdmV9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuY3Rhe3RleHQtYWxpZ246bGVmdH0uY3RhIC5zZWN0aW9uLWlubmVye3BhZGRpbmc6NjRweCAzMnB4fS5jdGEgLnNlY3Rpb24tdGl0bGV7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctcmlnaHQ6MjRweH0uY3RhLWlubmVye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59fS5pcy1ib3hlZHtiYWNrZ3JvdW5kOiMyNDI4MzB9LmJvZHktd3JhcHtiYWNrZ3JvdW5kOiMxRDIwMjY7b3ZlcmZsb3c6aGlkZGVuO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLWhlaWdodDoxMDB2aH0uYm94ZWQtY29udGFpbmVye21heC13aWR0aDoxNDQwcHg7bWFyZ2luOjAgYXV0bztib3gtc2hhZG93OjAgMjRweCA0OHB4IHJnYmEoMjEsMjQsMjksMC4yNCk7bWl4LWJsZW5kLW1vZGU6bXVsdGlwbHk7bWl4LWJsZW5kLW1vZGU6bm9ybWFsfW1haW57ZmxleDoxIDAgYXV0b30uc2VjdGlvbi1pbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLXRvcDo0OHB4O3BhZGRpbmctYm90dG9tOjQ4cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuc2VjdGlvbi1pbm5lcntwYWRkaW5nLXRvcDo4OHB4O3BhZGRpbmctYm90dG9tOjg4cHh9fS5zaXRlLWZvb3Rlcntmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoyMnB4O2xldHRlci1zcGFjaW5nOjBweH0uc2l0ZS1mb290ZXIgYXtjb2xvcjojOEE5NEE3O3RleHQtZGVjb3JhdGlvbjpub25lfS5zaXRlLWZvb3RlciBhOmhvdmVyLC5zaXRlLWZvb3RlciBhOmFjdGl2ZXt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5zaXRlLWZvb3Rlci1pbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7cGFkZGluZy10b3A6NDhweDtwYWRkaW5nLWJvdHRvbTo0OHB4fS5mb290ZXItYnJhbmQsLmZvb3Rlci1saW5rcywuZm9vdGVyLXNvY2lhbC1saW5rcywuZm9vdGVyLWNvcHlyaWdodHtmbGV4Om5vbmU7d2lkdGg6MTAwJTtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmZvb3Rlci1icmFuZCwuZm9vdGVyLWxpbmtzLC5mb290ZXItc29jaWFsLWxpbmtze21hcmdpbi1ib3R0b206MjRweH0uZm9vdGVyLXNvY2lhbC1saW5rcyBsaXtkaXNwbGF5OmlubGluZS1mbGV4fS5mb290ZXItc29jaWFsLWxpbmtzIGxpK2xpe21hcmdpbi1sZWZ0OjE2cHh9LmZvb3Rlci1zb2NpYWwtbGlua3MgbGkgYXtwYWRkaW5nOjhweH0uZm9vdGVyLWxpbmtzIGxpK2xpe21hcmdpbi1sZWZ0OjI0cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuc2l0ZS1mb290ZXJ7bWFyZ2luLXRvcDoyMHB4fS5zaXRlLWZvb3Rlci1pbm5lcntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtwYWRkaW5nLXRvcDo2NHB4O3BhZGRpbmctYm90dG9tOjY0cHh9LmZvb3Rlci1icmFuZCwuZm9vdGVyLWxpbmtzLC5mb290ZXItc29jaWFsLWxpbmtzLC5mb290ZXItY29weXJpZ2h0e2ZsZXg6NTAlfS5mb290ZXItYnJhbmQsLmZvb3Rlci1jb3B5cmlnaHR7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9LmZvb3Rlci1saW5rcywuZm9vdGVyLXNvY2lhbC1saW5rc3tqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LmZvb3Rlci1saW5rc3tvcmRlcjoxO21hcmdpbi1ib3R0b206MH19XG4iXX0= */ \ No newline at end of file diff --git a/dist/images/cta-illustration.svg b/dist/images/cta-illustration.svg new file mode 100644 index 0000000..c46d2f3 --- /dev/null +++ b/dist/images/cta-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-icon-01.svg b/dist/images/feature-icon-01.svg new file mode 100644 index 0000000..6054299 --- /dev/null +++ b/dist/images/feature-icon-01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-icon-02.svg b/dist/images/feature-icon-02.svg new file mode 100644 index 0000000..62b1193 --- /dev/null +++ b/dist/images/feature-icon-02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-icon-03.svg b/dist/images/feature-icon-03.svg new file mode 100644 index 0000000..ab7bbaa --- /dev/null +++ b/dist/images/feature-icon-03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-icon-04.svg b/dist/images/feature-icon-04.svg new file mode 100644 index 0000000..1ca34e7 --- /dev/null +++ b/dist/images/feature-icon-04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-icon-05.svg b/dist/images/feature-icon-05.svg new file mode 100644 index 0000000..43b4904 --- /dev/null +++ b/dist/images/feature-icon-05.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-icon-06.svg b/dist/images/feature-icon-06.svg new file mode 100644 index 0000000..3a0c70d --- /dev/null +++ b/dist/images/feature-icon-06.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/hero-back-illustration.svg b/dist/images/hero-back-illustration.svg new file mode 100644 index 0000000..8f0d151 --- /dev/null +++ b/dist/images/hero-back-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/hero-top-illustration.svg b/dist/images/hero-top-illustration.svg new file mode 100644 index 0000000..3eec102 --- /dev/null +++ b/dist/images/hero-top-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/logo.svg b/dist/images/logo.svg new file mode 100644 index 0000000..e2e655c --- /dev/null +++ b/dist/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/pricing-illustration.svg b/dist/images/pricing-illustration.svg new file mode 100644 index 0000000..982f983 --- /dev/null +++ b/dist/images/pricing-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/js/main.min.js b/dist/js/main.min.js new file mode 100644 index 0000000..71f079b --- /dev/null +++ b/dist/js/main.min.js @@ -0,0 +1 @@ +!function(){window;const e=document.documentElement;if(e.classList.remove("no-js"),e.classList.add("js"),document.body.classList.contains("has-animations")){(window.sr=ScrollReveal()).reveal(".feature, .pricing-table-inner",{duration:600,distance:"20px",easing:"cubic-bezier(0.5, -0.01, 0, 1.005)",origin:"bottom",interval:100}),e.classList.add("anime-ready"),anime.timeline({targets:".hero-figure-box-05"}).add({duration:400,easing:"easeInOutExpo",scaleX:[.05,.05],scaleY:[0,1],perspective:"500px",delay:anime.random(0,400)}).add({duration:400,easing:"easeInOutExpo",scaleX:1}).add({duration:800,rotateY:"-15deg",rotateX:"8deg",rotateZ:"-1deg"}),anime.timeline({targets:".hero-figure-box-06, .hero-figure-box-07"}).add({duration:400,easing:"easeInOutExpo",scaleX:[.05,.05],scaleY:[0,1],perspective:"500px",delay:anime.random(0,400)}).add({duration:400,easing:"easeInOutExpo",scaleX:1}).add({duration:800,rotateZ:"20deg"}),anime({targets:".hero-figure-box-01, .hero-figure-box-02, .hero-figure-box-03, .hero-figure-box-04, .hero-figure-box-08, .hero-figure-box-09, .hero-figure-box-10",duration:anime.random(600,800),delay:anime.random(600,800),rotate:[anime.random(-360,360),function(e){return e.getAttribute("data-rotation")}],scale:[.7,1],opacity:[0,1],easing:"easeInOutExpo"})}}(); \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..7529b20 --- /dev/null +++ b/index.html @@ -0,0 +1,303 @@ + + + + + + + xVOWL + + + + + + +
+ + +
+
+
+
+
+

+ xVOWL - The new generation +

+

+ We have the idea of improving the existing + solutions in regards to visualizations, + exploration and working with OWL. We have + many ideas which include providing state of + the art visualization, full-features + editors, sharable workplaces, AI infused + workflows and much more. +

+

+ Before we start tackling this we want to see + if we have enough interest and even maybe + some possible investors or funders (like + universities or companies) who would like to + support and provide their influence into the + products. +

+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ Feature 01 +
+

+ Visualization +

+

+ Make existing visualizations even + better. +

+
+
+
+
+
+ Feature 02 +
+

+ Feature-rich editors +

+

+ Provide an editor with which you can + easily edit and modify your + ontologies as you require. +

+
+
+
+
+
+ Feature 03 +
+

+ Transformers +

+

+ Easily transform your ontology + document into different + representations. +

+
+
+
+
+
+ Feature 04 +
+

+ AI features +

+

+ Include support from LLMs and AI to + support with ontology generation and + creation. +

+
+
+
+
+
+ Feature 05 +
+

+ Enterprise scopes +

+

+ The idea of buildings organizations + and teams and provide security and + sharability between is common + required feature of enterprise. Also + self-hosting and other things could + be provided. +

+
+
+
+
+
+ Feature 06 +
+

+ Learn from existing solutions +

+

+ There are already existing solutions + which should bne credited and + learned from. To name some WebVOWL, + ProtegeVOWL, OWL2VOWL, Ontobench, + LD-VOWL. +

+
+
+
+
+
+
+ +
+
+
+

+ Want to notified on release? +

+
+ Subscribe +
+
+
+

+ Interested to be investor or funder? +

+ +
+
+
+
+ +
+
+ +
+
+
+ + + + diff --git a/package-sample.json b/package-sample.json new file mode 100644 index 0000000..0a503d1 --- /dev/null +++ b/package-sample.json @@ -0,0 +1,54 @@ +{ + "name": "solid", + "version": "1.0.0", + "description": "Solid Template", + "author": "Pasquale Vitiello ", + "license": "GPLv3", + "repository": { + "type": "git", + "url": "https://bitbucket.org/pasqualevitiello/solid.git" + }, + "bugs": { + "url": "https://bitbucket.org/pasqualevitiello/solid/issues" + }, + "scripts": { + "clean": "rimraf dist/{css/*,js/*,images/*}", + "autoprefixer": "postcss -u autoprefixer -r dist/css/*", + "scss": "node-sass --output-style compressed -o dist/css src/scss", + "lint": "eslint src/js || true", + "lint-scss": "stylelint src/scss/*.scss --syntax scss || true", + "uglify": "mkdirp dist/js -p && uglifyjs src/js/*.js -m -c -o dist/js/main.min.js", + "imagemin": "imagemin src/images/* -o dist/images", + "serve": "browser-sync start --server --files \"dist/css/*.css, dist/js/*.js, **/*.html, !node_modules/**/*.html\"", + "build:css": "run-s lint-scss scss autoprefixer", + "build:js": "run-s lint uglify", + "build:images": "run-s imagemin", + "build": "run-s build:*", + "watch:css": "onchange \"src/scss\" -- run-s build:css", + "watch:js": "onchange \"src/js\" -- run-s build:js", + "watch:images": "onchange \"src/images\" -- run-s build:images", + "watch": "run-p serve watch:*", + "postinstall": "run-s build watch" + }, + "devDependencies": { + "autoprefixer": "^9.0.1", + "browser-sync": "^2.12.8", + "eslint": "^5.2.0", + "eslint-config-standard": "^12.0.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-node": "^7.0.1", + "eslint-plugin-promise": "^3.8.0", + "eslint-plugin-standard": "^3.1.0", + "imagemin-cli": "^3.0.0", + "mkdirp": "^0.5.1", + "node-sass": "^4.9.2", + "npm-run-all": "^4.1.3", + "onchange": "^4.1.0", + "postcss-cli": "^6.0.0", + "rimraf": "^2.5.4", + "stylelint": "^9.4.0", + "uglify-es": "^3.3.10" + }, + "homepage": "https://bitbucket.org/pasqualevitiello/solid#readme", + "main": ".eslintrc.js" +} diff --git a/src/images/cta-illustration.svg b/src/images/cta-illustration.svg new file mode 100644 index 0000000..c46d2f3 --- /dev/null +++ b/src/images/cta-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/feature-icon-01.svg b/src/images/feature-icon-01.svg new file mode 100644 index 0000000..6054299 --- /dev/null +++ b/src/images/feature-icon-01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/feature-icon-02.svg b/src/images/feature-icon-02.svg new file mode 100644 index 0000000..62b1193 --- /dev/null +++ b/src/images/feature-icon-02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/feature-icon-03.svg b/src/images/feature-icon-03.svg new file mode 100644 index 0000000..ef197c0 --- /dev/null +++ b/src/images/feature-icon-03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/feature-icon-04.svg b/src/images/feature-icon-04.svg new file mode 100644 index 0000000..1ca34e7 --- /dev/null +++ b/src/images/feature-icon-04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/feature-icon-05.svg b/src/images/feature-icon-05.svg new file mode 100644 index 0000000..43b4904 --- /dev/null +++ b/src/images/feature-icon-05.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/feature-icon-06.svg b/src/images/feature-icon-06.svg new file mode 100644 index 0000000..38165e7 --- /dev/null +++ b/src/images/feature-icon-06.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/hero-back-illustration.svg b/src/images/hero-back-illustration.svg new file mode 100644 index 0000000..8f0d151 --- /dev/null +++ b/src/images/hero-back-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/hero-top-illustration.svg b/src/images/hero-top-illustration.svg new file mode 100644 index 0000000..d391cb7 --- /dev/null +++ b/src/images/hero-top-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/logo.svg b/src/images/logo.svg new file mode 100644 index 0000000..e2e655c --- /dev/null +++ b/src/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/pricing-illustration.svg b/src/images/pricing-illustration.svg new file mode 100644 index 0000000..982f983 --- /dev/null +++ b/src/images/pricing-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/js/main.js b/src/js/main.js new file mode 100644 index 0000000..8e57c8d --- /dev/null +++ b/src/js/main.js @@ -0,0 +1,71 @@ +(function () { + const win = window + const doc = document.documentElement + + doc.classList.remove('no-js') + doc.classList.add('js') + + // Reveal animations + if (document.body.classList.contains('has-animations')) { + /* global ScrollReveal */ + const sr = window.sr = ScrollReveal() + + sr.reveal('.feature, .pricing-table-inner', { + duration: 600, + distance: '20px', + easing: 'cubic-bezier(0.5, -0.01, 0, 1.005)', + origin: 'bottom', + interval: 100 + }) + + doc.classList.add('anime-ready') + /* global anime */ + anime.timeline({ + targets: '.hero-figure-box-05' + }).add({ + duration: 400, + easing: 'easeInOutExpo', + scaleX: [0.05, 0.05], + scaleY: [0, 1], + perspective: '500px', + delay: anime.random(0, 400) + }).add({ + duration: 400, + easing: 'easeInOutExpo', + scaleX: 1 + }).add({ + duration: 800, + rotateY: '-15deg', + rotateX: '8deg', + rotateZ: '-1deg' + }) + + anime.timeline({ + targets: '.hero-figure-box-06, .hero-figure-box-07' + }).add({ + duration: 400, + easing: 'easeInOutExpo', + scaleX: [0.05, 0.05], + scaleY: [0, 1], + perspective: '500px', + delay: anime.random(0, 400) + }).add({ + duration: 400, + easing: 'easeInOutExpo', + scaleX: 1 + }).add({ + duration: 800, + rotateZ: '20deg' + }) + + anime({ + targets: '.hero-figure-box-01, .hero-figure-box-02, .hero-figure-box-03, .hero-figure-box-04, .hero-figure-box-08, .hero-figure-box-09, .hero-figure-box-10', + duration: anime.random(600, 800), + delay: anime.random(600, 800), + rotate: [ anime.random(-360, 360), function (el) { return el.getAttribute('data-rotation') } ], + scale: [0.7, 1], + opacity: [0, 1], + easing: 'easeInOutExpo' + }) + } +}()) diff --git a/src/scss/_normalize.scss b/src/scss/_normalize.scss new file mode 100644 index 0000000..8025dce --- /dev/null +++ b/src/scss/_normalize.scss @@ -0,0 +1,231 @@ +html { + line-height: 1.15; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +figcaption, +figure, +main { + display: block; +} + +figure { + margin: 1em 40px; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +pre { + font-family: monospace, monospace; + font-size: 1em; +} + +a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; +} + +b, +strong { + font-weight: inherit; +} + +b, +strong { + font-weight: bolder; +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +dfn { + font-style: italic; +} + +mark { + background-color: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +audio, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +img { + border-style: none; +} + +svg:not(:root) { + overflow: hidden; +} + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + font-size: 100%; + line-height: 1.15; + margin: 0; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} + +progress { + display: inline-block; + vertical-align: baseline; +} + +textarea { + overflow: auto; +} + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +details, +menu { + display: block; +} + +summary { + display: list-item; +} + +canvas { + display: inline-block; +} + +template { + display: none; +} + +[hidden] { + display: none; +} \ No newline at end of file diff --git a/src/scss/abstracts/_functions.scss b/src/scss/abstracts/_functions.scss new file mode 100644 index 0000000..6aa6a1c --- /dev/null +++ b/src/scss/abstracts/_functions.scss @@ -0,0 +1,55 @@ +// -------------------------------------------------------------------- +// Retrieve Font Size ------------------------------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-font-size($size, $elem) { + @return nth(map-get(map-get($font__scale, $elem), $size), 1); +} + +// -------------------------------------------------------------------- +// Retrieve Line Height ----------------------------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-line-height($size, $elem) { + @return nth(map-get(map-get($font__scale, $elem), $size), 2); +} + +// -------------------------------------------------------------------- +// Retrieve Kerning --------------------------------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-kerning($size, $elem) { + @return nth(map-get(map-get($font__scale, $elem), $size), 3); +} + +// -------------------------------------------------------------------- +// Retrieve Font Family ----------------------------------------------- +// Used in _mixins.scss [@mixin font-family] -------------------------- +// -------------------------------------------------------------------- +@function get-font-family($elem) { + @return map-get($font__family, $elem); +} + +// -------------------------------------------------------------------- +// Retrieve Font Weight ----------------------------------------------- +// Used in _mixins.scss [@mixin font-weight] -------------------------- +// -------------------------------------------------------------------- +@function get-font-weight($elem) { + @return map-get($font__weight, $elem); +} + +// -------------------------------------------------------------------- +// Retrieve Padding of Content Area Elements -------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-content-padding($elem) { + @return map-get($content__padding, $elem); +} + +// -------------------------------------------------------------------- +// Retrieve Colors ---------------------------------------------------- +// Usage: color(typography, 1) ---------------------------------------------- +// -------------------------------------------------------------------- +@function color($elem, $variant) { + @return map-get(map-get($color, $elem), $variant); +} diff --git a/src/scss/abstracts/_include-media.scss b/src/scss/abstracts/_include-media.scss new file mode 100644 index 0000000..bb5ccd5 --- /dev/null +++ b/src/scss/abstracts/_include-media.scss @@ -0,0 +1,567 @@ +@charset "UTF-8"; + +// _ _ _ _ _ +// (_) | | | | | (_) +// _ _ __ ___| |_ _ __| | ___ _ __ ___ ___ __| |_ __ _ +// | | '_ \ / __| | | | |/ _` |/ _ \ | '_ ` _ \ / _ \/ _` | |/ _` | +// | | | | | (__| | |_| | (_| | __/ | | | | | | __/ (_| | | (_| | +// |_|_| |_|\___|_|\__,_|\__,_|\___| |_| |_| |_|\___|\__,_|_|\__,_| +// +// Simple, elegant and maintainable media queries in Sass +// v1.4.9 +// +// http://include-media.com +// +// Authors: Eduardo Boucas (@eduardoboucas) +// Hugo Giraudel (@hugogiraudel) +// +// This project is licensed under the terms of the MIT license + + +//// +/// include-media library public configuration +/// @author Eduardo Boucas +/// @access public +//// + + +/// +/// Creates a list of global breakpoints +/// +/// @example scss - Creates a single breakpoint with the label `phone` +/// $breakpoints: ('phone': 320px); +/// +$breakpoints: ( + 'small': 480px, + 'medium': 640px, + 'large': 1024px, +) !default; + + +/// +/// Creates a list of static expressions or media types +/// +/// @example scss - Creates a single media type (screen) +/// $media-expressions: ('screen': 'screen'); +/// +/// @example scss - Creates a static expression with logical disjunction (OR operator) +/// $media-expressions: ( +/// 'retina2x': '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)' +/// ); +/// +$media-expressions: ( + 'screen': 'screen', + 'print': 'print', + 'handheld': 'handheld', + 'landscape': '(orientation: landscape)', + 'portrait': '(orientation: portrait)', + 'retina2x': '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi), (min-resolution: 2dppx)', + 'retina3x': '(-webkit-min-device-pixel-ratio: 3), (min-resolution: 350dpi), (min-resolution: 3dppx)' +) !default; + + +/// +/// Defines a number to be added or subtracted from each unit when declaring breakpoints with exclusive intervals +/// +/// @example scss - Interval for pixels is defined as `1` by default +/// @include media('>128px') {} +/// +/// /* Generates: */ +/// @media (min-width: 129px) {} +/// +/// @example scss - Interval for ems is defined as `0.01` by default +/// @include media('>20em') {} +/// +/// /* Generates: */ +/// @media (min-width: 20.01em) {} +/// +/// @example scss - Interval for rems is defined as `0.1` by default, to be used with `font-size: 62.5%;` +/// @include media('>2.0rem') {} +/// +/// /* Generates: */ +/// @media (min-width: 2.1rem) {} +/// +$unit-intervals: ( + 'px': 1, + 'em': 0.01, + 'rem': 0.1, + '': 0 +) !default; + +/// +/// Defines whether support for media queries is available, useful for creating separate stylesheets +/// for browsers that don't support media queries. +/// +/// @example scss - Disables support for media queries +/// $im-media-support: false; +/// @include media('>=tablet') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* Generates: */ +/// .foo { +/// color: tomato; +/// } +/// +$im-media-support: true !default; + +/// +/// Selects which breakpoint to emulate when support for media queries is disabled. Media queries that start at or +/// intercept the breakpoint will be displayed, any others will be ignored. +/// +/// @example scss - This media query will show because it intercepts the static breakpoint +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'desktop'; +/// @include media('>=tablet') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* Generates: */ +/// .foo { +/// color: tomato; +/// } +/// +/// @example scss - This media query will NOT show because it does not intercept the desktop breakpoint +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'tablet'; +/// @include media('>=desktop') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* No output */ +/// +$im-no-media-breakpoint: 'desktop' !default; + +/// +/// Selects which media expressions are allowed in an expression for it to be used when media queries +/// are not supported. +/// +/// @example scss - This media query will show because it intercepts the static breakpoint and contains only accepted media expressions +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'desktop'; +/// $im-no-media-expressions: ('screen'); +/// @include media('>=tablet', 'screen') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* Generates: */ +/// .foo { +/// color: tomato; +/// } +/// +/// @example scss - This media query will NOT show because it intercepts the static breakpoint but contains a media expression that is not accepted +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'desktop'; +/// $im-no-media-expressions: ('screen'); +/// @include media('>=tablet', 'retina2x') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* No output */ +/// +$im-no-media-expressions: ('screen', 'portrait', 'landscape') !default; + +//// +/// Cross-engine logging engine +/// @author Hugo Giraudel +/// @access private +//// + + +/// +/// Log a message either with `@error` if supported +/// else with `@warn`, using `feature-exists('at-error')` +/// to detect support. +/// +/// @param {String} $message - Message to log +/// +@function im-log($message) { + @if feature-exists('at-error') { + @error $message; + } @else { + @warn $message; + $_: noop(); + } + + @return $message; +} + + +/// +/// Wrapper mixin for the log function so it can be used with a more friendly +/// API than `@if im-log('..') {}` or `$_: im-log('..')`. Basically, use the function +/// within functions because it is not possible to include a mixin in a function +/// and use the mixin everywhere else because it's much more elegant. +/// +/// @param {String} $message - Message to log +/// +@mixin log($message) { + @if im-log($message) {} +} + + +/// +/// Function with no `@return` called next to `@warn` in Sass 3.3 +/// to trigger a compiling error and stop the process. +/// +@function noop() {} + +/// +/// Determines whether a list of conditions is intercepted by the static breakpoint. +/// +/// @param {Arglist} $conditions - Media query conditions +/// +/// @return {Boolean} - Returns true if the conditions are intercepted by the static breakpoint +/// +@function im-intercepts-static-breakpoint($conditions...) { + $no-media-breakpoint-value: map-get($breakpoints, $im-no-media-breakpoint); + + @if not $no-media-breakpoint-value { + @if im-log('`#{$im-no-media-breakpoint}` is not a valid breakpoint.') {} + } + + @each $condition in $conditions { + @if not map-has-key($media-expressions, $condition) { + $operator: get-expression-operator($condition); + $prefix: get-expression-prefix($operator); + $value: get-expression-value($condition, $operator); + + @if ($prefix == 'max' and $value <= $no-media-breakpoint-value) or + ($prefix == 'min' and $value > $no-media-breakpoint-value) { + @return false; + } + } @else if not index($im-no-media-expressions, $condition) { + @return false; + } + } + + @return true; +} + +//// +/// Parsing engine +/// @author Hugo Giraudel +/// @access private +//// + + +/// +/// Get operator of an expression +/// +/// @param {String} $expression - Expression to extract operator from +/// +/// @return {String} - Any of `>=`, `>`, `<=`, `<`, `≥`, `≤` +/// +@function get-expression-operator($expression) { + @each $operator in ('>=', '>', '<=', '<', '≥', '≤') { + @if str-index($expression, $operator) { + @return $operator; + } + } + + // It is not possible to include a mixin inside a function, so we have to + // rely on the `im-log(..)` function rather than the `log(..)` mixin. Because + // functions cannot be called anywhere in Sass, we need to hack the call in + // a dummy variable, such as `$_`. If anybody ever raise a scoping issue with + // Sass 3.3, change this line in `@if im-log(..) {}` instead. + $_: im-log('No operator found in `#{$expression}`.'); +} + + +/// +/// Get dimension of an expression, based on a found operator +/// +/// @param {String} $expression - Expression to extract dimension from +/// @param {String} $operator - Operator from `$expression` +/// +/// @return {String} - `width` or `height` (or potentially anything else) +/// +@function get-expression-dimension($expression, $operator) { + $operator-index: str-index($expression, $operator); + $parsed-dimension: str-slice($expression, 0, $operator-index - 1); + $dimension: 'width'; + + @if str-length($parsed-dimension) > 0 { + $dimension: $parsed-dimension; + } + + @return $dimension; +} + + +/// +/// Get dimension prefix based on an operator +/// +/// @param {String} $operator - Operator +/// +/// @return {String} - `min` or `max` +/// +@function get-expression-prefix($operator) { + @return if(index(('<', '<=', '≤'), $operator), 'max', 'min'); +} + + +/// +/// Get value of an expression, based on a found operator +/// +/// @param {String} $expression - Expression to extract value from +/// @param {String} $operator - Operator from `$expression` +/// +/// @return {Number} - A numeric value +/// +@function get-expression-value($expression, $operator) { + $operator-index: str-index($expression, $operator); + $value: str-slice($expression, $operator-index + str-length($operator)); + + @if map-has-key($breakpoints, $value) { + $value: map-get($breakpoints, $value); + } @else { + $value: to-number($value); + } + + $interval: map-get($unit-intervals, unit($value)); + + @if not $interval { + // It is not possible to include a mixin inside a function, so we have to + // rely on the `im-log(..)` function rather than the `log(..)` mixin. Because + // functions cannot be called anywhere in Sass, we need to hack the call in + // a dummy variable, such as `$_`. If anybody ever raise a scoping issue with + // Sass 3.3, change this line in `@if im-log(..) {}` instead. + $_: im-log('Unknown unit `#{unit($value)}`.'); + } + + @if $operator == '>' { + $value: $value + $interval; + } @else if $operator == '<' { + $value: $value - $interval; + } + + @return $value; +} + + +/// +/// Parse an expression to return a valid media-query expression +/// +/// @param {String} $expression - Expression to parse +/// +/// @return {String} - Valid media query +/// +@function parse-expression($expression) { + // If it is part of $media-expressions, it has no operator + // then there is no need to go any further, just return the value + @if map-has-key($media-expressions, $expression) { + @return map-get($media-expressions, $expression); + } + + $operator: get-expression-operator($expression); + $dimension: get-expression-dimension($expression, $operator); + $prefix: get-expression-prefix($operator); + $value: get-expression-value($expression, $operator); + + @return '(#{$prefix}-#{$dimension}: #{$value})'; +} + +/// +/// Slice `$list` between `$start` and `$end` indexes +/// +/// @access private +/// +/// @param {List} $list - List to slice +/// @param {Number} $start [1] - Start index +/// @param {Number} $end [length($list)] - End index +/// +/// @return {List} Sliced list +/// +@function slice($list, $start: 1, $end: length($list)) { + @if length($list) < 1 or $start > $end { + @return (); + } + + $result: (); + + @for $i from $start through $end { + $result: append($result, nth($list, $i)); + } + + @return $result; +} + +//// +/// String to number converter +/// @author Hugo Giraudel +/// @access private +//// + + +/// +/// Casts a string into a number +/// +/// @param {String | Number} $value - Value to be parsed +/// +/// @return {Number} +/// +@function to-number($value) { + @if type-of($value) == 'number' { + @return $value; + } @else if type-of($value) != 'string' { + $_: im-log('Value for `to-number` should be a number or a string.'); + } + + $first-character: str-slice($value, 1, 1); + $result: 0; + $digits: 0; + $minus: ($first-character == '-'); + $numbers: ('0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9); + + // Remove +/- sign if present at first character + @if ($first-character == '+' or $first-character == '-') { + $value: str-slice($value, 2); + } + + @for $i from 1 through str-length($value) { + $character: str-slice($value, $i, $i); + + @if not (index(map-keys($numbers), $character) or $character == '.') { + @return to-length(if($minus, -$result, $result), str-slice($value, $i)) + } + + @if $character == '.' { + $digits: 1; + } @else if $digits == 0 { + $result: $result * 10 + map-get($numbers, $character); + } @else { + $digits: $digits * 10; + $result: $result + map-get($numbers, $character) / $digits; + } + } + + @return if($minus, -$result, $result); +} + + +/// +/// Add `$unit` to `$value` +/// +/// @param {Number} $value - Value to add unit to +/// @param {String} $unit - String representation of the unit +/// +/// @return {Number} - `$value` expressed in `$unit` +/// +@function to-length($value, $unit) { + $units: ('px': 1px, 'cm': 1cm, 'mm': 1mm, '%': 1%, 'ch': 1ch, 'pc': 1pc, 'in': 1in, 'em': 1em, 'rem': 1rem, 'pt': 1pt, 'ex': 1ex, 'vw': 1vw, 'vh': 1vh, 'vmin': 1vmin, 'vmax': 1vmax); + + @if not index(map-keys($units), $unit) { + $_: im-log('Invalid unit `#{$unit}`.'); + } + + @return $value * map-get($units, $unit); +} + +/// +/// This mixin aims at redefining the configuration just for the scope of +/// the call. It is helpful when having a component needing an extended +/// configuration such as custom breakpoints (referred to as tweakpoints) +/// for instance. +/// +/// @author Hugo Giraudel +/// +/// @param {Map} $tweakpoints [()] - Map of tweakpoints to be merged with `$breakpoints` +/// @param {Map} $tweak-media-expressions [()] - Map of tweaked media expressions to be merged with `$media-expression` +/// +/// @example scss - Extend the global breakpoints with a tweakpoint +/// @include media-context(('custom': 678px)) { +/// .foo { +/// @include media('>phone', '<=custom') { +/// // ... +/// } +/// } +/// } +/// +/// @example scss - Extend the global media expressions with a custom one +/// @include media-context($tweak-media-expressions: ('all': 'all')) { +/// .foo { +/// @include media('all', '>phone') { +/// // ... +/// } +/// } +/// } +/// +/// @example scss - Extend both configuration maps +/// @include media-context(('custom': 678px), ('all': 'all')) { +/// .foo { +/// @include media('all', '>phone', '<=custom') { +/// // ... +/// } +/// } +/// } +/// +@mixin media-context($tweakpoints: (), $tweak-media-expressions: ()) { + // Save global configuration + $global-breakpoints: $breakpoints; + $global-media-expressions: $media-expressions; + + // Update global configuration + $breakpoints: map-merge($breakpoints, $tweakpoints) !global; + $media-expressions: map-merge($media-expressions, $tweak-media-expressions) !global; + + @content; + + // Restore global configuration + $breakpoints: $global-breakpoints !global; + $media-expressions: $global-media-expressions !global; +} + +//// +/// include-media public exposed API +/// @author Eduardo Boucas +/// @access public +//// + + +/// +/// Generates a media query based on a list of conditions +/// +/// @param {Arglist} $conditions - Media query conditions +/// +/// @example scss - With a single set breakpoint +/// @include media('>phone') { } +/// +/// @example scss - With two set breakpoints +/// @include media('>phone', '<=tablet') { } +/// +/// @example scss - With custom values +/// @include media('>=358px', '<850px') { } +/// +/// @example scss - With set breakpoints with custom values +/// @include media('>desktop', '<=1350px') { } +/// +/// @example scss - With a static expression +/// @include media('retina2x') { } +/// +/// @example scss - Mixing everything +/// @include media('>=350px', ' 0) { + @media #{unquote(parse-expression(nth($conditions, 1)))} { + // Recursive call + @include media(slice($conditions, 2)...) { + @content; + } + } + } +} diff --git a/src/scss/abstracts/_mixins.scss b/src/scss/abstracts/_mixins.scss new file mode 100644 index 0000000..0e7ddeb --- /dev/null +++ b/src/scss/abstracts/_mixins.scss @@ -0,0 +1,101 @@ +// Font-size + Line-height + Kerning +// Usage: @include font-size(1, mobile) +// Add more true/false args to control what to output: font-size, line-height, kerning +@mixin font-size($size, $elem, $font-size: true, $line-height: false, $kerning: false, $adjust-font-size: 0) { + @if not map-has-key(map-get($font__scale, $elem), $size) { + @warn "'#{$size}' key does not exist in array!"; + } + @if ( $font-size != false ) { + font-size: get-font-size($size, $elem) + $adjust-font-size; + } + @if ( $line-height == true ) { + line-height: get-line-height($size, $elem); + } + @if ( $kerning == true ) { + letter-spacing: get-kerning($size, $elem); + } +} + +// Font Family +@mixin font-family($elem) { + font-family: unquote(get-font-family($elem)); +} + +// Font Weight +@mixin font-weight($elem) { + font-weight: get-font-weight($elem); +} + +// Anchor aspect +@mixin anchor-aspect($type: 'main') { + @if ($type == 'main') { // Base + color: color(typography, 2); + text-decoration: underline; + + &:hover, + &:active { + outline: 0; + text-decoration: none; + } + } @else if ($type == 'header') { + color: color(typography, 2); + text-transform: uppercase; + text-decoration: none; + + &:hover, + &:active { + } + } @else if ($type == 'footer') { + color: color(typography, 2); + text-decoration: none; + + &:hover, + &:active { + text-decoration: underline; + } + } +} + +@mixin shadow { + box-shadow: 0 24px 48px rgba(color(bg, 1), .24); + mix-blend-mode: multiply; +} + +@mixin shadow-sm { + box-shadow: 0 16px 24px rgba(color(bg, 1), .24); + mix-blend-mode: multiply; +} + +@mixin divider-mix { + display: block; + height: 1px; + background: color(bg, 3); +} + +@mixin divider($type: false) { + @if ( $type == 'before' ) { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + @include divider-mix; + } + } @else if ($type == 'after') { + position: relative; + + &::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + @include divider-mix; + } + } @else { + @include divider-mix; + } +} diff --git a/src/scss/abstracts/_variables.scss b/src/scss/abstracts/_variables.scss new file mode 100644 index 0000000..6a9a20e --- /dev/null +++ b/src/scss/abstracts/_variables.scss @@ -0,0 +1,83 @@ +// -------------------------------------------- +// Colors ------------------------------------- +// Usage example: color(primary, main) +// -------------------------------------------- +$color: ( + typography: ( + 1: #FFFFFF, + 2: #8A94A7, + 3: #3B404C + ), + bg: ( + 1: #15181D, + 2: #1D2026, + 3: #242830, + 4: #2C3039 + ), + primary: ( + 1: #0270D7, + 2: #0F8AFD, + 3: #0256A4 + ) +); + +// -------------------------------------------- +// Typography --------------------------------- +// -------------------------------------------- +$font__family: ( + base: '"IBM Plex Sans", sans-serif', // font-family(base) + heading: '"IBM Plex Sans", sans-serif', // font-family(heading) + code: 'Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace', // font-family(code) + pre: '"Courier 10 Pitch", Courier, monospace' // font-family(pre) +); + +$font__sizes: ( + alpha: ( 44px, 54px, 0px ), // font-size, line-height, kerning (use '0' if don't want to output any kerning) + beta: ( 38px, 48px, 0px ), + gamma: ( 32px, 42px, 0px ), + delta: ( 24px, 34px, 0px ), + epsilon: ( 20px, 30px, -0.1px ), + zeta: ( 18px, 28px, -0.1px ), + eta: ( 16px, 24px, -0.1px ), + theta: ( 14px, 22px, 0px ) +); + +$font__scale: ( + desktop: ( // i.e. $breakpoint__m + $breakpoint__l (600 - 1024) + 1: map-get($font__sizes, alpha), // H1 + 2: map-get($font__sizes, beta), // H2 + 3: map-get($font__sizes, gamma), // H3 + 4: map-get($font__sizes, delta), // H4, H5, H6 + 5: map-get($font__sizes, epsilon), // Body + 6: map-get($font__sizes, zeta), // Text small (e.g. faq's) + 7: map-get($font__sizes, eta), // Text smaller (e.g. pricing, testimonials) + 8: map-get($font__sizes, theta) // Footer area + ), + mobile: ( // i.e. $breakpoint__xs + $breakpoint__s (up to 600) + 1: map-get($font__sizes, beta), // H1 + 2: map-get($font__sizes, gamma), // H2 + 3: map-get($font__sizes, delta), // H3 + 4: map-get($font__sizes, epsilon), // H4, H5, H6 + 5: map-get($font__sizes, epsilon), // Body + 6: map-get($font__sizes, zeta), // Text small (e.g. faq's) + 7: map-get($font__sizes, eta), // Text smaller (e.g. pricing, testimonials) + 8: map-get($font__sizes, theta) // Footer area + ) +); + +$font__weight: ( + regular: 400, // font__weight(regular) + medium: 500, // font__weight(medium) + semibold: 600, // font__weight(semi-bold) + bold: 700 // font__weight(bold) +); + +// -------------------------------------------- +// Structure ---------------------------------- +// -------------------------------------------- +$content__padding: ( + mobile: 16px, + desktop: 24px +); +$container__width: 1080px; +$container__width-sm: 800px; diff --git a/src/scss/base/_base.scss b/src/scss/base/_base.scss new file mode 100644 index 0000000..0e0bdee --- /dev/null +++ b/src/scss/base/_base.scss @@ -0,0 +1,103 @@ +html { + box-sizing: border-box; +} + +*, +*:before, +*:after { /* Inherit box-sizing to make it easier to change the property for components that leverage other behavior; see http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */ + box-sizing: inherit; +} + +body { + background: color(bg, 2); /* Fallback for when there is no custom background color defined. */ + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +hr { + border: 0; + @include divider(); + margin-top: 24px; + margin-bottom: 24px; +} + +ul, ol { + margin-top: 0; + margin-bottom: 24px; + padding-left: 24px; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li > ul, +li > ol { + margin-bottom: 0; +} + +dl { + margin-top: 0; + margin-bottom: 24px; +} + +dt { + @include font-weight(semibold); +} + +dd { + margin-left: 24px; + margin-bottom: 24px; +} + +img { + height: auto; /* Make sure images are scaled correctly. */ + max-width: 100%; /* Adhere to container width. */ + vertical-align: middle; +} + +figure { + margin: 24px 0; /* Extra wide images within figure tags don't overflow the content area. */ +} + +figcaption { + @include font-size(7, mobile, true, true); + padding: 8px 0; +} + +img, +svg { + display: block; +} + +// tables +table { + border-collapse: collapse; + margin-bottom: 24px; + width: 100%; +} + +tr { + border-bottom: 1px solid color(bg, 3); +} + +th { + text-align: left; +} + +th, +td { + padding: 10px 16px; + + &:first-child { + padding-left: 0; + } + + &:last-child { + padding-right: 0; + } +} diff --git a/src/scss/base/_helpers.scss b/src/scss/base/_helpers.scss new file mode 100644 index 0000000..1d085dc --- /dev/null +++ b/src/scss/base/_helpers.scss @@ -0,0 +1,476 @@ +.container, +.container-sm { + width: 100%; + margin: 0 auto; + padding-left: get-content-padding(mobile); + padding-right: get-content-padding(mobile); + + @include media( '>small' ) { + padding-left: get-content-padding(desktop); + padding-right: get-content-padding(desktop); + } +} + +.container { + max-width: $container__width + ( get-content-padding(desktop) * 2 ); +} + +.container-sm { + max-width: $container__width-sm + ( get-content-padding(desktop) * 2 ); +} + +.container { + + .container-sm { + max-width: $container__width-sm; + padding-left: 0; + padding-right: 0; + } +} + +/* Text meant only for screen readers. */ +.screen-reader-text { + clip: rect(1px, 1px, 1px, 1px); + position: absolute !important; + height: 1px; + width: 1px; + overflow: hidden; + word-wrap: normal !important; /* Many screen reader and browser combinations announce broken words as they would appear visually. */ + + &:focus { + border-radius: 2px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + display: block; + @include font-size(8, mobile, true, false, true); + @if ( get-font-size(8, desktop) != get-font-size(8, mobile) ) { + @include media( '>medium' ) { + @include font-size(8, desktop, true, false, true); + } + } + @include font-weight(semibold); + line-height: 16px; + text-decoration: none; + text-transform: uppercase; + background-color: color(bg, 2); + color: color(primary, 1) !important; + border: none; + height: auto; + left: 8px; + padding: 16px 32px; + top: 8px; + width: auto; + z-index: 100000; + } +} + +.list-reset { + list-style: none; + padding: 0; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-primary { + color: color(primary, 1); +} + +.has-top-divider { + @include divider(before); +} + +.has-bottom-divider { + @include divider(after); +} + +.m-0 { + margin: 0; +} + +.mt-0 { + margin-top: 0; +} + +.mr-0 { + margin-right: 0; +} + +.mb-0 { + margin-bottom: 0; +} + +.ml-0 { + margin-left: 0; +} + +.m-8 { + margin: 8px; +} + +.mt-8 { + margin-top: 8px; +} + +.mr-8 { + margin-right: 8px; +} + +.mb-8 { + margin-bottom: 8px; +} + +.ml-8 { + margin-left: 8px; +} + +.m-16 { + margin: 16px; +} + +.mt-16 { + margin-top: 16px; +} + +.mr-16 { + margin-right: 16px; +} + +.mb-16 { + margin-bottom: 16px; +} + +.ml-16 { + margin-left: 16px; +} + +.m-24 { + margin: 24px; +} + +.mt-24 { + margin-top: 24px; +} + +.mr-24 { + margin-right: 24px; +} + +.mb-24 { + margin-bottom: 24px; +} + +.ml-24 { + margin-left: 24px; +} + +.m-32 { + margin: 32px; +} + +.mt-32 { + margin-top: 32px; +} + +.mr-32 { + margin-right: 32px; +} + +.mb-32 { + margin-bottom: 32px; +} + +.ml-32 { + margin-left: 32px; +} + +.m-40 { + margin: 40px; +} + +.mt-40 { + margin-top: 40px; +} + +.mr-40 { + margin-right: 40px; +} + +.mb-40 { + margin-bottom: 40px; +} + +.ml-40 { + margin-left: 40px; +} + +.m-48 { + margin: 48px; +} + +.mt-48 { + margin-top: 48px; +} + +.mr-48 { + margin-right: 48px; +} + +.mb-48 { + margin-bottom: 48px; +} + +.ml-48 { + margin-left: 48px; +} + +.m-56 { + margin: 56px; +} + +.mt-56 { + margin-top: 56px; +} + +.mr-56 { + margin-right: 56px; +} + +.mb-56 { + margin-bottom: 56px; +} + +.ml-56 { + margin-left: 56px; +} + +.m-64 { + margin: 64px; +} + +.mt-64 { + margin-top: 64px; +} + +.mr-64 { + margin-right: 64px; +} + +.mb-64 { + margin-bottom: 64px; +} + +.ml-64 { + margin-left: 64px; +} + +.p-0 { + padding: 0; +} + +.pt-0 { + padding-top: 0; +} + +.pr-0 { + padding-right: 0; +} + +.pb-0 { + padding-bottom: 0; +} + +.pl-0 { + padding-left: 0; +} + +.p-8 { + padding: 8px; +} + +.pt-8 { + padding-top: 8px; +} + +.pr-8 { + padding-right: 8px; +} + +.pb-8 { + padding-bottom: 8px; +} + +.pl-8 { + padding-left: 8px; +} + +.p-16 { + padding: 16px; +} + +.pt-16 { + padding-top: 16px; +} + +.pr-16 { + padding-right: 16px; +} + +.pb-16 { + padding-bottom: 16px; +} + +.pl-16 { + padding-left: 16px; +} + +.p-24 { + padding: 24px; +} + +.pt-24 { + padding-top: 24px; +} + +.pr-24 { + padding-right: 24px; +} + +.pb-24 { + padding-bottom: 24px; +} + +.pl-24 { + padding-left: 24px; +} + +.p-32 { + padding: 32px; +} + +.pt-32 { + padding-top: 32px; +} + +.pr-32 { + padding-right: 32px; +} + +.pb-32 { + padding-bottom: 32px; +} + +.pl-32 { + padding-left: 32px; +} + +.p-40 { + padding: 40px; +} + +.pt-40 { + padding-top: 40px; +} + +.pr-40 { + padding-right: 40px; +} + +.pb-40 { + padding-bottom: 40px; +} + +.pl-40 { + padding-left: 40px; +} + +.p-48 { + padding: 48px; +} + +.pt-48 { + padding-top: 48px; +} + +.pr-48 { + padding-right: 48px; +} + +.pb-48 { + padding-bottom: 48px; +} + +.pl-48 { + padding-left: 48px; +} + +.p-56 { + padding: 56px; +} + +.pt-56 { + padding-top: 56px; +} + +.pr-56 { + padding-right: 56px; +} + +.pb-56 { + padding-bottom: 56px; +} + +.pl-56 { + padding-left: 56px; +} + +.p-64 { + padding: 64px; +} + +.pt-64 { + padding-top: 64px; +} + +.pr-64 { + padding-right: 64px; +} + +.pb-64 { + padding-bottom: 64px; +} + +.pl-64 { + padding-left: 64px; +} + +/* Reveal animations */ +.sr { + + .has-animations { + + .is-revealing { + visibility: hidden; + } + } +} + +.has-animations { + + .anime-element { + visibility: hidden; + + .anime-ready & { + visibility: visible; + } + } +} diff --git a/src/scss/base/_typography.scss b/src/scss/base/_typography.scss new file mode 100644 index 0000000..4fd860b --- /dev/null +++ b/src/scss/base/_typography.scss @@ -0,0 +1,252 @@ +html { + @include font-size(5, mobile, true, true); + @if ( get-font-size(5, desktop) != get-font-size(5, mobile) ) { + @include media( '>medium' ) { + @include font-size(5, desktop, true, true, true); + } + } +} + +body { + color: color(typography, 2); + font-size: 1rem; +} + +body, +button, +input, +select, +textarea { + @include font-family(base); +} + +a { + @include anchor-aspect(main); +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + clear: both; + color: color(typography, 1); + @if ( get-font-family(heading) != get-font-family(base) ) { + @include font-family(heading); + } + @include font-weight(semibold); +} + +h1, +.h1 { + @include font-size(1, mobile, true, true, true); + @if ( get-font-size(1, desktop) != get-font-size(1, mobile) ) { + @include media( '>medium' ) { + @include font-size(1, desktop, true, true, true); + } + } +} + +h2, +.h2 { + @include font-size(2, mobile, true, true, true); + @if ( get-font-size(2, desktop) != get-font-size(2, mobile) ) { + @include media( '>medium' ) { + @include font-size(2, desktop, true, true, true); + } + } +} + +h3, +.h3, +blockquote { + @include font-size(3, mobile, true, true, true); + @if ( get-font-size(3, desktop) != get-font-size(3, mobile) ) { + @include media( '>medium' ) { + @include font-size(3, desktop, true, true, true); + } + } +} + +h4, +h5, +h6, +.h4, +.h5, +.h6 { + @include font-size(4, mobile, true, true, true); + @if ( get-font-size(4, desktop) != get-font-size(4, mobile) ) { + @include media( '>medium' ) { + @include font-size(4, desktop, true, true, true); + } + } +} + +@include media( '<=medium' ) { + + .h1-mobile { + @include font-size(1, mobile, true, true, true); + } + + .h2-mobile { + @include font-size(2, mobile, true, true, true); + } + + .h3-mobile { + @include font-size(3, mobile, true, true, true); + } + + .h4-mobile, + .h5-mobile, + .h6-mobile { + @include font-size(4, mobile, true, true, true); + } +} + +.text-light { + color: color(typography, 2i); + + a { + color: color(typography, 2i); + } +} + +.text-light { + + h1, h2, h3, h4, h5, h6, + .h1, .h2, .h3, .h4, .h5, .h6 { + color: color(typography, 1i) !important; + } +} + +.text-sm { + @include font-size(6, mobile, true, true, true); + @if ( get-font-size(6, desktop) != get-font-size(6, mobile) ) { + @include media( '>medium' ) { + @include font-size(6, desktop, true, true, true); + } + } +} + +.text-xs { + @include font-size(7, mobile, true, true, true); + @if ( get-font-size(7, desktop) != get-font-size(7, mobile) ) { + @include media( '>medium' ) { + @include font-size(7, desktop, true, true, true); + } + } +} + +h1, h2, +.h1, .h2 { + margin-top: 48px; + margin-bottom: 16px; +} + +h3, +.h3 { + margin-top: 36px; + margin-bottom: 12px; +} + +h4, h5, h6, +.h4, .h5, .h6 { + margin-top: 24px; + margin-bottom: 4px; +} + +p { + margin-top: 0; + margin-bottom: 24px; +} + +dfn, cite, em, i { + font-style: italic; +} + +blockquote { + color: color(typography, 3); + font-style: italic; + margin-top: 24px; + margin-bottom: 24px; + margin-left: 24px; + + &::before { + content: "\201C"; + } + + &::after { + content: "\201D"; + } + + p { + display: inline; + } +} + +address { + color: color(typography, 2); + border-width: 1px 0; + border-style: solid; + border-color: color(bg, 3); + padding: 24px 0; + margin: 0 0 24px; +} + +pre, +pre h1, +pre h2, +pre h3, +pre h4, +pre h5, +pre h6, +pre .h1, +pre .h2, +pre .h3, +pre .h4, +pre .h5, +pre .h6 { + @include font-family(pre); +} + +pre, code, kbd, tt, var { + background: color(bg, 2); +} + +pre { + @include font-size(7, mobile, true, true); + margin-bottom: 1.6em; + max-width: 100%; + overflow: auto; + padding: 24px; + margin-top: 24px; + margin-bottom: 24px; +} + +code, kbd, tt, var { + @include font-family(code); + @include font-size(7, mobile, true); + padding: 2px 4px; +} + +abbr, acronym { + cursor: help; +} + +mark, ins { + text-decoration: none; +} + +small { + @include font-size(6, mobile, true, true, true); +} + +b, +strong { + @include font-weight(semibold); +} + +button, +input, +select, +textarea, +label { + @include font-size(5, mobile, true, true); +} diff --git a/src/scss/components/_buttons.scss b/src/scss/components/_buttons.scss new file mode 100644 index 0000000..c461be7 --- /dev/null +++ b/src/scss/components/_buttons.scss @@ -0,0 +1,67 @@ +.button { + display: inline-flex; + @include font-size(8, mobile, true, false, true); + @if ( get-font-size(8, desktop) != get-font-size(8, mobile) ) { + @include media( '>medium' ) { + @include font-size(8, desktop, true, false, true); + } + } + @include font-weight(semibold); + line-height: 16px; + text-decoration: none !important; + text-transform: uppercase; + background-color: color(bg, 3); + color: color(typography, 1) !important; + border: none; + border-radius: 2px; + cursor: pointer; + justify-content: center; + padding: 16px 32px; + height: 48px; + text-align: center; + white-space: nowrap; + + &:hover { + background: lighten(color(bg, 3), 1%); + } + + &:active { + outline: 0; + } + + &::before { + border-radius: 2px; + } +} + +.button-sm { + padding: 8px 24px; + height: 32px; +} + +.button-primary { + background: mix(color(primary, 1), color(primary, 2)); + background: linear-gradient(65deg, color(primary, 1) 0, color(primary, 2) 100%); + + &:hover { + background: lighten(mix(color(primary, 1), color(primary, 2)), 2%); + background: linear-gradient(65deg, lighten(color(primary, 1), 2%) 0, lighten(color(primary, 2), 2%) 100%); + } +} + +.button-block { + display: flex; +} + +.button-block { + display: flex; + width: 100%; +} + +@include media( '<=medium' ) { + + .button-wide-mobile { + width: 100%; + max-width: 280px; + } +} diff --git a/src/scss/components/_forms.scss b/src/scss/components/_forms.scss new file mode 100644 index 0000000..e20ef63 --- /dev/null +++ b/src/scss/components/_forms.scss @@ -0,0 +1,101 @@ +.input, +.textarea { + background-color: color(typography, 1); + border-width: 1px; + border-style: solid; + border-color: color(bg, 3); + border-radius: 2px; + color: color(typography, 2); + max-width: 100%; + width: 100%; + + &::placeholder { + color: color(typography, 3); + } + + &::-ms-input-placeholder { + color: color(typography, 3); + } + + &:-ms-input-placeholder { + color: color(typography, 3); + } + + &:hover { + border-color: darken(color(bg, 3), 5%); + } + + &:active, + &:focus { + outline: none; + border-color: color(bg, 3); + } + + &[disabled] { + cursor: not-allowed; + background-color: color(bg, 2); + border-color: color(bg, 2); + } +} + +.input { + -moz-appearance: none; + -webkit-appearance: none; + @include font-size(7, mobile, true, false, true); + @if ( get-font-size(7, desktop) != get-font-size(7, mobile) ) { + @include media( '>medium' ) { + @include font-size(7, desktop, true, false, true); + } + } + line-height: 20px; + padding: 13px 16px; + height: 48px; + box-shadow: none; + + .inline-input { + display: inline; + width: auto; + } +} + +.textarea { + display: block; + min-width: 100%; + resize: vertical; + + .inline-textarea { + display: inline; + width: auto; + } +} + +.field-grouped { + + > .control { + + &:not(:last-child) { + margin-bottom: 8px; + } + } +} + +@include media( '>medium' ) { + + .field-grouped { + display: flex; + + > .control { + flex-shrink: 0; + + &.control-expanded { + flex-grow: 1; + flex-shrink: 1; + } + + &:not(:last-child) { + margin-bottom: 0; + margin-right: 8px; + } + } + } +} diff --git a/src/scss/layout/_cta.scss b/src/scss/layout/_cta.scss new file mode 100644 index 0000000..6e316fc --- /dev/null +++ b/src/scss/layout/_cta.scss @@ -0,0 +1,54 @@ +.cta { + text-align: center; + + .section-inner { + padding: 48px 16px; + } + + .section-title { + margin-bottom: 40px; + } +} + +.cta-inner { + position: relative; + background: color(bg, 1); + overflow: hidden; + + &::before { + content: ''; + position: absolute; + right: 98px; + top: -117px; + width: 160px; + height: 187px; + background-image: url('../images/cta-illustration.svg'); + background-repeat: no-repeat; + } + + > * { + position: relative; /* To display elements above hero illustrations */ + } +} + +@include media( '>medium') { + + .cta { + text-align: left; + + .section-inner { + padding: 64px 32px; + } + + .section-title { + margin-bottom: 0; + padding-right: 24px; + } + } + + .cta-inner { + display: flex; + align-items: center; + justify-content: space-between; + } +} diff --git a/src/scss/layout/_features.scss b/src/scss/layout/_features.scss new file mode 100644 index 0000000..b969527 --- /dev/null +++ b/src/scss/layout/_features.scss @@ -0,0 +1,49 @@ +.features-wrap { + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + margin-right: -32px; + margin-left: -32px; + + &:first-of-type { + margin-top: -16px; + } + + &:last-of-type { + margin-bottom: -16px; + } +} + +.feature { + padding: 16px 32px; + width: 380px; + max-width: 380px; + flex-grow: 1; +} + +.feature-inner { + height: 100%; +} + +.feature-icon { + display: flex; + justify-content: center; +} + +@include media( '>medium' ) { + + .features-wrap { + + &:first-of-type { + margin-top: -24px; + } + + &:last-of-type { + margin-bottom: -24px; + } + } + + .feature { + padding: 32px 32px; + } +} diff --git a/src/scss/layout/_footer.scss b/src/scss/layout/_footer.scss new file mode 100644 index 0000000..89200a6 --- /dev/null +++ b/src/scss/layout/_footer.scss @@ -0,0 +1,96 @@ +.site-footer { + @include font-size(8, mobile, true, true, true); + @if ( get-font-size(8, desktop) != get-font-size(8, mobile) ) { + @include media( '>medium' ) { + @include font-size(8, desktop, true, true, true); + } + } + + a { + @include anchor-aspect(footer); + } +} + +.site-footer-inner { + position: relative; /* To display all elements above the background color */ + display: flex; + flex-wrap: wrap; + padding-top: 48px; + padding-bottom: 48px; +} + +.footer-brand, +.footer-links, +.footer-social-links, +.footer-copyright { + flex: none; + width: 100%; + display: inline-flex; + justify-content: center; +} + +.footer-brand, +.footer-links, +.footer-social-links { + margin-bottom: 24px; +} + +.footer-social-links { + + li { + display: inline-flex; + + + li { + margin-left: 16px; + } + + a { + padding: 8px; + } + } +} + +.footer-links { + + li { + + + li { + margin-left: 24px; + } + } +} + +@include media( '>medium' ) { + + .site-footer { + margin-top: 20px; + } + + .site-footer-inner { + justify-content: space-between; + padding-top: 64px; + padding-bottom: 64px; + } + + .footer-brand, + .footer-links, + .footer-social-links, + .footer-copyright { + flex: 50%; + } + + .footer-brand, + .footer-copyright { + justify-content: flex-start; + } + + .footer-links, + .footer-social-links { + justify-content: flex-end; + } + + .footer-links { + order: 1; + margin-bottom: 0; + } +} diff --git a/src/scss/layout/_header.scss b/src/scss/layout/_header.scss new file mode 100644 index 0000000..fb744ac --- /dev/null +++ b/src/scss/layout/_header.scss @@ -0,0 +1,53 @@ +.site-header { + padding: 24px 0; +} + +.site-header-inner { + position: relative; /* To display all elements above the background color */ + display: flex; + justify-content: space-between; + align-items: center; +} + +.header-links { + display: inline-flex; + + li { + display: inline-flex; + } + + a:not(.button) { + @include font-size(7, mobile, true, true, true); + @if ( get-font-size(7, desktop) != get-font-size(7, mobile) ) { + @include media( '>medium' ) { + @include font-size(7, desktop, true, true, true); + } + } + @include font-weight(semibold); + @include anchor-aspect(header); + line-height: 16px; + padding: 8px 24px; + } +} + +@include media( '>medium' ) { + + .site-header { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 700px; + background: color(bg, 3); + background: linear-gradient(80deg, rgba(color(bg, 3), .5) 0%, rgba(color(bg, 3), 0) 100%); + -webkit-transform-origin: 0; + transform-origin: 0; + -webkit-transform: skewY(-12deg); + transform: skewY(-12deg); + } + } +} diff --git a/src/scss/layout/_hero.scss b/src/scss/layout/_hero.scss new file mode 100644 index 0000000..7e6cdfd --- /dev/null +++ b/src/scss/layout/_hero.scss @@ -0,0 +1,269 @@ +.hero { + text-align: center; + padding-top: 48px; + padding-bottom: 88px; +} + +.hero-copy { + position: relative; /* To display elements above hero illustrations */ + z-index: 1; +} + +.hero-cta { + margin-bottom: 40px; +} + +.hero-figure { + position: relative; + + svg { + width: 100%; + height: auto; + } + + &::before, + &::after { + content: ''; + position: absolute; + background-repeat: no-repeat; + background-size: 100%; + + .has-animations & { + opacity: 0; + transition: opacity 2s ease; + + .anime-ready & { + opacity: 1; + } + } + } + + &::before { + top: -57.8%; + left: -1.3%; + width: 152.84%; + height: 178.78%; + background-image: url('../images/hero-back-illustration.svg'); + } + + &::after { + top: -35.6%; + left: 99.6%; + width: 57.2%; + height: 87.88%; + background-image: url('../images/hero-top-illustration.svg'); + } +} + +.hero-figure-box { + position: absolute; + top: 0; + will-change: transform; +} + +.hero-figure-box-01, +.hero-figure-box-02, +.hero-figure-box-03, +.hero-figure-box-04, +.hero-figure-box-08, +.hero-figure-box-09 { + overflow: hidden; + + &::before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + transform-origin: 100% 100%; + } +} + +.hero-figure-box-01 { + left: 103.2%; + top: 41.9%; + width: 28.03%; + height: 37.37%; + background: linear-gradient(to left top, #00BFFB, rgba(#00BFFB, 0)); + transform: rotateZ(45deg); + + &::before { + background: linear-gradient(to left, color(bg, 1) 0%, rgba(color(bg, 1), 0) 60%); + transform: rotateZ(45deg) scale(1.5); + } +} + +.hero-figure-box-02 { + left: 61.3%; + top: 64.1%; + width: 37.87%; + height: 50.50%; + background: linear-gradient(to left top, color(primary, 1), rgba(color(primary, 1), 0)); + transform: rotateZ(-45deg); + + &::before { + background: linear-gradient(to top, color(bg, 1) 0%, rgba(color(bg, 1), 0) 60%); + transform: rotateZ(-45deg) scale(1.5); + } +} + +.hero-figure-box-03 { + left: 87.7%; + top: -56.8%; + width: 56.81%; + height: 75.75%; + background: linear-gradient(to left top, #00BFFB, rgba(#00BFFB, 0)); + + &::before { + background: linear-gradient(to left, color(bg, 1) 0%, rgba(color(bg, 1), 0) 60%); + transform: rotateZ(45deg) scale(1.5); + } +} + +.hero-figure-box-04 { + left: 54.9%; + top: -8%; + width: 45.45%; + height: 60.60%; + background: linear-gradient(to left top, color(primary, 1), rgba(color(primary, 1), 0)); + transform: rotateZ(-135deg); + + &::before { + background: linear-gradient(to top, rgba(color(typography, 1), .24) 0%, rgba(color(typography, 1), 0) 60%); + transform: rotateZ(-45deg) scale(1.5); + } +} + +.hero-figure-box-05, +.hero-figure-box-06, +.hero-figure-box-07 { + background-color: color(bg, 3); + box-shadow: -20px 32px 64px rgba(#000, .25); +} + +.hero-figure-box-05 { + left: 17.4%; + top: 13.3%; + width: 64%; + height: 73.7%; + transform: perspective(500px) rotateY(-15deg) rotateX(8deg) rotateZ(-1deg); +} + +.hero-figure-box-06 { + left: 65.5%; + top: 6.3%; + width: 30.3%; + height: 40.4%; + transform: rotateZ(20deg); +} + +.hero-figure-box-07 { + left: 1.9%; + top: 42.4%; + width: 12.12%; + height: 16.16%; + transform: rotateZ(20deg); +} + +.hero-figure-box-08 { + left: 27.1%; + top: 81.6%; + width: 19.51%; + height: 26.01%; + background: color(primary, 1); + transform: rotateZ(-22deg); + + &::before { + background: linear-gradient(to left, rgba(color(typography, 1), 0) 0%, rgba(color(typography, 1), .48) 100%); + transform: rotateZ(45deg) scale(1.5); + } +} + +.hero-figure-box-09 { + left: 42.6%; + top: -17.9%; + width: 6.63%; + height: 8.83%; + background: #00BFFB; + transform: rotateZ(-52deg); + + &::before { + background: linear-gradient(to left, rgba(color(typography, 1), 0) 0%, rgba(color(typography, 1), .64) 100%); + transform: rotateZ(45deg) scale(1.5); + } +} + +.hero-figure-box-10 { + left: -3.8%; + top: 4.3%; + width: 3.03%; + height: 4.04%; + background: rgba(#00BFFB, .32); + transform: rotateZ(-50deg); +} + +@include media( '<=medium' ) { + + .hero-cta { + max-width: 280px; + margin-left: auto; + margin-right: auto; + + .button { + display: flex; + + + .button { + margin-top: 16px; + } + } + } + + .hero-figure::after, + .hero-figure-box-03, + .hero-figure-box-04, + .hero-figure-box-09 { + display: none; + } +} + +@include media( '>medium' ) { + + .hero { + text-align: left; + padding-top: 64px; + padding-bottom: 88px; + } + + .hero-inner { + /* Split hero in two half */ + display: flex; + justify-content: space-between; + align-items: center; + } + + .hero-copy { + padding-right: 64px; + min-width: 552px; + width: 552px; + } + + .hero-cta { + margin: 0; + + .button { + min-width: 170px; + + &:first-child { + margin-right: 16px; + } + } + } + + .hero-figure { + + svg { + width: auto; + } + } +} diff --git a/src/scss/layout/_main.scss b/src/scss/layout/_main.scss new file mode 100644 index 0000000..7a0961a --- /dev/null +++ b/src/scss/layout/_main.scss @@ -0,0 +1,37 @@ +.is-boxed { + background: color(bg, 3); +} + +.body-wrap { + background: color(bg, 2); + overflow: hidden; + /* Sticky footer */ + display: flex; + flex-direction: column; + min-height: 100vh; +} + +.boxed-container { + max-width: 1440px; + margin: 0 auto; + @include shadow; + mix-blend-mode: normal; +} + +main { + flex: 1 0 auto; +} + +.section-inner { + position: relative; /* To always display inner elements above pseudo decorative stuff */ + padding-top: 48px; + padding-bottom: 48px; +} + +@include media( '>medium' ) { + + .section-inner { + padding-top: 88px; + padding-bottom: 88px; + } +} diff --git a/src/scss/layout/_pricing.scss b/src/scss/layout/_pricing.scss new file mode 100644 index 0000000..eedb3ea --- /dev/null +++ b/src/scss/layout/_pricing.scss @@ -0,0 +1,125 @@ +.pricing-header { + margin-bottom: 48px; +} + +.pricing-tables-wrap { + display: flex; + flex-wrap: wrap; + justify-content: center; + margin-right: -12px; + margin-left: -12px; + + &:first-child { + margin-top: -12px; + } + + &:last-child { + margin-bottom: -12px; + } +} + +.pricing-table { + position: relative; + padding: 12px; + width: 368px; + max-width: 368px; + flex-grow: 1; + + &::before { + content: ''; + position: absolute; + left: 50%; + width: 200%; + max-width: 200%; + height: 435px; + background-repeat: no-repeat; + background-position: center; + background-size: 100%; + bottom: 18.8%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + background-image: url('../images/pricing-illustration.svg'); + } +} + +.pricing-table-header, +.pricing-table-features-title, +.pricing-table-features li { + border-bottom: 1px solid rgba(color(typography, 2), .24); +} + +.pricing-table-inner { + position: relative; + display: flex; + flex-wrap: wrap; + background: color(bg, 4); + padding: 24px; + height: 100%; + + > * { + position: relative; /* To display all elements above the box with shadow */ + width: 100%; + } + + &::before { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + @include shadow; + } +} + +.pricing-table-price { + @if ( get-font-family(heading) != get-font-family(base) ) { + @include font-family(heading); + } +} + +.pricing-table-price-currency { + color: color(typography, 2); +} + +.pricing-table-features-title { + color: color(typography, 1); + @include font-weight(bold); +} + +.pricing-table-features { + + li { + display: flex; + align-items: center; + padding: 14px 0; + + &::before { + content: ''; + width: 16px; + height: 12px; + margin-right: 16px; + background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUuNiA2LjRMMS42IDQgMCA1LjYgNS42IDEyIDE2IDEuNiAxNC40IDB6IiBmaWxsPSIjMDJDQkIxIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=); + background-repeat: no-repeat; + } + } +} + +.pricing-table-cta { + align-self: flex-end; +} + +@include media( '>medium' ) { + + .pricing { + + .section-paragraph { + padding-left: 90px; + padding-right: 90px; + } + } + + .pricing-header { + margin-bottom: 52px; + } +} diff --git a/src/scss/style.scss b/src/scss/style.scss new file mode 100644 index 0000000..6060307 --- /dev/null +++ b/src/scss/style.scss @@ -0,0 +1,74 @@ +/*-------------------------------------------------------------- +# Variables, functions and mixins +--------------------------------------------------------------*/ +@import "abstracts/variables", + "abstracts/functions", + "abstracts/mixins", + 'abstracts/include-media'; + +/*-------------------------------------------------------------- +1.0 Normalize + * normalize.css v7.0.0 | MIT License + * github.com/necolas/normalize.css +--------------------------------------------------------------*/ +@import "normalize"; + +/*-------------------------------------------------------------- +# Base +--------------------------------------------------------------*/ +@import "base/base"; + +/*-------------------------------------------------------------- +# Typography +--------------------------------------------------------------*/ +@import "base/typography"; + +/*-------------------------------------------------------------- +# Helpers +--------------------------------------------------------------*/ +@import "base/helpers"; + +/*-------------------------------------------------------------- +# Forms +--------------------------------------------------------------*/ +@import "components/forms"; + +/*-------------------------------------------------------------- +# Buttons +--------------------------------------------------------------*/ +@import "components/buttons"; + +/*-------------------------------------------------------------- +# Header +--------------------------------------------------------------*/ +@import "layout/header"; + +/*-------------------------------------------------------------- +# Hero +--------------------------------------------------------------*/ +@import "layout/hero"; + +/*-------------------------------------------------------------- +# Features +--------------------------------------------------------------*/ +@import "layout/features"; + +/*-------------------------------------------------------------- +# Pricing +--------------------------------------------------------------*/ +@import "layout/pricing"; + +/*-------------------------------------------------------------- +# CTA +--------------------------------------------------------------*/ +@import "layout/cta"; + +/*-------------------------------------------------------------- +# Site content +--------------------------------------------------------------*/ +@import "layout/main"; + +/*-------------------------------------------------------------- +# Footer +--------------------------------------------------------------*/ +@import "layout/footer";