Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9b6e188df8 | |||
| ee6b2a8919 | |||
| 0f551bd5c7 |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+72
-36
@@ -186,46 +186,82 @@ To configure CI for your project, run the ci-cd sub-generator (`jhipster ci-cd`)
|
|||||||
- [Node.js](https://nodejs.org/)
|
- [Node.js](https://nodejs.org/)
|
||||||
- [NPM](https://www.npmjs.com/)
|
- [NPM](https://www.npmjs.com/)
|
||||||
|
|
||||||
#Structure
|
## Deployment Guide (Ubuntu server + aaPanel + Executable JAR)
|
||||||
|
|
||||||
Using NGINX (via aaPanel) with Tomcat is a very common and recommended setup. In this architecture, NGINX acts as a Reverse Proxy. It handles incoming internet traffic (ports 80 and 443 for SSL) and forwards the requests to your Tomcat application running in the background (usually on port 8080).
|
### 1. Build the JAR file (on Windows)
|
||||||
|
Spring Boot applications come with a built-in web server, meaning you can package your entire application into a single executable `.jar` file!
|
||||||
|
Run the following command on your Windows PC to build the production-ready `.jar` file:
|
||||||
|
```powershell
|
||||||
|
./gradlew -Pprod clean bootJar
|
||||||
|
```
|
||||||
|
Alternatively, you can use the built-in npm script:
|
||||||
|
```powershell
|
||||||
|
npm run java:jar:prod
|
||||||
|
```
|
||||||
|
The generated `.jar` file will be located at `build/libs/sisvietnamvn-1.0.3.jar`.
|
||||||
|
|
||||||
Here is the step-by-step guide to setting this up in aaPanel:
|
### 2. Deploy and Run the application (on Ubuntu Server)
|
||||||
|
|
||||||
Step 1: Start your Tomcat/Spring Boot App
|
You have two main options to run the application on Ubuntu: using **aaPanel** or using standard **systemd**.
|
||||||
Make sure your application is running. By default, your project seems to run on port 8080.
|
|
||||||
|
|
||||||
If using embedded Tomcat: Run your .jar file in the background (e.g., nohup java -jar your-app.jar --spring.profiles.active=prod &).
|
#### Option A: Using aaPanel (Recommended)
|
||||||
If using standalone Tomcat: Ensure Tomcat is started and the app is deployed.
|
If you are using aaPanel, it is highly recommended to use its built-in **Java Project** manager to easily run the JAR file.
|
||||||
Step 2: Configure the Website in aaPanel
|
|
||||||
Log in to your aaPanel dashboard.
|
|
||||||
Go to the Website menu on the left sidebar.
|
|
||||||
Click Add site (if you haven't already).
|
|
||||||
Enter your domain name (e.g., sisvietnam.vn).
|
|
||||||
For PHP version, select Static (since Java handles the backend, you don't need PHP).
|
|
||||||
Click Submit to create the site.
|
|
||||||
Step 3: Set up the Reverse Proxy
|
|
||||||
In the Website list, click on the Settings button for your newly created domain.
|
|
||||||
In the settings window, click on the Reverse proxy tab on the left.
|
|
||||||
Click Add reverse proxy and fill in the details:
|
|
||||||
Proxy name: Give it any name (e.g., TomcatProxy).
|
|
||||||
Target URL: Enter http://127.0.0.1:8080 (Change 8080 if your app is running on a different port).
|
|
||||||
Sent Domain: Leave it as $host (the default).
|
|
||||||
Click Submit.
|
|
||||||
Step 4: Configure Spring Boot to Trust the Proxy (Crucial)
|
|
||||||
Because NGINX sits in front of your app, Tomcat will think all requests are coming from 127.0.0.1 instead of the user's real IP, and it might get confused about http vs https (which breaks redirects and security).
|
|
||||||
|
|
||||||
To fix this, you need to tell your Spring Boot app to read the headers forwarded by NGINX. Open your src/main/resources/config/application-prod.yml (or application.yml) and add:
|
1. **Install Java 21**: Make sure Java 21 is installed on your Ubuntu server via aaPanel.
|
||||||
|
2. **Upload the JAR**: Upload the `sisvietnamvn-1.0.3.jar` file to a folder on your server (e.g., `/www/wwwroot/sisvietnam.vn/`).
|
||||||
|
3. **Add Java Project**: In aaPanel, go to **Website** -> **Java Project** -> **Add Java project**.
|
||||||
|
4. **Configure Project**:
|
||||||
|
- **Project Type**: `Spring_boot`
|
||||||
|
- **Project jar**: Select the `sisvietnamvn-1.0.3.jar` file you just uploaded.
|
||||||
|
- **Project Port**: `8080` (or whichever port your app is configured to use).
|
||||||
|
- **Run user**: `www` (or `root`)
|
||||||
|
- Click **Submit**. aaPanel will automatically run your JAR file in the background!
|
||||||
|
|
||||||
yaml
|
#### Option B: Using systemd (Standard Ubuntu)
|
||||||
server:
|
If you prefer managing the server manually via terminal, you can register the JAR as a `systemd` service so it runs continuously in the background and starts automatically on boot.
|
||||||
forward-headers-strategy: framework
|
|
||||||
(Note: JHipster usually configures this automatically for the prod profile, but it is good to double-check).
|
|
||||||
|
|
||||||
Summary of How it Works Now:
|
1. **Upload the JAR**: Upload the `sisvietnamvn-1.0.3.jar` file to your server (e.g., `/var/www/sisvietnam/sisvietnamvn.jar`).
|
||||||
A user visits https://your-domain.com.
|
2. **Create the Service File**:
|
||||||
NGINX (aaPanel) receives the request on port 443.
|
```bash
|
||||||
NGINX forwards the request to http://127.0.0.1:8080.
|
sudo nano /etc/systemd/system/sisvietnam.service
|
||||||
Tomcat (Java) processes the request and sends the HTML/JSON back to NGINX.
|
```
|
||||||
NGINX sends the response back to the user.
|
3. **Add Configuration**: Paste the following, making sure the `ExecStart` path matches where you put the jar.
|
||||||
You can also use aaPanel's built-in SSL manager to easily apply Let's Encrypt certificates to your NGINX site, and your Tomcat backend won't need to worry about SSL certificates at all!
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=SIS Vietnam Spring Boot Application
|
||||||
|
After=syslog.target network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=root
|
||||||
|
ExecStart=/usr/bin/java -jar /var/www/sisvietnam/sisvietnamvn.jar
|
||||||
|
SuccessExitStatus=143
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
4. **Start the Service**: Run the following commands to reload systemd, enable the service to start on boot, and start it now:
|
||||||
|
```bash
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable sisvietnam.service
|
||||||
|
sudo systemctl start sisvietnam.service
|
||||||
|
```
|
||||||
|
5. **Check Status & Logs**:
|
||||||
|
- To check if it's running: `sudo systemctl status sisvietnam.service`
|
||||||
|
- To view the live terminal output: `sudo journalctl -u sisvietnam.service -f`
|
||||||
|
|
||||||
|
### 3. Configure NGINX Reverse Proxy (aaPanel)
|
||||||
|
When you set up a Java Project in aaPanel, it can automatically map your domain and set up a reverse proxy. If you need to verify or set it up manually:
|
||||||
|
|
||||||
|
1. **Add Site**: Go to aaPanel -> Website -> Add site. Enter your domain (e.g., `sisvietnam.vn`) and select **Static** for the PHP version.
|
||||||
|
2. **Setup Reverse Proxy**: Click "Settings" for the site -> "Reverse proxy" -> "Add reverse proxy".
|
||||||
|
- **Proxy name**: `JavaProxy`
|
||||||
|
- **Target URL**: `http://127.0.0.1:8080`
|
||||||
|
- **Sent Domain**: `$host`
|
||||||
|
3. **Spring Boot Proxy Trust**: Ensure Spring Boot knows it is behind a proxy so it can read client IPs correctly. In `src/main/resources/config/application-prod.yml`, verify this exists:
|
||||||
|
```yaml
|
||||||
|
server:
|
||||||
|
forward-headers-strategy: framework
|
||||||
|
```
|
||||||
|
4. **SSL**: Use aaPanel's built-in SSL manager to apply Let's Encrypt certificates to your NGINX site. You don't need to configure SSL inside Spring Boot itself.
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
const fs = require('fs');
|
|
||||||
|
|
||||||
const aboutPath = 'd:\\website_sisvietnam_moi\\website_sisvietnam.vn\\sisvietnamvn\\src\\main\\resources\\templates\\about.html';
|
|
||||||
const layoutPath = 'd:\\website_sisvietnam_moi\\website_sisvietnam.vn\\sisvietnamvn\\src\\main\\resources\\templates\\fragments\\layout.html';
|
|
||||||
const footerPath = 'd:\\website_sisvietnam_moi\\website_sisvietnam.vn\\sisvietnamvn\\src\\main\\resources\\templates\\fragments\\footer.html';
|
|
||||||
|
|
||||||
let aboutHtml = fs.readFileSync(aboutPath, 'utf8');
|
|
||||||
let layoutHtml = fs.readFileSync(layoutPath, 'utf8');
|
|
||||||
|
|
||||||
// 1. Extract Head
|
|
||||||
const headMatch = aboutHtml.match(/<head>([\s\S]*?)<\/head>/i);
|
|
||||||
const headContent = headMatch ? headMatch[1] : '';
|
|
||||||
|
|
||||||
// 2. Extract Main Content (everything between </header> and <footer ...>)
|
|
||||||
const mainMatch = aboutHtml.match(/<\/header>([\s\S]*?)<footer/i);
|
|
||||||
let mainContent = mainMatch ? mainMatch[1] : '';
|
|
||||||
// The match stops at `<footer`, so it doesn't include it.
|
|
||||||
|
|
||||||
// 3. Extract Footer (from <footer id="l--main-footer"... to </footer>)
|
|
||||||
const footerMatch = aboutHtml.match(/(<footer id="l--main-footer"[\s\S]*?<\/footer>)/i);
|
|
||||||
let footerContent = footerMatch ? footerMatch[1] : '';
|
|
||||||
|
|
||||||
// Create footer.html with fragment
|
|
||||||
footerContent = footerContent.replace('<footer id="l--main-footer" class="site-footer">', '<footer id="l--main-footer" class="site-footer" th:fragment="footer">');
|
|
||||||
fs.writeFileSync(footerPath, footerContent, 'utf8');
|
|
||||||
|
|
||||||
// Update layout.html to include footer
|
|
||||||
layoutHtml = layoutHtml.replace(/<footer>[\s\S]*?<\/footer>/i, '<footer th:replace="~{fragments/footer :: footer}"></footer>');
|
|
||||||
fs.writeFileSync(layoutPath, layoutHtml, 'utf8');
|
|
||||||
|
|
||||||
// Construct new about.html
|
|
||||||
const newAboutHtml = `<!DOCTYPE html>
|
|
||||||
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{fragments/layout}">
|
|
||||||
<head>
|
|
||||||
<th:block layout:fragment="head">
|
|
||||||
${headContent}
|
|
||||||
</th:block>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div layout:fragment="content" class="dialog-off-canvas-main-canvas umass-platform-homepage path-node page-node-type-landing-page landing-page transparent-header" data-off-canvas-main-canvas="">
|
|
||||||
${mainContent}
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
`;
|
|
||||||
|
|
||||||
fs.writeFileSync(aboutPath, newAboutHtml, 'utf8');
|
|
||||||
|
|
||||||
console.log("Transformation completed successfully!");
|
|
||||||
@@ -12,7 +12,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = "com.sisvietnamvn.web"
|
group = "com.sisvietnamvn.web"
|
||||||
version = "0.0.1-SNAPSHOT"
|
version = "1.0.4"
|
||||||
|
|
||||||
description = ""
|
description = ""
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
./gradlew -Pprod clean bootJar
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
const fs = require('fs');
|
|
||||||
const path = 'd:\\website_sisvietnam_moi\\website_sisvietnam.vn\\sisvietnamvn\\src\\main\\resources\\templates\\about.html';
|
|
||||||
|
|
||||||
let content = fs.readFileSync(path, 'utf8');
|
|
||||||
|
|
||||||
// Replace UMass Undergraduate specific files with the ones from the main UMass Amherst folder if we want, or just leave it.
|
|
||||||
// But since the folder was created while bootRun is active, let's use a gradle command to process resources.
|
|
||||||
// However, fixing the image links is important.
|
|
||||||
content = content.replace(/\/sites\/default\/files\/styles\/[^"'\s]+/gi, '/images/LogoSIS.svg');
|
|
||||||
|
|
||||||
// Also fix manifest 404
|
|
||||||
content = content.replace(/<link rel="manifest" href="[^"]+">/gi, '');
|
|
||||||
|
|
||||||
fs.writeFileSync(path, content, 'utf8');
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
$path = 'd:\website_sisvietnam_moi\website_sisvietnam.vn\sisvietnamvn\src\main\resources\templates\about.html'
|
|
||||||
$content = Get-Content -Raw -Path $path -Encoding UTF8
|
|
||||||
$content = $content -replace '/sites/default/files/styles/[^"''\s]+', '/images/LogoSIS.svg'
|
|
||||||
$content = $content -replace '<link rel="manifest" href="[^"]+">', ''
|
|
||||||
Set-Content -Path $path -Value $content -Encoding UTF8
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# This configuration is intended for development purpose, it's **your** responsibility to harden it for production
|
||||||
|
name: sisvietnam-oracle
|
||||||
|
services:
|
||||||
|
sisvietnam-oracle:
|
||||||
|
image: gvenzl/oracle-free:23-slim-faststart
|
||||||
|
environment:
|
||||||
|
# Password for the SYS and SYSTEM admin accounts
|
||||||
|
- ORACLE_PASSWORD=Oracle123!
|
||||||
|
# Name of the pluggable database
|
||||||
|
- ORACLE_DATABASE=sisvietnam
|
||||||
|
# Create an app user and password automatically
|
||||||
|
- APP_USER=sisvietnam
|
||||||
|
- APP_USER_PASSWORD=sisvietnam
|
||||||
|
ports:
|
||||||
|
- "1521:1521"
|
||||||
|
# Uncomment the following lines to make the database data persistent across restarts
|
||||||
|
# volumes:
|
||||||
|
# - ~/oracle-data:/opt/oracle/oradata
|
||||||
@@ -26,14 +26,13 @@ management:
|
|||||||
enabled: false
|
enabled: false
|
||||||
|
|
||||||
spring:
|
spring:
|
||||||
devtools:
|
|
||||||
restart:
|
|
||||||
enabled: false
|
|
||||||
livereload:
|
|
||||||
enabled: false
|
|
||||||
datasource:
|
datasource:
|
||||||
type: com.zaxxer.hikari.HikariDataSource
|
type: com.zaxxer.hikari.HikariDataSource
|
||||||
url: jdbc:oracle:thin:@localhost:1521:xe
|
# BEFORE: jdbc:oracle:thin:@oracle-db:1521:xe
|
||||||
|
# AFTER (notice the slash instead of the colon!):
|
||||||
|
url: jdbc:oracle:thin:@oracle-db:1521/XEPDB1
|
||||||
|
username: sisvietnamvn
|
||||||
|
password: my_secure_password123
|
||||||
hikari:
|
hikari:
|
||||||
poolName: Hikari
|
poolName: Hikari
|
||||||
auto-commit: false
|
auto-commit: false
|
||||||
@@ -90,6 +89,8 @@ jhipster:
|
|||||||
security:
|
security:
|
||||||
authentication:
|
authentication:
|
||||||
jwt:
|
jwt:
|
||||||
|
# This is a securely generated base64 secret required for production tokens
|
||||||
|
base64-secret: OTMzNWRiNGQ4YTk2OWUxZmE2NDg3NTE1MTQ4ZGI1NmM1NjRiMDk0ODhkYzg3OGJmZTc4ZTA2NmU1ZmZlZjQxYmFhZjZhMjFjMzFlMjllYWViOWFlMjdhYjY1NDQxNTVlOGRiMTEwNTFiNWM4NGNiZGMyODRlNmZhZGVkNWFiNDk=
|
||||||
# Token is valid 24 hours
|
# Token is valid 24 hours
|
||||||
token-validity-in-seconds: 86400
|
token-validity-in-seconds: 86400
|
||||||
token-validity-in-seconds-for-remember-me: 2592000
|
token-validity-in-seconds-for-remember-me: 2592000
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
/* Custom CSS - This file has the highest priority and will override other styles */
|
||||||
|
[data-component-id="umass_base:tophat"] {
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Creates an overlay gradient on top of the ambient video */
|
||||||
|
.f--ambient-video {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.f--ambient-video::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 50%;
|
||||||
|
/* Adjust how far up the gradient goes */
|
||||||
|
background-image: linear-gradient(180deg, transparent, #000);
|
||||||
|
pointer-events: none;
|
||||||
|
/* Allows clicks to pass through to the video controls */
|
||||||
|
z-index: 1;
|
||||||
|
/* Ensures it sits above the video */
|
||||||
|
}
|
||||||
@@ -37,14 +37,37 @@ img {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Colors */
|
/* Colors */
|
||||||
.text-red { color: #881c1c; }
|
.text-red {
|
||||||
.text-black { color: #000; }
|
color: #881c1c;
|
||||||
.text-grey { color: #666; }
|
}
|
||||||
.text-light { color: #fff; }
|
|
||||||
.bg-red { background: #881c1c; }
|
.text-black {
|
||||||
.bg-black { background: #111; }
|
color: #000;
|
||||||
.bg-grey { background: #f4f4f4; }
|
}
|
||||||
.bg-light-grey { background: #e5e5e5; }
|
|
||||||
|
.text-grey {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-light {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-red {
|
||||||
|
background: #881c1c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-black {
|
||||||
|
background: #111;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-grey {
|
||||||
|
background: #f4f4f4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-light-grey {
|
||||||
|
background: #e5e5e5;
|
||||||
|
}
|
||||||
|
|
||||||
/* Buttons */
|
/* Buttons */
|
||||||
.btn {
|
.btn {
|
||||||
@@ -56,22 +79,27 @@ img {
|
|||||||
transition: all 0.2s;
|
transition: all 0.2s;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-red {
|
.btn-red {
|
||||||
background: #881c1c;
|
background: #881c1c;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-red:hover {
|
.btn-red:hover {
|
||||||
background: #6b1515;
|
background: #6b1515;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-red-outline {
|
.btn-red-outline {
|
||||||
border: 2px solid #881c1c;
|
border: 2px solid #881c1c;
|
||||||
color: #881c1c;
|
color: #881c1c;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-red-outline:hover {
|
.btn-red-outline:hover {
|
||||||
background: #881c1c;
|
background: #881c1c;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-red-fill {
|
.btn-red-fill {
|
||||||
background: #881c1c;
|
background: #881c1c;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
@@ -89,44 +117,58 @@ img {
|
|||||||
/* ================= HEADER ================= */
|
/* ================= HEADER ================= */
|
||||||
.header {
|
.header {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0; left: 0; width: 100%;
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
padding: 30px 0;
|
padding: 30px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-inner {
|
.header-inner {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
|
|
||||||
.logo {
|
.logo {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
line-height: 1.2;
|
line-height: 1.2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.logo-light {
|
.logo-light {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
}
|
}
|
||||||
|
|
||||||
.logo-bold {
|
.logo-bold {
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#umass_base:tophat {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
.nav-right {
|
.nav-right {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
}
|
}
|
||||||
|
|
||||||
.top-nav {
|
.top-nav {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 20px;
|
gap: 20px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.top-nav a {
|
.top-nav a {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-btn {
|
.search-btn {
|
||||||
background: #881c1c;
|
background: #881c1c;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
@@ -138,10 +180,12 @@ img {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.main-nav {
|
.main-nav {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 24px;
|
gap: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.main-nav a {
|
.main-nav a {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
@@ -149,8 +193,13 @@ img {
|
|||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mobile-only { display: none; }
|
.mobile-only {
|
||||||
.desktop-only { display: flex; }
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.desktop-only {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
/* ================= HERO ================= */
|
/* ================= HERO ================= */
|
||||||
.hero {
|
.hero {
|
||||||
@@ -159,6 +208,7 @@ img {
|
|||||||
min-height: 600px;
|
min-height: 600px;
|
||||||
background: #000;
|
background: #000;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-bg {
|
.hero-bg {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
@@ -168,26 +218,34 @@ img {
|
|||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-overlay {
|
.hero-overlay {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0; left: 0; width: 100%; height: 100%;
|
top: 0;
|
||||||
background: linear-gradient(to bottom, rgba(0,0,0,0.6) 0%, transparent 30%, transparent 60%, rgba(0,0,0,0.8) 100%);
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(to bottom, rgba(0, 0, 0, 0.6) 0%, transparent 30%, transparent 60%, rgba(0, 0, 0, 0.8) 100%);
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-content {
|
.hero-content {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 60px;
|
bottom: 60px;
|
||||||
left: 0; right: 0;
|
left: 0;
|
||||||
|
right: 0;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
padding-left: 20px;
|
padding-left: 20px;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-title {
|
.hero-title {
|
||||||
font-size: 56px;
|
font-size: 56px;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-desc {
|
.hero-desc {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
@@ -199,25 +257,30 @@ img {
|
|||||||
padding: 60px 0;
|
padding: 60px 0;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.step-into-inner {
|
.step-into-inner {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
gap: 80px;
|
gap: 80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.step-into-title {
|
.step-into-title {
|
||||||
font-size: 32px;
|
font-size: 32px;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
line-height: 1.1;
|
line-height: 1.1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.step-into-links {
|
.step-into-links {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 80px;
|
gap: 80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.link-col {
|
.link-col {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 15px;
|
gap: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.link-col a {
|
.link-col a {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
@@ -229,6 +292,7 @@ img {
|
|||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid #eee;
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.link-col a .arrow {
|
.link-col a .arrow {
|
||||||
color: #881c1c;
|
color: #881c1c;
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
@@ -239,13 +303,16 @@ img {
|
|||||||
background: #111;
|
background: #111;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.whats-life-inner {
|
.whats-life-inner {
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
}
|
}
|
||||||
|
|
||||||
.whats-life-text {
|
.whats-life-text {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
padding: 80px 60px 80px 0;
|
padding: 80px 60px 80px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabs {
|
.tabs {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 20px;
|
gap: 20px;
|
||||||
@@ -253,41 +320,50 @@ img {
|
|||||||
border-bottom: 1px solid #333;
|
border-bottom: 1px solid #333;
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab {
|
.tab {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #888;
|
color: #888;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab.active {
|
.tab.active {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-bottom: 2px solid #fff;
|
border-bottom: 2px solid #fff;
|
||||||
padding-bottom: 11px;
|
padding-bottom: 11px;
|
||||||
margin-bottom: -12px;
|
margin-bottom: -12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.whats-life-text .subtitle {
|
.whats-life-text .subtitle {
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.whats-life-text .desc {
|
.whats-life-text .desc {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.whats-life-media {
|
.whats-life-media {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.whats-life-media img {
|
.whats-life-media img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
.play-icon {
|
.play-icon {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 50%; left: 50%;
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
width: 60px; height: 60px;
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
background: #881c1c;
|
background: #881c1c;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border: none;
|
border: none;
|
||||||
@@ -297,7 +373,8 @@ img {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
padding-left: 5px; /* center play triangle */
|
padding-left: 5px;
|
||||||
|
/* center play triangle */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================= STATS ================= */
|
/* ================= STATS ================= */
|
||||||
@@ -306,15 +383,18 @@ img {
|
|||||||
background: #fff;
|
background: #fff;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stats-inner {
|
.stats-inner {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
gap: 100px;
|
gap: 100px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stat-number {
|
.stat-number {
|
||||||
font-size: 48px;
|
font-size: 48px;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stat-text {
|
.stat-text {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
@@ -326,32 +406,42 @@ img {
|
|||||||
padding: 80px 0;
|
padding: 80px 0;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.excellence-grid {
|
.excellence-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr 1fr;
|
grid-template-columns: 1fr 1fr;
|
||||||
gap: 40px;
|
gap: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.exc-col-left .desc {
|
.exc-col-left .desc {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
}
|
}
|
||||||
.mt-large { margin-top: 60px; }
|
|
||||||
|
.mt-large {
|
||||||
|
margin-top: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
.story-card {
|
.story-card {
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.story-card img {
|
.story-card img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.story-card.has-bg .story-content {
|
.story-card.has-bg .story-content {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0; left: 0; width: 100%;
|
bottom: 0;
|
||||||
background: linear-gradient(transparent, rgba(0,0,0,0.8));
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
background: linear-gradient(transparent, rgba(0, 0, 0, 0.8));
|
||||||
padding: 40px 30px 20px;
|
padding: 40px 30px 20px;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tag {
|
.tag {
|
||||||
display: block;
|
display: block;
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
@@ -359,19 +449,23 @@ img {
|
|||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.story-content h3 {
|
.story-content h3 {
|
||||||
font-size: 22px;
|
font-size: 22px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
line-height: 1.2;
|
line-height: 1.2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.story-content p {
|
.story-content p {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
opacity: 0.9;
|
opacity: 0.9;
|
||||||
}
|
}
|
||||||
|
|
||||||
.story-card.large h3 {
|
.story-card.large h3 {
|
||||||
font-size: 28px;
|
font-size: 28px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sub-grid {
|
.sub-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr 1fr;
|
grid-template-columns: 1fr 1fr;
|
||||||
@@ -379,12 +473,44 @@ img {
|
|||||||
gap: 0;
|
gap: 0;
|
||||||
height: 300px;
|
height: 300px;
|
||||||
}
|
}
|
||||||
.box-black { background: #000; padding: 30px; color: #fff; display: flex; flex-direction: column; justify-content: center; }
|
|
||||||
.box-red { background: #881c1c; padding: 30px; color: #fff; display: flex; flex-direction: column; justify-content: center; }
|
.box-black {
|
||||||
.box-grey { background: #444; padding: 30px; color: #fff; display: flex; flex-direction: column; justify-content: center; }
|
background: #000;
|
||||||
.play-box { background: #f4f4f4; display: flex; align-items: center; justify-content: center; }
|
padding: 30px;
|
||||||
|
color: #fff;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box-red {
|
||||||
|
background: #881c1c;
|
||||||
|
padding: 30px;
|
||||||
|
color: #fff;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box-grey {
|
||||||
|
background: #444;
|
||||||
|
padding: 30px;
|
||||||
|
color: #fff;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.play-box {
|
||||||
|
background: #f4f4f4;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
.play-icon-large {
|
.play-icon-large {
|
||||||
width: 80px; height: 80px;
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
background: #881c1c;
|
background: #881c1c;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
@@ -399,25 +525,35 @@ img {
|
|||||||
padding: 80px 0;
|
padding: 80px 0;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
.max-w-800 { max-width: 800px; margin-bottom: 40px; font-size: 15px; }
|
|
||||||
|
.max-w-800 {
|
||||||
|
max-width: 800px;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
.card-grid-3 {
|
.card-grid-3 {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(3, 1fr);
|
grid-template-columns: repeat(3, 1fr);
|
||||||
gap: 30px;
|
gap: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-img img {
|
.card-img img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
aspect-ratio: 3/2;
|
aspect-ratio: 3/2;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-body {
|
.card-body {
|
||||||
padding: 20px 0;
|
padding: 20px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-body h3 {
|
.card-body h3 {
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-body p {
|
.card-body p {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #555;
|
color: #555;
|
||||||
@@ -428,28 +564,38 @@ img {
|
|||||||
padding: 60px 0;
|
padding: 60px 0;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
.text-center { text-align: center; }
|
|
||||||
|
.text-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
.apply-buttons {
|
.apply-buttons {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
gap: 20px;
|
gap: 20px;
|
||||||
}
|
}
|
||||||
.apply-buttons .btn { width: 180px; }
|
|
||||||
|
.apply-buttons .btn {
|
||||||
|
width: 180px;
|
||||||
|
}
|
||||||
|
|
||||||
/* ================= I'M LOOKING FOR ================= */
|
/* ================= I'M LOOKING FOR ================= */
|
||||||
.looking-for {
|
.looking-for {
|
||||||
padding: 80px 0;
|
padding: 80px 0;
|
||||||
background: #e5e5e5;
|
background: #e5e5e5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.looking-grid {
|
.looking-grid {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 60px;
|
gap: 60px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.looking-grid .col {
|
.looking-grid .col {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
.looking-grid .col a {
|
.looking-grid .col a {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
@@ -460,54 +606,70 @@ img {
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #000;
|
color: #000;
|
||||||
}
|
}
|
||||||
.looking-grid .col a .arrow { font-size: 10px; color: #881c1c; }
|
|
||||||
|
.looking-grid .col a .arrow {
|
||||||
|
font-size: 10px;
|
||||||
|
color: #881c1c;
|
||||||
|
}
|
||||||
|
|
||||||
/* ================= NEWS & EVENTS ================= */
|
/* ================= NEWS & EVENTS ================= */
|
||||||
.news-events {
|
.news-events {
|
||||||
padding: 80px 0;
|
padding: 80px 0;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-layout {
|
.news-layout {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 60% 35%;
|
grid-template-columns: 60% 35%;
|
||||||
gap: 5%;
|
gap: 5%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-main img {
|
.news-main img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
aspect-ratio: 16/9;
|
aspect-ratio: 16/9;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
.mt-small { margin-top: 20px; }
|
|
||||||
|
.mt-small {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
.news-main-title {
|
.news-main-title {
|
||||||
font-size: 28px;
|
font-size: 28px;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
margin: 10px 0;
|
margin: 10px 0;
|
||||||
line-height: 1.2;
|
line-height: 1.2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-main-desc {
|
.news-main-desc {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
color: #444;
|
color: #444;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-sidebar {
|
.news-sidebar {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 30px;
|
gap: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-small {
|
.news-small {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 15px;
|
gap: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-small img {
|
.news-small img {
|
||||||
width: 140px;
|
width: 140px;
|
||||||
height: 100px;
|
height: 100px;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-info h4 {
|
.news-info h4 {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
margin: 5px 0;
|
margin: 5px 0;
|
||||||
line-height: 1.3;
|
line-height: 1.3;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-info p {
|
.news-info p {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #666;
|
color: #666;
|
||||||
@@ -519,17 +681,31 @@ img {
|
|||||||
gap: 20px;
|
gap: 20px;
|
||||||
margin-top: 60px;
|
margin-top: 60px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.event-card img {
|
.event-card img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
aspect-ratio: 3/2;
|
aspect-ratio: 3/2;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
.event-info {
|
.event-info {
|
||||||
padding: 15px 0;
|
padding: 15px 0;
|
||||||
}
|
}
|
||||||
.event-info .date { font-weight: 800; font-size: 12px; }
|
|
||||||
.event-info h4 { font-size: 16px; font-weight: 700; margin: 5px 0; }
|
.event-info .date {
|
||||||
.event-info .type { font-size: 13px; }
|
font-weight: 800;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.event-info h4 {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 700;
|
||||||
|
margin: 5px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.event-info .type {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
/* ================= FOOTER ================= */
|
/* ================= FOOTER ================= */
|
||||||
.footer {
|
.footer {
|
||||||
@@ -537,22 +713,27 @@ img {
|
|||||||
color: #fff;
|
color: #fff;
|
||||||
padding: 60px 0 30px;
|
padding: 60px 0 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-top {
|
.footer-top {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
margin-bottom: 40px;
|
margin-bottom: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-brand {
|
.footer-brand {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-logo {
|
.footer-logo {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 15px;
|
gap: 15px;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.m-box {
|
.m-box {
|
||||||
width: 50px; height: 50px;
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
background: #881c1c;
|
background: #881c1c;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
@@ -561,17 +742,21 @@ img {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-logo .logo-text {
|
.footer-logo .logo-text {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
line-height: 1.2;
|
line-height: 1.2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.social-icons {
|
.social-icons {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 15px;
|
gap: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.social-icons a {
|
.social-icons a {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
width: 20px; height: 20px;
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-links-grid {
|
.footer-links-grid {
|
||||||
@@ -580,18 +765,21 @@ img {
|
|||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
gap: 80px;
|
gap: 80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-col h4 {
|
.footer-col h4 {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #888;
|
color: #888;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-col a {
|
.footer-col a {
|
||||||
display: block;
|
display: block;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-bottom {
|
.footer-bottom {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
@@ -600,103 +788,214 @@ img {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #888;
|
color: #888;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-links {
|
.bottom-links {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 20px;
|
gap: 20px;
|
||||||
}
|
}
|
||||||
.bottom-links a { color: #888; }
|
|
||||||
|
.bottom-links a {
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
|
||||||
/* ================= RESPONSIVE TABLET (768px) ================= */
|
/* ================= RESPONSIVE TABLET (768px) ================= */
|
||||||
@media (max-width: 1024px) {
|
@media (max-width: 1024px) {
|
||||||
.desktop-only { display: none; }
|
.desktop-only {
|
||||||
.mobile-only { display: flex; }
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-only {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
background: #111;
|
background: #111;
|
||||||
padding: 15px 0;
|
padding: 15px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mobile-actions {
|
.mobile-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-btn-mobile {
|
.search-btn-mobile {
|
||||||
background: #881c1c;
|
background: #881c1c;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border: none;
|
border: none;
|
||||||
width: 40px; height: 40px;
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hamburger-btn {
|
.hamburger-btn {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border: none;
|
border: none;
|
||||||
width: 40px; height: 40px;
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero {
|
.hero {
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
min-height: 500px;
|
min-height: 500px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
.hero-title { font-size: 40px; }
|
|
||||||
|
.hero-title {
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
.step-into-inner {
|
.step-into-inner {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
gap: 30px;
|
gap: 30px;
|
||||||
}
|
}
|
||||||
.step-into-links { width: 100%; justify-content: space-between; gap: 20px; }
|
|
||||||
.link-col { width: 48%; }
|
.step-into-links {
|
||||||
.link-col a { width: 100%; }
|
width: 100%;
|
||||||
|
justify-content: space-between;
|
||||||
.whats-life-inner { flex-direction: column; }
|
gap: 20px;
|
||||||
.whats-life-text { padding: 40px 0; }
|
}
|
||||||
.whats-life-media { height: 400px; width: 100%; }
|
|
||||||
|
.link-col {
|
||||||
.stats-inner { gap: 30px; }
|
width: 48%;
|
||||||
|
}
|
||||||
.excellence-grid { grid-template-columns: 1fr; }
|
|
||||||
.sub-grid { height: auto; grid-template-columns: 1fr 1fr; }
|
.link-col a {
|
||||||
|
width: 100%;
|
||||||
.card-grid-3 { grid-template-columns: 1fr; }
|
}
|
||||||
.card-img img { aspect-ratio: 16/9; }
|
|
||||||
|
.whats-life-inner {
|
||||||
.apply-buttons { flex-wrap: wrap; }
|
flex-direction: column;
|
||||||
|
}
|
||||||
.news-layout { grid-template-columns: 1fr; gap: 40px; }
|
|
||||||
.events-grid { grid-template-columns: 1fr 1fr; }
|
.whats-life-text {
|
||||||
|
padding: 40px 0;
|
||||||
.footer-top { flex-direction: column; gap: 40px; }
|
}
|
||||||
.footer-links-grid { justify-content: space-between; gap: 20px; }
|
|
||||||
|
.whats-life-media {
|
||||||
|
height: 400px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-inner {
|
||||||
|
gap: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.excellence-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sub-grid {
|
||||||
|
height: auto;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-grid-3 {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-img img {
|
||||||
|
aspect-ratio: 16/9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.apply-buttons {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.news-layout {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
gap: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.events-grid {
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-top {
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-links-grid {
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================= RESPONSIVE MOBILE (390px) ================= */
|
/* ================= RESPONSIVE MOBILE (390px) ================= */
|
||||||
@media (max-width: 767px) {
|
@media (max-width: 767px) {
|
||||||
.hero-title { font-size: 32px; }
|
.hero-title {
|
||||||
.hero-desc { font-size: 14px; }
|
font-size: 32px;
|
||||||
|
}
|
||||||
.step-into-links { flex-direction: column; }
|
|
||||||
.link-col { width: 100%; }
|
.hero-desc {
|
||||||
|
font-size: 14px;
|
||||||
.stats-inner { flex-direction: column; gap: 40px; }
|
}
|
||||||
|
|
||||||
.sub-grid { grid-template-columns: 1fr; }
|
.step-into-links {
|
||||||
|
flex-direction: column;
|
||||||
.apply-buttons { flex-direction: column; align-items: center; }
|
}
|
||||||
.apply-buttons .btn { width: 100%; max-width: 300px; }
|
|
||||||
|
.link-col {
|
||||||
.looking-grid { flex-direction: column; gap: 0; }
|
width: 100%;
|
||||||
|
}
|
||||||
.events-grid { grid-template-columns: 1fr; }
|
|
||||||
.news-small { flex-direction: column; }
|
.stats-inner {
|
||||||
.news-small img { width: 100%; height: auto; aspect-ratio: 16/9; }
|
flex-direction: column;
|
||||||
|
gap: 40px;
|
||||||
.footer-links-grid { flex-direction: column; }
|
}
|
||||||
.footer-bottom { flex-direction: column; gap: 20px; align-items: flex-start; }
|
|
||||||
.bottom-links { flex-direction: column; gap: 10px; }
|
.sub-grid {
|
||||||
}
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.apply-buttons {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.apply-buttons .btn {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.looking-grid {
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.events-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.news-small {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.news-small img {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
aspect-ratio: 16/9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-links-grid {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-bottom {
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20px;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-links {
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
-2
@@ -1456,7 +1456,8 @@ html[data-whatintent="mouse"] [data-component-id="umass_base:button"] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.transparent-header, body:has(.transparent-header) {
|
.transparent-header,
|
||||||
|
body:has(.transparent-header) {
|
||||||
[data-component-id="umass_base:site-header"] {
|
[data-component-id="umass_base:site-header"] {
|
||||||
#mobile-hamburger {
|
#mobile-hamburger {
|
||||||
|
|
||||||
@@ -13860,4 +13861,4 @@ html[data-whatinput=mouse] .lity .lity-wrap .lity-container .lity-close:focus {
|
|||||||
|
|
||||||
.claro-autocomplete__message {
|
.claro-autocomplete__message {
|
||||||
color: var(--gin-color-primary);
|
color: var(--gin-color-primary);
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
|
||||||
layout:decorate="~{fragments/layout}">
|
layout:decorate="~{fragments/layout}">
|
||||||
|
|
||||||
@@ -455,7 +455,7 @@
|
|||||||
<div data-component-id="umass_base:section-title"
|
<div data-component-id="umass_base:section-title"
|
||||||
class="f--section-title">
|
class="f--section-title">
|
||||||
<h2><a
|
<h2><a
|
||||||
href="https://www.isenberg.umass.edu/programs/undergraduate/online">Business
|
href="#">Business
|
||||||
Administration</a></h2>
|
Administration</a></h2>
|
||||||
</div>
|
</div>
|
||||||
<div data-component-id="umass_base:description"
|
<div data-component-id="umass_base:description"
|
||||||
@@ -473,7 +473,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="cta-container">
|
<div class="cta-container">
|
||||||
<div class="f--field f--button">
|
<div class="f--field f--button">
|
||||||
<a href="https://www.isenberg.umass.edu/programs/undergraduate/online"
|
<a href="#"
|
||||||
class="button-primary button-context-light "
|
class="button-primary button-context-light "
|
||||||
aria-label="Learn More"
|
aria-label="Learn More"
|
||||||
data-component-id="umass_base:button">
|
data-component-id="umass_base:button">
|
||||||
@@ -631,4 +631,4 @@
|
|||||||
</main>
|
</main>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -16,10 +16,10 @@
|
|||||||
<div class="c--component c--footer-branding">
|
<div class="c--component c--footer-branding">
|
||||||
|
|
||||||
|
|
||||||
<a class="logo" href="https://sisvietnam.vn/" aria-label="SIS">
|
<a class="logo" href="#" aria-label="SIS">
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<img th:src="@{/images/LogoSIS.svg}" alt="Logo SIS" />
|
<img src="https://sisvietnam.vn/wp-content/uploads/2026/06/LogoSIS-1.png" alt="Logo SIS" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</a>
|
</a>
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
<nav class="mc--menu mc--menu-footer" aria-label="UMass Amherst Footer Menu">
|
<nav class="mc--menu mc--menu-footer" aria-label="UMass Amherst Footer Menu">
|
||||||
<ul class="menu m--menu m--menu-footer">
|
<ul class="menu m--menu m--menu-footer">
|
||||||
<li class="menu-item menu-item--expanded">
|
<li class="menu-item menu-item--expanded">
|
||||||
<span class="navigation-title">Dành cho</span>
|
<span class="navigation-title">Thông tin</span>
|
||||||
<div class="submenu-wrapper">
|
<div class="submenu-wrapper">
|
||||||
<ul class="submenu">
|
<ul class="submenu">
|
||||||
<li class="menu-item">
|
<li class="menu-item">
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,18 +1,25 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
|
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>UMass Amherst</title>
|
<title>UMass Amherst</title>
|
||||||
|
|
||||||
<!-- Google Fonts: Lora and Open Sans -->
|
<!-- Google Fonts: Lora and Open Sans -->
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400..700;1,400..700&family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap" rel="stylesheet">
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400..700;1,400..700&family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap"
|
||||||
|
rel="stylesheet">
|
||||||
|
|
||||||
<!-- Add base CSS here if available -->
|
<!-- Add base CSS here if available -->
|
||||||
<th:block layout:fragment="head"></th:block>
|
<th:block layout:fragment="head"></th:block>
|
||||||
|
|
||||||
|
<!-- Custom CSS (Highest Priority) -->
|
||||||
|
<link rel="stylesheet" th:href="@{/css/custom.css}">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<header th:replace="~{fragments/header :: #l--main-header}"></header>
|
<header th:replace="~{fragments/header :: #l--main-header}"></header>
|
||||||
|
|
||||||
@@ -22,4 +29,5 @@
|
|||||||
|
|
||||||
<footer th:replace="~{fragments/footer :: footer}"></footer>
|
<footer th:replace="~{fragments/footer :: footer}"></footer>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
|
||||||
|
</html>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -43,10 +43,6 @@
|
|||||||
class="block block-system block-system-main-block tc--template-container tc--chaptered-page">
|
class="block block-system block-system-main-block tc--template-container tc--chaptered-page">
|
||||||
<div class="t--template t--chaptered-page">
|
<div class="t--template t--chaptered-page">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
/* Fix tall SIS logo overlapping the page title specifically for this page */
|
/* Fix tall SIS logo overlapping the page title specifically for this page */
|
||||||
@media (min-width:768px) and (max-width: 1024px) {
|
@media (min-width:768px) and (max-width: 1024px) {
|
||||||
@@ -54,6 +50,23 @@
|
|||||||
padding-top: 100px !important;
|
padding-top: 100px !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Override tophat background specifically for the Lien He page */
|
||||||
|
[data-component-id="umass_base:tophat"] {
|
||||||
|
background-color: var(--color-black) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-component-id="umass_base:site-header"] {
|
||||||
|
& .primary-navigation {
|
||||||
|
& .m--main-menu {
|
||||||
|
&>li {
|
||||||
|
a {
|
||||||
|
color: var(--color-white);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
<div class="content-top">
|
<div class="content-top">
|
||||||
<div class="lc--layout-container lc--two-column">
|
<div class="lc--layout-container lc--two-column">
|
||||||
@@ -97,30 +110,28 @@
|
|||||||
|
|
||||||
|
|
||||||
<div class="f--field f--link">
|
<div class="f--field f--link">
|
||||||
<a class="link" href="https://www.umass.edu/gateway/contact-us#general-information">
|
<a class="link" href="#">
|
||||||
Thông Tin Chung
|
Thông Tin Chung
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="f--field f--link">
|
<div class="f--field f--link">
|
||||||
<a class="link" href="https://www.umass.edu/gateway/contact-us#directories">
|
<a class="link" href="#">
|
||||||
Bản Đồ
|
Bản Đồ
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="f--field f--link">
|
<div class="f--field f--link">
|
||||||
<a class="link"
|
<a class="link" href="#">
|
||||||
href="https://www.umass.edu/gateway/contact-us#frequently-used-phone-numbers">
|
|
||||||
Số Điện Thoại Thường Dùng
|
Số Điện Thoại Thường Dùng
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="f--field f--link">
|
<div class="f--field f--link">
|
||||||
<a class="link"
|
<a class="link" href="#">
|
||||||
href="https://www.umass.edu/gateway/contact-us#frequently-contacted-departments">
|
|
||||||
Các Khoa Phòng Thường Liên Hệ
|
Các Khoa Phòng Thường Liên Hệ
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -873,8 +884,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<div class="f--field f--button">
|
<div class="f--field f--button">
|
||||||
<a href="https://www.umass.edu/uhs/contact"
|
<a href="#" class="button-text-link button-context-light "
|
||||||
class="button-text-link button-context-light "
|
|
||||||
aria-label="Xem chi tiết About University Health Services"
|
aria-label="Xem chi tiết About University Health Services"
|
||||||
target="_self" data-component-id="umass_base:button">
|
target="_self" data-component-id="umass_base:button">
|
||||||
|
|
||||||
@@ -910,7 +920,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<div data-component-id="umass_base:description" class="f--description">
|
<div data-component-id="umass_base:description" class="f--description">
|
||||||
<p><a href="https://www.umass.edu/diversity/incident-report-form">Climate
|
<p><a href="#">Climate
|
||||||
Incident Report Form</a></p>
|
Incident Report Form</a></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -922,8 +932,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<div class="f--field f--button">
|
<div class="f--field f--button">
|
||||||
<a href="https://www.umass.edu/diversity/"
|
<a href="#" class="button-text-link button-context-light "
|
||||||
class="button-text-link button-context-light "
|
|
||||||
aria-label="Xem chi tiết About Office of Equity and Inclusion"
|
aria-label="Xem chi tiết About Office of Equity and Inclusion"
|
||||||
target="_self" data-component-id="umass_base:button">
|
target="_self" data-component-id="umass_base:button">
|
||||||
|
|
||||||
@@ -979,8 +988,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<div class="f--field f--button">
|
<div class="f--field f--button">
|
||||||
<a href="https://www.umass.edu/titleix"
|
<a href="#" class="button-text-link button-context-light "
|
||||||
class="button-text-link button-context-light "
|
|
||||||
aria-label="Xem chi tiết About Title IX Coordinator" target="_self"
|
aria-label="Xem chi tiết About Title IX Coordinator" target="_self"
|
||||||
data-component-id="umass_base:button">
|
data-component-id="umass_base:button">
|
||||||
|
|
||||||
@@ -1025,8 +1033,7 @@
|
|||||||
<path
|
<path
|
||||||
d="M56 14H8c-1.1 0-2 0.9-2 2v32c0 1.1 0.9 2 2 2h48c1.1 0 2-0.9 2-2V16C58 14.9 57.1 14 56 14zM50.5 18L32 33.4 13.5 18H50.5zM10 46V20.3l20.7 17.3C31.1 37.8 31.5 38 32 38s0.9-0.2 1.3-0.5L54 20.3V46H10z">
|
d="M56 14H8c-1.1 0-2 0.9-2 2v32c0 1.1 0.9 2 2 2h48c1.1 0 2-0.9 2-2V16C58 14.9 57.1 14 56 14zM50.5 18L32 33.4 13.5 18H50.5zM10 46V20.3l20.7 17.3C31.1 37.8 31.5 38 32 38s0.9-0.2 1.3-0.5L54 20.3V46H10z">
|
||||||
</path>
|
</path>
|
||||||
</svg></a><br>413-545-2121<br><a
|
</svg></a><br>413-545-2121<br><a href="#">Anonymous
|
||||||
href="https://www.umass.edu/umpd/anonymous-witness-form">Anonymous
|
|
||||||
witness form</a></p>
|
witness form</a></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -1038,8 +1045,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<div class="f--field f--button">
|
<div class="f--field f--button">
|
||||||
<a href="https://www.umass.edu/umpd/"
|
<a href="#" class="button-text-link button-context-light "
|
||||||
class="button-text-link button-context-light "
|
|
||||||
aria-label="Xem chi tiết About UMass Amherst Police Department"
|
aria-label="Xem chi tiết About UMass Amherst Police Department"
|
||||||
target="_self" data-component-id="umass_base:button">
|
target="_self" data-component-id="umass_base:button">
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,8 @@
|
|||||||
<meta name="msapplication-TileColor" content="#881c1c">
|
<meta name="msapplication-TileColor" content="#881c1c">
|
||||||
<meta name="theme-color" content="#ffffff">
|
<meta name="theme-color" content="#ffffff">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="https://sisvietnam.vn/wp-content/uploads/2018/08/cropped-favicon-1.png">
|
<link rel="icon" type="image/png" sizes="32x32"
|
||||||
|
href="https://sisvietnam.vn/wp-content/uploads/2018/08/cropped-favicon-1.png">
|
||||||
|
|
||||||
<title>Tin Tức - Bệnh Viện Đa Khoa Quốc Tế S.I.S Cần Thơ</title>
|
<title>Tin Tức - Bệnh Viện Đa Khoa Quốc Tế S.I.S Cần Thơ</title>
|
||||||
<link href="/Undergraduate Study _ UMass Amherst_files/css2" rel="stylesheet">
|
<link href="/Undergraduate Study _ UMass Amherst_files/css2" rel="stylesheet">
|
||||||
@@ -35,6 +36,7 @@
|
|||||||
gap: 8px;
|
gap: 8px;
|
||||||
padding: 32px 0;
|
padding: 32px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tin-tuc-pagination a,
|
.tin-tuc-pagination a,
|
||||||
.tin-tuc-pagination span {
|
.tin-tuc-pagination span {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
@@ -49,17 +51,20 @@
|
|||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
transition: background 0.2s, color 0.2s;
|
transition: background 0.2s, color 0.2s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tin-tuc-pagination a:hover {
|
.tin-tuc-pagination a:hover {
|
||||||
background: #881c1c;
|
background: #881c1c;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color: #881c1c;
|
border-color: #881c1c;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tin-tuc-pagination span.current-page {
|
.tin-tuc-pagination span.current-page {
|
||||||
background: #881c1c;
|
background: #881c1c;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color: #881c1c;
|
border-color: #881c1c;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* News meta info (date, category tag) */
|
/* News meta info (date, category tag) */
|
||||||
.news-card-meta {
|
.news-card-meta {
|
||||||
font-size: 0.78rem;
|
font-size: 0.78rem;
|
||||||
@@ -69,6 +74,7 @@
|
|||||||
gap: 10px;
|
gap: 10px;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.news-card-meta .tag {
|
.news-card-meta .tag {
|
||||||
background: #f5e4e4;
|
background: #f5e4e4;
|
||||||
color: #881c1c;
|
color: #881c1c;
|
||||||
@@ -76,10 +82,12 @@
|
|||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make cards feel like news items with date */
|
/* Make cards feel like news items with date */
|
||||||
.c--card-grid-card .news-card-meta {
|
.c--card-grid-card .news-card-meta {
|
||||||
padding: 0 0 4px 0;
|
padding: 0 0 4px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Uniform card images */
|
/* Uniform card images */
|
||||||
.c--card-grid-card .f--image img {
|
.c--card-grid-card .f--image img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -94,7 +102,7 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div layout:fragment="content"
|
<div layout:fragment="content"
|
||||||
class="dialog-off-canvas-main-canvas umass-platform-homepage path-node page-node-type-landing-page"
|
class="dialog-off-canvas-main-canvas umass-platform-homepage path-node page-node-type-landing-page transparent-header"
|
||||||
data-off-canvas-main-canvas="">
|
data-off-canvas-main-canvas="">
|
||||||
|
|
||||||
<main id="main-content">
|
<main id="main-content">
|
||||||
@@ -126,8 +134,7 @@
|
|||||||
<img
|
<img
|
||||||
src="https://sisvietnam.vn/wp-content/uploads/2018/10/op1-view1g%E1%BA%A1ch-min-1-1024x722.jpg"
|
src="https://sisvietnam.vn/wp-content/uploads/2018/10/op1-view1g%E1%BA%A1ch-min-1-1024x722.jpg"
|
||||||
class="" alt="Tin Tức Bệnh Viện S.I.S Cần Thơ" height="900" width="1600"
|
class="" alt="Tin Tức Bệnh Viện S.I.S Cần Thơ" height="900" width="1600"
|
||||||
style="aspect-ratio: 16/9; object-fit: cover; width: 100%; height: 100%;"
|
style="aspect-ratio: 16/9; object-fit: cover; width: 100%; height: 100%;">
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -225,11 +232,8 @@
|
|||||||
<div class="cc--component-container cc--card-grid-card ">
|
<div class="cc--component-container cc--card-grid-card ">
|
||||||
<div class="c--component c--card-grid-card">
|
<div class="c--component c--card-grid-card">
|
||||||
<div class="f--field f--image">
|
<div class="f--field f--image">
|
||||||
<img
|
<img src="https://sisvietnam.vn/wp-content/uploads/2019/01/IMG_6313.jpg" class=""
|
||||||
src="https://sisvietnam.vn/wp-content/uploads/2019/01/IMG_6313.jpg"
|
alt="Can thiệp đột quỵ cấp tính thành công tại S.I.S Cần Thơ">
|
||||||
class=""
|
|
||||||
alt="Can thiệp đột quỵ cấp tính thành công tại S.I.S Cần Thơ"
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="text-container">
|
<div class="text-container">
|
||||||
<div class="news-card-meta">
|
<div class="news-card-meta">
|
||||||
@@ -240,7 +244,8 @@
|
|||||||
Can Thiệp Đột Quỵ Cấp Tính Thành Công, Bệnh Nhân Hồi Phục Ngoạn Mục
|
Can Thiệp Đột Quỵ Cấp Tính Thành Công, Bệnh Nhân Hồi Phục Ngoạn Mục
|
||||||
</h3>
|
</h3>
|
||||||
<div data-component-id="umass_base:description" class="f--description">
|
<div data-component-id="umass_base:description" class="f--description">
|
||||||
<p>Ê-kíp bác sĩ chuyên khoa Thần kinh – Đột quỵ của S.I.S Cần Thơ vừa thực hiện thành
|
<p>Ê-kíp bác sĩ chuyên khoa Thần kinh – Đột quỵ của S.I.S Cần Thơ vừa thực hiện
|
||||||
|
thành
|
||||||
công ca can thiệp nội mạch lấy huyết khối cho bệnh nhân trong cửa sổ vàng 6 giờ
|
công ca can thiệp nội mạch lấy huyết khối cho bệnh nhân trong cửa sổ vàng 6 giờ
|
||||||
đầu.</p>
|
đầu.</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -261,9 +266,7 @@
|
|||||||
<div class="f--field f--image">
|
<div class="f--field f--image">
|
||||||
<img
|
<img
|
||||||
src="https://sisvietnam.vn/wp-content/uploads/2018/10/op1-view1g%E1%BA%A1ch-min-1-1024x722.jpg"
|
src="https://sisvietnam.vn/wp-content/uploads/2018/10/op1-view1g%E1%BA%A1ch-min-1-1024x722.jpg"
|
||||||
class=""
|
class="" alt="Hội thảo khoa học tim mạch">
|
||||||
alt="Hội thảo khoa học tim mạch"
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="text-container">
|
<div class="text-container">
|
||||||
<div class="news-card-meta">
|
<div class="news-card-meta">
|
||||||
@@ -294,9 +297,7 @@
|
|||||||
<div class="f--field f--image">
|
<div class="f--field f--image">
|
||||||
<img
|
<img
|
||||||
src="https://sisvietnam.vn/wp-content/uploads/2026/05/SO-DO-TO-CHUC-BENH-VIEN-SIS_cap-nhat-15.05.2026.jpg"
|
src="https://sisvietnam.vn/wp-content/uploads/2026/05/SO-DO-TO-CHUC-BENH-VIEN-SIS_cap-nhat-15.05.2026.jpg"
|
||||||
class=""
|
class="" alt="Nhận biết dấu hiệu đột quỵ">
|
||||||
alt="Nhận biết dấu hiệu đột quỵ"
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="text-container">
|
<div class="text-container">
|
||||||
<div class="news-card-meta">
|
<div class="news-card-meta">
|
||||||
@@ -307,7 +308,8 @@
|
|||||||
Nhận Biết Dấu Hiệu Đột Quỵ Trong 60 Giây – FAST Là Gì?
|
Nhận Biết Dấu Hiệu Đột Quỵ Trong 60 Giây – FAST Là Gì?
|
||||||
</h3>
|
</h3>
|
||||||
<div data-component-id="umass_base:description" class="f--description">
|
<div data-component-id="umass_base:description" class="f--description">
|
||||||
<p>Phương pháp nhận biết đột quỵ bằng quy tắc FAST (Face – Arm – Speech – Time) được
|
<p>Phương pháp nhận biết đột quỵ bằng quy tắc FAST (Face – Arm – Speech – Time)
|
||||||
|
được
|
||||||
Tổ Chức Y Tế Thế Giới khuyến nghị. Nhận biết sớm, cứu não kịp thời.</p>
|
Tổ Chức Y Tế Thế Giới khuyến nghị. Nhận biết sớm, cứu não kịp thời.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="f--field f--button">
|
<div class="f--field f--button">
|
||||||
@@ -325,11 +327,8 @@
|
|||||||
<div class="cc--component-container cc--card-grid-card ">
|
<div class="cc--component-container cc--card-grid-card ">
|
||||||
<div class="c--component c--card-grid-card">
|
<div class="c--component c--card-grid-card">
|
||||||
<div class="f--field f--image">
|
<div class="f--field f--image">
|
||||||
<img
|
<img src="https://sisvietnam.vn/wp-content/uploads/2019/01/IMG_6313.jpg" class=""
|
||||||
src="https://sisvietnam.vn/wp-content/uploads/2019/01/IMG_6313.jpg"
|
alt="Quỹ Nhịp Cầu Nhân Ái">
|
||||||
class=""
|
|
||||||
alt="Quỹ Nhịp Cầu Nhân Ái"
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="text-container">
|
<div class="text-container">
|
||||||
<div class="news-card-meta">
|
<div class="news-card-meta">
|
||||||
@@ -360,9 +359,7 @@
|
|||||||
<div class="f--field f--image">
|
<div class="f--field f--image">
|
||||||
<img
|
<img
|
||||||
src="https://sisvietnam.vn/wp-content/uploads/2018/10/op1-view1g%E1%BA%A1ch-min-1-1024x722.jpg"
|
src="https://sisvietnam.vn/wp-content/uploads/2018/10/op1-view1g%E1%BA%A1ch-min-1-1024x722.jpg"
|
||||||
class=""
|
class="" alt="Báo Tuổi Trẻ viết về SIS">
|
||||||
alt="Báo Tuổi Trẻ viết về SIS"
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="text-container">
|
<div class="text-container">
|
||||||
<div class="news-card-meta">
|
<div class="news-card-meta">
|
||||||
@@ -370,16 +367,17 @@
|
|||||||
<span>10/05/2026</span>
|
<span>10/05/2026</span>
|
||||||
</div>
|
</div>
|
||||||
<h3 class="ally-focus-within">
|
<h3 class="ally-focus-within">
|
||||||
Tuổi Trẻ: "S.I.S Cần Thơ – Điểm Tựa Của Người Dân Miền Tây Trong Cuộc Chiến Với Đột Quỵ"
|
Tuổi Trẻ: "S.I.S Cần Thơ – Điểm Tựa Của Người Dân Miền Tây Trong Cuộc Chiến Với
|
||||||
|
Đột Quỵ"
|
||||||
</h3>
|
</h3>
|
||||||
<div data-component-id="umass_base:description" class="f--description">
|
<div data-component-id="umass_base:description" class="f--description">
|
||||||
<p>Báo Tuổi Trẻ đã có bài phóng sự chuyên sâu về hành trình 10 năm xây dựng trung tâm
|
<p>Báo Tuổi Trẻ đã có bài phóng sự chuyên sâu về hành trình 10 năm xây dựng trung
|
||||||
|
tâm
|
||||||
can thiệp đột quỵ hàng đầu đồng bằng sông Cửu Long của bệnh viện.</p>
|
can thiệp đột quỵ hàng đầu đồng bằng sông Cửu Long của bệnh viện.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="f--field f--button">
|
<div class="f--field f--button">
|
||||||
<a href="#" class="button-text-link button-context-light "
|
<a href="#" class="button-text-link button-context-light "
|
||||||
aria-label="Đọc bài báo" target="_self"
|
aria-label="Đọc bài báo" target="_self" data-component-id="umass_base:button">
|
||||||
data-component-id="umass_base:button">
|
|
||||||
<span class="button-text">Đọc thêm</span>
|
<span class="button-text">Đọc thêm</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -393,9 +391,7 @@
|
|||||||
<div class="f--field f--image">
|
<div class="f--field f--image">
|
||||||
<img
|
<img
|
||||||
src="https://sisvietnam.vn/wp-content/uploads/2026/05/SO-DO-TO-CHUC-BENH-VIEN-SIS_cap-nhat-15.05.2026.jpg"
|
src="https://sisvietnam.vn/wp-content/uploads/2026/05/SO-DO-TO-CHUC-BENH-VIEN-SIS_cap-nhat-15.05.2026.jpg"
|
||||||
class=""
|
class="" alt="Tuyển dụng bác sĩ">
|
||||||
alt="Tuyển dụng bác sĩ"
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="text-container">
|
<div class="text-container">
|
||||||
<div class="news-card-meta">
|
<div class="news-card-meta">
|
||||||
@@ -456,4 +452,5 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
|
||||||
|
</html>
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
$aboutFile = 'd:\website_sisvietnam_moi\website_sisvietnam.vn\sisvietnamvn\src\main\resources\templates\about.html'
|
|
||||||
$indexFile = 'd:\website_sisvietnam_moi\website_sisvietnam.vn\sisvietnamvn\src\main\resources\templates\index.html'
|
|
||||||
|
|
||||||
$aboutContent = Get-Content -Raw -Path $aboutFile -Encoding UTF8
|
|
||||||
$indexContent = Get-Content -Raw -Path $indexFile -Encoding UTF8
|
|
||||||
|
|
||||||
# Replace Header
|
|
||||||
$aboutContent = $aboutContent -replace '(?s)<header id="l--main-header">.*?</header>', '<header th:replace="~{fragments/header :: header}"></header>'
|
|
||||||
|
|
||||||
# Extract Footer from index.html
|
|
||||||
$indexFooter = [regex]::Match($indexContent, '(?s)<footer id="l--main-footer".*?</footer>').Value
|
|
||||||
|
|
||||||
# Replace Footer in about.html
|
|
||||||
$aboutContent = $aboutContent -replace '(?s)<footer id="l--main-footer".*?</footer>', $indexFooter
|
|
||||||
|
|
||||||
# Apply extra CSS from index.html
|
|
||||||
$cssSnippet = @"
|
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap" rel="stylesheet">
|
|
||||||
<style>
|
|
||||||
body, h1, h2, h3, h4, h5, h6, p, a, div, li, button, input, textarea, span:not([class*="fa"]):not([class*="icon"]):not([class*="material"]) {
|
|
||||||
font-family: 'Open Sans', Arial, Helvetica, sans-serif !important;
|
|
||||||
}
|
|
||||||
#block-footerbranding img {
|
|
||||||
filter: drop-shadow(0px 0px 10px rgba(255, 255, 255, 0.9)) drop-shadow(0px 0px 20px rgba(255, 255, 255, 0.7));
|
|
||||||
transition: filter 0.3s ease, transform 0.3s ease;
|
|
||||||
}
|
|
||||||
"@
|
|
||||||
$aboutContent = $aboutContent -replace '<style>', ($cssSnippet + "`n <style>")
|
|
||||||
|
|
||||||
Set-Content -Path $aboutFile -Value $aboutContent -Encoding UTF8
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
const fs = require('fs');
|
|
||||||
const path = 'd:\\website_sisvietnam_moi\\website_sisvietnam.vn\\sisvietnamvn\\src\\main\\resources\\templates\\about.html';
|
|
||||||
|
|
||||||
let content = fs.readFileSync(path, 'utf8');
|
|
||||||
|
|
||||||
const replacements = [
|
|
||||||
{ regex: /<h1>\s*Undergraduate\s*<\/h1>/gi, replacement: '<h1>Giới thiệu Bệnh viện S.I.S Cần Thơ</h1>' },
|
|
||||||
{ regex: /<span class="nolink">Get Your Degree<\/span>/gi, replacement: '<span class="nolink">Danh mục Giới thiệu</span>' },
|
|
||||||
{ regex: /Be Bright\. Be Bold\. Be You\./g, replacement: 'Sứ mệnh & Tầm nhìn' },
|
|
||||||
{ regex: /UMass Amherst is where possibilities happen.*?<\/p>/gi, replacement: 'S.I.S Cần Thơ là bệnh viện chuyên sâu về Cấp cứu Đột quỵ và Tim mạch. Sứ mệnh của chúng tôi là "Cứu Tinh Cho Bệnh Nhân Đột Quỵ". Chúng tôi tự hào mang đến các dịch vụ chăm sóc y tế chuẩn quốc tế cho người dân Đồng bằng sông Cửu Long và cả nước.</p>' },
|
|
||||||
{ regex: /Explore Every Possibility/g, replacement: 'Cơ sở vật chất hiện đại' },
|
|
||||||
{ regex: /Over 100 bachelor.*?degree programs\./gi, replacement: 'Hệ thống phòng mổ HYBRID, máy DSA, MRI 3 Tesla, CT 128 lát cắt hiện đại bậc nhất khu vực.' },
|
|
||||||
{ regex: /Small Classes Big Ideas/g, replacement: 'Đội ngũ Chuyên gia' },
|
|
||||||
{ regex: /Commonwealth Honors College.*?community/gi, replacement: 'Tập hợp các Giáo sư, Bác sĩ và Chuyên gia đầu ngành về Đột quỵ, Tim mạch và Thần kinh.' },
|
|
||||||
{ regex: /Beyond the Classroom/g, replacement: 'Chăm sóc toàn diện' },
|
|
||||||
{ regex: /Take what you learn and put it.*?abroad\./gi, replacement: 'Quy trình cấp cứu tối ưu, rút ngắn "thời gian vàng" kết hợp các dịch vụ tầm soát và phục hồi chức năng.' },
|
|
||||||
{ regex: /Empowering Your Best/g, replacement: 'Thành tựu nổi bật' },
|
|
||||||
{ regex: /Keep Exploring/g, replacement: 'Tìm hiểu thêm' }
|
|
||||||
];
|
|
||||||
|
|
||||||
replacements.forEach(r => {
|
|
||||||
content = content.replace(r.regex, r.replacement);
|
|
||||||
});
|
|
||||||
|
|
||||||
fs.writeFileSync(path, content, 'utf8');
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
$file = 'd:\website_sisvietnam_moi\website_sisvietnam.vn\sisvietnamvn\src\main\resources\templates\about.html'
|
|
||||||
$content = Get-Content -Raw -Path $file -Encoding UTF8
|
|
||||||
|
|
||||||
$replacements = @{
|
|
||||||
'<h1>\s*Undergraduate\s*</h1>' = '<h1>Giới thiệu Bệnh viện S.I.S Cần Thơ</h1>'
|
|
||||||
'<span class="nolink">Get Your Degree</span>' = '<span class="nolink">Danh mục Giới thiệu</span>'
|
|
||||||
'Be Bright\. Be Bold\. Be You\.' = 'Sứ mệnh & Tầm nhìn'
|
|
||||||
'UMass Amherst is where possibilities happen.*?</p>' = 'S.I.S Cần Thơ là bệnh viện chuyên sâu về Cấp cứu Đột quỵ và Tim mạch. Sứ mệnh của chúng tôi là "Cứu Tinh Cho Bệnh Nhân Đột Quỵ". Chúng tôi tự hào mang đến các dịch vụ chăm sóc y tế chuẩn quốc tế cho người dân Đồng bằng sông Cửu Long và cả nước.</p>'
|
|
||||||
'Explore Every Possibility' = 'Cơ sở vật chất hiện đại'
|
|
||||||
'Over 100 bachelor.*?degree programs\.' = 'Hệ thống phòng mổ HYBRID, máy DSA, MRI 3 Tesla, CT 128 lát cắt hiện đại bậc nhất khu vực.'
|
|
||||||
'Small Classes Big Ideas' = 'Đội ngũ Chuyên gia'
|
|
||||||
'Commonwealth Honors College.*?community' = 'Tập hợp các Giáo sư, Bác sĩ và Chuyên gia đầu ngành về Đột quỵ, Tim mạch và Thần kinh.'
|
|
||||||
'Beyond the Classroom' = 'Chăm sóc toàn diện'
|
|
||||||
'Take what you learn and put it.*?abroad\.' = 'Quy trình cấp cứu tối ưu, rút ngắn "thời gian vàng" kết hợp các dịch vụ tầm soát và phục hồi chức năng.'
|
|
||||||
'Empowering Your Best' = 'Thành tựu nổi bật'
|
|
||||||
'Keep Exploring' = 'Tìm hiểu thêm'
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($key in $replacements.Keys) {
|
|
||||||
$content = [regex]::Replace($content, $key, $replacements[$key], 'IgnoreCase,Singleline')
|
|
||||||
}
|
|
||||||
|
|
||||||
Set-Content -Path $file -Value $content -Encoding UTF8
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
const fs = require('fs');
|
|
||||||
|
|
||||||
const indexPath = 'd:\\website_sisvietnam_moi\\website_sisvietnam.vn\\sisvietnamvn\\src\\main\\resources\\templates\\index.html';
|
|
||||||
let indexHtml = fs.readFileSync(indexPath, 'utf8');
|
|
||||||
|
|
||||||
indexHtml = indexHtml.replace(/<footer id="l--main-footer"[\s\S]*?<\/footer>/i, '<footer th:replace="~{fragments/footer :: footer}"></footer>');
|
|
||||||
fs.writeFileSync(indexPath, indexHtml, 'utf8');
|
|
||||||
|
|
||||||
console.log("Replaced footer in index.html");
|
|
||||||
Reference in New Issue
Block a user