Layout Design

This commit is contained in:
2025-08-12 17:24:39 +07:00
parent 228cce8ef2
commit e6232374bf
35 changed files with 1036 additions and 4303 deletions

View File

@ -1,4 +1,5 @@
using System.Diagnostics; using System.Diagnostics;
using AppLibs.Libs;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using TWA_App.Models; using TWA_App.Models;
@ -12,10 +13,10 @@ namespace TWA_App.Controllers
{ {
_logger = logger; _logger = logger;
} }
[PageInfor("1000", "Home")]
public IActionResult Index() public async Task<IActionResult> Index()
{ {
return View(); return await this.ViewAsync();
} }
public IActionResult Privacy() public IActionResult Privacy()

187
TWA-App/Json/navlist.json Normal file
View File

@ -0,0 +1,187 @@
[
{
"id": "1000",
"name": "Home",
"icon": "home",
"group": 0,
"url": "/",
"sub-item": ""
},
{
"id": "2000",
"name": "Company",
"icon": "",
"group": 0,
"url": "",
"sub-item": [
{
"id": "2001",
"name": "About Us",
"url": "/Company/AboutUs"
},
{
"id": "2002",
"name": "Our Team",
"url": "/Company/OurTeam"
},
{
"id": "2003",
"name": "Mission & Vision",
"url": "/Company/Mission-Vision"
},
{
"id": "2004",
"name": "Milestone",
"url": "/Company/Milestone"
},
{
"id": "2005",
"name": "Careers",
"url": "/Company/Careers"
},
{
"id": "2006",
"name": "Partners",
"url": "/Company/Partners"
}
]
},
{
"id": "3000",
"name": "Services",
"icon": "",
"group": 0,
"url": "",
"sub-item": [
{
"name": "Air Cargo",
"group": 1
},
{
"id": "3001",
"name": "Air Freigth",
"url": "/GlyphFonts/Icons"
},
{
"id": "3002",
"name": "Air Forwarder",
"url": "/GlyphFonts/Glyps"
},
{
"id": "3003",
"name": "Cargo Tracking",
"url": "/GlyphFonts/Glyps"
},
{
"id": "3004",
"name": "Groupage",
"url": "/GlyphFonts/Glyps"
},
{
"id": "3004",
"name": "Special Cargo Handling",
"url": "/GlyphFonts/Glyps"
},
{
"name": "Air Passenger",
"group": 1
},
{
"id": "3005",
"name": "Ticketing & Reservation",
"url": "/GlyphFonts/Glyps"
},
{
"id": "3006",
"name": "Check-in Services",
"url": "/GlyphFonts/Glyps"
},
{
"id": "3007",
"name": "Baggage Handling",
"url": "/GlyphFonts/Glyps"
},
{
"id": "3008",
"name": "Customer Service & Support",
"url": "/GlyphFonts/Glyps"
},
{
"name": "Warehouse",
"group": 1
},
{
"id": "3009",
"name": "Contract Logistics",
"url": "/GlyphFonts/Glyps"
},
{
"id": "3010",
"name": "Value Added Services",
"url": "/GlyphFonts/Glyps"
},
{
"id": "3011",
"name": "Warehouse Logistics",
"url": "/GlyphFonts/Glyps"
},
{
"id": "3010",
"name": "Consultancy",
"url": "/GlyphFonts/Glyps"
}
]
},
{
"id": "4000",
"name": "News & Events",
"icon": "",
"group": 0,
"url": "",
"sub-item": [
{
"id": "4001",
"name": "Vectors",
"flexpage": true,
"url": "/Images/Vectors"
},
{
"id": "4002",
"name": "Ảnh Chụp",
"flexpage": true,
"url": "/Images/Photos"
}
]
},
{
"id": "5000",
"name": "Resources",
"icon": "",
"group": 0,
"url": "",
"sub-item": [
{
"id": "5001",
"name": "Vectors",
"flexpage": true,
"url": "/Images/Vectors"
},
{
"id": "5002",
"name": "Ảnh Chụp",
"flexpage": true,
"url": "/Images/Photos"
}
]
},
{
"id": "6000",
"name": "Contact",
"icon": "",
"group": 0,
"url": "",
"sub-item": ""
}
]

View File

@ -1,7 +1,10 @@
using AppLibs.Libs;
await WSNavigation.LoadJson();
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container. // Add services to the container.
builder.Services.AddControllersWithViews(); builder.Services.AddControllersWithViews().AddRazorRuntimeCompilation();
var app = builder.Build(); var app = builder.Build();

View File

@ -7,4 +7,15 @@
<RootNamespace>TWA_App</RootNamespace> <RootNamespace>TWA_App</RootNamespace>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="9.0.7" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup>
<Reference Include="AppLibs">
<HintPath>..\..\..\..\OneDrive - ATG SERVICES AND TRADING CORPORATION\My Documents\Project\MikaltoResort\AppLibs\AppLibs\bin\Release\net8.0\AppLibs.dll</HintPath>
</Reference>
</ItemGroup>
</Project> </Project>

View File

@ -1,8 +1,164 @@
@{ <div class="cfull">
ViewData["Title"] = "Home Page"; <div class="rSlider">
} <div class="swiper 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"));">
</div>
<div class="con_slider">
<div class="h-100 d-f a-i-center">
<div class="cfull">
<div class="r-n-g d-f f-c a-i-center banner-content">
<h1>Air Freight</h1>
<div class="sec-header">
<h2>Global air, local care</h2>
</div>
<span class="desc">
Your cargo, delivered anywhere in the world with confidence, care, and the reliability you can trust
</span>
<div class="d-f mt-5">
<div class="sec-1">
<button class="btn btn-second">See Details</button>
</div>
<div class="sec-2 ml-2">
<button class="btn btn-primary">Quote for Air Freight</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="swiper-slide">
<div class="background">
<img src="/images/banner/b3.jpg">
</div>
</div>
<div class="swiper-slide">
<div class="background">
<img src="/images/banner/b2.jpg">
</div>
</div>
</div>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
<div class="text-center"> </div>
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div> </div>
<section>
<div class="con">
<div class="r">
<div class="con-feature r-n-g">
<div class="c-12 c-s-6 c-m-4">
<div class="flex-feature d-f f-c a-i-center">
<i class="atg a-8x atg-trusted"></i>
<h3>
Trusted Air Partner
</h3>
<p>Safe, reliable air cargo booking and shipping, ensuring secure, timely, and cost-effective delivery</p>
</div>
</div>
<div class="c-12 c-s-6 c-m-4">
<div class="flex-feature d-f f-c a-i-center">
<i class="atg a-8x atg-air-cargo"></i>
<h3>
Professional Booking & Live Tracking
</h3>
<p>Dedicated teams provide efficient cargo booking and shipping with real-time shipment tracking</p>
</div>
</div>
<div class="c-12 c-s-6 c-m-4">
<div class="flex-feature d-f f-c a-i-center">
<i class="atg a-8x atg-support"></i>
<h3>Dedicated Customer Care</h3>
<p>Committed to transparent, devoted service and full support for all customer needs in cargo and passenger transportation</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Hero Section -->
<section class="pt-5 pb-5">
<div class="con">
<div class="r j-c-center">
<div class="c-12 c-m-10 text-center">
<h1 class="mb-3">Welcome to Aviationaly</h1>
<p class="mb-4">Start your aviation journey with professional instructors and top-notch facilities.</p>
<button class="p-2 bg-white">Get Started</button>
</div>
</div>
</div>
</section>
<!-- Features Section -->
<!-- Courses Section -->
<section class="pt-5 pb-5">
<div class="con">
<div class="r j-c-center">
<div class="c-12 text-center">
<h2 class="mb-3">Our Programs</h2>
</div>
<div class="r gap-3">
<div class="c-12 c-s-6 c-m-4 text-center">
<h4 class="mb-1">Private Pilot License</h4>
<p>Learn the fundamentals of flying and become a licensed pilot.</p>
</div>
<div class="c-12 c-s-6 c-m-4 text-center">
<h4 class="mb-1">Commercial Pilot License</h4>
<p>Advance your skills and prepare for a professional aviation career.</p>
</div>
<div class="c-12 c-s-6 c-m-4 text-center">
<h4 class="mb-1">Flight Instructor Course</h4>
<p>Teach others how to fly and build flight hours simultaneously.</p>
</div>
</div>
</div>
</div>
</section>
<!-- Testimonials Section -->
<section class="pt-5 pb-5 bg-white">
<div class="con">
<div class="r j-c-center">
<div class="c-12 text-center">
<h2 class="mb-3">What Students Say</h2>
</div>
<div class="r gap-3">
<div class="c-12 c-s-6 c-m-6">
<p class="mb-1">"Great instructors and hands-on training. I got my PPL in no time!"</p>
<strong>- Alex T.</strong>
</div>
<div class="c-12 c-s-6 c-m-6">
<p class="mb-1">"Modern facilities and friendly staff. Highly recommended!"</p>
<strong>- Maria L.</strong>
</div>
</div>
</div>
</div>
</section>
<!-- Contact Section -->
<section class="pt-5 pb-5">
<div class="con">
<div class="r j-c-center">
<div class="c-12 c-s-10 c-m-6">
<h2 class="mb-3 text-center">Contact Us</h2>
<form class="d-f f-c gap-2">
<input type="text" placeholder="Name" class="p-2">
<input type="email" placeholder="Email" class="p-2">
<textarea rows="4" placeholder="Message" class="p-2"></textarea>
<button class="p-2 bg-white">Send Message</button>
</form>
</div>
</div>
</div>
</section>
<!-- Footer -->
@section jsLib {
<script src="@Url.AbsoluteContent("~/js/ext_libs/swiper-bundle.min.js")" js-lib></script>
<script type="module" src="@Url.AbsoluteContent("~/js/js-page/1000.js")" js-lib></script>
}

View File

@ -0,0 +1,3 @@
<div class="con">
<p class="m-0">&copy; 2025 Aviationaly. All rights reserved.</p>
</div>

View File

@ -0,0 +1,31 @@
<div class="con hblock1">
<div class="r j-c-between a-i-center">
<div class="c-6 mt-2 mb-3">
<img src="~/images/logo/slogo.png" style="height:50px">
</div>
<div class="righ-bar d-f a-i-center">
<div class="d-s-b" data-dropdown>
<a href="javascript:void(0)" class="d-f a-i-center langnav"><span class="atg atg-world a-2x mr-1"></span> English <i class="atg a-s8x a-down-thick ml-2"></i></a>
<div class="sub-item">
<div class="nav-i"><a href="#" class="nav-link"><span>Vietnam</span></a></div>
<div class="nav-i"><a href="#" class="nav-link"><span>Cambodia</span></a></div>
</div>
</div>
<a class="btn btn-signin ml-4">Sign in</a>
</div>
</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>
<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>
</div>
</div>

View File

@ -0,0 +1,72 @@
@using AppLibs.Libs
@{
List<NavItem> t = await WSNavigation.GetListMenu();
}
@foreach (var i in t)
{
if (i.SubItem == null)
{
<div class="nav-i">
<a href="@i.Url" @Html.Raw(i.IsFlexPage) nav-id ="@i.ID" class="nav-item">@i.Name</a>
</div>
}
else
{
<div class="nav-i has-sub" data-dropdown>
<a href="javascript:void(0)" nav-id="@i.ID" class="nav-item">@i.Name<i class="atg a-s6x a-down-thick mt-1 ml-2"></i></a>
@switch (i.ID)
{
case "3000":
<div class="sub-item sub-nav-full">
<div class="cfull">
<div class="r-n-g">
@{
string s = "";
string groupHtml = "";
string list = "";
foreach (var j in i.SubItem)
{
if (j.IsGroup)
{
if (groupHtml.Length > 0)
{
s += String.Format(groupHtml, list);
list = "";
}
groupHtml = $"<div class=\"c-l-4 c-x-3\"><div class=\"nav-col d-f f-c\"><h3 class=\"title\">{j.Name}</h3>{{0}}</div></div>";
}else{
list += $"<div class=\"nav-i\"><a href=\"{j.Url}\" {j.ToFlexPageAttribute()} nav-id=\"{j.ID}\" class=\"nav-link\"><span>{j.Name}</span></a></div>";
}
}
if (groupHtml.Length > 0)
{
s += String.Format(groupHtml, list);
}
}
@Html.Raw(s)
<div class="d-n d-x-b c-x-3">
<img class="w-100" src="~/images/layout/air.png" />
</div>
</div>
</div>
</div>
break;
default:
<div class="sub-item">
@foreach (var j in i.SubItem)
{
<div class="nav-i"><a href="@j.Url" @j.ToFlexPageAttribute() nav-id="@j.ID" class="nav-link"><span>@j.Name</span></a></div>
}
</div>
break;
}
</div>
}
}

View File

@ -1,25 +0,0 @@
@model ErrorViewModel
@{
ViewData["Title"] = "Error";
}
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (Model.ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@Model.RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>

View File

@ -1,130 +1,66 @@
<!doctype html> @{
IgnoreSection("jsLib");
IgnoreSection("jsPage");
IgnoreBody();
}
<!doctype html>
<html lang="en"> <html lang="en">
<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, maximum-scale=1.0, user-scalable=0" />
<title>Aviationaly - Aviation & Flight School</title> <meta name="idPage" content="@ViewData["PageID"]" pageName="Trans World Aviation" layName="@ViewData["LayoutName"]" flexPage="@ViewData["FlexPage"]" />
<link rel="stylesheet" href="~/css/atg-lib/atg-core.css"> <title></title>
<link rel="icon" type="image/png" sizes="32x32" href="@Url.AbsoluteContent("~/images/logo/icon.png")">
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Mulish:ital,wght@0,200..1000;1,200..1000&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="~/css/atg-lib/atg-core.css" />
<link rel="stylesheet" href="~/css/atg-lib/swiper-bundle.min.css" />
<link rel="stylesheet" href="~/css/site.css" />
<link rel="stylesheet" href="~/css/atg-font/atg-admin-font.css" />
</head> </head>
<body class="bg-white"> <body>
<!-- Header --> <section data-scrollbar class="main-scrollbar">
<header class="p-3 bg-white"> <div class="loading"></div>
<div class="con"> <div class="main-wrapper" app-content>
<div class="r j-c-between a-i-center"> <header id="header"></header>
<div class="c-6"> <div class="main-container">
<img src="aviationkit/wp-content/uploads/sites/106/2022/09/aviationaly-logo-1.png" alt="Logo" style="height:50px"> <main main-content>
</div>
<nav class="c-6 d-f j-c-end gap-3">
<a href="#">Home</a>
<a href="#">Courses</a>
<a href="#">About</a>
<a href="#">Contact</a>
</nav>
</div>
</div>
</header>
<!-- Hero Section --> </main>
<section class="pt-5 pb-5">
<div class="con">
<div class="r j-c-center">
<div class="c-12 c-m-10 text-center">
<h1 class="mb-3">Welcome to Aviationaly</h1>
<p class="mb-4">Start your aviation journey with professional instructors and top-notch facilities.</p>
<button class="p-2 bg-white">Get Started</button>
</div> </div>
</div> </div>
</div> <footer id="footer">
</section>
<!-- Features Section -->
<section class="pt-5 pb-5 bg-white">
<div class="con">
<div class="r gap-3">
<div class="c-12 c-s-6 c-m-4 text-center">
<h3 class="mb-2">Modern Fleet</h3>
<p>Train with the latest aircraft models and technologies.</p>
</div>
<div class="c-12 c-s-6 c-m-4 text-center">
<h3 class="mb-2">Certified Instructors</h3>
<p>Learn from aviation experts with years of experience.</p>
</div>
<div class="c-12 c-s-6 c-m-4 text-center">
<h3 class="mb-2">Flexible Scheduling</h3>
<p>Choose courses that fit your lifestyle and availability.</p>
</div>
</div>
</div>
</section>
<!-- Courses Section -->
<section class="pt-5 pb-5">
<div class="con">
<div class="r j-c-center">
<div class="c-12 text-center">
<h2 class="mb-3">Our Programs</h2>
</div>
<div class="r gap-3">
<div class="c-12 c-s-6 c-m-4 text-center">
<h4 class="mb-1">Private Pilot License</h4>
<p>Learn the fundamentals of flying and become a licensed pilot.</p>
</div>
<div class="c-12 c-s-6 c-m-4 text-center">
<h4 class="mb-1">Commercial Pilot License</h4>
<p>Advance your skills and prepare for a professional aviation career.</p>
</div>
<div class="c-12 c-s-6 c-m-4 text-center">
<h4 class="mb-1">Flight Instructor Course</h4>
<p>Teach others how to fly and build flight hours simultaneously.</p>
</div>
</div>
</div>
</div>
</section>
<!-- Testimonials Section -->
<section class="pt-5 pb-5 bg-white">
<div class="con">
<div class="r j-c-center">
<div class="c-12 text-center">
<h2 class="mb-3">What Students Say</h2>
</div>
<div class="r gap-3">
<div class="c-12 c-s-6 c-m-6">
<p class="mb-1">"Great instructors and hands-on training. I got my PPL in no time!"</p>
<strong>- Alex T.</strong>
</div>
<div class="c-12 c-s-6 c-m-6">
<p class="mb-1">"Modern facilities and friendly staff. Highly recommended!"</p>
<strong>- Maria L.</strong>
</div>
</div>
</div>
</div>
</section>
<!-- Contact Section -->
<section class="pt-5 pb-5">
<div class="con">
<div class="r j-c-center">
<div class="c-12 c-s-10 c-m-6">
<h2 class="mb-3 text-center">Contact Us</h2>
<form class="d-f f-c gap-2">
<input type="text" placeholder="Name" class="p-2">
<input type="email" placeholder="Email" class="p-2">
<textarea rows="4" placeholder="Message" class="p-2"></textarea>
<button class="p-2 bg-white">Send Message</button>
</form>
</div>
</div>
</div>
</section>
@RenderBody()
<!-- Footer -->
<footer class="p-3 bg-white text-center">
<div class="con">
<p class="m-0">&copy; 2025 Aviationaly. All rights reserved.</p>
</div>
</footer> </footer>
</section>
<script src="@Url.AbsoluteContent("~/js/libs/js-core.js")"></script>
<section app-js-lib>
<script src="@Url.AbsoluteContent("~/js/ext_libs/js-scrollbar.js")" js-lib></script>
<script src="@Url.AbsoluteContent("~/js/libs/js-waves.js")" js-lib></script>
</section>
<section app-js-page>
</section>
<script>
window.requestTimeout(() => {
window.app = new AApp('[app-content] > .main-container');
(function () {
var asyncStyleSheets = [
'@Url.AbsoluteContent("~/css/atg-lib/atg-core.css")',
'@Url.AbsoluteContent("~/css/site.css")'
];
window.app.loadCSS(asyncStyleSheets);
})();
(function () {
window.app.render();
window.app.initScrollBar();
var asyncStyleSheets = [
'https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap',
'/css/atg-font/atg-admin-font.css',
'/css/atg-lib/waves.min.css'
];
window.app.loadCSS(asyncStyleSheets);
})();
}, 5, window.registerCancel);
</script>
</body> </body>
</html> </html>

View File

@ -0,0 +1,12 @@
<div id="header">
@await Html.PartialAsync("~/Views/Partial/Header.cshtml")
</div>
<div id="section1">
</div>
<div id="footer">
@await Html.PartialAsync("~/Views/Partial/Footer.cshtml")
</div>
@section jsLib {
<script type="module" src="@Url.AbsoluteContent("~/js/js-page/asyncLayout.js")" js-lib></script>
}

View File

@ -0,0 +1,5 @@
@RenderSection("jsLib", required: false)
@RenderSection("jsPage", required: false)
@{
IgnoreBody();
}

View File

@ -1,2 +0,0 @@
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script>

View File

@ -1,3 +1,4 @@
@using TWA_App @using TWA_App
@using TWA_App.Models @using TWA_App.Models
@using AppLibs.Libs;
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

View File

@ -1,3 +1,11 @@
@{ @{
switch (ViewData["Layout"])
{
case "SectionScript":
Layout = "_PartialScript";
break;
default:
Layout = "_Layout"; Layout = "_Layout";
break;
}
} }

View File

@ -7,6 +7,9 @@
} }
.atg { .atg {
line-height: 1;
display: flex;
align-items:center;
font-style: normal; font-style: normal;
font-family: atg-admin-font; font-family: atg-admin-font;
font-weight: 400; font-weight: 400;
@ -15,7 +18,12 @@
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.a-s6x{
font-size: .55em
}
.a-s8x{
font-size: .8em
}
.a-1x { .a-1x {
font-size: 1em font-size: 1em
} }
@ -298,3 +306,17 @@
.atg-filters-light:before { .atg-filters-light:before {
content: "\a03E" content: "\a03E"
} }
.atg-world:before {
content: "\a028"
}
.atg-trusted:before {
content: '\a03f'
}
.atg-air-cargo:before {
content: '\a040'
}
.atg-support:before {
content: '\a041'
}

View File

@ -193,3 +193,4 @@
.a-bag:before { .a-bag:before {
content: '\f0028' content: '\f0028'
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 684 B

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,9 +1,47 @@
import AGrid from '/js/libs/js-AGrid.js' 
function isInViewport(element) {
const rect = element.getBoundingClientRect();
return (
rect.top < window.innerHeight &&
rect.bottom > 0 &&
rect.left < window.innerWidth &&
rect.right > 0
);
}
function updateActiveSlideShow(swiperInstance) {
swiperInstance.slides.forEach(slide => slide.classList.remove('show'));
const activeSlide = swiperInstance.slides[swiperInstance.activeIndex];
if (isInViewport(activeSlide)) {
activeSlide.classList.add('show');
}
}
window.L1000 = function () { window.L1000 = function () {
const swiper = new Swiper('.mainSlider', {
loop: true,
on: {
slideChangeTransitionEnd: function () {
updateActiveSlideShow(this);
}
}
});
document.addEventListener('visibilitychange', function () {
if (document.visibilityState === 'hidden') {
// Remove class show khỏi tất cả các slide
swiper.slides.forEach(slide => slide.classList.remove('show'));
}
var a = new AGrid({ "element": ".GridGraphics" }); if (document.visibilityState === 'visible') {
// Add class show lại cho slide đang active
var a1 = new AGrid({ "element": ".AGrid-WaterFall", "gridType": "waterfall" }) const activeSlide = swiper.slides[swiper.activeIndex];
if (activeSlide) {
// Delay một chút để CSS animation có thời gian reset
window.requestTimeout(() => {
activeSlide.classList.add('show');
}, 50); // delay nhẹ để đảm bảo browser detect lại class
}
}
});
} }
window.AScript.set("1000", true); window.AScript.set("1000", true);

View File

@ -1,16 +1,16 @@
import AMenu from '/js/libs/js-AMenu.js' import AMenu from '/js/libs/js-AMenu.js'
import ALayout from '/js/libs/js-ALayout.js' import ALayout from '/js/libs/js-ALayout.js'
import ADropDown from '/js/libs/js-ADropDown.js'
var asyncStyleSheets = [ //var asyncStyleSheets = [
'https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap', // 'https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap',
'/css/atg-font/atg-admin-font.css' // '/css/atg-font/atg-admin-font.css'
]; //];
window.app.loadCSS(asyncStyleSheets); //window.app.loadCSS(asyncStyleSheets);
class AsyncLayout extends ALayout { class AsyncLayout extends ALayout {
constructor() { constructor() {
super(); super();
this.isLoaded = false;
this.layMNav = `<div class="m-header"> this.layMNav = `<div class="m-header">
<a app-nav href="${window.GetAbsoluteURL("/")}" class="c_logo d-f a-i-center c-a"> <a app-nav href="${window.GetAbsoluteURL("/")}" class="c_logo d-f a-i-center c-a">
<img src="/images/logo/logo.jpg" /> <img src="/images/logo/logo.jpg" />
@ -21,45 +21,19 @@ class AsyncLayout extends ALayout {
</a> </a>
<div class="nav-mainmenu d-f f-c"> <div class="nav-mainmenu d-f f-c">
</div> </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">
<img src="/images/logo/logo.jpg" />
<span class="d-f no-wrap ml-2"><b class="lg">VIN</b> <b class="lg lg1">FONT</b></span>
</a>
<div class="ml-auto nav-mainmenu d-x-f d-n">
</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>`; </div>`;
} }
_createFHeader() { _createFHeader() {
document.body.insertAdjacentHTML("afterbegin", this.layMNav); document.body.insertAdjacentHTML("afterbegin", this.layMNav);
document.body.insertAdjacentHTML("afterbegin", this.fHeader); //document.body.insertAdjacentHTML("afterbegin", this.fHeader);
var h = document.querySelector("#fHeader .nav-mainmenu"); //var h = document.querySelector("#fHeader .nav-mainmenu");
var h2 = document.querySelector(".m-header"); //var h2 = document.querySelector(".m-header");
var he2 = h2.querySelector(".nav-mainmenu"); //var he2 = h2.querySelector(".nav-mainmenu");
var r = document.querySelector("#header"); //var r = document.querySelector("#header");
r.querySelector(".nav-mainmenu").childNodes.forEach(el => { //r.querySelector(".nav-mainmenu").childNodes.forEach(el => {
he2.appendChild(el.cloneNode(true)); // he2.appendChild(el.cloneNode(true));
h.appendChild(el.cloneNode(true)); // h.appendChild(el.cloneNode(true));
}) //})
} }
dispose() { dispose() {
this.isLoaded = false; this.isLoaded = false;
@ -77,38 +51,42 @@ class AsyncLayout extends ALayout {
renderMenu() { renderMenu() {
this.isLoaded = true; this.isLoaded = true;
this._createFHeader(); this._createFHeader();
window.app.initNavs("Async"); this.dpLang = new ADropDown();
var hHeader = document.getElementById("header").clientHeight; this.dpLang.bindDropDown(document.querySelector(".langnav"));
var fHeader = document.getElementById("fHeader"); this.a1 = new AMenu("#header .navmain", ".m-header", document.querySelectorAll(".ico-menu"), true);
if (window.getOS() == "iOS") { // window.app.initNavs("Async");
fHeader.classList.add("ios"); // var hHeader = document.getElementById("header").clientHeight;
} // var fHeader = document.getElementById("fHeader");
const idE0 = window.app.on("App_Scrolling", (scrollY) => {
if (scrollY > hHeader && !fHeader.classList.contains("show")) {
fHeader.classList.add("show");
} // if (window.getOS() == "iOS") {
if (scrollY < hHeader && fHeader.classList.contains("show")) { // fHeader.classList.add("ios");
fHeader.classList.remove("show"); // }
} // const idE0 = window.app.on("App_Scrolling", (scrollY) => {
}); // if (scrollY > hHeader && !fHeader.classList.contains("show")) {
this.addCustomEvent(idE0, window.app, "Async"); // fHeader.classList.add("show");
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); // if (scrollY < hHeader && fHeader.classList.contains("show")) {
this.listAObject.add(a2); // fHeader.classList.remove("show");
const idE1 = window.app.on("redirect_page", (e) => { // }
a1.changeActive(); // });
a2.changeActive(); // this.addCustomEvent(idE0, window.app, "Async");
}); // var a1 = new AMenu("#header .nav-mainmenu", ".m-header", document.querySelectorAll(".m-navbar > .ico-menu"), true);
this.addCustomEvent(idE1, window.app, "Async"); // this.listAObject.add(a1);
const f = function (e) { // var a2 = new AMenu("#fHeader .nav-mainmenu", null, null);
window.app.initNavApp(window.GetAbsoluteURL("/Search")); // this.listAObject.add(a2);
} // const idE1 = window.app.on("redirect_page", (e) => {
const btnMHeader = document.getElementById("btnMHeader"); // a1.changeActive();
// btnMHeader.addEventListener(this.eventName, f); // a2.changeActive();
this.addSystemEvent(this.eventName, btnMHeader, f); // });
// 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);
} }
} }
window.ALayout.set("Async", new AsyncLayout()); window.ALayout.set("Async", new AsyncLayout());

View File

@ -1,128 +0,0 @@
import AMenu from '/js/libs/js-AMenu.js'
import ALayout from '/js/libs/js-ALayout.js'
var asyncStyleSheets = [
'https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap',
'/css/atg-font/atg-admin-font.css'
];
window.app.loadCSS(asyncStyleSheets);
window.Load_Menu = function () {
//var a1 = new AMenu("#header .nav-mainmenu", ".m-header", document.querySelectorAll(".m-navbar > .ico-menu"), true);
//var a2 = new AMenu("#fHeader .nav-mainmenu", null, null);
//console.log(document.getElementById("btnMHeader"));
//document.getElementById("btnMHeader").addEventListener("click", (e) => {
// window.app.initNavApp(window.GetAbsoluteURL("/Search"));
//});
}
class Async1Layout 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/logo.jpg" />
<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>
</a>
<div class="nav-mainmenu d-f f-c">
</div>
</div>`;
this.fHeader = `<div id="fHeader" class="f-header">
<div class="cfull">
<div class="c_search_header d-f a-i-center j-c-between">
<div class="c_filter c-6 c-s-4 c-l-2">
<a app-nav href="${window.GetAbsoluteURL("/")}" class="c_logo d-f a-i-center mt-3 mb-3">
<img src="/images/logo/logo.jpg" />
<span class="d-f no-wrap ml-2"><b class="lg">VIN</b> <b class="lg lg1">FONT</b></span>
</a>
</div>
<div class="c-6 c-s-8 c-l-10">
<div class="c_inp_search d-f">
<div class="c_cat d-n d-s-b c-s-4 c-m-3 c-x-2 ">
<div class="d-f j-c-center a-i-center" data-dropdown>
<a href="javascript:void(0)" class="d-f a-o j-c-between a-i-center w-100 pl-3 pr-3">
<div class="d-f a-i-center"><i class="atg a-2x atg-all mr-2"></i><span class="d-n d-s-b">Tất cả</span></div>
<i class="atg a-1x a-down-thick ml-2"></i>
</a>
</div>
</div>
<input type="text" class="c-12 c-s-8 c-m-9 c-x-10" placeholder="Tìm kiếm hàng triệu font và nội dung thiết kế với chật lượng cao" />
<div class="c_btn_search d-f">
<a href="javascript:void(0)"><i class="atg a-2x atg-image-upload"></i></a>
<a href="javascript:void(0)" class="ml-3 mr-3"><i class="atg a-2x atg-search"></i></a>
</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");
}
dispose() {
this.isLoaded = false;
var h = document.getElementById("header");
var f = document.getElementById("footer");
var h1 = document.getElementById("fHeader");
document.querySelector(".m-header").remove();
f.removeAll();
h.removeAll();
h1.remove();
window.app.removeSytemEventParent(window.app.lName);
window.app.removeCustomEventParent(window.app.lName);
super.dispose();
}
renderMenu() {
this.isLoaded = true;
this._createFHeader();
window.app.initNavs("Async1");
var hHeader = document.getElementById("header").clientHeight;
var fHeader = document.getElementById("fHeader");
if (window.getOS() == "iOS") {
fHeader.classList.add("ios");
}
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, "Async1");
//var a1 = new AMenu("#header .nav-mainmenu", ".m-header", document.querySelectorAll(".m-navbar > .ico-menu"), true);
//var a2 = new AMenu("#fHeader .nav-mainmenu", null, null);
//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);
}
}
window.ALayout.set("Async1", new Async1Layout());
window.AScript.set("asyncLayout1", true);