diff --git a/TWA-App/Data/page/2001.html b/TWA-App/Data/page/2001.html index efeff02..aac608a 100644 --- a/TWA-App/Data/page/2001.html +++ b/TWA-App/Data/page/2001.html @@ -1 +1,234 @@ -Hello Page About Us \ No newline at end of file +
+
+
+
+
+ +
+ +
+

30+

+

We have more than years of experience

+
+
+
+ +
+ + About Our Company + +

Trusted Logistic Service Provider

+ +
    +
  • revolutionary catalysts for chang
  • +
  • catalysts for chang the Seamlessly
  • +
  • business applications through
  • +
  • procedures whereas processes
  • +
+ +

Distinctively exploit optimal alignments for intuitive business applications through revolutionary catalysts for chang the Seamlessly optimal optimal alignments for intuitive.

+ +
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+ Background +
+
+
+
+
+
+
+ +
+ Cargo Tonnage +

0

+
+
+
+
+
+ +
+ + Satisfied Clients + +

+0

+
+
+
+
+
+ +
+ + Ticket Sales + +

0

+
+
+
+
+
+ +
+ + Annual Revenue + +

$0

+
+
+
+
+
+
+
+
+
+
Blog Post
+

Our Latest Blog Post

+
+
+ + + +
+
+
+
+
+
+
+
+
+
+ + + +
+
+
+ +
+ +
+ Logistics +

+ 5 Ways To Get The Most Out Of Your Logistics +

+
+
+ Oct 13, 2021 +
+
+ 0 +
+
+
+
+
+
+
+ + + +
+
+
+ +
+ +
+ Logistics +

+ The Top 5 Changes That Occur With AI in Logistics +

+
+
+ Oct 13, 2021 +
+
+ 0 +
+
+
+
+
+
+
+ + + +
+
+
+ +
+ +
+ Logistics +

+ 5 Ways To Get The Most Out Of Your Logistics +

+
+
+ Oct 13, 2021 +
+
+ 0 +
+
+
+
+
+
+
+ + + +
+
+
+ +
+ +
+ Logistics +

+ Supply Chain And Logistics Trends That Could Be Big +

+
+
+ Oct 13, 2021 +
+
+ 0 +
+
+
+
+
+
+ + +
+
+
+
+
+ +
+
diff --git a/TWA-App/Data/page/2002.html b/TWA-App/Data/page/2002.html index 34afae2..da13600 100644 --- a/TWA-App/Data/page/2002.html +++ b/TWA-App/Data/page/2002.html @@ -1 +1,64 @@ -Hello Page Our Team \ No newline at end of file +
+ + + +
+
+
+
+
+
+

We’re creating content for this section

+

+ 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. +

+ + + + + + + +
+ +
+
+
+
+
An email is required.
+
Email is not valid.
+ + + + +
+
+
Form submission successful!
+ To activate this form, sign up at +
+ https://startbootstrap.com/solution/contact-forms +
+
+ + + + +
Error sending message!
+
+
+
+
+
+
+ +
+ + +
+
+ + + +
+
+
\ No newline at end of file diff --git a/TWA-App/Data/page/2003.html b/TWA-App/Data/page/2003.html new file mode 100644 index 0000000..4c86670 --- /dev/null +++ b/TWA-App/Data/page/2003.html @@ -0,0 +1,64 @@ +
+ + + +
+
+
+
+
+
+

We’re creating content for this section

+

+ 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. +

+ + + + + + + +
+ +
+
+
+
+
An email is required.
+
Email is not valid.
+ + + + +
+
+
Form submission successful!
+ To activate this form, sign up at +
+ https://startbootstrap.com/solution/contact-forms +
+
+ + + + +
Error sending message!
+
+
+
+
+
+
+ +
+ + +
+
+ + + +
+
+
\ No newline at end of file diff --git a/TWA-App/Data/page/2004.html b/TWA-App/Data/page/2004.html new file mode 100644 index 0000000..4c86670 --- /dev/null +++ b/TWA-App/Data/page/2004.html @@ -0,0 +1,64 @@ +
+ + + +
+
+
+
+
+
+

We’re creating content for this section

+

+ 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. +

+ + + + + + + +
+ +
+
+
+
+
An email is required.
+
Email is not valid.
+ + + + +
+
+
Form submission successful!
+ To activate this form, sign up at +
+ https://startbootstrap.com/solution/contact-forms +
+
+ + + + +
Error sending message!
+
+
+
+
+
+
+ +
+ + +
+
+ + + +
+
+
\ No newline at end of file diff --git a/TWA-App/Data/page/2005.html b/TWA-App/Data/page/2005.html new file mode 100644 index 0000000..4c86670 --- /dev/null +++ b/TWA-App/Data/page/2005.html @@ -0,0 +1,64 @@ +
+ + + +
+
+
+
+
+
+

We’re creating content for this section

+

+ 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. +

+ + + + + + + +
+ +
+
+
+
+
An email is required.
+
Email is not valid.
+ + + + +
+
+
Form submission successful!
+ To activate this form, sign up at +
+ https://startbootstrap.com/solution/contact-forms +
+
+ + + + +
Error sending message!
+
+
+
+
+
+
+ +
+ + +
+
+ + + +
+
+
\ No newline at end of file diff --git a/TWA-App/TWA-App.csproj b/TWA-App/TWA-App.csproj index 25a2fd8..e9384aa 100644 --- a/TWA-App/TWA-App.csproj +++ b/TWA-App/TWA-App.csproj @@ -23,6 +23,19 @@ Always + + Always + + + Always + + + Always + + + + + diff --git a/TWA-App/Views/Company/Index.cshtml b/TWA-App/Views/Company/Index.cshtml index 4fc9d22..442003c 100644 --- a/TWA-App/Views/Company/Index.cshtml +++ b/TWA-App/Views/Company/Index.cshtml @@ -1,5 +1,17 @@ -@Html.Raw(ViewBag.Content) +
+
+ Background +
+
+
+

@ViewData["Title"]

+
+
+
+@Html.Raw(ViewBag.Content) @section jsLib { + + } \ No newline at end of file diff --git a/TWA-App/Views/Home/Index.cshtml b/TWA-App/Views/Home/Index.cshtml index 8d0afa7..14e10e2 100644 --- a/TWA-App/Views/Home/Index.cshtml +++ b/TWA-App/Views/Home/Index.cshtml @@ -1,736 +1,855 @@ 
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
-
+
-
-
-
-
- -

- Trusted Air Partner -

-

Safe, reliable air cargo booking and shipping, ensuring secure, timely, and cost-effective delivery

-
-
-
-
- -

- Professional Booking & Live Tracking -

-

Dedicated teams provide efficient cargo booking and shipping with real-time shipment tracking

-
-
-
-
- -

Dedicated Customer Care

-

Committed to transparent, devoted service and full support for all customer needs in cargo and passenger transportation

-
-
-
-
+
+
+
+
+ +

+ Trusted Air Partner +

+

Safe, reliable air cargo booking and shipping, ensuring secure, timely, and cost-effective delivery

+
+
+
+
+ +

+ Professional Booking & Live Tracking +

+

Dedicated teams provide efficient cargo booking and shipping with real-time shipment tracking

+
+
+
+
+ +

Dedicated Customer Care

+

Committed to transparent, devoted service and full support for all customer needs in cargo and passenger transportation

+
+
+
+
-
-
-
-
- -
- -
-

30+

-

We have more than years of experience

-
-
-
+
+
+
+
+ +
+ +
+

30+

+

We have more than years of experience

+
+
+
-
+
- About Our Company + About Our Company -

Trusted Logistic Service Provider

+

Trusted Logistic Service Provider

-
    -
  • revolutionary catalysts for chang
  • -
  • catalysts for chang the Seamlessly
  • -
  • business applications through
  • -
  • procedures whereas processes
  • -
+
    +
  • revolutionary catalysts for chang
  • +
  • catalysts for chang the Seamlessly
  • +
  • business applications through
  • +
  • procedures whereas processes
  • +
-

Distinctively exploit optimal alignments for intuitive business applications through revolutionary catalysts for chang the Seamlessly optimal optimal alignments for intuitive.

+

Distinctively exploit optimal alignments for intuitive business applications through revolutionary catalysts for chang the Seamlessly optimal optimal alignments for intuitive.

-
+
- + -
- -
+
+ +
-
+
-
+
-
+
-
- Background -
-
-
-
-
-
-
- -
- Cargo Tonnage -

0

-
-
-
-
-
- -
- - Satisfied Clients - -

+0

-
-
-
-
-
- -
- - Ticket Sales - -

0

-
-
-
-
-
- -
- - Annual Revenue - -

$0

-
-
-
-
-
+
+ Background +
+
+
+
+
+
+
+ +
+ Cargo Tonnage +

0

+
+
+
+
+
+ +
+ + Satisfied Clients + +

+0

+
+
+
+
+
+ +
+ + Ticket Sales + +

0

+
+
+
+
+
+ +
+ + Annual Revenue + +

$0

+
+
+
+
+
-
-
-
- Certified & Trusted Logistics Provider -

Our Prestigious Certifications and Awards

-
-
-

- We take great pride in our unwavering commitment to the highest standards of quality, safety, and operational excellence. The following certifications and international memberships highlight and recognize our outstanding performance and reliability in providing world-class logistics services -

-
-
-
-
-
-
-
-
-
-
- -

- IATA GSSA Certified Company -

-

- Officially recognized by the International Air Transport Association as a General Sales & Service Agent -

-
+
+
+
+ Certified & Trusted Logistics Provider +

Our Prestigious Certifications and Awards

+
+
+

+ We take great pride in our unwavering commitment to the highest standards of quality, safety, and operational excellence. The following certifications and international memberships highlight and recognize our outstanding performance and reliability in providing world-class logistics services +

+
+
+
+
+
+
+
+
+
+
+ +

+ IATA GSSA Certified Company +

+

+ Officially recognized by the International Air Transport Association as a General Sales & Service Agent +

+
-
-
-
- -

- Member of TIACA - FEDAGSA -

-

- Proud member of leading global cargo and air logistics associations -

-
-
-
-
-
-
- -
-
-
-
-
+
+
+
+ +

+ Member of TIACA - FEDAGSA +

+

+ Proud member of leading global cargo and air logistics associations +

+
+
+
+
+
+
+ +
+
+
+
+
-
-
-
-
- All Our Services -

- Service We Offer -

-
-
-
-
-

orem ipsum dolor sit amet, consectetur adipisicing elit. Eos aperiam porro reiciendis dolore doloribus repellendus tempora vitae quia voluptas ipsum eligend.

-
-
-
-
-
-
-
-
-
- -
- -
-
-
-

Air Freight

-

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est amet similique ipsum reprehenderit sed.

+
+
+
+
+ All Our Services +

+ Service We Offer +

+
+
+
+
+

orem ipsum dolor sit amet, consectetur adipisicing elit. Eos aperiam porro reiciendis dolore doloribus repellendus tempora vitae quia voluptas ipsum eligend.

+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+

Air Freight

+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est amet similique ipsum reprehenderit sed.

- Read More -
-
-
-
-
-
- -
- -
-
-
-

Air Freight

-

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est amet similique ipsum reprehenderit sed.

+ Read More +
+
+
+
+
+
+ +
+ +
+
+
+

Air Freight

+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est amet similique ipsum reprehenderit sed.

- Read More -
-
-
-
-
-
- -
- -
-
-
-

Air Freight

-

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est amet similique ipsum reprehenderit sed.

+ Read More +
+
+
+
+
+
+ +
+ +
+
+
+

Air Freight

+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est amet similique ipsum reprehenderit sed.

- Read More -
-
-
-
-
-
-
-
-

Do You Want To explore more services just click here

-
-
+ Read More +
+
+
+
+
+
+
+
+

Do You Want To explore more services just click here

+
+
-
- Background -
-
-
-
- - Delivering excellence with top airline partners - -

- Global Strategic Partnerships -

-
-
-
-
-
-
-
-
-
Qatar Airways logo
-
-
-
China Airlines logo
-
-
-
Philippine Airlines logo
-
-
-
Cambodia Angkor Air logo
-
-
-
Vietnam Airlines logo
-
- -
+
+ Background +
+
+
+
+ + Delivering excellence with top airline partners + +

+ Global Strategic Partnerships +

+
+
+
+
+
+
+
+
+
Qatar Airways logo
+
+
+
China Airlines logo
+
+
+
Philippine Airlines logo
+
+
+
Cambodia Angkor Air logo
+
+
+
Vietnam Airlines logo
+
+ +
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
- - -
-
-
-
-
-
-

Air Freight

-
-
-
- - - +
+
+
+
+ + +
+
+
+
+
+
+

Air Freight

+
+
+
+ + + - - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - - + + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + - - -
-
-
+ + +
+
+
- + -
-
-
- -

We will contact you soon!

-

- As one of the world’s leading supply chain management companies. -

-
-
-
-
-
-
-
-
-
-

Tracking shipments

-
    -
  • - - Depending on the tracking technology that carriers are using, Morz’s system will work differently to receive and create updates on the status of the shipments. While some tracking updates are received through automated systems, others require Morz tracking teams to regularly reach out to carriers. If you have questions about tracking your shipment, contact your Account Executive. +
+
+
+ +

We will contact you soon!

+

+ As one of the world’s leading supply chain management companies. +

+
+
+
+
+
+
+
+
+
+

Tracking shipments

+
    +
  • + + Depending on the tracking technology that carriers are using, Morz’s system will work differently to receive and create updates on the status of the shipments. While some tracking updates are received through automated systems, others require Morz tracking teams to regularly reach out to carriers. If you have questions about tracking your shipment, contact your Account Executive. -
  • -
  • - - Make sure you use a Morz BOL, otherwise it could result in tracking information delays. The carriers send shipment tracking information to Morz’s system when a Morz BOL is used. +
  • +
  • + + Make sure you use a Morz BOL, otherwise it could result in tracking information delays. The carriers send shipment tracking information to Morz’s system when a Morz BOL is used. -
  • -
  • - - For help finding the BOL number, take a look at a BOL example. Contact your account manager to get a copy of your BOL if you don’t have one. +
  • +
  • + + For help finding the BOL number, take a look at a BOL example. Contact your account manager to get a copy of your BOL if you don’t have one. -
  • -
-
-
-
- -
- - -
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
-
- Background -
-
-
-
-
-
- Get in touch with us anytime -
-

Looking for the best
logistics transport service?

- -
-
-
-
+
+ Background +
+
+
+
+
+
+ Get in touch with us anytime +
+

Looking for the best
logistics transport service?

+ +
+
+
+
-
-
-
-
-
- Coverage -
-

Our Branch Network

+
+
+
+
+
+ Coverage +
+

Our Branch Network

-

- With a strong presence across key cities, we ensure fast service, on-site support, and seamless connections to our customers nationwide and internationally. -

-

- Our company operates 5 branches strategically located in major business hubs. Each office is fully equipped to provide customer care, technical support, and logistics coordination, helping us deliver reliable and efficient services wherever our clients are. -

-
-
-
+

+ With a strong presence across key cities, we ensure fast service, on-site support, and seamless connections to our customers nationwide and internationally. +

+

+ Our company operates 5 branches strategically located in major business hubs. Each office is fully equipped to provide customer care, technical support, and logistics coordination, helping us deliver reliable and efficient services wherever our clients are. +

+
+
+
+
+
+
+
+
+
+
+ Company Branch Map + + +
+
+
+
+
+
+
+
+
+
+
+
+ Background +
+
+
+
+ + Testimonials + +

+ What People and Clients Think About Us? +

+
+
+
+
+
+
+
+
+
+ img +
+
    +
  • +
  • +
  • +
  • +
  • +
+

+ Service is some of the best we have ever volport Logistics International customer + had with ocean forwarders we like to + ship as much as possible with you +

+
+
+ img +
+
+

Disen Mac Hoor

+ + Founder, Volport Co + +
+
+
+
+
+
+
+ img +
+
    +
  • +
  • +
  • +
  • +
  • +
+

+ Service is some of the best we have ever volport Logistics International customer + had with ocean forwarders we like to + ship as much as possible with you +

+
+
+ img +
+
+

Disen Mac Hoor

+ + Founder, Volport Co + +
+
+
+
+
+
+
+ img +
+
    +
  • +
  • +
  • +
  • +
  • +
+

+ Service is some of the best we have ever volport Logistics International customer + had with ocean forwarders we like to + ship as much as possible with you +

+
+
+ img +
+
+

Disen Mac Hoor

+ + Founder, Volport Co + +
+
+
+
+
-
-
-
-
-
-
-
- Company Branch Map - - -
-
-
-
-
-
-
-
-
+
+
+
+ + +
-
-
-
Blog Post
-

Our Latest Blog Post

-
-
- - - -
-
-
-
-
-
-
-
-
- - - -
-
-
- -
- -
- Logistics -

- 5 Ways To Get The Most Out Of Your Logistics -

-
-
- Oct 13, 2021 -
-
- 0 -
-
-
-
-
-
-
- - - -
-
-
- -
- -
- Logistics -

- The Top 5 Changes That Occur With AI in Logistics -

-
-
- Oct 13, 2021 -
-
- 0 -
-
-
-
-
-
-
- - - -
-
-
- -
- -
- Logistics -

- 5 Ways To Get The Most Out Of Your Logistics -

-
-
- Oct 13, 2021 -
-
- 0 -
-
-
-
-
-
-
- - - -
-
-
- -
- -
- Logistics -

- Supply Chain And Logistics Trends That Could Be Big -

-
-
- Oct 13, 2021 -
-
- 0 -
-
-
-
-
-
+
+
+
Blog Post
+

Our Latest Blog Post

+
+
+ + + +
+
+
+
+
+
+
+
+
+
+ + + +
+
+
+ +
+ +
+ Logistics +

+ 5 Ways To Get The Most Out Of Your Logistics +

+
+
+ Oct 13, 2021 +
+
+ 0 +
+
+
+
+
+
+
+ + + +
+
+
+ +
+ +
+ Logistics +

+ The Top 5 Changes That Occur With AI in Logistics +

+
+
+ Oct 13, 2021 +
+
+ 0 +
+
+
+
+
+
+
+ + + +
+
+
+ +
+ +
+ Logistics +

+ 5 Ways To Get The Most Out Of Your Logistics +

+
+
+ Oct 13, 2021 +
+
+ 0 +
+
+
+
+
+
+
+ + + +
+
+
+ +
+ +
+ Logistics +

+ Supply Chain And Logistics Trends That Could Be Big +

+
+
+ Oct 13, 2021 +
+
+ 0 +
+
+
+
+
+
-
-
-
-
+
+
+
+
+
-
+
@section jsLib { - - + + } \ No newline at end of file diff --git a/TWA-App/wwwroot/css/atg-font/atg-admin-font.css b/TWA-App/wwwroot/css/atg-font/atg-admin-font.css index 890118d..2601e65 100644 --- a/TWA-App/wwwroot/css/atg-font/atg-admin-font.css +++ b/TWA-App/wwwroot/css/atg-font/atg-admin-font.css @@ -398,4 +398,8 @@ .atg-mess-question1:before { content: '\a054' +} + +.atg-solid-star:before{ + content: '\a055' } \ No newline at end of file diff --git a/TWA-App/wwwroot/css/atg-lib/atg-core.css b/TWA-App/wwwroot/css/atg-lib/atg-core.css index b4d216c..d1b60ae 100644 --- a/TWA-App/wwwroot/css/atg-lib/atg-core.css +++ b/TWA-App/wwwroot/css/atg-lib/atg-core.css @@ -2652,8 +2652,7 @@ h3 { transition: width .3s ease-in; left: 0; top: 0; - height: 2px; - background: var(--primary) + height: 2px } .ico-menu div:first-child { diff --git a/TWA-App/wwwroot/css/site.css b/TWA-App/wwwroot/css/site.css index b1a33cd..a516473 100644 --- a/TWA-App/wwwroot/css/site.css +++ b/TWA-App/wwwroot/css/site.css @@ -56,6 +56,7 @@ } .f-header { + z-index: 10000; top: -65px } @@ -71,13 +72,10 @@ background-color: var(--text-color-dark) !important } -.f-header.show.ios{ - position: absolute; +.f-header.ios{ + position: fixed; } -.rSlider{ - margin: 0; -} h1, h2, h3, h4, h5, h6, h7, p, span, div { user-select: none; /* Ngăn không cho bôi đen copy text */ @@ -114,8 +112,13 @@ a { position: relative; text-decoration: none; color:inherit; - cursor: pointer + cursor: pointer !important } + + a * { + cursor: pointer !important + } + body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; /* For Firefox on macOS */ @@ -239,7 +242,7 @@ body[page="1000"] .hblock1 { transition: color .3s ease-in-out } -body[page="1000"] .navmain .nav-item:hover, body[page="1000"] .navmain .nav-item.active, body[page="1000"] .navmain [data-dropdown].active .nav-item, .f-header .navmain .nav-item:hover, .f-header .navmain .nav-item.active, .f-header .navmain [data-dropdown].active .nav-item { +body[page="1000"] #header .navmain .nav-item:hover, body[page="1000"] #header .navmain .nav-item.active, body[page="1000"] #header .navmain [data-dropdown].active .nav-item, .f-header .navmain .nav-item:hover, .f-header .navmain .nav-item.active, .f-header .navmain [data-dropdown].active .nav-item { color: var(--text-color-lW1) } @@ -268,12 +271,6 @@ body[page="1000"] .navmain .nav-item:hover, body[page="1000"] .navmain .nav-item border-bottom: 1px solid var(--border-color-2) } -.m-header .nav-mainmenu [data-dropdown] .sub-item { - position: relative; - top: 0 !important; - box-shadow: none; -} - .nav-link { font-size: .92rem; font-weight: 400; @@ -292,7 +289,7 @@ body[page="1000"] .sub-item .nav-link, .sub-item .nav-link { color: var(--text-color-dark) } -.nav-link:hover{ +.nav-link:hover, .nav-link.active{ color: var(--color-primary) !important; padding-left: 25px; background: var(--color-1) @@ -300,7 +297,7 @@ body[page="1000"] .sub-item .nav-link, .sub-item .nav-link { -.navmain [data-dropdown].active .nav-item::after, .navmain .nav-item::after, .navmain [data-dropdown].active .nav-item::before, .navmain .nav-item::before { +.navmain .nav-item::before, .navmain .nav-item::after { content: ''; display: block; position: absolute; @@ -309,33 +306,31 @@ body[page="1000"] .sub-item .nav-link, .sub-item .nav-link { right: 49%; left: 49%; bottom: 0; - height: 3px; + height: 2px; background: var(--color-primary); transform: scaleX(0); transition: transform .4s ease-in-out } -.navmain [data-dropdown].active .nav-item::after, .navmain .nav-item::after, .navmain .nav-item.active::after { +.navmain .nav-item::after { transform-origin: center right; border-top-left-radius: 3px; border-bottom-left-radius: 3px; left: 5%; } -.navmain [data-dropdown].active .nav-item::before, .navmain .nav-item::before, .navmain .nav-item.active::before { +.navmain .nav-item::before { transform-origin: center left; border-top-right-radius: 3px; border-bottom-right-radius: 3px; right: 5%; } -.navmain [data-dropdown].active .nav-item::after, .navmain .nav-item:hover::after, .navmain .nav-item.active::after { - +.navmain [data-dropdown].active .nav-item::after, .navmain .nav-item:hover::after, .navmain .nav-item.active::after, .navmain .activeM .nav-item::after { transform: scale(1); } -.navmain [data-dropdown].active .nav-item::before, .navmain .nav-item:hover::before, .navmain .nav-item.active::before { - +.navmain [data-dropdown].active .nav-item::before, .navmain .nav-item:hover::before, .navmain .nav-item.active::before, .navmain .activeM .nav-item::before { transform: scaleX(1); } @@ -352,7 +347,10 @@ body[page="1000"] .sub-item .nav-link, .sub-item .nav-link { width: var(--mNav-width); box-shadow: 0 2px 3px rgba(96, 96, 96, .4); transition: left .6s ease-out; - padding: 35px 30px +} + +.m-header .c_logo{ + margin: 35px 30px 0; } .m-header.show { @@ -365,19 +363,25 @@ body[page="1000"] .sub-item .nav-link, .sub-item .nav-link { top: 20px; right: 20px; } - - - .m-header .navmain { - margin: 20px 0; + .m-header .nav-mainmenu [data-dropdown] .sub-item { + position: relative; + top: 0 !important; + box-shadow: none; } - .m-header .navmain .nav-item.active::after, .m-header .navmain .nav-item:hover::after, .m-header .navmain .nav-i.active .nav-item::after, .m-header .navmain .nav-i.activeM .nav-item::after { + .m-header .navmain { + height: calc(100% - 120px); + padding: 0 35px; + margin-top: 20px; + } + + .m-header .navmain .nav-item:hover::after, .m-header .navmain .nav-i.active .nav-item::after, .m-header .navmain .activeM .nav-item::after { left: 0; right: 50%; width: 50% } - .m-header .navmain .nav-item.active::before, .m-header .navmain .nav-item:hover::before, .m-header .navmain .nav-i.active .nav-item::before, .m-header .navmain .nav-i.activeM .nav-item::before { + .m-header .navmain .nav-item:hover::before, .m-header .navmain .nav-i.active .nav-item::before, .m-header .navmain .activeM .nav-item::before { left: 50%; right: 0; width: 50%; @@ -388,21 +392,53 @@ body[page="1000"] .sub-item .nav-link, .sub-item .nav-link { height: auto !important; } + .m-header .navmain a.active, .m-header .navmain .nav-item:hover { + color: var(--color-second) + } + + .m-header .navmain .sub-item .nav-link.active, .m-header .navmain .sub-item .nav-link:hover { + padding-left: 15px; + color: var(--color-primary); + background: none + } + + .m-header .navmain .sub-item .nav-link{ + padding-left: 10px + } + .m-header .navmain a { padding: 10px 0; display: inline-flex; - } + color:var(--text-color-dark) - .m-header .navmain .nav-item{ - color:#000 } - .m-header .navmain [data-dropdown] .sub-item { position: relative; top: 0 !important; box-shadow: none; } + .m-header .sub-nav-full { + width: 100% !important; + left: 0; + transform: none + } + .m-header .sub-nav-full .cfull{ + padding: 0; + } + .m-header .sub-nav-full .r-n-g > div + { + flex: 0 0 100%; + max-width: 100% !important + } + .m-header .sub-nav-full .nav-col { + margin:5px 10px + } + .m-header .sub-nav-full .title { + padding-left: 0; + padding-bottom: 10px + } + .rSlider { margin: 0; } @@ -641,12 +677,16 @@ div[class*=sec]{ } .ico-menu span { - background-color: var(--text-color-white) !important; + background-color: var(--text-color-dark); border-radius: 2px; height: 2px !important; cursor: pointer } +body[page="1000"] .ico-menu span { + background-color: var(--text-color-white) +} + .ico-menu:hover div:first-child span, .ico-menu.active div:first-child span { animation: down-rotate 0.6s ease-in-out forwards; } @@ -1116,6 +1156,64 @@ div[class*=sec]{ } /***End Section**/ +/**********Customer Section**********/ +.customer-section{ + padding: 80px 0 60px +} +.cust-reviews { + padding: 40px 35px +} + + .cust-reviews .quote { + opacity: .3; + display: inline-block; + position: absolute; + top: 20px; + right: 20px; + z-index: -1; + } +.cust-body{ + display: flex; + margin-top: 30px; + color: white +} + +.cust-image { + width: 64px; + height: 64px; + border: 2px solid white; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + border-radius: 50%; + padding: 3px; +} + + .cust-image img { + width: 54px; + height: auto + } + +.cust-reviews .star { + display: flex; + margin-bottom: 20px; + line-height: 1; +} + + .cust-reviews .star li { + display: inline; + margin-right: 2px; + } + + .cust-reviews .star li i { + color: var(--color-primary); + } +.cust-reviews p { + color: var(--text-color-white); + margin-bottom: 0; +} + +/************End Section***********************/ + /***Our Service Section***/ .our-section { padding:0 @@ -1334,10 +1432,13 @@ div[class*=sec]{ } +.blog-section .swiper-slide { + padding: 0 20px 20px; +} .blog-section .grid{ - margin:0; - height: 100% +margin: 0; +height: 100% } .blog-author { position: absolute; @@ -1513,7 +1614,7 @@ div[class*=sec]{ opacity: 1; visibility: visible; background: rgb(86 83 96 / 0.32); - width: 100vh; + width: 100vw; } .c-aoverlay { @@ -1724,4 +1825,140 @@ div[class*=sec]{ resize: none } -/*********End************/ \ No newline at end of file +/*********End************/ + + + +/*********Page Section***********/ +.page-section .title{ + padding: 60px 0; +} + +.con-page-section { + margin-bottom:40px +} + + +video.bg-video { + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + object-fit: cover; + z-index: 0; +} + +.con-masthead{ + overflow:hidden; + 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: 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 h2{ + text-transform: capitalize; + font-size: 2.5rem + } + +.masthead-content p { + font-size: 1rem; + line-height: 2 +} + + + + .masthead .masthead-content .input-group-newsletter input { + height: auto; + width: 100%; + font-size: 1rem; + padding: 1rem; + } + + .masthead .masthead-content .input-group-newsletter button { + font-size: 0.85rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 1px; + padding: calc(1rem + 2px); + } + +@media (min-width: 992px) { + .masthead { + padding: 60px 0; + height: 100%; + width: 75vw; + min-height: 0; + } + + .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; + } +} + +.social-icons { + position: relative; + z-index: 2; +} + + .social-icons .btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0; + height: 4rem; + width: 4rem; + border-radius: 100rem; + } + +@media (min-width: 992px) { + .social-icons { + position: absolute; + height: 100%; + top: 0; + right: 2.5rem; + width: auto; + } +} \ No newline at end of file diff --git a/TWA-App/wwwroot/font/atg-admin-font.fcp b/TWA-App/wwwroot/font/atg-admin-font.fcp index e32ee70..f70afc4 100644 Binary files a/TWA-App/wwwroot/font/atg-admin-font.fcp and b/TWA-App/wwwroot/font/atg-admin-font.fcp differ diff --git a/TWA-App/wwwroot/font/atgfont-Regular.woff b/TWA-App/wwwroot/font/atgfont-Regular.woff index 867c76c..f75a3a3 100644 Binary files a/TWA-App/wwwroot/font/atgfont-Regular.woff and b/TWA-App/wwwroot/font/atgfont-Regular.woff differ diff --git a/TWA-App/wwwroot/font/atgfont-Regular.woff2 b/TWA-App/wwwroot/font/atgfont-Regular.woff2 index 55f5d20..15faf65 100644 Binary files a/TWA-App/wwwroot/font/atgfont-Regular.woff2 and b/TWA-App/wwwroot/font/atgfont-Regular.woff2 differ diff --git a/TWA-App/wwwroot/images/1000/customer-section/review-cust.jpg b/TWA-App/wwwroot/images/1000/customer-section/review-cust.jpg new file mode 100644 index 0000000..ac9baa4 Binary files /dev/null and b/TWA-App/wwwroot/images/1000/customer-section/review-cust.jpg differ diff --git a/TWA-App/wwwroot/images/wait-section/bg.mp4 b/TWA-App/wwwroot/images/wait-section/bg.mp4 new file mode 100644 index 0000000..36fdff9 Binary files /dev/null and b/TWA-App/wwwroot/images/wait-section/bg.mp4 differ diff --git a/TWA-App/wwwroot/js/js-page/1000.js b/TWA-App/wwwroot/js/js-page/1000.js index 04e1d26..e7af238 100644 --- a/TWA-App/wwwroot/js/js-page/1000.js +++ b/TWA-App/wwwroot/js/js-page/1000.js @@ -20,15 +20,21 @@ function updateActiveSlideShow(swiperInstance) { window.L1000 = function () { const swiper = new Swiper('.mainSlider', { loop: true, - effect: 'fade', - fadeEffect: { - crossFade: true, // ảnh cũ mờ dần, ảnh mới xuất hiện + effect: 'creative', + creativeEffect: { + limitProgress: 1, + prev: { translate: ['-40%', 0, -1], opacity: 0, shadow: true }, + next: { translate: ['40%', 0, -1], opacity: 0, shadow: true } }, autoplay: { delay: 5000, // 5s disableOnInteraction: false, // không dừng khi hover hay click }, loop: true, // bật loop để chạy liên tục + allowTouchMove: true, + simulateTouch: true, + followFinger: true, + threshold: 0, speed: 1000, navigation: { nextEl: ".swiper-button-next", @@ -61,7 +67,7 @@ window.L1000 = function () { } }); var tabs = new ATab(document.querySelector(".tabQuoute .atabs"), document.querySelector(".tabQuoute .tabcontents")); - + const parallaxEls = document.querySelectorAll('.parallax'); let ticking = false; const swiper1 = new Swiper('.airlineSwiper', { @@ -86,12 +92,12 @@ window.L1000 = function () { }); parallaxEls.forEach(el => { const parent = el.closest(".con-parallax"); - if (parent) { + if (parent) { parent.style.height = parent.querySelector("[data-content]").offsetHeight + "px"; } }); window.app.on("App_Scrolling", (t) => { - if (!ticking) { + if (!ticking) { window.requestAnimationFrame(() => { updateParallax(t, parallaxEls); ticking = false; @@ -114,10 +120,10 @@ window.L1000 = function () { }); const swiper2 = new Swiper('.ourBlogSwiper', { slidesPerView: 1, - spaceBetween: 40, + spaceBetween: 0, autoplay: { delay: 2000, // 5s - disableOnInteraction: true, + disableOnInteraction: true, }, loop: true, // bật loop để chạy liên tục speed: 1000, @@ -134,7 +140,26 @@ window.L1000 = function () { }, }); - + const swiper3 = new Swiper(".custSwiper", { + slidesPerView: 1, + spaceBetween: 40, + 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: 3 }, // màn hình ≥1200px + 576: { slidesPerView: 2 }, // ≥768px= + 0: { slidesPerView: 1 } // <576px + }, + }); } function animateCount(el) { const rect = el.getBoundingClientRect(); diff --git a/TWA-App/wwwroot/js/js-page/2000.js b/TWA-App/wwwroot/js/js-page/2000.js index 954cde0..aea443a 100644 --- a/TWA-App/wwwroot/js/js-page/2000.js +++ b/TWA-App/wwwroot/js/js-page/2000.js @@ -1,5 +1,61 @@ -window.L2000 = function () { - +window.runParalax = 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; + } + }); } +function updateParallax(t, parallaxEls) { + parallaxEls.forEach(el => { + const section = el.closest('.con-parallax'); + if (!section) return; + + const rect = section.getBoundingClientRect(); + const sectionHeight = section.offsetHeight; + + // Chỉ xử lý khi section trong khung nhìn + const inView = rect.bottom > 0 && rect.top < window.innerHeight; + if (!inView) return; + + // Set height parent 1 lần + const content = section.querySelector('[data-content]'); + if (content && !section.dataset.heightSet) { + section.style.height = content.offsetHeight + 'px'; + section.dataset.heightSet = 'true'; // đánh dấu đã set height + } + + const img = el.querySelector('.bg-img'); + if (!img) return; + + const imgHeight = img.offsetHeight; + const depth = parseFloat(el.dataset.depth ?? 1); // 1 = chạy hết, <1 = chạy ít hơn + + // progress: 0 khi section top chạm viewport top, 1 khi section bottom chạm viewport bottom + const progress = (window.innerHeight - rect.top) / (window.innerHeight + sectionHeight); + const clamped = Math.min(1, Math.max(0, progress)); + + // scrollable = toàn bộ quãng đường ảnh có thể chạy + const scrollable = imgHeight - sectionHeight; + + // offset Y + const offsetY = -clamped * scrollable * depth; + img.style.transform = `translate(-50%, ${offsetY}px)`; + }); +} + + window.AScript.set("2000", true); \ No newline at end of file diff --git a/TWA-App/wwwroot/js/js-page/2001.js b/TWA-App/wwwroot/js/js-page/2001.js new file mode 100644 index 0000000..a08f1ff --- /dev/null +++ b/TWA-App/wwwroot/js/js-page/2001.js @@ -0,0 +1,133 @@ +window.L2001 = function () { + if (window["runParalax"] !== undefined) { + window["runParalax"](); + } + const swiper2 = new Swiper('.ourBlogSwiper1', { + 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: { + 1400: { slidesPerView: 4 }, + 992: { slidesPerView: 3 }, // màn hình ≥1200px + 576: { slidesPerView: 2 }, // ≥768px= + 0: { slidesPerView: 1 } // <576px + }, + }); + + + const parallaxEls = document.querySelectorAll('.con-perf-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"; + } + }); + const countNum = document.querySelectorAll('[CountNumber]'); + let tickingC = false; + window.app.on("App_Scrolling", (t) => { + if (!ticking) { + window.requestAnimationFrame(() => { + updateParallax(t, parallaxEls); + ticking = false; + }); + ticking = true; + } + if (!tickingC) { + window.requestAnimationFrame(() => { + countNum.forEach((el) => { + animateCount(el); + }) + tickingC = false; + }); + tickingC = true; + } + }); + +} +function animateCount(el) { + const rect = el.getBoundingClientRect(); + const inView = rect.bottom > 0 && rect.top < window.innerHeight; + if (el.hasAttribute("render")) { + if (!inView) { + el.removeAttribute("render"); + } + return; + } + if (inView) { + el.setAttribute("render", ""); + const min = parseInt(el.getAttribute("num-min") ?? 0); + const max = parseInt(el.getAttribute("num-max") ?? 1); + const prefix = el.getAttribute("prefix") ?? ""; + const duration = parseInt(el.getAttribute("duration") ?? 1000); // ms + const interval = 10; // ms mỗi tick + + const steps = duration / interval; + const stepValue = Math.ceil((max - min) / steps); + + let current = min; + let tickCount = 0; + + function tick() { + current = Math.min(min + stepValue * tickCount, max); + el.textContent = prefix + current.toLocaleString("en-US"); + tickCount++; + + if (tickCount <= steps) { + window.requestTimeout(tick, interval); + } + } + + tick(); // khởi chạy + } +} + +function updateParallax(t, parallaxEls) { + parallaxEls.forEach(el => { + const section = el.closest('.con-parallax'); + if (!section) return; + + const rect = section.getBoundingClientRect(); + const sectionHeight = section.offsetHeight; + + // Chỉ xử lý khi section trong khung nhìn + const inView = rect.bottom > 0 && rect.top < window.innerHeight; + if (!inView) return; + + // Set height parent 1 lần + const content = section.querySelector('[data-content]'); + if (content && !section.dataset.heightSet) { + section.style.height = content.offsetHeight + 'px'; + section.dataset.heightSet = 'true'; // đánh dấu đã set height + } + + const img = el.querySelector('.bg-img'); + if (!img) return; + + const imgHeight = img.offsetHeight; + const depth = parseFloat(el.dataset.depth ?? 1); // 1 = chạy hết, <1 = chạy ít hơn + + // progress: 0 khi section top chạm viewport top, 1 khi section bottom chạm viewport bottom + const progress = (window.innerHeight - rect.top) / (window.innerHeight + sectionHeight); + const clamped = Math.min(1, Math.max(0, progress)); + + // scrollable = toàn bộ quãng đường ảnh có thể chạy + const scrollable = imgHeight - sectionHeight; + + // offset Y + const offsetY = -clamped * scrollable * depth; + img.style.transform = `translate(-50%, ${offsetY}px)`; + }); +} + +window.AScript.set("2001", true); \ No newline at end of file diff --git a/TWA-App/wwwroot/js/js-page/2002.js b/TWA-App/wwwroot/js/js-page/2002.js new file mode 100644 index 0000000..2dc4e26 --- /dev/null +++ b/TWA-App/wwwroot/js/js-page/2002.js @@ -0,0 +1,7 @@ +window.L2002 = function () { + if (window["runParalax"] !== undefined) { + window["runParalax"](); + } +} + +window.AScript.set("2002", true); \ No newline at end of file diff --git a/TWA-App/wwwroot/js/js-page/2003.js b/TWA-App/wwwroot/js/js-page/2003.js new file mode 100644 index 0000000..49c8eb4 --- /dev/null +++ b/TWA-App/wwwroot/js/js-page/2003.js @@ -0,0 +1,7 @@ +window.L2002 = function () { + if (window["runParalax"] !== undefined) { + window["runParalax"](); + } +} + +window.AScript.set("2003", true); \ No newline at end of file diff --git a/TWA-App/wwwroot/js/js-page/2004.js b/TWA-App/wwwroot/js/js-page/2004.js new file mode 100644 index 0000000..c8b6012 --- /dev/null +++ b/TWA-App/wwwroot/js/js-page/2004.js @@ -0,0 +1,7 @@ +window.L2002 = function () { + if (window["runParalax"] !== undefined) { + window["runParalax"](); + } +} + +window.AScript.set("2004", true); \ No newline at end of file diff --git a/TWA-App/wwwroot/js/js-page/2005.js b/TWA-App/wwwroot/js/js-page/2005.js new file mode 100644 index 0000000..af18de2 --- /dev/null +++ b/TWA-App/wwwroot/js/js-page/2005.js @@ -0,0 +1,7 @@ +window.L2002 = function () { + if (window["runParalax"] !== undefined) { + window["runParalax"](); + } +} + +window.AScript.set("2005", true); \ No newline at end of file diff --git a/TWA-App/wwwroot/js/js-page/asyncLayout.js b/TWA-App/wwwroot/js/js-page/asyncLayout.js index 6099d3a..8df1d5c 100644 --- a/TWA-App/wwwroot/js/js-page/asyncLayout.js +++ b/TWA-App/wwwroot/js/js-page/asyncLayout.js @@ -21,7 +21,7 @@ class AsyncLayout extends ALayout { - `; @@ -102,6 +102,15 @@ 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, + renderByPixel: true, + 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) => { a1.changeActive(); a2.changeActive(); diff --git a/TWA-App/wwwroot/js/libs/js-ADropdown.js b/TWA-App/wwwroot/js/libs/js-ADropdown.js index 48ffdc4..b3b9e93 100644 --- a/TWA-App/wwwroot/js/libs/js-ADropdown.js +++ b/TWA-App/wwwroot/js/libs/js-ADropdown.js @@ -9,6 +9,7 @@ export default class Dropdown extends window.AObject { if (window.dropdown == null) { this.initGlobalVar(); } + this.scrollTrack = false; } initGlobalVar() { var f = function (ev) { @@ -42,7 +43,7 @@ export default class Dropdown extends window.AObject { if (window.isValidPointerClick(ev)) return; this.onClick.call(this, ev); }.bind(this); - this.addSystemEvent(this.eventName, e, f, p); + this.addSystemEvent(this.eventName, e, f, p, true); } document_onClick(e) { this.checkRelease(e); @@ -51,8 +52,13 @@ export default class Dropdown extends window.AObject { if (this.isLock) { return; } + if (this.scrollTrack) { + e.stopImmediatePropagation(); + e.preventDefault(); + return; + } var t1 = e.currentTarget; - var p = t1.closest('[data-dropdown]'); + var p = t1.closest('[data-dropdown]'); var p1 = e.target.closest(".noopen"); if (window.dropdown.currentE != null && (e.target.closest(".item") != null || p1 == null)) { var tmp = window.dropdown.currentE.con; diff --git a/TWA-App/wwwroot/js/libs/js-AMenu.js b/TWA-App/wwwroot/js/libs/js-AMenu.js index db7122e..4c6c1ba 100644 --- a/TWA-App/wwwroot/js/libs/js-AMenu.js +++ b/TWA-App/wwwroot/js/libs/js-AMenu.js @@ -45,17 +45,17 @@ export default class AMenu extends window.AObject { this.initDropDown(); this.initNav(this.navD); if (this.isMDiffD) { - this.initNav(this.navM); + this.initNav(this.navM, "M"); } } - initNav(ele) { + initNav(ele, type = "D") { let arr = ele.querySelectorAll(".nav-i.has-sub .nav-link, .nav-mainmenu > .nav-i:not(.has-sub) a"); Array.from(arr).forEach(el => { var f = function (evt) { if (window.isValidPointerClick(evt)) return; - this.addEventClick.call(this, evt); + this.addEventClick.call(this, evt, type); }.bind(this); el.addEventListener(this.eventName, f); var f1 = function (evt) { @@ -124,8 +124,14 @@ export default class AMenu extends window.AObject { } } - addEventClick(e) { + 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"); + }) + } } closeExpandMenu() { Array.from(this.navM.querySelectorAll(".nav-i.has-sub")).forEach(el => { diff --git a/TWA-App/wwwroot/js/libs/js-core.js b/TWA-App/wwwroot/js/libs/js-core.js index ea66714..d03ed45 100644 --- a/TWA-App/wwwroot/js/libs/js-core.js +++ b/TWA-App/wwwroot/js/libs/js-core.js @@ -415,13 +415,13 @@ window.AObject = class { } } - addSystemEvent(eventName, element, callback, parent = null) { + addSystemEvent(eventName, element, callback, parent = null, capture = false) { if (!this.systemEvents.has(element)) { this.systemEvents.set(element, new Map()); } const eventMap = this.systemEvents.get(element); eventMap.set(eventName, { callback, parent }); - element.addEventListener(eventName, callback, false); + element.addEventListener(eventName, callback, capture); if (parent) { if (!this.parentEventMap.has(parent)) { this.parentEventMap.set(parent, new Set()); @@ -622,7 +622,7 @@ class AApp extends window.AObject { } else { var sOption = { - damping: (window.getOS() == "Android") ? .1 : .04, + damping: (window.getOS() == "Android") ? .08 : .04, thumbMinSize: 25, renderByPixel: true, alwaysShowTracks: true, @@ -1007,36 +1007,43 @@ class CacheStorage { } _initDB() { - const req = indexedDB.open(`${this.prefix}_db`, 1); - req.onupgradeneeded = (e) => { - let store; - if (!e.target.result.objectStoreNames.contains("cache")) { - store = e.target.result.createObjectStore("cache", { keyPath: "key" }); - } - if (!e.target.result.objectStoreNames.contains("fpCache")) { - e.target.result.createObjectStore("fpCache", { keyPath: "key" }); - } - try { - store.add({ id: 1, value: "test data" }); - store.delete("1"); - } catch (e) { + + const openDB = () => { + console.log("Renew Database"); + const req = indexedDB.open(`${this.prefix}_db`, 1); + req.onupgradeneeded = (e) => { + const db = e.target.result; + if (!db.objectStoreNames.contains("cache")) { + db.createObjectStore("cache", { keyPath: "key" }); + } + if (!db.objectStoreNames.contains("fpCache")) { + db.createObjectStore("fpCache", { keyPath: "key" }); + } + }; + req.onsuccess = () => { + this.db = req.result; this.ready = true; + this._flushQueue(); + }; + req.onerror = () => { + console.warn("IndexedDB open failed, fallback to localStorage"); this.db = null; - this.useIndexedDB = false; - } - + this.ready = true; + this._flushQueue(); + }; }; - req.onsuccess = (event) => { - this.db = req.result; - this.ready = true; - this._flushQueue(); + + + const del = indexedDB.deleteDatabase(`${this.prefix}_db`); + del.onsuccess = () => openDB(); + del.onerror = () => { + console.warn("deleteDatabase failed, continue opening fresh"); + openDB(); }; - req.onerror = () => { - console.warn("IndexedDB failed, fallback to localStorage"); - this.ready = true; - this.db = null; - this._flushQueue(); + del.onblocked = () => { + console.warn("deleteDatabase blocked (tab khác đang giữ kết nối)"); }; + } _flushQueue() { while (this.queue.length) { diff --git a/TWA-App/wwwroot/js/site.js b/TWA-App/wwwroot/js/site.js deleted file mode 100644 index 0937657..0000000 --- a/TWA-App/wwwroot/js/site.js +++ /dev/null @@ -1,4 +0,0 @@ -// Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification -// for details on configuring this project to bundle and minify static web assets. - -// Write your JavaScript code.