You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

939 lines
20 KiB

/* The standard layout defined in the server includes a fixed header with a
* sticky sidebar. This causes the scroll bar for the main area to appear to the
* right of the sidebar, which looks confusing for the chat. Thus that layout is
* overridden with a full set of flex containers to cascade parent element
* height to the main view to limit the vertical scroll bar only to it (same
* thing done for the sidebar and the chat view). */
#body-user,
#body-public {
display: flex;
flex-direction: column;
}
#body-user #header,
#body-public #header {
/* Override fixed position from server to include it in the flex layout */
position: static;
flex-shrink: 0;
}
#content {
display: flex;
flex-direction: row;
overflow: hidden;
flex-grow: 1;
/* Override "min-height: 100%" and "padding-top: 50px" set in server, as the
* header is part of the flex layout and thus the whole body is not
* available for the content. */
min-height: 0;
padding-top: 0;
/* Does not change anything in normal mode, but ensures that the element
* will stretch to the full width in full screen mode. */
width: 100%;
/* Override margin used in server, as the header is part of the flex layout
* and thus the content does not need to be pushed down. */
margin-top: 0;
}
#app-content {
display: flex;
flex-direction: column;
overflow: hidden;
flex-grow: 1;
}
#app-content-wrapper {
display: flex;
flex-direction: column;
overflow: hidden;
flex-grow: 1;
}
#oca-spreedme-add-room {
border-bottom: 1px solid $color-border;
}
.oca-spreedme-add-person {
border: 1px solid $color-border;
border-radius: $border-radius;
}
.contactsmenu-popover li > a > img {
/* The app uses border-box sizing, so the size of the icon is the
* width/height plus the padding set by default in the server
* (16px + 11px*2). */
width: 38px;
height: 38px;
}
/**
* Sidebar styles
*/
#select2-drop {
margin-top: -44px !important;
}
#oca-spreedme-add-room .select2-container,
.oca-spreedme-add-person .select2-container {
width: 100%;
margin: 0 !important;
border: none;
padding: 9px;
}
#oca-spreedme-add-room .select2-container .select2-choice,
.oca-spreedme-add-person .select2-container .select2-choice {
border: none;
color: var(--color-text-maxcontrast) !important;
}
#oca-spreedme-add-room .select2-arrow,
.oca-spreedme-add-person .select2-arrow {
display: none !important;
}
#select2-drop .select2-search input {
padding: 13px 12px 13px 43px !important;
width: 100%;
box-sizing: border-box;
margin: 0;
border: none;
background-image: none !important;
}
#select2-drop .select2-results .select2-result {
padding: 0;
}
.participantWithList .avatar,
#app-navigation .avatar,
#app-navigation .icon-contacts-dark,
#app-navigation .app-navigation-entry-link .icon-public {
position: absolute;
left: 6px;
top: 6px;
}
.participantWithList li > a:first-child img,
#app-navigation li > a:first-child img {
width: 32px !important;
height: 32px !important;
margin: 0 !important;
}
.select2-result .icon-contacts.avatar,
.select2-result .icon-public-white.avatar,
.select2-result .icon-mail.avatar,
#app-navigation .app-navigation-entry-link .icon {
border-radius: 50%;
width: 32px;
height: 32px;
background-color: var(--color-background-darker);
}
.icon-file-white {
@include icon-color('file', 'filetypes', $color-white, 1, true);
}
#app-navigation .favorite-mark {
position: absolute;
/* 44px is the padding of the main entry link, and 16px the size (size, not
* background size) of the icon, both defined in the server. */
left: calc(44px - 16px);
line-height: 100%;
.icon-favorite {
display: inline-block;
vertical-align: middle;
/* Show favorite icon in yellow instead of default black. */
@include icon-color('star-dark', 'actions', 'FC0', 1, true);
}
}
#app-navigation .app-navigation-entry-utils-counter {
overflow: hidden;
text-align: right;
font-size: 9pt;
line-height: 44px;
padding: 0 12px; /* Same padding as all li > a in the app-navigation */
span {
padding: 2px 5px;
border-radius: 10px;
background-color: nc-lighten($color-main-text, 90%);
font-weight: bold;
}
&.highlighted {
padding-right: 0;
text-align: center;
width: 22px !important;
span {
background-color: $color-primary;
color: $color-primary-text;
}
}
}
.hidden-important {
display: none !important;
}
/**
* Main view chat styles
*/
#app-content-wrapper {
height: 100%;
}
#app-content-wrapper #chatView {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
/* The lateral padding is set for each child instead of for the chat view as a
whole to prevent showing the scroll bar padded from the border of the chat
view (which could be fixed by using a negative margin and a positive padding
in the list of messages) and to ensure that the contacts menu is not clipped
due to overflowing the chat view on its left (much harder to fix). */
#app-content-wrapper #chatView .newCommentRow {
padding-left: 44px;
padding-right: 44px;
}
#app-content-wrapper #chatView .comments {
overflow-y: auto;
/* Needed for proper calculation of comment positions in the scrolling
container (as otherwise the comment position is calculated with respect
to the closest ancestor with a relative position) */
position: relative;
padding-left: 44px;
padding-right: 44px;
}
#app-content-wrapper #chatView .comments .wrapper-background,
#app-content-wrapper #chatView .comments .wrapper {
/* Padding is not respected in the comment wrapper due to its absolute
* positioning, so it must be set through its position. */
left: 44px;
right: 44px;
}
/* Hide all siblings of the chat view when shown as the main view */
#app-content-wrapper #chatView ~ *:not(#video-fullscreen):not([id^=tooltip]) {
display: none !important;
}
#emptycontent {
position: absolute;
z-index: 40;
}
#emptycontent-icon {
width: 128px;
margin: 0 auto;
padding-bottom: 20px;
}
#app-content ~ #app-sidebar-wrapper .icon-menu-people,
#app-content .icon-fullscreen {
opacity: .5;
&:hover,
&:focus {
opacity: 1;
}
}
/* Use dark icons when not in a call (= white background) */
#app-content:not(.incall):not(.screensharing) .icon-white.icon-shadow,
#app-content:not(.incall):not(.screensharing) ~ #app-sidebar-wrapper .icon-white.icon-shadow {
/* Still use white icons outside of calls when local video shows; otherwise
* use dark icons.
* There is no need to override "icon-video" and "icon-screensharing", as
* they will never be shown with dark icons. */
&#hideVideo.local-video-disabled,
&#mute.local-video-disabled,
&#screensharing-button.local-video-disabled {
filter: none;
}
&#hideVideo.local-video-disabled {
background-image: var(--icon-video-off-000);
}
&#mute.local-video-disabled {
&.icon-audio-off {
background-image: var(--icon-audio-off-000);
}
&.icon-audio {
background-image: var(--icon-audio-000);
}
}
&#screensharing-button.local-video-disabled {
background-image: var(--icon-screen-off-000);
}
&.icon-menu-people {
background-image: var(--icon-spreed-menu-people-000);
}
&.icon-fullscreen {
background-image: var(--icon-fullscreen-000);
}
&.icon-menu-people,
&.icon-fullscreen {
filter: none;
}
}
/* Use white icon for the app navigation toggle when in a call */
#app-content.incall .icon-menu,
#app-content.screensharing .icon-menu {
@include icon-color('menu', 'actions', $color-white, 1, true);
filter: drop-shadow(1px 1px 4px var(--color-box-shadow));
}
#video-fullscreen {
position: absolute;
top: 44px;
right: 0;
z-index: 90;
}
#video-fullscreen,
#app-sidebar-trigger {
background-color: transparent;
border: none;
margin: 0;
width: 44px;
height: 44px;
}
/* Fullscreen handling */
/* No switching between rooms in fullscreen, focus on the current call. */
#content:-webkit-full-screen #app-navigation-toggle {
display: none !important;
}
#content:-moz-full-screen #app-navigation-toggle {
display: none !important;
}
#content:-ms-fullscreen #app-navigation-toggle {
display: none !important;
}
#content:fullscreen #app-navigation-toggle {
display: none !important;
}
#content:-webkit-full-screen #app-navigation {
display: none;
}
#content:-moz-full-screen #app-navigation {
display: none;
}
#content:-ms-fullscreen #app-navigation {
display: none;
}
#content:fullscreen #app-navigation {
display: none;
}
#content:-webkit-full-screen #app-content {
margin-left: 0;
}
#content:-moz-full-screen #app-content {
margin-left: 0;
}
#content:-ms-fullscreen #app-content {
margin-left: 0;
}
#content:fullscreen #app-content {
margin-left: 0;
}
/* Set the background of the content to the same colour as the app content and
* the app sidebar to prevent a black background from appearing when the sidebar
* is shown or hidden.
* During a call the background of the app content is black, but as the
* background of the content has the same colour of the sidebar and is a
* placeholder on its position it looks acceptable. */
#content:-webkit-full-screen {
background-color: var(--color-main-background);
}
#content:-moz-full-screen {
background-color: var(--color-main-background);
}
#content:-ms-fullscreen {
background-color: var(--color-main-background);
}
#content:fullscreen {
background-color: var(--color-main-background);
}
.localmediaerror h2 {
color: red;
font-weight: bold;
}
.localmediaerror .emptycontent-additional {
display: none;
}
#app-navigation .utils {
padding: 0;
}
#app-navigation .utils .action {
display: inline-block;
padding: 22px;
cursor: pointer;
opacity: .3;
}
#app-navigation .app-navigation-entry-menu li {
width: auto !important;
float: inherit;
}
#app-navigation .app-navigation-entry-menu li.active {
box-shadow: inset 4px 0 var(--color-primary);
margin-left: -1px;
padding-left: 1px;
}
#app-navigation .app-navigation-entry-menu li div.separator {
border-bottom: 1px solid var(--color-border-dark);
margin: 0 10px;
}
#app-navigation .app-navigation-entry-menu li button {
float: inherit !important;
margin: 0;
padding: 0;
width: 100% !important;
min-height: 44px;
}
#app-navigation .app-navigation-entry-menu input {
margin-left: 5px !important;
margin-top: -5px;
min-width: 150px;
padding-right: 26px;
text-overflow: ellipsis;
overflow: hidden;
}
#app-navigation .app-navigation-entry-menu input.first-option {
margin-top: 5px;
}
#app-navigation .app-navigation-entry-menu li span {
display: inline-block;
height: 36px;
line-height: 36px;
padding-right: 10px;
font-weight: 400;
float: left;
}
#app-navigation .app-navigation-entry-menu li span[class^='icon-'],
#app-navigation .app-navigation-entry-menu li span[class*=' icon-'] {
padding: 16px;
box-sizing: border-box;
}
#app-navigation .app-navigation-entry-utils-menu-button {
display: inline-block;
}
/* The sidebar wrapper contains the trigger for the sidebar and the sidebar
* itself placed in columns. To prevent the trigger from taking up space for the
* app content the trigger width is removed from the wrapper by pushing its left
* margin. */
#app-sidebar-wrapper {
display: flex;
margin-left: -44px;
}
#app-sidebar-trigger {
/* Higher than the z-index of the app-content */
z-index: 1050;
cursor: pointer;
}
/* Override server definitions to ensure that the sidebar is vertically
* stretched, as the header is part of the flex layout and its height does not
* need to be removed from the sidebar (specially in fullscreen mode where there
* is no header). */
#app-sidebar {
position: static;
height: unset;
top: 0;
}
@include icon-black-white('menu-people', 'spreed', 1);
@include icon-black-white('no-password', 'spreed', 1);
@include icon-black-white('share-window', 'spreed', 1);
#app-sidebar .close {
position: absolute;
top: 0;
right: 0;
padding: 22px;
opacity: .3;
/* Higher index than the trigger to hide it when the sidebar is open */
z-index: 20;
}
#app-sidebar .close:hover,
#app-sidebar .close:focus {
opacity: 1;
}
/* make blue header bar transparent in shared room */
#body-public #app-content:not(.participants-1) #header.spreed-public {
background: transparent;
}
/* As the header is hidden (except for the logo), move the fullscreen button and
* sidebar to the top during calls */
#body-public #app-content:not(.participants-1) #app-sidebar,
#body-public #app-content:not(.participants-1) #app-sidebar-trigger,
#body-public #app-content:not(.participants-1) #video-fullscreen {
top: 0;
z-index: 3000;
}
#body-public #app-content:not(.participants-1) #video-fullscreen {
top: 44px;
}
/**
* Right sidebar
*/
#app-sidebar .detailCallInfoContainer {
padding: 15px;
clear: both;
}
.tabHeaders {
display: inline-block;
}
/* START: move padding fixes and icons-for-tabs capability into core */
.tabHeaders {
display: flex;
margin-top: 0;
margin-bottom: 10px;
min-height: 44px;
}
.tabHeaders .tabHeader {
flex-basis: 50%;
flex-grow: 0;
padding: 12px;
text-align: center;
border-bottom: 1px solid $color-border;
margin-bottom: 0;
a {
padding-left: 32px;
background-position: 12px;
background-repeat: no-repeat;
color: $color-main-text;
opacity: .5;
}
}
.tabHeaders .tabHeader.selected a,
.tabHeaders .tabHeader:hover a,
.tabHeaders .tabHeader:focus a {
opacity: 1;
}
/* END: move padding fixes and icons-for-tabs capability into core */
#app-sidebar.hidden {
display: none !important;
}
.participantWithList .participant-moderator-indicator {
color: var(--color-text-maxcontrast);
font-weight: 300;
padding-left: 5px;
}
.participantWithList .icon {
width: 16px;
display: inline-block;
opacity: .4;
margin-left: 5px;
margin-bottom: -4px;
&.hidden {
display: none;
}
}
.participantWithList .participant-offline {
& > a {
color: var(--color-text-maxcontrast);
}
.avatar {
opacity: .4;
}
}
.participantWithList li {
position: relative;
width: 100%;
box-sizing: border-box;
}
.participantWithList li > a {
display: block;
width: 100%;
line-height: 44px;
min-height: 44px;
overflow: hidden;
box-sizing: border-box;
white-space: nowrap;
text-overflow: ellipsis;
padding-left: 44px;
background-size: 16px 16px;
background: no-repeat 14px center;
}
/**
* App navigation utils, buttons and counters for drop down menu
*/
.participantWithList .participant-entry-utils {
position: absolute;
top: 0;
right: 0;
z-index: 105;
}
.participantWithList .active > .participant-entry-utils li {
display: inline-block;
}
.participantWithList .participant-entry-utils li {
width: 44px;
height: 44px;
}
.participantWithList .participant-entry-utils button,
.participantWithList .participant-entry-utils button + .icon-loading-small {
height: 100%;
width: 100%;
margin: 0;
box-shadow: none;
}
.participantWithList .participant-entry-utils-menu-button button {
border: 0;
opacity: .5;
background-color: transparent;
}
.participantWithList .participant-entry-utils-menu-button button:hover,
.participantWithList .participant-entry-utils-menu-button button:focus {
opacity: 1;
}
/**
* Sidebar details view
*/
.detailCallInfoContainer,
.authorRow {
.room-name {
display: block;
margin-right: 29px;
.label {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.input-wrapper {
position: relative;
.username {
width: 100%;
margin: 4px 0 4px 0 !important;
font-size: 15px;
font-weight: 300;
padding-right: 44px;
text-overflow: ellipsis;
}
.icon-confirm.confirm-button {
position: absolute;
right: 0;
top: 2px;
padding: 12px 21px;
margin: 0;
background-color: transparent !important;
border: none;
}
}
}
.guest-name p {
display: inline-block;
padding: 9px 0;
}
.editable-text-label {
.label-wrapper {
display: flex;
align-items: center;
.edit-button {
display: none;
.icon {
background-color: transparent;
border: none;
padding: 13px 22px;
margin: 0;
}
}
&:hover .edit-button {
display: block;
}
}
.input-wrapper {
display: flex;
align-items: center;
}
.label {
margin-left: 5px;
}
}
.call-controls-container {
display: flex;
.call-button,
.share-link-options {
flex-grow: 1;
flex-basis: 50%;
}
.call-button {
flex-grow: 0;
.join-call,
.leave-call {
width: 100%;
padding: 12px;
}
.icon-loading-small {
/* Prevent the text from being moved when the icon is shown. */
position: absolute;
margin-left: 5px;
margin-top: 1px;
/* Unset the background image set by the server for loading
* icons inside buttons, as in this case the pure CSS icon can
* be used instead of the image. */
background-image: unset;
&.hidden {
display: none;
}
}
}
}
.share-link-options {
display: flex;
align-items: center;
.link-checkbox-label {
white-space: nowrap;
padding: 12px;
}
.button {
cursor: pointer;
width: 44px;
height: 44px;
display: block;
background-color: transparent;
border: none;
margin: 0;
opacity: .5;
&:hover,
&:focus,
&:active {
opacity: 1;
}
}
.password-button {
position: relative;
}
}
}
/**
* Cascade parent element height to the chat view in the sidebar to limit the
* vertical scroll bar only to the list of messages. Otherwise, the vertical
* scroll bar would be shown for the whole sidebar and everything would be
* moved when scrolling to see overflown messages.
*
* The list of messages should stretch to fill the available space at the bottom
* of the right sidebar, so the height is cascaded using flex boxes.
*
* It is horrible, I know (but better than using JavaScript ;-) ). Please
* improve it if you know how :-)
*/
#app-sidebar {
display: flex;
flex-direction: column;
}
#app-sidebar .tabs {
display: flex;
flex-direction: column;
overflow: hidden;
flex-grow: 1;
}
#app-sidebar .tabsContainer {
display: flex;
flex-direction: column;
overflow: hidden;
flex-grow: 1;
}
#app-sidebar .tab {
display: flex;
flex-direction: column;
overflow: hidden;
flex-grow: 1;
}
#app-sidebar #chatView {
display: flex;
flex-direction: column;
overflow: hidden;
flex-grow: 1;
}
#app-sidebar .comments {
overflow-y: auto;
/* Needed for proper calculation of comment positions in the scrolling
container (as otherwise the comment position is calculated with respect
to the closest ancestor with a relative position) */
position: relative;
}
/**
* Place the scroll bar of the message list on the right edge of the sidebar,
* but keeping the padding of the tab view.
*
* The padding must be set on the left too to ensure that the contacts menu
* shown when clicking on an author name does not overflow the tab (as it would
* be hidden).
*
* The bottom padding is removed to extend the chat view to the bottom edge of
* the sidebar.
*/
#app-sidebar .tab-chat {
padding-left: 0;
padding-right: 0;
padding-bottom: 0;
}
#app-sidebar #chatView .newCommentRow,
#app-sidebar #chatView .comments {
padding-left: 15px;
padding-right: 15px;
}
#app-sidebar #chatView .comments .wrapper-background,
#app-sidebar #chatView .comments .wrapper {
/* Padding is not respected in the comment wrapper due to its absolute
* positioning, so it must be set through its position. */
left: 15px;
right: 15px;
}
#app-sidebar #chatView .newCommentForm {
/* Make room to show the "Add" button when chat is shown in the sidebar. */
margin-right: 44px;
}
/**
* Limiting the scroll bar in the sidebar to the list of chat messages causes
* the scroll bar to be removed from the whole sidebar in other tabs too.
* Therefore, the scroll bars must be explicitly enabled in the other tab
* contents that need them.
*/
#app-sidebar #participantsTabView {
display: flex;
flex-direction: column;
overflow: hidden;
}
#app-sidebar .participantWithList {
overflow-y: auto;
padding-top: 8px;
}
#app-sidebar .participantWithList .participant:last-child {
/* Add room for the popovermenu on last user */
padding-bottom: 64px;
}
/**
* Place the scroll bar of the participants list on the right edge of the
* sidebar, but keeping the padding of the tab view.
*
* The bottom padding is removed to extend the participant view to the bottom
* edge of the sidebar.
*/
#app-sidebar .tab-participants {
padding-right: 0;
padding-bottom: 0;
}
/* Form needs margin, participant list needs padding
* So the form has margin from the right side, but the scroll bar of the
* participant list is directly on the right.
*/
#app-sidebar #participantsTabView form {
margin-right: 15px;
}
#app-sidebar #participantsTabView .participantWithList {
padding-right: 15px;
}
/**
* Add a little margin to the last participant so the list is nicely framed with
* the sides when fully scrolled to the bottom.
*/
#app-sidebar #participantsTabView .participant:last-child {
margin-bottom: 15px;
}