app.css 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  1. /*
  2. MeetRoom - Video conferencing WebApp styles
  3. Dark meeting UI with a light Semantic UI lobby.
  4. */
  5. html,
  6. body {
  7. margin: 0;
  8. padding: 0;
  9. height: 100%;
  10. overflow: hidden;
  11. background: #f4f6f8;
  12. }
  13. /* ================= Lobby ================= */
  14. #lobby {
  15. height: 100vh;
  16. overflow-y: auto;
  17. display: flex;
  18. align-items: center;
  19. justify-content: center;
  20. }
  21. .lobby-inner {
  22. width: 100%;
  23. max-width: 720px;
  24. padding: 2em 1em;
  25. }
  26. .lobby-brand {
  27. display: flex;
  28. align-items: center;
  29. gap: 1em;
  30. margin-bottom: 1.5em;
  31. }
  32. .lobby-brand img {
  33. width: 64px;
  34. height: 64px;
  35. }
  36. .lobby-brand h1 {
  37. margin: 0;
  38. font-size: 1.8em;
  39. color: #1b2733;
  40. }
  41. .lobby-brand p {
  42. margin: 0.2em 0 0 0;
  43. color: #667788;
  44. }
  45. .lobby-cards .card .header .icon {
  46. color: #2f80ed;
  47. }
  48. /* ================= Meeting room ================= */
  49. #room {
  50. display: flex;
  51. flex-direction: column;
  52. height: 100vh;
  53. background: #16181d;
  54. color: #e6e8ec;
  55. position: relative;
  56. }
  57. #roomHeader {
  58. flex: 0 0 auto;
  59. display: flex;
  60. align-items: center;
  61. justify-content: space-between;
  62. padding: 0.5em 1em;
  63. background: #1e2128;
  64. border-bottom: 1px solid #2b2f38;
  65. }
  66. .room-titles {
  67. display: flex;
  68. align-items: center;
  69. gap: 0.8em;
  70. min-width: 0;
  71. }
  72. #roomTitle {
  73. font-weight: bold;
  74. white-space: nowrap;
  75. overflow: hidden;
  76. text-overflow: ellipsis;
  77. }
  78. #roomIdTag {
  79. cursor: pointer;
  80. }
  81. .room-meta {
  82. flex: 0 0 auto;
  83. color: #9aa4b2;
  84. display: flex;
  85. align-items: center;
  86. gap: 1em;
  87. }
  88. .room-meta .meta-item {
  89. display: inline-flex;
  90. align-items: center;
  91. gap: 0.3em;
  92. white-space: nowrap;
  93. font-variant-numeric: tabular-nums;
  94. }
  95. .room-meta .meta-item .icon {
  96. margin: 0;
  97. opacity: 0.75;
  98. }
  99. /* Meeting duration is the primary at-a-glance value */
  100. #meetingElapsed {
  101. color: #e6e8ec;
  102. font-weight: bold;
  103. }
  104. /* On narrow layouts the wall clock is the first thing to drop */
  105. @media (max-width: 520px) {
  106. .room-meta .meta-item.meta-item:nth-child(2) {
  107. display: none;
  108. }
  109. }
  110. #reconnectBanner {
  111. flex: 0 0 auto;
  112. background: #7a5b1e;
  113. color: #ffe9b8;
  114. padding: 0.45em 1em;
  115. font-size: 0.9em;
  116. text-align: center;
  117. }
  118. #roomBody {
  119. flex: 1 1 auto;
  120. display: flex;
  121. min-height: 0;
  122. }
  123. /* Video grid */
  124. #videoGrid {
  125. flex: 1 1 auto;
  126. display: grid;
  127. grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  128. grid-auto-rows: 1fr;
  129. gap: 8px;
  130. padding: 8px;
  131. overflow-y: auto;
  132. align-content: center;
  133. }
  134. .video-tile {
  135. position: relative;
  136. background: #23262e;
  137. border-radius: 8px;
  138. overflow: hidden;
  139. min-height: 180px;
  140. display: flex;
  141. align-items: center;
  142. justify-content: center;
  143. }
  144. .video-tile video {
  145. width: 100%;
  146. height: 100%;
  147. object-fit: contain;
  148. background: #000;
  149. }
  150. .video-tile.no-video video {
  151. display: none;
  152. }
  153. .video-tile .tile-avatar {
  154. display: none;
  155. width: 84px;
  156. height: 84px;
  157. border-radius: 50%;
  158. background: #2f80ed;
  159. color: #fff;
  160. font-size: 2.4em;
  161. align-items: center;
  162. justify-content: center;
  163. text-transform: uppercase;
  164. }
  165. .video-tile.no-video .tile-avatar {
  166. display: flex;
  167. }
  168. .video-tile .tile-label {
  169. position: absolute;
  170. left: 8px;
  171. bottom: 8px;
  172. background: rgba(0, 0, 0, 0.55);
  173. padding: 2px 10px;
  174. border-radius: 12px;
  175. font-size: 0.85em;
  176. display: flex;
  177. align-items: center;
  178. gap: 0.4em;
  179. max-width: calc(100% - 16px);
  180. white-space: nowrap;
  181. overflow: hidden;
  182. text-overflow: ellipsis;
  183. }
  184. .video-tile .tile-label .icon {
  185. margin: 0;
  186. }
  187. .video-tile .muted-icon {
  188. color: #e74c3c;
  189. }
  190. .video-tile .sharing-badge {
  191. position: absolute;
  192. top: 8px;
  193. left: 8px;
  194. background: rgba(47, 128, 237, 0.85);
  195. padding: 2px 10px;
  196. border-radius: 12px;
  197. font-size: 0.8em;
  198. display: none;
  199. align-items: center;
  200. gap: 0.4em;
  201. }
  202. .video-tile.is-sharing .sharing-badge {
  203. display: flex;
  204. }
  205. /* Raised-hand badge (top-right of a tile) */
  206. .video-tile .hand-badge {
  207. position: absolute;
  208. top: 8px;
  209. right: 8px;
  210. background: #f2b134;
  211. color: #3a2a05;
  212. width: 30px;
  213. height: 30px;
  214. border-radius: 50%;
  215. display: none;
  216. align-items: center;
  217. justify-content: center;
  218. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
  219. animation: handWave 1.6s ease-in-out infinite;
  220. }
  221. .video-tile .hand-badge .icon {
  222. margin: 0;
  223. width: auto;
  224. font-size: 1em;
  225. line-height: 1;
  226. /* The Semantic hand glyph sits low-right inside its em box; nudge it to
  227. optically centre it within the round badge. */
  228. transform: translate(-0.5px, -2.5px);
  229. }
  230. .video-tile.hand-raised .hand-badge {
  231. display: flex;
  232. }
  233. @keyframes handWave {
  234. 0%, 100% { transform: rotate(-8deg); }
  235. 50% { transform: rotate(8deg); }
  236. }
  237. /* Chat panel */
  238. #chatPanel {
  239. flex: 0 0 320px;
  240. display: flex;
  241. flex-direction: column;
  242. background: #1e2128;
  243. border-left: 1px solid #2b2f38;
  244. min-width: 0;
  245. }
  246. .chat-header {
  247. flex: 0 0 auto;
  248. padding: 0.7em 1em;
  249. border-bottom: 1px solid #2b2f38;
  250. font-weight: bold;
  251. }
  252. .chat-close {
  253. float: right;
  254. cursor: pointer;
  255. color: #9aa4b2;
  256. }
  257. #chatMessages {
  258. flex: 1 1 auto;
  259. overflow-y: auto;
  260. padding: 0.8em;
  261. }
  262. .chat-msg {
  263. margin-bottom: 0.8em;
  264. word-break: break-word;
  265. }
  266. .chat-msg .msg-meta {
  267. font-size: 0.78em;
  268. color: #9aa4b2;
  269. margin-bottom: 2px;
  270. }
  271. .chat-msg .msg-body {
  272. background: #262a33;
  273. border-radius: 8px;
  274. padding: 6px 10px;
  275. display: inline-block;
  276. max-width: 100%;
  277. }
  278. .chat-msg.own .msg-body {
  279. background: #2f80ed;
  280. color: #fff;
  281. }
  282. .chat-msg.system .msg-body {
  283. background: transparent;
  284. color: #9aa4b2;
  285. font-style: italic;
  286. padding: 0;
  287. }
  288. .chat-msg .file-link {
  289. color: #7db4ff;
  290. text-decoration: none;
  291. display: inline-flex;
  292. align-items: center;
  293. gap: 0.4em;
  294. }
  295. .chat-msg.own .file-link {
  296. color: #eaf3ff;
  297. }
  298. .chat-msg .file-size {
  299. font-size: 0.8em;
  300. opacity: 0.8;
  301. }
  302. .chat-msg .chat-image {
  303. display: block;
  304. max-width: 100%;
  305. max-height: 220px;
  306. border-radius: 6px;
  307. cursor: pointer;
  308. margin-bottom: 4px;
  309. }
  310. .chat-input {
  311. flex: 0 0 auto;
  312. padding: 0.7em;
  313. border-top: 1px solid #2b2f38;
  314. }
  315. /* Participants / attendance side panel */
  316. #peoplePanel {
  317. flex: 0 0 320px;
  318. display: flex;
  319. flex-direction: column;
  320. background: #1e2128;
  321. border-left: 1px solid #2b2f38;
  322. min-width: 0;
  323. }
  324. #attendanceList {
  325. flex: 1 1 auto;
  326. overflow-y: auto;
  327. padding: 0.8em;
  328. }
  329. .attendance-group {
  330. font-size: 0.78em;
  331. color: #9aa4b2;
  332. text-transform: uppercase;
  333. letter-spacing: 0.06em;
  334. margin: 0.6em 0 0.4em 0;
  335. }
  336. .attendance-entry {
  337. display: flex;
  338. align-items: center;
  339. gap: 0.6em;
  340. background: #262a33;
  341. border-radius: 8px;
  342. padding: 6px 10px;
  343. margin-bottom: 6px;
  344. }
  345. .attendance-entry .icon {
  346. margin: 0;
  347. color: #9aa4b2;
  348. }
  349. .attendance-entry.present .icon {
  350. color: #7bed9f;
  351. }
  352. .attendance-entry .attendee-name {
  353. flex: 1 1 auto;
  354. min-width: 0;
  355. white-space: nowrap;
  356. overflow: hidden;
  357. text-overflow: ellipsis;
  358. }
  359. .attendance-entry .host-tag {
  360. flex: 0 0 auto;
  361. font-size: 0.72em;
  362. background: #2f80ed;
  363. color: #fff;
  364. border-radius: 8px;
  365. padding: 1px 8px;
  366. }
  367. .attendance-entry .attendee-times {
  368. flex: 0 0 auto;
  369. font-size: 0.75em;
  370. color: #9aa4b2;
  371. text-align: right;
  372. white-space: nowrap;
  373. }
  374. /* Raised-hand marker in the participant list */
  375. .attendance-entry .hand-indicator.icon {
  376. flex: 0 0 auto;
  377. color: #f2b134;
  378. margin: 0;
  379. }
  380. /* Raise-hand queue entries (ordered, at the top of the participant list) */
  381. .hand-queue-entry {
  382. display: flex;
  383. align-items: center;
  384. gap: 0.6em;
  385. background: #2c2a1e;
  386. border: 1px solid #4a4020;
  387. border-radius: 8px;
  388. padding: 6px 10px;
  389. margin-bottom: 6px;
  390. }
  391. .hand-queue-entry .hand-queue-pos {
  392. flex: 0 0 auto;
  393. width: 20px;
  394. height: 20px;
  395. line-height: 20px;
  396. text-align: center;
  397. border-radius: 50%;
  398. background: #f2b134;
  399. color: #3a2a05;
  400. font-size: 0.78em;
  401. font-weight: bold;
  402. }
  403. .hand-queue-entry .hand-indicator.icon {
  404. flex: 0 0 auto;
  405. color: #f2b134;
  406. margin: 0;
  407. }
  408. .hand-queue-entry .attendee-name {
  409. flex: 1 1 auto;
  410. min-width: 0;
  411. white-space: nowrap;
  412. overflow: hidden;
  413. text-overflow: ellipsis;
  414. }
  415. /* Host-only kick button */
  416. .attendance-entry .kick-btn {
  417. flex: 0 0 auto;
  418. background: transparent;
  419. border: none;
  420. color: #9aa4b2;
  421. cursor: pointer;
  422. padding: 2px 4px;
  423. border-radius: 6px;
  424. line-height: 1;
  425. }
  426. .attendance-entry .kick-btn:hover {
  427. background: #5c2b2b;
  428. color: #ffb3ab;
  429. }
  430. .attendance-entry .kick-btn .icon {
  431. margin: 0;
  432. color: inherit;
  433. }
  434. /* Attachment source menu (pops above the chat input) */
  435. #attachMenu {
  436. position: absolute;
  437. left: 0.7em;
  438. right: 0.7em;
  439. bottom: 100%;
  440. margin-bottom: 6px;
  441. background: #262a33;
  442. border: 1px solid #3a3f4a;
  443. border-radius: 8px;
  444. box-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);
  445. overflow: hidden;
  446. z-index: 25;
  447. }
  448. .chat-input {
  449. position: relative;
  450. }
  451. .attach-menu-item {
  452. display: flex;
  453. align-items: center;
  454. gap: 0.6em;
  455. width: 100%;
  456. background: transparent;
  457. border: none;
  458. color: #e6e8ec;
  459. text-align: left;
  460. padding: 10px 14px;
  461. cursor: pointer;
  462. font-family: inherit;
  463. font-size: 0.9em;
  464. }
  465. .attach-menu-item:hover {
  466. background: #313641;
  467. }
  468. .attach-menu-item .icon {
  469. margin: 0;
  470. color: #7db4ff;
  471. }
  472. /* Connection stats: a compact floating window that overlays the meeting.
  473. Defaults to the top-left so it stays clear of the right-docked chat /
  474. participants panels; the user can drag it anywhere by its header. */
  475. #statsPanel {
  476. position: absolute;
  477. top: 60px;
  478. left: 14px;
  479. width: 264px;
  480. max-width: calc(100% - 28px);
  481. max-height: calc(100% - 150px);
  482. background: #1e2128;
  483. border: 1px solid #3a3f4a;
  484. border-radius: 10px;
  485. box-shadow: 0 12px 32px rgba(0, 0, 0, 0.55);
  486. display: flex;
  487. flex-direction: column;
  488. overflow: hidden;
  489. z-index: 35;
  490. }
  491. #statsHeader {
  492. flex: 0 0 auto;
  493. display: flex;
  494. align-items: center;
  495. gap: 0.4em;
  496. padding: 0.6em 0.9em;
  497. font-weight: bold;
  498. font-size: 0.9em;
  499. border-bottom: 1px solid #2b2f38;
  500. cursor: move;
  501. user-select: none;
  502. -webkit-user-select: none;
  503. touch-action: none;
  504. }
  505. #statsHeader .chart.line.icon {
  506. margin: 0;
  507. color: #7db4ff;
  508. }
  509. #statsHeader .stats-title {
  510. flex: 1 1 auto;
  511. }
  512. .stats-close {
  513. flex: 0 0 auto;
  514. cursor: pointer;
  515. color: #9aa4b2;
  516. margin: 0;
  517. }
  518. .stats-close:hover {
  519. color: #e6e8ec;
  520. }
  521. #statsBody {
  522. flex: 1 1 auto;
  523. overflow-y: auto;
  524. padding: 0.8em;
  525. }
  526. .stats-empty {
  527. color: #9aa4b2;
  528. font-size: 0.88em;
  529. padding: 0.6em 0.2em;
  530. }
  531. .stats-summary {
  532. display: flex;
  533. gap: 8px;
  534. margin-bottom: 0.8em;
  535. }
  536. .stats-summary-item {
  537. flex: 1 1 0;
  538. background: #262a33;
  539. border-radius: 8px;
  540. padding: 10px;
  541. display: flex;
  542. flex-direction: column;
  543. align-items: center;
  544. gap: 2px;
  545. }
  546. .stats-summary-item .icon {
  547. margin: 0;
  548. color: #7db4ff;
  549. }
  550. .stats-summary-item strong {
  551. font-size: 1.05em;
  552. font-variant-numeric: tabular-nums;
  553. }
  554. .stats-summary-item span {
  555. font-size: 0.72em;
  556. color: #9aa4b2;
  557. text-transform: uppercase;
  558. letter-spacing: 0.05em;
  559. }
  560. .stats-peer {
  561. background: #262a33;
  562. border-radius: 8px;
  563. padding: 8px 10px;
  564. margin-bottom: 6px;
  565. }
  566. .stats-peer-name {
  567. display: flex;
  568. align-items: center;
  569. gap: 0.5em;
  570. font-size: 0.9em;
  571. margin-bottom: 4px;
  572. white-space: nowrap;
  573. overflow: hidden;
  574. text-overflow: ellipsis;
  575. }
  576. .stats-quality {
  577. flex: 0 0 auto;
  578. font-size: 0.68em;
  579. text-transform: uppercase;
  580. letter-spacing: 0.05em;
  581. border-radius: 8px;
  582. padding: 1px 8px;
  583. }
  584. .stats-quality.good {
  585. background: #1f4d33;
  586. color: #7bed9f;
  587. }
  588. .stats-quality.fair {
  589. background: #5a4a1e;
  590. color: #ffe09a;
  591. }
  592. .stats-quality.poor {
  593. background: #5c2b2b;
  594. color: #ffb3ab;
  595. }
  596. .stats-peer-metrics {
  597. display: grid;
  598. grid-template-columns: 1fr 1fr;
  599. gap: 3px 10px;
  600. font-size: 0.82em;
  601. color: #c3c9d4;
  602. font-variant-numeric: tabular-nums;
  603. }
  604. .stats-peer-metrics span {
  605. display: inline-flex;
  606. align-items: center;
  607. gap: 0.4em;
  608. }
  609. .stats-peer-metrics .icon {
  610. margin: 0;
  611. color: #9aa4b2;
  612. }
  613. /* Invite dialog */
  614. #inviteModal {
  615. position: absolute;
  616. top: 0;
  617. right: 0;
  618. bottom: 0;
  619. left: 0;
  620. background: rgba(0, 0, 0, 0.55);
  621. display: flex;
  622. align-items: center;
  623. justify-content: center;
  624. z-index: 40;
  625. padding: 1em;
  626. }
  627. .invite-card {
  628. width: 100%;
  629. max-width: 420px;
  630. background: #1e2128;
  631. border: 1px solid #2b2f38;
  632. border-radius: 12px;
  633. box-shadow: 0 12px 40px rgba(0, 0, 0, 0.55);
  634. max-height: calc(100vh - 2em);
  635. display: flex;
  636. flex-direction: column;
  637. overflow: hidden;
  638. }
  639. .invite-card-header {
  640. flex: 0 0 auto;
  641. padding: 0.9em 1.1em;
  642. font-weight: bold;
  643. border-bottom: 1px solid #2b2f38;
  644. }
  645. .invite-card-header .icon {
  646. color: #7db4ff;
  647. }
  648. .invite-card-close {
  649. float: right;
  650. cursor: pointer;
  651. color: #9aa4b2;
  652. }
  653. .invite-card-close:hover {
  654. color: #e6e8ec;
  655. }
  656. .invite-card-body {
  657. flex: 1 1 auto;
  658. overflow-y: auto;
  659. padding: 1.1em;
  660. }
  661. .invite-field {
  662. margin-bottom: 1em;
  663. }
  664. .invite-field label {
  665. display: block;
  666. font-size: 0.75em;
  667. text-transform: uppercase;
  668. letter-spacing: 0.05em;
  669. color: #9aa4b2;
  670. margin-bottom: 0.35em;
  671. }
  672. .invite-value {
  673. color: #e6e8ec;
  674. word-break: break-word;
  675. }
  676. .invite-copy-row {
  677. display: flex;
  678. align-items: center;
  679. gap: 6px;
  680. }
  681. .invite-id {
  682. flex: 1 1 auto;
  683. font-size: 1.25em;
  684. font-weight: bold;
  685. letter-spacing: 0.04em;
  686. color: #e6e8ec;
  687. font-variant-numeric: tabular-nums;
  688. }
  689. .invite-copy-row input {
  690. flex: 1 1 auto;
  691. min-width: 0;
  692. background: #262a33;
  693. border: 1px solid #3a3f4a;
  694. border-radius: 6px;
  695. color: #e6e8ec;
  696. padding: 8px 10px;
  697. font-family: inherit;
  698. font-size: 0.85em;
  699. }
  700. .invite-copy-btn {
  701. flex: 0 0 auto;
  702. }
  703. .invite-note {
  704. background: #3a3320;
  705. color: #ffe09a;
  706. border-radius: 8px;
  707. padding: 8px 12px;
  708. font-size: 0.82em;
  709. margin-bottom: 1em;
  710. }
  711. .invite-note .icon {
  712. margin: 0 0.3em 0 0;
  713. }
  714. #inviteMessage {
  715. width: 100%;
  716. background: #262a33;
  717. border: 1px solid #3a3f4a;
  718. border-radius: 6px;
  719. color: #e6e8ec;
  720. padding: 8px 10px;
  721. font-family: inherit;
  722. font-size: 0.9em;
  723. resize: vertical;
  724. box-sizing: border-box;
  725. }
  726. .invite-card-footer {
  727. flex: 0 0 auto;
  728. padding: 0.9em 1.1em;
  729. border-top: 1px solid #2b2f38;
  730. text-align: right;
  731. }
  732. /* New chat message popup */
  733. #msgToast {
  734. position: absolute;
  735. right: 16px;
  736. bottom: 78px;
  737. max-width: 300px;
  738. background: #262a33;
  739. color: #e6e8ec;
  740. border: 1px solid #3a3f4a;
  741. border-left: 3px solid #2f80ed;
  742. border-radius: 8px;
  743. padding: 10px 14px;
  744. box-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);
  745. cursor: pointer;
  746. z-index: 30;
  747. }
  748. #msgToast .toast-title {
  749. font-weight: bold;
  750. font-size: 0.85em;
  751. margin-bottom: 3px;
  752. display: flex;
  753. align-items: center;
  754. gap: 0.4em;
  755. }
  756. #msgToast .toast-title .icon {
  757. margin: 0;
  758. color: #7db4ff;
  759. }
  760. #msgToast .toast-body {
  761. font-size: 0.85em;
  762. color: #c3c9d4;
  763. word-break: break-word;
  764. overflow: hidden;
  765. display: -webkit-box;
  766. -webkit-line-clamp: 3;
  767. -webkit-box-orient: vertical;
  768. }
  769. #uploadStatus {
  770. color: #9aa4b2;
  771. font-size: 0.85em;
  772. margin-bottom: 0.4em;
  773. }
  774. /* Control bar */
  775. #controlBar {
  776. flex: 0 0 auto;
  777. display: flex;
  778. justify-content: center;
  779. gap: 10px;
  780. padding: 10px;
  781. background: #1e2128;
  782. border-top: 1px solid #2b2f38;
  783. flex-wrap: wrap;
  784. }
  785. .ctrl-btn {
  786. background: #262a33;
  787. color: #e6e8ec;
  788. border: none;
  789. border-radius: 10px;
  790. padding: 8px 14px;
  791. min-width: 74px;
  792. cursor: pointer;
  793. font-family: inherit;
  794. font-size: 0.85em;
  795. display: flex;
  796. flex-direction: column;
  797. align-items: center;
  798. gap: 3px;
  799. position: relative;
  800. }
  801. .ctrl-btn:hover {
  802. background: #313641;
  803. }
  804. .ctrl-btn .icon {
  805. margin: 0;
  806. font-size: 1.3em;
  807. }
  808. .ctrl-btn.ctrl-off {
  809. background: #3a2a2c;
  810. color: #ff8a80;
  811. }
  812. .ctrl-btn.ctrl-active {
  813. background: #1f4d33;
  814. color: #7bed9f;
  815. }
  816. .ctrl-btn.ctrl-danger {
  817. background: #5c2b2b;
  818. color: #ffb3ab;
  819. }
  820. .ctrl-btn.ctrl-danger:hover {
  821. background: #742f2f;
  822. }
  823. .ctrl-btn:disabled {
  824. opacity: 0.45;
  825. cursor: not-allowed;
  826. }
  827. .chat-badge {
  828. position: absolute;
  829. top: 4px;
  830. right: 8px;
  831. background: #e74c3c;
  832. color: #fff;
  833. border-radius: 10px;
  834. min-width: 18px;
  835. height: 18px;
  836. line-height: 18px;
  837. font-size: 0.75em;
  838. padding: 0 4px;
  839. }
  840. /* Narrow layouts (embedded / mobile) */
  841. @media (max-width: 720px) {
  842. #chatPanel,
  843. #peoplePanel {
  844. position: absolute;
  845. right: 0;
  846. top: 0;
  847. bottom: 0;
  848. width: 85%;
  849. max-width: 320px;
  850. z-index: 20;
  851. }
  852. #roomBody {
  853. position: relative;
  854. }
  855. }