- {data.items.map((item, index) => {
- const isEven = index % 2 === 0;
- return (
-
-
- {/* Timeline Dot (glowing on hover) */}
-
-
- {/* Left/Right alternating grid layout */}
-
-
- {isEven ? (
- <>
- {/* Left: Card (Desktop) / Full content (Mobile) */}
-
-
-
- {item.order}
-
- {/* Mobile-only time badge */}
-
-
- {item.time}
-
-
-
- {renderFormattedText(item.title)}
-
- {!item.description && item.avatar && (
-
- {renderAvatar(item.avatar, "w-10 h-10 lg:w-12 lg:h-12")}
-
- )}
- {item.description && (
-
- {item.avatar && (
-
- {renderAvatar(item.avatar, "w-10 h-10 lg:w-12 lg:h-12")}
-
- )}
-
- {renderFormattedText(item.description)}
-
-
- )}
-
-
-
- {/* Right: Time badge (Desktop-only) */}
-
-
- {item.time}
-
-
- >
- ) : (
- <>
- {/* Left: Time badge (Desktop-only) */}
-
-
- {item.time}
-
-
-
- {/* Right: Card (Desktop) / Full content (Mobile) */}
-
-
-
- {item.order}
-
- {/* Mobile-only time badge */}
-
-
- {item.time}
-
-
-
- {renderFormattedText(item.title)}
-
- {!item.description && item.avatar && (
-
- {renderAvatar(item.avatar, "w-10 h-10 lg:w-12 lg:h-12")}
-
- )}
- {item.description && (
-
- {item.avatar && (
-
- {renderAvatar(item.avatar, "w-10 h-10 lg:w-12 lg:h-12")}
-
- )}
-
- {renderFormattedText(item.description)}
-
-
- )}
-
-
- >
- )}
-
-
-
+ {/* Printable Header (Visible only when printing) */}
+
+
APAC IPv6, AI & Cloud Summit 2026 - Agenda
+
Keangnam Landmark Tower, Hanoi, Vietnam
+
+ {/* Event Venue Banner with Direct Google Maps Button */}
+
+
+ {/* Control Toolbar */}
+
+ {/* Row 1: Search & My Schedule & Print & View Modes */}
+
+ {/* Search Input */}
+
+
setSearchQuery(e.target.value)}
+ className="w-full pl-9 pr-3 py-2 rounded-full bg-background/80 border border-primary/20 text-on-surface text-xs lg:text-sm focus:outline-none focus:border-primary transition-colors placeholder:text-on-surface-variant/50"
+ />
+
+
+
+ {/* Right Action Controls */}
+
+ {/* My Schedule Filter Button */}
+
+
+ {/* Print / Export PDF Button */}
+
+
+ {/* Timezone Switcher */}
+
+ {(["ICT", "UTC", "Local"] as const).map((tz) => (
+
+ ))}
+
+
+ {/* View Mode Toggle */}
+
+
+
+
+
+
+
+ {/* Row 2: Category Filter Tags */}
+
+ {CATEGORIES.map((category) => (
+
+ ))}
+
+
+
+ {/* Results Counter Bar */}
+
+
+ Showing {filteredItems.length} of {(data.items || []).length} sessions
+ {showOnlyBookmarks && " (My Schedule)"}
+
+
+
+
+
+
+ Event Date: Aug 4, 2026
+
+
+
+ {/* No Results Fallback */}
+ {filteredItems.length === 0 && (
+
+
No matching sessions found.
+
+
+ )}
+
+ {/* CARD VIEW: Wider Max Width + Reduced Gaps for Natural Text Flow */}
+ {viewMode === "card" && filteredItems.length > 0 && (
+
+ {/* Central vertical line */}
+
+
+ {/* Timeline Items */}
+
+ {filteredItems.map((item, index) => {
+ const isEven = index % 2 === 0;
+ const isBookmarked = bookmarkedIds.includes(item.id);
+ const orderNum = String(index + 1).padStart(2, "0");
+ const timeText = getTimeDisplay(item);
+ const hasSpeaker = Boolean(item.speaker && item.speaker.trim() !== "");
+
+ return (
+
+ {/* Timeline Dot (glowing on hover) */}
+
+
+ {/* Left/Right alternating grid layout */}
+
+ {isEven ? (
+ <>
+ {/* Left: Card (Desktop) / Full content (Mobile) */}
+
+
+ {/* Top Bar inside Card: Category badge + Order + Star */}
+
+
+ {item.category}
+
+
+
+ {orderNum}
+
+
+
+
+
+ {/* Mobile-only time badge */}
+
+
+ {timeText}
+
+
+
+ {/* Session Title */}
+
+ {renderFormattedText(item.title)}
+
+
+ {/* Description & Speaker Info */}
+
+ {item.description && (
+
+ {renderFormattedText(item.description)}
+
+ )}
+
+ {/* Speaker info with avatar */}
+
+ {hasSpeaker ? (
+ <>
+ {renderAvatar(item.avatar)}
+
+
+ {item.speaker}
+
+ {item.speaker_title && (
+
+ {item.speaker_title}
+
+ )}
+
+ >
+ ) : (
+
+ —
+
+ )}
+
+
+ {/* Location Badge */}
+
+
+
{item.location || "Main Stage"}
+
+
+
+
+
+ {/* Right: Time badge (Desktop-only) */}
+
+
+ {timeText}
+
+ {timezoneMode !== "UTC" && item.time_utc && (
+
+ {item.time_utc} UTC
+
+ )}
+
+ >
+ ) : (
+ <>
+ {/* Left: Time badge (Desktop-only) */}
+
+
+ {timeText}
+
+ {timezoneMode !== "UTC" && item.time_utc && (
+
+ {item.time_utc} UTC
+
+ )}
+
+
+ {/* Right: Card (Desktop) / Full content (Mobile) */}
+
+
+ {/* Top Bar inside Card: Category badge + Order + Star */}
+
+
+ {item.category}
+
+
+
+ {orderNum}
+
+
+
+
+
+ {/* Mobile-only time badge */}
+
+
+ {timeText}
+
+
+
+ {/* Session Title */}
+
+ {renderFormattedText(item.title)}
+
+
+ {/* Description & Speaker Info */}
+
+ {item.description && (
+
{renderFormattedText(item.description)}
+ )}
+
+ {/* Speaker info with avatar */}
+
+ {hasSpeaker ? (
+ <>
+ {renderAvatar(item.avatar)}
+
+
+ {item.speaker}
+
+ {item.speaker_title && (
+
+ {item.speaker_title}
+
+ )}
+
+ >
+ ) : (
+
+ —
+
+ )}
+
+
+ {/* Location Badge */}
+
+
+
{item.location || "Main Stage"}
+
+
+
+
+ >
+ )}
+
+
+ );
+ })}
+
+
+ )}
+
+ {/* TABLE VIEW: Responsive Truncated Rows + Click Row to Open Detail Modal */}
+ {viewMode === "table" && filteredItems.length > 0 && (
+
+
+
+
+
+ | Time |
+ Category |
+ Session Title & Description |
+ Speaker / Presenter |
+ Location |
+ Action |
+
+
+
+ {filteredItems.map((item, idx) => {
+ const isBookmarked = bookmarkedIds.includes(item.id);
+ const isEven = idx % 2 === 0;
+ const hasSpeaker = Boolean(item.speaker && item.speaker.trim() !== "");
+
+ return (
+ setSelectedModalItem(item)}
+ className={`hover:bg-primary/10 transition-colors group cursor-pointer ${
+ isEven ? "bg-surface/20" : "bg-transparent"
+ }`}
+ title="Click to view full session details"
+ >
+ {/* Time */}
+ |
+
+ {getTimeDisplay(item)}
+
+ {timezoneMode !== "UTC" && item.time_utc && (
+
+ {item.time_utc} UTC
+
+ )}
+ |
+
+ {/* Category */}
+
+
+ {item.category}
+
+ |
+
+ {/* Title & Description (Truncated for clean responsive table layout) */}
+
+
+ {item.title}
+
+ {item.description && (
+
+ {item.description}
+
+ )}
+ |
+
+ {/* Speaker */}
+
+ {hasSpeaker ? (
+
+ {renderAvatar(item.avatar, "w-7 h-7 lg:w-8 lg:h-8")}
+
+
+ {item.speaker}
+
+ {item.speaker_title && (
+
+ {item.speaker_title}
+
+ )}
+
+
+ ) : (
+ —
+ )}
+ |
+
+ {/* Location */}
+
+
+
+ {item.location || "Main Stage"}
+
+ |
+
+ {/* Actions: Save Star + Expand indicator */}
+ e.stopPropagation()}>
+
+
+
+
+ |
+
+ );
+ })}
+
+
+
+
+ )}
+
+ {/* SESSION DETAIL MODAL (Opens on Row Click in Table View or Detail Click) */}
+ {selectedModalItem && (
+
setSelectedModalItem(null)}
+ >
+
e.stopPropagation()}
+ >
+ {/* Modal Header Bar */}
+
+
+ {selectedModalItem.category}
+
+
+
+
+
+
+
+ {/* Session Time & Location Badges */}
+
+
+
+
{getTimeDisplay(selectedModalItem)}
+
+
+ {selectedModalItem.time_utc && (
+
+ ({selectedModalItem.time_utc} UTC)
+
+ )}
+
+
+
+
{selectedModalItem.location || "Main Stage"}
+
+
+
+ {/* Full Title (Untruncated) */}
+
+ {renderFormattedText(selectedModalItem.title)}
+
+
+ {/* Full Description (Untruncated) */}
+ {selectedModalItem.description && (
+
+
Description
+ {renderFormattedText(selectedModalItem.description)}
+
+ )}
+
+ {/* Speaker Information */}
+
+
Speaker / Presenter
+ {selectedModalItem.speaker && selectedModalItem.speaker.trim() !== "" ? (
+
+ {renderAvatar(selectedModalItem.avatar, "w-12 h-12")}
+
+
+ {selectedModalItem.speaker}
+
+ {selectedModalItem.speaker_title && (
+
+ {selectedModalItem.speaker_title}
+
+ )}
+
+
+ ) : (
+
—
+ )}
+
+
+ {/* Modal Footer */}
+
+
+
+
+
+ )}
);
}
diff --git a/app/components/home/HeroSection.tsx b/app/components/home/HeroSection.tsx
index 3c64ed4..79fa108 100644
--- a/app/components/home/HeroSection.tsx
+++ b/app/components/home/HeroSection.tsx
@@ -16,13 +16,25 @@ export default function HeroSection({