This commit is contained in:
eric
2026-03-07 12:33:14 -06:00
parent 8b034e255b
commit 9bb8bcdf0b
28 changed files with 7231 additions and 78 deletions

245
app/components/Sidebar.tsx Normal file
View File

@@ -0,0 +1,245 @@
const meetups = [
{ city: "清迈", emoji: "🇹🇭", date: "3月9日 周一", attendees: 12 },
{ city: "曼谷", emoji: "🇹🇭", date: "3月12日 周四", attendees: 8 },
{ city: "巴厘岛", emoji: "🇮🇩", date: "3月14日 周六", attendees: 15 },
{ city: "大理", emoji: "🇨🇳", date: "3月16日 周一", attendees: 6 },
{ city: "里斯本", emoji: "🇵🇹", date: "3月20日 周五", attendees: 23 },
];
const travelingNow = [
{ name: "小明", bg: "#f43f5e", destination: "清迈" },
{ name: "雨晴", bg: "#8b5cf6", destination: "巴厘岛" },
{ name: "阿杰", bg: "#3b82f6", destination: "曼谷" },
{ name: "小燕", bg: "#10b981", destination: "东京" },
{ name: "大伟", bg: "#f59e0b", destination: "里斯本" },
{ name: "佳琪", bg: "#ec4899", destination: "墨西哥城" },
{ name: "志远", bg: "#06b6d4", destination: "柏林" },
{ name: "心怡", bg: "#ef4444", destination: "首尔" },
{ name: "凯文", bg: "#84cc16", destination: "巴塞罗那" },
{ name: "子豪", bg: "#7c3aed", destination: "成都" },
{ name: "浩然", bg: "#0d9488", destination: "大理" },
{ name: "雅琪", bg: "#ea580c", destination: "台北" },
{ name: "天翔", bg: "#6366f1", destination: "布达佩斯" },
{ name: "美玲", bg: "#d946ef", destination: "梅德林" },
{ name: "俊杰", bg: "#14b8a6", destination: "普吉岛" },
{ name: "晓华", bg: "#f97316", destination: "吉隆坡" },
];
const newMembers = [
{ name: "林", bg: "#3b82f6" },
{ name: "张", bg: "#8b5cf6" },
{ name: "陈", bg: "#f43f5e" },
{ name: "周", bg: "#10b981" },
{ name: "吴", bg: "#f59e0b" },
{ name: "杨", bg: "#ec4899" },
{ name: "赵", bg: "#06b6d4" },
{ name: "黄", bg: "#ef4444" },
{ name: "孙", bg: "#84cc16" },
{ name: "马", bg: "#7c3aed" },
{ name: "朱", bg: "#0d9488" },
{ name: "胡", bg: "#ea580c" },
{ name: "郭", bg: "#6366f1" },
{ name: "何", bg: "#d946ef" },
{ name: "高", bg: "#14b8a6" },
{ name: "梁", bg: "#f97316" },
{ name: "郑", bg: "#a855f7" },
{ name: "罗", bg: "#22c55e" },
{ name: "谢", bg: "#e11d48" },
{ name: "韩", bg: "#0ea5e9" },
];
const hotTopics = [
{ title: "清迈最佳共享办公空间推荐 Top 10", views: 2340 },
{ title: "2026年数字游民签证政策汇总", views: 1890 },
{ title: "远程工作者的跨国税务规划指南", views: 1560 },
{ title: "东南亚 vs 拉美:哪个更适合游民?", views: 1230 },
{ title: "新手游民必备工具与装备清单", views: 980 },
];
export default function Sidebar() {
return (
<aside className="w-[320px] shrink-0 hidden lg:block">
<div className="sticky top-20 space-y-4 sidebar-scroll max-h-[calc(100vh-100px)] overflow-y-auto pr-1">
{/* Insurance / Visa Promo */}
<div className="rounded-2xl bg-gradient-to-br from-emerald-50 to-teal-50 border border-emerald-100 p-5">
<div className="flex items-start gap-3 mb-3">
<span className="text-2xl">🛡</span>
<div>
<h3 className="font-bold text-gray-900 text-sm"></h3>
<p className="text-xs text-gray-500 mt-0.5">
</p>
</div>
</div>
<p className="text-xs text-emerald-700 bg-emerald-100/50 rounded-lg px-3 py-2 mb-3">
195+ ¥15/
</p>
<button className="w-full text-center text-sm font-semibold text-emerald-700 hover:text-emerald-800 bg-white border border-emerald-200 rounded-full py-2 transition-colors hover:bg-emerald-50">
</button>
<p className="text-[10px] text-gray-400 text-center mt-2">广</p>
</div>
{/* Upcoming Meetups */}
<div className="rounded-2xl bg-white border border-gray-100 shadow-sm p-5">
<div className="flex items-center justify-between mb-4">
<h3 className="font-bold text-gray-900 text-sm flex items-center gap-1.5">
🍹
</h3>
<span className="text-[11px] text-gray-400">8/</span>
</div>
<div className="space-y-3">
{meetups.map((m) => (
<div
key={m.city + m.date}
className="flex items-center justify-between py-2 border-b border-gray-50 last:border-0 last:pb-0"
>
<div className="flex items-center gap-2.5">
<span className="text-lg">{m.emoji}</span>
<div>
<p className="text-sm font-medium text-gray-800">
{m.city}
</p>
<p className="text-[11px] text-gray-400">{m.date}</p>
</div>
</div>
<span className="text-[11px] text-gray-400 bg-gray-50 rounded-full px-2 py-0.5">
{m.attendees}
</span>
</div>
))}
</div>
<button className="w-full text-center text-xs font-medium text-gray-500 hover:text-gray-700 mt-3 pt-3 border-t border-gray-100 transition-colors">
</button>
</div>
{/* Traveling Now */}
<div className="rounded-2xl bg-white border border-gray-100 shadow-sm p-5">
<div className="flex items-center justify-between mb-4">
<h3 className="font-bold text-gray-900 text-sm flex items-center gap-1.5">
🛩
</h3>
<span className="text-[11px] text-gray-400">
{travelingNow.length}
</span>
</div>
<div className="flex flex-wrap gap-2">
{travelingNow.map((m) => (
<div key={m.name} className="group relative">
<div
className="w-9 h-9 rounded-full flex items-center justify-center text-xs text-white font-medium shadow-sm cursor-pointer hover:scale-110 transition-transform avatar-online"
style={{ backgroundColor: m.bg }}
title={`${m.name} · ${m.destination}`}
>
{m.name.charAt(0)}
</div>
</div>
))}
</div>
</div>
{/* New Members */}
<div className="rounded-2xl bg-white border border-gray-100 shadow-sm p-5">
<div className="flex items-center justify-between mb-4">
<h3 className="font-bold text-gray-900 text-sm flex items-center gap-1.5">
👋
</h3>
<span className="text-[11px] text-gray-400">86/</span>
</div>
<div className="flex flex-wrap gap-2">
{newMembers.map((m) => (
<div
key={m.name}
className="w-9 h-9 rounded-full flex items-center justify-center text-xs text-white font-medium shadow-sm cursor-pointer hover:scale-110 transition-transform"
style={{ backgroundColor: m.bg }}
>
{m.name}
</div>
))}
</div>
</div>
{/* Hot Topics */}
<div className="rounded-2xl bg-white border border-gray-100 shadow-sm p-5">
<h3 className="font-bold text-gray-900 text-sm flex items-center gap-1.5 mb-4">
🔥
</h3>
<div className="space-y-3">
{hotTopics.map((t, i) => (
<a
key={t.title}
href="#"
className="flex items-start gap-2.5 group"
>
<span className="text-xs font-bold text-gray-300 mt-0.5 w-4 shrink-0">
{i + 1}
</span>
<div className="flex-1 min-w-0">
<p className="text-sm text-gray-700 group-hover:text-gray-900 transition-colors line-clamp-1 leading-snug">
{t.title}
</p>
<p className="text-[11px] text-gray-400 mt-0.5">
{t.views.toLocaleString()}
</p>
</div>
</a>
))}
</div>
<button className="w-full text-center text-xs font-medium text-gray-500 hover:text-gray-700 mt-3 pt-3 border-t border-gray-100 transition-colors">
</button>
</div>
{/* Chat CTA */}
<div className="rounded-2xl bg-gradient-to-br from-violet-50 to-purple-50 border border-violet-100 p-5">
<div className="flex items-start gap-3 mb-3">
<span className="text-2xl">💬</span>
<div>
<h3 className="font-bold text-gray-900 text-sm">
</h3>
<p className="text-xs text-gray-500 mt-0.5">
3,200+
</p>
</div>
</div>
<button className="w-full text-center text-sm font-semibold text-violet-700 hover:text-violet-800 bg-white border border-violet-200 rounded-full py-2 transition-colors hover:bg-violet-50">
</button>
</div>
{/* Visa Service */}
<div className="rounded-2xl bg-gradient-to-br from-amber-50 to-orange-50 border border-amber-100 p-5">
<div className="flex items-start gap-3 mb-3">
<span className="text-2xl">🏛</span>
<div>
<h3 className="font-bold text-gray-900 text-sm"></h3>
<p className="text-xs text-gray-500 mt-0.5">
</p>
</div>
</div>
<div className="flex flex-wrap gap-1.5 mb-3">
<span className="text-[11px] bg-amber-100/60 text-amber-700 rounded-full px-2 py-0.5">
🇹🇭
</span>
<span className="text-[11px] bg-amber-100/60 text-amber-700 rounded-full px-2 py-0.5">
🇵🇹
</span>
<span className="text-[11px] bg-amber-100/60 text-amber-700 rounded-full px-2 py-0.5">
🇪🇸 西
</span>
<span className="text-[11px] bg-amber-100/60 text-amber-700 rounded-full px-2 py-0.5">
🇮🇩
</span>
</div>
<button className="w-full text-center text-sm font-semibold text-amber-700 hover:text-amber-800 bg-white border border-amber-200 rounded-full py-2 transition-colors hover:bg-amber-50">
</button>
<p className="text-[10px] text-gray-400 text-center mt-2">广</p>
</div>
</div>
</aside>
);
}