mirror of
https://akkoma.dev/AkkomaGang/akkoma-fe
synced 2025-04-30 19:19:29 +08:00
A simple virtual scroller is now used for the emoji grid. This avoids loading all emoji images at once, saving network bandwidth and reducing load on the server, while also putting less work on the browser's DOM and layout engine. Co-authored-by: yan <yan@omg.lol> Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/275 Co-authored-by: yanchan09 <yan@omg.lol> Co-committed-by: yanchan09 <yan@omg.lol>
174 lines
3.2 KiB
SCSS
174 lines
3.2 KiB
SCSS
@import '../../_variables.scss';
|
|
|
|
// The worst query selector ever
|
|
// selects ONLY emojis pickers in replies in notifications
|
|
// who thought this was a good idea?
|
|
.notification > .Status > .status-container > .post-status-form > form > .form-group > .emoji-input > .emoji-picker {
|
|
max-width: 100%;
|
|
left: 0;
|
|
@media (min-width: 1300px) {
|
|
left: -30px;
|
|
}
|
|
}
|
|
|
|
.Notification {
|
|
.emoji-picker {
|
|
min-width: 160%;
|
|
width: 150%;
|
|
overflow: hidden;
|
|
left: -70%;
|
|
max-width: 100%;
|
|
@media (min-width: 800px) and (max-width: 1280px) {
|
|
left: -50%;
|
|
min-width: 50%;
|
|
max-width: 130%;
|
|
}
|
|
|
|
@media (max-width: 800px) {
|
|
left: -10%;
|
|
min-width: 50%;
|
|
max-width: 130%;
|
|
}
|
|
|
|
.Status > .emoji-picker {
|
|
z-index: 1000;
|
|
}
|
|
}
|
|
}
|
|
.emoji-picker {
|
|
display: flex;
|
|
flex-direction: column;
|
|
position: absolute;
|
|
right: 0;
|
|
left: 0;
|
|
margin: 0 !important;
|
|
z-index: 100;
|
|
background-color: $fallback--bg;
|
|
background-color: var(--popover, $fallback--bg);
|
|
color: $fallback--link;
|
|
color: var(--popoverText, $fallback--link);
|
|
--lightText: var(--popoverLightText, $fallback--faint);
|
|
--faint: var(--popoverFaintText, $fallback--faint);
|
|
--faintLink: var(--popoverFaintLink, $fallback--faint);
|
|
--lightText: var(--popoverLightText, $fallback--lightText);
|
|
--icon: var(--popoverIcon, $fallback--icon);
|
|
|
|
.keep-open,
|
|
.too-many-emoji {
|
|
padding: 7px;
|
|
line-height: normal;
|
|
}
|
|
|
|
.too-many-emoji {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.keep-open-label {
|
|
padding: 0 7px;
|
|
display: flex;
|
|
}
|
|
|
|
.heading {
|
|
margin-top: 10px;
|
|
height: 4.8em;
|
|
}
|
|
|
|
.content {
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex: 1 1 auto;
|
|
min-height: 0px;
|
|
}
|
|
|
|
.emoji-tabs {
|
|
flex-grow: 1;
|
|
}
|
|
|
|
.additional-tabs {
|
|
border-left: 1px solid;
|
|
border-left-color: $fallback--icon;
|
|
border-left-color: var(--icon, $fallback--icon);
|
|
padding-left: 7px;
|
|
flex: 0 0 auto;
|
|
}
|
|
|
|
.additional-tabs,
|
|
.emoji-tabs {
|
|
position: absolute;
|
|
display: block;
|
|
flex-wrap: nowrap;
|
|
|
|
overflow: auto;
|
|
width: 100%;
|
|
|
|
white-space: nowrap;
|
|
|
|
&-item {
|
|
vertical-align: top;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 32px;
|
|
height: 32px;
|
|
padding: .4em;
|
|
cursor: pointer;
|
|
|
|
img {
|
|
max-width: 100%;
|
|
max-height: 100%;
|
|
object-fit: contain;
|
|
}
|
|
|
|
span {
|
|
font-size: 1.9em;
|
|
}
|
|
|
|
&.disabled {
|
|
opacity: 0.5;
|
|
pointer-events: none;
|
|
}
|
|
|
|
&.active {
|
|
border-bottom: 4px solid;
|
|
|
|
svg {
|
|
color: $fallback--lightText;
|
|
color: var(--lightText, $fallback--lightText);
|
|
}
|
|
}
|
|
.fa-sticky-note {
|
|
font-size: 2em;
|
|
}
|
|
}
|
|
}
|
|
|
|
.sticker-picker {
|
|
flex: 1 1 auto
|
|
}
|
|
|
|
.stickers,
|
|
.emoji {
|
|
&-content {
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex: 1 1 auto;
|
|
min-height: 0;
|
|
|
|
&.hidden {
|
|
opacity: 0;
|
|
pointer-events: none;
|
|
position: absolute;
|
|
}
|
|
}
|
|
}
|
|
|
|
.emoji-search {
|
|
padding: 5px;
|
|
flex: 0 0 auto;
|
|
|
|
input {
|
|
width: 100%;
|
|
}
|
|
}
|
|
}
|