Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/bright-tigers-occur.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@stackoverflow/stacks": patch
---

Improve badge layout
224 changes: 134 additions & 90 deletions packages/stacks-classic/lib/components/badge/badge.less
Original file line number Diff line number Diff line change
@@ -1,54 +1,108 @@
.s-badge {
--_ba-as: unset;
--_ba-bc: transparent;
--_ba-bg: var(--black-100);
--_ba-fc: var(--black-500);
--_ba-fs: var(--fs-caption); //13px
--_ba-fs: var(--fs-caption);
--_ba-px: var(--su6);
--_ba-py: var(--su4);
--_ba-tt: unset;
--_ba-wmn: 0;
--_ba-bl: 0;
--_ba-fw: unset;
--_ba-g: unset;
--_ba-svg-p: var(--su2);
--_ba-sq-bg: var(--black-200);
--_ba-bx-sh-w: var(--su2);
--_ba-gap: unset;
--_ba-bx-sh-inset: ~"";

// CONTEXTUAL STYLES
.highcontrast-mode({
--_ba-bx-sh-w: var(--su1);

// SIZES
&&__sm {
--_ba-wmn: calc(var(--su16) + var(--su2));
--_ba-as: flex-start;
--_ba-fs: var(--fs-fine); //12px
--_ba-px: var(--su4);
--_ba-py: var(--su1);
--_ba-bx-sh-w: 0px;
--_ba-bx-sh-inset: inset;
}
&.s-badge__sm {
--_ba-bx-sh-w: 0;
}

&&__lg {
--_ba-fs: var(--fs-body1); //14px
--_ba-px: var(--su8);
--_ba-py: calc(var(--su4) + var(--su1)); //5px
--_ba-bx-sh-w: var(--su4);
&.s-badge__lg {
--_ba-bx-sh-w: var(--su4);
}

&:not(.s-badge__important) > svg {
//Add border around the square in high contrast mode
box-shadow: 0 0 0 calc(var(--_ba-bx-sh-w) - var(--su1)) var(--_ba-sq-bg),
0 0 0 max(var(--su1), var(--_ba-bx-sh-w)) currentcolor inset;
}

a[href] {
&,
&:hover {
text-decoration: underline !important;
}
}
});

&:has(> .s-bling__filled),
&&__squared,
&:has(> svg) {
&,
&.s-badge__lg,
&.s-badge__sm {
--_ba-px: 0;
--_ba-py: 0;
}

&.s-badge__lg {
--_ba-pr: var(--su8);
}

&.s-badge__sm {
--_ba-pr: var(--su4);
}

--_ba-pr: var(--su6);
}

// We need negative margin to make up for the positive badge padding
& .s-bling__filled {
margin: calc(var(--_ba-py) * -1) 0 calc(var(--_ba-py) * -1) calc(var(--_ba-px) * -1);
&:has(> .s-bling__filled),
&&__squared {
&.s-badge__lg {
--_ba-g: var(--su8);
}

&.s-badge__sm {
--_ba-g: var(--su4);
}

--_ba-g: var(--su6);
}
& svg {
margin: calc(var(--_ba-py) * -1) 0 calc(var(--_ba-py) * -1) var(--sun4);

&:not(&__squared):has(> svg){
--_ba-g: var(--su2);
}


&:has(.s-bling__rep) {
--_ba-fw: 600;
--_ba-fc: var(--black-600);
}

&:has(.s-bling) {
--_ba-bg: var(--black-150);
}

// SIZES
&&__sm {
--_ba-fs: var(--fs-fine);
--_ba-px: var(--su4);
--_ba-py: var(--su1);
--_ba-wmn: calc(var(--su16) + var(--su2));
--_ba-svg-p: var(--_ba-py);
}

&&__lg {
--_ba-fs: var(--fs-body1);
--_ba-px: var(--su8);
--_ba-py: calc(var(--su4) + var(--su1));
--_ba-svg-p: var(--_ba-py);
}

// TAG
&&__gold,
&&__silver,
Expand Down Expand Up @@ -84,8 +138,23 @@
--_ba-fc: var(--black-600);
}

&&__moderator,
&&__new {
&:before {
background-color: var(--_ba-bc);
height: var(--_ba-before-h);
width: var(--_ba-before-w);
-webkit-mask: var(--_ba-before-icon) no-repeat center;
mask: var(--_ba-before-icon) no-repeat center;

content: "";
display: inline-block;
-webkit-mask-size: contain;
mask-size: contain;
}
}

&&__moderator {
// :before icon
--_ba-bc: var(--blue-500);
--_ba-before-h: calc(var(--su12) + var(--su1)); // 13px
--_ba-before-w: calc(var(--su12) - var(--su1)); // 11px
Expand All @@ -98,68 +167,40 @@
}

&:before {
height: var(--_ba-before-h);
margin-top: var(--sun1);
width: var(--_ba-before-w);

content: "";
display: inline-block;
background-color: var(--_ba-bc);
-webkit-mask: var(--_ba-before-icon) no-repeat center;
mask: var(--_ba-before-icon) no-repeat center;
-webkit-mask-size: contain;
mask-size: contain;
}
}

&&__staff {
// Staff should always be "StackOverflow orange"
--_ba-bc: var(--orange-400);
}

&&__admin {
// Only the admin badge is themeable
--_ba-bc: var(--theme-primary-500, var(--orange-500));
}

&&__ai {
--_ba-bc: var(--purple-400);
}

&&__bot {
--_ba-bc: var(--black-400);
}

// TODO reassess if we need this modifier or should rely on embedding an svg (our `__featured` example is the same as this badge)
&&__new {
--_ba-bg: var(--purple-100);
--_ba-fc: var(--purple-500);
--_ba-sq-bg: var(--purple-200);
--_ba-bc: var(--purple-400);
--_ba-gap: var(--su2); // 2px gap between icon and text
--_ba-before-h: calc(var(--su12) + var(--su4)); // 16px
--_ba-before-w: calc(var(--su12) + var(--su4)); // 16px
--_ba-before-icon: url("data:image/svg+xml;,%3Csvg width='20' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.25 7h7.28l-5.89 4.29.68 2.08-2.07-1.5-.04-.12-.33-1.04.88-.64 2.16-1.56h-3.76l-.34-1.04L10 4.94l-.82 2.53-.34 1.04H5.08l2.16 1.56.88.64-.33 1.04-.83 2.54 2.16-1.57.87-.64 5.12 3.72.78 2.41L10 13.93l-5.9 4.28 2.26-6.92L.46 7h7.29L10 .08z' /%3E%3C/svg%3E");

&.s-badge__sm {
--_ba-before-h: calc(var(--su12) + var(--su2)); // 14px
--_ba-before-w: calc(var(--su12) + var(--su2)); // 14px
}

&.s-badge__lg {
--_ba-before-h: calc(var(--su12) + var(--su6)); // 18px
--_ba-before-w: calc(var(--su12) + var(--su6)); // 18px
}
--_ba-gap: var(--su2);
--_ba-before-h: calc(var(--su12) + var(--su2));
--_ba-before-w: calc(var(--su12) + var(--su2));
--_ba-before-icon: url("data:image/svg+xml;,%3Csvg width='14' height='14' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 1a7 7 0 1 1 0 14A7 7 0 0 1 8 1m0 1.25a5.75 5.75 0 1 0 0 11.5 5.75 5.75 0 0 0 0-11.5m1 10.06H7V10.6h2zM8.14 4c1.78 0 2.77.96 2.77 2.5 0 1.79-2.1 2.2-2.1 3.25h-1.6c0-2 2-2.08 2-3.26 0-.54-.27-.96-1.02-.96-.7 0-1.03.46-1.1 1.23H5.4A2.75 2.75 0 0 1 8.13 4' fill='%23fff'/%3E%3C/svg%3E");

&:before {
height: var(--_ba-before-h);
margin-top: 0;
margin-left: var(--sun2);
width: var(--_ba-before-w);

content: "";
display: inline-block;
background-color: var(--_ba-bc);
-webkit-mask: var(--_ba-before-icon) no-repeat center;
mask: var(--_ba-before-icon) no-repeat center;
-webkit-mask-size: contain;
mask-size: contain;
margin-top: 0;
}
}

Expand All @@ -168,117 +209,120 @@
--_ba-bg: var(--blue-100);
--_ba-fc: var(--blue-500);
--_ba-sq-bg: var(--blue-200);

&.s-badge__important {
--_ba-bg: var(--blue-400);
--_ba-sq-bg: var(--blue-500);
}
}

&&__warning {
--_ba-bg: var(--yellow-100);
--_ba-fc: var(--yellow-500);
--_ba-sq-bg: var(--yellow-200);

&.s-badge__important {
--_ba-bg: var(--yellow-400);
--_ba-sq-bg: var(--yellow-500);
}
}

&&__danger {
--_ba-bg: var(--red-100);
--_ba-fc: var(--red-500);
--_ba-sq-bg: var(--red-200);

&.s-badge__important {
--_ba-bg: var(--red-400);
--_ba-sq-bg: var(--red-500);
}
}

&&__critical {
--_ba-bg: var(--red-200);
--_ba-fc: var(--red-600);
--_ba-sq-bg: var(--red-300);

&.s-badge__important {
--_ba-bg: var(--red-500);
--_ba-sq-bg: var(--red-600);
}
}

&&__tonal {
--_ba-bg: var(--black-200);
--_ba-fc: var(--black-600);
--_ba-sq-bg: var(--black-300);

&.s-badge__important {
--_ba-bg: var(--black-500);
--_ba-sq-bg: var(--black-600);
}
}

&&__success {
--_ba-bg: var(--green-100);
--_ba-fc: var(--green-600);
--_ba-sq-bg: var(--green-200);

&.s-badge__important {
--_ba-bg: var(--green-500);
--_ba-sq-bg: var(--green-600);
}
}

&&__featured {
--_ba-bg: var(--purple-100);
--_ba-fc: var(--purple-500);
--_ba-sq-bg: var(--purple-200);

&.s-badge__important {
--_ba-bg: var(--purple-400);
--_ba-sq-bg: var(--purple-500);
}
}

// SQUARED
&&__squared {
--_ba_box-shadow: 0 0 0 var(--_ba-bx-sh-w) var(--_ba-sq-bg);
svg {
background-color: var(--_ba-sq-bg);
box-shadow: var(--_ba_box-shadow);
margin-right: var(--_ba-bx-sh-w)
}
}
&&__squared:not(&__important) {
.highcontrast-mode({
//Add border around the square in high contrast mode
--_ba_box-shadow: 0 0 0 calc(var(--_ba-bx-sh-w) - var(--su1)) var(--_ba-sq-bg),
0 0 0 max(var(--su1), var(--_ba-bx-sh-w)) currentcolor var(--_ba-bx-sh-inset);
});
}

// ICONS
&:not(&__squared):has(> svg){
//We want a smaller gap for icons that aren't squared
--_ba-gap: calc(var(--_ba-px) - var(--su2));
&&__squared svg {
background-color: var(--_ba-sq-bg);
}

// IMPORTANT
&&__important {
--_ba-bg: var(--black-400);
--_ba-sq-bg: var(--black-500);
--_ba-fw: 600;
--_ba-fc: var(--black-050);
--_ba-fw: 600;
--_ba-sq-bg: var(--black-500);
}

// CHILD ELEMENTS
svg {
aspect-ratio: 1 / 1;
box-sizing: content-box;
display: block;
height: calc(var(--su16) + var(--su4));
padding: var(--_ba-svg-p);
}

// INTERACTION
a&:hover {
text-decoration: none;
}

align-self: var(--_ba-as);
background-color: var(--_ba-bg);
border-left: var(--_ba-bl) solid var(--_ba-bc);
color: var(--_ba-fc);
font-size: var(--_ba-fs);
font-weight: var(--_ba-fw);
gap: var(--_ba-gap, var(--_ba-px));
padding: var(--_ba-py) var(--_ba-px);
line-height: var(--lh-md);
gap: var(--_ba-g, var(--_ba-px));
padding: var(--_ba-py) var(--_ba-pr, var(--_ba-px)) var(--_ba-py) var(--_ba-px);
min-width: var(--_ba-wmn);
text-transform: var(--_ba-tt);

align-items: center;
display: inline-flex;
justify-content: center;
line-height: var(--lh-md);
text-decoration: none;
vertical-align: middle;
white-space: nowrap;
Expand Down
Git LFS file not shown
Loading