| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983 |
- /*
- MeetRoom - Video conferencing WebApp styles
- Dark meeting UI with a light Semantic UI lobby.
- */
- html,
- body {
- margin: 0;
- padding: 0;
- height: 100%;
- overflow: hidden;
- background: #f4f6f8;
- }
- /* ================= Lobby ================= */
- #lobby {
- height: 100vh;
- overflow-y: auto;
- display: flex;
- align-items: center;
- justify-content: center;
- }
- .lobby-inner {
- width: 100%;
- max-width: 720px;
- padding: 2em 1em;
- }
- .lobby-brand {
- display: flex;
- align-items: center;
- gap: 1em;
- margin-bottom: 1.5em;
- }
- .lobby-brand img {
- width: 64px;
- height: 64px;
- }
- .lobby-brand h1 {
- margin: 0;
- font-size: 1.8em;
- color: #1b2733;
- }
- .lobby-brand p {
- margin: 0.2em 0 0 0;
- color: #667788;
- }
- .lobby-cards .card .header .icon {
- color: #2f80ed;
- }
- /* ================= Meeting room ================= */
- #room {
- display: flex;
- flex-direction: column;
- height: 100vh;
- background: #16181d;
- color: #e6e8ec;
- position: relative;
- }
- #roomHeader {
- flex: 0 0 auto;
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 0.5em 1em;
- background: #1e2128;
- border-bottom: 1px solid #2b2f38;
- }
- .room-titles {
- display: flex;
- align-items: center;
- gap: 0.8em;
- min-width: 0;
- }
- #roomTitle {
- font-weight: bold;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- #roomIdTag {
- cursor: pointer;
- }
- .room-meta {
- flex: 0 0 auto;
- color: #9aa4b2;
- display: flex;
- align-items: center;
- gap: 1em;
- }
- .room-meta .meta-item {
- display: inline-flex;
- align-items: center;
- gap: 0.3em;
- white-space: nowrap;
- font-variant-numeric: tabular-nums;
- }
- .room-meta .meta-item .icon {
- margin: 0;
- opacity: 0.75;
- }
- /* Meeting duration is the primary at-a-glance value */
- #meetingElapsed {
- color: #e6e8ec;
- font-weight: bold;
- }
- /* On narrow layouts the wall clock is the first thing to drop */
- @media (max-width: 520px) {
- .room-meta .meta-item.meta-item:nth-child(2) {
- display: none;
- }
- }
- #reconnectBanner {
- flex: 0 0 auto;
- background: #7a5b1e;
- color: #ffe9b8;
- padding: 0.45em 1em;
- font-size: 0.9em;
- text-align: center;
- }
- #roomBody {
- flex: 1 1 auto;
- display: flex;
- min-height: 0;
- }
- /* Video grid */
- #videoGrid {
- flex: 1 1 auto;
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
- grid-auto-rows: 1fr;
- gap: 8px;
- padding: 8px;
- overflow-y: auto;
- align-content: center;
- }
- .video-tile {
- position: relative;
- background: #23262e;
- border-radius: 8px;
- overflow: hidden;
- min-height: 180px;
- display: flex;
- align-items: center;
- justify-content: center;
- }
- .video-tile video {
- width: 100%;
- height: 100%;
- object-fit: contain;
- background: #000;
- }
- .video-tile.no-video video {
- display: none;
- }
- .video-tile .tile-avatar {
- display: none;
- width: 84px;
- height: 84px;
- border-radius: 50%;
- background: #2f80ed;
- color: #fff;
- font-size: 2.4em;
- align-items: center;
- justify-content: center;
- text-transform: uppercase;
- }
- .video-tile.no-video .tile-avatar {
- display: flex;
- }
- .video-tile .tile-label {
- position: absolute;
- left: 8px;
- bottom: 8px;
- background: rgba(0, 0, 0, 0.55);
- padding: 2px 10px;
- border-radius: 12px;
- font-size: 0.85em;
- display: flex;
- align-items: center;
- gap: 0.4em;
- max-width: calc(100% - 16px);
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- .video-tile .tile-label .icon {
- margin: 0;
- }
- .video-tile .muted-icon {
- color: #e74c3c;
- }
- .video-tile .sharing-badge {
- position: absolute;
- top: 8px;
- left: 8px;
- background: rgba(47, 128, 237, 0.85);
- padding: 2px 10px;
- border-radius: 12px;
- font-size: 0.8em;
- display: none;
- align-items: center;
- gap: 0.4em;
- }
- .video-tile.is-sharing .sharing-badge {
- display: flex;
- }
- /* Raised-hand badge (top-right of a tile) */
- .video-tile .hand-badge {
- position: absolute;
- top: 8px;
- right: 8px;
- background: #f2b134;
- color: #3a2a05;
- width: 30px;
- height: 30px;
- border-radius: 50%;
- display: none;
- align-items: center;
- justify-content: center;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
- animation: handWave 1.6s ease-in-out infinite;
- }
- .video-tile .hand-badge .icon {
- margin: 0;
- width: auto;
- font-size: 1em;
- line-height: 1;
- /* The Semantic hand glyph sits low-right inside its em box; nudge it to
- optically centre it within the round badge. */
- transform: translate(-0.5px, -2.5px);
- }
- .video-tile.hand-raised .hand-badge {
- display: flex;
- }
- @keyframes handWave {
- 0%, 100% { transform: rotate(-8deg); }
- 50% { transform: rotate(8deg); }
- }
- /* Chat panel */
- #chatPanel {
- flex: 0 0 320px;
- display: flex;
- flex-direction: column;
- background: #1e2128;
- border-left: 1px solid #2b2f38;
- min-width: 0;
- }
- .chat-header {
- flex: 0 0 auto;
- padding: 0.7em 1em;
- border-bottom: 1px solid #2b2f38;
- font-weight: bold;
- }
- .chat-close {
- float: right;
- cursor: pointer;
- color: #9aa4b2;
- }
- #chatMessages {
- flex: 1 1 auto;
- overflow-y: auto;
- padding: 0.8em;
- }
- .chat-msg {
- margin-bottom: 0.8em;
- word-break: break-word;
- }
- .chat-msg .msg-meta {
- font-size: 0.78em;
- color: #9aa4b2;
- margin-bottom: 2px;
- }
- .chat-msg .msg-body {
- background: #262a33;
- border-radius: 8px;
- padding: 6px 10px;
- display: inline-block;
- max-width: 100%;
- }
- .chat-msg.own .msg-body {
- background: #2f80ed;
- color: #fff;
- }
- .chat-msg.system .msg-body {
- background: transparent;
- color: #9aa4b2;
- font-style: italic;
- padding: 0;
- }
- .chat-msg .file-link {
- color: #7db4ff;
- text-decoration: none;
- display: inline-flex;
- align-items: center;
- gap: 0.4em;
- }
- .chat-msg.own .file-link {
- color: #eaf3ff;
- }
- .chat-msg .file-size {
- font-size: 0.8em;
- opacity: 0.8;
- }
- .chat-msg .chat-image {
- display: block;
- max-width: 100%;
- max-height: 220px;
- border-radius: 6px;
- cursor: pointer;
- margin-bottom: 4px;
- }
- .chat-input {
- flex: 0 0 auto;
- padding: 0.7em;
- border-top: 1px solid #2b2f38;
- }
- /* Participants / attendance side panel */
- #peoplePanel {
- flex: 0 0 320px;
- display: flex;
- flex-direction: column;
- background: #1e2128;
- border-left: 1px solid #2b2f38;
- min-width: 0;
- }
- #attendanceList {
- flex: 1 1 auto;
- overflow-y: auto;
- padding: 0.8em;
- }
- .attendance-group {
- font-size: 0.78em;
- color: #9aa4b2;
- text-transform: uppercase;
- letter-spacing: 0.06em;
- margin: 0.6em 0 0.4em 0;
- }
- .attendance-entry {
- display: flex;
- align-items: center;
- gap: 0.6em;
- background: #262a33;
- border-radius: 8px;
- padding: 6px 10px;
- margin-bottom: 6px;
- }
- .attendance-entry .icon {
- margin: 0;
- color: #9aa4b2;
- }
- .attendance-entry.present .icon {
- color: #7bed9f;
- }
- .attendance-entry .attendee-name {
- flex: 1 1 auto;
- min-width: 0;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- .attendance-entry .host-tag {
- flex: 0 0 auto;
- font-size: 0.72em;
- background: #2f80ed;
- color: #fff;
- border-radius: 8px;
- padding: 1px 8px;
- }
- .attendance-entry .attendee-times {
- flex: 0 0 auto;
- font-size: 0.75em;
- color: #9aa4b2;
- text-align: right;
- white-space: nowrap;
- }
- /* Raised-hand marker in the participant list */
- .attendance-entry .hand-indicator.icon {
- flex: 0 0 auto;
- color: #f2b134;
- margin: 0;
- }
- /* Raise-hand queue entries (ordered, at the top of the participant list) */
- .hand-queue-entry {
- display: flex;
- align-items: center;
- gap: 0.6em;
- background: #2c2a1e;
- border: 1px solid #4a4020;
- border-radius: 8px;
- padding: 6px 10px;
- margin-bottom: 6px;
- }
- .hand-queue-entry .hand-queue-pos {
- flex: 0 0 auto;
- width: 20px;
- height: 20px;
- line-height: 20px;
- text-align: center;
- border-radius: 50%;
- background: #f2b134;
- color: #3a2a05;
- font-size: 0.78em;
- font-weight: bold;
- }
- .hand-queue-entry .hand-indicator.icon {
- flex: 0 0 auto;
- color: #f2b134;
- margin: 0;
- }
- .hand-queue-entry .attendee-name {
- flex: 1 1 auto;
- min-width: 0;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- /* Host-only kick button */
- .attendance-entry .kick-btn {
- flex: 0 0 auto;
- background: transparent;
- border: none;
- color: #9aa4b2;
- cursor: pointer;
- padding: 2px 4px;
- border-radius: 6px;
- line-height: 1;
- }
- .attendance-entry .kick-btn:hover {
- background: #5c2b2b;
- color: #ffb3ab;
- }
- .attendance-entry .kick-btn .icon {
- margin: 0;
- color: inherit;
- }
- /* Attachment source menu (pops above the chat input) */
- #attachMenu {
- position: absolute;
- left: 0.7em;
- right: 0.7em;
- bottom: 100%;
- margin-bottom: 6px;
- background: #262a33;
- border: 1px solid #3a3f4a;
- border-radius: 8px;
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);
- overflow: hidden;
- z-index: 25;
- }
- .chat-input {
- position: relative;
- }
- .attach-menu-item {
- display: flex;
- align-items: center;
- gap: 0.6em;
- width: 100%;
- background: transparent;
- border: none;
- color: #e6e8ec;
- text-align: left;
- padding: 10px 14px;
- cursor: pointer;
- font-family: inherit;
- font-size: 0.9em;
- }
- .attach-menu-item:hover {
- background: #313641;
- }
- .attach-menu-item .icon {
- margin: 0;
- color: #7db4ff;
- }
- /* Connection stats: a compact floating window that overlays the meeting.
- Defaults to the top-left so it stays clear of the right-docked chat /
- participants panels; the user can drag it anywhere by its header. */
- #statsPanel {
- position: absolute;
- top: 60px;
- left: 14px;
- width: 264px;
- max-width: calc(100% - 28px);
- max-height: calc(100% - 150px);
- background: #1e2128;
- border: 1px solid #3a3f4a;
- border-radius: 10px;
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.55);
- display: flex;
- flex-direction: column;
- overflow: hidden;
- z-index: 35;
- }
- #statsHeader {
- flex: 0 0 auto;
- display: flex;
- align-items: center;
- gap: 0.4em;
- padding: 0.6em 0.9em;
- font-weight: bold;
- font-size: 0.9em;
- border-bottom: 1px solid #2b2f38;
- cursor: move;
- user-select: none;
- -webkit-user-select: none;
- touch-action: none;
- }
- #statsHeader .chart.line.icon {
- margin: 0;
- color: #7db4ff;
- }
- #statsHeader .stats-title {
- flex: 1 1 auto;
- }
- .stats-close {
- flex: 0 0 auto;
- cursor: pointer;
- color: #9aa4b2;
- margin: 0;
- }
- .stats-close:hover {
- color: #e6e8ec;
- }
- #statsBody {
- flex: 1 1 auto;
- overflow-y: auto;
- padding: 0.8em;
- }
- .stats-empty {
- color: #9aa4b2;
- font-size: 0.88em;
- padding: 0.6em 0.2em;
- }
- .stats-summary {
- display: flex;
- gap: 8px;
- margin-bottom: 0.8em;
- }
- .stats-summary-item {
- flex: 1 1 0;
- background: #262a33;
- border-radius: 8px;
- padding: 10px;
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 2px;
- }
- .stats-summary-item .icon {
- margin: 0;
- color: #7db4ff;
- }
- .stats-summary-item strong {
- font-size: 1.05em;
- font-variant-numeric: tabular-nums;
- }
- .stats-summary-item span {
- font-size: 0.72em;
- color: #9aa4b2;
- text-transform: uppercase;
- letter-spacing: 0.05em;
- }
- .stats-peer {
- background: #262a33;
- border-radius: 8px;
- padding: 8px 10px;
- margin-bottom: 6px;
- }
- .stats-peer-name {
- display: flex;
- align-items: center;
- gap: 0.5em;
- font-size: 0.9em;
- margin-bottom: 4px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- .stats-quality {
- flex: 0 0 auto;
- font-size: 0.68em;
- text-transform: uppercase;
- letter-spacing: 0.05em;
- border-radius: 8px;
- padding: 1px 8px;
- }
- .stats-quality.good {
- background: #1f4d33;
- color: #7bed9f;
- }
- .stats-quality.fair {
- background: #5a4a1e;
- color: #ffe09a;
- }
- .stats-quality.poor {
- background: #5c2b2b;
- color: #ffb3ab;
- }
- .stats-peer-metrics {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 3px 10px;
- font-size: 0.82em;
- color: #c3c9d4;
- font-variant-numeric: tabular-nums;
- }
- .stats-peer-metrics span {
- display: inline-flex;
- align-items: center;
- gap: 0.4em;
- }
- .stats-peer-metrics .icon {
- margin: 0;
- color: #9aa4b2;
- }
- /* Invite dialog */
- #inviteModal {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background: rgba(0, 0, 0, 0.55);
- display: flex;
- align-items: center;
- justify-content: center;
- z-index: 40;
- padding: 1em;
- }
- .invite-card {
- width: 100%;
- max-width: 420px;
- background: #1e2128;
- border: 1px solid #2b2f38;
- border-radius: 12px;
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.55);
- max-height: calc(100vh - 2em);
- display: flex;
- flex-direction: column;
- overflow: hidden;
- }
- .invite-card-header {
- flex: 0 0 auto;
- padding: 0.9em 1.1em;
- font-weight: bold;
- border-bottom: 1px solid #2b2f38;
- }
- .invite-card-header .icon {
- color: #7db4ff;
- }
- .invite-card-close {
- float: right;
- cursor: pointer;
- color: #9aa4b2;
- }
- .invite-card-close:hover {
- color: #e6e8ec;
- }
- .invite-card-body {
- flex: 1 1 auto;
- overflow-y: auto;
- padding: 1.1em;
- }
- .invite-field {
- margin-bottom: 1em;
- }
- .invite-field label {
- display: block;
- font-size: 0.75em;
- text-transform: uppercase;
- letter-spacing: 0.05em;
- color: #9aa4b2;
- margin-bottom: 0.35em;
- }
- .invite-value {
- color: #e6e8ec;
- word-break: break-word;
- }
- .invite-copy-row {
- display: flex;
- align-items: center;
- gap: 6px;
- }
- .invite-id {
- flex: 1 1 auto;
- font-size: 1.25em;
- font-weight: bold;
- letter-spacing: 0.04em;
- color: #e6e8ec;
- font-variant-numeric: tabular-nums;
- }
- .invite-copy-row input {
- flex: 1 1 auto;
- min-width: 0;
- background: #262a33;
- border: 1px solid #3a3f4a;
- border-radius: 6px;
- color: #e6e8ec;
- padding: 8px 10px;
- font-family: inherit;
- font-size: 0.85em;
- }
- .invite-copy-btn {
- flex: 0 0 auto;
- }
- .invite-note {
- background: #3a3320;
- color: #ffe09a;
- border-radius: 8px;
- padding: 8px 12px;
- font-size: 0.82em;
- margin-bottom: 1em;
- }
- .invite-note .icon {
- margin: 0 0.3em 0 0;
- }
- #inviteMessage {
- width: 100%;
- background: #262a33;
- border: 1px solid #3a3f4a;
- border-radius: 6px;
- color: #e6e8ec;
- padding: 8px 10px;
- font-family: inherit;
- font-size: 0.9em;
- resize: vertical;
- box-sizing: border-box;
- }
- .invite-card-footer {
- flex: 0 0 auto;
- padding: 0.9em 1.1em;
- border-top: 1px solid #2b2f38;
- text-align: right;
- }
- /* New chat message popup */
- #msgToast {
- position: absolute;
- right: 16px;
- bottom: 78px;
- max-width: 300px;
- background: #262a33;
- color: #e6e8ec;
- border: 1px solid #3a3f4a;
- border-left: 3px solid #2f80ed;
- border-radius: 8px;
- padding: 10px 14px;
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);
- cursor: pointer;
- z-index: 30;
- }
- #msgToast .toast-title {
- font-weight: bold;
- font-size: 0.85em;
- margin-bottom: 3px;
- display: flex;
- align-items: center;
- gap: 0.4em;
- }
- #msgToast .toast-title .icon {
- margin: 0;
- color: #7db4ff;
- }
- #msgToast .toast-body {
- font-size: 0.85em;
- color: #c3c9d4;
- word-break: break-word;
- overflow: hidden;
- display: -webkit-box;
- -webkit-line-clamp: 3;
- -webkit-box-orient: vertical;
- }
- #uploadStatus {
- color: #9aa4b2;
- font-size: 0.85em;
- margin-bottom: 0.4em;
- }
- /* Control bar */
- #controlBar {
- flex: 0 0 auto;
- display: flex;
- justify-content: center;
- gap: 10px;
- padding: 10px;
- background: #1e2128;
- border-top: 1px solid #2b2f38;
- flex-wrap: wrap;
- }
- .ctrl-btn {
- background: #262a33;
- color: #e6e8ec;
- border: none;
- border-radius: 10px;
- padding: 8px 14px;
- min-width: 74px;
- cursor: pointer;
- font-family: inherit;
- font-size: 0.85em;
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 3px;
- position: relative;
- }
- .ctrl-btn:hover {
- background: #313641;
- }
- .ctrl-btn .icon {
- margin: 0;
- font-size: 1.3em;
- }
- .ctrl-btn.ctrl-off {
- background: #3a2a2c;
- color: #ff8a80;
- }
- .ctrl-btn.ctrl-active {
- background: #1f4d33;
- color: #7bed9f;
- }
- .ctrl-btn.ctrl-danger {
- background: #5c2b2b;
- color: #ffb3ab;
- }
- .ctrl-btn.ctrl-danger:hover {
- background: #742f2f;
- }
- .ctrl-btn:disabled {
- opacity: 0.45;
- cursor: not-allowed;
- }
- .chat-badge {
- position: absolute;
- top: 4px;
- right: 8px;
- background: #e74c3c;
- color: #fff;
- border-radius: 10px;
- min-width: 18px;
- height: 18px;
- line-height: 18px;
- font-size: 0.75em;
- padding: 0 4px;
- }
- /* Narrow layouts (embedded / mobile) */
- @media (max-width: 720px) {
- #chatPanel,
- #peoplePanel {
- position: absolute;
- right: 0;
- top: 0;
- bottom: 0;
- width: 85%;
- max-width: 320px;
- z-index: 20;
- }
- #roomBody {
- position: relative;
- }
- }
|