LarpixClient/webroot/style.css
olcxja d4c3b15367 fix a few bugs
- make mobile vc tiles match pc version
- translate missing blahs
- make font appear on avatar svg
2026-08-25 20:49:31 +02:00

1966 lines
46 KiB
CSS

@font-face {
font-family: 'Nunito';
src: URL('Nunito-Regular.ttf') format('truetype');
}
@font-face {
font-family: 'NotoColorEmoji';
src: URL('NotoColorEmoji-Regular.ttf') format('truetype');
}
:root {
--main-bg-color: rgb(20, 20, 20);
--text-color: rgb(240, 240, 245);
--darker-text-color: rgb(210, 210, 215);
--icon-button-size: 2rem;
--press-scale: scale(0.92);
--light-border-color: rgba(255, 255, 255, 0.08);
--button-margin: 0.4rem;
--icon-button-height: 3.4rem;
--button-height: 2.4rem;
--border-width: 0.09rem;
--big-default: rgb(207, 207, 207);
--big-red: hsl(0, 60%, 55%);
--big-green: hsl(120, 60%, 55%);
}
*:focus {
outline: none;
box-shadow: none;
}
.red {
color: var(--big-red);
}
.green {
color: var(--big-green);
}
.mininote {
font-size: 80%;
padding: 0 0.5rem;
}
.aqua {
color: rgb(0 139 200);
}
html {
font-size: max(16px, calc(100vw / 120));
}
body {
padding-top: env(safe-area-inset-top);
padding-bottom: env(safe-area-inset-bottom);
background-color: var(--main-bg-color);
overflow: hidden;
display: flex;
height: 100dvh;
width: 100%;
}
main, loading {
display: flex;
height: 100%;
width: 100%;
overflow: hidden;
}
loading {
justify-content: center;
align-items: center;
width: 100%;
}
* {
font-size: 1rem;
scrollbar-width: none;
box-sizing: border-box;
margin: 0;
padding: 0;
transition: all 0.2s ease;
color: var(--text-color);
font-family: "Nunito", "NotoColorEmoji", sans-serif;
-webkit-tap-highlight-color: transparent;
user-select: none !important;
-webkit-user-drag: none !important;
scrollbar-width: none;
-ms-overflow-style: none;
}
::-webkit-scrollbar {
display: none;
width: 0 !important;
height: 0 !important;
background: transparent;
}
button, input, textarea {
border-radius: 0.8rem;
background-color: rgba(255, 255, 255, 0.05);
margin: var(--button-margin);
padding: var(--button-margin);
height: var(--button-height);
display: flex;
cursor: pointer;
align-items: center;
justify-content: flex-start;
border: var(--border-width) solid var(--light-border-color);
backface-visibility: hidden;
transform: translateZ(0);
will-change: transform;
transform-origin: center center;
touch-action: manipulation;
-webkit-touch-callout: none;
}
input, textarea {
padding-left: calc(var(--button-margin) * 2);
-webkit-touch-callout: default;
user-select: text !important;
-webkit-user-select: text !important;
}
textarea {
resize: none;
}
.chat-message-text, .chat-message-author, .chat-message-timestamp,
.profile-name, .profile-bio, .profile-id-host,
.dm-username, .group-name, .room-name {
user-select: text !important;
-webkit-user-select: text !important;
cursor: auto;
}
indicator {
content: "";
position: absolute;
width: 0;
height: 0;
left: -0.08rem;
border: 0.15rem solid transparent;
border-radius: 0.8rem;
transform: translateY(calc( ( var(--icon-button-height) + (var(--button-margin) * 2) ) / 2 - 0.25rem));
}
indicator.notification {
content: "";
position: absolute;
width: 0;
height: 0.5rem;
left: -0.08rem;
border: 0.15rem solid var(--text-color);
border-radius: 0.8rem;
transform: translateY(calc( ( var(--icon-button-height) + (var(--button-margin) * 2) ) / 2 - 0.25rem));
}
indicator.active {
content: "";
position: absolute;
width: 0;
height: 2rem;
left: -0.08rem;
border: 0.15rem solid var(--text-color);
border-radius: 0.8rem;
transform: translateY(calc( ( var(--icon-button-height) + (var(--button-margin) * 2) ) / 2 - 1rem));
}
.icon-button {
height: var(--icon-button-height);
width: var(--icon-button-height);
justify-content: center;
overflow: hidden;
}
.icon-button svg {
width: var(--icon-button-size);
height: var(--icon-button-size);
pointer-events: none !important;
}
.icon-button img {
width: calc(var(--icon-button-height) - (var(--border-width) * 2));
height: calc(var(--icon-button-height) - (var(--border-width) * 2));
pointer-events: none !important;
border-radius: 0.65rem;
aspect-ratio: 1 / 1;
flex-shrink: 0;
}
button {
overflow: hidden;
}
button svg {
pointer-events: none !important;
}
button img {
pointer-events: none !important;
}
.reaction-pill {
backface-visibility: hidden;
transform: translateZ(0);
}
roomcontent {
display: flex;
flex-direction: column;
height: 100%;
flex-grow: 1;
min-width: 0;
}
roomcontent2 {
display: flex;
flex-direction: column;
height: calc(100% - (var(--button-height) * 1.5));
width: 100%;
}
sidebar {
display: flex;
flex-direction: column;
flex-shrink: 0;
height: 100%;
width: calc(var(--icon-button-height) + (var(--button-margin) * 2) + var(--border-width));
border-right: var(--border-width) solid var(--light-border-color);
}
sidebar:not(.second)::-webkit-scrollbar {
display: none;
}
sidebar:not(.second) {
-ms-overflow-style: none;
scrollbar-width: none;
}
#roomsbar roomcontent2 {
overflow-y: auto;
overflow-x: hidden;
}
sidebar.second {
width: 17rem;
min-width: 17rem;
max-width: 17rem;
flex-shrink: 0;
}
.sidebar-section-header {
display: flex;
align-items: center;
justify-content: space-between;
}
.collapse-text-button {
padding-left: calc(var(--button-margin) + 0.2rem);
flex-shrink: 0;
flex-grow: 1;
border: none;
background-color: transparent;
height: 2rem;
font-weight: 600;
gap: 0.3rem;
}
.collapse-text-button .chevron {
width: 1.25rem;
height: 1.25rem;
}
.collapse-text-button.collapsed .chevron {
transform: rotate(-90deg);
}
.add-action-button {
border: none;
background-color: transparent;
height: 2rem;
width: 2rem;
padding: 0;
flex-shrink: 0;
justify-content: center;
color: rgba(255, 255, 255, 0.5);
}
.add-action-button svg {
width: 1.25rem;
height: 1.25rem;
}
hr {
border: none;
height: 0;
background-color: transparent;
border-bottom: var(--border-width) solid var(--light-border-color);
width: 60%;
margin-left: 20%;
}
#notification-container {
padding-top: env(safe-area-inset-top);
position: fixed;
top: 1.5rem;
left: 50%;
transform: translateX(-50%);
z-index: 9999;
display: flex;
flex-direction: column;
gap: 0.8rem;
pointer-events: none;
align-items: center;
}
.notification {
background: rgba(255, 255, 255, 0.015);
backdrop-filter: blur(1.2rem);
-webkit-backdrop-filter: blur(1.2rem);
border: var(--border-width) solid var(--light-border-color);
border-radius: 0.9rem;
padding: 0.8rem 1.3rem;
color: var(--text-color);
font-size: 1rem;
font-weight: 500;
text-align: center;
box-shadow: 0 0.5rem 2rem rgba(0, 0, 0, 0.4);
opacity: 0;
transform: translateY(-2rem);
transition:
opacity 0.2s ease,
transform 0.25s cubic-bezier(0.175, 0.885, 0.32, 1.275),
background-color 0.15s ease;
}
.notification.show {
opacity: 1;
transform: translateY(0);
}
.notification.info {
border-color: var(--big-default);
}
.notification.error {
border-color: var(--big-red);
}
.notification.success {
border-color: var(--big-green);
}
roomtopbar {
height: calc(var(--button-height) * 1.5);
display: flex;
flex-direction: row;
align-items: center;
z-index: 10;
background-color: var(--main-bg-color);
width: 100%;
border-bottom: var(--border-width) solid var(--light-border-color);
line-height: calc(var(--button-height) * 1.5);
font-weight: bold;
padding-left: calc(var(--button-margin) * 3);
padding-right: calc(var(--button-margin) * 3);
font-size: 1.5rem;
}
sidebar.second#roomdetailsbar {
height: 100%;
display: flex;
flex-direction: column;
border-left: var(--border-width) solid var(--light-border-color);
}
fullcontainer {
width: 100%;
height: 100%;
}
herotitle {
font-weight: bold;
font-size: 1.6rem;
}
.input-group {
text-align: left;
display: flex;
flex-direction: column;
gap: 0.2rem;
width: 90%;
max-width: 30rem;
margin: 0 auto;
}
.input-group label {
font-size: 0.75rem;
font-weight: 800;
margin-left: 0.6rem;
margin-bottom: -0.2rem;
opacity: 0.4;
letter-spacing: 0.05rem;
position: relative;
z-index: 1;
}
.submit-button {
justify-content: center;
background-color: var(--text-color);
color: var(--main-bg-color);
font-weight: 800;
border: none;
font-size: 1.05rem;
}
.bottom-element {
margin-top: auto;
}
blah, inherit, .inherit {
all: inherit;
padding: 0;
margin: 0;
display: inline;
opacity: 1;
border: none;
background-color: transparent;
}
space{
margin-left: 0.4rem;
}
.context-menu {
position: fixed;
background: var(--main-bg-color);
border: var(--border-width) solid var(--light-border-color);
border-radius: 0.8rem;
padding: 0.4rem;
display: flex;
flex-direction: column;
gap: 0.2rem;
z-index: 2000;
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.4);
opacity: 0;
transform: scale(0.95);
transform-origin: center left;
pointer-events: none;
}
.context-menu.show {
opacity: 1;
transform: scale(1);
pointer-events: auto;
}
.context-menu button {
margin: 0;
padding: 0.5rem 1rem;
border: none;
background: transparent;
width: 100%;
min-width: 10rem;
justify-content: flex-start;
gap: 0.5rem;
font-weight: 600;
}
.topbar-action-btn {
display: flex;
background: transparent;
border: none;
height: 2.4rem;
width: 2.4rem;
padding: 0;
margin: 0;
margin-right: 0.8rem;
align-items: center;
justify-content: center;
flex-shrink: 0;
color: var(--text-color);
cursor: pointer;
}
.topbar-action-btn:active, .topbar-action-btn.is-pressed {
background-color: rgba(255, 255, 255, 0.1);
transform: var(--press-scale);
}
.topbar-action-btn.right {
margin-right: 0;
margin-left: 0.2rem;
}
.topbar-action-btn svg {
width: 1.5rem;
height: 1.5rem;
}
.mobile-nav-btn {
display: none;
background: transparent;
border: none;
height: 2.4rem;
width: 2.4rem;
padding: 0;
margin: 0;
margin-right: 0.8rem;
align-items: center;
justify-content: center;
flex-shrink: 0;
color: var(--text-color);
cursor: pointer;
}
.mobile-nav-btn:active, .mobile-nav-btn.is-pressed {
background-color: rgba(255, 255, 255, 0.1);
transform: var(--press-scale);
}
.mobile-nav-btn svg {
width: 1.5rem;
height: 1.5rem;
}
.flex-spacer {
flex-grow: 1;
}
@media (max-width: 55rem) {
.mobile-nav-btn {
display: flex;
}
main {
position: relative;
width: 100vw;
overflow: hidden;
}
sidebar, sidebar.second, roomcontent {
position: absolute !important;
height: 100%;
transition: all 0.25s cubic-bezier(0.25, 1, 0.5, 1);
}
sidebar {
left: 0;
z-index: 1;
}
#roomsbar {
left: calc(var(--icon-button-height) + (var(--button-margin) * 2) + var(--border-width));
width: calc(100vw - (var(--icon-button-height) + (var(--button-margin) * 2) + var(--border-width))) !important;
min-width: unset !important;
max-width: none !important;
z-index: 1;
}
roomcontent {
left: 0;
width: 100vw !important;
transform: translateX(100vw);
border-right: none !important;
z-index: 2;
background-color: var(--main-bg-color);
}
#roomdetailsbar {
left: auto !important;
right: 0;
width: 90vw !important;
min-width: unset !important;
max-width: none !important;
transform: translateX(100vw);
z-index: 10;
background-color: var(--main-bg-color);
}
main.mobile-content sidebar,
main.mobile-content #roomsbar {
transform: translateX(-30vw);
}
main.mobile-content roomcontent {
transform: translateX(0);
}
main.mobile-details sidebar,
main.mobile-details #roomsbar {
transform: translateX(-60vw);
}
main.mobile-details roomcontent {
transform: translateX(-30vw);
}
main.mobile-details #roomdetailsbar {
transform: translateX(0);
}
roomcontent::after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 10;
cursor: pointer;
opacity: 0;
pointer-events: none;
transition: all 0.25s cubic-bezier(0.25, 1, 0.5, 1);
}
main.mobile-details roomcontent::after {
opacity: 1;
pointer-events: auto;
}
}
.collapse-text-button.selected {
background-color: rgba(240, 240, 245, 0.1);
}
.submit-button.tab-inactive {
background-color: transparent;
color: var(--text-color);
}
.list-container {
flex-grow: 1;
display: flex;
flex-direction: column;
align-items: center;
padding: 1rem;
overflow-y: auto;
gap: 0.5rem;
}
.list-container.empty {
justify-content: center;
text-align: center;
opacity: 0.5;
}
.list-container.no-flex-grow {
flex-grow: 0;
}
.collapsible-wrapper {
display: grid;
grid-template-rows: 1fr;
transition: grid-template-rows 0.25s cubic-bezier(0.25, 1, 0.5, 1);
}
.collapsible-wrapper.collapsed {
grid-template-rows: 0fr;
}
.collapsible-inner {
overflow: hidden;
}
.invite-entry {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.8rem 1rem;
border: var(--border-width) solid var(--light-border-color);
border-radius: 0.8rem;
width: 100%;
background: rgba(255, 255, 255, 0.02);
flex-shrink: 0;
}
.invite-info {
display: flex;
align-items: center;
gap: 1rem;
}
.invite-pfp {
width: 2.8rem;
height: 2.8rem;
border-radius: 0.8rem;
border: var(--border-width) solid rgba(255, 255, 255, 0.2);
object-fit: cover;
aspect-ratio: 1 / 1;
flex-shrink: 0;
}
.invite-details {
display: flex;
flex-direction: column;
text-align: left;
}
.invite-name {
font-weight: 700;
font-size: 1.05rem;
}
.invite-desc {
font-size: 0.85rem;
opacity: 0.6;
}
.invite-actions {
display: flex;
gap: 0.5rem;
}
.invite-actions button {
margin: 0;
border-color: rgba(255, 255, 255, 0.2);
width: 3.1rem;
height: 3.1rem;
}
.room-entry {
display: flex;
align-items: center;
gap: 0.1rem;
padding: 1.5rem 0.6rem;
width: 100%;
border: none;
background: transparent;
border-radius: 0.8rem;
flex-shrink: 0;
cursor: pointer;
margin: 0;
}
.room-pfp {
width: 2.2rem;
height: 2.2rem;
border-radius: 0.65rem;
border: var(--border-width) solid rgba(255, 255, 255, 0.2);
object-fit: cover;
pointer-events: none;
aspect-ratio: 1 / 1;
flex-shrink: 0;
}
.room-name {
font-weight: 600;
font-size: 1.05rem;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
pointer-events: none;
}
.chat-message {
display: flex;
gap: 1rem;
padding: 0.4rem 0.6rem;
margin: 0 -0.6rem;
border-radius: 0.8rem;
transition: background-color 0.15s ease;
}
@media (hover: hover) {
.chat-message:hover {
background-color: rgba(255, 255, 255, 0.04);
}
}
.chat-message:active, .chat-message.context-menu-open {
background-color: rgba(255, 255, 255, 0.04);
}
.chat-message.with-avatar {
margin-top: 0.8rem;
}
.chat-message-pfp {
width: 2.5rem;
height: 2.5rem;
border-radius: 0.65rem;
object-fit: cover;
flex-shrink: 0;
border: var(--border-width) solid rgba(255, 255, 255, 0.2);
aspect-ratio: 1 / 1;
}
.chat-message-content {
display: flex;
flex-direction: column;
flex-grow: 1;
}
.chat-message-header {
display: flex;
align-items: baseline;
gap: 0.5rem;
margin-bottom: 0.2rem;
display: none; /* hidden for consecutive */
}
.chat-message.with-avatar .chat-message-header {
display: flex;
}
.chat-message-author {
font-weight: bold;
font-size: 1.05rem;
}
.chat-message-timestamp {
font-size: 0.75rem;
opacity: 0.5;
}
.chat-message-text {
line-height: 1.4;
word-break: break-word;
white-space: pre-wrap;
}
@media (hover: hover) {
sidebarelement:hover indicator:not(.active) {
content: "";
position: absolute;
width: 0;
height: 1.2rem;
left: -0.08rem;
border: 0.15rem solid var(--text-color);
border-radius: 0.8rem;
transform: translateY(calc( ( var(--icon-button-height) + (var(--button-margin) * 2) ) / 2 - 0.6rem));
}
button:hover, input:not([type="range"]):hover, textarea:hover {
background-color: rgba(255, 255, 255, 0.1);
}
.submit-button:hover, .profile-action-btn:hover {
background-color: rgba(255, 255, 255, 0.5);
}
.add-action-button:hover {
background-color: rgba(255, 255, 255, 0.1);
color: var(--text-color);
}
.context-menu button:hover {
background-color: rgba(255, 255, 255, 0.08);
}
.invite-actions button:hover {
filter: brightness(0.93);
}
}
/* Suwaki ([type=range]) są wyłączone z efektu klikania całego pola -
przytrzymanie skaluje tylko uchwyt (patrz ::-webkit-slider-thumb:active). */
button:active, button.is-pressed,
input:not([type="range"]):active, input:not([type="range"]).is-pressed,
textarea:active, textarea.is-pressed {
background-color: rgba(255, 255, 255, 0.1);
transform: var(--press-scale);
}
#room-topbar-clickable {
transform: scale(1);
}
.invite-actions button:active {
filter: brightness(0.85);
}
button.active, input.active, textarea.active {
background-color: rgba(255, 255, 255, 0.1);
}
.submit-button:active, .submit-button.is-pressed, .profile-action-btn:active, .profile-action-btn.is-pressed {
background-color: rgba(255, 255, 255, 0.5);
}
.add-action-button:active, .add-action-button.is-pressed {
background-color: rgba(255, 255, 255, 0.1);
color: var(--text-color);
}
.context-menu button:active, .context-menu button.is-pressed {
background-color: rgba(255, 255, 255, 0.08);
}
sidebarelement:has(.icon-button:active) indicator:not(.active) {
content: "";
position: absolute;
width: 0;
height: 1.2rem;
left: -0.08rem;
border: 0.15rem solid var(--text-color);
border-radius: 0.8rem;
transform: translateY(calc( ( var(--icon-button-height) + (var(--button-margin) * 2) ) / 2 - 0.6rem));
}
.context-menu button.reaction-text-btn {
background-color: rgba(255, 255, 255, 0.03);
background: rgba(255, 255, 255, 0.05);
}
.context-menu button.reaction-text-btn:hover {
background-color: rgba(255, 255, 255, 0.06);
background: rgba(255, 255, 255, 0.08);
}
.profile-popup-container {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 3000;
display: flex;
justify-content: center;
align-items: center;
pointer-events: none;
}
.profile-popup-container.show {
pointer-events: auto;
}
.profile-popup-bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0);
backdrop-filter: blur(0);
-webkit-backdrop-filter: blur(0);
transition: background 0.3s ease, backdrop-filter 0.3s ease, -webkit-backdrop-filter 0.3s ease;
}
.profile-popup-container.show .profile-popup-bg {
background: rgba(0, 0, 0, 0.4);
backdrop-filter: blur(0.25rem);
-webkit-backdrop-filter: blur(0.25rem);
}
.profile-popup-content {
position: relative;
width: 90vw;
max-width: 31rem;
height: 85vh;
max-height: 44rem;
background: var(--main-bg-color);
border: var(--border-width) solid var(--light-border-color);
border-radius: 0.9rem;
overflow: hidden;
box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.5);
opacity: 0;
transform: scale(0.6);
transition: all 0.2s ease;
display: flex;
flex-direction: column;
}
.popup-auto-height {
height: auto;
max-height: 85vh;
}
button.profile-action-btn.popup-action-btn {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
align-self: stretch;
margin-top: 0;
}
button.profile-action-btn.popup-action-btn blah {
align-self: center;
}
button.profile-action-btn.popup-btn-cancel {
background: rgba(255, 255, 255, 0.05);
color: var(--text-color);
border: var(--border-width) solid var(--light-border-color);
}
button.profile-action-btn.popup-btn-cancel:hover {
background: rgba(255, 255, 255, 0.1);
}
button.profile-action-btn.popup-btn-danger, button.submit-button.popup-btn-danger {
background: var(--big-red) !important;
color: white !important;
border: none;
}
button.profile-action-btn.popup-btn-danger:hover, button.submit-button.popup-btn-danger:hover {
filter: brightness(0.85);
}
.profile-popup-container.show .profile-popup-content {
transform: scale(1);
opacity: 1;
transition: all 0.2s ease;
}
.profile-popup-close-btn {
position: absolute;
top: 1rem;
right: 1rem;
z-index: 10;
background: rgba(0, 0, 0, 0.4);
backdrop-filter: blur(0.25rem);
-webkit-backdrop-filter: blur(0.25rem);
border: none;
width: 2.5rem;
height: 2.5rem;
border-radius: 0.8rem;
display: flex;
justify-content: center;
align-items: center;
padding: 0;
margin: 0;
cursor: pointer;
}
.profile-popup-close-btn svg {
width: 1.5rem;
height: 1.5rem;
}
.profile-popup-close-btn:hover {
background: rgba(255, 255, 255, 0.2);
}
#profile-popup-inner {
width: 100%;
height: 100%;
overflow-y: auto;
display: flex;
flex-direction: column;
}
.profile-banner {
width: 100%;
aspect-ratio: 494 / 200;
background: linear-gradient(135deg, rgba(255,255,255,0.05), rgba(255,255,255,0.1));
object-fit: cover;
flex-shrink: 0;
}
.profile-avatar-container {
position: relative;
margin-top: calc(-3.75 / 31 * 100%);
margin-left: calc(2 / 31 * 100%);
width: calc(7.5 / 31 * 100%);
flex-shrink: 0;
}
.profile-avatar-container::before {
content: "";
display: block;
padding-top: 100%;
}
.profile-avatar {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 0.8rem;
border: var(--border-width) solid rgba(255, 255, 255, 0.2);
object-fit: cover;
background: var(--main-bg-color);
aspect-ratio: 1 / 1;
}
.profile-info {
padding: 1rem 2rem 2rem 2rem;
display: flex;
flex-direction: column;
gap: 1rem;
}
.profile-name {
font-size: 2rem;
font-weight: 800;
line-height: 1.1;
margin-bottom: 0.2rem;
word-break: break-word;
}
.profile-id-host {
font-size: 1rem;
opacity: 0.6;
font-weight: 600;
}
.profile-bio {
font-size: 1.05rem;
line-height: 1.5;
white-space: pre-wrap;
background: rgba(255, 255, 255, 0.03);
padding: 1rem;
border-radius: 0.8rem;
border: var(--border-width) solid var(--light-border-color);
word-break: break-word;
}
.profile-action-btn {
align-self: flex-start;
padding: 0.6rem 1.5rem;
font-weight: 700;
background: var(--text-color);
color: var(--main-bg-color);
border-radius: 0.8rem;
margin-top: 0.5rem;
margin-left: 0;
height: auto;
}
input[type="range"] {
-webkit-appearance: none;
appearance: none;
display: block;
margin: 0;
padding: 0.4rem 0.05rem;
border: none;
width: 100%;
height: 0.375rem;
background: rgba(255, 255, 255, 0.1);
border-radius: 0.34rem;
outline: none;
}
#cropper-zoom {
margin: 0.625rem 0;
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 1rem;
height: 1rem;
border-radius: 50%;
background: var(--text-color);
cursor: pointer;
transition: transform 0.2s, background 0.2s;
}
input[type="range"]::-webkit-slider-thumb:hover {
transform: scale(1.08);
background: #fff;
}
input[type="range"]::-webkit-slider-thumb:active {
transform: scale(0.87);
}
input[type="range"]::-moz-range-thumb {
width: 1rem;
height: 1rem;
border-radius: 50%;
background: var(--text-color);
cursor: pointer;
transition: transform 0.2s, background 0.2s;
border: none;
}
input[type="range"]::-moz-range-thumb:hover {
transform: scale(1.08);
background: #fff;
}
input[type="range"]::-moz-range-thumb:active {
transform: scale(0.87);
}
roomcontent roomtopbar .room-action-pin,
roomcontent roomtopbar .room-action-call {
display: flex;
}
#roomdetailsbar roomtopbar .room-action-pin,
#roomdetailsbar roomtopbar .room-action-call {
display: none;
}
body.hide-topbar-pin roomcontent roomtopbar .room-action-pin { display: none !important; }
body.hide-topbar-pin #roomdetailsbar roomtopbar .room-action-pin { display: flex !important; }
body.hide-topbar-call roomcontent roomtopbar .room-action-call { display: none !important; }
body.hide-topbar-call #roomdetailsbar roomtopbar .room-action-call { display: flex !important; }
/* Toggle Switch */
.toggle-switch {
position: relative;
display: inline-block;
width: 3.4rem;
height: 1.8rem;
margin: var(--button-margin);
flex-shrink: 0;
}
label.toggle-switch {
opacity: 0.8;
}
.toggle-switch input {
opacity: 0;
width: 0;
height: 0;
}
.toggle-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(255, 255, 255, 0.1);
transition: .4s;
border-radius: 1.8rem;
border: var(--border-width) solid var(--light-border-color);
}
.toggle-slider:before {
position: absolute;
content: "";
height: 1.2rem;
width: 1.2rem;
left: 0.25rem;
top: 50%;
transform: translateY(-50%);
background-color: var(--text-color);
transition: .4s;
border-radius: 50%;
}
input:checked + .toggle-slider {
background-color: var(--text-color) !important;
border-color: var(--text-color) !important;
}
input:checked + .toggle-slider:before {
transform: translate(1.6rem, -50%);
background-color: var(--main-bg-color) !important;
}
.setting-row {
display: flex;
justify-content: space-between;
align-items: center;
width: auto;
box-sizing: border-box;
margin: var(--button-margin);
padding: 0.5rem;
border-radius: 0.8rem;
background-color: rgba(255, 255, 255, 0.02);
}
.setting-row:hover {
background-color: rgba(255, 255, 255, 0.04);
}
.setting-info {
display: flex;
flex-direction: column;
justify-content: center;
}
.setting-title {
font-size: 1.1rem;
font-weight: bold;
}
.setting-desc {
font-size: 0.85rem;
color: var(--darker-text-color);
margin-top: 0.2rem;
}
.unread-badge {
width: 0.65rem;
height: 0.65rem;
min-width: 0.65rem;
min-height: 0.65rem;
background-color: var(--big-red);
border-radius: 50%;
flex-shrink: 0;
margin-right: 0.5rem;
transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
transform: scale(0);
}
.unread-badge.show {
transform: scale(1);
animation: badge-appear 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
@keyframes badge-appear {
0% { transform: scale(0); }
100% { transform: scale(1); }
}
/* Custom Select */
.custom-select {
position: relative;
border-radius: 0.8rem;
background-color: rgba(255, 255, 255, 0.05);
margin: var(--button-margin);
height: var(--button-height);
display: flex;
cursor: pointer;
align-items: center;
border: var(--border-width) solid var(--light-border-color);
color: var(--text-color);
width: calc(100% - (var(--button-margin) * 2));
outline: none;
user-select: none;
z-index: 2; /* to appear above other elements if necessary */
}
.custom-select-value {
padding: var(--button-margin) calc(var(--button-margin) * 2);
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
}
.custom-select-value span {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.custom-select .chevron {
transition: transform 0.2s ease;
}
.custom-select.open .chevron {
transform: rotate(180deg);
}
.custom-select-options {
position: absolute;
top: calc(100% + 0.4rem);
left: 0;
width: 100%;
background-color: var(--main-bg-color);
border: var(--border-width) solid var(--light-border-color);
border-radius: 0.8rem;
max-height: 15rem;
overflow-y: auto;
z-index: 100;
opacity: 0;
visibility: hidden;
transform: translateY(-0.625rem);
transition: all 0.2s ease;
box-shadow: 0 0.25rem 0.75rem rgba(0,0,0,0.5);
padding: 0.4rem;
pointer-events: none;
}
.custom-select.open .custom-select-options {
opacity: 1;
visibility: visible;
transform: translateY(0);
pointer-events: auto;
}
.custom-select-option {
padding: var(--button-margin) calc(var(--button-margin) * 2);
height: var(--button-height);
display: flex;
align-items: center;
border-radius: 0.8rem;
background-color: transparent;
cursor: pointer;
transition: background-color 0.2s;
text-align: left;
margin-bottom: 0.2rem;
}
.custom-select-option:last-child {
margin-bottom: 0;
}
.custom-select-option:hover {
background-color: rgba(255, 255, 255, 0.1);
}
.custom-select-option.selected {
background-color: rgba(255, 255, 255, 0.15);
font-weight: bold;
}
/* Voice UI Styles */
#voice-call-popup {
position: fixed;
width: 37.5rem;
height: 28.125rem;
min-width: 20rem;
min-height: 14rem;
background-color: var(--main-bg-color);
border: var(--border-width) solid var(--light-border-color);
border-radius: 0.9rem;
box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.5);
z-index: 1000;
display: flex;
flex-direction: column;
overflow: hidden;
touch-action: none;
opacity: 0;
transform: translateY(1.5rem) scale(0.92);
pointer-events: none;
transition:
opacity 0.2s ease,
transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
#voice-call-popup.show {
opacity: 1;
transform: translateY(0) scale(1);
pointer-events: auto;
}
#voice-call-popup.hide {
opacity: 0;
transform: translateY(1rem) scale(0.95);
}
#voice-header {
height: 3rem;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.03);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 0.9375rem;
cursor: grab;
font-weight: bold;
user-select: none;
-webkit-user-select: none;
touch-action: none;
border-bottom: var(--border-width) solid var(--light-border-color);
}
#voice-header:active {
cursor: grabbing;
}
.voice-title {
display: flex;
align-items: center;
gap: 0.5rem;
color: var(--text-color);
min-width: 0;
}
.voice-title span {
font-size: 0.95rem;
font-weight: 700;
max-width: 16rem;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.voice-title svg {
width: 1.1rem;
height: 1.1rem;
pointer-events: none !important;
}
#voice-status {
display: flex;
align-items: center;
gap: 0.4rem;
flex-shrink: 0;
font-size: 0.75rem;
font-weight: 500;
color: var(--darker-text-color);
opacity: 0.75;
font-variant-numeric: tabular-nums;
}
#voice-status .status-dot {
width: 0.55rem;
height: 0.55rem;
flex-shrink: 0;
border-radius: 50%;
background: var(--darker-text-color);
}
#voice-status.connecting .status-dot {
background: hsl(35, 90%, 55%);
animation: voice-dot-pulse 1.2s ease-in-out infinite;
}
#voice-status.connected .status-dot {
background: var(--big-green);
}
#voice-status.disconnected .status-dot {
background: var(--big-red);
}
.status-ping:empty {
display: none;
}
@keyframes voice-dot-pulse {
50% { opacity: 0.25; }
}
#voice-users {
padding: 0.9375rem;
display: flex;
flex-wrap: wrap;
justify-content: center;
align-content: flex-start;
gap: 0.75rem;
overflow-y: auto;
flex-grow: 1;
touch-action: pan-y;
}
.voice-resize-handle {
position: absolute;
z-index: 6;
touch-action: none;
}
.voice-resize-n { top: 0; left: 0.6rem; right: 0.6rem; height: 0.45rem; cursor: ns-resize; }
.voice-resize-s { bottom: 0; left: 0.6rem; right: 0.6rem; height: 0.45rem; cursor: ns-resize; }
.voice-resize-e { right: 0; top: 0.6rem; bottom: 0.6rem; width: 0.45rem; cursor: ew-resize; }
.voice-resize-w { left: 0; top: 0.6rem; bottom: 0.6rem; width: 0.45rem; cursor: ew-resize; }
.voice-resize-ne, .voice-resize-nw, .voice-resize-se, .voice-resize-sw { width: 0.8rem; height: 0.8rem; }
.voice-resize-ne { top: 0; right: 0; cursor: nesw-resize; }
.voice-resize-nw { top: 0; left: 0; cursor: nwse-resize; }
.voice-resize-se { bottom: 0; right: 0; cursor: nwse-resize; }
.voice-resize-sw { bottom: 0; left: 0; cursor: nesw-resize; }
/*
* Kafelki rozmowy - wszystkie majÄ… TEN SAM rozmiar (kwadrat, --voice-tile-size
* ustawiany przez relayoutVoiceTiles() w voice.js). Kafelki płyną obok siebie,
* a gdy się nie mieszczą w rzędzie, flex-wrap przenosi je do następnego.
*/
.voice-tile {
position: relative;
width: var(--voice-tile-size, 9rem);
height: var(--voice-tile-size, 9rem);
flex: 0 0 auto;
background: var(--light-border-color);
background-size: cover;
background-position: center;
border-radius: 0.65rem;
overflow: hidden;
cursor: pointer;
border: calc(var(--border-width) * 2) solid rgba(85, 85, 85);
box-shadow: 0 0.25rem 0.625rem rgba(0, 0, 0, 0.3);
transition: border-color 0.15s ease, box-shadow 0.2s ease;
}
.voice-tile.tile-enter {
animation: voice-tile-in 0.25s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
.voice-tile video,
.voice-tile canvas {
display: block;
width: 100%;
height: 100%;
object-fit: contain;
background: #000;
}
@keyframes voice-tile-in {
from { opacity: 0; transform: scale(0.85); }
to { opacity: 1; transform: scale(1); }
}
.voice-tile.speaking {
border-color: var(--big-green);
box-shadow: 0 0 0.3rem rgba(120, 200, 120, 0.45);
}
.voice-tile-name {
position: absolute;
bottom: 0.375rem;
left: 0.375rem;
font-size: 0.6875rem;
font-weight: 600;
padding: 0.125rem 0.5rem;
background: rgba(0, 0, 0, 0.55);
backdrop-filter: blur(0.5rem);
-webkit-backdrop-filter: blur(0.5rem);
border-radius: 50rem;
color: #fff;
max-width: calc(100% - 0.75rem);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
pointer-events: none;
}
.voice-tile-icons {
position: absolute;
bottom: 0.375rem;
right: 0.375rem;
display: flex;
gap: 0.25rem;
}
.voice-tile-icons svg {
filter: drop-shadow(0 0.125rem 0.25rem rgba(0, 0, 0, 0.6));
}
.voice-mic-meter {
height: 0.25rem;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.06);
width: 100%;
}
#voice-mic-level {
height: 100%;
width: 0%;
background: rgba(255, 255, 255, 0.15);
transition: width 0.1s linear, background-color 0.2s ease;
}
.voice-controls {
height: 4rem;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.02);
border-top: var(--border-width) solid var(--light-border-color);
display: flex;
align-items: center;
justify-content: center;
gap: 0.9375rem;
padding: 0 0.9375rem;
}
.voice-btn {
border: var(--border-width) solid var(--light-border-color);
background: rgba(255, 255, 255, 0.05);
color: var(--text-color) !important;
width: 2.6rem;
height: 2.6rem;
flex-shrink: 0;
margin: 0;
padding: 0;
border-radius: 0.8rem;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
backface-visibility: hidden;
transform: translateZ(0);
will-change: transform;
touch-action: manipulation;
}
.voice-btn svg {
width: 1.4rem;
height: 1.4rem;
pointer-events: none !important;
}
.voice-btn:hover {
background: rgba(255, 255, 255, 0.1);
}
.voice-btn:active, .voice-btn.is-pressed {
transform: var(--press-scale);
}
.voice-btn.voice-btn-active {
background: var(--big-green) !important;
border-color: transparent !important;
color: white !important;
}
.voice-btn.voice-btn-active:hover {
filter: brightness(1.1);
}
.voice-btn.voice-btn-danger {
background: var(--big-red) !important;
border-color: transparent !important;
color: white !important;
}
/* Incoming Call Popup */
#incoming-call-popup {
position: fixed;
top: calc(env(safe-area-inset-top, 0rem) + 4.5rem);
left: 0;
right: 0;
margin-inline: auto;
width: fit-content;
max-width: calc(100vw - 2rem);
display: flex;
align-items: center;
gap: 1rem;
padding: 0.7rem 0.7rem 0.7rem 1rem;
background: rgba(255, 255, 255, 0.015);
backdrop-filter: blur(1.2rem);
-webkit-backdrop-filter: blur(1.2rem);
border: var(--border-width) solid var(--big-green);
border-radius: 0.9rem;
box-shadow: 0 0.5rem 2rem rgba(0, 0, 0, 0.4);
z-index: 9999;
opacity: 0;
transition:
opacity 0.2s ease,
transform 0.25s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
#incoming-call-popup.show {
opacity: 1;
transform: translateY(0);
}
.incoming-call-avatar {
width: 2.5rem;
height: 2.5rem;
flex-shrink: 0;
border-radius: 0.65rem;
border: var(--border-width) solid rgba(255, 255, 255, 0.2);
object-fit: cover;
aspect-ratio: 1 / 1;
}
.incoming-call-info {
display: flex;
flex-direction: column;
gap: 0.1rem;
text-align: left;
min-width: 0;
}
.incoming-call-name,
.incoming-call-subtitle {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.incoming-call-name {
font-weight: bold;
font-size: 1.05rem;
color: var(--text-color);
}
.incoming-call-subtitle {
font-size: 0.85rem;
color: var(--darker-text-color);
opacity: 0.8;
}
.incoming-call-actions {
display: flex;
gap: 0.5rem;
margin-left: 0.4rem;
}
.voice-call-btn {
height: 2.4rem;
padding: 0 0.9375rem;
margin: 0;
border-radius: 0.8rem;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 0.375rem;
font-weight: 700;
backface-visibility: hidden;
transform: translateZ(0);
will-change: transform;
touch-action: manipulation;
}
.voice-call-btn svg {
width: 1rem;
height: 1rem;
pointer-events: none !important;
}
.voice-call-btn.accept {
background: var(--big-green) !important;
border: none !important;
color: white !important;
}
.voice-call-btn.decline {
background: var(--big-red) !important;
border: none !important;
color: white !important;
}
.voice-call-btn.accept:hover,
.voice-call-btn.decline:hover {
filter: brightness(0.85);
}
.voice-call-btn:active, .voice-call-btn.is-pressed {
transform: var(--press-scale);
}
/* Voice User Settings Popup */
#voice-user-settings {
position: fixed;
background: var(--main-bg-color);
border: var(--border-width) solid var(--light-border-color);
padding: 0.4rem;
border-radius: 0.8rem;
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.4);
z-index: 10000;
min-width: 13rem;
display: flex;
flex-direction: column;
gap: 0.2rem;
transform-origin: top left;
transform: scale(0.9);
opacity: 0;
pointer-events: none;
transition:
opacity 0.15s ease,
transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
#voice-user-settings.open {
transform: scale(1);
opacity: 1;
pointer-events: auto;
}
.voice-setting-row {
display: flex;
flex-direction: column;
gap: 0.3rem;
margin-bottom: 0;
padding: 0.5rem;
border-radius: 0.65rem;
}
.voice-setting-row:hover {
background-color: rgba(255, 255, 255, 0.04);
}
.voice-setting-row label {
font-size: 0.75rem;
font-weight: 600;
color: var(--darker-text-color);
display: flex;
justify-content: space-between;
}
/* In-call Voice Device Settings Popup */
#voice-device-settings {
position: fixed;
/* left/top are set from JS (centered, viewport-clamped) so the opening
animation cannot shift the popup and the header can drag it directly */
width: min(24rem, calc(100vw - 2rem));
max-height: calc(100vh - 3rem);
background: var(--main-bg-color);
border: var(--border-width) solid var(--light-border-color);
border-radius: 0.9rem;
box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.5);
z-index: 10020;
display: flex;
flex-direction: column;
overflow: hidden;
opacity: 0;
pointer-events: none;
transform: scale(0.92);
transition:
opacity 0.15s ease,
transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
#voice-device-settings.show {
opacity: 1;
pointer-events: auto;
transform: scale(1);
}
#vds-header {
height: 2.8rem;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 0.6rem 0 0.9375rem;
font-weight: bold;
font-size: 0.95rem;
background: rgba(255, 255, 255, 0.03);
border-bottom: var(--border-width) solid var(--light-border-color);
user-select: none;
-webkit-user-select: none;
cursor: grab;
touch-action: none;
}
#vds-header:active {
cursor: grabbing;
}
#vds-header span {
display: flex;
align-items: center;
gap: 0.5rem;
min-width: 0;
}
#vds-header svg {
pointer-events: none !important;
flex-shrink: 0;
}
#vds-close {
width: 2rem;
height: 2rem;
flex-shrink: 0;
margin: 0;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: none;
color: var(--darker-text-color);
border-radius: 0.6rem;
cursor: pointer;
}
#vds-close:hover {
background: rgba(255, 255, 255, 0.08);
color: var(--text-color);
}
#vds-body {
padding: 0.4rem 0.7rem 0.8rem;
overflow-y: auto;
touch-action: pan-y;
display: flex;
flex-direction: column;
gap: 0.15rem;
}
.vds-row {
display: flex;
flex-direction: column;
gap: 0.3rem;
padding: 0.3rem 0.1rem;
}
.vds-row > label {
font-size: 0.75rem;
font-weight: 600;
color: var(--darker-text-color);
display: flex;
justify-content: space-between;
}
.vds-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.5rem;
padding: 0.3rem 0.1rem;
}
.vds-cell {
display: flex;
flex-direction: column;
gap: 0.3rem;
min-width: 0;
}
.vds-cell > label {
font-size: 0.75rem;
font-weight: 600;
color: var(--darker-text-color);
}
#voice-device-settings .custom-select {
margin: 0;
width: 100%;
height: 2.3rem;
font-size: 0.85rem;
}
/* Floating option layer for the settings selects - lives on <body>, so it can
escape the popup bounds and is unaffected by the popup transform/scrolling.
Explicit solid background: never translucent over call content. */
.custom-select-options.vds-floating {
position: fixed;
display: block;
width: auto;
margin: 0;
background-color: var(--main-bg-color);
z-index: 10040;
opacity: 0;
visibility: hidden;
pointer-events: none;
transform: translateY(-0.4rem);
transition:
opacity 0.15s ease,
transform 0.15s ease,
visibility 0.15s;
}
.custom-select-options.vds-floating.vds-open {
opacity: 1;
visibility: visible;
pointer-events: auto;
transform: translateY(0);
}
.vds-sens-meter {
position: relative;
height: 1.9rem;
background: rgba(255, 255, 255, 0.06);
border-radius: 0.55rem;
overflow: hidden;
border: var(--border-width) solid var(--light-border-color);
}
.vds-sens-fill {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 0%;
background: rgba(255, 255, 255, 0.15);
transition: width 0.05s linear, background-color 0.2s;
pointer-events: none;
}
.vds-sens-mark {
position: absolute;
top: 0;
bottom: 0;
width: 0.125rem;
margin-left: -0.0625rem;
background: rgba(255, 255, 255, 0.65);
border-radius: 0.0625rem;
pointer-events: none;
}
/* Settings button keeps its hover look while the settings popup is open */
#voice-btn-settings.active {
background: rgba(255, 255, 255, 0.1);
}
#vds-sens-slider {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
margin: 0;
-webkit-appearance: none;
appearance: none;
background: transparent;
outline: none;
border: 0;
border-radius: 0.55rem;
/* pan-y on the popup body would eat horizontal touch drags */
touch-action: none;
z-index: 2;
cursor: ew-resize;
}
/* The app-wide `input:active` press effect must not shrink this slider. */
#vds-sens-slider:active,
#vds-sens-slider.is-pressed {
transform: none !important;
}
#vds-sens-slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 0.25rem;
height: 100%;
background: var(--text-color);
border-radius: 0.125rem;
box-shadow: 0 0 0.3rem rgba(0, 0, 0, 0.8);
}
#vds-sens-slider::-webkit-slider-thumb:hover,
#vds-sens-slider::-webkit-slider-thumb:active {
transform: none !important;
}
#vds-sens-slider::-moz-range-thumb {
width: 0.25rem;
height: 100%;
background: var(--text-color);
border: none;
border-radius: 0.125rem;
}
#vds-sens-slider::-moz-range-thumb:hover,
#vds-sens-slider::-moz-range-thumb:active {
transform: none !important;
}
@media (max-width: 55rem) {
#voice-call-popup {
width: 16rem;
height: 17rem;
min-width: 13rem;
min-height: 12rem;
}
#incoming-call-popup {
gap: 0.75rem;
padding: 0.6rem 0.6rem 0.6rem 0.8rem;
}
.voice-call-btn {
padding: 0 0.75rem;
}
}