> ## Documentation Index
> Fetch the complete documentation index at: https://www.yumeyuka.moe/llms.txt
> Use this file to discover all available pages before exploring further.

# 好朋友

export const FriendCard = ({name, role, image, bio, url}) => {
  const fallbackAvatar = `https://ui-avatars.com/api/?name=${encodeURIComponent(name)}&background=E8F4F5&color=358e98`;
  return <a href={url} target="_blank" rel="noopener noreferrer" className="flex items-start gap-5 p-6 rounded-2xl w-full
               not-prose no-underline
               bg-white/80 dark:bg-zinc-900/60
               border border-zinc-200/60 dark:border-zinc-700/40
               hover:border-[#358e98]/50 dark:hover:border-[#71c6db]/30
               transition-colors duration-200">
			<div className="shrink-0">
				<div className="w-16 h-16 rounded-full overflow-hidden bg-[#358e98]/10 ring-2 ring-[#358e98]/60 dark:ring-[#71c6db]/50">
					<img src={image || fallbackAvatar} alt={name} loading="lazy" className="w-full h-full object-cover m-0" onError={e => {
    e.currentTarget.src = fallbackAvatar;
  }} />
				</div>
			</div>

			<div className="flex-1 min-w-0">
				<div className="flex items-center justify-between gap-3 mb-2">
					<h3 className="text-lg font-semibold m-0 text-zinc-900 dark:text-zinc-100 truncate">
						{name}
					</h3>
					<span className="shrink-0 text-xs font-medium text-[#358e98] dark:text-[#71c6db] bg-[#358e98]/10 dark:bg-[#71c6db]/10 px-3 py-1 rounded-full">
						{role}
					</span>
				</div>

				<p className="text-sm text-zinc-600 dark:text-zinc-400 m-0 leading-relaxed line-clamp-2">
					{bio}
				</p>
			</div>
		</a>;
};

export const FriendList = ({children}) => {
  const [shuffledChildren, setShuffledChildren] = useState([]);
  useEffect(() => {
    const childrenArray = React.Children.toArray(children);
    const shuffled = [...childrenArray].sort(() => Math.random() - 0.5);
    setShuffledChildren(shuffled);
  }, [children]);
  const renderChildren = shuffledChildren.length > 0 ? shuffledChildren : children;
  return <div className="grid grid-cols-1 md:grid-cols-2 gap-5 w-full max-w-5xl mx-auto my-10">
			{renderChildren}
		</div>;
};

<FriendList>
  <FriendCard name="枫莹" role="好闺蜜" image="https://avatars.githubusercontent.com/u/87564515?v=4" bio="三無青年、ただ生きるだけ" url="https://www.fengying.xin/" />

  <FriendCard name="布铃" role="blyrin " image="https://avatars.githubusercontent.com/u/67328567?v=4" bio="布影轻摇溪水暖，铃花半落石阶幽" url="https://blyrin.cn/" />

  <FriendCard name="白彩恋" role="浅草" image="https://avatars.githubusercontent.com/u/169267914?v=4" bio="日永弃明月天穹，世不离两反一逆" url="https://shiror.ren/" />

  <FriendCard name="Chenzyadb" role="咲汀 GalGame" image="https://avatars.githubusercontent.com/u/89340470?v=4" bio="真正能给你撑腰的, 是丰富的知识储备, 足够的经济基础..." url="https://github.com/chenzyadb" />

  <FriendCard name="Linso" role="强到被跨省抓捕" image="https://avatars.githubusercontent.com/u/168621525?v=4" bio="秋乐/曼珠沙华/PrintX" url="https://linso.top/" />

  <FriendCard name="Saku" role="椎名 朔" image="https://avatars.githubusercontent.com/u/228504405?v=4" bio="技術とデザインの交差点" url="https://shiina.xyz" />

  <FriendCard name="イレイナ" role="Ireina" image="https://avatars.githubusercontent.com/u/140869597?v=4" bio="对我而言，最宝贵的时间就是我静下心独自思考的时候" url="https://github.com/re-zero001" />
</FriendList>
