Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6af9240c22 | |||
| 49b8d2b2ea |
Binary file not shown.
@@ -0,0 +1,2 @@
|
||||
SELECT content FROM sis_component_template WHERE slug = 'cta-buttons';
|
||||
EXIT;
|
||||
@@ -1,337 +1,37 @@
|
||||
<body>
|
||||
<div class="cc--component-container cc--news-events ">
|
||||
<div class="c--component c--news-events">
|
||||
<div class="news-events-section__header">
|
||||
<h2 class="news-events-section__main-title"> NEWS & EVENTS </h2>
|
||||
<a class="news-events-section__cta news-events-section__cta--desktop" href="https://www.umass.edu/news/news-events"> More News & Events </a>
|
||||
</div>
|
||||
<h3 class="section-title"> FEATURED ARTICLES </h3>
|
||||
<div class="featured-grid">
|
||||
<div class="featured-grid__item">
|
||||
<article class="news-card news-card--featured">
|
||||
<div class="news-card__image">
|
||||
<div>
|
||||
<img loading="lazy" src="./UMass Amherst _ UMass Amherst_files/NEWS-Operating Room Surgery viaAdobeStock.jpeg" width="1280" height="720" alt="Medical Team Performing Surgical Operation in Modern Operating Room">
|
||||
</div>
|
||||
</div>
|
||||
<div class="news-card__content">
|
||||
<div class="featured-grid__category">
|
||||
<a href="https://www.umass.edu/taxonomy/term/811" hreflang="en">Research</a>
|
||||
</div>
|
||||
<h3 class="news-card__title">
|
||||
<a href="https://www.umass.edu/news/article/scheduling-surgeons-umass-amherst-researchers-identify-factors-could-influence" rel="bookmark">
|
||||
<span>Scheduling Surgeons: UMass Amherst Researchers Identify Factors That Could Influence Hospital Efficiency</span>
|
||||
</a>
|
||||
</h3>
|
||||
<div class="news-card__date"> June 24, 2026 </div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
<div class="featured-grid__item">
|
||||
<article class="news-card news-card--featured">
|
||||
<div class="news-card__image">
|
||||
<div>
|
||||
<img loading="lazy" src="./UMass Amherst _ UMass Amherst_files/Yanfei Xu polymer figure.jpg" width="1280" height="720" alt="An illustration of THDBT (tetrahydroxy deoxybenzoin triazole) filler aggregates at the molecular level. In this “slow chaos” state, there are fewer vibrational pathways available for heat transport, resulting in lower thermal conductivity. Reproduced from Materials Horizons with permission from the Royal Society of Chemistry.">
|
||||
</div>
|
||||
</div>
|
||||
<div class="news-card__content">
|
||||
<div class="featured-grid__category">
|
||||
<a href="https://www.umass.edu/taxonomy/term/811" hreflang="en">Research</a>
|
||||
</div>
|
||||
<h3 class="news-card__title">
|
||||
<a href="https://www.umass.edu/news/article/umass-amherst-led-team-discovers-new-way-make-thermally-insulative-plastics" rel="bookmark">
|
||||
<span>UMass Amherst-Led Team Discovers New Way to Make Thermally Insulative Plastics </span>
|
||||
</a>
|
||||
</h3>
|
||||
<div class="news-card__date"> June 22, 2026 </div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
<div class="featured-grid__item">
|
||||
<article class="news-card news-card--featured">
|
||||
<div class="news-card__image">
|
||||
<div>
|
||||
<img loading="lazy" src="./UMass Amherst _ UMass Amherst_files/Anthropology Field School Dig-26.jpg" width="1280" height="720" alt="Students dig during UMass Amherst’s Bioarchaeology and Forensic Anthropology Field School">
|
||||
</div>
|
||||
</div>
|
||||
<div class="news-card__content">
|
||||
<div class="featured-grid__category">
|
||||
<a href="https://www.umass.edu/taxonomy/term/646" hreflang="en">Academics</a>
|
||||
</div>
|
||||
<h3 class="news-card__title">
|
||||
<a href="https://www.umass.edu/news/article/umass-bioarchaeology-and-forensic-anthropology-field-school-gives-students-hands" rel="bookmark">
|
||||
<span>UMass Bioarchaeology and Forensic Anthropology Field School Gives Students Hands-On Experience in Forensic Anthropology</span>
|
||||
</a>
|
||||
</h3>
|
||||
<div class="news-card__date"> June 17, 2026 </div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
<div class="featured-grid__item">
|
||||
<article class="news-card news-card--featured">
|
||||
<div class="news-card__image">
|
||||
<div>
|
||||
<img loading="lazy" src="./UMass Amherst _ UMass Amherst_files/NEWS-deli slicer.jpg" width="1280" height="720" alt="A worker slicing deli meat">
|
||||
</div>
|
||||
</div>
|
||||
<div class="news-card__content">
|
||||
<div class="featured-grid__category">
|
||||
<a href="https://www.umass.edu/taxonomy/term/811" hreflang="en">Research</a>
|
||||
</div>
|
||||
<h3 class="news-card__title">
|
||||
<a href="https://www.umass.edu/news/article/hands-why-human-touch-can-create-food-safety-blind-spot" rel="bookmark">
|
||||
<span>Hands Off: Why Human Touch Can Create a Food-Safety Blind Spot </span>
|
||||
</a>
|
||||
</h3>
|
||||
<div class="news-card__date"> June 17, 2026 </div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
<div class="news-events-row">
|
||||
<div class="news-column">
|
||||
<h3 class="section-title--news"> LATEST NEWS </h3>
|
||||
<div class="news-list">
|
||||
<div class="news-list__item">
|
||||
<article class="news-teaser">
|
||||
<div class="news-teaser__image">
|
||||
<div>
|
||||
<img loading="lazy" src="./UMass Amherst _ UMass Amherst_files/UMass Police Chief Tyrone Parham, Max Callahan, Senator Comerford on MA Senate Rostrum_crop.jpg" width="2833" height="1769" alt="UMass Police Chief Tyrone Parham, Max Callahan and Senator Comerford stand at the Massachusetts Senate Rostrum">
|
||||
</div>
|
||||
</div>
|
||||
<div class="news-teaser__content">
|
||||
<div class="news-list__category">
|
||||
<a href="https://www.umass.edu/taxonomy/term/1001" hreflang="en">University News</a>
|
||||
</div>
|
||||
<h3 class="news-teaser__title">
|
||||
<a href="https://www.umass.edu/news/article/umass-amherst-supported-effort-help-drivers-autism-interact-police-becomes-law" rel="bookmark">
|
||||
<span>UMass Amherst-Supported Effort to Help Drivers with Autism Interact with Police Becomes Law </span>
|
||||
</a>
|
||||
</h3>
|
||||
<div class="news-teaser__summary">
|
||||
<div>
|
||||
<p>A new law signed by Gov. Maura Healey aimed at helping people with autism during interactions with police has roots on the UMass Amherst campus. The so-called “Blue Envelope Bill” sets up a voluntary program where drivers or passengers can provide information helpful to law enforcement during traffic stops or other encounters. </p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
<div class="news-list__item">
|
||||
<article class="news-teaser">
|
||||
<div class="news-teaser__image">
|
||||
<div>
|
||||
<img loading="lazy" src="./UMass Amherst _ UMass Amherst_files/Giuliano Roberts Eye-Tracking IV Pumps Photo 2.jpg" width="4528" height="3016" alt="A student (left) wears eye-tracking glasses as doctoral student Seonhun Lee holds a laptop showing information about the study completed using the technology.">
|
||||
</div>
|
||||
</div>
|
||||
<div class="news-teaser__content">
|
||||
<div class="news-list__category">
|
||||
<a href="https://www.umass.edu/taxonomy/term/811" hreflang="en">Research</a>
|
||||
</div>
|
||||
<h3 class="news-teaser__title">
|
||||
<a href="https://www.umass.edu/news/article/eye-tracking-technology-helps-researchers-see-iv-pump-safety-through-student-nurses" rel="bookmark">
|
||||
<span>Eye-Tracking Technology Helps Researchers See IV Pump Safety Through Student Nurses’ Eyes</span>
|
||||
</a>
|
||||
</h3>
|
||||
<div class="news-teaser__summary">
|
||||
<div>
|
||||
<p>The approach, detailed in a study published in the June 2026 issue of Advancing Medical-Surgical Nursing, marks the first known use of eye-tracking technology to evaluate IV smart pumps.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="events-column">
|
||||
<h3 class="events-title"> Events </h3>
|
||||
<div class="events-widget">
|
||||
<script type="text/javascript" src="./UMass Amherst _ UMass Amherst_files/view"></script>
|
||||
<style>
|
||||
/* ========================================== CAMPUS EVENTS ========================================== */
|
||||
.campus-events-widget {
|
||||
background: transparent;
|
||||
padding: 0;
|
||||
font-family: inherit;
|
||||
}
|
||||
<div class="cc--component-container cc--news-events">
|
||||
<div class="c--component c--news-events">
|
||||
|
||||
.campus-events-widget .events-list {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
<!-- Phần 2 cột: Tin mới (Trái) và Sự kiện (Phải) -->
|
||||
<div class="news-events-row">
|
||||
|
||||
<div class="news-column">
|
||||
<h2 class="section-title--news" style="font-size: 2rem;">
|
||||
TIN TỨC MỚI
|
||||
</h2>
|
||||
<div class="news-list">
|
||||
<!-- Shortcode Tin Tức hiển thị dạng list (tuỳ chỉnh lại limit cho phù hợp) -->
|
||||
[component:news-grid data-source="posts:tag=news,limit=2,collection=news_posts"]
|
||||
</div>
|
||||
</div>
|
||||
|
||||
/* ========================================== DESKTOP LIST LAYOUT ========================================== */
|
||||
.campus-events-widget .teaser-item {
|
||||
padding: 20px 0;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
<div class="events-column">
|
||||
<h2 class="events-title" style="font-size: 2rem;">
|
||||
SỰ KIỆN
|
||||
</h2>
|
||||
<div class="events-widget">
|
||||
<!-- Shortcode Sự kiện -->
|
||||
[component:events-list data-source="posts:tag=event,limit=4,collection=event_posts"]
|
||||
</div>
|
||||
</div>
|
||||
|
||||
.campus-events-widget .teaser-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
</div>
|
||||
|
||||
.campus-events-widget .event-wrapper {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
align-items: flex-start;
|
||||
}
|
||||
<!-- Header chung (Mobile) -->
|
||||
<div class="news-events-section__footer">
|
||||
<a href="/news/news-events" class="news-events-section__cta news-events-section__cta--mobile">
|
||||
Xem Thêm
|
||||
</a>
|
||||
</div>
|
||||
|
||||
/* ===================================== DATE BLOCK ===================================== */
|
||||
.campus-events-widget .event-date {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 0.125rem;
|
||||
padding: 0.25rem;
|
||||
background: #881C1C;
|
||||
width: 2.875rem;
|
||||
height: 3.125rem;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.campus-events-widget .event-date__month {
|
||||
font-size: 1rem;
|
||||
font-weight: 800;
|
||||
line-height: 1.25rem;
|
||||
text-transform: uppercase;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.campus-events-widget .event-date__day {
|
||||
font-size: 1rem;
|
||||
font-weight: 800;
|
||||
line-height: 1.25rem;
|
||||
text-transform: uppercase;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* ===================================== EVENT DETAILS ===================================== */
|
||||
.campus-events-widget .event-details {
|
||||
flex: 1;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* Title */
|
||||
.campus-events-widget .event-title {
|
||||
font-size: 1rem;
|
||||
font-weight: 800;
|
||||
line-height: 1.25rem;
|
||||
text-transform: uppercase;
|
||||
color: #000;
|
||||
position: relative;
|
||||
margin: 0 0 0.375rem;
|
||||
padding-right: 1.25rem;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
}
|
||||
|
||||
.campus-events-widget .event-title a {
|
||||
color: #222;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.campus-events-widget .event-title a:hover {
|
||||
color: #881c1c;
|
||||
}
|
||||
|
||||
/* Chevron */
|
||||
.campus-events-widget .event-title::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0.2rem;
|
||||
width: 0.3125rem;
|
||||
height: 0.6875rem;
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
background-position: center;
|
||||
background-image: url("data:image/svg+xml,%3Csvg width='5' height='11' viewBox='0 0 5 11' fill='none'
|
||||
xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd'clip-rule='evenodd'd='M4.57143 5.14286L0 0V10.2857L4.57143 5.14286Z'fill='%23881C1C'/%3E%3C/svg%3E"); } /* Time */ .campus-events-widget .event-time { font-size: 16px; color: #000; margin-bottom: 4px; } /* Location */ .campus-events-widget .event-location { font-size: 1rem; font-weight: 400; line-height: 1.5rem; font-style: normal; color: #000; } /* Hide summaries */ .campus-events-widget .summary, .campus-events-widget .event-description { display: none !important; } /* ========================================== MOBILE CARD DESIGN ========================================== */ @media (max-width: 768px) { .campus-events-widget .event-title { font-size: 0.75rem; } .campus-events-widget .event-time { font-size: 0.75rem; } .campus-events-widget .event-location { font-size: 0.75rem; } .campus-events-widget .event-wrapper { display: flex; flex: 1; padding-right: 10px; align-items: stretch; gap: 12px; border: 1px solid #CCC; } .campus-events-widget .event-date { display: flex; padding: 4px 8px; flex-direction: column; justify-content: center; align-items: center; align-self: stretch; background: #881C1C; min-width: 48px; height: auto; } .campus-events-widget .event-details { padding: 8px 10px 8px 0; } .campus-events-widget .teaser-item { flex: 0 0 279px; display: flex; border: 0px solid #CCC; padding-bottom: 0; } .campus-events-widget .events-list { display: flex; gap: 1rem; } .campus-events-widget .events-list::before, .campus-events-widget .events-list::after { content: ""; flex: 0 0 8.333%; } } /* ========================================== SMALL MOBILE ADJUSTMENTS ========================================== */ @media (max-width: 480px) { .campus-events-widget .event-wrapper { gap: 10px; } .campus-events-widget .event-date__day { font-size: 18px; } }
|
||||
</style>
|
||||
<div id="lw" class="campus-events-widget">
|
||||
<div class="events-list">
|
||||
<div class="teaser-item">
|
||||
<div class="event-wrapper">
|
||||
<!-- DATE BLOCK -->
|
||||
<div class="event-date">
|
||||
<div class="event-date__month"> JUL </div>
|
||||
<div class="event-date__day"> 07 </div>
|
||||
</div>
|
||||
<!-- DETAILS -->
|
||||
<div class="event-details">
|
||||
<div class="event-title">
|
||||
<a href="https://events.umass.edu/event/hr-is-here-for-you-5678?utm_campaign=widget&utm_medium=widget&utm_source=UMass+Amherst+Events+Calendar"> HR is Here for You </a>
|
||||
</div>
|
||||
<div class="event-time"> 10:00 am – 4:00 pm </div>
|
||||
<div class="event-location"> UMass Downtown </div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="teaser-item">
|
||||
<div class="event-wrapper">
|
||||
<!-- DATE BLOCK -->
|
||||
<div class="event-date">
|
||||
<div class="event-date__month"> JUL </div>
|
||||
<div class="event-date__day"> 07 </div>
|
||||
</div>
|
||||
<!-- DETAILS -->
|
||||
<div class="event-details">
|
||||
<div class="event-title">
|
||||
<a href="https://events.umass.edu/event/ms-in-accounting-virtual-information-session-1380?utm_campaign=widget&utm_medium=widget&utm_source=UMass+Amherst+Events+Calendar"> MS in Accounting Virtual Information Session </a>
|
||||
</div>
|
||||
<div class="event-time"> 12:00 pm – 1:00 pm </div>
|
||||
<div class="event-location"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="teaser-item">
|
||||
<div class="event-wrapper">
|
||||
<!-- DATE BLOCK -->
|
||||
<div class="event-date">
|
||||
<div class="event-date__month"> JUL </div>
|
||||
<div class="event-date__day"> 07 </div>
|
||||
</div>
|
||||
<!-- DETAILS -->
|
||||
<div class="event-details">
|
||||
<div class="event-title">
|
||||
<a href="https://events.umass.edu/event/thrive-at-five-summer-yoga-and-mindfulness-series?utm_campaign=widget&utm_medium=widget&utm_source=UMass+Amherst+Events+Calendar"> Thrive at Five - Summer Yoga and Mindfulness Series </a>
|
||||
</div>
|
||||
<div class="event-time"> 5:00 pm – 6:00 pm </div>
|
||||
<div class="event-location"> Orchard Hill Pavilion </div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="teaser-item">
|
||||
<div class="event-wrapper">
|
||||
<!-- DATE BLOCK -->
|
||||
<div class="event-date">
|
||||
<div class="event-date__month"> JUL </div>
|
||||
<div class="event-date__day"> 08 </div>
|
||||
</div>
|
||||
<!-- DETAILS -->
|
||||
<div class="event-details">
|
||||
<div class="event-title">
|
||||
<a href="https://events.umass.edu/event/online-or-hybrid-ms-in-cs-virtual-info-session-6202?utm_campaign=widget&utm_medium=widget&utm_source=UMass+Amherst+Events+Calendar"> Online or Hybrid MS in CS: Virtual Info Session </a>
|
||||
</div>
|
||||
<div class="event-time"> 10:00 am – 11:00 am </div>
|
||||
<div class="event-location"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="news-events-section__footer">
|
||||
<a class="news-events-section__cta news-events-section__cta--mobile" href="https://www.umass.edu/news/news-events"> More News & Events </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
<style>* { box-sizing: border-box; } body {margin: 0;}</style>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,172 +1,27 @@
|
||||
<style>
|
||||
.stroke-book-banner {
|
||||
background-color: #f8f9fa;
|
||||
padding: 50px 20px;
|
||||
font-family: var(--font-family-base, 'Inter', 'Segoe UI', sans-serif);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.sbb-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
max-width: 1200px;
|
||||
width: 100%;
|
||||
gap: 50px;
|
||||
/* Faint brain background pattern placeholder */
|
||||
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 24 24" fill="none" stroke="%23ffe6e6" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 1.98-3A2.5 2.5 0 0 1 9.5 2Z"/><path d="M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-1.98-3A2.5 2.5 0 0 0 14.5 2Z"/></svg>');
|
||||
background-position: right center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 350px;
|
||||
}
|
||||
|
||||
.sbb-left {
|
||||
flex: 1.2;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.sbb-left img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
object-fit: contain;
|
||||
filter: drop-shadow(0 15px 25px rgba(0,0,0,0.15));
|
||||
}
|
||||
|
||||
.sbb-right {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: flex-start;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.sbb-subtitle {
|
||||
font-size: 1.4rem;
|
||||
font-weight: 700;
|
||||
color: #222;
|
||||
margin-bottom: 5px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.sbb-title {
|
||||
font-size: 3.2rem;
|
||||
font-weight: 800;
|
||||
color: #c0272d;
|
||||
margin: 0 0 15px 0;
|
||||
text-transform: uppercase;
|
||||
line-height: 1.1;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
|
||||
.sbb-tagline {
|
||||
font-size: 1.25rem;
|
||||
font-weight: 700;
|
||||
color: #333;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.sbb-features {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0 0 35px 0;
|
||||
}
|
||||
|
||||
.sbb-features li {
|
||||
font-size: 1.1rem;
|
||||
color: #444;
|
||||
margin-bottom: 14px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.sbb-features li::before {
|
||||
content: '✓';
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
border-radius: 50%;
|
||||
border: 1.5px solid #c0272d;
|
||||
color: #c0272d;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
margin-right: 12px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.sbb-btn {
|
||||
display: inline-block;
|
||||
background: linear-gradient(180deg, #d81b32 0%, #a11122 100%);
|
||||
color: #fff;
|
||||
font-weight: 700;
|
||||
font-size: 1.15rem;
|
||||
padding: 16px 40px;
|
||||
border-radius: 6px;
|
||||
text-decoration: none;
|
||||
text-transform: uppercase;
|
||||
box-shadow: 0 4px 10px rgba(161, 17, 34, 0.4);
|
||||
transition: all 0.3s ease;
|
||||
letter-spacing: 0.5px;
|
||||
border: 1px solid #8e0b1b;
|
||||
}
|
||||
|
||||
.sbb-btn:hover {
|
||||
background: linear-gradient(180deg, #ee1f38 0%, #b81427 100%);
|
||||
box-shadow: 0 6px 15px rgba(161, 17, 34, 0.5);
|
||||
transform: translateY(-2px);
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
@media (max-width: 992px) {
|
||||
.sbb-container {
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
gap: 30px;
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
.sbb-left {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.sbb-right {
|
||||
align-items: center;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.sbb-title {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
|
||||
.sbb-features li {
|
||||
text-align: left;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="stroke-book-banner">
|
||||
<div class="sbb-container">
|
||||
<div class="sbb-left">
|
||||
<img src="/upload/sach-dot-quy-ngang.png" alt="Cẩm nang sức khỏe phòng chống đột quỵ">
|
||||
<div data-component-id="umass_base:block-multiple-ctas" data-background="solid" data-layout-variant="default">
|
||||
<div class="container" th:unless="${ctaMenu != null and not #lists.isEmpty(ctaMenu.items)}">
|
||||
<div class="text-container">
|
||||
<div data-component-id="umass_base:section-title" class="f--section-title">
|
||||
<h2>TÌM HIỂU<span class="highlight">CHUYÊN KHOA</span></h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sbb-right">
|
||||
<div class="sbb-subtitle">CẨM NANG SỨC KHỎE</div>
|
||||
<h2 class="sbb-title">PHÒNG CHỐNG ĐỘT QUỴ</h2>
|
||||
<div class="sbb-tagline">Hiểu đúng – Phòng sớm – Sống khỏe mỗi ngày</div>
|
||||
<ul class="sbb-features">
|
||||
<li>Kiến thức khoa học, dễ hiểu</li>
|
||||
<li>Nhận biết sớm dấu hiệu – Xử trí kịp thời</li>
|
||||
<li>Phòng ngừa hiệu quả – Giảm thiểu nguy cơ</li>
|
||||
<li>Dành cho mọi lứa tuổi</li>
|
||||
</ul>
|
||||
<a href="#" class="sbb-btn">TÌM HIỂU NGAY</a>
|
||||
<div class="links-container">
|
||||
[menu:CTA]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.links-container {
|
||||
display: grid !important;
|
||||
grid-template-columns: repeat(2, 1fr) !important;
|
||||
gap: 1rem;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
.links-container {
|
||||
grid-template-columns: 1fr !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,37 @@
|
||||
<div class="cc--component-container cc--news-events">
|
||||
<div class="c--component c--news-events">
|
||||
|
||||
<!-- Phần 2 cột: Tin mới (Trái) và Sự kiện (Phải) -->
|
||||
<div class="news-events-row">
|
||||
|
||||
<div class="news-column">
|
||||
<h3 class="section-title--news">
|
||||
TIN TỨC MỚI
|
||||
</h3>
|
||||
<div class="news-list">
|
||||
<!-- Shortcode Tin Tức hiển thị dạng list (tuỳ chỉnh lại limit cho phù hợp) -->
|
||||
[component:news-grid data-source="posts:tag=news,limit=2,collection=news_posts"]
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="events-column">
|
||||
<h3 class="events-title">
|
||||
SỰ KIỆN
|
||||
</h3>
|
||||
<div class="events-widget">
|
||||
<!-- Shortcode Sự kiện -->
|
||||
[component:events-list data-source="posts:tag=event,limit=4,collection=event_posts"]
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Header chung (Mobile) -->
|
||||
<div class="news-events-section__footer">
|
||||
<a href="/news/news-events" class="news-events-section__cta news-events-section__cta--mobile">
|
||||
Xem Thêm
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
+12
-3
@@ -53,13 +53,16 @@ public class ManagePostController {
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /manage/posts — List all posts with optional filters.
|
||||
* GET /manage/posts — List all posts with optional filters, search, and pagination.
|
||||
*/
|
||||
@GetMapping
|
||||
public String listPosts(@RequestParam(value = "categoryId", required = false) Long categoryId,
|
||||
@RequestParam(value = "status", required = false) String statusStr,
|
||||
@RequestParam(value = "search", required = false) String search,
|
||||
@RequestParam(value = "page", defaultValue = "0") int page,
|
||||
@RequestParam(value = "size", defaultValue = "10") int size,
|
||||
Model model) {
|
||||
LOG.debug("Request to list all posts (categoryId={}, status={})", categoryId, statusStr);
|
||||
LOG.debug("Request to list all posts (categoryId={}, status={}, search={}, page={}, size={})", categoryId, statusStr, search, page, size);
|
||||
|
||||
PageStatus status = null;
|
||||
if (statusStr != null && !statusStr.isBlank()) {
|
||||
@@ -70,11 +73,17 @@ public class ManagePostController {
|
||||
}
|
||||
}
|
||||
|
||||
model.addAttribute("posts", postService.findFiltered(categoryId, status));
|
||||
org.springframework.data.domain.Pageable pageable = org.springframework.data.domain.PageRequest.of(page, size, org.springframework.data.domain.Sort.by("createdDate").descending());
|
||||
org.springframework.data.domain.Page<com.sisvietnamvn.web.domain.Post> postPage = postService.findFilteredAndSearch(categoryId, status, search, pageable);
|
||||
|
||||
model.addAttribute("postPage", postPage);
|
||||
model.addAttribute("posts", postPage.getContent());
|
||||
model.addAttribute("categories", categoryService.findAll());
|
||||
model.addAttribute("statuses", PageStatus.values());
|
||||
model.addAttribute("selectedCategoryId", categoryId);
|
||||
model.addAttribute("selectedStatus", statusStr);
|
||||
model.addAttribute("selectedSearch", search);
|
||||
model.addAttribute("pageSize", size);
|
||||
return "manage/posts/list";
|
||||
}
|
||||
|
||||
|
||||
@@ -82,4 +82,16 @@ public interface PostRepository extends JpaRepository<Post, Long> {
|
||||
*/
|
||||
@Query("SELECT p FROM Post p JOIN p.tags t WHERE t.id = :tagId ORDER BY p.createdDate DESC")
|
||||
List<Post> findByTagId(@Param("tagId") Long tagId, org.springframework.data.domain.Pageable pageable);
|
||||
|
||||
/**
|
||||
* Find posts with filters, search text, and pagination.
|
||||
*/
|
||||
@org.springframework.data.jpa.repository.EntityGraph(attributePaths = {"category"})
|
||||
@Query("SELECT p FROM Post p WHERE (:categoryId IS NULL OR p.category.id = :categoryId) " +
|
||||
"AND (:status IS NULL OR p.status = :status) " +
|
||||
"AND (:search IS NULL OR LOWER(p.title) LIKE LOWER(:search) OR LOWER(p.excerpt) LIKE LOWER(:search))")
|
||||
org.springframework.data.domain.Page<Post> findFilteredAndSearch(@Param("categoryId") Long categoryId,
|
||||
@Param("status") PageStatus status,
|
||||
@Param("search") String search,
|
||||
org.springframework.data.domain.Pageable pageable);
|
||||
}
|
||||
|
||||
+26
-19
@@ -211,13 +211,23 @@ public class ComponentTemplateService {
|
||||
index++;
|
||||
}
|
||||
} else if (posts != null) {
|
||||
java.time.format.DateTimeFormatter monthFormatter = java.time.format.DateTimeFormatter.ofPattern("MMM").withZone(java.time.ZoneId.systemDefault());
|
||||
java.time.format.DateTimeFormatter monthFormatter = java.time.format.DateTimeFormatter.ofPattern("MM").withZone(java.time.ZoneId.systemDefault());
|
||||
java.time.format.DateTimeFormatter dayFormatter = java.time.format.DateTimeFormatter.ofPattern("dd").withZone(java.time.ZoneId.systemDefault());
|
||||
java.time.format.DateTimeFormatter timeFormatter = java.time.format.DateTimeFormatter.ofPattern("hh:mm a").withZone(java.time.ZoneId.systemDefault());
|
||||
for (com.sisvietnamvn.web.domain.Post post : posts) {
|
||||
String itemHtml = loopBody;
|
||||
String safeTitle = post.getTitle() != null ? org.springframework.web.util.HtmlUtils.htmlEscape(post.getTitle()) : "";
|
||||
String safeExcerpt = post.getExcerpt() != null ? org.springframework.web.util.HtmlUtils.htmlEscape(post.getExcerpt()) : "";
|
||||
String rawExcerpt = post.getExcerpt();
|
||||
if (rawExcerpt == null || rawExcerpt.trim().isEmpty()) {
|
||||
rawExcerpt = post.getMetaDescription();
|
||||
}
|
||||
if (rawExcerpt == null || rawExcerpt.trim().isEmpty()) {
|
||||
String rawContent = post.getContent();
|
||||
if (rawContent != null) {
|
||||
rawContent = rawContent.replaceAll("<[^>]*>", " ").replaceAll("\\s+", " ").trim();
|
||||
rawExcerpt = rawContent.length() > 150 ? rawContent.substring(0, 150) + "..." : rawContent;
|
||||
}
|
||||
}
|
||||
String safeExcerpt = rawExcerpt != null ? org.springframework.web.util.HtmlUtils.htmlEscape(rawExcerpt) : "";
|
||||
|
||||
itemHtml = itemHtml.replace("{{title}}", safeTitle);
|
||||
itemHtml = itemHtml.replace("{{slug}}", post.getSlug() != null ? post.getSlug() : "");
|
||||
@@ -232,18 +242,9 @@ public class ComponentTemplateService {
|
||||
if (post.getEventTime() != null) {
|
||||
itemHtml = itemHtml.replace("{{eventMonth}}", monthFormatter.format(post.getEventTime()));
|
||||
itemHtml = itemHtml.replace("{{eventDay}}", dayFormatter.format(post.getEventTime()));
|
||||
itemHtml = itemHtml.replace("{{eventTimeStr}}", timeFormatter.format(post.getEventTime()));
|
||||
} else {
|
||||
itemHtml = itemHtml.replace("{{eventMonth}}", "");
|
||||
itemHtml = itemHtml.replace("{{eventDay}}", "");
|
||||
itemHtml = itemHtml.replace("{{eventTimeStr}}", "");
|
||||
}
|
||||
|
||||
if (post.getLocation() != null && !post.getLocation().isEmpty()) {
|
||||
String locHtml = "<div class=\"event-location\">" + org.springframework.web.util.HtmlUtils.htmlEscape(post.getLocation()) + "</div>";
|
||||
itemHtml = itemHtml.replace("{{locationHtml}}", locHtml);
|
||||
} else {
|
||||
itemHtml = itemHtml.replace("{{locationHtml}}", "");
|
||||
}
|
||||
|
||||
itemHtml = itemHtml.replace("{{index}}", String.valueOf(index));
|
||||
@@ -275,13 +276,16 @@ public class ComponentTemplateService {
|
||||
Optional<ComponentTemplate> existing = templateRepository.findBySlug("news-grid");
|
||||
if (existing.isPresent()) {
|
||||
ComponentTemplate t = existing.get();
|
||||
if (t.getHtmlTemplate() == null || !t.getHtmlTemplate().contains("<style>")) {
|
||||
return; // Already clean
|
||||
if (t.getHtmlTemplate() == null || (!t.getHtmlTemplate().contains("<style>") && !t.getHtmlTemplate().contains("{{excerpt}}"))) {
|
||||
// If it doesn't have the excerpt yet, update it.
|
||||
t.setHtmlTemplate(getNewsGridHtml());
|
||||
templateRepository.save(t);
|
||||
LOG.info("Updated news-grid component template to include excerpt");
|
||||
} else if (t.getHtmlTemplate().contains("<style>")) {
|
||||
t.setHtmlTemplate(getNewsGridHtml());
|
||||
templateRepository.save(t);
|
||||
LOG.info("Cleaned up hardcoded CSS in news-grid component template");
|
||||
}
|
||||
// Update the existing one
|
||||
t.setHtmlTemplate(getNewsGridHtml());
|
||||
templateRepository.save(t);
|
||||
LOG.info("Cleaned up hardcoded CSS in news-grid component template");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -313,7 +317,10 @@ public class ComponentTemplateService {
|
||||
" <span>{{title}}</span>\n" +
|
||||
" </a>\n" +
|
||||
" </h3>\n" +
|
||||
" <div class=\"news-card__date\">{{date}}</div>\n" +
|
||||
" <div class=\"news-card__summary\" style=\"margin-top: 10px; font-size: 0.9em; color: #555; display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;\">\n" +
|
||||
" {{excerpt}}\n" +
|
||||
" </div>\n" +
|
||||
" <div class=\"news-card__date\" style=\"margin-top: auto; padding-top: 10px;\">{{date}}</div>\n" +
|
||||
" </div>\n" +
|
||||
" </article>\n" +
|
||||
"</div>\n" +
|
||||
|
||||
@@ -94,6 +94,19 @@ public class PostService {
|
||||
return postRepository.findAllByOrderByCreatedDateDesc();
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all posts filtered by category, status, and search string, with pagination.
|
||||
*/
|
||||
@Transactional(readOnly = true)
|
||||
public org.springframework.data.domain.Page<Post> findFilteredAndSearch(Long categoryId, PageStatus status, String search, org.springframework.data.domain.Pageable pageable) {
|
||||
LOG.debug("Request to get Posts filtered by categoryId={}, status={}, search={}", categoryId, status, search);
|
||||
String searchParam = (search != null && !search.trim().isEmpty()) ? "%" + search.trim() + "%" : null;
|
||||
org.springframework.data.domain.Page<Post> page = postRepository.findFilteredAndSearch(categoryId, status, searchParam, pageable);
|
||||
// Eagerly initialize tags within the transaction to avoid LazyInitializationException in Thymeleaf
|
||||
page.getContent().forEach(post -> org.hibernate.Hibernate.initialize(post.getTags()));
|
||||
return page;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save a post (create or update).
|
||||
* Auto-generates a URL slug from the title if the slug is empty.
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
--color-text-light: #ffffff;
|
||||
|
||||
/* Typography */
|
||||
--font-family-base: 'Open Sans', 'Inter', sans-serif;
|
||||
--font-family-heading: 'Lora', 'Georgia', serif;
|
||||
--font-family-base: 'Open Sans', Arial, Helvetica, sans-serif;
|
||||
--font-family-heading: 'Open Sans', Arial, Helvetica, sans-serif;
|
||||
|
||||
/* Spacing & Radii */
|
||||
--spacing-md: 20px;
|
||||
@@ -39,6 +39,11 @@
|
||||
/* ==========================================================================
|
||||
2. Global / Base Overrides
|
||||
========================================================================== */
|
||||
body, h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
|
||||
font-family: var(--font-family-base) !important;
|
||||
font-feature-settings: 'liga' off, 'clig' off !important;
|
||||
}
|
||||
|
||||
[data-component-id="umass_base:tophat"] {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
@@ -304,7 +309,7 @@
|
||||
height: 100%;
|
||||
display: flex;
|
||||
}
|
||||
.featured-grid__item .news-card--featured {
|
||||
/* .featured-grid__item .news-card--featured {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
@@ -317,7 +322,7 @@
|
||||
gap: 16px;
|
||||
background: #fff;
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
} */
|
||||
.featured-grid__item .news-card__image {
|
||||
flex: none;
|
||||
width: 100%;
|
||||
@@ -398,7 +403,7 @@
|
||||
height: 100%;
|
||||
display: flex;
|
||||
}
|
||||
.featured-grid__item .news-card--featured {
|
||||
/* .featured-grid__item .news-card--featured {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
@@ -411,11 +416,11 @@
|
||||
gap: 16px;
|
||||
background: #fff;
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
} */
|
||||
.featured-grid__item .news-card__image {
|
||||
flex: 0 0 170px;
|
||||
width: 100%;
|
||||
height: 170px;
|
||||
height: auto;
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
.featured-grid__item .news-card__image > div {
|
||||
@@ -528,4 +533,21 @@
|
||||
.mobile-only {
|
||||
display: none !important;
|
||||
}
|
||||
.news-events-section__footer {
|
||||
display: none;
|
||||
}
|
||||
.cc--footer .c--footer {
|
||||
padding: 36px 6.25%;
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Override for 4-column Stats Block --- */
|
||||
@media (min-width: 64rem) {
|
||||
.f--field.f--stats-block {
|
||||
grid-template-columns: repeat(4, 1fr) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.lc--layout-container ol li, .lc--layout-container ul li, .sg-pattern-example ol li, .sg-pattern-example ul li {
|
||||
font-weight: var(--font-weight-extrabold);
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 812 KiB After Width: | Height: | Size: 3.4 MiB |
@@ -41,12 +41,16 @@
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form th:action="@{/manage/posts}" method="get" class="form-inline">
|
||||
<div class="form-group mr-3 mb-2">
|
||||
<label for="filterSearch" class="mr-2 font-weight-bold">Search:</label>
|
||||
<input type="text" class="form-control form-control-sm" id="filterSearch" name="search" th:value="${selectedSearch}" placeholder="Title or content...">
|
||||
</div>
|
||||
<div class="form-group mr-3 mb-2">
|
||||
<label for="filterCategory" class="mr-2 font-weight-bold">Category:</label>
|
||||
<select class="form-control form-control-sm" id="filterCategory" name="categoryId">
|
||||
<option value="">All Categories</option>
|
||||
<option th:each="cat : ${categories}" th:value="${cat.id}" th:text="${cat.name}"
|
||||
th:selected="${selectedCategoryId != null && selectedCategoryId == cat.id}"></option>
|
||||
th:selected="${selectedCategoryId != null and selectedCategoryId == cat.id}"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group mr-3 mb-2">
|
||||
@@ -54,7 +58,16 @@
|
||||
<select class="form-control form-control-sm" id="filterStatus" name="status">
|
||||
<option value="">All Statuses</option>
|
||||
<option th:each="s : ${statuses}" th:value="${s}" th:text="${s}"
|
||||
th:selected="${selectedStatus != null && selectedStatus == s.name()}"></option>
|
||||
th:selected="${selectedStatus != null and selectedStatus == s.name()}"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group mr-3 mb-2">
|
||||
<label for="filterSize" class="mr-2 font-weight-bold">Show:</label>
|
||||
<select class="form-control form-control-sm" id="filterSize" name="size">
|
||||
<option value="10" th:selected="${pageSize == 10}">10</option>
|
||||
<option value="20" th:selected="${pageSize == 20}">20</option>
|
||||
<option value="50" th:selected="${pageSize == 50}">50</option>
|
||||
<option value="100" th:selected="${pageSize == 100}">100</option>
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-sm btn-primary mb-2 mr-2">
|
||||
@@ -89,7 +102,7 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="post, iterStat : ${posts}">
|
||||
<td th:text="${iterStat.count}"></td>
|
||||
<td th:text="${(postPage.number * postPage.size) + iterStat.count}"></td>
|
||||
<td>
|
||||
<a th:href="@{/manage/posts/{id}/edit(id=${post.id})}" class="font-weight-bold text-primary"
|
||||
th:text="${post.title}"></a>
|
||||
@@ -146,12 +159,38 @@
|
||||
<tr th:if="${#lists.isEmpty(posts)}">
|
||||
<td colspan="8" class="text-center text-muted py-4">
|
||||
<i class="fas fa-newspaper fa-2x mb-2 d-block"></i>
|
||||
No posts found. Click "Add New Post" to create one.
|
||||
No posts found.
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Pagination -->
|
||||
<div th:if="${postPage.totalPages gt 1}" class="d-flex justify-content-between align-items-center mt-3">
|
||||
<div>
|
||||
Showing <span th:text="${(postPage.number * postPage.size) + 1}"></span> to
|
||||
<span th:text="${(postPage.number * postPage.size) + postPage.numberOfElements}"></span> of
|
||||
<span th:text="${postPage.totalElements}"></span> entries
|
||||
</div>
|
||||
<nav>
|
||||
<ul class="pagination mb-0">
|
||||
<li class="page-item" th:classappend="${postPage.first ? 'disabled' : ''}">
|
||||
<a class="page-link" th:href="@{/manage/posts(page=${postPage.number - 1}, size=${pageSize}, categoryId=${selectedCategoryId}, status=${selectedStatus}, search=${selectedSearch})}">Previous</a>
|
||||
</li>
|
||||
|
||||
<li class="page-item" th:each="i : ${#numbers.sequence(0, postPage.totalPages - 1)}"
|
||||
th:classappend="${postPage.number == i ? 'active' : ''}">
|
||||
<a class="page-link" th:href="@{/manage/posts(page=${i}, size=${pageSize}, categoryId=${selectedCategoryId}, status=${selectedStatus}, search=${selectedSearch})}" th:text="${i + 1}"></a>
|
||||
</li>
|
||||
|
||||
<li class="page-item" th:classappend="${postPage.last ? 'disabled' : ''}">
|
||||
<a class="page-link" th:href="@{/manage/posts(page=${postPage.number + 1}, size=${pageSize}, categoryId=${selectedCategoryId}, status=${selectedStatus}, search=${selectedSearch})}">Next</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
.sis-footer-custom {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
padding: 40px 20px;
|
||||
padding: 0px 20px;
|
||||
gap: 60px;
|
||||
color: #fff;
|
||||
font-family: var(--font-family-base, 'Inter', sans-serif);
|
||||
@@ -186,6 +186,57 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.sis-footer-bottom {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
background-color: var(--color-brand); /* Slightly darker background for the bottom bar */
|
||||
font-size: 0.9rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
color: #fff;
|
||||
font-family: var(--font-family-base, 'Inter', sans-serif);
|
||||
}
|
||||
.sis-footer-links {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.sis-footer-links a {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
}
|
||||
.sis-footer-links a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.sis-footer-links span.separator {
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
.sis-footer-copyright {
|
||||
opacity: 0.8;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="sis-footer-bottom">
|
||||
<div class="sis-footer-links">
|
||||
<a href="#">Chính sách bảo mật</a>
|
||||
<span class="separator">|</span>
|
||||
<a href="#">Điều khoản dịch vụ</a>
|
||||
<span class="separator">|</span>
|
||||
<a href="#">Quy định sử dụng</a>
|
||||
<span class="separator">|</span>
|
||||
<a href="#">Chính sách Cookie</a>
|
||||
</div>
|
||||
<div class="sis-footer-copyright">
|
||||
Copyright ©2025. Bệnh viện Đa Khoa Quốc Tế S.I.S Cần Thơ.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -116,14 +116,14 @@
|
||||
flex: 1;
|
||||
}
|
||||
.mega-col-info h3 {
|
||||
color: #00529b; /* Classic medical blue */
|
||||
color: var(--color-brand);
|
||||
font-size: 24px;
|
||||
font-weight: 700;
|
||||
margin-top: 0;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.mega-col-info p {
|
||||
color: #4b5563;
|
||||
color: var(--color-black);
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
@@ -254,9 +254,9 @@
|
||||
<!-- Column 1: Info (Title and Text) -->
|
||||
<div class="mega-col-info">
|
||||
<h3 th:text="${item.label}">Về Bệnh viện</h3>
|
||||
<p th:if="${item.label == 'Về Bệnh viện' or item.label == 'VỀ BỆNH VIỆN'}">Bệnh viện Đột quỵ Quốc tế tự hào là đơn vị tiên phong trong việc cung cấp dịch vụ khám chữa bệnh chất lượng cao, mang lại sự tin cậy và an tâm cho bệnh nhân.</p>
|
||||
<p th:if="${item.label == 'Chuyên khoa' or item.label == 'CHUYÊN KHOA'}">Khám phá các chuyên khoa hàng đầu với đội ngũ bác sĩ chuyên môn cao, trang thiết bị y tế hiện đại đạt tiêu chuẩn quốc tế.</p>
|
||||
<p th:if="${item.label != 'Về Bệnh viện' and item.label != 'VỀ BỆNH VIỆN' and item.label != 'Chuyên khoa' and item.label != 'CHUYÊN KHOA'}">Khám phá thêm thông tin chi tiết về các dịch vụ, chuyên gia và hoạt động của chúng tôi để bảo vệ sức khỏe của bạn.</p>
|
||||
<p th:if="${item.label == 'Về Bệnh viện' or item.label == 'VỀ BỆNH VIỆN'}" style="text-transform: math-auto;">Bệnh viện Đột quỵ Quốc tế tự hào là đơn vị tiên phong trong việc cung cấp dịch vụ khám chữa bệnh chất lượng cao, mang lại sự tin cậy và an tâm cho bệnh nhân.</p>
|
||||
<p th:if="${item.label == 'Chuyên khoa' or item.label == 'CHUYÊN KHOA'}" style="text-transform: math-auto;">Khám phá các chuyên khoa hàng đầu với đội ngũ bác sĩ chuyên môn cao, trang thiết bị y tế hiện đại đạt tiêu chuẩn quốc tế.</p>
|
||||
<p th:if="${item.label != 'Về Bệnh viện' and item.label != 'VỀ BỆNH VIỆN' and item.label != 'Chuyên khoa' and item.label != 'CHUYÊN KHOA'}" style="text-transform: math-auto;">Khám phá thêm thông tin chi tiết về các dịch vụ, chuyên gia và hoạt động của chúng tôi để bảo vệ sức khỏe của bạn.</p>
|
||||
</div>
|
||||
|
||||
<!-- Column 2: The actual Submenu Links -->
|
||||
|
||||
Reference in New Issue
Block a user