discourse/app/assets/stylesheets/common/base/user.scss
Krzysztof Kotlarek e313190fdb
FEATURE: better UI to manage 2fa (#19338)
In this PR, we introduced an option, that when all authenticators are disabled, but backup codes still exists, user can authenticate with those backup codes. This was reverted as this is not expected behavior.

https://github.com/discourse/discourse/pull/18982

Instead, when the last authenticator is deleted, backup codes should be deleted as well. Because this disables 2fa, user is asked to confirm that action by typing text.

In addition, UI for 2fa preferences was refreshed.
2022-12-08 09:41:22 +11:00

850 lines
14 KiB
SCSS

// Common styles for "/user" section
// These styles are also used for "/groups" — test those pages if making significant changes
.user-content-wrapper {
// Grid layout
width: 100%;
display: grid;
grid-template-columns: 1fr 5fr;
grid-template-rows: auto auto 1fr auto;
grid-gap: 20px;
.user-primary-navigation {
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 1;
grid-row-end: 2;
.nav-pills {
flex-wrap: wrap;
}
}
.user-secondary-navigation {
grid-column-start: 1;
grid-column-end: 2;
grid-row-start: 2;
grid-row-end: 3;
}
.solo-preference,
.user-content,
.spinner {
grid-row-start: 2;
grid-row-end: 4;
grid-column-start: 1;
grid-column-end: 3;
}
.user-content {
min-width: 100%;
}
.user-additional-controls + .user-content,
.user-secondary-navigation + .user-content {
grid-column-start: 2;
grid-column-end: 3;
}
.user-additional-controls {
grid-row-start: 3;
align-self: start;
justify-self: start;
}
}
.user-content {
.list-actions {
display: flex;
margin-bottom: 12px;
.btn {
margin-right: 12px;
}
}
.paginated-topics-list {
position: relative;
}
.show-mores {
width: 100%;
}
.d-icon-heart {
color: var(--love);
}
.user-notifications-filter {
display: block;
width: 100%;
border-bottom: 0.5px solid var(--primary-low);
}
}
.user-main {
.about {
width: 100%;
margin-bottom: 15px;
&.has-background {
.user-profile-image {
background-size: cover;
background-position: center center;
background-repeat: no-repeat;
}
.staff-counters {
margin-bottom: 0;
}
}
.secondary {
display: inline-block;
width: 100%;
border-top: 1px solid var(--primary-low);
.btn {
padding: 4px 12px;
}
dl {
margin: 0;
padding: 5px 10px;
div {
display: inline-flex;
align-items: baseline;
margin-right: 15px;
margin: 4px 0;
}
}
dt,
dd {
display: inline-flex;
align-items: center;
}
dd {
padding: 0;
margin: 0 15px 0 0;
color: var(--primary);
&.groups {
span:not(:last-of-type) {
margin-right: 0.25em;
}
span:after {
content: ",";
}
span:last-of-type:after {
content: "";
}
}
}
dt {
color: var(--secondary-medium);
margin-right: 5px;
display: inline-block;
}
}
.details {
background: rgba(var(--secondary-rgb), 0.8);
border-bottom: 1px solid var(--primary-low);
h1 {
font-size: var(--font-up-5);
font-weight: normal;
.d-icon {
font-size: 0.8em;
}
}
h2 {
font-weight: normal;
max-width: 100%;
@include ellipsis;
}
h3 {
font-weight: normal;
margin-bottom: 0.5em;
.d-icon:not(:first-of-type) {
margin-left: 10px;
}
}
.groups {
display: inline;
}
img.avatar {
float: left;
}
.suspended {
color: var(--danger);
}
.primary {
width: 100%;
position: relative;
h1 {
font-weight: bold;
}
.bio {
max-height: 300px;
overflow: auto;
img {
max-width: 100%;
}
}
}
.user-profile-avatar {
position: relative;
float: left;
.avatar-flair {
bottom: 8px;
right: 16px;
}
}
}
.controls {
ul {
list-style-type: none;
margin-top: 0;
}
}
&.collapsed-info {
.details {
margin-top: 0;
background: rgba(var(--secondary-rgb), 0.8);
.bio {
display: none;
}
.primary {
width: 100%;
.avatar {
margin-right: 10px;
width: 45px;
height: 45px;
}
h1 {
font-size: var(--font-up-3);
}
h2 {
font-size: var(--font-up-1);
}
h3,
h3.location-and-website {
display: none;
}
}
}
.user-profile-avatar {
.avatar-flair {
bottom: 8px;
right: 2px;
.d-icon {
font-size: var(--font-0);
}
}
}
}
}
.staff-counters {
background: var(--primary);
color: var(--secondary);
display: flex;
padding: 10px;
margin-bottom: 16px;
> div,
> div a {
display: flex;
align-items: baseline;
flex: 0 1 auto;
margin: 0 10px 0 0;
color: var(--secondary);
span {
padding: 0 7px 1px;
border-radius: 10px;
margin-right: 5px;
}
}
.active {
font-weight: bold;
}
}
.helpful-flags {
background-color: var(--success);
}
.flagged-posts {
background-color: #e49735;
}
.warnings-received {
background-color: var(--danger-medium);
}
.deleted-posts {
background-color: var(--danger-medium);
}
.suspensions {
background-color: var(--danger);
}
.user-field {
margin-bottom: 10px;
.controls {
label {
width: auto;
text-align: left;
font-weight: normal;
}
.instructions {
color: var(--primary-medium);
margin-top: 5px;
margin-bottom: 10px;
font-size: var(--font-down-1);
}
}
}
.user-content {
.admin-controls nav {
margin: 0;
.nav-pills {
overflow-x: auto;
}
}
}
}
.login-form,
.user-field,
.invites-show {
.required {
vertical-align: top;
color: var(--danger);
font-weight: bold;
margin-left: 0.25em;
}
}
.public-user-fields {
margin-top: 8px;
margin-bottom: 8px;
.user-field-name {
font-weight: bold;
}
.collapsed-info & {
display: none;
}
.user-field-value-list-item:not(:last-of-type) {
&:after {
// create comma separated list
content: ",";
}
}
}
.avatar-selector {
.avatar-choice {
display: grid;
grid-template-columns: 2em 1fr auto;
grid-template-rows: auto auto;
align-items: center;
&:not(:last-of-type) {
margin-bottom: 0.75em;
}
span {
word-break: break-word; // Prevents long emails from breaking the modal width
}
input[type="radio"] {
margin-top: 0;
}
button {
margin-left: auto;
}
label a {
margin: 0;
}
}
$label-max-width: 300px;
label.radio {
display: flex;
align-items: center;
max-width: $label-max-width;
margin: 0 0.5em 0 0;
padding: 0;
.avatar {
flex: 0 0 auto;
margin: 0 0.75em 0 0;
}
}
.error {
color: var(--danger);
margin: 0;
max-width: calc(#{$label-max-width} - 20px);
grid-column-start: 2;
grid-column-end: 3;
}
}
.top-section {
@include clearfix();
ul {
list-style: none;
margin: 0;
}
}
.top-section,
.top-sub-section {
margin-bottom: 20px;
&.badges-section {
display: flex;
flex-wrap: wrap;
}
}
.user-badges {
margin-bottom: 2em;
}
.stats-title {
text-transform: uppercase;
margin-bottom: 10px;
width: 100%;
}
.stats-section {
ul {
margin: 10px 0;
}
li {
display: inline-block;
padding: 10px 14px 10px 0;
margin: 0 10px 10px 0;
&.linked-stat {
// This makes the entire "box" (the li) clickable instead of a narrow area.
padding: 0;
a {
padding: 10px 14px 10px 0;
width: 100%;
height: 100%;
display: block;
color: var(--primary);
}
}
}
.value {
font-weight: bold;
font-size: var(--font-up-2);
}
.label {
color: var(--primary-medium);
}
}
.top-sub-section {
width: 50%;
ul {
max-width: 95%;
}
li {
border-left: var(--primary-low) solid 2px;
padding: 5px 8px;
margin: 10px 0;
}
.topic-info {
color: var(--primary-medium);
}
@media all and (max-width: 600px) {
float: none;
width: 100%;
}
}
.replies-section,
.topics-section,
.links-section {
li {
word-wrap: break-word;
}
}
.links-section {
.domain {
font-size: var(--font-down-1);
color: var(--primary-medium);
}
}
.top-categories-section {
table {
max-width: 95%;
tr {
border: none;
}
td,
th {
padding: 0.5em;
&.topic-count,
&.reply-count {
text-align: center;
}
}
}
}
.summary-user-list {
li {
height: 45px;
}
}
.groups {
.group-link {
color: var(--tertiary);
}
}
.user-preferences {
textarea {
height: 100px;
}
.tracking-controls {
label {
align-items: center;
display: inline-block;
.d-icon {
margin-right: 3px;
}
}
.select-kit.multi-select {
@include breakpoint(mobile-extra-large) {
width: 100%;
}
}
.show-tracking {
float: right;
}
}
.static {
color: var(--primary);
display: inline-block;
}
.instructions {
color: var(--primary-medium);
margin-bottom: 10px;
font-size: var(--font-down-1);
line-height: var(--line-height-large);
a[href] {
color: var(--tertiary);
}
}
.avatar {
margin-left: 3px;
}
.warning {
background-color: var(--danger-medium);
padding: 5px 8px;
color: var(--secondary);
width: 520px;
}
.warning-wrap {
height: 30px;
margin-bottom: 10px;
}
.tracking-controls {
margin-top: 24px;
}
&.second-factor-backup-preferences {
padding-left: 0;
.second-factor-token-input {
margin-right: 10px;
}
.form-horizontal {
.instructions {
margin-left: 0;
}
.actions {
margin-top: 5px;
}
}
.backup-codes {
margin: 2em 0;
.wrapper {
display: inline-block;
position: relative;
border-radius: 3px;
border: 1px solid var(--primary-low);
width: 100%;
}
.backup-codes-area {
resize: none;
padding: 0;
height: auto;
text-align: center;
width: 100%;
background: var(--secondary);
border: 0;
cursor: auto;
outline: none;
font-family: monospace;
&:focus {
box-shadow: none;
border-color: var(--primary-low);
}
}
.backup-codes-copy-btn,
.backup-codes-download-btn {
right: 5px;
position: absolute;
}
.backup-codes-copy-btn {
top: 5px;
}
.backup-codes-download-btn {
top: 40px;
}
}
}
.pref-associated-accounts table {
td {
padding: 8px;
}
}
.featured-topic-link {
padding: 5px 0;
font-weight: bold;
}
.save-theme-alert {
font-size: var(--font-down-1);
}
.control-subgroup {
float: left;
+ .controls {
clear: both;
padding-top: 1em;
}
}
.light-color-scheme {
margin-right: 1em;
}
.instructions {
clear: both;
display: inline-block;
margin-top: 4px;
}
@mixin inactiveMode() {
color: var(--primary-medium);
.select-kit.combo-box .select-kit-header {
border-color: var(--primary-medium);
}
}
@media (prefers-color-scheme: dark) {
.light-color-scheme {
@include inactiveMode;
}
}
@media (prefers-color-scheme: light) {
.dark-color-scheme {
@include inactiveMode;
}
}
.undo-preview {
margin-bottom: 1em;
}
}
.paginated-topics-list {
.user-content {
width: 100%;
margin-top: 0;
}
}
.large-notifications {
margin: 0;
}
.large-notification {
display: flex;
align-items: center;
a {
display: flex;
align-items: center;
.d-icon {
margin-right: 0.5em;
}
span:first-child {
color: var(--primary);
}
// Can remove this once other languages have removed html from i18n values
div {
.fa {
display: none;
}
p {
margin: 0;
}
}
}
}
.second-factor {
&.instructions {
color: var(--primary-medium);
margin-top: 5px;
margin-bottom: 10px;
font-size: var(--font-down-1);
}
.second-factor-item {
margin-top: 0.75em;
width: 500px;
display: flex;
justify-content: space-between;
border-bottom: 1px solid #ddd;
margin: 5px 0px;
align-items: center;
&:last-child {
border-bottom: 0;
}
.btn-danger .d-icon {
color: var(--danger);
}
}
.btn.edit {
min-height: auto;
}
}
.primary-textual .staged,
.user-card .staged {
font-style: italic;
}
.selectable-avatars {
max-height: 350px;
margin-bottom: 1em;
text-align: justify;
.selectable-avatar {
margin: 5px;
display: inline-block;
.avatar {
cursor: pointer;
width: 60px;
height: 60px;
&:hover {
box-shadow: 0 0 10px var(--primary);
}
}
}
}
.timezone-input {
margin-bottom: 0.5em;
}
.user-invites-page {
.invite-error {
grid-column: 1 / span 2;
}
table.user-invite-list {
.invite-type {
.d-icon {
color: var(--primary-medium);
}
}
.invite-extra {
font-size: var(--font-down-1);
margin: 0.25em 0;
a {
color: var(--primary-medium);
}
}
}
}
.notification-schedule {
.instruction {
margin-top: 12px;
margin-bottom: 10px;
}
.notification-schedule-table {
.notification-schedule-tbody {
border-top-width: 1px;
.day {
.day-label {
padding: 1em 1em 1em 0;
}
.to {
padding: 0 0.5em;
}
}
}
}
}