Skip to content
Snippets Groups Projects
  • HJ's avatar
    4e56e640
    Merge remote-tracking branch 'origin/develop' into better-selects · 4e56e640
    HJ authored
    * origin/develop: (76 commits)
      Translated using Weblate (Italian)
      Translated using Weblate (Basque)
      Translated using Weblate (Spanish)
      Translated using Weblate (Chinese (Simplified))
      Translated using Weblate (Italian)
      Translated using Weblate (Chinese (Traditional))
      Translated using Weblate (Russian)
      Translated using Weblate (Italian)
      Translated using Weblate (French)
      Translated using Weblate (Russian)
      Translated using Weblate (Italian)
      Translated using Weblate (French)
      Translated using Weblate (Basque)
      Translated using Weblate (Spanish)
      Translated using Weblate (Chinese (Simplified))
      Translated using Weblate (Japanese)
      Translated using Weblate (Italian)
      Translated using Weblate (Esperanto)
      Translated using Weblate (Chinese (Traditional))
      Translated using Weblate (Norwegian Bokmål)
      ...
    4e56e640
    History
    Merge remote-tracking branch 'origin/develop' into better-selects
    HJ authored
    * origin/develop: (76 commits)
      Translated using Weblate (Italian)
      Translated using Weblate (Basque)
      Translated using Weblate (Spanish)
      Translated using Weblate (Chinese (Simplified))
      Translated using Weblate (Italian)
      Translated using Weblate (Chinese (Traditional))
      Translated using Weblate (Russian)
      Translated using Weblate (Italian)
      Translated using Weblate (French)
      Translated using Weblate (Russian)
      Translated using Weblate (Italian)
      Translated using Weblate (French)
      Translated using Weblate (Basque)
      Translated using Weblate (Spanish)
      Translated using Weblate (Chinese (Simplified))
      Translated using Weblate (Japanese)
      Translated using Weblate (Italian)
      Translated using Weblate (Esperanto)
      Translated using Weblate (Chinese (Traditional))
      Translated using Weblate (Norwegian Bokmål)
      ...
App.scss 17.17 KiB
@import './_variables.scss';

#app {
  min-height: 100vh;
  max-width: 100%;
  overflow: hidden;
}

.app-bg-wrapper {
  position: fixed;
  z-index: -1;
  height: 100%;
  left: 0;
  right: -20px;
  background-size: cover;
  background-repeat: no-repeat;
  background-color: var(--wallpaper);
  background-image: var(--body-background-image);
  background-position: 50% 50px;
}

i[class^='icon-'] {
  user-select: none;
}

h4 {
  margin: 0;
}

#content {
  box-sizing: border-box;
  padding-top: 60px;
  margin: auto;
  min-height: 100vh;
  max-width: 980px;
  align-content: flex-start;
}

.underlay {
  background-color: rgba(0,0,0,0.15);
  background-color: var(--underlay, rgba(0,0,0,0.15));
}

.text-center {
  text-align: center;
}

html {
  font-size: 14px;
}

body {
  overscroll-behavior-y: none;
  font-family: sans-serif;
  font-family: var(--interfaceFont, sans-serif);
  margin: 0;
  color: $fallback--text;
  color: var(--text, $fallback--text);
  max-width: 100vw;
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;

  &.hidden {
    display: none;
  }
}

a {
  text-decoration: none;
  color: $fallback--link;
  color: var(--link, $fallback--link);
}

.button-default {
  user-select: none;
  color: $fallback--text;
  color: var(--btnText, $fallback--text);
  background-color: $fallback--fg;
  background-color: var(--btn, $fallback--fg);
  border: none;
  border-radius: $fallback--btnRadius;
  border-radius: var(--btnRadius, $fallback--btnRadius);
  cursor: pointer;
  box-shadow: $fallback--buttonShadow;
  box-shadow: var(--buttonShadow);
  font-size: 14px;
  font-family: sans-serif;
  font-family: var(--interfaceFont, sans-serif);

  i[class*=icon-],
  .svg-inline--fa {
    color: $fallback--text;
    color: var(--btnText, $fallback--text);
  }

  &::-moz-focus-inner {
    border: none;
  }

  &:hover {
    box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3);
    box-shadow: var(--buttonHoverShadow);
  }

  &:active {
    box-shadow: 0px 0px 4px 0px rgba(255, 255, 255, 0.3), 0px 1px 0px 0px rgba(0, 0, 0, 0.2) inset, 0px -1px 0px 0px rgba(255, 255, 255, 0.2) inset;
    box-shadow: var(--buttonPressedShadow);
    color: $fallback--text;
    color: var(--btnPressedText, $fallback--text);
    background-color: $fallback--fg;
    background-color: var(--btnPressed, $fallback--fg);

    svg,
    i {
      color: $fallback--text;
      color: var(--btnPressedText, $fallback--text);
    }
  }

  &:disabled {
    cursor: not-allowed;
    color: $fallback--text;
    color: var(--btnDisabledText, $fallback--text);
    background-color: $fallback--fg;
    background-color: var(--btnDisabled, $fallback--fg);

    svg,
    i {
      color: $fallback--text;
      color: var(--btnDisabledText, $fallback--text);
    }
  }

  &.toggled {
    color: $fallback--text;
    color: var(--btnToggledText, $fallback--text);
    background-color: $fallback--fg;
    background-color: var(--btnToggled, $fallback--fg);
    box-shadow: 0px 0px 4px 0px rgba(255, 255, 255, 0.3), 0px 1px 0px 0px rgba(0, 0, 0, 0.2) inset, 0px -1px 0px 0px rgba(255, 255, 255, 0.2) inset;
    box-shadow: var(--buttonPressedShadow);

    svg,
    i {
      color: $fallback--text;
      color: var(--btnToggledText, $fallback--text);
    }
  }

  &.danger {
    // TODO: add better color variable
    color: $fallback--text;
    color: var(--alertErrorPanelText, $fallback--text);
    background-color: $fallback--alertError;
    background-color: var(--alertError, $fallback--alertError);
  }
}

.button-unstyled {
  background: none;
  border: none;
  outline: none;
  display: inline;
  text-align: initial;
  font-size: 100%;
  font-family: inherit;
  padding: 0;
  line-height: unset;
  cursor: pointer;
  box-sizing: content-box;
  color: inherit;

  &.-link {
    color: $fallback--link;
    color: var(--link, $fallback--link);
  }

  &.-fullwidth {
    width: 100%;
  }

  &.-hover-highlight {
    &:hover svg {
      color: $fallback--lightText;
      color: var(--lightText, $fallback--lightText);
    }
  }
}

input, textarea, .input {

  &.unstyled {
    border-radius: 0;
    background: none;
    box-shadow: none;
    height: unset;
  }

  border: none;
  border-radius: $fallback--inputRadius;
  border-radius: var(--inputRadius, $fallback--inputRadius);
  box-shadow: 0px 1px 0px 0px rgba(0, 0, 0, 0.2) inset, 0px -1px 0px 0px rgba(255, 255, 255, 0.2) inset, 0px 0px 2px 0px rgba(0, 0, 0, 1) inset;
  box-shadow: var(--inputShadow);
  background-color: $fallback--fg;
  background-color: var(--input, $fallback--fg);
  color: $fallback--lightText;
  color: var(--inputText, $fallback--lightText);
  font-family: sans-serif;
  font-family: var(--inputFont, sans-serif);
  font-size: 14px;
  margin: 0;
  box-sizing: border-box;
  display: inline-block;
  position: relative;
  height: 28px;
  line-height: 16px;
  hyphens: none;
  padding: 8px .5em;

  &:disabled, &[disabled=disabled], &.disabled {
    cursor: not-allowed;
    opacity: 0.5;
  }

  &[type=range] {
    background: none;
    border: none;
    margin: 0;
    box-shadow: none;
    flex: 1;
  }

  &[type=radio] {
    display: none;
    &:checked + label::before {
      box-shadow: 0px 0px 2px black inset, 0px 0px 0px 4px $fallback--fg inset;
      box-shadow: var(--inputShadow), 0px 0px 0px 4px var(--fg, $fallback--fg) inset;
      background-color: var(--accent, $fallback--link);
    }
    &:disabled {
      &,
      & + label,
      & + label::before {
        opacity: .5;
      }
    }
    + label::before {
      flex-shrink: 0;
      display: inline-block;
      content: '';
      transition: box-shadow 200ms;
      width: 1.1em;
      height: 1.1em;
      border-radius: 100%; // Radio buttons should always be circle
      box-shadow: 0px 0px 2px black inset;
      box-shadow: var(--inputShadow);
      margin-right: .5em;
      background-color: $fallback--fg;
      background-color: var(--input, $fallback--fg);
      vertical-align: top;
      text-align: center;
      line-height: 1.1em;
      font-size: 1.1em;
      box-sizing: border-box;
      color: transparent;
      overflow: hidden;
      box-sizing: border-box;
    }
  }

  &[type=checkbox] {
    display: none;
    &:checked + label::before {
      color: $fallback--text;
      color: var(--inputText, $fallback--text);
    }
    &:disabled {
      &,
      & + label,
      & + label::before {
        opacity: .5;
      }
    }
    + label::before {
      flex-shrink: 0;
      display: inline-block;
      content: '✓';
      transition: color 200ms;
      width: 1.1em;
      height: 1.1em;
      border-radius: $fallback--checkboxRadius;
      border-radius: var(--checkboxRadius, $fallback--checkboxRadius);
      box-shadow: 0px 0px 2px black inset;
      box-shadow: var(--inputShadow);
      margin-right: .5em;
      background-color: $fallback--fg;
      background-color: var(--input, $fallback--fg);
      vertical-align: top;
      text-align: center;
      line-height: 1.1em;
      font-size: 1.1em;
      box-sizing: border-box;
      color: transparent;
      overflow: hidden;
      box-sizing: border-box;
    }
  }

  &.resize-height {
    resize: vertical;
  }
}

option {
  color: $fallback--text;
  color: var(--text, $fallback--text);
  background-color: $fallback--bg;
  background-color: var(--bg, $fallback--bg);
}

.hide-number-spinner {
  -moz-appearance: textfield;
  &[type=number]::-webkit-inner-spin-button,
  &[type=number]::-webkit-outer-spin-button {
    opacity: 0;
    display: none;
  }
}

i[class*=icon-], .svg-inline--fa  {
  color: $fallback--icon;
  color: var(--icon, $fallback--icon);
}

.btn-block {
  display: block;
  width: 100%;
}

.btn-group {
  position: relative;
  display: inline-flex;
  vertical-align: middle;

  button {
    position: relative;
    flex: 1 1 auto;

    &:not(:last-child) {
      border-top-right-radius: 0;
      border-bottom-right-radius: 0;
    }

    &:not(:first-child) {
      border-top-left-radius: 0;
      border-bottom-left-radius: 0;
    }
  }
}

.container {
  display: flex;
  flex-wrap: wrap;
  margin: 0;
  padding: 0 10px 0 10px;
}

.auto-size {
  flex: 1
}

main-router {
  flex: 1;
}

.status.compact {
  color: rgba(0, 0, 0, 0.42);
  font-weight: 300;

  p {
    margin: 0;
    font-size: 0.8em
  }
}

/* Panel */

.panel {
  display: flex;
  position: relative;

  flex-direction: column;
  margin: 0.5em;

  background-color: $fallback--bg;
  background-color: var(--bg, $fallback--bg);

  &::after, & {
    border-radius: $fallback--panelRadius;
    border-radius: var(--panelRadius, $fallback--panelRadius);
  }

  &::after {
    content: '';
    position: absolute;

    top: 0;
    bottom: 0;
    left: 0;
    right: 0;

    pointer-events: none;

    box-shadow: 1px 1px 4px rgba(0,0,0,.6);
    box-shadow: var(--panelShadow);
  }
}

.panel-body:empty::before {
  content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations
  display: block;
  margin: 1em;
  text-align: center;
}

.panel-heading {
  display: flex;
  flex: none;
  border-radius: $fallback--panelRadius $fallback--panelRadius 0 0;
  border-radius: var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius) 0 0;
  background-size: cover;
  padding: .6em .6em;
  text-align: left;
  line-height: 28px;
  color: var(--panelText);
  background-color: $fallback--fg;
  background-color: var(--panel, $fallback--fg);
  align-items: baseline;
  box-shadow: var(--panelHeaderShadow);

  .title {
    flex: 1 0 auto;
    font-size: 1.3em;
  }

  .faint {
    background-color: transparent;
    color: $fallback--faint;
    color: var(--panelFaint, $fallback--faint);
  }

  .faint-link {
    color: $fallback--faint;
    color: var(--faintLink, $fallback--faint);
  }

  .alert {
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow-x: hidden;
  }

  .button-default,
  .alert {
    // height: 100%;
    line-height: 21px;
    min-height: 0;
    box-sizing: border-box;
    margin: 0;
    margin-left: .5em;
    min-width: 1px;
    align-self: stretch;
  }

  .button-default {
    flex-shrink: 0;

    &,
    i[class*=icon-] {
      color: $fallback--text;
      color: var(--btnPanelText, $fallback--text);
    }

    &:active {
      background-color: $fallback--fg;
      background-color: var(--btnPressedPanel, $fallback--fg);
      color: $fallback--text;
      color: var(--btnPressedPanelText, $fallback--text);
    }
    &:disabled {
      color: $fallback--text;
      color: var(--btnDisabledPanelText, $fallback--text);
    }

    &.toggled {
      color: $fallback--text;
      color: var(--btnToggledPanelText, $fallback--text);
    }
  }

  a,
  .-link {
    color: $fallback--link;
    color: var(--panelLink, $fallback--link)
  }
}

.panel-heading.stub {
  border-radius: $fallback--panelRadius;
  border-radius: var(--panelRadius, $fallback--panelRadius);
}

/* TODO Should remove timeline-footer from here when we refactor panels into
 * separate component and utilize slots
 */
.panel-footer, .timeline-footer {
  display: flex;
  border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;
  border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
  flex: none;
  padding: 0.6em 0.6em;
  text-align: left;
  line-height: 28px;
  align-items: baseline;
  border-width: 1px 0 0 0;
  border-style: solid;
  border-color: var(--border, $fallback--border);

  .faint {
    color: $fallback--faint;
    color: var(--panelFaint, $fallback--faint);
  }

  a,
  .-link {
    color: $fallback--link;
    color: var(--panelLink, $fallback--link);
  }
}

.panel-body > p {
  line-height: 18px;
  padding: 1em;
  margin: 0;
}

.container > * {
  min-width: 0px;
}

.fa {
  color: grey;
}

nav {
  z-index: 1000;
  color: var(--topBarText);
  background-color: $fallback--fg;
  background-color: var(--topBar, $fallback--fg);
  color: $fallback--faint;
  color: var(--faint, $fallback--faint);
  box-shadow: 0px 0px 4px rgba(0,0,0,.6);
  box-shadow: var(--topBarShadow);
  box-sizing: border-box;
}

.fade-enter-active, .fade-leave-active {
  transition: opacity .2s
}
.fade-enter, .fade-leave-active {
  opacity: 0
}

.main {
  flex-basis: 50%;
  flex-grow: 1;
  flex-shrink: 1;
}

.sidebar-bounds {
  flex: 0;
  flex-basis: 35%;
}

.sidebar-flexer {
  flex: 1;
  flex-basis: 345px;
  width: 365px;
}

.mobile-shown {
  display: none;
}

@media all and (min-width: 800px) {
  body {
    overflow-y: scroll;
  }

  .sidebar-bounds {
    overflow: hidden;
    max-height: 100vh;
    width: 345px;
    position: fixed;
    margin-top: -10px;

    .sidebar-scroller {
      height: 96vh;
      width: 365px;
      padding-top: 10px;
      padding-right: 50px;
      overflow-x: hidden;
      overflow-y: scroll;
    }

    .sidebar {
      width: 345px;
    }
  }
  .sidebar-flexer {
    max-height: 96vh;
    flex-shrink: 0;
    flex-grow: 0;
  }
}

.badge {
  box-sizing: border-box;
  display: inline-block;
  border-radius: 99px;
  max-width: 10em;
  min-width: 1.7em;
  height: 1.3em;
  padding: 0.15em 0.15em;
  vertical-align: middle;
  font-weight: normal;
  font-style: normal;
  font-size: 0.9em;
  line-height: 1;
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;

  &.badge-notification {
    background-color: $fallback--cRed;
    background-color: var(--badgeNotification, $fallback--cRed);
    color: white;
    color: var(--badgeNotificationText, white);
  }
}

.alert {
  margin: 0.35em;
  padding: 0.25em;
  border-radius: $fallback--tooltipRadius;
  border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
  min-height: 28px;
  line-height: 28px;

  &.error {
    background-color: $fallback--alertError;
    background-color: var(--alertError, $fallback--alertError);
    color: $fallback--text;
    color: var(--alertErrorText, $fallback--text);

    .panel-heading & {
      color: $fallback--text;
      color: var(--alertErrorPanelText, $fallback--text);
    }
  }

  &.warning {
    background-color: $fallback--alertWarning;
    background-color: var(--alertWarning, $fallback--alertWarning);
    color: $fallback--text;
    color: var(--alertWarningText, $fallback--text);

    .panel-heading & {
      color: $fallback--text;
      color: var(--alertWarningPanelText, $fallback--text);
    }
  }

  &.success {
    background-color: var(--alertSuccess, $fallback--alertWarning);
    color: var(--alertSuccessText, $fallback--text);

    .panel-heading & {
      color: var(--alertSuccessPanelText, $fallback--text);
    }
  }
}

.faint {
  color: $fallback--faint;
  color: var(--faint, $fallback--faint);
}
.faint-link {
  color: $fallback--faint;
  color: var(--faint, $fallback--faint);

  &:hover {
    text-decoration: underline;
  }
}

.visibility-notice {
  padding: .5em;
  border: 1px solid $fallback--faint;
  border: 1px solid var(--faint, $fallback--faint);
  border-radius: $fallback--inputRadius;
  border-radius: var(--inputRadius, $fallback--inputRadius);
}

.notice-dismissible {
  padding-right: 4rem;
  position: relative;

  .dismiss {
    position: absolute;
    top: 0;
    right: 0;
    padding: .5em;
    color: inherit;
  }
}

.fa-scale-110 {
  &.svg-inline--fa {
    font-size: 1.1em;
  }
}

.fa-old-padding {
  &.svg-inline--fa {
    padding: 0 0.3em;
  }
}

@keyframes shakeError {
  0% {
    transform: translateX(0);
  }
  15% {
    transform: translateX(0.375rem);
  }
  30% {
    transform: translateX(-0.375rem);
  }
  45% {
    transform: translateX(0.375rem);
  }
  60% {
    transform: translateX(-0.375rem);
  }
  75% {
    transform: translateX(0.375rem);
  }
  90% {
    transform: translateX(-0.375rem);
  }
  100% {
    transform: translateX(0);
  }
}

@media all and (max-width: 800px) {
  .mobile-hidden {
    display: none;
  }

  .panel-switcher {
    display: flex;
  }

  .container {
    padding: 0;
  }

  .panel {
    margin: 0.5em 0 0.5em 0;
  }

  .menu-button {
    display: block;
    margin-right: 0.8em;
  }

  .main {
    margin-bottom: 7em;
  }
}

.setting-list,
.option-list{
  list-style-type: none;
  padding-left: 2em;
  li {
    margin-bottom: 0.5em;
  }
  .suboptions {
    margin-top: 0.3em
  }
}

.login-hint {
  text-align: center;

  @media all and (min-width: 801px) {
    display: none;
  }

  a {
    display: inline-block;
    padding: 1em 0px;
    width: 100%;
  }
}

.btn.button-default {
  min-height: 28px;
}

.animate-spin {
  animation: spin 2s infinite linear;
  display: inline-block;
}

@keyframes spin {
  0% {
    transform: rotate(0deg);
  }

  100% {
    transform: rotate(359deg);
  }
}

.new-status-notification {
  position: relative;
  font-size: 1.1em;
  z-index: 1;
  flex: 1;
}

.chat-layout {
  // Needed for smoother chat navigation in the desktop Safari (otherwise the chat layout "jumps" as the chat opens).
  overflow: hidden;
  height: 100%;

  // Get rid of scrollbar on body as scrolling happens on different element
  body {
    overflow: hidden;
  }

  // Ensures the fixed position of the mobile browser bars on scroll up / down events.
  // Prevents the mobile browser bars from overlapping or hiding the message posting form.
  @media all and (max-width: 800px) {
    body {
      height: 100%;
    }

    #app {
      height: 100%;
      overflow: hidden;
      min-height: auto;
    }

    #app_bg_wrapper {
      overflow: hidden;
    }

    .main {
      overflow: hidden;
      height: 100%;
    }

    #content {
      padding-top: 0;
      height: 100%;
      overflow: visible;
    }
  }
}