├── .gitignore ├── README.md ├── css.css ├── globals.css ├── index.html ├── keyfield.html ├── keyfield.js ├── kf.css ├── main.js ├── package-lock.json ├── package.json ├── popup.html ├── popup.js ├── popup_ex.css ├── renderer.js └── resc ├── branding ├── brand_ico.ico └── brand_png.png ├── fonts ├── FluentSystemIcons-Filled.ttf ├── FluentSystemIcons-Regular.ttf └── SegoeIcons.ttf └── imgs ├── copilot.svg ├── search ├── dark.svg └── light.svg └── weather ├── clearsky.svg ├── densedrizzle.svg ├── densefreezingdrizzle.svg ├── depositingrimefog.svg ├── foggy.svg ├── heavyfreezingrain.svg ├── heavyrain.svg ├── heavysnowfall.svg ├── heavysnowshowers.svg ├── lightdrizzle.svg ├── lightfreezingdrizzle.svg ├── lightfreezingrain.svg ├── mainlyclear.svg ├── moderatedrizzle.svg ├── moderaterain.svg ├── moderaterainshowers.svg ├── moderatesnowfall.svg ├── overcast.svg ├── partlycloudy.svg ├── slightrain.svg ├── slightrainshowers.svg ├── slightsnowfall.svg ├── slightsnowshowers.svg ├── snowgrains.svg ├── thunderstormwithhail.svg ├── thunderstormwithheavyhail.svg ├── thunderstormwithslighthail.svg └── violentrainshowers.svg /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 12Bar 2 | ![image](https://github.com/Futur3Sn0w/12Bar/assets/18166632/3283c03c-163f-4d4e-83c3-53f401cce2c2) 3 | TODO: Write howto/explainer :P 4 | For now, click Releases on the sidebar to download, or click Wiki at the top to view some more information! 5 |
6 | 7 | ## Installation: 8 | **Note:** The current version of 12Bar **requires** DesktopCoral to be installed to use it within apps. 9 | This won't be required forever, but the app's built-in docking functionality isn't quite ready yet! 10 | Follow the steps below to get started. 11 | 12 | 1. Download 12Bar and DesktopCoral: 13 | https://github.com/Futur3Sn0w/12Bar/releases/latest 14 | https://www.donationcoder.com/software/mouser/other-windows-apps/desktopcoral 15 | 16 | 2. Install and open DesktopCoral's options 17 | Change the options to match below: 18 | ![image](https://github.com/Futur3Sn0w/12Bar/assets/18166632/2cfbbd93-2b98-4e32-a4ee-f8b45156cf4e) 19 | 20 | 3. Run 12Bar! 21 | Running 12Bar before opening DesktopCoral will cause issues, so be sure to run it first! 22 | 23 | 24 | ## Options Popup 25 | You can change options within 12Bar or exit it from the options popup, which you can open at any time from the tray icon! 26 | Double-click it to jump to settings, or right click for more options. 27 | ![image](https://github.com/Futur3Sn0w/12Bar/assets/18166632/ee53d36f-fda4-48e4-ae28-938a581e6902) 28 | -------------------------------------------------------------------------------- /css.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | 5 | height: 100vh; 6 | width: 100vw; 7 | 8 | display: flex; 9 | align-items: center; 10 | justify-content: center; 11 | 12 | filter: blur(10px); 13 | transform: scale(.9); 14 | opacity: 0; 15 | 16 | overflow: hidden; 17 | color: var(--global-text); 18 | 19 | user-select: none !important; 20 | font-family: 'Segoe UI' !important; 21 | 22 | transition: .2s; 23 | transition-delay: .75s; 24 | } 25 | 26 | body.loaded { 27 | opacity: 1; 28 | filter: blur(0); 29 | transform: scale(1); 30 | } 31 | 32 | * { 33 | -webkit-user-drag: none !important; 34 | } 35 | 36 | /* :root, 37 | html, 38 | body { 39 | background-color: transparent !important; 40 | background: transparent !important; 41 | } */ 42 | 43 | body[popup] { 44 | background-color: var(--main-pill); 45 | } 46 | 47 | .backgroundFill { 48 | width: 100vw; 49 | height: 100vh; 50 | 51 | position: absolute; 52 | z-index: -10; 53 | transition: .4s; 54 | opacity: 0; 55 | } 56 | 57 | .backgroundFill.enabled { 58 | opacity: 1; 59 | } 60 | 61 | .main-sect { 62 | display: flex; 63 | 64 | position: absolute; 65 | } 66 | 67 | .center { 68 | position: absolute; 69 | z-index: 9; 70 | display: flex; 71 | align-items: center; 72 | justify-content: center; 73 | 74 | /* background-color: #fff !important; */ 75 | } 76 | 77 | .right { 78 | z-index: 10; 79 | right: 10px; 80 | font-weight: 500; 81 | height: 100%; 82 | 83 | display: flex; 84 | align-items: center; 85 | gap: 10px 86 | } 87 | 88 | .timeDate { 89 | font-size: 15px; 90 | 91 | display: flex; 92 | gap: 10px; 93 | align-items: center; 94 | padding: 0 8px; 95 | } 96 | 97 | .statIcons { 98 | font-size: 20px; 99 | 100 | display: flex; 101 | gap: 7px; 102 | align-items: center; 103 | padding: 0 8px; 104 | 105 | font-weight: lighter; 106 | font-family: FluentIcons-Reg; 107 | } 108 | 109 | .batteryIcn { 110 | font-size: 17px; 111 | font-family: SegoeSystemIcns !important; 112 | } 113 | 114 | .volIcon { 115 | font-size: 18px; 116 | font-family: SegoeSystemIcns !important; 117 | } 118 | 119 | .volIcon.mute { 120 | font-family: FluentIcons-Reg !important; 121 | } 122 | 123 | .wifiIcon.eth { 124 | font-size: 17px; 125 | font-family: SegoeSystemIcns !important; 126 | } 127 | 128 | .dropDownBtn { 129 | font-size: 14px; 130 | font-family: FluentIcons-Reg; 131 | } 132 | 133 | .dropDownBtn p { 134 | transition: .15s; 135 | } 136 | 137 | .dropDownBtn:active p { 138 | transform: scale(.8); 139 | } 140 | 141 | .profileBtn { 142 | border-radius: 100px !important; 143 | width: 40px; 144 | } 145 | 146 | .profileBtn.hide { 147 | display: none !important; 148 | } 149 | 150 | .profileImg { 151 | width: 35px; 152 | height: 35px; 153 | border-radius: 100px; 154 | background-color: white; 155 | 156 | transition: .15s; 157 | } 158 | 159 | .profileBtn:active .profileImg { 160 | transform: scale(.85); 161 | } 162 | 163 | .fiBtn { 164 | aspect-ratio: 1/1; 165 | display: flex; 166 | align-items: center; 167 | justify-content: center; 168 | 169 | position: relative; 170 | padding: 0 10px; 171 | } 172 | 173 | .frontItem { 174 | position: relative; 175 | 176 | display: flex; 177 | align-items: center; 178 | justify-content: center; 179 | } 180 | 181 | .frontItem:not(.restartable)::before { 182 | content: ""; 183 | width: 100%; 184 | height: 100%; 185 | 186 | position: absolute; 187 | z-index: -2; 188 | border: 1px solid transparent; 189 | transition: .2s; 190 | height: 40px; 191 | 192 | border-radius: 5px; 193 | } 194 | 195 | .frontItem:not(.restartable):hover::before { 196 | background-color: var(--btn-back); 197 | border-color: var(--btn-border); 198 | border-top-color: var(--btn-top-border); 199 | } 200 | 201 | .frontItem:not(.restartable):active::before { 202 | background-color: rgba(255, 255, 255, .1); 203 | } 204 | 205 | @keyframes shrinkOut { 206 | 0% { 207 | transform: scale(1); 208 | opacity: 1; 209 | } 210 | 211 | 99% { 212 | transform: scale(.8); 213 | opacity: 0; 214 | } 215 | 216 | 100% { 217 | transform: scale(1); 218 | opacity: 0; 219 | } 220 | } 221 | 222 | .mainBar { 223 | display: flex; 224 | align-items: center; 225 | width: fit-content; 226 | min-width: 450px; 227 | height: 38px; 228 | overflow: hidden; 229 | 230 | border: none !important; 231 | border-color: transparent !important; 232 | /* border-color: var(--btn-border); */ 233 | 234 | /* padding: 2px; */ 235 | border-radius: 100px; 236 | /* background-color: var(--main-pill); */ 237 | box-shadow: 0 2px 6px 0 var(--shadow-color); 238 | } 239 | 240 | .mainBar::before { 241 | content: ""; 242 | 243 | position: absolute; 244 | z-index: -2; 245 | 246 | width: 100%; 247 | height: 100%; 248 | background-color: var(--main-pill); 249 | border: 1px solid var(--btn-border); 250 | border-radius: inherit; 251 | box-sizing: border-box; 252 | 253 | opacity: .5; 254 | transition: .15s; 255 | } 256 | 257 | .mainBar:hover::before { 258 | opacity: .75; 259 | } 260 | 261 | .mainBar::after { 262 | content: ""; 263 | 264 | position: absolute; 265 | top: 0; 266 | left: 50%; 267 | transform: translateX(-50%); 268 | z-index: 1; 269 | 270 | width: calc(100% - 30px); 271 | height: 1px; 272 | background: linear-gradient(to right, transparent, white 20%, white 80%, transparent); 273 | border-radius: inherit; 274 | 275 | opacity: .15; 276 | } 277 | 278 | .mainBar:active::before, 279 | .mainBar:focus::before, 280 | .mainBar:focus-within::before { 281 | opacity: .7; 282 | } 283 | 284 | .mainBar.desktop .appIcn, 285 | .mainBar.desktop .appLabel, 286 | .appIcn.hide, 287 | .appLabel.hide { 288 | display: none; 289 | } 290 | 291 | .mainBar div { 292 | display: flex; 293 | align-items: center; 294 | justify-content: center; 295 | 296 | height: 100%; 297 | } 298 | 299 | .appIcn { 300 | background-color: var(--app-icon-plate); 301 | border-radius: 30px 0 0 30px; 302 | width: 47px; 303 | 304 | height: 31px !important; 305 | 306 | margin-right: -15px; 307 | } 308 | 309 | .aiImg { 310 | aspect-ratio: 1/1; 311 | height: 100% !important; 312 | width: 20px; 313 | /* background-color: rgba(255, 255, 255, 0.24); */ 314 | object-fit: contain; 315 | 316 | margin-left: -10px; 317 | } 318 | 319 | .appLabel { 320 | background-color: var(--app-label-plate); 321 | border-radius: 100px; 322 | 323 | font-size: 14px; 324 | color: var(--app-label-text); 325 | 326 | display: flex; 327 | align-items: center; 328 | justify-content: center; 329 | gap: 5px; 330 | 331 | padding: 0 15px; 332 | } 333 | 334 | .appLabel.notitle { 335 | gap: 0; 336 | } 337 | 338 | .appLabel.notitle .sep { 339 | display: none; 340 | } 341 | 342 | .appLabel p { 343 | opacity: .75; 344 | } 345 | 346 | .appLabel p.title { 347 | max-width: 450px; 348 | white-space: nowrap; 349 | overflow: hidden; 350 | text-overflow: ellipsis; 351 | } 352 | 353 | .search { 354 | height: 100%; 355 | width: max-content; 356 | color: var(--app-label-text); 357 | 358 | justify-content: flex-start !important; 359 | 360 | margin-right: auto; 361 | padding-right: 10px; 362 | } 363 | 364 | .search .icn { 365 | position: relative; 366 | height: 100%; 367 | width: 45px; 368 | font-family: FluentIcons-Fill; 369 | font-size: 20px; 370 | /* background-color: white; */ 371 | border-radius: 100%; 372 | 373 | display: flex; 374 | text-align: center; 375 | align-items: center; 376 | justify-content: center; 377 | opacity: .25; 378 | } 379 | 380 | .search .icn.img { 381 | color: transparent; 382 | opacity: 1; 383 | } 384 | 385 | .search .icn img { 386 | position: absolute; 387 | width: 20px; 388 | transition: .15s; 389 | opacity: 0; 390 | } 391 | 392 | .search .icn.img img { 393 | opacity: 1; 394 | } 395 | 396 | .mainBar:active .search .icn img { 397 | transform: scale(.8); 398 | } 399 | 400 | .search .searchBox { 401 | height: fit-content; 402 | 403 | width: max-content; 404 | border: none; 405 | padding: 0; 406 | margin: 0; 407 | margin-left: -5px; 408 | margin-top: -1px; 409 | 410 | color: var(--app-label-text); 411 | opacity: .5; 412 | font-size: 13px; 413 | font-family: 'Segoe UI Variable Small'; 414 | 415 | display: flex; 416 | justify-content: start; 417 | } 418 | 419 | .mainBar.desktop .search .searchBox { 420 | width: 350px; 421 | } 422 | 423 | .left { 424 | display: flex; 425 | align-items: center; 426 | justify-content: center; 427 | gap: 5px; 428 | 429 | position: absolute; 430 | left: 10px; 431 | } 432 | 433 | .left .weather { 434 | display: flex; 435 | align-items: center; 436 | gap: 5px; 437 | 438 | box-sizing: border-box; 439 | font-size: 16px; 440 | 441 | padding: 3px 10px 3px 2px; 442 | /* height: fit-content !important; */ 443 | } 444 | 445 | .weather:active .wicon { 446 | transform: scale(.8); 447 | } 448 | 449 | .wicon { 450 | width: 35px; 451 | object-fit: contain; 452 | object-position: center; 453 | transition: .15s; 454 | } 455 | 456 | .wtemp { 457 | font-weight: 500; 458 | } 459 | 460 | .wfeel { 461 | font-weight: 400; 462 | opacity: .5; 463 | width: max-content; 464 | } 465 | 466 | .left .copilot { 467 | display: flex; 468 | padding: 0 8px; 469 | } 470 | 471 | .left .copilot.user-disable, 472 | .left .copilot.unsupported { 473 | display: none; 474 | } 475 | 476 | .left .copilot:active img { 477 | transform: scale(.8); 478 | } 479 | 480 | .left .copilot img { 481 | transition: .2s; 482 | width: 25px; 483 | } -------------------------------------------------------------------------------- /globals.css: -------------------------------------------------------------------------------- 1 | /* I usually hate doing globals because it just feels 2 | janky, but for maximum realism; here we go! */ 3 | 4 | :root { 5 | --global-text: #FFF; 6 | 7 | --btn-back: rgba(255, 255, 255, .05); 8 | --btn-border: rgba(255, 255, 255, .05); 9 | --btn-top-border: rgba(255, 255, 255, .1); 10 | 11 | --main-pill: rgba(22, 22, 22, 0.75); 12 | --app-icon-plate: rgba(255, 255, 255, 0.1); 13 | --app-label-plate: black; 14 | --app-label-text: white; 15 | --surface-text: white; 16 | 17 | --popup-back: hsl(0, 0%, 96%); 18 | --popup-btn: white; 19 | --popup-btn-checked: #047CD6; 20 | --popup-btn-hover: #f7f7f7; 21 | --popup-btn-border: #EDEDED; 22 | --popup-btn-border-bottom: #D3D3D3; 23 | --popup-footer: hsl(0, 0%, 93%); 24 | --popup-surface-text: black; 25 | } 26 | 27 | .dark-theme { 28 | --main-pill: #222222bf; 29 | --app-icon-plate: rgba(255, 255, 255, 0.1); 30 | --app-label-plate: #222222; 31 | --app-label-text: white; 32 | --surface-text: white; 33 | 34 | --btn-back: rgba(255, 255, 255, .05); 35 | --btn-border: rgba(255, 255, 255, .05); 36 | --btn-top-border: rgba(255, 255, 255, .1); 37 | 38 | --popup-back: rgb(42, 42, 42); 39 | --popup-btn: #373737; 40 | --popup-btn-checked: #047CD6; 41 | --popup-btn-hover: #3C3C3C; 42 | --popup-btn-border: #444444; 43 | --popup-btn-border-bottom: #484848; 44 | --popup-sect: #ffffff10; 45 | --popup-footer: #202020; 46 | --popup-surface-text: white; 47 | --imgFilter: brightness(100) contrast(0) saturate(100) brightness(100); 48 | } 49 | 50 | .light-theme { 51 | --main-pill: #ffffffbf; 52 | --app-icon-plate: rgba(0, 0, 0, 0.1); 53 | --app-label-plate: #fefefe; 54 | --app-label-text: black; 55 | --surface-text: black; 56 | 57 | --btn-back: rgba(255, 255, 255, .25); 58 | --btn-border: rgba(255, 255, 255, .025); 59 | --btn-top-border: rgba(255, 255, 255, .075); 60 | 61 | --popup-back: hsl(0, 0%, 96%); 62 | --popup-btn: white; 63 | --popup-btn-checked: #047CD6; 64 | --popup-btn-hover: #f7f7f7; 65 | --popup-btn-border: #EDEDED; 66 | --popup-btn-border-bottom: #D3D3D3; 67 | --popup-sect: #e7e6e6; 68 | --popup-footer: hsl(0, 0%, 93%); 69 | --popup-surface-text: black; 70 | --imgFilter: brightness(100) contrast(0) saturate(100) brightness(100) invert(1); 71 | } 72 | 73 | @font-face { 74 | font-family: FluentIcons-Fill; 75 | src: url('resc/fonts/FluentSystemIcons-Filled.ttf'); 76 | } 77 | 78 | @font-face { 79 | font-family: FluentIcons-Reg; 80 | src: url('resc/fonts/FluentSystemIcons-Regular.ttf'); 81 | } 82 | 83 | @font-face { 84 | font-family: SegoeSystemIcns; 85 | src: url('resc/fonts/SegoeIcons.ttf'); 86 | } -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 14 | 15 |
16 |
17 |
18 | 19 |
Loading...
20 |
21 |
22 |
23 | 24 |
25 |
26 |
27 |
28 | 35 |
36 | 37 |
38 |
39 |

40 |
-
41 |

42 |
43 |
44 |
45 |
46 | 49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | 60 |
61 |
62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /keyfield.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |

18 | Hey there! 19 |

20 |

21 | It looks like this is your first time using 12Bar. Welcome! 22 |
23 | This is a very early beta, things are bound to be incorrect, broken, or just missing. 24 |
25 | Thanks for testing! 26 |

27 |
Okay
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /keyfield.js: -------------------------------------------------------------------------------- 1 | const { ipcRenderer } = require('electron') 2 | const $ = require('jquery'); 3 | 4 | $('.saveBtn').on('click', function () { 5 | window.close(); 6 | localStorage.setItem('oobe', 'done') 7 | }) 8 | 9 | $('.quitBtn').on('click', function () { 10 | ipcRenderer.send('exit'); 11 | }) -------------------------------------------------------------------------------- /kf.css: -------------------------------------------------------------------------------- 1 | body { 2 | display: flex; 3 | flex-direction: column; 4 | gap: 5px; 5 | 6 | font-family: 'Segoe UI'; 7 | 8 | width: 100vw; 9 | height: 100vh; 10 | overflow: hidden; 11 | box-sizing: border-box; 12 | 13 | margin: 0; 14 | padding: 10px; 15 | user-select: none; 16 | 17 | background-color: var(--popup-back); 18 | color: var(--popup-surface-text); 19 | --webkit-app-region: no-drag; 20 | } 21 | 22 | p { 23 | margin: 0; 24 | padding: 0; 25 | } 26 | 27 | p.header { 28 | font-size: 22px; 29 | font-weight: bold; 30 | 31 | width: calc(100vw - 8px); 32 | margin-top: -6px; 33 | padding: 2px 10px; 34 | margin-left: -6px; 35 | box-sizing: border-box; 36 | border-radius: 5px; 37 | 38 | background-color: var(--popup-btn-border); 39 | --webkit-app-region: drag; 40 | } 41 | 42 | p.subhead { 43 | font-family: 'Segoe UI Variable Small'; 44 | font-size: 12.5px; 45 | padding: 4px 0; 46 | } 47 | 48 | .hide { 49 | display: none; 50 | } 51 | 52 | .keyTB { 53 | width: 80%; 54 | margin: 0 auto; 55 | background-color: var(--popup-btn); 56 | box-sizing: border-box; 57 | 58 | outline: none !important; 59 | 60 | font-family: monospace; 61 | color: var(--popup-surface-text); 62 | border: 1px solid transparent; 63 | border-top-color: var(--popup-btn-border-bottom); 64 | border-color: var(--popup-btn-border); 65 | border-radius: 5px; 66 | 67 | padding: 3px 5px; 68 | 69 | transition: .15s; 70 | } 71 | 72 | .keyTB:focus { 73 | background-color: var(--popup-btn-hover); 74 | } 75 | 76 | .kfBtn { 77 | width: fit-content; 78 | position: absolute; 79 | bottom: 10px; 80 | right: 10px; 81 | 82 | padding: 5px 10px; 83 | font-size: 13px; 84 | border-radius: 5px; 85 | box-sizing: border-box; 86 | 87 | background-color: var(--popup-btn); 88 | 89 | border: 1px solid transparent; 90 | border-top-color: var(--popup-btn-border-bottom); 91 | border-color: var(--popup-btn-border); 92 | 93 | transition: .15s; 94 | } 95 | 96 | .kfBtn:hover { 97 | background-color: var(--popup-btn-hover); 98 | } 99 | 100 | .kfBtn:active { 101 | padding: 6.5px 13.5px; 102 | font-size: 10px; 103 | } 104 | 105 | .kfBtn.quitBtn { 106 | right: unset; 107 | left: 10px; 108 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "12bar", 3 | "version": "0.2.0", 4 | "description": "An Electron-based replica of the leaked Windows 12 topchrome UI.", 5 | "main": "main.js", 6 | "scripts": { 7 | "start": "electron .", 8 | "start-with-warnings": "electron . --trace-warnings", 9 | "start-debug": "electron . --inspect", 10 | "build": " electron-builder --win --x64", 11 | "rebuild": ".\\node_modules\\.bin\\electron-rebuild.cmd" 12 | }, 13 | "author": "Futur3Sn0w", 14 | "license": "ISC", 15 | "devDependencies": { 16 | "electron": "^26.2.1", 17 | "electron-rebuild": "^3.2.9" 18 | }, 19 | "dependencies": { 20 | "@electron/remote": "^2.0.12", 21 | "@lwahonen/ffi-napi": "^4.0.12", 22 | "@lwahonen/ref-napi": "^4.0.8", 23 | "@nut-tree/nut-js": "^3.1.2", 24 | "active-win": "^8.1.0", 25 | "electron-acrylic-window": "^0.5.11", 26 | "electron-store": "^8.1.0", 27 | "ffi-napi": "^4.0.3", 28 | "file-icon-info": "^1.1.1", 29 | "jquery": "^3.7.1", 30 | "node-gyp-build": "^4.6.1", 31 | "ps-list": "^8.1.1", 32 | "ref-napi": "^3.0.3", 33 | "robotjs": "^0.6.0", 34 | "wifi-name": "^3.1.1", 35 | "win-audio": "^2.0.2" 36 | }, 37 | "build": { 38 | "directories": { 39 | "output": "../build" 40 | }, 41 | "win": { 42 | "icon": "resc/branding/brand_png.png" 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12Bar Options 8 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 18 | 19 |
20 |
21 |
22 | 23 |
24 |
25 |
26 | 27 |
28 |
29 | 30 |
31 | 32 |
33 | 34 | 38 |
39 |
40 | 41 |
42 |
43 | 44 |
45 |
46 |
47 | 48 |
49 |
50 |
51 | 52 |
53 |
54 | 55 |
56 |
57 |
58 | 59 |
60 |
61 |
62 |
63 | 64 |
65 |
66 |
67 | 68 |
69 | 70 | 71 |
72 |
73 |
74 | 75 |
76 |
77 |
78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /popup.js: -------------------------------------------------------------------------------- 1 | const { shell, ipcRenderer } = require('electron') 2 | const $ = require('jquery'); 3 | const remote = require('@electron/remote'); 4 | var bg = localStorage.getItem('background'); 5 | var themePreference = localStorage.getItem('themePreference'); 6 | var searchPref = localStorage.getItem('searchPref'); 7 | var userMenu = localStorage.getItem('userMenuPref'); 8 | var tempUnit = localStorage.getItem('tempUnit'); 9 | var userCopilot = localStorage.getItem('user-copilot'); 10 | var altSearch = localStorage.getItem('altSearch'); 11 | 12 | const os = require('os'); 13 | 14 | $(window).on('load', function () { 15 | var userImg = localStorage.getItem('userImgPath'); 16 | var username = os.userInfo().username; 17 | 18 | ipcRenderer.send('get-appver') 19 | ipcRenderer.send('checkCopilot'); 20 | 21 | if (bg == 'true') { 22 | $('.backgroundCB').attr('checked', true) 23 | } 24 | 25 | if (themePreference) { 26 | $(':root').addClass(themePreference); 27 | $('.themeCB').prop('checked', themePreference === 'dark-theme'); 28 | } 29 | 30 | if (tempUnit == 'f') { 31 | $('.tempUnitCB').prop('checked', true) 32 | $('.tempUnitBtn .tuTemp').text('°F'); 33 | } else if (tempUnit == 'c') { 34 | $('.tempUnitCB').prop('checked', false) 35 | $('.tempUnitBtn .tuTemp').text('°C'); 36 | } 37 | 38 | if (searchPref == 'true') { 39 | $('.searchToggleCB').attr('checked', true); 40 | } 41 | 42 | if (userMenu == 'true') { 43 | $('.userimgCB').attr('checked', true); 44 | } else if (userMenu == 'false') { 45 | $('.userimgCB').attr('checked', false); 46 | } 47 | 48 | if (userCopilot == 'true') { 49 | $('.copilotCB').attr('checked', true) 50 | } 51 | 52 | if (altSearch == 'y') { 53 | $('.searchProvCB').attr('checked', true) 54 | } 55 | 56 | $('.userImg').attr('src', userImg); 57 | $('.username').text(username); 58 | if (themePreference) { 59 | $('.searchImg').attr('src', 'resc/imgs/search/' + themePreference.replace('-theme', '') + '.svg') 60 | } 61 | 62 | ipcRenderer.send('cwin-ready', -8); 63 | }) 64 | 65 | ipcRenderer.on('got-appver', (_event, ver) => { 66 | $('.username').attr("label", ' v' + ver); 67 | }) 68 | 69 | ipcRenderer.on('no-copilot', function () { 70 | $('.copilotBtn').addClass('hide'); 71 | }) 72 | 73 | $('.copilotBtn').on('click', function () { 74 | localStorage.setItem('user-copilot', $('.copilotCB').is(':checked')) 75 | if (localStorage.getItem('user-copilot') == 'true') { 76 | ipcRenderer.send('user-enable-copilot') 77 | } else if (localStorage.getItem('user-copilot') == 'false') { 78 | ipcRenderer.send('user-disable-copilot') 79 | } 80 | }) 81 | 82 | $('.refreshBtn').on('click', function () { 83 | if ($('.refreshBtn').hasClass('debug')) { 84 | ipcRenderer.send('devTools'); 85 | } else { 86 | ipcRenderer.send('hotKey', 'ctrl', 'r'); 87 | } 88 | }) 89 | 90 | $('.tempUnitBtn').on('click', function () { 91 | var newTempUnitPref = $('.tempUnitCB').is(':checked') ? 'f' : 'c'; 92 | localStorage.setItem('tempUnit', newTempUnitPref); 93 | if (newTempUnitPref == 'f') { 94 | $('.tempUnitBtn .tuTemp').text('°F'); 95 | } else if (newTempUnitPref == 'c') { 96 | $('.tempUnitBtn .tuTemp').text('°C'); 97 | } 98 | ipcRenderer.send('hotKey', 'ctrl', 'r'); 99 | }) 100 | 101 | $('.backgroundCB').on('click', function () { 102 | ipcRenderer.send('toggleBackground'); 103 | localStorage.setItem('background', $('.backgroundCB').is(':checked')) 104 | }) 105 | 106 | $('.themeCB').on('click', function () { 107 | $(':root').toggleClass('light-theme dark-theme'); 108 | var newThemePref = $(':root').hasClass('light-theme') ? 'light-theme' : 'dark-theme'; 109 | var themeToSend = $(':root').hasClass('light-theme') ? 'light' : 'dark'; 110 | localStorage.setItem('themePreference', newThemePref); 111 | ipcRenderer.send('toggleTheme', themeToSend); 112 | }); 113 | 114 | $('.searchToggleCB').on('click', function () { 115 | ipcRenderer.send('toggleSearch'); 116 | var searchStat = $('.searchToggleCB').is(':checked') ? 'true' : 'false'; 117 | localStorage.setItem('searchPref', searchStat); 118 | }); 119 | 120 | $('.userimgBtn').on('click', function () { 121 | ipcRenderer.send('toggleUserMenu'); 122 | var userMenuPref = $('.userimgCB').is(':checked') ? 'true' : 'false'; 123 | localStorage.setItem('userMenuPref', userMenuPref); 124 | }); 125 | 126 | $('.searchProvCB').on('click', function () { 127 | var newSearchProvPref = $('.searchProvCB').is(':checked') ? 'y' : 'n'; 128 | localStorage.setItem('altSearch', newSearchProvPref); 129 | ipcRenderer.send('hotKey', 'ctrl', 'r'); 130 | }) 131 | 132 | $('.exitBtn').on('click', function () { 133 | ipcRenderer.send('exit'); 134 | }) 135 | 136 | ipcRenderer.on("before-input-event", (event, input) => { 137 | localStorage.setItem('ctrl', input.control) 138 | }); 139 | 140 | $('.resetBtn').on('click', function () { 141 | var ctrl = localStorage.getItem('ctrl') 142 | if (ctrl == 'true') { 143 | ipcRenderer.send('reset-app') 144 | } else { 145 | alert('In order to prevent accidental presses, hold the Ctrl key before clicking this to reset 12Bar.') 146 | } 147 | }); 148 | 149 | $('.popupCloseBtn').on('click', function () { 150 | window.close(); 151 | }) 152 | 153 | ipcRenderer.on('refresh', function () { 154 | location.reload(); 155 | }) 156 | 157 | $('.btn1').on('click', function () { 158 | ipcRenderer.send('hotKey', 'command', 'i'); 159 | }) 160 | 161 | $('.btn2').on('click', function () { 162 | if ($('.btn2').attr('btnTxt') == 'Dev tools') { 163 | ipcRenderer.send('devTools') 164 | } else { 165 | ipcRenderer.send('show-popup'); 166 | } 167 | }) 168 | 169 | $('.btn3').on('click', function () { 170 | ipcRenderer.send('power-dialog'); 171 | }) 172 | 173 | $('.btnSubCont label').on('click', function () { 174 | if ($(this).parent().hasClass('expand')) { 175 | $(this).parent().removeClass('expand'); 176 | } else { 177 | $('.btnSubCont.expand').removeClass('expand'); 178 | $(this).parent().addClass('expand'); 179 | } 180 | let newHeight; 181 | 182 | // setTimeout(() => { 183 | if ($('.btnSubCont').hasClass('expand')) { 184 | newHeight = Math.round($(this).parent().height() - 28); 185 | } else { 186 | newHeight = -8; 187 | } 188 | ipcRenderer.send('cwin-ready', newHeight); 189 | // }, 150); 190 | }) 191 | 192 | $('.userImgDiv').on('mouseover', function () { 193 | $('.userArea').addClass('uiHover') 194 | }) 195 | 196 | $('.userImgDiv').on('mouseout', function () { 197 | $('.userArea').removeClass('uiHover') 198 | 199 | }) 200 | 201 | $('.userImgDiv').on('click', function () { 202 | ipcRenderer.send('open-yourinfo'); 203 | }) 204 | 205 | ipcRenderer.on('before-input-event', (_event, input) => { 206 | if (input.control) { 207 | $('.btn2').attr('btnTxt', 'Dev tools').text('') 208 | } else { 209 | $('.btn2').attr('btnTxt', 'Refresh 12Bar').text('') 210 | } 211 | }) -------------------------------------------------------------------------------- /popup_ex.css: -------------------------------------------------------------------------------- 1 | body { 2 | /* background-color: var(--popup-back) !important; */ 3 | background-color: transparent !important; 4 | color: var(--popup-surface-text); 5 | 6 | box-sizing: border-box; 7 | 8 | display: flex; 9 | flex-direction: column; 10 | justify-content: start; 11 | } 12 | 13 | .titleBar { 14 | display: flex; 15 | align-items: center; 16 | width: 100%; 17 | height: 35px; 18 | box-sizing: border-box; 19 | padding-left: 10px; 20 | 21 | background-color: var(--popup-footer); 22 | color: var(--popup-surface-text); 23 | font-size: 13px; 24 | font-family: 'Segoe UI Variable Small'; 25 | 26 | position: absolute; 27 | top: 0; 28 | left: 0; 29 | 30 | -webkit-app-region: drag; 31 | } 32 | 33 | .popupCloseBtn { 34 | width: 45px; 35 | height: 35px; 36 | 37 | position: absolute; 38 | top: 0; 39 | right: 0; 40 | 41 | display: flex; 42 | align-items: center; 43 | justify-content: center; 44 | 45 | font-family: SegoeSystemIcns; 46 | color: var(--popup-surface-text); 47 | font-size: 10px; 48 | transition: .15s; 49 | 50 | -webkit-app-region: no-drag; 51 | } 52 | 53 | .popupCloseBtn:hover { 54 | color: white; 55 | background-color: #e81123; 56 | } 57 | 58 | .userArea { 59 | width: 100%; 60 | height: 103px; 61 | 62 | box-sizing: border-box; 63 | display: flex; 64 | gap: 5px; 65 | position: relative; 66 | } 67 | 68 | .username { 69 | font-family: 'Segoe UI'; 70 | font-size: 17px; 71 | font-weight: 700; 72 | 73 | position: absolute; 74 | top: 5px; 75 | left: 103px; 76 | z-index: 13; 77 | 78 | display: flex; 79 | justify-content: flex-start; 80 | 81 | padding: 5px 0; 82 | width: 100% - 191px; 83 | box-sizing: border-box; 84 | /* border-radius: 10px 0 0 0; */ 85 | } 86 | 87 | .username::before { 88 | content: 'Click to open account settings'; 89 | position: absolute; 90 | top: 27px; 91 | left: 0; 92 | z-index: 12; 93 | 94 | width: max-content; 95 | box-sizing: border-box; 96 | border-radius: 50px; 97 | 98 | font-size: 12px; 99 | font-weight: normal; 100 | transition: .2s; 101 | opacity: 0; 102 | } 103 | 104 | .userArea.uiHover .username::before { 105 | opacity: 1; 106 | } 107 | 108 | .username::after { 109 | content: '12Bar' attr(label); 110 | position: absolute; 111 | top: 27px; 112 | left: 0; 113 | z-index: 12; 114 | 115 | width: max-content; 116 | box-sizing: border-box; 117 | border-radius: 50px; 118 | 119 | font-size: 12px; 120 | font-weight: normal; 121 | transition: .2s; 122 | opacity: .75; 123 | } 124 | 125 | .userArea.uiHover .username::after { 126 | opacity: 0; 127 | } 128 | 129 | .userImgDiv { 130 | display: flex; 131 | width: min-content; 132 | height: 100%; 133 | position: relative; 134 | margin-right: auto; 135 | margin-left: 8px; 136 | margin-top: 8px; 137 | 138 | /* -webkit-mask-image: linear-gradient(to right, transparent, black); */ 139 | /* mask-image: linear-gradient(to right, transparent, black); */ 140 | } 141 | 142 | .userImg { 143 | height: calc(100% - 16px); 144 | border-radius: 7px; 145 | aspect-ratio: 1/1; 146 | object-fit: contain; 147 | 148 | transition: .2s; 149 | } 150 | 151 | .userImg:active { 152 | transform: scale(.95); 153 | } 154 | 155 | 156 | .buttons { 157 | width: 100%; 158 | height: 30px; 159 | display: flex; 160 | /* flex-direction: column; */ 161 | box-sizing: border-box; 162 | gap: 1px; 163 | 164 | margin-top: auto; 165 | margin-bottom: 8px; 166 | margin-left: auto; 167 | margin-right: 8px; 168 | /* padding: 8px; */ 169 | padding-bottom: 0; 170 | /* position: absolute; */ 171 | /* left: 5px; */ 172 | /* bottom: 5px; */ 173 | /* z-index: 14; */ 174 | } 175 | 176 | .button { 177 | width: 30px; 178 | height: 30px; 179 | 180 | border-radius: 5px; 181 | border: 1px solid transparent; 182 | font-size: 14px; 183 | font-family: SegoeSystemIcns; 184 | 185 | transition: .15s; 186 | 187 | box-sizing: border-box; 188 | padding: 3px 8px; 189 | padding-left: 7px; 190 | box-sizing: border-box; 191 | 192 | display: flex; 193 | align-items: center; 194 | justify-content: center; 195 | gap: 7px; 196 | } 197 | 198 | .button::after { 199 | /* content: attr(btnTxt); */ 200 | font-size: 12px; 201 | font-family: 'Segoe UI Variable Small'; 202 | } 203 | 204 | .button:hover { 205 | background-color: var(--btn-back); 206 | border-color: var(--btn-border); 207 | border-bottom-color: var(--btn-top-border); 208 | } 209 | 210 | .button:active { 211 | font-size: 12px; 212 | } 213 | 214 | .btn3 { 215 | margin-left: auto; 216 | } 217 | 218 | .btnContainer { 219 | width: 100%; 220 | height: fit-content; 221 | /* max-height: 100%; */ 222 | flex-shrink: 0; 223 | 224 | gap: 5px; 225 | display: flex; 226 | flex-direction: column; 227 | align-items: center; 228 | justify-content: flex-start; 229 | 230 | box-sizing: border-box; 231 | padding: 0 8px; 232 | margin-top: 0; 233 | } 234 | 235 | .btnContainer::-webkit-scrollbar { 236 | display: none !important; 237 | opacity: 0 !important; 238 | width: 0 !important; 239 | } 240 | 241 | .btnSubCont { 242 | height: fit-content; 243 | max-height: 40px; 244 | width: 100%; 245 | 246 | position: relative; 247 | overflow: hidden; 248 | border-radius: 7px; 249 | background-color: var(--popup-footer); 250 | 251 | gap: 5px; 252 | display: flex; 253 | flex-direction: column; 254 | align-items: flex-end; 255 | justify-content: flex-start; 256 | 257 | box-sizing: border-box; 258 | padding: 10px; 259 | /* transition: .2s; */ 260 | } 261 | 262 | .btnSubCont::before { 263 | content: ''; 264 | width: 100%; 265 | height: 34px; 266 | flex-shrink: 0; 267 | } 268 | 269 | .btnSubCont.expand { 270 | max-height: 200px; 271 | } 272 | 273 | .btnSubCont label { 274 | font-size: 15px; 275 | font-family: 'Segoe UI Variable Small'; 276 | font-weight: 500; 277 | align-self: flex-start; 278 | box-sizing: border-box; 279 | padding: 5px 12px; 280 | 281 | display: flex; 282 | align-items: center; 283 | 284 | position: absolute; 285 | top: 0; 286 | left: 0; 287 | width: 100%; 288 | height: 40px; 289 | background-color: var(--popup-sect); 290 | } 291 | 292 | .btnSubCont label::after { 293 | content: ""; 294 | font-size: 14px; 295 | font-family: FluentIcons-Reg, 'Segoe UI'; 296 | position: absolute; 297 | z-index: 1; 298 | left: 251px; 299 | top: 12px; 300 | transition: .15s; 301 | 302 | display: flex; 303 | align-items: center; 304 | justify-content: center; 305 | } 306 | 307 | .btnSubCont label::before { 308 | content: attr(num); 309 | font-size: 12px; 310 | font-family: FluentIcons-Reg, 'Segoe UI'; 311 | position: absolute; 312 | left: 230px; 313 | top: 7px; 314 | transition: .15s; 315 | 316 | display: flex; 317 | align-items: center; 318 | justify-content: center; 319 | 320 | background-color: var(--popup-btn-hover); 321 | box-sizing: border-box; 322 | padding: 4px 29px 4px 10px; 323 | border-radius: 50px; 324 | } 325 | 326 | .btnSubCont.expand label::after { 327 | transform: rotate(180deg); 328 | } 329 | 330 | .btnSubCont label:active::after { 331 | transform: scale(.8); 332 | } 333 | 334 | .btnSubCont.expand label:active::after { 335 | transform: rotate(180deg) scale(.8); 336 | } 337 | 338 | .fiBtn { 339 | width: 35px; 340 | height: 35px; 341 | flex-shrink: 0; 342 | border-radius: 5px; 343 | padding: 0; 344 | margin: 0; 345 | /* transform: translateY(-10px); */ 346 | border: 1px solid transparent; 347 | box-sizing: border-box; 348 | /* background-color: purple; */ 349 | } 350 | 351 | .fiBtn .icon { 352 | pointer-events: none !important; 353 | transition: .1s; 354 | position: relative; 355 | z-index: 1; 356 | font-family: FluentIcons-Reg; 357 | font-size: 18px; 358 | 359 | position: absolute; 360 | left: 0; 361 | transform: translateX(-225px); 362 | } 363 | 364 | .fiBtn:active i { 365 | transform: scale(.8); 366 | } 367 | 368 | .fiBtn::after { 369 | content: attr(label); 370 | position: absolute; 371 | left: 0; 372 | transform: translateX(-200px); 373 | /* bottom: 50%; */ 374 | font-size: 12.5px; 375 | font-weight: 400; 376 | width: max-content; 377 | 378 | font-family: 'Segoe UI Variable Small'; 379 | 380 | pointer-events: none; 381 | } 382 | 383 | .restartable::before { 384 | content: 'Will restart 12Bar' !important; 385 | font-size: 10px; 386 | font-family: 'Segoe UI Variable Small'; 387 | opacity: .75; 388 | 389 | position: absolute !important; 390 | bottom: 2px !important; 391 | left: -200px !important; 392 | 393 | width: max-content !important; 394 | height: min-content; 395 | } 396 | 397 | .restartable::after { 398 | top: 2px; 399 | } 400 | 401 | input[type="checkbox"] { 402 | appearance: none; 403 | margin: 0; 404 | padding: 0; 405 | box-sizing: border-box; 406 | 407 | width: 100%; 408 | height: 100%; 409 | 410 | position: absolute; 411 | z-index: 0; 412 | top: 0; 413 | left: 0; 414 | 415 | display: flex; 416 | align-items: center; 417 | justify-content: center; 418 | 419 | font-family: SegoeSystemIcns; 420 | 421 | border-radius: inherit; 422 | 423 | border: 1px solid transparent; 424 | border-color: var(--popup-btn-border); 425 | border-bottom-color: var(--popup-btn-border-bottom); 426 | background-color: var(--popup-btn); 427 | 428 | transition: .15s; 429 | } 430 | 431 | input[type="checkbox"]::before { 432 | content: ''; 433 | font-size: 14px; 434 | color: var(--popup-surface-text); 435 | transition: .15s; 436 | } 437 | 438 | input[type="checkbox"]:checked::before { 439 | content: ''; 440 | color: white; 441 | } 442 | 443 | .themeBtn input[type="checkbox"]::before { 444 | content: ''; 445 | } 446 | 447 | .themeBtn input[type="checkbox"]:checked::before { 448 | content: ''; 449 | } 450 | 451 | .fiBtn:active input[type="checkbox"]::before { 452 | transform: scale(.75); 453 | } 454 | 455 | input[type="checkbox"]:checked { 456 | background-color: var(--popup-btn-checked); 457 | } 458 | 459 | .copilotBtn .icon { 460 | width: 19px; 461 | } 462 | 463 | .copilotBtn.hide { 464 | display: none; 465 | } 466 | 467 | .bsc2 * .icon { 468 | font-family: SegoeSystemIcns !important; 469 | } 470 | 471 | .tempUnitCB { 472 | display: flex; 473 | background-color: var(--popup-btn) !important; 474 | } 475 | 476 | .tempUnitCB::before { 477 | content: '' !important; 478 | } 479 | 480 | .tuTemp { 481 | display: flex; 482 | font-family: 'Segoe UI Variable Small' !important; 483 | color: var(--popup-surface-text) !important; 484 | z-index: 10; 485 | pointer-events: none; 486 | transition: .15s; 487 | } 488 | 489 | .tempUnitBtn:active .tuTemp { 490 | transform: scale(.75); 491 | } -------------------------------------------------------------------------------- /renderer.js: -------------------------------------------------------------------------------- 1 | const { ipcRenderer, ipcMain, net } = require('electron') 2 | const { exec } = require('child_process'); 3 | const os = require('os'); 4 | const $ = require('jquery'); 5 | 6 | var bg = localStorage.getItem('background'); 7 | var lat = localStorage.getItem('locLat'); 8 | var lon = localStorage.getItem('locLon'); 9 | var themePreference = localStorage.getItem('themePreference'); 10 | var altSearch = localStorage.getItem('altSearch'); 11 | var searchPref = localStorage.getItem('searchPref'); 12 | var tempUnit = localStorage.getItem('tempUnit'); 13 | var userMenu = localStorage.getItem('userMenuPref'); 14 | var userCopilot = localStorage.getItem('user-copilot'); 15 | var currentWinBuild = os.release().replace('10.0.', ''); 16 | 17 | const weatherCodes = { 18 | 0: "Clear sky", 19 | 1: "Mainly clear", 20 | 2: "Partly cloudy", 21 | 3: "Overcast", 22 | 45: "Foggy", 23 | 48: "Depositing rime fog", 24 | 51: "Light Drizzle", 25 | 53: "Moderate Drizzle", 26 | 55: "Dense Drizzle", 27 | 56: "Light Freezing Drizzle", 28 | 57: "Dense Freezing Drizzle", 29 | 61: "Slight Rain", 30 | 63: "Moderate Rain", 31 | 65: "Heavy Rain", 32 | 66: "Light Freezing Rain", 33 | 67: "Heavy Freezing Rain", 34 | 71: "Slight Snow fall", 35 | 73: "Moderate Snow fall", 36 | 75: "Heavy Snow fall", 37 | 77: "Snow grains", 38 | 80: "Slight Rain showers", 39 | 81: "Moderate Rain showers", 40 | 82: "Violent Rain showers", 41 | 85: "Slight snow showers ", 42 | 86: "Heavy snow showers ", 43 | 95: "Thunderstorm with slight hail", 44 | 96: "Thunderstorm with hail", 45 | 99: "Thunderstorm with heavy hail" 46 | }; 47 | 48 | let batteryIsCharging = false; 49 | 50 | $(window).on('load', function () { 51 | checkOobe(); 52 | // appLblCheck(); 53 | currentTime(); 54 | 55 | 56 | ipcRenderer.send('getVolumeLevel'); 57 | ipcRenderer.send('getUserImage'); 58 | 59 | $('.appLabel').addClass('notitle') 60 | $('p.name').hide(); 61 | $('.appLabel .sep').hide(); 62 | 63 | if (bg == null) { 64 | localStorage.setItem('background', false); 65 | } else if (bg == 'true') { 66 | $('.backgroundFill').addClass('enabled') 67 | } 68 | ipcRenderer.send('set-bg-state', $('.backgroundFill').hasClass('enabled')); 69 | 70 | if (altSearch == null) { 71 | localStorage.setItem('altSearch', 'n'); 72 | } else if (altSearch == 'y') { 73 | $('.mainBar').addClass('altSearch') 74 | } 75 | 76 | if (userMenu == null) { 77 | localStorage.setItem('userMenuPref', true); 78 | } else if (userMenu == 'true') { 79 | $('.profileBtn').removeClass('hide') 80 | } else if (userMenu == 'false') { 81 | $('.profileBtn').addClass('hide') 82 | } 83 | 84 | if (tempUnit == null) { 85 | localStorage.setItem('tempUnit', 'c'); 86 | } else if (tempUnit == 'f') { 87 | localStorage.setItem('tempUnit', 'f'); 88 | } else if (tempUnit == 'c') { 89 | localStorage.setItem('tempUnit', 'c'); 90 | } 91 | checkKey(); 92 | 93 | 94 | 95 | if (themePreference) { 96 | $(':root').addClass(themePreference); 97 | $('.searchImg').attr('src', 'resc/imgs/search/' + themePreference.replace('-theme', '') + '.svg') 98 | } else { 99 | $(':root').addClass('light-theme'); 100 | localStorage.setItem('themePreference', 'light-theme'); 101 | } 102 | 103 | if (searchPref) { 104 | if (searchPref == 'true') { 105 | $('.search .icn').addClass('img') 106 | } 107 | } 108 | 109 | if (currentWinBuild < 23493) { 110 | $('.copilot').addClass('unsupported'); 111 | } 112 | 113 | if (userCopilot == null) { 114 | localStorage.setItem('user-copilot', true); 115 | } else if (userCopilot == 'true') { 116 | $('.copilot').removeClass('user-disable') 117 | } else if (userCopilot == 'false') { 118 | $('.copilot').addClass('user-disable') 119 | } 120 | 121 | $('.wifiIcon').hide(); 122 | ipcRenderer.send('get-netinfo') 123 | 124 | $('body').addClass('loaded'); 125 | }) 126 | 127 | ipcRenderer.on('network-info', (_event, netInf) => { 128 | var conType = netInf['InterfaceAlias']; 129 | // var conName = netInf['Name']; 130 | // The above should work, just isn't needed at the moment 131 | 132 | if (conType == 'Wi-Fi') { 133 | $('.wifiIcon').show(); 134 | $('.wifiIcon').text('') 135 | $('.wifiIcon').removeClass('eth'); 136 | } else if (conType.indexOf('Ethernet') !== 1) { 137 | $('.wifiIcon').show(); 138 | $('.wifiIcon').addClass('eth'); 139 | $('.wifiIcon').text('') 140 | } else { 141 | $('.wifiIcon').hide(); 142 | $('.wifiIcon').removeClass('eth'); 143 | } 144 | }) 145 | 146 | ipcRenderer.on('userimage-output', (_event, path) => { 147 | if (path == null || path == 'null') { 148 | $('.profileImg').attr('src', process.env.systemdrive + "\\ProgramData\\Microsoft\\User Account Pictures\\user.png"); 149 | localStorage.setItem('userImgPath', process.env.systemdrive + "\\ProgramData\\Microsoft\\User Account Pictures\\user.png"); 150 | } else { 151 | $('.profileImg').attr('src', path); 152 | localStorage.setItem('userImgPath', path); 153 | } 154 | }) 155 | 156 | ipcRenderer.on('toggleTempUnit', function () { 157 | checkKey(); 158 | }) 159 | 160 | ipcRenderer.on('checkCopilot', function () { 161 | if (currentWinBuild < 23493) { 162 | ipcRenderer.send('no-copilot'); 163 | } 164 | }) 165 | 166 | ipcRenderer.on('user-enable-copilot', function () { 167 | $('.copilot').removeClass('user-disable') 168 | }) 169 | 170 | ipcRenderer.on('user-disable-copilot', function () { 171 | $('.copilot').addClass('user-disable') 172 | }) 173 | 174 | ipcRenderer.on('toggleUserMenu', function () { 175 | userMenu = localStorage.getItem('userMenuPref') 176 | if (userMenu == 'true') { 177 | $('.profileBtn').removeClass('hide') 178 | } else if (userMenu == 'false') { 179 | $('.profileBtn').addClass('hide') 180 | } 181 | }) 182 | 183 | function currentTime() { 184 | let date = new Date(); 185 | let hh = date.getHours(); 186 | let mm = date.getMinutes(); 187 | let smallDay = date.getDate(); 188 | let smallMonth = date.getMonth() + 1; 189 | const days = [ 190 | "Sun", 191 | "Mon", 192 | "Tue", 193 | "Wed", 194 | "Thu", 195 | "Fri", 196 | "Sat", 197 | ]; 198 | 199 | const currentDay = days[date.getDay()]; 200 | 201 | if (hh == 0) { 202 | hh = 12; 203 | } 204 | if (hh > 12) { 205 | hh = hh - 12; 206 | } 207 | 208 | hh = (hh < 10) ? "0" + hh : hh; 209 | mm = (mm < 10) ? "0" + mm : mm; 210 | smallMonth = (smallMonth < 10) ? "0" + smallMonth : smallMonth; 211 | smallDay = (smallDay < 10) ? "0" + smallDay : smallDay; 212 | 213 | let time = hh + ":" + mm; 214 | let dateString = currentDay + " " + smallMonth + "/" + smallDay; 215 | 216 | $('.date').text(dateString); 217 | $('.time').text(time); 218 | let t = setTimeout(function () { currentTime() }, 1000); 219 | } 220 | 221 | function checkKey() { 222 | if (navigator.geolocation) { 223 | console.log("Geolocation is supported."); 224 | getLatLon().catch((error) => { 225 | alert(`Error: ${error.message}`); 226 | }); 227 | } else { 228 | console.log("Geolocation is not enabled and/or supported by this device."); 229 | } 230 | ipcRenderer.send('win-show'); 231 | newWeatherBalloon(lat, lon); 232 | window.setInterval("newWeatherBalloon(lat, lon);", 10000); 233 | } 234 | 235 | function checkOobe() { 236 | if (localStorage.getItem('oobe') == 'done') { 237 | 238 | } else { 239 | ipcRenderer.send('show-keyfield'); 240 | } 241 | } 242 | 243 | async function getLatLon() { 244 | try { 245 | const response = await fetch(`http://ip-api.com/json`); 246 | const { lat, lon } = await response.json(); 247 | 248 | localStorage.setItem("locLat", lat); 249 | localStorage.setItem("locLon", lon); 250 | } catch (error) { 251 | console.log(error); 252 | throw error; 253 | } 254 | } 255 | 256 | function newWeatherBalloon() { 257 | fetch('https://api.open-meteo.com/v1/forecast?latitude=' + lat + '&longitude=' + lon + '&daily=weathercode¤t_weather=true&timezone=auto&forecast_days=1') 258 | .then(function (resp) { return resp.json() }) // Convert data to json 259 | .then(function (data) { 260 | $('.weather').show(); 261 | setTimeout(newDrawWeather(data), 10000); 262 | }) 263 | .catch(function (error) { 264 | location.reload(); 265 | blankFunction(); 266 | console.error('An error occurred:', error); 267 | }); 268 | } 269 | 270 | function newDrawWeather(d) { 271 | var feel = weatherCodes[d.current_weather.weathercode]; 272 | var theme; 273 | var tempPref; 274 | if (tempUnit == 'c') { 275 | tempPref = Math.round(d.current_weather.temperature); 276 | } else if (tempUnit == 'f') { 277 | tempPref = Math.round((d.current_weather.temperature * 1.8) + 32); 278 | } 279 | document.getElementById('wtemp').innerText = tempPref + '°'; 280 | var wIcon = d.current_weather.weathercode; 281 | if ($(':root').hasClass('dark-theme')) { 282 | theme = 'dark'; 283 | } else { 284 | theme = 'light'; 285 | } 286 | $('.wicon').attr('src', "resc/imgs/weather/" + weatherCodes[d.current_weather.weathercode].replace(/\s+/g, "").toLowerCase() + '.svg'); 287 | $('.wfeel').text(feel) 288 | } 289 | 290 | function blankFunction() { 291 | $('.weather').hide(); 292 | } 293 | 294 | function toTitleCase(str) { 295 | return str.replace(/\b\w/g, function (match) { 296 | return match.toUpperCase(); 297 | }); 298 | } 299 | 300 | function appLblCheck() { 301 | if ($('.appLabel').width() <= 30 || $('.appLabel').text().includes('No app selected')) { 302 | $('.appLabel').addClass('hide'); 303 | $('.appIcn').addClass('hide'); 304 | $('.searchBox').text('Type here to search the web, apps, and your device') 305 | } else { 306 | $('.appLabel').removeClass('hide'); 307 | $('.appIcn').removeClass('hide'); 308 | // $('.searchBox').text('Type here to search') 309 | } 310 | } 311 | 312 | function changeTextColor() { 313 | var backgroundColor = $(".backgroundFill").css("background-color"); 314 | var rgb = backgroundColor.match(/\d+/g); 315 | var brightness = (299 * rgb[0] + 587 * rgb[1] + 114 * rgb[2]) / 1000; 316 | var textColor = brightness > 128 ? "black" : "white"; 317 | var shadowColor = brightness > 128 ? "#00000010" : "transparent"; 318 | $(':root').css('--global-text', textColor); 319 | $(':root').css('--shadow-color', shadowColor); 320 | } 321 | 322 | $('.statIcons').on('click', function () { 323 | ipcRenderer.send('hotKey', 'command', 'a'); 324 | }) 325 | 326 | $('.timeDate').on('click', function () { 327 | ipcRenderer.send('hotKey', 'command', 'n'); 328 | }) 329 | 330 | $('.mainBar').on('click', function () { 331 | if (altSearch == 'y') { 332 | ipcRenderer.send('hotKey', 'alt', 'space'); 333 | } else { 334 | ipcRenderer.send('hotKey', 'command', 's'); 335 | } 336 | }) 337 | 338 | $('.weather').on('click', function () { 339 | ipcRenderer.send('hotKey', 'command', 'w'); 340 | }) 341 | 342 | $('.copilot').on('click', function () { 343 | ipcRenderer.send('hotKey', 'command', 'c'); 344 | }) 345 | 346 | $('.profileBtn').on('click', function () { 347 | let themeToSend 348 | if (themePreference == 'light-theme') { 349 | themeToSend = 'light' 350 | } else if (themePreference == 'dark-theme') { 351 | themeToSend = 'dark' 352 | } 353 | ipcRenderer.send('show-popup', themeToSend); 354 | }) 355 | 356 | $('.dropDownBtn').on('click', function () { 357 | // var inputCtrl = localStorage.getItem('ctrl2'); 358 | // if (inputCtrl == 'true') { 359 | // ipcRenderer.send('show-popup'); 360 | // } else { 361 | ipcRenderer.send('show-tray-popup') 362 | // } 363 | }) 364 | 365 | if (navigator.getBattery()) { 366 | setInterval(() => { 367 | navigator.getBattery().then((battery) => { 368 | var battNum = battery.level * 100; 369 | $('.batteryIcn .fill').width(battNum + "%"); 370 | 371 | if (battNum <= 10) { 372 | $('.batteryIcn').text(''); 373 | } else if (battNum <= 20) { 374 | $('.batteryIcn').text(''); 375 | } else if (battNum <= 30) { 376 | $('.batteryIcn').text(''); 377 | } else if (battNum <= 40) { 378 | $('.batteryIcn').text(''); 379 | } else if (battNum <= 50) { 380 | $('.batteryIcn').text(''); 381 | } else if (battNum <= 60) { 382 | $('.batteryIcn').text(''); 383 | } else if (battNum <= 70) { 384 | $('.batteryIcn').text(''); 385 | } else if (battNum <= 80) { 386 | $('.batteryIcn').text(''); 387 | } else if (battNum <= 90) { 388 | $('.batteryIcn').text(''); 389 | } else if (battNum <= 100) { 390 | $('.batteryIcn').text(''); 391 | } 392 | 393 | batteryIsCharging = battery.charging; 394 | battery.addEventListener("chargingchange", () => { 395 | batteryIsCharging = battery.charging; 396 | }); 397 | if (batteryIsCharging) { 398 | $('.batteryIcn').text(''); 399 | } 400 | }); 401 | }, 5000); 402 | } else { 403 | $('.batteryIcn').hide(); 404 | } 405 | 406 | ipcRenderer.on('winTitle', (_event, name, title) => { 407 | // appLblCheck(); 408 | // console.log(data) 409 | $('.appLabel p.name').text(name); 410 | $('.appLabel p.title').text(title); 411 | 412 | if (name == "Visual Studio Code" 413 | || name == "Microsoft Edge" 414 | || name == "Notepad.exe" 415 | || name == "Discord" 416 | || name == "mspaint.exe" 417 | || name == "Google Chrome" 418 | || name == title) { 419 | $('.appLabel').addClass('notitle') 420 | $('p.name').hide(); 421 | $('.appLabel .sep').hide(); 422 | } else { 423 | $('.appLabel').removeClass('notitle') 424 | $('p.name').show(); 425 | $('.appLabel .sep').show(); 426 | } 427 | 428 | if (title == "") { 429 | $('.appLabel').addClass('notitle') 430 | } else { 431 | $('.appLabel').removeClass('notitle') 432 | } 433 | appLblCheck(); 434 | }) 435 | 436 | ipcRenderer.on('get-theme', function () { 437 | let themeToSend 438 | if (themePreference == 'light-theme') { 439 | themeToSend = 'light' 440 | } else if (themePreference == 'dark-theme') { 441 | themeToSend = 'dark' 442 | } 443 | ipcRenderer.send('got-theme-sw', themeToSend); 444 | }) 445 | 446 | ipcRenderer.on('desktop', function () { 447 | $('.mainBar').addClass('desktop') 448 | $('.searchBox').text('Type here to search the web, apps, and your device') 449 | }) 450 | 451 | ipcRenderer.on('no-desktop', function () { 452 | $('.mainBar').removeClass('desktop') 453 | $('.searchBox').text('Type here to search') 454 | }) 455 | 456 | ipcRenderer.on('checkBackground', (_event) => { 457 | if (bg == null) { 458 | localStorage.setItem('background', false); 459 | } else if (bg == 'true') { 460 | $('.backgroundFill').addClass('enabled') 461 | } else if (bg == 'false') { 462 | $('.backgroundFill').removeClass('enabled') 463 | } 464 | }) 465 | 466 | ipcRenderer.on('backColor', (_event, color) => { 467 | $('.backgroundFill').css('background-color', color); 468 | changeTextColor(); 469 | }) 470 | 471 | ipcRenderer.on('icon-data', (_event, data) => { 472 | $('.aiImg').attr('src', `data:image/png;base64,${data}`); 473 | }); 474 | 475 | ipcRenderer.on('toggleTheme', function () { 476 | $(':root').toggleClass('light-theme dark-theme') 477 | location.reload(); 478 | }) 479 | 480 | ipcRenderer.on('toggleUserMenu', function () { 481 | if (userMenu == null) { 482 | localStorage.setItem('userMenuPref', true); 483 | } else if (userMenu == 'true') { 484 | $('.profileBtn').removeClass('hide') 485 | } else if (userMenu == 'false') { 486 | $('.profileBtn').addClass('hide') 487 | } 488 | }) 489 | 490 | ipcRenderer.on('toggleBackground', (_event) => { 491 | $('.backgroundFill').toggleClass('enabled'); 492 | ipcRenderer.send('set-bg-state', $('.backgroundFill').hasClass('enabled')); 493 | }) 494 | 495 | ipcRenderer.on('toggleSearch', function () { 496 | $('.search .icn').toggleClass('img'); 497 | }) 498 | 499 | ipcRenderer.on('disableBackground', (_event) => { 500 | $('.backgroundFill').removeClass('enabled'); 501 | }) 502 | 503 | ipcRenderer.on('volumeLevel', (event, volumeLevel) => { 504 | console.log('System volume level:', volumeLevel); 505 | if (volumeLevel <= 1) { 506 | $('.volIcon').text('') 507 | $('.volIcon').addClass('mute') 508 | } else if (volumeLevel <= 5) { 509 | $('.volIcon').text('') 510 | $('.volIcon').removeClass('mute') 511 | } else if (volumeLevel <= 33) { 512 | $('.volIcon').text('') 513 | $('.volIcon').removeClass('mute') 514 | } else if (volumeLevel <= 66) { 515 | $('.volIcon').text('') 516 | $('.volIcon').removeClass('mute') 517 | } else if (volumeLevel <= 100) { 518 | $('.volIcon').text('') 519 | $('.volIcon').removeClass('mute') 520 | } 521 | }); 522 | 523 | ipcRenderer.on('reset-app', function () { 524 | localStorage.clear(); 525 | }) 526 | 527 | ipcRenderer.on('main-console-forward', (_event, errorMsg) => { 528 | console.log(errorMsg); 529 | }) -------------------------------------------------------------------------------- /resc/branding/brand_ico.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Futur3Sn0w/12Bar/5599be012bc12382a147bc87660f814fd4cde8e0/resc/branding/brand_ico.ico -------------------------------------------------------------------------------- /resc/branding/brand_png.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Futur3Sn0w/12Bar/5599be012bc12382a147bc87660f814fd4cde8e0/resc/branding/brand_png.png -------------------------------------------------------------------------------- /resc/fonts/FluentSystemIcons-Filled.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Futur3Sn0w/12Bar/5599be012bc12382a147bc87660f814fd4cde8e0/resc/fonts/FluentSystemIcons-Filled.ttf -------------------------------------------------------------------------------- /resc/fonts/FluentSystemIcons-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Futur3Sn0w/12Bar/5599be012bc12382a147bc87660f814fd4cde8e0/resc/fonts/FluentSystemIcons-Regular.ttf -------------------------------------------------------------------------------- /resc/fonts/SegoeIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Futur3Sn0w/12Bar/5599be012bc12382a147bc87660f814fd4cde8e0/resc/fonts/SegoeIcons.ttf -------------------------------------------------------------------------------- /resc/imgs/copilot.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resc/imgs/search/dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /resc/imgs/search/light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /resc/imgs/weather/clearsky.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/densedrizzle.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/densefreezingdrizzle.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/depositingrimefog.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/foggy.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/heavyfreezingrain.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/heavyrain.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 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /resc/imgs/weather/heavysnowfall.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/heavysnowshowers.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/lightdrizzle.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/lightfreezingdrizzle.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/lightfreezingrain.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/mainlyclear.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 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /resc/imgs/weather/moderatedrizzle.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/moderaterain.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/moderaterainshowers.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 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /resc/imgs/weather/moderatesnowfall.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/overcast.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/partlycloudy.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 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /resc/imgs/weather/slightrain.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/slightrainshowers.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/slightsnowfall.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /resc/imgs/weather/slightsnowshowers.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/snowgrains.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /resc/imgs/weather/thunderstormwithhail.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/thunderstormwithheavyhail.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/thunderstormwithslighthail.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 | -------------------------------------------------------------------------------- /resc/imgs/weather/violentrainshowers.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 | --------------------------------------------------------------------------------