@import './_variables.scss'; body { overflow: hidden; } #app-loaded { min-height: 100vh; min-width: 100vw; overflow: hidden; --navbar-height: 50px; } .navbar { height: var(--navbar-height); } .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%; } h4 { margin: 0; } #content { overflow-y: auto; position: sticky; } .app-layout { position: relative; display: grid; grid-template-columns: auto auto; grid-template-rows: 1fr; box-sizing: border-box; margin: 0 auto; height: 100vh; align-content: flex-start; flex-wrap: wrap; padding: 0 10px 0 10px; grid-template-columns: auto auto; justify-content: center; } .underlay { height: 100%; width: 100%; grid-column-start: 1; grid-column-end: 3; grid-row-start: 1; grid-row-end: 1; margin: -0.5em; padding: 0.5em; } .column { max-width: 615px; padding-top: 10px; grid-row-start: 1; grid-row-end: 1; &:nth-child(2) { grid-column: 1; } &:nth-child(3) { grid-column: 2; } &.-mini { max-width: 345px; } &.-scrollable { position: sticky; top: 0; margin-top: calc(-1 * var(--navbar-padding)); max-height: 100vh; overflow-y: auto; } } body, .column.-scrollable { &::-webkit-scrollbar { display: block; width: 0; } } .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); &.-sublime { background: transparent; } 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; } } } .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-from, .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) { .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 // 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; } } }