├── .babelrc.js ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .github ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .nvmrc ├── .travis.yml ├── LICENSE ├── README.md ├── app ├── about.js ├── app.html ├── app.js ├── assets │ ├── images │ │ ├── iconTemplate.png │ │ └── iconTemplate@2x.png │ ├── stylesheets │ │ ├── debug.css │ │ └── font-awesome.min.css │ └── webfonts │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.svg │ │ ├── fa-brands-400.ttf │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.eot │ │ ├── fa-regular-400.svg │ │ ├── fa-regular-400.ttf │ │ ├── fa-regular-400.woff │ │ ├── fa-regular-400.woff2 │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.svg │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ └── fa-solid-900.woff2 ├── background.js ├── blocks │ ├── block.js │ ├── external.js │ ├── external │ │ ├── hotkey.js │ │ └── serviceScript.js │ ├── externalBlock.js │ ├── input.js │ ├── input │ │ ├── keyword.js │ │ ├── prefixScript.js │ │ └── rootScript.js │ ├── inputBlock.js │ ├── output.js │ └── output │ │ ├── copyToClipboard.js │ │ ├── openFile.js │ │ ├── openInBrowser.js │ │ ├── playSound.js │ │ ├── preview.js │ │ ├── reloadConfig.js │ │ ├── sendNotification.js │ │ ├── showFile.js │ │ └── userScript.js ├── components │ ├── debug.js │ ├── loadingSpinner.js │ ├── noplugins.js │ ├── result.js │ ├── results.js │ ├── search.js │ └── style.js ├── containers │ ├── configWrapper.js │ ├── databaseWrapper.js │ ├── pluginWrapper.js │ └── zazu.js ├── debug.html ├── debug.js ├── helpers │ ├── menu.js │ ├── singleInstance.js │ ├── startup.js │ └── window.js ├── lib │ ├── configuration.js │ ├── download.js │ ├── env.js │ ├── git.js │ ├── github.js │ ├── globalEmitter.js │ ├── installStatus.js │ ├── json.js │ ├── keyboard.js │ ├── logger.js │ ├── manager.js │ ├── mergeUnique.js │ ├── notification.js │ ├── npmInstall.js │ ├── pluginFreshRequire.js │ ├── pluginTransport.js │ ├── retry.js │ ├── screens.js │ ├── template.js │ ├── track.js │ ├── track │ │ ├── newrelic.js │ │ └── noop.js │ ├── truncateResult.js │ └── update.js ├── packages │ ├── package.js │ ├── plugin.js │ └── theme.js ├── preview.html ├── registBabel.js ├── templates │ └── zazurc.json └── transforms │ └── resultSorter.js ├── appveyor.yml ├── changelog.md ├── code_of_conduct.md ├── configs ├── webpack.config.base.js ├── webpack.config.main.prod.babel.js ├── webpack.config.renderer.debug.prod.babel.js └── webpack.config.renderer.prod.babel.js ├── docs ├── .gitignore ├── .ruby-version ├── .spelling ├── .travis.yml ├── 404.md ├── CNAME ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── _config.yml ├── _documentation │ ├── blocks.md │ ├── configuration.md │ ├── getting-started.md │ ├── plugins.md │ └── themes.md ├── _includes │ ├── feedback.html │ ├── footer.html │ ├── fork.html │ ├── head.html │ ├── navigation.html │ ├── social.html │ └── underbar.html ├── _layouts │ ├── default.html │ ├── documentation.html │ ├── page.html │ └── sidebar-page.html ├── _packages │ ├── another-dark-theme.md │ ├── ascii-search.md │ ├── battery.md │ ├── calculator.md │ ├── caniuse.md │ ├── capybara-theme.md │ ├── chrome-bookmarks.md │ ├── clean-dark-theme.md │ ├── clement-theme.md │ ├── clipboard.md │ ├── colors.md │ ├── currency-convertor.md │ ├── dark-solarized.md │ ├── dark-theme.md │ ├── dash.md │ ├── dev-doc.md │ ├── devdocs.md │ ├── dictionary.md │ ├── docker.md │ ├── emoj.md │ ├── emoji.md │ ├── encode-decode.md │ ├── fallback.md │ ├── file-finder.md │ ├── firefox-bookmarks.md │ ├── fkill.md │ ├── free-shadowsocks.md │ ├── giphy.md │ ├── gist.md │ ├── github-repos.md │ ├── github.md │ ├── hacker-news.md │ ├── hash.md │ ├── homebrew.md │ ├── ip-address.md │ ├── js-beautify.md │ ├── light-solarized.md │ ├── light-theme.md │ ├── mac-1password.md │ ├── mac-open-terminal.md │ ├── mac-vpn.md │ ├── npms.md │ ├── omnifocus.md │ ├── package-manager.md │ ├── packagist.md │ ├── password.md │ ├── pibble.md │ ├── placehold.it.md │ ├── playful-theme.md │ ├── pypi.md │ ├── rubygems.md │ ├── simple-theme.md │ ├── snippets.md │ ├── system.md │ ├── timetracker.md │ ├── timezone.md │ ├── tldr.md │ ├── translation-and-optional-anki.md │ ├── uptime.md │ ├── utime.md │ └── weather.md ├── _pages │ ├── documentation.html │ ├── download.html │ ├── faq.html │ ├── plugins.html │ └── themes.html ├── _posts │ ├── 2017-03-07-video-introduction-to-zazu.md │ └── 2017-03-18-zazu-v0.5.0.md ├── _sass │ ├── base │ │ └── _reset.scss │ ├── components │ │ ├── _archives.scss │ │ ├── _article.scss │ │ ├── _buttons.scss │ │ ├── _feedback.scss │ │ ├── _footer.scss │ │ ├── _fork.scss │ │ ├── _header.scss │ │ ├── _navigation.scss │ │ ├── _packages.scss │ │ ├── _search.scss │ │ ├── _social.scss │ │ └── _underbar.scss │ ├── helpers │ │ ├── _mixins.scss │ │ └── _variables.scss │ ├── themes │ │ ├── _blue.scss │ │ ├── _green.scss │ │ ├── _grey.scss │ │ ├── _mint.scss │ │ ├── _orange.scss │ │ ├── _purple.scss │ │ └── _teal.scss │ ├── utilities │ │ ├── _layout.scss │ │ └── _themes.scss │ └── vendor │ │ └── _syntax-highlighting.scss ├── api │ ├── docs.json │ ├── packages.json │ ├── posts.json │ └── version.json ├── blog │ └── index.html ├── css │ └── main.scss ├── favicon.ico ├── feed.xml ├── images │ ├── action-shots │ │ ├── calculator.png │ │ ├── clipboard.png │ │ ├── file-finder.png │ │ ├── package-manager.png │ │ ├── system.png │ │ └── video.png │ ├── os-icons │ │ ├── mac.png │ │ ├── ubuntu.png │ │ └── windows.png │ └── package-icons │ │ ├── 1password.png │ │ ├── another-dark-theme.png │ │ ├── ascii-search.png │ │ ├── battery.png │ │ ├── calculator.png │ │ ├── caniuse.png │ │ ├── capybara-theme.png │ │ ├── chrome.png │ │ ├── clean-dark-theme.png │ │ ├── clement-theme.png │ │ ├── clipboard.png │ │ ├── colors.png │ │ ├── currency-convertor.svg │ │ ├── dark-solarized-theme.png │ │ ├── dark-theme.png │ │ ├── dash.png │ │ ├── devdocs.png │ │ ├── dictionary.png │ │ ├── docker.png │ │ ├── emoj.svg │ │ ├── encode-decode.svg │ │ ├── fallback.png │ │ ├── file-finder.png │ │ ├── firefox.png │ │ ├── fkill.png │ │ ├── free-shadowsocks.png │ │ ├── giphy.png │ │ ├── github-repos.png │ │ ├── github.png │ │ ├── hacker-news.png │ │ ├── hash.svg │ │ ├── homebrew.png │ │ ├── ip-address.svg │ │ ├── js-beautify.png │ │ ├── light-theme.png │ │ ├── npms.png │ │ ├── omnifocus.png │ │ ├── package-manager.png │ │ ├── packagist.png │ │ ├── password.png │ │ ├── pibble.png │ │ ├── placehold.png │ │ ├── playful-theme.png │ │ ├── pypi.png │ │ ├── rubygems.png │ │ ├── simple-theme.png │ │ ├── snippets.svg │ │ ├── system.png │ │ ├── terminal.png │ │ ├── timetracker.svg │ │ ├── timezone.svg │ │ ├── tldr.png │ │ ├── translation.png │ │ ├── uptime.png │ │ ├── vpn.png │ │ ├── weather.png │ │ ├── zazu-dev-doc.png │ │ └── zazu-emoji.png ├── index.html ├── js │ ├── feedback.js │ ├── headers.js │ ├── search.js │ ├── triangle-header.js │ └── vendor │ │ ├── fetch.min.js │ │ ├── fuzzyfind.min.js │ │ └── trianglify.min.js └── robots.txt ├── features ├── accessibility.feature ├── input_blocks.feature ├── installing_plugins.feature ├── navigate_results.feature ├── open.feature ├── output_blocks.feature ├── step_definitions │ └── myStepDefinitions.js ├── support │ ├── after_hooks.js │ └── custom_formattor.js └── updating_plugins.feature ├── gulpfile.js ├── package-lock.json ├── package.json ├── resources ├── icons │ └── 512x512.png ├── osx │ ├── dmg-background.png │ ├── dmg-background@2x.png │ ├── dmg-icon.icns │ └── icon.icns └── windows │ ├── icon.ico │ └── setup-icon.ico ├── tasks └── ghpages.js └── test ├── .eslintrc ├── app ├── blocks │ ├── external │ │ └── service.spec.js │ ├── input │ │ ├── prefixScript.spec.js │ │ └── rootScript.spec.js │ └── output │ │ └── userScript.spec.js ├── lib │ ├── configuration.spec.js │ ├── manager.spec.js │ ├── mergeUnique.spec.js │ ├── notification.spec.js │ └── template.spec.js ├── packages │ └── plugin.spec.js └── transforms │ └── resultSorter.spec.js └── fixtures └── home ├── .calculator.zazurc.json ├── .fallback.zazurc.json ├── .zazu ├── databases │ └── installStatus.nedb └── plugins │ └── tinytacoteam │ └── zazu-fixture │ ├── copyPasta.js │ ├── food.js │ ├── main.css │ ├── process.js │ └── zazu.json └── .zazurc.json /.babelrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | ignore: [/\/(node_modules)\//, /newrelic\.js/], 3 | presets: [ 4 | [ 5 | '@babel/preset-env', 6 | { 7 | targets: { 8 | electron: '5', 9 | }, 10 | }, 11 | ], 12 | '@babel/preset-react', 13 | ], 14 | plugins: [ 15 | 'babel-plugin-macros', 16 | '@babel/plugin-syntax-dynamic-import', 17 | 'dynamic-import-node-babel-7', 18 | '@babel/plugin-proposal-class-properties', 19 | '@babel/plugin-transform-react-constant-elements', 20 | '@babel/plugin-transform-react-inline-elements', 21 | 'babel-plugin-closure-elimination', 22 | ], 23 | } 24 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | insert_final_newline = true 6 | 7 | [*.js] 8 | indent_style = space 9 | indent_size = 2 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | vendor 3 | build 4 | resources 5 | plugins 6 | docs 7 | dist 8 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: 'babel-eslint', 3 | extends: ['standard', 'plugin:react/recommended'], 4 | rules: { 'comma-dangle': [2, 'always-multiline'] }, 5 | plugins: ['react', 'html'], 6 | parserOptions: { 7 | ecmaFeatures: { 8 | jsx: true, 9 | }, 10 | }, 11 | settings: { 12 | react: { 13 | version: '16.8.6', 14 | }, 15 | }, 16 | globals: { 17 | newrelic: true, 18 | __nr_require: true, 19 | }, 20 | env: { 21 | browser: true, 22 | node: true, 23 | es6: true, 24 | mocha: true, 25 | node: true, 26 | }, 27 | } 28 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Getting Involved 2 | 3 | ### What's being worked on now 4 | 5 | The core team tracks what is currently being worked on on the [Zazu Project 6 | Board][Zazu Project Board]. 7 | 8 | ### Zazu Core 9 | 10 | You can also look through currently open issues in Zazu Core. Often, the ones 11 | not being worked on are marked with a [help wanted][help wanted tag]. tag. 12 | 13 | ### Plugins 14 | 15 | Plugin development is also a great way to get involved. Zazu needs plugin to do 16 | anything useful for a user. If you create one, start the repo name with `zazu-` 17 | and feel free to submit it to the plugin directory once you get it working! If 18 | you need help getting started there is documentation on [creating a 19 | plugin][plugin page]. 20 | 21 | ## Community 22 | 23 | You can find the community and core developers on [Gitter Chat][Gitter Chat]. 24 | 25 | ## Core Team Guidelines 26 | 27 | If you're part of Zazu's core team there are a few guidelines for you as well. 28 | 29 | When starting work, please update the [Roadmap][Roadmap] with your current task. 30 | When you create a pull request, add a reviewer who is also on the core team. Add 31 | a label for which [semver][semver] number needs to be bumped, for example `major 32 | version`, `minor version` or `patch version`. 33 | 34 | If you get added as a reviewer and you don't have time to get to it in the next 35 | day or two, feel free to comment or re-assign the ticket, things come up, we 36 | understand! [: 37 | 38 | If there is no reviewer on a pull request, from a non-core member for example, 39 | assign it to yourself and take it from there. 40 | 41 | When making a review: 42 | 43 | * Verify semver label 44 | * Look at the code 45 | * Run code/docs locally 46 | 47 | Once approved of the change: 48 | 49 | * Merge the pull request 50 | * Publish the documentation if necessary (eg `npm run docs:publish`) 51 | 52 | [semver]: http://semver.org/ 53 | [Roadmap]: https://github.com/tinytacoteam/zazu/projects/3 54 | [help wanted tag]: https://github.com/tinytacoteam/zazu/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22 55 | [plugin page]: http://zazuapp.org/documentation/plugins/ 56 | [Gitter Chat]: https://gitter.im/tinytacoteam/zazu 57 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Expected Behavior 2 | 3 | ### Actual Behavior 4 | 5 | ### Steps to reproduce the behavior 6 | 7 | ### Versions 8 | 9 | * Zazu: 10 | * OS: 11 | * GIT: 12 | 13 | Please, include a link to gist of most applicable `~/.zazu/log/` file. 14 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | All pull requests should go to `master`, even the documentation is in `master` 2 | under `./docs/`. 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | log 4 | .DS_Store 5 | Thumbs.db 6 | *.autogenerated 7 | build 8 | releases 9 | dist 10 | tmp 11 | docs/_site 12 | databases 13 | zazu-fallback 14 | zazu-calculator 15 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v9.8.0 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 'lts/*' 4 | 5 | 6 | matrix: 7 | fast_finish: true 8 | include: 9 | - os: osx 10 | osx_image: xcode9.4 11 | env: 12 | - ELECTRON_CACHE=$HOME/.cache/electron 13 | - ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder 14 | 15 | - os: linux 16 | services: 17 | - xvfb 18 | 19 | cache: 20 | directories: 21 | - $HOME/.cache/electron 22 | - $HOME/.cache/electron-builder 23 | 24 | script: 25 | - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then npm run cucumber; fi 26 | - npm test 27 | - | 28 | if [ "$TRAVIS_OS_NAME" == "linux" ]; then 29 | npm run release:linux; 30 | else 31 | npm run release:osx 32 | fi 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Tiny Taco Team 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 | -------------------------------------------------------------------------------- /app/about.js: -------------------------------------------------------------------------------- 1 | const { app, clipboard, dialog } = require('electron') 2 | const env = require('./lib/env') 3 | 4 | const items = [ 5 | { name: 'App Environment', value: env.name }, 6 | { name: 'App Version', value: app.getVersion() }, 7 | { name: 'Electron Version', value: process.versions.electron }, 8 | { name: 'Node Version', value: process.versions.node }, 9 | { name: 'Chrome Version', value: process.versions.chrome }, 10 | ] 11 | 12 | module.exports = { 13 | show () { 14 | const detail = items.map((item) => { 15 | return item.name + ': ' + item.value 16 | }).join('\n') 17 | dialog.showMessageBox({ 18 | type: 'info', 19 | message: 'Zazu App', 20 | detail, 21 | defaultId: 0, 22 | buttons: ['Ok', 'Copy'], 23 | }, (index) => { 24 | if (index === 1) { 25 | clipboard.writeText(detail) 26 | } 27 | }) 28 | }, 29 | } 30 | -------------------------------------------------------------------------------- /app/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Zazu 6 | 16 | 17 | 18 | 19 |
20 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/app.js: -------------------------------------------------------------------------------- 1 | const ReactDOM = require('react-dom') 2 | const React = require('react') 3 | 4 | const ConfigWrapper = require('./containers/configWrapper') 5 | const PluginWrapper = require('./containers/pluginWrapper') 6 | 7 | ReactDOM.render( 8 | 9 | 10 | , 11 | document.getElementById('zazu') 12 | ) 13 | 14 | // Catch `esc` or `enter` to avoid alert beep. 15 | document.body.onkeydown = e => { 16 | return e.key !== 'Enter' && e.key !== 'Escape' 17 | } 18 | -------------------------------------------------------------------------------- /app/assets/images/iconTemplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/images/iconTemplate.png -------------------------------------------------------------------------------- /app/assets/images/iconTemplate@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/images/iconTemplate@2x.png -------------------------------------------------------------------------------- /app/assets/stylesheets/debug.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #ECECEC; 3 | } 4 | section { 5 | width: 100%; 6 | height: 200px; 7 | text-align: center; 8 | font-family: 'Roboto', 'Helvetica Neue', Helvetica, sans-serif; 9 | } 10 | img { 11 | width: 75px; 12 | height: 75px; 13 | } 14 | h2 { 15 | margin-bottom: 0; 16 | } 17 | ul { 18 | margin: 0; 19 | padding: 0; 20 | } 21 | li { 22 | list-style: none; 23 | } 24 | pre.verbose { 25 | border-left: 5px solid #31708F; 26 | color: #31708F; 27 | padding-left: 5px; 28 | background-color: #D9EDF7; 29 | } 30 | pre.info { 31 | border-left: 5px solid #3C763D; 32 | color: #3C763D; 33 | padding-left: 5px; 34 | background-color: #DFF0D8; 35 | } 36 | pre.warn { 37 | border-left: 5px solid #8A6D3B; 38 | color: #8A6D3B; 39 | padding-left: 5px; 40 | background-color: #FCF8E3; 41 | } 42 | pre.error { 43 | border-left: 5px solid #A94442; 44 | color: #A94442; 45 | padding-left: 5px; 46 | background-color: #F2DEDE; 47 | } 48 | -------------------------------------------------------------------------------- /app/assets/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /app/assets/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /app/assets/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /app/assets/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /app/assets/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /app/assets/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /app/assets/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /app/assets/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /app/assets/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /app/assets/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /app/assets/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /app/assets/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/app/assets/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /app/blocks/block.js: -------------------------------------------------------------------------------- 1 | const cuid = require('cuid') 2 | 3 | const logger = require('../lib/logger') 4 | 5 | class Block { 6 | constructor (data) { 7 | this.pluginId = data.pluginId 8 | this.type = data.type 9 | this.id = data.id || cuid() 10 | this.connections = data.connections || [] 11 | this.logger = logger.bindMeta({ plugin: this.pluginId, block: this.id }) 12 | } 13 | 14 | requiredField (fieldName) { 15 | const blockName = this.constructor.name 16 | this.logger.log('error', `Field "${fieldName}" is required.`, { 17 | fieldName, 18 | blockName, 19 | }) 20 | } 21 | 22 | _ensurePromise (val) { 23 | if (!(val instanceof Promise)) { 24 | this.logger.log('error', 'Block did not return a Promise') 25 | return Promise.resolve() 26 | } 27 | return val 28 | } 29 | 30 | call (state) { 31 | return state.next() 32 | } 33 | } 34 | 35 | module.exports = Block 36 | -------------------------------------------------------------------------------- /app/blocks/external.js: -------------------------------------------------------------------------------- 1 | const Hotkey = require('./external/hotkey') 2 | const ServiceScript = require('./external/serviceScript') 3 | 4 | module.exports = { 5 | Hotkey, 6 | ServiceScript, 7 | } 8 | -------------------------------------------------------------------------------- /app/blocks/external/hotkey.js: -------------------------------------------------------------------------------- 1 | const globalEmitter = require('../../lib/globalEmitter') 2 | const ExternalBlock = require('../externalBlock') 3 | 4 | class Hotkey extends ExternalBlock { 5 | constructor (data, options) { 6 | super(data, options) 7 | this.connections = data.connections || [] 8 | this.hotkey = options[this.id] || data.hotkey 9 | } 10 | 11 | start () { 12 | globalEmitter.emit('registerHotkey', this.hotkey) 13 | globalEmitter.on('triggerHotkey', (accelerator) => { 14 | if (this.hotkey === accelerator) { 15 | this.logger.log('info', 'Hotkey triggered', { accelerator }) 16 | this.handle() 17 | } 18 | }) 19 | } 20 | 21 | handle () { 22 | this.emit('actioned') 23 | } 24 | } 25 | 26 | module.exports = Hotkey 27 | -------------------------------------------------------------------------------- /app/blocks/external/serviceScript.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const electron = require('electron') 3 | 4 | const ExternalBlock = require('../externalBlock') 5 | 6 | class ServiceScript extends ExternalBlock { 7 | constructor (data, options) { 8 | super(data, options) 9 | this.cwd = data.cwd 10 | this.options = options 11 | this.type = data.type 12 | this.connections = [] 13 | this.interval = parseInt(data.interval, 10) 14 | if (isNaN(this.interval) || this.interval < 100) { 15 | this.interval = 100 16 | } 17 | try { 18 | const plugin = electron.remote.require(path.join(this.cwd, data.script)) 19 | 20 | this.script = plugin({ 21 | console: this.logger, 22 | cwd: this.cwd, 23 | }) 24 | } catch (e) { 25 | this.script = false 26 | this.loadError = e 27 | } 28 | } 29 | 30 | start () { 31 | return this.handle() 32 | } 33 | 34 | handle () { 35 | if (!this.script) { 36 | this.logger.error('Plugin failed to load', this.loadError) 37 | return Promise.resolve() 38 | } 39 | return this._ensurePromise(this.script(this.options)) 40 | .then(() => new Promise((resolve) => { 41 | setTimeout(resolve, this.interval) 42 | })) 43 | .then(() => this.start()) 44 | .catch((error) => { 45 | this.logger.error('Script failed', error) 46 | }) 47 | } 48 | } 49 | 50 | module.exports = ServiceScript 51 | -------------------------------------------------------------------------------- /app/blocks/externalBlock.js: -------------------------------------------------------------------------------- 1 | const EventEmitter = require('events') 2 | const cuid = require('cuid') 3 | 4 | const logger = require('../lib/logger') 5 | 6 | class ExternalBlock extends EventEmitter { 7 | constructor (data, options) { 8 | super() 9 | this.pluginId = data.pluginId 10 | this.id = data.id || cuid() 11 | this.logger = logger.bindMeta({ plugin: data.pluginId, block: this.id }) 12 | } 13 | 14 | _ensurePromise (val) { 15 | if (!(val instanceof Promise)) { 16 | this.logger.log('error', 'Block did not return a Promise') 17 | return Promise.resolve() 18 | } 19 | return val 20 | } 21 | 22 | call () { 23 | return Promise.resolve() 24 | } 25 | } 26 | 27 | module.exports = ExternalBlock 28 | -------------------------------------------------------------------------------- /app/blocks/input.js: -------------------------------------------------------------------------------- 1 | const RootScript = require('./input/rootScript') 2 | const PrefixScript = require('./input/prefixScript') 3 | const Keyword = require('./input/keyword') 4 | 5 | module.exports = { 6 | RootScript, 7 | PrefixScript, 8 | Keyword, 9 | } 10 | -------------------------------------------------------------------------------- /app/blocks/input/keyword.js: -------------------------------------------------------------------------------- 1 | const InputBlock = require('../inputBlock') 2 | 3 | class Keyword extends InputBlock { 4 | constructor (data) { 5 | super(data) 6 | this.keyword = data.keyword || this.requiredField('keyword') 7 | this.title = data.title || this.requiredField('title') 8 | this.subtitle = data.subtitle 9 | this.icon = data.icon 10 | } 11 | 12 | respondsTo (input) { 13 | const longEnough = input.length > 2 14 | const partOfKeyword = this.keyword.indexOf(input) !== -1 15 | const respondsTo = longEnough && !!partOfKeyword 16 | this.logger.log('verbose', `${respondsTo ? 'r' : 'notR'}esponds to input`, { input, respondsTo }) 17 | return respondsTo 18 | } 19 | 20 | search (input, env = {}) { 21 | this.logger.log('info', 'Rendering keyword', { input }) 22 | return Promise.resolve([ 23 | { 24 | blockRank: 2, 25 | title: this.title, 26 | subtitle: this.subtitle, 27 | value: this.keyword, 28 | icon: this.icon, 29 | }, 30 | ]) 31 | } 32 | } 33 | 34 | module.exports = Keyword 35 | -------------------------------------------------------------------------------- /app/blocks/input/rootScript.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const electron = require('electron') 3 | 4 | const InputBlock = require('../inputBlock') 5 | const truncateResult = require('../../lib/truncateResult') 6 | 7 | class RootScript extends InputBlock { 8 | constructor (data) { 9 | super(data) 10 | try { 11 | const plugin = electron.remote.require(path.join(data.cwd, data.script)) 12 | this.script = plugin({ 13 | console: this.logger, 14 | cwd: data.cwd, 15 | }) 16 | } catch (e) { 17 | this.script = false 18 | this.loadError = e 19 | } 20 | } 21 | 22 | respondsTo (input, env = {}) { 23 | if (!this.script) { 24 | this.logger.error('Plugin failed to load', this.loadError) 25 | return false 26 | } 27 | const respondsTo = !!this.script.respondsTo(input, env) 28 | this.logger.log('verbose', `${respondsTo ? 'r' : 'notR'}espondsTo`, { input, respondsTo }) 29 | return respondsTo 30 | } 31 | 32 | query (input) { 33 | return input 34 | } 35 | 36 | search (input, env = {}) { 37 | const query = this.query(input) 38 | this.logger.log('verbose', 'Executing Script', { query }) 39 | return new Promise((resolve, reject) => { 40 | const timeout = setTimeout(() => { 41 | timeout === this.timeout ? resolve() : reject(new Error('Debounced')) 42 | }, this.debounce) 43 | this.timeout = timeout 44 | }).then(() => { 45 | return this._ensurePromise(this.script.search(query, env)) 46 | }).then((results) => { 47 | this.logger.log('info', 'Script Results', { results: (Array.isArray(results) ? results.map(truncateResult) : results) }) 48 | return this._validateResults(results.map((result) => Object.assign({}, result, { blockRank: 1 }))) 49 | }).catch((error) => { 50 | if (error.message === 'Debounced') { 51 | this.logger.log('verbose', error.message, { query, error }) 52 | } else { 53 | this.logger.error('Script failed', { query, error }) 54 | } 55 | }) 56 | } 57 | } 58 | 59 | module.exports = RootScript 60 | -------------------------------------------------------------------------------- /app/blocks/inputBlock.js: -------------------------------------------------------------------------------- 1 | const Block = require('./block') 2 | 3 | const globalEmitter = require('../lib/globalEmitter') 4 | const truncateResult = require('../lib/truncateResult') 5 | 6 | class InputBlock extends Block { 7 | constructor (data) { 8 | super(data) 9 | this.pluginId = data.pluginId 10 | this.isScoped = null 11 | this.debounce = data.debounce || 100 12 | } 13 | 14 | isActive () { 15 | return this.isScoped !== false 16 | } 17 | 18 | setScoped (value) { 19 | this.isScoped = value 20 | } 21 | 22 | _validateResults (results) { 23 | if (!Array.isArray(results)) { 24 | this.logger.log('error', 'results must be an array', { 25 | results, 26 | }) 27 | return [] 28 | } 29 | results.forEach((result) => { 30 | const keys = Object.keys(result) 31 | if (!keys.includes('title')) { 32 | this.logger.log('error', 'result must contain a title', { result: truncateResult(result) }) 33 | } 34 | if (!keys.includes('value')) { 35 | this.logger.log('error', 'result must contain a value', { result: truncateResult(result) }) 36 | } 37 | }) 38 | return results 39 | } 40 | 41 | call (state) { 42 | setImmediate(() => { 43 | globalEmitter.emit('showWindow', this.pluginId, this.id) 44 | }) 45 | return Promise.resolve() 46 | } 47 | } 48 | 49 | module.exports = InputBlock 50 | -------------------------------------------------------------------------------- /app/blocks/output.js: -------------------------------------------------------------------------------- 1 | const CopyToClipboard = require('./output/copyToClipboard') 2 | const OpenInBrowser = require('./output/openInBrowser') 3 | const SendNotification = require('./output/sendNotification') 4 | const UserScript = require('./output/userScript') 5 | const ShowFile = require('./output/showFile') 6 | const OpenFile = require('./output/openFile') 7 | const ReloadConfig = require('./output/reloadConfig') 8 | const Preview = require('./output/preview') 9 | const PlaySound = require('./output/playSound') 10 | 11 | module.exports = { 12 | CopyToClipboard, 13 | OpenInBrowser, 14 | SendNotification, 15 | UserScript, 16 | OpenFile, 17 | ShowFile, 18 | ReloadConfig, 19 | Preview, 20 | PlaySound, 21 | } 22 | -------------------------------------------------------------------------------- /app/blocks/output/copyToClipboard.js: -------------------------------------------------------------------------------- 1 | const electron = require('electron') 2 | 3 | const Template = require('../../lib/template') 4 | const Block = require('../block') 5 | 6 | class CopyToClipboard extends Block { 7 | constructor (data) { 8 | super(data) 9 | this.clipboard = electron.clipboard 10 | this.text = data.text || '{value}' 11 | } 12 | 13 | call (state) { 14 | this.logger.log('info', 'Copying to clipboard') 15 | this.clipboard.writeText(Template.compile(this.text, { 16 | value: String(state.value), 17 | })) 18 | return state.next() 19 | } 20 | } 21 | 22 | module.exports = CopyToClipboard 23 | -------------------------------------------------------------------------------- /app/blocks/output/openFile.js: -------------------------------------------------------------------------------- 1 | const { shell } = require('electron') 2 | const os = require('os') 3 | 4 | const Block = require('../block') 5 | 6 | class OpenFile extends Block { 7 | constructor (data) { 8 | super(data) 9 | this.script = data.script 10 | this.cwd = data.cwd 11 | } 12 | 13 | call (state, env = {}) { 14 | const fullPath = state.value.replace(/^~/, os.homedir()) 15 | this.logger.log('info', 'Opening File', { fullPath }) 16 | shell.openItem(fullPath) 17 | return state.next() 18 | } 19 | } 20 | 21 | module.exports = OpenFile 22 | -------------------------------------------------------------------------------- /app/blocks/output/openInBrowser.js: -------------------------------------------------------------------------------- 1 | const { shell } = require('electron') 2 | 3 | const Template = require('../../lib/template') 4 | const Block = require('../block') 5 | 6 | class OpenInBrowser extends Block { 7 | constructor (data) { 8 | super(data) 9 | this.url = data.url || '{value}' 10 | } 11 | 12 | call (state) { 13 | const url = Template.compile(this.url, { 14 | value: String(state.value), 15 | }) 16 | this.logger.log('info', 'Opening in browser', { url }) 17 | shell.openExternal(url) 18 | return state.next() 19 | } 20 | } 21 | 22 | module.exports = OpenInBrowser 23 | -------------------------------------------------------------------------------- /app/blocks/output/playSound.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const Template = require('../../lib/template') 3 | const Block = require('../block') 4 | 5 | class PlaySound extends Block { 6 | constructor (data) { 7 | super(data) 8 | this.file = data.file 9 | this.cwd = data.cwd 10 | } 11 | 12 | call (state, env = {}) { 13 | const file = Template.compile(this.file, { 14 | value: String(state.value), 15 | }) 16 | const fullPath = path.join(this.cwd, file) 17 | 18 | this.logger.log('info', 'Playing File', { fullPath }) 19 | 20 | const audio = new Audio(fullPath) 21 | return new Promise((resolve) => { 22 | return audio.play().then(() => { 23 | audio.addEventListener('ended', resolve) 24 | }) 25 | }).then(() => { 26 | return state.next() 27 | }) 28 | } 29 | } 30 | 31 | module.exports = PlaySound 32 | -------------------------------------------------------------------------------- /app/blocks/output/preview.js: -------------------------------------------------------------------------------- 1 | const Block = require('../block') 2 | const Template = require('../../lib/template') 3 | const { windowHelper } = require('../../helpers/window') 4 | const path = require('path') 5 | const Screens = require('../../lib/screens') 6 | 7 | class Preview extends Block { 8 | constructor (data) { 9 | super(data) 10 | this.message = data.message || '{value}' 11 | this.screens = Screens.getInstance({ 12 | windowWidth: 700, 13 | }) 14 | } 15 | 16 | call (state, env = {}) { 17 | const win = windowHelper('preview-block', { 18 | show: false, 19 | width: 700, 20 | height: 500, 21 | frame: false, 22 | resizable: false, 23 | autoResize: true, 24 | alwaysOnTop: true, 25 | skipTaskbar: true, 26 | title: 'Large Type', 27 | url: path.join('file://', path.dirname(path.dirname(__dirname)), '/preview.html'), 28 | webPreferences: { 29 | nodeIntegration: true, 30 | }, 31 | }) 32 | const position = this.screens.getCenterPositionOnCurrentScreen() 33 | if (position) { 34 | win.setPosition(position.x, position.y) 35 | } 36 | win.webContents.on('did-finish-load', () => { 37 | win.webContents.send('message', Template.compile(this.message, { 38 | value: String(state.value), 39 | })) 40 | }) 41 | return new Promise((resolve) => { 42 | win.on('blur', () => { 43 | win.close() 44 | }) 45 | win.on('close', () => { 46 | resolve() 47 | }) 48 | }).then(() => { 49 | return state.next() 50 | }) 51 | } 52 | } 53 | 54 | module.exports = Preview 55 | -------------------------------------------------------------------------------- /app/blocks/output/reloadConfig.js: -------------------------------------------------------------------------------- 1 | const globalEmitter = require('../../lib/globalEmitter') 2 | const Block = require('../block') 3 | 4 | class ReloadConfig extends Block { 5 | constructor (data) { 6 | super(data) 7 | this.url = data.url || '{value}' 8 | } 9 | 10 | call () { 11 | this.logger.log('info', 'Reloading configuration') 12 | globalEmitter.emit('reloadConfig') 13 | return Promise.resolve() 14 | } 15 | } 16 | 17 | module.exports = ReloadConfig 18 | -------------------------------------------------------------------------------- /app/blocks/output/sendNotification.js: -------------------------------------------------------------------------------- 1 | const notification = require('../../lib/notification') 2 | const Template = require('../../lib/template') 3 | const Block = require('../block') 4 | 5 | class SendNotification extends Block { 6 | constructor (data) { 7 | super(data) 8 | this.title = data.title || '{value}' 9 | this.message = data.message || '{value}' 10 | } 11 | 12 | call (state) { 13 | const variables = { value: String(state.value) } 14 | const options = { 15 | title: Template.compile(this.title, variables), 16 | message: Template.compile(this.message, variables), 17 | } 18 | this.logger.log('info', 'Notification', options) 19 | notification.push(options) 20 | return state.next() 21 | } 22 | } 23 | 24 | module.exports = SendNotification 25 | -------------------------------------------------------------------------------- /app/blocks/output/showFile.js: -------------------------------------------------------------------------------- 1 | const { shell } = require('electron') 2 | const os = require('os') 3 | 4 | const Block = require('../block') 5 | 6 | class ShowFile extends Block { 7 | constructor (data) { 8 | super(data) 9 | this.script = data.script 10 | this.cwd = data.cwd 11 | } 12 | 13 | call (state, env = {}) { 14 | const fullPath = state.value.replace(/^~/, os.homedir()) 15 | this.logger.log('info', 'Showing File', { fullPath }) 16 | shell.showItemInFolder(fullPath) 17 | return state.next() 18 | } 19 | } 20 | 21 | module.exports = ShowFile 22 | -------------------------------------------------------------------------------- /app/blocks/output/userScript.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const electron = require('electron') 3 | 4 | const Block = require('../block') 5 | 6 | class UserScript extends Block { 7 | constructor (data) { 8 | super(data) 9 | try { 10 | const plugin = electron.remote.require(path.join(data.cwd, data.script)) 11 | this.script = plugin({ 12 | console: this.logger, 13 | cwd: data.cwd, 14 | }) 15 | } catch (e) { 16 | this.script = false 17 | this.loadError = e 18 | } 19 | } 20 | 21 | call (state, env = {}) { 22 | if (!this.script) { 23 | this.logger.error('Plugin failed to load', this.loadError) 24 | return Promise.resolve() 25 | } 26 | this.logger.log('verbose', 'Executing Script', { value: state.value }) 27 | return this._ensurePromise(this.script(state.value, env)).then((output) => { 28 | state.value = output 29 | this.logger.log('info', 'User Script results', { value: state.value }) 30 | return state.next() 31 | }).catch((error) => { 32 | this.logger.error('User Script failed', { value: state.value, error }) 33 | }) 34 | } 35 | } 36 | 37 | module.exports = UserScript 38 | -------------------------------------------------------------------------------- /app/components/loadingSpinner.js: -------------------------------------------------------------------------------- 1 | const React = require('react') 2 | const PropTypes = require('prop-types') 3 | 4 | const Style = require('./style') 5 | 6 | const LoadingSpinner = ({ loaded, total }) => { 7 | let css = ` 8 | body { 9 | background-color: #5CC7B2; 10 | margin: 0; 11 | } 12 | h2, h3 { 13 | margin: 0; 14 | padding: 10px; 15 | display: block; 16 | color: #fff; 17 | text-align: center; 18 | } 19 | ` 20 | 21 | return ( 22 |
23 |

Zazu is loading...

24 |

{loaded} of {total} plugins are loaded

25 | 27 | 28 | 29 |
30 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /app/registBabel.js: -------------------------------------------------------------------------------- 1 | require('@babel/register')({ 2 | ignore: [/node_modules/, /newrelic\.js/], 3 | presets: [ 4 | [ 5 | '@babel/preset-env', 6 | { 7 | targets: { 8 | electron: '5', 9 | }, 10 | }, 11 | ], 12 | '@babel/preset-react', 13 | ], 14 | plugins: [ 15 | 'babel-plugin-macros', 16 | '@babel/plugin-syntax-dynamic-import', 17 | 'dynamic-import-node-babel-7', 18 | '@babel/plugin-proposal-class-properties', 19 | '@babel/plugin-transform-react-constant-elements', 20 | '@babel/plugin-transform-react-inline-elements', 21 | 'babel-plugin-closure-elimination', 22 | ], 23 | }) 24 | -------------------------------------------------------------------------------- /app/templates/zazurc.json: -------------------------------------------------------------------------------- 1 | { 2 | "hotkey": "alt+space", 3 | "theme": "tinytacoteam/zazu-light-theme", 4 | "displayOn": "detect", 5 | "plugins": [ 6 | "tinytacoteam/zazu-calculator", 7 | "tinytacoteam/zazu-file-finder", 8 | "tinytacoteam/zazu-template", 9 | "tinytacoteam/zazu-system", 10 | "tinytacoteam/zazu-package-manager", 11 | { 12 | "name": "tinytacoteam/zazu-fallback", 13 | "variables": { 14 | "rootSearches": ["google"] 15 | } 16 | }, 17 | { 18 | "name": "tinytacoteam/zazu-clipboard", 19 | "variables": { 20 | "ClipboardKey": "cmd+shift+v" 21 | } 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /app/transforms/resultSorter.js: -------------------------------------------------------------------------------- 1 | const resultSorter = { 2 | sort (results, clickedResults) { 3 | return results.slice(0).map((result) => { 4 | if (result.id) { 5 | const score = clickedResults.reduce((memo, clickedResult) => { 6 | if (clickedResult.id === result.id) memo++ 7 | return memo 8 | }, result.blockRank) 9 | return { score, result } 10 | } 11 | const noIdScore = result.blockRank - 3 12 | return { score: noIdScore, result } 13 | }).sort((a, b) => { 14 | if (a.score !== b.score) return b.score - a.score 15 | const aIndex = results.indexOf(a.result) 16 | const bIndex = results.indexOf(b.result) 17 | return aIndex - bIndex 18 | }).map((item) => { 19 | return item.result 20 | }) 21 | }, 22 | } 23 | 24 | module.exports = resultSorter 25 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | environment: 2 | nodejs_version: "stable" 3 | JAVA_HOME: C:\Program Files\Java\jdk12 4 | 5 | os: unstable 6 | 7 | cache: 8 | - node_modules 9 | - '%USERPROFILE%\.electron' 10 | 11 | install: 12 | - ps: Install-Product node $env:nodejs_version 13 | - ps: $env:Path += ";C:\Program Files (x86)\NSIS;%JAVA_HOME%" 14 | - choco install nsis -pre -y 15 | - npm install 16 | 17 | test_script: 18 | - node --version 19 | - npm --version 20 | - java -version 21 | - npm run cucumber 22 | - npm test 23 | 24 | build_script: 25 | - npm run release:win 26 | 27 | artifacts: 28 | - path: 'dist\*.exe' 29 | name: Zazu 30 | -------------------------------------------------------------------------------- /code_of_conduct.md: -------------------------------------------------------------------------------- 1 | # Contributor Code of Conduct 2 | 3 | As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. 4 | 5 | We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. 6 | 7 | Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct. 8 | 9 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team. 10 | 11 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers. 12 | 13 | This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/) 14 | -------------------------------------------------------------------------------- /configs/webpack.config.base.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Base webpack config used across other specific configs 3 | */ 4 | 5 | import path from 'path' 6 | import webpack from 'webpack' 7 | import { dependencies } from '../package.json' 8 | 9 | export default { 10 | externals: [...Object.keys(dependencies || {})], 11 | 12 | module: { 13 | rules: [ 14 | { 15 | test: /\.jsx?$/, 16 | exclude: /node_modules/, 17 | use: { 18 | loader: 'babel-loader', 19 | options: { 20 | cacheDirectory: true, 21 | }, 22 | }, 23 | }, 24 | ], 25 | }, 26 | 27 | output: { 28 | path: path.join(__dirname, '..', 'app'), 29 | // https://github.com/webpack/webpack/issues/1114 30 | libraryTarget: 'commonjs2', 31 | }, 32 | 33 | /** 34 | * Determine the array of extensions that should be used to resolve modules. 35 | */ 36 | resolve: { 37 | extensions: ['.js', '.jsx', '.json'], 38 | }, 39 | 40 | plugins: [ 41 | new webpack.EnvironmentPlugin({ 42 | NODE_ENV: 'production', 43 | }), 44 | 45 | new webpack.NamedModulesPlugin(), 46 | ], 47 | } 48 | -------------------------------------------------------------------------------- /configs/webpack.config.main.prod.babel.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Webpack config for production electron main process 3 | */ 4 | 5 | import path from 'path' 6 | import webpack from 'webpack' 7 | import merge from 'webpack-merge' 8 | import TerserPlugin from 'terser-webpack-plugin' 9 | import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' 10 | import baseConfig from './webpack.config.base' 11 | 12 | export default merge.smart(baseConfig, { 13 | devtool: 'source-map', 14 | 15 | mode: 'production', 16 | 17 | target: 'electron-main', 18 | 19 | entry: './app/background.js', 20 | 21 | output: { 22 | path: path.join(__dirname, '..', 'app/dist'), 23 | filename: 'background.prod.js', 24 | }, 25 | 26 | optimization: { 27 | minimizer: [ 28 | new TerserPlugin({ 29 | parallel: true, 30 | sourceMap: true, 31 | cache: true, 32 | }), 33 | ], 34 | }, 35 | 36 | plugins: [ 37 | new BundleAnalyzerPlugin({ 38 | analyzerMode: process.env.OPEN_ANALYZER === 'true' ? 'server' : 'disabled', 39 | openAnalyzer: process.env.OPEN_ANALYZER === 'true', 40 | }), 41 | 42 | /** 43 | * Create global constants which can be configured at compile time. 44 | * 45 | * Useful for allowing different behaviour between development builds and 46 | * release builds 47 | * 48 | * NODE_ENV should be production so that modules do not perform certain 49 | * development checks 50 | */ 51 | new webpack.EnvironmentPlugin({ 52 | NODE_ENV: 'production', 53 | DEBUG_PROD: false, 54 | START_MINIMIZED: false, 55 | }), 56 | ], 57 | 58 | /** 59 | * Disables webpack processing of __dirname and __filename. 60 | * If you run the bundle in node.js it falls back to these values of node.js. 61 | * https://github.com/webpack/webpack/issues/2010 62 | */ 63 | node: { 64 | __dirname: false, 65 | __filename: false, 66 | }, 67 | }) 68 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | .sass-cache 2 | -------------------------------------------------------------------------------- /docs/.ruby-version: -------------------------------------------------------------------------------- 1 | 2.2.2 2 | -------------------------------------------------------------------------------- /docs/.spelling: -------------------------------------------------------------------------------- 1 | # markdown-spellcheck spelling configuration file 2 | # Format - lines beginning # are comments 3 | # global dictionary is at the start, file overrides afterwards 4 | # one word per line, to define a file override use ' - filename' 5 | # where filename is relative to this configuration file 6 | Zazu 7 | repo 8 | boolean 9 | JSON 10 | CWD 11 | CSS 12 | screensaver 13 | draggable 14 | toc 15 | unicode 16 | Analytics 17 | stylesheet 18 | iframe 19 | portableMode 20 | resume.docx 21 | -------------------------------------------------------------------------------- /docs/.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | 3 | rvm: 4 | - 2.2.2 5 | 6 | cache: bundler 7 | 8 | branches: 9 | only: 10 | - gh-pages 11 | 12 | before_install: 13 | - npm install -g markdown-spellcheck 14 | - gem install html-proofer 15 | 16 | script: 17 | - mdspell -nar --en-us "**/*.md" "!**/vendor/**/*.md" 18 | - bundle exec jekyll build 19 | - htmlproofer ./_site 20 | -------------------------------------------------------------------------------- /docs/404.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Zazu App 4 | --- 5 | 6 | Uh oh... Page not found. 7 | 8 | This page doesn't seem to exist. You might have followed a bad link or mistyped 9 | the address, feel free to try again. Alternatively, you can return to the 10 | [documentation](/documentation/) page. 11 | -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | zazuapp.org 2 | -------------------------------------------------------------------------------- /docs/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'jekyll' 4 | gem 'jekyll-github-metadata' 5 | gem 'kramdown' 6 | gem 'rouge' 7 | gem 'jekyll-paginate' 8 | -------------------------------------------------------------------------------- /docs/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | addressable (2.4.0) 5 | colorator (0.1) 6 | faraday (0.9.2) 7 | multipart-post (>= 1.2, < 3) 8 | ffi (1.9.10) 9 | ffi (1.9.10-java) 10 | jekyll (3.1.2) 11 | colorator (~> 0.1) 12 | jekyll-sass-converter (~> 1.0) 13 | jekyll-watch (~> 1.1) 14 | kramdown (~> 1.3) 15 | liquid (~> 3.0) 16 | mercenary (~> 0.3.3) 17 | rouge (~> 1.7) 18 | safe_yaml (~> 1.0) 19 | jekyll-github-metadata (1.11.1) 20 | octokit (~> 4.0) 21 | jekyll-paginate (1.1.0) 22 | jekyll-sass-converter (1.4.0) 23 | sass (~> 3.4) 24 | jekyll-watch (1.3.1) 25 | listen (~> 3.0) 26 | kramdown (1.11.1) 27 | liquid (3.0.6) 28 | listen (3.0.3) 29 | rb-fsevent (>= 0.9.3) 30 | rb-inotify (>= 0.9) 31 | mercenary (0.3.6) 32 | multipart-post (2.0.0) 33 | octokit (4.3.0) 34 | sawyer (~> 0.7.0, >= 0.5.3) 35 | rb-fsevent (0.9.7) 36 | rb-inotify (0.9.5) 37 | ffi (>= 0.5.0) 38 | rouge (1.10.1) 39 | safe_yaml (1.0.4) 40 | sass (3.4.22) 41 | sawyer (0.7.0) 42 | addressable (>= 2.3.5, < 2.5) 43 | faraday (~> 0.8, < 0.10) 44 | 45 | PLATFORMS 46 | java 47 | ruby 48 | 49 | DEPENDENCIES 50 | jekyll 51 | jekyll-github-metadata 52 | jekyll-paginate 53 | kramdown 54 | rouge 55 | 56 | BUNDLED WITH 57 | 1.12.5 58 | -------------------------------------------------------------------------------- /docs/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Alex Carpenter 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 | 23 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Material Jekyll Theme 2 | 3 | This theme was modified from [Material Jekyll Theme](https://github.com/gdg-managua/jekyll-mdl). 4 | 5 | ## Getting started 6 | 7 | To run this locally follow [this 8 | guide](https://help.github.com/articles/setting-up-your-github-pages-site-locally-with-jekyll/). 9 | 10 | The `gh-pages` branch is auto generated, so please commit to masters inside of 11 | the [docs](https://github.com/tinytacoteam/zazu/tree/master/docs) folder! 12 | -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | # Site settings 2 | title: Zazu App 3 | description: > 4 | Zazu is a new open source productivity app, that allows developers to be in the 5 | drivers seat. Unlike other solutions, there are no built in integrations, so 6 | every plugin has the full scope of what Zazu has to offer. 7 | fixedNav: 'true' # true or false 8 | themeColor: mint # teal, purple, green, blue, orange, purple, grey 9 | siteurl: 'http://zazuapp.org' 10 | branch: gh-pages 11 | paginate: 5 12 | paginate_path: "/blog/page:num/" 13 | 14 | collections: 15 | packages: 16 | output: false 17 | documentation: 18 | output: true 19 | permalink: /documentation/:path/ 20 | 21 | gems: 22 | - jekyll-github-metadata 23 | - jekyll-paginate 24 | - kramdown 25 | - rouge 26 | 27 | # Social 28 | twitterUsername: zazuapp 29 | dribbbleUsername: 30 | codepenUsername: 31 | githubUsername: tinytacoteam 32 | gitterUsername: tinytacoteam/zazu 33 | 34 | # Build settings 35 | permalink: /:year/:month/:title 36 | markdown: kramdown 37 | include: [_pages, _packages, _documentation, _posts] 38 | exclude: [vendor, _site, CHANGELOG.md, LICENSE, README.md, .ruby-version] 39 | sass: 40 | style: compressed 41 | -------------------------------------------------------------------------------- /docs/_documentation/getting-started.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: documentation 3 | description: "Getting started with Zazu" 4 | icon: "fa-user-plus" 5 | title: "Getting Started" 6 | --- 7 | 8 | * TOC 9 | {:toc} 10 | 11 | ## Download 12 | 13 | You can go to our [Download](/download/) page to get the latest version of Zazu 14 | or build your own. It offers a build for popular operating systems such as Mac, 15 | Linux and Windows. 16 | 17 | ## Run 18 | 19 | Once you open Zazu, it'll begin to install all your plugins and present you with 20 | a notification letting you know that your plugins have been installed. Once your 21 | plugins are installed, you can hit the default launch shortcut `alt+space` and 22 | see Zazu appear. You can begin to type in commands such as: 23 | 24 | * 13 feet to inches 25 | * screensaver 26 | * find resume.docx 27 | 28 | ## Configure 29 | 30 | All your configuration is in a single file, to make it easy to backup and 31 | version. It's located in your home directory under `~/.zazurc.json` (or 32 | `C:\Users\YOUR_NAME\.zazurc.json` for Windows). Here, you can add some new 33 | plugins and remove ones you don't want. There is more information in our 34 | documentation on [Personal Configuration](/documentation/configuration/). 35 | 36 | Zazu supports running in portable mode, details are found on the [configuration page](/documentation/configuration#portableMode) 37 | 38 | ## Moving Zazu 39 | 40 | On some Linux configurations, Zazu doesn't position itself correctly when it 41 | first opens. To fix this, parts of your selected theme have "draggable" regions, 42 | which allow you to drag Zazu. Since Zazu remembers where it was last opened, 43 | it'll stay in that position. 44 | -------------------------------------------------------------------------------- /docs/_documentation/themes.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: documentation 3 | description: "Overview of what is all included in Zazu Themes" 4 | icon: "fa-paint-brush" 5 | title: "Creating Themes" 6 | --- 7 | 8 | * TOC 9 | {:toc} 10 | 11 | ## Theme Overview 12 | 13 | The compiled CSS gets included when Zazu is launched. Be sure to include a 14 | `zazu.json` file in the root of your project with the following information: 15 | 16 | ~~~ javascript 17 | { 18 | "name": "Light Theme", 19 | "stylesheet": "dist/main.css" 20 | } 21 | ~~~~ 22 | 23 | ### Fields 24 | 25 | * `stylesheet` *string*: A relative path to the CSS to be used when displaying 26 | the Zazu window. 27 | 28 | ## Previewing your theme 29 | 30 | A [theme 31 | playbook](https://tinytacoteam.github.io/zazu-theme-playbook) exists so you can 32 | preview your Zazu theme with a few of the basic cases. 33 | 34 | Take a look at some of the other themes on the [packages](/themes/) page for 35 | some inspiration. 36 | 37 | ## Using your theme 38 | 39 | Just add your relative path to your GitHub repo inside of your [personal 40 | configuration](/documentation/configuration/#theme). 41 | 42 | ## Draggable Regions 43 | 44 | Zazu tries to be as small as possible, for this reason we don't have a title 45 | bar, so themes need to implement "draggable" regions. That way users can 46 | reposition Zazu if they need to. To define a draggable region you can add some 47 | CSS to your theme. 48 | 49 | ~~~ css 50 | body { 51 | -webkit-app-region: drag; 52 | } 53 | input { 54 | -webkit-app-region: no-drag; 55 | } 56 | ~~~ 57 | 58 | ## Submitting your theme 59 | 60 | Once you finish, submit it to the [themes page](/themes/) by making a package 61 | file in the 62 | [documentation](https://github.com/tinytacoteam/zazu/tree/master/docs/_packages) 63 | -------------------------------------------------------------------------------- /docs/_includes/feedback.html: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /docs/_includes/footer.html: -------------------------------------------------------------------------------- 1 | 19 | 24 | 25 | -------------------------------------------------------------------------------- /docs/_includes/fork.html: -------------------------------------------------------------------------------- 1 | 2 | Fork me on GitHub 3 | 4 | -------------------------------------------------------------------------------- /docs/_includes/navigation.html: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /docs/_includes/social.html: -------------------------------------------------------------------------------- 1 |
2 | 23 |
24 | -------------------------------------------------------------------------------- /docs/_includes/underbar.html: -------------------------------------------------------------------------------- 1 |
2 | {% if page.url != '/' %} 3 | 27 | {% endif %} 28 | 29 |
30 | -------------------------------------------------------------------------------- /docs/_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% include head.html %} 4 | 5 | {% include fork.html %} 6 | {% include navigation.html %} 7 | 8 | {{ content }} 9 | 10 | {% include footer.html %} 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /docs/_layouts/documentation.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: sidebar-page 3 | --- 4 | {{ content }} 5 | -------------------------------------------------------------------------------- /docs/_layouts/page.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 |
6 |
7 |

{{ page.title }}

8 |
9 |
10 | 11 | {% include underbar.html %} 12 | 13 |
14 | {{ content }} 15 |
16 | 17 | {% include feedback.html %} 18 |
19 | -------------------------------------------------------------------------------- /docs/_layouts/sidebar-page.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 |
6 |
7 |

{{ page.title }}

8 |
9 |
10 | 11 | {% include underbar.html %} 12 | 13 |
14 |
15 | {{ content }} 16 |
17 |
18 | 19 | {% include feedback.html %} 20 |
21 | -------------------------------------------------------------------------------- /docs/_packages/another-dark-theme.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: theme 4 | title: "Another Dark Theme" 5 | image: /images/package-icons/another-dark-theme.png 6 | githuburl: iansinnott/zazu-dark-theme 7 | description: "A simple, dark theme" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/ascii-search.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: false 3 | type: plugin 4 | title: "Ascii Search" 5 | image: /images/package-icons/ascii-search.png 6 | githuburl: tinytacoteam/zazu-ascii-search 7 | description: "Copy uncommon characters to your clipboard" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/battery.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Battery" 5 | image: /images/package-icons/battery.png 6 | githuburl: danielbayerlein/zazu-battery 7 | description: "Shows information about your battery" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/calculator.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Calculator" 5 | image: /images/package-icons/calculator.png 6 | githuburl: tinytacoteam/zazu-calculator 7 | description: "Quick access to advanced calculations" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/caniuse.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Can I use" 5 | image: /images/package-icons/caniuse.png 6 | githuburl: gabrielpoca/zazu-caniuse 7 | description: "Search and open features in caniuse.com" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/capybara-theme.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: theme 4 | title: "Capybara Theme" 5 | image: /images/package-icons/capybara-theme.png 6 | githuburl: cecoates/zazu-capybara-theme 7 | description: "Bright theme featuring a capybara with a monocle" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/chrome-bookmarks.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Chrome Bookmarks" 5 | image: /images/package-icons/chrome.png 6 | githuburl: tinytacoteam/zazu-chrome-bookmarks 7 | description: "Search your Google Chrome bookmarks" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/clean-dark-theme.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: theme 4 | title: "Clean Dark Theme" 5 | image: /images/package-icons/clean-dark-theme.png 6 | githuburl: singuerinc/zazu-clean-dark-theme 7 | description: "Dark theme with no logo to get in your way" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/clement-theme.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: theme 4 | title: "Clement Theme" 5 | image: /images/package-icons/clement-theme.png 6 | githuburl: Eric-Jackson/zazu-clement-theme 7 | description: "A simple, spacious and clean theme for Zazu" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/clipboard.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Clipboard" 5 | image: /images/package-icons/clipboard.png 6 | githuburl: tinytacoteam/zazu-clipboard 7 | description: "An elegant clipboard manager" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/colors.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Colors" 5 | image: /images/package-icons/colors.png 6 | githuburl: halvves/zazu-colors 7 | description: "Convert some colors" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/currency-convertor.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Currency Convertor" 5 | image: /images/package-icons/currency-convertor.svg 6 | githuburl: avaly/zazu-currency-convertor 7 | description: "Converts amounts between currencies." 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/dark-solarized.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: theme 4 | title: "Solarized Dark Theme" 5 | image: /images/package-icons/dark-solarized-theme.png 6 | githuburl: marcpaul/zazu-solarized-dark-theme 7 | description: "A solarized inspired theme" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/dark-theme.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: theme 4 | title: "Dark Theme" 5 | image: /images/package-icons/dark-theme.png 6 | githuburl: tinytacoteam/zazu-dark-theme 7 | description: "The darker side of Zazu" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/dash.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Dash" 5 | image: /images/package-icons/dash.png 6 | githuburl: fracturedloop/zazu-dash 7 | description: "Search Dash or Zeal with Zazu" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/dev-doc.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: false 3 | type: plugin 4 | title: "Dev Documentation" 5 | image: /images/package-icons/zazu-dev-doc.png 6 | githuburl: jgoday/zazu-dev-doc 7 | description: "search and go to online development documentation." 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/devdocs.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "DevDocs" 5 | image: /images/package-icons/devdocs.png 6 | githuburl: danielbayerlein/zazu-devdocs 7 | description: "Search for API documentations with devdocs.io" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/dictionary.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Dictionary" 5 | image: /images/package-icons/dictionary.png 6 | githuburl: sagold/zazu-dict 7 | description: "Find synonyms, translate german <-> *" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/docker.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Docker" 5 | image: /images/package-icons/docker.png 6 | githuburl: nantaphop/zazu-docker 7 | description: "Quickly run Docker commands" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/emoj.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Emoj" 5 | image: /images/package-icons/emoj.svg 6 | githuburl: blakek/zazu-emoj 7 | description: "Find relevant emoji" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/emoji.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Emoji" 5 | image: /images/package-icons/zazu-emoji.png 6 | githuburl: iansinnott/zazu-emoji 7 | description: "⚡ Fast, offline emoji search" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/encode-decode.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Encode / Decode" 5 | image: /images/package-icons/encode-decode.svg 6 | githuburl: brpaz/zazu-encode-decode 7 | description: "Encodes and decodes strings in multiple formats (base64, html, etc)" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/fallback.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Fallback" 5 | image: /images/package-icons/fallback.png 6 | githuburl: tinytacoteam/zazu-fallback 7 | description: "Search sites such as Google, DuckDuckGo, GitHub and more!" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/file-finder.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "File Finder" 5 | image: /images/package-icons/file-finder.png 6 | githuburl: tinytacoteam/zazu-file-finder 7 | description: "Locate files and apps" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/firefox-bookmarks.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Firefox Bookmarks" 5 | image: /images/package-icons/firefox.png 6 | githuburl: linonetwo/zazu-firefox-bookmarks 7 | description: "Search your Firefox bookmarks" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/fkill.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Fkill" 5 | image: /images/package-icons/fkill.png 6 | githuburl: chrishelgert/zazu-fkill 7 | description: "Kill processes with fkill" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/free-shadowsocks.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "free-shadowsocks" 5 | image: /images/package-icons/free-shadowsocks.png 6 | githuburl: sqlwwx/zazu-free-shadowsocks 7 | description: "Getting free sock proxies from ishadowsocks" 8 | --- 9 | 10 | -------------------------------------------------------------------------------- /docs/_packages/giphy.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Giphy" 5 | image: /images/package-icons/giphy.png 6 | githuburl: halvves/zazu-giphy 7 | description: "Gif giving is the greatest love language of all." 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/gist.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Gist" 5 | icon: fa-github-alt 6 | githuburl: afaur/zazu-gist 7 | description: "Create gists from your clipboard contents" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/github-repos.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "GitHub repos" 5 | image: /images/package-icons/github-repos.png 6 | githuburl: gabrielpoca/zazu-github-repos 7 | description: "Search and open your GitHub repos" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/github.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "GitHub" 5 | image: /images/package-icons/github.png 6 | githuburl: danielbayerlein/zazu-github 7 | description: "Search for GitHub repositories with github.com" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/hacker-news.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Hacker News" 5 | image: /images/package-icons/hacker-news.png 6 | githuburl: chrishelgert/zazu-hacker-news 7 | description: "List the latest Hacker News" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/hash.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Hash" 5 | image: /images/package-icons/hash.svg 6 | githuburl: brpaz/zazu-hash 7 | description: "generate hashes using common algorithms like md5 or sha1" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/homebrew.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Homebrew" 5 | image: /images/package-icons/homebrew.png 6 | githuburl: danielbayerlein/zazu-homebrew 7 | description: "Search for Homebrew formulae with braumeister.org" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/ip-address.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "IP Address" 5 | image: /images/package-icons/ip-address.svg 6 | githuburl: blakek/zazu-ip-address 7 | description: "Show your internal and external IP address" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/js-beautify.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "JS Beautify" 5 | image: /images/package-icons/js-beautify.png 6 | githuburl: blainesch/zazu-js-beautify 7 | description: "Beautify JavaScript from your clipboard" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/light-solarized.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: theme 4 | title: "Solarized Light Theme" 5 | image: /images/package-icons/dark-solarized-theme.png 6 | githuburl: marcpaul/zazu-solarized-light-theme 7 | description: "A solarized inspired theme" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/light-theme.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: theme 4 | title: "Light Theme" 5 | image: /images/package-icons/light-theme.png 6 | githuburl: tinytacoteam/zazu-light-theme 7 | description: "The default theme for Zazu" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/mac-1password.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Mac 1Password" 5 | image: /images/package-icons/1password.png 6 | githuburl: tinytacoteam/zazu-mac-1password 7 | description: "Open 1password sites on Mac" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/mac-open-terminal.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Open Terminal" 5 | image: /images/package-icons/terminal.png 6 | githuburl: amjith/zazu-mac-open-terminal 7 | description: "Open terminal from the current finder path." 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/mac-vpn.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Toggle VPN" 5 | image: /images/package-icons/vpn.png 6 | githuburl: amjith/zazu-mac-vpn 7 | description: "Connect/Disconnect VPN connections." 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/npms.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "npms" 5 | image: /images/package-icons/npms.png 6 | githuburl: danielbayerlein/zazu-npms 7 | description: "Search for npm packages with npms.io" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/omnifocus.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Omnifocus" 5 | image: /images/package-icons/omnifocus.png 6 | githuburl: bookstein/zazu-mac-omnifocus 7 | description: "Create tasks in Omnifocus" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/package-manager.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Package Manager" 5 | image: /images/package-icons/package-manager.png 6 | githuburl: tinytacoteam/zazu-package-manager 7 | description: "A easy to use package manager" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/packagist.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Packagist" 5 | image: /images/package-icons/packagist.png 6 | githuburl: brpaz/zazu-packagist 7 | description: "Search composer packages on packagist.org" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/password.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Password generator" 5 | image: /images/package-icons/password.png 6 | githuburl: jnstr/zazu-password 7 | description: "Generate passwords with ease" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/pibble.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Pibble" 5 | image: /images/package-icons/pibble.png 6 | githuburl: blainesch/zazu-pibble 7 | description: "Brighten your day with moar pibbles" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/placehold.it.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Placehold.it" 5 | image: /images/package-icons/placehold.png 6 | githuburl: brpaz/zazu-placehold.it 7 | description: "Generates placeholder images using Placehold.it" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/playful-theme.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: theme 4 | title: "Playful Theme" 5 | image: /images/package-icons/playful-theme.png 6 | githuburl: tinytacoteam/zazu-playful-theme 7 | description: "For the young at heart." 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/pypi.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "PyPi" 5 | image: /images/package-icons/pypi.png 6 | githuburl: afaur/zazu-pypi 7 | description: "Search for your favorite Python packages" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/rubygems.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "RubyGems" 5 | image: /images/package-icons/rubygems.png 6 | githuburl: danielbayerlein/zazu-rubygems 7 | description: "Search for gems with rubygems.org" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/simple-theme.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: theme 4 | title: "Simple Theme" 5 | image: /images/package-icons/simple-theme.png 6 | githuburl: danielbayerlein/zazu-simple-theme 7 | description: "A simple theme for Zazu" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/snippets.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Snippets" 5 | image: /images/package-icons/snippets.svg 6 | githuburl: tinytacoteam/zazu-snippets 7 | description: "Create and easily access common snippets" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/system.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "System" 5 | image: /images/package-icons/system.png 6 | githuburl: tinytacoteam/zazu-system 7 | description: "Tell your computer to lock, screensaver and more!" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/timetracker.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Timetracker" 5 | image: /images/package-icons/timetracker.svg 6 | githuburl: jnstr/zazu-timetracker 7 | description: "Track the time you spend on projects" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/timezone.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Timezone" 5 | image: /images/package-icons/timezone.svg 6 | githuburl: avaly/zazu-timezone 7 | description: "Shows what time it is in another timezone." 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/tldr.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "TLDR" 5 | image: /images/package-icons/tldr.png 6 | githuburl: twang2218/zazu-tldr 7 | description: "Check tldr pages from Zazu" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/translation-and-optional-anki.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Translation and Optional Anki" 5 | image: /images/package-icons/translation.png 6 | githuburl: linonetwo/zazu-translation 7 | description: "Translate and optionally add to anki" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/uptime.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "uptime" 5 | image: /images/package-icons/uptime.png 6 | githuburl: danielbayerlein/zazu-uptime 7 | description: "Shows the system uptime" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_packages/utime.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Utime" 5 | icon: fa-clock-o 6 | githuburl: puyt/zazu-utime 7 | description: "Convert unix timestamps to human-readable dates and vice versa" 8 | --- -------------------------------------------------------------------------------- /docs/_packages/weather.md: -------------------------------------------------------------------------------- 1 | --- 2 | top: true 3 | type: plugin 4 | title: "Weather" 5 | image: /images/package-icons/weather.png 6 | githuburl: blainesch/zazu-weather 7 | description: "Get weather information from your location and others" 8 | --- 9 | -------------------------------------------------------------------------------- /docs/_pages/documentation.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Documentation 4 | permalink: /documentation/ 5 | --- 6 | 55 | -------------------------------------------------------------------------------- /docs/_pages/download.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Download Zazu 4 | permalink: /download/ 5 | --- 6 | 7 |
8 |

Download v{{ site.currentAppVersion | default: '0.4.0' }} for your Operating System

9 | 11 | Windows Download 12 |

Windows

13 |
14 | 16 | Mac Download 17 |

macOS

18 |
19 | 21 | Ubuntu Download 22 |

Ubuntu

23 |
24 |
25 | 26 |
27 |

Compile Locally

28 |

If we don't create builds for your platform, feel free to compile it locally

29 |
30 | git clone git@github.com:tinytacoteam/zazu.git
31 | cd zazu
32 | npm install
33 | npm run release
34 | open releases
35 |     
36 |
37 | 38 |
39 |

Install via Brew

40 |

For Macs you can also install the latest build using Homebrew

42 |
43 | brew update
44 | brew cask install zazu
45 |     
46 |
47 | 48 | 55 | -------------------------------------------------------------------------------- /docs/_pages/faq.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: FAQ 4 | permalink: /faq/ 5 | --- 6 | 7 |
8 |
9 |

What is the core vision?

10 |

A fully extensible and open source launcher for hackers, creators and 11 | dabblers. It comes with sane defaults to make it useful out of the box. But 12 | everything can be changed to fit your needs. Don't let others tell you the 13 | best way to be productive, configure it to be perfect for you.

14 |
15 |
16 |

How do you compare to alternatives?

Zazu treats 17 | plugins as first class citizens. Even the app finder is built as a plugin 18 | which can be replaced (if desired). This means plugins are designed as 19 | natural extensions of Zazu and they don't require a special trigger such as 20 | / or ,. This allows a more intuitive plugin API that doesn't hamper 21 | discoverability.

Zazu is a cross platform app launcher that supports 22 | Linux, Mac and Windows. Every build is tested on all three platforms. This 23 | helps ensure it works perfectly when you download it, and has a consistent 24 | experience when you switch between Operating Systems.

Zazu is open 25 | source licensed under a permissive MIT license. If the calculator is missing 26 | an important feature, make a pull request! If you hate this one thing about 27 | Zazu that would totally make it better, fork it!

All configuration is in a single text 29 | file. It can be backuped and versioned so you can have a consistent 30 | experience.

31 |
32 |
33 |

Does it work on <PLATFORM>?

34 |

Yes! Zazu works on Linux, Mac and Windows!

35 |
36 |
37 |

Can I make my own plugins?

38 |

Absolutely! Zazu is designed with extensibility in mind. Want something 39 | custom to help with your job? We have a tutorial to help make your first Zazu 41 | plugin.

42 |

Don't need a calculator? Get rid of it from your configuration file. Need a 44 | snappier file finder? Swap out the default!

45 |
46 |
47 |

How fast is it?

48 |

I have not officially benchmarked it. My friends and I use it every day 49 | and it is quite snappy. If a plugin feels sluggish to you let me know, I'd 50 | love to help you make it faster. If you already know what the problem is, 51 | feel free to open a pull request, I'd love to have some help. :)

52 |
53 |
54 | -------------------------------------------------------------------------------- /docs/_pages/plugins.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Plugins 4 | permalink: /plugins/ 5 | --- 6 | 7 | {% for package in site.packages %} 8 | {% if package.type == "plugin" %} 9 | 10 | {% if package.icon %} 11 | 12 | {% else %} 13 | {{ package.title }} Logo 14 | {% endif %} 15 |

{{ package.title }}

16 |

{{ package.description }}

17 |
18 | {% endif %} 19 | {% endfor %} 20 | 21 |
22 | 23 | Add your plugin to this page! 24 | 25 |
26 | -------------------------------------------------------------------------------- /docs/_pages/themes.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Themes 4 | permalink: /themes/ 5 | --- 6 | 7 | {% for package in site.packages %} 8 | {% if package.type == "theme" %} 9 | 10 | {{ package.title }} Logo 11 |

{{ package.title }}

12 |

{{ package.description }}

13 |
14 | {% endif %} 15 | {% endfor %} 16 | 17 |
18 | 19 | Add your theme to this page! 20 | 21 |
22 | -------------------------------------------------------------------------------- /docs/_posts/2017-03-18-zazu-v0.5.0.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: "Zazu's v0.5.0 is released!" 4 | description: "Introducing Preview block types and more!" 5 | permalink: /blog/2017/video-introduction-to-zazu 6 | --- 7 | 8 | ### Bugs 9 | 10 | There were quite a few bugs that were fixed. For example if you ever tried 11 | narrowing down your plugin logs in the debugger, it wasn't working as correctly, 12 | but it's fixed now. 13 | 14 | We also made `npm` more resilient, yet again! 15 | 16 | ### Features 17 | 18 | We are introducing a new block type [Preview][preview] which allows you to 19 | display large text on the screen, compared to a small notification. This would 20 | be useful for presentations, or for more accessible communications. 21 | 22 | We fixed quite a few more bugs and added a few more features, be sure to check 23 | out the [changelog][changelog] for information on the rest of the bugs. 24 | 25 | [changelog]: https://github.com/tinytacoteam/zazu/blob/master/changelog.md#050 26 | [preview]: http://zazuapp.org/documentation/blocks/#preview 27 | -------------------------------------------------------------------------------- /docs/_sass/base/_reset.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Reset 3 | ========================================================================== */ 4 | 5 | /* Reset Modified from Normalize.css */ 6 | 7 | /* Base Reset */ 8 | 9 | * { 10 | margin: 0; 11 | padding: 0; 12 | } 13 | 14 | *, *:before, *:after { box-sizing: inherit; } 15 | 16 | 17 | html { 18 | min-height: 100%; 19 | box-sizing: border-box; 20 | -webkit-tap-highlight-color: transparent; 21 | font-size: 62.5%; // Make it easy to calculate rems to px 22 | } 23 | 24 | body { 25 | @include ff--sans-serif(400); 26 | -webkit-font-smoothing: antialiased; 27 | } 28 | 29 | article, 30 | aside, 31 | figcaption, 32 | figure, 33 | footer, 34 | header, 35 | hgroup, 36 | main, 37 | menu, 38 | nav, 39 | section { 40 | display: block; 41 | } 42 | 43 | h1, 44 | h2, 45 | h3, 46 | h4, 47 | h5, 48 | h6 { 49 | 50 | } 51 | 52 | 53 | /* Media */ 54 | audio, canvas, progress, video { 55 | display: inline-block; 56 | vertical-align: baseline; 57 | } 58 | 59 | audio:not([controls]) { 60 | display: none; 61 | height: 0; 62 | } 63 | 64 | /* Images */ 65 | 66 | [hidden], template { display: none; } 67 | 68 | img { 69 | max-width: 100%; 70 | font-style: italic; 71 | vertical-align: middle; 72 | border: 0; 73 | } 74 | 75 | svg:not(:root) { overflow: hidden; } 76 | 77 | svg { 78 | pointer-events: none; 79 | max-height: 100% 80 | } 81 | 82 | 83 | /* Links */ 84 | 85 | a { 86 | background-color: transparent; 87 | text-decoration: none; 88 | color: $t-theme; 89 | } 90 | 91 | a:active, a:hover { outline: 0; } 92 | 93 | /* Text Selectors */ 94 | 95 | abbr[title] { border-bottom: 1px dotted; } 96 | b, strong { font-weight: bold; } 97 | i, em { font-weight: italic; } 98 | 99 | /* Content */ 100 | 101 | figure { 102 | margin: 0; 103 | } 104 | 105 | 106 | hr { 107 | margin-top: 2.5rem; 108 | margin-bottom: 2.5rem; 109 | width: 100%; 110 | height: 1px; 111 | border: 0; 112 | background: #EFF1F3; 113 | } 114 | 115 | /* Code Blocks */ 116 | 117 | pre { overflow: auto; } 118 | 119 | code, pre { 120 | 121 | } 122 | -------------------------------------------------------------------------------- /docs/_sass/components/_archives.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Archives 3 | ========================================================================== */ 4 | 5 | .c-archives { 6 | margin-bottom: 10rem; 7 | } 8 | 9 | .c-archives__year { 10 | margin-bottom: 2.5rem; 11 | @include fs--heading-1; 12 | } 13 | 14 | .c-archives__list { 15 | margin-bottom: 2.5rem; 16 | list-style: none; 17 | } 18 | 19 | .c-archives__item { 20 | padding-top: 2.5rem; 21 | padding-bottom: 2.5rem; 22 | border-top: 1px solid #EFF1F3; 23 | display: -webkit-box; 24 | display: -webkit-flex; 25 | display: -ms-flexbox; 26 | display: flex; 27 | -webkit-flex-wrap: wrap; 28 | -ms-flex-wrap: wrap; 29 | flex-wrap: wrap; 30 | -webkit-box-pack: justify; 31 | -webkit-justify-content: space-between; 32 | -ms-flex-pack: justify; 33 | justify-content: space-between; 34 | -webkit-box-align: center; 35 | -webkit-align-items: center; 36 | -ms-flex-align: center; 37 | align-items: center; 38 | 39 | h3 { 40 | @include fs--body; 41 | } 42 | 43 | p { 44 | @include fs--body; 45 | color: #515862; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /docs/_sass/components/_buttons.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Buttons 3 | ========================================================================== */ 4 | 5 | // Base button 6 | .c-btn { 7 | padding: 1.5rem 2rem; 8 | @include fs--meta; 9 | text-decoration: none; 10 | background: #FAFAFA; 11 | box-shadow: 0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12); 12 | border-radius: 3px; 13 | } 14 | 15 | // Button groups 16 | .c-btn-group { 17 | display: flex; 18 | justify-content: space-between; 19 | } 20 | -------------------------------------------------------------------------------- /docs/_sass/components/_feedback.scss: -------------------------------------------------------------------------------- 1 | #feedback { 2 | background: lighten($t-theme, 40%); 3 | border-bottom: 1px solid lighten($t-theme, 25%); 4 | padding: 10px; 5 | 6 | .main, .extra, .thankyou { 7 | max-width: 76rem; 8 | margin-right: auto; 9 | margin-left: auto; 10 | clear: both; 11 | } 12 | label, textarea, button { 13 | font-size: 150%; 14 | } 15 | label { 16 | padding-left: 5px; 17 | } 18 | .main { 19 | height: 100px; 20 | h2 { 21 | line-height: 50px; 22 | } 23 | .form-element { 24 | float: left; 25 | padding-right: 15px; 26 | line-height: 50px; 27 | } 28 | button { 29 | background: $t-theme; 30 | padding: 5px 10px; 31 | border: 0; 32 | color: #fff; 33 | border-radius: 5px; 34 | height: 30px; 35 | font-weight: bold; 36 | cursor:pointer; 37 | cursor:hand; 38 | &:hover { 39 | background: darken($t-theme, 10%); 40 | } 41 | } 42 | @media screen and (min-width: $screen-md-min) { 43 | height: 50px; 44 | h2 { 45 | float: left; 46 | display: inline; 47 | padding-right: 15px; 48 | line-height: 50px; 49 | } 50 | } 51 | } 52 | .extra { 53 | label { 54 | display: block; 55 | } 56 | textarea { 57 | max-width: 70rem; 58 | width: 90%; 59 | height: 125px; 60 | padding: 5px; 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /docs/_sass/components/_footer.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Footer 3 | ========================================================================== */ 4 | 5 | .c-footer { 6 | padding-top: 14.1rem; // 75px 7 | padding-left: 2.5rem; 8 | padding-right: 2.5rem; 9 | width: 100%; 10 | height: 300px; 11 | background: $c__light-grey; 12 | color: darken($c__light-grey, 25%); 13 | 14 | p { 15 | @include fs--meta; 16 | line-height: 3; 17 | } 18 | 19 | a:not(:first-of-type) { 20 | margin-left: 2rem; 21 | } 22 | } 23 | 24 | .c-footer__container { 25 | display: -webkit-box; 26 | display: -webkit-flex; 27 | display: -ms-flexbox; 28 | -webkit-flex-wrap: wrap; 29 | -ms-flex-wrap: wrap; 30 | flex-wrap: wrap; 31 | display: flex; 32 | -webkit-box-pack: justify; 33 | -webkit-justify-content: space-between; 34 | -ms-flex-pack: justify; 35 | justify-content: space-between; 36 | } 37 | -------------------------------------------------------------------------------- /docs/_sass/components/_fork.scss: -------------------------------------------------------------------------------- 1 | a.fork { 2 | display: none; 3 | } 4 | @media screen and (min-width: $screen-sm) { 5 | a.fork { 6 | display: inline; 7 | 8 | img { 9 | position: fixed; 10 | z-index: 999; 11 | top: 0; 12 | right: 0; 13 | border: 0; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /docs/_sass/components/_header.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Header 3 | ========================================================================== */ 4 | 5 | .c-header { 6 | padding-top: 14.1rem; // 75px 7 | padding-bottom: 7.5rem; // 75px 8 | padding-right: 2.5rem; 9 | padding-left: 2.5rem; 10 | background: $t-theme; 11 | position: relative; 12 | max-width: 100%; 13 | canvas { 14 | position: absolute; 15 | bottom: 0; 16 | left: 0; 17 | z-index: 1; 18 | } 19 | h1 { 20 | text-shadow: 21 | -1px -1px 0 $c__mint, 22 | 1px -1px 0 $c__mint, 23 | -1px 1px 0 $c__mint, 24 | 1px 1px 0 $c__mint; 25 | position: relative; 26 | z-index: 2; 27 | } 28 | } 29 | 30 | .c-header__title { 31 | position: relative; 32 | @include ff--mono(500); 33 | @include fs--title; 34 | color: $c__white; 35 | 36 | span { 37 | color: rgba(#fff, .5); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /docs/_sass/components/_navigation.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Navigation 3 | ========================================================================== */ 4 | 5 | .c-navigation { 6 | position: absolute; 7 | top: 0; 8 | left: 0; 9 | padding: 0 2.5rem; 10 | width: 100%; 11 | background: $t-theme; 12 | z-index: 10; 13 | 14 | &:after { 15 | content: ''; 16 | position: absolute; 17 | top: 100%; 18 | left: 0; 19 | width: 100%; 20 | height: 10px; 21 | background: linear-gradient(to bottom, rgba(#000, .25), rgba(#000, 0)); 22 | } 23 | 24 | &.is-fixed { 25 | position: fixed; 26 | will-change: transform; 27 | } 28 | } 29 | 30 | .c-navigation__item { 31 | position: relative; 32 | display: inline-block; 33 | padding-top: 2.5rem; 34 | padding-bottom: 2.5rem; 35 | @include ff--mono(500); 36 | @include fs--meta; 37 | color: $c__white; 38 | text-transform: uppercase; 39 | 40 | &:not(:last-of-type) { 41 | margin-right: 2.5rem; 42 | } 43 | 44 | &:after { 45 | content: ''; 46 | position: absolute; 47 | bottom: 0; 48 | left: 0; 49 | width: 100%; 50 | height: 2px; 51 | background: transparent; 52 | transition: background ease-in-out 0.2s; 53 | } 54 | 55 | &:hover:after, 56 | &.is-active:after { 57 | background: $c__white; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /docs/_sass/components/_packages.scss: -------------------------------------------------------------------------------- 1 | a.package { 2 | width: 325px; 3 | border: 2px solid darken($c__light-grey, 10%); 4 | text-align: center; 5 | margin: 10px; 6 | padding-top: 20px; 7 | height: 300px; 8 | float: left; 9 | position: relative; 10 | text-decoration: none !important; 11 | 12 | &.download { 13 | width: 200px; 14 | height: 200px; 15 | } 16 | 17 | i.fa { 18 | font-size: 128px; 19 | } 20 | 21 | img { 22 | max-width: 128px; 23 | } 24 | 25 | &:hover { 26 | background-color: $c__light-grey; 27 | } 28 | 29 | &:before, &:after { 30 | font: normal normal normal 14px/1 FontAwesome; 31 | position: absolute; 32 | top: 0; 33 | right: 0; 34 | text-align: center; 35 | display: block; 36 | width: 35px; 37 | } 38 | 39 | &:before { 40 | @include fs--title; 41 | color: $t-theme; 42 | content: "\f02e"; // fa-bookmark 43 | line-height: 1; 44 | top: -5px; 45 | } 46 | 47 | &:after { 48 | text-align: center; 49 | @include fs--body; 50 | color: $c__white; 51 | top: 2px; 52 | line-height: 1; 53 | } 54 | 55 | &.windows:after { 56 | content: "\f17a"; // windows logo 57 | } 58 | 59 | &.ubuntu:after { 60 | content: "\f17c"; // linux penguin 61 | } 62 | 63 | &.mac:after { 64 | content: "\f179"; // apple icon 65 | } 66 | 67 | &.theme:after { 68 | content: "\f1fc"; // paint-brush 69 | } 70 | 71 | &.plugin:after { 72 | content: "\f1e6"; // fa-plug 73 | } 74 | } 75 | 76 | div.submit { 77 | text-align: center; 78 | clear: both; 79 | } 80 | -------------------------------------------------------------------------------- /docs/_sass/components/_search.scss: -------------------------------------------------------------------------------- 1 | .searchContainer { 2 | max-width: 400px; 3 | width: 100%; 4 | height: 40px; 5 | float: right; 6 | overflow: visible; 7 | 8 | input { 9 | font-size: 20px; 10 | width: 25%; 11 | margin-left: 75%; 12 | padding: 5px; 13 | outline: none; 14 | transition: all .5s ease; 15 | &:focus { 16 | margin-left: 0; 17 | width: 100%; 18 | } 19 | } 20 | 21 | select { 22 | top: -2px; 23 | margin-left: 5px; 24 | position: relative; 25 | border: none; 26 | font-size: 14px; 27 | height: 35px; 28 | padding: 5px; 29 | } 30 | 31 | &.focused .result { 32 | display: block; 33 | } 34 | 35 | .result { 36 | border-color: darken(white, 10%); 37 | border-style: solid; 38 | border-width: 0 1px 1px 0; 39 | cursor: pointer; 40 | background-color: #fff; 41 | padding: 5px 10px; 42 | position: relative; 43 | z-index: 2; 44 | display: none; 45 | 46 | img { 47 | width: 30px; 48 | height: 30px; 49 | margin-right: 10px; 50 | } 51 | 52 | i { 53 | margin-right: 10px; 54 | font-size: 35px; 55 | } 56 | 57 | p { 58 | margin: 0; 59 | } 60 | 61 | &:hover { 62 | background-color: darken(white, 2.5%); 63 | } 64 | 65 | &.posts { 66 | border-left: 3px solid $c__purple; 67 | } 68 | 69 | &.packages { 70 | border-left: 3px solid $c__orange; 71 | } 72 | 73 | &.docs { 74 | border-left: 3px solid $c__mint; 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /docs/_sass/components/_social.scss: -------------------------------------------------------------------------------- 1 | .c-social { 2 | padding: 7.5rem; // 75px 3 | background: #fff; 4 | } 5 | 6 | .c-social__list { 7 | max-width: 76rem; // 760px 8 | margin-right: auto; 9 | margin-left: auto; 10 | list-style: none; 11 | } 12 | 13 | .c-social__title { 14 | @include ff--mono(500); 15 | @include fs--heading-2; 16 | color: rgba(#000, .5); 17 | } 18 | -------------------------------------------------------------------------------- /docs/_sass/components/_underbar.scss: -------------------------------------------------------------------------------- 1 | .additionalInformation { 2 | @include fs--meta; 3 | margin: 10px; 4 | .breadcrumbs { 5 | width: 50%; 6 | float: left; 7 | } 8 | .search { 9 | width: 50%; 10 | float: right; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /docs/_sass/helpers/_mixins.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Mixins 3 | ========================================================================== */ 4 | 5 | // Font families 6 | @mixin ff--sans-serif($font-weight: normal) { 7 | font-family: 'Roboto', 'Helvetica Neue', Helvetica, sans-serif; 8 | font-weight: $font-weight; 9 | } 10 | 11 | @mixin ff--mono($font-weight: normal) { 12 | font-family: 'Roboto Mono', monospace; 13 | font-weight: $font-weight; 14 | } 15 | 16 | // Font sizing 17 | @mixin fs--title { 18 | line-height: 1.5; 19 | font-size: 4rem; // 40px 20 | } 21 | 22 | @mixin fs--heading-1 { 23 | line-height: 1.25; 24 | font-size: 3.5rem; // 35px 25 | } 26 | 27 | @mixin fs--heading-2 { 28 | line-height: 1.25; 29 | font-size: 3rem; // 30px 30 | } 31 | 32 | @mixin fs--body { 33 | line-height: 1.5; 34 | font-size: 1.8rem; // 18px 35 | } 36 | 37 | @mixin fs--meta { 38 | line-height: 1; 39 | font-size: 1.6rem; // 16px 40 | } 41 | 42 | @mixin clearfix { 43 | overflow: auto; 44 | clear: both; 45 | zoom: 1; 46 | } 47 | -------------------------------------------------------------------------------- /docs/_sass/helpers/_variables.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Variables 3 | ========================================================================== */ 4 | 5 | // Colors 6 | $c__red: #F44336; 7 | $c__pink: #E91E63; 8 | $c__purple: #9C27B0; 9 | $c__deep-purple: #673AB7; 10 | $c__indigo: #3F51B5; 11 | $c__blue: #2196F3; 12 | $c__light-blue: #03A9F4; 13 | $c__cyan: #00BCD4; 14 | $c__teal: #009688; 15 | $c__green: #4CAF50; 16 | $c__light-green: #8BC34A; 17 | $c__lime: #CDDC39; 18 | $c__yellow: #FFEB3B; 19 | $c__amber: #FFC107; 20 | $c__orange: #FF9800; 21 | $c__deep-orange: #FF5722; 22 | $c__brown: #795548; 23 | $c__grey: #9E9E9E; 24 | $c__light-grey: #FAFAFA; 25 | $c__blue-grey: #607D8B; 26 | $c__black: #000000; 27 | $c__white: #ffffff; 28 | $c__mint: #5CC7B2; 29 | 30 | // Theme 31 | $t-theme: $c__mint; 32 | 33 | // Bootstrap grid variables 34 | $screen-xs: 480px; // Extra small screen / phone 35 | $screen-xs-min: $screen-xs; 36 | $screen-phone: $screen-xs-min; 37 | 38 | $screen-sm: 768px; // Small screen / tablet 39 | $screen-sm-min: $screen-sm; 40 | $screen-tablet: $screen-sm-min; 41 | 42 | $screen-md: 992px; // Medium screen / desktop 43 | $screen-md-min: $screen-md; 44 | $screen-desktop: $screen-md-min; 45 | 46 | $screen-lg: 1200px; // Large screen / wide desktop 47 | $screen-lg-min: $screen-lg; 48 | $screen-lg-desktop: $screen-lg-min; 49 | 50 | $screen-xs-max: ($screen-sm-min - 1); 51 | $screen-sm-max: ($screen-md-min - 1); 52 | $screen-md-max: ($screen-lg-min - 1); 53 | -------------------------------------------------------------------------------- /docs/_sass/themes/_blue.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Blue Theme 3 | ========================================================================== */ 4 | 5 | .t-blue { 6 | 7 | .c-navigation, 8 | .c-header { 9 | background: $c__blue; 10 | } 11 | 12 | .c-article__main a:not(.c-btn) { 13 | color: $c__blue; 14 | } 15 | 16 | .c-footer a { 17 | color: $c__blue; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/_sass/themes/_green.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Green Theme 3 | ========================================================================== */ 4 | 5 | .t-green { 6 | 7 | .c-navigation, 8 | .c-header { 9 | background: $c__green; 10 | } 11 | 12 | .c-article__main a:not(.c-btn) { 13 | color: $c__green; 14 | } 15 | 16 | .c-footer a { 17 | color: $c__green; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/_sass/themes/_grey.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Grey Theme 3 | ========================================================================== */ 4 | 5 | .t-grey { 6 | 7 | .c-navigation, 8 | .c-header { 9 | background: $c__blue-grey; 10 | } 11 | 12 | .c-article__main a:not(.c-btn) { 13 | color: $c__blue-grey; 14 | } 15 | 16 | .c-footer a { 17 | color: $c__blue-grey; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/_sass/themes/_mint.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Teal Theme 3 | ========================================================================== */ 4 | 5 | .t-mint { 6 | 7 | .c-navigation, 8 | .c-header { 9 | background: $c__mint; 10 | } 11 | 12 | .c-article__main a:not(.c-btn) { 13 | color: $c__mint; 14 | } 15 | 16 | .c-footer a { 17 | color: $c__mint; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/_sass/themes/_orange.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Grey Theme 3 | ========================================================================== */ 4 | 5 | .t-orange { 6 | 7 | .c-navigation, 8 | .c-header { 9 | background: $c__deep-orange; 10 | } 11 | 12 | .c-article__main a:not(.c-btn) { 13 | color: $c__deep-orange; 14 | } 15 | 16 | .c-footer a { 17 | color: $c__deep-orange; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/_sass/themes/_purple.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Grey Theme 3 | ========================================================================== */ 4 | 5 | .t-purple { 6 | 7 | .c-navigation, 8 | .c-header { 9 | background: $c__deep-purple; 10 | } 11 | 12 | .c-article__main a:not(.c-btn) { 13 | color: $c__deep-purple; 14 | } 15 | 16 | .c-footer a { 17 | color: $c__deep-purple; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/_sass/themes/_teal.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Teal Theme 3 | ========================================================================== */ 4 | 5 | .t-teal { 6 | 7 | .c-navigation, 8 | .c-header { 9 | background: $c__teal; 10 | } 11 | 12 | .c-article__main a:not(.c-btn) { 13 | color: $c__teal; 14 | } 15 | 16 | .c-footer a { 17 | color: $c__teal; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/_sass/utilities/_layout.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Layout 3 | ========================================================================== */ 4 | 5 | .u-container { 6 | max-width: 116rem; // 1160px 7 | margin-right: auto; 8 | margin-left: auto; 9 | } 10 | -------------------------------------------------------------------------------- /docs/_sass/utilities/_themes.scss: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | Themes 3 | ========================================================================== */ 4 | 5 | .t-purple { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /docs/api/docs.json: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | { 5 | "docs": [ 6 | {% for documentation in site.documentation %} 7 | { 8 | "icon": "{{ documentation.icon }}", 9 | "url": "{{ documentation.url }}", 10 | "title": "{{ documentation.title | xml_escape }}", 11 | "content": {{ documentation.description | jsonify }}, 12 | "description": {{ documentation.content | strip_html | strip_newlines | jsonify }} 13 | }{% if forloop.last == false %},{% endif %} 14 | {% endfor %} 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /docs/api/packages.json: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | { 5 | "packages": [ 6 | {% for package in site.packages %} 7 | { 8 | "top": {{ package.top }}, 9 | "type": "{{ package.type }}", 10 | "title": "{{ package.title }}", 11 | "image": "{{ package.image }}", 12 | "icon": "{{ package.icon }}", 13 | "githuburl": "{{ package.githuburl }}", 14 | "description": "{{ package.description | xml_escape }}" 15 | }{% if forloop.last == false %},{% endif %} 16 | {% endfor %} 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /docs/api/posts.json: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | { 5 | "posts": [ 6 | {% for post in site.posts %} 7 | { 8 | "url": "{{ post.url }}", 9 | "title": "{{ post.title | xml_escape }}", 10 | "description": "{{ post.description }}" 11 | }{% if forloop.last == false %},{% endif %} 12 | {% endfor %} 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /docs/api/version.json: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | { 5 | "version": "v{{ site.currentAppVersion | default: '0.4.0' }}" 6 | } 7 | -------------------------------------------------------------------------------- /docs/blog/index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Blog 4 | --- 5 | 6 | 7 | {% for post in paginator.posts %} 8 |

{{ post.title }}

9 |
10 | {{ post.description }} 11 |
12 | {% endfor %} 13 | 14 | 15 | {% if paginator.total_pages > 1 %} 16 | 39 | {% endif %} 40 | -------------------------------------------------------------------------------- /docs/css/main.scss: -------------------------------------------------------------------------------- 1 | --- 2 | # Only the main Sass file needs front matter (the dashes are enough) 3 | --- 4 | @charset "utf-8"; 5 | 6 | // Helpers 7 | @import 8 | 'helpers/variables', 9 | 'helpers/mixins'; 10 | 11 | // Base 12 | @import 13 | 'base/reset'; 14 | 15 | // Utilities 16 | @import 17 | 'utilities/layout'; 18 | 19 | // Components 20 | @import 21 | 'components/header', 22 | 'components/fork', 23 | 'components/navigation', 24 | 'components/underbar', 25 | 'components/feedback', 26 | 'components/article', 27 | 'components/packages', 28 | 'components/search', 29 | 'components/archives', 30 | 'components/social', 31 | 'components/buttons', 32 | 'components/footer'; 33 | 34 | // Themes 35 | @import 36 | 'themes/blue', 37 | 'themes/green', 38 | 'themes/grey', 39 | 'themes/orange', 40 | 'themes/purple'; 41 | 42 | // Vendor 43 | @import 44 | 'vendor/syntax-highlighting'; 45 | 46 | -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/favicon.ico -------------------------------------------------------------------------------- /docs/feed.xml: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | 5 | 6 | 7 | {{ site.title | xml_escape }} 8 | {{ site.description | xml_escape }} 9 | {{ site.siteurl }}/ 10 | 11 | {{ site.time | date_to_rfc822 }} 12 | {{ site.time | date_to_rfc822 }} 13 | Jekyll v{{ jekyll.version }} 14 | {% for post in site.posts limit:10 %} 15 | 16 | {{ post.title | xml_escape }} 17 | {{ post.content | xml_escape }} 18 | {{ post.date | date_to_rfc822 }} 19 | {{ post.url | prepend: site.siteurl }} 20 | {{ post.url | prepend: site.siteurl }} 21 | {% for tag in post.tags %} 22 | {{ tag | xml_escape }} 23 | {% endfor %} 24 | {% for cat in post.categories %} 25 | {{ cat | xml_escape }} 26 | {% endfor %} 27 | 28 | {% endfor %} 29 | 30 | 31 | -------------------------------------------------------------------------------- /docs/images/action-shots/calculator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/action-shots/calculator.png -------------------------------------------------------------------------------- /docs/images/action-shots/clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/action-shots/clipboard.png -------------------------------------------------------------------------------- /docs/images/action-shots/file-finder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/action-shots/file-finder.png -------------------------------------------------------------------------------- /docs/images/action-shots/package-manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/action-shots/package-manager.png -------------------------------------------------------------------------------- /docs/images/action-shots/system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/action-shots/system.png -------------------------------------------------------------------------------- /docs/images/action-shots/video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/action-shots/video.png -------------------------------------------------------------------------------- /docs/images/os-icons/mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/os-icons/mac.png -------------------------------------------------------------------------------- /docs/images/os-icons/ubuntu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/os-icons/ubuntu.png -------------------------------------------------------------------------------- /docs/images/os-icons/windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/os-icons/windows.png -------------------------------------------------------------------------------- /docs/images/package-icons/1password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/1password.png -------------------------------------------------------------------------------- /docs/images/package-icons/another-dark-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/another-dark-theme.png -------------------------------------------------------------------------------- /docs/images/package-icons/ascii-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/ascii-search.png -------------------------------------------------------------------------------- /docs/images/package-icons/battery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/battery.png -------------------------------------------------------------------------------- /docs/images/package-icons/calculator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/calculator.png -------------------------------------------------------------------------------- /docs/images/package-icons/caniuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/caniuse.png -------------------------------------------------------------------------------- /docs/images/package-icons/capybara-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/capybara-theme.png -------------------------------------------------------------------------------- /docs/images/package-icons/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/chrome.png -------------------------------------------------------------------------------- /docs/images/package-icons/clean-dark-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/clean-dark-theme.png -------------------------------------------------------------------------------- /docs/images/package-icons/clement-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/clement-theme.png -------------------------------------------------------------------------------- /docs/images/package-icons/clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/clipboard.png -------------------------------------------------------------------------------- /docs/images/package-icons/colors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/colors.png -------------------------------------------------------------------------------- /docs/images/package-icons/dark-solarized-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/dark-solarized-theme.png -------------------------------------------------------------------------------- /docs/images/package-icons/dark-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/dark-theme.png -------------------------------------------------------------------------------- /docs/images/package-icons/dash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/dash.png -------------------------------------------------------------------------------- /docs/images/package-icons/devdocs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/devdocs.png -------------------------------------------------------------------------------- /docs/images/package-icons/dictionary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/dictionary.png -------------------------------------------------------------------------------- /docs/images/package-icons/docker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/docker.png -------------------------------------------------------------------------------- /docs/images/package-icons/encode-decode.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/images/package-icons/fallback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/fallback.png -------------------------------------------------------------------------------- /docs/images/package-icons/file-finder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/file-finder.png -------------------------------------------------------------------------------- /docs/images/package-icons/firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/firefox.png -------------------------------------------------------------------------------- /docs/images/package-icons/fkill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/fkill.png -------------------------------------------------------------------------------- /docs/images/package-icons/free-shadowsocks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/free-shadowsocks.png -------------------------------------------------------------------------------- /docs/images/package-icons/giphy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/giphy.png -------------------------------------------------------------------------------- /docs/images/package-icons/github-repos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/github-repos.png -------------------------------------------------------------------------------- /docs/images/package-icons/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/github.png -------------------------------------------------------------------------------- /docs/images/package-icons/hacker-news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/hacker-news.png -------------------------------------------------------------------------------- /docs/images/package-icons/hash.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/images/package-icons/homebrew.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/homebrew.png -------------------------------------------------------------------------------- /docs/images/package-icons/js-beautify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/js-beautify.png -------------------------------------------------------------------------------- /docs/images/package-icons/light-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/light-theme.png -------------------------------------------------------------------------------- /docs/images/package-icons/npms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/npms.png -------------------------------------------------------------------------------- /docs/images/package-icons/omnifocus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/omnifocus.png -------------------------------------------------------------------------------- /docs/images/package-icons/package-manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/package-manager.png -------------------------------------------------------------------------------- /docs/images/package-icons/packagist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/packagist.png -------------------------------------------------------------------------------- /docs/images/package-icons/password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/password.png -------------------------------------------------------------------------------- /docs/images/package-icons/pibble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/pibble.png -------------------------------------------------------------------------------- /docs/images/package-icons/placehold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/placehold.png -------------------------------------------------------------------------------- /docs/images/package-icons/playful-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/playful-theme.png -------------------------------------------------------------------------------- /docs/images/package-icons/pypi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/pypi.png -------------------------------------------------------------------------------- /docs/images/package-icons/rubygems.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/rubygems.png -------------------------------------------------------------------------------- /docs/images/package-icons/simple-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/simple-theme.png -------------------------------------------------------------------------------- /docs/images/package-icons/snippets.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/images/package-icons/system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/system.png -------------------------------------------------------------------------------- /docs/images/package-icons/terminal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/terminal.png -------------------------------------------------------------------------------- /docs/images/package-icons/timetracker.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /docs/images/package-icons/tldr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/tldr.png -------------------------------------------------------------------------------- /docs/images/package-icons/translation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/translation.png -------------------------------------------------------------------------------- /docs/images/package-icons/uptime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/uptime.png -------------------------------------------------------------------------------- /docs/images/package-icons/vpn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/vpn.png -------------------------------------------------------------------------------- /docs/images/package-icons/weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/weather.png -------------------------------------------------------------------------------- /docs/images/package-icons/zazu-dev-doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/zazu-dev-doc.png -------------------------------------------------------------------------------- /docs/images/package-icons/zazu-emoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/docs/images/package-icons/zazu-emoji.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Zazu App 4 | --- 5 | 6 |

Zazu App

7 | 8 |

A fully extensible and open source launcher for hackers, creators and 9 | dabblers. It comes with sane defaults to make it useful out of the box. But 10 | everything can be changed to fit your needs. Don't let others tell you the best 11 | way to be productive, configure it to be perfect for you.

12 | 13 |

If you are just getting started, check out the Getting Started guide.

16 | 17 |

Action Shots

18 | 19 |
20 |

Introduction Video

21 |

22 | 23 |

24 |

Package Manager

25 |

Manage your plugins from within Zazu.

26 | Package Manager 27 |

Calculator

28 |

Accepts some common equations for you to copy to your clipboard.

29 | Calculator Plugin 30 |

Clipboard History

31 |

Remembers things so you don't have to! Fuzzy search and browser all the 32 | things you've copied.

33 | Clipboard Plugin 34 |

File Finder

35 |

Find Applications or files deep in your file system.

36 | File Finder Plugin 37 |

System Commands

38 |

Switch on your screen saver, lock your computer, and more!

39 | System Plugin 40 |

Build your own!

41 |

Zazu is completely open, so build your plugins. You can 42 | get started building your plugin then 43 | head over and submit it to the plugins gallery!

44 |
45 | -------------------------------------------------------------------------------- /docs/js/headers.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Finds all the headers that can link to themselves and make them clickable. 3 | */ 4 | 5 | var selector = '.c-article__main.sidebar h2[id], .c-article__main.sidebar h3[id], #faq h2[id]' 6 | var headers = document.querySelectorAll(selector) 7 | var headerLength = headers.length 8 | 9 | for (var i = 0; i < headerLength; ++i) { 10 | var header = headers[i] 11 | var link = document.createElement('a') 12 | link.href = '#' + header.id 13 | link.innerText = header.innerText 14 | header.innerText = '' 15 | header.appendChild(link) 16 | } 17 | -------------------------------------------------------------------------------- /docs/js/triangle-header.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.addEventListener('resize', debounce(createIt)) 3 | var header = document.getElementById('header') 4 | var triangles 5 | 6 | function debounce (fn) { 7 | var timeout 8 | return function () { 9 | if (timeout) { 10 | clearTimeout(timeout) 11 | } 12 | timeout = setTimeout(fn, 100) 13 | } 14 | } 15 | 16 | function createIt () { 17 | if (triangles) { 18 | header.removeChild(triangles) 19 | } 20 | triangles = Trianglify({ 21 | height: 205, 22 | width: header.offsetWidth, 23 | x_colors: ['#BFF3E9', '#88DFCE', '#5CC7B2', '#39AB95', '#1F9780'], 24 | }).canvas() 25 | header.appendChild(triangles) 26 | } 27 | createIt() 28 | })() 29 | -------------------------------------------------------------------------------- /docs/js/vendor/fuzzyfind.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Fuzzyfind - https://github.com/amjith/fuzzyfind 3 | * A matching algorithm for filtering and ranking a list based on partial user input. 4 | * Copyright (C) 2016 Amjith Ramanujam 5 | * @license MIT 6 | */ 7 | var fuzzyfind=function(r){function t(e){if(n[e])return n[e].exports;var a=n[e]={exports:{},id:e,loaded:!1};return r[e].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var n={};return t.m=r,t.c=n,t.p="",t(0)}([function(r,t,n){var e=n(1),a=n(2);r.exports=function(r,t,n){if("string"!=typeof r||""===r)return t;n=n||{};var o=n.accessor||function(r){return r},u=void 0===n.precision?1:n.precision,f=[],s=a(r,u);return t.forEach(function(r){var t=o(r);s.find(function(n){var a=e(t)["for"](n);return a.found&&f.push({gram:n,length:a.end-a.start,start:a.start,searchableItem:t,item:r}),a.found})}),f.sort(function(r,t){return r.gram.length>t.gram.length?-1:r.gram.lengtht.length?1:r.lengtht.start?1:r.startt.searchableItem?1:r.searchableItem=e;){var u=0,f=n-o;for(u;u<=f;u++){var s=r.substr(u,o);a.indexOf(s)===-1&&a.push(s)}o--}return a}}]); -------------------------------------------------------------------------------- /docs/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | -------------------------------------------------------------------------------- /features/accessibility.feature: -------------------------------------------------------------------------------- 1 | Feature: Accessibility 2 | As a user of Zazu 3 | I want to use accessibility options 4 | So I can be more productive 5 | 6 | Scenario: Copy to Clipboard 7 | Given I have "tinytacoteam/zazu-fixture" as a plugin 8 | And the app is launched 9 | When I toggle it open 10 | And I type in "tinytacoteam" 11 | Then the search window is visible 12 | And I have no accessibility warnings 13 | -------------------------------------------------------------------------------- /features/input_blocks.feature: -------------------------------------------------------------------------------- 1 | Feature: Input Blocks 2 | As a user of Zazu 3 | I want to use all the available block types 4 | So I can be more productive 5 | 6 | Scenario: Root Script 7 | Given I have "tinytacoteam/zazu-fixture" as a plugin 8 | And the app is launched 9 | When I toggle it open 10 | And I type in "tinytacoteam" 11 | Then the search window is visible 12 | And I have 1 results 13 | And the results contain "tinytacoteam" 14 | 15 | Scenario: Prefix Script 16 | Given I have "tinytacoteam/zazu-fixture" as a plugin 17 | And the app is launched 18 | When I toggle it open 19 | And I type in "food cookie" 20 | Then the search window is visible 21 | And I have 2 results 22 | 23 | Scenario: Keyword 24 | Given I have "tinytacoteam/zazu-fixture" as a plugin 25 | And the app is launched 26 | When I toggle it open 27 | And I type in "eggtimer" 28 | Then the search window is visible 29 | And I have 1 results 30 | And the results contain "Start eggtimer" 31 | 32 | Scenario: Hotkey to an input 33 | Given I have "tinytacoteam/zazu-fixture" as a plugin 34 | And the app is launched 35 | When I hit the hotkey "alt+f" 36 | And I type in "cookie" 37 | Then the search window is visible 38 | And I have 2 results 39 | -------------------------------------------------------------------------------- /features/installing_plugins.feature: -------------------------------------------------------------------------------- 1 | Feature: Installing Plugins 2 | As a user of Zazu 3 | I want to install extensions from other users 4 | So I can be more productive 5 | 6 | Scenario: Install calculator plugin 7 | Given I have "tinytacoteam/zazu-calculator" as a plugin 8 | And the app is launched 9 | When I toggle it open 10 | And I type in "21 * 2" 11 | Then the search window is visible 12 | And I have 1 results 13 | And the results contain "42" 14 | 15 | Scenario: Install and update calculator plugin 16 | Given I have "tinytacoteam/zazu-calculator" as a plugin 17 | And the app is launched 18 | And I update the plugins 19 | When I toggle it open 20 | And I type in "21 * 2" 21 | Then the search window is visible 22 | And I have 1 results 23 | And the results contain "42" 24 | -------------------------------------------------------------------------------- /features/navigate_results.feature: -------------------------------------------------------------------------------- 1 | Feature: Navigation 2 | As a user of Zazu 3 | I want to be able to scroll through results 4 | So I can select the most relevant result 5 | 6 | Scenario: Assert first result 7 | Given I have "tinytacoteam/zazu-fixture" as a plugin 8 | And the app is launched 9 | When I toggle it open 10 | And I type in "food tiny" 11 | Then the active result contains "tiny taco" 12 | 13 | Scenario: Scroll down to second result 14 | Given I have "tinytacoteam/zazu-fixture" as a plugin 15 | And the app is launched 16 | When I toggle it open 17 | And I type in "food tiny" 18 | And I hit the hotkey "control+n" 19 | Then the active result contains "tiny burrito" 20 | 21 | Scenario: Loop back to the top 22 | Given I have "tinytacoteam/zazu-fixture" as a plugin 23 | And the app is launched 24 | When I toggle it open 25 | And I type in "food tiny" 26 | And I hit the hotkey "control+n" 27 | And I hit the hotkey "control+n" 28 | And I hit the hotkey "control+n" 29 | And I hit the hotkey "control+n" 30 | Then the active result contains "tiny taco" 31 | 32 | Scenario: Loop to the bottom 33 | Given I have "tinytacoteam/zazu-fixture" as a plugin 34 | And the app is launched 35 | When I toggle it open 36 | And I type in "food tiny" 37 | And I hit the hotkey "control+p" 38 | Then the active result contains "tiny cookies" 39 | 40 | Scenario: Scroll up twice 41 | Given I have "tinytacoteam/zazu-fixture" as a plugin 42 | And the app is launched 43 | When I toggle it open 44 | And I type in "food tiny" 45 | And I hit the hotkey "control+p" 46 | And I hit the hotkey "control+p" 47 | Then the active result contains "tiny cookie cake" 48 | -------------------------------------------------------------------------------- /features/open.feature: -------------------------------------------------------------------------------- 1 | Feature: Open 2 | As a user of Zazu 3 | I want to open the app 4 | So I can be more productive 5 | 6 | Scenario: Opening Zazu 7 | Given I have "tinytacoteam/zazu-fixture" as a plugin 8 | And the app is launched 9 | When I toggle it open 10 | Then the search window is visible 11 | -------------------------------------------------------------------------------- /features/output_blocks.feature: -------------------------------------------------------------------------------- 1 | Feature: Output Blocks 2 | As a user of Zazu 3 | I want to use all the available block types 4 | So I can be more productive 5 | 6 | Scenario: Copy to Clipboard 7 | Given I have "tinytacoteam/zazu-fixture" as a plugin 8 | And the app is launched 9 | When I toggle it open 10 | And I type in "tinytacoteam" 11 | And I eventually click on the active result 12 | Then the search window is not visible 13 | And my clipboard contains "tinytacoteam" 14 | 15 | Scenario: User Script + Copy to Clipboard 16 | Given I have "tinytacoteam/zazu-fixture" as a plugin 17 | And the app is launched 18 | When I toggle it open 19 | And I type in "food taco" 20 | And I eventually click on the active result 21 | Then the search window is not visible 22 | And my clipboard contains "GMO tiny taco" 23 | -------------------------------------------------------------------------------- /features/support/after_hooks.js: -------------------------------------------------------------------------------- 1 | const { After, Before } = require('cucumber') 2 | const jetpack = require('fs-jetpack') 3 | const path = require('path') 4 | const { git } = require('../../app/lib/git') 5 | 6 | const homeDir = path.join(__dirname, '../../test/fixtures/home') 7 | const calcPlugin = path.join(homeDir, '.zazu', 'plugins', 'tinytacoteam', 'zazu-calculator') 8 | const fallbackPlugin = path.join(homeDir, '.zazu', 'plugins', 'tinytacoteam', 'zazu-fallback') 9 | const databaseFile = path.join(homeDir, '.zazu', 'databases', 'installStatus.nedb') 10 | const configFile = path.join(homeDir, '.zazurc.json') 11 | 12 | Before(function () { 13 | return git(['checkout', configFile]).then(() => { 14 | jetpack.remove(calcPlugin) 15 | jetpack.remove(fallbackPlugin) 16 | return this.close() 17 | }).then(() => { 18 | return git(['checkout', databaseFile]) 19 | }).then(() => { 20 | const logDir = path.join(homeDir, '.zazu/log') 21 | const files = jetpack.list(logDir) || [] 22 | return files.map((file) => { 23 | const logFile = path.join(logDir, file) 24 | jetpack.remove(logFile) 25 | }) 26 | }) 27 | }) 28 | 29 | After(function (testCase) { 30 | return this.close().then(() => { 31 | return git(['checkout', databaseFile]) 32 | }).then(() => { 33 | return git(['checkout', configFile]) 34 | }) 35 | }) 36 | -------------------------------------------------------------------------------- /features/support/custom_formattor.js: -------------------------------------------------------------------------------- 1 | const { ProgressFormatter, Status } = require('cucumber') 2 | const jetpack = require('fs-jetpack') 3 | const path = require('path') 4 | 5 | class SimpleFormatter extends ProgressFormatter { 6 | constructor (options) { 7 | super(options) 8 | options.eventBroadcaster.on('test-case-finished', this.printErrorLogs.bind(this)) 9 | } 10 | 11 | printErrorLogs ({ sourceLocation, result }) { 12 | if (result.status === Status.FAILED) { 13 | const { gherkinDocument, pickle } = this.eventDataCollector.getTestCaseData(sourceLocation) 14 | this.log(`\n\n${gherkinDocument.feature.name} / ${pickle.name}\n`) 15 | const homeDir = path.join(__dirname, '../../test/fixtures/home') 16 | const logDir = path.join(homeDir, '.zazu/log') 17 | const files = jetpack.list(logDir) || [] 18 | files.map(file => { 19 | const logFile = path.join(logDir, file) 20 | console.log(`\n---logs---\n${file}\n`) 21 | try { 22 | jetpack 23 | .read(logFile) 24 | .split('\n') 25 | .map(logLine => { 26 | try { 27 | return JSON.stringify(JSON.parse(logLine), null, ' ') 28 | } catch { 29 | return logLine 30 | } 31 | }) 32 | .forEach(line => console.log(line)) 33 | } catch (error) { 34 | console.error('Error loading logs', error) 35 | } 36 | }) 37 | console.log('\n') 38 | } 39 | } 40 | } 41 | 42 | module.exports = SimpleFormatter 43 | -------------------------------------------------------------------------------- /features/updating_plugins.feature: -------------------------------------------------------------------------------- 1 | Feature: Updating Plugins 2 | As a user of Zazu 3 | I want to update plugins 4 | So I can have the latest productivity tools 5 | 6 | Scenario: Before update 7 | Given I have "tinytacoteam/zazu-fallback" installed before packagist support 8 | And the app is launched 9 | When I toggle it open 10 | And I type in "packagist prettyarray" 11 | Then the search window is visible 12 | And I have no results 13 | 14 | Scenario: Update plugin 15 | Given I have "tinytacoteam/zazu-fallback" installed before packagist support 16 | And the app is launched 17 | And I update the plugins 18 | When I toggle it open 19 | And I type in "packagist prettyarray" 20 | Then the search window is visible 21 | And I have 1 result 22 | And the active result contains "Search Packagist for prettyarray" 23 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | require('./tasks/ghpages') 4 | -------------------------------------------------------------------------------- /resources/icons/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/resources/icons/512x512.png -------------------------------------------------------------------------------- /resources/osx/dmg-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/resources/osx/dmg-background.png -------------------------------------------------------------------------------- /resources/osx/dmg-background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/resources/osx/dmg-background@2x.png -------------------------------------------------------------------------------- /resources/osx/dmg-icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/resources/osx/dmg-icon.icns -------------------------------------------------------------------------------- /resources/osx/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/resources/osx/icon.icns -------------------------------------------------------------------------------- /resources/windows/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/resources/windows/icon.ico -------------------------------------------------------------------------------- /resources/windows/setup-icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bayleeadamoss/zazu/e6e37e63841ca4e8abd6bd6dfc7d211ae30d18d5/resources/windows/setup-icon.ico -------------------------------------------------------------------------------- /tasks/ghpages.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const gulp = require('gulp') 4 | const ghpages = require('gh-pages') 5 | const path = require('path') 6 | const fs = require('fs') 7 | const { execSync } = require('child_process') 8 | 9 | const appVersion = () => { 10 | const packageJson = 'package.json' 11 | const packageContent = JSON.parse(fs.readFileSync(packageJson)) 12 | return packageContent.version 13 | } 14 | 15 | const commitSha = () => { 16 | return execSync('git rev-parse HEAD').toString() 17 | } 18 | 19 | const setupDynamicConfig = docsConfigFile => { 20 | fs.writeFileSync(docsConfigFile, `currentCommitSha: ${commitSha()}\n`, { flag: 'a' }) 21 | fs.writeFileSync(docsConfigFile, `currentAppVersion: ${appVersion()}\n`, { flag: 'a' }) 22 | } 23 | 24 | const cleanupDynamicConfig = docsConfigFile => { 25 | const data = fs.readFileSync(docsConfigFile) 26 | fs.writeFileSync( 27 | docsConfigFile, 28 | data 29 | .toString() 30 | .split('\n') 31 | .filter(line => { 32 | return !line.match(/currentCommitSha|currentAppVersion/) 33 | }) 34 | .join('\n') 35 | .trim() + '\n' 36 | ) 37 | } 38 | 39 | gulp.task('ghpages', () => { 40 | const docsDirectory = path.join('docs') 41 | const docsConfigFile = path.join(docsDirectory, '_config.yml') 42 | setupDynamicConfig(docsConfigFile) 43 | console.log('start publishing') 44 | return new Promise((resolve, reject) => { 45 | ghpages.publish(docsDirectory, { dotfiles: true }, error => { 46 | if (error) { 47 | console.error(error) 48 | reject(error) 49 | } else { 50 | cleanupDynamicConfig(docsConfigFile) 51 | console.log('Deployed documentation') 52 | resolve() 53 | } 54 | }) 55 | }) 56 | }) 57 | -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-unused-expressions": "off" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /test/app/blocks/external/service.spec.js: -------------------------------------------------------------------------------- 1 | const chai = require('chai') 2 | const sinonChai = require('sinon-chai') 3 | const sinon = require('sinon') 4 | const ServiceScript = require('../../../../app/blocks/external/serviceScript') 5 | const { expect } = chai 6 | 7 | chai.use(sinonChai) 8 | 9 | let serviceScript 10 | describe('ServiceScript', () => { 11 | beforeEach(() => { 12 | serviceScript = new ServiceScript({}) 13 | serviceScript.script = (value) => { 14 | return new Promise((resolve, reject) => { 15 | resolve(value * 10) 16 | }) 17 | } 18 | }) 19 | describe('start', () => { 20 | it('calls handle after interval', (done) => { 21 | serviceScript.handle = sinon.stub().returns(Promise.resolve()) 22 | serviceScript.start().then(() => { 23 | expect(serviceScript.handle).to.have.been.calledOnce 24 | done() 25 | }) 26 | }) 27 | }) 28 | 29 | describe('handle', () => { 30 | it('executes correctly then calls start', (done) => { 31 | serviceScript.start = sinon.stub() 32 | serviceScript.handle().then(() => { 33 | expect(serviceScript.start).to.have.been.calledOnce 34 | done() 35 | }) 36 | }) 37 | }) 38 | }) 39 | -------------------------------------------------------------------------------- /test/app/blocks/input/rootScript.spec.js: -------------------------------------------------------------------------------- 1 | const { expect } = require('chai') 2 | const RootScript = require('../../../../app/blocks/input/rootScript') 3 | 4 | const rootScript = new RootScript({}) 5 | rootScript.script = { 6 | search: (input, env) => { 7 | return new Promise((resolve, reject) => { 8 | setTimeout(resolve, 1100) 9 | }) 10 | }, 11 | respondsTo: () => { 12 | return true 13 | }, 14 | } 15 | 16 | let subjectStart, subject 17 | describe('RootScript', () => { 18 | beforeEach(() => { 19 | subjectStart = new Date() 20 | subject = rootScript.search(2) 21 | }) 22 | it('takes at least 1000ms to complete', (done) => { 23 | subject.then(() => { 24 | expect(new Date() - subjectStart).to.be.gt(1000) 25 | done() 26 | }) 27 | }) 28 | }) 29 | -------------------------------------------------------------------------------- /test/app/blocks/output/userScript.spec.js: -------------------------------------------------------------------------------- 1 | const { expect } = require('chai') 2 | const UserScript = require('../../../../app/blocks/output/userScript') 3 | 4 | const userScript = new UserScript({}) 5 | userScript.script = (value) => { 6 | return new Promise((resolve, reject) => { 7 | resolve(value * 10) 8 | }) 9 | } 10 | 11 | let state, subject 12 | describe('UserScript', () => { 13 | beforeEach(() => { 14 | state = { value: 32, next: () => {} } 15 | subject = userScript.call(state) 16 | }) 17 | it('can mutate the state', (done) => { 18 | subject.then(() => { 19 | expect(state.value).to.eq(320) 20 | done() 21 | }) 22 | }) 23 | }) 24 | -------------------------------------------------------------------------------- /test/app/lib/configuration.spec.js: -------------------------------------------------------------------------------- 1 | const { expect } = require('chai') 2 | const configuration = require('../../../app/lib/configuration') 3 | const jetpack = require('fs-jetpack') 4 | const os = require('os') 5 | const path = require('path') 6 | 7 | describe('Configuration', () => { 8 | beforeEach(() => { 9 | const base = path.join(os.tmpdir(), String(Math.random())) 10 | configuration.profilePath = path.join(base, '.zazurc.json') 11 | configuration.pluginDir = path.join(base, '.zazu/plugins/') 12 | jetpack.remove(configuration.profilePath) 13 | configuration.loaded = false 14 | }) 15 | 16 | describe('load', () => { 17 | describe('given no configuration file', () => { 18 | beforeEach(() => { 19 | expect(jetpack.exists(configuration.profilePath)).to.be.false 20 | configuration.load() 21 | }) 22 | 23 | it('creates zazurc file', () => { 24 | expect(jetpack.exists(configuration.profilePath)).to.be.ok 25 | }) 26 | }) 27 | 28 | describe('given a configuration file', () => { 29 | beforeEach(() => { 30 | jetpack.write(configuration.profilePath, JSON.stringify({ 31 | hotkey: 'alt+space', 32 | theme: 'tinytacoteam/dark-purple', 33 | plugins: ['abc'], 34 | })) 35 | expect(jetpack.exists(configuration.profilePath)).to.be.ok 36 | configuration.load() 37 | }) 38 | 39 | it('loads configuration file', () => { 40 | expect(configuration.plugins[0]).to.eq('abc') 41 | expect(configuration.hotkey).to.be.eq('alt+space') 42 | expect(configuration.theme).to.be.eq('tinytacoteam/dark-purple') 43 | }) 44 | }) 45 | }) 46 | }) 47 | -------------------------------------------------------------------------------- /test/app/lib/manager.spec.js: -------------------------------------------------------------------------------- 1 | const { expect } = require('chai') 2 | const { cooldown, warmup } = require('../../../app/lib/manager') 3 | 4 | describe('Manager', () => { 5 | describe('cooldown', () => { 6 | it('replaces variables with their value', (done) => { 7 | let totalCooldowns = 0 8 | const coolFn = cooldown(() => { 9 | return new Promise((resolve) => setTimeout(resolve, 100)) 10 | }, () => { 11 | totalCooldowns++ 12 | }) 13 | for (let i = 0; i < 5; i++) coolFn() 14 | expect(totalCooldowns).to.eq(0) 15 | setTimeout(() => { 16 | expect(totalCooldowns).to.eq(1) 17 | done() 18 | }, 150) 19 | }) 20 | }) 21 | 22 | describe('warmup', () => { 23 | it('replaces variables with their value', (done) => { 24 | let totalWarmups = 0 25 | const warmFn = warmup(() => { 26 | return new Promise((resolve) => setTimeout(resolve, 100)) 27 | }, () => { 28 | totalWarmups++ 29 | }) 30 | for (let i = 0; i < 5; i++) warmFn() 31 | expect(totalWarmups).to.eq(1) 32 | setTimeout(() => { 33 | expect(totalWarmups).to.eq(1) 34 | done() 35 | }, 150) 36 | }) 37 | }) 38 | }) 39 | -------------------------------------------------------------------------------- /test/app/lib/mergeUnique.spec.js: -------------------------------------------------------------------------------- 1 | const { expect } = require('chai') 2 | const mergeUnique = require('../../../app/lib/mergeUnique') 3 | 4 | describe('mergeUnique', () => { 5 | it('adds to the end', () => { 6 | const expected = ['tiny', 'taco', 'team'] 7 | expect(mergeUnique('tiny', ['taco', 'team'])).to.deep.equal(expected) 8 | }) 9 | 10 | it('does not add the same item twice', () => { 11 | const expected = ['tiny', 'taco', 'team'] 12 | expect(mergeUnique('tiny', ['tiny', 'taco', 'team'])).to.deep.equal(expected) 13 | }) 14 | 15 | it('moves items to the beginning', () => { 16 | const expected = ['taco', 'tiny', 'team'] 17 | expect(mergeUnique('taco', ['tiny', 'taco', 'team'])).to.deep.equal(expected) 18 | }) 19 | }) 20 | -------------------------------------------------------------------------------- /test/app/lib/notification.spec.js: -------------------------------------------------------------------------------- 1 | const { expect } = require('chai') 2 | const notification = require('../../../app/lib/notification') 3 | const sinon = require('sinon') 4 | 5 | describe('Notification', () => { 6 | describe('displayFirstNotificationInQueue', () => { 7 | let noop 8 | 9 | beforeEach(() => { 10 | noop = sinon.stub() 11 | notification.queue.push(noop) 12 | expect(notification.queue.length).to.eq(1) 13 | notification.displayFirstNotificationInQueue() 14 | }) 15 | 16 | it('shifts the queue', () => { 17 | expect(notification.queue.length).to.eq(0) 18 | }) 19 | 20 | it('shifts the queue', () => { 21 | expect(noop).to.have.been.calledOnce 22 | }) 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /test/app/lib/template.spec.js: -------------------------------------------------------------------------------- 1 | const { expect } = require('chai') 2 | const Template = require('../../../app/lib/template') 3 | 4 | describe('Template', () => { 5 | describe('compile', () => { 6 | it('replaces variables with their value', () => { 7 | expect(Template.compile('{first}{last}', { 8 | first: 'tiny', 9 | last: 'taco', 10 | })).to.eq('tinytaco') 11 | }) 12 | 13 | it('replaces the same variable multiple times', () => { 14 | expect(Template.compile('{first}{first}', { 15 | first: 'tiny', 16 | last: 'taco', 17 | })).to.eq('tinytiny') 18 | }) 19 | 20 | it('replaces with empty strings', () => { 21 | expect(Template.compile('{first}:{last}', { 22 | first: 'tiny', 23 | last: '', 24 | })).to.eq('tiny:') 25 | }) 26 | 27 | it('doesnt replace empty brackets', () => { 28 | expect(Template.compile('{}:{first}', { 29 | first: 'tiny', 30 | })).to.eq('{}:tiny') 31 | }) 32 | }) 33 | }) 34 | -------------------------------------------------------------------------------- /test/fixtures/home/.calculator.zazurc.json: -------------------------------------------------------------------------------- 1 | { 2 | "hotkey": "shift+space", 3 | "theme": "tinytacoteam/zazu-fixture", 4 | "disableAnalytics": true, 5 | "blur": false, 6 | "plugins": [ 7 | "tinytacoteam/zazu-calculator" 8 | ], 9 | "comments": [ 10 | "zazu-fixtures is installed", 11 | "zazu-calculator is not" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /test/fixtures/home/.fallback.zazurc.json: -------------------------------------------------------------------------------- 1 | { 2 | "hotkey": "shift+space", 3 | "theme": "tinytacoteam/zazu-fixture", 4 | "disableAnalytics": true, 5 | "blur": false, 6 | "plugins": [ 7 | "tinytacoteam/zazu-fallback" 8 | ], 9 | "comments": [ 10 | "zazu-fixtures and zazu-fallback is installed" 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /test/fixtures/home/.zazu/databases/installStatus.nedb: -------------------------------------------------------------------------------- 1 | {"key":"tinytacoteam/zazu-calculator","value":"installed","_id":"EfGqmQ0XFwO5x7ey"} 2 | {"key":"tinytacoteam/zazu-fixture","value":"installed","_id":"QgTBzM9so4FK0ATM"} 3 | {"key":"tinytacoteam/zazu-fallback","value":"installed","_id":"4lJcWEiVNP2v24zw"} 4 | -------------------------------------------------------------------------------- /test/fixtures/home/.zazu/plugins/tinytacoteam/zazu-fixture/copyPasta.js: -------------------------------------------------------------------------------- 1 | module.exports = (pluginContext) => { 2 | return { 3 | respondsTo: (query) => { 4 | return !query.match(/^(egg|food )/) 5 | }, 6 | search: (query, env = {}) => { 7 | return new Promise((resolve, reject) => { 8 | resolve([ 9 | { 10 | icon: 'fa-lightbulb-o', 11 | title: 'You typed: "' + query + '"', 12 | subtitle: 'Action to copy to clipboard', 13 | value: query, 14 | }, 15 | ]) 16 | }) 17 | }, 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /test/fixtures/home/.zazu/plugins/tinytacoteam/zazu-fixture/food.js: -------------------------------------------------------------------------------- 1 | module.exports = (pluginContext) => { 2 | const foods = [ 3 | 'tiny taco', 4 | 'tiny burrito', 5 | 'tiny cookie cake', 6 | 'tiny cookies', 7 | ] 8 | 9 | return (query, env = {}) => { 10 | return new Promise((resolve, reject) => { 11 | resolve(foods.filter((food) => { 12 | return food.match(new RegExp(query, 'i')) 13 | }).map((food) => { 14 | return { 15 | icon: 'fa-apple', 16 | title: food, 17 | subtitle: 'Select item to copy the value to the clipboard.', 18 | value: food, 19 | } 20 | })) 21 | }) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /test/fixtures/home/.zazu/plugins/tinytacoteam/zazu-fixture/main.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | background-color: #F7F7F7; 4 | margin: 0; 5 | padding: 0; 6 | font-size: 20px; 7 | } 8 | section#zazu { 9 | background-color: #eaeaea; 10 | background-position: 530px 5px; 11 | background-repeat: no-repeat; 12 | background-size: 60px; 13 | -webkit-app-region: drag; 14 | cursor: move; 15 | } 16 | section#zazu input { 17 | outline: none; 18 | font-size: 40px; 19 | width: 500px; 20 | padding: 10px; 21 | border: 0; 22 | background-color: transparent; 23 | -webkit-app-region: no-drag; 24 | cursor: auto; 25 | } 26 | section#zazu iframe#preview { 27 | border: 0; 28 | } 29 | section#zazu div.results { 30 | display: flex; 31 | flex-direction: row; 32 | } 33 | section#zazu div.results ul { 34 | padding: 0; 35 | margin: 0; 36 | border-top: 1px solid #dedede; 37 | max-height: 333px; 38 | overflow: hidden; 39 | width: 50%; 40 | } 41 | section#zazu div.results ul:last-child { 42 | width: 100%; 43 | } 44 | section#zazu div.results ul + div { 45 | width: 50%; 46 | } 47 | section#zazu div.results ul li { 48 | display: block; 49 | height: 45px; 50 | line-height: 45px; 51 | border-bottom: 1px solid #dedede; 52 | -webkit-app-region: no-drag; 53 | cursor: pointer; 54 | width: 100%; 55 | } 56 | section#zazu div.results ul li .icon { 57 | text-align: center; 58 | line-height: 30px; 59 | height: 30px; 60 | width: 30px; 61 | margin: 7.5px; 62 | float: left; 63 | } 64 | section#zazu div.results ul li h2, 65 | section#zazu div.results ul li h3 { 66 | margin: 0; 67 | padding-left: 10px; 68 | white-space: nowrap; 69 | overflow: hidden; 70 | text-overflow: ellipsis; 71 | font-weight: 400; 72 | font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; 73 | } 74 | section#zazu div.results ul li h2 { 75 | font-size: 20px; 76 | line-height: 25px; 77 | } 78 | section#zazu div.results ul li h2:last-child { 79 | font-size: 20px; 80 | line-height: 45px; 81 | } 82 | section#zazu div.results ul li h3 { 83 | font-size: 15px; 84 | line-height: 15px; 85 | } 86 | section#zazu div.results ul li.active, 87 | section#zazu div.results ul li:hover { 88 | background-color: #dedede; 89 | } 90 | -------------------------------------------------------------------------------- /test/fixtures/home/.zazu/plugins/tinytacoteam/zazu-fixture/process.js: -------------------------------------------------------------------------------- 1 | module.exports = (pluginContext) => { 2 | return (value) => { 3 | return new Promise((resolve, reject) => { 4 | resolve('GMO ' + value) 5 | }) 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test/fixtures/home/.zazu/plugins/tinytacoteam/zazu-fixture/zazu.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Fixture", 3 | "version": "1.0.1", 4 | "description": "Fixture things", 5 | "icon": "icon.png", 6 | "stylesheet": "main.css", 7 | "blocks": { 8 | "external": [ 9 | { 10 | "type": "Hotkey", 11 | "hotkey": "alt+f", 12 | "name": "TinyFood", 13 | "connections": ["Food"] 14 | } 15 | ], 16 | "input": [ 17 | { 18 | "id": "CopyPasta", 19 | "type": "RootScript", 20 | "script": "copyPasta.js", 21 | "connections": ["Copy"] 22 | }, 23 | { 24 | "id": "EggTimer", 25 | "type": "Keyword", 26 | "keyword": "eggtimer", 27 | "title": "Start eggtimer", 28 | "subtitle": "Click here to start the egg timer", 29 | "icon": "fa-clock-o", 30 | "connections": [] 31 | }, 32 | { 33 | "id": "Food", 34 | "type": "PrefixScript", 35 | "prefix": "food", 36 | "space": true, 37 | "args": "Required", 38 | "script": "food.js", 39 | "connections": ["Process"] 40 | } 41 | ], 42 | "output": [ 43 | { 44 | "id": "Process", 45 | "type": "UserScript", 46 | "script": "process.js", 47 | "value": "{value}", 48 | "connections": ["Copy"] 49 | }, 50 | { 51 | "id": "Copy", 52 | "type": "CopyToClipboard", 53 | "text": "{value}" 54 | } 55 | ] 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /test/fixtures/home/.zazurc.json: -------------------------------------------------------------------------------- 1 | { 2 | "hotkey": "shift+space", 3 | "theme": "tinytacoteam/zazu-fixture", 4 | "disableAnalytics": true, 5 | "blur": false, 6 | "plugins": [ 7 | "tinytacoteam/zazu-fixture" 8 | ], 9 | "comments": [ 10 | "zazu-fixtures is installed" 11 | ] 12 | } 13 | --------------------------------------------------------------------------------