updated 10-09-25

This commit is contained in:
2025-09-10 07:56:07 +07:00
parent e44fe5dcf8
commit 237daad289
14 changed files with 269 additions and 4995 deletions

View File

@ -34,12 +34,6 @@ if (!app.Environment.IsDevelopment())
app.UseHsts();
}
app.UseForwardedHeaders();
app.Use(async (ctx, next) =>
{
Console.WriteLine("X-Forwarded-Proto: " + ctx.Request.Headers["X-Forwarded-Proto"]);
Console.WriteLine("Scheme: " + ctx.Request.Scheme);
await next();
});
app.UseHttpsRedirection();
app.UseRouting();

View File

@ -1,6 +1,6 @@
<div class="cfull">
<div class="rSlider">
<div class="swiper mainSlider">
<div class="swiper swiperM mainSlider">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="background" style="background-image: url(@Url.AbsoluteContent("~/images/banner/low-angle-view-cloudscape-against-sky-sunset.jpg"));">
@ -307,9 +307,57 @@
</div>
</div>
</section>
<section class="con-parallax">
<div class="parallax" data-dept="0.3" data-src="https://wp.storebuild.shop/portx/wp-content/uploads/2023/07/cta1-bg.jpg"></div>
<div class="bg-wrapper parallax" data-dept="0.3">
<img src="~/images/1000/directly.jpg" alt="Background" class="bg-img">
</div>
<div class="con section partner-section section-break" data-content>
<div class="r">
<div class="c-12 d-f f-c a-i-center">
<span class="sub-title">
Delivering excellence with top airline partners
</span>
<h2 class="title">
Global Strategic Partnerships
</h2>
</div>
</div>
<div class="r mt-3">
<div class="c-12">
<div class="r-n-g">
<div class="swiper airlineSwiper">
<div class="swiper-wrapper a-i-center">
<div class="swiper-slide h-100 d-f a-i-center j-c-center">
<div class="logo-card"><img class="w-100" src="~/images/1000/partnerint/PR.png" alt="Qatar Airways logo" loading="lazy" /></div>
</div>
<div class="swiper-slide h-100 d-f a-i-center j-c-center">
<div class="logo-card"><img class="w-100" src="~/images/1000/partnerint/QR.png" alt="China Airlines logo" loading="lazy" /></div>
</div>
<div class="swiper-slide h-100 d-f a-i-center j-c-center">
<div class="logo-card"><img class="w-100" src="~/images/1000/partnerint/MaCau.png" alt="Philippine Airlines logo" loading="lazy" /></div>
</div>
<div class="swiper-slide h-100 d-f a-i-center j-c-center">
<div class="logo-card"><img class="w-100" src="~/images/1000/partnerint/K6.png" alt="Cambodia Angkor Air logo" loading="lazy" /></div>
</div>
<div class="swiper-slide h-100 d-f a-i-center j-c-center">
<div class="logo-card"><img class="w-100" src="~/images/1000/partnerint/SKCargo-logo.png" alt="Vietnam Airlines logo" loading="lazy" /></div>
</div>
<!-- Thêm logo khác tại đây -->
</div>
<div class="swiper-button-prev" aria-label="previous"></div>
<div class="swiper-button-next" aria-label="next"></div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="con-parallax">
<div class="bg-wrapper parallax" data-dept="0.3">
<img src="https://wp.storebuild.shop/portx/wp-content/uploads/2023/07/cta1-bg.jpg" alt="Background" class="bg-img">
</div>
<div class="con section section-break" data-content>
<div class="r">
<div class="c-12">
@ -346,7 +394,7 @@
<div class="grid-body d-f f-c">
<div class="blog-author d-f a-i-center">
<div class="blog-author-img mr-10">
<img class="w-100" alt="" src="https://secure.gravatar.com/avatar/187861c59f0bf60f2604ab92e2d7f0c53dbb26b9e5ef2bbb31fcc900eba2bbca?s=96&amp;d=mm&amp;r=g">
<img alt="" src="https://secure.gravatar.com/avatar/187861c59f0bf60f2604ab92e2d7f0c53dbb26b9e5ef2bbb31fcc900eba2bbca?s=96&amp;d=mm&amp;r=g">
</div>
<div class="d-f blog-author-content"><span>By</span> <a class="ml-1" href="">Admin</a></div>
</div>
@ -373,7 +421,7 @@
<div class="grid-body d-f f-c">
<div class="blog-author d-f a-i-center">
<div class="blog-author-img mr-10">
<img class="w-100" alt="" src="https://secure.gravatar.com/avatar/187861c59f0bf60f2604ab92e2d7f0c53dbb26b9e5ef2bbb31fcc900eba2bbca?s=96&amp;d=mm&amp;r=g">
<img alt="" src="https://secure.gravatar.com/avatar/187861c59f0bf60f2604ab92e2d7f0c53dbb26b9e5ef2bbb31fcc900eba2bbca?s=96&amp;d=mm&amp;r=g">
</div>
<div class="d-f blog-author-content"><span>By</span> <a class="ml-1" href="">Admin</a></div>
</div>
@ -400,7 +448,7 @@
<div class="grid-body d-f f-c">
<div class="blog-author d-f a-i-center">
<div class="blog-author-img mr-10">
<img class="w-100" alt="" src="https://secure.gravatar.com/avatar/187861c59f0bf60f2604ab92e2d7f0c53dbb26b9e5ef2bbb31fcc900eba2bbca?s=96&amp;d=mm&amp;r=g">
<img alt="" src="https://secure.gravatar.com/avatar/187861c59f0bf60f2604ab92e2d7f0c53dbb26b9e5ef2bbb31fcc900eba2bbca?s=96&amp;d=mm&amp;r=g">
</div>
<div class="d-f blog-author-content"><span>By</span> <a class="ml-1" href="">Admin</a></div>
</div>

View File

@ -17,15 +17,17 @@
</div>
</div>
<div class="con hblock2">
<div class="r j-c-between a-i-center">
<div class="d-f d-l-n f-c ico-menu">
<div><span style="width:100%"></span></div>
<div><span style="width:100%"></span></div>
<div><span style="width:100%"></span></div>
<div class="r a-i-center">
<div class="m-navbar">
<div class="d-f d-l-n f-c ico-menu">
<div><span style="width:100%"></span></div>
<div><span style="width:100%"></span></div>
<div><span style="width:100%"></span></div>
</div>
</div>
<nav class="d-n d-l-f c-l-11 navmain">
@await Html.PartialAsync("~/Views/Partial/MenuAP.cshtml")
</nav>
<a href="#"><span class="atg atg-search a-2x mb-1"></span></a>
<a class="ml-auto" href="#"><span class="atg atg-search a-2x mb-1"></span></a>
</div>
</div>

View File

@ -46,11 +46,26 @@
mask-composite: intersect;
}
.f-header{
top: -140px
.main-wrapper{
transform:translateZ(0)
}
.f-header {
top: -65px
}
.f-header .navmain a {
color: #000000
}
.f-header .navmain a.active, .f-header .navmain a:hover, .f-header .navmain .nav-i.active a {
color: var(--text-color-dark)
}
.f-header .ico-menu span{
background-color: var(--text-color-dark) !important
}
.f-header.show.ios{
position: absolute;
}
@ -260,8 +275,8 @@ body {
position: absolute;
height: 0;
width: 45%;
right: 50%;
left: 50%;
right: 49%;
left: 49%;
bottom: 0;
height: 3px;
background: var(--color-primary);
@ -323,17 +338,17 @@ body {
}
.m-header .nav-mainmenu {
.m-header .navmain {
margin: 20px 0;
}
.m-header .nav-mainmenu .nav-item.active::after, .m-header .nav-mainmenu .nav-item:hover::after, .m-header .nav-mainmenu .nav-i.active .nav-item::after, .m-header .nav-mainmenu .nav-i.activeM .nav-item::after {
.m-header .navmain .nav-item.active::after, .m-header .navmain .nav-item:hover::after, .m-header .navmain .nav-i.active .nav-item::after, .m-header .navmain .nav-i.activeM .nav-item::after {
left: 0;
right: 50%;
width: 50%
}
.m-header .nav-mainmenu .nav-item.active::before, .m-header .nav-mainmenu .nav-item:hover::before, .m-header .nav-mainmenu .nav-i.active .nav-item::before, .m-header .nav-mainmenu .nav-i.activeM .nav-item::before {
.m-header .navmain .nav-item.active::before, .m-header .navmain .nav-item:hover::before, .m-header .navmain .nav-i.active .nav-item::before, .m-header .navmain .nav-i.activeM .nav-item::before {
left: 50%;
right: 0;
width: 50%;
@ -344,12 +359,16 @@ body {
height: auto !important;
}
.m-header .nav-mainmenu a {
.m-header .navmain a {
padding: 10px 0;
display: inline-flex;
}
.m-header .nav-mainmenu [data-dropdown] .sub-item {
.m-header .navmain .nav-item{
color:#000
}
.m-header .navmain [data-dropdown] .sub-item {
position: relative;
top: 0 !important;
box-shadow: none;
@ -368,11 +387,22 @@ body {
background-repeat: no-repeat;
background-color: transparent
}
.swiper {
.swiperM {
border-radius: var(--radius);
min-height: 800px;
height: 100vh
}
.swiper-button-next,
.swiper-button-prev {
opacity: 0;
transition: opacity 0.3s;
}
/* Khi hover vào swiper, hiện nút */
.swiper:hover .swiper-button-next,
.swiper:hover .swiper-button-prev {
opacity: 1;
}
.con_slider {
background-color: rgba(17, 39,88, 0.4);
@ -1106,7 +1136,11 @@ div[class*=sec]{
}
/**End Section*/
/***Section Partner***/
.partner-section{
padding: 80px 0
}
/***End Section***/
/**Blog Section*/
.blog-section .title{
@ -1263,7 +1297,7 @@ div[class*=sec]{
top: 0;
left: 0;
width: 100%;
height: 100vh;
height: calc(var(--vh, 1vh) * 100);
z-index: -1;
}
@ -1273,6 +1307,28 @@ div[class*=sec]{
left: 50%;
height: 100%;
width: 100%;
transform: translateX(-50%) translateY(0); /* chỉ dịch ngang center */
object-fit: cover;
transition: transform 0.1s linear;
}
transform: translateX(-50%) translateY(0); /* chỉ dịch ngang center */
}
/*Overlay*/
.c-aoverlay.show {
opacity: 1;
visibility: visible;
background: rgb(86 83 96 / 0.32);
width: 100vh;
}
.c-aoverlay {
position: absolute;
top: 0;
width: 0;
height: 100vh;
right: 0;
z-index: 2000;
opacity: 0;
visibility: hidden;
transition: all ease-in .4s;
}
/*End Ovelay*/

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 57 KiB

File diff suppressed because one or more lines are too long

View File

@ -43,13 +43,33 @@ window.L1000 = function () {
}
}
});
const parallaxEls = document.querySelectorAll('.parallax');
let ticking = false;
const swiper1 = new Swiper('.airlineSwiper', {
slidesPerView: 1,
spaceBetween: 30,
autoplay: {
delay: 2000, // 5s
disableOnInteraction: false, // không dừng khi hover hay click
},
loop: true, // bật loop để chạy liên tục
speed: 1000,
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
loopedSlides: 5, // số slide duplicate
breakpoints: {
1200: { slidesPerView: 4 }, // màn hình ≥1200px
768: { slidesPerView: 3 }, // ≥768px=
0: { slidesPerView: 2 } // <576px
},
});
parallaxEls.forEach(el => {
const parent = el.closest(".con-parallax");
if (parent) {
parent.style.height = parent.offsetHeight + "px";
if (parent) {
parent.style.height = parent.querySelector("[data-content]").offsetHeight + "px";
}
});
window.app.on("App_Scrolling", (t) => {
@ -114,23 +134,39 @@ function animateCount(el) {
}
function updateParallax(t, parallaxEls) {
parallaxEls.forEach(el => {
const rect = el.getBoundingClientRect();
const section = el.closest('.con-parallax');
if (!section) return;
const rect = section.getBoundingClientRect();
const sectionHeight = section.offsetHeight;
// Chỉ xử lý khi section trong khung nhìn
const inView = rect.bottom > 0 && rect.top < window.innerHeight;
if (!inView) return;
if (inView) {
const depth = parseFloat(el.dataset.depth || 0.5);
const progress = rect.top / window.innerHeight;
const img = el.querySelector('.bg-img');
if (el && img) {
// vị trí ban đầu wrapper
const wrapperOffset = -el.offsetHeight + (el.offsetHeight / 2); // top: -100% + translateY(50%)
// offset parallax
const parallaxOffset = progress * depth * el.offsetHeight;
// áp dụng vào image
img.style.transform = `translate(-50%, ${wrapperOffset + parallaxOffset}px)`;
}
// Set height parent 1 lần
const content = section.querySelector('[data-content]');
if (content && !section.dataset.heightSet) {
section.style.height = content.offsetHeight + 'px';
section.dataset.heightSet = 'true'; // đánh dấu đã set height
}
const img = el.querySelector('.bg-img');
if (!img) return;
const imgHeight = img.offsetHeight;
const depth = parseFloat(el.dataset.depth ?? 1); // 1 = chạy hết, <1 = chạy ít hơn
// progress: 0 khi section top chạm viewport top, 1 khi section bottom chạm viewport bottom
const progress = (window.innerHeight - rect.top) / (window.innerHeight + sectionHeight);
const clamped = Math.min(1, Math.max(0, progress));
// scrollable = toàn bộ quãng đường ảnh có thể chạy
const scrollable = imgHeight - sectionHeight;
// offset Y
const offsetY = -clamped * scrollable * depth;
img.style.transform = `translate(-50%, ${offsetY}px)`;
});
}

View File

@ -13,28 +13,54 @@ import ADropDown from '/js/libs/js-ADropDown.js'
class AsyncLayout extends ALayout {
constructor() {
super();
this.isLoaded = false;
this.layMNav = `<div class="m-header">
<a app-nav href="${window.GetAbsoluteURL("/")}" class="c_logo d-f a-i-center c-a">
<img src="/images/logo/slogo.png" />
<a href="javascript:void(0)" class="hd-close">
<i class="atg atg-x"></i>
</a>
</a>
<div class="navmain d-f f-c">
</div>
</div>`;
this.fHeader = `<div id="fHeader" class="f-header">
<div class="cfull">
<div class="r d-f a-i-center c_second_header">
<a app-nav href="${window.GetAbsoluteURL("/")}" class="c_logo d-f a-i-center c-a">
<span class="d-f no-wrap ml-2"><b class="lg">VIN</b> <b class="lg lg1">FONT</b></span>
<a href="javascript:void(0)" class="hd-close">
<i class="atg atg-x"></i>
</a>
<img src="/images/logo/slogo.png" style="height:32px" />
</a>
<div class="nav-mainmenu d-f f-c">
<div class="ml-auto navmain d-x-f d-n">
</div>
</div>`;
<div class="ml-auto d-f d-x-n a-i-center">
<a class="d-f nav-login mr-0"><i class="atg atg-search"></i></a>
<a app-nav href="${window.GetAbsoluteURL("/Login")}" class="d-f nav-login"><i class="atg atg-user"></i></a>
<div class="m-navbar">
<div class="d-f f-c ico-menu p-0">
<div><span style="width:100%"></span></div>
<div><span style="width:100%"></span></div>
<div><span style="width:100%"></span></div>
</div>
</div>
</div>
</div>
</div>
</div>`;
}
_createFHeader() {
document.body.insertAdjacentHTML("afterbegin", this.layMNav);
//document.body.insertAdjacentHTML("afterbegin", this.fHeader);
//var h = document.querySelector("#fHeader .nav-mainmenu");
//var h2 = document.querySelector(".m-header");
//var he2 = h2.querySelector(".nav-mainmenu");
//var r = document.querySelector("#header");
//r.querySelector(".nav-mainmenu").childNodes.forEach(el => {
// he2.appendChild(el.cloneNode(true));
// h.appendChild(el.cloneNode(true));
//})
document.body.insertAdjacentHTML("afterbegin", this.fHeader);
var h = document.querySelector("#fHeader .navmain");
var h2 = document.querySelector(".m-header");
var he2 = h2.querySelector(".navmain");
var r = document.querySelector("#header");
r.querySelector(".navmain").childNodes.forEach(el => {
he2.appendChild(el.cloneNode(true));
h.appendChild(el.cloneNode(true));
});
}
dispose() {
this.isLoaded = false;
@ -54,40 +80,36 @@ class AsyncLayout extends ALayout {
this._createFHeader();
this.dpLang = new ADropDown();
this.dpLang.bindDropDown(document.querySelector(".langnav"));
this.a1 = new AMenu("#header .navmain", ".m-header", document.querySelectorAll(".ico-menu"), true);
// window.app.initNavs("Async");
// var hHeader = document.getElementById("header").clientHeight;
// var fHeader = document.getElementById("fHeader");
window.app.initNavs("Async");
var hHeader = document.getElementById("header").clientHeight;
var fHeader = document.getElementById("fHeader");
// if (window.getOS() == "iOS") {
// fHeader.classList.add("ios");
// }
// const idE0 = window.app.on("App_Scrolling", (scrollY) => {
// if (scrollY > hHeader && !fHeader.classList.contains("show")) {
// fHeader.classList.add("show");
if (window.getOS() == "iOS") {
fHeader.classList.add("ios");
}
const idE0 = window.app.on("App_Scrolling", (scrollY) => {
if (scrollY > hHeader && !fHeader.classList.contains("show")) {
fHeader.classList.add("show");
// }
// if (scrollY < hHeader && fHeader.classList.contains("show")) {
// fHeader.classList.remove("show");
// }
// });
// this.addCustomEvent(idE0, window.app, "Async");
// var a1 = new AMenu("#header .nav-mainmenu", ".m-header", document.querySelectorAll(".m-navbar > .ico-menu"), true);
// this.listAObject.add(a1);
// var a2 = new AMenu("#fHeader .nav-mainmenu", null, null);
// this.listAObject.add(a2);
// const idE1 = window.app.on("redirect_page", (e) => {
// a1.changeActive();
// a2.changeActive();
// });
// this.addCustomEvent(idE1, window.app, "Async");
// const f = function (e) {
// window.app.initNavApp(window.GetAbsoluteURL("/Search"));
// }
// const btnMHeader = document.getElementById("btnMHeader");
//// btnMHeader.addEventListener(this.eventName, f);
// this.addSystemEvent(this.eventName, btnMHeader, f);
}
if (scrollY < hHeader && fHeader.classList.contains("show")) {
fHeader.classList.remove("show");
}
});
this.addCustomEvent(idE0, window.app, "Async");
var a1 = new AMenu("#header .navmain", ".m-header", document.querySelectorAll(".m-navbar > .ico-menu"), true);
this.listAObject.add(a1);
var a2 = new AMenu("#fHeader .navmain", null, null);
this.listAObject.add(a2);
const idE1 = window.app.on("redirect_page", (e) => {
a1.changeActive();
a2.changeActive();
});
this.addCustomEvent(idE1, window.app, "Async");
const f = function (e) {
window.app.initNavApp(window.GetAbsoluteURL("/Search"));
}
}
}
window.ALayout.set("Async", new AsyncLayout());