fix: assessment tooltips on homepage

This commit is contained in:
SethBurkart123
2025-06-25 09:46:35 +10:00
parent b69d5f47fc
commit b503363d64
4 changed files with 127 additions and 10 deletions
+54
View File
@@ -94,3 +94,57 @@ body:has(.outside-container:not(.hide))
background: var(--text-primary) !important; background: var(--text-primary) !important;
color: var(--theme-primary) !important; color: var(--theme-primary) !important;
} }
.fixed-tooltip {
display: inline-block;
z-index: 5 !important;
width: 28px;
background: none;
box-shadow: none;
padding: 2px;
position: absolute;
}
.fixed-tooltip svg {
fill: var(--theme-primary);
}
.tooltiptext-fixed {
width: 120px;
transform: scale(0);
transition: transform 0.2s;
transform-origin: top;
background: var(--background-primary);
color: var(--text-primary);
text-align: center;
border-radius: 6px;
padding: 2px;
position: fixed;
z-index: 1000;
top: 0;
left: 0;
margin-left: -62px;
}
.tooltiptext-fixed::after {
content: "";
position: absolute;
bottom: 100%;
left: 50%;
margin-left: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent var(--text-primary) transparent;
}
.tooltiptext-fixed.show {
transform: scale(1);
transform-origin: top;
transition: transform 0.2s;
}
.tooltiptext-fixed p:hover {
cursor: pointer;
background: rgba(0, 0, 0, 0.3) !important;
transition: 200ms;
}
.tooltiptext-fixed p {
border-radius: 8px !important;
padding-top: 2px;
padding-bottom: 2px;
margin: 2px;
}
+2 -1
View File
@@ -2733,12 +2733,13 @@ body {
.menuShown #menuToggle .hamburger-line:nth-child(3) { .menuShown #menuToggle .hamburger-line:nth-child(3) {
transform: translateY(-6px) rotate(-45deg); transform: translateY(-6px) rotate(-45deg);
} }
.day-empty { div.day-empty {
display: flex; display: flex;
align-items: center; align-items: center;
height: 15em; height: 15em;
width: 100%; width: 100%;
border-radius: 16px 0; border-radius: 16px 0;
padding: 0 !important;
img { img {
margin: 20px; margin: 20px;
+12 -9
View File
@@ -13,6 +13,7 @@ import { CreateCustomShortcutDiv } from "@/seqta/utils/CreateEnable/CreateCustom
import { CreateElement } from "@/seqta/utils/CreateEnable/CreateElement"; import { CreateElement } from "@/seqta/utils/CreateEnable/CreateElement";
import { FilterUpcomingAssessments } from "@/seqta/utils/FilterUpcomingAssessments"; import { FilterUpcomingAssessments } from "@/seqta/utils/FilterUpcomingAssessments";
import { getMockNotices } from "@/seqta/ui/dev/hideSensitiveContent"; import { getMockNotices } from "@/seqta/ui/dev/hideSensitiveContent";
import { setupFixedTooltips } from "@/seqta/utils/fixedTooltip";
let LessonInterval: any; let LessonInterval: any;
let currentSelectedDate = new Date(); let currentSelectedDate = new Date();
@@ -628,12 +629,13 @@ function openNoticeModal(
// Get the current scale applied to the source element and compensate for it // Get the current scale applied to the source element and compensate for it
const computedStyle = getComputedStyle(sourceElement); const computedStyle = getComputedStyle(sourceElement);
const transform = computedStyle.transform; const transform = computedStyle.transform;
let scaleX = 1, scaleY = 1; let scaleX = 1,
scaleY = 1;
if (transform && transform !== 'none') {
if (transform && transform !== "none") {
const matrix = transform.match(/matrix.*\((.+)\)/); const matrix = transform.match(/matrix.*\((.+)\)/);
if (matrix) { if (matrix) {
const values = matrix[1].split(', '); const values = matrix[1].split(", ");
scaleX = parseFloat(values[0]); scaleX = parseFloat(values[0]);
scaleY = parseFloat(values[3]); scaleY = parseFloat(values[3]);
} }
@@ -642,11 +644,11 @@ function openNoticeModal(
// Apply inverse scale to get true original dimensions and positions // Apply inverse scale to get true original dimensions and positions
const newSourceWidth = newSourceRect.width / scaleX; const newSourceWidth = newSourceRect.width / scaleX;
const newSourceHeight = newSourceRect.height / scaleY; const newSourceHeight = newSourceRect.height / scaleY;
// Calculate position shift due to center-based scaling // Calculate position shift due to center-based scaling
const deltaX = (newSourceWidth - newSourceRect.width) / 2; const deltaX = (newSourceWidth - newSourceRect.width) / 2;
const deltaY = (newSourceHeight - newSourceRect.height) / 2; const deltaY = (newSourceHeight - newSourceRect.height) / 2;
const newSourceLeft = newSourceRect.left - deltaX; const newSourceLeft = newSourceRect.left - deltaX;
const newSourceTop = newSourceRect.top - deltaY; const newSourceTop = newSourceRect.top - deltaY;
@@ -965,7 +967,7 @@ function makeLessonDiv(lesson: any, num: number) {
.join(""); .join("");
lessonString += ` lessonString += `
<div class="tooltip assessmenttooltip"> <div class="fixed-tooltip assessmenttooltip">
<svg style="width:28px;height:28px;border-radius:0;" viewBox="0 0 24 24"> <svg style="width:28px;height:28px;border-radius:0;" viewBox="0 0 24 24">
<path fill="#ed3939" d="M16 2H4C2.9 2 2 2.9 2 4V20C2 21.11 2.9 22 4 22H16C17.11 22 18 21.11 18 20V4C18 2.9 17.11 2 16 2M16 20H4V4H6V12L8.5 9.75L11 12V4H16V20M20 15H22V17H20V15M22 7V13H20V7H22Z" /> <path fill="#ed3939" d="M16 2H4C2.9 2 2 2.9 2 4V20C2 21.11 2.9 22 4 22H16C17.11 22 18 21.11 18 20V4C18 2.9 17.11 2 16 2M16 20H4V4H6V12L8.5 9.75L11 12V4H16V20M20 15H22V17H20V15M22 7V13H20V7H22Z" />
</svg> </svg>
@@ -975,8 +977,9 @@ function makeLessonDiv(lesson: any, num: number) {
} }
lessonString += "</div>"; lessonString += "</div>";
const element = stringToHTML(lessonString);
return stringToHTML(lessonString); setupFixedTooltips(element);
return element;
} }
function buildAssessmentURL(programmeID: any, metaID: any, itemID = "") { function buildAssessmentURL(programmeID: any, metaID: any, itemID = "") {
+59
View File
@@ -0,0 +1,59 @@
export function setupFixedTooltips(root: Document | HTMLElement = document) {
const elements = root.querySelectorAll<HTMLElement>(".fixed-tooltip");
elements.forEach((tooltip) => {
const text = tooltip.querySelector<HTMLElement>(".tooltiptext");
if (!text) return;
tooltip.removeChild(text);
text.classList.add("tooltiptext-fixed");
let hideTimeout: number | undefined;
const show = () => {
if (hideTimeout) {
clearTimeout(hideTimeout);
hideTimeout = undefined;
}
document.body.appendChild(text);
const rect = tooltip.getBoundingClientRect();
text.style.left = `${rect.left + rect.width / 2}px`;
text.style.top = `${rect.bottom + 5}px`;
requestAnimationFrame(() => text.classList.add("show"));
};
const scheduleHide = () => {
hideTimeout = window.setTimeout(() => {
text.classList.remove("show");
setTimeout(() => {
if (text.parentElement === document.body) {
document.body.removeChild(text);
}
}, 200);
}, 300);
};
tooltip.addEventListener("mouseenter", show);
tooltip.addEventListener("mouseleave", scheduleHide);
tooltip.addEventListener("blur", scheduleHide);
tooltip.addEventListener("click", scheduleHide);
text.addEventListener("mouseenter", () => {
if (hideTimeout) {
clearTimeout(hideTimeout);
hideTimeout = undefined;
}
});
text.addEventListener("mouseleave", scheduleHide);
text.addEventListener("click", () => {
if (hideTimeout) {
clearTimeout(hideTimeout);
hideTimeout = undefined;
}
text.classList.remove("show");
setTimeout(() => {
if (text.parentElement === document.body) {
document.body.removeChild(text);
}
}, 200);
});
});
}