discourse/app/assets/stylesheets/common/base/user-badges.scss
Kris a07d45095e
DEV: make sure badge images always have a size (#40708)
Reported here: https://meta.discourse.org/t/svg-bug/404832

SVGs don't always have dimensions included, and in this case when
uploaded to a custom badge the image collapses to 0.

<img width="500" alt="image"
src="https://github.com/user-attachments/assets/083a1776-64e7-4d10-834e-15b925c57dce"
/>

This flips around the styles so that instead of setting everything to
100% and capping the maximum, we set everything to our desired
dimensions and scale down using object-fit.

This means that images without dimensions get them through CSS (avoids
100% of 0 being 0), and images that are too large will still shrink to
fit the space.

<img width="500" alt="image"
src="https://github.com/user-attachments/assets/9afe4379-cb8f-45c9-a0fd-2a5169844a39"
/>
2026-06-09 15:19:46 -04:00

400 lines
6.5 KiB
SCSS
Vendored

/* Default badge styles. */
.show-badge {
background: var(--d-content-background);
}
.user-badge {
padding: 3px 8px;
color: var(--primary);
border: 1px solid var(--content-border-color);
line-height: var(--line-height-large);
display: inline-flex;
align-items: center;
background-color: var(--secondary);
img {
height: 16px;
width: 16px;
}
.badge-display-name {
margin-left: 0.25em;
}
&.badge-type-gold .fa {
color: var(--gold) !important;
}
&.badge-type-silver .fa {
color: var(--silver) !important;
}
&.badge-type-bronze .fa {
color: var(--bronze) !important;
}
&.disabled {
color: var(--primary-medium);
background-color: var(--primary-very-low);
.fa {
opacity: 0.4;
}
}
}
@media all and (width <= 750px) {
.show-badge .user-badge-with-posts .badge-user a.post-link {
width: auto;
}
.show-badge div.badge-user {
padding: 0;
}
.badges-listing {
display: block;
.info,
.grant-count {
text-align: left;
}
.row > div.info {
display: none;
}
.row {
display: block;
> div {
display: block;
margin-top: 10px;
}
}
}
}
.show-badge .badge-user-info {
.earned {
font-size: var(--font-up-2);
margin-bottom: 1em;
}
}
.show-badge .single-user {
margin-left: 2%;
padding-bottom: 20px;
.load-more {
padding-top: 30px;
display: block;
font-size: var(--font-up-2);
}
}
.show-badge .single-user .badge-user {
padding-left: 0;
text-align: left;
display: block;
margin: 20px 0;
width: 800px;
.badge-info {
display: none;
}
.date {
display: inline-block;
font-size: var(--font-up-1);
margin-left: 10px;
}
.post-link {
font-size: var(--font-up-2);
width: 500px;
margin: 0;
padding: 0;
}
&::after {
content: "";
clear: both;
display: table;
}
}
.long-description.banner {
width: 88%;
margin-bottom: 15px;
margin-top: 15px;
}
.badge-card {
background-color: var(--d-badge-card-background-color);
border: 1px solid var(--content-border-color);
position: relative;
border-radius: var(--d-border-radius);
.check-display {
position: absolute;
right: 5px;
top: 5px;
}
.badge-granted {
display: block;
margin-top: 0.5em;
color: var(--primary-medium);
font-size: var(--font-down-1);
}
.grant-count {
font-weight: bold;
color: var(--primary-medium);
line-height: 1;
}
.grant-text {
color: var(--primary-medium);
font-size: var(--font-down-1);
}
.favorite-btn {
position: absolute;
right: 0;
bottom: 0;
z-index: 1;
border-radius: var(--d-button-border-radius) 0 var(--d-button-border-radius)
0;
}
.badge-contents {
display: flex;
align-items: flex-start;
gap: 1rem;
padding: 1.5em 1.5em;
.badge-link {
color: var(--primary);
display: inline-block;
line-height: var(--line-height-medium);
&::after {
content: "";
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
}
.badge-summary {
overflow-wrap: break-word;
&:has(a) {
// for summary links to be reachable
// they must be positioned above .badge-link:after
position: relative;
z-index: 1;
}
}
.badge-icon {
--badge-icon-size: 3.5em;
display: flex;
flex-shrink: 0;
align-items: center;
justify-content: center;
svg {
font-size: var(--badge-icon-size);
}
img {
width: var(--badge-icon-size);
height: var(--badge-icon-size);
object-fit: contain;
}
&.badge-type-gold .fa {
color: rgb(231, 195, 0) !important;
}
&.badge-type-silver .fa {
color: #c0c0c0 !important;
}
&.badge-type-bronze .fa {
color: #cd7f32 !important;
}
}
.badge-info {
min-width: 0;
color: var(--primary);
h3 {
margin-bottom: 0.25em;
font-size: var(--font-up-1);
@media screen and (width >= 900px) {
font-size: var(--font-up-2);
}
}
}
}
&.--badge-large {
width: 100%;
align-self: flex-start;
@media screen and (width >= 767px) {
max-width: calc(var(--d-max-width) / 2);
}
.badge-contents {
h3 {
font-size: var(--font-up-3);
}
}
}
&.--can-favorite {
// helps description text avoid favorite button overlap
.badge-summary {
width: 100%;
padding-right: var(--space-6);
box-sizing: border-box;
}
}
}
.badges-granted {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(18em, 1fr));
gap: 3em 2em;
}
.container.badges {
background: var(--d-content-background);
}
.badge-groups {
margin: 20px 0;
color: var(--primary-med-or-secondary-med);
h3 {
margin-bottom: 1em;
}
}
.badge-title {
.user-content {
padding: 0;
}
}
.badge-group-list {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(18em, 1fr));
gap: 1em;
width: 100%;
margin-bottom: 1.5em;
.title {
font-size: var(--font-up-1);
}
}
.show-badge-details {
display: flex;
flex-wrap: wrap;
flex-direction: row;
margin-bottom: 2em;
margin-top: 1em;
gap: 1em;
.badge-grant-info {
&.hidden {
display: none;
}
}
.grant-info-item {
margin-bottom: 1em;
color: var(--primary-med-or-secondary-med);
&:first-of-type {
margin-right: 10px;
}
}
.badge-set-title {
flex: 0 1 auto;
padding: 1.5em;
border: 1px solid var(--content-border-color);
.badge-title {
height: 100%;
&__saved {
color: var(--success);
}
}
.control-group:last-child {
margin: auto 0 0;
}
.form-horizontal {
display: flex;
flex-direction: column;
height: 100%;
margin: 0;
}
.controls {
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 0.5em;
margin: 0;
button:last-of-type {
margin-right: auto;
}
}
.combobox {
width: 100%;
}
}
}
.check-display {
display: flex;
width: 1.5em;
height: 1.5em;
border-radius: 100%;
align-items: center;
justify-content: center;
.d-icon {
font-size: var(--font-down-2);
color: var(--secondary);
}
}
.check-display.status-checked {
background-color: var(--success);
}
.check-display.status-unchecked {
background-color: var(--danger);
}
.hyperlink {
cursor: pointer;
}