Margin is an open annotation layer for the internet. Powered by the AT Protocol. margin.at
extension web atproto comments
at main 726 lines 34 kB view raw
1import React from "react"; 2import { useStore } from "@nanostores/react"; 3import { Link } from "react-router-dom"; 4import { $theme, cycleTheme } from "../store/theme"; 5import { $user } from "../store/auth"; 6import { 7 MessageSquareText, 8 Highlighter, 9 Bookmark, 10 FolderOpen, 11 Keyboard, 12 PanelRight, 13 MousePointerClick, 14 Shield, 15 Users, 16 Chrome, 17 ArrowRight, 18 Github, 19 ExternalLink, 20 Hash, 21 Coffee, 22 Heart, 23 Eye, 24 Sun, 25 Moon, 26 Monitor, 27} from "lucide-react"; 28import { AppleIcon, TangledIcon } from "../components/common/Icons"; 29import { FaFirefox, FaEdge } from "react-icons/fa"; 30 31function FeatureCard({ 32 icon: Icon, 33 title, 34 description, 35 accent = false, 36}: { 37 icon: React.ElementType; 38 title: string; 39 description: string; 40 accent?: boolean; 41}) { 42 return ( 43 <div 44 className={`group p-6 rounded-2xl border transition-all duration-200 hover:-translate-y-0.5 hover:shadow-sm ${ 45 accent 46 ? "bg-primary-50 dark:bg-primary-950/30 border-primary-200/50 dark:border-primary-800/40" 47 : "bg-white dark:bg-surface-800 border-surface-200/60 dark:border-surface-700/60" 48 }`} 49 > 50 <div 51 className={`w-11 h-11 rounded-xl flex items-center justify-center mb-4 transition-colors ${ 52 accent 53 ? "bg-primary-600 text-white" 54 : "bg-surface-100 dark:bg-surface-700/50 text-surface-500 dark:text-surface-400 group-hover:bg-primary-600 group-hover:text-white dark:group-hover:bg-primary-500" 55 }`} 56 > 57 <Icon size={20} /> 58 </div> 59 <h3 className="font-display font-semibold text-base mb-2 text-surface-900 dark:text-white"> 60 {title} 61 </h3> 62 <p className="text-sm text-surface-500 dark:text-surface-400 leading-relaxed"> 63 {description} 64 </p> 65 </div> 66 ); 67} 68 69function ExtensionFeature({ 70 icon: Icon, 71 title, 72 description, 73}: { 74 icon: React.ElementType; 75 title: string; 76 description: string; 77}) { 78 return ( 79 <div className="flex gap-4 items-start"> 80 <div className="w-9 h-9 rounded-lg bg-primary-100 dark:bg-primary-900/30 flex items-center justify-center flex-shrink-0 text-primary-600 dark:text-primary-400"> 81 <Icon size={18} /> 82 </div> 83 <div> 84 <h4 className="font-semibold text-sm text-surface-900 dark:text-white mb-1"> 85 {title} 86 </h4> 87 <p className="text-sm text-surface-500 dark:text-surface-400 leading-relaxed"> 88 {description} 89 </p> 90 </div> 91 </div> 92 ); 93} 94 95export default function About() { 96 const theme = useStore($theme); // ensure theme is applied on this page 97 const user = useStore($user); 98 99 const [browser] = React.useState< 100 "chrome" | "firefox" | "edge" | "safari" | "other" 101 >(() => { 102 if (typeof navigator === "undefined") return "other"; 103 const ua = navigator.userAgent; 104 if (/Edg\//i.test(ua)) return "edge"; 105 if (/Firefox/i.test(ua)) return "firefox"; 106 if (/^((?!chrome|android).)*safari/i.test(ua)) return "safari"; 107 if (/Chrome/i.test(ua)) return "chrome"; 108 return "other"; 109 }); 110 111 const extensionLink = 112 browser === "firefox" 113 ? "https://addons.mozilla.org/en-US/firefox/addon/margin/" 114 : browser === "edge" 115 ? "https://microsoftedge.microsoft.com/addons/detail/margin/nfjnmllpdgcdnhmmggjihjbidmeadddn" 116 : "https://chromewebstore.google.com/detail/margin/cgpmbiiagnehkikhcbnhiagfomajncpa"; 117 118 const ExtensionIcon = 119 browser === "firefox" ? FaFirefox : browser === "edge" ? FaEdge : Chrome; 120 const extensionLabel = 121 browser === "firefox" ? "Firefox" : browser === "edge" ? "Edge" : "Chrome"; 122 123 const [isScrolled, setIsScrolled] = React.useState(false); 124 125 React.useEffect(() => { 126 const handleScroll = () => { 127 setIsScrolled(window.scrollY > 20); 128 }; 129 window.addEventListener("scroll", handleScroll, { passive: true }); 130 return () => window.removeEventListener("scroll", handleScroll); 131 }, []); 132 133 return ( 134 <div className="min-h-screen bg-surface-100 dark:bg-surface-900"> 135 <nav 136 className={`sticky top-0 z-50 transition-all duration-300 ${ 137 isScrolled 138 ? "bg-white/80 dark:bg-surface-900/80 backdrop-blur-xl border-b border-surface-200/50 dark:border-surface-800/50 shadow-sm" 139 : "bg-transparent border-b border-transparent" 140 }`} 141 > 142 <div 143 className={`max-w-5xl mx-auto px-4 sm:px-6 flex items-center justify-between transition-all duration-300 ${ 144 isScrolled ? "h-14" : "h-24" 145 }`} 146 > 147 <div className="flex items-center gap-2.5"> 148 <img src="/logo.svg" alt="Margin" className="w-7 h-7" /> 149 <span className="font-display font-bold text-lg tracking-tight text-surface-900 dark:text-white"> 150 Margin 151 </span> 152 </div> 153 <div className="flex items-center gap-1 sm:gap-2"> 154 <div className="hidden md:flex items-center gap-1 mr-2"> 155 {user && ( 156 <Link 157 to="/home" 158 className="text-[13px] font-medium text-surface-500 dark:text-surface-400 hover:text-surface-900 dark:hover:text-white transition-colors px-3 py-1.5 rounded-lg hover:bg-surface-100 dark:hover:bg-surface-800" 159 > 160 Feed 161 </Link> 162 )} 163 </div> 164 165 {!user && ( 166 <Link 167 to="/login" 168 className="text-[13px] font-medium text-surface-600 dark:text-surface-300 hover:text-surface-900 dark:hover:text-white transition-colors px-3 py-1.5 rounded-lg hover:bg-surface-100 dark:hover:bg-surface-800" 169 > 170 Sign in 171 </Link> 172 )} 173 174 <a 175 href={extensionLink} 176 target="_blank" 177 rel="noopener noreferrer" 178 className="text-[13px] font-semibold px-3 sm:px-4 py-1.5 bg-surface-900 dark:bg-white text-white dark:text-surface-900 rounded-lg hover:bg-surface-800 dark:hover:bg-surface-100 transition-colors" 179 > 180 <span className="hidden sm:inline">Get Extension</span> 181 <span className="sm:hidden">Install</span> 182 </a> 183 </div> 184 </div> 185 </nav> 186 187 <section className="relative overflow-hidden"> 188 <div className="absolute top-0 inset-x-0 h-[500px] bg-gradient-to-b from-primary-50/50 via-transparent to-transparent dark:from-primary-900/10 dark:to-transparent -z-10 pointer-events-none" /> 189 190 <div className="max-w-4xl mx-auto px-6 pt-8 pb-20 md:pt-16 md:pb-28 text-center relative z-10"> 191 <div className="flex flex-col sm:flex-row items-center justify-center gap-4 mb-10"> 192 <div className="group relative inline-flex items-center gap-2 px-1 py-1 rounded-full bg-surface-50/50 dark:bg-surface-800/30 border border-surface-200 dark:border-surface-700/50 hover:bg-surface-100/50 dark:hover:bg-surface-800/50 transition-colors cursor-pointer"> 193 <div className="flex items-center -space-x-2"> 194 <a 195 href="https://github.com/margin-at" 196 target="_blank" 197 rel="noreferrer" 198 className="relative z-10 flex items-center justify-center w-8 h-8 rounded-full bg-white dark:bg-surface-900 text-surface-600 hover:text-surface-900 dark:text-surface-400 dark:hover:text-white border-2 border-surface-50 dark:border-surface-800 shadow-sm transition-transform hover:z-20 hover:scale-110" 199 title="GitHub" 200 > 201 <Github size={15} /> 202 </a> 203 <a 204 href="https://tangled.org/margin.at/margin" 205 target="_blank" 206 rel="noreferrer" 207 className="relative z-0 flex items-center justify-center w-8 h-8 rounded-full bg-white dark:bg-surface-900 border-2 border-surface-50 dark:border-surface-800 shadow-sm transition-transform hover:z-20 hover:scale-110" 208 title="Tangled" 209 > 210 <TangledIcon 211 size={16} 212 className="text-surface-600 hover:text-surface-900 dark:text-surface-400 dark:hover:text-white transition-colors" 213 /> 214 </a> 215 </div> 216 <span className="pr-4 pl-0.5 text-[13px] font-semibold text-surface-600 dark:text-surface-300"> 217 Fully open source{" "} 218 <span className="text-primary-500 font-normal"></span> 219 </span> 220 </div> 221 </div> 222 223 <h1 className="font-display text-5xl md:text-6xl lg:text-7xl font-bold tracking-tight text-surface-900 dark:text-white leading-[1.05] mb-6"> 224 Write on the margins <br className="hidden sm:block" /> 225 <span className="text-primary-600 dark:text-primary-400"> 226 of the internet. 227 </span> 228 </h1> 229 230 <p className="text-lg md:text-xl text-surface-500 dark:text-surface-400 max-w-2xl mx-auto leading-relaxed mb-10"> 231 Margin is an open annotation layer for the internet. Highlight text, 232 leave notes, and bookmark pages, all stored on your decentralized 233 identity with the{" "} 234 <a 235 href="https://atproto.com" 236 target="_blank" 237 rel="noreferrer" 238 className="text-surface-800 dark:text-surface-200 hover:text-primary-600 dark:hover:text-primary-400 border-b border-surface-300 dark:border-surface-600 hover:border-primary-400 transition-colors font-medium" 239 > 240 AT Protocol 241 </a> 242 . Not locked in a silo. 243 </p> 244 245 <div className="flex flex-col sm:flex-row items-center justify-center gap-4 mt-4"> 246 <Link 247 to={user ? "/home" : "/login"} 248 className="group inline-flex items-center justify-center gap-2 px-8 py-3.5 bg-surface-900 dark:bg-white text-white dark:text-surface-900 rounded-[14px] font-semibold hover:bg-surface-800 dark:hover:bg-surface-200 hover:scale-[1.02] shadow-sm transition-all duration-200 w-full sm:w-auto" 249 > 250 {user ? "Open App" : "Get Started"} 251 <ArrowRight 252 size={18} 253 className="transition-transform group-hover:translate-x-1" 254 /> 255 </Link> 256 <a 257 href={extensionLink} 258 target="_blank" 259 rel="noopener noreferrer" 260 className="inline-flex items-center justify-center gap-2 px-8 py-3.5 bg-surface-50 dark:bg-surface-800/50 text-surface-700 dark:text-surface-200 hover:text-surface-900 dark:hover:text-white rounded-[14px] font-semibold hover:bg-surface-100 dark:hover:bg-surface-800 hover:scale-[1.02] transition-all duration-200 w-full sm:w-auto" 261 > 262 <ExtensionIcon size={18} /> 263 Install for {extensionLabel} 264 </a> 265 </div> 266 </div> 267 </section> 268 269 <section className="max-w-5xl mx-auto px-6 py-20 md:py-24"> 270 <div className="text-center mb-12"> 271 <h2 className="font-display text-2xl md:text-3xl font-bold tracking-tight text-surface-900 dark:text-white mb-4"> 272 Everything you need to engage with the web 273 </h2> 274 <p className="text-surface-500 dark:text-surface-400 max-w-xl mx-auto leading-relaxed"> 275 More than bookmarks. A full toolkit for reading, thinking, and 276 sharing on the open web. 277 </p> 278 </div> 279 280 <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5"> 281 <FeatureCard 282 icon={MessageSquareText} 283 title="Annotations" 284 description="Leave notes on any web page. Start discussions, share insights, or just jot down your thoughts for later." 285 accent 286 /> 287 <FeatureCard 288 icon={Highlighter} 289 title="Highlights" 290 description="Select and highlight text on any page with customizable colors. Your highlights are rendered inline with the CSS Highlights API." 291 /> 292 <FeatureCard 293 icon={Bookmark} 294 title="Bookmarks" 295 description="Save pages with one click or a keyboard shortcut. All your bookmarks are synced to your AT Protocol identity." 296 /> 297 <FeatureCard 298 icon={FolderOpen} 299 title="Collections" 300 description="Organize your annotations, highlights, and bookmarks into themed collections. Share them publicly or keep them private." 301 /> 302 <FeatureCard 303 icon={Users} 304 title="Social Discovery" 305 description="See what others are saying about the pages you visit. Discover annotations, trending tags, and connect with other readers." 306 /> 307 <FeatureCard 308 icon={Hash} 309 title="Tags & Search" 310 description="Tag your annotations for easy retrieval. Search by URL, tag, or content to find exactly what you're looking for." 311 /> 312 </div> 313 </section> 314 315 <section className="bg-white/50 dark:bg-surface-800/50 border-y border-surface-200/60 dark:border-surface-800/60"> 316 <div className="max-w-5xl mx-auto px-6 py-20 md:py-24"> 317 <div className="grid grid-cols-1 lg:grid-cols-2 gap-12 lg:gap-16 items-center"> 318 <div> 319 <div className="inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-surface-100 dark:bg-surface-800 text-surface-600 dark:text-surface-400 text-xs font-medium mb-5 border border-surface-200/60 dark:border-surface-700/60"> 320 <ExtensionIcon size={13} /> 321 Browser Extension 322 </div> 323 <h2 className="font-display text-2xl md:text-3xl font-bold tracking-tight text-surface-900 dark:text-white mb-4"> 324 Your annotation toolkit, 325 <br /> 326 right in the browser 327 </h2> 328 <p className="text-surface-500 dark:text-surface-400 leading-relaxed mb-8"> 329 The Margin extension brings the full annotation experience 330 directly into every page you visit. Just select, annotate, and 331 go. 332 </p> 333 334 <div className="space-y-5"> 335 <ExtensionFeature 336 icon={Eye} 337 title="Inline Overlay" 338 description="See annotations and highlights rendered directly on the page. Uses the CSS Highlights API for beautiful, native-feeling text underlines." 339 /> 340 <ExtensionFeature 341 icon={MousePointerClick} 342 title="Context Menu & Selection" 343 description="Right-click any selected text to annotate, highlight, or quote it. Or just right-click the page to bookmark it instantly." 344 /> 345 <ExtensionFeature 346 icon={Keyboard} 347 title="Keyboard Shortcuts" 348 description="Toggle the overlay, bookmark the current page, or annotate selected text without reaching for the mouse." 349 /> 350 <ExtensionFeature 351 icon={PanelRight} 352 title="Side Panel" 353 description="Open the Margin side panel to browse annotations, bookmarks, and collections without leaving the page you're reading." 354 /> 355 </div> 356 357 <div className="flex flex-col sm:flex-row gap-3 mt-8 flex-wrap"> 358 <a 359 href={extensionLink} 360 target="_blank" 361 rel="noopener noreferrer" 362 className="inline-flex items-center justify-center gap-2 px-5 py-2.5 bg-surface-900 dark:bg-white text-white dark:text-surface-900 rounded-lg font-medium text-sm transition-all hover:opacity-90" 363 > 364 <ExtensionIcon size={15} /> 365 Install for {extensionLabel} 366 <ExternalLink size={12} /> 367 </a> 368 {browser !== "chrome" && ( 369 <a 370 href="https://chromewebstore.google.com/detail/margin/cgpmbiiagnehkikhcbnhiagfomajncpa" 371 target="_blank" 372 rel="noopener noreferrer" 373 className="inline-flex items-center justify-center gap-2 px-5 py-2.5 bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-200 rounded-lg font-medium text-sm transition-all hover:bg-surface-200 dark:hover:bg-surface-700 border border-surface-200/80 dark:border-surface-700/80" 374 > 375 <Chrome size={15} /> 376 Chrome 377 <ExternalLink size={12} /> 378 </a> 379 )} 380 {browser !== "firefox" && ( 381 <a 382 href="https://addons.mozilla.org/en-US/firefox/addon/margin/" 383 target="_blank" 384 rel="noopener noreferrer" 385 className="inline-flex items-center justify-center gap-2 px-5 py-2.5 bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-200 rounded-lg font-medium text-sm transition-all hover:bg-surface-200 dark:hover:bg-surface-700 border border-surface-200/80 dark:border-surface-700/80" 386 > 387 <FaFirefox size={15} /> 388 Firefox 389 <ExternalLink size={12} /> 390 </a> 391 )} 392 {browser !== "edge" && ( 393 <a 394 href="https://microsoftedge.microsoft.com/addons/detail/margin/nfjnmllpdgcdnhmmggjihjbidmeadddn" 395 target="_blank" 396 rel="noopener noreferrer" 397 className="inline-flex items-center justify-center gap-2 px-5 py-2.5 bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-200 rounded-lg font-medium text-sm transition-all hover:bg-surface-200 dark:hover:bg-surface-700 border border-surface-200/80 dark:border-surface-700/80" 398 > 399 <FaEdge size={15} /> 400 Edge 401 <ExternalLink size={12} /> 402 </a> 403 )} 404 <a 405 href="https://www.icloud.com/shortcuts/1e33ebf52f55431fae1e187cfe9738c3" 406 target="_blank" 407 rel="noopener noreferrer" 408 className="inline-flex items-center justify-center gap-2 px-5 py-2.5 bg-surface-100 dark:bg-surface-800 text-surface-700 dark:text-surface-200 rounded-lg font-medium text-sm transition-all hover:bg-surface-200 dark:hover:bg-surface-700 border border-surface-200/80 dark:border-surface-700/80" 409 > 410 <AppleIcon size={15} /> 411 iOS Shortcut 412 <ExternalLink size={12} /> 413 </a> 414 </div> 415 </div> 416 417 <div className="relative hidden lg:block"> 418 <div className="relative rounded-2xl border border-surface-200/60 dark:border-surface-700/60 bg-white dark:bg-surface-800 p-6 shadow-xl"> 419 <div className="flex items-center gap-2 mb-4"> 420 <div className="flex gap-1.5"> 421 <div className="w-3 h-3 rounded-full bg-red-400/60" /> 422 <div className="w-3 h-3 rounded-full bg-yellow-400/60" /> 423 <div className="w-3 h-3 rounded-full bg-green-400/60" /> 424 </div> 425 <div className="flex-1 mx-3 bg-surface-200 dark:bg-surface-700 rounded-md h-6 flex items-center px-3"> 426 <span className="text-[10px] text-surface-400 truncate"> 427 example.com/article/how-to-think-clearly 428 </span> 429 </div> 430 </div> 431 432 <div className="space-y-3 text-sm text-surface-600 dark:text-surface-300 leading-relaxed"> 433 <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-3/4" /> 434 <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-full" /> 435 <div className="flex gap-0.5 flex-wrap items-center"> 436 <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-1/4" /> 437 <span className="px-1 py-0.5 bg-yellow-200/70 dark:bg-yellow-500/30 rounded text-xs text-surface-700 dark:text-yellow-200 font-medium leading-none"> 438 The point here is that Margin is indeed 439 </span> 440 <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-1/5" /> 441 </div> 442 <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-5/6" /> 443 <div className="flex gap-0.5 flex-wrap items-center"> 444 <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-2/5" /> 445 <span className="px-1 py-0.5 bg-primary-200/70 dark:bg-primary-500/30 rounded text-xs text-primary-700 dark:text-primary-200 font-medium leading-none"> 446 the best thing ever 447 </span> 448 <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-1/4" /> 449 </div> 450 <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-2/3" /> 451 </div> 452 453 <div className="absolute -right-4 top-1/3 w-56 bg-white dark:bg-surface-900 rounded-xl border border-surface-200/60 dark:border-surface-700/60 shadow-lg p-3.5"> 454 <div className="flex items-center gap-2 mb-2"> 455 <div className="w-6 h-6 rounded-full bg-gradient-to-br from-primary-400 to-primary-600 flex items-center justify-center text-white text-[10px] font-bold"> 456 S 457 </div> 458 <span className="text-xs font-semibold text-surface-900 dark:text-white"> 459 @scan.margin.cafe 460 </span> 461 </div> 462 <p className="text-xs text-surface-600 dark:text-surface-300 leading-relaxed"> 463 I agree, Margin is just so good, like the other day I was 464 drinking some of that Margin for breakfast 465 </p> 466 <div className="flex items-center gap-3 mt-2.5 pt-2 border-t border-surface-100 dark:border-surface-700"> 467 <span className="text-[10px] text-surface-400 flex items-center gap-1"> 468 <Heart size={10} /> 3 469 </span> 470 <span className="text-[10px] text-surface-400 flex items-center gap-1"> 471 <MessageSquareText size={10} /> 1 472 </span> 473 </div> 474 </div> 475 </div> 476 </div> 477 </div> 478 </div> 479 </section> 480 481 <section className="max-w-5xl mx-auto px-6 py-20 md:py-24"> 482 <div className="grid grid-cols-1 md:grid-cols-2 gap-12 items-center"> 483 <div> 484 <div className="inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-white dark:bg-surface-800 text-surface-600 dark:text-surface-400 text-xs font-medium mb-5 border border-surface-200/60 dark:border-surface-700/60"> 485 <Shield size={13} /> 486 Decentralized 487 </div> 488 <h2 className="font-display text-2xl md:text-3xl font-bold tracking-tight text-surface-900 dark:text-white mb-4"> 489 Your data, your identity 490 </h2> 491 <p className="text-surface-500 dark:text-surface-400 leading-relaxed mb-6"> 492 Margin is built on the{" "} 493 <a 494 href="https://atproto.com" 495 target="_blank" 496 rel="noreferrer" 497 className="text-primary-600 dark:text-primary-400 hover:underline font-medium" 498 > 499 AT Protocol 500 </a> 501 , the open protocol that powers apps like Bluesky. Your 502 annotations, highlights, and bookmarks are stored in your personal 503 data repository, not locked in a silo. 504 </p> 505 <ul className="space-y-3 text-sm text-surface-600 dark:text-surface-300"> 506 <li className="flex items-start gap-3"> 507 <div className="w-5 h-5 rounded-full bg-primary-100 dark:bg-primary-900/30 flex items-center justify-center flex-shrink-0 mt-0.5"> 508 <div className="w-1.5 h-1.5 rounded-full bg-primary-600 dark:bg-primary-400" /> 509 </div> 510 Sign in with your AT Protocol handle, no new account needed 511 </li> 512 <li className="flex items-start gap-3"> 513 <div className="w-5 h-5 rounded-full bg-primary-100 dark:bg-primary-900/30 flex items-center justify-center flex-shrink-0 mt-0.5"> 514 <div className="w-1.5 h-1.5 rounded-full bg-primary-600 dark:bg-primary-400" /> 515 </div> 516 Your data lives in your PDS, portable and under your control 517 </li> 518 <li className="flex items-start gap-3"> 519 <div className="w-5 h-5 rounded-full bg-primary-100 dark:bg-primary-900/30 flex items-center justify-center flex-shrink-0 mt-0.5"> 520 <div className="w-1.5 h-1.5 rounded-full bg-primary-600 dark:bg-primary-400" /> 521 </div> 522 Custom Lexicon schemas for annotations, highlights, collections 523 & more 524 </li> 525 <li className="flex items-start gap-3"> 526 <div className="w-5 h-5 rounded-full bg-primary-100 dark:bg-primary-900/30 flex items-center justify-center flex-shrink-0 mt-0.5"> 527 <div className="w-1.5 h-1.5 rounded-full bg-primary-600 dark:bg-primary-400" /> 528 </div> 529 Fully open source, check out the code and contribute 530 </li> 531 </ul> 532 </div> 533 534 <div className="rounded-2xl bg-surface-900 dark:bg-surface-950 p-5 text-sm font-mono shadow-xl border border-surface-800 dark:border-surface-800"> 535 <div className="flex items-center gap-2 mb-4"> 536 <div className="text-xs text-surface-500">lexicon</div> 537 <div className="text-xs text-primary-400 px-2 py-0.5 rounded bg-primary-400/10"> 538 at.margin.annotation 539 </div> 540 </div> 541 <div className="space-y-1 text-[13px] leading-relaxed"> 542 <span className="text-surface-500">{"{"}</span> 543 <div className="pl-4"> 544 <span className="text-green-400">"type"</span> 545 <span className="text-surface-400">: </span> 546 <span className="text-amber-400">"record"</span> 547 <span className="text-surface-400">,</span> 548 </div> 549 <div className="pl-4"> 550 <span className="text-green-400">"record"</span> 551 <span className="text-surface-400">: {"{"}</span> 552 </div> 553 <div className="pl-8"> 554 <span className="text-green-400">"body"</span> 555 <span className="text-surface-400">: </span> 556 <span className="text-amber-400">"Great insight..."</span> 557 <span className="text-surface-400">,</span> 558 </div> 559 <div className="pl-8"> 560 <span className="text-green-400">"target"</span> 561 <span className="text-surface-400">: {"{"}</span> 562 </div> 563 <div className="pl-12"> 564 <span className="text-green-400">"source"</span> 565 <span className="text-surface-400">: </span> 566 <span className="text-sky-400">"https://..."</span> 567 <span className="text-surface-400">,</span> 568 </div> 569 <div className="pl-12"> 570 <span className="text-green-400">"selector"</span> 571 <span className="text-surface-400">: {"{"}</span> 572 </div> 573 <div className="pl-16"> 574 <span className="text-green-400">"exact"</span> 575 <span className="text-surface-400">: </span> 576 <span className="text-amber-400">"selected text"</span> 577 </div> 578 <div className="pl-12"> 579 <span className="text-surface-400">{"}"}</span> 580 </div> 581 <div className="pl-8"> 582 <span className="text-surface-400">{"}"}</span> 583 </div> 584 <div className="pl-4"> 585 <span className="text-surface-400">{"}"}</span> 586 </div> 587 <span className="text-surface-500">{"}"}</span> 588 </div> 589 </div> 590 </div> 591 </section> 592 593 <section className="border-t border-surface-200/60 dark:border-surface-800/60"> 594 <div className="max-w-5xl mx-auto px-6 py-20 md:py-24 text-center"> 595 <h2 className="font-display text-2xl md:text-3xl font-bold tracking-tight text-surface-900 dark:text-white mb-4"> 596 Start writing on the margins 597 </h2> 598 <p className="text-surface-500 dark:text-surface-400 max-w-lg mx-auto mb-8"> 599 Join the open annotation layer. Sign in with your AT Protocol 600 identity and install the extension to get started. 601 </p> 602 <div className="flex flex-col sm:flex-row items-center justify-center gap-3"> 603 <Link 604 to={user ? "/home" : "/login"} 605 className="inline-flex items-center gap-2 px-7 py-3 bg-primary-600 hover:bg-primary-700 dark:bg-primary-500 dark:hover:bg-primary-400 text-white rounded-xl font-semibold transition-colors" 606 > 607 {user ? "Open App" : "Sign in"} 608 <ArrowRight size={16} /> 609 </Link> 610 <a 611 href="https://github.com/margin-at" 612 target="_blank" 613 rel="noreferrer" 614 className="inline-flex items-center gap-2 px-7 py-3 text-surface-600 dark:text-surface-300 hover:text-surface-900 dark:hover:text-white transition-colors font-medium" 615 > 616 <Github size={16} /> 617 View on GitHub 618 </a> 619 <a 620 href="https://tangled.org/margin.at/margin" 621 target="_blank" 622 rel="noreferrer" 623 className="inline-flex items-center gap-2 px-7 py-3 text-surface-600 dark:text-surface-300 hover:text-surface-900 dark:hover:text-white transition-colors font-medium" 624 > 625 <TangledIcon size={16} /> 626 View on Tangled 627 </a> 628 </div> 629 <div className="mt-10 flex items-center gap-5 flex-wrap justify-center"> 630 <a 631 href="https://ko-fi.com/scan" 632 target="_blank" 633 rel="noopener noreferrer" 634 className="inline-flex items-center gap-2 text-surface-500 dark:text-surface-400 hover:text-[#FF5E5B] dark:hover:text-[#FF5E5B] transition-colors font-medium" 635 > 636 <Coffee size={16} /> 637 Ko-fi 638 </a> 639 </div> 640 </div> 641 </section> 642 643 <footer className="border-t border-surface-200/60 dark:border-surface-800/60"> 644 <div className="max-w-5xl mx-auto px-6 py-8"> 645 <div className="flex flex-col sm:flex-row items-center justify-between gap-4"> 646 <div className="flex items-center gap-2.5"> 647 <img 648 src="/logo.svg" 649 alt="Margin" 650 className="w-5 h-5 opacity-60" 651 /> 652 <span className="text-sm text-surface-400 dark:text-surface-500"> 653 © 2026 Margin 654 </span> 655 </div> 656 <div className="flex items-center gap-5 text-sm text-surface-400 dark:text-surface-500"> 657 {user && ( 658 <Link 659 to="/home" 660 className="hover:text-surface-600 dark:hover:text-surface-300 transition-colors" 661 > 662 Feed 663 </Link> 664 )} 665 <a 666 href="/privacy" 667 className="hover:text-surface-600 dark:hover:text-surface-300 transition-colors" 668 > 669 Privacy 670 </a> 671 <a 672 href="/terms" 673 className="hover:text-surface-600 dark:hover:text-surface-300 transition-colors" 674 > 675 Terms 676 </a> 677 <a 678 href="https://github.com/margin-at" 679 target="_blank" 680 rel="noreferrer" 681 className="hover:text-surface-600 dark:hover:text-surface-300 transition-colors" 682 > 683 GitHub 684 </a> 685 <a 686 href="https://tangled.org/margin.at/margin" 687 target="_blank" 688 rel="noreferrer" 689 className="hover:text-surface-600 dark:hover:text-surface-300 transition-colors" 690 > 691 Tangled 692 </a> 693 <a 694 href="mailto:hello@margin.at" 695 className="hover:text-surface-600 dark:hover:text-surface-300 transition-colors" 696 > 697 Contact 698 </a> 699 <div className="w-px h-4 bg-surface-200 dark:bg-surface-700 ml-1" /> 700 <button 701 onClick={cycleTheme} 702 title={ 703 theme === "light" 704 ? "Light mode" 705 : theme === "dark" 706 ? "Dark mode" 707 : "System theme" 708 } 709 className="flex items-center gap-1.5 hover:text-surface-600 dark:hover:text-surface-300 transition-colors" 710 > 711 {theme === "light" ? ( 712 <Sun size={15} /> 713 ) : theme === "dark" ? ( 714 <Moon size={15} /> 715 ) : ( 716 <Monitor size={15} /> 717 )} 718 <span className="hidden sm:inline capitalize">{theme}</span> 719 </button> 720 </div> 721 </div> 722 </div> 723 </footer> 724 </div> 725 ); 726}