feat: implement livestream post functionality and update site theme assets

This commit is contained in:
2026-07-14 23:34:50 +07:00
parent 1b905d8c60
commit f4e24a0e00
130 changed files with 17284 additions and 277 deletions
@@ -60,4 +60,465 @@
/* Ensures it sits above the video */
}
/* News Grid Tablet Layout */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.news-list {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 24px;
align-items: stretch;
}
.featured-grid__item {
height: 100%;
display: flex;
}
.featured-grid__item .news-card--featured {
display: flex;
flex-direction: column;
align-items: flex-start;
border: 1px solid #881C1C;
border-radius: 16px;
padding: 16px;
box-sizing: border-box;
width: 100%;
height: 100%;
gap: 16px;
background: #fff;
margin-bottom: 0 !important;
}
.featured-grid__item .news-card__image {
flex: none;
width: 100%;
aspect-ratio: 1 / 1;
margin-bottom: 0 !important;
}
.featured-grid__item .news-card__image > div {
height: 100%;
width: 100%;
}
.featured-grid__item .news-card__image img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
border-radius: 8px;
}
.featured-grid__item .news-card__content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: flex-start;
min-width: 0;
padding: 0 !important;
margin: 0 !important;
}
.featured-grid__item .featured-grid__category {
margin-bottom: 12px;
}
.featured-grid__item .featured-grid__category a {
display: inline-block;
background-color: #f2f2f2;
color: #881C1C;
padding: 4px 8px;
border-radius: 4px;
font-size: 0.75rem;
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
}
.featured-grid__item .news-card__title {
font-size: 1.1rem;
font-weight: 700;
margin-top: 0;
margin-bottom: 12px;
line-height: 1.4;
}
.featured-grid__item .news-card__title a {
color: #000;
text-decoration: none;
}
.featured-grid__item .news-card__title a:hover {
color: #881C1C;
}
.featured-grid__item .news-card__date {
margin-top: auto;
color: #881C1C;
font-size: 0.85rem;
font-weight: 500;
}
}
/* News Grid Desktop Layout */
@media screen and (min-width: 1025px){
.news-list {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 24px;
align-items: stretch;
}
.education-column .news-list {
grid-template-columns: repeat(3, 1fr);
}
.featured-grid__item {
height: 100%;
display: flex;
}
.featured-grid__item .news-card--featured {
display: flex;
flex-direction: row;
align-items: flex-start;
border: 1px solid #881C1C;
border-radius: 16px;
padding: 16px;
box-sizing: border-box;
width: 100%;
height: 100%;
gap: 16px;
background: #fff;
margin-bottom: 0 !important;
}
.featured-grid__item .news-card__image {
flex: 0 0 170px;
width: 100%;
height: 170px;
margin-bottom: 0 !important;
}
.featured-grid__item .news-card__image > div {
height: 100%;
width: 100%;
}
.featured-grid__item .news-card__image img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
border-radius: 8px;
}
.featured-grid__item .news-card__content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: flex-start;
min-width: 0;
padding: 0 !important;
margin: 0 !important;
}
.featured-grid__item .featured-grid__category {
margin-bottom: 12px;
}
.featured-grid__item .featured-grid__category a {
display: inline-block;
background-color: #f2f2f2;
color: #881C1C;
padding: 4px 8px;
border-radius: 4px;
font-size: 0.75rem;
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
}
.featured-grid__item .news-card__title {
font-size: 1.1rem;
font-weight: 700;
margin-top: 0;
margin-bottom: 12px;
line-height: 1.4;
}
.featured-grid__item .news-card__title a {
color: #000;
text-decoration: none;
}
.featured-grid__item .news-card__title a:hover {
color: #881C1C;
}
.featured-grid__item .news-card__date {
margin-top: auto;
color: #881C1C;
font-size: 0.85rem;
font-weight: 500;
}
}
/* ==========================================================================
Desktop Layouts (>= 1024px)
========================================================================== */
@media screen and (min-width: 1025px) {
/* Side-by-side layout for News and Events */
.news-events-row {
display: flex;
flex-direction: row;
gap: 40px;
align-items: stretch;
}
.news-events-row > .news-column {
flex: 1.8;
min-width: 0;
}
.news-events-row > .events-column {
flex: 1;
min-width: 0;
}
}
/* ==========================================================================
Navigation Container & Mobile Menu
========================================================================== */
/* --- Desktop (>1024px) --- */
.navigation-container {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 1.5rem;
flex-grow: 1;
}
/* Desktop: show horizontal menu, hide hamburger */
@media (min-width: 1025px) {
#mobile-hamburger {
display: none !important;
}
#mobile-flyout-container {
display: flex !important;
align-items: center;
}
.primary-navigation {
display: flex;
align-items: center;
}
/* Desktop: hide arrow toggles and back buttons */
.mc--main-menu .arrow-toggle,
.mc--main-menu .button-back,
.mc--main-menu .navigation-title {
display: none !important;
}
/* Desktop: horizontal main menu */
.m--main-menu {
display: flex;
gap: 0;
list-style: none;
margin: 0;
padding: 0;
}
.m--main-menu > .menu-item > .link-arrow-wrapper > a {
text-transform: uppercase;
font-weight: 700;
padding: 10px 15px;
white-space: nowrap;
}
}
/* --- Mobile (<= 768px) --- */
@media (max-width: 768px) {
/* Hide ambient video on mobile to save bandwidth and use image fallback */
.f--ambient-video,
.video-controls {
display: none !important;
}
}
/* Override Tabbed Media Content text colors since background was changed to light gray */
.cc--tabbed-media-content .f--description p {
color: #000000 !important;
}
.cc--tabbed-media-content .f--description a {
color: var(--color-brand) !important;
}
/* Style tab labels and borders to black */
.cc--tabbed-media-content .tab-labels-inner {
border-bottom-color: #cccccc !important; /* light gray line for the tab row */
}
.cc--tabbed-media-content .tab-label {
color: #555555 !important; /* dark gray for inactive tabs */
font-weight: 700 !important;
}
.cc--tabbed-media-content .tab-label[aria-selected="true"] {
color: #000000 !important; /* solid black for active tab */
border-bottom: 3px solid #000000 !important; /* solid black underline for active tab */
}
/* Center children inside tabbed-media-content-media-col */
.cc--tabbed-media-content .tabbed-media-content-media-col {
align-items: center !important;
justify-content: center !important;
}
/* --- Mobile & Tablet (<=1024px) --- */
@media (max-width: 1024px) {
.navigation-container {
gap: 0.5rem;
}
/* Hamburger button */
#mobile-hamburger {
display: block;
z-index: 1001;
background: none;
border: none;
cursor: pointer;
padding: 10px;
}
.hamburger-box {
width: 30px;
height: 24px;
display: inline-block;
position: relative;
}
.hamburger-inner,
.hamburger-inner::before,
.hamburger-inner::after {
width: 30px;
height: 3px;
background-color: #fff;
border-radius: 2px;
position: absolute;
transition: transform 0.3s ease, opacity 0.2s ease;
}
.hamburger-inner {
top: 50%;
transform: translateY(-50%);
}
.hamburger-inner::before {
content: '';
top: -9px;
}
.hamburger-inner::after {
content: '';
bottom: -9px;
}
/* Hamburger X state */
#mobile-hamburger.is-active .hamburger-inner {
transform: rotate(45deg);
}
#mobile-hamburger.is-active .hamburger-inner::before {
top: 0;
opacity: 0;
}
#mobile-hamburger.is-active .hamburger-inner::after {
bottom: 0;
transform: rotate(-90deg);
}
/* Mobile flyout container */
#mobile-flyout-container {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: auto;
background: #fff;
z-index: 1000;
overflow-y: auto;
overflow-x: hidden;
padding-top: 80px;
}
/* Primary navigation inside flyout */
.primary-navigation {
display: block;
}
/* Main menu list - vertical */
.m--main-menu {
list-style: none;
margin: 0;
padding: 0;
}
.m--main-menu > .menu-item {
border-bottom: 1px solid #e0e0e0;
}
/* Link + arrow wrapper */
.link-arrow-wrapper {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0;
}
.link-arrow-wrapper > a {
flex: 1;
padding: 15px 20px;
color: #333;
text-decoration: none;
font-weight: 700;
font-size: 16px;
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* Arrow toggle button */
.arrow-toggle {
background: none;
border: none;
/* border-left: 1px solid #e0e0e0; */
/* padding: 15px 20px; */
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
min-width: 50px;
}
.arrow-toggle svg {
transition: transform 0.3s ease;
}
.arrow-toggle.is-active svg {
transform: rotate(180deg);
}
/* Submenu list */
.submenu {
list-style: none;
margin: 0;
padding: 0;
}
.submenu .menu-item {
border-bottom: 1px solid #f0f0f0;
}
.submenu .menu-item a,
.submenu .menu-item span {
display: block;
padding: 12px 20px;
color: #333;
text-decoration: none;
font-size: 15px;
text-transform: uppercase;
font-weight: 600;
letter-spacing: 0.03em;
}
.submenu .menu-item a:hover {
background-color: #f5f5f5;
color: #881c1c;
}
/* Hide desktop-only elements on mobile */
.desktop-only {
display: none !important;
}
/* Show mobile-only elements on mobile */
.mobile-only {
display: block !important;
}
/* Hide quicklink buttons, utility menu, and social links on mobile flyout */
.mc--quicklink-button-menu,
.mc--utility-menu,
[data-component-id="umass_base:header-socials"] {
margin-top: 20px;
border-top: 2px solid #881c1c;
padding-top: 10px;
}
}
/* On Desktop, hide mobile-only elements */
@media (min-width: 1366) {
.mobile-only {
display: none !important;
}
}
@@ -0,0 +1,45 @@
document.addEventListener('DOMContentLoaded', function () {
document.querySelectorAll('.video-controls').forEach(function (controls) {
var playBtn = controls.querySelector('.video-play-button');
var pauseBtn = controls.querySelector('.video-pause-button');
// Find the associated ambient video. In the HTML structure, the .f--ambient-video
// container is a sibling (specifically previousElementSibling) of .video-controls.
// If not, we fall back to searching within the closest parent.
var videoContainer = controls.previousElementSibling;
if (!videoContainer || !videoContainer.classList.contains('f--ambient-video')) {
var parent = controls.closest('.image-video-container');
if (parent) {
videoContainer = parent.querySelector('.f--ambient-video');
}
}
if (!videoContainer) return;
var video = videoContainer.querySelector('video');
if (!video) return;
if (pauseBtn) {
pauseBtn.addEventListener('click', function (e) {
e.preventDefault();
pauseBtn.classList.add('hidden');
if (playBtn) {
playBtn.classList.add('active');
playBtn.focus();
}
video.pause();
});
}
if (playBtn) {
playBtn.addEventListener('click', function (e) {
e.preventDefault();
playBtn.classList.remove('active');
if (pauseBtn) {
pauseBtn.classList.remove('hidden');
pauseBtn.focus();
}
video.play();
});
}
});
});
@@ -0,0 +1,88 @@
/**
* Mobile Menu - Hamburger toggle, submenu accordion interactions.
* Pure vanilla JS — jQuery is NOT available.
* Only active on mobile/tablet (≤1024px via CSS).
*/
document.addEventListener('DOMContentLoaded', function () {
var hamburger = document.getElementById('mobile-hamburger');
var flyout = document.getElementById('mobile-flyout-container');
var header = document.querySelector('[data-component-id="umass_base:site-header"]');
// Helper functions for fade animation
function fadeIn(el) {
el.style.display = 'block';
var anim = el.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 300, fill: 'forwards' });
el._fadeAnim = anim;
}
function fadeOut(el) {
var anim = el.animate([{ opacity: 1 }, { opacity: 0 }], { duration: 300, fill: 'forwards' });
el._fadeAnim = anim;
anim.onfinish = function() {
if (el._fadeAnim === anim) {
el.style.display = 'none';
}
};
}
// --- Hamburger toggle ---
if (hamburger && flyout) {
hamburger.addEventListener('click', function () {
var isActive = hamburger.classList.toggle('is-active');
if (isActive) {
fadeIn(flyout);
} else {
fadeOut(flyout);
// Close all open submenus when closing the flyout
flyout.querySelectorAll('.submenu-wrapper').forEach(function (w) {
if (w.style.display !== 'none') fadeOut(w);
});
flyout.querySelectorAll('.arrow-toggle.is-active').forEach(function (a) {
a.classList.remove('is-active');
});
}
if (header) header.classList.toggle('mobile-menu-active', isActive);
});
}
// --- Arrow toggle: open/close submenu (fade style) ---
document.querySelectorAll('#mobile-flyout-container .arrow-toggle').forEach(function (btn) {
btn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
// The submenu-wrapper is the next sibling of .link-arrow-wrapper
var linkArrowWrapper = btn.closest('.link-arrow-wrapper');
if (!linkArrowWrapper) return;
var wrapper = linkArrowWrapper.nextElementSibling;
if (!wrapper || !wrapper.classList.contains('submenu-wrapper')) return;
var isActive = btn.classList.toggle('is-active');
if (isActive) {
fadeIn(wrapper);
} else {
fadeOut(wrapper);
}
});
});
// --- Back button: close submenu ---
document.querySelectorAll('.button-back').forEach(function (btn) {
btn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
var wrapper = btn.closest('.submenu-wrapper');
if (wrapper) {
fadeOut(wrapper);
// Also reset the arrow toggle on the parent li
var li = wrapper.closest('li');
if (li) {
var toggle = li.querySelector('.link-arrow-wrapper > .arrow-toggle');
if (toggle) {
toggle.classList.remove('is-active');
}
}
}
});
});
});
Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB