some basic viewer

This commit is contained in:
Robin Appelman 2023-04-29 14:54:53 +02:00
commit 5910b2f35a
45 changed files with 1089 additions and 1436 deletions

14
style/pages/viewer.css Normal file
View file

@ -0,0 +1,14 @@
@import 'viewer/AnalyseMenu.css';
@import 'viewer/Analyser.css';
@import 'viewer/KillFeed.css';
@import 'viewer/MapContainer.css';
@import 'viewer/MapRender.css';
@import 'viewer/Panner.css';
@import 'viewer/Player.css';
@import 'viewer/PlayerSpec.css';
@import 'viewer/Timeline.css';
progress {
width: 100%;
display: block;
}

View file

@ -0,0 +1,42 @@
.analyse-menu {
position: absolute;
top: 0;
left: 0;
opacity: 0.5;
transition: all 0.5s;
&:hover {
opacity: 1;
}
& .share-session {
background: transparent;
color: var(--primary-color);
font-size: 200%;
width: 32px;
height: 32px;
margin: 10px;
border: none;
cursor: pointer;
background-image: url("images/link_white.svg");
background-size: contain;
&:active, &:focus {
outline: none;
}
}
& .share-text {
color: var(--primary-color);
background-color: var(--text-secondary);
padding: 5px;
margin-top: 0;
border: 1px #888 solid;
border-radius: 5px;
&:active, &:focus {
outline: none;
}
}
}

View file

@ -0,0 +1,75 @@
.map-holder {
position: fixed;
top: 32px;
left: 0;
width: 100%;
height: calc(100% - 32px - 100px);
}
.time-control {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 100px;
background-color: var(--primary-color-accent);
& .timeline {
position: absolute;
bottom: 0;
left: 64px;
width: calc(100% - 64px);
}
& .play-pause-button {
position: absolute;
bottom: 0;
left: 0;
height: 100px;
width: 64px;
background-color: transparent;
color: black;
font-size: 200%;
border: none;
&:focus, &:active {
outline: none;
}
}
}
.error-holder {
.error-image {
text-align: center;
padding: 20px;
font-size: 250%;
&::after {
display: block;
content: '';
background-size: contain;
background-repeat: no-repeat;
background-position: 50% 50%;
background-image: url('images/teleporter.png');
width: 100%;
height: 500px;
margin: 50px 0;
}
}
& .error {
background-color: #FF9494;
line-height: 32px;
margin: 0 -30px;
padding: 32px;
padding-left: 74px;
background-image: url('images/error.png');
background-size: 32px;
background-repeat: no-repeat;
background-position: 32px 32px;
& .error-hint {
margin-top: 32px;
}
}
}

View file

@ -0,0 +1,45 @@
.killfeed {
position: absolute;
top: 0;
right: 0;
padding: 15px;
user-select: none;
& .kill {
& .red {
color: #a75d50;
}
& .blue {
color: #5b818f;
}
&.active-player {
background-color: #ddcfb2;
}
display: inline-block;
margin: 3px;
white-space: nowrap;
background-color: #2d2727cc;
border-radius: 5px;
padding: 5px 15px;
width: auto;
text-align: right;
color: var(--primary-color);
font-weight: bold;
float: right;
clear: both;
& .player {
padding: 0 5px;
}
}
}
.kill-icon {
display: inline-block;
height: 22px;
width: auto;
vertical-align: middle;
filter: brightness(600%);
}

View file

@ -0,0 +1,5 @@
.map-container {
width: 100%;
height: 100%;
background-color: black;
}

View file

@ -0,0 +1,9 @@
.map-background {
/*width: 1000px;*/
/*height: 1000px;*/
min-height: 500px;
min-width: 700px;
background: black no-repeat;
background-position: bottom left;
background-size: contain;
}

View file

@ -0,0 +1,54 @@
.pan-zoom-element {
border: 1px solid #ccc;
position: relative;
overflow: hidden;
cursor: default;
& .content-container {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
}
& .noselect {
user-select: none;
}
}
.zoommenu {
position: fixed;
color: #888;
bottom: 100px;
right: 0;
margin: 10px;
font-size: 200%;
opacity: 0.5;
transition: all 0.5s;
&:hover {
opacity: 1;
}
background-color: #f8f8f8;
border-radius: 5px;
& div {
transition: all 0.5s;
width: 32px;
text-align: center;
cursor: pointer;
user-select: none;
&:hover {
color: #000;
}
}
& div:first-child {
border-bottom: 1px solid #ddd;
margin: 0;
}
}

View file

@ -0,0 +1,4 @@
.player-icon {
mask-size: cover;
mask-repeat: no-repeat;
}

View file

@ -0,0 +1,218 @@
.blueSpecHolder {
position: absolute;
left: 0;
top: 50%;
transform: translate(0, -50%);
}
.redSpecHolder {
position: absolute;
right: 0;
top: 50%;
transform: translate(0, -50%);
}
.playerspec {
background-color: black;
color: white;
height: 42px;
width: 200px;
position: relative;
font-family: sans-serif;
margin-bottom: 2px;
user-select: none;
&.uber {
height: 28px;
}
& .class-icon, .steam-avatar {
width: 42px;
height: 42px;
display: inline-block;
position: absolute;
top: 0;
left: 0;
background-position: top left;
background-size: 100% 100%;
&.uber {
height: 28px;
background-size: 28px 28px;
background-repeat: no-repeat;
background-position: 50% 50%;
}
}
& .player-name {
display: inline-block;
position: relative;
padding: 0 5px;
white-space: nowrap;
width: 120px;
overflow: hidden;
text-overflow: ellipsis;
}
& .health-container {
display: inline-block;
position: absolute;
left: 42px;
top: 0;
height: 28px;
width: calc(100% - 42px);
line-height: 28px;
font-weight: bold;
& .health {
position: relative;
float: right;
padding: 0 5px;
}
& .healthbar {
position: absolute;
top: 0;
left: 0;
height: 28px;
}
}
&.red {
& .health-container {
background-color: #a75d50aa;
}
& .healthbar {
background-color: #a75d50;
}
& .class-icon.scout {
background-image: url('../../images/class_portraits/Icon_scout.jpg');
}
& .class-icon.soldier {
background-image: url('../../images/class_portraits/Icon_soldier.jpg');
}
& .class-icon.pyro {
background-image: url('../../images/class_portraits/Icon_pyro.jpg');
}
& .class-icon.demoman {
background-image: url('../../images/class_portraits/Icon_demoman.jpg');
}
& .class-icon.engineer {
background-image: url('../../images/class_portraits/Icon_engineer.jpg');
}
& .class-icon.heavy {
background-image: url('../../images/class_portraits/Icon_heavy.jpg');
}
& .class-icon.medic {
background-image: url('../../images/class_portraits/Icon_medic.jpg');
}
& .class-icon.sniper {
background-image: url('../../images/class_portraits/Icon_sniper.jpg');
}
& .class-icon.spy{
background-image: url('../../images/class_portraits/Icon_spy.jpg');
}
& .class-icon.uber {
background-image: url('images/charge_red.svg');
}
& .class-icon, & .steam-avatar {
right: 0;
left: auto;
}
& .health-container {
right: 42px;
left: auto;
}
& .health {
float: left;
}
& .player-name {
float: right;
direction: ltr;
text-align: right;
}
}
&.blue {
& .health-container {
background-color: #5b818faa;
}
& .healthbar {
background-color: #5b818f;
}
& .class-icon.scout {
background-image: url('../../images/class_portraits/Icon_scout_blue.jpg');
}
& .class-icon.soldier {
background-image: url('../../images/class_portraits/Icon_soldier_blue.jpg');
}
& .class-icon.pyro {
background-image: url('../../images/class_portraits/Icon_pyro_blue.jpg');
}
& .class-icon.demoman {
background-image: url('../../images/class_portraits/Icon_demoman_blue.jpg');
}
& .class-icon.engineer {
background-image: url('../../images/class_portraits/Icon_engineer_blue.jpg');
}
& .class-icon.heavy {
background-image: url('../../images/class_portraits/Icon_heavy_blue.jpg');
}
& .class-icon.medic {
background-image: url('../../images/class_portraits/Icon_medic_blue.jpg');
}
& .class-icon.sniper {
background-image: url('../../images/class_portraits/Icon_sniper_blue.jpg');
}
& .class-icon.spy {
background-image: url('../../images/class_portraits/Icon_spy_blue.jpg');
}
& .class-icon.uber {
background-image: url('images/charge_blue.svg');
}
}
&.overhealed {
& .health {
color: #79d297;
}
& .health:after {
position: absolute;
top: 21px;
right: 0;
padding: 0 5px;
font-size: 10px;
font-weight: bold;
content: 'OVERHEALED'
}
&.red .health:after {
position: absolute;
top: 21px;
left: 0;
right: auto;
}
}
&.dead {
& .healthbar, & .health {
display: none;
}
& .health-container {
background-color: transparent;
}
& .class-icon {
opacity: 0.5;
}
}
}

View file

@ -0,0 +1,21 @@
.timeline {
width: 100%;
height: 100px;
}
.timeline-progress {
position: absolute;
bottom: -60px;
left: 0;
width: 100%;
height: 160px;
}
.timeline-background {
position: absolute;
bottom: 22px;
left: 0;
width: 100%;
height: 78px;
transform: scale(1, -1);
}