mirror of
https://github.com/smartfrigde/armcord.git
synced 2024-08-14 23:56:58 +00:00
Updated titlebar and a few other things
This commit is contained in:
parent
b31d9d8d4a
commit
12c195a2fa
17 changed files with 239 additions and 146 deletions
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="https://armcord.vercel.app/armcord_full_logo.png" width="720">
|
<img src="https://armcord.vercel.app/armcord_full_logo.png" width="520">
|
||||||
<br>ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.
|
<br>ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -73,6 +73,7 @@ ArmCord is also available on the Snap store [here](https://snapcraft.io/armcord)
|
||||||
[electron-discord-webapp](https://github.com/SpacingBat3/electron-discord-webapp)
|
[electron-discord-webapp](https://github.com/SpacingBat3/electron-discord-webapp)
|
||||||
[custom-electron-titlebar (css only)](https://github.com/AlexTorresSk/custom-electron-titlebar)
|
[custom-electron-titlebar (css only)](https://github.com/AlexTorresSk/custom-electron-titlebar)
|
||||||
[electron-builder](https://electron.build)
|
[electron-builder](https://electron.build)
|
||||||
|
[OpenAsar (~~stole~~ borrowed code for adding items to the settings modal seemlessly)](https://github.com/GooseMod/OpenAsar)
|
||||||
# Sponsors
|
# Sponsors
|
||||||
[![JetBrains supports ArmCord with free licenses to their software to core developers](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](https://jb.gg/OpenSourceSupport)
|
[![JetBrains supports ArmCord with free licenses to their software to core developers](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](https://jb.gg/OpenSourceSupport)
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 16 KiB |
BIN
assets/ac_plug_colored.png
Normal file
BIN
assets/ac_plug_colored.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
|
@ -1,15 +1,43 @@
|
||||||
.info-3pQQBb:last-child:before {
|
|
||||||
content: "ArmCord Version: 3.1.0" !important;
|
|
||||||
height: auto;
|
|
||||||
line-height: 16px;
|
|
||||||
text-align: center;
|
|
||||||
color: var(--text-muted);
|
|
||||||
font-size: 12px;
|
|
||||||
text-transform: none;
|
|
||||||
}
|
|
||||||
.notice-2HEN-u {
|
.notice-2HEN-u {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.sidebar-1tnWFu {
|
.sidebar-1tnWFu {
|
||||||
border-top-left-radius: 8px !important;
|
border-top-left-radius: 8px;
|
||||||
|
}
|
||||||
|
.scroller-3X7KbA {
|
||||||
|
padding: 0;
|
||||||
|
padding-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
[class^="socialLinks-"] + [class^="info-"] {
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
#ac-ver {
|
||||||
|
text-transform: none;
|
||||||
|
cursor: pointer;
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
|
#ac-ver:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
color: var(--text-normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Server List Scrollbar - https://github.com/kckarnige/server-scroll */
|
||||||
|
.none-2-_0dP {
|
||||||
|
scrollbar-width: auto !important;
|
||||||
|
overflow-y: scroll !important;
|
||||||
|
overflow-x: hidden !important;
|
||||||
|
margin-right: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.none-2-_0dP:hover::-webkit-scrollbar {
|
||||||
|
width: 0.29em !important;
|
||||||
|
border-radius: 25px;
|
||||||
|
height: 0px !important;
|
||||||
|
background: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.none-2-_0dP::-webkit-scrollbar-thumb {
|
||||||
|
background: var(--background-accent);
|
||||||
|
border-radius: 25px;
|
||||||
}
|
}
|
||||||
|
|
4
src/content/css/logos.css
Normal file
4
src/content/css/logos.css
Normal file
File diff suppressed because one or more lines are too long
|
@ -4,8 +4,10 @@
|
||||||
:root {
|
:root {
|
||||||
--background-primary: #282b30;
|
--background-primary: #282b30;
|
||||||
--background-secondary: rgba(255, 255, 255, 0.1);
|
--background-secondary: rgba(255, 255, 255, 0.1);
|
||||||
|
--background-modifier-hover: rgba(106, 116, 128, 0.16);
|
||||||
--brand-experiment: #7289da;
|
--brand-experiment: #7289da;
|
||||||
--header-primary: #fff;
|
--interactive-normal: #b9bbbe;
|
||||||
|
--interactive-hover: #dcddde;
|
||||||
--text-muted: #72767d;
|
--text-muted: #72767d;
|
||||||
--font-primary: "Whitney";
|
--font-primary: "Whitney";
|
||||||
}
|
}
|
||||||
|
@ -20,14 +22,11 @@
|
||||||
html,
|
html,
|
||||||
body {
|
body {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding-top: 30px;
|
padding-top: 30px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
background: var(--background-primary);
|
background: var(--background-primary);
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
@ -97,21 +96,20 @@ body {
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
content: var(--logo-svg);
|
||||||
|
width: 292px;
|
||||||
}
|
}
|
||||||
#logo p:first-child {
|
|
||||||
color: #7289da;
|
.titlebar #window-controls-container #maximize {
|
||||||
margin: 0;
|
display: none;
|
||||||
font-weight: normal;
|
|
||||||
font-family: Helvetica, sans-serif;
|
|
||||||
font-size: 32px;
|
|
||||||
}
|
}
|
||||||
#logo p:last-child {
|
|
||||||
color: white;
|
.titlebar #window-controls-container #spacer {
|
||||||
margin: 0;
|
float: left;
|
||||||
font-weight: normal;
|
height: 100%;
|
||||||
font-family: Discordinated;
|
width: 33%;
|
||||||
font-size: 32px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* Buttons {{{ */
|
/* Buttons {{{ */
|
||||||
|
@ -121,19 +119,16 @@ body {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
|
|
||||||
user-select: all !important;
|
user-select: all !important;
|
||||||
|
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
button {
|
button {
|
||||||
background: var(--brand-experiment);
|
background: var(--brand-experiment);
|
||||||
color: var(--header-primary);
|
color: var(--header-primary);
|
||||||
|
outline: none;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
|
||||||
padding: 8px 20px;
|
padding: 8px 20px;
|
||||||
}
|
}
|
||||||
button:hover {
|
button:hover {
|
||||||
|
|
|
@ -112,3 +112,7 @@ video {
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
white-space: pre;
|
white-space: pre;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img.logo {
|
||||||
|
width: 272px;
|
||||||
|
}
|
||||||
|
|
|
@ -1,10 +1,3 @@
|
||||||
@import url("https://armcord.smartfridge.space/logofont.css");
|
|
||||||
:root {
|
|
||||||
--window-buttons: var(--header-secondary);
|
|
||||||
--cord-color: var(--header-primary);
|
|
||||||
--armcord-color: #7289da;
|
|
||||||
--titlebar-color: var(--background-tertiary);
|
|
||||||
}
|
|
||||||
.tabs {
|
.tabs {
|
||||||
display: block;
|
display: block;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
|
|
@ -1,10 +1,3 @@
|
||||||
@import url("https://armcord.smartfridge.space/logofont.css");
|
|
||||||
:root {
|
|
||||||
--window-buttons: var(--header-secondary);
|
|
||||||
--cord-color: var(--header-primary);
|
|
||||||
--armcord-color: #7289da;
|
|
||||||
--titlebar-color: var(--background-tertiary);
|
|
||||||
}
|
|
||||||
.titlebar {
|
.titlebar {
|
||||||
display: block;
|
display: block;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
@ -18,7 +11,6 @@
|
||||||
clear: both;
|
clear: both;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
background-color: #202225;
|
|
||||||
-webkit-app-region: drag;
|
-webkit-app-region: drag;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
|
@ -26,12 +18,10 @@
|
||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: 99999;
|
z-index: 99999;
|
||||||
}
|
}
|
||||||
.titlebar #window-title {
|
|
||||||
width: 30%;
|
.container-2RRFHK {
|
||||||
height: 100%;
|
padding-top: 30px;
|
||||||
line-height: 30px;
|
top: -30px;
|
||||||
float: left;
|
|
||||||
padding: 0 0 0 1em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.titlebar #window-controls-container {
|
.titlebar #window-controls-container {
|
||||||
|
@ -39,7 +29,6 @@
|
||||||
width: 150px;
|
width: 150px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
background-color: #202225;
|
|
||||||
-webkit-app-region: no-drag;
|
-webkit-app-region: no-drag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,61 +37,115 @@
|
||||||
.titlebar #window-controls-container #quit {
|
.titlebar #window-controls-container #quit {
|
||||||
float: left;
|
float: left;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 33%;
|
width: 33.1%;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #f7f7f7;
|
color: var(--interactive-normal);
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
.titlebar #window-controls-container #spacer {
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
.titlebar #window-controls-container #minimize:hover {
|
/* ArmCord on Linux */
|
||||||
|
[armcord-platform="linux"] .titlebar #window-controls-container #minimize:hover {
|
||||||
background-color: #99aab5;
|
background-color: #99aab5;
|
||||||
}
|
}
|
||||||
.titlebar #window-controls-container #maximize:hover {
|
[armcord-platform="linux"] .titlebar #window-controls-container #maximize:hover {
|
||||||
background-color: #99aab5;
|
background-color: #99aab5;
|
||||||
}
|
}
|
||||||
.titlebar #window-controls-container #quit:hover {
|
[armcord-platform="linux"] .titlebar #window-controls-container #quit:hover {
|
||||||
background-color: #f04747;
|
background-color: #f04747;
|
||||||
}
|
}
|
||||||
.titlebar #window-controls-container #quit {
|
|
||||||
background-color: #f7f7f7;
|
/* ArmCord on Windows */
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #minimize:hover {
|
||||||
|
background-color: var(--background-modifier-hover);
|
||||||
|
transition: 0.2s ease;
|
||||||
|
}
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #maximize:hover {
|
||||||
|
background-color: var(--background-modifier-hover);
|
||||||
|
transition: 0.2s ease;
|
||||||
|
}
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #minimize:hover #minimize-icon {
|
||||||
|
background-color: var(--interactive-hover);
|
||||||
|
transition: 0.2s ease;
|
||||||
|
}
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #maximize:hover #maximize-icon {
|
||||||
|
background-color: var(--interactive-hover);
|
||||||
|
transition: 0.2s ease;
|
||||||
|
}
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #quit:hover {
|
||||||
|
background-color: #e81123;
|
||||||
|
transition: 0.2s ease;
|
||||||
|
}
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #quit:hover #quit-icon {
|
||||||
|
background-color: #ffffff;
|
||||||
|
transition: 0.1s ease;
|
||||||
|
}
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #minimize {
|
||||||
|
background-color: transparent;
|
||||||
|
transition: 0.1s ease;
|
||||||
|
}
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #maximize {
|
||||||
|
background-color: transparent;
|
||||||
|
transition: 0.1s ease;
|
||||||
|
}
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #quit {
|
||||||
|
background-color: transparent;
|
||||||
|
transition: 0.1s ease;
|
||||||
|
}
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #quit:active {
|
||||||
|
background-color: #f1707a;
|
||||||
|
transition: 0.1s ease;
|
||||||
|
}
|
||||||
|
[armcord-platform="win32"] .titlebar #window-controls-container #quit:active #quit-icon {
|
||||||
|
background-color: #000000cc;
|
||||||
|
transition: 0.1s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.titlebar #window-controls-container #quit-icon {
|
||||||
|
background-color: var(--interactive-normal);
|
||||||
|
display: list-item;
|
||||||
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E")
|
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E")
|
||||||
no-repeat 50% 50%;
|
no-repeat 50% 50%;
|
||||||
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E")
|
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E")
|
||||||
no-repeat 50% 50%;
|
no-repeat 50% 50%;
|
||||||
}
|
}
|
||||||
.titlebar #window-controls-container #minimize {
|
.titlebar #window-controls-container #minimize-icon {
|
||||||
background-color: #f7f7f7;
|
background-color: var(--interactive-normal);
|
||||||
|
display: list-item;
|
||||||
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E")
|
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E")
|
||||||
no-repeat 50% 50%;
|
no-repeat 50% 50%;
|
||||||
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E")
|
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E")
|
||||||
no-repeat 50% 50%;
|
no-repeat 50% 50%;
|
||||||
}
|
}
|
||||||
.titlebar #window-controls-container #maximize {
|
.titlebar #window-controls-container #maximize-icon {
|
||||||
background-color: #f7f7f7;
|
background-color: var(--interactive-normal);
|
||||||
|
display: list-item;
|
||||||
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E")
|
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E")
|
||||||
no-repeat 50% 50%;
|
no-repeat 50% 50%;
|
||||||
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E")
|
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E")
|
||||||
no-repeat 50% 50%;
|
no-repeat 50% 50%;
|
||||||
}
|
}
|
||||||
.window-title:after {
|
|
||||||
content: "Cord";
|
[isMaximized] .titlebar #window-controls-container #maximize-icon {
|
||||||
color: var(--cord-color) !important;
|
background-color: var(--interactive-normal);
|
||||||
font-weight: normal;
|
display: list-item;
|
||||||
font-size: 14px;
|
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E")
|
||||||
font-family: Discordinated;
|
no-repeat 50% 50%;
|
||||||
}
|
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E")
|
||||||
.window-title:before {
|
no-repeat 50% 50%;
|
||||||
content: "ARM";
|
|
||||||
color: var(--armcord-color);
|
|
||||||
font-weight: normal;
|
|
||||||
font-size: 14px;
|
|
||||||
font-family: Helvetica, sans-serif;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-title {
|
.window-title {
|
||||||
font-size: 0px !important;
|
content: var(--wordmark-svg);
|
||||||
margin-left: initial !important;
|
height: 10px;
|
||||||
transform: translate(10px, 0px);
|
margin-left: initial;
|
||||||
|
transform: translate(9px, 9.5px);
|
||||||
|
float: left;
|
||||||
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.withFrame-haYltI {
|
.withFrame-haYltI {
|
||||||
height: 30px !important;
|
height: 30px !important;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,10 +15,7 @@
|
||||||
<p>You appear to be offline. Please connect to the internet and restart ArmCord Setup.</p>
|
<p>You appear to be offline. Please connect to the internet and restart ArmCord Setup.</p>
|
||||||
</div>
|
</div>
|
||||||
<div id="setup">
|
<div id="setup">
|
||||||
<div id="logo" class="hidden">
|
<div id="logo" class="hidden"></div>
|
||||||
<p>ARM</p>
|
|
||||||
<p>Cord</p>
|
|
||||||
</div>
|
|
||||||
<div id="page1" class="hidden">
|
<div id="page1" class="hidden">
|
||||||
<p>Select the type of setup you want to perform.</p>
|
<p>Select the type of setup you want to perform.</p>
|
||||||
<div id="buttons">
|
<div id="buttons">
|
||||||
|
@ -58,7 +55,7 @@
|
||||||
<option value="flicker">Flicker (Heavily WIP)</option>
|
<option value="flicker">Flicker (Heavily WIP)</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<p>
|
<p class="text-center">
|
||||||
Why not all of them? Having many client mods at the same time can cause issues. If you really
|
Why not all of them? Having many client mods at the same time can cause issues. If you really
|
||||||
want to do it though, check our documentation ;)
|
want to do it though, check our documentation ;)
|
||||||
</p>
|
</p>
|
||||||
|
@ -70,6 +67,9 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
document.onload = function () {
|
||||||
|
ipcRenderer.send("win-unmaximize");
|
||||||
|
};
|
||||||
// Accessors {{{
|
// Accessors {{{
|
||||||
let options = {};
|
let options = {};
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ export var tabs: boolean;
|
||||||
|
|
||||||
if (process.platform == "linux") {
|
if (process.platform == "linux") {
|
||||||
if (process.env.$XDG_SESSION_TYPE == "wayland") {
|
if (process.env.$XDG_SESSION_TYPE == "wayland") {
|
||||||
console.log("Wayland specific patches applied.")
|
console.log("Wayland specific patches applied.");
|
||||||
app.commandLine.appendSwitch("ozone-platform=wayland");
|
app.commandLine.appendSwitch("ozone-platform=wayland");
|
||||||
if (process.env.$XDG_CURRENT_DESKTOP == "GNOME") {
|
if (process.env.$XDG_CURRENT_DESKTOP == "GNOME") {
|
||||||
app.commandLine.appendSwitch("enable-features=UseOzonePlatform,WaylandWindowDecorations");
|
app.commandLine.appendSwitch("enable-features=UseOzonePlatform,WaylandWindowDecorations");
|
||||||
|
|
|
@ -7,6 +7,8 @@ import {injectTitlebar} from "./titlebar";
|
||||||
import {sleep, addStyle, injectJS} from "../utils";
|
import {sleep, addStyle, injectJS} from "../utils";
|
||||||
import {ipcRenderer} from "electron";
|
import {ipcRenderer} from "electron";
|
||||||
import {injectTabs} from "./tabs";
|
import {injectTabs} from "./tabs";
|
||||||
|
var version = ipcRenderer.sendSync("get-app-version", "app-version");
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
armcord: any;
|
armcord: any;
|
||||||
|
@ -48,3 +50,17 @@ if (window.location.href.indexOf("splash.html") > -1) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Settings info version injection (Stolen and modified from OpenAsar, mwuh ha ha ha ha >:D)
|
||||||
|
setInterval(() => {
|
||||||
|
const host = document.getElementsByClassName("info-3pQQBb")[0];
|
||||||
|
if (!host || document.querySelector("#ac-ver")) return;
|
||||||
|
const el = document.createElement("span");
|
||||||
|
el.id = "ac-ver";
|
||||||
|
el.classList.add("text-xs-normal-3SiVjE", "line-18uChy");
|
||||||
|
|
||||||
|
el.textContent = `\nArmCord Version: ${version}`;
|
||||||
|
el.onclick = () => ipcRenderer.send("openSettingsWindow");
|
||||||
|
|
||||||
|
host.append(el);
|
||||||
|
}, 2000);
|
||||||
|
|
|
@ -2,15 +2,17 @@ import {ipcRenderer} from "electron";
|
||||||
import {addStyle} from "../utils";
|
import {addStyle} from "../utils";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
|
import {platform} from "node:process";
|
||||||
export function injectTitlebar() {
|
export function injectTitlebar() {
|
||||||
document.addEventListener("DOMContentLoaded", function (event) {
|
document.addEventListener("DOMContentLoaded", function (event) {
|
||||||
var elem = document.createElement("div");
|
var elem = document.createElement("div");
|
||||||
elem.innerHTML = `<nav class="titlebar">
|
elem.innerHTML = `<nav class="titlebar">
|
||||||
<div class="window-title" id="window-title"></div>
|
<div class="window-title" id="window-title"></div>
|
||||||
<div id="window-controls-container">
|
<div id="window-controls-container">
|
||||||
<div id="minimize"></div>
|
<div id="spacer"></div>
|
||||||
<div id="maximize"></div>
|
<div id="minimize"><div id="minimize-icon"></div></div>
|
||||||
<div id="quit"></div>
|
<div id="maximize"><div id="maximize-icon"></div></div>
|
||||||
|
<div id="quit"><div id="quit-icon"></div></div>
|
||||||
</div>
|
</div>
|
||||||
</nav>`;
|
</nav>`;
|
||||||
elem.classList.add("withFrame-haYltI");
|
elem.classList.add("withFrame-haYltI");
|
||||||
|
@ -19,8 +21,11 @@ export function injectTitlebar() {
|
||||||
} else {
|
} else {
|
||||||
document.getElementById("app-mount")!.prepend(elem);
|
document.getElementById("app-mount")!.prepend(elem);
|
||||||
}
|
}
|
||||||
const cssPath = path.join(__dirname, "../", "/content/css/titlebar.css");
|
const titlebarcssPath = path.join(__dirname, "../", "/content/css/titlebar.css");
|
||||||
addStyle(fs.readFileSync(cssPath, "utf8"));
|
const wordmarkcssPath = path.join(__dirname, "../", "/content/css/logos.css");
|
||||||
|
addStyle(fs.readFileSync(titlebarcssPath, "utf8"));
|
||||||
|
addStyle(fs.readFileSync(wordmarkcssPath, "utf8"));
|
||||||
|
document.body.setAttribute("armcord-platform", platform);
|
||||||
|
|
||||||
var minimize = document.getElementById("minimize");
|
var minimize = document.getElementById("minimize");
|
||||||
var maximize = document.getElementById("maximize");
|
var maximize = document.getElementById("maximize");
|
||||||
|
@ -33,8 +38,10 @@ export function injectTitlebar() {
|
||||||
maximize!.addEventListener("click", () => {
|
maximize!.addEventListener("click", () => {
|
||||||
if (ipcRenderer.sendSync("win-isMaximized") == true) {
|
if (ipcRenderer.sendSync("win-isMaximized") == true) {
|
||||||
ipcRenderer.send("win-unmaximize");
|
ipcRenderer.send("win-unmaximize");
|
||||||
|
document.body.removeAttribute("isMaximized");
|
||||||
} else {
|
} else {
|
||||||
ipcRenderer.send("win-maximize");
|
ipcRenderer.send("win-maximize");
|
||||||
|
document.body.setAttribute("isMaximized", "");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -119,37 +119,36 @@ export default async function startServer() {
|
||||||
["Fosscord", new URL("https://dev.fosscord.com/app")]
|
["Fosscord", new URL("https://dev.fosscord.com/app")]
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
let wss = null, wsPort = 6463;
|
let wss = null,
|
||||||
|
wsPort = 6463;
|
||||||
for (const port of range(6463, 6472)) {
|
for (const port of range(6463, 6472)) {
|
||||||
wss = await getServer(port);
|
wss = await getServer(port);
|
||||||
if (wss !== null) {
|
if (wss !== null) {
|
||||||
void wsLog("ArmCord is listening at " + (port.toString()));
|
void wsLog("ArmCord is listening at " + port.toString());
|
||||||
wsPort = port;
|
wsPort = port;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (wss === null) return;
|
if (wss === null) return;
|
||||||
let lock = false;
|
let lock = false;
|
||||||
wss.on('connection', (wss, request) => {
|
wss.on("connection", (wss, request) => {
|
||||||
const origin = request.headers.origin??'https://discord.com';
|
const origin = request.headers.origin ?? "https://discord.com";
|
||||||
let known = false;
|
let known = false;
|
||||||
for (const instance of knownInstancesList) {
|
for (const instance of knownInstancesList) {
|
||||||
if(instance[1].origin === origin)
|
if (instance[1].origin === origin) known = true;
|
||||||
known = true;
|
|
||||||
}
|
}
|
||||||
if (!known) return;
|
if (!known) return;
|
||||||
wss.send(JSON.stringify(messages.handShake));
|
wss.send(JSON.stringify(messages.handShake));
|
||||||
wss.once('message', (data, isBinary) => {
|
wss.once("message", (data, isBinary) => {
|
||||||
if (lock) return;
|
if (lock) return;
|
||||||
lock = true;
|
lock = true;
|
||||||
let parsedData: unknown = data;
|
let parsedData: unknown = data;
|
||||||
if(!isBinary)
|
if (!isBinary) parsedData = data.toString();
|
||||||
parsedData = data.toString();
|
if (isJsonSyntaxCorrect(parsedData as string)) parsedData = JSON.parse(parsedData as string);
|
||||||
if(isJsonSyntaxCorrect(parsedData as string))
|
|
||||||
parsedData = JSON.parse(parsedData as string);
|
|
||||||
if (isInviteResponse(parsedData)) {
|
if (isInviteResponse(parsedData)) {
|
||||||
// Replies to browser, so it finds the communication successful.
|
// Replies to browser, so it finds the communication successful.
|
||||||
wss.send(JSON.stringify({
|
wss.send(
|
||||||
|
JSON.stringify({
|
||||||
cmd: parsedData.cmd,
|
cmd: parsedData.cmd,
|
||||||
data: {
|
data: {
|
||||||
invite: null,
|
invite: null,
|
||||||
|
@ -157,26 +156,30 @@ export default async function startServer() {
|
||||||
},
|
},
|
||||||
evt: null,
|
evt: null,
|
||||||
nonce: parsedData.nonce
|
nonce: parsedData.nonce
|
||||||
}));
|
})
|
||||||
createInviteWindow()
|
);
|
||||||
|
createInviteWindow();
|
||||||
const child = inviteWindow;
|
const child = inviteWindow;
|
||||||
if (child === undefined) return;
|
if (child === undefined) return;
|
||||||
void child.loadURL(origin+'/invite/'+parsedData.args.code);
|
void child.loadURL(origin + "/invite/" + parsedData.args.code);
|
||||||
child.webContents.once("did-finish-load", () => {
|
child.webContents.once("did-finish-load", () => {
|
||||||
child.show();
|
child.show();
|
||||||
});
|
});
|
||||||
child.webContents.once("will-navigate", () => {
|
child.webContents.once("will-navigate", () => {
|
||||||
lock = false;
|
lock = false;
|
||||||
child.close();
|
child.close();
|
||||||
})
|
});
|
||||||
child.on("close", (e) => {
|
child.on("close", (e) => {
|
||||||
lock = false;
|
lock = false;
|
||||||
})
|
});
|
||||||
// Blocks requests to ArmCord's WS, to prevent loops.
|
// Blocks requests to ArmCord's WS, to prevent loops.
|
||||||
child.webContents.session.webRequest.onBeforeRequest({
|
child.webContents.session.webRequest.onBeforeRequest(
|
||||||
urls: ['ws://127.0.0.1:'+wsPort.toString()+'/*']
|
{
|
||||||
}, (_details,callback) => callback({cancel: true}));
|
urls: ["ws://127.0.0.1:" + wsPort.toString() + "/*"]
|
||||||
|
},
|
||||||
|
(_details, callback) => callback({cancel: true})
|
||||||
|
);
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import * as path from "path";
|
||||||
import {createSettingsWindow} from "./settings/main";
|
import {createSettingsWindow} from "./settings/main";
|
||||||
let tray: any = null;
|
let tray: any = null;
|
||||||
app.whenReady().then(async () => {
|
app.whenReady().then(async () => {
|
||||||
if (await getConfig("windowStyle") == "discord") {
|
if ((await getConfig("windowStyle")) == "discord") {
|
||||||
tray = new Tray(path.join(__dirname, "../", "/assets/dsc-tray.png"));
|
tray = new Tray(path.join(__dirname, "../", "/assets/dsc-tray.png"));
|
||||||
const contextMenu = Menu.buildFromTemplate([
|
const contextMenu = Menu.buildFromTemplate([
|
||||||
{
|
{
|
||||||
|
@ -28,7 +28,7 @@ app.whenReady().then(async () => {
|
||||||
tray = new Tray(path.join(__dirname, "../", "/assets/ac_plug.png"));
|
tray = new Tray(path.join(__dirname, "../", "/assets/ac_plug.png"));
|
||||||
const contextMenu = Menu.buildFromTemplate([
|
const contextMenu = Menu.buildFromTemplate([
|
||||||
{
|
{
|
||||||
label: "ArmCord",
|
label: "ArmCord"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "separator"
|
type: "separator"
|
||||||
|
|
|
@ -139,7 +139,7 @@ export async function checkIfConfigExists() {
|
||||||
contentPath = path.join(__dirname, "/ts-out/content/setup.html");
|
contentPath = path.join(__dirname, "/ts-out/content/setup.html");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (await getConfig("doneSetup") == false) {
|
if ((await getConfig("doneSetup")) == false) {
|
||||||
console.log("First run of the ArmCord. Starting setup.");
|
console.log("First run of the ArmCord. Starting setup.");
|
||||||
setup();
|
setup();
|
||||||
isSetup = true;
|
isSetup = true;
|
||||||
|
|
|
@ -6,7 +6,7 @@ import {BrowserWindow, shell, app, ipcMain, dialog, clipboard} from "electron";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import {checkIfConfigIsBroken, firstRun, getConfig, contentPath, isSetup} from "./utils";
|
import {checkIfConfigIsBroken, firstRun, getConfig, contentPath, isSetup} from "./utils";
|
||||||
import {registerIpc} from "./ipc";
|
import {registerIpc} from "./ipc";
|
||||||
import startServer from "./socket"
|
import startServer from "./socket";
|
||||||
import contextMenu from "electron-context-menu";
|
import contextMenu from "electron-context-menu";
|
||||||
import os from "os";
|
import os from "os";
|
||||||
export var icon: string;
|
export var icon: string;
|
||||||
|
@ -23,8 +23,7 @@ contextMenu({
|
||||||
async function doAfterDefiningTheWindow() {
|
async function doAfterDefiningTheWindow() {
|
||||||
checkIfConfigIsBroken();
|
checkIfConfigIsBroken();
|
||||||
registerIpc();
|
registerIpc();
|
||||||
mainWindow.webContents.userAgent =
|
mainWindow.webContents.userAgent = `Mozilla/5.0 (X11; ${os.type()} ${os.arch()}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36`; //fake useragent for screenshare to work
|
||||||
`Mozilla/5.0 (X11; ${os.type()} ${os.arch()}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36`; //fake useragent for screenshare to work
|
|
||||||
mainWindow.webContents.setWindowOpenHandler(({url}) => {
|
mainWindow.webContents.setWindowOpenHandler(({url}) => {
|
||||||
shell.openExternal(url);
|
shell.openExternal(url);
|
||||||
return {action: "deny"};
|
return {action: "deny"};
|
||||||
|
@ -43,8 +42,8 @@ async function doAfterDefiningTheWindow() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
console.log(contentPath);
|
console.log(contentPath);
|
||||||
if (await getConfig("inviteWebsocket") == true) {
|
if ((await getConfig("inviteWebsocket")) == true) {
|
||||||
startServer()
|
startServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -191,5 +190,5 @@ export function createInviteWindow() {
|
||||||
spellcheck: true
|
spellcheck: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
inviteWindow.hide()
|
inviteWindow.hide();
|
||||||
}
|
}
|
Loading…
Reference in a new issue