├── .babelrc ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .travis.yml ├── LICENSE.md ├── README.md ├── doc ├── close_screenshot.png └── example_screenshot.png ├── example ├── .editorconfig ├── .gitattributes ├── .gitignore ├── .htaccess ├── apple-touch-icon.png ├── browserconfig.xml ├── crossdomain.xml ├── css │ ├── home.css │ ├── main.css │ └── normalize.css ├── favicon.ico ├── img │ └── .gitignore ├── index.html ├── js │ ├── 1kbu.js │ ├── 3aid_model_data.js │ ├── 3aid_styles.js │ ├── bipyridine.sdf │ ├── bipyridine_model_data.js │ ├── bipyridine_styles.js │ ├── dna_model_data.js │ ├── dna_pdb.js │ ├── main.jsx │ ├── orbital.js │ ├── plugins.js │ ├── settings.jsx │ └── vendor │ │ └── modernizr-2.8.3.min.js ├── robots.txt ├── tile-wide.png ├── tile.png └── webpack.config.js ├── karma.conf.js ├── nightwatch.conf.js ├── package.json ├── scripts └── download_selenium.js ├── src ├── components │ └── molecule_3d.jsx ├── constants │ ├── environment_constants.js │ ├── selection_types_constants.js │ └── shape_constants.js ├── main.js └── utils │ ├── lib_utils.js │ └── molecule_utils.js ├── test ├── components │ └── molecule_3d_spec.js ├── e2e │ ├── fixtures │ │ └── setup.js │ └── specs │ │ └── startup_spec.js ├── fixtures │ └── factories.js └── utils │ ├── lib_utils_spec.js │ └── molecule_utils_spec.js └── webpack.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "es2015", 4 | "es2016", 5 | "es2017", 6 | "stage-2", 7 | "react", 8 | ] 9 | } 10 | 11 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | example/js/bipyridine_model_data.js 2 | example/js/bipyridine_styles.js 3 | example/js/3aid_model_data.js 4 | example/js/3aid_styles.js 5 | example/js/orbital.js 6 | example/js/1kbu.js 7 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "airbnb", 3 | "rules": { 4 | "react/jsx-no-bind": 0, 5 | "react/no-unused-prop-types": 1, 6 | }, 7 | "parser": "babel-eslint", 8 | "globals": { 9 | "window": true, 10 | "document": true, 11 | }, 12 | } 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | npm-debug.log 4 | reports/ 5 | selenium-debug.log 6 | screenshots/ 7 | .DS_Store 8 | phantomjsdriver.log 9 | .idea 10 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 6.4.0 4 | addons: 5 | apt: 6 | packages: 7 | - oracle-java8-set-default 8 | script: 9 | - npm test 10 | - java -version 11 | - npm run setup-selenium 12 | - npm run example & 13 | - npm run e2e 14 | deploy: 15 | provider: npm 16 | email: justinjmccandless@gmail.com 17 | api_key: 18 | secure: cQQ7nxbqZEPBjd8iRLh8gQGTW9Ueh/c2MU/pVkJsaCA3aM90kJF/ekAJI0NAeipsT1vEXPs554vMK8KjTgNCbrklf8hdxj36sMmJPWR8/+yXdsSrPXCLurpemjhAQCtIdFteB13k62OREE8QD9IwQjqKRH63UJH8pIjmAN5VJe6t9mpaNP8lQfR+CTJvfgNLJcWuabFF3tXJ4BJB0aJYfeUPT86qoTY2vQPtPKOTC1urZx/+u4O0vawKYCJizxk5+NAVDndvBh5q0qf98OKeceRs7tdvhuQsCeN0OsM93oqbOsJ+sfO1xIuQ3aRbd+xWF3GE6kJH9mMryZ6uD+K+EwM12AoaFMFrPoV1RycnzHmN3cXr2BeFbVza4DTHCubfF0yRf2277ykOyTnXGcAy0ntKy+pj/V5Ftrl7pCikDEXBhppohEp/vaWaGUCPb6VhU4T5W5kdwt4GAD01D5q5LPJgIkxfjqzixixrIw0CkmNb7vOdKnuQoadC4i7YCf3MeMZnEqgB2EJTlCezQL7qZVJhRYNRL0uPaQ7g7WH30C77lhr3FfJc2q7gOVulv1XbZkHh2YF2hSTE/FuV4cgM/7tl8xABppKOqxuRk8DH7oXv6iFan+XzCKQkV6TcnWd1TweJPOiJhkF8S24RbUgAQDrPHsr76fBEntepfvZonLY= 19 | skip_cleanup: true 20 | on: 21 | tags: true 22 | repo: Autodesk/molecule-3d-for-react 23 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Molecule3d 2 | [![Build Status](https://travis-ci.org/Autodesk/molecule-3d-for-react.svg?branch=master)](https://travis-ci.org/Autodesk/molecule-3d-for-react) 3 | 4 | A data-bound React wrapper for [3dmol.js](http://3dmol.csb.pitt.edu) that visualizes any molecule in 3D. 5 | 6 | screen shot 7 | 8 | ## Installation 9 | 10 | npm install molecule-3d-for-react 11 | 12 | ## Usage 13 | 19 | 20 | See below for the full spec of what data can be passed in, and check out [example/js/main.js](https://github.com/Autodesk/molecule-3d-for-react/blob/master/example/js/main.js) for a working example. 21 | 22 | ## Props 23 | In order to set up your molecule visualization, just pass in the proper props data to the React component. Here are all of the parameters with explanations: 24 | 25 | ### modelData {Object} Required 26 | JSON data representing the actual molecular input. Of the form: 27 | 28 | { 29 | atoms: [{ 30 | serial, 31 | name, 32 | elem, 33 | mass_magnitude, 34 | residue_index, 35 | esidue_name, 36 | chain, 37 | positions, 38 | momenta, 39 | }, ... ], 40 | bonds: [{ 41 | atom1_index, 42 | atom2_index, 43 | bond_order, 44 | }, ... ], 45 | } 46 | 47 | An example of full working modelData for a real molecule can be found in [example/js/bipyridine_model_data.js](https://github.com/Autodesk/molecule-3d-for-react/blob/master/example/js/bipyridine_model_data.js). 48 | 49 | ### backgroundColor {String} ['#73757C'] 50 | The background color of the visualization. 51 | 52 | ### backgroundOpacity {Number 0-1} [1.0] 53 | The opacity of the background. 54 | 55 | ### atomLabelsShown {Boolean} [false] 56 | Indicates whether or not to show text labels on all atoms. 57 | 58 | ### styles {Array of Objects} [[]] 59 | An array indicating how to style individual atoms. Atoms are indicated by index, so the first style in this array corresponds to the first atom in `model_data.atoms`. Of the form: 60 | 61 | [ 62 | { 63 | visualization_type: 'stick'|'sphere'|'cartoon', 64 | color: '#abcdef', 65 | }, ... 66 | ] 67 | 68 | An example of a styles array for the bipyridine molecule can be found in [example/js/bipyridine_styles.js](https://github.com/Autodesk/molecule-3d-for-react/blob/master/example/js/bipyridine_styles.js). 69 | 70 | ### selectedAtomIds {Array of Numbers} [[]] 71 | An array of atom indices indicating which atoms should be visually selected. 72 | 73 | ### selectionType {String} ['Atom'] 74 | A string indicating whether clicks select atoms ('Atom'), residues ('Residue'), or chains ('Chain'). 75 | 76 | ### shapes {Array of Objects} [[]] 77 | Indicates any shapes to display in the visualization using 3Dmol.js's [addShape method](http://3dmol.csb.pitt.edu/doc/$3Dmol.GLViewer.html#addShape). For example: 78 | 79 | [{ 80 | type: 'Sphere', 81 | x: 0, 82 | y: 0, 83 | z: 0, 84 | }] 85 | 86 | ### labels {Array of Objects} [[]] 87 | Labels to draw using 3Dmol.js's [addLabel method](http://3dmol.csb.pitt.edu/doc/$3Dmol.GLViewer.html#addLabel). The text for the field is expected as `label.text`. For example: 88 | 89 | ```javascript 90 | [{'backgroundColor': '0x000000', 91 | 'backgroundOpacity': 1.0, 92 | 'borderColor': 'black', 93 | 'fontColor': '0xffffff', 94 | 'fontSize': 14, 95 | 'position': 96 | {'x': -1.84, 97 | 'y': 8.30, 98 | 'z': 33.87}, 99 | 'text': 'PRO1'}] 100 | ``` 101 | 102 | ### orbital {Object} [{}] 103 | Indicates an orbital to display using 3Dmol.js's [addIsosurface method](http://3dmol.csb.pitt.edu/doc/$3Dmol.GLViewer.html#addIsosurface). Of the type: 104 | 105 | { 106 | cube_file, 107 | iso_val, 108 | opacity, 109 | } 110 | 111 | ### onRenderNewData {function} [(glviewer) => {}] 112 | A callback for when the modelData has changed and it has been re-rendered in the viewer. 113 | 114 | ## Example 115 | 116 | screen shot 117 | 118 | An example is included which provides data-bound inputs that you can play with to see how they affect the visualization. To run it, use the command: 119 | 120 | npm run example 121 | 122 | ## What about 2d? 123 | Take a look at our sister project, [molecule-2d-for-react](https://github.com/Autodesk/molecule-2d-for-react), for a React component with a similar interface that renders a 2d visualization. 124 | 125 | 126 | ## Development 127 | Running the example above will also set up a typical development flow, where any changes to the code will be immediately reflected in the browser. 128 | 129 | ### Development within another project 130 | If you're using this in another project and want to make changes to this repository locally and see them reflected in your other project, first you'll need to do some setup. You can point your other project to use the local copy of molecule-3d-for-react like this: 131 | 132 | cd ~/path/to/molecule-3d-for-react 133 | npm link 134 | cd ~/path/to/other-project 135 | npm link molecule-3d-for-react 136 | 137 | See [this great blog post](http://justjs.com/posts/npm-link-developing-your-own-npm-modules-without-tears) for more info on `npm link`. 138 | 139 | Once you've linked your other project, you'll need to build molecule-3d-for-react (and likely your other project, too) every time you want your changes to reflect in your other project. You can do this manually with `npm run build`. If you want to rebuild molecule-3d-for-react automatically every time a change is made, run `npm run watch`. 140 | 141 | ### Running Tests 142 | Unit tests can be run with: 143 | 144 | npm test 145 | 146 | End-to-end tests can be run with: 147 | 148 | npm run setup-selenium 149 | npm run e2e 150 | 151 | ### Releasing a new version 152 | Travis automatically publishes any new tagged commit to NPM. The best way to take advantage of this is to first create a new tagged commit using `npm version`: 153 | 154 | npm version patch -m "Upgrade to %s for reasons" 155 | 156 | Then push that commit to a new release branch, push the tag with `git push origin --tags` and open a pull request on Github. When you see that Travis has succeeded in deploying, merge it to master. 157 | 158 | ## License 159 | 160 | Copyright 2016 Autodesk Inc. 161 | 162 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at 163 | 164 | http://www.apache.org/licenses/LICENSE-2.0 165 | 166 | Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 167 | 168 | ## Contributing 169 | This project is developed and maintained by the [Molecular Design Toolkit](https://github.com/autodesk/molecular-design-toolkit) project. Please see that project's CONTRIBUTING document for details. 170 | -------------------------------------------------------------------------------- /doc/close_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Autodesk/molecule-3d-for-react/ea30999599755f916a1db1d321b198e21348d1a6/doc/close_screenshot.png -------------------------------------------------------------------------------- /doc/example_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Autodesk/molecule-3d-for-react/ea30999599755f916a1db1d321b198e21348d1a6/doc/example_screenshot.png -------------------------------------------------------------------------------- /example/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | indent_size = 4 8 | indent_style = space 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /example/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | # Include your project-specific ignores in this file 2 | # Read about how to use .gitignore: https://help.github.com/articles/ignoring-files 3 | -------------------------------------------------------------------------------- /example/.htaccess: -------------------------------------------------------------------------------- 1 | # Apache Server Configs v2.14.0 | MIT License 2 | # https://github.com/h5bp/server-configs-apache 3 | 4 | # (!) Using `.htaccess` files slows down Apache, therefore, if you have 5 | # access to the main server configuration file (which is usually called 6 | # `httpd.conf`), you should add this logic there. 7 | # 8 | # https://httpd.apache.org/docs/current/howto/htaccess.html. 9 | 10 | # ###################################################################### 11 | # # CROSS-ORIGIN # 12 | # ###################################################################### 13 | 14 | # ---------------------------------------------------------------------- 15 | # | Cross-origin requests | 16 | # ---------------------------------------------------------------------- 17 | 18 | # Allow cross-origin requests. 19 | # 20 | # https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS 21 | # http://enable-cors.org/ 22 | # http://www.w3.org/TR/cors/ 23 | 24 | # 25 | # Header set Access-Control-Allow-Origin "*" 26 | # 27 | 28 | # ---------------------------------------------------------------------- 29 | # | Cross-origin images | 30 | # ---------------------------------------------------------------------- 31 | 32 | # Send the CORS header for images when browsers request it. 33 | # 34 | # https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image 35 | # https://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html 36 | 37 | 38 | 39 | 40 | SetEnvIf Origin ":" IS_CORS 41 | Header set Access-Control-Allow-Origin "*" env=IS_CORS 42 | 43 | 44 | 45 | 46 | # ---------------------------------------------------------------------- 47 | # | Cross-origin web fonts | 48 | # ---------------------------------------------------------------------- 49 | 50 | # Allow cross-origin access to web fonts. 51 | 52 | 53 | 54 | Header set Access-Control-Allow-Origin "*" 55 | 56 | 57 | 58 | # ---------------------------------------------------------------------- 59 | # | Cross-origin resource timing | 60 | # ---------------------------------------------------------------------- 61 | 62 | # Allow cross-origin access to the timing information for all resources. 63 | # 64 | # If a resource isn't served with a `Timing-Allow-Origin` header that 65 | # would allow its timing information to be shared with the document, 66 | # some of the attributes of the `PerformanceResourceTiming` object will 67 | # be set to zero. 68 | # 69 | # http://www.w3.org/TR/resource-timing/ 70 | # http://www.stevesouders.com/blog/2014/08/21/resource-timing-practical-tips/ 71 | 72 | # 73 | # Header set Timing-Allow-Origin: "*" 74 | # 75 | 76 | 77 | # ###################################################################### 78 | # # ERRORS # 79 | # ###################################################################### 80 | 81 | # ---------------------------------------------------------------------- 82 | # | Custom error messages/pages | 83 | # ---------------------------------------------------------------------- 84 | 85 | # Customize what Apache returns to the client in case of an error. 86 | # https://httpd.apache.org/docs/current/mod/core.html#errordocument 87 | 88 | ErrorDocument 404 /404.html 89 | 90 | # ---------------------------------------------------------------------- 91 | # | Error prevention | 92 | # ---------------------------------------------------------------------- 93 | 94 | # Disable the pattern matching based on filenames. 95 | # 96 | # This setting prevents Apache from returning a 404 error as the result 97 | # of a rewrite when the directory with the same name does not exist. 98 | # 99 | # https://httpd.apache.org/docs/current/content-negotiation.html#multiviews 100 | 101 | Options -MultiViews 102 | 103 | 104 | # ###################################################################### 105 | # # INTERNET EXPLORER # 106 | # ###################################################################### 107 | 108 | # ---------------------------------------------------------------------- 109 | # | Document modes | 110 | # ---------------------------------------------------------------------- 111 | 112 | # Force Internet Explorer 8/9/10 to render pages in the highest mode 113 | # available in the various cases when it may not. 114 | # 115 | # https://hsivonen.fi/doctype/#ie8 116 | # 117 | # (!) Starting with Internet Explorer 11, document modes are deprecated. 118 | # If your business still relies on older web apps and services that were 119 | # designed for older versions of Internet Explorer, you might want to 120 | # consider enabling `Enterprise Mode` throughout your company. 121 | # 122 | # https://msdn.microsoft.com/en-us/library/ie/bg182625.aspx#docmode 123 | # http://blogs.msdn.com/b/ie/archive/2014/04/02/stay-up-to-date-with-enterprise-mode-for-internet-explorer-11.aspx 124 | 125 | 126 | 127 | Header set X-UA-Compatible "IE=edge" 128 | 129 | # `mod_headers` cannot match based on the content-type, however, 130 | # the `X-UA-Compatible` response header should be send only for 131 | # HTML documents and not for the other resources. 132 | 133 | 134 | Header unset X-UA-Compatible 135 | 136 | 137 | 138 | 139 | # ---------------------------------------------------------------------- 140 | # | Iframes cookies | 141 | # ---------------------------------------------------------------------- 142 | 143 | # Allow cookies to be set from iframes in Internet Explorer. 144 | # 145 | # https://msdn.microsoft.com/en-us/library/ms537343.aspx 146 | # http://www.w3.org/TR/2000/CR-P3P-20001215/ 147 | 148 | # 149 | # Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" 150 | # 151 | 152 | 153 | # ###################################################################### 154 | # # MEDIA TYPES AND CHARACTER ENCODINGS # 155 | # ###################################################################### 156 | 157 | # ---------------------------------------------------------------------- 158 | # | Media types | 159 | # ---------------------------------------------------------------------- 160 | 161 | # Serve resources with the proper media types (f.k.a. MIME types). 162 | # 163 | # https://www.iana.org/assignments/media-types/media-types.xhtml 164 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addtype 165 | 166 | 167 | 168 | # Data interchange 169 | 170 | AddType application/atom+xml atom 171 | AddType application/json json map topojson 172 | AddType application/ld+json jsonld 173 | AddType application/rss+xml rss 174 | AddType application/vnd.geo+json geojson 175 | AddType application/xml rdf xml 176 | 177 | 178 | # JavaScript 179 | 180 | # Normalize to standard type. 181 | # https://tools.ietf.org/html/rfc4329#section-7.2 182 | 183 | AddType application/javascript js 184 | 185 | 186 | # Manifest files 187 | 188 | AddType application/manifest+json webmanifest 189 | AddType application/x-web-app-manifest+json webapp 190 | AddType text/cache-manifest appcache 191 | 192 | 193 | # Media files 194 | 195 | AddType audio/mp4 f4a f4b m4a 196 | AddType audio/ogg oga ogg opus 197 | AddType image/bmp bmp 198 | AddType image/svg+xml svg svgz 199 | AddType image/webp webp 200 | AddType video/mp4 f4v f4p m4v mp4 201 | AddType video/ogg ogv 202 | AddType video/webm webm 203 | AddType video/x-flv flv 204 | 205 | # Serving `.ico` image files with a different media type 206 | # prevents Internet Explorer from displaying then as images: 207 | # https://github.com/h5bp/html5-boilerplate/commit/37b5fec090d00f38de64b591bcddcb205aadf8ee 208 | 209 | AddType image/x-icon cur ico 210 | 211 | 212 | # Web fonts 213 | 214 | AddType application/font-woff woff 215 | AddType application/font-woff2 woff2 216 | AddType application/vnd.ms-fontobject eot 217 | 218 | # Browsers usually ignore the font media types and simply sniff 219 | # the bytes to figure out the font type. 220 | # https://mimesniff.spec.whatwg.org/#matching-a-font-type-pattern 221 | # 222 | # However, Blink and WebKit based browsers will show a warning 223 | # in the console if the following font types are served with any 224 | # other media types. 225 | 226 | AddType application/x-font-ttf ttc ttf 227 | AddType font/opentype otf 228 | 229 | 230 | # Other 231 | 232 | AddType application/octet-stream safariextz 233 | AddType application/x-bb-appworld bbaw 234 | AddType application/x-chrome-extension crx 235 | AddType application/x-opera-extension oex 236 | AddType application/x-xpinstall xpi 237 | AddType text/vcard vcard vcf 238 | AddType text/vnd.rim.location.xloc xloc 239 | AddType text/vtt vtt 240 | AddType text/x-component htc 241 | 242 | 243 | 244 | # ---------------------------------------------------------------------- 245 | # | Character encodings | 246 | # ---------------------------------------------------------------------- 247 | 248 | # Serve all resources labeled as `text/html` or `text/plain` 249 | # with the media type `charset` parameter set to `UTF-8`. 250 | # 251 | # https://httpd.apache.org/docs/current/mod/core.html#adddefaultcharset 252 | 253 | AddDefaultCharset utf-8 254 | 255 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 256 | 257 | # Serve the following file types with the media type `charset` 258 | # parameter set to `UTF-8`. 259 | # 260 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addcharset 261 | 262 | 263 | AddCharset utf-8 .atom \ 264 | .bbaw \ 265 | .css \ 266 | .geojson \ 267 | .js \ 268 | .json \ 269 | .jsonld \ 270 | .manifest \ 271 | .rdf \ 272 | .rss \ 273 | .topojson \ 274 | .vtt \ 275 | .webapp \ 276 | .webmanifest \ 277 | .xloc \ 278 | .xml 279 | 280 | 281 | 282 | # ###################################################################### 283 | # # REWRITES # 284 | # ###################################################################### 285 | 286 | # ---------------------------------------------------------------------- 287 | # | Rewrite engine | 288 | # ---------------------------------------------------------------------- 289 | 290 | # (1) Turn on the rewrite engine (this is necessary in order for 291 | # the `RewriteRule` directives to work). 292 | # 293 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteEngine 294 | # 295 | # (2) Enable the `FollowSymLinks` option if it isn't already. 296 | # 297 | # https://httpd.apache.org/docs/current/mod/core.html#options 298 | # 299 | # (3) If your web host doesn't allow the `FollowSymlinks` option, 300 | # you need to comment it out or remove it, and then uncomment 301 | # the `Options +SymLinksIfOwnerMatch` line (4), but be aware 302 | # of the performance impact. 303 | # 304 | # https://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks 305 | # 306 | # (4) Some cloud hosting services will require you set `RewriteBase`. 307 | # 308 | # https://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-modrewrite-not-working-on-my-site 309 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase 310 | # 311 | # (5) Depending on how your server is set up, you may also need to 312 | # use the `RewriteOptions` directive to enable some options for 313 | # the rewrite engine. 314 | # 315 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions 316 | # 317 | # (6) Set %{ENV:PROTO} variable, to allow rewrites to redirect with the 318 | # appropriate schema automatically (http or https). 319 | 320 | 321 | 322 | # (1) 323 | RewriteEngine On 324 | 325 | # (2) 326 | Options +FollowSymlinks 327 | 328 | # (3) 329 | # Options +SymLinksIfOwnerMatch 330 | 331 | # (4) 332 | # RewriteBase / 333 | 334 | # (5) 335 | # RewriteOptions 336 | 337 | # (6) 338 | RewriteCond %{HTTPS} =on 339 | RewriteRule ^ - [env=proto:https] 340 | RewriteCond %{HTTPS} !=on 341 | RewriteRule ^ - [env=proto:http] 342 | 343 | 344 | 345 | # ---------------------------------------------------------------------- 346 | # | Forcing `https://` | 347 | # ---------------------------------------------------------------------- 348 | 349 | # Redirect from the `http://` to the `https://` version of the URL. 350 | # https://wiki.apache.org/httpd/RewriteHTTPToHTTPS 351 | 352 | # 353 | # RewriteEngine On 354 | # RewriteCond %{HTTPS} !=on 355 | # RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] 356 | # 357 | 358 | # ---------------------------------------------------------------------- 359 | # | Suppressing / Forcing the `www.` at the beginning of URLs | 360 | # ---------------------------------------------------------------------- 361 | 362 | # The same content should never be available under two different 363 | # URLs, especially not with and without `www.` at the beginning. 364 | # This can cause SEO problems (duplicate content), and therefore, 365 | # you should choose one of the alternatives and redirect the other 366 | # one. 367 | # 368 | # By default `Option 1` (no `www.`) is activated. 369 | # http://no-www.org/faq.php?q=class_b 370 | # 371 | # If you would prefer to use `Option 2`, just comment out all the 372 | # lines from `Option 1` and uncomment the ones from `Option 2`. 373 | # 374 | # (!) NEVER USE BOTH RULES AT THE SAME TIME! 375 | 376 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 377 | 378 | # Option 1: rewrite www.example.com → example.com 379 | 380 | 381 | RewriteEngine On 382 | RewriteCond %{HTTPS} !=on 383 | RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 384 | RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L] 385 | 386 | 387 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 388 | 389 | # Option 2: rewrite example.com → www.example.com 390 | # 391 | # Be aware that the following might not be a good idea if you use "real" 392 | # subdomains for certain parts of your website. 393 | 394 | # 395 | # RewriteEngine On 396 | # RewriteCond %{HTTPS} !=on 397 | # RewriteCond %{HTTP_HOST} !^www\. [NC] 398 | # RewriteCond %{SERVER_ADDR} !=127.0.0.1 399 | # RewriteCond %{SERVER_ADDR} !=::1 400 | # RewriteRule ^ %{ENV:PROTO}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 401 | # 402 | 403 | 404 | # ###################################################################### 405 | # # SECURITY # 406 | # ###################################################################### 407 | 408 | # ---------------------------------------------------------------------- 409 | # | Clickjacking | 410 | # ---------------------------------------------------------------------- 411 | 412 | # Protect website against clickjacking. 413 | # 414 | # The example below sends the `X-Frame-Options` response header with 415 | # the value `DENY`, informing browsers not to display the content of 416 | # the web page in any frame. 417 | # 418 | # This might not be the best setting for everyone. You should read 419 | # about the other two possible values the `X-Frame-Options` header 420 | # field can have: `SAMEORIGIN` and `ALLOW-FROM`. 421 | # https://tools.ietf.org/html/rfc7034#section-2.1. 422 | # 423 | # Keep in mind that while you could send the `X-Frame-Options` header 424 | # for all of your website’s pages, this has the potential downside that 425 | # it forbids even non-malicious framing of your content (e.g.: when 426 | # users visit your website using a Google Image Search results page). 427 | # 428 | # Nonetheless, you should ensure that you send the `X-Frame-Options` 429 | # header for all pages that allow a user to make a state changing 430 | # operation (e.g: pages that contain one-click purchase links, checkout 431 | # or bank-transfer confirmation pages, pages that make permanent 432 | # configuration changes, etc.). 433 | # 434 | # Sending the `X-Frame-Options` header can also protect your website 435 | # against more than just clickjacking attacks: 436 | # https://cure53.de/xfo-clickjacking.pdf. 437 | # 438 | # https://tools.ietf.org/html/rfc7034 439 | # http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx 440 | # https://www.owasp.org/index.php/Clickjacking 441 | 442 | # 443 | 444 | # Header set X-Frame-Options "DENY" 445 | 446 | # # `mod_headers` cannot match based on the content-type, however, 447 | # # the `X-Frame-Options` response header should be send only for 448 | # # HTML documents and not for the other resources. 449 | 450 | # 451 | # Header unset X-Frame-Options 452 | # 453 | 454 | # 455 | 456 | # ---------------------------------------------------------------------- 457 | # | Content Security Policy (CSP) | 458 | # ---------------------------------------------------------------------- 459 | 460 | # Mitigate the risk of cross-site scripting and other content-injection 461 | # attacks. 462 | # 463 | # This can be done by setting a `Content Security Policy` which 464 | # whitelists trusted sources of content for your website. 465 | # 466 | # The example header below allows ONLY scripts that are loaded from 467 | # the current website's origin (no inline scripts, no CDN, etc). 468 | # That almost certainly won't work as-is for your website! 469 | # 470 | # To make things easier, you can use an online CSP header generator 471 | # such as: http://cspisawesome.com/. 472 | # 473 | # http://content-security-policy.com/ 474 | # http://www.html5rocks.com/en/tutorials/security/content-security-policy/ 475 | # http://www.w3.org/TR/CSP11/). 476 | 477 | # 478 | 479 | # Header set Content-Security-Policy "script-src 'self'; object-src 'self'" 480 | 481 | # # `mod_headers` cannot match based on the content-type, however, 482 | # # the `Content-Security-Policy` response header should be send 483 | # # only for HTML documents and not for the other resources. 484 | 485 | # 486 | # Header unset Content-Security-Policy 487 | # 488 | 489 | # 490 | 491 | # ---------------------------------------------------------------------- 492 | # | File access | 493 | # ---------------------------------------------------------------------- 494 | 495 | # Block access to directories without a default document. 496 | # 497 | # You should leave the following uncommented, as you shouldn't allow 498 | # anyone to surf through every directory on your server (which may 499 | # includes rather private places such as the CMS's directories). 500 | 501 | 502 | Options -Indexes 503 | 504 | 505 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 506 | 507 | # Block access to all hidden files and directories with the exception of 508 | # the visible content from within the `/.well-known/` hidden directory. 509 | # 510 | # These types of files usually contain user preferences or the preserved 511 | # state of an utility, and can include rather private places like, for 512 | # example, the `.git` or `.svn` directories. 513 | # 514 | # The `/.well-known/` directory represents the standard (RFC 5785) path 515 | # prefix for "well-known locations" (e.g.: `/.well-known/manifest.json`, 516 | # `/.well-known/keybase.txt`), and therefore, access to its visible 517 | # content should not be blocked. 518 | # 519 | # https://www.mnot.net/blog/2010/04/07/well-known 520 | # https://tools.ietf.org/html/rfc5785 521 | 522 | 523 | RewriteEngine On 524 | RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC] 525 | RewriteCond %{SCRIPT_FILENAME} -d [OR] 526 | RewriteCond %{SCRIPT_FILENAME} -f 527 | RewriteRule "(^|/)\." - [F] 528 | 529 | 530 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 531 | 532 | # Block access to files that can expose sensitive information. 533 | # 534 | # By default, block access to backup and source files that may be 535 | # left by some text editors and can pose a security risk when anyone 536 | # has access to them. 537 | # 538 | # http://feross.org/cmsploit/ 539 | # 540 | # (!) Update the `` regular expression from below to 541 | # include any files that might end up on your production server and 542 | # can expose sensitive information about your website. These files may 543 | # include: configuration files, files that contain metadata about the 544 | # project (e.g.: project dependencies), build scripts, etc.. 545 | 546 | 547 | 548 | # Apache < 2.3 549 | 550 | Order allow,deny 551 | Deny from all 552 | Satisfy All 553 | 554 | 555 | # Apache ≥ 2.3 556 | 557 | Require all denied 558 | 559 | 560 | 561 | 562 | # ---------------------------------------------------------------------- 563 | # | HTTP Strict Transport Security (HSTS) | 564 | # ---------------------------------------------------------------------- 565 | 566 | # Force client-side SSL redirection. 567 | # 568 | # If a user types `example.com` in their browser, even if the server 569 | # redirects them to the secure version of the website, that still leaves 570 | # a window of opportunity (the initial HTTP connection) for an attacker 571 | # to downgrade or redirect the request. 572 | # 573 | # The following header ensures that browser will ONLY connect to your 574 | # server via HTTPS, regardless of what the users type in the browser's 575 | # address bar. 576 | # 577 | # (!) Remove the `includeSubDomains` optional directive if the website's 578 | # subdomains are not using HTTPS. 579 | # 580 | # http://www.html5rocks.com/en/tutorials/security/transport-layer-security/ 581 | # https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14#section-6.1 582 | # http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx 583 | 584 | # 585 | # Header always set Strict-Transport-Security "max-age=16070400; includeSubDomains" 586 | # 587 | 588 | # ---------------------------------------------------------------------- 589 | # | Reducing MIME type security risks | 590 | # ---------------------------------------------------------------------- 591 | 592 | # Prevent some browsers from MIME-sniffing the response. 593 | # 594 | # This reduces exposure to drive-by download attacks and cross-origin 595 | # data leaks, and should be left uncommented, especially if the server 596 | # is serving user-uploaded content or content that could potentially be 597 | # treated as executable by the browser. 598 | # 599 | # http://www.slideshare.net/hasegawayosuke/owasp-hasegawa 600 | # http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx 601 | # https://msdn.microsoft.com/en-us/library/ie/gg622941.aspx 602 | # https://mimesniff.spec.whatwg.org/ 603 | 604 | 605 | Header set X-Content-Type-Options "nosniff" 606 | 607 | 608 | # ---------------------------------------------------------------------- 609 | # | Reflected Cross-Site Scripting (XSS) attacks | 610 | # ---------------------------------------------------------------------- 611 | 612 | # (1) Try to re-enable the cross-site scripting (XSS) filter built 613 | # into most web browsers. 614 | # 615 | # The filter is usually enabled by default, but in some cases it 616 | # may be disabled by the user. However, in Internet Explorer for 617 | # example, it can be re-enabled just by sending the 618 | # `X-XSS-Protection` header with the value of `1`. 619 | # 620 | # (2) Prevent web browsers from rendering the web page if a potential 621 | # reflected (a.k.a non-persistent) XSS attack is detected by the 622 | # filter. 623 | # 624 | # By default, if the filter is enabled and browsers detect a 625 | # reflected XSS attack, they will attempt to block the attack 626 | # by making the smallest possible modifications to the returned 627 | # web page. 628 | # 629 | # Unfortunately, in some browsers (e.g.: Internet Explorer), 630 | # this default behavior may allow the XSS filter to be exploited, 631 | # thereby, it's better to inform browsers to prevent the rendering 632 | # of the page altogether, instead of attempting to modify it. 633 | # 634 | # https://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities 635 | # 636 | # (!) Do not rely on the XSS filter to prevent XSS attacks! Ensure that 637 | # you are taking all possible measures to prevent XSS attacks, the 638 | # most obvious being: validating and sanitizing your website's inputs. 639 | # 640 | # http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-iv-the-xss-filter.aspx 641 | # http://blogs.msdn.com/b/ieinternals/archive/2011/01/31/controlling-the-internet-explorer-xss-filter-with-the-x-xss-protection-http-header.aspx 642 | # https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29 643 | 644 | # 645 | 646 | # # (1) (2) 647 | # Header set X-XSS-Protection "1; mode=block" 648 | 649 | # # `mod_headers` cannot match based on the content-type, however, 650 | # # the `X-XSS-Protection` response header should be send only for 651 | # # HTML documents and not for the other resources. 652 | 653 | # 654 | # Header unset X-XSS-Protection 655 | # 656 | 657 | # 658 | 659 | # ---------------------------------------------------------------------- 660 | # | Server-side technology information | 661 | # ---------------------------------------------------------------------- 662 | 663 | # Remove the `X-Powered-By` response header that: 664 | # 665 | # * is set by some frameworks and server-side languages 666 | # (e.g.: ASP.NET, PHP), and its value contains information 667 | # about them (e.g.: their name, version number) 668 | # 669 | # * doesn't provide any value as far as users are concern, 670 | # and in some cases, the information provided by it can 671 | # be used by attackers 672 | # 673 | # (!) If you can, you should disable the `X-Powered-By` header from the 674 | # language / framework level (e.g.: for PHP, you can do that by setting 675 | # `expose_php = off` in `php.ini`) 676 | # 677 | # https://php.net/manual/en/ini.core.php#ini.expose-php 678 | 679 | 680 | Header unset X-Powered-By 681 | 682 | 683 | # ---------------------------------------------------------------------- 684 | # | Server software information | 685 | # ---------------------------------------------------------------------- 686 | 687 | # Prevent Apache from adding a trailing footer line containing 688 | # information about the server to the server-generated documents 689 | # (e.g.: error messages, directory listings, etc.) 690 | # 691 | # https://httpd.apache.org/docs/current/mod/core.html#serversignature 692 | 693 | ServerSignature Off 694 | 695 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 696 | 697 | # Prevent Apache from sending in the `Server` response header its 698 | # exact version number, the description of the generic OS-type or 699 | # information about its compiled-in modules. 700 | # 701 | # (!) The `ServerTokens` directive will only work in the main server 702 | # configuration file, so don't try to enable it in the `.htaccess` file! 703 | # 704 | # https://httpd.apache.org/docs/current/mod/core.html#servertokens 705 | 706 | #ServerTokens Prod 707 | 708 | 709 | # ###################################################################### 710 | # # WEB PERFORMANCE # 711 | # ###################################################################### 712 | 713 | # ---------------------------------------------------------------------- 714 | # | Compression | 715 | # ---------------------------------------------------------------------- 716 | 717 | 718 | 719 | # Force compression for mangled `Accept-Encoding` request headers 720 | # https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html 721 | 722 | 723 | 724 | SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding 725 | RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding 726 | 727 | 728 | 729 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 730 | 731 | # Compress all output labeled with one of the following media types. 732 | # 733 | # (!) For Apache versions below version 2.3.7 you don't need to 734 | # enable `mod_filter` and can remove the `` 735 | # and `` lines as `AddOutputFilterByType` is still in 736 | # the core directives. 737 | # 738 | # https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype 739 | 740 | 741 | AddOutputFilterByType DEFLATE "application/atom+xml" \ 742 | "application/javascript" \ 743 | "application/json" \ 744 | "application/ld+json" \ 745 | "application/manifest+json" \ 746 | "application/rdf+xml" \ 747 | "application/rss+xml" \ 748 | "application/schema+json" \ 749 | "application/vnd.geo+json" \ 750 | "application/vnd.ms-fontobject" \ 751 | "application/x-font-ttf" \ 752 | "application/x-javascript" \ 753 | "application/x-web-app-manifest+json" \ 754 | "application/xhtml+xml" \ 755 | "application/xml" \ 756 | "font/eot" \ 757 | "font/opentype" \ 758 | "image/bmp" \ 759 | "image/svg+xml" \ 760 | "image/vnd.microsoft.icon" \ 761 | "image/x-icon" \ 762 | "text/cache-manifest" \ 763 | "text/css" \ 764 | "text/html" \ 765 | "text/javascript" \ 766 | "text/plain" \ 767 | "text/vcard" \ 768 | "text/vnd.rim.location.xloc" \ 769 | "text/vtt" \ 770 | "text/x-component" \ 771 | "text/x-cross-domain-policy" \ 772 | "text/xml" 773 | 774 | 775 | 776 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 777 | 778 | # Map the following filename extensions to the specified 779 | # encoding type in order to make Apache serve the file types 780 | # with the appropriate `Content-Encoding` response header 781 | # (do note that this will NOT make Apache compress them!). 782 | # 783 | # If these files types would be served without an appropriate 784 | # `Content-Enable` response header, client applications (e.g.: 785 | # browsers) wouldn't know that they first need to uncompress 786 | # the response, and thus, wouldn't be able to understand the 787 | # content. 788 | # 789 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addencoding 790 | 791 | 792 | AddEncoding gzip svgz 793 | 794 | 795 | 796 | 797 | # ---------------------------------------------------------------------- 798 | # | Content transformation | 799 | # ---------------------------------------------------------------------- 800 | 801 | # Prevent intermediate caches or proxies (e.g.: such as the ones 802 | # used by mobile network providers) from modifying the website's 803 | # content. 804 | # 805 | # https://tools.ietf.org/html/rfc2616#section-14.9.5 806 | # 807 | # (!) If you are using `mod_pagespeed`, please note that setting 808 | # the `Cache-Control: no-transform` response header will prevent 809 | # `PageSpeed` from rewriting `HTML` files, and, if the 810 | # `ModPagespeedDisableRewriteOnNoTransform` directive isn't set 811 | # to `off`, also from rewriting other resources. 812 | # 813 | # https://developers.google.com/speed/pagespeed/module/configuration#notransform 814 | 815 | # 816 | # Header merge Cache-Control "no-transform" 817 | # 818 | 819 | # ---------------------------------------------------------------------- 820 | # | ETags | 821 | # ---------------------------------------------------------------------- 822 | 823 | # Remove `ETags` as resources are sent with far-future expires headers. 824 | # 825 | # https://developer.yahoo.com/performance/rules.html#etags 826 | # https://tools.ietf.org/html/rfc7232#section-2.3 827 | 828 | # `FileETag None` doesn't work in all cases. 829 | 830 | Header unset ETag 831 | 832 | 833 | FileETag None 834 | 835 | # ---------------------------------------------------------------------- 836 | # | Expires headers | 837 | # ---------------------------------------------------------------------- 838 | 839 | # Serve resources with far-future expires headers. 840 | # 841 | # (!) If you don't control versioning with filename-based 842 | # cache busting, you should consider lowering the cache times 843 | # to something like one week. 844 | # 845 | # https://httpd.apache.org/docs/current/mod/mod_expires.html 846 | 847 | 848 | 849 | ExpiresActive on 850 | ExpiresDefault "access plus 1 month" 851 | 852 | # CSS 853 | 854 | ExpiresByType text/css "access plus 1 year" 855 | 856 | 857 | # Data interchange 858 | 859 | ExpiresByType application/atom+xml "access plus 1 hour" 860 | ExpiresByType application/rdf+xml "access plus 1 hour" 861 | ExpiresByType application/rss+xml "access plus 1 hour" 862 | 863 | ExpiresByType application/json "access plus 0 seconds" 864 | ExpiresByType application/ld+json "access plus 0 seconds" 865 | ExpiresByType application/schema+json "access plus 0 seconds" 866 | ExpiresByType application/vnd.geo+json "access plus 0 seconds" 867 | ExpiresByType application/xml "access plus 0 seconds" 868 | ExpiresByType text/xml "access plus 0 seconds" 869 | 870 | 871 | # Favicon (cannot be renamed!) and cursor images 872 | 873 | ExpiresByType image/vnd.microsoft.icon "access plus 1 week" 874 | ExpiresByType image/x-icon "access plus 1 week" 875 | 876 | # HTML 877 | 878 | ExpiresByType text/html "access plus 0 seconds" 879 | 880 | 881 | # JavaScript 882 | 883 | ExpiresByType application/javascript "access plus 1 year" 884 | ExpiresByType application/x-javascript "access plus 1 year" 885 | ExpiresByType text/javascript "access plus 1 year" 886 | 887 | 888 | # Manifest files 889 | 890 | ExpiresByType application/manifest+json "access plus 1 week" 891 | ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" 892 | ExpiresByType text/cache-manifest "access plus 0 seconds" 893 | 894 | 895 | # Media files 896 | 897 | ExpiresByType audio/ogg "access plus 1 month" 898 | ExpiresByType image/bmp "access plus 1 month" 899 | ExpiresByType image/gif "access plus 1 month" 900 | ExpiresByType image/jpeg "access plus 1 month" 901 | ExpiresByType image/png "access plus 1 month" 902 | ExpiresByType image/svg+xml "access plus 1 month" 903 | ExpiresByType image/webp "access plus 1 month" 904 | ExpiresByType video/mp4 "access plus 1 month" 905 | ExpiresByType video/ogg "access plus 1 month" 906 | ExpiresByType video/webm "access plus 1 month" 907 | 908 | 909 | # Web fonts 910 | 911 | # Embedded OpenType (EOT) 912 | ExpiresByType application/vnd.ms-fontobject "access plus 1 month" 913 | ExpiresByType font/eot "access plus 1 month" 914 | 915 | # OpenType 916 | ExpiresByType font/opentype "access plus 1 month" 917 | 918 | # TrueType 919 | ExpiresByType application/x-font-ttf "access plus 1 month" 920 | 921 | # Web Open Font Format (WOFF) 1.0 922 | ExpiresByType application/font-woff "access plus 1 month" 923 | ExpiresByType application/x-font-woff "access plus 1 month" 924 | ExpiresByType font/woff "access plus 1 month" 925 | 926 | # Web Open Font Format (WOFF) 2.0 927 | ExpiresByType application/font-woff2 "access plus 1 month" 928 | 929 | 930 | # Other 931 | 932 | ExpiresByType text/x-cross-domain-policy "access plus 1 week" 933 | 934 | 935 | 936 | # ---------------------------------------------------------------------- 937 | # | File concatenation | 938 | # ---------------------------------------------------------------------- 939 | 940 | # Allow concatenation from within specific files. 941 | # 942 | # e.g.: 943 | # 944 | # If you have the following lines in a file called, for 945 | # example, `main.combined.js`: 946 | # 947 | # 948 | # 949 | # 950 | # Apache will replace those lines with the content of the 951 | # specified files. 952 | 953 | # 954 | # 955 | # Options +Includes 956 | # AddOutputFilterByType INCLUDES application/javascript \ 957 | # application/x-javascript \ 958 | # text/javascript 959 | # SetOutputFilter INCLUDES 960 | # 961 | # 962 | # Options +Includes 963 | # AddOutputFilterByType INCLUDES text/css 964 | # SetOutputFilter INCLUDES 965 | # 966 | # 967 | 968 | # ---------------------------------------------------------------------- 969 | # | Filename-based cache busting | 970 | # ---------------------------------------------------------------------- 971 | 972 | # If you're not using a build process to manage your filename version 973 | # revving, you might want to consider enabling the following directives 974 | # to route all requests such as `/style.12345.css` to `/style.css`. 975 | # 976 | # To understand why this is important and even a better solution than 977 | # using something like `*.css?v231`, please see: 978 | # http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/ 979 | 980 | # 981 | # RewriteEngine On 982 | # RewriteCond %{REQUEST_FILENAME} !-f 983 | # RewriteRule ^(.+)\.(\d+)\.(bmp|css|cur|gif|ico|jpe?g|js|png|svgz?|webp|webmanifest)$ $1.$3 [L] 984 | # 985 | -------------------------------------------------------------------------------- /example/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Autodesk/molecule-3d-for-react/ea30999599755f916a1db1d321b198e21348d1a6/example/apple-touch-icon.png -------------------------------------------------------------------------------- /example/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /example/crossdomain.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /example/css/home.css: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | } 4 | 5 | .data { 6 | margin-left: 4rem; 7 | } 8 | -------------------------------------------------------------------------------- /example/css/main.css: -------------------------------------------------------------------------------- 1 | /*! HTML5 Boilerplate v5.3.0 | MIT License | https://html5boilerplate.com/ */ 2 | 3 | /* 4 | * What follows is the result of much research on cross-browser styling. 5 | * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal, 6 | * Kroc Camen, and the H5BP dev community and team. 7 | */ 8 | 9 | /* ========================================================================== 10 | Base styles: opinionated defaults 11 | ========================================================================== */ 12 | 13 | html { 14 | color: #222; 15 | font-size: 1em; 16 | line-height: 1.4; 17 | } 18 | 19 | /* 20 | * Remove text-shadow in selection highlight: 21 | * https://twitter.com/miketaylr/status/12228805301 22 | * 23 | * These selection rule sets have to be separate. 24 | * Customize the background color to match your design. 25 | */ 26 | 27 | ::-moz-selection { 28 | background: #b3d4fc; 29 | text-shadow: none; 30 | } 31 | 32 | ::selection { 33 | background: #b3d4fc; 34 | text-shadow: none; 35 | } 36 | 37 | /* 38 | * A better looking default horizontal rule 39 | */ 40 | 41 | hr { 42 | display: block; 43 | height: 1px; 44 | border: 0; 45 | border-top: 1px solid #ccc; 46 | margin: 1em 0; 47 | padding: 0; 48 | } 49 | 50 | /* 51 | * Remove the gap between audio, canvas, iframes, 52 | * images, videos and the bottom of their containers: 53 | * https://github.com/h5bp/html5-boilerplate/issues/440 54 | */ 55 | 56 | audio, 57 | canvas, 58 | iframe, 59 | img, 60 | svg, 61 | video { 62 | vertical-align: middle; 63 | } 64 | 65 | /* 66 | * Remove default fieldset styles. 67 | */ 68 | 69 | fieldset { 70 | border: 0; 71 | margin: 0; 72 | padding: 0; 73 | } 74 | 75 | /* 76 | * Allow only vertical resizing of textareas. 77 | */ 78 | 79 | textarea { 80 | resize: vertical; 81 | } 82 | 83 | /* ========================================================================== 84 | Browser Upgrade Prompt 85 | ========================================================================== */ 86 | 87 | .browserupgrade { 88 | margin: 0.2em 0; 89 | background: #ccc; 90 | color: #000; 91 | padding: 0.2em 0; 92 | } 93 | 94 | /* ========================================================================== 95 | Author's custom styles 96 | ========================================================================== */ 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | /* ========================================================================== 115 | Helper classes 116 | ========================================================================== */ 117 | 118 | /* 119 | * Hide visually and from screen readers 120 | */ 121 | 122 | .hidden { 123 | display: none !important; 124 | } 125 | 126 | /* 127 | * Hide only visually, but have it available for screen readers: 128 | * http://snook.ca/archives/html_and_css/hiding-content-for-accessibility 129 | */ 130 | 131 | .visuallyhidden { 132 | border: 0; 133 | clip: rect(0 0 0 0); 134 | height: 1px; 135 | margin: -1px; 136 | overflow: hidden; 137 | padding: 0; 138 | position: absolute; 139 | width: 1px; 140 | } 141 | 142 | /* 143 | * Extends the .visuallyhidden class to allow the element 144 | * to be focusable when navigated to via the keyboard: 145 | * https://www.drupal.org/node/897638 146 | */ 147 | 148 | .visuallyhidden.focusable:active, 149 | .visuallyhidden.focusable:focus { 150 | clip: auto; 151 | height: auto; 152 | margin: 0; 153 | overflow: visible; 154 | position: static; 155 | width: auto; 156 | } 157 | 158 | /* 159 | * Hide visually and from screen readers, but maintain layout 160 | */ 161 | 162 | .invisible { 163 | visibility: hidden; 164 | } 165 | 166 | /* 167 | * Clearfix: contain floats 168 | * 169 | * For modern browsers 170 | * 1. The space content is one way to avoid an Opera bug when the 171 | * `contenteditable` attribute is included anywhere else in the document. 172 | * Otherwise it causes space to appear at the top and bottom of elements 173 | * that receive the `clearfix` class. 174 | * 2. The use of `table` rather than `block` is only necessary if using 175 | * `:before` to contain the top-margins of child elements. 176 | */ 177 | 178 | .clearfix:before, 179 | .clearfix:after { 180 | content: " "; /* 1 */ 181 | display: table; /* 2 */ 182 | } 183 | 184 | .clearfix:after { 185 | clear: both; 186 | } 187 | 188 | /* ========================================================================== 189 | EXAMPLE Media Queries for Responsive Design. 190 | These examples override the primary ('mobile first') styles. 191 | Modify as content requires. 192 | ========================================================================== */ 193 | 194 | @media only screen and (min-width: 35em) { 195 | /* Style adjustments for viewports that meet the condition */ 196 | } 197 | 198 | @media print, 199 | (-webkit-min-device-pixel-ratio: 1.25), 200 | (min-resolution: 1.25dppx), 201 | (min-resolution: 120dpi) { 202 | /* Style adjustments for high resolution devices */ 203 | } 204 | 205 | /* ========================================================================== 206 | Print styles. 207 | Inlined to avoid the additional HTTP request: 208 | http://www.phpied.com/delay-loading-your-print-css/ 209 | ========================================================================== */ 210 | 211 | @media print { 212 | *, 213 | *:before, 214 | *:after, 215 | *:first-letter, 216 | *:first-line { 217 | background: transparent !important; 218 | color: #000 !important; /* Black prints faster: 219 | http://www.sanbeiji.com/archives/953 */ 220 | box-shadow: none !important; 221 | text-shadow: none !important; 222 | } 223 | 224 | a, 225 | a:visited { 226 | text-decoration: underline; 227 | } 228 | 229 | a[href]:after { 230 | content: " (" attr(href) ")"; 231 | } 232 | 233 | abbr[title]:after { 234 | content: " (" attr(title) ")"; 235 | } 236 | 237 | /* 238 | * Don't show links that are fragment identifiers, 239 | * or use the `javascript:` pseudo protocol 240 | */ 241 | 242 | a[href^="#"]:after, 243 | a[href^="javascript:"]:after { 244 | content: ""; 245 | } 246 | 247 | pre, 248 | blockquote { 249 | border: 1px solid #999; 250 | page-break-inside: avoid; 251 | } 252 | 253 | /* 254 | * Printing Tables: 255 | * http://css-discuss.incutio.com/wiki/Printing_Tables 256 | */ 257 | 258 | thead { 259 | display: table-header-group; 260 | } 261 | 262 | tr, 263 | img { 264 | page-break-inside: avoid; 265 | } 266 | 267 | img { 268 | max-width: 100% !important; 269 | } 270 | 271 | p, 272 | h2, 273 | h3 { 274 | orphans: 3; 275 | widows: 3; 276 | } 277 | 278 | h2, 279 | h3 { 280 | page-break-after: avoid; 281 | } 282 | } 283 | -------------------------------------------------------------------------------- /example/css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS and IE text size adjust after device orientation change, 6 | * without disabling user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -ms-text-size-adjust: 100%; /* 2 */ 12 | -webkit-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 29 | * and Firefox. 30 | * Correct `block` display not defined for `main` in IE 11. 31 | */ 32 | 33 | article, 34 | aside, 35 | details, 36 | figcaption, 37 | figure, 38 | footer, 39 | header, 40 | hgroup, 41 | main, 42 | menu, 43 | nav, 44 | section, 45 | summary { 46 | display: block; 47 | } 48 | 49 | /** 50 | * 1. Correct `inline-block` display not defined in IE 8/9. 51 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 52 | */ 53 | 54 | audio, 55 | canvas, 56 | progress, 57 | video { 58 | display: inline-block; /* 1 */ 59 | vertical-align: baseline; /* 2 */ 60 | } 61 | 62 | /** 63 | * Prevent modern browsers from displaying `audio` without controls. 64 | * Remove excess height in iOS 5 devices. 65 | */ 66 | 67 | audio:not([controls]) { 68 | display: none; 69 | height: 0; 70 | } 71 | 72 | /** 73 | * Address `[hidden]` styling not present in IE 8/9/10. 74 | * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. 75 | */ 76 | 77 | [hidden], 78 | template { 79 | display: none; 80 | } 81 | 82 | /* Links 83 | ========================================================================== */ 84 | 85 | /** 86 | * Remove the gray background color from active links in IE 10. 87 | */ 88 | 89 | a { 90 | background-color: transparent; 91 | } 92 | 93 | /** 94 | * Improve readability of focused elements when they are also in an 95 | * active/hover state. 96 | */ 97 | 98 | a:active, 99 | a:hover { 100 | outline: 0; 101 | } 102 | 103 | /* Text-level semantics 104 | ========================================================================== */ 105 | 106 | /** 107 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome. 108 | */ 109 | 110 | abbr[title] { 111 | border-bottom: 1px dotted; 112 | } 113 | 114 | /** 115 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. 116 | */ 117 | 118 | b, 119 | strong { 120 | font-weight: bold; 121 | } 122 | 123 | /** 124 | * Address styling not present in Safari and Chrome. 125 | */ 126 | 127 | dfn { 128 | font-style: italic; 129 | } 130 | 131 | /** 132 | * Address variable `h1` font-size and margin within `section` and `article` 133 | * contexts in Firefox 4+, Safari, and Chrome. 134 | */ 135 | 136 | h1 { 137 | font-size: 2em; 138 | margin: 0.67em 0; 139 | } 140 | 141 | /** 142 | * Address styling not present in IE 8/9. 143 | */ 144 | 145 | mark { 146 | background: #ff0; 147 | color: #000; 148 | } 149 | 150 | /** 151 | * Address inconsistent and variable font size in all browsers. 152 | */ 153 | 154 | small { 155 | font-size: 80%; 156 | } 157 | 158 | /** 159 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 160 | */ 161 | 162 | sub, 163 | sup { 164 | font-size: 75%; 165 | line-height: 0; 166 | position: relative; 167 | vertical-align: baseline; 168 | } 169 | 170 | sup { 171 | top: -0.5em; 172 | } 173 | 174 | sub { 175 | bottom: -0.25em; 176 | } 177 | 178 | /* Embedded content 179 | ========================================================================== */ 180 | 181 | /** 182 | * Remove border when inside `a` element in IE 8/9/10. 183 | */ 184 | 185 | img { 186 | border: 0; 187 | } 188 | 189 | /** 190 | * Correct overflow not hidden in IE 9/10/11. 191 | */ 192 | 193 | svg:not(:root) { 194 | overflow: hidden; 195 | } 196 | 197 | /* Grouping content 198 | ========================================================================== */ 199 | 200 | /** 201 | * Address margin not present in IE 8/9 and Safari. 202 | */ 203 | 204 | figure { 205 | margin: 1em 40px; 206 | } 207 | 208 | /** 209 | * Address differences between Firefox and other browsers. 210 | */ 211 | 212 | hr { 213 | box-sizing: content-box; 214 | height: 0; 215 | } 216 | 217 | /** 218 | * Contain overflow in all browsers. 219 | */ 220 | 221 | pre { 222 | overflow: auto; 223 | } 224 | 225 | /** 226 | * Address odd `em`-unit font size rendering in all browsers. 227 | */ 228 | 229 | code, 230 | kbd, 231 | pre, 232 | samp { 233 | font-family: monospace, monospace; 234 | font-size: 1em; 235 | } 236 | 237 | /* Forms 238 | ========================================================================== */ 239 | 240 | /** 241 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 242 | * styling of `select`, unless a `border` property is set. 243 | */ 244 | 245 | /** 246 | * 1. Correct color not being inherited. 247 | * Known issue: affects color of disabled elements. 248 | * 2. Correct font properties not being inherited. 249 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 250 | */ 251 | 252 | button, 253 | input, 254 | optgroup, 255 | select, 256 | textarea { 257 | color: inherit; /* 1 */ 258 | font: inherit; /* 2 */ 259 | margin: 0; /* 3 */ 260 | } 261 | 262 | /** 263 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 264 | */ 265 | 266 | button { 267 | overflow: visible; 268 | } 269 | 270 | /** 271 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 272 | * All other form control elements do not inherit `text-transform` values. 273 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 274 | * Correct `select` style inheritance in Firefox. 275 | */ 276 | 277 | button, 278 | select { 279 | text-transform: none; 280 | } 281 | 282 | /** 283 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 284 | * and `video` controls. 285 | * 2. Correct inability to style clickable `input` types in iOS. 286 | * 3. Improve usability and consistency of cursor style between image-type 287 | * `input` and others. 288 | */ 289 | 290 | button, 291 | html input[type="button"], /* 1 */ 292 | input[type="reset"], 293 | input[type="submit"] { 294 | -webkit-appearance: button; /* 2 */ 295 | cursor: pointer; /* 3 */ 296 | } 297 | 298 | /** 299 | * Re-set default cursor for disabled elements. 300 | */ 301 | 302 | button[disabled], 303 | html input[disabled] { 304 | cursor: default; 305 | } 306 | 307 | /** 308 | * Remove inner padding and border in Firefox 4+. 309 | */ 310 | 311 | button::-moz-focus-inner, 312 | input::-moz-focus-inner { 313 | border: 0; 314 | padding: 0; 315 | } 316 | 317 | /** 318 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 319 | * the UA stylesheet. 320 | */ 321 | 322 | input { 323 | line-height: normal; 324 | } 325 | 326 | /** 327 | * It's recommended that you don't attempt to style these elements. 328 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 329 | * 330 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 331 | * 2. Remove excess padding in IE 8/9/10. 332 | */ 333 | 334 | input[type="checkbox"], 335 | input[type="radio"] { 336 | box-sizing: border-box; /* 1 */ 337 | padding: 0; /* 2 */ 338 | } 339 | 340 | /** 341 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 342 | * `font-size` values of the `input`, it causes the cursor style of the 343 | * decrement button to change from `default` to `text`. 344 | */ 345 | 346 | input[type="number"]::-webkit-inner-spin-button, 347 | input[type="number"]::-webkit-outer-spin-button { 348 | height: auto; 349 | } 350 | 351 | /** 352 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome. 353 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. 354 | */ 355 | 356 | input[type="search"] { 357 | -webkit-appearance: textfield; /* 1 */ 358 | box-sizing: content-box; /* 2 */ 359 | } 360 | 361 | /** 362 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 363 | * Safari (but not Chrome) clips the cancel button when the search input has 364 | * padding (and `textfield` appearance). 365 | */ 366 | 367 | input[type="search"]::-webkit-search-cancel-button, 368 | input[type="search"]::-webkit-search-decoration { 369 | -webkit-appearance: none; 370 | } 371 | 372 | /** 373 | * Define consistent border, margin, and padding. 374 | */ 375 | 376 | fieldset { 377 | border: 1px solid #c0c0c0; 378 | margin: 0 2px; 379 | padding: 0.35em 0.625em 0.75em; 380 | } 381 | 382 | /** 383 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 384 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 385 | */ 386 | 387 | legend { 388 | border: 0; /* 1 */ 389 | padding: 0; /* 2 */ 390 | } 391 | 392 | /** 393 | * Remove default vertical scrollbar in IE 8/9/10/11. 394 | */ 395 | 396 | textarea { 397 | overflow: auto; 398 | } 399 | 400 | /** 401 | * Don't inherit the `font-weight` (applied by a rule above). 402 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 403 | */ 404 | 405 | optgroup { 406 | font-weight: bold; 407 | } 408 | 409 | /* Tables 410 | ========================================================================== */ 411 | 412 | /** 413 | * Remove most spacing between table cells. 414 | */ 415 | 416 | table { 417 | border-collapse: collapse; 418 | border-spacing: 0; 419 | } 420 | 421 | td, 422 | th { 423 | padding: 0; 424 | } 425 | -------------------------------------------------------------------------------- /example/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Autodesk/molecule-3d-for-react/ea30999599755f916a1db1d321b198e21348d1a6/example/favicon.ico -------------------------------------------------------------------------------- /example/img/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Autodesk/molecule-3d-for-react/ea30999599755f916a1db1d321b198e21348d1a6/example/img/.gitignore -------------------------------------------------------------------------------- /example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 22 | 23 | 24 |
25 |

molecule-3d-for-react

26 |
27 |
28 |
29 | 30 | 31 | 32 | 33 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /example/js/bipyridine.sdf: -------------------------------------------------------------------------------- 1 | 2 | OpenBabel08091616573D 3 | 4 | 20 21 0 0 0 0 0 0 0 0999 V2000 5 | -0.7015 -1.2104 0.0598 N 0 0 0 0 0 0 0 0 0 0 0 0 6 | -1.4095 -0.0497 0.0357 C 0 0 0 0 0 0 0 0 0 0 0 0 7 | -0.7311 1.1783 0.0646 C 0 0 0 0 0 0 0 0 0 0 0 0 8 | 0.6605 1.2269 -0.0027 C 0 0 0 0 0 0 0 0 0 0 0 0 9 | 1.3724 0.0469 -0.0163 C 0 0 0 0 0 0 0 0 0 0 0 0 10 | 0.6575 -1.1366 0.0579 C 0 0 0 0 0 0 0 0 0 0 0 0 11 | -2.9039 -0.1126 -0.1283 C 0 0 0 0 0 0 0 0 0 0 0 0 12 | -3.5029 -1.3283 -0.2388 N 0 0 0 0 0 0 0 0 0 0 0 0 13 | -4.8314 -1.3682 -0.5322 C 0 0 0 0 0 0 0 0 0 0 0 0 14 | -5.6084 -0.2481 -0.7751 C 0 0 0 0 0 0 0 0 0 0 0 0 15 | -5.0146 0.9870 -0.6303 C 0 0 0 0 0 0 0 0 0 0 0 0 16 | -3.6706 1.0545 -0.2661 C 0 0 0 0 0 0 0 0 0 0 0 0 17 | -1.2549 2.1214 0.1109 H 0 0 0 0 0 0 0 0 0 0 0 0 18 | 1.1641 2.1886 -0.0484 H 0 0 0 0 0 0 0 0 0 0 0 0 19 | 2.4567 0.0509 -0.0673 H 0 0 0 0 0 0 0 0 0 0 0 0 20 | 1.1771 -2.0879 0.1185 H 0 0 0 0 0 0 0 0 0 0 0 0 21 | -5.2721 -2.3596 -0.5697 H 0 0 0 0 0 0 0 0 0 0 0 0 22 | -6.6538 -0.3342 -1.0547 H 0 0 0 0 0 0 0 0 0 0 0 0 23 | -5.5730 1.9036 -0.7995 H 0 0 0 0 0 0 0 0 0 0 0 0 24 | -3.2478 2.0379 -0.1250 H 0 0 0 0 0 0 0 0 0 0 0 0 25 | 2 1 2 0 0 0 0 26 | 3 2 1 0 0 0 0 27 | 4 3 2 0 0 0 0 28 | 5 4 1 0 0 0 0 29 | 6 1 1 0 0 0 0 30 | 6 5 2 0 0 0 0 31 | 7 2 1 0 0 0 0 32 | 8 7 2 0 0 0 0 33 | 9 8 1 0 0 0 0 34 | 10 9 2 0 0 0 0 35 | 11 10 1 0 0 0 0 36 | 12 7 1 0 0 0 0 37 | 12 11 2 0 0 0 0 38 | 13 3 1 0 0 0 0 39 | 14 4 1 0 0 0 0 40 | 15 5 1 0 0 0 0 41 | 16 6 1 0 0 0 0 42 | 17 9 1 0 0 0 0 43 | 18 10 1 0 0 0 0 44 | 19 11 1 0 0 0 0 45 | 20 12 1 0 0 0 0 46 | M END 47 | $$$$ 48 | -------------------------------------------------------------------------------- /example/js/bipyridine_model_data.js: -------------------------------------------------------------------------------- 1 | export default { 2 | "atoms": [ 3 | { 4 | "elem": "n", 5 | "mass_magnitude": 14.003074, 6 | "momenta": [ 7 | 0, 8 | 0, 9 | 0 10 | ], 11 | "name": "n", 12 | "positions": [ 13 | -0.7015, 14 | -1.2104, 15 | 0.0598 16 | ], 17 | "residue_index": 0, 18 | "serial": 0 19 | }, 20 | { 21 | "elem": "c", 22 | "mass_magnitude": 12, 23 | "momenta": [ 24 | 0, 25 | 0, 26 | 0 27 | ], 28 | "name": "c", 29 | "positions": [ 30 | -1.4095, 31 | -0.0497, 32 | 0.0357 33 | ], 34 | "residue_index": 0, 35 | "serial": 1 36 | }, 37 | { 38 | "elem": "c", 39 | "mass_magnitude": 12, 40 | "momenta": [ 41 | 0, 42 | 0, 43 | 0 44 | ], 45 | "name": "c3", 46 | "positions": [ 47 | -0.7311, 48 | 1.1783, 49 | 0.0646 50 | ], 51 | "residue_index": 0, 52 | "serial": 2 53 | }, 54 | { 55 | "elem": "c", 56 | "mass_magnitude": 12, 57 | "momenta": [ 58 | 0, 59 | 0, 60 | 0 61 | ], 62 | "name": "c4", 63 | "positions": [ 64 | 0.6605, 65 | 1.2269, 66 | -0.0027 67 | ], 68 | "residue_index": 0, 69 | "serial": 3 70 | }, 71 | { 72 | "elem": "c", 73 | "mass_magnitude": 12, 74 | "momenta": [ 75 | 0, 76 | 0, 77 | 0 78 | ], 79 | "name": "c5", 80 | "positions": [ 81 | 1.3724, 82 | 0.0469, 83 | -0.0163 84 | ], 85 | "residue_index": 0, 86 | "serial": 4 87 | }, 88 | { 89 | "elem": "c", 90 | "mass_magnitude": 12, 91 | "momenta": [ 92 | 0, 93 | 0, 94 | 0 95 | ], 96 | "name": "c6", 97 | "positions": [ 98 | 0.6575, 99 | -1.1366, 100 | 0.0579 101 | ], 102 | "residue_index": 0, 103 | "serial": 5 104 | }, 105 | { 106 | "elem": "c", 107 | "mass_magnitude": 12, 108 | "momenta": [ 109 | 0, 110 | 0, 111 | 0 112 | ], 113 | "name": "c7", 114 | "positions": [ 115 | -2.9039, 116 | -0.1126, 117 | -0.1283 118 | ], 119 | "residue_index": 0, 120 | "serial": 6 121 | }, 122 | { 123 | "elem": "n", 124 | "mass_magnitude": 14.003074, 125 | "momenta": [ 126 | 0, 127 | 0, 128 | 0 129 | ], 130 | "name": "n8", 131 | "positions": [ 132 | -3.5029, 133 | -1.3283, 134 | -0.2388 135 | ], 136 | "residue_index": 0, 137 | "serial": 7 138 | }, 139 | { 140 | "elem": "c", 141 | "mass_magnitude": 12, 142 | "momenta": [ 143 | 0, 144 | 0, 145 | 0 146 | ], 147 | "name": "c9", 148 | "positions": [ 149 | -4.8314, 150 | -1.3682, 151 | -0.5322 152 | ], 153 | "residue_index": 0, 154 | "serial": 8 155 | }, 156 | { 157 | "elem": "c", 158 | "mass_magnitude": 12, 159 | "momenta": [ 160 | 0, 161 | 0, 162 | 0 163 | ], 164 | "name": "c10", 165 | "positions": [ 166 | -5.6084, 167 | -0.2481, 168 | -0.7751 169 | ], 170 | "residue_index": 0, 171 | "serial": 9 172 | }, 173 | { 174 | "elem": "c", 175 | "mass_magnitude": 12, 176 | "momenta": [ 177 | 0, 178 | 0, 179 | 0 180 | ], 181 | "name": "c11", 182 | "positions": [ 183 | -5.0146, 184 | 0.987, 185 | -0.6303 186 | ], 187 | "residue_index": 0, 188 | "serial": 10 189 | }, 190 | { 191 | "elem": "c", 192 | "mass_magnitude": 12, 193 | "momenta": [ 194 | 0, 195 | 0, 196 | 0 197 | ], 198 | "name": "c12", 199 | "positions": [ 200 | -3.6706, 201 | 1.0545, 202 | -0.2661 203 | ], 204 | "residue_index": 0, 205 | "serial": 11 206 | }, 207 | { 208 | "elem": "h", 209 | "mass_magnitude": 1.007825, 210 | "momenta": [ 211 | 0, 212 | 0, 213 | 0 214 | ], 215 | "name": "h", 216 | "positions": [ 217 | -1.2549, 218 | 2.1214, 219 | 0.1109 220 | ], 221 | "residue_index": 0, 222 | "serial": 12 223 | }, 224 | { 225 | "elem": "h", 226 | "mass_magnitude": 1.007825, 227 | "momenta": [ 228 | 0, 229 | 0, 230 | 0 231 | ], 232 | "name": "h14", 233 | "positions": [ 234 | 1.1641, 235 | 2.1886, 236 | -0.0484 237 | ], 238 | "residue_index": 0, 239 | "serial": 13 240 | }, 241 | { 242 | "elem": "h", 243 | "mass_magnitude": 1.007825, 244 | "momenta": [ 245 | 0, 246 | 0, 247 | 0 248 | ], 249 | "name": "h15", 250 | "positions": [ 251 | 2.4567, 252 | 0.0509, 253 | -0.0673 254 | ], 255 | "residue_index": 0, 256 | "serial": 14 257 | }, 258 | { 259 | "elem": "h", 260 | "mass_magnitude": 1.007825, 261 | "momenta": [ 262 | 0, 263 | 0, 264 | 0 265 | ], 266 | "name": "h16", 267 | "positions": [ 268 | 1.1771, 269 | -2.0879, 270 | 0.1185 271 | ], 272 | "residue_index": 0, 273 | "serial": 15 274 | }, 275 | { 276 | "elem": "h", 277 | "mass_magnitude": 1.007825, 278 | "momenta": [ 279 | 0, 280 | 0, 281 | 0 282 | ], 283 | "name": "h17", 284 | "positions": [ 285 | -5.2721, 286 | -2.3596, 287 | -0.5697 288 | ], 289 | "residue_index": 0, 290 | "serial": 16 291 | }, 292 | { 293 | "elem": "h", 294 | "mass_magnitude": 1.007825, 295 | "momenta": [ 296 | 0, 297 | 0, 298 | 0 299 | ], 300 | "name": "h18", 301 | "positions": [ 302 | -6.6538, 303 | -0.3342, 304 | -1.0547 305 | ], 306 | "residue_index": 0, 307 | "serial": 17 308 | }, 309 | { 310 | "elem": "h", 311 | "mass_magnitude": 1.007825, 312 | "momenta": [ 313 | 0, 314 | 0, 315 | 0 316 | ], 317 | "name": "h19", 318 | "positions": [ 319 | -5.573, 320 | 1.9036, 321 | -0.7995 322 | ], 323 | "residue_index": 0, 324 | "serial": 18 325 | }, 326 | { 327 | "elem": "h", 328 | "mass_magnitude": 1.007825, 329 | "momenta": [ 330 | 0, 331 | 0, 332 | 0 333 | ], 334 | "name": "h20", 335 | "positions": [ 336 | -3.2478, 337 | 2.0379, 338 | -0.125 339 | ], 340 | "residue_index": 0, 341 | "serial": 19 342 | } 343 | ], 344 | "bonds": [ 345 | { 346 | "atom1_index": 1, 347 | "atom2_index": 6, 348 | "bond_order": 1 349 | }, 350 | { 351 | "atom1_index": 1, 352 | "atom2_index": 2, 353 | "bond_order": 1 354 | }, 355 | { 356 | "atom1_index": 4, 357 | "atom2_index": 5, 358 | "bond_order": 2 359 | }, 360 | { 361 | "atom1_index": 4, 362 | "atom2_index": 14, 363 | "bond_order": 1 364 | }, 365 | { 366 | "atom1_index": 7, 367 | "atom2_index": 8, 368 | "bond_order": 1 369 | }, 370 | { 371 | "atom1_index": 9, 372 | "atom2_index": 17, 373 | "bond_order": 1 374 | }, 375 | { 376 | "atom1_index": 9, 377 | "atom2_index": 10, 378 | "bond_order": 1 379 | }, 380 | { 381 | "atom1_index": 8, 382 | "atom2_index": 9, 383 | "bond_order": 2 384 | }, 385 | { 386 | "atom1_index": 8, 387 | "atom2_index": 16, 388 | "bond_order": 1 389 | }, 390 | { 391 | "atom1_index": 6, 392 | "atom2_index": 7, 393 | "bond_order": 2 394 | }, 395 | { 396 | "atom1_index": 6, 397 | "atom2_index": 11, 398 | "bond_order": 1 399 | }, 400 | { 401 | "atom1_index": 0, 402 | "atom2_index": 5, 403 | "bond_order": 1 404 | }, 405 | { 406 | "atom1_index": 0, 407 | "atom2_index": 1, 408 | "bond_order": 2 409 | }, 410 | { 411 | "atom1_index": 11, 412 | "atom2_index": 19, 413 | "bond_order": 1 414 | }, 415 | { 416 | "atom1_index": 3, 417 | "atom2_index": 13, 418 | "bond_order": 1 419 | }, 420 | { 421 | "atom1_index": 3, 422 | "atom2_index": 4, 423 | "bond_order": 1 424 | }, 425 | { 426 | "atom1_index": 5, 427 | "atom2_index": 15, 428 | "bond_order": 1 429 | }, 430 | { 431 | "atom1_index": 2, 432 | "atom2_index": 3, 433 | "bond_order": 2 434 | }, 435 | { 436 | "atom1_index": 2, 437 | "atom2_index": 12, 438 | "bond_order": 1 439 | }, 440 | { 441 | "atom1_index": 10, 442 | "atom2_index": 18, 443 | "bond_order": 1 444 | }, 445 | { 446 | "atom1_index": 10, 447 | "atom2_index": 11, 448 | "bond_order": 2 449 | } 450 | ], 451 | "chains": [ 452 | { 453 | "description": "", 454 | "name": " " 455 | } 456 | ], 457 | "residues": [ 458 | { 459 | "chain_index": 0, 460 | "name": "LIG1", 461 | "sequence_number": 1 462 | } 463 | ] 464 | }; 465 | -------------------------------------------------------------------------------- /example/js/bipyridine_styles.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 0: { visualization_type: 'stick', color: '#fedcba' }, 3 | 1: { visualization_type: 'stick', color: '#abcdef' }, 4 | 2: { visualization_type: 'stick', color: '#abcdef' }, 5 | 3: { visualization_type: 'stick', color: '#abcdef' }, 6 | 4: { visualization_type: 'stick', color: '#abcdef' }, 7 | 5: { visualization_type: 'stick', color: '#abcdef' }, 8 | 6: { visualization_type: 'stick', color: '#abcdef' }, 9 | 7: { visualization_type: 'stick', color: '#fedcba' }, 10 | 8: { visualization_type: 'stick', color: '#abcdef' }, 11 | 9: { visualization_type: 'stick', color: '#abcdef' }, 12 | 10: { visualization_type: 'stick', color: '#abcdef' }, 13 | 11: { visualization_type: 'stick', color: '#abcdef' }, 14 | 12: { visualization_type: 'stick', color: '#bada55' }, 15 | 13: { visualization_type: 'stick', color: '#bada55' }, 16 | 14: { visualization_type: 'stick', color: '#bada55' }, 17 | 15: { visualization_type: 'stick', color: '#bada55' }, 18 | 16: { visualization_type: 'stick', color: '#bada55' }, 19 | 17: { visualization_type: 'stick', color: '#bada55' }, 20 | 18: { visualization_type: 'stick', color: '#bada55' }, 21 | 19: { visualization_type: 'stick', color: '#bada55' }, 22 | }; 23 | -------------------------------------------------------------------------------- /example/js/main.jsx: -------------------------------------------------------------------------------- 1 | import 'babel-polyfill'; 2 | import React from 'react'; 3 | import { render } from 'react-dom'; 4 | import Molecule3d from '../../src/main.js'; 5 | import Settings from './settings.jsx'; 6 | // import modelData from './1kbu'; 7 | // import modelData from './3aid_model_data'; 8 | // import styles from './3aid_styles'; 9 | // import modelData from './dna_model_data'; 10 | import modelData from './bipyridine_model_data'; 11 | import styles from './bipyridine_styles'; 12 | import orbital from './orbital'; 13 | 14 | const shapes = [{ 15 | type: 'Arrow', 16 | color: '#00ff00', 17 | start: { 18 | x: 0, 19 | y: 0, 20 | z: -2.5, 21 | }, 22 | end: { 23 | x: 0, 24 | y: 0, 25 | z: 3, 26 | }, 27 | }]; 28 | const labels = [ 29 | { 30 | backgroundColor: '0x000000', 31 | backgroundOpacity: 1.0, 32 | borderColor: 'black', 33 | fontColor: '0xffffff', 34 | fontSize: 14, 35 | position: { 36 | x: 0, 37 | y: 0, 38 | z: 3, 39 | }, 40 | text: 'I\'m a label', 41 | }, 42 | ]; 43 | 44 | class Example extends React.Component { 45 | constructor(props) { 46 | super(props); 47 | 48 | this.state = { 49 | labels, 50 | modelData, 51 | styles, 52 | shapes, 53 | orbital, 54 | selectedAtomIds: [], 55 | atomLabelsShown: false, 56 | backgroundColor: undefined, 57 | backgroundOpacity: undefined, 58 | selectionType: undefined, 59 | }; 60 | } 61 | 62 | onChangeMolecule = (newModelData, newStyles) => { 63 | this.setState({ modelData: newModelData, styles: newStyles }); 64 | } 65 | 66 | onChangeSelection = (newSelectedAtomIds) => { 67 | this.setState({ selectedAtomIds: newSelectedAtomIds }); 68 | } 69 | 70 | onChangeModelData = (newModelData) => { 71 | this.setState({ modelData: newModelData }); 72 | } 73 | 74 | onChangeStyles = (newStyles) => { 75 | this.setState({ styles: newStyles }); 76 | } 77 | 78 | onChangeShapes = (newShapes) => { 79 | this.setState({ shapes: newShapes }); 80 | } 81 | 82 | onChangeBackgroundColor = (newBackgroundColor) => { 83 | this.setState({ backgroundColor: newBackgroundColor }); 84 | } 85 | 86 | onChangeBackgroundOpacity = (newBackgroundOpacity) => { 87 | this.setState({ backgroundOpacity: newBackgroundOpacity }); 88 | } 89 | 90 | onChangeSelectionType = (newSelectionType) => { 91 | this.setState({ selectionType: newSelectionType }); 92 | } 93 | 94 | onChangeAtomLabelsShown = (newAtomLabelsShown) => { 95 | this.setState({ atomLabelsShown: newAtomLabelsShown }); 96 | } 97 | 98 | onChangeOrbital = (newOrbital) => { 99 | this.setState({ orbital: newOrbital }); 100 | } 101 | 102 | onChangeLabels = (newLabels) => { 103 | this.setState({ labels: newLabels }); 104 | } 105 | 106 | 107 | render() { 108 | return ( 109 |
110 | 114 | 128 |
129 | ); 130 | } 131 | } 132 | 133 | render( 134 | , 135 | document.querySelector('.container') 136 | ); 137 | -------------------------------------------------------------------------------- /example/js/plugins.js: -------------------------------------------------------------------------------- 1 | // Avoid `console` errors in browsers that lack a console. 2 | (function() { 3 | var method; 4 | var noop = function () {}; 5 | var methods = [ 6 | 'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error', 7 | 'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log', 8 | 'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd', 9 | 'timeline', 'timelineEnd', 'timeStamp', 'trace', 'warn' 10 | ]; 11 | var length = methods.length; 12 | var console = (window.console = window.console || {}); 13 | 14 | while (length--) { 15 | method = methods[length]; 16 | 17 | // Only stub undefined methods. 18 | if (!console[method]) { 19 | console[method] = noop; 20 | } 21 | } 22 | }()); 23 | 24 | // Place any jQuery/helper plugins in here. 25 | -------------------------------------------------------------------------------- /example/js/settings.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Map as IMap } from 'immutable'; 3 | import aidModelData from './3aid_model_data'; 4 | import aidStyles from './3aid_styles'; 5 | import bipyridineModelData from './bipyridine_model_data'; 6 | import bipyridineStyles from './bipyridine_styles'; 7 | import selectionTypesConstants from '../../src/constants/selection_types_constants'; 8 | 9 | class Settings extends React.Component { 10 | 11 | static defaultProps = { 12 | atomLabelsShown: false, 13 | backgroundOpacity: 1.0, 14 | backgroundColor: '', 15 | labels: [], 16 | orbital: {}, 17 | selectedAtomIds: [], 18 | selectionType: selectionTypesConstants.ATOM, 19 | shapes: [], 20 | styles: [], 21 | } 22 | 23 | static propTypes = { 24 | atomLabelsShown: React.PropTypes.bool, 25 | backgroundColor: React.PropTypes.string, 26 | backgroundOpacity: React.PropTypes.number, 27 | labels: React.PropTypes.arrayOf(React.PropTypes.shape({ 28 | backgroundColor: React.PropTypes.string, 29 | backgroundOpacity: React.PropTypes.number, 30 | borderColor: React.PropTypes.string, 31 | fontColor: React.PropTypes.string, 32 | fontSize: React.PropTypes.number, 33 | position: { 34 | x: React.PropTypes.number, 35 | y: React.PropTypes.number, 36 | z: React.PropTypes.number, 37 | }, 38 | text: React.PropTypes.string, 39 | })), 40 | modelData: React.PropTypes.oneOfType([ 41 | React.PropTypes.instanceOf(IMap), 42 | React.PropTypes.object, 43 | ]).isRequired, 44 | shapes: React.PropTypes.arrayOf(React.PropTypes.object), 45 | styles: React.PropTypes.objectOf(React.PropTypes.object), 46 | onChangeMolecule: React.PropTypes.func.isRequired, 47 | onChangeSelection: React.PropTypes.func.isRequired, 48 | onChangeModelData: React.PropTypes.func.isRequired, 49 | onChangeStyles: React.PropTypes.func.isRequired, 50 | onChangeShapes: React.PropTypes.func.isRequired, 51 | onChangeBackgroundColor: React.PropTypes.func.isRequired, 52 | onChangeBackgroundOpacity: React.PropTypes.func.isRequired, 53 | onChangeSelectionType: React.PropTypes.func.isRequired, 54 | onChangeAtomLabelsShown: React.PropTypes.func.isRequired, 55 | onChangeOrbital: React.PropTypes.func.isRequired, 56 | onChangeLabels: React.PropTypes.func.isRequired, 57 | orbital: React.PropTypes.shape({ 58 | iso_val: React.PropTypes.number, 59 | opacity: React.PropTypes.number, 60 | cube_file: React.PropTypes.string, 61 | }), 62 | selectedAtomIds: React.PropTypes.arrayOf(React.PropTypes.number), 63 | selectionType: React.PropTypes.string, 64 | } 65 | 66 | constructor(props) { 67 | super(props); 68 | 69 | this.state = { 70 | labels: JSON.stringify(props.labels), 71 | selectedAtomIds: JSON.stringify(props.selectedAtomIds), 72 | modelData: JSON.stringify(props.modelData), 73 | shapes: JSON.stringify(props.shapes), 74 | styles: JSON.stringify(props.styles), 75 | backgroundColor: props.backgroundColor, 76 | backgroundOpacity: props.backgroundOpacity, 77 | orbital: JSON.stringify(props.orbital), 78 | selectionType: props.selectionType, 79 | atomLabelsShown: props.atomLabelsShown, 80 | }; 81 | } 82 | 83 | componentWillReceiveProps(nextProps) { 84 | this.setState({ 85 | selectedAtomIds: JSON.stringify(nextProps.selectedAtomIds), 86 | styles: JSON.stringify(nextProps.styles), 87 | shapes: JSON.stringify(nextProps.shapes), 88 | modelData: JSON.stringify(nextProps.modelData), 89 | backgroundColor: nextProps.backgroundColor, 90 | backgroundOpacity: nextProps.backgroundOpacity, 91 | orbital: JSON.stringify(nextProps.orbital), 92 | selectionType: nextProps.selectionType, 93 | atomLabelsShown: nextProps.atomLabelsShown, 94 | }); 95 | } 96 | 97 | onClickSmallButton = () => { 98 | this.props.onChangeMolecule(bipyridineModelData, bipyridineStyles); 99 | } 100 | 101 | onClickLargeButton = () => { 102 | this.props.onChangeMolecule(aidModelData, aidStyles); 103 | } 104 | 105 | onBlurSelection = (event) => { 106 | this.props.onChangeSelection(JSON.parse(event.target.value)); 107 | } 108 | 109 | onChangeSelection = (event) => { 110 | this.setState({ selectedAtomIds: event.target.value }); 111 | } 112 | 113 | onChangeModelData = (event) => { 114 | this.setState({ modelData: event.target.value }); 115 | } 116 | 117 | onBlurModelData = (event) => { 118 | this.props.onChangeModelData(JSON.parse(event.target.value)); 119 | } 120 | 121 | onChangeStyles = (event) => { 122 | this.setState({ styles: event.target.value }); 123 | } 124 | 125 | onBlurStyles = (event) => { 126 | this.props.onChangeStyles(JSON.parse(event.target.value)); 127 | } 128 | 129 | onChangeShapes = (event) => { 130 | this.setState({ shapes: event.target.value }); 131 | } 132 | 133 | onBlurShapes = (event) => { 134 | this.props.onChangeShapes(JSON.parse(event.target.value)); 135 | } 136 | 137 | onChangeBackgroundColor = (event) => { 138 | this.setState({ backgroundColor: event.target.value }); 139 | } 140 | 141 | onBlurBGColor = (event) => { 142 | this.props.onChangeBackgroundColor(event.target.value); 143 | } 144 | 145 | onChangeBackgroundOpacity = (event) => { 146 | this.setState({ backgroundOpacity: event.target.value }); 147 | } 148 | 149 | onBlurBGOpacity = (event) => { 150 | this.props.onChangeBackgroundOpacity(parseFloat(event.target.value)); 151 | } 152 | 153 | onChangeSelectionType = (event) => { 154 | this.props.onChangeSelectionType(event.target.value); 155 | } 156 | 157 | onChangeLabelsInput = (event) => { 158 | this.props.onChangeAtomLabelsShown(event.target.checked); 159 | } 160 | 161 | onChangeOrbital = (event) => { 162 | this.setState({ orbital: event.target.value }); 163 | } 164 | 165 | onBlurOrbitalInput = (event) => { 166 | this.props.onChangeOrbital(JSON.parse(event.target.value)); 167 | } 168 | 169 | onChangeLabels = (event) => { 170 | this.setState({ labels: event.target.value }); 171 | } 172 | 173 | onBlurLabelsInput = (event) => { 174 | this.props.onChangeLabels(JSON.parse(event.target.value)); 175 | } 176 | 177 | render() { 178 | return ( 179 |
180 | 181 | 182 | 183 |

selectedAtomIds

184 | 189 | 190 |

modelData

191 |