├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── custom.md │ └── feature_request.md ├── .gitignore ├── .travis.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── bower_components ├── app-storage │ ├── app-indexeddb-mirror │ │ ├── app-indexeddb-mirror-client.html │ │ ├── app-indexeddb-mirror.html │ │ └── common-worker.html │ ├── app-network-status-behavior.html │ └── app-storage-behavior.html ├── firebase │ ├── firebase-app.js │ ├── firebase-auth.js │ ├── firebase-database.js │ ├── firebase-messaging.js │ └── firebase-storage.js ├── iron-a11y-announcer │ └── iron-a11y-announcer.html ├── iron-a11y-keys-behavior │ └── iron-a11y-keys-behavior.html ├── iron-autogrow-textarea │ └── iron-autogrow-textarea.html ├── iron-behaviors │ ├── iron-button-state.html │ └── iron-control-state.html ├── iron-flex-layout │ └── iron-flex-layout.html ├── iron-icon │ └── iron-icon.html ├── iron-icons │ ├── communication-icons.html │ └── iron-icons.html ├── iron-iconset-svg │ └── iron-iconset-svg.html ├── iron-input │ └── iron-input.html ├── iron-meta │ └── iron-meta.html ├── iron-validatable-behavior │ └── iron-validatable-behavior.html ├── note-app-elements │ ├── images │ │ ├── icon-0-75x.png │ │ ├── icon-1-5x.png │ │ ├── icon-1x.png │ │ ├── icon-2x.png │ │ ├── icon-3x.png │ │ ├── icon-4x.png │ │ ├── icon-inverted-3x.png │ │ └── icon-square-3x.png │ ├── na-behavior.html │ ├── na-editor.html │ ├── na-elements.html │ ├── na-login.html │ ├── na-note.html │ ├── na-toolbar.html │ └── shared-styles.html ├── paper-behaviors │ ├── paper-button-behavior.html │ ├── paper-inky-focus-behavior.html │ └── paper-ripple-behavior.html ├── paper-fab │ └── paper-fab.html ├── paper-icon-button │ └── paper-icon-button.html ├── paper-ripple │ └── paper-ripple.html ├── paper-styles │ ├── color.html │ ├── default-theme.html │ ├── element-styles │ │ └── paper-material-styles.html │ └── shadow.html ├── platinum-sw │ ├── platinum-sw-cache.html │ ├── platinum-sw-elements.html │ ├── platinum-sw-fetch.html │ ├── platinum-sw-import-script.html │ ├── platinum-sw-offline-analytics.html │ └── platinum-sw-register.html ├── polymer │ ├── lib │ │ ├── elements │ │ │ ├── array-selector.html │ │ │ ├── custom-style.html │ │ │ ├── dom-bind.html │ │ │ ├── dom-if.html │ │ │ ├── dom-module.html │ │ │ └── dom-repeat.html │ │ ├── legacy │ │ │ ├── class.html │ │ │ ├── legacy-element-mixin.html │ │ │ ├── mutable-data-behavior.html │ │ │ ├── polymer-fn.html │ │ │ ├── polymer.dom.html │ │ │ └── templatizer-behavior.html │ │ ├── mixins │ │ │ ├── element-mixin.html │ │ │ ├── gesture-event-listeners.html │ │ │ ├── mutable-data.html │ │ │ ├── property-accessors.html │ │ │ ├── property-effects.html │ │ │ └── template-stamp.html │ │ └── utils │ │ │ ├── array-splice.html │ │ │ ├── async.html │ │ │ ├── boot.html │ │ │ ├── case-map.html │ │ │ ├── debounce.html │ │ │ ├── flattened-nodes-observer.html │ │ │ ├── flush.html │ │ │ ├── gestures.html │ │ │ ├── import-href.html │ │ │ ├── mixin.html │ │ │ ├── path.html │ │ │ ├── render-status.html │ │ │ ├── resolve-url.html │ │ │ ├── settings.html │ │ │ ├── style-gather.html │ │ │ ├── templatize.html │ │ │ └── unresolved.html │ ├── polymer-element.html │ └── polymer.html ├── polymerfire │ ├── firebase-app-script.html │ ├── firebase-app.html │ ├── firebase-auth-script.html │ ├── firebase-auth.html │ ├── firebase-common-behavior.html │ ├── firebase-database-behavior.html │ ├── firebase-database-script.html │ ├── firebase-document.html │ ├── firebase-messaging-script.html │ ├── firebase-messaging.html │ ├── firebase-query.html │ ├── firebase-storage-behavior.html │ ├── firebase-storage-multiupload.html │ ├── firebase-storage-ref.html │ ├── firebase-storage-script.html │ ├── firebase-storage-upload-task.html │ └── polymerfire.html ├── shadycss │ ├── apply-shim.html │ ├── apply-shim.min.js │ ├── custom-style-interface.html │ └── custom-style-interface.min.js ├── web-animations-js │ └── web-animations.min.js └── webcomponentsjs │ ├── custom-elements-es5-adapter.js │ ├── gulpfile.js │ ├── webcomponents-hi-ce.js │ ├── webcomponents-hi-sd-ce.js │ ├── webcomponents-hi.js │ ├── webcomponents-lite.js │ ├── webcomponents-loader.js │ └── webcomponents-sd-ce.js ├── icons └── screely.png ├── index.html ├── manifest.json ├── note-app.html ├── package.json ├── sw-import.js └── travis.js /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | open_collective: liyasthomas 2 | patreon: liyasthomas 3 | custom: https://www.paypal.me/liyascthomas 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | 5 | --- 6 | 7 | **Describe the bug** 8 | A clear and concise description of what the bug is. 9 | 10 | **To Reproduce** 11 | Steps to reproduce the behavior: 12 | 1. Go to '...' 13 | 2. Click on '....' 14 | 3. Scroll down to '....' 15 | 4. See error 16 | 17 | **Expected behavior** 18 | A clear and concise description of what you expected to happen. 19 | 20 | **Screenshots** 21 | If applicable, add screenshots to help explain your problem. 22 | 23 | **Desktop (please complete the following information):** 24 | - OS: [e.g. iOS] 25 | - Browser [e.g. chrome, safari] 26 | - Version [e.g. 22] 27 | 28 | **Smartphone (please complete the following information):** 29 | - Device: [e.g. iPhone6] 30 | - OS: [e.g. iOS8.1] 31 | - Browser [e.g. stock browser, safari] 32 | - Version [e.g. 22] 33 | 34 | **Additional context** 35 | Add any other context about the problem here. 36 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/custom.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Custom issue template 3 | about: Describe this issue template's purpose here. 4 | 5 | --- 6 | 7 | 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | 5 | --- 6 | 7 | **Is your feature request related to a problem? Please describe.** 8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 9 | 10 | **Describe the solution you'd like** 11 | A clear and concise description of what you want to happen. 12 | 13 | **Describe alternatives you've considered** 14 | A clear and concise description of any alternative solutions or features you've considered. 15 | 16 | **Additional context** 17 | Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Firebase 2 | .firebaserc 3 | firebase.json 4 | 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | 24 | # nyc test coverage 25 | .nyc_output 26 | 27 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 28 | .grunt 29 | 30 | # Bower dependency directory (https://bower.io/) 31 | bower_components 32 | 33 | # node-waf configuration 34 | .lock-wscript 35 | 36 | # Compiled binary addons (http://nodejs.org/api/addons.html) 37 | build/Release 38 | 39 | # Dependency directories 40 | node_modules/ 41 | jspm_packages/ 42 | 43 | # Typescript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Optional REPL history 53 | .node_repl_history 54 | 55 | # Output of 'npm pack' 56 | *.tgz 57 | 58 | # Yarn Integrity file 59 | .yarn-integrity 60 | 61 | # dotenv environment variables file 62 | .env 63 | 64 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "node" 4 | notifications: 5 | webhooks: https://www.travisbuddy.com 6 | env: 7 | - MY_VAR=EverythignIsAwesome 8 | - NODE_ENV=TEST -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at liyascthomas@gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Liyas Thomas 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://travis-ci.com/liyasthomas/pineapple-notes.svg?branch=master)](https://travis-ci.com/liyasthomas/pineapple-notes) [![GitHub release](https://img.shields.io/github/release/liyasthomas/pineapple-notes/all.svg)](https://github.com/liyasthomas/pineapple-notes/releases/latest) [![repo size](https://img.shields.io/github/repo-size/liyasthomas/pineapple-notes.svg)](https://github.com/liyasthomas/pineapple-notes/archive/master.zip) [![license](https://img.shields.io/github/license/liyasthomas/pineapple-notes.svg)](https://github.com/liyasthomas/pineapple-notes/blob/master/LICENSE) [![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/liyasthomas/pineapple-notes/issues) [![Website](https://img.shields.io/website-up-down-green-red/https/shields.io.svg?label=website)](https://liyas-thomas.firebaseapp.com) [![Donate](https://img.shields.io/badge/$-donate-ff69b4.svg)](https://www.paypal.me/liyascthomas) 2 | 3 | # 🍍 Pineapple Notes 4 | 5 | ### A simple, clean note app by [Liyas Thomas](https://github.com/liyasthomas) 6 | 7 |
8 |
9 | Pineapple Notes 10 |
11 |
12 | 13 | ### Features :sparkles: 14 | 15 | :eyeglasses: **Virtual Reality made simple**: Description 1 16 | 17 | :heart: **Declarative HTML**: Description 2 18 | 19 | :electric_plug: **Entity-Component Architecture**: Description 3 20 | 21 | :zap: **Performance**: Description 4 22 | 23 | :globe_with_meridians: **Cross-Platform**: Description 5 24 | 25 | --- 26 | 27 | ## Demo 28 | 29 | [https://pineapple-notes.firebaseapp.com](https://pineapple-notes.firebaseapp.com/) 30 | 31 | --- 32 | 33 | ## Built with 34 | 35 | * **[Polymer](https://www.polymer-project.org)** 36 | * [Web components](https://www.webcomponents.org) 37 | * **[Chromium](https://github.com/chromium/chromium)** - Thanks for being so fast! 38 | * HTML - For the web framework 39 | * CSS - For styling components 40 | * JavaScript - For magic! 41 | 42 | --- 43 | 44 | ## Contributing 45 | 46 | Please read [CONTRIBUTING](CONTRIBUTING.md) for details on our [CODE OF CONDUCT](CODE_OF_CONDUCT.md), and the process for submitting pull requests to us. 47 | 48 | --- 49 | 50 | ## Continuous Integration 51 | 52 | We use [Travis CI](https://travis-ci.com) for continuous integration. Check out our [Travis CI Status](https://travis-ci.com/liyasthomas/pineapple-notes). 53 | 54 | --- 55 | 56 | ## Versioning 57 | 58 | This project is developed by [Liyas Thomas](https://github.com/liyasthomas) using the [Semantic Versioning specification](https://semver.org). For the versions available, see the [releases on this repository](https://github.com/liyasthomas/pineapple-notes/releases). 59 | 60 | --- 61 | 62 | ## Change log 63 | 64 | See the [CHANGELOG](CHANGELOG.md) file for details. 65 | 66 | --- 67 | 68 | ## Authors 69 | 70 | ### Lead Developers 71 | * [**Liyas Thomas**](https://github.com/liyasthomas) - *Author* 72 | 73 | ### Thanks 74 | * [Google](https://www.google.com) - For [Firebase](https://firebase.google.com) 75 | 76 | See the list of [contributors](https://github.com/liyasthomas/pineapple-notes/graphs/contributors) who participated in this project. 77 | 78 | --- 79 | 80 | ## License 81 | 82 | This project is licensed under the [MIT License](https://opensource.org/licenses/MIT) - see the [LICENSE](LICENSE) file for details. 83 | 84 | --- 85 | 86 | ## Acknowledgments 87 | 88 | * Hat tip to anyone who's code was used 89 | * Inspirations: 90 | * [Firebase](https://firebase.google.com) 91 | -------------------------------------------------------------------------------- /bower_components/app-storage/app-indexeddb-mirror/app-indexeddb-mirror-client.html: -------------------------------------------------------------------------------- 1 | 2 | 113 | -------------------------------------------------------------------------------- /bower_components/app-storage/app-indexeddb-mirror/app-indexeddb-mirror.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 111 | 112 | -------------------------------------------------------------------------------- /bower_components/app-storage/app-indexeddb-mirror/common-worker.html: -------------------------------------------------------------------------------- 1 | 74 | -------------------------------------------------------------------------------- /bower_components/app-storage/app-network-status-behavior.html: -------------------------------------------------------------------------------- 1 | 2 | 48 | -------------------------------------------------------------------------------- /bower_components/iron-a11y-announcer/iron-a11y-announcer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 70 | 71 | -------------------------------------------------------------------------------- /bower_components/iron-behaviors/iron-button-state.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 182 | -------------------------------------------------------------------------------- /bower_components/iron-behaviors/iron-control-state.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 95 | -------------------------------------------------------------------------------- /bower_components/iron-icon/iron-icon.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 28 | 29 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /bower_components/iron-iconset-svg/iron-iconset-svg.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 140 | -------------------------------------------------------------------------------- /bower_components/iron-meta/iron-meta.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 150 | -------------------------------------------------------------------------------- /bower_components/iron-validatable-behavior/iron-validatable-behavior.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 75 | -------------------------------------------------------------------------------- /bower_components/note-app-elements/images/icon-0-75x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyasthomas/pineapple-notes/5f0d32bf713f0f20b46012fe5e79946abbd08869/bower_components/note-app-elements/images/icon-0-75x.png -------------------------------------------------------------------------------- /bower_components/note-app-elements/images/icon-1-5x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyasthomas/pineapple-notes/5f0d32bf713f0f20b46012fe5e79946abbd08869/bower_components/note-app-elements/images/icon-1-5x.png -------------------------------------------------------------------------------- /bower_components/note-app-elements/images/icon-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyasthomas/pineapple-notes/5f0d32bf713f0f20b46012fe5e79946abbd08869/bower_components/note-app-elements/images/icon-1x.png -------------------------------------------------------------------------------- /bower_components/note-app-elements/images/icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyasthomas/pineapple-notes/5f0d32bf713f0f20b46012fe5e79946abbd08869/bower_components/note-app-elements/images/icon-2x.png -------------------------------------------------------------------------------- /bower_components/note-app-elements/images/icon-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyasthomas/pineapple-notes/5f0d32bf713f0f20b46012fe5e79946abbd08869/bower_components/note-app-elements/images/icon-3x.png -------------------------------------------------------------------------------- /bower_components/note-app-elements/images/icon-4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyasthomas/pineapple-notes/5f0d32bf713f0f20b46012fe5e79946abbd08869/bower_components/note-app-elements/images/icon-4x.png -------------------------------------------------------------------------------- /bower_components/note-app-elements/images/icon-inverted-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyasthomas/pineapple-notes/5f0d32bf713f0f20b46012fe5e79946abbd08869/bower_components/note-app-elements/images/icon-inverted-3x.png -------------------------------------------------------------------------------- /bower_components/note-app-elements/images/icon-square-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyasthomas/pineapple-notes/5f0d32bf713f0f20b46012fe5e79946abbd08869/bower_components/note-app-elements/images/icon-square-3x.png -------------------------------------------------------------------------------- /bower_components/note-app-elements/na-behavior.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 107 | -------------------------------------------------------------------------------- /bower_components/note-app-elements/na-editor.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 106 | 212 | 213 | -------------------------------------------------------------------------------- /bower_components/note-app-elements/na-elements.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /bower_components/note-app-elements/na-login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 87 | 114 | 115 | -------------------------------------------------------------------------------- /bower_components/note-app-elements/na-note.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 88 | 131 | 132 | -------------------------------------------------------------------------------- /bower_components/note-app-elements/na-toolbar.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 35 | 60 | 61 | -------------------------------------------------------------------------------- /bower_components/note-app-elements/shared-styles.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 138 | 139 | -------------------------------------------------------------------------------- /bower_components/paper-behaviors/paper-button-behavior.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 96 | -------------------------------------------------------------------------------- /bower_components/paper-behaviors/paper-inky-focus-behavior.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 50 | -------------------------------------------------------------------------------- /bower_components/paper-behaviors/paper-ripple-behavior.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 125 | -------------------------------------------------------------------------------- /bower_components/paper-fab/paper-fab.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 100 | 101 | 141 | 142 | -------------------------------------------------------------------------------- /bower_components/paper-icon-button/paper-icon-button.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 62 | 63 | 101 | 102 | -------------------------------------------------------------------------------- /bower_components/paper-styles/default-theme.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 61 | 62 | -------------------------------------------------------------------------------- /bower_components/paper-styles/element-styles/paper-material-styles.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 49 | 50 | -------------------------------------------------------------------------------- /bower_components/paper-styles/shadow.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 66 | 67 | -------------------------------------------------------------------------------- /bower_components/platinum-sw/platinum-sw-elements.html: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /bower_components/platinum-sw/platinum-sw-import-script.html: -------------------------------------------------------------------------------- 1 | 9 | 10 | 60 | -------------------------------------------------------------------------------- /bower_components/platinum-sw/platinum-sw-offline-analytics.html: -------------------------------------------------------------------------------- 1 | 9 | 10 | 55 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/elements/custom-style.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 114 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/elements/dom-bind.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 134 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/elements/dom-module.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 136 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/legacy/polymer-fn.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 48 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/mixins/gesture-event-listeners.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 67 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/utils/boot.html: -------------------------------------------------------------------------------- 1 | 65 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/utils/case-map.html: -------------------------------------------------------------------------------- 1 | 10 | 64 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/utils/debounce.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 116 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/utils/flush.html: -------------------------------------------------------------------------------- 1 | 10 | 60 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/utils/import-href.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 106 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/utils/mixin.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 76 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/utils/render-status.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 130 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/utils/resolve-url.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 108 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/utils/settings.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 118 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/utils/style-gather.html: -------------------------------------------------------------------------------- 1 | 10 | 159 | -------------------------------------------------------------------------------- /bower_components/polymer/lib/utils/unresolved.html: -------------------------------------------------------------------------------- 1 | 31 | -------------------------------------------------------------------------------- /bower_components/polymer/polymer-element.html: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /bower_components/polymer/polymer.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 25 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-app-script.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-app.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 133 | 134 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-auth-script.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-common-behavior.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 79 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-database-behavior.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 129 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-database-script.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-document.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 194 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-messaging-script.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-storage-behavior.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 117 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-storage-ref.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 216 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-storage-script.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /bower_components/polymerfire/firebase-storage-upload-task.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 170 | -------------------------------------------------------------------------------- /bower_components/polymerfire/polymerfire.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /bower_components/shadycss/apply-shim.html: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /bower_components/shadycss/custom-style-interface.html: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /bower_components/shadycss/custom-style-interface.min.js: -------------------------------------------------------------------------------- 1 | (function(){/* 2 | 3 | Copyright (c) 2017 The Polymer Project Authors. All rights reserved. 4 | This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 | The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 | The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 | Code distributed by Google as part of the polymer project is also 8 | subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 | */ 10 | 'use strict';var c=!(window.ShadyDOM&&window.ShadyDOM.inUse),f;function g(a){f=a&&a.shimcssproperties?!1:c||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?f=window.ShadyCSS.nativeCss:window.ShadyCSS?(g(window.ShadyCSS),window.ShadyCSS=void 0):g(window.WebComponents&&window.WebComponents.flags);var h=f;function k(a,b){for(var d in b)null===d?a.style.removeProperty(d):a.style.setProperty(d,b[d])};var l=null,m=window.HTMLImports&&window.HTMLImports.whenReady||null,n;function p(){var a=q;requestAnimationFrame(function(){m?m(a):(l||(l=new Promise(function(a){n=a}),"complete"===document.readyState?n():document.addEventListener("readystatechange",function(){"complete"===document.readyState&&n()})),l.then(function(){a&&a()}))})};var r=null,q=null;function t(){this.customStyles=[];this.enqueued=!1}function u(a){!a.enqueued&&q&&(a.enqueued=!0,p())}t.prototype.c=function(a){a.__seenByShadyCSS||(a.__seenByShadyCSS=!0,this.customStyles.push(a),u(this))};t.prototype.b=function(a){if(a.__shadyCSSCachedStyle)return a.__shadyCSSCachedStyle;var b;a.getStyle?b=a.getStyle():b=a;return b}; 11 | t.prototype.a=function(){for(var a=this.customStyles,b=0;b{'use strict';if(!window.customElements)return;const a=window.HTMLElement,b=window.customElements.define,c=window.customElements.get,d=new Map,e=new Map;let f=!1,g=!1;window.HTMLElement=function(){if(!f){const a=d.get(this.constructor),b=c.call(window.customElements,a);g=!0;const e=new b;return e}f=!1;},window.HTMLElement.prototype=a.prototype;Object.defineProperty(window,'customElements',{value:window.customElements,configurable:!0,writable:!0}),Object.defineProperty(window.customElements,'define',{value:(c,h)=>{const i=h.prototype,j=class extends a{constructor(){super(),Object.setPrototypeOf(this,i),g||(f=!0,h.call(this)),g=!1;}},k=j.prototype;j.observedAttributes=h.observedAttributes,k.connectedCallback=i.connectedCallback,k.disconnectedCallback=i.disconnectedCallback,k.attributeChangedCallback=i.attributeChangedCallback,k.adoptedCallback=i.adoptedCallback,d.set(h,c),e.set(c,h),b.call(window.customElements,c,j);},configurable:!0,writable:!0}),Object.defineProperty(window.customElements,'get',{value:(a)=>e.get(a),configurable:!0,writable:!0});})(); 5 | 6 | /** 7 | @license 8 | Copyright (c) 2017 The Polymer Project Authors. All rights reserved. 9 | This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 10 | The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 11 | The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 12 | Code distributed by Google as part of the polymer project is also 13 | subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 14 | */ 15 | 16 | }()); 17 | -------------------------------------------------------------------------------- /bower_components/webcomponentsjs/gulpfile.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. 4 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 | * Code distributed by Google as part of the polymer project is also 8 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 | */ 10 | 11 | 'use strict'; 12 | 13 | /* eslint-env node */ 14 | /* eslint-disable no-console */ 15 | 16 | const gulp = require('gulp'); 17 | const sourcemaps = require('gulp-sourcemaps'); 18 | const buffer = require('vinyl-buffer'); 19 | const rename = require('gulp-rename'); 20 | const rollup = require('rollup-stream'); 21 | const source = require('vinyl-source-stream'); 22 | const del = require('del'); 23 | const runseq = require('run-sequence'); 24 | const closure = require('google-closure-compiler').gulp(); 25 | const babel = require('rollup-plugin-babel'); 26 | 27 | function debugify(sourceName, fileName, extraRollupOptions) { 28 | if (!fileName) 29 | fileName = sourceName; 30 | 31 | const options = { 32 | entry: `./entrypoints/${sourceName}-index.js`, 33 | format: 'iife', 34 | moduleName: 'webcomponentsjs' 35 | }; 36 | 37 | Object.assign(options, extraRollupOptions); 38 | 39 | return rollup(options) 40 | .pipe(source(`${sourceName}-index.js`), 'entrypoints') 41 | .pipe(rename(fileName + '.js')) 42 | .pipe(gulp.dest('./')) 43 | } 44 | 45 | function closurify(sourceName, fileName) { 46 | if (!fileName) { 47 | fileName = sourceName; 48 | } 49 | 50 | const closureOptions = { 51 | new_type_inf: true, 52 | compilation_level: 'ADVANCED', 53 | language_in: 'ES6_STRICT', 54 | language_out: 'ES5_STRICT', 55 | isolation_mode: 'IIFE', 56 | assume_function_wrapper: true, 57 | js_output_file: `${fileName}.js`, 58 | warning_level: 'VERBOSE', 59 | rewrite_polyfills: false, 60 | externs: [ 61 | 'externs/webcomponents.js', 62 | 'node_modules/@webcomponents/custom-elements/externs/custom-elements.js', 63 | 'node_modules/@webcomponents/html-imports/externs/html-imports.js', 64 | 'node_modules/@webcomponents/shadycss/externs/shadycss-externs.js', 65 | 'node_modules/@webcomponents/shadydom/externs/shadydom.js' 66 | ] 67 | }; 68 | 69 | const rollupOptions = { 70 | entry: `entrypoints/${sourceName}-index.js`, 71 | format: 'iife', 72 | moduleName: 'webcomponents', 73 | sourceMap: true, 74 | context: 'window' 75 | }; 76 | 77 | return rollup(rollupOptions) 78 | .pipe(source(`${sourceName}-index.js`, 'entrypoints')) 79 | .pipe(buffer()) 80 | .pipe(sourcemaps.init({loadMaps: true})) 81 | .pipe(closure(closureOptions)) 82 | .pipe(sourcemaps.write('.')) 83 | .pipe(gulp.dest('.')); 84 | } 85 | 86 | gulp.task('debugify-hi', () => { 87 | return debugify('webcomponents-hi') 88 | }); 89 | 90 | gulp.task('debugify-hi-ce', () => { 91 | return debugify('webcomponents-hi-ce') 92 | }); 93 | 94 | gulp.task('debugify-hi-sd-ce', () => { 95 | return debugify('webcomponents-hi-sd-ce') 96 | }); 97 | 98 | gulp.task('debugify-hi-sd-ce-pf', () => { 99 | // The es6-promise polyfill needs to set the correct context. 100 | // See https://github.com/rollup/rollup/wiki/Troubleshooting#this-is-undefined 101 | const extraOptions = {context: 'window'}; 102 | return debugify('webcomponents-hi-sd-ce-pf', 'webcomponents-lite', extraOptions) 103 | }); 104 | 105 | gulp.task('debugify-sd-ce', () => { 106 | return debugify('webcomponents-sd-ce') 107 | }); 108 | 109 | gulp.task('closurify-hi', () => { 110 | return closurify('webcomponents-hi') 111 | }); 112 | 113 | gulp.task('closurify-hi-ce', () => { 114 | return closurify('webcomponents-hi-ce') 115 | }); 116 | 117 | gulp.task('closurify-hi-sd-ce', () => { 118 | return closurify('webcomponents-hi-sd-ce') 119 | }); 120 | 121 | gulp.task('closurify-hi-sd-ce-pf', () => { 122 | return closurify('webcomponents-hi-sd-ce-pf', 'webcomponents-lite') 123 | }); 124 | 125 | gulp.task('closurify-sd-ce', () => { 126 | return closurify('webcomponents-sd-ce') 127 | }); 128 | 129 | function singleLicenseComment() { 130 | let hasLicense = false; 131 | return (comment) => { 132 | if (hasLicense) { 133 | return false; 134 | } 135 | return hasLicense = /@license/.test(comment); 136 | } 137 | } 138 | 139 | const babelOptions = { 140 | presets: 'minify', 141 | shouldPrintComment: singleLicenseComment() 142 | }; 143 | 144 | gulp.task('debugify-ce-es5-adapter', () => { 145 | return debugify('custom-elements-es5-adapter', '', {plugins: [babel(babelOptions)]}); 146 | }); 147 | 148 | gulp.task('default', ['closure']); 149 | 150 | gulp.task('clean-builds', () => { 151 | return del(['custom-elements-es5-adapter.js{,.map}', 'webcomponents*.js{,.map}', '!webcomponents-loader.js']); 152 | }); 153 | 154 | gulp.task('debug', (cb) => { 155 | const tasks = [ 156 | 'debugify-hi', 157 | 'debugify-hi-ce', 158 | 'debugify-hi-sd-ce', 159 | 'debugify-hi-sd-ce-pf', 160 | 'debugify-sd-ce', 161 | 'debugify-ce-es5-adapter' 162 | ]; 163 | runseq('clean-builds', tasks, cb); 164 | }); 165 | 166 | gulp.task('closure', (cb) => { 167 | const tasks = [ 168 | 'closurify-hi', 169 | 'closurify-hi-ce', 170 | 'closurify-hi-sd-ce', 171 | 'closurify-hi-sd-ce-pf', 172 | 'closurify-sd-ce', 173 | 'debugify-ce-es5-adapter' 174 | ]; 175 | runseq('clean-builds', ...tasks, cb); 176 | }); -------------------------------------------------------------------------------- /bower_components/webcomponentsjs/webcomponents-loader.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. 4 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 | * Code distributed by Google as part of the polymer project is also 8 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 | */ 10 | 11 | (function() { 12 | 'use strict'; 13 | // global for (1) existence means `WebComponentsReady` will file, 14 | // (2) WebComponents.ready == true means event has fired. 15 | window.WebComponents = window.WebComponents || {}; 16 | var name = 'webcomponents-loader.js'; 17 | // Feature detect which polyfill needs to be imported. 18 | var polyfills = []; 19 | if (!('import' in document.createElement('link'))) { 20 | polyfills.push('hi'); 21 | } 22 | if (!('attachShadow' in Element.prototype && 'getRootNode' in Element.prototype) || 23 | (window.ShadyDOM && window.ShadyDOM.force)) { 24 | polyfills.push('sd'); 25 | } 26 | if (!window.customElements || window.customElements.forcePolyfill) { 27 | polyfills.push('ce'); 28 | } 29 | // NOTE: any browser that does not have template or ES6 features 30 | // must load the full suite (called `lite` for legacy reasons) of polyfills. 31 | if (!('content' in document.createElement('template')) || !window.Promise || !Array.from || 32 | // Edge has broken fragment cloning which means you cannot clone template.content 33 | !(document.createDocumentFragment().cloneNode() instanceof DocumentFragment)) { 34 | polyfills = ['lite']; 35 | } 36 | 37 | if (polyfills.length) { 38 | var script = document.querySelector('script[src*="' + name +'"]'); 39 | var newScript = document.createElement('script'); 40 | // Load it from the right place. 41 | var replacement = 'webcomponents-' + polyfills.join('-') + '.js'; 42 | var url = script.src.replace(name, replacement); 43 | newScript.src = url; 44 | // NOTE: this is required to ensure the polyfills are loaded before 45 | // *native* html imports load on older Chrome versions. This *is* CSP 46 | // compliant since CSP rules must have allowed this script to run. 47 | // In all other cases, this can be async. 48 | if (document.readyState === 'loading' && ('import' in document.createElement('link'))) { 49 | document.write(newScript.outerHTML); 50 | } else { 51 | document.head.appendChild(newScript); 52 | } 53 | } else { 54 | // Ensure `WebComponentsReady` is fired also when there are no polyfills loaded. 55 | // however, we have to wait for the document to be in 'interactive' state, 56 | // otherwise a rAF may fire before scripts in 57 | 58 | var fire = function() { 59 | requestAnimationFrame(function() { 60 | window.WebComponents.ready = true; 61 | document.dispatchEvent(new CustomEvent('WebComponentsReady', {bubbles: true})); 62 | }); 63 | }; 64 | 65 | if (document.readyState !== 'loading') { 66 | fire(); 67 | } else { 68 | document.addEventListener('readystatechange', function wait() { 69 | fire(); 70 | document.removeEventListener('readystatechange', wait); 71 | }); 72 | } 73 | } 74 | })(); 75 | -------------------------------------------------------------------------------- /icons/screely.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liyasthomas/pineapple-notes/5f0d32bf713f0f20b46012fe5e79946abbd08869/icons/screely.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 28 | 29 | 30 | 31 | 32 | 33 | Pineapple 🍍 Notes by Liyas Thomas 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 124 | 125 | 126 | 132 | 134 | 135 | 136 | 141 | 142 | 143 |
144 | 145 |
146 |
147 | 148 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Pineapple Notes", 3 | "short_name": "Pineapple Notes", 4 | "description": "A simple, clean note app", 5 | "scope": "/", 6 | "start_url": "/", 7 | "display": "standalone", 8 | "orientation": "any", 9 | "theme_color": "#fff", 10 | "background_color": "#fff", 11 | "icons": [ 12 | { 13 | "src": "bower_components/note-app-elements/images/icon-4x.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /note-app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 75 | 106 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pineapple-notes", 3 | "repository": { 4 | "type": "git", 5 | "url": "https://github.com/liyasthomas/pineapple-notes.git" 6 | }, 7 | "description": "A simple, clean note app by Liyas Thomas", 8 | "author": "@liyasthomas", 9 | "version": "1.0.0", 10 | "devDependencies": { 11 | "jshint": "^2.8.0" 12 | }, 13 | "scripts": { 14 | "test": "jshint travis.js" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /sw-import.js: -------------------------------------------------------------------------------- 1 | importScripts('bower_components/platinum-sw/sw.js'); 2 | -------------------------------------------------------------------------------- /travis.js: -------------------------------------------------------------------------------- 1 | var http = require('http'); 2 | http.createServer(function (req, res) { 3 | res.writeHead(200, { 4 | 'Content-Type': 'text/plain' 5 | }); 6 | res.end('Travis!\n'); // build should pass now! 7 | }).listen(1337, '127.0.0.1'); 8 | console.log('Server running at http://127.0.0.1:1337/'); 9 | --------------------------------------------------------------------------------