الملفات
codepill-sfu/public/css/VideoGrid.css
2025-09-28 01:06:06 +02:00

537 أسطر
11 KiB
CSS

/*--------------------------------------------------------------
# Video grid
--------------------------------------------------------------*/
#videoMediaContainer {
z-index: 1;
position: absolute;
display: flex;
top: 0;
width: 100%;
height: 100%;
border-radius: 5px;
opacity: 1;
align-content: center;
flex-wrap: wrap;
align-items: center;
justify-content: center;
vertical-align: middle;
overflow: hidden;
transition: opacity 500ms;
/* border: 3px solid blue; */
}
#videoPinMediaContainer {
z-index: 1;
position: absolute;
display: none;
top: 0;
left: 0;
width: 75%;
height: 100%;
border-radius: 5px;
box-shadow: var(--box-shadow);
overflow: hidden;
/* animation: show 0.4s ease; */
/* border: 3px solid lime; */
}
.Camera {
position: relative;
vertical-align: middle;
align-self: center;
overflow: hidden;
display: inline-block;
background: transparent;
border-radius: 10px;
/* border: var(--border); */
box-shadow: var(--box-shadow);
animation: show 0.4s ease;
}
/* .Camera:hover {
border: 3px solid rgb(113, 157, 239);
} */
.Camera .fa-hand-paper {
margin: 10px !important;
font-size: 1.5rem !important;
}
#videoMediaContainer i {
position: absolute;
display: none;
top: 0;
color: rgb(0, 255, 71);
font-size: 14px;
align-items: center;
padding: 5px;
margin: 5px;
width: auto;
height: 25px;
border-radius: 5px;
background: rgba(0, 0, 0, 0.4);
}
.videoAvatarImage {
z-index: 1;
position: absolute;
display: none;
width: var(--vmi-wh);
height: var(--vmi-wh);
border-radius: 50%;
transition: box-shadow 0.3s ease;
}
.audio {
position: absolute;
right: 0;
color: #fff;
margin: 5px;
width: auto;
height: 25px;
border-radius: 5px;
background: rgba(0, 0, 0, 0.1);
}
.username {
z-index: 1;
position: absolute;
right: 0;
bottom: 0;
color: #fff;
font-size: 10px;
display: flex;
align-items: center;
padding: 10px;
margin: 10px;
width: auto;
height: 25px;
border-radius: 5px;
background: var(--body-bg);
}
.fscreen {
position: absolute;
right: 0;
bottom: 0px;
color: #fff;
margin: 5px;
width: auto;
height: 25px;
border-radius: 5px;
background: rgba(0, 0, 0, 0.1);
}
/* Video Menu Bar */
.videoMenuBar {
z-index: 2;
position: absolute; /* inside video feed by default */
top: 0;
left: 0;
width: 100%;
display: flex;
align-items: center;
flex-direction: row-reverse; /* invert buttons order visually */
justify-content: flex-start; /* with row-reverse, this packs to the right */
flex-wrap: nowrap;
gap: clamp(2px, 1vw, 8px);
padding: clamp(4px, 1.2vw, 8px);
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
border-top-left-radius: 10px;
border-top-right-radius: 10px;
background: var(--body-bg);
/* box-shadow: var(--box-shadow); */
cursor: default;
overflow-x: auto;
overflow-y: hidden;
scrollbar-width: none; /* Firefox */
white-space: nowrap;
-webkit-overflow-scrolling: touch;
}
/* Mobile floating menubar when appended to body */
.videoMenuBar.mobile-floating {
z-index: 2;
position: fixed;
top: env(safe-area-inset-top, 0px);
left: 0;
right: 0;
width: 100vw;
border-radius: 0 0 10px 10px;
}
.videoAvatarMenuBar,
.videoMenuBarShare {
z-index: 2;
position: absolute;
display: flex;
flex-direction: row-reverse;
align-items: center;
gap: 1px;
top: 0;
left: 0;
padding: 10px;
background: rgba(0, 0, 0, 0.2);
font-size: small;
font-weight: bold;
text-align: center;
width: 100%;
cursor: default;
overflow: hidden;
}
.videoMenuBar input,
.videoMenuBar button,
.videoAvatarMenuBar button,
.videoMenuBarShare button {
font-size: clamp(0.9rem, 1.1vw, 1.05rem);
float: right;
color: #fff;
background: transparent;
border-radius: 5px;
display: inline;
border: none;
}
.videoMenuBar button:hover,
.videoAvatarMenuBar button:hover,
.videoMenuBarShare button:hover {
color: grey;
transition: all 0.3s ease-in-out;
}
/* Touch-friendly sizing for buttons within menu bar */
.videoMenuBar button {
min-width: 32px;
min-height: 32px;
flex: 0 0 auto;
}
.fa-bars {
color: #66beff !important;
}
.expand-video .dropdown-button {
cursor: pointer;
position: relative;
}
.expand-video-content {
z-index: 5;
display: none;
position: absolute;
width: 100%;
height: 100%;
padding: 14px;
border-radius: 5px;
background: var(--body-bg);
box-shadow: var(--box-shadow);
overflow: auto;
}
.expand-video-content.show {
z-index: 5;
display: grid !important;
grid-gap: 5px 5px;
grid-template-columns: 1fr 1fr;
grid-template-areas:
'header header'
'controls controls';
align-content: start;
justify-items: start;
overflow: auto;
}
.peer-name-container {
display: row;
width: 100%;
height: 100%;
padding: 10px;
margin: 10px;
}
.expand-video-content .peer-name-header {
grid-area: header;
width: 100%;
padding: 10px;
height: 100px;
background: var(--btns-bg-color);
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border-radius: 10px;
margin-bottom: 10px;
display: flex;
align-items: center;
justify-content: center;
}
.expand-video-content .peer-name {
font-size: 12px;
font-weight: bold;
color: #fff;
background: var(--body-bg);
border-radius: 10px;
padding: 6px;
width: 100%;
}
.expand-video-content input[type='range'] {
display: inline !important;
width: 100%;
margin: 16px 0;
background: rgba(255, 255, 255, 0.1);
height: 6px;
}
/* Button Group Container */
.expand-video-content .button-group {
display: flex !important;
gap: 8px;
flex-wrap: nowrap;
width: 100%;
}
/* Individual Buttons */
.expand-video-content .button-group button {
text-align: center;
padding: 0 10px;
font-size: 15px;
color: #fff;
background: var(--btns-bg-color);
min-width: 42px;
min-height: 42px;
justify-content: center;
align-items: center;
display: inline-flex; /* center icon + label */
gap: 6px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
border-radius: 10px;
border: none;
cursor: pointer;
transition:
background 0.2s ease,
transform 0.1s ease;
}
/* Icon alignment inside buttons */
.expand-video-content .button-group button i {
line-height: 1;
pointer-events: none; /* avoid accidental icon-only clicks interference */
}
/* Hover & Active Effects */
.expand-video-content .button-group button:hover {
background: var(--body-bg);
transform: scale(1.05);
}
.expand-video-content .button-group button:active {
transform: scale(0.95);
}
@media (max-width: 600px) {
.expand-video-content .button-group {
gap: 6px;
flex-wrap: wrap; /* allow wrapping on small screens */
justify-content: center;
}
.expand-video-content .button-group button {
font-size: 14px;
min-width: 44px; /* accessible tap target */
min-height: 44px;
padding: 0 8px;
border-radius: 8px;
}
}
.expand-video-content button:hover {
color: white;
background: var(--body-bg);
}
#videoMediaContainer video {
position: absolute;
margin-left: auto;
margin-right: auto;
}
/* Keep peer name header on the left, controls on the right */
.videoMenuBar .peer-name-header {
order: 9999; /* with row-reverse, last = leftmost */
padding: 0;
background: transparent;
height: auto;
}
.videoMenuBar .peer-name-header .peer-name-container {
margin: 0;
padding: 0;
}
.videoMenuBar .peer-name-header .peer-name {
background: transparent;
padding: 0;
font-size: 0.95rem;
}
.videoCircle {
position: absolute;
width: var(--vmi-wh);
height: var(--vmi-wh);
border-radius: 50%;
/* center */
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
transition: box-shadow 0.3s ease;
}
.videoDefault {
position: absolute;
width: 100%;
height: 100%;
border-radius: '10px';
transition: box-shadow 0.3s ease;
}
video {
width: 100%;
height: 100%;
object-fit: var(--videoObjFit);
border-radius: 10px;
cursor: pointer;
transition: transform 0.3s ease-in-out;
}
#canvasAIElement {
width: 100%;
height: 100%;
object-fit: var(--videoObjFit);
border-radius: 10px;
cursor: pointer;
}
video:hover {
filter: contrast(105%);
}
video:fullscreen {
object-fit: contain;
}
.mirror {
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
transform: rotateY(180deg);
}
.blur {
-webkit-filter: blur(5px);
-moz-filter: blur(5px);
-o-filter: blur(5px);
-ms-filter: blur(5px);
filter: blur(5px);
}
input[type='range'] {
/* display: none; */
color: #fff;
width: 50px;
cursor: pointer;
}
@keyframes show {
0% {
opacity: 0;
transform: scale(0.4) translateY(20px);
}
100% {
opacity: 1;
transform: scale(1) translateY(0);
}
}
@media (max-width: 800px) {
.videoMenuBar {
gap: 6px;
padding: 8px;
}
.videoMenuBar button,
.videoAvatarMenuBar button,
.videoMenuBarShare button {
font-size: 1rem;
}
.expand-video-content {
right: 6px;
left: 6px;
width: auto;
max-width: none;
}
}
@media (max-width: 480px) {
/* Switch to a responsive grid for tighter screens */
.expand-video-content .button-group {
display: grid !important;
grid-template-columns: repeat(auto-fit, minmax(56px, 1fr));
gap: 6px;
justify-items: center;
}
.expand-video-content .button-group button {
min-width: unset; /* let grid control width */
width: 100%;
min-height: 44px;
padding: 8px;
font-size: 0.95rem;
}
.videoMenuBar {
gap: 4px;
padding: 6px;
}
.videoMenuBar button,
.videoAvatarMenuBar button,
.videoMenuBarShare button {
font-size: 0.95rem;
min-width: 40px; /* compact tap target */
min-height: 40px;
}
.videoMenuBar input[type='range'] {
width: clamp(60px, 30vw, 140px);
}
}
@media (max-width: 360px) {
.expand-video-content .button-group {
grid-template-columns: repeat(3, 1fr);
gap: 5px;
}
.expand-video-content .button-group button {
min-height: 40px;
padding: 6px;
font-size: 0.9rem;
border-radius: 8px;
}
.videoMenuBar {
gap: 4px;
padding: 6px;
}
.videoMenuBar button,
.videoAvatarMenuBar button,
.videoMenuBarShare button {
font-size: 0.95rem;
min-width: 40px;
min-height: 40px;
}
.expand-video-content {
top: 6px;
right: 6px;
left: 6px;
padding: 12px;
}
}