moorsecopers99 95b2d7b083
🐛 Add ability to delete uploaded profile avatar (#9068)
Fixes #9067. Adds a delete button that appears on hover over an
uploaded profile photo; clicking it opens a confirm modal and, on
accept, clears the stored photo so the generated fallback avatar is
shown again. A new :delete-profile-photo RPC schedules the old
storage object for garbage collection and sets photo-id to null.

Signed-off-by: moorsecopers99 <patellscott18@gmail.com>
Co-authored-by: Andrey Antukh <niwi@niwi.nz>
2026-04-21 19:19:30 +02:00

378 lines
7.1 KiB
SCSS

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
//
// Copyright (c) KALEIDOS INC
@use "common/refactor/common-refactor" as *;
.dashboard-settings {
display: flex;
width: 100%;
justify-content: center;
align-items: center;
a:not(.button-primary, .link) {
color: var(--color-foreground-secondary);
}
}
.form-container {
display: flex;
flex-direction: column;
max-width: $s-500;
width: $s-580;
margin: $s-80 auto $s-120 auto;
justify-content: center;
form {
display: flex;
flex-direction: column;
.btn-secondary {
width: 100%;
font-size: $fs-11;
text-transform: uppercase;
background-color: var(--color-background-tertiary);
color: var(--color-foreground-primary);
&:hover {
color: var(--color-accent-primary);
background-color: var(--color-background-quaternary);
}
}
hr {
display: none;
}
}
.fields-row {
--input-height: #{$s-40};
margin-bottom: $s-20;
flex-direction: column;
.options {
display: flex;
justify-content: flex-end;
font-size: $fs-14;
margin-top: $s-12;
}
}
.field {
margin-bottom: $s-20;
}
.field-title {
color: var(--color-foreground-primary);
&:not(:first-child) {
margin-top: $s-64;
}
}
.field-text {
color: var(--color-foreground-secondary);
}
.custom-input,
.custom-select {
flex-direction: column-reverse;
label {
position: relative;
text-transform: uppercase;
color: var(--color-foreground-primary);
font-size: $fs-11;
margin-bottom: $s-12;
margin-left: calc(-1 * $s-4);
}
input,
select {
background-color: var(--color-background-tertiary);
border-radius: $br-8;
border-color: transparent;
color: var(--color-foreground-primary);
padding: 0 $s-16;
&:focus {
outline: $s-1 solid var(--color-accent-primary);
}
::placeholder {
color: var(--color-foreground-secondary);
}
}
.help-icon {
bottom: $s-12;
top: auto;
svg {
fill: var(--color-foreground-secondary);
}
}
&.disabled {
input {
background-color: var(--input-background-color-disabled);
border-color: var(--color-background-quaternary);
color: var(--color-foreground-secondary);
}
}
.input-container {
background-color: var(--color-background-tertiary);
border-radius: $br-8;
border-color: transparent;
margin-top: $s-24;
.main-content {
label {
position: absolute;
top: calc(-1 * $s-24);
}
span {
color: var(--color-foreground-primary);
}
}
&:focus {
border: $s-1 solid var(--color-accent-primary);
}
}
textarea {
border-radius: $br-8;
padding: $s-12 $s-16;
background-color: var(--color-background-tertiary);
color: var(--color-foreground-primary);
border: none;
&:focus {
outline: $s-1 solid var(--color-accent-primary);
}
}
}
&.two-columns {
max-width: $s-520;
justify-content: space-between;
flex-direction: row;
}
h1 {
font-size: $fs-36;
color: var(--color-background-tertiary);
margin-bottom: $s-20;
}
.subtitle {
font-size: $fs-24;
color: var(--color-background-tertiary);
margin-bottom: $s-20;
}
.notification-icon {
justify-content: center;
display: flex;
margin-bottom: $s-48;
svg {
fill: var(--color-background-primary);
height: 40%;
width: 40%;
}
}
.notification-text {
font-size: $fs-16;
color: var(--color-background-primary);
margin-bottom: $s-20;
}
.notification-text-email {
background: var(--color-foreground-primary);
border-radius: $br-4;
color: var(--color-background-primary);
font-size: $fs-16;
font-weight: $fw500;
margin: $s-24 0 $s-40 0;
padding: $s-16;
text-align: center;
}
h2 {
font-size: $fs-24;
font-weight: $fw400;
color: var(--color-foreground-primary);
display: flex;
align-items: center;
margin: $s-16 0;
}
h3 {
font-size: $fs-12;
font-weight: $fw400;
color: var(--color-foreground-primary);
display: flex;
align-items: center;
margin: $s-8 0;
text-transform: uppercase;
}
a:not(.button-primary) {
&:hover {
text-decoration: underline;
}
}
p {
color: var(--color-background-primary);
}
hr {
border-color: var(--color-foreground-secondary);
}
.links {
margin-top: $s-12;
}
}
form.avatar-form {
display: flex;
flex-direction: column;
width: $s-148;
height: $s-148;
margin: $s-16 0;
img {
border-radius: 50%;
flex-shrink: 0;
height: 100%;
margin-right: $s-16;
width: 100%;
}
}
.image-change-field {
position: relative;
width: 100%;
height: 100%;
.update-overlay {
opacity: 0;
cursor: pointer;
position: absolute;
width: 100%;
height: 100%;
border-radius: 50%;
font-size: $fs-24;
color: var(--color-foreground-primary);
line-height: 6;
text-align: center;
background: var(--color-accent-tertiary);
z-index: $z-index-modal;
}
.delete-overlay {
position: absolute;
top: $s-4;
inset-inline-end: $s-4;
display: flex;
align-items: center;
justify-content: center;
width: $s-32;
height: $s-32;
padding: 0;
border: none;
border-radius: 50%;
background: var(--color-background-primary);
color: var(--color-foreground-primary);
cursor: pointer;
opacity: 0;
transition: opacity 0.15s ease-in-out;
z-index: calc(#{$z-index-modal} + 1);
&:hover {
background: var(--color-background-quaternary);
color: var(--color-accent-primary);
}
}
input[type="file"] {
width: 100%;
height: 100%;
position: absolute;
opacity: 0;
cursor: pointer;
top: 0;
z-index: $z-index-modal;
}
&:hover {
.update-overlay {
opacity: 0.8;
}
.delete-overlay {
opacity: 1;
}
}
}
.profile-form {
display: flex;
flex-direction: column;
max-width: $s-368;
width: 100%;
}
.newsletter-subs {
border-bottom: $s-1 solid var(--color-foreground-secondary);
border-top: $s-1 solid var(--color-foreground-secondary);
padding: $s-32 0;
margin-bottom: $s-32;
.newsletter-title {
font-family: "worksans", "vazirmatn", sans-serif;
color: var(--color-foreground-secondary);
font-size: $fs-14;
}
label {
font-family: "worksans", "vazirmatn", sans-serif;
color: var(--color-background-primary);
font-size: $fs-12;
margin-right: calc(-1 * $s-16);
margin-bottom: $s-12;
}
.info {
color: var(--color-foreground-secondary);
font-size: $fs-12;
margin-bottom: $s-8;
}
.input-checkbox label {
align-items: flex-start;
}
}
.btn-secondary {
@extend %button-secondary;
height: $s-32;
}
.btn-primary {
@extend %button-primary;
height: $s-32;
}