feat: implement livestream post functionality and update site theme assets
This commit is contained in:
+8
-8
File diff suppressed because one or more lines are too long
@@ -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 |
+8
-8
File diff suppressed because one or more lines are too long
BIN
Binary file not shown.
|
After Width: | Height: | Size: 176 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 176 KiB |
Reference in New Issue
Block a user