├── .DS_Store ├── .gitignore ├── .travis.yml ├── .vscode └── launch.json ├── LICENSE.md ├── README.md ├── app └── .gitkeep ├── appveyor.yml ├── assets ├── .DS_Store ├── app-icons │ ├── .DS_Store │ ├── icon.ico │ ├── icon.png │ └── tray │ │ ├── .DS_Store │ │ ├── icon.png │ │ └── icon@2x.png ├── css │ └── normalize.css └── images │ ├── switch.ico │ ├── tip-final.svg │ ├── tip-manage.svg │ ├── tip-overview.svg │ ├── tip-pref.svg │ └── tip-switch.svg ├── build-scripts └── getSwitchServicePreBuild.js ├── docs ├── css │ ├── style.css │ └── style.scss ├── index.html ├── switch-demo.gif ├── switch-logo-dark.png ├── switch-logo.png └── switch-shot.png ├── electron-builder.json ├── index.html ├── intro.html ├── main.js ├── package-lock.json ├── package.json ├── preload.js ├── renovate.json ├── service-binaries ├── notifier │ └── terminal-notifier ├── switch └── switch.ico ├── settings.html ├── src ├── analytics.ts ├── const.ts ├── interfaces.ts ├── intro.ts ├── renderer.ts ├── settings.ts ├── switch.ts └── win-run-get-pid.bat ├── styles ├── switch.css ├── switch.css.map ├── switch.min.css ├── switch.min.css.map ├── switch.scss ├── toastify.min.css └── toastify.min.css.map ├── switch-demo.gif └── tsconfig.json /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist/* 3 | app/* 4 | !app/.gitkeep 5 | service-binaries 6 | 7 | 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | matrix: 2 | include: 3 | - os: osx 4 | osx_image: xcode10.2 5 | language: node_js 6 | node_js: "10" 7 | env: 8 | - ELECTRON_CACHE=$HOME/.cache/electron 9 | - ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder 10 | script: 11 | - npm run get-ss-prebuild 12 | - npm run compile-darwin 13 | cache: 14 | directories: 15 | # - node_modules 16 | - $HOME/.cache/electron 17 | - $HOME/.cache/electron-builder 18 | before_cache: 19 | - rm -rf $HOME/.cache/electron-builder/wine 20 | 21 | branches: 22 | except: 23 | - "/^v\\d+\\.\\d+\\.\\d+$/" 24 | only: 25 | - master -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "type": "node", 6 | "request": "launch", 7 | "name": "Electron Main", 8 | "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", 9 | "program": "${workspaceFolder}/main.js" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Switch logo](./docs/switch-logo-dark.png) 2 | 3 | [![Build Status](https://travis-ci.org/ahkohd/switch-desktop.svg?branch=master)](https://travis-ci.org/ahkohd/switch-desktop) [![Build status](https://ci.appveyor.com/api/projects/status/ueo46t4pb2p8tdrv?svg=true)](https://ci.appveyor.com/project/ahkohd/switch-desktop) 4 | 5 | Keyboard-driven commands to navigate your apps faster. Available for 🪟 Windows & 🍏 macOS 6 | 7 | > 🆕 🥳 **Hurray!** We are happy to announce that Switch is now available for **macOS**. [**Download now 👌**](https://get-switch.app) 8 | 9 | > ℹ️ **Switch 2** for Windows is around the corner. Have a feature in mind? [Let us know! 👈](https://github.com/ahkohd/switch-desktop/discussions) 10 | 11 | # Features 12 | 13 | - Switch fast between apps. 14 | - Favourite apps loadout. 15 | - Convenience of use by both left and right handed users with the use of left/right alt or + on macOS. 16 | 17 | > **[Download Switch now 🪟 🍏](https://get-switch.app)** 18 | 19 | # Screenshot 20 | 21 | ![Switch demo](./docs/switch-shot.png) 22 | 23 | # Components 24 | 25 | Switch as two main components. 26 | 27 | - [Switch desktop](https://github.com/ahkohd/switch-desktop) Serves as the UI, provides the dock and tray menu. 28 | - [Switch service](https://github.com/ahkohd/switch) Does the actual window switching magic. 29 | 30 | # Contributing 31 | 32 | If you have found any bugs or just want to see some new features in Switch, feel free to open an issue. I'm open to any suggestions and bug reports would be really helpful. Switch is under development and some bugs may occur. Also, please don't hesitate to open a pull request. 33 | 34 | # Running 35 | 36 | Before running Switch in development mode, please ensure you have Node.js installed on your machine. 37 | 38 | Clone this repo, and cd into it, Then: 39 | 40 | ```bash 41 | $npm i 42 | $npm run get-ss-prebuild 43 | $npm run dev 44 | ``` 45 | 46 | # License 47 | 48 | [Read LICENSE.md](./LICENSE.md) 49 | -------------------------------------------------------------------------------- /app/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/app/.gitkeep -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | image: Visual Studio 2017 2 | 3 | platform: 4 | - x64 5 | 6 | cache: 7 | - node_modules 8 | - '%USERPROFILE%\.electron' 9 | 10 | init: 11 | - git config --global core.autocrlf input 12 | 13 | install: 14 | - ps: Install-Product node 10 x64 15 | - npm i 16 | 17 | build_script: 18 | - npm run get-ss-prebuild 19 | - npm run compile-win32 20 | 21 | test: off 22 | 23 | branches: 24 | only: 25 | - master -------------------------------------------------------------------------------- /assets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/assets/.DS_Store -------------------------------------------------------------------------------- /assets/app-icons/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/assets/app-icons/.DS_Store -------------------------------------------------------------------------------- /assets/app-icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/assets/app-icons/icon.ico -------------------------------------------------------------------------------- /assets/app-icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/assets/app-icons/icon.png -------------------------------------------------------------------------------- /assets/app-icons/tray/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/assets/app-icons/tray/.DS_Store -------------------------------------------------------------------------------- /assets/app-icons/tray/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/assets/app-icons/tray/icon.png -------------------------------------------------------------------------------- /assets/app-icons/tray/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/assets/app-icons/tray/icon@2x.png -------------------------------------------------------------------------------- /assets/css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /* Document 4 | ========================================================================== */ 5 | 6 | /** 7 | * 1. Correct the line height in all browsers. 8 | * 2. Prevent adjustments of font size after orientation changes in iOS. 9 | */ 10 | 11 | html { 12 | line-height: 1.15; /* 1 */ 13 | -webkit-text-size-adjust: 100%; /* 2 */ 14 | } 15 | 16 | /* Sections 17 | ========================================================================== */ 18 | 19 | /** 20 | * Remove the margin in all browsers. 21 | */ 22 | 23 | body { 24 | margin: 0; 25 | } 26 | 27 | /** 28 | * Render the `main` element consistently in IE. 29 | */ 30 | 31 | main { 32 | display: block; 33 | } 34 | 35 | /** 36 | * Correct the font size and margin on `h1` elements within `section` and 37 | * `article` contexts in Chrome, Firefox, and Safari. 38 | */ 39 | 40 | h1 { 41 | font-size: 2em; 42 | margin: 0.67em 0; 43 | } 44 | 45 | /* Grouping content 46 | ========================================================================== */ 47 | 48 | /** 49 | * 1. Add the correct box sizing in Firefox. 50 | * 2. Show the overflow in Edge and IE. 51 | */ 52 | 53 | hr { 54 | box-sizing: content-box; /* 1 */ 55 | height: 0; /* 1 */ 56 | overflow: visible; /* 2 */ 57 | } 58 | 59 | /** 60 | * 1. Correct the inheritance and scaling of font size in all browsers. 61 | * 2. Correct the odd `em` font sizing in all browsers. 62 | */ 63 | 64 | pre { 65 | font-family: monospace, monospace; /* 1 */ 66 | font-size: 1em; /* 2 */ 67 | } 68 | 69 | /* Text-level semantics 70 | ========================================================================== */ 71 | 72 | /** 73 | * Remove the gray background on active links in IE 10. 74 | */ 75 | 76 | a { 77 | background-color: transparent; 78 | } 79 | 80 | /** 81 | * 1. Remove the bottom border in Chrome 57- 82 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 83 | */ 84 | 85 | abbr[title] { 86 | border-bottom: none; /* 1 */ 87 | text-decoration: underline; /* 2 */ 88 | text-decoration: underline dotted; /* 2 */ 89 | } 90 | 91 | /** 92 | * Add the correct font weight in Chrome, Edge, and Safari. 93 | */ 94 | 95 | b, 96 | strong { 97 | font-weight: bolder; 98 | } 99 | 100 | /** 101 | * 1. Correct the inheritance and scaling of font size in all browsers. 102 | * 2. Correct the odd `em` font sizing in all browsers. 103 | */ 104 | 105 | code, 106 | kbd, 107 | samp { 108 | font-family: monospace, monospace; /* 1 */ 109 | font-size: 1em; /* 2 */ 110 | } 111 | 112 | /** 113 | * Add the correct font size in all browsers. 114 | */ 115 | 116 | small { 117 | font-size: 80%; 118 | } 119 | 120 | /** 121 | * Prevent `sub` and `sup` elements from affecting the line height in 122 | * all browsers. 123 | */ 124 | 125 | sub, 126 | sup { 127 | font-size: 75%; 128 | line-height: 0; 129 | position: relative; 130 | vertical-align: baseline; 131 | } 132 | 133 | sub { 134 | bottom: -0.25em; 135 | } 136 | 137 | sup { 138 | top: -0.5em; 139 | } 140 | 141 | /* Embedded content 142 | ========================================================================== */ 143 | 144 | /** 145 | * Remove the border on images inside links in IE 10. 146 | */ 147 | 148 | img { 149 | border-style: none; 150 | } 151 | 152 | /* Forms 153 | ========================================================================== */ 154 | 155 | /** 156 | * 1. Change the font styles in all browsers. 157 | * 2. Remove the margin in Firefox and Safari. 158 | */ 159 | 160 | button, 161 | input, 162 | optgroup, 163 | select, 164 | textarea { 165 | font-family: inherit; /* 1 */ 166 | font-size: 100%; /* 1 */ 167 | line-height: 1.15; /* 1 */ 168 | margin: 0; /* 2 */ 169 | } 170 | 171 | /** 172 | * Show the overflow in IE. 173 | * 1. Show the overflow in Edge. 174 | */ 175 | 176 | button, 177 | input { /* 1 */ 178 | overflow: visible; 179 | } 180 | 181 | /** 182 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 183 | * 1. Remove the inheritance of text transform in Firefox. 184 | */ 185 | 186 | button, 187 | select { /* 1 */ 188 | text-transform: none; 189 | } 190 | 191 | /** 192 | * Correct the inability to style clickable types in iOS and Safari. 193 | */ 194 | 195 | button, 196 | [type="button"], 197 | [type="reset"], 198 | [type="submit"] { 199 | -webkit-appearance: button; 200 | } 201 | 202 | /** 203 | * Remove the inner border and padding in Firefox. 204 | */ 205 | 206 | button::-moz-focus-inner, 207 | [type="button"]::-moz-focus-inner, 208 | [type="reset"]::-moz-focus-inner, 209 | [type="submit"]::-moz-focus-inner { 210 | border-style: none; 211 | padding: 0; 212 | } 213 | 214 | /** 215 | * Restore the focus styles unset by the previous rule. 216 | */ 217 | 218 | button:-moz-focusring, 219 | [type="button"]:-moz-focusring, 220 | [type="reset"]:-moz-focusring, 221 | [type="submit"]:-moz-focusring { 222 | outline: 1px dotted ButtonText; 223 | } 224 | 225 | /** 226 | * Correct the padding in Firefox. 227 | */ 228 | 229 | fieldset { 230 | padding: 0.35em 0.75em 0.625em; 231 | } 232 | 233 | /** 234 | * 1. Correct the text wrapping in Edge and IE. 235 | * 2. Correct the color inheritance from `fieldset` elements in IE. 236 | * 3. Remove the padding so developers are not caught out when they zero out 237 | * `fieldset` elements in all browsers. 238 | */ 239 | 240 | legend { 241 | box-sizing: border-box; /* 1 */ 242 | color: inherit; /* 2 */ 243 | display: table; /* 1 */ 244 | max-width: 100%; /* 1 */ 245 | padding: 0; /* 3 */ 246 | white-space: normal; /* 1 */ 247 | } 248 | 249 | /** 250 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. 251 | */ 252 | 253 | progress { 254 | vertical-align: baseline; 255 | } 256 | 257 | /** 258 | * Remove the default vertical scrollbar in IE 10+. 259 | */ 260 | 261 | textarea { 262 | overflow: auto; 263 | } 264 | 265 | /** 266 | * 1. Add the correct box sizing in IE 10. 267 | * 2. Remove the padding in IE 10. 268 | */ 269 | 270 | [type="checkbox"], 271 | [type="radio"] { 272 | box-sizing: border-box; /* 1 */ 273 | padding: 0; /* 2 */ 274 | } 275 | 276 | /** 277 | * Correct the cursor style of increment and decrement buttons in Chrome. 278 | */ 279 | 280 | [type="number"]::-webkit-inner-spin-button, 281 | [type="number"]::-webkit-outer-spin-button { 282 | height: auto; 283 | } 284 | 285 | /** 286 | * 1. Correct the odd appearance in Chrome and Safari. 287 | * 2. Correct the outline style in Safari. 288 | */ 289 | 290 | [type="search"] { 291 | -webkit-appearance: textfield; /* 1 */ 292 | outline-offset: -2px; /* 2 */ 293 | } 294 | 295 | /** 296 | * Remove the inner padding in Chrome and Safari on macOS. 297 | */ 298 | 299 | [type="search"]::-webkit-search-decoration { 300 | -webkit-appearance: none; 301 | } 302 | 303 | /** 304 | * 1. Correct the inability to style clickable types in iOS and Safari. 305 | * 2. Change font properties to `inherit` in Safari. 306 | */ 307 | 308 | ::-webkit-file-upload-button { 309 | -webkit-appearance: button; /* 1 */ 310 | font: inherit; /* 2 */ 311 | } 312 | 313 | /* Interactive 314 | ========================================================================== */ 315 | 316 | /* 317 | * Add the correct display in Edge, IE 10+, and Firefox. 318 | */ 319 | 320 | details { 321 | display: block; 322 | } 323 | 324 | /* 325 | * Add the correct display in all browsers. 326 | */ 327 | 328 | summary { 329 | display: list-item; 330 | } 331 | 332 | /* Misc 333 | ========================================================================== */ 334 | 335 | /** 336 | * Add the correct display in IE 10+. 337 | */ 338 | 339 | template { 340 | display: none; 341 | } 342 | 343 | /** 344 | * Add the correct display in IE 10. 345 | */ 346 | 347 | [hidden] { 348 | display: none; 349 | } -------------------------------------------------------------------------------- /assets/images/switch.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/assets/images/switch.ico -------------------------------------------------------------------------------- /assets/images/tip-final.svg: -------------------------------------------------------------------------------- 1 | Appreciation -------------------------------------------------------------------------------- /assets/images/tip-manage.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 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /assets/images/tip-pref.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 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /build-scripts/getSwitchServicePreBuild.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const download = require('download'); 3 | const rimraf = require("rimraf"); 4 | 5 | console.log('[info]: Getting Switch service prebuild binary...'); 6 | console.log(`[info]: ${process.platform} detected`); 7 | const getVersionArg = process.argv[2]; 8 | const fileName = `switch_deamon_v${getVersionArg}_${process.platform}_release.zip`; 9 | if(fs.existsSync('./service-binaries/')) 10 | { 11 | console.log('[info]: Clearing binaries cache...'); 12 | rimraf.sync('./service-binaries/'); 13 | console.log('[info]: Cache binaries cleared!'); 14 | } 15 | 16 | const url = `https://github.com/ahkohd/switch/releases/download/switch-v${getVersionArg}/${fileName}`; 17 | 18 | 19 | console.log('[info]: Downloading prebuild..'); 20 | console.log('[url]:', url); 21 | 22 | download(url, './service-binaries', {extract: true, filter: file => !file.path.endsWith('/')}).then(() => { 23 | console.log('[info]: Prebuild downloaded!'); 24 | console.log('[info]: Prebuild extracted!'); 25 | console.log('[success]: Done!'); 26 | }).catch(err =>{ 27 | console.log('[error]: Unable to download prebuild'); 28 | throw err; 29 | }); -------------------------------------------------------------------------------- /docs/css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: "Poppins", sans-serif; 3 | overflow-x: hidden !important; 4 | } 5 | 6 | nav.navbar { 7 | background: transparent !important; 8 | } 9 | 10 | .navbar-brand img { 11 | -webkit-transform: scale(0.5); 12 | transform: scale(0.5); 13 | } 14 | 15 | .demo_pane { 16 | position: relative; 17 | } 18 | 19 | .demo_pane .embed-container { 20 | margin-top: 4em; 21 | border-radius: 8px; 22 | } 23 | 24 | .rside { 25 | padding-top: 3.5rem; 26 | } 27 | 28 | .rside h2 { 29 | color: #3a3838; 30 | font-size: 5.5em; 31 | font-family: Poppins; 32 | font-style: normal; 33 | font-weight: 600; 34 | font-size: 45px; 35 | line-height: 95.5%; 36 | } 37 | 38 | .rside h2 sup { 39 | font-size: 12px; 40 | } 41 | 42 | .rside p { 43 | color: #3a3838; 44 | font-family: Poppins; 45 | font-style: normal; 46 | font-weight: normal; 47 | font-size: 22px; 48 | line-height: 132.5%; 49 | padding-left: 10px; 50 | margin-top: 20px; 51 | } 52 | 53 | .pan { 54 | margin-top: 50px; 55 | } 56 | 57 | button.win { 58 | background: #6c63ff; 59 | -webkit-box-shadow: 0px 4px 10px #d1ceff; 60 | box-shadow: 0px 4px 10px #d1ceff; 61 | color: white; 62 | border: none; 63 | font-size: 18px; 64 | outline: none !important; 65 | font-family: Poppins; 66 | font-style: normal; 67 | font-weight: 500; 68 | font-size: 18px; 69 | line-height: 147.5%; 70 | /* or 27px */ 71 | color: rgba(255, 255, 255, 0.93); 72 | text-shadow: 0px 1px 4px rgba(35, 26, 192, 0.33); 73 | } 74 | 75 | button { 76 | padding: 10px 25px; 77 | outline: none; 78 | -webkit-transition: ease all 0.2s; 79 | transition: ease all 0.2s; 80 | margin: 3px; 81 | border: none; 82 | color: white; 83 | border-radius: 8px; 84 | } 85 | 86 | button i.fa { 87 | font-size: 30px; 88 | vertical-align: -4px; 89 | margin-right: 10px; 90 | } 91 | 92 | button.gh { 93 | -webkit-transform: scale(0.85); 94 | transform: scale(0.85); 95 | margin-right: 30px; 96 | background: #5e5e5e; 97 | -webkit-box-shadow: 0px 4px 10px rgba(90, 90, 90, 0.2); 98 | box-shadow: 0px 4px 10px rgba(90, 90, 90, 0.2); 99 | border-radius: 8px; 100 | border: none; 101 | font-family: Poppins; 102 | font-style: normal; 103 | font-weight: 500; 104 | font-size: 18px; 105 | line-height: 147.5%; 106 | } 107 | 108 | button.mac:hover { 109 | background: #fd557c; 110 | } 111 | 112 | button.win:hover { 113 | background: #5048ff; 114 | } 115 | 116 | button.mac { 117 | background: #ff6388; 118 | -webkit-box-shadow: 0px 4px 10px #fcc9d5; 119 | box-shadow: 0px 4px 10px #fcc9d5; 120 | border-radius: 8px; 121 | font-family: Poppins; 122 | font-style: normal; 123 | font-weight: 500; 124 | font-size: 18px; 125 | line-height: 147.5%; 126 | opacity: 0.8; 127 | color: rgba(255, 255, 255, 0.93); 128 | text-shadow: 0px 1px 4px #e81d4d; 129 | } 130 | 131 | button:hover { 132 | -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 133 | 0 1px 2px rgba(0, 0, 0, 0.24); 134 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); 135 | border-color: transparent; 136 | background: #4e4e4e; 137 | color: white; 138 | } 139 | 140 | .particle { 141 | top: 0; 142 | position: absolute; 143 | z-index: 0; 144 | border-radius: 50%; 145 | } 146 | 147 | @-webkit-keyframes particle-animation-1 { 148 | 100% { 149 | -webkit-transform: translate3d(45vw, 10vh, 99px); 150 | transform: translate3d(45vw, 10vh, 99px); 151 | } 152 | } 153 | 154 | @keyframes particle-animation-1 { 155 | 100% { 156 | -webkit-transform: translate3d(45vw, 10vh, 99px); 157 | transform: translate3d(45vw, 10vh, 99px); 158 | } 159 | } 160 | 161 | .particle:nth-child(1) { 162 | -webkit-animation: particle-animation-1 60s infinite; 163 | animation: particle-animation-1 60s infinite; 164 | opacity: 0.47; 165 | height: 8px; 166 | width: 8px; 167 | -webkit-animation-delay: -0.2s; 168 | animation-delay: -0.2s; 169 | -webkit-transform: translate3d(6vw, 59vh, 49px); 170 | transform: translate3d(6vw, 59vh, 49px); 171 | background: #c1d926; 172 | } 173 | 174 | @-webkit-keyframes particle-animation-2 { 175 | 100% { 176 | -webkit-transform: translate3d(67vw, 70vh, 32px); 177 | transform: translate3d(67vw, 70vh, 32px); 178 | } 179 | } 180 | 181 | @keyframes particle-animation-2 { 182 | 100% { 183 | -webkit-transform: translate3d(67vw, 70vh, 32px); 184 | transform: translate3d(67vw, 70vh, 32px); 185 | } 186 | } 187 | 188 | .particle:nth-child(2) { 189 | -webkit-animation: particle-animation-2 60s infinite; 190 | animation: particle-animation-2 60s infinite; 191 | opacity: 0.3; 192 | height: 8px; 193 | width: 8px; 194 | -webkit-animation-delay: -0.4s; 195 | animation-delay: -0.4s; 196 | -webkit-transform: translate3d(62vw, 36vh, 66px); 197 | transform: translate3d(62vw, 36vh, 66px); 198 | background: #d92635; 199 | } 200 | 201 | @-webkit-keyframes particle-animation-3 { 202 | 100% { 203 | -webkit-transform: translate3d(57vw, 90vh, 64px); 204 | transform: translate3d(57vw, 90vh, 64px); 205 | } 206 | } 207 | 208 | @keyframes particle-animation-3 { 209 | 100% { 210 | -webkit-transform: translate3d(57vw, 90vh, 64px); 211 | transform: translate3d(57vw, 90vh, 64px); 212 | } 213 | } 214 | 215 | .particle:nth-child(3) { 216 | -webkit-animation: particle-animation-3 60s infinite; 217 | animation: particle-animation-3 60s infinite; 218 | opacity: 0.78; 219 | height: 10px; 220 | width: 10px; 221 | -webkit-animation-delay: -0.6s; 222 | animation-delay: -0.6s; 223 | -webkit-transform: translate3d(19vw, 84vh, 28px); 224 | transform: translate3d(19vw, 84vh, 28px); 225 | background: #26d997; 226 | } 227 | 228 | @-webkit-keyframes particle-animation-4 { 229 | 100% { 230 | -webkit-transform: translate3d(16vw, 90vh, 89px); 231 | transform: translate3d(16vw, 90vh, 89px); 232 | } 233 | } 234 | 235 | @keyframes particle-animation-4 { 236 | 100% { 237 | -webkit-transform: translate3d(16vw, 90vh, 89px); 238 | transform: translate3d(16vw, 90vh, 89px); 239 | } 240 | } 241 | 242 | .particle:nth-child(4) { 243 | -webkit-animation: particle-animation-4 60s infinite; 244 | animation: particle-animation-4 60s infinite; 245 | opacity: 0.31; 246 | height: 6px; 247 | width: 6px; 248 | -webkit-animation-delay: -0.8s; 249 | animation-delay: -0.8s; 250 | -webkit-transform: translate3d(51vw, 58vh, 50px); 251 | transform: translate3d(51vw, 58vh, 50px); 252 | background: #7726d9; 253 | } 254 | 255 | @-webkit-keyframes particle-animation-5 { 256 | 100% { 257 | -webkit-transform: translate3d(25vw, 55vh, 98px); 258 | transform: translate3d(25vw, 55vh, 98px); 259 | } 260 | } 261 | 262 | @keyframes particle-animation-5 { 263 | 100% { 264 | -webkit-transform: translate3d(25vw, 55vh, 98px); 265 | transform: translate3d(25vw, 55vh, 98px); 266 | } 267 | } 268 | 269 | .particle:nth-child(5) { 270 | -webkit-animation: particle-animation-5 60s infinite; 271 | animation: particle-animation-5 60s infinite; 272 | opacity: 0.16; 273 | height: 10px; 274 | width: 10px; 275 | -webkit-animation-delay: -1s; 276 | animation-delay: -1s; 277 | -webkit-transform: translate3d(2vw, 48vh, 80px); 278 | transform: translate3d(2vw, 48vh, 80px); 279 | background: #d92688; 280 | } 281 | 282 | @-webkit-keyframes particle-animation-6 { 283 | 100% { 284 | -webkit-transform: translate3d(33vw, 12vh, 30px); 285 | transform: translate3d(33vw, 12vh, 30px); 286 | } 287 | } 288 | 289 | @keyframes particle-animation-6 { 290 | 100% { 291 | -webkit-transform: translate3d(33vw, 12vh, 30px); 292 | transform: translate3d(33vw, 12vh, 30px); 293 | } 294 | } 295 | 296 | .particle:nth-child(6) { 297 | -webkit-animation: particle-animation-6 60s infinite; 298 | animation: particle-animation-6 60s infinite; 299 | opacity: 0.51; 300 | height: 6px; 301 | width: 6px; 302 | -webkit-animation-delay: -1.2s; 303 | animation-delay: -1.2s; 304 | -webkit-transform: translate3d(80vw, 9vh, 100px); 305 | transform: translate3d(80vw, 9vh, 100px); 306 | background: #3226d9; 307 | } 308 | 309 | @-webkit-keyframes particle-animation-7 { 310 | 100% { 311 | -webkit-transform: translate3d(40vw, 31vh, 24px); 312 | transform: translate3d(40vw, 31vh, 24px); 313 | } 314 | } 315 | 316 | @keyframes particle-animation-7 { 317 | 100% { 318 | -webkit-transform: translate3d(40vw, 31vh, 24px); 319 | transform: translate3d(40vw, 31vh, 24px); 320 | } 321 | } 322 | 323 | .particle:nth-child(7) { 324 | -webkit-animation: particle-animation-7 60s infinite; 325 | animation: particle-animation-7 60s infinite; 326 | opacity: 0.86; 327 | height: 8px; 328 | width: 8px; 329 | -webkit-animation-delay: -1.4s; 330 | animation-delay: -1.4s; 331 | -webkit-transform: translate3d(1vw, 89vh, 27px); 332 | transform: translate3d(1vw, 89vh, 27px); 333 | background: #cdd926; 334 | } 335 | 336 | @-webkit-keyframes particle-animation-8 { 337 | 100% { 338 | -webkit-transform: translate3d(57vw, 35vh, 68px); 339 | transform: translate3d(57vw, 35vh, 68px); 340 | } 341 | } 342 | 343 | @keyframes particle-animation-8 { 344 | 100% { 345 | -webkit-transform: translate3d(57vw, 35vh, 68px); 346 | transform: translate3d(57vw, 35vh, 68px); 347 | } 348 | } 349 | 350 | .particle:nth-child(8) { 351 | -webkit-animation: particle-animation-8 60s infinite; 352 | animation: particle-animation-8 60s infinite; 353 | opacity: 0.86; 354 | height: 9px; 355 | width: 9px; 356 | -webkit-animation-delay: -1.6s; 357 | animation-delay: -1.6s; 358 | -webkit-transform: translate3d(25vw, 40vh, 19px); 359 | transform: translate3d(25vw, 40vh, 19px); 360 | background: #af26d9; 361 | } 362 | 363 | @-webkit-keyframes particle-animation-9 { 364 | 100% { 365 | -webkit-transform: translate3d(31vw, 79vh, 6px); 366 | transform: translate3d(31vw, 79vh, 6px); 367 | } 368 | } 369 | 370 | @keyframes particle-animation-9 { 371 | 100% { 372 | -webkit-transform: translate3d(31vw, 79vh, 6px); 373 | transform: translate3d(31vw, 79vh, 6px); 374 | } 375 | } 376 | 377 | .particle:nth-child(9) { 378 | -webkit-animation: particle-animation-9 60s infinite; 379 | animation: particle-animation-9 60s infinite; 380 | opacity: 0.4; 381 | height: 6px; 382 | width: 6px; 383 | -webkit-animation-delay: -1.8s; 384 | animation-delay: -1.8s; 385 | -webkit-transform: translate3d(51vw, 62vh, 4px); 386 | transform: translate3d(51vw, 62vh, 4px); 387 | background: #d95326; 388 | } 389 | 390 | @-webkit-keyframes particle-animation-10 { 391 | 100% { 392 | -webkit-transform: translate3d(30vw, 34vh, 55px); 393 | transform: translate3d(30vw, 34vh, 55px); 394 | } 395 | } 396 | 397 | @keyframes particle-animation-10 { 398 | 100% { 399 | -webkit-transform: translate3d(30vw, 34vh, 55px); 400 | transform: translate3d(30vw, 34vh, 55px); 401 | } 402 | } 403 | 404 | .particle:nth-child(10) { 405 | -webkit-animation: particle-animation-10 60s infinite; 406 | animation: particle-animation-10 60s infinite; 407 | opacity: 0.19; 408 | height: 9px; 409 | width: 9px; 410 | -webkit-animation-delay: -2s; 411 | animation-delay: -2s; 412 | -webkit-transform: translate3d(57vw, 52vh, 7px); 413 | transform: translate3d(57vw, 52vh, 7px); 414 | background: #62d926; 415 | } 416 | 417 | @-webkit-keyframes particle-animation-11 { 418 | 100% { 419 | -webkit-transform: translate3d(74vw, 42vh, 75px); 420 | transform: translate3d(74vw, 42vh, 75px); 421 | } 422 | } 423 | 424 | @keyframes particle-animation-11 { 425 | 100% { 426 | -webkit-transform: translate3d(74vw, 42vh, 75px); 427 | transform: translate3d(74vw, 42vh, 75px); 428 | } 429 | } 430 | 431 | .particle:nth-child(11) { 432 | -webkit-animation: particle-animation-11 60s infinite; 433 | animation: particle-animation-11 60s infinite; 434 | opacity: 0.19; 435 | height: 9px; 436 | width: 9px; 437 | -webkit-animation-delay: -2.2s; 438 | animation-delay: -2.2s; 439 | -webkit-transform: translate3d(54vw, 86vh, 30px); 440 | transform: translate3d(54vw, 86vh, 30px); 441 | background: #a0d926; 442 | } 443 | 444 | @-webkit-keyframes particle-animation-12 { 445 | 100% { 446 | -webkit-transform: translate3d(71vw, 82vh, 21px); 447 | transform: translate3d(71vw, 82vh, 21px); 448 | } 449 | } 450 | 451 | @keyframes particle-animation-12 { 452 | 100% { 453 | -webkit-transform: translate3d(71vw, 82vh, 21px); 454 | transform: translate3d(71vw, 82vh, 21px); 455 | } 456 | } 457 | 458 | .particle:nth-child(12) { 459 | -webkit-animation: particle-animation-12 60s infinite; 460 | animation: particle-animation-12 60s infinite; 461 | opacity: 0.65; 462 | height: 6px; 463 | width: 6px; 464 | -webkit-animation-delay: -2.4s; 465 | animation-delay: -2.4s; 466 | -webkit-transform: translate3d(71vw, 78vh, 39px); 467 | transform: translate3d(71vw, 78vh, 39px); 468 | background: #2f26d9; 469 | } 470 | 471 | @-webkit-keyframes particle-animation-13 { 472 | 100% { 473 | -webkit-transform: translate3d(46vw, 74vh, 63px); 474 | transform: translate3d(46vw, 74vh, 63px); 475 | } 476 | } 477 | 478 | @keyframes particle-animation-13 { 479 | 100% { 480 | -webkit-transform: translate3d(46vw, 74vh, 63px); 481 | transform: translate3d(46vw, 74vh, 63px); 482 | } 483 | } 484 | 485 | .particle:nth-child(13) { 486 | -webkit-animation: particle-animation-13 60s infinite; 487 | animation: particle-animation-13 60s infinite; 488 | opacity: 0.4; 489 | height: 9px; 490 | width: 9px; 491 | -webkit-animation-delay: -2.6s; 492 | animation-delay: -2.6s; 493 | -webkit-transform: translate3d(48vw, 88vh, 78px); 494 | transform: translate3d(48vw, 88vh, 78px); 495 | background: #88d926; 496 | } 497 | 498 | @-webkit-keyframes particle-animation-14 { 499 | 100% { 500 | -webkit-transform: translate3d(6vw, 84vh, 18px); 501 | transform: translate3d(6vw, 84vh, 18px); 502 | } 503 | } 504 | 505 | @keyframes particle-animation-14 { 506 | 100% { 507 | -webkit-transform: translate3d(6vw, 84vh, 18px); 508 | transform: translate3d(6vw, 84vh, 18px); 509 | } 510 | } 511 | 512 | .particle:nth-child(14) { 513 | -webkit-animation: particle-animation-14 60s infinite; 514 | animation: particle-animation-14 60s infinite; 515 | opacity: 0.46; 516 | height: 7px; 517 | width: 7px; 518 | -webkit-animation-delay: -2.8s; 519 | animation-delay: -2.8s; 520 | -webkit-transform: translate3d(58vw, 52vh, 65px); 521 | transform: translate3d(58vw, 52vh, 65px); 522 | background: #d926be; 523 | } 524 | 525 | @-webkit-keyframes particle-animation-15 { 526 | 100% { 527 | -webkit-transform: translate3d(30vw, 63vh, 41px); 528 | transform: translate3d(30vw, 63vh, 41px); 529 | } 530 | } 531 | 532 | @keyframes particle-animation-15 { 533 | 100% { 534 | -webkit-transform: translate3d(30vw, 63vh, 41px); 535 | transform: translate3d(30vw, 63vh, 41px); 536 | } 537 | } 538 | 539 | .particle:nth-child(15) { 540 | -webkit-animation: particle-animation-15 60s infinite; 541 | animation: particle-animation-15 60s infinite; 542 | opacity: 0.83; 543 | height: 9px; 544 | width: 9px; 545 | -webkit-animation-delay: -3s; 546 | animation-delay: -3s; 547 | -webkit-transform: translate3d(11vw, 24vh, 58px); 548 | transform: translate3d(11vw, 24vh, 58px); 549 | background: #7a26d9; 550 | } 551 | 552 | @-webkit-keyframes particle-animation-16 { 553 | 100% { 554 | -webkit-transform: translate3d(80vw, 14vh, 87px); 555 | transform: translate3d(80vw, 14vh, 87px); 556 | } 557 | } 558 | 559 | @keyframes particle-animation-16 { 560 | 100% { 561 | -webkit-transform: translate3d(80vw, 14vh, 87px); 562 | transform: translate3d(80vw, 14vh, 87px); 563 | } 564 | } 565 | 566 | .particle:nth-child(16) { 567 | -webkit-animation: particle-animation-16 60s infinite; 568 | animation: particle-animation-16 60s infinite; 569 | opacity: 0.66; 570 | height: 8px; 571 | width: 8px; 572 | -webkit-animation-delay: -3.2s; 573 | animation-delay: -3.2s; 574 | -webkit-transform: translate3d(53vw, 83vh, 31px); 575 | transform: translate3d(53vw, 83vh, 31px); 576 | background: #d94126; 577 | } 578 | 579 | @-webkit-keyframes particle-animation-17 { 580 | 100% { 581 | -webkit-transform: translate3d(53vw, 46vh, 7px); 582 | transform: translate3d(53vw, 46vh, 7px); 583 | } 584 | } 585 | 586 | @keyframes particle-animation-17 { 587 | 100% { 588 | -webkit-transform: translate3d(53vw, 46vh, 7px); 589 | transform: translate3d(53vw, 46vh, 7px); 590 | } 591 | } 592 | 593 | .particle:nth-child(17) { 594 | -webkit-animation: particle-animation-17 60s infinite; 595 | animation: particle-animation-17 60s infinite; 596 | opacity: 0.43; 597 | height: 9px; 598 | width: 9px; 599 | -webkit-animation-delay: -3.4s; 600 | animation-delay: -3.4s; 601 | -webkit-transform: translate3d(82vw, 34vh, 46px); 602 | transform: translate3d(82vw, 34vh, 46px); 603 | background: #85d926; 604 | } 605 | 606 | @-webkit-keyframes particle-animation-18 { 607 | 100% { 608 | -webkit-transform: translate3d(39vw, 68vh, 39px); 609 | transform: translate3d(39vw, 68vh, 39px); 610 | } 611 | } 612 | 613 | @keyframes particle-animation-18 { 614 | 100% { 615 | -webkit-transform: translate3d(39vw, 68vh, 39px); 616 | transform: translate3d(39vw, 68vh, 39px); 617 | } 618 | } 619 | 620 | .particle:nth-child(18) { 621 | -webkit-animation: particle-animation-18 60s infinite; 622 | animation: particle-animation-18 60s infinite; 623 | opacity: 0.15; 624 | height: 8px; 625 | width: 8px; 626 | -webkit-animation-delay: -3.6s; 627 | animation-delay: -3.6s; 628 | -webkit-transform: translate3d(50vw, 3vh, 81px); 629 | transform: translate3d(50vw, 3vh, 81px); 630 | background: #d97426; 631 | } 632 | 633 | @-webkit-keyframes particle-animation-19 { 634 | 100% { 635 | -webkit-transform: translate3d(50vw, 41vh, 96px); 636 | transform: translate3d(50vw, 41vh, 96px); 637 | } 638 | } 639 | 640 | @keyframes particle-animation-19 { 641 | 100% { 642 | -webkit-transform: translate3d(50vw, 41vh, 96px); 643 | transform: translate3d(50vw, 41vh, 96px); 644 | } 645 | } 646 | 647 | .particle:nth-child(19) { 648 | -webkit-animation: particle-animation-19 60s infinite; 649 | animation: particle-animation-19 60s infinite; 650 | opacity: 0.6; 651 | height: 8px; 652 | width: 8px; 653 | -webkit-animation-delay: -3.8s; 654 | animation-delay: -3.8s; 655 | -webkit-transform: translate3d(49vw, 61vh, 61px); 656 | transform: translate3d(49vw, 61vh, 61px); 657 | background: #a326d9; 658 | } 659 | 660 | @-webkit-keyframes particle-animation-20 { 661 | 100% { 662 | -webkit-transform: translate3d(88vw, 7vh, 40px); 663 | transform: translate3d(88vw, 7vh, 40px); 664 | } 665 | } 666 | 667 | @keyframes particle-animation-20 { 668 | 100% { 669 | -webkit-transform: translate3d(88vw, 7vh, 40px); 670 | transform: translate3d(88vw, 7vh, 40px); 671 | } 672 | } 673 | 674 | .particle:nth-child(20) { 675 | -webkit-animation: particle-animation-20 60s infinite; 676 | animation: particle-animation-20 60s infinite; 677 | opacity: 0.2; 678 | height: 6px; 679 | width: 6px; 680 | -webkit-animation-delay: -4s; 681 | animation-delay: -4s; 682 | -webkit-transform: translate3d(62vw, 51vh, 88px); 683 | transform: translate3d(62vw, 51vh, 88px); 684 | background: #26d988; 685 | } 686 | 687 | @-webkit-keyframes particle-animation-21 { 688 | 100% { 689 | -webkit-transform: translate3d(88vw, 32vh, 47px); 690 | transform: translate3d(88vw, 32vh, 47px); 691 | } 692 | } 693 | 694 | @keyframes particle-animation-21 { 695 | 100% { 696 | -webkit-transform: translate3d(88vw, 32vh, 47px); 697 | transform: translate3d(88vw, 32vh, 47px); 698 | } 699 | } 700 | 701 | .particle:nth-child(21) { 702 | -webkit-animation: particle-animation-21 60s infinite; 703 | animation: particle-animation-21 60s infinite; 704 | opacity: 0.63; 705 | height: 9px; 706 | width: 9px; 707 | -webkit-animation-delay: -4.2s; 708 | animation-delay: -4.2s; 709 | -webkit-transform: translate3d(72vw, 78vh, 10px); 710 | transform: translate3d(72vw, 78vh, 10px); 711 | background: #26d997; 712 | } 713 | 714 | @-webkit-keyframes particle-animation-22 { 715 | 100% { 716 | -webkit-transform: translate3d(23vw, 5vh, 27px); 717 | transform: translate3d(23vw, 5vh, 27px); 718 | } 719 | } 720 | 721 | @keyframes particle-animation-22 { 722 | 100% { 723 | -webkit-transform: translate3d(23vw, 5vh, 27px); 724 | transform: translate3d(23vw, 5vh, 27px); 725 | } 726 | } 727 | 728 | .particle:nth-child(22) { 729 | -webkit-animation: particle-animation-22 60s infinite; 730 | animation: particle-animation-22 60s infinite; 731 | opacity: 0.11; 732 | height: 9px; 733 | width: 9px; 734 | -webkit-animation-delay: -4.4s; 735 | animation-delay: -4.4s; 736 | -webkit-transform: translate3d(73vw, 43vh, 12px); 737 | transform: translate3d(73vw, 43vh, 12px); 738 | background: #d95026; 739 | } 740 | 741 | @-webkit-keyframes particle-animation-23 { 742 | 100% { 743 | -webkit-transform: translate3d(55vw, 35vh, 87px); 744 | transform: translate3d(55vw, 35vh, 87px); 745 | } 746 | } 747 | 748 | @keyframes particle-animation-23 { 749 | 100% { 750 | -webkit-transform: translate3d(55vw, 35vh, 87px); 751 | transform: translate3d(55vw, 35vh, 87px); 752 | } 753 | } 754 | 755 | .particle:nth-child(23) { 756 | -webkit-animation: particle-animation-23 60s infinite; 757 | animation: particle-animation-23 60s infinite; 758 | opacity: 0.09; 759 | height: 9px; 760 | width: 9px; 761 | -webkit-animation-delay: -4.6s; 762 | animation-delay: -4.6s; 763 | -webkit-transform: translate3d(55vw, 63vh, 90px); 764 | transform: translate3d(55vw, 63vh, 90px); 765 | background: #26bed9; 766 | } 767 | 768 | @-webkit-keyframes particle-animation-24 { 769 | 100% { 770 | -webkit-transform: translate3d(48vw, 31vh, 23px); 771 | transform: translate3d(48vw, 31vh, 23px); 772 | } 773 | } 774 | 775 | @keyframes particle-animation-24 { 776 | 100% { 777 | -webkit-transform: translate3d(48vw, 31vh, 23px); 778 | transform: translate3d(48vw, 31vh, 23px); 779 | } 780 | } 781 | 782 | .particle:nth-child(24) { 783 | -webkit-animation: particle-animation-24 60s infinite; 784 | animation: particle-animation-24 60s infinite; 785 | opacity: 0.48; 786 | height: 8px; 787 | width: 8px; 788 | -webkit-animation-delay: -4.8s; 789 | animation-delay: -4.8s; 790 | -webkit-transform: translate3d(4vw, 21vh, 35px); 791 | transform: translate3d(4vw, 21vh, 35px); 792 | background: #80d926; 793 | } 794 | 795 | @-webkit-keyframes particle-animation-25 { 796 | 100% { 797 | -webkit-transform: translate3d(86vw, 12vh, 41px); 798 | transform: translate3d(86vw, 12vh, 41px); 799 | } 800 | } 801 | 802 | @keyframes particle-animation-25 { 803 | 100% { 804 | -webkit-transform: translate3d(86vw, 12vh, 41px); 805 | transform: translate3d(86vw, 12vh, 41px); 806 | } 807 | } 808 | 809 | .particle:nth-child(25) { 810 | -webkit-animation: particle-animation-25 60s infinite; 811 | animation: particle-animation-25 60s infinite; 812 | opacity: 0.93; 813 | height: 9px; 814 | width: 9px; 815 | -webkit-animation-delay: -5s; 816 | animation-delay: -5s; 817 | -webkit-transform: translate3d(24vw, 23vh, 61px); 818 | transform: translate3d(24vw, 23vh, 61px); 819 | background: #b526d9; 820 | } 821 | 822 | @-webkit-keyframes particle-animation-26 { 823 | 100% { 824 | -webkit-transform: translate3d(42vw, 63vh, 98px); 825 | transform: translate3d(42vw, 63vh, 98px); 826 | } 827 | } 828 | 829 | @keyframes particle-animation-26 { 830 | 100% { 831 | -webkit-transform: translate3d(42vw, 63vh, 98px); 832 | transform: translate3d(42vw, 63vh, 98px); 833 | } 834 | } 835 | 836 | .particle:nth-child(26) { 837 | -webkit-animation: particle-animation-26 60s infinite; 838 | animation: particle-animation-26 60s infinite; 839 | opacity: 0.83; 840 | height: 10px; 841 | width: 10px; 842 | -webkit-animation-delay: -5.2s; 843 | animation-delay: -5.2s; 844 | -webkit-transform: translate3d(2vw, 53vh, 53px); 845 | transform: translate3d(2vw, 53vh, 53px); 846 | background: #d93e26; 847 | } 848 | 849 | @-webkit-keyframes particle-animation-27 { 850 | 100% { 851 | -webkit-transform: translate3d(56vw, 22vh, 47px); 852 | transform: translate3d(56vw, 22vh, 47px); 853 | } 854 | } 855 | 856 | @keyframes particle-animation-27 { 857 | 100% { 858 | -webkit-transform: translate3d(56vw, 22vh, 47px); 859 | transform: translate3d(56vw, 22vh, 47px); 860 | } 861 | } 862 | 863 | .particle:nth-child(27) { 864 | -webkit-animation: particle-animation-27 60s infinite; 865 | animation: particle-animation-27 60s infinite; 866 | opacity: 0.51; 867 | height: 8px; 868 | width: 8px; 869 | -webkit-animation-delay: -5.4s; 870 | animation-delay: -5.4s; 871 | -webkit-transform: translate3d(58vw, 18vh, 13px); 872 | transform: translate3d(58vw, 18vh, 13px); 873 | background: #268ed9; 874 | } 875 | 876 | @-webkit-keyframes particle-animation-28 { 877 | 100% { 878 | -webkit-transform: translate3d(68vw, 12vh, 93px); 879 | transform: translate3d(68vw, 12vh, 93px); 880 | } 881 | } 882 | 883 | @keyframes particle-animation-28 { 884 | 100% { 885 | -webkit-transform: translate3d(68vw, 12vh, 93px); 886 | transform: translate3d(68vw, 12vh, 93px); 887 | } 888 | } 889 | 890 | .particle:nth-child(28) { 891 | -webkit-animation: particle-animation-28 60s infinite; 892 | animation: particle-animation-28 60s infinite; 893 | opacity: 0.92; 894 | height: 8px; 895 | width: 8px; 896 | -webkit-animation-delay: -5.6s; 897 | animation-delay: -5.6s; 898 | -webkit-transform: translate3d(22vw, 6vh, 54px); 899 | transform: translate3d(22vw, 6vh, 54px); 900 | background: #d96826; 901 | } 902 | 903 | @-webkit-keyframes particle-animation-29 { 904 | 100% { 905 | -webkit-transform: translate3d(38vw, 44vh, 66px); 906 | transform: translate3d(38vw, 44vh, 66px); 907 | } 908 | } 909 | 910 | @keyframes particle-animation-29 { 911 | 100% { 912 | -webkit-transform: translate3d(38vw, 44vh, 66px); 913 | transform: translate3d(38vw, 44vh, 66px); 914 | } 915 | } 916 | 917 | .particle:nth-child(29) { 918 | -webkit-animation: particle-animation-29 60s infinite; 919 | animation: particle-animation-29 60s infinite; 920 | opacity: 0.63; 921 | height: 8px; 922 | width: 8px; 923 | -webkit-animation-delay: -5.8s; 924 | animation-delay: -5.8s; 925 | -webkit-transform: translate3d(56vw, 79vh, 70px); 926 | transform: translate3d(56vw, 79vh, 70px); 927 | background: #26d991; 928 | } 929 | 930 | @-webkit-keyframes particle-animation-30 { 931 | 100% { 932 | -webkit-transform: translate3d(50vw, 59vh, 70px); 933 | transform: translate3d(50vw, 59vh, 70px); 934 | } 935 | } 936 | 937 | @keyframes particle-animation-30 { 938 | 100% { 939 | -webkit-transform: translate3d(50vw, 59vh, 70px); 940 | transform: translate3d(50vw, 59vh, 70px); 941 | } 942 | } 943 | 944 | .particle:nth-child(30) { 945 | -webkit-animation: particle-animation-30 60s infinite; 946 | animation: particle-animation-30 60s infinite; 947 | opacity: 0.71; 948 | height: 10px; 949 | width: 10px; 950 | -webkit-animation-delay: -6s; 951 | animation-delay: -6s; 952 | -webkit-transform: translate3d(18vw, 90vh, 71px); 953 | transform: translate3d(18vw, 90vh, 71px); 954 | background: #a026d9; 955 | } 956 | 957 | @media screen and (min-width: 801px) { 958 | body { 959 | overflow: hidden; 960 | } 961 | } 962 | 963 | @media screen and (max-width: 800px) { 964 | .col-md-6 { 965 | -webkit-box-flex: 0 !important; 966 | -ms-flex: none !important; 967 | flex: none !important; 968 | max-width: 100% !important; 969 | } 970 | .ph-link { 971 | display: table; 972 | margin: 0 auto; 973 | } 974 | .rside { 975 | padding: 5em 30px; 976 | } 977 | .rside h2, 978 | .rside p { 979 | text-align: center; 980 | } 981 | .pan { 982 | display: table; 983 | margin: 40px auto; 984 | } 985 | .pan button { 986 | display: table; 987 | margin: 20px auto; 988 | } 989 | .pan button i { 990 | font-size: 18px; 991 | vertical-align: 0; 992 | } 993 | .navbar { 994 | margin-bottom: 20px; 995 | } 996 | .navbar-brand img { 997 | -webkit-transform: scale(1); 998 | transform: scale(1); 999 | width: 120px; 1000 | } 1001 | .demo_pane, 1002 | .embed-container { 1003 | margin-top: 0 !important; 1004 | padding-top: 0 !important; 1005 | } 1006 | } 1007 | 1008 | .embed-container { 1009 | position: relative; 1010 | padding-bottom: 56.25%; 1011 | height: 0; 1012 | overflow: hidden; 1013 | max-width: 100%; 1014 | } 1015 | 1016 | .embed-container iframe, 1017 | .embed-container object, 1018 | .embed-container embed { 1019 | position: absolute; 1020 | top: 0; 1021 | left: 0; 1022 | width: 100%; 1023 | height: 100%; 1024 | } 1025 | 1026 | #update { 1027 | background: #72ed00; 1028 | text-align: center; 1029 | padding: 15px 25px; 1030 | 1031 | border-radius: 20px; 1032 | 1033 | max-width: 900px; 1034 | display: table; 1035 | margin: 0 auto; 1036 | 1037 | cursor: default; 1038 | } 1039 | 1040 | #update a { 1041 | font-weight: 600; 1042 | color: black; 1043 | } 1044 | 1045 | @media only screen and (max-width: 870px) { 1046 | #update { 1047 | width: 90%; 1048 | margin: 0 5%; 1049 | } 1050 | } 1051 | -------------------------------------------------------------------------------- /docs/css/style.scss: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: "Poppins", sans-serif; 3 | overflow-x: hidden !important; 4 | } 5 | 6 | nav.navbar { 7 | background: transparent !important; 8 | } 9 | 10 | .navbar-brand img { 11 | transform: scale(0.5); 12 | } 13 | 14 | .demo_pane { 15 | position: relative; 16 | 17 | .embed-container { 18 | margin-top: 4em; 19 | border-radius: 8px; 20 | } 21 | } 22 | 23 | .rside { 24 | padding-top: 3.5rem; 25 | 26 | h2 { 27 | color: #3a3838; 28 | font-size: 5.5em; 29 | font-family: Poppins; 30 | font-style: normal; 31 | font-weight: 600; 32 | font-size: 45px; 33 | line-height: 95.5%; 34 | 35 | sup { 36 | font-size: 12px; 37 | } 38 | } 39 | 40 | p { 41 | color: #3a3838; 42 | font-family: Poppins; 43 | font-style: normal; 44 | font-weight: normal; 45 | font-size: 22px; 46 | line-height: 132.5%; 47 | padding-left: 10px; 48 | margin-top: 20px; 49 | } 50 | } 51 | 52 | .pan { 53 | margin-top: 50px; 54 | } 55 | 56 | button.win { 57 | background: #6c63ff; 58 | box-shadow: 0px 4px 10px #d1ceff; 59 | color: white; 60 | border: none; 61 | font-size: 18px; 62 | outline: none !important; 63 | 64 | font-family: Poppins; 65 | font-style: normal; 66 | font-weight: 500; 67 | font-size: 18px; 68 | line-height: 147.5%; 69 | /* or 27px */ 70 | 71 | color: rgba(255, 255, 255, 0.93); 72 | text-shadow: 0px 1px 4px rgba(35, 26, 192, 0.33); 73 | } 74 | 75 | button { 76 | padding: 10px 25px; 77 | outline: none; 78 | transition: ease all 0.2s; 79 | margin: 3px; 80 | border: none; 81 | color: white; 82 | border-radius: 8px; 83 | 84 | i.fa { 85 | font-size: 30px; 86 | vertical-align: -4px; 87 | margin-right: 10px; 88 | } 89 | } 90 | 91 | button.gh { 92 | transform: scale(0.85); 93 | margin-right: 30px; 94 | background: #5e5e5e; 95 | box-shadow: 0px 4px 10px rgba(90, 90, 90, 0.2); 96 | border-radius: 8px; 97 | border: none; 98 | 99 | font-family: Poppins; 100 | font-style: normal; 101 | font-weight: 500; 102 | font-size: 18px; 103 | line-height: 147.5%; 104 | } 105 | 106 | button.mac:hover { 107 | background: darken($color: rgb(253, 90, 128), $amount: 1); 108 | } 109 | 110 | button.win:hover { 111 | background: darken($color: rgb(85, 77, 255), $amount: 1); 112 | } 113 | 114 | button.mac { 115 | background: #ff6388; 116 | box-shadow: 0px 4px 10px #fcc9d5; 117 | border-radius: 8px; 118 | 119 | font-family: Poppins; 120 | font-style: normal; 121 | font-weight: 500; 122 | font-size: 18px; 123 | line-height: 147.5%; 124 | opacity: 0.8; 125 | // cursor: not-allowed; 126 | 127 | color: rgba(255, 255, 255, 0.93); 128 | 129 | text-shadow: 0px 1px 4px #e81d4d; 130 | } 131 | 132 | button:hover { 133 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); 134 | border-color: transparent; 135 | background: rgb(78, 78, 78); 136 | color: white; 137 | } 138 | 139 | // particle effect 140 | 141 | .particle { 142 | top: 0; 143 | position: absolute; 144 | z-index: 0; 145 | border-radius: 50%; 146 | } 147 | 148 | @for $i from 1 through 30 { 149 | @keyframes particle-animation-#{$i} { 150 | 100% { 151 | transform: translate3d( 152 | (random(90) * 1vw), 153 | (random(90) * 1vh), 154 | (random(100) * 1px) 155 | ); 156 | } 157 | } 158 | 159 | .particle:nth-child(#{$i}) { 160 | animation: particle-animation-#{$i} 60s infinite; 161 | $size: random(5) + 5 + px; 162 | opacity: random(100) / 100; 163 | height: $size; 164 | width: $size; 165 | animation-delay: -$i * 0.2s; 166 | transform: translate3d( 167 | (random(90) * 1vw), 168 | (random(90) * 1vh), 169 | (random(100) * 1px) 170 | ); 171 | background: hsl(random(360), 70%, 50%); 172 | } 173 | } 174 | 175 | @media screen and (min-width: 801px) { 176 | body { 177 | overflow: hidden; 178 | } 179 | } 180 | 181 | @media screen and (max-width: 800px) { 182 | .col-md-6 { 183 | flex: none !important; 184 | max-width: 100% !important; 185 | } 186 | 187 | .ph-link { 188 | display: table; 189 | margin: 0 auto; 190 | } 191 | 192 | .rside { 193 | padding: 5em 30px; 194 | 195 | h2, 196 | p { 197 | text-align: center; 198 | } 199 | } 200 | 201 | .pan { 202 | display: table; 203 | margin: 40px auto; 204 | 205 | button { 206 | display: table; 207 | margin: 20px auto; 208 | 209 | i { 210 | font-size: 18px; 211 | vertical-align: 0; 212 | } 213 | } 214 | } 215 | 216 | .navbar { 217 | margin-bottom: 20px; 218 | } 219 | 220 | .navbar-brand img { 221 | transform: scale(1); 222 | width: 120px; 223 | } 224 | 225 | .demo_pane, 226 | .embed-container { 227 | margin-top: 0 !important; 228 | padding-top: 0 !important; 229 | } 230 | } 231 | 232 | .embed-container { 233 | position: relative; 234 | padding-bottom: 56.25%; 235 | height: 0; 236 | overflow: hidden; 237 | max-width: 100%; 238 | } 239 | 240 | .embed-container iframe, 241 | .embed-container object, 242 | .embed-container embed { 243 | position: absolute; 244 | top: 0; 245 | left: 0; 246 | width: 100%; 247 | height: 100%; 248 | } 249 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 16 | 17 | 21 | 22 | Switch - switch between your favourite lightning fast. (Windows, MacOS) 23 | 24 | 25 | 26 | 27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | 58 | 74 | 75 |

76 | 🆕   🥳 Hurray! We are happy to announce that Switch is now 77 | available for macOS. 78 | Download now 👌 79 |

80 | 81 |
82 |
83 |
84 |

A crossplatform key+combo window manager

85 | 86 |

87 | Switch between your favourite apps lightning fast. (Windows, MacOS) 88 |

89 | 90 |
91 | 97 | 103 | 104 |

105 | Switch - Zap between your favorite apps lightning fast. | Product Hunt Embed 116 |
117 |
118 |
119 |
120 | 125 |
126 |
127 |
128 |
129 | 134 | 139 | 144 | 145 | 203 | 204 | 205 | 209 | 219 | 220 | 221 | -------------------------------------------------------------------------------- /docs/switch-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/docs/switch-demo.gif -------------------------------------------------------------------------------- /docs/switch-logo-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/docs/switch-logo-dark.png -------------------------------------------------------------------------------- /docs/switch-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/docs/switch-logo.png -------------------------------------------------------------------------------- /docs/switch-shot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/docs/switch-shot.png -------------------------------------------------------------------------------- /electron-builder.json: -------------------------------------------------------------------------------- 1 | { 2 | "appId": "com.softnexus.switch", 3 | "productName": "Switch", 4 | "asar": true, 5 | "directories": { 6 | "output": "dist", 7 | "buildResources": "assets/app-icons" 8 | }, 9 | "extraResources": ["./service-binaries/**/*"], 10 | "files": [ 11 | "./app/**/*", 12 | "./styles/**/*", 13 | "./assets/**/*", 14 | "package.json", 15 | "./main.js", 16 | "./index.html", 17 | "./intro.html", 18 | "./preload.js", 19 | "./settings.html" 20 | ], 21 | "linux": { 22 | "category": "Network", 23 | "target": [ 24 | { 25 | "target": "deb", 26 | "arch": ["ia32", "x64"] 27 | }, 28 | { 29 | "target": "AppImage", 30 | "arch": ["ia32", "x64"] 31 | } 32 | ] 33 | }, 34 | "win": { 35 | "publish": ["github"], 36 | "target": ["zip", "nsis"], 37 | "verifyUpdateCodeSignature": false 38 | }, 39 | "mac": { 40 | "publish": ["github"], 41 | "category": "public.app-category.navigation", 42 | "extendInfo": { 43 | "LSUIElement": 1 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Switch 9 | 10 | 11 | 12 |
13 |
14 |
15 |
16 |
17 | 18 |
19 |
20 |
21 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /intro.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 22 | 23 | 24 | Intro 25 | 26 | 27 | 28 |
29 |
30 | 31 |
32 | 33 |

Open dock

34 |

35 | Tap left or right alt key to show Switch dock. 36 |

37 | 38 |
39 |
40 | 41 |

Manage apps

42 |

43 | You can add and remove apps at the dock. 44 |

45 |
46 | 47 |
48 | 49 |

Switch apps

50 |

51 | Hold left or right alt then press your NUM keys to 53 | switch between your hotapps. 54 |

55 |
56 | 57 |
58 | 59 |

Settings

60 |

61 | You can find Switch settings at the tray menu. 62 |

63 |
64 | 65 |
66 | 67 |

🎉✨

68 |

69 | All that's all for now, Get ready to switch! 70 |

71 |
72 | 73 | 78 |
79 | 80 | 81 | 82 | 83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 | 120 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | // Modules to control application life and create native browser window 2 | const { app, BrowserWindow, ipcMain } = require("electron"); 3 | const path = require("path"); 4 | const Positioner = require("electron-positioner"); 5 | const { execFile } = require("child_process"); 6 | const Sentry = require("@sentry/node"); 7 | Sentry.init({ 8 | dsn: "https://1607ab9c0f4b4156be881c9ec9be23b5@sentry.io/1540999" 9 | }); 10 | 11 | // Load saved configurations 12 | const Store = require("electron-store"); 13 | const config = new Store({ 14 | projectName: "SwitchDock" 15 | }); 16 | 17 | // SPWAN SWITCH SERVICE 18 | const devmode = process.argv[2] == "--dev" ? true : false; 19 | 20 | function SPWAN_SWITCH_SERVICE_WIN() { 21 | // windows specific spawn 22 | return execFile( 23 | devmode 24 | ? path.join(app.getAppPath(), "\\service-binaries\\switch") 25 | : path.join(path.dirname(app.getAppPath()), "\\service-binaries\\switch"), 26 | [], 27 | (error, stdout, stderr) => {} 28 | ); 29 | } 30 | 31 | // Keep a global reference of the window object, if you don't, the window will 32 | // be closed automatically when the JavaScript object is garbage collected. 33 | let mainWindow; 34 | // Make switch only one instance. 35 | const gotTheLock = app.requestSingleInstanceLock(); 36 | 37 | if (!gotTheLock) { 38 | app.quit(); 39 | } else { 40 | app.on("second-instance", (event, commandLine, workingDirectory) => { 41 | // Someone tried to run a second instance, we should focus our window. 42 | if (mainWindow) { 43 | if (mainWindow.isMinimized()) mainWindow.restore(); 44 | mainWindow.focus(); 45 | } 46 | }); 47 | 48 | function createWindow() { 49 | const dimension = { 50 | mac: [65, 600], 51 | win: [70, 600] 52 | }; 53 | const getDim = function() { 54 | return process.platform == "darwin" ? dimension.mac : dimension.win; 55 | }; 56 | 57 | // Create the browser window. 58 | mainWindow = new BrowserWindow({ 59 | width: getDim()[0], 60 | height: getDim()[1], 61 | frame: false, 62 | resizable: false, 63 | skipTaskbar: true, 64 | minimizable: false, 65 | maximizable: false, 66 | fullscreenable: false, 67 | alwaysOnTop: true, 68 | autoHideMenuBar: true, 69 | transparent: true, 70 | show: false, 71 | vibrancy: "popover", 72 | hasShadow: false, 73 | webPreferences: { 74 | nodeIntegration: true, 75 | devTools: false, 76 | preload: path.join(__dirname, "preload.js") 77 | } 78 | }); 79 | 80 | // and load the index.html of the app. 81 | mainWindow.loadFile("index.html"); 82 | 83 | // Open the DevTools. 84 | // mainWindow.webContents.openDevTools() 85 | 86 | // Emitted when the window is closed. 87 | mainWindow.on("closed", function() { 88 | // Dereference the window object, usually you would store windows 89 | // in an array if your app supports multi windows, this is the time 90 | // when you should delete the corresponding element. 91 | mainWindow = null; 92 | }); 93 | 94 | mainWindow.once("ready-to-show", () => { 95 | // setup positioner 96 | const positioner = new Positioner(mainWindow); 97 | let placement = config.get("config"); 98 | // get placement 99 | placement = placement == null ? "right" : placement.placement; 100 | placement == "right" 101 | ? positioner.move("rightCenter") 102 | : positioner.move("leftCenter"); 103 | const pos = mainWindow.getPosition(); 104 | placement == "right" 105 | ? mainWindow.setPosition(pos[0] - 10, pos[1]) 106 | : mainWindow.setPosition(pos[0] + 10, pos[1]); 107 | // delay a bit 108 | setTimeout(() => mainWindow.show(), 1000); 109 | }); 110 | 111 | // spawn the executable approraite for the windows os. 112 | if (process.platform == "win32") { 113 | let child = SPWAN_SWITCH_SERVICE_WIN(); 114 | // on error kill service and respawn 115 | child.stderr.on("data", data => { 116 | child.kill(); 117 | // auto spwan.. 118 | child = SPWAN_SWITCH_SERVICE_WIN(); 119 | }); 120 | } 121 | } 122 | 123 | // This method will be called when Electron has finished 124 | // initialization and is ready to create browser windows. 125 | // Some APIs can only be used after this event occurs. 126 | app.on("ready", createWindow); 127 | 128 | // Quit when all windows are closed. 129 | app.on("window-all-closed", function() { 130 | // On macOS it is common for applications and their menu bar 131 | // to stay active until the user quits explicitly with Cmd + Q 132 | if (process.platform !== "darwin") app.quit(); 133 | }); 134 | 135 | app.on("activate", function() { 136 | // On macOS it's common to re-create a window in the app when the 137 | // dock icon is clicked and there are no other windows open. 138 | if (mainWindow === null) createWindow(); 139 | }); 140 | 141 | // In this file you can include the rest of your app's specific main process 142 | // code. You can also put them in separate files and require them here. 143 | 144 | ipcMain.on("quit-switch", function(event, arg) { 145 | app.exit(0); 146 | }); 147 | } 148 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "switch", 3 | "version": "1.0.25", 4 | "description": "Switch between your favourite lightning fast. (Windows, MacOS)", 5 | "main": "./main.js", 6 | "scripts": { 7 | "start": "electron .", 8 | "start-dev": "electron . --dev", 9 | "dev": "concurrently \"npm:watch-ts\" \"npm:start-dev\" ", 10 | "prod": "concurrently \"npm:watch-ts\" \"npm:start\" ", 11 | "watch-ts": "tsc -w", 12 | "build-ts": "npx tsc", 13 | "get-ss-prebuild": "node ./build-scripts/getSwitchServicePreBuild.js 0.0.4", 14 | "compile-win32": "npm run build-ts && electron-builder -w -p always", 15 | "compile-darwin": "npm run build-ts && electron-builder -m -p always", 16 | "compile-linux": "npm run build-ts && electron-builder -l -p always", 17 | "postinstall": "electron-builder install-app-deps", 18 | "watch-sass": "sass --watch ./styles", 19 | "retarget-vibrancy": "cd ./node_modules/electron-vibrancy && node-gyp rebuild --target=6.0.0 --arch=x64 --debug" 20 | }, 21 | "repository": { 22 | "type": "git", 23 | "url": "https://github.com/ahkohd/switch-desktop.git" 24 | }, 25 | "keywords": [ 26 | "Switch", 27 | "app", 28 | "utility", 29 | "productivity" 30 | ], 31 | "author": "Victor Aremu", 32 | "license": "CC0-1.0", 33 | "devDependencies": { 34 | "download": "7.1.0", 35 | "electron": "^7.0.0-beta.6", 36 | "electron-builder": "21.2.0", 37 | "npm": "^6.14.3", 38 | "rimraf": "3.0.0", 39 | "run": "1.4.0", 40 | "typescript": "3.5.3" 41 | }, 42 | "dependencies": { 43 | "@sentry/browser": "^5.6.2", 44 | "@sentry/node": "^5.15.0", 45 | "concurrently": "^4.1.1", 46 | "electron-google-analytics": "^0.1.0", 47 | "electron-is-dev": "^1.1.0", 48 | "electron-positioner": "^4.1.0", 49 | "electron-store": "^4.0.0", 50 | "extract-file-icon": "^0.3.1", 51 | "find-process": "^1.4.2", 52 | "node-ipc": "^9.1.1", 53 | "open": "^6.4.0", 54 | "ps-node": "^0.1.6", 55 | "sass": "^1.22.9", 56 | "tether": "^1.4.7", 57 | "toastify-js": "^1.6.1", 58 | "username": "^5.1.0", 59 | "uuid": "^3.3.3" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /preload.js: -------------------------------------------------------------------------------- 1 | const { remote, app, ipcRenderer } = require("electron"); 2 | 3 | const find = require("find-process"); 4 | const ps = require("ps-node"); 5 | const isDev = require("electron-is-dev"); 6 | 7 | const { Tray, Menu, BrowserWindow } = remote; 8 | const url = require("url"); 9 | const path = require("path"); 10 | const { execFile } = require("child_process"); 11 | 12 | const Store = require("electron-store"); 13 | const config = new Store({ 14 | projectName: "SwitchDock" 15 | }); 16 | 17 | let tray = new Tray( 18 | path.join( 19 | __dirname, 20 | `/assets/app-icons/${ 21 | process.platform == "darwin" ? "tray/icon.png" : "icon.png" 22 | }` 23 | ) 24 | ); 25 | let settingsWindowOpened = false; 26 | 27 | canShowIntro = () => { 28 | const status = config.get("showIntro"); 29 | return status == null ? true : status; 30 | }; 31 | 32 | // creates an intro window 33 | createIntroWindow = () => { 34 | let win = new remote.BrowserWindow({ 35 | width: 600, 36 | height: 400, 37 | show: false, 38 | frame: false, 39 | hasShadow: false, 40 | transparent: true, 41 | maximizable: false, 42 | minimizable: false, 43 | skipTaskbar: true, 44 | resizable: false, 45 | webPreferences: { 46 | devTools: false, 47 | nodeIntegration: true 48 | } 49 | }); 50 | 51 | win.loadURL( 52 | url.format({ 53 | pathname: path.join(__dirname, "intro.html"), 54 | protocol: "file:", 55 | slashes: true 56 | }) 57 | ); 58 | win.on("closed", () => {}); 59 | win.once("ready-to-show", () => { 60 | win.show(); 61 | }); 62 | }; 63 | //show intro on startup. 64 | if (canShowIntro()) createIntroWindow(); 65 | 66 | createSettingsWindow = () => { 67 | let win = new BrowserWindow({ 68 | width: 600, 69 | height: 400, 70 | show: false, 71 | maximizable: false, 72 | minimizable: false, 73 | resizable: false, 74 | webPreferences: { 75 | // devTools: true, 76 | nodeIntegration: true 77 | } 78 | }); 79 | win.loadURL( 80 | url.format({ 81 | pathname: path.join(__dirname, "settings.html"), 82 | protocol: "file:", 83 | slashes: true 84 | }) 85 | ); 86 | 87 | win.on("closed", () => { 88 | settingsWindowOpened = false; 89 | trayMenu.items[1].enabled = true; 90 | // send the update to the switch service.. 91 | try { 92 | window.SWITCH_SERVICE_CHANNEL.emit( 93 | "switch-service-incoming", 94 | JSON.stringify({ 95 | type: "config-update", 96 | data: { 97 | ...config.get("config"), 98 | disableAltGr: config.get("disableAltGr") 99 | } 100 | }) 101 | ); 102 | } catch (e) {} 103 | }); 104 | 105 | win.once("ready-to-show", () => { 106 | settingsWindowOpened = true; 107 | win.setMenu(null); 108 | win.show(); 109 | tray.setContextMenu(trayMenu); 110 | trayMenu.items[1].enabled = false; 111 | }); 112 | }; 113 | 114 | const trayMenuTemplate = [ 115 | { 116 | label: "Show dock...", 117 | click: () => { 118 | try { 119 | window.SWITCH_SERVICE_CHANNEL.emit( 120 | "switch-service-incoming", 121 | JSON.stringify({ 122 | type: "show-dock" 123 | }) 124 | ); 125 | } catch (e) {} 126 | } 127 | }, 128 | 129 | { 130 | label: "Preferences...", 131 | click: () => createSettingsWindow(), 132 | enabled: !settingsWindowOpened 133 | }, 134 | { 135 | type: "separator" 136 | }, 137 | { 138 | label: "Quit", 139 | click: () => { 140 | // stop swicth service... 141 | if (process.platform == "darwin") StartOrStopSwitchMacService(false); 142 | ipcRenderer.send("quit-switch"); 143 | } 144 | } 145 | ]; 146 | 147 | if (process.platform == "darwin") { 148 | // If platform is mac add extra menu item to cater for starting 149 | // and stoping services ... 150 | trayMenuTemplate.unshift({ 151 | type: "separator" 152 | }); 153 | trayMenuTemplate.unshift({ 154 | label: "Turn Off", 155 | click: () => { 156 | StartOrStopSwitchMacService(false); 157 | } 158 | }); 159 | // try and stop any existing switch service 160 | // and then build up tray menu 161 | StartOrStopSwitchMacService(true); 162 | } else { 163 | // build and show tray menu ... 164 | buildTrayMenu(); 165 | } 166 | 167 | function buildTrayMenu() { 168 | let trayMenu = Menu.buildFromTemplate(trayMenuTemplate); 169 | tray.setContextMenu(trayMenu); 170 | } 171 | 172 | /** 173 | * Swicth service spawn stategy for mac OS 174 | */ 175 | const SPWAN_SWITCH_SERVICE_MAC = function() { 176 | return execFile( 177 | isDev 178 | ? path.join(__dirname, "/service-binaries/switch") 179 | : path.join(path.dirname(__dirname), "/service-binaries/switch"), 180 | [], 181 | (error, stdout, stderr) => {} 182 | ); 183 | }; 184 | 185 | /** 186 | * Tries to start a new switch service but then kills the existing ones 187 | * @param {boolean} start If true, its a start operation otherwise its a stop 188 | */ 189 | function StartOrStopSwitchMacService(start = true) { 190 | find("name", "/service-binaries/switch", false).then(function(list) { 191 | list.forEach(p => { 192 | ps.kill(p.pid, err => {}); 193 | }); 194 | 195 | if (start) { 196 | let child = SPWAN_SWITCH_SERVICE_MAC(); 197 | // on error kill service and respawn 198 | child.stderr.on("data", data => { 199 | child.kill(); 200 | // auto spwan.. 201 | child = SPWAN_SWITCH_SERVICE_MAC(); 202 | }); 203 | 204 | trayMenuTemplate[0].label = "Turn Off"; 205 | trayMenuTemplate[0].click = () => { 206 | StartOrStopSwitchMacService(false); 207 | }; 208 | } else { 209 | trayMenuTemplate[0].label = "Turn On"; 210 | trayMenuTemplate[0].click = () => { 211 | StartOrStopSwitchMacService(true); 212 | }; 213 | } 214 | buildTrayMenu(); 215 | }); 216 | } 217 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /service-binaries/notifier/terminal-notifier: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/service-binaries/notifier/terminal-notifier -------------------------------------------------------------------------------- /service-binaries/switch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/service-binaries/switch -------------------------------------------------------------------------------- /service-binaries/switch.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/service-binaries/switch.ico -------------------------------------------------------------------------------- /settings.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 22 | 23 | 24 | 25 | 26 | Switch - Settings 27 | 28 | 29 | 30 |
31 |
32 |
33 | 34 |

35 |
36 |
37 |
38 |

Settings

39 |
40 | 41 | 45 |
46 | 47 |
48 | 49 | 53 |
54 | 55 |
56 | 57 | 61 | 63 |
64 | 65 |
66 | 67 | 71 |
72 | 73 |
74 | 75 | 79 |
80 | 81 | 82 | 83 |

84 |
85 |
86 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /src/analytics.ts: -------------------------------------------------------------------------------- 1 | import Analytics from 'electron-google-analytics'; 2 | const analytics = new Analytics('UA-126189060-5'); 3 | import { readFileSync } from 'fs'; 4 | import * as path from 'path'; 5 | const uuid = require('uuid/v4'); 6 | 7 | 8 | const username = require('username'); 9 | const appVersion = getAppVersion(); 10 | const details = { uname: username.sync(), platform: process.platform, version: appVersion }; 11 | 12 | // usage dock analytics 13 | export function initAnalytics(store) { 14 | console.log('[Info]: Intialize analytics'); 15 | const uid = store.get('uid', uuid()); 16 | try { 17 | analytics.set('uid', uid); 18 | analytics.set('clientID', uid); 19 | analytics.set('trackID', uid); 20 | analytics.set('appName', 'Switch'); 21 | analytics.set('appVersion', appVersion); 22 | } catch (e) { 23 | console.log('Failed to log Switch dock version.') 24 | } 25 | 26 | store.set('uid', uid); 27 | return uid; 28 | } 29 | 30 | 31 | // installs and setup analytics 32 | export function firstUseAnalytics(uid) { 33 | const isFirstTime = localStorage.getItem('first-time'); 34 | if (isFirstTime == null) { 35 | // its user's first time, log it using the app... 36 | try { 37 | analytics.send('pageview', { 38 | dh: 'switch-dock', 39 | dp: 'intro?newUser=yes', 40 | dt: 'Intro', 41 | }, uid).then((response) => { 42 | return response; 43 | }).catch((err) => { 44 | return err; 45 | }); 46 | } catch (e) { } 47 | localStorage.setItem('first-time', 'no'); 48 | } else if (isFirstTime == 'no') { 49 | // user is just rechecking intro... 50 | try { 51 | analytics.send('pageview', { 52 | dh: 'switch-dock', 53 | dp: 'intro?newUser=no', 54 | dt: 'Intro', 55 | }, uid).then((response) => { 56 | return response; 57 | }).catch((err) => { 58 | return err; 59 | }); 60 | } catch (e) { } 61 | } 62 | } 63 | 64 | // on dock show log to analytics... 65 | export function logOnShowDock(uid, startup = false) { 66 | if (startup) { 67 | try { 68 | analytics.send('pageview', { 69 | dh: 'switch-dock', 70 | dp: 'dock?version=' + appVersion + '&startup=true', 71 | dt: 'Dock', 72 | }, uid).then((response) => { 73 | return response; 74 | }).catch((err) => { 75 | return err; 76 | }); 77 | } catch (e) { } 78 | } else { 79 | try { 80 | analytics.event('ShowDock', 'show', { ec: 'ShowDock', ea: 'show', el: 'dock', ev: details, clientID: uid }) 81 | .then((response) => { 82 | return response; 83 | }).catch((err) => { 84 | return err; 85 | }); 86 | } catch (e) { } 87 | } 88 | } 89 | 90 | function getAppVersion() { 91 | return JSON.parse(readFileSync(path.join(__dirname, '../package.json')).toString()).version; 92 | } 93 | 94 | 95 | -------------------------------------------------------------------------------- /src/const.ts: -------------------------------------------------------------------------------- 1 | export const EXE_RELATED_CONTENT_TYPES = [ 2 | "application/x-msdownload", 3 | "application/bin", 4 | "application/binary", 5 | "application/com", 6 | "application/dos-exe", 7 | "application/exe", 8 | "application/macbinary", 9 | "application/msdos-windows", 10 | "application/octet-stream", 11 | "application/x-com", 12 | "application/x-exe", 13 | "application/x-macbinary", 14 | "application/x-msdos-program", 15 | "application/x-stuffit", 16 | "application/x-tencore", 17 | "application/x-winexe", 18 | "application/x-zip-compressed", 19 | "vms/exe" 20 | ]; 21 | -------------------------------------------------------------------------------- /src/interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface SwitchHotApp { 2 | empty: boolean, 3 | name: string, 4 | rawcode: number, 5 | path: string, 6 | icon: string 7 | } -------------------------------------------------------------------------------- /src/intro.ts: -------------------------------------------------------------------------------- 1 | const remote = require('electron').remote; 2 | const Store = require('electron-store'); 3 | const config = new Store({ 4 | projectName: 'SwitchDock' 5 | }); 6 | 7 | // Initialize analytics... 8 | import { initAnalytics, firstUseAnalytics } from './analytics'; 9 | const uuid = initAnalytics(config); 10 | firstUseAnalytics(uuid); 11 | 12 | 13 | export class Intro { 14 | currentIndex: number = 1; 15 | 16 | constructor() { 17 | if (process.platform == 'darwin') this.macOSCleanUp(); 18 | // add mac specific styling 19 | if (remote.process.platform == 'darwin') document.getElementById('slide-mac').classList.add('mac'); 20 | 21 | let pane = this.getAllPanes(); 22 | this.showPane(this.currentIndex); 23 | } 24 | 25 | getAllPanes(): HTMLCollectionOf { 26 | return document.getElementsByClassName('tip') as HTMLCollectionOf; 27 | } 28 | 29 | showPane(paneIndex: number) { 30 | let panes = this.getAllPanes(); 31 | if (paneIndex < 1 || panes == null || panes.length == 0 || paneIndex > panes.length) return; 32 | this.currentIndex = paneIndex; 33 | for (let i = 0; i < panes.length; i++) { 34 | if (paneIndex - 1 == i) { 35 | panes[i].style.display = 'block'; 36 | } else { 37 | panes[i].style.display = 'none'; 38 | } 39 | } 40 | 41 | if (paneIndex == 1) { 42 | this.hideElement('prev'); 43 | this.showElement('next'); 44 | this.hideElement('close'); 45 | } else if (paneIndex == panes.length) { 46 | this.hideElement('next'); 47 | this.showElement('prev'); 48 | this.showElement('close'); 49 | } else { 50 | this.showElement('prev'); 51 | this.showElement('next'); 52 | this.hideElement('close'); 53 | } 54 | 55 | } 56 | 57 | next() { 58 | this.showPane(this.currentIndex + 1); 59 | } 60 | 61 | prev() { 62 | this.showPane(this.currentIndex - 1); 63 | } 64 | 65 | 66 | hideElement(id: string) { 67 | document.getElementById(id).style.display = 'none'; 68 | } 69 | 70 | showElement(id: string) { 71 | document.getElementById(id).style.display = 'inline'; 72 | } 73 | 74 | close() { 75 | config.set('showIntro', false); 76 | remote.getCurrentWindow().close(); 77 | } 78 | 79 | macOSCleanUp() { 80 | let $macHides = document.getElementsByClassName('if-mac-combo'); 81 | for (let i = 0; i < $macHides.length; i++) { 82 | ($macHides.item(i) as HTMLElement).innerText = '⌘+⌥'; 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/renderer.ts: -------------------------------------------------------------------------------- 1 | import { Switch, osSpecificAppearance } from './switch'; 2 | const ipc = require('node-ipc'); 3 | import { remote, app } from 'electron'; 4 | import * as Sentry from '@sentry/browser'; 5 | Sentry.init({ 6 | dsn: 'https://1607ab9c0f4b4156be881c9ec9be23b5@sentry.io/1540999', 7 | }); 8 | 9 | // Load saved configurations 10 | const Store = require('electron-store'); 11 | const config = new Store({ 12 | projectName: 'SwitchDock' 13 | }); 14 | 15 | // Initialize analytics... 16 | import { initAnalytics, logOnShowDock } from './analytics'; 17 | const uuid = initAnalytics(config); 18 | logOnShowDock(uuid, true); 19 | 20 | 21 | // Dock visibility 22 | let windowVisible = true; 23 | 24 | // specifics for windows.. 25 | osSpecificAppearance(); 26 | 27 | /* Hides the dock after 3000 seconds. 28 | * - By moving it to a negative screen position, since the dock 29 | * is always on top of every other window. 30 | */ 31 | const hide = () => { 32 | return setTimeout(() => { 33 | const window = remote.getCurrentWindow(); 34 | window.setIgnoreMouseEvents(true); 35 | if (process.platform == 'darwin') { 36 | window.setOpacity(0); 37 | } else { 38 | document.body.style.opacity = '0'; 39 | } 40 | windowVisible = false; 41 | }, 3000) 42 | }; 43 | 44 | // Get user settings 45 | const settings = config.get('config'); 46 | // save previous placement 47 | let previousPlacement = (settings == null) ? 'right' : settings.placement; 48 | // holds auto hide timeout. 49 | let autoHide; 50 | // a flag 51 | (window as any).DOCK_CAN_AUTO_HIDE = true; 52 | 53 | if (settings == null || settings.autoHide) { 54 | // if there is no settings of user set autoHide to true 55 | // Flag dock to be auto hideable 56 | (window as any).DOCK_CAN_AUTO_HIDE = true; 57 | // auto hide dock 58 | autoHide = hide(); 59 | } else if (!settings.autoHide) { 60 | // auto hide is not allowed 61 | (window as any).DOCK_CAN_AUTO_HIDE = false; 62 | } 63 | 64 | // Shows the current window 65 | const show = (thenHide: boolean = true) => { 66 | const window = remote.getCurrentWindow(); 67 | window.setIgnoreMouseEvents(false); 68 | if (process.platform == 'darwin') { 69 | window.setOpacity(1); 70 | } else { 71 | document.body.style.opacity = '1'; 72 | } 73 | windowVisible = true; 74 | clearTimeout(autoHide); 75 | if (thenHide) autoHide = hide(); 76 | 77 | try { 78 | logOnShowDock(uuid); 79 | } catch (e) { } 80 | 81 | } 82 | 83 | (window as any).SHOW_DOCK = show; 84 | 85 | // places the dock to the left or right.. 86 | function placeDock(placement: string) { 87 | const dock = remote.getCurrentWindow(); 88 | const screenSize = window.screen; 89 | // 600 - window's height 90 | let calcY = (screenSize.height / 2) - (600 / 2); 91 | if (placement == 'left') { 92 | dock.setPosition(10, calcY); 93 | } else { 94 | // place right.. 95 | // 70 - window's width 96 | let calcX = screenSize.width - (70 + 10); 97 | dock.setPosition(calcX, calcY); 98 | } 99 | 100 | } 101 | 102 | // Instance Switch UI 103 | (window as any).APP = new Switch(config); 104 | 105 | // Don't hide when user is on the dock 106 | document.body.addEventListener('mouseenter', () => { 107 | if ((window as any).DOCK_CAN_AUTO_HIDE) clearInterval(autoHide); 108 | }); 109 | 110 | // Hide the dock when user is not on the dock 111 | document.body.addEventListener('mouseleave', () => { 112 | if ((window as any).DOCK_CAN_AUTO_HIDE) { 113 | clearInterval(autoHide); 114 | autoHide = hide(); 115 | } 116 | }); 117 | 118 | 119 | 120 | 121 | /* 122 | * SWITCH SERVICE 123 | * Node IPC channel 124 | */ 125 | 126 | ipc.config.id = 'switch-client-channel'; 127 | ipc.config.retry = 1500; 128 | ipc.config.silent = true; 129 | 130 | ipc.connectTo('switch-service-channel', () => { 131 | 132 | // When client connects 133 | ipc.of['switch-service-channel'].on('connect', () => { 134 | // make connection instance global 135 | (window as any).SWITCH_SERVICE_CHANNEL = ipc.of['switch-service-channel']; 136 | // send dock's pid to Switch service 137 | ipc.of['switch-service-channel'].emit('switch-service-incoming', JSON.stringify({ type: 'client-pid', data: remote.process.pid })); 138 | }); 139 | 140 | // When Switch service sends a show dock event 141 | ipc.of['switch-service-channel'].on('client-show', (payload) => { 142 | // if dock and auto hide 143 | if ((window as any).DOCK_CAN_AUTO_HIDE) { 144 | // and dock is visible 145 | if (windowVisible) { 146 | // clear auto hide timeout 147 | clearTimeout(autoHide); 148 | // auto hide dock 149 | autoHide = hide(); 150 | } else { 151 | // show dock 152 | show(); 153 | } 154 | } 155 | }); 156 | 157 | // When Switch service sends config update. 158 | ipc.of['switch-service-channel'].on('config-update', (settings) => { 159 | // check if user disable or enables dock autohide 160 | 161 | if (settings.placement && settings.placement == 'left' && previousPlacement != 'left') { 162 | placeDock('left'); 163 | previousPlacement = 'left'; 164 | clearTimeout(autoHide); 165 | show(); 166 | } else if (settings.placement && settings.placement == 'right' && previousPlacement != 'right') { 167 | placeDock('right'); 168 | previousPlacement = 'right'; 169 | clearTimeout(autoHide); 170 | show(); 171 | } 172 | 173 | if (!settings.autoHide) { 174 | show(false); 175 | (window as any).DOCK_CAN_AUTO_HIDE = false; 176 | } else if (settings.autoHide && !(window as any).DOCK_CAN_AUTO_HIDE) { 177 | show(); 178 | (window as any).DOCK_CAN_AUTO_HIDE = true; 179 | } 180 | }); 181 | 182 | // When Switch service sends last switched app 183 | ipc.of['switch-service-channel'].on('last-switched-app', (data) => { 184 | (window as any).APP.lastSwitchedApp(data.hotApp); 185 | }); 186 | 187 | 188 | }); 189 | 190 | -------------------------------------------------------------------------------- /src/settings.ts: -------------------------------------------------------------------------------- 1 | import * as Toastify from 'toastify-js'; 2 | (window as any).toastify = Toastify; 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const Store = require('electron-store'); 6 | const config = new Store({ 7 | projectName: 'SwitchDock', 8 | }); 9 | 10 | import * as Sentry from '@sentry/browser'; 11 | Sentry.init({ 12 | dsn: 'https://1607ab9c0f4b4156be881c9ec9be23b5@sentry.io/1540999', 13 | }); 14 | 15 | 16 | 17 | 18 | export class Settings { 19 | 20 | constructor() { 21 | if (process.platform == 'darwin') this.macOSCleanUp(); 22 | window.onload = () => { 23 | this.updateUI(); 24 | } 25 | 26 | this.getAppVersion(); 27 | } 28 | 29 | getSavedFromStore() { 30 | const settings = config.get('config'); 31 | if (settings == null) { 32 | const initial = { 33 | autoHide: true, 34 | maximize: true, 35 | placement: 'right', 36 | }; 37 | config.set('config', initial) 38 | return initial; 39 | } else { 40 | return settings; 41 | } 42 | } 43 | 44 | getShowIntro() { 45 | const status = config.get('showIntro'); 46 | return status == null ? true : status; 47 | } 48 | 49 | getDisableAltGr() { 50 | const status = config.get('disableAltGr'); 51 | return status == null ? false : status; 52 | } 53 | 54 | 55 | 56 | 57 | updateUI() { 58 | const data = this.getSavedFromStore(); 59 | document.clear(); 60 | this.setCheckedValue('auto_hide', data.autoHide); 61 | this.setCheckedValue('maximize', data.maximize); 62 | this.setCheckedValue('intro', this.getShowIntro()); 63 | this.setSelectedValue('placement', data.placement); 64 | this.setCheckedValue('disableAltGr', this.getDisableAltGr()); 65 | 66 | } 67 | 68 | getCheckedValue(id: string): boolean { 69 | return (document.getElementById(id) as HTMLInputElement).checked; 70 | } 71 | 72 | setCheckedValue(id: string, value: boolean) { 73 | (document.getElementById(id) as HTMLInputElement).checked = value; 74 | } 75 | 76 | setSelectedValue(id: string, value: string) { 77 | (document.getElementById(id) as HTMLInputElement).value = value; 78 | } 79 | 80 | getValue(id: string) { 81 | return (document.getElementById(id) as HTMLInputElement).value; 82 | } 83 | 84 | saveSettings() { 85 | 86 | const autoHide = this.getCheckedValue('auto_hide'); 87 | const maximize = this.getCheckedValue('maximize'); 88 | const intro = this.getCheckedValue('intro'); 89 | const placement = this.getValue('placement'); 90 | const disableAltGr = this.getCheckedValue('disableAltGr'); 91 | 92 | 93 | 94 | config.set('config', { 95 | autoHide: autoHide, 96 | maximize: maximize, 97 | placement: placement 98 | }); 99 | 100 | config.set('showIntro', intro); 101 | config.set('disableAltGr', disableAltGr); 102 | 103 | 104 | 105 | (window as any).toastify({ 106 | text: "🦄 Saved!", 107 | duration: 3000, 108 | gravity: "bottom", 109 | position: 'left', 110 | className: 'toast-left', 111 | backgroundColor: "linear-gradient(to right, #ff5f6d, #ffc371)", 112 | }).showToast(); 113 | } 114 | 115 | getAppVersion() { 116 | fs.readFile(path.join(__dirname, '../package.json'), (err, data) => { 117 | if (err) throw new Error(err); 118 | const parse = JSON.parse(data); 119 | document.getElementById('ver').innerText = `v${parse.version}` 120 | }); 121 | } 122 | 123 | macOSCleanUp() { 124 | let $macHides = document.getElementsByClassName('mac-hide'); 125 | for (let i = 0; i < $macHides.length; i++) { 126 | ($macHides.item(i) as HTMLElement).style.opacity = '0'; 127 | } 128 | } 129 | } -------------------------------------------------------------------------------- /src/switch.ts: -------------------------------------------------------------------------------- 1 | import { SwitchHotApp } from "./interfaces"; 2 | import * as Tether from "tether"; 3 | import { EXE_RELATED_CONTENT_TYPES } from "./const"; 4 | const fileIcon = require("extract-file-icon"); 5 | const open = require("open"); 6 | const path = require("path"); 7 | 8 | const remote = require("electron").remote; 9 | const Menu = remote.Menu; 10 | const MenuItem = remote.MenuItem; 11 | 12 | export class Switch { 13 | hotApps: SwitchHotApp[] | null; 14 | hotApp: SwitchHotApp = { 15 | empty: true, 16 | name: "", 17 | rawcode: null, 18 | path: "", 19 | icon: "" 20 | }; 21 | lastHotAppIndex: number = null; 22 | runningHotApps = []; 23 | 24 | constructor(public config) { 25 | /// Create hot apps elements 26 | this.awakeAppList(); 27 | /// Get them from store 28 | this.hotApps = this.getHotApps(); 29 | /// Render them 30 | this.renderUIUpdate(); 31 | /// Set up context menu 32 | this.setUpContextMenu(); 33 | } 34 | 35 | /** 36 | * Get a list of hot apps 37 | * @returns SwitchHotApp 38 | */ 39 | 40 | getHotApps(): SwitchHotApp[] | null { 41 | let data = this.config.get("DockHotApps"); 42 | if (data == null) { 43 | data = []; 44 | for (let i = 0; i < 10; i++) data.push(this.hotApp); 45 | this.saveHotApps(data); 46 | } 47 | return data; 48 | } 49 | 50 | /** 51 | * Render Changes 52 | */ 53 | 54 | renderUIUpdate() { 55 | const appsListUI: HTMLCollectionOf = document.getElementsByClassName( 56 | "app" 57 | ) as HTMLCollectionOf; 58 | for (let i = 0; i < this.hotApps.length; i++) { 59 | let elem = appsListUI[i]; 60 | let hot = this.hotApps[i]; 61 | if (hot.empty) continue; 62 | elem.className = "app tooltip"; 63 | /// Tooltip 64 | document.getElementById("tip-" + i).innerHTML = `

${ 65 | hot.name.split(".exe")[0] 66 | }

`; 67 | let icon: HTMLImageElement = document.createElement("img"); 68 | icon.dataset.hotAppId = i.toString(); 69 | icon.dataset.appName = hot.name; 70 | icon.id = "ic-" + i; 71 | icon.onclick = function() { 72 | icon.classList.add("animated"); 73 | icon.classList.add("bounce"); 74 | setTimeout(() => { 75 | icon.classList.remove("animated"); 76 | icon.classList.remove("bounce"); 77 | (window as any).APP.openApp(this); 78 | }, 1000); 79 | }.bind(i); 80 | 81 | icon.src = "data:image/png;base64," + hot.icon; 82 | icon.className = "icon"; 83 | elem.innerHTML = ""; 84 | elem.append(icon); 85 | } 86 | 87 | Tether.position(); 88 | } 89 | 90 | /** 91 | * Bootstrap the appbar UI elements 92 | */ 93 | 94 | awakeAppList() { 95 | const track = document.getElementById("track"); 96 | for (let i = 0; i < 10; i++) { 97 | const div = document.createElement("div"); 98 | const file = document.createElement("input"); 99 | div.id = "app-" + i; 100 | div.className = "app empty tooltip"; 101 | div.innerHTML += `

Add app

`; 104 | file.type = "file"; 105 | /// Remove default title behaviour. 106 | file.title = ""; 107 | /// if(process.platform == 'darwin') file.accept = ".app"; 108 | file.id = "f-app-" + i; 109 | file.addEventListener("change", e => { 110 | (window as any).APP.onClickAddHotApp(e); 111 | }); 112 | div.appendChild(file); 113 | track.appendChild(div); 114 | 115 | /// Place tooltip 116 | new Tether({ 117 | element: document.getElementById("tip-" + i), 118 | target: div, 119 | attachment: "middle center", 120 | targetAttachment: i == 0 ? "bottom center" : "top center", 121 | offset: i == 0 ? "-8px 0" : "8px 0", 122 | constraints: [ 123 | { 124 | to: "scrollParent" 125 | } 126 | ] 127 | }); 128 | 129 | /// Add hover eventlistner 130 | div.onmouseenter = () => { 131 | document.getElementById("tip-" + i).classList.add("show"); 132 | }; 133 | 134 | div.onmouseleave = () => { 135 | document.getElementById("tip-" + i).classList.remove("show"); 136 | }; 137 | } 138 | } 139 | 140 | /** 141 | * Resets the hot app tile of as given index 142 | * @param {number} i Index to reset 143 | */ 144 | 145 | resetAppTileUI(i: number) { 146 | const appTile = document.getElementById("app-" + i); 147 | appTile.innerHTML = ""; 148 | appTile.className = "app empty tooltip"; 149 | document.getElementById("tip-" + i).innerHTML = `

Add app

`; 150 | const file = document.createElement("input"); 151 | file.type = "file"; 152 | file.id = "f-app-" + i; 153 | file.title = ""; 154 | /// if(process.platform == 'darwin') file.accept = ".app"; 155 | file.addEventListener("change", e => { 156 | (window as any).APP.onClickAddHotApp(e); 157 | }); 158 | appTile.appendChild(file); 159 | } 160 | 161 | /** 162 | * Handles click event when user want to add new app 163 | * @param {Event} elem - Event 164 | */ 165 | 166 | onClickAddHotApp(elem) { 167 | if (process.platform == "darwin") (window as any).SHOW_DOCK(); 168 | 169 | /// Request dock to appear. A fix for macOS - dock disappears while add app.. 170 | try { 171 | (window as any).SWITCH_SERVICE_CHANNEL.emit( 172 | "switch-service-incoming", 173 | JSON.stringify({ 174 | type: "show-dock" 175 | }) 176 | ); 177 | 178 | const file = elem.target.files[0]; 179 | if (this.checkIfAppExists(file.path, file.name)) { 180 | alert("App already exists in dock!"); 181 | return; 182 | } 183 | 184 | /// Get app icon 185 | let opsys = process.platform; 186 | if ( 187 | opsys == "darwin" && 188 | file.path.toLowerCase().split("/pkginfo").length == 2 189 | ) { 190 | const chunck = file.path.split(".app"); 191 | const p = chunck[0].split("/"); 192 | const appPath = chunck[0] + ".app"; 193 | const icon = fileIcon(appPath, 64).toString("base64"); 194 | (window as any).APP.addApp( 195 | elem.target.id.split("-")[2], 196 | { name: p[p.length - 1], path: appPath }, 197 | icon 198 | ); 199 | } else if ( 200 | EXE_RELATED_CONTENT_TYPES.includes(file.type) && 201 | path.extname(file.path.toLowerCase()) == ".exe" && 202 | (opsys == "win32" || "win64") 203 | ) { 204 | const icon = fileIcon(file.path, 32).toString("base64"); 205 | (window as any).APP.addApp(elem.target.id.split("-")[2], file, icon); 206 | } else { 207 | alert("Please select an app!"); 208 | } 209 | } catch (e) {} 210 | } 211 | 212 | /** 213 | * Checks if an app with a given name and path already exists 214 | * @param {string} path 215 | * @param {string} name 216 | */ 217 | 218 | checkIfAppExists(path: string, name: string) { 219 | const nameExits = this.hotApps.filter( 220 | hotapp => hotapp.name.toLowerCase() == name.toLocaleLowerCase() 221 | ); 222 | const pathExists = this.hotApps.filter( 223 | hotapp => hotapp.path.toLowerCase() == path.toLowerCase() 224 | ); 225 | return pathExists.length == 0 || nameExits.length == 0 ? false : true; 226 | } 227 | 228 | /** 229 | * Adds a new app and save it details 230 | * @param {any} index 231 | * @param {any} fileDetails 232 | * @param {string} appIcon 233 | */ 234 | 235 | addApp(index: any, fileDetails: any, appIcon: string) { 236 | let mapDarwinKeycode = parseInt(index) + 2; 237 | if (mapDarwinKeycode == 10) mapDarwinKeycode = 0; 238 | this.hotApps[index] = { 239 | empty: false, 240 | name: fileDetails.name, 241 | path: fileDetails.path, 242 | icon: appIcon, 243 | rawcode: 244 | process.platform == "darwin" ? mapDarwinKeycode : 49 + parseInt(index) 245 | }; 246 | this.saveHotApps(this.hotApps); 247 | this.renderUIUpdate(); 248 | } 249 | 250 | /** 251 | * Removes an hotapp of given index and update store. 252 | * @param {number} index 253 | */ 254 | 255 | removeApp(index: number) { 256 | this.hotApps[index] = this.hotApp; 257 | this.saveHotApps(this.hotApps); 258 | this.resetAppTileUI(index); 259 | } 260 | 261 | /** 262 | * Saves hotapps update into the store 263 | * @param {any} update 264 | */ 265 | 266 | saveHotApps(update) { 267 | this.config.set("DockHotApps", update); 268 | /// Send update to background service 269 | let hotAppsData = []; 270 | update.forEach(hot => { 271 | hotAppsData.push({ 272 | name: hot.name, 273 | path: hot.path, 274 | rawcode: hot.rawcode 275 | }); 276 | }); 277 | try { 278 | (window as any).SWITCH_SERVICE_CHANNEL.emit( 279 | "switch-service-incoming", 280 | JSON.stringify({ type: "update-hot-apps", data: hotAppsData }) 281 | ); 282 | } catch (e) {} 283 | } 284 | 285 | /** 286 | * Get the hot app index of a given hot app name 287 | * @param {string} name Hot app name 288 | */ 289 | 290 | getHotApppIndex(name: string) { 291 | for (let i = 0; i < this.hotApps.length; i++) { 292 | if (this.hotApps[i].name == name) return i; 293 | } 294 | return null; 295 | } 296 | 297 | /** 298 | * Sets the last switched hot app 299 | * @param hotApp Last switched hot app 300 | */ 301 | 302 | lastSwitchedApp(hotApp) { 303 | const hotAppIndex = this.getHotApppIndex(hotApp.name); 304 | if (this.lastHotAppIndex != null) { 305 | document.getElementById("app-" + this.lastHotAppIndex).className = "app"; 306 | } 307 | 308 | document.getElementById("app-" + hotAppIndex).className = "app active"; 309 | this.lastHotAppIndex = hotAppIndex; 310 | } 311 | 312 | /** 313 | * Open a hot app with a given index 314 | * @param {number} index Index of the hot app to open 315 | */ 316 | 317 | openApp(index: number) { 318 | let hotAppData = this.hotApps[index]; 319 | open(hotAppData.path); 320 | } 321 | 322 | onRightClick() {} 323 | 324 | /** 325 | * Builds new context menu which triggers functions of the 326 | * hot app provided. 327 | * @param {number} i Index of the hot app 328 | * @returns {Menu} The built menu 329 | */ 330 | 331 | buildContextMenuBasedOnHotAppIndex(i: number) { 332 | const menu = new Menu(); 333 | const menuItems = [ 334 | { 335 | label: "Launch app", 336 | click: () => { 337 | this.openApp(i); 338 | } 339 | }, 340 | { 341 | label: "Remove app", 342 | click: () => { 343 | this.removeApp(i); 344 | } 345 | } 346 | ]; 347 | 348 | menuItems.forEach(item => { 349 | menu.append(new MenuItem(item)); 350 | }); 351 | 352 | return menu; 353 | } 354 | 355 | /** 356 | * Add event listener on context menu. 357 | */ 358 | 359 | setUpContextMenu() { 360 | window.addEventListener( 361 | "contextmenu", 362 | e => { 363 | e.preventDefault(); 364 | const elem = e.target as HTMLElement; 365 | // if the element has a data attribute data-hotAppId. 366 | if (elem.dataset.hotAppId) { 367 | const hotAppID = parseInt(elem.dataset.hotAppId); 368 | document.getElementById("tip-" + hotAppID).classList.remove("show"); 369 | const menu = this.buildContextMenuBasedOnHotAppIndex(hotAppID); 370 | menu.popup(remote.getCurrentWindow() as any); 371 | } 372 | }, 373 | false 374 | ); 375 | } 376 | } 377 | 378 | export function osSpecificAppearance() { 379 | const opsys = process.platform; 380 | const appBar = document.getElementById("appbar"); 381 | if (opsys == "win32") { 382 | appBar.style.borderRadius = "0px"; 383 | } else if (opsys == "darwin") { 384 | appBar.classList.add("mac-style"); 385 | } 386 | } 387 | -------------------------------------------------------------------------------- /src/win-run-get-pid.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | for /f "tokens=2 delims==; " %%a in (' wmic process call create %1 ^| find "ProcessId" ') do set PID=%%a 3 | echo "%PID%" -------------------------------------------------------------------------------- /styles/switch.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "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", 4 | "sources": [ 5 | "switch.scss" 6 | ], 7 | "names": [], 8 | "file": "switch.css" 9 | } -------------------------------------------------------------------------------- /styles/switch.min.css: -------------------------------------------------------------------------------- 1 | *{-webkit-user-select:none}html{padding:0;margin:0;outline:0;background:transparent}body{display:flex;height:100vh;overflow:hidden;font:caption;background:transparent !important}#appbar{border-radius:5px;position:relative;margin:auto;width:75px;height:92.2%;background:transparent !important;overflow:hidden;padding-top:35px;padding-bottom:10px;border:1px solid rgba(255,255,255,0.1)}#appbar .track{overflow-x:hidden;overflow-y:scroll;height:100%;width:96%;margin:0 2%}#appbar .track .app.empty{border:dashed 2px rgba(255,255,255,0.089)}#appbar .track .app.empty::before{content:'+';font-size:40px;position:absolute;left:17px;top:5px;transform:scale(0.9);color:rgba(255,255,255,0.089)}#appbar .track .app{position:relative;width:56px !important;height:56px !important;display:table;margin-left:auto;margin-right:auto;margin-bottom:2vh;border-radius:5px;display:flex;border:dashed 2px transparent}#appbar .track .app *{margin:auto}#appbar .track .app .icon{width:32px;height:32px;z-index:0;border-radius:5px}#appbar .track .app input[type=file]{position:absolute;width:100%;height:100%;opacity:0;z-index:10}#appbar .track .app:hover{color:#00aced}#appbar .track .app:hover .icon{filter:hue-rotate(0deg) saturate(2) invert(0)}#appbar .track .app:hover::after{content:'';width:9px;height:9px;border-radius:50%;background:#fff;position:absolute;bottom:30%;right:10%;box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24);z-index:100}#appbar .track .app.empty:hover::after{display:none}#appbar .track .app.active::before{content:'';width:9px;height:9px;border-radius:50%;background:#00aced;position:absolute;bottom:30%;right:10%;box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24);z-index:100}#appbar .track .app.empty:hover::before{color:#00aced}#drag{width:100%;position:absolute;height:35px;background:transparent;top:0;left:0;-webkit-app-region:drag;display:flex;align-items:center;justify-content:center;z-index:99999 !important}#drag .circle{width:8px;height:8px;border-radius:50%;background:rgba(255,255,255,0.192);cursor:move}#drag .bar{width:30px;height:8px;border-radius:10px;margin-left:5px;background:rgba(255,255,255,0.192);cursor:move}#drag .circle:nth-child(2){margin-left:5px;margin-right:5px}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3);border-radius:10px}::-webkit-scrollbar{width:7px;background-color:transparent !important;display:none}::-webkit-scrollbar-thumb{border-radius:10px;-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3);background-color:#636363}.animated{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:linear;animation-timing-function:linear;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite}@-webkit-keyframes bounce{0%,100%{-webkit-transform:translateY(0)}50%{-webkit-transform:translateY(-5px)}}@keyframes bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeIn{animation-name:fadeIn;animation-timing-function:ease-out;animation-duration:.3s}.fadeOut{animation-name:fadeOut;animation-duration:.3s;animation-fill-mode:forwards}.settings-page{font:caption;background:#252525 !important;color:#999;position:relative;overflow-y:scroll !important}.settings-page h2{color:#999}.settings-page .board{width:90%;height:100%;display:flex;align-items:center;justify-content:space-around;flex-direction:row;overflow-x:hidden;overflow-y:scroll !important;font:caption}.settings-page .board .lside{height:100%;display:flex;justify-content:center;align-items:flex-start}.settings-page .board .lside div{margin:30px auto;text-align:center}.settings-page .board .lside div img{width:60px;height:60px}.settings-page .board .lside div p{margin:5px 0 0 0;color:#999;font-size:14px;letter-spacing:1px}.settings-page .board .rside{width:70%;height:100%;padding-top:30px}.settings-page .board .rside h2{font:caption;font-weight:bold;font-size:30px;margin:0 0 15px 0;color:rgba(0,0,0,0.712)}.settings-page .board .rside .label{font-size:14px;margin-bottom:2px;display:block}.settings-page .board .rside .form-control{margin-top:13px}.settings-page .board .rside .form-control select{border-radius:5px;padding:3px 5px;border:2px solid #00aced;outline:none;font:caption;color:#999;background:transparent}.settings-page .board .rside .form-control select option{background:#222;color:#999}.settings-page .board .rside .switch{transform:scale(0.7) translateX(-15px)}.settings-page .board .rside .btn{display:block;width:20%;margin-top:10px;padding:10px 0;font-weight:bold;border-radius:5px;background:#222;color:white;border:3px solid #111;outline:none;box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24);position:absolute;right:30px;bottom:30px;transform:scale(0.9)}.settings-page .board .rside .btn:hover{background:#2196F3}.settings-page .window-maximize,.settings-page .window-minimize{display:none}.switch{position:relative;display:inline-block;width:60px;height:34px}.switch input{opacity:0}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:"";height:26px;width:26px;left:4px;bottom:4px;background-color:white;-webkit-transition:.4s;transition:.4s}input:checked+.slider{background-color:#2196F3}input:focus+.slider{box-shadow:0 0 1px #2196F3}input:checked+.slider:before{-webkit-transform:translateX(26px);-ms-transform:translateX(26px);transform:translateX(26px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}.toast-left{left:20px;position:absolute;width:80px !important;font:caption;box-shadow:none !important;color:#999}.intro-page{display:flex}.intro-page .slide.mac{margin:auto;padding:0 !important;margin:0 !important;width:100vw !important;height:100vh !important}.intro-page .slide{box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24);border-radius:5px;width:95vw;height:95vh;display:flex;background:#d5ecff;margin:auto}.intro-page .slide .pane{margin:auto;font:caption;text-align:center;max-width:75vh;position:relative;z-index:1}.intro-page .slide .pane img{width:auto;height:130px}.intro-page .slide .pane h2{color:#333;font-size:25px;margin-bottom:10px}.intro-page .slide .pane p{margin-top:0px;font-size:13px;color:#000;font-weight:400;text-align:center}.intro-page .slide .pane .nav{padding-top:5px;display:table;margin:0 auto;transform:scale(0.85)}.intro-page .slide .pane .nav button{background:#d5ecff;border:3px solid #00aced;border-radius:5px;padding:10px 25px;outline:none;font-weight:bold;font-size:14px;transition:ease all .2s;margin:0 3px}.intro-page .slide .pane .nav button:hover{box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24);border-color:transparent;background:#4e4e4e;color:white}.intro-page .slide .pane .nav button.close{background:#00aced;color:white}span.key{background:#eee;border:1px solid #999;color:#222;padding:0px 5px;border-radius:5px;font-weight:bold;line-height:25px}.particle{position:absolute;z-index:0;border-radius:50%}@keyframes particle-animation-1{100%{transform:translate3d(62vw, 73vh, 57px)}}.particle:nth-child(1){animation:particle-animation-1 60s infinite;opacity:.4;height:10px;width:10px;animation-delay:-.2s;transform:translate3d(15vw, 42vh, 44px);background:#50d926}@keyframes particle-animation-2{100%{transform:translate3d(25vw, 86vh, 36px)}}.particle:nth-child(2){animation:particle-animation-2 60s infinite;opacity:.71;height:8px;width:8px;animation-delay:-.4s;transform:translate3d(15vw, 9vh, 27px);background:#26d92c}@keyframes particle-animation-3{100%{transform:translate3d(27vw, 84vh, 43px)}}.particle:nth-child(3){animation:particle-animation-3 60s infinite;opacity:.46;height:10px;width:10px;animation-delay:-.6s;transform:translate3d(28vw, 58vh, 15px);background:#d926d3}@keyframes particle-animation-4{100%{transform:translate3d(37vw, 46vh, 20px)}}.particle:nth-child(4){animation:particle-animation-4 60s infinite;opacity:.46;height:8px;width:8px;animation-delay:-.8s;transform:translate3d(54vw, 85vh, 12px);background:#d926d3}@keyframes particle-animation-5{100%{transform:translate3d(23vw, 75vh, 20px)}}.particle:nth-child(5){animation:particle-animation-5 60s infinite;opacity:.57;height:9px;width:9px;animation-delay:-1s;transform:translate3d(72vw, 25vh, 88px);background:#d92647}@keyframes particle-animation-6{100%{transform:translate3d(66vw, 30vh, 66px)}}.particle:nth-child(6){animation:particle-animation-6 60s infinite;opacity:.05;height:6px;width:6px;animation-delay:-1.2s;transform:translate3d(36vw, 16vh, 62px);background:#d92641}@keyframes particle-animation-7{100%{transform:translate3d(10vw, 57vh, 23px)}}.particle:nth-child(7){animation:particle-animation-7 60s infinite;opacity:.46;height:7px;width:7px;animation-delay:-1.4s;transform:translate3d(75vw, 83vh, 67px);background:#be26d9}@keyframes particle-animation-8{100%{transform:translate3d(72vw, 77vh, 43px)}}.particle:nth-child(8){animation:particle-animation-8 60s infinite;opacity:.35;height:8px;width:8px;animation-delay:-1.6s;transform:translate3d(42vw, 26vh, 26px);background:#d94726}@keyframes particle-animation-9{100%{transform:translate3d(3vw, 53vh, 51px)}}.particle:nth-child(9){animation:particle-animation-9 60s infinite;opacity:.79;height:6px;width:6px;animation-delay:-1.8s;transform:translate3d(19vw, 83vh, 17px);background:#26d95c}@keyframes particle-animation-10{100%{transform:translate3d(3vw, 40vh, 34px)}}.particle:nth-child(10){animation:particle-animation-10 60s infinite;opacity:.41;height:8px;width:8px;animation-delay:-2s;transform:translate3d(2vw, 18vh, 70px);background:#26d95c}@keyframes particle-animation-11{100%{transform:translate3d(30vw, 13vh, 23px)}}.particle:nth-child(11){animation:particle-animation-11 60s infinite;opacity:.18;height:7px;width:7px;animation-delay:-2.2s;transform:translate3d(59vw, 74vh, 8px);background:#262cd9}@keyframes particle-animation-12{100%{transform:translate3d(69vw, 65vh, 63px)}}.particle:nth-child(12){animation:particle-animation-12 60s infinite;opacity:.67;height:6px;width:6px;animation-delay:-2.4s;transform:translate3d(45vw, 11vh, 4px);background:#26d99a}@keyframes particle-animation-13{100%{transform:translate3d(65vw, 5vh, 5px)}}.particle:nth-child(13){animation:particle-animation-13 60s infinite;opacity:.12;height:6px;width:6px;animation-delay:-2.6s;transform:translate3d(59vw, 53vh, 93px);background:#d9264a}@keyframes particle-animation-14{100%{transform:translate3d(88vw, 83vh, 35px)}}.particle:nth-child(14){animation:particle-animation-14 60s infinite;opacity:.9;height:10px;width:10px;animation-delay:-2.8s;transform:translate3d(30vw, 33vh, 20px);background:#d92629}@keyframes particle-animation-15{100%{transform:translate3d(22vw, 89vh, 40px)}}.particle:nth-child(15){animation:particle-animation-15 60s infinite;opacity:.61;height:7px;width:7px;animation-delay:-3s;transform:translate3d(39vw, 50vh, 11px);background:#d9a926}@keyframes particle-animation-16{100%{transform:translate3d(29vw, 29vh, 58px)}}.particle:nth-child(16){animation:particle-animation-16 60s infinite;opacity:.48;height:10px;width:10px;animation-delay:-3.2s;transform:translate3d(22vw, 53vh, 95px);background:#268ed9}@keyframes particle-animation-17{100%{transform:translate3d(21vw, 87vh, 54px)}}.particle:nth-child(17){animation:particle-animation-17 60s infinite;opacity:.37;height:6px;width:6px;animation-delay:-3.4s;transform:translate3d(33vw, 36vh, 94px);background:#2665d9}@keyframes particle-animation-18{100%{transform:translate3d(31vw, 87vh, 89px)}}.particle:nth-child(18){animation:particle-animation-18 60s infinite;opacity:.27;height:10px;width:10px;animation-delay:-3.6s;transform:translate3d(73vw, 65vh, 91px);background:#26d953}@keyframes particle-animation-19{100%{transform:translate3d(88vw, 29vh, 14px)}}.particle:nth-child(19){animation:particle-animation-19 60s infinite;opacity:.46;height:6px;width:6px;animation-delay:-3.8s;transform:translate3d(68vw, 77vh, 76px);background:#d93526}@keyframes particle-animation-20{100%{transform:translate3d(65vw, 6vh, 70px)}}.particle:nth-child(20){animation:particle-animation-20 60s infinite;opacity:.02;height:9px;width:9px;animation-delay:-4s;transform:translate3d(22vw, 43vh, 89px);background:#26d938}@keyframes particle-animation-21{100%{transform:translate3d(75vw, 12vh, 30px)}}.particle:nth-child(21){animation:particle-animation-21 60s infinite;opacity:.6;height:9px;width:9px;animation-delay:-4.2s;transform:translate3d(14vw, 45vh, 21px);background:#26b8d9}@keyframes particle-animation-22{100%{transform:translate3d(79vw, 70vh, 3px)}}.particle:nth-child(22){animation:particle-animation-22 60s infinite;opacity:.7;height:9px;width:9px;animation-delay:-4.4s;transform:translate3d(26vw, 55vh, 13px);background:#a6d926}@keyframes particle-animation-23{100%{transform:translate3d(55vw, 8vh, 89px)}}.particle:nth-child(23){animation:particle-animation-23 60s infinite;opacity:.07;height:7px;width:7px;animation-delay:-4.6s;transform:translate3d(9vw, 81vh, 66px);background:#c4d926}@keyframes particle-animation-24{100%{transform:translate3d(2vw, 28vh, 11px)}}.particle:nth-child(24){animation:particle-animation-24 60s infinite;opacity:.97;height:10px;width:10px;animation-delay:-4.8s;transform:translate3d(38vw, 35vh, 4px);background:#8b26d9}@keyframes particle-animation-25{100%{transform:translate3d(61vw, 84vh, 48px)}}.particle:nth-child(25){animation:particle-animation-25 60s infinite;opacity:.63;height:6px;width:6px;animation-delay:-5s;transform:translate3d(60vw, 3vh, 7px);background:#6ed926}@keyframes particle-animation-26{100%{transform:translate3d(76vw, 4vh, 62px)}}.particle:nth-child(26){animation:particle-animation-26 60s infinite;opacity:.56;height:8px;width:8px;animation-delay:-5.2s;transform:translate3d(84vw, 84vh, 50px);background:#3bd926}@keyframes particle-animation-27{100%{transform:translate3d(67vw, 55vh, 81px)}}.particle:nth-child(27){animation:particle-animation-27 60s infinite;opacity:.2;height:10px;width:10px;animation-delay:-5.4s;transform:translate3d(45vw, 68vh, 50px);background:#d92635}@keyframes particle-animation-28{100%{transform:translate3d(46vw, 4vh, 34px)}}.particle:nth-child(28){animation:particle-animation-28 60s infinite;opacity:.19;height:6px;width:6px;animation-delay:-5.6s;transform:translate3d(74vw, 75vh, 24px);background:#d93226}@keyframes particle-animation-29{100%{transform:translate3d(52vw, 66vh, 10px)}}.particle:nth-child(29){animation:particle-animation-29 60s infinite;opacity:.19;height:7px;width:7px;animation-delay:-5.8s;transform:translate3d(83vw, 16vh, 69px);background:#d92688}@keyframes particle-animation-30{100%{transform:translate3d(19vw, 2vh, 68px)}}.particle:nth-child(30){animation:particle-animation-30 60s infinite;opacity:.24;height:9px;width:9px;animation-delay:-6s;transform:translate3d(16vw, 64vh, 33px);background:#d99d26}.tooltiptext{visibility:hidden;opacity:0;max-width:50px !important;min-width:40px !important;background-color:#2c2c2c;color:rgba(255,255,255,0.822);text-align:center;border-radius:3px;padding:5px;z-index:1 !important;font:caption;font-size:13px;text-align:center;text-overflow:ellipsis;box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24);pointer-events:none}.tooltiptext p{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;height:100%;padding:0;margin:0}.tooltiptext::first-letter{text-transform:capitalize}.tooltiptext::after{content:" ";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#2c2c2c transparent transparent transparent}.tooltiptext.top::after{content:" ";position:absolute;top:initial;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:transparent transparent #2c2c2c transparent}.tooltiptext.show{animation-name:tooltip;animation-delay:.7s;animation-duration:.3s;animation-fill-mode:forwards}@keyframes tooltip{0%{visibility:hidden;opacity:0}100%{visibility:visible;opacity:1}}.tooltiptext.tether-out-of-bounds-top,.tooltiptext.tether-out-of-bounds-bottom{display:none}.mac-style{background:transparent !important}.mac-style .tooltip.empty{transform:scale(0.8);font-weight:lighter !important;border-color:rgba(255,255,255,0.4) !important}.mac-style .app.empty::before{top:2px !important;color:rgba(255,255,255,0.4) !important}.mac-style .app.empty:hover::before{top:2px !important;color:#00aced !important}.mac-style .app .icon{width:48px !important;height:48px !important} 2 | -------------------------------------------------------------------------------- /styles/switch.min.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "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", 4 | "sources": [ 5 | "switch.scss" 6 | ], 7 | "names": [], 8 | "file": "switch.min.css" 9 | } -------------------------------------------------------------------------------- /styles/switch.scss: -------------------------------------------------------------------------------- 1 | $app-bar-bg: rgba(0, 0, 0, 0.863); 2 | $drag-height: 35px; 3 | $secondary-color: #00aced; 4 | $app-hover-indicator-color: white; 5 | // vibrancy value 6 | // $app-bar-bg: rgba(0, 0, 0, 0.521); 7 | $drag-indicator-color: rgba(255, 255, 255, 0.192); 8 | // vibrancy value 9 | // $empty-app-border-color: rgba(255, 255, 255, 0.17); 10 | $empty-app-border-color: rgba(255, 255, 255, 0.089); 11 | 12 | $tooltip-bg: rgb(44, 44, 44); 13 | $tooltip-fg: rgba(255, 255, 255, 0.822); 14 | $tooltip-shadow-color1: rgba(0, 0, 0, 0.12); 15 | $tooltip-shadow-color2: rgba(0, 0, 0, 0.24); 16 | 17 | 18 | * { 19 | -webkit-user-select: none; 20 | } 21 | 22 | html { 23 | padding: 0; 24 | margin: 0; 25 | outline: 0; 26 | background: transparent; 27 | } 28 | 29 | body { 30 | display: flex; 31 | height: 100vh; 32 | overflow: hidden; 33 | font: caption; 34 | background: transparent !important; 35 | } 36 | 37 | #appbar { 38 | border-radius: 5px; 39 | position: relative; 40 | margin: auto; 41 | width: 75px; 42 | height: 92.2%; 43 | // background: $app-bar-bg; 44 | background: transparent !important; 45 | overflow: hidden; 46 | padding-top: $drag-height; 47 | padding-bottom: 10px; 48 | border: 1px solid rgba(255, 255, 255, .1); 49 | 50 | .track { 51 | overflow-x: hidden; 52 | overflow-y: scroll; 53 | height: 100%; 54 | width: 96%; 55 | margin: 0 2%; 56 | 57 | .app.empty { 58 | border: dashed 2px $empty-app-border-color; 59 | } 60 | 61 | .app.empty::before { 62 | content: '+'; 63 | font-size: 40px; 64 | position: absolute; 65 | left: 17px; 66 | top: 5px; 67 | transform: scale(.9); 68 | color: $empty-app-border-color; 69 | } 70 | 71 | 72 | 73 | .app { 74 | position: relative; 75 | width: 56px !important; 76 | height: 56px !important; 77 | display: table; 78 | margin-left: auto; 79 | margin-right: auto; 80 | margin-bottom: 2vh; 81 | border-radius: 5px; 82 | display: flex; 83 | border: dashed 2px transparent; 84 | // overflow: hidden; 85 | 86 | & * { 87 | margin: auto; 88 | } 89 | 90 | .icon { 91 | width: 32px; 92 | height: 32px; 93 | z-index: 0; 94 | border-radius: 5px; 95 | // transition: all .3s ease-in-out; 96 | } 97 | 98 | input[type=file] { 99 | position: absolute; 100 | width: 100%; 101 | height: 100%; 102 | opacity: 0; 103 | z-index: 10; 104 | } 105 | 106 | 107 | } 108 | 109 | .app:hover { 110 | color: $secondary-color; 111 | 112 | 113 | 114 | .icon { 115 | // transform: rotateZ(5deg) scale(.95); 116 | filter: hue-rotate(0deg) saturate(2) invert(0); 117 | } 118 | } 119 | 120 | .app:hover::after { 121 | content: ''; 122 | width: 9px; 123 | height: 9px; 124 | border-radius: 50%; 125 | background: $app-hover-indicator-color; 126 | position: absolute; 127 | bottom: 30%; 128 | right: 10%; 129 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); 130 | z-index: 100; 131 | } 132 | 133 | .app.empty:hover::after { 134 | display: none; 135 | } 136 | 137 | .app.active::before { 138 | content: ''; 139 | width: 9px; 140 | height: 9px; 141 | border-radius: 50%; 142 | background: $secondary-color; 143 | position: absolute; 144 | bottom: 30%; 145 | right: 10%; 146 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); 147 | z-index: 100; 148 | } 149 | 150 | .app.empty:hover::before { 151 | color: $secondary-color; 152 | } 153 | } 154 | } 155 | 156 | #drag { 157 | width: 100%; 158 | position: absolute; 159 | height: $drag-height; 160 | background: transparent; 161 | top: 0; 162 | left: 0; 163 | -webkit-app-region: drag; 164 | display: flex; 165 | align-items: center; 166 | justify-content: center; 167 | z-index: 99999 !important; 168 | 169 | .circle { 170 | width: 8px; 171 | height: 8px; 172 | border-radius: 50%; 173 | background: $drag-indicator-color; 174 | cursor: move; 175 | } 176 | 177 | .bar { 178 | width: 30px; 179 | height: 8px; 180 | border-radius: 10px; 181 | margin-left: 5px; 182 | background: $drag-indicator-color; 183 | cursor: move; 184 | } 185 | 186 | .circle:nth-child(2) { 187 | margin-left: 5px; 188 | margin-right: 5px; 189 | } 190 | } 191 | 192 | 193 | ::-webkit-scrollbar-track { 194 | -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); 195 | border-radius: 10px; 196 | // background-color: transparent !important; 197 | } 198 | 199 | ::-webkit-scrollbar { 200 | width: 7px; 201 | background-color: transparent !important; 202 | display: none; 203 | } 204 | 205 | ::-webkit-scrollbar-thumb { 206 | border-radius: 10px; 207 | -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3); 208 | background-color: rgb(99, 99, 99); 209 | } 210 | 211 | .animated { 212 | -webkit-animation-duration: .5s; 213 | animation-duration: .5s; 214 | -webkit-animation-fill-mode: both; 215 | animation-fill-mode: both; 216 | -webkit-animation-timing-function: linear; 217 | animation-timing-function: linear; 218 | animation-iteration-count: infinite; 219 | -webkit-animation-iteration-count: infinite; 220 | } 221 | 222 | @-webkit-keyframes bounce { 223 | 224 | 0%, 225 | 100% { 226 | -webkit-transform: translateY(0); 227 | } 228 | 229 | 50% { 230 | -webkit-transform: translateY(-5px); 231 | } 232 | } 233 | 234 | @keyframes bounce { 235 | 236 | 0%, 237 | 100% { 238 | transform: translateY(0); 239 | } 240 | 241 | 50% { 242 | transform: translateY(-5px); 243 | } 244 | } 245 | 246 | .bounce { 247 | -webkit-animation-name: bounce; 248 | animation-name: bounce; 249 | } 250 | 251 | 252 | @keyframes fadeIn { 253 | from { 254 | opacity: 0; 255 | } 256 | 257 | to { 258 | opacity: 1; 259 | } 260 | } 261 | 262 | @keyframes fadeOut { 263 | 0% { 264 | opacity: 1; 265 | } 266 | 267 | 100% { 268 | opacity: 0; 269 | } 270 | } 271 | 272 | 273 | .fadeIn { 274 | animation-name: fadeIn; 275 | animation-timing-function: ease-out; 276 | animation-duration: .3s; 277 | } 278 | 279 | .fadeOut { 280 | animation-name: fadeOut; 281 | animation-duration: .3s; 282 | animation-fill-mode: forwards; 283 | } 284 | 285 | 286 | 287 | 288 | 289 | 290 | .settings-page { 291 | font: caption; 292 | background: rgb(37, 37, 37) !important; 293 | color: #999; 294 | position: relative; 295 | overflow-y: scroll !important; 296 | 297 | h2 { 298 | color: #999; 299 | } 300 | 301 | .board { 302 | width: 90%; 303 | height: 100%; 304 | display: flex; 305 | align-items: center; 306 | justify-content: space-around; 307 | flex-direction: row; 308 | overflow-x: hidden; 309 | overflow-y: scroll !important; 310 | font: caption; 311 | 312 | 313 | .lside { 314 | height: 100%; 315 | display: flex; 316 | justify-content: center; 317 | align-items: flex-start; 318 | 319 | div { 320 | margin: 30px auto; 321 | text-align: center; 322 | 323 | img { 324 | width: 60px; 325 | height: 60px; 326 | } 327 | 328 | p { 329 | margin: 5px 0 0 0; 330 | color: #999; 331 | font-size: 14px; 332 | letter-spacing: 1px; 333 | } 334 | } 335 | } 336 | 337 | .rside { 338 | width: 70%; 339 | height: 100%; 340 | padding-top: 30px; 341 | 342 | h2 { 343 | font: caption; 344 | font-weight: bold; 345 | font-size: 30px; 346 | margin: 0 0 15px 0; 347 | color: rgba(0, 0, 0, 0.712); 348 | } 349 | 350 | .label { 351 | font-size: 14px; 352 | margin-bottom: 2px; 353 | display: block; 354 | 355 | } 356 | 357 | .form-control { 358 | margin-top: 13px; 359 | 360 | select { 361 | border-radius: 5px; 362 | padding: 3px 5px; 363 | border: 2px solid #00aced; 364 | outline: none; 365 | font: caption; 366 | color: #999; 367 | background: transparent; 368 | 369 | & option { 370 | background: #222; 371 | color: #999; 372 | } 373 | } 374 | } 375 | 376 | .switch { 377 | transform: scale(.7) translateX(-15px); 378 | } 379 | 380 | .btn { 381 | display: block; 382 | width: 20%; 383 | margin-top: 10px; 384 | padding: 10px 0; 385 | font-weight: bold; 386 | border-radius: 5px; 387 | background: #222; 388 | color: white; 389 | border: 3px solid #111; 390 | outline: none; 391 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); 392 | position: absolute; 393 | right: 30px; 394 | bottom: 30px; 395 | transform: scale(.9); 396 | } 397 | 398 | .btn:hover { 399 | background: #2196F3; 400 | } 401 | 402 | 403 | } 404 | } 405 | 406 | 407 | 408 | .window-maximize, 409 | .window-minimize { 410 | display: none; 411 | } 412 | 413 | 414 | } 415 | 416 | 417 | /* The switch - the box around the slider */ 418 | .switch { 419 | position: relative; 420 | display: inline-block; 421 | width: 60px; 422 | height: 34px; 423 | } 424 | 425 | /* Hide default HTML checkbox */ 426 | .switch input { 427 | opacity: 0; 428 | } 429 | 430 | /* The slider */ 431 | .slider { 432 | position: absolute; 433 | cursor: pointer; 434 | top: 0; 435 | left: 0; 436 | right: 0; 437 | bottom: 0; 438 | background-color: #ccc; 439 | -webkit-transition: .4s; 440 | transition: .4s; 441 | } 442 | 443 | .slider:before { 444 | position: absolute; 445 | content: ""; 446 | height: 26px; 447 | width: 26px; 448 | left: 4px; 449 | bottom: 4px; 450 | background-color: white; 451 | -webkit-transition: .4s; 452 | transition: .4s; 453 | } 454 | 455 | input:checked+.slider { 456 | background-color: #2196F3; 457 | } 458 | 459 | input:focus+.slider { 460 | box-shadow: 0 0 1px #2196F3; 461 | } 462 | 463 | input:checked+.slider:before { 464 | -webkit-transform: translateX(26px); 465 | -ms-transform: translateX(26px); 466 | transform: translateX(26px); 467 | } 468 | 469 | /* Rounded sliders */ 470 | .slider.round { 471 | border-radius: 34px; 472 | } 473 | 474 | .slider.round:before { 475 | border-radius: 50%; 476 | } 477 | 478 | .toast-left { 479 | left: 20px; 480 | position: absolute; 481 | width: 80px !important; 482 | font: caption; 483 | box-shadow: none !important; 484 | color: #999; 485 | } 486 | 487 | .intro-page { 488 | display: flex; 489 | 490 | .slide.mac { 491 | margin: auto; 492 | padding: 0 !important; 493 | margin: 0 !important; 494 | width: 100vw !important; 495 | height: 100vh !important; 496 | } 497 | 498 | .slide { 499 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); 500 | border-radius: 5px; 501 | width: 95vw; 502 | height: 95vh; 503 | display: flex; 504 | background: rgb(213, 236, 255); 505 | margin: auto; 506 | 507 | .pane { 508 | margin: auto; 509 | font: caption; 510 | text-align: center; 511 | max-width: 75vh; 512 | position: relative; 513 | z-index: 1; 514 | 515 | 516 | img { 517 | width: auto; 518 | height: 130px; 519 | } 520 | 521 | h2 { 522 | color: #333; 523 | font-size: 25px; 524 | margin-bottom: 10px; 525 | } 526 | 527 | p { 528 | margin-top: 0px; 529 | font-size: 13px; 530 | color: #000; 531 | font-weight: 400; 532 | text-align: center; 533 | } 534 | 535 | .nav { 536 | padding-top: 5px; 537 | display: table; 538 | margin: 0 auto; 539 | transform: scale(.85); 540 | 541 | button { 542 | background: rgb(213, 236, 255); 543 | border: 3px solid #00aced; 544 | border-radius: 5px; 545 | padding: 10px 25px; 546 | outline: none; 547 | font-weight: bold; 548 | font-size: 14px; 549 | transition: ease all .2s; 550 | margin: 0 3px; 551 | } 552 | 553 | button:hover { 554 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); 555 | border-color: transparent; 556 | background: rgb(78, 78, 78); 557 | color: white; 558 | } 559 | 560 | button.close { 561 | background: #00aced; 562 | color: white; 563 | } 564 | } 565 | } 566 | } 567 | } 568 | 569 | span.key { 570 | background: #eee; 571 | border: 1px solid #999; 572 | color: #222; 573 | padding: 0px 5px; 574 | border-radius: 5px; 575 | font-weight: bold; 576 | line-height: 25px; 577 | } 578 | 579 | 580 | 581 | // particle effect 582 | 583 | .particle { 584 | position: absolute; 585 | z-index: 0; 586 | border-radius: 50%; 587 | } 588 | 589 | @for $i from 1 through 30 { 590 | @keyframes particle-animation-#{$i} { 591 | 100% { 592 | transform: translate3d((random(90) * 1vw), (random(90) * 1vh), (random(100) * 1px)); 593 | } 594 | } 595 | 596 | .particle:nth-child(#{$i}) { 597 | animation: particle-animation-#{$i} 60s infinite; 598 | $size: random(5) + 5 + px; 599 | opacity: random(100)/100; 600 | height: $size; 601 | width: $size; 602 | animation-delay: -$i * .2s; 603 | transform: translate3d((random(90) * 1vw), (random(90) * 1vh), (random(100) * 1px)); 604 | background: hsl(random(360), 70%, 50%); 605 | } 606 | } 607 | 608 | .tooltiptext { 609 | visibility: hidden; 610 | opacity: 0; 611 | max-width: 50px !important; 612 | min-width: 40px !important; 613 | background-color: $tooltip-bg; 614 | color: $tooltip-fg; 615 | text-align: center; 616 | border-radius: 3px; 617 | padding: 5px; 618 | z-index: 1 !important; 619 | font: caption; 620 | font-size: 13px; 621 | // transition: opacity .3s; 622 | text-align: center; 623 | text-overflow: ellipsis; 624 | box-shadow: 0 1px 3px $tooltip-shadow-color1, 0 1px 2px $tooltip-shadow-color2; 625 | pointer-events: none; 626 | } 627 | 628 | 629 | .tooltiptext p { 630 | text-overflow: ellipsis; 631 | overflow: hidden; 632 | white-space: nowrap; 633 | height: 100%; 634 | padding: 0; 635 | margin: 0; 636 | } 637 | 638 | .tooltiptext::first-letter { 639 | text-transform: capitalize; 640 | } 641 | 642 | .tooltiptext::after { 643 | content: " "; 644 | position: absolute; 645 | top: 100%; 646 | /* At the bottom of the tooltip */ 647 | left: 50%; 648 | margin-left: -5px; 649 | border-width: 5px; 650 | border-style: solid; 651 | border-color: $tooltip-bg transparent transparent transparent; 652 | } 653 | 654 | .tooltiptext.top::after { 655 | content: " "; 656 | position: absolute; 657 | top: initial; 658 | bottom: 100%; 659 | /* At the top of the tooltip */ 660 | left: 50%; 661 | margin-left: -5px; 662 | border-width: 5px; 663 | border-style: solid; 664 | border-color: transparent transparent $tooltip-bg transparent; 665 | } 666 | 667 | 668 | .tooltiptext.show { 669 | animation-name: tooltip; 670 | animation-delay: .7s; 671 | animation-duration: .3s; 672 | animation-fill-mode: forwards; 673 | } 674 | 675 | @keyframes tooltip { 676 | 0% { 677 | visibility: hidden; 678 | opacity: 0; 679 | } 680 | 681 | 100% { 682 | visibility: visible; 683 | opacity: 1; 684 | } 685 | } 686 | 687 | .tooltiptext.tether-out-of-bounds-top, 688 | .tooltiptext.tether-out-of-bounds-bottom { 689 | display: none; 690 | } 691 | 692 | // adds specific styling.. 693 | .mac-style 694 | { 695 | background: transparent !important; 696 | 697 | .tooltip.empty { 698 | transform: scale(.8); 699 | font-weight: lighter !important; 700 | border-color: rgba(255, 255, 255, .4) !important; 701 | } 702 | 703 | .app.empty::before { 704 | top: 2px !important; 705 | color: rgba(255, 255, 255, .4) !important; 706 | } 707 | .app.empty:hover::before { 708 | top: 2px !important; 709 | color: #00aced !important; 710 | } 711 | 712 | .app .icon { 713 | width: 48px !important; 714 | height: 48px !important; 715 | } 716 | 717 | 718 | } -------------------------------------------------------------------------------- /styles/toastify.min.css: -------------------------------------------------------------------------------- 1 | .toastify{font-family:Calibri, 'Lucida Grande', sans-serif;padding:12px 20px;color:#fff;display:inline-block;-webkit-box-shadow:0 3px 6px -1px rgba(0,0,0,0.12),0 10px 36px -4px rgba(77,96,232,0.3);box-shadow:0 3px 6px -1px rgba(0,0,0,0.12),0 10px 36px -4px rgba(77,96,232,0.3);background:linear-gradient(135deg, #73a5ff, #5477f5);position:fixed;opacity:0;-webkit-transition:all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1);transition:all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1);border-radius:2px;cursor:pointer;text-decoration:none;max-width:calc(50% - 20px);z-index:2147483647}.toastify.on{opacity:1}.toast-close{opacity:.4;padding:0 5px}.toastify-right{right:15px}.toastify-left{left:15px}.toastify-top{top:-150px}.toastify-bottom{bottom:-150px}.toastify-rounded{border-radius:25px}.toastify-avatar{width:1.5em;height:1.5em;margin:0 5px;border-radius:2px}@media only screen and (max-width: 360px){.toastify-left,.toastify-right{margin-left:auto;margin-right:auto;left:0;right:0;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}} 2 | /*# sourceMappingURL=toastify.min.css.map */ -------------------------------------------------------------------------------- /styles/toastify.min.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "AAAA,AAAA,SAAS,AAAA,CAAC,WAAW,CAAE,oCAAoC,CAAE,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE,IAAG,CAAC,gBAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAE,IAAG,CAAC,mBAAkB,CAAC,UAAU,CAAC,iDAA+C,CAAC,UAAU,CAAC,yCAAuC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAG,CAAC,mCAA6B,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAE,AAAD,AAAA,SAAS,AAAA,GAAG,AAAA,CAAC,OAAO,CAAC,CAAC,CAAE,AAAD,AAAA,YAAY,AAAA,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAE,AAAD,AAAA,eAAe,AAAA,CAAC,KAAK,CAAC,IAAI,CAAE,AAAD,AAAA,cAAc,AAAA,CAAC,IAAI,CAAC,IAAI,CAAE,AAAD,AAAA,aAAa,AAAA,CAAC,GAAG,CAAC,MAAM,CAAE,AAAD,AAAA,gBAAgB,AAAA,CAAC,MAAM,CAAC,MAAM,CAAE,AAAD,AAAA,iBAAiB,AAAA,CAAC,aAAa,CAAC,IAAI,CAAE,AAAD,AAAA,gBAAgB,AAAA,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAE,AAAD,MAAM,MAAM,MAAM,MAAM,SAAS,EAAE,KAAK,EAAC,AAAA,cAAc,CAAC,eAAe,AAAA,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAE", 4 | "sources": [ 5 | "toastify.scss" 6 | ], 7 | "names": [], 8 | "file": "toastify.min.css" 9 | } -------------------------------------------------------------------------------- /switch-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahkohd/switch-desktop/152d83ff4d6df20aab558189a24a1bbebf5bd671/switch-demo.gif -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "module": "commonjs", 5 | "outDir": "app", 6 | "removeComments": true, 7 | "rootDir": "src", 8 | "baseUrl": ".", 9 | "allowJs": true, 10 | "sourceMap": true, 11 | "paths": { 12 | "*": ["node_modules/*"] 13 | } 14 | }, 15 | "include": [ 16 | "./src/**/*" 17 | ] 18 | } --------------------------------------------------------------------------------