| @@ -46,6 +46,7 @@ body { | |||
| } | |||
| .media { | |||
| grid-area: media; | |||
| position: relative; | |||
| } | |||
| #textbox { | |||
| resize: vertical; | |||
| @@ -54,49 +55,59 @@ body { | |||
| display: inline; | |||
| padding-left: var(--pad); | |||
| } | |||
| .video-meta { | |||
| position: absolute; | |||
| z-index: 999; | |||
| } | |||
| .video-option { | |||
| display: block; | |||
| } | |||
| .videos { | |||
| display: inline-grid; | |||
| display: grid; | |||
| grid-auto-flow: column; | |||
| grid-gap: 3px; | |||
| justify-content: start; | |||
| overflow: hidden; | |||
| resize: vertical; | |||
| overflow-x: scroll; | |||
| height: 200px; | |||
| width: 100%; | |||
| resize: vertical; | |||
| } | |||
| .video-container { | |||
| background-color: lightsteelblue; | |||
| display: inline-block; | |||
| position: relative; | |||
| height: 100%; | |||
| overflow: scroll; | |||
| } | |||
| .video-meta { | |||
| position: absolute; | |||
| z-index: 999; | |||
| } | |||
| .video-option { | |||
| display: block; | |||
| } | |||
| .video-container video { | |||
| position: absolute; | |||
| background-color: black; | |||
| height: 100%; | |||
| width: 100%; | |||
| } | |||
| /* mirror */ | |||
| .video-container.mirror video { | |||
| transform: scaleX(-1); | |||
| } | |||
| /* square */ | |||
| .video-container.square { | |||
| height: 100%; | |||
| width: var(--height); | |||
| overflow: hidden; | |||
| } | |||
| .video-container.square video { | |||
| object-fit: cover; | |||
| width: 100%; | |||
| height: 100%; | |||
| } | |||
| .video-container.mirror video { | |||
| transform: scaleX(-1); | |||
| } | |||
| /* full-screen */ | |||
| .video-container.full-screen { | |||
| position: initial; | |||
| position: absolute; | |||
| top: 0; | |||
| left: 0; | |||
| right: 0; | |||
| width: unset; | |||
| z-index: 999; | |||
| overflow: scroll; | |||
| background-color: black; | |||
| } | |||
| .video-container.full-screen video { | |||
| position: relative; | |||
| object-fit: contain; | |||
| width: unset; | |||
| height: unset; | |||
| } | |||
| @media only screen and (min-width: 800px) { | |||
| .chat { | |||
| @@ -0,0 +1,57 @@ | |||
| <meta charset="utf-8"/> | |||
| <link rel="stylesheet" href="/pico.css" /> | |||
| <style> | |||
| body { | |||
| margin: 0; | |||
| } | |||
| .media { | |||
| position: fixed; | |||
| top: 50; | |||
| left: 100; | |||
| width: 800; | |||
| height: 300; | |||
| background-color: crimson; | |||
| padding: 1em; | |||
| overflow: hidden; | |||
| resize: both; | |||
| } | |||
| .videos { | |||
| --pad: 3px; | |||
| grid-gap: var(--pad); | |||
| padding: var(--pad); | |||
| height: calc(100% - 2 * var(--pad)); | |||
| background-color: royalblue; | |||
| } | |||
| </style> | |||
| <body> | |||
| <div class="media"> | |||
| <div class="videos"> | |||
| <div class="video-container mirror"> | |||
| <video autoplay></video> | |||
| </div> | |||
| <div class="video-container mirror square"> | |||
| <video autoplay></video> | |||
| </div> | |||
| <div class="video-container mirror"> | |||
| <video autoplay></video> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </body> | |||
| <script> | |||
| navigator.mediaDevices.getUserMedia({audio: false, video: true}) | |||
| .then(stream => document.querySelectorAll('video') | |||
| .forEach(video => video.srcObject = stream)) | |||
| </script> | |||
| <script> | |||
| const doOne = ({target}) => target.style.setProperty('--height', `${target.clientHeight}px`) | |||
| const doAll = (entries) => entries.forEach(doOne) | |||
| sizer = new ResizeObserver(doAll) | |||
| document.querySelectorAll('.video-container').forEach(el => sizer.observe(el)) | |||
| document.querySelectorAll('.video-container').forEach(el => | |||
| el.onclick = (ev) => el.classList.toggle('full-screen')) | |||
| </script> | |||