/*
* gamja WhatsApp theme
* Load AFTER gamja's own style.css:
*
*
*
* Works on stock gamja. Apply gamja-whatsapp.patch as well to get
* your own messages as green right-side bubbles and drop the brackets.
*/
:root {
--wa-green: #00a884;
--wa-green-dark: #008069;
--wa-panel: #ffffff;
--wa-header: #f0f2f5;
--wa-chat-bg: #efeae2;
--wa-dots: rgba(0, 0, 0, 0.035);
--wa-in: #ffffff;
--wa-out: #d9fdd3;
--wa-text: #111b21;
--wa-text-2: #667781;
--wa-divider: #e9edef;
--wa-hover: #f5f6f6;
--wa-active: #f0f2f5;
--wa-input: #ffffff;
--wa-pill: #ffffff;
--wa-pill-text: #54656f;
--wa-unread-bar: rgba(255, 255, 255, 0.55);
--wa-shadow: 0 1px 0.5px rgba(11, 20, 26, 0.13);
--wa-mention: #027eb5;
--wa-error: #ea0038;
/* remap gamja's own variables so anything left unstyled still matches */
--main-background: var(--wa-panel);
--main-color: var(--wa-text);
--sidebar-background: var(--wa-panel);
--expander-background: var(--wa-header);
--expander-background-hover: var(--wa-divider);
--expander-border: var(--wa-text-2);
--button-color: #ffffff;
--button-background: var(--wa-green);
--button-background-hover: var(--wa-green-dark);
--button-border: transparent;
--danger-button-color: #ffffff;
--danger-button-background: var(--wa-error);
--danger-button-background-hover: #c2002f;
--danger-button-border: transparent;
--green: var(--wa-green);
--gray: var(--wa-text-2);
--red: var(--wa-error);
}
@media (prefers-color-scheme: dark) {
:root {
--wa-panel: #111b21;
--wa-header: #202c33;
--wa-chat-bg: #0b141a;
--wa-dots: rgba(255, 255, 255, 0.025);
--wa-in: #202c33;
--wa-out: #005c4b;
--wa-text: #e9edef;
--wa-text-2: #8696a0;
--wa-divider: #222d34;
--wa-hover: #202c33;
--wa-active: #2a3942;
--wa-input: #2a3942;
--wa-pill: #182229;
--wa-pill-text: #8696a0;
--wa-unread-bar: rgba(17, 27, 33, 0.6);
--wa-shadow: 0 1px 0.5px rgba(0, 0, 0, 0.3);
--wa-mention: #53bdeb;
--wa-error: #f15c6d;
}
}
/* ---------- base ---------- */
html {
scrollbar-color: var(--wa-text-2) transparent;
}
body {
font-family: "Segoe UI", "Helvetica Neue", Helvetica, "Lucida Grande", Arial, Ubuntu, Cantarell, "Fira Sans", sans-serif;
font-size: 14.2px;
color: var(--wa-text);
background: var(--wa-panel);
-webkit-font-smoothing: antialiased;
}
a {
color: var(--wa-mention);
}
button {
border: none;
border-radius: 18px;
padding: 0.4rem 0.9rem;
font: inherit;
font-size: 0.85rem;
font-weight: 500;
}
/* ---------- left panel: chat list ---------- */
#buffer-list {
background: var(--wa-panel);
border-right: 1px solid var(--wa-divider);
}
#buffer-list ul {
min-width: 220px;
}
#buffer-list li a,
#buffer-list li:not(.type-server) a {
position: relative;
display: block;
padding: 13px 40px 13px 16px;
color: var(--wa-text);
font-size: 15.5px;
border-bottom: 1px solid var(--wa-divider);
text-decoration: none;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
#buffer-list li.type-server a {
font-weight: 600;
color: var(--wa-text-2);
font-size: 13px;
text-transform: uppercase;
letter-spacing: 0.04em;
background: var(--wa-header);
}
#buffer-list li a:hover {
background: var(--wa-hover);
text-decoration: none;
}
#buffer-list li.active a {
color: var(--wa-text);
background: var(--wa-active);
}
#buffer-list li.error a {
color: var(--wa-error);
}
#buffer-list li.unread-message a,
#buffer-list li.unread-highlight a {
color: var(--wa-text);
font-weight: 600;
}
/* green unread badge on the right, "@" for mentions */
#buffer-list li.unread-message a::after,
#buffer-list li.unread-highlight a::after {
content: "";
position: absolute;
right: 16px;
top: 50%;
width: 10px;
height: 10px;
margin-top: -5px;
border-radius: 50%;
background: var(--wa-green);
}
#buffer-list li.unread-highlight a::after {
content: "@";
width: 20px;
height: 20px;
margin-top: -10px;
color: #ffffff;
font-size: 12px;
font-weight: 700;
line-height: 20px;
text-align: center;
}
/* ---------- chat header ---------- */
#buffer-header {
background: var(--wa-header);
color: var(--wa-text);
border-bottom: 1px solid var(--wa-divider);
min-height: 59px;
align-items: center;
}
#buffer-header .title {
display: block;
padding: 8px 16px 0;
font-size: 16px;
font-weight: 500;
}
#buffer-header .description {
padding: 2px 16px 8px;
color: var(--wa-text-2);
font-size: 13px;
}
#buffer-header .actions {
align-items: center;
gap: 8px;
padding: 0 12px;
}
#buffer-header .actions button {
border-width: 0;
}
#buffer-header .status-here {
color: var(--wa-green);
}
/* ---------- chat area ---------- */
#buffer {
color: var(--wa-text-2);
background-color: var(--wa-chat-bg);
/* cheap dot wallpaper, no image request */
background-image: radial-gradient(var(--wa-dots) 1.2px, transparent 1.4px);
background-size: 22px 22px;
}
#buffer .logline-list {
padding: 12px 6% 16px;
}
#buffer .logline {
overflow: visible;
overflow-wrap: anywhere;
margin: 2px 0;
line-height: 1.35;
}
/* --- message bubbles --- */
#buffer .logline.talk,
#buffer .logline.me-tell {
position: relative;
width: fit-content;
max-width: min(65%, 640px);
margin: 6px 0 2px 8px;
padding: 6px 7px 8px 9px;
color: var(--wa-text);
background: var(--wa-in);
border-radius: 7.5px;
border-top-left-radius: 0;
box-shadow: var(--wa-shadow);
white-space: pre-line;
}
/* tail */
#buffer .logline.talk::before,
#buffer .logline.me-tell::before {
content: "";
position: absolute;
top: 0;
left: -8px;
width: 8px;
height: 13px;
background: inherit;
clip-path: polygon(0 0, 100% 0, 100% 100%);
}
/* reserves room so the timestamp never sits on top of the text */
#buffer .logline.talk::after,
#buffer .logline.me-tell::after {
content: "";
display: inline-block;
width: 44px;
height: 1px;
}
#buffer .logline.talk .timestamp,
#buffer .logline.me-tell .timestamp {
position: absolute;
right: 7px;
bottom: 3px;
color: var(--wa-text-2);
font-size: 11px;
line-height: 15px;
text-decoration: none;
}
#buffer .logline.talk .nick {
font-weight: 500;
font-size: 12.8px;
text-decoration: none;
}
#buffer .logline.me-tell {
font-style: italic;
}
/* someone mentioned you */
#buffer .logline.highlight .nick {
color: var(--wa-green);
background: none;
}
#buffer .logline.talk.highlight {
box-shadow: var(--wa-shadow), inset 3px 0 0 var(--wa-green);
}
/* --- with gamja-whatsapp.patch applied --- */
/* sender name on its own line, brackets hidden */
#buffer .logline.talk .sender {
display: block;
font-size: 0;
line-height: 1.4;
margin-bottom: 1px;
}
#buffer .logline.talk .sender .nick {
font-size: 12.8px;
}
#buffer .logline.talk .text {
white-space: pre-wrap;
}
/* your own messages: green, right side */
#buffer .logline.talk.self,
#buffer .logline.me-tell.self {
margin-left: auto;
margin-right: 8px;
background: var(--wa-out);
border-top-left-radius: 7.5px;
border-top-right-radius: 0;
}
#buffer .logline.talk.self::before,
#buffer .logline.me-tell.self::before {
left: auto;
right: -8px;
clip-path: polygon(0 0, 100% 0, 0 100%);
}
#buffer .logline.talk.self .sender {
display: none;
}
/* --- joins, parts, modes, etc: small centered system pills --- */
#buffer .logline:not(.talk):not(.me-tell):not(.motd):not(.error) {
width: fit-content;
max-width: 80%;
margin: 6px auto;
padding: 5px 12px;
color: var(--wa-pill-text);
background: var(--wa-pill);
border-radius: 7.5px;
box-shadow: var(--wa-shadow);
font-size: 12.5px;
text-align: center;
white-space: normal;
}
#buffer .logline:not(.talk):not(.me-tell) .timestamp {
display: none;
}
#buffer .logline:not(.talk):not(.me-tell) .nick {
color: inherit;
font-weight: 600;
}
#buffer .logline.motd {
color: var(--wa-text);
font-family: monospace;
font-size: 12.5px;
}
#buffer .logline.error {
width: fit-content;
margin: 6px auto;
padding: 5px 12px;
color: var(--wa-error);
background: var(--wa-pill);
border-radius: 7.5px;
font-size: 12.5px;
}
/* --- date + unread separators --- */
#buffer .separator::before,
#buffer .separator::after {
display: none;
}
#buffer .date-separator {
display: block;
width: fit-content;
margin: 12px auto;
padding: 5px 12px;
color: var(--wa-pill-text);
background: var(--wa-pill);
border-radius: 7.5px;
box-shadow: var(--wa-shadow);
font-size: 12.5px;
font-variant: normal;
text-transform: uppercase;
}
#buffer .unread-separator {
display: block;
margin: 10px -7%;
padding: 6px 0;
color: var(--wa-text-2);
background: var(--wa-unread-bar);
font-size: 12.5px;
font-variant: normal;
text-transform: uppercase;
text-align: center;
}
/* ---------- composer ---------- */
#composer {
background: var(--wa-header);
border-top: none;
padding: 8px 16px;
}
#composer input {
height: 42px;
padding: 9px 12px;
color: var(--wa-text);
border-radius: 8px;
font: inherit;
font-size: 15px;
}
#composer input,
#composer input:focus {
background: var(--wa-input);
}
#composer input::placeholder {
color: var(--wa-text-2);
}
/* ---------- right panel: members ---------- */
#member-list {
background: var(--wa-panel);
border-left: 1px solid var(--wa-divider);
}
#member-list-header {
background: var(--wa-header);
color: var(--wa-text-2);
border-left: none;
border-bottom: 1px solid var(--wa-divider);
padding: 0 16px;
min-height: 59px;
display: flex;
align-items: center;
font-size: 14px;
}
#member-list ul {
min-width: 180px;
}
#member-list li a {
padding: 10px 16px;
color: var(--wa-text);
border-bottom: 1px solid var(--wa-divider);
text-decoration: none;
}
#member-list li a:hover {
background: var(--wa-hover);
}
#member-list li a.away {
color: var(--wa-text-2);
}
/* "group admin" style for ops */
.membership.owner,
.membership.admin,
.membership.op {
color: var(--wa-green);
}
/* ---------- connect screen + dialogs ---------- */
#connect {
color: var(--wa-text);
background: var(--wa-header);
}
#connect form {
max-width: 380px;
margin-top: 8vh;
padding: 28px 32px;
background: var(--wa-panel);
border-radius: 3px;
box-shadow: 0 17px 50px 0 rgba(11, 20, 26, 0.19), 0 12px 15px 0 rgba(11, 20, 26, 0.24);
}
form input[type="text"],
form input[type="username"],
form input[type="password"],
form input[type="url"],
form input[type="email"],
form input[type="search"] {
padding: 8px 2px;
color: var(--wa-text);
background: transparent;
border: none;
border-bottom: 2px solid var(--wa-divider);
border-radius: 0;
outline: none;
transition: border-color 0.15s;
}
form input[type="text"]:focus,
form input[type="username"]:focus,
form input[type="password"]:focus,
form input[type="url"]:focus,
form input[type="email"]:focus,
form input[type="search"]:focus {
border-bottom-color: var(--wa-green);
}
/* composer input is a text input inside a form, undo the line above */
#composer input,
#composer input:focus {
border: none;
}
.dialog {
background-color: rgba(11, 20, 26, 0.6);
}
.dialog .dialog-body {
color: var(--wa-text);
background: var(--wa-panel);
border: none;
border-radius: 3px;
box-shadow: 0 17px 50px 0 rgba(11, 20, 26, 0.19), 0 12px 15px 0 rgba(11, 20, 26, 0.24);
}
#error-msg {
color: #ffffff;
background: var(--wa-error);
border-radius: 6px;
}
ul.switcher-list li a.selected {
background: var(--wa-active);
}
.expander {
background: var(--wa-header);
}
/* ---------- mobile ---------- */
@media (max-width: 640px) {
#buffer .logline-list {
padding: 10px 10px 14px;
}
#buffer .logline.talk,
#buffer .logline.me-tell {
max-width: 85%;
}
#buffer .unread-separator {
margin-left: -10px;
margin-right: -10px;
}
#buffer-list ul,
#member-list ul {
min-width: 0;
}
#buffer-list.expand ul,
#member-list.expand ul {
min-width: 220px;
}
}
/* force dark mode for everyone, neutral black */
:root {
--wa-panel: #0f0f0f;
--wa-header: #1c1c1c;
--wa-chat-bg: #080808;
--wa-dots: rgba(255, 255, 255, 0.025);
--wa-in: #1f1f1f;
--wa-out: #005c4b;
--wa-text: #ececec;
--wa-text-2: #8c8c8c;
--wa-divider: #232323;
--wa-hover: #1a1a1a;
--wa-active: #2a2a2a;
--wa-input: #262626;
--wa-pill: #171717;
--wa-pill-text: #8c8c8c;
--wa-unread-bar: rgba(20, 20, 20, 0.6);
--wa-shadow: 0 1px 0.5px rgba(0, 0, 0, 0.5);
--wa-mention: #53bdeb;
--wa-error: #f15c6d;
color-scheme: dark;
}