'use client'; import React, { useState, useEffect } from 'react'; import Image, { ImageProps } from 'next/image'; interface TransparentImageProps extends Omit { src: string; alt: string; teamOrBrandName?: string; theme?: 'light' | 'dark'; // bg-stone-50 vs bg-stone-900 } /** * 字串過濾器 (String Formatter) * 確保專有名詞的大小寫與字元間距嚴格對齊 */ export const formatBrandName = (name: string) => { return name.toUpperCase().replace(/\s+/g, ' ').trim(); }; export default function TransparentImage({ src, alt, teamOrBrandName, theme = 'dark', className = '', ...props }: TransparentImageProps) { const [isValidAlpha, setIsValidAlpha] = useState(null); useEffect(() => { // 實務上這裡可以加上 Canvas 檢查,掃描圖片角落是否有典型的實體灰白棋盤格特徵 // 或者只允許載入已經過後端白名單校驗的 CDN 圖片 // 這裡我們假設 src 來自信任的 CDN 或本地 public setIsValidAlpha(true); }, [src]); // 防呆機制:若檢測到無效透明度,顯示佔位符 if (isValidAlpha === false) { return (
Alpha Error
); } // 移除 `mix-blend-mode` 偽裝去背,嚴格要求圖檔自帶真實 Alpha Channel return (
{alt}
{teamOrBrandName && ( {theme === 'dark' ? ( {formatBrandName(teamOrBrandName)} ) : ( {formatBrandName(teamOrBrandName)} )} )}
); }