Files
mue/src/components/Elements/MainModal/scss/index.scss
alexsparkes 1ef65fb5d2 fix: resolve QA bugs across settings, reminder banner, and modal layout
- Replace all querySelector('.reminder-info') calls with EventBus.emit('showReminder')
  across 14 files — prevents crashes when the element is not mounted
- Move ReminderInfo from inside the sidebar to the top of the right content column
  so it no longer obscures sidebar navigation
- Fix reminder not showing for non-hot-reload settings (Slider hook violation where
  useT() was called inside a requestAnimationFrame callback)
- Skip reminder for LocationSearch since it already emits a hot-reload refresh event
- Suppress reminder for settings with hot-reload (no page refresh needed)
- Fix modal content overflowing right edge: replace width:100%!important on
  .modalTabContent with flex:1 + min-width:0 + overflow-x:hidden
- Fix ReminderInfo refresh button being too small
- Fix sidebar collapse animation using max-width transition instead of width:0
- Fix PhotoInformation showing 0x0 resolution and Unknown Location before image loads
- Fix Wikipedia disambiguation links for quote authors by returning null from
  getAuthorLink (Wikidata links used when available)
- Bail early in useSuggestedPacks when offline mode is enabled

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 10:19:50 +01:00

458 lines
7.1 KiB
SCSS

@use 'sass:map';
@use 'scss/variables' as *;
@use 'modules/topBar' as *;
@use 'modules/sidebar' as *;
@use 'modules/navbar' as *;
@use 'modules/buttons' as *;
@use 'modules/modalTabContent' as *;
@use 'modules/links' as *;
@use 'modules/scrollbars' as *;
@use 'settings/main' as *;
@use 'marketplace/main' as *;
/* Fixed: Added sass:map module */
.Overlay {
position: fixed;
z-index: 100;
inset: 0;
width: 100vw;
height: 100vh;
display: grid;
place-items: center;
opacity: 0;
transition: opacity 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
&.ReactModal__Overlay--after-open {
opacity: 1;
}
&.ReactModal__Overlay--before-close {
opacity: 0;
}
}
.Modal {
@include themed {
color: t($color);
}
box-shadow: 0 0 20px rgb(0 0 0 / 30%);
opacity: 0;
z-index: -2;
border-radius: map.get($modal, 'border-radius');
-webkit-user-select: none;
user-select: none;
overflow: hidden;
transform: scale(0.95);
transition: opacity 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94),
transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
&:focus {
outline: 0;
}
.modalInfoPage {
user-select: text;
}
}
.closePositioning {
position: absolute;
top: 3rem;
inset-inline-end: 3rem;
}
.closeModal {
display: grid;
place-items: center;
padding: 0.5em;
border-radius: 12px;
cursor: pointer;
transition: 0.5s;
outline: none;
border: none;
background: transparent;
svg {
font-size: 2em;
}
@include themed {
color: t($color);
}
&:hover {
@include themed {
background: t($modal-sidebarActive);
}
}
}
.ReactModal__Html--open,
.ReactModal__Body--open {
overflow: hidden;
}
/* modal transition */
.ReactModal__Content--after-open {
opacity: 1;
transform: scale(1);
}
.ReactModal__Content--before-close {
opacity: 0;
transform: scale(0.95);
}
#modal {
height: 80vh;
width: clamp(60vw, 1400px, 90vw);
backdrop-filter: blur(16px) saturate(180%);
backdrop-filter: blur(16px) saturate(180%);
overflow: hidden;
border-radius: 12px;
@include themed {
background-color: t($modal-background);
}
}
/* fixes for font size on extension */
label,
p,
span.modalLink {
font-size: 1rem;
}
h2 {
font-size: 2rem;
margin-bottom: 0;
}
h3 {
font-size: 1.17rem;
}
h5 {
font-size: 0.8rem;
}
.loaderHolder {
display: flex;
gap: 15px;
flex-flow: column;
align-items: center;
}
#loader {
display: inline-block;
width: 50px;
height: 50px;
@include themed {
border: 3px solid t($modal-sidebar);
border-radius: 50%;
border-top-color: t($modal-sidebarActive);
}
animation: spin 1s ease-in-out infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.headerExtras {
display: flex;
flex-flow: column;
gap: -1px;
padding: 10px 0;
div:nth-child(1) {
display: flex;
flex-flow: column;
gap: 10px;
}
form {
margin-top: 10px;
}
.link {
display: flex;
flex-flow: row;
gap: 15px;
align-items: center;
}
.MuiOutlinedInput-notchedOutline {
@include themed {
border-color: t($modal-sidebarActive) !important;
}
}
}
.headerActions {
display: flex;
flex-flow: row;
gap: 20px;
justify-content: center;
align-items: center;
.link {
display: flex;
flex-flow: row;
gap: 15px;
align-items: center;
}
}
.marketplaceCondition {
display: flex;
flex-flow: row !important;
gap: -1px;
justify-content: space-between;
align-items: center;
}
.languageSettings {
padding-bottom: 50px;
.MuiFormGroup-root {
gap: 5px;
}
.MuiFormControl-root {
width: 100% !important;
gap: 15px;
.MuiFormControlLabel-root {
display: flex;
flex-direction: row-reverse;
justify-content: space-between;
padding: 5px 5px 5px 20px;
transition: 0.3s;
@include themed {
background: t($modal-sidebar);
border-radius: t($borderRadius);
&:hover {
background: t($modal-sidebarActive);
}
}
}
}
}
.sliderTitle {
width: 100%;
display: flex;
justify-content: space-between;
padding: 15px 0;
.link {
display: flex;
flex-flow: row;
gap: 15px;
align-items: center;
}
}
.moreSettings {
cursor: pointer;
display: flex;
flex-flow: row;
justify-content: space-between;
padding: 25px;
margin-top: 20px;
transition: 0.5s;
@include themed {
background: t($modal-sidebar);
border-radius: t($borderRadius);
box-shadow: 0 0 0 1px t($modal-border);
&:hover {
background: t($modal-sidebarActive);
}
}
svg {
font-size: 20px;
}
.left {
display: flex;
flex-flow: row;
align-items: center;
gap: 25px;
svg {
@include themed {
background-image: t($slightGradient);
box-shadow: t($boxShadow);
}
padding: 15px;
border-radius: 100%;
flex-shrink: 0;
}
}
.content {
display: flex;
flex-flow: column;
}
.action {
display: flex;
flex-flow: row;
gap: 20px;
align-items: center;
}
}
.reminder-info {
display: flex;
flex-flow: row;
align-items: center;
gap: 12px;
padding: 10px 16px;
flex-shrink: 0;
@include themed {
background-color: t($modal-secondaryColour);
border-bottom: 1px solid t($modal-sidebarActive);
}
.title {
font-weight: 600;
white-space: nowrap;
}
.subtitle {
opacity: 0.7;
flex: 1;
}
button {
@include basicIconButton(8px 14px, 0.875rem, modal);
display: flex;
align-items: center;
gap: 8px;
flex-shrink: 0;
cursor: pointer;
svg {
margin: 0 !important;
font-size: 1rem;
}
}
.closeModal {
cursor: pointer;
display: flex;
align-items: center;
flex-shrink: 0;
opacity: 0.6;
&:hover {
opacity: 1;
}
}
svg {
margin: 0 !important;
}
@extend %tabText;
}
.quoteSkeleton {
margin-top: 5px;
display: flex;
flex-flow: column;
gap: 5px;
align-items: center;
div {
display: flex;
flex-flow: row;
}
.text {
display: flex;
flex-flow: column;
padding: 5px;
}
.skeletonAuthor {
font-size: smaller;
display: flex;
flex-flow: row;
align-items: center;
gap: 25px;
padding: 0 20px 0 5px;
svg {
@include themed {
background-color: t($modal-sidebar);
padding: 10px;
border-radius: t($borderRadius);
place-items: center;
}
}
@include themed {
background-color: t($modal-sidebarActive);
border-radius: t($borderRadius);
}
.title {
font-size: medium !important;
}
.subtitle {
font-size: smaller !important;
}
}
}
.quickLinksSkeleton {
.circles {
display: flex;
flex-flow: row;
gap: 5px;
div {
margin-top: 10px;
padding: 3px;
height: 20px;
width: 20px;
border-radius: 100%;
display: grid;
place-items: center;
@include themed {
background-color: t($modal-sidebarActive);
}
}
}
}
.clockSkeleton {
font-size: 30px !important;
font-weight: bold;
}