Closed TrdHuy closed 2 months ago
portfolios.json
[
{
"page_id": "page_portfolio_autoblocker",
"page_name": "Auto blocker",
"page_avatar": "./assets/images/portofilo/autoblocker/ab.jpg",
"page_url": "portfolio_autoblocker.html",
"page_category": "Android application"
}
]
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>H U Y</title>
<!--
- favicon
-->
<link rel="shortcut icon" href="./assets/images/my-avatar.png" type="image/x-icon">
<!--
- custom css link
-->
<link rel="stylesheet" href="./assets/css/style.css">
<!--
- google font link
-->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600&display=swap" rel="stylesheet">
</head>
<body>
<!--
- #MAIN
-->
<main>
<!--
- #SIDEBAR
-->
<div class="modal-container" form-input-container>
<div class="overlay" form-input-overlay></div>
<section class="form-input-modal">
<button class="modal-close-btn" form-input-close-btn>
<ion-icon name="close-outline"></ion-icon>
</button>
<div class="modal-content" form-input-modal-content>
</div>
<iframe id="formInputFrame" allowTransparency="true" scrolling="no" frameborder="0"></iframe>
</section>
</div>
<aside class="sidebar" data-sidebar>
<div class="sidebar-info">
<figure class="avatar-box">
<img src="./assets/images/ava.jpg" alt="H U Y">
</figure>
<div class="info-content">
<h1 class="name" title="H U Y">H U Y</h1>
<p class="title">Fullstack Software Engineer</p>
</div>
<button class="info_more-btn" data-sidebar-btn>
<span>Show Contacts</span>
<ion-icon name="chevron-down"></ion-icon>
</button>
</div>
<div class="sidebar-info_more">
<div class="separator"></div>
<ul class="contacts-list">
<li class="contact-item">
<div class="icon-box">
<ion-icon name="mail-outline"></ion-icon>
</div>
<div class="contact-info">
<p class="contact-title">Email</p>
<a href="mailto:trdtranduchuy@gmail.com" class="contact-link">trdtranduchuy@gmail.com</a>
</div>
</li>
<li class="contact-item">
<div class="icon-box">
<ion-icon name="phone-portrait-outline"></ion-icon>
</div>
<div class="contact-info">
<p class="contact-title">Phone</p>
<a href="tel:+84383854090" class="contact-link">+84 (38) 3854-090</a>
</div>
</li>
<li class="contact-item">
<div class="icon-box">
<ion-icon name="calendar-outline"></ion-icon>
</div>
<div class="contact-info">
<p class="contact-title">Birthday</p>
<time datetime="1996-09-10">Oct 9, 1996</time>
</div>
</li>
<li class="contact-item">
<div class="icon-box">
<ion-icon name="location-outline"></ion-icon>
</div>
<div class="contact-info">
<p class="contact-title">Location</p>
<address>Long Bien, Ha Noi, Viet Nam</address>
</div>
</li>
</ul>
<div class="separator"></div>
<ul class="social-list">
<li class="social-item">
<a href="https://www.facebook.com/trdtranduchuy" class="social-link">
<ion-icon name="logo-facebook"></ion-icon>
</a>
</li>
<li class="social-item">
<a href="https://github.com/TrdHuy" class="social-link">
<ion-icon name="logo-github"></ion-icon>
</a>
</li>
</ul>
</div>
</aside>
<!--
- #main-content
-->
<div class="main-content">
<!--
- #NAVBAR
-->
<nav class="navbar">
<ul class="navbar-list">
<li class="navbar-item">
<button class="navbar-link active" data-nav-link>About</button>
</li>
<li class="navbar-item">
<button class="navbar-link" data-nav-link>Resume</button>
</li>
<li class="navbar-item">
<button class="navbar-link" data-nav-link>Portfolio</button>
</li>
<li class="navbar-item">
<button class="navbar-link" data-nav-link>Developers</button>
</li>
<li class="navbar-item">
<button class="navbar-link" data-nav-link>Contact</button>
</li>
</ul>
</nav>
<!--
- #ABOUT
-->
<article class="about active" data-page="about">
<header>
<h2 class="h2 article-title">About me</h2>
</header>
<section class="about-text">
<p>👋 Hi. I am Huy. I am a seasoned fullstack engineer with a passion for software development 🧑💻. I
specialize in server applications, mobile applications, and desktop applications. With years of experience,
I've worked on a variety of projects that span across multiple platforms and technologies.</p>
<p>🚀 I have had the privilege of working at Samsung, where I spent several years researching and developing
innovative software solutions. My time at Samsung has honed my skills in creating robust and efficient
software systems, and I bring that expertise to every project I work on.</p>
<p>📈 Throughout my career, I have managed and led the development of multiple software projects, ensuring
they are delivered on time and meet high-quality standards. As a software architect, I have designed and
implemented scalable and maintainable software architectures that drive business success.</p>
<p>⚡️ I am obsessed with creating robust and efficient software solutions. I enjoy solving complex problems
and building scalable systems that enhance user experiences.</p>
<p>🎓 Additionally, I serve as an internal lecturer at Samsung, where I teach Android application programming.
Through this role, I have the opportunity to share my knowledge and experience with colleagues, helping to
cultivate the next generation of skilled developers within the company.</p>
</section>
<!--
- service
-->
<section class="service">
<h3 class="h3 service-title">What i'm doing</h3>
<ul class="service-list">
<li class="service-item" data-service-item>
<div class="service-icon-box">
<img src="./assets/images/blender.png" alt="design icon" width="40" data-service-avatar>
</div>
<div class="service-content-box">
<h4 class="h4 service-item-title" data-service-title>Application design</h4>
<div class="service-item-text" data-service-text>
<p>
The most modern and high-quality design made at a professional level.
</p>
</div>
</div>
</li>
<li class="service-item" data-service-item>
<div class="service-icon-box">
<img src="./assets/images/net-core.png" alt="Application development icon" width="40"
data-service-avatar>
</div>
<div class="service-content-box">
<h4 class="h4 service-item-title" data-service-title>Desktop Apps</h4>
<div class="service-item-text" data-service-text>
<p>
Developed highly scalable and efficient server-side applications using .NET framework.
</p>
</div>
</div>
</li>
<li class="service-item" data-service-item>
<div class="service-icon-box">
<img src="./assets/images/gh-action.png" alt="Application development icon" width="40"
data-service-avatar>
</div>
<div class="service-content-box">
<h4 class="h4 service-item-title" data-service-title>DevOps</h4>
<div class="service-item-text" data-service-text>
<p>
Implemented CI/CD pipelines and automated deployment processes using Github Action.
</p>
</div>
</div>
</li>
<li class="service-item" data-service-item>
<div class="service-icon-box">
<img src="./assets/images/xamarin.png" alt="mobile app icon" width="40" data-service-avatar>
</div>
<div class="service-content-box">
<h4 class="h4 service-item-title" data-service-title>Mobile apps</h4>
<div class="service-item-text" data-service-text>
<p>
Our mobile application development service excels in creating high-quality, cross-platform
applications for both iOS and Android using the Xamarin framework.
</p>
<p>
Ensuring seamless performance and
a consistent user experience across all devices.
</p>
</div>
</div>
</li>
<li class="service-item" data-service-item>
<div class="service-icon-box">
<img src="./assets/images/android.png" alt="mobile app icon" width="40" data-service-avatar>
</div>
<div class="service-content-box">
<h4 class="h4 service-item-title" data-service-title>Android apps</h4>
<div class="service-item-text" data-service-text>
<p>
Our professional mobile application development service specializes in creating robust and
innovative applications using the Android framework.
</p>
<p>
Ensuring high performance and seamless user experiences.
</p>
</div>
</div>
</li>
<li class="service-item" data-service-item>
<div class="service-icon-box">
<img src="./assets/images/unity.png" alt="unity icon" width="40" data-service-avatar>
</div>
<div class="service-content-box">
<h4 class="h4 service-item-title" data-service-title>Game Development</h4>
<div class="service-item-text" data-service-text>
<p>
Developed engaging and interactive games using the Unity platform.
</p>
</div>
</div>
</li>
<li class="service-item" data-service-item>
<div class="service-icon-box">
<img src="./assets/images/jira.png" alt="mobile app icon" width="40" data-service-avatar>
</div>
<div class="service-content-box">
<h4 class="h4 service-item-title" data-service-title>Project Management</h4>
<div class="service-item-text" data-service-text>
<p>
Managed the development of multiple software projects, ensuring timely delivery and adherence to
quality standards.
Designed and implemented scalable and maintainable software architectures.
</p>
</div>
</div>
</li>
</ul>
</section>
<!--
- testimonials
-->
<section class="testimonials">
<h3 class="h3 testimonials-title">My team</h3>
<ul class="testimonials-list has-scrollbar">
<li class="testimonials-item">
<div class="content-card" data-testimonials-item>
<figure class="testimonials-avatar-box">
<img src="./assets/images/hieu-nguyen.jpg" alt="Henry william" width="60" data-testimonials-avatar>
</figure>
<h4 class="h4 testimonials-item-title" data-testimonials-title>Nguyễn Trung Hiếu</h4>
<div class="testimonials-text" data-testimonials-text>
<p>
He is a talented programmer with 2 years of experience in web and desktop application development.
Skilled in both front-end and back-end technologies, he has successfully created dynamic websites
and efficient desktop applications.
</p>
<p>
His dedication to writing clean, maintainable code ensures that
his projects are both user-friendly and reliable. Always eager to learn, he continually updates his
knowledge to stay current with the latest industry trends and technologies.
</p>
</div>
</div>
</li>
<li class="testimonials-item">
<div class="content-card" data-testimonials-item>
<figure class="testimonials-avatar-box">
<img src="./assets/images/mai-tam.jpg" alt="Mai Tam" width="60" data-testimonials-avatar>
</figure>
<h4 class="h4 testimonials-item-title" data-testimonials-title>Mai Tâm</h4>
<div class="testimonials-text" data-testimonials-text>
<p>
She is a professional tester with 4 years of experience in the field of global application testing.
With extensive knowledge and exceptional skills, she is proficient in running testing tools and
designing them effectively.
</p>
<p>
She has written numerous high-quality test cases, ensuring comprehensive
testing of applications that meet the highest standards. Her passion and progressive mindset
contribute positively to the success of every testing project she is involved in.
</p>
</div>
</div>
</li>
<li class="testimonials-item">
<div class="content-card" data-testimonials-item>
<figure class="testimonials-avatar-box">
<img src="./assets/images/duy-nguyen.jpg" alt="Daniel lewis" width="60" data-testimonials-avatar>
</figure>
<h4 class="h4 testimonials-item-title" data-testimonials-title>Nguyễn Quốc Duy</h4>
<div class="testimonials-text" data-testimonials-text>
<p>
He is a skilled programmer with 4 years of experience in developing mobile applications and web
solutions. With a deep understanding of both front-end and back-end technologies, he has
successfully
built and deployed numerous high-quality apps and websites.
</p>
<p>
His expertise in creating user-friendly interfaces and robust back-end systems ensures that every
project he works on is both functional and efficient. Passionate about staying updated with the
latest
industry trends, he continually enhances his skills to deliver innovative and reliable solutions.
</p>
</div>
</div>
</li>
</ul>
</section>
<!--
- testimonials modal
-->
<div class="modal-container" data-modal-container>
<div class="overlay" data-overlay></div>
<section class="testimonials-modal">
<button class="modal-close-btn" data-modal-close-btn>
<ion-icon name="close-outline"></ion-icon>
</button>
<div class="modal-img-wrapper">
<figure class="modal-avatar-box">
<img src="./assets/images/avatar-1.png" alt="Daniel lewis" data-modal-img>
</figure>
<img src="./assets/images/icon-quote.svg" alt="quote icon">
</div>
<div class="modal-content">
<h4 class="h3 modal-title" data-modal-title>Nguyễn Quốc Duy</h4>
<time datetime="2021-06-14">14 June, 2021</time>
<div data-modal-text>
<p>
He is a skilled programmer with 4 years of experience in developing mobile applications and web
solutions. With a deep understanding of both front-end and back-end technologies, he has successfully
built and deployed numerous high-quality apps and websites.
</p>
<p>
His expertise in creating user-friendly interfaces and robust back-end systems ensures that every
project he works on is both functional and efficient. Passionate about staying updated with the latest
industry trends, he continually enhances his skills to deliver innovative and reliable solutions.
</p>
</div>
</div>
</section>
</div>
<!--
- service modal
-->
<div class="modal-container" data-service-modal-container>
<div class="overlay" data-service-overlay></div>
<section class="testimonials-modal">
<button class="modal-close-btn" data-service-modal-close-btn>
<ion-icon name="close-outline"></ion-icon>
</button>
<div class="modal-img-wrapper">
<figure>
<img src="./assets/images/avatar-1.png" alt="Daniel lewis" width="80" data-service-modal-img>
</figure>
</div>
<div class="modal-content">
<h4 class="h3 modal-title" data-service-modal-title>Nguyễn Quốc Duy</h4>
<div data-service-modal-text>
<p>
He is a skilled programmer with 4 years of experience in developing mobile applications and web
solutions. With a deep understanding of both front-end and back-end technologies, he has successfully
built and deployed numerous high-quality apps and websites.
</p>
<p>
His expertise in creating user-friendly interfaces and robust back-end systems ensures that every
project he works on is both functional and efficient. Passionate about staying updated with the latest
industry trends, he continually enhances his skills to deliver innovative and reliable solutions.
</p>
</div>
</div>
</section>
</div>
<!--
- clients
-->
<!-- <section class="clients">
<h3 class="h3 clients-title">Clients</h3>
<ul class="clients-list has-scrollbar">
<li class="clients-item">
<a href="#">
<img src="./assets/images/logo-1-color.png" alt="client logo">
</a>
</li>
</ul>
</section> -->
</article>
<!--
- #RESUME
-->
<article class="resume" data-page="resume">
<header>
<h2 class="h2 article-title">Resume</h2>
</header>
<section class="timeline">
<div class="title-wrapper">
<div class="icon-box">
<ion-icon name="book-outline"></ion-icon>
</div>
<h3 class="h3">Education</h3>
</div>
<ol class="timeline-list">
<li class="timeline-item">
<h4 class="h4 timeline-item-title">Posts and Telecommunications Institute of Technology</h4>
<span>2014 — 2018</span>
<p class="timeline-text">
During my time at the academy, I developed a strong foundation in telecommunications and information
technology. I was actively involved in various projects and research activities, gaining hands-on
experience in software development and network engineering. I also participated in several competitions
and workshops, enhancing my problem-solving skills and technical knowledge.
</p>
</li>
<li class="timeline-item">
<h4 class="h4 timeline-item-title">External Coding Courses</h4>
<span>2013 — 2015</span>
<p class="timeline-text">
During this period, I enrolled in several coding courses at various training centers. These courses
covered a range of topics including web development, data structures, algorithms, and mobile app
development. The hands-on experience and practical knowledge gained from these courses significantly
complemented my academic studies and fueled my passion for programming.
</p>
</li>
<li class="timeline-item">
<h4 class="h4 timeline-item-title">Luong The Vinh High School for Gifted Students in Mathematics and
Informatics</h4>
<span>2011 — 2013</span>
<p class="timeline-text">
In this specialized program, I focused on advanced mathematics and computer science. This rigorous
curriculum helped me develop critical thinking and analytical skills. I was a member of the school's
math club and competed in several national math and coding competitions, where I consistently achieved
top rankings. This period laid the groundwork for my passion for technology and software development.
</p>
</li>
</ol>
</section>
<section class="timeline">
<div class="title-wrapper">
<div class="icon-box">
<ion-icon name="book-outline"></ion-icon>
</div>
<h3 class="h3">Experience</h3>
</div>
<ol class="timeline-list">
<li class="timeline-item">
<h4 class="h4 timeline-item-title">Senior Mobile Application Software Development Engineer at Samsung</h4>
<span>2022 — Present</span>
<p class="timeline-text">
In my current role at Samsung, I am a software development engineer specializing in mobile applications
for the Android platform. My primary focus is on designing and developing security solutions for
Samsung's mobile devices. I collaborate closely with cross-functional teams to ensure the security
features are robust, user-friendly, and aligned with the latest industry standards. My responsibilities
include coding, testing, and implementing innovative security measures to protect user data and enhance
the overall security of Samsung's mobile ecosystem.
</p>
</li>
<li class="timeline-item">
<h4 class="h4 timeline-item-title">Team Leader and Founder of Dezone99</h4>
<span>2021 — Present</span>
<p class="timeline-text">
Since 2021, I have founded and led Dezone99, an external development team specializing in full-stack
software development for desktop, mobile, and web applications. In this role, I oversee the development
process, ensuring that projects meet high standards of quality and functionality. My team excels in UI
design, creating intuitive and visually appealing interfaces for our software solutions. As the team
leader, I am responsible for project management, client communication, and driving the overall success
of our development initiatives.
</p>
</li>
<li class="timeline-item">
<h4 class="h4 timeline-item-title">User Interface Software Engineer at Samsung</h4>
<span>2020 — 2022</span>
<p class="timeline-text">
From 2020 to 2022, I worked on developing software and solutions related to user interfaces for mobile
devices at Samsung. My projects included enhancing the user experience for features such as the
keyboard, DeX mode, and S Pen functionality. I focused on creating intuitive and responsive interfaces,
ensuring seamless interaction between the user and the device. My role involved close collaboration with
design and development teams to implement user-centric features that meet high standards of usability
and performance.
</p>
</li>
<li class="timeline-item">
<h4 class="h4 timeline-item-title">Software Project Manager at Samsung</h4>
<span>2018 — 2020</span>
<p class="timeline-text">
From 2018 to 2020, I was involved in managing software projects at Samsung. My responsibilities included
building binaries for mobile devices, ensuring that devices were set up correctly according to the
requirements of customers in different regions globally. I also reviewed commits and collaborated with
various teams to maintain the quality and consistency of the software. My role required meticulous
attention to detail and a strong understanding of project management principles to ensure timely and
accurate delivery of software solutions.
</p>
</li>
</ol>
</section>
<section class="skill">
<h3 class="h3 skills-title">My skills</h3>
<ul class="skills-list content-card">
<li class="skills-item">
<div class="title-wrapper">
<h5 class="h5">Desktop apps development</h5>
<data value="80">90%</data>
</div>
<div class="skill-progress-bg">
<div class="skill-progress-fill" style="width: 90%;"></div>
</div>
</li>
<li class="skills-item">
<div class="title-wrapper">
<h5 class="h5">Android apps development</h5>
<data value="70">90%</data>
</div>
<div class="skill-progress-bg">
<div class="skill-progress-fill" style="width: 90%;"></div>
</div>
</li>
<li class="skills-item">
<div class="title-wrapper">
<h5 class="h5">Mobile apps development</h5>
<data value="90">70%</data>
</div>
<div class="skill-progress-bg">
<div class="skill-progress-fill" style="width: 70%;"></div>
</div>
</li>
<li class="skills-item">
<div class="title-wrapper">
<h5 class="h5">Web development</h5>
<data value="50">50%</data>
</div>
<div class="skill-progress-bg">
<div class="skill-progress-fill" style="width: 50%;"></div>
</div>
</li>
<li class="skills-item">
<div class="title-wrapper">
<h5 class="h5">Game development</h5>
<data value="50">60%</data>
</div>
<div class="skill-progress-bg">
<div class="skill-progress-fill" style="width: 60%;"></div>
</div>
</li>
<li class="skills-item">
<div class="title-wrapper">
<h5 class="h5">Project Management</h5>
<data value="50">90%</data>
</div>
<div class="skill-progress-bg">
<div class="skill-progress-fill" style="width: 90%;"></div>
</div>
</li>
<li class="skills-item">
<div class="title-wrapper">
<h5 class="h5">Application Design</h5>
<data value="50">60%</data>
</div>
<div class="skill-progress-bg">
<div class="skill-progress-fill" style="width: 60%;"></div>
</div>
</li>
<li class="skills-item">
<div class="title-wrapper">
<h5 class="h5">Branding</h5>
<data value="50">40%</data>
</div>
<div class="skill-progress-bg">
<div class="skill-progress-fill" style="width: 40%;"></div>
</div>
</li>
</ul>
</section>
</article>
<!--
- #PORTFOLIO
-->
<article class="portfolio" data-page="portfolio" data-src="portfolio_dashboard.html?iframeId=portfolioDashboard">
<header>
<h2 class="h2 article-title">Portfolio</h2>
</header>
<section class="projects">
<iframe class="blog-frame-container" id="portfolioDashboard" allowTransparency="true" scrolling="no"
loading="lazy" frameborder="0" allowfullscreen="true"></iframe>
<!-- <ul class="project-list">
<li class="project-item active" data-filter-item data-category="web development">
<a href="#">
<figure class="project-img">
<div class="project-item-icon-box">
<ion-icon name="eye-outline"></ion-icon>
</div>
<img src="./assets/images/project-1.jpg" alt="finance" loading="lazy">
</figure>
<h3 class="project-title">Finance</h3>
<p class="project-category">Web development</p>
</a>
</li>
<li class="project-item active" data-filter-item data-category="web development">
<a href="#">
<figure class="project-img">
<div class="project-item-icon-box">
<ion-icon name="eye-outline"></ion-icon>
</div>
<img src="./assets/images/project-2.png" alt="orizon" loading="lazy">
</figure>
<h3 class="project-title">Orizon</h3>
<p class="project-category">Web development</p>
</a>
</li>
<li class="project-item active" data-filter-item data-category="web design">
<a href="#">
<figure class="project-img">
<div class="project-item-icon-box">
<ion-icon name="eye-outline"></ion-icon>
</div>
<img src="./assets/images/project-3.jpg" alt="fundo" loading="lazy">
</figure>
<h3 class="project-title">Fundo</h3>
<p class="project-category">Web design</p>
</a>
</li>
<li class="project-item active" data-filter-item data-category="applications">
<a href="#">
<figure class="project-img">
<div class="project-item-icon-box">
<ion-icon name="eye-outline"></ion-icon>
</div>
<img src="./assets/images/project-4.png" alt="brawlhalla" loading="lazy">
</figure>
<h3 class="project-title">Brawlhalla</h3>
<p class="project-category">Applications</p>
</a>
</li>
<li class="project-item active" data-filter-item data-category="web design">
<a href="#">
<figure class="project-img">
<div class="project-item-icon-box">
<ion-icon name="eye-outline"></ion-icon>
</div>
<img src="./assets/images/project-5.png" alt="dsm." loading="lazy">
</figure>
<h3 class="project-title">DSM.</h3>
<p class="project-category">Web design</p>
</a>
</li>
<li class="project-item active" data-filter-item data-category="web design">
<a href="#">
<figure class="project-img">
<div class="project-item-icon-box">
<ion-icon name="eye-outline"></ion-icon>
</div>
<img src="./assets/images/project-6.png" alt="metaspark" loading="lazy">
</figure>
<h3 class="project-title">MetaSpark</h3>
<p class="project-category">Web design</p>
</a>
</li>
<li class="project-item active" data-filter-item data-category="web development">
<a href="#">
<figure class="project-img">
<div class="project-item-icon-box">
<ion-icon name="eye-outline"></ion-icon>
</div>
<img src="./assets/images/project-7.png" alt="summary" loading="lazy">
</figure>
<h3 class="project-title">Summary</h3>
<p class="project-category">Web development</p>
</a>
</li>
<li class="project-item active" data-filter-item data-category="applications">
<a href="#">
<figure class="project-img">
<div class="project-item-icon-box">
<ion-icon name="eye-outline"></ion-icon>
</div>
<img src="./assets/images/project-8.jpg" alt="task manager" loading="lazy">
</figure>
<h3 class="project-title">Task Manager</h3>
<p class="project-category">Applications</p>
</a>
</li>
<li class="project-item active" data-filter-item data-category="web development">
<a href="#">
<figure class="project-img">
<div class="project-item-icon-box">
<ion-icon name="eye-outline"></ion-icon>
</div>
<img src="./assets/images/project-9.png" alt="arrival" loading="lazy">
</figure>
<h3 class="project-title">Arrival</h3>
<p class="project-category">Web development</p>
</a>
</li>
</ul> -->
</section>
</article>
<!--
- #BLOG
-->
<article class="blog" data-page="developers" data-src="developer_page.html?iframeId=developerPageFrame">
<header>
<h2 class="h2 article-title">Developers</h2>
</header>
<section class="blog-posts">
<iframe class="blog-frame-container" id="developerPageFrame" allowTransparency="true" scrolling="no"
frameborder="0" allowfullscreen="true"></iframe>
</section>
</article>
<!--
- #CONTACT
-->
<article class="contact" data-page="contact">
<header>
<h2 class="h2 article-title">Contact</h2>
</header>
<section class="mapbox" data-mapbox>
<figure>
<iframe
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d59582.225634042436!2d105.81218971544796!3d21.037122854436067!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3135a96e2e72c51f%3A0x54689ea60eeeee78!2sLong%20Bi%C3%AAn%2C%20Hanoi%2C%20Vietnam!5e0!3m2!1sen!2sbd!4v1722782819327!5m2!1sen!2sbd"
width="400" height="300" loading="lazy" id="googleMapFrame"></iframe>
</figure>
</section>
<section class="contact-form">
<h3 class="h3 form-title">Contact Form</h3>
<form action="#" class="form" data-form>
<div class="input-wrapper">
<input type="text" name="fullname" class="form-input" placeholder="Full name" required data-form-input>
<input type="email" name="email" class="form-input" placeholder="Email address" required data-form-input>
</div>
<textarea name="message" class="form-input" placeholder="Your Message" required data-form-input></textarea>
<button class="form-btn" type="submit" disabled data-form-btn>
<ion-icon name="paper-plane"></ion-icon>
<span>Send Message</span>
</button>
</form>
</section>
</article>
</div>
</main>
<!--
- custom js link
-->
<script src="./assets/js/contract.js"></script>
<script src="./assets/js/script.js"></script>
<!--
- ionicon link
-->
<script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
<script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>
</body>
</html>
script.js
'use strict';
const TRD_CONSTRACT = window.TRD_CONSTRACT;
window.addEventListener('load', function () {
TRD_CONSTRACT.clearLocalStorage();
});
// element toggle function
const elementToggleFunc = function (elem) { elem.classList.toggle("active"); }
// sidebar variables
const sidebar = document.querySelector("[data-sidebar]");
const sidebarBtn = document.querySelector("[data-sidebar-btn]");
// sidebar toggle functionality for mobile
sidebarBtn.addEventListener("click", function () { elementToggleFunc(sidebar); });
// testimonials variables
const testimonialsItem = document.querySelectorAll("[data-testimonials-item]");
const modalContainer = document.querySelector("[data-modal-container]");
const modalCloseBtn = document.querySelector("[data-modal-close-btn]");
const overlay = document.querySelector("[data-overlay]");
// modal variable
const modalImg = document.querySelector("[data-modal-img]");
const modalTitle = document.querySelector("[data-modal-title]");
const modalText = document.querySelector("[data-modal-text]");
// modal toggle function
const testimonialsModalFunc = function () {
modalContainer.classList.toggle("active");
overlay.classList.toggle("active");
}
// add click event to all modal items
for (let i = 0; i < testimonialsItem.length; i++) {
testimonialsItem[i].addEventListener("click", function () {
modalImg.src = this.querySelector("[data-testimonials-avatar]").src;
modalImg.alt = this.querySelector("[data-testimonials-avatar]").alt;
modalTitle.innerHTML = this.querySelector("[data-testimonials-title]").innerHTML;
modalText.innerHTML = this.querySelector("[data-testimonials-text]").innerHTML;
testimonialsModalFunc();
});
}
// add click event to modal close button
modalCloseBtn.addEventListener("click", testimonialsModalFunc);
overlay.addEventListener("click", testimonialsModalFunc);
//######################################################################
const iframeMap = new Map();
function loadForm(url, container) {
const iframeId = container.id;
const newUrl = url + '?iframeId=' + iframeId + '&shouldNotifyWidth=1';
container.src = newUrl;
}
document.querySelectorAll('iframe').forEach(iframe => {
iframeMap.set(iframe.id, iframe);
});
// form input variables
window.addEventListener('message', function (event) {
const data = event.data;
switch (data.event) {
case TRD_CONSTRACT.EVENT.IFRAME_CONTENT_SIZE_CHANGED:
if (data.frameId) {
const iframe = iframeMap.get(data.frameId);
if (event.data.height) {
iframe.style.height = event.data.height + 'px';
}
if (event.data.width) {
iframe.style.width = event.data.width + 'px';
}
}
break;
case TRD_CONSTRACT.EVENT.SHOW_FORM_INPUT:
const url = data.url;
if (url) {
loadForm(url, formIframe);
formInputModalFunc();
}
break;
case TRD_CONSTRACT.EVENT.HIDE_FORM_INPUT:
const frameId = data.frameId;
if (frameId == formIframe.id) {
formInputContainer.classList.remove("active");
formInputOverlay.classList.remove("active");
}
break;
default:
console.log('Unknown event:', data.event);
}
});
const formInputContainer = document.querySelector("[form-input-container]");
const formInputCloseBtn = document.querySelector("[form-input-close-btn]");
const formInputOverlay = document.querySelector("[form-input-overlay]");
const formInputModalContent = document.querySelector("[form-input-modal-content]");
const formIframe = document.getElementById("formInputFrame");
const formInputModalFunc = function () {
formInputContainer.classList.toggle("active");
formInputOverlay.classList.toggle("active");
}
formInputCloseBtn.addEventListener("click", formInputModalFunc);
formInputOverlay.addEventListener("click", formInputModalFunc);
//#########################SERVICE-DETAIL###############################
// service detail variables
const serviceItem = document.querySelectorAll("[data-service-item]");
const serviceModalContainer = document.querySelector("[data-service-modal-container]");
const serviceModalCloseBtn = document.querySelector("[data-service-modal-close-btn]");
const serviceOverlay = document.querySelector("[data-service-overlay]");
// modal variable
const serviceModalImg = document.querySelector("[data-service-modal-img]");
const serviceModalTitle = document.querySelector("[data-service-modal-title]");
const serviceModalText = document.querySelector("[data-service-modal-text]");
// modal toggle function
const serviceModalFunc = function () {
serviceModalContainer.classList.toggle("active");
serviceOverlay.classList.toggle("active");
}
// add click event to all modal items
for (let i = 0; i < serviceItem.length; i++) {
serviceItem[i].addEventListener("click", function () {
serviceModalImg.src = this.querySelector("[data-service-avatar]").src;
serviceModalImg.alt = this.querySelector("[data-service-avatar]").alt;
serviceModalTitle.innerHTML = this.querySelector("[data-service-title]").innerHTML;
serviceModalText.innerHTML = this.querySelector("[data-service-text]").innerHTML;
serviceModalFunc();
});
}
// add click event to modal close button
serviceModalCloseBtn.addEventListener("click", serviceModalFunc);
serviceOverlay.addEventListener("click", serviceModalFunc);
//######################################################################
// contact form variables
const form = document.querySelector("[data-form]");
const formInputs = document.querySelectorAll("[data-form-input]");
const formBtn = document.querySelector("[data-form-btn]");
// add event to all form input field
for (let i = 0; i < formInputs.length; i++) {
formInputs[i].addEventListener("input", function () {
// check form validation
if (form.checkValidity()) {
formBtn.removeAttribute("disabled");
} else {
formBtn.setAttribute("disabled", "");
}
});
}
// page navigation variables
const navigationLinks = document.querySelectorAll("[data-nav-link]");
const pages = document.querySelectorAll("[data-page]");
// add event to all nav link
for (let i = 0; i < navigationLinks.length; i++) {
navigationLinks[i].addEventListener("click", function () {
for (let i = 0; i < pages.length; i++) {
if (this.innerHTML.toLowerCase() === pages[i].dataset.page) {
pages[i].classList.add("active");
navigationLinks[i].classList.add("active");
window.scrollTo(0, 0);
const iframe = pages[i].querySelector('iframe');
if (iframe) {
iframe.src = pages[i].dataset.src;
} else {
}
} else {
pages[i].classList.remove("active");
navigationLinks[i].classList.remove("active");
}
}
});
}
style.css
/*-----------------------------------*\
#style.css
\*-----------------------------------*/
/**
* copyright 2022 @codewithsadee
*/
/*-----------------------------------*\
#CUSTOM PROPERTY
\*-----------------------------------*/
:root {
/**
* colors
*/
/* gradient */
--bg-gradient-onyx: linear-gradient(to bottom right,
hsl(240, 1%, 25%) 3%,
hsl(0, 0%, 19%) 97%);
--bg-gradient-jet: linear-gradient(to bottom right,
hsla(240, 1%, 18%, 0.251) 0%,
hsla(240, 2%, 11%, 0) 100%), hsl(240, 2%, 13%);
--bg-gradient-yellow-1: linear-gradient(to bottom right,
hsl(45, 100%, 71%) 0%,
hsla(36, 100%, 69%, 0) 50%);
--bg-gradient-yellow-2: linear-gradient(135deg,
hsla(45, 100%, 71%, 0.251) 0%,
hsla(35, 100%, 68%, 0) 59.86%), hsl(240, 2%, 13%);
--border-gradient-onyx: linear-gradient(to bottom right,
hsl(0, 0%, 25%) 0%,
hsla(0, 0%, 25%, 0) 50%);
--text-gradient-yellow: linear-gradient(to right,
hsl(45, 100%, 72%),
hsl(35, 100%, 68%));
/* solid */
--jet: hsl(0, 0%, 22%);
--onyx: hsl(240, 1%, 17%);
--eerie-black-1: hsl(240, 2%, 13%);
--eerie-black-2: hsl(240, 2%, 12%);
--smoky-black: hsl(0, 0%, 7%);
--white-1: hsl(0, 0%, 100%);
--white-2: hsl(0, 0%, 98%);
--orange-yellow-crayola: hsl(45, 100%, 72%);
--vegas-gold: hsl(45, 54%, 58%);
--light-gray: hsl(0, 0%, 84%);
--light-gray-70: hsla(0, 0%, 84%, 0.7);
--bittersweet-shimmer: hsl(0, 43%, 51%);
/**
* typography
*/
/* font-family */
--ff-poppins: 'Poppins', sans-serif;
/* font-size */
--fs-1: 24px;
--fs-2: 18px;
--fs-3: 17px;
--fs-4: 16px;
--fs-5: 15px;
--fs-6: 14px;
--fs-7: 13px;
--fs-8: 11px;
/* font-weight */
--fw-300: 300;
--fw-400: 400;
--fw-500: 500;
--fw-600: 600;
/**
* shadow
*/
--shadow-1: -4px 8px 24px hsla(0, 0%, 0%, 0.25);
--shadow-2: 0 16px 30px hsla(0, 0%, 0%, 0.25);
--shadow-3: 0 16px 40px hsla(0, 0%, 0%, 0.25);
--shadow-4: 0 25px 50px hsla(0, 0%, 0%, 0.15);
--shadow-5: 0 24px 80px hsla(0, 0%, 0%, 0.25);
/**
* transition
*/
--transition-1: 0.25s ease;
--transition-2: 0.5s ease-in-out;
}
/*-----------------------------------*\
#RESET
\*-----------------------------------*/
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
a {
text-decoration: none;
}
li {
list-style: none;
}
img,
ion-icon,
a,
button,
time,
span {
display: block;
}
button {
font: inherit;
background: none;
border: none;
text-align: left;
cursor: pointer;
}
input,
textarea {
display: block;
width: 100%;
background: none;
font: inherit;
}
::selection {
background: var(--orange-yellow-crayola);
color: var(--smoky-black);
}
:focus {
outline-color: var(--orange-yellow-crayola);
}
html {
font-family: var(--ff-poppins);
}
body {
background: var(--smoky-black);
}
/*-----------------------------------*\
#REUSED STYLE
\*-----------------------------------*/
.sidebar,
article {
background: var(--eerie-black-2);
border: 1px solid var(--jet);
border-radius: 20px;
padding: 15px;
box-shadow: var(--shadow-1);
z-index: 1;
}
.separator {
width: 100%;
height: 1px;
background: var(--jet);
margin: 16px 0;
}
.icon-box {
position: relative;
background: var(--border-gradient-onyx);
width: 30px;
height: 30px;
border-radius: 8px;
display: flex;
justify-content: center;
align-items: center;
font-size: 16px;
color: var(--orange-yellow-crayola);
box-shadow: var(--shadow-1);
z-index: 1;
}
.icon-box::before {
content: "";
position: absolute;
inset: 1px;
background: var(--eerie-black-1);
border-radius: inherit;
z-index: -1;
}
.icon-box ion-icon {
--ionicon-stroke-width: 35px;
}
article {
display: none;
}
article.active {
display: block;
animation: fade 0.5s ease backwards;
}
@keyframes fade {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.h2,
.h3,
.h4,
.h5 {
color: var(--white-2);
text-transform: capitalize;
}
.h2 {
font-size: var(--fs-1);
}
.h3 {
font-size: var(--fs-2);
}
.h4 {
font-size: var(--fs-4);
}
.h5 {
font-size: var(--fs-7);
font-weight: var(--fw-500);
}
.article-title {
position: relative;
padding-bottom: 7px;
}
.article-title::after {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 30px;
height: 3px;
background: var(--text-gradient-yellow);
border-radius: 3px;
}
.has-scrollbar::-webkit-scrollbar {
width: 5px;
/* for vertical scrollbar */
height: 5px;
/* for horizontal scrollbar */
}
.has-scrollbar::-webkit-scrollbar-track {
background: var(--onyx);
border-radius: 5px;
}
.has-scrollbar::-webkit-scrollbar-thumb {
background: var(--orange-yellow-crayola);
border-radius: 5px;
}
.has-scrollbar::-webkit-scrollbar-button {
width: 20px;
}
.content-card {
position: relative;
background: var(--border-gradient-onyx);
padding: 15px;
padding-top: 45px;
border-radius: 14px;
box-shadow: var(--shadow-2);
cursor: pointer;
z-index: 1;
}
.content-card::before {
content: "";
position: absolute;
inset: 1px;
background: var(--bg-gradient-jet);
border-radius: inherit;
z-index: -1;
}
/*-----------------------------------*\
#MAIN
\*-----------------------------------*/
main {
margin: 15px 12px;
margin-bottom: 75px;
min-width: 259px;
}
/*-----------------------------------*\
#SIDEBAR
\*-----------------------------------*/
.sidebar {
margin-bottom: 15px;
max-height: 112px;
overflow: hidden;
transition: var(--transition-2);
}
.sidebar.active {
max-height: 405px;
}
.sidebar-info {
position: relative;
display: flex;
justify-content: flex-start;
align-items: center;
gap: 15px;
}
/* .avatar-box {
background: var(--bg-gradient-onyx);
border-radius: 50%;
} */
.avatar-box img {
width: 100%;
height: auto;
border-radius: 50%;
border: 5px solid var(--jet);
}
.info-content .name {
color: var(--white-2);
font-size: var(--fs-3);
font-weight: var(--fw-500);
letter-spacing: -0.25px;
margin-bottom: 10px;
}
.info-content .title {
color: var(--white-1);
background: var(--onyx);
font-size: var(--fs-8);
font-weight: var(--fw-300);
width: max-content;
padding: 3px 12px;
border-radius: 8px;
}
.info_more-btn {
position: absolute;
top: -15px;
right: -15px;
border-radius: 0 15px;
font-size: 13px;
color: var(--orange-yellow-crayola);
background: var(--border-gradient-onyx);
padding: 10px;
box-shadow: var(--shadow-2);
transition: var(--transition-1);
z-index: 1;
}
.info_more-btn::before {
content: "";
position: absolute;
inset: 1px;
border-radius: inherit;
background: var(--bg-gradient-jet);
transition: var(--transition-1);
z-index: -1;
}
.info_more-btn:hover,
.info_more-btn:focus {
background: var(--bg-gradient-yellow-1);
}
.info_more-btn:hover::before,
.info_more-btn:focus::before {
background: var(--bg-gradient-yellow-2);
}
.info_more-btn span {
display: none;
}
.sidebar-info_more {
opacity: 0;
visibility: hidden;
transition: var(--transition-2);
}
.sidebar.active .sidebar-info_more {
opacity: 1;
visibility: visible;
}
.contacts-list {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
}
.contact-item {
min-width: 100%;
display: flex;
align-items: center;
gap: 16px;
}
.contact-info {
max-width: calc(100% - 46px);
width: calc(100% - 46px);
}
.contact-title {
color: var(--light-gray-70);
font-size: var(--fs-8);
text-transform: uppercase;
margin-bottom: 2px;
}
.contact-info :is(.contact-link, time, address) {
color: var(--white-2);
font-size: var(--fs-7);
}
.contact-info address {
font-style: normal;
}
.social-list {
display: flex;
justify-content: flex-start;
align-items: center;
gap: 15px;
padding-bottom: 4px;
padding-left: 7px;
}
.social-item .social-link {
color: var(--light-gray-70);
font-size: 18px;
}
.social-item .social-link:hover {
color: var(--light-gray);
}
/*-----------------------------------*\
#NAVBAR
\*-----------------------------------*/
.navbar {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
background: hsla(240, 1%, 17%, 0.75);
backdrop-filter: blur(10px);
border: 1px solid var(--jet);
border-radius: 12px 12px 0 0;
box-shadow: var(--shadow-2);
z-index: 5;
}
.navbar-list {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
padding: 0 10px;
}
.navbar-link {
color: var(--light-gray);
font-size: var(--fs-8);
padding: 20px 7px;
transition: color var(--transition-1);
}
.navbar-link:hover,
.navbar-link:focus {
color: var(--light-gray-70);
}
.navbar-link.active {
color: var(--orange-yellow-crayola);
}
/*-----------------------------------*\
#ABOUT
\*-----------------------------------*/
.about .article-title {
margin-bottom: 15px;
}
.about-text {
color: var(--light-gray);
font-size: var(--fs-6);
font-weight: var(--fw-300);
line-height: 1.6;
}
.about-text p {
margin-bottom: 15px;
}
/**
* #service
*/
.service {
margin-bottom: 35px;
}
.service-title {
margin-bottom: 20px;
}
.service-list {
display: grid;
grid-template-columns: 1fr;
gap: 20px;
}
.service-item {
position: relative;
background: var(--border-gradient-onyx);
padding: 20px;
border-radius: 14px;
box-shadow: var(--shadow-2);
z-index: 1;
}
.service-item::before {
content: "";
position: absolute;
inset: 1px;
background: var(--bg-gradient-jet);
border-radius: inherit;
z-index: -1;
}
.service-icon-box {
margin-bottom: 10px;
}
.service-icon-box img {
margin: auto;
width: 45px;
}
.service-content-box {
text-align: center;
}
.service-item-title {
margin-bottom: 7px;
}
.service-item-text {
color: var(--light-gray);
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
text-overflow: ellipsis;
font-size: var(--fs-6);
font-weight: var(--fw-3);
line-height: 1.6;
}
/**
* #testimonials
*/
.testimonials {
margin-bottom: 30px;
}
.testimonials-title {
margin-bottom: 20px;
}
.testimonials-list {
display: flex;
justify-content: flex-start;
align-items: flex-start;
gap: 15px;
margin: 0 -15px;
padding: 25px 15px;
padding-bottom: 35px;
overflow-x: auto;
scroll-behavior: smooth;
overscroll-behavior-inline: contain;
scroll-snap-type: inline mandatory;
}
.testimonials-item {
min-width: 100%;
scroll-snap-align: center;
}
.testimonials-avatar-box {
position: absolute;
top: 0;
left: 0;
transform: translate(15px, -25px);
background: var(--bg-gradient-onyx);
border-radius: 30%;
box-shadow: var(--shadow-1);
}
.testimonials-avatar-box img {
width: 100%;
height: auto;
border-radius: 30%;
border: 2px solid var(--jet);
}
.testimonials-item-title {
margin-bottom: 7px;
}
.testimonials-text {
color: var(--light-gray);
font-size: var(--fs-6);
font-weight: var(--fw-300);
line-height: 1.6;
display: -webkit-box;
line-clamp: 4;
-webkit-line-clamp: 4;
-webkit-box-orient: vertical;
overflow: hidden;
}
/**
* #testimonials-modal
*/
.modal-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
overflow-y: auto;
overscroll-behavior: contain;
z-index: 20;
pointer-events: none;
visibility: hidden;
}
.modal-container::-webkit-scrollbar {
display: none;
}
.modal-container.active {
pointer-events: all;
visibility: visible;
}
.overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
background: hsl(0, 0%, 5%);
opacity: 0;
visibility: hidden;
pointer-events: none;
z-index: 1;
transition: var(--transition-1);
}
.overlay.active {
opacity: 0.8;
visibility: visible;
pointer-events: all;
}
.testimonials-modal {
background: var(--eerie-black-2);
position: relative;
padding: 15px;
margin: 15px 12px;
border: 1px solid var(--jet);
border-radius: 14px;
box-shadow: var(--shadow-5);
transform: scale(1.2);
opacity: 0;
transition: var(--transition-1);
z-index: 2;
}
.form-input-modal {
background: var(--smoky-black);
position: relative;
padding: 15px;
border: 1px solid var(--jet);
border-radius: 14px;
box-shadow: var(--shadow-5);
transform: scale(1.2);
opacity: 0;
transition: var(--transition-1);
z-index: 2;
}
.modal-container.active .testimonials-modal {
transform: scale(1);
opacity: 1;
}
.modal-container.active .form-input-modal {
transform: scale(1);
opacity: 1;
}
.modal-close-btn {
position: absolute;
top: 15px;
right: 15px;
background: var(--onyx);
border-radius: 8px;
width: 32px;
height: 32px;
display: flex;
justify-content: center;
align-items: center;
color: var(--white-2);
font-size: 18px;
opacity: 0.7;
}
.modal-close-btn:hover,
.modal-close-btn:focus {
opacity: 1;
}
.modal-close-btn ion-icon {
--ionicon-stroke-width: 50px;
}
/* .modal-avatar-box {
background: var(--bg-gradient-onyx);
width: max-content;
border-radius: 50%;
margin-bottom: 15px;
box-shadow: var(--shadow-2);
} */
.modal-avatar-box img {
width: 100%;
height: auto;
border-radius: 50%;
border: 1px solid var(--jet);
}
.modal-img-wrapper>img {
display: none;
}
.modal-title {
margin-bottom: 4px;
}
.modal-content time {
font-size: var(--fs-6);
color: var(--light-gray-70);
font-weight: var(--fw-300);
margin-bottom: 10px;
}
.modal-content p {
color: var(--light-gray);
font-size: var(--fs-6);
font-weight: var(--fw-300);
line-height: 1.6;
}
/**
* #clients
*/
.clients {
margin-bottom: 15px;
}
.clients-list {
display: flex;
justify-content: flex-start;
align-items: flex-start;
gap: 15px;
margin: 0 -15px;
padding: 25px;
padding-bottom: 25px;
overflow-x: auto;
scroll-behavior: smooth;
overscroll-behavior-inline: contain;
scroll-snap-type: inline mandatory;
scroll-padding-inline: 25px;
}
.clients-item {
min-width: 50%;
scroll-snap-align: start;
}
.clients-item img {
width: 100%;
filter: grayscale(1);
transition: var(--transition-1);
}
.clients-item img:hover {
filter: grayscale(0);
}
/*-----------------------------------*\
#RESUME
\*-----------------------------------*/
.article-title {
margin-bottom: 30px;
}
/**
* education and experience
*/
.timeline {
margin-bottom: 30px;
}
.timeline .title-wrapper {
display: flex;
align-items: center;
gap: 15px;
margin-bottom: 25px;
}
.timeline-list {
font-size: var(--fs-6);
margin-left: 45px;
}
.timeline-item {
position: relative;
}
.timeline-item:not(:last-child) {
margin-bottom: 20px;
}
.timeline-item-title {
font-size: var(--fs-6);
line-height: 1.3;
margin-bottom: 7px;
}
.timeline-list span {
color: var(--vegas-gold);
font-weight: var(--fw-400);
line-height: 1.6;
}
.timeline-item:not(:last-child)::before {
content: "";
position: absolute;
top: -25px;
left: -30px;
width: 1px;
height: calc(100% + 50px);
background: var(--jet);
}
.timeline-item::after {
content: "";
position: absolute;
top: 5px;
left: -33px;
height: 6px;
width: 6px;
background: var(--text-gradient-yellow);
border-radius: 50%;
box-shadow: 0 0 0 4px var(--jet);
}
.timeline-text {
color: var(--light-gray);
font-weight: var(--fw-300);
line-height: 1.6;
}
/**
* skills
*/
.skills-title {
margin-bottom: 20px;
}
.skills-list {
padding: 20px;
}
.skills-item:not(:last-child) {
margin-bottom: 15px;
}
.skill .title-wrapper {
display: flex;
align-items: center;
gap: 5px;
margin-bottom: 8px;
}
.skill .title-wrapper data {
color: var(--light-gray);
font-size: var(--fs-7);
font-weight: var(--fw-300);
}
.skill-progress-bg {
background: var(--jet);
width: 100%;
height: 8px;
border-radius: 10px;
}
.skill-progress-fill {
background: var(--text-gradient-yellow);
height: 100%;
border-radius: inherit;
}
/*-----------------------------------*\
#BLOG
\*-----------------------------------*/
.blog.active {
display: flex;
flex-direction: column;
}
.blog-posts {
margin-bottom: 10px;
flex-grow: 1;
display: block;
}
.blog-frame-container {
width: 100%;
}
.blog-posts-list {
display: grid;
grid-template-columns: 1fr;
gap: 20px;
}
.blog-post-item>a {
position: relative;
background: var(--border-gradient-onyx);
height: 100%;
box-shadow: var(--shadow-4);
border-radius: 16px;
z-index: 1;
}
.blog-post-item>a::before {
content: "";
position: absolute;
inset: 1px;
border-radius: inherit;
background: var(--eerie-black-1);
z-index: -1;
}
.blog-banner-box {
width: 100%;
height: 200px;
border-radius: 12px;
overflow: hidden;
}
.blog-banner-box img {
width: 100%;
height: 100%;
object-fit: cover;
transition: var(--transition-1);
}
.blog-post-item>a:hover .blog-banner-box img {
transform: scale(1.1);
}
.blog-content {
padding: 15px;
}
.blog-meta {
display: flex;
justify-content: flex-start;
align-items: center;
gap: 7px;
margin-bottom: 10px;
}
.blog-meta :is(.blog-category, time) {
color: var(--light-gray-70);
font-size: var(--fs-6);
font-weight: var(--fw-300);
}
.blog-meta .dot {
background: var(--light-gray-70);
width: 4px;
height: 4px;
border-radius: 4px;
}
.blog-item-title {
margin-bottom: 10px;
line-height: 1.3;
transition: var(--transition-1);
}
.blog-post-item>a:hover .blog-item-title {
color: var(--orange-yellow-crayola);
}
.blog-text {
color: var(--light-gray);
font-size: var(--fs-6);
font-weight: var(--fw-300);
line-height: 1.6;
}
/*-----------------------------------*\
#CONTACT
\*-----------------------------------*/
.mapbox {
position: relative;
height: 250px;
width: 100%;
border-radius: 16px;
margin-bottom: 30px;
border: 1px solid var(--jet);
overflow: hidden;
}
.mapbox figure {
height: 100%;
}
.mapbox iframe {
width: 100%;
height: 100%;
border: none;
filter: grayscale(1) invert(1);
}
.contact-form {
margin-bottom: 10px;
}
.form-title {
margin-bottom: 20px;
}
.input-wrapper {
display: grid;
grid-template-columns: 1fr;
gap: 25px;
margin-bottom: 25px;
}
.list-input-wrapper {
display: grid;
grid-template-columns: 1fr;
gap: 25px;
margin-bottom: 25px;
}
.form-input {
color: var(--white-2);
font-size: var(--fs-6);
font-weight: var(--fw-400);
padding: 13px 20px;
border: 1px solid var(--jet);
border-radius: 14px;
outline: none;
}
.form-input::placeholder {
font-weight: var(--fw-500);
}
.form-input:focus {
border-color: var(--orange-yellow-crayola);
}
textarea.form-input {
min-height: 100px;
height: 120px;
max-height: 200px;
resize: vertical;
margin-bottom: 25px;
}
textarea.form-input::-webkit-resizer {
display: none;
}
.form-input:focus:invalid {
border-color: var(--bittersweet-shimmer);
}
.form-btn {
position: relative;
width: 100%;
background: var(--border-gradient-onyx);
color: var(--orange-yellow-crayola);
display: flex;
justify-content: center;
align-items: center;
gap: 10px;
padding: 13px 20px;
border-radius: 14px;
font-size: var(--fs-6);
text-transform: capitalize;
box-shadow: var(--shadow-3);
z-index: 1;
transition: var(--transition-1);
}
.form-btn::before {
content: "";
position: absolute;
inset: 1px;
background: var(--bg-gradient-jet);
border-radius: inherit;
z-index: -1;
transition: var(--transition-1);
}
.form-btn ion-icon {
font-size: 16px;
}
.form-btn:hover {
background: var(--bg-gradient-yellow-1);
}
.form-btn:hover::before {
background: var(--bg-gradient-yellow-2);
}
.form-btn:disabled {
opacity: 0.7;
cursor: not-allowed;
}
.form-btn:disabled:hover {
background: var(--border-gradient-onyx);
}
.form-btn:disabled:hover::before {
background: var(--bg-gradient-jet);
}
/*-----------------------------------*\
#RESPONSIVE
\*-----------------------------------*/
/**
* responsive larger than 450px screen
*/
@media (min-width: 450px) {
/**
* client
*/
.clients-item {
min-width: calc(33.33% - 10px);
}
/**
* BLOG
*/
.blog-banner-box {
height: auto;
}
.avatar-box img {
max-height: 75px;
}
.testimonials-avatar-box img {
max-height: 65px;
}
.modal-avatar-box img {
max-inline-size: fit-content;
}
}
/**
* responsive larger than 580px screen
*/
@media (min-width: 580px) {
/**
* CUSTOM PROPERTY
*/
:root {
/**
* typography
*/
--fs-1: 32px;
--fs-2: 24px;
--fs-3: 26px;
--fs-4: 18px;
--fs-6: 15px;
--fs-7: 15px;
--fs-8: 12px;
}
/**
* #REUSED STYLE
*/
.sidebar,
article {
width: 520px;
margin-inline: auto;
padding: 30px;
}
.article-title {
font-weight: var(--fw-600);
padding-bottom: 15px;
}
.article-title::after {
width: 40px;
height: 5px;
}
.icon-box {
width: 48px;
height: 48px;
border-radius: 12px;
font-size: 18px;
}
/**
* #MAIN
*/
main {
margin-top: 60px;
margin-bottom: 100px;
}
/**
* #SIDEBAR
*/
.sidebar {
max-height: 180px;
margin-bottom: 30px;
}
.sidebar.active {
max-height: 584px;
}
.sidebar-info {
gap: 25px;
}
.avatar-box {
border-radius: 30px;
}
.avatar-box img {
width: 120px;
max-height: max-content;
}
.info-content .name {
margin-bottom: 15px;
}
.info-content .title {
padding: 5px 18px;
}
.info_more-btn {
top: -30px;
right: -30px;
padding: 10px 15px;
}
.info_more-btn span {
display: block;
font-size: var(--fs-8);
}
.info_more-btn ion-icon {
display: none;
}
.separator {
margin: 32px 0;
}
.contacts-list {
gap: 20px;
}
.contact-info {
max-width: calc(100% - 64px);
width: calc(100% - 64px);
}
/**
* #NAVBAR
*/
.navbar {
border-radius: 20px 20px 0 0;
}
.navbar-list {
gap: 20px;
}
.navbar-link {
--fs-8: 14px;
}
/**
* #ABOUT
*/
.about .article-title {
margin-bottom: 20px;
}
.about-text {
margin-bottom: 40px;
}
/* service */
.service-item {
display: flex;
justify-content: flex-start;
align-items: flex-start;
gap: 18px;
padding: 30px;
}
.service-icon-box {
margin-bottom: 0;
margin-top: 5px;
margin-right: 10px;
}
.service-content-box {
text-align: left;
}
/* testimonials */
.testimonials-title {
margin-bottom: 25px;
}
.testimonials-list {
gap: 30px;
margin: 0 -30px;
padding: 30px;
padding-bottom: 35px;
}
.content-card {
padding: 30px;
padding-top: 25px;
}
.testimonials-avatar-box {
transform: translate(30px, -30px);
border-radius: 20px;
}
.testimonials-avatar-box img {
width: 80px;
max-height: fit-content;
}
.testimonials-item-title {
margin-bottom: 10px;
margin-left: 95px;
}
.testimonials-text {
line-clamp: 2;
-webkit-line-clamp: 2;
}
/* testimonials modal */
.modal-container {
padding: 20px;
}
.testimonials-modal {
display: flex;
justify-content: flex-start;
align-items: stretch;
gap: 25px;
padding: 30px;
border-radius: 20px;
}
.modal-img-wrapper {
display: flex;
flex-direction: column;
align-items: center;
}
.modal-avatar-box {
border-radius: 18px;
margin-bottom: 0;
}
.modal-avatar-box img {
width: 65px;
}
.modal-img-wrapper>img {
display: block;
flex-grow: 1;
width: 35px;
}
/* clients */
.clients-list {
gap: 50px;
margin: 0 -30px;
padding: 45px;
scroll-padding-inline: 45px;
}
.clients-item {
min-width: calc(33.33% - 35px);
}
/**
* #RESUME
*/
.timeline-list {
margin-left: 65px;
}
.timeline-item:not(:last-child)::before {
left: -40px;
}
.timeline-item::after {
height: 8px;
width: 8px;
left: -43px;
}
.skills-item:not(:last-child) {
margin-bottom: 25px;
}
/**
* BLOG
*/
.blog-banner-box {
border-radius: 16px;
}
.blog-posts-list {
gap: 30px;
}
.blog-content {
padding: 25px;
}
/**
* #CONTACT
*/
.mapbox {
height: 380px;
border-radius: 18px;
}
.input-wrapper {
gap: 30px;
margin-bottom: 30px;
}
.form-input {
padding: 15px 20px;
}
textarea.form-input {
margin-bottom: 30px;
}
.form-btn {
--fs-6: 16px;
padding: 16px 20px;
}
.form-btn ion-icon {
font-size: 18px;
}
}
/**
* responsive larger than 768px screen
*/
@media (min-width: 768px) {
/**
* REUSED STYLE
*/
.sidebar,
article {
width: 700px;
}
.has-scrollbar::-webkit-scrollbar-button {
width: 100px;
}
/**
* SIDEBAR
*/
.contacts-list {
grid-template-columns: 1fr 1fr;
gap: 30px 15px;
}
/**
* NAVBAR
*/
.navbar-link {
--fs-8: 15px;
}
/**
* ABOUT
*/
/* testimonials modal */
.testimonials-modal {
gap: 35px;
max-width: 680px;
}
.modal-avatar-box img {
width: 80px;
}
/**
* Blog
*/
.blog-posts-list {
grid-template-columns: 1fr 1fr;
}
/**
* CONTACT
*/
.input-wrapper {
grid-template-columns: 1fr 1fr;
}
.form-btn {
width: max-content;
margin-left: auto;
}
.list-form-btn {
width: auto;
margin: auto;
}
}
/**
* responsive larger than 1024px screen
*/
@media (min-width: 1024px) {
/**
* CUSTOM PROPERTY
*/
:root {
/**
* shadow
*/
--shadow-1: -4px 8px 24px hsla(0, 0%, 0%, 0.125);
--shadow-2: 0 16px 30px hsla(0, 0%, 0%, 0.125);
--shadow-3: 0 16px 40px hsla(0, 0%, 0%, 0.125);
}
/**
* REUSED STYLE
*/
.sidebar,
article {
width: 950px;
box-shadow: var(--shadow-5);
}
/**
* MAIN
*/
main {
margin-bottom: 60px;
}
.main-content {
position: relative;
width: max-content;
margin: auto;
}
/**
* NAVBAR
*/
.navbar {
position: absolute;
bottom: auto;
top: 0;
left: auto;
right: 0;
width: max-content;
border-radius: 0 20px;
padding: 0 20px;
box-shadow: none;
}
.navbar-list {
gap: 30px;
padding: 0 20px;
}
.navbar-link {
font-weight: var(--fw-500);
}
/**
* ABOUT
*/
/* service */
.service-list {
grid-template-columns: 1fr 1fr;
gap: 20px 25px;
}
/* testimonials */
.testimonials-item {
min-width: calc(50% - 15px);
}
/* clients */
.clients-item {
min-width: calc(25% - 38px);
}
/**
* BLOG
*/
.blog-banner-box {
height: 230px;
}
}
/**
* responsive larger than 1250px screen
*/
@media (min-width: 1250px) {
/**
* RESET
*/
body::-webkit-scrollbar {
width: 20px;
}
body::-webkit-scrollbar-track {
background: var(--smoky-black);
}
body::-webkit-scrollbar-thumb {
border: 5px solid var(--smoky-black);
background: hsla(0, 0%, 100%, 0.1);
border-radius: 20px;
box-shadow: inset 1px 1px 0 hsla(0, 0%, 100%, 0.11),
inset -1px -1px 0 hsla(0, 0%, 100%, 0.11);
}
body::-webkit-scrollbar-thumb:hover {
background: hsla(0, 0%, 100%, 0.15);
}
body::-webkit-scrollbar-button {
height: 60px;
}
/**
* REUSED STYLE
*/
.sidebar,
article {
width: auto;
}
article {
min-height: 100%;
}
/**
* MAIN
*/
main {
max-width: 1200px;
margin-inline: auto;
display: flex;
justify-content: center;
align-items: stretch;
gap: 25px;
}
.main-content {
min-width: 75%;
width: 75%;
margin: 0;
}
/**
* SIDEBAR
*/
.sidebar {
position: sticky;
top: 60px;
max-height: max-content;
height: 100%;
margin-bottom: 0;
padding-top: 60px;
z-index: 1;
}
.sidebar-info {
flex-direction: column;
}
.avatar-box img {
width: 150px;
}
.info-content .name {
white-space: nowrap;
text-align: center;
}
.info-content .title {
margin: auto;
}
.info_more-btn {
display: none;
}
.sidebar-info_more {
opacity: 1;
visibility: visible;
}
.contacts-list {
grid-template-columns: 1fr;
}
.contact-info :is(.contact-link) {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.contact-info :is(.contact-link, time, address) {
--fs-7: 14px;
font-weight: var(--fw-300);
}
.separator:last-of-type {
margin: 15px 0;
opacity: 0;
}
.social-list {
justify-content: center;
}
/**
* RESUME
*/
.timeline-text {
max-width: 700px;
}
}
portofilo_ab.css
:root {
/**
* colors
*/
/* gradient */
--bg-gradient-onyx: linear-gradient(to bottom right,
hsl(240, 1%, 25%) 3%,
hsl(0, 0%, 19%) 97%);
--bg-gradient-jet: linear-gradient(to bottom right,
hsla(240, 1%, 18%, 0.251) 0%,
hsla(240, 2%, 11%, 0) 100%), hsl(240, 2%, 13%);
--bg-gradient-yellow-1: linear-gradient(to bottom right,
hsl(45, 100%, 71%) 0%,
hsla(36, 100%, 69%, 0) 50%);
--bg-gradient-yellow-2: linear-gradient(135deg,
hsla(45, 100%, 71%, 0.251) 0%,
hsla(35, 100%, 68%, 0) 59.86%), hsl(240, 2%, 13%);
--border-gradient-onyx: linear-gradient(to bottom right,
hsl(0, 0%, 25%) 0%,
hsla(0, 0%, 25%, 0) 50%);
--text-gradient-yellow: linear-gradient(to right,
hsl(45, 100%, 72%),
hsl(35, 100%, 68%));
/* solid */
--jet: hsl(0, 0%, 22%);
--onyx: hsl(240, 1%, 17%);
--eerie-black-1: hsl(240, 2%, 13%);
--eerie-black-2: hsl(240, 2%, 12%);
--smoky-black: hsl(0, 0%, 7%);
--white-1: hsl(0, 0%, 100%);
--white-2: hsl(0, 0%, 98%);
--orange-yellow-crayola: hsl(45, 100%, 72%);
--vegas-gold: hsl(45, 54%, 58%);
--light-gray: hsl(0, 0%, 84%);
--light-gray-70: hsla(0, 0%, 84%, 0.7);
--bittersweet-shimmer: hsl(0, 43%, 51%);
/**
* typography
*/
/* font-family */
--ff-poppins: 'Poppins', sans-serif;
/* font-size */
--fs-1: 24px;
--fs-2: 18px;
--fs-3: 17px;
--fs-4: 16px;
--fs-5: 15px;
--fs-6: 14px;
--fs-7: 13px;
--fs-8: 11px;
/* font-weight */
--fw-300: 300;
--fw-400: 400;
--fw-500: 500;
--fw-600: 600;
/**
* shadow
*/
--shadow-1: -4px 8px 24px hsla(0, 0%, 0%, 0.25);
--shadow-2: 0 16px 30px hsla(0, 0%, 0%, 0.25);
--shadow-3: 0 16px 40px hsla(0, 0%, 0%, 0.25);
--shadow-4: 0 25px 50px hsla(0, 0%, 0%, 0.15);
--shadow-5: 0 24px 80px hsla(0, 0%, 0%, 0.25);
/**
* transition
*/
--transition-1: 0.25s ease;
--transition-2: 0.5s ease-in-out;
}
.description-container {
min-width: 400px;
}
.portfolio-container {
background: var(--eerie-black-2);
}
.portfolio-container h1 {
font-size: var(--fs-3);
}
.portfolio-container h2 {
font-size: var(--fs-4);
}
.portfolio-container h3 {
font-size: var(--fs-5);
}
.portfolio-container p {
font-size: var(--fs-5);
}
.item-title {
padding-bottom: 5px;
margin-bottom: 30px;
position: relative;
}
.item-title::after {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 1px;
background: var(--text-gradient-yellow);
border-radius: 3px;
}
.hor-screen-container p,
.hor-screen-container h3 {
text-align: center;
}
.screen-img {
max-height: 600px;
border-radius: 20px;
border: 5px solid var(--jet);
box-sizing: border-box;
}
.overview table {
width: 100%;
border-collapse: collapse;
}
.overview th,
.overview td {
padding: 10px;
text-align: left;
border-bottom: 1px solid var(--text-gradient-yellow);
font-size: var(--fs-5);
}
.overview th {
width: 15%;
}
.overview-container {}
.ver-screen-container {
display: flex;
gap: 15px;
align-items: center
}
.hor-screen-container {
display: flex;
gap: 15px;
padding: 20px;
align-items: center;
flex-direction: column;
max-width: 400px;
}
.content-item-container {
margin-top: 40px;
}
@media (min-width: 400px) {
.adaptable-container {
display: flex;
flex-direction: column;
}
.adaptable-title {
display: none;
}
}
@media (min-width: 580px) {
.screen-img {
max-height: 550px;
border-radius: 20px;
border: 4px solid var(--jet);
}
.description-container {
min-width: 200px;
}
}
@media (min-width: 768px) {
.adaptable-title {
display: block;
}
.description-container {
min-width: 400px;
}
.adaptable-container {
display: flex;
flex-direction: row;
}
}
@media (min-width: 1250px) {
.screen-img {
max-height: 550px;
border-radius: 20px;
border: 5px solid var(--jet);
}
}
portfolio.css
/*-----------------------------------*\
#PORTFOLIO
\*-----------------------------------*/
.portfolio-overview-area {
display: none;
}
.portfolio-overview-area.active {
display: block;
animation: scaleUp 0.25s ease forwards;
}
.filter-list {
display: none;
}
.filter-select-box {
position: relative;
margin-bottom: 25px;
}
.filter-select {
background: var(--eerie-black-2);
color: var(--light-gray);
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
padding: 12px 16px;
border: 1px solid var(--jet);
border-radius: 14px;
font-size: var(--fs-6);
font-weight: var(--fw-300);
}
.filter-select.active .select-icon {
transform: rotate(0.5turn);
}
.select-list {
background: var(--eerie-black-2);
position: absolute;
top: calc(100% + 6px);
width: 100%;
padding: 6px;
border: 1px solid var(--jet);
border-radius: 14px;
z-index: 2;
opacity: 0;
visibility: hidden;
pointer-events: none;
transition: 0.15s ease-in-out;
}
.filter-select.active+.select-list {
opacity: 1;
visibility: visible;
pointer-events: all;
}
.select-item button {
background: var(--eerie-black-2);
color: var(--light-gray);
font-size: var(--fs-6);
font-weight: var(--fw-300);
text-transform: capitalize;
width: 100%;
padding: 8px 10px;
border-radius: 8px;
}
.select-item button:hover {
--eerie-black-2: hsl(240, 2%, 20%);
}
.project-list {
display: grid;
grid-template-columns: 1fr;
gap: 80px;
margin-bottom: 10px;
}
.project-item {
display: none;
}
.project-item.active {
display: block;
animation: scaleUp 0.25s ease forwards;
}
@keyframes scaleUp {
0% {
transform: scale(0.5);
}
100% {
transform: scale(1);
}
}
.project-item {
width: 100%;
}
.project-img {
position: relative;
width: 100%;
height: 200px;
border-radius: 16px;
overflow: hidden;
margin-bottom: 15px;
}
.project-img::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: transparent;
z-index: 1;
transition: var(--transition-1);
}
.project-item:hover {
cursor: pointer;
}
.project-item:hover .project-img::before {
background: hsla(0, 0%, 0%, 0.5);
}
.project-item-icon-box {
--scale: 0.8;
background: var(--jet);
color: var(--orange-yellow-crayola);
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(var(--scale));
font-size: 20px;
padding: 18px;
border-radius: 12px;
opacity: 0;
z-index: 1;
transition: var(--transition-1);
}
.project-item:hover .project-item-icon-box {
--scale: 1;
opacity: 1;
}
.project-item-icon-box ion-icon {
--ionicon-stroke-width: 50px;
}
.project-img img {
width: 100%;
height: 100%;
object-fit: cover;
transition: var(--transition-1);
}
.project-item:hover img {
transform: scale(1.1);
}
.project-title,
.project-category {
margin-left: 10px;
}
.project-title {
color: var(--white-2);
font-size: var(--fs-5);
font-weight: var(--fw-400);
text-transform: capitalize;
line-height: 1.3;
}
.project-category {
color: var(--light-gray-70);
font-size: var(--fs-6);
font-weight: var(--fw-300);
}
.portfolio-page-detai {
display: none;
}
.portfolio-page-detai.active {
display: block;
animation: scaleUp 0.25s ease forwards;
}
.icon-btn {
background: var(--onyx);
border-radius: 8px;
width: 32px;
height: 32px;
display: flex;
justify-content: center;
align-items: center;
color: var(--white-2);
font-size: 18px;
opacity: 0.7;
}
.icon-btn:hover {
opacity: 1;
}
.icon-btn ion-icon {
--ionicon-stroke-width: 50px;
}
.underline-for-text {
content: "";
width: 100%;
height: 3px;
background: var(--text-gradient-yellow);
border-radius: 3px;
}
@media (min-width: 450px) {
/**
* #PORTFOLIO
*/
.project-img {
height: auto;
}
}
@media (min-width: 580px) {
/**
* #PORTFOLIO
*/
.project-img {
border-radius: 16px;
}
}
@media (min-width: 768px) {
/**
* PORTFOLIO
*/
.article-title {
padding-bottom: 20px;
}
.filter-select-box {
display: none;
}
.filter-list {
display: flex;
justify-content: flex-start;
align-items: center;
gap: 25px;
padding-left: 5px;
margin-bottom: 30px;
}
.filter-item button {
color: var(--light-gray);
font-size: var(--fs-5);
transition: var(--transition-1);
}
.filter-item button:hover {
color: var(--light-gray-70);
}
.filter-item button.active {
color: var(--orange-yellow-crayola);
}
/* portfolio grid */
.project-list {
grid-template-columns: 1fr 1fr;
gap: 30px;
}
}
@media (min-width: 1024px) {
/**
* PORTFOLIO
*/
.project-list {
grid-template-columns: repeat(3, 1fr);
}
}
base.css
.flex-horizontal-layout {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
gap: 10px;
}
.flex-horizontal-item {
flex: 1;
}
launch.json
{
"version": "0.2.0",
"configurations": [
// {
// "name": "Launch Live Server",
// "type": "node",
// "request": "launch",
// "preLaunchTask": "Run Live Server",
// "program": "${workspaceFolder}/${relativeFile}",
// "cwd": "${workspaceFolder}",
// "runtimeExecutable": "live-server"
// }
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"url": "http://localhost:5500/${fileBasename}", // Ctrl + F5 in browser to refresh css Cache
"webRoot": "${workspaceFolder}"
},
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome current file",
"url": "file://${file}",
"webRoot": "${workspaceFolder}"
}
]
}
settings.json
{
// Mainly for static files
"liveServer.settings.useWebExt": true,
// This means that you change your real URL (current PHP url)
// to another URL (which Live Sever starts).
"liveServer.settings.proxy": {
"enable": true, // i. enabled
"baseUri": "/", // ii. workspace
"proxyUri": "http://localhost:8089/TrdHuy.github.io" // iii. actual address,
},
"liveServer.settings.watchFiles": [
"**/*.html",
"**/*.css",
"**/*.js"
]
}
portfolio_dashboard.html