diff --git a/app/components/home/AgendaSection.tsx b/app/components/home/AgendaSection.tsx
index bd1a5a2..8830232 100644
--- a/app/components/home/AgendaSection.tsx
+++ b/app/components/home/AgendaSection.tsx
@@ -5,6 +5,7 @@ type AgendaItem = {
time: string;
title: string;
description: string;
+ avatar?: string;
};
type Props = {
@@ -53,6 +54,25 @@ const renderFormattedText = (text: string) => {
};
export default function AgendaSection({ data }: Props) {
+ const base = process.env.NEXT_PUBLIC_BASE_PATH || "";
+
+ const renderAvatar = (avatarUrl: string, sizeClass: string) => (
+
+ {avatarUrl.includes("placeholder") ? (
+
+ ) : (
+ // eslint-disable-next-line @next/next/no-img-element
+

+ )}
+
+ );
+
return (
{/* Section Header */}
@@ -108,12 +128,24 @@ export default function AgendaSection({ data }: Props) {
{item.time}
-
+
{renderFormattedText(item.title)}
+ {!item.description && item.avatar && (
+
+ {renderAvatar(item.avatar, "w-10 h-10 lg:w-12 lg:h-12")}
+
+ )}
{item.description && (
-
- {renderFormattedText(item.description)}
+
+ {item.avatar && (
+
+ {renderAvatar(item.avatar, "w-10 h-10 lg:w-12 lg:h-12")}
+
+ )}
+
+ {renderFormattedText(item.description)}
+
)}
@@ -147,12 +179,24 @@ export default function AgendaSection({ data }: Props) {
{item.time}
-
+
{renderFormattedText(item.title)}
+ {!item.description && item.avatar && (
+
+ {renderAvatar(item.avatar, "w-10 h-10 lg:w-12 lg:h-12")}
+
+ )}
{item.description && (
-
- {renderFormattedText(item.description)}
+
+ {item.avatar && (
+
+ {renderAvatar(item.avatar, "w-10 h-10 lg:w-12 lg:h-12")}
+
+ )}
+
+ {renderFormattedText(item.description)}
+
)}
diff --git a/app/components/home/PartnersCarousel.tsx b/app/components/home/PartnersCarousel.tsx
index df7e87d..ba427c2 100644
--- a/app/components/home/PartnersCarousel.tsx
+++ b/app/components/home/PartnersCarousel.tsx
@@ -2,6 +2,7 @@
// Tên file chính xác trong public/assets/img/carousel/
const ROW_1 = [
+ { name: "IEAS", file: "ieas.png" },
{ name: "NVIDIA", file: "Nvidia_logo.svg.png" },
{ name: "Maxis", file: "Maxis-logo.png" },
{ name: "Singtel", file: "Singtel_logo.svg.png" },
diff --git a/app/data/home.json b/app/data/home.json
index 5d567d3..ca182ce 100644
--- a/app/data/home.json
+++ b/app/data/home.json
@@ -1,7 +1,7 @@
{
"hero": {
"badgeIcon": "calendar_today",
- "badgeText": "27 August 2026 | Ho Chi Minh City, Vietnam",
+ "badgeText": "27 August 2026 | Hanoi, Vietnam",
"title": "IPv6 - Enhanced for AI & Data Centre Summit 2026",
"subtitle": "Unlocking the Potential of Next-Gen Infrastructure. Join global leaders in redefining ASEAN's digital connectivity for the age of AI.",
"primaryCta": { "label": "Register", "href": "/registration" },
@@ -153,7 +153,8 @@
"order": "03",
"time": "9.15 am – 9.25 am",
"title": "Welcome Address by **Prof Emeritus Dr Sureswaran Ramadass**",
- "description": "*Chairman, IPv6 Forum Malaysia*\n*Chairman, APAC IPv6 Council*"
+ "description": "*Chairman, IPv6 Forum Malaysia*\n*Chairman, APAC IPv6 Council*",
+ "avatar": "/assets/img/speakers/speaker.png"
},
{
"order": "04",
@@ -177,19 +178,22 @@
"order": "07",
"time": "10.00 am – 10.40 am",
"title": "Keynote Address: **\"IPv6 Enhanced, SRv6 & Net5.5G for AI-Native Data Centres\"**",
- "description": "Speaker: Dr. Will Liu, Huawei, China"
+ "description": "Speaker: Dr. Will Liu, Huawei, China",
+ "avatar": "/assets/img/speakers/placeholder.png"
},
{
"order": "08",
"time": "10.40 am – 11.10 am",
"title": "**AI, Cybersecurity & Smart Digital Ecosystems**",
- "description": "Speaker: Prof. Sureswaran Ramadass, Malaysia\nChairman, IPv6 Forum Malaysia"
+ "description": "Speaker: Prof. Sureswaran Ramadass, Malaysia\nChairman, IPv6 Forum Malaysia",
+ "avatar": "/assets/img/speakers/speaker.png"
},
{
"order": "09",
"time": "11.10 am – 11.50 am",
"title": "**Building AI-Ready Data Centre Infrastructure in ASEAN**",
- "description": "Speaker: Mr. Bayu Hanantasena, Strategic Advisor to CEO, Indosat, Indonesia"
+ "description": "Speaker: Mr. Bayu Hanantasena, Strategic Advisor to CEO, Indosat, Indonesia",
+ "avatar": "/assets/img/speakers/placeholder.png"
},
{
"order": "10",
diff --git a/app/data/home.vi.json b/app/data/home.vi.json
index 0a8ec54..69e84f5 100644
--- a/app/data/home.vi.json
+++ b/app/data/home.vi.json
@@ -1,7 +1,7 @@
{
"hero": {
"badgeIcon": "calendar_today",
- "badgeText": "27 Tháng 8/2026 | TP. Hồ Chí Minh, Việt Nam",
+ "badgeText": "27 Tháng 8/2026 | Hà Nội, Việt Nam",
"title": "IPv6 - Enhanced for AI & Data Centre Summit 2026",
"subtitle": "Khám phá tiềm năng Hạ tầng thế hệ mới. Chung sức định hình kỷ nguyên kết nối số tại ASEAN cùng doanh nghiệp hàng đầu quốc tế.",
"primaryCta": { "label": "Đăng Ký", "href": "/registration" },
@@ -153,7 +153,8 @@
"order": "03",
"time": "9.15 am – 9.25 am",
"title": "Phát biểu chào mừng bởi **Prof Emeritus Dr Sureswaran Ramadass**",
- "description": "*Chairman, IPv6 Forum Malaysia*\n*Chairman, APAC IPv6 Council*"
+ "description": "*Chairman, IPv6 Forum Malaysia*\n*Chairman, APAC IPv6 Council*",
+ "avatar": "/assets/img/speakers/speaker.png"
},
{
"order": "04",
@@ -177,19 +178,22 @@
"order": "07",
"time": "10.00 am – 10.40 am",
"title": "Bài phát biểu Keynote: **\"Tối ưu hóa IPv6, SRv6 & Net5.5G cho Trung tâm Dữ liệu tích hợp AI\"**",
- "description": "Speaker: Dr. Will Liu, Huawei, China"
+ "description": "Speaker: Dr. Will Liu, Huawei, China",
+ "avatar": "/assets/img/speakers/placeholder.png"
},
{
"order": "08",
"time": "10.40 am – 11.10 am",
"title": "**AI, An ninh mạng & Hệ sinh thái số thông minh**",
- "description": "Speaker: Prof. Sureswaran Ramadass, Malaysia\nChairman, IPv6 Forum Malaysia"
+ "description": "Speaker: Prof. Sureswaran Ramadass, Malaysia\nChairman, IPv6 Forum Malaysia",
+ "avatar": "/assets/img/speakers/speaker.png"
},
{
"order": "09",
"time": "11.10 am – 11.50 am",
"title": "**Xây dựng hạ tầng Trung tâm dữ liệu sẵn sàng cho AI tại ASEAN**",
- "description": "Speaker: Mr. Bayu Hanantasena, Strategic Advisor to CEO, Indosat, Indonesia"
+ "description": "Speaker: Mr. Bayu Hanantasena, Strategic Advisor to CEO, Indosat, Indonesia",
+ "avatar": "/assets/img/speakers/placeholder.png"
},
{
"order": "10",
diff --git a/app/data/sponsor.json b/app/data/sponsor.json
index 5efbc3a..4d40c55 100644
--- a/app/data/sponsor.json
+++ b/app/data/sponsor.json
@@ -2,7 +2,7 @@
"hero": {
"eyebrow": "OPPORTUNITY AWAITS",
"title": "Become a Sponsor",
- "subtitle": "IPv6 - Enhanced AI & Data Centre Summit 2026 — 27 August 2026, Ho Chi Minh City",
+ "subtitle": "IPv6 - Enhanced AI & Data Centre Summit 2026 — 27 August 2026, Hanoi",
"description": "Join industry leaders at the forefront of the technological evolution. We invite innovative companies to co-sponsor an elite gathering focusing on AI, IPv6, Cloud Computing, Cybersecurity, Blockchain, and Data Centres. Align your brand with the architects of tomorrow's infrastructure.",
"primaryCta": { "label": "Download Prospectus", "href": "#" },
"secondaryCta": { "label": "Speak to an Agent", "href": "#contact" }
diff --git a/app/data/sponsor.vi.json b/app/data/sponsor.vi.json
index a86c890..b0e8e5d 100644
--- a/app/data/sponsor.vi.json
+++ b/app/data/sponsor.vi.json
@@ -2,7 +2,7 @@
"hero": {
"eyebrow": "CƠ HỘI ĐANG CHỜ",
"title": "Trở Thành Nhà Tài Trợ",
- "subtitle": "Hội Nghị IPv6 cho AI & Trung Tâm Dữ Liệu 2026 — 27 Tháng 8 năm 2026, TP. Hồ Chí Minh",
+ "subtitle": "Hội Nghị IPv6 cho AI & Trung Tâm Dữ Liệu 2026 — 27 Tháng 8 năm 2026, Hà Nội",
"description": "Cùng các nhà lãnh đạo ngành ở tuyến đầu tiến hóa công nghệ. Chúng tôi mời các công ty đổi mới đồng tài trợ cho sự kiện đẳng cấp tập trung vào AI, IPv6, Điện Toán Đám Mây, An Ninh Mạng, Blockchain và Trung Tâm Dữ Liệu. Kết nối thương hiệu của bạn với những kiến trúc sư của hạ tầng ngày mai.",
"primaryCta": { "label": "Tải Hồ Sơ Tài Trợ", "href": "#" },
"secondaryCta": { "label": "Liên Hệ Chuyên Viên", "href": "#contact" }
diff --git a/public/assets/img/carousel/ieas.png b/public/assets/img/carousel/ieas.png
new file mode 100644
index 0000000..123f49f
Binary files /dev/null and b/public/assets/img/carousel/ieas.png differ
diff --git a/public/assets/img/feedback-qr-local.png b/public/assets/img/feedback-qr-local.png
new file mode 100644
index 0000000..ec8a049
Binary files /dev/null and b/public/assets/img/feedback-qr-local.png differ
diff --git a/public/assets/img/feedback-qr-prod.png b/public/assets/img/feedback-qr-prod.png
new file mode 100644
index 0000000..53d1658
Binary files /dev/null and b/public/assets/img/feedback-qr-prod.png differ
diff --git a/scripts/generate-qr.ts b/scripts/generate-qr.ts
new file mode 100644
index 0000000..dd365e6
--- /dev/null
+++ b/scripts/generate-qr.ts
@@ -0,0 +1,50 @@
+import fs from 'fs';
+import path from 'path';
+import axios from 'axios';
+
+async function downloadQR(url: string, outputPath: string) {
+ const qrApiUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(url)}`;
+ const response = await axios({
+ url: qrApiUrl,
+ method: 'GET',
+ responseType: 'stream',
+ });
+
+ return new Promise((resolve, reject) => {
+ const writer = fs.createWriteStream(outputPath);
+ response.data.pipe(writer);
+ writer.on('finish', () => resolve());
+ writer.on('error', (err) => reject(err));
+ });
+}
+
+async function main() {
+ const localUrl = 'http://localhost:3000/ipv6/feedback';
+ const prodUrl = 'https://techvanguard.vn/ipv6/feedback';
+
+ const publicDir = path.join(__dirname, '../public/assets/img');
+ if (!fs.existsSync(publicDir)) {
+ fs.mkdirSync(publicDir, { recursive: true });
+ }
+
+ const localPath = path.join(publicDir, 'feedback-qr-local.png');
+ const prodPath = path.join(publicDir, 'feedback-qr-prod.png');
+
+ console.log('Downloading QR code for local URL:', localUrl);
+ await downloadQR(localUrl, localPath);
+ console.log('Saved local QR to:', localPath);
+
+ console.log('Downloading QR code for prod URL:', prodUrl);
+ await downloadQR(prodUrl, prodPath);
+ console.log('Saved prod QR to:', prodPath);
+
+ // Copy to artifact directory
+ const artifactDir = 'C:\\Users\\Admin\\.gemini\\antigravity-ide\\brain\\c96f6734-1739-4dd2-b415-68dac04243f7';
+ if (fs.existsSync(artifactDir)) {
+ fs.copyFileSync(localPath, path.join(artifactDir, 'feedback-qr-local.png'));
+ fs.copyFileSync(prodPath, path.join(artifactDir, 'feedback-qr-prod.png'));
+ console.log('Copied QR codes to artifact directory.');
+ }
+}
+
+main().catch(console.error);