···
export default function ProjectCard({ project }: ProjectCardProps) {
const [showWarning, setShowWarning] = useState(false);
10
+
const [showInfrastructureInfo, setShowInfrastructureInfo] = useState(false);
const getLinkIcon = (kind: string, url?: string) => {
// Special case: Show Bluesky icon for social links on bsky.app
if (kind === 'social' && url?.includes('bsky.app')) {
···
122
-
{project.type === 'semi-platform' && (
123
-
<div className="relative group">
126
-
e.stopPropagation();
127
-
setShowWarning(!showWarning);
129
-
className="p-1 -m-1 rounded hover:bg-gray-700 transition-colors sm:pointer-events-none"
130
-
aria-label="Warning information"
133
-
className="w-5 h-5 text-yellow-500"
134
-
fill="currentColor"
135
-
viewBox="0 0 20 20"
123
+
<div className="flex items-center gap-2">
124
+
{project.hasIndependentInfrastructure && (
125
+
<div className="relative group">
128
+
e.stopPropagation();
129
+
setShowInfrastructureInfo(!showInfrastructureInfo);
131
+
className="p-1 -m-1 rounded hover:bg-gray-700 transition-colors sm:pointer-events-none"
132
+
aria-label="Independent infrastructure"
137
-
<path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
143
-
className="fixed inset-0 z-20 sm:hidden"
144
-
onClick={() => setShowWarning(false)}
146
-
<div className="absolute right-0 top-8 w-48 p-2 bg-gray-900 text-gray-200 text-xs rounded-lg z-30 border border-gray-700 sm:hidden">
147
-
Has not implemented platform-based AT Protocol lexicon
151
-
<div className="hidden sm:block absolute right-0 top-6 w-48 p-2 bg-gray-900 text-gray-200 text-xs rounded-lg opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none z-10 border border-gray-700">
152
-
Has not implemented platform-based AT Protocol lexicon
135
+
className="w-5 h-5 text-blue-400"
136
+
fill="currentColor"
137
+
viewBox="0 0 20 20"
139
+
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" />
142
+
{showInfrastructureInfo && (
145
+
className="fixed inset-0 z-20 sm:hidden"
146
+
onClick={() => setShowInfrastructureInfo(false)}
148
+
<div className="absolute right-0 top-8 w-48 p-2 bg-gray-900 text-gray-200 text-xs rounded-lg z-30 border border-gray-700 sm:hidden">
149
+
Runs fully independent infrastructure
153
+
<div className="hidden sm:block absolute right-0 top-6 w-48 p-2 bg-gray-900 text-gray-200 text-xs rounded-lg opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none z-10 border border-gray-700">
154
+
Runs fully independent infrastructure
158
+
{project.type === 'semi-platform' && (
159
+
<div className="relative group">
162
+
e.stopPropagation();
163
+
setShowWarning(!showWarning);
165
+
className="p-1 -m-1 rounded hover:bg-gray-700 transition-colors sm:pointer-events-none"
166
+
aria-label="Warning information"
169
+
className="w-5 h-5 text-yellow-500"
170
+
fill="currentColor"
171
+
viewBox="0 0 20 20"
173
+
<path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
179
+
className="fixed inset-0 z-20 sm:hidden"
180
+
onClick={() => setShowWarning(false)}
182
+
<div className="absolute right-0 top-8 w-48 p-2 bg-gray-900 text-gray-200 text-xs rounded-lg z-30 border border-gray-700 sm:hidden">
183
+
Has not implemented platform-based AT Protocol lexicon
187
+
<div className="hidden sm:block absolute right-0 top-6 w-48 p-2 bg-gray-900 text-gray-200 text-xs rounded-lg opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none z-10 border border-gray-700">
188
+
Has not implemented platform-based AT Protocol lexicon