update services page

This commit is contained in:
2025-09-27 19:03:32 +07:00
parent 1cd8632d9f
commit fed702fce8
43 changed files with 1278 additions and 585 deletions

View File

@ -155,10 +155,10 @@ namespace AppLibs.Libs
}
}
public static async Task<string> ReadStaticPage(this Controller controller, string id)
public static async Task<string> ReadStaticPage(this Controller controller, string file)
{
var filePath = Path.Combine(Directory.GetCurrentDirectory(),
"Data", "page", $"{id}.html");
"Data", "pages", $"{file}");
if (!System.IO.File.Exists(filePath))
throw new FileNotFoundException();

View File

@ -19,7 +19,7 @@ namespace TWA_App.Controllers
ViewData["PageID"] = result.ID;
ViewData["Title"] = result.Name;
ViewBag.Content = await this.ReadStaticPage(result.ID);
ViewBag.Content = await this.ReadStaticPage(Path.Join("company", result.ID + ".html"));
return await this.ViewAsync();
}
}

View File

@ -0,0 +1,32 @@
using AppLibs.Libs;
using Microsoft.AspNetCore.Mvc;
namespace TWA_App.Controllers
{
public class ServicesController : Controller
{
[PageInfor("3000", "Services", "/Services/*")]
[Layout(LayoutOptions.Default)]
public async Task<IActionResult> Index(string? id)
{
if (id != null)
{
NavItem list = (await WSNavigation.GetListMenu())[2];
if (list.SubItem != null && list.SubItem.Count > 0)
{
NavItem? result = list.SubItem.FirstOrDefault(l => l.Url.Split('/').Last().Equals(id));
if (result != null)
{
ViewData["PageID"] = result.ID;
ViewData["Title"] = result.Name;
ViewBag.Content = await this.ReadStaticPage(Path.Join("services", result.ID + ".html"));
return await this.ViewAsync();
}
}
}
return NotFound();
}
}
}

View File

@ -1,64 +0,0 @@
<div class="con-masthead">
<video class="bg-video" playsinline="playsinline" autoplay="autoplay" muted="muted" loop="loop"><source src="/images/wait-section/bg.mp4" type="video/mp4" /></video>
<!-- Masthead-->
<div class="masthead">
<div class="cfull">
<div class="r">
<div class="c-12">
<div class="masthead-content ">
<div class="cfull px-4 px-lg-0">
<h2 class="fst-italic lh-1 mb-4">Were creating content for this section</h2>
<p class="mb-5">
Content for the provincial pages is being prepared and will be updated soon. Please leave your email to receive updates and be notified when it goes live.
</p>
<!-- * * * * * * * * * * * * * * *-->
<!-- * * SB Forms Contact Form * *-->
<!-- * * * * * * * * * * * * * * *-->
<!-- This form is pre-integrated with SB Forms.-->
<!-- To make this form functional, sign up at-->
<!-- https://startbootstrap.com/solution/contact-forms-->
<!-- to get an API token!-->
<form id="contactForm" data-sb-form-api-token="API_TOKEN">
<!-- Email address input-->
<div class="d-f input-group-newsletter">
<div class="c"><input class="form-control h-100" id="email" type="email" placeholder="Enter email address..." aria-label="Enter email address..." data-sb-validations="required,email" /></div>
<div class="c-a"><button class="btn btn-primary disabled ml-2 h-100" id="submitButton" type="submit">Notify Me!</button></div>
</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:required">An email is required.</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:email">Email is not valid.</div>
<!-- Submit success message-->
<!---->
<!-- This is what your users will see when the form-->
<!-- has successfully submitted-->
<div class="d-n" id="submitSuccessMessage">
<div class="text-center mb-3 mt-2">
<div class="fw-bolder">Form submission successful!</div>
To activate this form, sign up at
<br />
<a href="https://startbootstrap.com/solution/contact-forms">https://startbootstrap.com/solution/contact-forms</a>
</div>
</div>
<!-- Submit error message-->
<!---->
<!-- This is what your users will see when there is-->
<!-- an error submitting the form-->
<div class="d-n" id="submitErrorMessage"><div class="text-center text-danger mb-3 mt-2">Error sending message!</div></div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Social Icons-->
<!-- For more icon options, visit https://fontawesome.com/icons?d=gallery&p=2&s=brands-->
<div class="social-icons">
<div class="d-f f-r f-l-c j-c-center a-i-center h-100 mt-3 mt-l-0">
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-facebook"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-yt"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-tiktok"></i></a>
</div>
</div>
</div>

View File

@ -1,64 +0,0 @@
<div class="con-masthead">
<video class="bg-video" playsinline="playsinline" autoplay="autoplay" muted="muted" loop="loop"><source src="/images/wait-section/bg.mp4" type="video/mp4" /></video>
<!-- Masthead-->
<div class="masthead">
<div class="cfull">
<div class="r">
<div class="c-12">
<div class="masthead-content ">
<div class="cfull px-4 px-lg-0">
<h2 class="fst-italic lh-1 mb-4">Were creating content for this section</h2>
<p class="mb-5">
Content for the provincial pages is being prepared and will be updated soon. Please leave your email to receive updates and be notified when it goes live.
</p>
<!-- * * * * * * * * * * * * * * *-->
<!-- * * SB Forms Contact Form * *-->
<!-- * * * * * * * * * * * * * * *-->
<!-- This form is pre-integrated with SB Forms.-->
<!-- To make this form functional, sign up at-->
<!-- https://startbootstrap.com/solution/contact-forms-->
<!-- to get an API token!-->
<form id="contactForm" data-sb-form-api-token="API_TOKEN">
<!-- Email address input-->
<div class="d-f input-group-newsletter">
<div class="c"><input class="form-control h-100" id="email" type="email" placeholder="Enter email address..." aria-label="Enter email address..." data-sb-validations="required,email" /></div>
<div class="c-a"><button class="btn btn-primary disabled ml-2 h-100" id="submitButton" type="submit">Notify Me!</button></div>
</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:required">An email is required.</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:email">Email is not valid.</div>
<!-- Submit success message-->
<!---->
<!-- This is what your users will see when the form-->
<!-- has successfully submitted-->
<div class="d-n" id="submitSuccessMessage">
<div class="text-center mb-3 mt-2">
<div class="fw-bolder">Form submission successful!</div>
To activate this form, sign up at
<br />
<a href="https://startbootstrap.com/solution/contact-forms">https://startbootstrap.com/solution/contact-forms</a>
</div>
</div>
<!-- Submit error message-->
<!---->
<!-- This is what your users will see when there is-->
<!-- an error submitting the form-->
<div class="d-n" id="submitErrorMessage"><div class="text-center text-danger mb-3 mt-2">Error sending message!</div></div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Social Icons-->
<!-- For more icon options, visit https://fontawesome.com/icons?d=gallery&p=2&s=brands-->
<div class="social-icons">
<div class="d-f f-r f-l-c j-c-center a-i-center h-100 mt-3 mt-l-0">
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-facebook"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-yt"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-tiktok"></i></a>
</div>
</div>
</div>

View File

@ -1,64 +0,0 @@
<div class="con-masthead">
<video class="bg-video" playsinline="playsinline" autoplay="autoplay" muted="muted" loop="loop"><source src="/images/wait-section/bg.mp4" type="video/mp4" /></video>
<!-- Masthead-->
<div class="masthead">
<div class="cfull">
<div class="r">
<div class="c-12">
<div class="masthead-content ">
<div class="cfull px-4 px-lg-0">
<h2 class="fst-italic lh-1 mb-4">Were creating content for this section</h2>
<p class="mb-5">
Content for the provincial pages is being prepared and will be updated soon. Please leave your email to receive updates and be notified when it goes live.
</p>
<!-- * * * * * * * * * * * * * * *-->
<!-- * * SB Forms Contact Form * *-->
<!-- * * * * * * * * * * * * * * *-->
<!-- This form is pre-integrated with SB Forms.-->
<!-- To make this form functional, sign up at-->
<!-- https://startbootstrap.com/solution/contact-forms-->
<!-- to get an API token!-->
<form id="contactForm" data-sb-form-api-token="API_TOKEN">
<!-- Email address input-->
<div class="d-f input-group-newsletter">
<div class="c"><input class="form-control h-100" id="email" type="email" placeholder="Enter email address..." aria-label="Enter email address..." data-sb-validations="required,email" /></div>
<div class="c-a"><button class="btn btn-primary disabled ml-2 h-100" id="submitButton" type="submit">Notify Me!</button></div>
</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:required">An email is required.</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:email">Email is not valid.</div>
<!-- Submit success message-->
<!---->
<!-- This is what your users will see when the form-->
<!-- has successfully submitted-->
<div class="d-n" id="submitSuccessMessage">
<div class="text-center mb-3 mt-2">
<div class="fw-bolder">Form submission successful!</div>
To activate this form, sign up at
<br />
<a href="https://startbootstrap.com/solution/contact-forms">https://startbootstrap.com/solution/contact-forms</a>
</div>
</div>
<!-- Submit error message-->
<!---->
<!-- This is what your users will see when there is-->
<!-- an error submitting the form-->
<div class="d-n" id="submitErrorMessage"><div class="text-center text-danger mb-3 mt-2">Error sending message!</div></div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Social Icons-->
<!-- For more icon options, visit https://fontawesome.com/icons?d=gallery&p=2&s=brands-->
<div class="social-icons">
<div class="d-f f-r f-l-c j-c-center a-i-center h-100 mt-3 mt-l-0">
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-facebook"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-yt"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-tiktok"></i></a>
</div>
</div>
</div>

View File

@ -1,64 +0,0 @@
<div class="con-masthead">
<video class="bg-video" playsinline="playsinline" autoplay="autoplay" muted="muted" loop="loop"><source src="/images/wait-section/bg.mp4" type="video/mp4" /></video>
<!-- Masthead-->
<div class="masthead">
<div class="cfull">
<div class="r">
<div class="c-12">
<div class="masthead-content ">
<div class="cfull px-4 px-lg-0">
<h2 class="fst-italic lh-1 mb-4">Were creating content for this section</h2>
<p class="mb-5">
Content for the provincial pages is being prepared and will be updated soon. Please leave your email to receive updates and be notified when it goes live.
</p>
<!-- * * * * * * * * * * * * * * *-->
<!-- * * SB Forms Contact Form * *-->
<!-- * * * * * * * * * * * * * * *-->
<!-- This form is pre-integrated with SB Forms.-->
<!-- To make this form functional, sign up at-->
<!-- https://startbootstrap.com/solution/contact-forms-->
<!-- to get an API token!-->
<form id="contactForm" data-sb-form-api-token="API_TOKEN">
<!-- Email address input-->
<div class="d-f input-group-newsletter">
<div class="c"><input class="form-control h-100" id="email" type="email" placeholder="Enter email address..." aria-label="Enter email address..." data-sb-validations="required,email" /></div>
<div class="c-a"><button class="btn btn-primary disabled ml-2 h-100" id="submitButton" type="submit">Notify Me!</button></div>
</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:required">An email is required.</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:email">Email is not valid.</div>
<!-- Submit success message-->
<!---->
<!-- This is what your users will see when the form-->
<!-- has successfully submitted-->
<div class="d-n" id="submitSuccessMessage">
<div class="text-center mb-3 mt-2">
<div class="fw-bolder">Form submission successful!</div>
To activate this form, sign up at
<br />
<a href="https://startbootstrap.com/solution/contact-forms">https://startbootstrap.com/solution/contact-forms</a>
</div>
</div>
<!-- Submit error message-->
<!---->
<!-- This is what your users will see when there is-->
<!-- an error submitting the form-->
<div class="d-n" id="submitErrorMessage"><div class="text-center text-danger mb-3 mt-2">Error sending message!</div></div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Social Icons-->
<!-- For more icon options, visit https://fontawesome.com/icons?d=gallery&p=2&s=brands-->
<div class="social-icons">
<div class="d-f f-r f-l-c j-c-center a-i-center h-100 mt-3 mt-l-0">
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-facebook"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-yt"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-tiktok"></i></a>
</div>
</div>
</div>

View File

@ -0,0 +1,69 @@
<div class="con-masthead">
<video class="bg-video" playsinline="playsinline" autoplay="autoplay" muted="muted" loop="loop"><source src="/images/wait-section/bg.mp4" type="video/mp4" /></video>
<!-- Masthead-->
<div class="con h-100">
<div class="r h-a h-l-100">
<div class="c-12 c-l-8 c-x-6 masthead h-100">
<div class="r a-i-center h-100">
<div class="c-12">
<div class="masthead-content ">
<div class="px-4 px-lg-0">
<h2 class="fst-italic lh-1 mb-4">Were creating content for this section</h2>
<p class="mb-5">
Content for the provincial pages is being prepared and will be updated soon. Please leave your email to receive updates and be notified when it goes live.
</p>
<!-- * * * * * * * * * * * * * * *-->
<!-- * * SB Forms Contact Form * *-->
<!-- * * * * * * * * * * * * * * *-->
<!-- This form is pre-integrated with SB Forms.-->
<!-- To make this form functional, sign up at-->
<!-- https://startbootstrap.com/solution/contact-forms-->
<!-- to get an API token!-->
<form id="contactForm" data-sb-form-api-token="API_TOKEN">
<!-- Email address input-->
<div class="d-f input-group-newsletter">
<div class="c"><input class="form-control h-100" id="email" type="email" placeholder="Enter email address..." aria-label="Enter email address..." data-sb-validations="required,email" /></div>
<div class="c-a"><button class="btn btn-primary disabled ml-2 h-100" id="submitButton" type="submit">Notify Me!</button></div>
</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:required">An email is required.</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:email">Email is not valid.</div>
<!-- Submit success message-->
<!---->
<!-- This is what your users will see when the form-->
<!-- has successfully submitted-->
<div class="d-n" id="submitSuccessMessage">
<div class="text-center mb-3 mt-2">
<div class="fw-bolder">Form submission successful!</div>
To activate this form, sign up at
<br />
<a href="https://startbootstrap.com/solution/contact-forms">https://startbootstrap.com/solution/contact-forms</a>
</div>
</div>
<!-- Submit error message-->
<!---->
<!-- This is what your users will see when there is-->
<!-- an error submitting the form-->
<div class="d-n" id="submitErrorMessage"><div class="text-center text-danger mb-3 mt-2">Error sending message!</div></div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="c-12 c-l-8 c-x-6">
</div>
</div>
</div>
<!-- Social Icons-->
<!-- For more icon options, visit https://fontawesome.com/icons?d=gallery&p=2&s=brands-->
<div class="social-icons">
<div class="d-f f-r f-l-c j-c-center a-i-center h-100 mt-3 mt-l-0">
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-facebook"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-yt"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-tiktok"></i></a>
</div>
</div>
</div>

View File

@ -0,0 +1,69 @@
<div class="con-masthead">
<video class="bg-video" playsinline="playsinline" autoplay="autoplay" muted="muted" loop="loop"><source src="/images/wait-section/bg.mp4" type="video/mp4" /></video>
<!-- Masthead-->
<div class="con h-100">
<div class="r h-a h-l-100">
<div class="c-12 c-l-8 c-x-6 masthead h-100">
<div class="r a-i-center h-100">
<div class="c-12">
<div class="masthead-content ">
<div class="px-4 px-lg-0">
<h2 class="fst-italic lh-1 mb-4">Were creating content for this section</h2>
<p class="mb-5">
Content for the provincial pages is being prepared and will be updated soon. Please leave your email to receive updates and be notified when it goes live.
</p>
<!-- * * * * * * * * * * * * * * *-->
<!-- * * SB Forms Contact Form * *-->
<!-- * * * * * * * * * * * * * * *-->
<!-- This form is pre-integrated with SB Forms.-->
<!-- To make this form functional, sign up at-->
<!-- https://startbootstrap.com/solution/contact-forms-->
<!-- to get an API token!-->
<form id="contactForm" data-sb-form-api-token="API_TOKEN">
<!-- Email address input-->
<div class="d-f input-group-newsletter">
<div class="c"><input class="form-control h-100" id="email" type="email" placeholder="Enter email address..." aria-label="Enter email address..." data-sb-validations="required,email" /></div>
<div class="c-a"><button class="btn btn-primary disabled ml-2 h-100" id="submitButton" type="submit">Notify Me!</button></div>
</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:required">An email is required.</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:email">Email is not valid.</div>
<!-- Submit success message-->
<!---->
<!-- This is what your users will see when the form-->
<!-- has successfully submitted-->
<div class="d-n" id="submitSuccessMessage">
<div class="text-center mb-3 mt-2">
<div class="fw-bolder">Form submission successful!</div>
To activate this form, sign up at
<br />
<a href="https://startbootstrap.com/solution/contact-forms">https://startbootstrap.com/solution/contact-forms</a>
</div>
</div>
<!-- Submit error message-->
<!---->
<!-- This is what your users will see when there is-->
<!-- an error submitting the form-->
<div class="d-n" id="submitErrorMessage"><div class="text-center text-danger mb-3 mt-2">Error sending message!</div></div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="c-12 c-l-8 c-x-6">
</div>
</div>
</div>
<!-- Social Icons-->
<!-- For more icon options, visit https://fontawesome.com/icons?d=gallery&p=2&s=brands-->
<div class="social-icons">
<div class="d-f f-r f-l-c j-c-center a-i-center h-100 mt-3 mt-l-0">
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-facebook"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-yt"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-tiktok"></i></a>
</div>
</div>
</div>

View File

@ -0,0 +1,69 @@
<div class="con-masthead">
<video class="bg-video" playsinline="playsinline" autoplay="autoplay" muted="muted" loop="loop"><source src="/images/wait-section/bg.mp4" type="video/mp4" /></video>
<!-- Masthead-->
<div class="con h-100">
<div class="r h-a h-l-100">
<div class="c-12 c-l-8 c-x-6 masthead h-100">
<div class="r a-i-center h-100">
<div class="c-12">
<div class="masthead-content ">
<div class="px-4 px-lg-0">
<h2 class="fst-italic lh-1 mb-4">Were creating content for this section</h2>
<p class="mb-5">
Content for the provincial pages is being prepared and will be updated soon. Please leave your email to receive updates and be notified when it goes live.
</p>
<!-- * * * * * * * * * * * * * * *-->
<!-- * * SB Forms Contact Form * *-->
<!-- * * * * * * * * * * * * * * *-->
<!-- This form is pre-integrated with SB Forms.-->
<!-- To make this form functional, sign up at-->
<!-- https://startbootstrap.com/solution/contact-forms-->
<!-- to get an API token!-->
<form id="contactForm" data-sb-form-api-token="API_TOKEN">
<!-- Email address input-->
<div class="d-f input-group-newsletter">
<div class="c"><input class="form-control h-100" id="email" type="email" placeholder="Enter email address..." aria-label="Enter email address..." data-sb-validations="required,email" /></div>
<div class="c-a"><button class="btn btn-primary disabled ml-2 h-100" id="submitButton" type="submit">Notify Me!</button></div>
</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:required">An email is required.</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:email">Email is not valid.</div>
<!-- Submit success message-->
<!---->
<!-- This is what your users will see when the form-->
<!-- has successfully submitted-->
<div class="d-n" id="submitSuccessMessage">
<div class="text-center mb-3 mt-2">
<div class="fw-bolder">Form submission successful!</div>
To activate this form, sign up at
<br />
<a href="https://startbootstrap.com/solution/contact-forms">https://startbootstrap.com/solution/contact-forms</a>
</div>
</div>
<!-- Submit error message-->
<!---->
<!-- This is what your users will see when there is-->
<!-- an error submitting the form-->
<div class="d-n" id="submitErrorMessage"><div class="text-center text-danger mb-3 mt-2">Error sending message!</div></div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="c-12 c-l-8 c-x-6">
</div>
</div>
</div>
<!-- Social Icons-->
<!-- For more icon options, visit https://fontawesome.com/icons?d=gallery&p=2&s=brands-->
<div class="social-icons">
<div class="d-f f-r f-l-c j-c-center a-i-center h-100 mt-3 mt-l-0">
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-facebook"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-yt"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-tiktok"></i></a>
</div>
</div>
</div>

View File

@ -0,0 +1,68 @@
<div class="con-masthead">
<video class="bg-video" playsinline="playsinline" autoplay="autoplay" muted="muted" loop="loop"><source src="/images/wait-section/bg.mp4" type="video/mp4" /></video>
<!-- Masthead-->
<div class="con h-100">
<div class="r h-a h-l-100">
<div class="c-12 c-l-8 c-x-6 masthead h-100">
<div class="r a-i-center h-100">
<div class="c-12">
<div class="masthead-content ">
<div class="px-4 px-lg-0">
<h2 class="fst-italic lh-1 mb-4">Were creating content for this section</h2>
<p class="mb-5">
Content for the provincial pages is being prepared and will be updated soon. Please leave your email to receive updates and be notified when it goes live.
</p>
<!-- * * * * * * * * * * * * * * *-->
<!-- * * SB Forms Contact Form * *-->
<!-- * * * * * * * * * * * * * * *-->
<!-- This form is pre-integrated with SB Forms.-->
<!-- To make this form functional, sign up at-->
<!-- https://startbootstrap.com/solution/contact-forms-->
<!-- to get an API token!-->
<form id="contactForm" data-sb-form-api-token="API_TOKEN">
<!-- Email address input-->
<div class="d-f input-group-newsletter">
<div class="c"><input class="form-control h-100" id="email" type="email" placeholder="Enter email address..." aria-label="Enter email address..." data-sb-validations="required,email" /></div>
<div class="c-a"><button class="btn btn-primary disabled ml-2 h-100" id="submitButton" type="submit">Notify Me!</button></div>
</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:required">An email is required.</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:email">Email is not valid.</div>
<!-- Submit success message-->
<!---->
<!-- This is what your users will see when the form-->
<!-- has successfully submitted-->
<div class="d-n" id="submitSuccessMessage">
<div class="text-center mb-3 mt-2">
<div class="fw-bolder">Form submission successful!</div>
To activate this form, sign up at
<br />
<a href="https://startbootstrap.com/solution/contact-forms">https://startbootstrap.com/solution/contact-forms</a>
</div>
</div>
<!-- Submit error message-->
<!---->
<!-- This is what your users will see when there is-->
<!-- an error submitting the form-->
<div class="d-n" id="submitErrorMessage"><div class="text-center text-danger mb-3 mt-2">Error sending message!</div></div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="c-12 c-l-8 c-x-6">
</div>
</div>
</div>
<!-- Social Icons-->
<!-- For more icon options, visit https://fontawesome.com/icons?d=gallery&p=2&s=brands-->
<div class="social-icons">
<div class="d-f f-r f-l-c j-c-center a-i-center h-100 mt-3 mt-l-0">
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-facebook"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-yt"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-tiktok"></i></a>
</div>
</div>
</div>

View File

@ -0,0 +1,69 @@
<div class="con-masthead">
<video class="bg-video" playsinline="playsinline" autoplay="autoplay" muted="muted" loop="loop"><source src="/images/wait-section/bg.mp4" type="video/mp4" /></video>
<!-- Masthead-->
<div class="con h-100">
<div class="r h-a h-l-100">
<div class="c-12 c-l-8 c-x-6 masthead h-100">
<div class="r a-i-center h-100">
<div class="c-12">
<div class="masthead-content ">
<div class="px-4 px-lg-0">
<h2 class="fst-italic lh-1 mb-4">Were creating content for this section</h2>
<p class="mb-5">
Content for the provincial pages is being prepared and will be updated soon. Please leave your email to receive updates and be notified when it goes live.
</p>
<!-- * * * * * * * * * * * * * * *-->
<!-- * * SB Forms Contact Form * *-->
<!-- * * * * * * * * * * * * * * *-->
<!-- This form is pre-integrated with SB Forms.-->
<!-- To make this form functional, sign up at-->
<!-- https://startbootstrap.com/solution/contact-forms-->
<!-- to get an API token!-->
<form id="contactForm" data-sb-form-api-token="API_TOKEN">
<!-- Email address input-->
<div class="d-f input-group-newsletter">
<div class="c"><input class="form-control h-100" id="email" type="email" placeholder="Enter email address..." aria-label="Enter email address..." data-sb-validations="required,email" /></div>
<div class="c-a"><button class="btn btn-primary disabled ml-2 h-100" id="submitButton" type="submit">Notify Me!</button></div>
</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:required">An email is required.</div>
<div class="invalid-feedback mt-2 d-n" data-sb-feedback="email:email">Email is not valid.</div>
<!-- Submit success message-->
<!---->
<!-- This is what your users will see when the form-->
<!-- has successfully submitted-->
<div class="d-n" id="submitSuccessMessage">
<div class="text-center mb-3 mt-2">
<div class="fw-bolder">Form submission successful!</div>
To activate this form, sign up at
<br />
<a href="https://startbootstrap.com/solution/contact-forms">https://startbootstrap.com/solution/contact-forms</a>
</div>
</div>
<!-- Submit error message-->
<!---->
<!-- This is what your users will see when there is-->
<!-- an error submitting the form-->
<div class="d-n" id="submitErrorMessage"><div class="text-center text-danger mb-3 mt-2">Error sending message!</div></div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="c-12 c-l-8 c-x-6">
</div>
</div>
</div>
<!-- Social Icons-->
<!-- For more icon options, visit https://fontawesome.com/icons?d=gallery&p=2&s=brands-->
<div class="social-icons">
<div class="d-f f-r f-l-c j-c-center a-i-center h-100 mt-3 mt-l-0">
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-facebook"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-yt"></i></a>
<a class="btn btn-primary m-3" href="#!"><i class="atg a-2x atg-circle-tiktok"></i></a>
</div>
</div>
</div>

View File

@ -0,0 +1 @@


View File

@ -0,0 +1 @@


View File

@ -0,0 +1 @@


View File

@ -0,0 +1 @@


View File

@ -1,196 +1,194 @@
[
{
"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",
"flexpage": true
},
{
"id": "2002",
"name": "Our Team",
"url": "/Company/OurTeam"
},
{
"id": "2003",
"name": "Mission & Vision",
"url": "/Company/Mission-Vision",
"flexpage": true
},
{
"id": "2004",
"name": "Milestone",
"url": "/Company/Milestone",
"flexpage": true
},
{
"id": "2005",
"name": "Careers",
"url": "/Company/Careers",
"flexpage": true
},
{
"id": "2006",
"name": "Partners",
"url": "/Company/Partners",
"flexpage": true
}
]
},
{
"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": "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",
"flexpage": true
},
{
"id": "2002",
"name": "Our Team",
"url": "/Company/OurTeam"
},
{
"id": "2003",
"name": "Mission & Vision",
"url": "/Company/Mission-Vision",
"flexpage": true
},
{
"id": "2004",
"name": "Milestone",
"url": "/Company/Milestone",
"flexpage": true
},
{
"id": "2005",
"name": "Careers",
"url": "/Company/Careers",
"flexpage": true
},
{
"id": "2006",
"name": "Partners",
"url": "/Company/Partners",
"flexpage": true
}
]
},
{
"id": "3000",
"name": "Services",
"icon": "",
"group": 0,
"url": "",
"sub-item": [
{
"name": "Air Cargo",
"group": 1
},
{
"id": "3001",
"name": "Cargo GSSA",
"url": "/Services/Cargo-GSSA",
"flexpage": true
]
},
{
"id": "4000",
"name": "News & Events",
"icon": "",
"group": 0,
"url": "",
"sub-item": [
{
"id": "4001",
"name": "News",
"url": "/Images/Vectors"
},
{
"id": "4002",
"name": "Data",
"flexpage": true,
"url": "/Images/Photos"
},
{
"id": "4003",
"name": "Events",
"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": ""
}
},
{
"id": "3002",
"name": "Aircraft Charter",
"url": "/Services/Aircraft-Charter",
"flexpage": true
},
{
"id": "3003",
"name": "Cargo Tracking",
"url": "/Services/Cargo-Tracking",
"flexpage": true
},
{
"id": "3004",
"name": "Groupage",
"url": "/Services/Groupage",
"flexpage": true
},
{
"name": "Air Passenger",
"group": 1
},
{
"id": "3008",
"name": "Passenger GSSA",
"url": "/Services/Passenger-GSSA",
"flexpage": true
},
{
"id": "3006",
"name": "Ticketing & Reservation",
"url": "/Services/Ticketing-Reservation",
"flexpage": true
},
{
"id": "3007",
"name": "Check-in Services",
"url": "/Services/Check-In-Services",
"flexpage": true
},
{
"id": "3009",
"name": "Customer Service & Support",
"url": "/Services/Customer-Service-Support",
"flexpage": true
},
{
"name": "Other Services",
"group": 1
},
{
"id": "3010",
"name": "Aviation Support",
"url": "/Services/Aviation-Support",
"flexpage": true
},
{
"id": "3011",
"name": "Courier Service",
"url": "/Services/Courier-Service",
"flexpage": true
}
]
},
{
"id": "4000",
"name": "News & Events",
"icon": "",
"group": 0,
"url": "",
"sub-item": [
{
"id": "4001",
"name": "News",
"flexpage": true,
"url": "/News-Events/News"
},
{
"id": "4002",
"name": "Data",
"flexpage": true,
"url": "/News-Events/Data"
},
{
"id": "4003",
"name": "Events",
"flexpage": true,
"url": "/News-Events/Events"
}
]
},
{
"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": "/Contact",
"sub-item": ""
}
]

View File

@ -0,0 +1,37 @@
using AppLibs.Libs;
using System.Collections.Generic;
namespace TWA_App.Models
{
public class ServicesModel
{
public static async Task<string> GetSidebar()
{
List<NavItem> wSNavigation = await WSNavigation.GetListMenu();
var sidebar = wSNavigation[2].SubItem;
var hContent = "";
foreach (var item in sidebar)
{
if (item.IsGroup)
{
if (hContent != "")
{
hContent += "</div></div></div>";
}
hContent += $"<div class=\"nav-i has-sub\" data-dropdown><a class=\"nav-item\">{item.Name}</a><div class=\"sub-item\" ><div class=\"d-f f-c\">";
}
else
{
hContent += $"<a class=\"nav-item\" nav-id=\"{item.ID}\">{item.Name}</a>";
}
}
hContent += "</div></div></div>";
return hContent;
}
}
}

View File

@ -40,17 +40,21 @@ if (!app.Environment.IsDevelopment())
}
app.UseForwardedHeaders();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapControllerRoute(
name: "mapCompany",
pattern: "Company/{id?}",
defaults: new { controller = "Company", action = "Index" })
.WithStaticAssets();
app.MapControllerRoute(
name: "mapServices",
pattern: "Services/{id?}",
defaults: new { controller = "Services", action = "Index" })
.WithStaticAssets();
app.MapControllerRoute(
name: "default",

View File

@ -17,25 +17,47 @@
</ItemGroup>
<ItemGroup>
<None Update="Data\page\2001.html">
<None Update="Data\pages\company\2001.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\page\2002.html">
<None Update="Data\pages\company\2002.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\page\2003.html">
<None Update="Data\pages\company\2003.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\page\2004.html">
<None Update="Data\pages\company\2006.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\page\2005.html">
<None Update="Data\pages\company\2004.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\pages\company\2005.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\pages\services\3001.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\pages\services\3002.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\pages\services\3003.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\pages\services\3004.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="wwwroot\images\NewFolder\" />
<Folder Include="wwwroot\images\wait-section\" />
</ItemGroup>
<ItemGroup>
<Content Update="wwwroot\images\wait-section\bg.mp4">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

View File

@ -91,25 +91,25 @@
<div class="flex-feature d-f f-c a-i-center">
<i class="atg a-8x atg-trusted"></i>
<h3>
Trusted Air Partner
Cargo GSA Supervision Services
</h3>
<p>Safe, reliable air cargo booking and shipping, ensuring secure, timely, and cost-effective delivery</p>
<p>We offers airlines end-to-end capacity management, maximizing yield with experts in reservations, handling, revenue accounting, and competitive market monitoring</p>
</div>
</div>
<div class="c-12 c-m-6 c-x-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
Passenger GSA Service
</h3>
<p>Dedicated teams provide efficient cargo booking and shipping with real-time shipment tracking</p>
<p>We tailored specialized end-to-end solutions for airlines includes call/web reservation, handling limitations, FIT/group booking, personal effects, ADM/ACM, refund processing</p>
</div>
</div>
<div class="c-12 c-m-6 c-x-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>
<h3>Aviation Support</h3>
<p>We offer Full-spectrum aviation support that range from handling supervision, ramp for cargo-passenger, maintenance, load control, lounges and warehousing even charter solution</p>
</div>
</div>
</div>
@ -145,7 +145,7 @@
<li class="d-f a-i-center"><i class="atg atg-radiobutton a-2x"></i>procedures whereas processes</li>
</ul>
<p class="desc mb-4">Distinctively exploit optimal alignments for intuitive business applications through revolutionary catalysts for chang the Seamlessly optimal optimal alignments for intuitive.</p>
<p class="desc mb-4">TWA was established in 2014 as a General Sales Agent for air cargo and passenger services. Since then, we have successfully expanded into the passenger market, earning industry recognition for our unwavering professionalism. Our dedicated team leverages extensive experience and deep industry knowledge to deliver flexible, client-focused solutions. Through proactive management and a comprehensive suite of services - including sales, marketing, operations, customer service, and ground handling for both cargo and passenger segments, we have supported our clients sustained growth. Committed to maximizing revenue and minimizing costs, we provide dynamic, cost-efficient business solutions to leading airlines worldwide. At TWA, our singular focus on creating genuine competitive advantage drives every engagement and fosters long-term partnerships across the globe.</p>
<div class="d-f a-i-center mt-4">
@ -174,7 +174,7 @@
<i class="atg a-8x atg-air-cargo"></i>
</div>
<span>Cargo Tonnage</span>
<h1 CountNumber prefix="+" num-max="100000" num-min="1">0</h1>
<h1 CountNumber prefix="+" num-max="3000" num-min="1">0</h1>
</div>
</div>
<div class="c-6 c-l-3">
@ -185,7 +185,7 @@
<span>
Satisfied Clients
</span>
<h1 CountNumber prefix="+" num-max="1000" num-min="1">+0</h1>
<h1 CountNumber prefix="+" num-max="500" num-min="1">+0</h1>
</div>
</div>
<div class="c-6 c-l-3">
@ -196,7 +196,7 @@
<span>
Ticket Sales
</span>
<h1 CountNumber num-max="20000" num-min="1">0</h1>
<h1 CountNumber num-max="2000" num-min="1">0</h1>
</div>
</div>
<div class="c-6 c-l-3">
@ -207,7 +207,7 @@
<span>
Annual Revenue
</span>
<h1 CountNumber prefix="$" num-max="10000000" num-min="1">$0</h1>
<h1 CountNumber prefix="$" num-max="15000000" num-min="1">$0</h1>
</div>
</div>
</div>
@ -268,6 +268,82 @@
</div>
</section>
<section class="award-section section">
<div class="bg-wrapper">
<img src="~/images/1000/award-section/bg-image.png" />
</div>
<div class="bg-wrapper1">
<img src="~/images/1000/award-section/bg-image.png" />
</div>
<div class="con">
<div class="r">
<div class="c-12 ">
<div class="d-f f-c a-i-center">
<span class="sub-title">Proven impact & Trusted by experts</span>
<h2 class="text-center">
Our Awards
</h2>
<p class="desc text-center ml-5 mr-5">
Were proud to be recognized for our craft across design, technology, and client success. These awards reflect our commitment to quality and measurable outcomes.
</p>
</div>
</div>
</div>
<div class="r mt-5 a-i-center">
<div class="c-12 c-l-6">
<img class="w-100" src="~/images/1000/award-section/bg-award.png" />
</div>
<div class="c-12 c-l-6 mt-5 mt-l-0">
<div class="swiper swiperAward">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="grid a-i-center">
<img src="~/images/1000/award-section/ci-award.png" />
<h3 class="text-center">China Airline 2022 Million Dollar Sales Award</h3>
<p class="desc text-center">
China Airlines honored TWA as Top Sales, backed by CIs 1,400 flights weekly (including 91 cargo) to 102 cities, delivering flexible solutions and strengthening CIs market growth in Vietnam.
</p>
</div>
</div>
<div class="swiper-slide">
<div class="grid a-i-center">
<img src="~/images/1000/award-section/ci-award.png" />
<h3 class="text-center">CX Top Agent Appreciation </h3>
<p class="desc text-center">
China Airlines honored TWA as Top Sales, backed by CIs 1,400 flights weekly (including 91 cargo) to 102 cities, delivering flexible solutions and strengthening CIs market growth in Vietnam.
</p>
</div>
</div>
<div class="swiper-slide">
<div class="grid a-i-center">
<img src="~/images/1000/award-section/ci-award.png" />
<h3 class="text-center">
VJ Certificate of Appreciation
</h3>
<p class="desc text-center">
Honors exceptional results in sales growth, operational efficiency, and service quality, driving network expansion, higher customer satisfaction, and stronger brand reputation across priority markets globally.
</p>
</div>
</div>
<div class="swiper-slide">
<div class="grid a-i-center">
<img src="~/images/1000/award-section/ci-award.png" />
<h3 class="text-center">PAL International Award Top Performer in 2025</h3>
<p class="desc text-center">
The partner leading international sales, yield/load stability, on-time performance, and adherence to PAL service standards—reflecting a shared commitment to market growth and end-to-end customer excellence.
</p>
</div>
</div>
</div>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
</div>
</div>
</div>
</section>
<section class="our-section section">
<div class="con block1">
<div class="r">
@ -281,7 +357,7 @@
</div>
<div class="c-l-1 pl-3 pr-3 j-c-center d-n d-l-f "><div class="sep"></div> </div>
<div class="c-l-5">
<p class="desc mt-3 mt-l-0">orem ipsum dolor sit amet, consectetur adipisicing elit. Eos aperiam porro reiciendis dolore doloribus repellendus tempora vitae quia voluptas ipsum eligend.</p>
<p class="desc mt-3 mt-l-0">TWA provides full-spectrum aviation, charter, courier, and logistics solutions, delivering customized, efficient, and cost-effective services that maximize value, ensure flexibility, and support sustainable growth worldwide.</p>
</div>
</div>
</div>
@ -297,8 +373,8 @@
</div>
</div>
<div class="grid-body">
<a href=""><h3 class="title">Air Freight</h3></a>
<p class="desc">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est amet similique ipsum reprehenderit sed.</p>
<a href=""><h3 class="title">Cargo GSSA</h3></a>
<p class="desc">We offers airlines end-to-end capacity management, maximizing yield with experts in reservations, handling, revenue accounting, and competitive market monitoring.</p>
<a class="mt-3" href="">Read More</a>
</div>
@ -313,8 +389,8 @@
</div>
</div>
<div class="grid-body">
<a href=""><h3 class="title">Air Freight</h3></a>
<p class="desc">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est amet similique ipsum reprehenderit sed.</p>
<a href=""><h3 class="title">Passenger GSSA</h3></a>
<p class="desc">We tailored specialized end-to-end solutions for airlines includes call/web reservation, handling limitations, FIT/group booking, personal effects, ADM/ACM, refund processing.</p>
<a class="mt-3" href="">Read More</a>
</div>
@ -329,8 +405,56 @@
</div>
</div>
<div class="grid-body">
<a href=""><h3 class="title">Air Freight</h3></a>
<p class="desc">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est amet similique ipsum reprehenderit sed.</p>
<a href=""><h3 class="title">Aviation Support</h3></a>
<p class="desc">We offer Full-spectrum aviation support that range from handling supervision, ramp for cargo-passenger, maintenance, load control, lounges and warehousing even charter solution.</p>
<a class="mt-3" href="">Read More</a>
</div>
</div>
</div>
<div class="c-12 c-s-6 c-l-4">
<div class="grid">
<div class="service-item-thumb">
<img class="w-100" src="https://shtheme.org/demosd/logistek/wp-content/themes/logistek/assets/images/service/service1.jpg" alt="">
<div class="service-item-icon">
<i class="atg atg-warehouse a-2x"></i>
</div>
</div>
<div class="grid-body">
<a href=""><h3 class="title">Aircraft Charter</h3></a>
<p class="desc">Passenger and cargo charters reach remote destinations, delivering vital supplies and handling heavy, oversized, or difficult cargo.</p>
<a class="mt-3" href="">Read More</a>
</div>
</div>
</div>
<div class="c-12 c-s-6 c-l-4">
<div class="grid">
<div class="service-item-thumb">
<img class="w-100" src="https://shtheme.org/demosd/logistek/wp-content/themes/logistek/assets/images/service/service1.jpg" alt="">
<div class="service-item-icon">
<i class="atg atg-warehouse a-2x"></i>
</div>
</div>
<div class="grid-body">
<a href=""><h3 class="title">Courier Service</h3></a>
<p class="desc">Same-day on-demand and scheduled delivery, plus warehousing services, ensure fast, reliable logistics solutions and comprehensive support.</p>
<a class="mt-3" href="">Read More</a>
</div>
</div>
</div>
<div class="c-12 c-s-6 c-l-4">
<div class="grid">
<div class="service-item-thumb">
<img class="w-100" src="https://shtheme.org/demosd/logistek/wp-content/themes/logistek/assets/images/service/service1.jpg" alt="">
<div class="service-item-icon">
<i class="atg atg-warehouse a-2x"></i>
</div>
</div>
<div class="grid-body">
<a href=""><h3 class="title">Logistic</h3></a>
<p class="desc">TWA delivering total logistics solutions that could customized to our customers requirements by more than 10 years of experience in this industry and our meticulous approach to solution design and execution.</p>
<a class="mt-3" href="">Read More</a>
</div>
@ -471,11 +595,11 @@
</div>
</div>
<button class="mt-2 btn btn-primary" type="submit">Request a Quote</button>
<button class="mt-2 mb-3 btn btn-primary" type="submit">Request a Quote</button>
</div>
<div class="c-l-4 c-x-3">
<div class="d-f f-c quote-quess ml-auto">
<div class="d-f f-c mt-l-0 mt-5 mb-5 quote-quess ml-auto mr-l-0 mr-auto">
<i class="atg a-4x atg-mess-question1"></i>
<h3>We will contact you soon!</h3>
<p class="mb-2">
@ -571,6 +695,21 @@
</div>
</div>
<div class="c-12 c-l-6">
<div class="r">
<div class="c-6">
<div class="d-f f-c a-i-center">
<span>Head Office: Ho Chi Minh City</span>
<span>Branch Office: Da Nang City</span>
<span>Branch Office: Phnom Penh City</span>
</div>
</div>
<div class="c-6">
<div class="d-f f-c a-i-center">
<span>Branch Office: Ha Noi City</span>
<span>Branch Office: Yangon City</span>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -9,7 +9,7 @@
if (i.SubItem == null)
{
<div class="nav-i">
<a href="@i.Url" app-nav nav-id="@i.ID" class="nav-item">@i.Name</a>
<a href="@i.Url" nav-id="@i.ID" class="nav-item">@i.Name</a>
</div>
}
else
@ -19,7 +19,7 @@
@switch (i.ID)
{
case "3000":
<div class="sub-item sub-nav-full">
<div class="sub-item sub-nav-full nonhide">
<div class="cfull">
<div class="r-n-g">
@{
@ -41,7 +41,7 @@
}
else
{
list += $"<div class=\"nav-i\"><a href=\"{j.Url}\" {j.ToFlexPageAttribute()} app-nav nav-id=\"{j.ID}\" class=\"nav-link\"><span>{j.Name}</span></a></div>";
list += $"<div class=\"nav-i\"><a href=\"{j.Url}\" {j.ToFlexPageAttribute()} nav-id=\"{j.ID}\" class=\"nav-link\"><span>{j.Name}</span></a></div>";
}
}
@ -60,10 +60,10 @@
</div>
break;
default:
<div class="sub-item">
<div class="sub-item nonhide">
@foreach (var j in i.SubItem)
{
<div class="nav-i"><a href="@j.Url" @j.ToFlexPageAttribute() app-nav nav-id="@j.ID" class="nav-link"><span>@j.Name</span></a></div>
<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;

View File

@ -0,0 +1,124 @@
<section class="con-parallax con-page-section">
<div class="bg-wrapper parallax" data-dept="0.1">
<img src="~/images/3000/plh-@(ViewData["PageID"]).jpg" alt="Background" class="bg-img">
</div>
<div class="con section page-section section-break" data-content>
<div class="r">
<h1 class="title">@ViewData["Title"]</h1>
</div>
</div>
</section>
<div class="con section pt-0">
<div class="r">
<div class="r-n-g">
<div class="c-12 c-l-4 c-x-3 ">
<div class="d-f f-c con-sidebarR">
<h3 class="mb-2">Catagories</h3>
<div class="sidebarR">
@Html.Raw(await ServicesModel.GetSidebar())
</div>
</div>
</div>
<div class="c-12 c-l-8 c-x-9">
<div class="fl-col-content fl-node-content vamtam-show-bg-image">
<div class="fl-module fl-module-vamtam-heading fl-node-5a736a9c884b9" data-node="5a736a9c884b9">
<div class="fl-module-content fl-node-content">
<h2 class="vamtam-heading ">
<span class="vamtam-heading-text">How <b>can we help?</b></span>
</h2>
</div>
</div>
<div class="fl-col-group fl-node-5a736bfe7efd8 fl-col-group-nested fl-col-group-equal-height fl-col-group-align-top fl-col-group-custom-width" data-node="5a736bfe7efd8">
<div class="fl-col fl-node-5a736bfe7f30e fl-col-bg-color fl-col-small fl-col-small-custom-width" data-node="5a736bfe7f30e">
<div class="fl-col-content fl-node-content vamtam-show-bg-image">
<div class="fl-module fl-module-vamtam-separator fl-node-5a736a9c88e2c" data-node="5a736a9c88e2c">
<div class="fl-module-content fl-node-content">
<div class="fl-separator" style="border-top-color:var(--vamtam-accent-color-1);opacity:1"></div>
</div>
</div>
</div>
</div>
<div class="fl-col fl-node-5a736bfe7f359 fl-col-bg-color" data-node="5a736bfe7f359">
<div class="fl-col-content fl-node-content vamtam-show-bg-image"></div>
</div>
</div>
<div class="fl-module fl-module-rich-text fl-node-5a736a9c884fd" data-node="5a736a9c884fd">
<div class="fl-module-content fl-node-content">
<div class="fl-rich-text">
<p>Our mission at Morz is to create measurable value for our stakeholders while serving our customers, our team members and our community. Treating others with respect and compassion is at the core of the ITS philosophy and we provide a safe working environment for our employees and offer them opportunities to grow, both personally and professionally. This belief also extends to our community, where we work to provide economic stability through quality employment opportunities and give back whenever we can.</p>
<p>We are proud to have led the way in Morz since 1999. Simply put, we provide creative logistics solutions with our asset-based dedicated and expedited fleet, warehousing and distribution services and nationwide multi-modal freight brokerage. Based on our dependable work ethic, company culture and values and the highest level of service in the industry—our vision is to achieve excellence in everything that we do.</p>
<p>When the company founders started Morz Logistics, they vowed to create a company that was built on strong family values—respect, integrity and compassion—and a true work-life balance. They committed to work hard for each other, their employees, their clients and their community, building relationships that would grow and bring success for everyone involved. We at ITS Logistics are proud of what weve accomplished so far, and look forward to our future success together.</p>
</div>
</div>
</div>
<div class="fl-col-group fl-node-5a736a9c8853f fl-col-group-nested" data-node="5a736a9c8853f">
<div class="fl-col fl-node-5a736a9c8857d fl-col-bg-color" data-node="5a736a9c8857d">
<div class="fl-col-content fl-node-content vamtam-show-bg-image">
<div class="fl-module fl-module-vamtam-heading fl-node-5a736a9c885f4" data-node="5a736a9c885f4">
<div class="fl-module-content fl-node-content">
<h3 class="vamtam-heading ">
<span class="vamtam-heading-text">Stats &amp; Charts</span>
</h3>
</div>
</div>
<div class="fl-module fl-module-rich-text fl-node-5a736a9c88632" data-node="5a736a9c88632">
<div class="fl-module-content fl-node-content">
<div class="fl-rich-text">
<p>Morz Logistics was founded by CEO Jeff Lynch, COO Darryl Bader and CFO Dan Allen. They signed the first dedicated agreement with CLIF Bar and started with a 40,000 sq. ft. warehouse and two trucks—and became a $1 million company in the first full year.</p>
<p>The company expanded to dedicated fleet services and added an additional 27,000 sq. ft. of warehousing space. ITS also signed its first contracts with Starbucks and Amazon and grew to 12 trucks and more than 40 employees.</p>
<p>Morz moved its corporate office and primary warehouse into a 172,000 sq. ft. space in Sparks, Nevada. The company also added pool distribution service, dedicated one-way service and grew to more than 50 trucks.</p>
<p>Seeing more opportunity, Morz expanded its brokerage service into a nationwide multi-modal freight brokerage division.hey signed the first dedicated agreement with CLIF Bar and started with a 40,000 sq. ft. warehouse and two trucks—and became a $1 million company in the first full year.</p>
</div>
</div>
</div>
</div>
</div>
<div class="fl-col fl-node-5a736a9c885b9 fl-col-bg-color fl-col-small" data-node="5a736a9c885b9">
<div class="fl-col-content fl-node-content vamtam-show-bg-image">
<div class="fl-module fl-module-rich-text fl-node-5a736a9c88676" data-node="5a736a9c88676">
<div class="fl-module-content fl-node-content">
<div class="fl-rich-text">
<p></p>
<div class="ec-uv-chart-container uv-div-12724" data-object="ec_object_12724">
<div class="uv-chart-div" style="display:inline-block;width:100%;height:100%;">
<!-- SVG nguyên bản (giữ nguyên) -->
<svg id="uv-1758877888714" class="uv-frame" width="100%" height="100%" preserveAspectRatio="xMinYMin meet" viewBox="0 0 600 600">
<rect class="uv-frame-bg" width="600" height="600" style="fill:#fff;"></rect>
<g id="uv-panel-1758877888714" class="uv-panel" transform="translate(100,50)">
<rect class="uv-chart-bg" height="400" width="400" style="fill:#fff;"></rect>
<!-- ... (phần SVG paths/labels như bạn cung cấp) ... -->
<!-- Mình giữ nguyên toàn bộ nội dung SVG bạn dán vào -->
</g>
</svg>
</div>
</div>
<p></p>
</div>
</div>
</div>
</div>
</div>
</div><!-- /.fl-col-group nested -->
</div><!-- /.fl-col-content root -->
</div>
</div>
</div>
</div>
@Html.Raw(ViewBag.Content)
@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/3000.js")" js-lib></script>
<script type="module" src="@Url.AbsoluteContent("~/js/js-page/" + ViewData["PageID"] + ".js")" js-lib></script>
}

View File

@ -35,6 +35,7 @@
<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/ext_libs/js-overscroll.js")" js-lib></script>
<script src="@Url.AbsoluteContent("~/js/libs/js-waves.js")" js-lib></script>
</section>
<section app-js-page>

View File

@ -107,6 +107,10 @@ h1, h2, h3, h4, h5, h6, p {
height: 100% !important;
}
.h-a{
height: auto
}
.w-100 {
width: 100% !important
}
@ -1651,7 +1655,9 @@ h1, h2, h3, h4, h5, h6, p {
.ml-l-3 {
margin-left: 1rem !important
}
.mr-l-0 {
margin-right: 0 !important
}
.mr-l-3{
margin-right: 1rem !important
}
@ -1691,6 +1697,10 @@ h1, h2, h3, h4, h5, h6, p {
.gap-l-5 {
gap: 3rem !important;
}
.h-l-100{
height: 100%
}
}
@media (min-width:1200px) {

View File

@ -765,6 +765,8 @@ body[page="1000"] .ico-menu span {
}
.grid-body .title{
font-weight: 700;
font-size: 1.2rem;
color: var(--text-color-dark);
font-family: 'Mulish';
padding-bottom: 0;
@ -1214,6 +1216,53 @@ body[page="1000"] .ico-menu span {
/************End Section***********************/
/*********Award Section************/
.award-section{
padding: 80px 0
}
.award-section .bg-wrapper1 {
position:absolute;
left:0;
top:0;
width: 100%;
opacity: .15;
height: 100%
}
.award-section .bg-wrapper1 img {
position: absolute;
left: -20%;
width: auto;
transform: scale(-1);
transform-origin: center;
height: 100%
}
.award-section .bg-wrapper{
opacity: .2;
height: 100%
}
.award-section .bg-wrapper img{
position:absolute;
right:0;
height: 100%
}
.award-section .grid{
box-shadow: none;
border:none;
display:flex;
flex-direction: column
}
.award-section .grid img{
width: 50%;
min-width: 300px
}
.award-section .grid h3{
margin: 10px 20% 0
}
/************End Section***********************/
/***Our Service Section***/
.our-section {
padding:0
@ -1250,6 +1299,7 @@ body[page="1000"] .ico-menu span {
}
.our-section .grid{
height: calc(100% - 40px);
border:none
}
@ -1300,6 +1350,8 @@ body[page="1000"] .ico-menu span {
transform: rotateY(360deg);
}
.service-item-icon {
transform: translateY(20px);
position: absolute;
@ -1830,6 +1882,22 @@ height: 100%
/*********Page Section***********/
.page-section{
padding: 80px 0;
}
@media (min-width: 992px){
.page-section {
padding: 100px 0;
}
}
@media (min-width: 1200px) {
.page-section {
padding: 120px 0;
}
}
.page-section .title{
padding: 60px 0;
}
@ -1854,35 +1922,25 @@ video.bg-video {
margin-top: -40px;
height: 90vh
}
.masthead {
color:white;
position: relative;
overflow: hidden;
z-index: 2;
display: flex;
align-items: center;
justify-content: center;
.masthead:before {
content: "";
position: absolute;
top: 0;
bottom: 0;
right: -200px;
left: -200px;
height: 100%;
background-color: rgba(0, 0, 0, 0.85);
}
.masthead:before {
content: "";
position: absolute;
top: 0;
bottom: 0;
right: 0;
left: 0;
height: 100%;
width: 100%;
background-color: rgba(0, 0, 0, 0.85);
}
.masthead .masthead-content {
position: relative;
max-width: 40rem;
padding-top: 5rem;
padding-bottom: 5rem;
}
.masthead-content {
color: white;
position: relative;
width: 100%;
padding-top: 5rem;
padding-bottom: 5rem;
}
.masthead-content h2{
text-transform: capitalize;
font-size: 2.5rem
@ -1895,7 +1953,7 @@ video.bg-video {
.masthead .masthead-content .input-group-newsletter input {
.masthead-content .input-group-newsletter input {
height: auto;
width: 100%;
font-size: 1rem;
@ -1911,36 +1969,25 @@ video.bg-video {
}
@media (min-width: 992px) {
.masthead {
padding: 60px 0;
height: 100%;
width: 75vw;
min-height: 0;
.masthead-content {
padding-right: 150px
}
.masthead:before {
transform: skewX(-9deg);
transform-origin: top right;
}
.masthead .masthead-content {
padding-top: 0;
padding-bottom: 0;
padding-left: 2rem;
padding-right: 9rem;
}
}
@media (min-width: 1200px) {
.masthead {
width: 65vw;
.masthead:before {
right: -35px;
transform: skewX(-9deg);
transform-origin: top right;
}
}
.social-icons {
position: relative;
position: absolute;
z-index: 2;
bottom: 15px;
left: 50%;
transform: translateX(-50%)
}
.social-icons .btn {
@ -1955,10 +2002,56 @@ video.bg-video {
@media (min-width: 992px) {
.social-icons {
position: absolute;
height: 100%;
top: 0;
top: 50%;
left:auto;
transform: translate(0, -50%);
right: 2.5rem;
width: auto;
}
}
/**********Services Company*************/
.con-sidebarR {
margin: 0 20px;
padding: 35px;
background: var(--text-color-lW3);
border-radius: var(--radius);
margin-bottom: 40px
}
.sidebarR .nav-item {
font-size: .98rem;
font-weight: 600;
padding: 10px 15px;
padding-left: 0;
transition: all .3s ease-in-out
}
.sidebarR .nav-item:hover {
color: var(--text-color-dark);
padding-left: 6px
}
.sidebarR .sub-item{
position:relative;
background: transparent;
box-shadow: none
}
.sidebarR .sub-item .nav-item {
padding-left: 15px;
font-size: .85rem;
border-bottom: 1px solid var(--text-color-lW1);
font-weight: 400;
}
.sidebarR .sub-item .nav-item:hover{
color: var(--color-primary);
padding-left: 20px;
}
/*************End Services*************/

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

View File

@ -2545,5 +2545,27 @@
e.default = Q
}]).default
}));
window.DisableClickOnScrollPlugin = class extends window.Scrollbar.ScrollbarPlugin {
static pluginName = 'disableClickOnScroll';
constructor(scrollbar, options) {
super(scrollbar, options);
this.isScrolling = false;
}
transformDelta(delta, fromEvent) {
if (fromEvent && (Math.abs(delta.x) > 0 || Math.abs(delta.y) > 0)) {
this.isScrolling = true;
}
return delta;
}
onRender() {
// Reset the scrolling flag after a brief delay
if (this.isScrolling) {
setTimeout(() => {
this.isScrolling = false;
}, 100);
}
}
}
window.Scrollbar.use(window.DisableClickOnScrollPlugin);
window.AScript.set("js-scrollbar", true);

View File

@ -140,9 +140,11 @@ window.L1000 = function () {
},
});
const swiper3 = new Swiper(".custSwiper", {
slidesPerView: 1,
spaceBetween: 40,
spaceBetween: 0,
autoplay: {
delay: 2000, // 5s
disableOnInteraction: true,
@ -158,7 +160,27 @@ window.L1000 = function () {
992: { slidesPerView: 3 }, // màn hình ≥1200px
576: { slidesPerView: 2 }, // ≥768px=
0: { slidesPerView: 1 } // <576px
}
});
const swiper4 = new Swiper(".swiperAward", {
slidesPerView: 1,
spaceBetween: 0,
autoplay: {
delay: 2000, // 5s
disableOnInteraction: true,
},
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: {
992: { slidesPerView: 1 }, // màn hình ≥1200px
0: { slidesPerView: 2 } // <576px
}
});
}
function animateCount(el) {

View File

@ -27,35 +27,39 @@ function updateParallax(t, parallaxEls) {
const rect = section.getBoundingClientRect();
const sectionHeight = section.offsetHeight;
// Chỉ xử lý khi section trong khung nhìn
// Only process if the section is in the viewport or partially in it
const inView = rect.bottom > 0 && rect.top < window.innerHeight;
if (!inView) return;
// Set height parent 1 lần
// Set height parent only once
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
section.dataset.heightSet = 'true'; // Mark that the height is set
section.dataset.initialTop = rect.top;
}
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
const depth = parseFloat(el.dataset.depth ?? 1); // 1 = moves fully, <1 = moves less
const initialTop = parseFloat(section.dataset.initialTop);
// 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
// Calculate how far the section has moved from its initial position
// Calculate progress for how much of the section is visible in the viewport
let a = 0
if (window.innerHeight - initialTop > 100) {
a = window.innerHeight - initialTop - rect.top - rect.bottom;
} else {
a = window.innerHeight - rect.top
}
const progress = Math.min(1, Math.max(0, a / (window.innerHeight + sectionHeight)));
const scrollable = imgHeight - sectionHeight;
// offset Y
const offsetY = -clamped * scrollable * depth;
let offsetY = -progress * scrollable * depth;
img.style.transform = `translate(-50%, ${offsetY}px)`;
});
}
window.AScript.set("2000", true);

View File

@ -100,34 +100,38 @@ function updateParallax(t, parallaxEls) {
const rect = section.getBoundingClientRect();
const sectionHeight = section.offsetHeight;
// Chỉ xử lý khi section trong khung nhìn
// Only process if the section is in the viewport or partially in it
const inView = rect.bottom > 0 && rect.top < window.innerHeight;
if (!inView) return;
// Set height parent 1 lần
// Set height parent only once
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
section.dataset.heightSet = 'true'; // Mark that the height is set
section.dataset.initialTop = rect.top;
}
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
const depth = parseFloat(el.dataset.depth ?? 1); // 1 = moves fully, <1 = moves less
const initialTop = parseFloat(section.dataset.initialTop);
// 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
// Calculate how far the section has moved from its initial position
// Calculate progress for how much of the section is visible in the viewport
let a = 0
if (window.innerHeight - initialTop > 100) {
a = window.innerHeight - initialTop - rect.top - rect.bottom;
} else {
a = window.innerHeight - rect.top
}
const progress = Math.min(1, Math.max(0, a / (window.innerHeight + sectionHeight)));
const scrollable = imgHeight - sectionHeight;
// offset Y
const offsetY = -clamped * scrollable * depth;
let offsetY = -progress * scrollable * depth;
img.style.transform = `translate(-50%, ${offsetY}px)`;
});
}
window.AScript.set("2001", true);

View File

@ -0,0 +1,67 @@
import AMenu from '/js/libs/js-AMenu.js'
window.runServices = function () {
const parallaxEls = document.querySelectorAll('.con-page-section .parallax');
let ticking = false;
parallaxEls.forEach(el => {
const parent = el.closest(".con-parallax");
if (parent) {
parent.style.height = parent.querySelector("[data-content]").offsetHeight + "px";
}
});
window.app.on("App_Scrolling", (t) => {
if (!ticking) {
window.requestAnimationFrame(() => {
updateParallax(t, parallaxEls);
ticking = false;
});
ticking = true;
}
});
var sideBar = new AMenu(".sidebarR", null, null);
}
function updateParallax(t, parallaxEls) {
parallaxEls.forEach(el => {
const section = el.closest('.con-parallax');
if (!section) return;
const rect = section.getBoundingClientRect();
const sectionHeight = section.offsetHeight;
// Only process if the section is in the viewport or partially in it
const inView = rect.bottom > 0 && rect.top < window.innerHeight;
if (!inView) return;
// Set height parent only once
const content = section.querySelector('[data-content]');
if (content && !section.dataset.heightSet) {
section.style.height = content.offsetHeight + 'px';
section.dataset.heightSet = 'true'; // Mark that the height is set
section.dataset.initialTop = rect.top;
}
const img = el.querySelector('.bg-img');
if (!img) return;
const imgHeight = img.offsetHeight;
const depth = parseFloat(el.dataset.depth ?? 1); // 1 = moves fully, <1 = moves less
const initialTop = parseFloat(section.dataset.initialTop);
// Calculate how far the section has moved from its initial position
// Calculate progress for how much of the section is visible in the viewport
let a = 0
if (window.innerHeight - initialTop > 100) {
a = window.innerHeight - initialTop - rect.top - rect.bottom;
} else {
a = window.innerHeight - rect.top
}
const progress = Math.min(1, Math.max(0, a / (window.innerHeight + sectionHeight)));
const scrollable = imgHeight - sectionHeight;
let offsetY = -progress * scrollable * depth;
img.style.transform = `translate(-50%, ${offsetY}px)`;
});
}
window.AScript.set("3000", true);

View File

@ -0,0 +1,7 @@
window.L3001 = function () {
if (window["runServices"] !== undefined) {
window["runServices"]();
}
}
window.AScript.set("3001", true);

View File

@ -1,6 +1,6 @@
import AMenu from '/js/libs/js-AMenu.js'
import ALayout from '/js/libs/js-ALayout.js'
import ADropDown from '/js/libs/js-ADropDown.js'
import ADropDown from '/js/libs/js-ADropdown.js'
//var asyncStyleSheets = [
// 'https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap',
@ -61,6 +61,7 @@ class AsyncLayout extends ALayout {
he2.appendChild(el.cloneNode(true));
h.appendChild(el.cloneNode(true));
});
}
dispose() {
this.isLoaded = false;
@ -102,6 +103,8 @@ class AsyncLayout extends ALayout {
this.listAObject.add(a1);
var a2 = new AMenu("#fHeader .navmain", null, null);
this.listAObject.add(a2);
var sOption = {
damping: (window.getOS() == "Android") ? .06 : .04,
thumbMinSize: 25,
@ -109,6 +112,7 @@ class AsyncLayout extends ALayout {
alwaysShowTracks: true,
continuousScrolling: true
};
this.scroll = window.Scrollbar.init(document.querySelector('.m-header .scroll-header[data-scrollbar]'), sOption);
const idE1 = window.app.on("redirect_page", (e) => {
@ -121,5 +125,6 @@ class AsyncLayout extends ALayout {
}
}
}
window.ALayout.set("Async", new AsyncLayout());
window.AScript.set("asyncLayout", true);

View File

@ -9,7 +9,6 @@ export default class Dropdown extends window.AObject {
if (window.dropdown == null) {
this.initGlobalVar();
}
this.scrollTrack = false;
}
initGlobalVar() {
var f = function (ev) {
@ -52,11 +51,7 @@ export default class Dropdown extends window.AObject {
if (this.isLock) {
return;
}
if (this.scrollTrack) {
e.stopImmediatePropagation();
e.preventDefault();
return;
}
console.log("Asdasd");
var t1 = e.currentTarget;
var p = t1.closest('[data-dropdown]');
var p1 = e.target.closest(".noopen");

View File

@ -50,18 +50,15 @@ export default class AMenu extends window.AObject {
}
initNav(ele, type = "D") {
let arr = ele.querySelectorAll(".nav-i.has-sub .nav-link, .nav-mainmenu > .nav-i:not(.has-sub) a");
let arr = ele.querySelectorAll(".nav-i.has-sub .nav-link, .navmain > .nav-i:not(.has-sub) a");
console.log(arr);
Array.from(arr).forEach(el => {
var f = function (evt) {
evt.preventDefault();
if (window.isValidPointerClick(evt)) return;
this.addEventClick.call(this, evt, type);
}.bind(this);
el.addEventListener(this.eventName, f);
var f1 = function (evt) {
evt.preventDefault();
}
el.addEventListener("click", f1);
el.addEventListener("click", f, true);
});
}
initDropDown() {
@ -126,12 +123,19 @@ export default class AMenu extends window.AObject {
addEventClick(e, t) {
window.app.initNavApp(e.currentTarget.getAttribute("href"), e.currentTarget.hasAttribute("isflexpage"));
if (t == "M") {
this.overlay.removeOverlay();
this.listIco.forEach(el => {
el.classList.remove("active");
})
}
window.requestTimeout((() => {
requestAnimationFrame((() => {
if (t == "M") {
this.overlay.removeOverlay();
this.listIco.forEach(el => {
el.classList.remove("active");
})
} else {
this.dropdown.closeDropdown();
}
}).bind(this));
}).bind(this), 100);
}
closeExpandMenu() {
Array.from(this.navM.querySelectorAll(".nav-i.has-sub")).forEach(el => {

View File

@ -0,0 +1,5 @@
export default class ASidebar extends window.AObject {
constructor(o) {
super();
}
}

View File

@ -212,6 +212,7 @@ window.AObject = class {
this.parentEventMap = new Map();
this.listAObject = new Set();
this.eventName = window.getPrimaryPointerEvent();
this.isScrolling = false;
}
_fCheckPast(label, callback) {
@ -620,7 +621,7 @@ class AApp extends window.AObject {
}).bind(this));
} else {
window.Scrollbar.use(window.OverscrollPlugin);
var sOption = {
damping: (window.getOS() == "Android") ? .08 : .04,
thumbMinSize: 25,
@ -658,7 +659,12 @@ class AApp extends window.AObject {
}
}).bind(this));
}
initNavApp(t, flex=false) {
initNavApp(t, flex = false) {
if (window.getOS() == "iOS") {
window.scrollTo({ top: 0, behavior: 'smooth' });
} else {
window.smScroll.scrollTo(0, 0, 500);
}
this.isRedirectPage = true;
this.callLoadPage(window.GetAbsoluteURL(t), flex);
}