diff --git a/atoms/LICENSE b/atoms/LICENSE new file mode 100644 index 0000000..e587591 --- /dev/null +++ b/atoms/LICENSE @@ -0,0 +1,621 @@ + 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 \ No newline at end of file diff --git a/atoms/README.md b/atoms/README.md new file mode 100644 index 0000000..7724cf9 --- /dev/null +++ b/atoms/README.md @@ -0,0 +1,8 @@ +# Atoms +Atoms is a web app that displays atoms and simple bonding in a cute and fun way + +A live demo is available at: http://atoms.cf + +# License +GNU GPL V3 +See LICENSE for more details. diff --git a/atoms/index.css b/atoms/index.css new file mode 100644 index 0000000..e8842d7 --- /dev/null +++ b/atoms/index.css @@ -0,0 +1,495 @@ +@import url(https://fonts.googleapis.com/css?family=Oswald); + +/* Let's get this party started */ +::-webkit-scrollbar { + width: 12px; +} + +/* Track */ +::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); + -webkit-border-radius: 5px; + border-radius: 5px; +} + +/* Handle */ +::-webkit-scrollbar-thumb { + -webkit-border-radius: 5px; + border-radius: 5px; + background: rgba(0,0,0,0.7); + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5); +} +::-webkit-scrollbar-thumb:window-inactive { + background: rgba(0,0,0,0.4); +} + +html { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +body { + background-image: url("./resources/static/light.png"); + overflow: hidden; + font-family: Oswald; + font-size: 100%; + margin: 0; + cursor: default; + + -webkit-transition: background-image ease-in 0.5s; + -moz-transition: background-image ease-in 0.5s; + -ms-transition: background-image ease-in 0.5s; + transition: background-image ease-in 0.5s; +} + +p { + margin-bottom: 1%; +} + +input { + font-family: Oswald; +} + +.periodictable { + color: #000; + width:50px; + height: 65px; + padding:0; + margin:0; + text-align: center; + -webkit-transition: box-shadow 0.3s ease; + -moz-transition: box-shadow 0.3s ease; + -ms-transition: box-shadow 0.3s ease; + transition: box-shadow 0.3s ease; +} + +.atom:hover { + box-shadow:inset 0 0 0 99999px rgba(0,0,0,0.2); +} + +.atomvalue { + font-size: 65%; + margin: 0; + padding: 0; +} + +.oxid { + margin: 0; + display: inline-block; +} + +.oxidStat { + margin-top: 0; + display: inline-block; +} + +.oxid:first-letter { + font-size: 175% !important; +} + +.common { + -webkit-filter: drop-shadow(4px 4px 3px #010); + filter: drop-shadow(4px 4px 3px #010); +} + +img { + -webkit-filter: drop-shadow(4px 4px 3px #444); + filter: drop-shadow(4px 4px 3px #444); +} + +.desc { + font-size:110%; + display: inline-block; + margin-right: 3%; + margin-top: 0; + height:10%; +} + +.setting { + display: flex; + position: relative; + height:100%; + width:100%; + margin-left: 4%; + margin-bottom: 10%; +} + +.option { + position: relative; + display: inline-block; + font-size: 130%; + margin-top : -2%; +} + +.selection { + margin-top: -5%; + padding: 4px; + box-shadow:inset 0 0 0 99999px rgba(0,0,0,0.2); + margin-top: 0; + + -webkit-transition: box-shadow 0.3s ease, color 0.7s ease; + -moz-transition: box-shadow 0.3s ease, color 0.7s ease; + -ms-transition: box-shadow 0.3s ease, color 0.7s ease; + transition: box-shadow 0.3s ease, color 0.7s ease; +} + +.selection:hover { + cursor: pointer; + box-shadow: inset 0 0 0 99999px rgba(0,0,0,0.1); +} + +.dropdown { + display: none; + opacity: 0; + position: absolute; + box-shadow: 4px 4px 3px #444; + z-index: 50; + + -webkit-transition: opacity 0.3s ease; + -moz-transition: opacity 0.3s ease; + -ms-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} + +.dropdown p { + color: black; + margin:0; + background-color:#fff; + padding: 12px 16px; + text-decoration: none; + display: block; + + -webkit-transition: background-color 0.3s ease, opacity 0.3s ease; + -moz-transition: background-color 0.3s ease, opacity 0.3s ease; + -ms-transition: background-color 0.3s ease, opacity 0.3s ease; + transition: background-color 0.3s ease, opacity 0.3s ease; +} + +.dropdown p:hover { + background-color:#CECDCD; +} + +.tDesc { + padding: 0; + margin: 0; + text-align: center; + font-size: 150%; +} + +.pulltab { + position: fixed; + margin-left: -6%; + padding: 0.5%; + width: 6.2%; + height: 4%; + background-color: #b3daff; + box-shadow: 2px 2px 5px 3px #333; + cursor: pointer; + + -webkit-transition: transform 0.2s ease, margin 0.3s ease, color 0.4s ease; + -moz-transition: transform 0.2s ease, margin 0.3s ease, color 0.4s ease; + -ms-transition: transform 0.2s ease, margin 0.3s ease ,color 0.4s ease; + transition: transform 0.2s ease, margin 0.3s ease, color 0.4s ease; +} + +.pulltab:hover { + margin-left: 0%; +} + +.first { + margin-top:5%; + +} +.second { + margin-top: 12%; +} + +.third { + margin-top: 19%; +} + +.sidebar { + position: absolute; + background-color: #e6f5ff; + min-height: 100%; + padding: 15px 20px 15px 15px; + box-shadow: 2px 2px 5px 3px #333; + z-index:5; + overflow-x: hidden; + overflow-y: auto; + + -webkit-transition: margin 0.5s ease, background-color 0.5s ease; + -moz-transition: margin 0.5s ease, background-color 0.5s ease; + -ms-transition: margin 0.5s ease, background-color 0.5s ease; + transition: margin 0.5s ease, background-color 0.5s ease; +} + +.elements { + margin-left: -150%; + height:100%; + padding-right: 10px; +} + +.settings { + margin-left: -40%; + width: 20%; +} + +.tools { + margin-left: -170%; + height: 100%; + width: 90%; +} + +.atom { + cursor: pointer; +} + +.fa { + float: right; + font-size: 250% !important; + color: #585858; + margin: 0 1% 3% 1%; + cursor: pointer; + + -webkit-transition: color 0.5s ease; + -moz-transition: color 0.5s ease; + -ms-transition: color 0.5s ease; + transition: color 0.5s ease; +} + +.fa:hover { + color: #FF746B; +} + +.tabletitle { + text-align: center; +} + +.key { + margin-left: 18%; + margin-bottom: -20%; + margin-top: 15%; +} + +.keycolor { + width: 20px; + height: 25px; +} + +.keyvalue { + line-height: 1em; + height: 5%; + padding-right: 2.5%; + text-align: left; +} + +#keylegend { + position: absolute; + top: 16%; +} + +.legendholder { + position:absolute; + top: 16%; + left: 35%; + z-index: -1; +} + +.legend { + border-collapse: collapse; + max-width: 55%; +} + +.legendcell { + width: 2px; + height: 25px !important; +} + +.legendrangeval { + display: flex; +} + +.minlegend { + position: relative; + right:3%; + bottom:10; +} + +.maxlegend { + position: relative; + left: 43%; + bottom:50; +} + +.normal { + border: 1px hidden; + margin: 3%; +} +.extension { + border: 1px hidden; + margin-top:3%; + margin-left: 10%; +} + +.infoBox { + margin-bottom: 5%; + display: flex; + cursor: text; + -webkit-touch-callout: text; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.preview { + margin: 3%; +} + +.info1, .info2 { + margin: 3%; +} +.info1 { + width: 25%; +} + +.info2 { + width: 33%; +} + +.sh { + margin-top: 32%; + text-align:center; + font-size:300%; + color:#fff; + text-shadow: 4px 4px 5px #444; +} + +.help { + padding: 1px 1px 5px 2px; + margin-right: 3%; + text-align:center; + width: 20px; + height: 20px; + box-shadow:inset 0 0 0 99999px rgba(0,0,0,0.2); + + -webkit-transition: box-shadow 0.3s ease; + -moz-transition: box-shadow 0.3s ease; + -ms-transition: box-shadow 0.3s ease; + transition: box-shadow 0.3s ease; +} + +.help:hover { + box-shadow: inset 0 0 0 99999px rgba(0,0,0,0.1); +} + +.helptab { + position:absolute; + display: none; + opacity: 0; + top: 80%; + margin-left: -8%; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-bottom: 17px solid #fefefe; + + -webkit-filter: drop-shadow(4px 0px 3px #444); + filter: drop-shadow(4px 0px 3px #444); + + -webkit-transition: opacity 0.3s ease; + -moz-transition: opacity 0.3s ease; + -ms-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} + +.helptext { + position:absolute; + display: none; + opacity: 0; + border-radius: 7px; + top: 102%; + margin-left: -12%; + padding: 5px; + font-size: 90%; + color: #000; + background-color: #fefefe; + box-shadow: 4px 4px 3px #444; + z-index:60; + + -webkit-transition: opacity 0.3s ease; + -moz-transition: opacity 0.3s ease; + -ms-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} + +.about { + position: absolute; + bottom: 3%; + max-width: 70%; + margin-left: 3.5%; + font-size: 110%; +} + +.github { + font-size: 120%; + color: #23527C; + text-decoration: none; + + -webkit-transition: color 0.3s ease; + -moz-transition: color 0.3s ease; + -ms-transition: color 0.3s ease; + transition: color 0.3s ease; + +} +.github:hover { + text-decoration: none; + color: #69CBE4; +} + +.realAtom { + cursor: pointer; +} + +.eye { + -webkit-animation: updown 1.3s infinite alternate ease; + animation: updown 1.3s infinite alternate ease; +} + +#balancebutton { + width: 10%; + font-size: 175%; + margin-right: 3%; + padding: .5%; + text-align:center; + box-shadow:inset 0 0 0 99999px rgba(0,0,0,0.2); + + -webkit-transition: box-shadow 0.3s ease; + -moz-transition: box-shadow 0.3s ease; + -ms-transition: box-shadow 0.3s ease; + transition: box-shadow 0.3s ease; +} + +#balancebutton:hover { + box-shadow: inset 0 0 0 99999px rgba(0,0,0,0.1); +} + +.balanceout { + text-align: center; + width: 15%; + height: 4%; + font-size: 110%; +} + +@-webkit-keyframes updown { + 0% { transform: translateY(0px); } + 100% { transform: translateY(-4px); } +} + +@keyframes updown { + 0% { transform: translateY(0px); } + 100% { transform: translateY(-4px); } +} \ No newline at end of file diff --git a/atoms/index.html b/atoms/index.html new file mode 100644 index 0000000..454ef02 --- /dev/null +++ b/atoms/index.html @@ -0,0 +1,132 @@ + + + + + Atoms + + + + + + +

Elements

+ + +

Tools

+ + +

Settings

+ + +
+ + + + + + + + + + \ No newline at end of file diff --git a/atoms/js/atom.js b/atoms/js/atom.js new file mode 100644 index 0000000..39d54fd --- /dev/null +++ b/atoms/js/atom.js @@ -0,0 +1,265 @@ +function tableDesc() { + var p = ["element","atomRadi","moleWeig","ioniEner","elecAffi","elecNega","phase","density","melting","boiling", + "oxidStat","elecConf"]; + var unit = [""," pm"," g/mol", " kJ/mol"," kJ/mol", " eV", "", " g/mL", "",""]; + var prefix = ["Element Name: ", "Atomic Radius: ", "Molecular Mass: ", "Ionization Energy: ", "Electron Affinity: ", + "Electronegativity: ", "Phase/State: ", "Density: ", "Melting Point: ", "Boiling Point: ", + "Oxidation State(s): ", "Electron Configuration: "]; + var states = {"g":"Gas","l":"Liquid","s":"Solid","Unknown":"Unknown"}; + + // Setting up divs for organization + var infoBox = document.createElement("div"); + infoBox.className = "infoBox"; + + get("elements").appendChild(infoBox); + var div = document.createElement("div"); + div.className = "info1"; + get("infoBox").appendChild(div); + var div2 = document.createElement("div"); + div2.className = "info2"; + get("infoBox").appendChild(div2); + + for(var i = 0;i < p.length; i++) { // For all possible data types + elem = document.createElement("p"); + elem.className = "eDesc " + p[i]; + if(i <= 5) { + get("info1").appendChild(elem); + } else { + get("info2").appendChild(elem); + } + } + get("info2").appendChild(document.createElement("br")); + + box = document.createElement("div"); + box.className = "preview"; + get("infoBox").appendChild(box); + + var trans1 = get("periodictable")[92]; + var trans2 = get("periodictable")[110]; + + trans1.style.backgroundColor = "#41484D"; + trans2.style.backgroundColor = "#41484D"; + trans1.appendChild(document.createTextNode("57 - 71")); + trans2.appendChild(document.createTextNode("89 - 103")); + trans1.style.fontSize = "90%"; + trans2.style.fontSize = "90%"; + + // Creates 'reactivity' for each cell + for(var i = 0;i < elementCount;i++) { + var cell = get("td")[info["location"][i]]; // Gets location of each atom in order + + cell.onclick = function() { + lastElement = this; + var index = parseInt(this.childNodes[0].childNodes[0].nodeValue-1); + for(var i = 0;i < p.length; i++) { // Loop through all data types to be displayed + if(i == 8 || i == 9) { // If data type is melting or boiling + if(info[p[i]][settings["unit"]][index] !== null) { + // Get prefix ex. Melting: + actual value + unit + if(settings["unit"] != "K") { + changeText(p[i],prefix[i] + info[p[i]][settings["unit"]][index] + "° " + settings["unit"]); + } else { + changeText(p[i],prefix[i] + info[p[i]][settings["unit"]][index] + " " + settings["unit"]); + } + } else { // If null + changeText(p[i],prefix[i] + "Unknown"); // Make unknown + } + } else { + if(info[p[i]][index] != null) { // If data type value isn't null + if(i == 6) { // If data type is phase/state + // Get prefix + value reference ex. 'g' -> 'Gas' + unit + changeText(p[i],prefix[i] + states[info[p[i]][index]] + unit[i]); + } else if(i == 10) { // If data type is oxidation states + var para = get("oxidStat"); + + // Remove all childs in oxidation state div + while (para.firstChild) { + para.removeChild(para.firstChild); + } + + var allStates = info[p[i]][index]; + var para1 = document.createElement("span"); + para1.appendChild(document.createTextNode(prefix[i])); + para.appendChild(para1); + + for(var j = 0;j < allStates.length; j++) { // For all states in array + oxidStat = allStates[j]; + if(j == 6) { // Add new line to prevent overflow + para.appendChild(document.createElement("br")) + } + if(allStates[j].includes("b")) { // If value has b, make value different + oxidStat = allStates[j].substring(1); + var par = document.createElement("p"); + par.appendChild(document.createTextNode(oxidStat)); + par.className = "oxid common"; + para.appendChild(par); + var par = document.createElement("span"); // Spans use inline block + par.className = "comma" + par.appendChild(document.createTextNode(", ")) + para.appendChild(par); + } else { + var pa = document.createElement("p"); + pa.appendChild(document.createTextNode(oxidStat)); + pa.className = "oxid"; + para.appendChild(pa); + pa = document.createElement("span"); // Spans use inline block + pa.className = "comma" + pa.appendChild(document.createTextNode(", ")) + para.appendChild(pa); + } + } + para.removeChild(para.lastChild); // Remove last comma + } else if(i == 11) { // If data type is electron configuration + var para = get("elecConf"); + + // Remove all childs in electron configuration div + while (para.firstChild) { + para.removeChild(para.firstChild); + } + + var elecConf = info[p[i]][index].split("."); // Ex. ["1s", "2", "2s", "2"] + para.appendChild(document.createTextNode(prefix[i])); + + if(settings["elecConf"] == "abr") { + // Add 2 to get to next non superscript and subtract one to prevent undefined + for(var j = 0;j < elecConf.length-1; j+=2) { + para.appendChild(document.createTextNode(elecConf[j])); // Append electron level + // Append value for level in superscript + var sup = document.createElement("sup"); + sup.appendChild(document.createTextNode(elecConf[j+1])); + para.appendChild(sup); + } + + } else if(settings["elecConf"] == "norm") { + while(elecConf[0].includes("[")) { // Ex: [Xe]5s2 + // Get ex. [Xe] configuration + otherConf = info[p[i]][info["shorthand"].indexOf(elecConf[0].substring(1,3))].split("."); + elecConf[0] = elecConf[0].substring(4); // [Xe]5s2 = 5s2 + for(var j = otherConf.length-1; j >= 0; j--) { + // Put configuration of abbreviation in front of last configuration + elecConf.unshift(otherConf[j]); + } + } + + // Add 2 to get to next non superscript and subtract one to prevent undefined + for(var j = 0;j < elecConf.length-1; j+=2) { + if(j == 20) { // Add new line to prevent overflow + para.appendChild(document.createElement("br")) + } + para.appendChild(document.createTextNode(elecConf[j])); // Append electron level + var sup = document.createElement("sup"); + // Append value for level in superscript + sup.appendChild(document.createTextNode(elecConf[j+1])); + para.appendChild(sup); + } + } + } else { // If not special data type + changeText(p[i],prefix[i] + info[p[i]][index] + unit[i]); + } + + } else { // If null + changeText(p[i],prefix[i] + "Unknown"); + } + } + } // Remove all childs in preview, then get new atom div + try { + get("preview").removeChild(get("preview").firstChild); + } catch(err){} + get("preview").appendChild(getAtomDOM(index,window.innerHeight/3.8)); + + } + } +} + +function changeText(dom,text) { + var dom = get(dom); + // Remove all childs in div + while (dom.firstChild) { + dom.removeChild(dom.firstChild); + } + + dom.appendChild(document.createTextNode(" ")); + dom.childNodes[0].nodeValue = text; +} + +function getAtomDOM(atomNum, size) { + var holder = document.createElement("div"); + holder.style.position = "relative"; + holder.style.height = size; + holder.style.width = size; + holder.className = "realAtom"; + + var atom = document.createElement("img"); + atom.ondragstart = function(){return false;} // Disables image dragging + atom.src = "./resources/reactive/Ring" + info["valeElec"][atomNum] + ".gif"; + atom.style.height = size; + atom.style.width = size; + atom.style.position = "absolute"; + atom.style.top = "0"; + atom.style.left = "0"; + + var circle = document.createElement("div"); + circle.className = "innerAtom"; + circle.style.borderRadius = "50%"; // Creates circle + circle.style.height = size*0.85; + circle.style.width = size*0.85; + circle.style.margin = "0 auto"; + circle.style.position = "absolute"; + circle.style.top = size*0.075; + circle.style.left = size*0.075; + var bgColor = getColor(settings["displayTheme"],atomNum); + circle.style.backgroundColor = bgColor; + circle.style.boxShadow = "inset 0 0 0 15px " + changeColor(bgColor,20) + ", inset 0 0 10px 30px " + changeColor(bgColor,-20) + ", 1px 4px 16px 6px #444"; + + var eyes = document.createElement("div"); + eyes.style.display = "flex"; + eyes.style.position = "absolute"; + var eyesWidth = size*0.17; + var eyesHeight = size*0.15; + eyes.style.top = size*0.425 - eyesHeight/2; + eyes.style.left = size*0.67 - eyesWidth/2; + var eye = document.createElement("div"); + eye.style.backgroundColor = changeColor(bgColor,-20); + eye.style.borderRadius = "100px / 240px"; + eye.style.boxShadow = "inset 0 0 0 4px #fff"; + eye.style.width = size*0.06; + eye.style.height = size*0.15; + eye.className = "eye"; + eyes.appendChild(eye); + var eye2 = eye.cloneNode(true); + eye2.style.marginLeft = "5px"; + eyes.appendChild(eye2); + + var sh = document.createElement("p"); + sh.appendChild(document.createTextNode(info["shorthand"][atomNum])); + sh.className = "sh"; + + circle.appendChild(sh); + circle.appendChild(eyes); + holder.appendChild(circle) + holder.appendChild(atom); + + return holder; +} + +get("body").onmousemove = function(event) { + // Makes eyes point at mouse + try { + var a = event.clientX; + var b = event.clientY; + for(var i = 0; i < document.getElementsByClassName("innerAtom").length; i++) { + var atom = document.getElementsByClassName("innerAtom")[i]; + var x = (atom.getBoundingClientRect()["left"] + atom.getBoundingClientRect()["right"])/2; // X coord + var y = (atom.getBoundingClientRect()["top"] + atom.getBoundingClientRect()["bottom"])/2; // Y coord + var width = atom.getBoundingClientRect()["width"]; // Width and length are same because circle + + var r = width/4; + var vect = [a-x, b-y]; + var magn = Math.sqrt(Math.pow(vect[0],2) + Math.pow(vect[1],2)) + var eyePos = [vect[0]*r/magn, vect[1]*r/magn]; + + var eyes = atom.childNodes[1]; + eyes.style.left = width/2 + eyePos[0] - eyes.getBoundingClientRect()["width"]/2; + eyes.style.top = width/2 + eyePos[1] - eyes.getBoundingClientRect()["height"]/2; + } + } catch(err) {} +} \ No newline at end of file diff --git a/atoms/js/buttons.js b/atoms/js/buttons.js new file mode 100644 index 0000000..82d923f --- /dev/null +++ b/atoms/js/buttons.js @@ -0,0 +1,57 @@ +get("pulltab")[0].onclick = function(){open(get("elements"));} +get("pulltab")[1].onclick = function(){open(get("tools"));} +get("pulltab")[2].onclick = function(){open(get("settings"));} +get("fa")[0].onclick = function() { + get("elements").style.marginLeft = "-150%"; +} +get("fa")[1].onclick = function() { + get("tools").style.marginLeft = "-170%"; +} +get("fa")[2].onclick = function() { + get("settings").style.marginLeft = "-40%"; +} + +function open(dom) { + dom.style.marginLeft = "0%"; +} + +for(var i = 0; i < options.length; i++) { + get("help")[i].onclick = function() { + var index = options.indexOf(this.parentNode.childNodes[9].id); + get("helptext")[index].style.display = "block"; + get("helptab")[index].style.display = "block"; + setTimeout(function() { + get("helptab")[index].style.opacity = "1"; + get("helptext")[index].style.opacity = "1"; + }, 1) + } + + get("help")[i].onmouseleave = function() { + var index = options.indexOf(this.parentNode.childNodes[9].id); + get("helptab")[index].style.opacity = "0"; + setTimeout(function(){get("helptext")[index].style.opacity = "0";},100); + setTimeout(function() { + get("helptab")[index].style.display = "none"; + get("helptext")[index].style.display = "none"; + }, 300); + } +} + +get("balancebutton").onclick = function() { + //Invalid form handling + var reactants = get("reactant").value; + var products = get("products").value; + var reacNum = reactants.split("+").length-1; + var final = ""; + var balanced = balanceEquation(get("reactant").value,get("product").value); + + for(var i = 0; i < balanced.length; i++) { + if(i == reacNum) { + final += balanced[i] + " -> "; + } else { + final += balanced[i] + " + "; + } + } + final = final.substring(0,final.length-3); + get("balanceout").value = final; +} \ No newline at end of file diff --git a/atoms/js/main.js b/atoms/js/main.js new file mode 100644 index 0000000..a8e965d --- /dev/null +++ b/atoms/js/main.js @@ -0,0 +1,50 @@ +function getJSON() { + xhr.open("GET","./resources/static/info.json", true); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + info = JSON.parse(xhr.responseText); + } + } + xhr.send(null); +} + +function update() { + var cookie = document.cookie; + var cookieArray = cookie.split(";"); + + // For all settings, append into object format + + for(var i = 0; i < cookieArray.length; i++) { + var set = cookieArray[i].split("="); + settings[set[0].replace(" ","")] = set[1]; + } + + // Below are settings applied based + var dispTheme = settings["displayTheme"]; + changeTheme(settings["theme"]); + tableTheme(dispTheme); + legendChange(dispTheme); + keyChange(dispTheme) +} + +var reader = new FileReader(); +var xhr = new XMLHttpRequest(); + +if(document.cookie == "") { // Set defaults if no cookie + document.cookie = "theme=light"; + document.cookie = "displayTheme=category;"; + document.cookie = "elecConf=abr;"; + document.cookie = "unit=K;" +} + +getJSON(); + +setTimeout(function mainFunc() { + getRanges(); + createTable(); + update(); + makeSettings(); + tableDesc(); + keyLegend(); + createGradientLegend(); +}, 600); \ No newline at end of file diff --git a/atoms/js/onload.js b/atoms/js/onload.js new file mode 100644 index 0000000..954f157 --- /dev/null +++ b/atoms/js/onload.js @@ -0,0 +1,224 @@ +function createTable() { + var tbl = document.createElement('table'); + tbl.style.border = "1px hidden"; + tbl.className = "normal"; + + // Creates table width j, height i + for(var i = 0; i < 7; i++) { + var tr = tbl.insertRow(); + for(var j = 0; j < 18; j++) { + td = tr.insertCell(); + td.className = "periodictable"; + } + } + get("sidebar")[0].appendChild(tbl); + + // Repeat of process above for Lanthanides and Actinides + tbl = document.createElement('table'); + tbl.className = "extension"; + for(var i = 0; i < 2; i++) { + var tr = tbl.insertRow(); + for(var j = 0; j < 15; j++) { + var td = tr.insertCell(); + td.className = "periodictable"; + } + } + get("sidebar")[0].appendChild(tbl); + + // Creates text for the periodic table + cells = get("td"); + for(var i = 0;i < elementCount;i++) { + ele = document.createElement("p"); + text = document.createTextNode(i+1); // i+1 to offset 0 + ele.appendChild(text); + cells[info["location"][i]].appendChild(ele); + text = document.createTextNode(info["shorthand"][i]); + value = document.createElement("p"); + value.appendChild(document.createTextNode("")); + value.className = "atomvalue"; + cells[info["location"][i]].appendChild(text); + cells[info["location"][i]].appendChild(value); + cells[info["location"][i]].className = cells[info["location"][i]].className +" atom"; // Adds class to prevent hover animation on blank cells + } +} + +function keyLegend() { + var rowlength = 3; + + // Get theme + var theme = settings["displayTheme"]; + var index = choices[1].indexOf(theme); + // Create Table + var tbl = document.createElement('table'); + // id for CSS + tbl.id = "keylegend"; + if(theme == "category") { + tbl.style.top = "10%"; + tbl.style.left = "16.5%"; + } + for (var i = 0; i < Object.keys(keyColors[index]).length; i+=rowlength) { + var tr = tbl.insertRow(); + for (var x = 0; x < rowlength; x++) { + if ((i + x) < Object.keys(keyColors[index]).length) { + var keycolor = tr.insertCell(); + keycolor.className = "keycolor"; + keycolor.style.backgroundColor = keyColors[index][Object.keys(keyColors[index])[i + x]]; + + var keyname = tr.insertCell(); + keyvalue = document.createTextNode(Object.keys(keyColors[index])[i + x]); + keyname.appendChild(keyvalue); + keyname.className = "keyvalue"; + } + } + }; + get("key").appendChild(tbl); +} + +function createGradientLegend() { + + var units = [""," pm"," g/mol", " kJ/mol"," kJ/mol", " eV", " g/mL", "", ""]; + + // Create Table element + var tbl = document.createElement('table'); + + // Adds Class for styling + tbl.className = "legend"; + + // Gets theme then makes vars for hexes so that repeated table access not necessary + var theme = settings["displayTheme"]; + var index = choices[1].indexOf(theme); + var unit = settings["unit"]; + + // Filter out non-gradient layouts + if (colorChart[theme].length === 2) { + var color1 = colorChart[theme][0]; + var color2 = colorChart[theme][1]; + } + + + // Creates a gradient of 101 values wide (j) for good transition + var tr = tbl.insertRow(); + for(var j = 0; j <= 1; j += 0.01) { + var td = tr.insertCell(); + td.className = "legendcell"; + if (colorChart[theme].length === 2) { + td.style.backgroundColor = gradientColor(color1, color2 , j); + } + } + + // Adds table to key area + get("legendholder").appendChild(tbl); + + // Create Key + + var min = document.createElement("p"); + min.className = "legendrangeval minlegend"; + var max = document.createElement("p"); + max.className = "legendrangeval maxlegend" + + if (colorChart[theme].length != 2) { + var minval = document.createTextNode(""); + var maxval = document.createTextNode(""); + + } else if (theme === "melting" || theme === "boiling") { + if (unit === "K") { + var extra = " " + unit; + } else { + var extra = " °" + unit; + } + var minval = document.createTextNode(ranges[theme][unit][0] + extra); + var maxval = document.createTextNode(ranges[theme][unit][1] + extra); + + + } else { + var minval = document.createTextNode(ranges[theme][0] + " " + units[index]); + var maxval = document.createTextNode(ranges[theme][1] + " " + units[index]); + + } + min.appendChild(minval); + max.appendChild(maxval); + + get("legendholder").appendChild(min); + get("legendholder").appendChild(max); + + // Create Title + + var title = document.createElement("h1"); + title.className = "tabletitle"; + if (units[index] != "") { + var end = choicesDisplay[1][index] + " (" + units[index] + " )"; + } else { + var end = choicesDisplay[1][index]; + } + title.innerHTML = end; + get("titleholder").appendChild(title); + +} + +function makeSettings() { + for(var i = 0; i < options.length;i++) { + var parent = get("option")[i]; + var text = document.createElement("p"); + // Create text of current settings choice for this option + text.appendChild(document.createTextNode(choicesDisplay[i][choices[i].indexOf(settings[parent.id])])) + text.className = "selection"; + + parent.appendChild(text); + var holder = document.createElement("div"); //Dropdown choice holder div + holder.className = "dropdown"; + parent.appendChild(holder); + + // On mouse functions + parent.onclick = function() { + // Make visible + var k = this; + this.childNodes[1].style.display = "inline"; + // Needs delay in between to execute transition properly, do not remove. + setTimeout(function(){k.childNodes[1].style.opacity = "1";},1); + } + parent.onmouseleave = function() { + // Make invisible + var k = this; + this.childNodes[1].style.opacity = "0"; + setTimeout(function(){k.childNodes[1].display = "none";},300); //Time for opacity change + } + holder.onmouseleave = function() { + // Make invisible + var k = this; + this.style.opacity = "0"; + setTimeout(function(){k.style.display = "none";},300); //Time for opacity change + } + + for(var j = 0;j < choices[i].length;j++) { // For all choices, append div for choice selection + var p = document.createElement("p"); + p.className = i.toString() + j.toString(); + p.appendChild(document.createTextNode(choicesDisplay[i][j])) + holder.appendChild(p); + + p.onclick = function(event) { + event.stopPropagation(); // Parent onclick doesn't occur when child gets clicked + var value = this.innerHTML; + var k = this; + var setting = this.parentNode.parentNode.id; + var textDiv = this.parentNode.parentNode.childNodes[0].childNodes[0]; + // Only if different value + if(value !== textDiv.nodeValue) { + this.parentNode.style.opacity = "0"; + setTimeout(function(){k.parentNode.style.display = "none";},300); + // Text transition: opacity 0 + textDiv.parentNode.style.color = themeChart["font"][settings["theme"]].replace(")",",0)").replace("b","ba"); + // Update settings through cookie + deleteCookie(setting); + document.cookie = setting+"="+choices[parseInt(this.className[0])][parseInt(this.className[1])]; + // Text transition: opacity 1 + setTimeout(function() { + textDiv.nodeValue = value; + textDiv.parentNode.style.color = themeChart["font"][settings["theme"]].replace(")",",1)").replace("b","ba"); + update(); + }, 650) + + } + } + } + } +} \ No newline at end of file diff --git a/atoms/js/tools.js b/atoms/js/tools.js new file mode 100644 index 0000000..35ca88c --- /dev/null +++ b/atoms/js/tools.js @@ -0,0 +1,393 @@ +function getColor(theme, atomNum) { + if(theme == "category") { + var color = colorChart[theme][info[theme][atomNum]]; + } else if(theme == "melting" || theme == "boiling") { + if(info[theme]["K"][atomNum] == null) { // if value is null + color = "#41484D"; + } else { + // Value - Min(all values) / Max(all values) - Min(all values) + var ratio = (info[theme]["K"][atomNum] - ranges[theme]["K"][0]) / ranges[theme]["K"][2]; + var color = gradientColor(colorChart[theme][0],colorChart[theme][1], ratio); // high, low, ratio + } + } else { + if(info[theme][atomNum] == null) { // if value is null + color = "#41484D"; + } else { + // Value - Min(all values) / Max(all values) - Min(all values) + var ratio = (info[theme][atomNum] - ranges[theme][0]) / ranges[theme][2]; + var color = gradientColor(colorChart[theme][0],colorChart[theme][1], ratio); + } + } + + return color; +} + +function changeColor(hex, amt) { + + hex = hex.slice(1); + var num = parseInt(hex,16); + var r = (num >> 16) + amt; + + if (r > 255) r = 255; + else if (r < 0) r = 0; + + var b = ((num >> 8) & 0x00FF) + amt; + + if (b > 255) b = 255; + else if (b < 0) b = 0; + + var g = (num & 0x0000FF) + amt; + + if (g > 255) g = 255; + else if (g < 0) g = 0; + + var final = (g | (b << 8) | (r << 16)).toString(16); + + // Adds preceeding zeros + while (final.length < 6) {final = "0" + final}; + return "#" + final; +} + +function gradientColor(hex1, hex2, ratio) { + + // Splits hex1 into 3 pieces (2 char each) + var hex1 = hex1.replace("#", "").match(/.{1,2}/g); + // Converts each one into int + + for (var i = 0; i <= 2; i++) { + hex1[i] = parseInt(hex1[i], 16); + } + + // Does above process for hex2 + var hex2 = hex2.replace("#", "").match(/.{1,2}/g); + for (var i = 0; i <= 2; i++) { + hex2[i] = parseInt(hex2[i], 16); + } + + // Creates end table for finished hex parts + var donetable = []; + // Averages each of the three parts between hex1 and hex2 + for (var i = 0; i <= 2; i++) { + // Weighted average to get exact gradient necessary and not average + // Round to prevent weird hex decimal shenanigans + var val = Math.round((ratio) * hex1[i] + (1 - ratio) * hex2[i]); + val = val.toString(16); + + // Adds 0 to solve math automatically removing preceeding zeroes + if (val.length === 1) { + val = "0" + val; + } + donetable[i] = val; + } + + // Rejoins hex and adds # + done = "#" + donetable.join(""); + + return done; +} + +function get(name) { + // Condensed format for document.getX + var elements = []; + if(document.getElementsByClassName(name).length > 0) { + elements = document.getElementsByClassName(name); + } + else if(document.getElementsByTagName(name).length > 0) { + for(var a = 0; a < document.getElementsByTagName(name).length; a++) { + elements.push(document.getElementsByTagName(name)[a]); + } + } + else if(document.getElementById(name) != null) { + elements.push(document.getElementById(name)); + } + + if(elements.length == 1) { + return elements[0]; + } else { return elements; } +} + +function deleteElem (id) { + var element = document.getElementById(id); + elem.parentNode.removeChild(element); + +} + +function deleteCookie(setting) { + // Sets expiration date to past date, deleting cookie automatically + document.cookie = setting+"=; expires=Thu, 01 Jan 2000 00:00:00 GMT"; +} + +function getRanges() { + // Format of ranges is [Min, Max, Range] + for(var i = 1; i < choices[1].length; i++) { // Possible data types are options except for category + var option = choices[1][i]; + if(i == 7 || i == 8) { + ranges[option] = {}; + for(var j = 0; j < 3; j++) { // Units for temperatures + var unit = choices[3][j]; + var min = Math.min.apply(null,info[option][unit]); + var max = Math.max.apply(null,info[option][unit]); + var range = max - min; + ranges[option][unit] = [min,max,range]; + } + } else { + var min = Math.min.apply(null,info[option]); + var max = Math.max.apply(null,info[option]); + var range = max - min; + ranges[option] = [min,max,range]; + } + } +} + +function balanceEquation(reactant, product) { + var compounds = []; + var vary = []; + var matrix = []; + var freeMatrix = []; + var finalMatrix = []; + + // Create array from inputs. + formulaStr = reactant + "+" + product; + compounds = formulaStr.replace(/\s/g,"").split("+"); + + // Create element matrix list. + for(var i = 0; i < compounds.length; i++) { + var counter = 0; + var indexes = []; + + currString = compounds[i]; + compounds[i] = [compounds[i]]; + + while(counter < currString.length) { + if(currString[counter] == currString[counter].toUpperCase() && isNaN(currString[counter])) { + indexes.push(counter); + } + counter += 1; + } + + indexes.push(currString.length); + + for(var j = 0; j < indexes.length-1; j++) { + element = currString.substring(indexes[j],indexes[j+1]); + elementNoNum = element.replace(/[0-9]/g,""); + + if(vary.indexOf(elementNoNum) == -1 && elementNoNum != '(' && elementNoNum != ')') { + vary.push(elementNoNum); + } + + if(element.search(/[0-9]/g) != -1) { + compounds[i].push([elementNoNum,parseInt(element.replace(/\D/g,""))]); + } else { + compounds[i].push([elementNoNum,1]); + } + } + } + + //Parenthesis handling. + for(var r = 0; r < compounds.length; r++) { + var s = 1; + while(s < compounds[r].length) { + if(compounds[r][s][0] == "(") { + var count = 1; + var v = s; + + while(count > 0) { + v++; + if(compounds[r][v][0] == "(") count++; + if(compounds[r][v][0] == ")") count--; + } + + var curr = compounds[r]; + var times = curr[v][1]; + var before = curr.splice(0,s); + var mid = curr.splice(1,v-1-before.length); + + var ae = 0; + var open = 0; + + while(ae < curr.length) { + if(curr[ae][0] == "(") { + open++; + if(open == 1) curr.splice(ae,ae+1); + } else if(curr[ae][0] == ")") { + open--; + if(open === 0) curr.splice(ae,ae+1); + break; + } else { + ae++; + } + } + var after = curr; + for(var ab = 0; ab < mid.length; ab++) { + if(times > 1) { + mid[ab][1] *= times; + before.push(mid[ab]); + } else { + before.push(mid[ab]); + } + } + if(after !== 0) { + for(var ac = 0; ac < after.length; ac++) { + before.push(after[ac]); + } + } + compounds[r] = before; + s=0; + } + s++; + } + } + + // Create matrix. + for(var x = 0; x < vary.length; x++) { + matrix[x] = []; + for(var y = 0; y < compounds.length; y++) { + var pushed = false; + for(var z = 1; z < compounds[y].length; z++) { + if(compounds[y][z][0] == vary[x]) { + matrix[x].push(compounds[y][z][1]); + pushed = true; + break; + } + } + if(!pushed) { + matrix[x].push(0); + } + } + } + + // Get Reduced Row Echelon Form. + var lead = 0; + var rows = matrix.length; + var columns = matrix[0].length; + + for(var a = 0; a < rows; a++) { + var breakOut = false; + if(columns <= lead) { + break; + } + var e = a; + while(matrix[e][lead] === 0) { + e++; + if(rows == e) { + e = a; + lead++; + if(columns == lead) { + breakOut = true; + break; + } + } + } + + if(breakOut) break; + + var tmp = matrix[e]; + matrix[e] = matrix[a]; + matrix[a] = tmp; + + var val = matrix[a][lead]; + for(var b = 0; b < columns; b++) { + matrix[a][b] /= val; + } + + for(var c = 0; c < rows; c++) { + if (c == a) continue; + val = matrix[c][lead]; + for(var d = 0; d < columns; d++) { + matrix[c][d] -= val * matrix[a][d]; + } + } + lead++; + } + + // Remove redundant lines. + for(var r = 0; r < matrix.length; r++) { + var splice = true; + for(var q = 0; q < matrix[0].length; q++) { + if(matrix[r][q] === 0 && splice === false) { + splice = true; + } else { + splice = false; + } + } + if(splice) { + matrix.splice(r,r+1); + r = 0; + } + } + + // Extract free matrix. + var rank = matrix.length; + for(var m = 0; m < rank; m++) { + freeMatrix[m] = []; + for(var n = rank; n < matrix[0].length; n++) { + freeMatrix[m].push(-1*matrix[m][n]); + } + } + + // Adding identity matrix. + for(var e = 0; e < compounds.length-freeMatrix.length; e++) { + freeMatrix.push([]); + for(var f = 0; f < compounds.length-rank; f++) { + if((f/2) == parseInt(f/2)) { + freeMatrix[e+rank].push(1); + } else { + freeMatrix[e+rank].push(0); + } + } + } + + // Adding and converting into 1 column/row. + for(var o = 0; o < freeMatrix.length; o++) { + var value = 0; + for(var p = 0; p< freeMatrix[0].length; p++) { + value += freeMatrix[o][p]; + } + finalMatrix.push(value); + } + + // Multiply all to integers. + var mul = 1; + var testMul = 1; + + for(var g = 0; g < finalMatrix.length; g++) { + var testInt = finalMatrix[g] * testMul; + while(testInt != parseInt(testInt)) { + testMul += 1; + testInt = finalMatrix[g] * testMul; + } + if(testMul < mul) { + mul = testMul; + } + } + + for(var h = 0; h < finalMatrix.length; h++) { + finalMatrix[h] *= testMul; + } + + // Get GCD. + var gcd; + + for(var u = 0; u < finalMatrix.length-1; u++) { + gcd = getGCD(finalMatrix[u], finalMatrix[u+1]); + + } + + // Get final answers. + for(var w = 0; w < finalMatrix.length; w++) { + finalMatrix[w] /= gcd; + finalMatrix[w] = Math.abs(finalMatrix[w]); + if(finalMatrix[w] != 1) { + finalMatrix[w] += compounds[w][0]; + } else { + finalMatrix[w] = compounds[w][0]; + } + } + + return finalMatrix; +} + +function getGCD(a,b) { + if(!b) return a; + return getGCD(b, a % b); +} \ No newline at end of file diff --git a/atoms/js/update.js b/atoms/js/update.js new file mode 100644 index 0000000..517c5e6 --- /dev/null +++ b/atoms/js/update.js @@ -0,0 +1,129 @@ +function changeTheme(type) { + // Changes background image + get("body").style.backgroundImage = "url('./resources/static/" + type +".png')"; + get("body").style.color = themeChart["font"][type]; + // Changes interface element colors + for(var i = 0; i < get("pulltab").length; i++) { + get("pulltab")[i].style.backgroundColor = themeChart["pulltab"][type]; + get("pulltab")[i].style.color = themeChart["font"][type].replace(")",",0)"); + get("pulltab")[i].onmouseover = function() { + this.style.color = themeChart["font"][type].replace(")",",1)").replace("b","ba"); + } + get("pulltab")[i].onmouseleave = function() { + this.style.color = themeChart["font"][type].replace(")",",0)").replace("b","ba"); + } + get("sidebar")[i].style.backgroundColor = themeChart["sidebar"][type]; + } + + for(var i = 0; i < get("selection").length; i++) { + get("selection")[i].style.color = themeChart["font"][type]; + } +} + +function tableTheme(theme) { + for(var i = 0;i < elementCount;i++) { + // Changes background color of each cell + if (document.getElementsByClassName("periodictable").length != 0) { + var index = get("periodictable")[info["location"][i]]; + index.style.backgroundColor = getColor(theme, i); + + if(theme == "category") { + index.childNodes[2].childNodes[0].nodeValue = ""; + } else if(theme == "melting" || theme == "boiling") { + temperatureValue = info[theme][settings["unit"]][i]; + if(temperatureValue != null) { + index.childNodes[2].childNodes[0].nodeValue = temperatureValue + "°"; + } + + } else { + index.childNodes[2].childNodes[0].nodeValue = info[theme][i]; + } + } + } + try {lastElement.click();} catch(err){} // Last selection still selected when changing themes +} + +function keyChange(theme) { + if (document.getElementById("keylegend") != null) { + var rowlength = 3; + + document.getElementsByClassName("key")[0].removeChild(document.getElementById("keylegend")); + + var index = choices[1].indexOf(theme); + // Create Table + var tbl = document.createElement('table'); + // id for CSS + tbl.id = "keylegend"; + if(theme == "category") { + tbl.style.top = "10%"; + tbl.style.left = "16.5%"; + } + for (var i = 0; i < Object.keys(keyColors[index]).length; i+=rowlength) { + var tr = tbl.insertRow(); + for (var x = 0; x < rowlength; x++) { + if ((i + x) < Object.keys(keyColors[index]).length) { + var keycolor = tr.insertCell(); + keycolor.className = "keycolor"; + keycolor.style.backgroundColor = keyColors[index][Object.keys(keyColors[index])[i + x]]; + + var keyname = tr.insertCell(); + keyvalue = document.createTextNode(Object.keys(keyColors[index])[i + x]); + keyname.appendChild(keyvalue); + keyname.className = "keyvalue"; + } + } + + }; + get("key").appendChild(tbl); + } +} + +function legendChange(theme) { + var units = [""," pm"," g/mol", " kJ/mol"," kJ/mol", " eV", " g/mL", "", ""]; + + // Title + if (get("tabletitle").length != 0) { + var index = choices[1].indexOf(theme); + if (units[index] != "") { + var end = choicesDisplay[1][index] + " (" + units[index] + " )"; + } else { + var end = choicesDisplay[1][index]; + } + get("tabletitle").innerHTML = end; + } + + if (colorChart[theme].length != 2) { + get("legendholder").style.display = "none"; + } else { + get("legendholder").style.display = ""; + var color1 = colorChart[theme][0]; + var color2 = colorChart[theme][1]; + + if (theme === "melting" && "boiling") { + var unit = settings["unit"]; + var newmin = ranges[theme][unit][0]; + var newmax = ranges[theme][unit][1]; + + if (unit != "K") { + unit = "°" + unit; + } + newmin = newmin + " " + unit; + newmax = newmax + " " + unit; + + + } else { + var newmin = ranges[theme][0] + " " + units[index]; + var newmax = ranges[theme][1] + " " + units[index]; + } + + if (get("legend").length != 0) { + + for(var j = 0; j <= 99; j ++) { + get("legendcell")[j].style.backgroundColor = gradientColor(color1, color2 , j/100); + } + + get("minlegend").innerHTML = newmin; + get("maxlegend").innerHTML = newmax; + } + } +} \ No newline at end of file diff --git a/atoms/resources/reactive/Ring1.gif b/atoms/resources/reactive/Ring1.gif new file mode 100644 index 0000000..189bb4c Binary files /dev/null and b/atoms/resources/reactive/Ring1.gif differ diff --git a/atoms/resources/reactive/Ring2.gif b/atoms/resources/reactive/Ring2.gif new file mode 100644 index 0000000..496909c Binary files /dev/null and b/atoms/resources/reactive/Ring2.gif differ diff --git a/atoms/resources/reactive/Ring3.gif b/atoms/resources/reactive/Ring3.gif new file mode 100644 index 0000000..bdf26ec Binary files /dev/null and b/atoms/resources/reactive/Ring3.gif differ diff --git a/atoms/resources/reactive/Ring4.gif b/atoms/resources/reactive/Ring4.gif new file mode 100644 index 0000000..5ec252b Binary files /dev/null and b/atoms/resources/reactive/Ring4.gif differ diff --git a/atoms/resources/reactive/Ring5.gif b/atoms/resources/reactive/Ring5.gif new file mode 100644 index 0000000..443a7b6 Binary files /dev/null and b/atoms/resources/reactive/Ring5.gif differ diff --git a/atoms/resources/reactive/Ring6.gif b/atoms/resources/reactive/Ring6.gif new file mode 100644 index 0000000..4c2ca8e Binary files /dev/null and b/atoms/resources/reactive/Ring6.gif differ diff --git a/atoms/resources/reactive/Ring7.gif b/atoms/resources/reactive/Ring7.gif new file mode 100644 index 0000000..b9be490 Binary files /dev/null and b/atoms/resources/reactive/Ring7.gif differ diff --git a/atoms/resources/reactive/Ring8.gif b/atoms/resources/reactive/Ring8.gif new file mode 100644 index 0000000..d4e1af0 Binary files /dev/null and b/atoms/resources/reactive/Ring8.gif differ diff --git a/atoms/resources/reactive/StableRing1.gif b/atoms/resources/reactive/StableRing1.gif new file mode 100644 index 0000000..1b72061 Binary files /dev/null and b/atoms/resources/reactive/StableRing1.gif differ diff --git a/atoms/resources/reactive/StableRing2.gif b/atoms/resources/reactive/StableRing2.gif new file mode 100644 index 0000000..21c6fac Binary files /dev/null and b/atoms/resources/reactive/StableRing2.gif differ diff --git a/atoms/resources/reactive/StableRing3.gif b/atoms/resources/reactive/StableRing3.gif new file mode 100644 index 0000000..f7fbe02 Binary files /dev/null and b/atoms/resources/reactive/StableRing3.gif differ diff --git a/atoms/resources/reactive/StableRing4.gif b/atoms/resources/reactive/StableRing4.gif new file mode 100644 index 0000000..b9e7f49 Binary files /dev/null and b/atoms/resources/reactive/StableRing4.gif differ diff --git a/atoms/resources/reactive/StableRing5.gif b/atoms/resources/reactive/StableRing5.gif new file mode 100644 index 0000000..c66bd1b Binary files /dev/null and b/atoms/resources/reactive/StableRing5.gif differ diff --git a/atoms/resources/reactive/StableRing6.gif b/atoms/resources/reactive/StableRing6.gif new file mode 100644 index 0000000..13a9af3 Binary files /dev/null and b/atoms/resources/reactive/StableRing6.gif differ diff --git a/atoms/resources/reactive/StableRing7.gif b/atoms/resources/reactive/StableRing7.gif new file mode 100644 index 0000000..93aaa1d Binary files /dev/null and b/atoms/resources/reactive/StableRing7.gif differ diff --git a/atoms/resources/reactive/StableRing8.gif b/atoms/resources/reactive/StableRing8.gif new file mode 100644 index 0000000..1d6a78a Binary files /dev/null and b/atoms/resources/reactive/StableRing8.gif differ diff --git a/atoms/resources/static/dark.png b/atoms/resources/static/dark.png new file mode 100644 index 0000000..8f9d1e5 Binary files /dev/null and b/atoms/resources/static/dark.png differ diff --git a/atoms/resources/static/favicon.ico b/atoms/resources/static/favicon.ico new file mode 100644 index 0000000..451b023 Binary files /dev/null and b/atoms/resources/static/favicon.ico differ diff --git a/atoms/resources/static/info.json b/atoms/resources/static/info.json new file mode 100644 index 0000000..25e86b2 --- /dev/null +++ b/atoms/resources/static/info.json @@ -0,0 +1,168 @@ +{ + "element": ["Hydrogen","Helium","Lithium","Beryllium","Boron","Carbon","Nitrogen","Oxygen","Fluorine","Neon", + "Sodium","Magnesium","Aluminum","Silicon","Phosphorus","Sulfur","Chlorine","Argon","Potassium", + "Calcium","Scandium","Titanium","Vanadium","Chromium","Manganese","Iron","Cobalt","Nickel","Copper", + "Zinc","Gallium","Germanium","Arsenic","Selenium","Bromine","Krypton","Rubidium","Strontium","Yttrium", + "Zirconium","Niobium","Molybdenum","Technetium","Ruthenium","Rhodium","Palladium","Silver","Cadmium", + "Indium","Tin","Antimony","Tellurium","Iodine","Xenon","Cesium","Barium","Lanthanum","Cerium", + "Praseodymium","Neodymium","Promethium","Samarium","Europium","Gadolinium","Terbium","Dysprosium", + "Holmium","Erbium","Thulium","Ytterbium","Lutetium","Hafnium","Tantalum","Tungsten","Rhenium","Osmium", + "Iridium","Platinum","Gold","Mercury","Thallium","Lead","Bismuth","Polonium","Astatine","Radon", + "Francium","Radium","Actinium","Thorium","Protactinium","Uranium","Neptunium","Plutonium","Americium", + "Curium","Berkelium","Californium","Einsteinium","Fermium","Mendelevium","Nobelium","Lawrencium", + "Rutherfordium","Dubnium","Seaborgium","Bohrium","Hassium","Meitnerium","Darmstadtium","Roentgenium", + "Copernicium","Ununtrium","Flerovium","Ununpentium","Livermorium","Ununseptium","Ununoctium"], + "location":[0,17,18,19,30,31,32,33,34,35,36,37,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71, + 72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,126,127,128,129,130,131,132,133,134,135,136, + 137,138,139,140,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,141,142,143,144,145,146,147, + 148,149,150,151,152,153,154,155,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125], + "shorthand": ["H","He","Li","Be","B","C","N","O","F","Ne","Na","Mg","Al","Si","P","S","Cl","Ar","K","Ca","Sc","Ti","V", + "Cr","Mn","Fe","Co","Ni","Cu","Zn","Ga","Ge","As","Se","Br","Kr","Rb","Sr","Y","Zr","Nb","Mo","Tc", + "Ru","Rh","Pd","Ag","Cd","In","Sn","Sb","Te","I","Xe","Cs","Ba","La","Ce","Pr","Nd","Pm","Sm","Eu","Gd", + "Tb","Dy","Ho","Er","Tm","Yb","Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg","Tl","Pb","Bi","Po","At", + "Rn","Fr","Ra","Ac","Th","Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm","Md","No","Lr","Rf","Db","Sg", + "Bh","Hs","Mt","Ds","Rg","Cn","Uut","Fl","Uup","Lv","Uus","Uuo"], + + "atomRadi": [53,31,167,112,87,67,56,48,42,38,190,145,118,111,98,88,79,71,243,194,184,176,171,166,161,156,152,149, + 145,142,136,125,114,103,94,88,265,219,212,206,198,190,183,178,173,168,165,161,156,145,133,123,115,108, + 298,253,null,null,247,206,205,238,231,233,225,228,226,226,222,222,217,208,200,193,188,185,180,177,174, + 171,156,154,143,135,127,120,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], + "moleWeig": [1.008,4.00026,6.94,9.0122,10.81,12.011,14.007,15.999,18.998,20.180,22.990,24.305,26.982,28.085,30.974, + 32.06,35.45,39.948,39.098,40.078,44.956,47.867,50.942,51.996,54.938,55.845,58.993,58.693,63.546,65.38,69.723, + 72.630,74.922,78.97,79.904,83.798,85.468,87.62,88.906,91.224,92.906,95.95,98,101.07,102.91,106.42,107.87, + 112.41,114.82,118.71,121.76,127.60,126.90,131.29,132.91,137.33,138.91,140.12,140.91,144.24,145,150.36, + 151.96,157.25,158.93,162.50,164.93,167.26,168.93,173.05,174.97,178.49,180.95,183.84,186.21,190.23,192.22, + 195.08,196.97,200.59,204.38,207.2,208.98,209,210,222,223,226,227,232.04,231.04,238.03,237,244,243,247,247, + 251,252,257,258,259,262,265,268,271,270,277,276,281,280,285,286,289,289,293,294,294], + "ioniEner": [1312.0,2372.3,520.2,899.5,800.6,1086.5,1402.3,1313.9,1681.0,2080.7,495.8,737.7,577.5,786.5,1011.8,999.6, + 1251.2,1520.6,418.8,589.8,633.1,658.8,650.9,652.9,717.3,762.5,760.4,737.1,745.5,906.4,578.8,762.2,944.5, + 941.0,1139.9,1350.8,403.0,549.5,599.9,640.1,652.1,684.3,702,710.2,719.7,804.4,731.0,867.8,558.3,708.6, + 830.6,869.3,1008.4,1170.3,375.7,502.9,538.1,534.4,528.1,533.1,538.6,544.5,547.1,593.4,565.8,573.0,581.0, + 589.3,596.7,603.4,523.5,658.5,728.4,758.8,755.8,814.2,865.2,864.4,890.1,1007.1,589.4,715.6,703.0,812.1,null, + 1037.1,393.0,509.3,498.8,608.5,568,597.6,604.5,581.5,576.4,578.1,598.0,606.1,619,627,635,642,472.8,580, + null,null,null,null,null,null,null,null,null,null,null,null,null,null], + "elecAffi": [72.8,0,59.6,0,27.0,121.8,0,141.0,328.2,0,52.9,0,41.8,134.1,72.0,200.4,348.6,0,48.4,2.4,18,8,51,65.2,0, + 15,64,111.7,119.2,0,40,118.9,78,195.0,324.5,0,46.9,5.0,30,41,86,72.1,60,101.0,110.3,54.2,125.9,0,39, + 107.3,101.1,190.2,295.2,0,45.5,14.0,45,null,null,null,null,null,null,null,null,null,null,null,null,null + ,null,0,31,79,20,104.0,150.9,205.0,222.7,0,37,35,90.9,180,270,0,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null], + "elecNega": [2.20,null,0.98,1.57,2.04,2.55,3.04,3.44,3.98,null,0.93,1.31,1.61,1.90,2.19,2.58,3.16,null,0.82,1.00,1.36, + 1.54,1.63,1.66,1.55,1.83,1.88,1.91,1.90,1.65,1.81,2.01,2.18,2.55,2.96,3.00,0.82,0.95,1.22,1.33,1.6,2.16, + 1.9,2.2,2.28,2.20,1.93,1.69,1.78,1.96,2.05,2.1,2.66,2.60,0.79,0.89,1.1,1.12,1.13,1.14,1.13,1.17,1.2,1.2, + 1.1,1.22,1.23,1.24,1.25,1.1,1.27,1.3,1.5,2.36,1.9,2.2,2.20,2.28,2.54,2.00,1.62,2.33,2.02,2.0,2.2,2.2,0.7, + 0.9,1.1,1.3,1.5,1.38,1.36,1.28,1.13,1.28,1.3,1.3,1.3,1.3,1.3,1.3,1.291,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null], + "phase" : ["g","g","s","s","s","s","g","g","g","g","s","s","s","s","s","s","g","g","s","s","s","s","s","s","s","s","s", + "s","s","s","s","s","s","s","l","g","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","g", + "s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","l","s","s", + "s","s","s","g","s","s","s","s","s","s","s","s","s","s","s","s","s",null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null], + "density" : [0.0000899,0.0001785,0.535,1.848,2.46,2.26,0.001251,0.001429,0.001696,0.9,0.968,1.738,2.7,2.33,1.823,1.96, + 0.003214,0.001784,0.856,1.55,2.985,4.507,6.11,7.14,7.47,7.874,8.9,8.908,8.92,7.14,5.904,5.323,5.727,4.819, + 3.12,0.00375,1.532,2.63,4.472,6.511,8.57,10.28,11.5,12.37,12.45,12.023,10.49,8.65,7.31,7.31,6.697,6.24,4.94,0.0059, + 1.879,3.51,6.146,6.689,6.64,7.01,7.264,7.353,5.244,7.901,8.219,8.551,8.795,9.066,9.321,6.57,9.841,13.31,16.65, + 19.25,21.02,22.61,22.65,21.09,19.3,13.534,11.85,11.34,9.78,9.196,null,0.00973,null,5,10.07,11.724,15.37,19.05, + 20.45,19.816,null,13.51,14.78,15.1,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null], + "melting": { + "K": [14.01,0.95,453.65,1560,2348,3823,63.15,54.36,53.53,24.56,370.95,923,933.437,1687,317.3,388.36,171.65, + 83.8,336.53,1115,1814,1941,2183,2180,1519,1811,1768,1728,1357.77,692.68,302.9146,1211.4,1090,494,265.95, + 115.79,312.46,1050,1799,2128,2750,2896,2430,2607,2237,1828.05,1234.93,594.22,429.75,505.08,903.78,722.66, + 386.85,161.4,301.59,1000,1193,1071,1208,1297,1315,1345,1095,1585,1629,1685,1734,1802,1818,1097,1936,2506, + 3290,3695,3459,3306,2719,2041.4,1337.33,234.32,577,600.61,544.55,527,575,202,null,973,1323,2115,1841,1405.3, + null,912.5,1449,1613,1323,1173,1133,1800,1100,1100,1900,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null], + "C": [-259.14,-272.2,180.5,1287,2075,3550,-210,-218.79,-219.62,-248.59,97.8,650,660.323,1414,44.2,115.21,-101.5, + -189.35,63.38,842,1541,1668,1910,1907,1246,1538,1495,1455,1084.62,419.53,29.7646,938.25,817,221,-7.2,-157.36, + 39.31,777,1526,1855,2477,2623,2157,2334,1964,1554.9,961.78,321.07,156.6,231.93,630.63,449.51,113.7,-111.7, + 28.44,727,920,798,935,1024,1042,1072,822,1312,1356,1412,1461,1529,1545,824,1663,2233,3017,3422,3186,3033, + 2446,1768.3,1064.18,-38.83,304,327.46,271.4,254,302,-71.15,null,700,1050,1842,1568,1132.2,null,639.4,1176, + 1340,1050,900,860,1527,827,827,1627,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null], + "F": [-434.45203,-458,356.9,2349,3767,6422,-346,-361.82,-363.32,-415.46,208.04,1202,1220.581,2577,111.6,239.38,-150.7, + -308.83,146.08,1548,2806,3034,3470,3465,2275,2800,2723,2651,1984.32,787.15,85.5763,1720.85,1503,430,19,-251.25, + 102.76,1431,2779,3371,4491,4753,3915,4233,3567,2830.82,1763.2,609.93,313.88,449.47,1167.13,841.12,236.66,-169.1, + 83.19,1341,1688,1468,1715,1875,1908,1962,1512,2394,2473,2574,2662,2784,2813,1515,3025,4051,5463,6192,5767,5491, + 4435,3214.9,1947.52,-37.89,579,621.43,520.52,489,576,-96,null,1292,1922,3348,2854,2070,null,1182.9,2149,2444, + 1922,1652,1580,2781,1521,1521,2961,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null] + }, + "boiling": { + "K": [20.28,4.22,1615,2744,4273,4098,77.36,90.2,85.03,27.07,1156,1363,2792,3538,550,717.8,239.11,87.3,1032,1757,3109, + 3560,3680,2944,2334,3134,3200,3186,2835,1180,2477,3106,887,958,331.95,119.93,961,1655,3609,4682,5017,4912,4538, + 4423,3968,3236,2435,1040,2345,2875,1860,1261,457.4,165.03,944,2170,3737,3697,3793,3347,3273,2067,1802,3546,3503, + 2840,2993,3141,2223,1469,3675,4876,5731,5828,5869,5285,4701,4098,3129,629.88,1746,2022,1837,1235,null,211.3,null, + 2010,3471,5061,null,4404,null,3505,2284,3383,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null], + "C": [-252.87,-268.93,1342,2471,4000,3825,-195.79,-182.95,-188.12,-246.08,883,1090,2519,3265,277,444.6,-34.04,-185.85, + 759,1484,2836,3287,3407,2671,2061,2861,2927,2913,2562,907,2204,2833,614,685,58.8,-153.22,688,1382,3336,4409,4744, + 4639,4265,4150,3695,2963,2162,767,2072,2602,1587,988,184.3,-108.12,671,1897,3464,3424,3520,3074,3000,1794,1529, + 3273,3230,2567,2720,2868,1950,1196,3402,4603,5458,5555,5596,5012,4428,3825,2856,356.73,1473,1749,1564,962,null, + -61.85,null,1737,3198,4788,null,4131,null,3228,2011,3110,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null], + "F":[-423.17,-452.07,2448,4480,7232,6917,-320.42,-297.31,-306.62,-410.94,1621,1994,4566,5909,531,832.3,-29.27,-302.53, + 1398,2703,5136,5949,6165,4840,3742,5182,5301,5275,4644,907,3999,5131,1137,1265,137.8,-243.8,1270,2520,6037,7968, + 8571,8382,7709,7502,6683,5365,3924,1413,3762,4716,2889,1810,363.7,-162.62,1240,3447,6267,6195,6368,5565,5432,3261, + 2784,5923,5846,4653,4928,5194,3542,2185,6156,8317,9856,10031,10105,9054,8002,6917,5173,674.11,2683,3180,2847,1764, + null,-79.1,null,3159,5788,8650,null,7468,null,5842,3652,5630,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null] + }, + "color": ["c","c","s","sg","b","b","c","c","c","c","s","s","s","g","c","y","y","c","s","s","s","s","s","s","s","g","g", + "g","Copper","sg","s","g","s","g","Red","c","s","s","s","s","g","g","s","s","s","s","s","s","s","s","s","s","sg", + "c","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","s","g","g","g","g","sg","s","g","Gold","s","s","sg", + "g","s","s","c","s","s","s","s","s","s","s","s","s","s",null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null], + "oxidStat": [["-1","b+1"],null,["b+1"],["+1","b+2"],["-5,","-1","+1","+2","b+3"],["b-4","b-3","b-2","b-1","b+1","b+2","b+3","b+4"],["b-3","-2","-1","+1","+2","b+3","+4","b+5"], + ["b-2","-1","+1","+2"],["b-1"],null,["-1","b+1"],["+1","b+2"],["-2","-1","+1","+2","b+3"],["b-4","-3","-2","-1","+1","+2","+3","b+4"],["b-3","-2","-1","+1","+2","b+3","+4","b+5"], + ["b-2","-1","+1","b+2","+3","b+4","+5","b+6"],["b-1","b+1","+2","b+3","+4","b+5","+6","b+7"],null,["-1","b+1"],["-1","+1","b+2"], + ["+1","+2","b+3"],["-2","-1","+1","+2","+3","b+4"],["-3","-1","+1","+2","+3","+4","b+5"],["-4","-2","-1","+1","+2","b+3","+4","+5","b+6"], + ["-3","-2","-1","+1","b+2","+3","b+4","+5","+6","b+7"],["-4","-2","-1","+1","b+2","b+3","+4","+5","b+6"],["-3","-1","+1","b+2","b+3","+4","+5"], + ["-2","-1","+1","b+2","+3","+4"],["-2","+1","b+2","+3","+4"],["-2","+1","b+2"],["-5","-4","-2","-1","+1","+2","b+3"],["b-4","-3","-2","-1","+1","b+2","+3","b+4"], + ["b-3","-2","-1","+1","+2","b+3","+4","b+5"],["b-2","-1","+1","b+2","+3","b+4","+5","b+6"],["b-1","b+1","b+3","+4","b+5","b+7"],["b+2"], + ["-1","b+1"],["+1","b+2"],["+1","+2","b+3"],["-2","+1","+2","+3","b+4"],["-3","-1","+1","+2","+3","+4","b+5"], + ["-4","-2","-1","+1","+2","+3","b+4","+5","b+6"],["-3","-1","+1","+2","+3","b+4","+5","+6","b+7"],["-4","-2","+1","+2","b+3","b+4","+5","+6","+7","+8"], + ["-3","-1","+1","+2","b+3","+4","+5","+6"],["+1","b+2","+3","b+4","+5","+6"],["-2","-1","b+1","+2","+3","+4"],["-2","+1","b+2"], + ["-5","-2","-1","+1","+2","b+3"],["b-4","-3","-2","-1","+1","b+2","+3","b+4"],["b-3","-2","-1","+1","+2","b+3","+4","b+5"],["b-2","-1","+1","b+2","+3","b+4","+5","b+6"], + ["b-1","b+1","b+3","+4","b+5","+6","b+7"],["b+2","b+4","b+6","+8"],["-1","b+1"],["+1","b+2"],["+1","+2","b+3"], + ["+2","b+3","b+4"],["+2","b+3","+4"],["+2","b+3","+4"],["+2","b+3"],["+2","b+3"],["b+2","b+3"],["+1","+2","b+3"], + ["+1","+2","b+3","+4"],["+2","b+3","+4"],["+2","b+3"],["+2","b+3"],["+2","b+3"],["+2","b+3"],["+2","b+3"], + ["-2","+1","+2","+3","b+4"],["-3","-1","+1","+2","+3","+4","b+5"],["-4","-2","-1","+1","+2","+3","b+4","+5","b+6"], + ["-3","-1","+1","+2","+3","b+4","+5","+6","+7"],["-4","-2","-1","+1","+2","+3","b+4","+5","+6","+7","+8"], + ["-3","-1","+1","+2","b+3","b+4","+5","+6","+7","+8"],["-3","-2","-1","+1","b+2","+3","b+4","+5","+6"], + ["-3","-2","-1","+1","+2","b+3","+5"],["-2","b+1","b+2","+4"],["-5","-2","-1","b+1","+2","b+3"],["-4","-2","-1","+1","b+2","+3","b+4"], + ["-3","-2","-1","+1","+2","b+3","+4","+5"],["b-2","b+2","b+4","+5","+6"],["b-1","b+1","+3","+5","+7"],["b+2","+6"],["b+1"], + ["b+2"],["+2","b+3"],["+1","+2","+3","b+4"],["+2","+3","+4","b+5"],["+1","+2","+3","+4","+5","b+6"], + ["+2","+3","+4","b+5","+6","+7"],["+1","+2","+3","b+4","+5","+6","+7","+8"],["+2","b+3","+4","+5","+6","+7","+8"], + ["+2","b+3","+4","+6"],["+2","b+3","+4"],["+2","b+3","+4"],["+2","b+3","+4"],["+2","b+3"],["+2","b+3"],["b+2","+3"], + ["b+3"],["b+4"],["b+5"],["b+6"],["b+7"],["b+8"],null,null,null,null,null,null,null,null,null,null], + "category": ["nm","ng","al","ae","md","nm","nm","nm","ha","ng","al","ae","bm","md","nm","nm","ha","ng","al","ae","tm", + "tm","tm","tm","tm","tm","tm","tm","tm","tm","bm","md","md","nm","ha","ng","al","ae","tm","tm","tm","tm", + "tm","tm","tm","tm","tm","tm","bm","bm","md","md","ha","ng","al","ae","tm","lh","lh","lh","lh","lh","lh", + "lh","lh","lh","lh","lh","lh","lh","lh","tm","tm","tm","tm","tm","tm","tm","tm","tm","bm","bm","bm","md", + "ha","ng","al","ae","tm","ac","ac","ac","ac","ac","ac","ac","ac","ac","ac","ac","ac","ac","ac","tm","tm", + "tm","tm","tm","tm","tm","tm","tm","bm","bm","bm","bm","ha","ng"], + "valeElec": [1,2,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,2,2,2,2,2,2,2,2,2,2,3,4,5,6,7,8,1,2,2,2,2,2,2,2,2,2,2,2,3,4,5, + 6,7,8,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4,5,6,7,8,1,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,3,4,5,6,7,8], + "elecConf": ["1s.1","1s.2","[He]2s.1","[He]2s.2","[He]2s.2.2p.1","[He]2s.2.2p.2","[He]2s.2.2p.3","[He]2s.2.2p.4", + "[He]2s.2.2p.5","[He]2s.2.2p.6","[Ne]3s.1","[Ne]3s.2","[Ne]3s.2.3p.1","[Ne]3s.2.3p.2","[Ne]3s.2.3p.3", + "[Ne]3s.2.3p.4","[Ne]3s.2.3p.5","[Ne]3s.2.3p.6","[Ar]4s.1","[Ar]4s.2","[Ar]3d.1.4s.2","[Ar]3d.2.4s.2", + "[Ar]3d.3.4s.2","[Ar]3d.5.4s.1","[Ar]3d.5.4s.2","[Ar]3d.6.4s.2","[Ar]3d.7.4s.2","[Ar]3d.8.4s.2","[Ar]3d.10.4s.1", + "[Ar]3d.10.4s.2","[Ar]3d.10.4s.2.4p.1","[Ar]3d.10.4s.2.4p.2","[Ar]3d.10.4s.2.4p.3","[Ar]3d.10.4s.2.4p.4", + "[Ar]3d.10.4s.2.4p.5","[Ar]3d.10.4s.2.4p.6","[Kr]5s.1","[Kr]5s.2","[Kr]4d.1.5s.2","[Kr]4d.2.5s.2","[Kr]4d.4.5s.1", + "[Kr]4d.5.5s.1","[Kr]4d.5.5s.2","[Kr]4d.7.5s.1","[Kr]4d.8.5s.1","[Kr]4d.10","[Kr]4d.10.5s.1","[Kr]4d.10.5s.2", + "[Kr]4d.10.5s.2.5p.1","[Kr]4d.10.5s.2.5p.2","[Kr]4d.10.5s.2.5p.3","[Kr]4d.10.5s.2.5p.4","[Kr]4d.10.5s.2.5p.5", + "[Kr]4d.10.5s.2.5p.6","[Xe]6s.1","[Xe]6s.2","[Xe]5d.1.6s.2","[Xe]4f.1.5d.1.6s.2","[Xe]4f.3.6s.2","[Xe]4f.4.6s.2", + "[Xe]4f.5.6s.2","[Xe]4f.6.6s.2","[Xe]4f.7.6s.2","[Xe]4f.7.5d.1.6s.2","[Xe]4f.9.6s.2","[Xe]4f.10.6s.2", + "[Xe]4f.11.6s.2","[Xe]4f.12.6s.2","[Xe]4f.13.6s.2","[Xe]4f.14.6s.2","[Xe]4f.14.5d.1.6s.2","[Xe]4f.14.5d.2.6s.2", + "[Xe]4f.14.5d.3.6s.2","[Xe]4f.14.5d.4.6s.2","[Xe]4f.14.5d.5.6s.2","[Xe]4f.14.5d.6.6s.2","[Xe]4f.14.5d.7.6s.2","[Xe]4f.14.5d.9.6s.1","[Xe]4f.14.5d.10.6s.1","[Xe]4f.14.5d.10.6s.2","[Xe]4f.14.5d.10.6s.2.6p.1", + "[Xe]4f.14.5d.10.6s.2.6p.2","[Xe]4f.14.5d.10.6s.2.6p.3","[Xe]4f.14.5d.10.6s.2.6p.4","[Xe]4f.14.5d.10.6s.2.6p.5", + "[Xe]4f.14.5d.10.6s.2.6p.6","[Rn]7s.1","[Rn]7s.2","[Rn]6d.1.7s.2","[Rn]6d.2.7s.2","[Rn]5f.2.6d.1.7s.2", + "[Rn]5f.3.6d.1.7s.2","[Rn]5f.4.6d.1.7s.2","[Rn]5f.6.7s.2","[Rn]5f.7.7s.2","[Rn]5f.7.6d.1.7s.2","[Rn]5f.9.7s.2", + "[Rn]5f.10.7s.2","[Rn]5f.11.7s.2","[Rn]5f.12.7s.2","[Rn]5f.13.7s.2","[Rn]5f.14.7s.2","[Rn]5f.14.7s.2.7p.1", + "[Rn]5f.14.6d.2.7s.2","[Rn]5f.14.6d.3.7s.2","[Rn]5f.14.6d.4.7s.2","[Rn]5f.14.6d.5.7s.2","[Rn]5f.14.6d.6.7s.2", + "[Rn]5f.14.6d.7.7s.2","[Rn]5f.14.6d.9.7s.1","[Rn]5f.14.6d.10.7s.1","[Rn]5f.14.6d.10.7s.2","[Rn]5f.14.6d.10.7s.2.7p.1", + "[Rn]5f.14.6d.10.7s.2.7p.2","[Rn]5f.14.6d.10.7s.2.7p.3","[Rn]5f.14.6d.10.7s.2.7p.4","[Rn]5f.14.6d.10.7s.2.7p.5", + "[Rn]5f.14.6d.10.7s.2.7p.6"] +} diff --git a/atoms/resources/static/light.png b/atoms/resources/static/light.png new file mode 100644 index 0000000..05242da Binary files /dev/null and b/atoms/resources/static/light.png differ