From f162d45f8ed523e4b93f13724b69e45f6f6be4c7 Mon Sep 17 00:00:00 2001 From: Quang Mau Date: Fri, 20 Feb 2026 03:36:03 +0700 Subject: [PATCH] vntechies v3 --- components/ArticleList.js | 26 +- components/ArticleThumbnail.js | 7 +- components/BottomNav.js | 56 +- components/Card.js | 90 +- components/CourseRegistrationForm.js | 44 +- components/Footer.js | 227 ++-- components/Header.js | 82 +- components/HorizontalCard.js | 18 +- components/Image.js | 6 +- components/LayoutWrapper.js | 10 +- components/PageTitle.js | 6 +- components/Pagination.js | 42 +- components/SectionContainer.js | 8 +- components/SummaryButton.js | 94 +- components/Tag.js | 9 +- components/ThemeSwitch.js | 6 +- components/home/AWSCert.js | 2 +- components/home/DataCourse.js | 106 ++ components/home/FreeCourses.js | 2 +- components/home/Hero.js | 75 +- css/tailwind.css | 140 +++ data/authors/default.md | 4 +- data/authors/hanguyen.md | 10 +- data/authors/hungran.md | 2 +- data/authors/monmen.md | 5 +- data/authors/phuongnm.md | 4 +- data/blog/aws/architecting-s3-efficiently.mdx | 94 +- .../data-engineer-bootcamp/gioi-thieu.mdx | 4 +- data/courses/devops/gioi-thieu.mdx | 4 +- data/siteMetadata.js | 2 +- layouts/CourseData.js | 6 +- layouts/CourseDevOps.js | 2 +- layouts/CourseSimple.js | 272 ++--- layouts/DocumentLayout.js | 17 +- layouts/ListLayout.js | 54 +- layouts/PostLayout.js | 244 +++-- layouts/PostSimple.js | 112 +- pages/404.js | 43 +- pages/_app.js | 1 - pages/about.js | 270 ++++- pages/aws-certification-paths.js | 2 +- pages/blog/[...slug].js | 2 +- pages/career.js | 125 ++- pages/courses.js | 50 +- pages/courses/register.js | 536 ++++++---- pages/index.js | 968 +++++++++++++++++- pages/series.js | 28 +- pages/tags.js | 43 +- public/static/images/authors/hanguyen.jpeg | Bin 0 -> 84184 bytes public/static/images/authors/hanguyen.jpg | Bin 98062 -> 0 bytes public/static/images/courses/vdt.png | Bin 0 -> 41627 bytes tailwind.config.js | 1 + 52 files changed, 2753 insertions(+), 1208 deletions(-) create mode 100644 components/home/DataCourse.js create mode 100644 public/static/images/authors/hanguyen.jpeg delete mode 100644 public/static/images/authors/hanguyen.jpg create mode 100644 public/static/images/courses/vdt.png diff --git a/components/ArticleList.js b/components/ArticleList.js index e586b7ec..8291552e 100644 --- a/components/ArticleList.js +++ b/components/ArticleList.js @@ -2,37 +2,39 @@ import Link from '@/components/Link' import ArticleThumbnail from './ArticleThumbnail' const ArticleList = ({ slug, title, summary, tags, image }) => { + const visibleTags = (tags || []).slice(0, 3) + return (
- -
-
+ +
+
-
+
-
+
- {tags.slice(0, 3).map((tag) => ( + {visibleTags.map((tag) => ( {tag} ))}
-

+

{title}

-

+

{summary}

-
- Đọc thêm +
+ Đọc thêm {
-
+
) diff --git a/components/ArticleThumbnail.js b/components/ArticleThumbnail.js index 8d0d9e64..dd54c19a 100644 --- a/components/ArticleThumbnail.js +++ b/components/ArticleThumbnail.js @@ -1,12 +1,13 @@ -import Link from '@/components/Link' import Image from 'next/image' -const ArticleThumbnail = ({ slug, title, image }) => { +const ArticleThumbnail = ({ title, image }) => { + const thumbnail = image || '/static/images/default-ogp.png' + return ( {title} { const route = `/${router.pathname.split('/')[1]}` return ( -
-