(READ ONLY) Margin is an open annotation layer for the internet. Powered by the AT Protocol.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

new landing

+569 -453
+11 -2
web/src/components/navigation/RightSidebar.tsx
··· 1 1 import React, { useEffect, useRef, useState } from "react"; 2 - import { Search, Coffee } from "lucide-react"; 2 + import { Search, Coffee, Heart } from "lucide-react"; 3 3 import { 4 4 getTrendingTags, 5 5 searchActors, ··· 314 314 Stoat 315 315 </a> 316 316 <a 317 + href="https://opencollective.com/margin" 318 + target="_blank" 319 + rel="noopener noreferrer" 320 + className="inline-flex items-center gap-1 text-[12px] text-surface-400 dark:text-surface-500 hover:text-[#7FADF2] dark:hover:text-[#7FADF2] transition-colors" 321 + > 322 + <Heart size={12} className="shrink-0" /> 323 + Open Collective 324 + </a> 325 + <a 317 326 href="https://ko-fi.com/scan" 318 327 target="_blank" 319 328 rel="noopener noreferrer" 320 329 className="inline-flex items-center gap-1 text-[12px] text-surface-400 dark:text-surface-500 hover:text-[#FF5E5B] dark:hover:text-[#FF5E5B] transition-colors" 321 330 > 322 331 <Coffee size={12} className="shrink-0" /> 323 - Support on Ko-fi 332 + Ko-fi 324 333 </a> 325 334 <span>{t("sidebar.copyright")}</span> 326 335 </div>
+557 -449
web/src/views/About.tsx
··· 26 26 Sun, 27 27 Moon, 28 28 Monitor, 29 + Check, 30 + Lock, 29 31 } from "lucide-react"; 30 32 import { AppleIcon, TangledIcon } from "../components/common/Icons"; 31 33 import { FaFirefox, FaEdge } from "react-icons/fa"; 32 34 33 - function FeatureCard({ 34 - icon: Icon, 35 - title, 36 - description, 37 - accent = false, 38 - }: { 39 - icon: React.ElementType; 40 - title: string; 41 - description: string; 42 - accent?: boolean; 43 - }) { 44 - return ( 45 - <div 46 - className={`group p-6 rounded-2xl border transition-all duration-200 hover:-translate-y-0.5 hover:shadow-sm ${ 47 - accent 48 - ? "bg-primary-50 dark:bg-primary-950/30 border-primary-200/50 dark:border-primary-800/40" 49 - : "bg-white dark:bg-surface-800 border-surface-200/60 dark:border-surface-700/60" 50 - }`} 51 - > 52 - <div 53 - className={`w-11 h-11 rounded-xl flex items-center justify-center mb-4 transition-colors ${ 54 - accent 55 - ? "bg-primary-600 text-white" 56 - : "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" 57 - }`} 58 - > 59 - <Icon size={20} /> 60 - </div> 61 - <h3 className="font-display font-semibold text-base mb-2 text-surface-900 dark:text-white"> 62 - {title} 63 - </h3> 64 - <p className="text-sm text-surface-500 dark:text-surface-400 leading-relaxed"> 65 - {description} 66 - </p> 67 - </div> 68 - ); 69 - } 70 - 71 - function ExtensionFeature({ 72 - icon: Icon, 73 - title, 74 - description, 75 - }: { 76 - icon: React.ElementType; 77 - title: string; 78 - description: string; 79 - }) { 80 - return ( 81 - <div className="flex gap-4 items-start"> 82 - <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"> 83 - <Icon size={18} /> 84 - </div> 85 - <div> 86 - <h4 className="font-semibold text-sm text-surface-900 dark:text-white mb-1"> 87 - {title} 88 - </h4> 89 - <p className="text-sm text-surface-500 dark:text-surface-400 leading-relaxed"> 90 - {description} 91 - </p> 92 - </div> 93 - </div> 94 - ); 95 - } 96 - 97 35 export default function About() { 98 36 const { t } = useTranslation(); 99 - const theme = useStore($theme); // ensure theme is applied on this page 37 + const theme = useStore($theme); 100 38 const user = useStore($user); 101 39 102 40 const [browser] = React.useState< ··· 141 79 return () => window.removeEventListener("scroll", handleScroll); 142 80 }, []); 143 81 82 + const features = [ 83 + { 84 + icon: MessageSquareText, 85 + title: t("about.features.annotations.title"), 86 + description: t("about.features.annotations.description"), 87 + }, 88 + { 89 + icon: Highlighter, 90 + title: t("about.features.highlights.title"), 91 + description: t("about.features.highlights.description"), 92 + }, 93 + { 94 + icon: Bookmark, 95 + title: t("about.features.bookmarks.title"), 96 + description: t("about.features.bookmarks.description"), 97 + }, 98 + { 99 + icon: FolderOpen, 100 + title: t("about.features.collections.title"), 101 + description: t("about.features.collections.description"), 102 + }, 103 + { 104 + icon: Users, 105 + title: t("about.features.socialDiscovery.title"), 106 + description: t("about.features.socialDiscovery.description"), 107 + }, 108 + { 109 + icon: Hash, 110 + title: t("about.features.tagsSearch.title"), 111 + description: t("about.features.tagsSearch.description"), 112 + }, 113 + ]; 114 + 144 115 return ( 145 116 <div className="min-h-screen bg-surface-100 dark:bg-surface-900"> 146 - <nav className="sticky top-0 z-50 pt-3 pb-1 px-4 sm:px-6 mx-auto max-w-5xl"> 147 - <div 148 - className={`relative flex items-center justify-between rounded-2xl px-4 sm:px-5 transition-all duration-300 ease-out ${ 149 - isScrolled ? "h-12" : "h-14" 150 - }`} 151 - > 152 - <div 153 - className={`absolute inset-0 rounded-2xl bg-white/75 dark:bg-surface-900/75 backdrop-blur-lg border border-surface-200/40 dark:border-surface-700/40 shadow-sm transition-opacity duration-300 ease-out ${ 154 - isScrolled ? "opacity-100" : "opacity-0" 155 - }`} 156 - /> 157 - <div className="relative flex items-center gap-6"> 158 - <a 159 - href="/" 160 - className="flex items-center gap-2.5 hover:opacity-80 transition-opacity" 161 - > 162 - <img src="/logo.svg" alt="Margin" className="w-7 h-7" /> 117 + <nav 118 + className={`sticky top-0 z-50 transition-[background-color,border-color,backdrop-filter] duration-200 ease-out ${ 119 + isScrolled 120 + ? "bg-white/75 dark:bg-surface-900/75 backdrop-blur-xl border-b border-surface-200/60 dark:border-surface-800/60" 121 + : "bg-transparent border-b border-transparent" 122 + }`} 123 + > 124 + <div className="max-w-6xl mx-auto px-5 sm:px-8 h-16 flex items-center justify-between gap-4"> 125 + <div className="flex items-center gap-7"> 126 + <a href="/" className="group flex items-center gap-2.5"> 127 + <img 128 + src="/logo.svg" 129 + alt="Margin" 130 + className="w-7 h-7 transition-transform group-hover:rotate-[-4deg]" 131 + /> 163 132 <span className="font-display font-bold text-lg tracking-tight text-surface-900 dark:text-white"> 164 133 Margin 165 134 </span> 166 135 </a> 167 - <div className="hidden md:flex items-center gap-0.5"> 168 - <a 169 - href="/home" 170 - 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" 171 - > 172 - {t("nav.feed")} 173 - </a> 174 - <a 175 - href="/discover" 176 - 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" 177 - > 178 - {t("nav.discover")} 179 - </a> 180 - </div> 136 + 137 + {user && ( 138 + <div className="hidden md:flex items-center gap-5"> 139 + <a 140 + href="/home" 141 + className="text-[13px] font-medium text-surface-600 dark:text-surface-400 hover:text-surface-900 dark:hover:text-white transition-colors" 142 + > 143 + {t("nav.feed")} 144 + </a> 145 + <a 146 + href="/discover" 147 + className="text-[13px] font-medium text-surface-600 dark:text-surface-400 hover:text-surface-900 dark:hover:text-white transition-colors" 148 + > 149 + {t("nav.discover")} 150 + </a> 151 + </div> 152 + )} 181 153 </div> 182 - <div className="relative flex items-center gap-2"> 154 + 155 + <div className="flex items-center gap-1 sm:gap-2"> 183 156 {!user && ( 184 157 <a 185 158 href="/login" 186 - 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" 159 + 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" 187 160 > 188 161 {t("nav.signIn")} 189 162 </a> 190 163 )} 191 - 192 164 <a 193 165 href={extensionLink} 194 166 target="_blank" 195 167 rel="noopener noreferrer" 196 - className="inline-flex items-center gap-1.5 text-[13px] font-semibold px-3.5 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" 168 + className="group inline-flex items-center gap-1.5 text-[13px] font-semibold pl-3 pr-3.5 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" 197 169 > 198 170 <ExtensionIcon size={14} /> 199 171 <span className="hidden sm:inline"> ··· 205 177 </div> 206 178 </nav> 207 179 208 - <section className="relative overflow-hidden"> 209 - <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" /> 210 - 211 - <div className="max-w-4xl mx-auto px-6 pt-8 pb-20 md:pt-16 md:pb-28 text-center relative z-10"> 212 - <div className="flex flex-col sm:flex-row items-center justify-center gap-4 mb-10"> 213 - <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"> 214 - <div className="flex items-center -space-x-2"> 215 - <a 216 - href="https://github.com/margin-at" 217 - target="_blank" 218 - rel="noreferrer" 219 - 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" 220 - title="GitHub" 221 - > 222 - <Github size={15} /> 223 - </a> 224 - <a 225 - href="https://tangled.org/margin.at/margin" 226 - target="_blank" 227 - rel="noreferrer" 228 - 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" 229 - title="Tangled" 230 - > 231 - <TangledIcon 232 - size={16} 233 - className="text-surface-600 hover:text-surface-900 dark:text-surface-400 dark:hover:text-white transition-colors" 234 - /> 235 - </a> 236 - </div> 237 - <span className="pr-4 pl-0.5 text-[13px] font-semibold text-surface-600 dark:text-surface-300"> 238 - {t("about.hero.openSource")}{" "} 239 - <span className="text-primary-500 font-normal">✨</span> 240 - </span> 241 - </div> 242 - </div> 243 - 244 - <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"> 245 - {t("about.hero.headline")} <br className="hidden sm:block" /> 246 - <span className="text-primary-600 dark:text-primary-400"> 247 - {t("about.hero.headlineAccent")} 248 - </span> 249 - </h1> 250 - 251 - <p className="text-lg md:text-xl text-surface-500 dark:text-surface-400 max-w-2xl mx-auto leading-relaxed mb-10"> 252 - {t("about.hero.descriptionPre")}{" "} 180 + <section className="max-w-6xl mx-auto px-6 pt-16 pb-16 md:pt-24 md:pb-20"> 181 + <div className="inline-flex items-center gap-1.5 px-1 py-1 rounded-full bg-white dark:bg-surface-800 border border-surface-200 dark:border-surface-700/60 mb-8 shadow-sm"> 182 + <div className="flex items-center -space-x-1.5"> 253 183 <a 254 - href="https://atproto.com" 184 + href="https://github.com/margin-at" 255 185 target="_blank" 256 186 rel="noreferrer" 257 - 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" 187 + className="relative z-10 flex items-center justify-center w-7 h-7 rounded-full bg-surface-50 dark:bg-surface-900 text-surface-600 hover:text-surface-900 dark:text-surface-400 dark:hover:text-white border-2 border-white dark:border-surface-800 shadow-sm transition-transform hover:z-20 hover:scale-110" 188 + title="GitHub" 258 189 > 259 - {t("about.hero.atProtocol")} 190 + <Github size={13} /> 260 191 </a> 261 - {t("about.hero.descriptionPost")} 262 - </p> 263 - 264 - <div className="flex flex-col sm:flex-row items-center justify-center gap-4 mt-4"> 265 192 <a 266 - href={user ? "/home" : "/login"} 267 - 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" 193 + href="https://tangled.org/margin.at/margin" 194 + target="_blank" 195 + rel="noreferrer" 196 + className="relative z-0 flex items-center justify-center w-7 h-7 rounded-full bg-surface-50 dark:bg-surface-900 border-2 border-white dark:border-surface-800 shadow-sm transition-transform hover:z-20 hover:scale-110" 197 + title="Tangled" 268 198 > 269 - {user ? t("about.hero.openApp") : t("about.hero.getStarted")} 270 - <ArrowRight 271 - size={18} 272 - className="transition-transform group-hover:translate-x-1" 199 + <TangledIcon 200 + size={14} 201 + className="text-surface-600 dark:text-surface-400" 273 202 /> 274 203 </a> 275 - <a 276 - href={extensionLink} 277 - target="_blank" 278 - rel="noopener noreferrer" 279 - 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" 280 - > 281 - <ExtensionIcon size={18} /> 282 - {t("about.hero.installFor", { browser: extensionLabel })} 283 - </a> 284 204 </div> 205 + <span className="pr-3 pl-1 text-xs font-semibold text-surface-600 dark:text-surface-300"> 206 + {t("about.hero.openSource")} 207 + </span> 285 208 </div> 286 - </section> 287 209 288 - <section className="max-w-5xl mx-auto px-6 py-20 md:py-24"> 289 - <div className="text-center mb-12"> 290 - <h2 className="font-display text-2xl md:text-3xl font-bold tracking-tight text-surface-900 dark:text-white mb-4"> 291 - {t("about.features.title")} 292 - </h2> 293 - <p className="text-surface-500 dark:text-surface-400 max-w-xl mx-auto leading-relaxed"> 294 - {t("about.features.subtitle")} 295 - </p> 296 - </div> 210 + <h1 className="font-display text-5xl md:text-7xl lg:text-[5.5rem] font-bold tracking-tight text-surface-900 dark:text-white leading-[1.02] mb-8 max-w-4xl"> 211 + {t("about.hero.headline")} <br className="hidden sm:block" /> 212 + <span className="text-primary-600 dark:text-primary-400"> 213 + {t("about.hero.headlineAccent")} 214 + </span> 215 + </h1> 297 216 298 - <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5"> 299 - <FeatureCard 300 - icon={MessageSquareText} 301 - title={t("about.features.annotations.title")} 302 - description={t("about.features.annotations.description")} 303 - accent 304 - /> 305 - <FeatureCard 306 - icon={Highlighter} 307 - title={t("about.features.highlights.title")} 308 - description={t("about.features.highlights.description")} 309 - /> 310 - <FeatureCard 311 - icon={Bookmark} 312 - title={t("about.features.bookmarks.title")} 313 - description={t("about.features.bookmarks.description")} 314 - /> 315 - <FeatureCard 316 - icon={FolderOpen} 317 - title={t("about.features.collections.title")} 318 - description={t("about.features.collections.description")} 319 - /> 320 - <FeatureCard 321 - icon={Users} 322 - title={t("about.features.socialDiscovery.title")} 323 - description={t("about.features.socialDiscovery.description")} 324 - /> 325 - <FeatureCard 326 - icon={Hash} 327 - title={t("about.features.tagsSearch.title")} 328 - description={t("about.features.tagsSearch.description")} 329 - /> 217 + <p className="text-lg md:text-xl text-surface-500 dark:text-surface-400 max-w-2xl leading-relaxed mb-10"> 218 + {t("about.hero.descriptionPre")}{" "} 219 + <a 220 + href="https://atproto.com" 221 + target="_blank" 222 + rel="noreferrer" 223 + 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" 224 + > 225 + {t("about.hero.atProtocol")} 226 + </a> 227 + {t("about.hero.descriptionPost")} 228 + </p> 229 + 230 + <div className="flex flex-col sm:flex-row items-start gap-3"> 231 + <a 232 + href={user ? "/home" : "/login"} 233 + className="group inline-flex items-center gap-2 px-6 py-3 bg-surface-900 dark:bg-white text-white dark:text-surface-900 rounded-xl font-semibold hover:bg-surface-800 dark:hover:bg-surface-200 transition-all duration-200 text-[15px] shadow-sm" 234 + > 235 + {user ? t("about.hero.openApp") : t("about.hero.getStarted")} 236 + <ArrowRight 237 + size={16} 238 + className="transition-transform group-hover:translate-x-0.5" 239 + /> 240 + </a> 241 + <a 242 + href={extensionLink} 243 + target="_blank" 244 + rel="noopener noreferrer" 245 + className="inline-flex items-center gap-2 px-6 py-3 text-surface-700 dark:text-surface-200 hover:text-surface-900 dark:hover:text-white bg-white dark:bg-surface-800 hover:bg-surface-50 dark:hover:bg-surface-700 border border-surface-200 dark:border-surface-700 rounded-xl font-semibold transition-all duration-200 text-[15px]" 246 + > 247 + <ExtensionIcon size={16} /> 248 + {t("about.hero.installFor", { browser: extensionLabel })} 249 + </a> 330 250 </div> 331 251 </section> 332 252 333 - <section className="bg-white/50 dark:bg-surface-800/50 border-y border-surface-200/60 dark:border-surface-800/60"> 334 - <div className="max-w-5xl mx-auto px-6 py-20 md:py-24"> 335 - <div className="grid grid-cols-1 lg:grid-cols-2 gap-12 lg:gap-16 items-center"> 336 - <div> 337 - <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"> 338 - <ExtensionIcon size={13} /> 339 - {t("about.extension.badge")} 253 + <section className="max-w-6xl mx-auto px-6 pb-20 md:pb-28"> 254 + <div className="relative"> 255 + <div 256 + aria-hidden 257 + className="absolute inset-x-12 top-12 bottom-0 bg-gradient-to-b from-primary-100/40 to-transparent dark:from-primary-900/20 dark:to-transparent rounded-3xl blur-2xl" 258 + /> 259 + 260 + <div className="relative rounded-2xl border border-surface-200 dark:border-surface-700/60 bg-white dark:bg-surface-800 shadow-2xl shadow-surface-900/10 overflow-hidden"> 261 + <div className="flex items-center gap-3 px-4 py-3 border-b border-surface-100 dark:border-surface-700/60 bg-surface-50/50 dark:bg-surface-900/40"> 262 + <div className="flex gap-1.5"> 263 + <div className="w-3 h-3 rounded-full bg-red-400/70" /> 264 + <div className="w-3 h-3 rounded-full bg-yellow-400/70" /> 265 + <div className="w-3 h-3 rounded-full bg-green-400/70" /> 340 266 </div> 341 - <h2 className="font-display text-2xl md:text-3xl font-bold tracking-tight text-surface-900 dark:text-white mb-4"> 342 - {t("about.extension.title")} 343 - <br /> 344 - {t("about.extension.titleLine2")} 345 - </h2> 346 - <p className="text-surface-500 dark:text-surface-400 leading-relaxed mb-8"> 347 - {t("about.extension.description")} 348 - </p> 349 - 350 - <div className="space-y-5"> 351 - <ExtensionFeature 352 - icon={Eye} 353 - title={t("about.extension.features.inlineOverlay.title")} 354 - description={t( 355 - "about.extension.features.inlineOverlay.description", 356 - )} 357 - /> 358 - <ExtensionFeature 359 - icon={MousePointerClick} 360 - title={t("about.extension.features.contextMenu.title")} 361 - description={t( 362 - "about.extension.features.contextMenu.description", 363 - )} 364 - /> 365 - <ExtensionFeature 366 - icon={Keyboard} 367 - title={t("about.extension.features.keyboard.title")} 368 - description={t( 369 - "about.extension.features.keyboard.description", 370 - )} 371 - /> 372 - <ExtensionFeature 373 - icon={PanelRight} 374 - title={t("about.extension.features.sidePanel.title")} 375 - description={t( 376 - "about.extension.features.sidePanel.description", 377 - )} 378 - /> 267 + <div className="flex-1 max-w-md mx-auto bg-white dark:bg-surface-800 border border-surface-200 dark:border-surface-700/60 rounded-md px-3 py-1 flex items-center justify-center gap-1.5"> 268 + <Lock size={10} className="text-surface-400" /> 269 + <span className="text-[11px] font-mono text-surface-500 dark:text-surface-400 truncate"> 270 + essays.example.com/marginalia 271 + </span> 379 272 </div> 380 - 381 - <div className="flex flex-col sm:flex-row gap-3 mt-8 flex-wrap"> 382 - <a 383 - href={extensionLink} 384 - target="_blank" 385 - rel="noopener noreferrer" 386 - 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" 387 - > 388 - <ExtensionIcon size={15} /> 389 - {t("about.hero.installFor", { browser: extensionLabel })} 390 - <ExternalLink size={12} /> 391 - </a> 392 - {browser !== "chrome" && ( 393 - <a 394 - href="https://chromewebstore.google.com/detail/margin/cgpmbiiagnehkikhcbnhiagfomajncpa" 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 - <Chrome size={15} /> 400 - Chrome 401 - <ExternalLink size={12} /> 402 - </a> 403 - )} 404 - {browser !== "firefox" && ( 405 - <a 406 - href="https://addons.mozilla.org/en-US/firefox/addon/margin/" 407 - target="_blank" 408 - rel="noopener noreferrer" 409 - 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" 410 - > 411 - <FaFirefox size={15} /> 412 - Firefox 413 - <ExternalLink size={12} /> 414 - </a> 415 - )} 416 - {browser !== "edge" && ( 417 - <a 418 - href="https://microsoftedge.microsoft.com/addons/detail/margin/nfjnmllpdgcdnhmmggjihjbidmeadddn" 419 - target="_blank" 420 - rel="noopener noreferrer" 421 - 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" 422 - > 423 - <FaEdge size={15} /> 424 - Edge 425 - <ExternalLink size={12} /> 426 - </a> 427 - )} 428 - <a 429 - href="https://www.icloud.com/shortcuts/1e33ebf52f55431fae1e187cfe9738c3" 430 - target="_blank" 431 - rel="noopener noreferrer" 432 - 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" 433 - > 434 - <AppleIcon size={15} /> 435 - {t("about.extension.iosShortcut")} 436 - <ExternalLink size={12} /> 437 - </a> 273 + <div className="flex items-center gap-2 pl-2"> 274 + <img src="/logo.svg" alt="" className="w-5 h-5" /> 275 + <span className="text-[11px] font-mono font-semibold text-primary-600 dark:text-primary-400"> 276 + 3 277 + </span> 438 278 </div> 439 279 </div> 440 280 441 - <div className="relative hidden lg:block"> 442 - <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"> 443 - <div className="flex items-center gap-2 mb-4"> 444 - <div className="flex gap-1.5"> 445 - <div className="w-3 h-3 rounded-full bg-red-400/60" /> 446 - <div className="w-3 h-3 rounded-full bg-yellow-400/60" /> 447 - <div className="w-3 h-3 rounded-full bg-green-400/60" /> 448 - </div> 449 - <div className="flex-1 mx-3 bg-surface-200 dark:bg-surface-700 rounded-md h-6 flex items-center px-3"> 450 - <span className="text-[10px] text-surface-400 truncate"> 451 - example.com/article/how-to-think-clearly 452 - </span> 281 + <div className="grid grid-cols-1 md:grid-cols-[1fr_280px] gap-0 md:gap-8"> 282 + <article className="px-6 sm:px-10 py-8 md:py-10 border-b md:border-b-0 md:border-r border-surface-100 dark:border-surface-700/60"> 283 + <div className="mb-6"> 284 + <h3 className="font-display font-bold text-2xl md:text-3xl text-surface-900 dark:text-white mb-2 tracking-tight"> 285 + The Reader's Margin 286 + </h3> 287 + <div className="flex items-center gap-3 text-xs text-surface-400 dark:text-surface-500 font-mono"> 288 + <span>Lena Park</span> 289 + <span>·</span> 290 + <span>12 min</span> 453 291 </div> 454 292 </div> 455 293 456 - <div className="space-y-3 text-sm text-surface-600 dark:text-surface-300 leading-relaxed"> 457 - <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-3/4" /> 458 - <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-full" /> 459 - <div className="flex gap-0.5 flex-wrap items-center"> 460 - <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-1/4" /> 461 - <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"> 462 - The point here is that Margin is indeed 294 + <div className="space-y-2.5"> 295 + <div className="h-2.5 bg-surface-200 dark:bg-surface-700/70 rounded-full w-full" /> 296 + <div className="h-2.5 bg-surface-200 dark:bg-surface-700/70 rounded-full w-[94%]" /> 297 + <div className="h-2.5 bg-surface-200 dark:bg-surface-700/70 rounded-full w-[88%]" /> 298 + 299 + <div className="text-[15px] text-surface-700 dark:text-surface-300 leading-[1.7] py-1"> 300 + When you mark up the page,{" "} 301 + <span className="text-surface-900 dark:text-white font-medium underline decoration-yellow-400 dark:decoration-yellow-500/80 [text-decoration-thickness:2px] underline-offset-[3px] [text-decoration-skip-ink:none]"> 302 + the page begins to read you back 463 303 </span> 464 - <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-1/5" /> 304 + . 465 305 </div> 466 - <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-5/6" /> 467 - <div className="flex gap-0.5 flex-wrap items-center"> 468 - <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-2/5" /> 469 - <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"> 470 - the best thing ever 306 + 307 + <div className="h-2.5 bg-surface-200 dark:bg-surface-700/70 rounded-full w-[82%]" /> 308 + 309 + <div className="pt-3" /> 310 + 311 + <div className="h-2.5 bg-surface-200 dark:bg-surface-700/70 rounded-full w-[91%]" /> 312 + <div className="h-2.5 bg-surface-200 dark:bg-surface-700/70 rounded-full w-full" /> 313 + 314 + <div className="text-[15px] text-surface-700 dark:text-surface-300 leading-[1.7] py-1"> 315 + A note in the margin is{" "} 316 + <span className="text-surface-900 dark:text-white font-medium underline decoration-primary-500 dark:decoration-primary-400 [text-decoration-thickness:2px] underline-offset-[3px] [text-decoration-skip-ink:none]"> 317 + a conversation with the future you 318 + </span>{" "} 319 + — and now, with everyone else who reads. 320 + </div> 321 + 322 + <div className="h-2.5 bg-surface-200 dark:bg-surface-700/70 rounded-full w-[85%]" /> 323 + <div className="h-2.5 bg-surface-200 dark:bg-surface-700/70 rounded-full w-[70%]" /> 324 + 325 + <div className="pt-3" /> 326 + 327 + <div className="h-2.5 bg-surface-200 dark:bg-surface-700/70 rounded-full w-[93%]" /> 328 + <div className="text-[15px] text-surface-700 dark:text-surface-300 leading-[1.7] py-1"> 329 + The library was once shared in pencil and{" "} 330 + <span className="text-surface-900 dark:text-white font-medium underline decoration-yellow-400 dark:decoration-yellow-500/80 [text-decoration-thickness:2px] underline-offset-[3px] [text-decoration-skip-ink:none]"> 331 + whispered footnotes 471 332 </span> 472 - <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-1/4" /> 333 + . 473 334 </div> 474 - <div className="h-3 bg-surface-200 dark:bg-surface-700 rounded w-2/3" /> 335 + <div className="h-2.5 bg-surface-200 dark:bg-surface-700/70 rounded-full w-[78%]" /> 475 336 </div> 337 + </article> 476 338 477 - <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"> 478 - <div className="flex items-center gap-2 mb-2"> 479 - <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"> 480 - S 339 + <aside className="px-6 sm:px-6 py-8 md:py-10 bg-surface-50/40 dark:bg-surface-900/30"> 340 + <div className="flex items-center justify-between mb-4"> 341 + <span className="text-[10px] font-mono uppercase tracking-[0.12em] text-surface-400 dark:text-surface-500"> 342 + Annotations 343 + </span> 344 + <span className="text-[10px] font-mono text-surface-400 dark:text-surface-500"> 345 + 3 346 + </span> 347 + </div> 348 + 349 + <div className="space-y-3"> 350 + <div className="bg-white dark:bg-surface-800 rounded-lg border border-surface-200/70 dark:border-surface-700/60 p-3"> 351 + <div className="flex items-center gap-1.5 mb-2"> 352 + <div className="w-5 h-5 rounded-full bg-gradient-to-br from-primary-400 to-primary-600 flex items-center justify-center text-white text-[9px] font-bold"> 353 + S 354 + </div> 355 + <span className="text-[11px] font-semibold text-surface-700 dark:text-surface-300 truncate"> 356 + @scan.margin.cafe 357 + </span> 358 + <span className="text-[10px] text-surface-400 ml-auto font-mono shrink-0"> 359 + 2m 360 + </span> 481 361 </div> 482 - <span className="text-xs font-semibold text-surface-900 dark:text-white"> 483 - @scan.margin.cafe 484 - </span> 362 + <p className="text-[12px] text-surface-600 dark:text-surface-400 leading-snug"> 363 + this is the whole thesis tbh 364 + </p> 365 + <div className="flex items-center gap-3 mt-2 pt-2 border-t border-surface-100 dark:border-surface-700/60"> 366 + <span className="inline-flex items-center gap-1 text-[10px] text-surface-400"> 367 + <Heart size={9} /> 4 368 + </span> 369 + <span className="inline-flex items-center gap-1 text-[10px] text-surface-400"> 370 + <MessageSquareText size={9} /> 1 371 + </span> 372 + </div> 485 373 </div> 486 - <p className="text-xs text-surface-600 dark:text-surface-300 leading-relaxed"> 487 - I agree, Margin is just so good, like the other day I was 488 - drinking some of that Margin for breakfast 489 - </p> 490 - <div className="flex items-center gap-3 mt-2.5 pt-2 border-t border-surface-100 dark:border-surface-700"> 491 - <span className="text-[10px] text-surface-400 flex items-center gap-1"> 492 - <Heart size={10} /> 3 493 - </span> 494 - <span className="text-[10px] text-surface-400 flex items-center gap-1"> 495 - <MessageSquareText size={10} /> 1 496 - </span> 374 + 375 + <div className="bg-white dark:bg-surface-800 rounded-lg border border-surface-200/70 dark:border-surface-700/60 p-3"> 376 + <div className="flex items-center gap-1.5 mb-2"> 377 + <div className="w-5 h-5 rounded-full bg-gradient-to-br from-emerald-400 to-emerald-600 flex items-center justify-center text-white text-[9px] font-bold"> 378 + M 379 + </div> 380 + <span className="text-[11px] font-semibold text-surface-700 dark:text-surface-300 truncate"> 381 + @maya.margin.cafe 382 + </span> 383 + <span className="text-[10px] text-surface-400 ml-auto font-mono shrink-0"> 384 + 1h 385 + </span> 386 + </div> 387 + <p className="text-[12px] text-surface-600 dark:text-surface-400 leading-snug"> 388 + saving this for the design book 389 + </p> 390 + </div> 391 + 392 + <div className="bg-white dark:bg-surface-800 rounded-lg border border-surface-200/70 dark:border-surface-700/60 p-3"> 393 + <div className="flex items-center gap-1.5 mb-2"> 394 + <div className="w-5 h-5 rounded-full bg-surface-200 dark:bg-surface-700 flex items-center justify-center"> 395 + <Highlighter 396 + size={10} 397 + className="text-surface-500 dark:text-surface-400" 398 + /> 399 + </div> 400 + <span className="text-[11px] font-semibold text-surface-700 dark:text-surface-300"> 401 + highlight 402 + </span> 403 + <span className="text-[10px] text-surface-400 ml-auto font-mono"> 404 + 3h 405 + </span> 406 + </div> 407 + <p className="text-[12px] text-surface-500 dark:text-surface-500 italic leading-snug"> 408 + "whispered footnotes" 409 + </p> 497 410 </div> 498 411 </div> 499 - </div> 412 + </aside> 500 413 </div> 501 414 </div> 502 415 </div> 503 416 </section> 504 417 505 - <section className="max-w-5xl mx-auto px-6 py-20 md:py-24"> 506 - <div className="grid grid-cols-1 md:grid-cols-2 gap-12 items-center"> 507 - <div> 508 - <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"> 509 - <Shield size={13} /> 510 - {t("about.protocol.badge")} 511 - </div> 512 - <h2 className="font-display text-2xl md:text-3xl font-bold tracking-tight text-surface-900 dark:text-white mb-4"> 513 - {t("about.protocol.title")} 418 + <section className="border-t border-surface-200 dark:border-surface-800 bg-white dark:bg-surface-900/40"> 419 + <div className="max-w-6xl mx-auto px-6 py-24 md:py-32"> 420 + <div className="max-w-2xl mb-16 md:mb-20"> 421 + <h2 className="font-display text-4xl md:text-5xl lg:text-6xl font-bold tracking-tight text-surface-900 dark:text-white mb-5 leading-[1.05]"> 422 + {t("about.features.title")} 514 423 </h2> 515 - <p className="text-surface-500 dark:text-surface-400 leading-relaxed mb-6"> 516 - {t("about.protocol.descriptionPre")}{" "} 517 - <a 518 - href="https://atproto.com" 519 - target="_blank" 520 - rel="noreferrer" 521 - className="text-primary-600 dark:text-primary-400 hover:underline font-medium" 522 - > 523 - {t("about.hero.atProtocol")} 524 - </a> 525 - {t("about.protocol.descriptionPost")} 424 + <p className="text-lg text-surface-500 dark:text-surface-400 leading-relaxed"> 425 + {t("about.features.subtitle")} 526 426 </p> 527 - <ul className="space-y-3 text-sm text-surface-600 dark:text-surface-300"> 528 - {([0, 1, 2, 3] as const).map((i) => ( 529 - <li key={i} className="flex items-start gap-3"> 530 - <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"> 531 - <div className="w-1.5 h-1.5 rounded-full bg-primary-600 dark:bg-primary-400" /> 532 - </div> 533 - {t(`about.protocol.point${i}`)} 534 - </li> 535 - ))} 536 - </ul> 537 427 </div> 538 428 539 - <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"> 540 - <div className="flex items-center gap-2 mb-4"> 541 - <div className="text-xs text-surface-500">lexicon</div> 542 - <div className="text-xs text-primary-400 px-2 py-0.5 rounded bg-primary-400/10"> 543 - at.margin.annotation 429 + <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-x-12 gap-y-14"> 430 + {features.map((feature) => ( 431 + <div key={feature.title}> 432 + <div className="flex items-center gap-2.5 mb-3"> 433 + <feature.icon 434 + size={16} 435 + className="text-primary-500 dark:text-primary-400 flex-shrink-0" 436 + /> 437 + <h3 className="font-display font-semibold text-xl text-surface-900 dark:text-white tracking-tight"> 438 + {feature.title} 439 + </h3> 440 + </div> 441 + <p className="text-[15px] text-surface-500 dark:text-surface-400 leading-relaxed"> 442 + {feature.description} 443 + </p> 544 444 </div> 545 - </div> 546 - <div className="space-y-1 text-[13px] leading-relaxed"> 547 - <span className="text-surface-500">{"{"}</span> 548 - <div className="pl-4"> 549 - <span className="text-green-400">"type"</span> 550 - <span className="text-surface-400">: </span> 551 - <span className="text-amber-400">"record"</span> 552 - <span className="text-surface-400">,</span> 445 + ))} 446 + </div> 447 + </div> 448 + </section> 449 + 450 + <section className="border-t border-surface-200/60 dark:border-surface-800/60"> 451 + <div className="max-w-6xl mx-auto px-6 py-24 md:py-28"> 452 + <div className="grid grid-cols-1 lg:grid-cols-[1.3fr_1fr] gap-14 lg:gap-20 items-start"> 453 + <div> 454 + <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"> 455 + <ExtensionIcon size={13} /> 456 + {t("about.extension.badge")} 553 457 </div> 554 - <div className="pl-4"> 555 - <span className="text-green-400">"record"</span> 556 - <span className="text-surface-400">: {"{"}</span> 458 + <h2 className="font-display text-4xl md:text-5xl font-bold tracking-tight text-surface-900 dark:text-white mb-5 leading-[1.05]"> 459 + {t("about.extension.title")}{" "} 460 + <span className="text-surface-400 dark:text-surface-500"> 461 + {t("about.extension.titleLine2")} 462 + </span> 463 + </h2> 464 + <p className="text-lg text-surface-500 dark:text-surface-400 leading-relaxed mb-12 max-w-lg"> 465 + {t("about.extension.description")} 466 + </p> 467 + 468 + <div className="grid grid-cols-1 sm:grid-cols-2 gap-x-10 gap-y-8"> 469 + {( 470 + [ 471 + { icon: Eye, key: "inlineOverlay" }, 472 + { icon: MousePointerClick, key: "contextMenu" }, 473 + { icon: Keyboard, key: "keyboard" }, 474 + { icon: PanelRight, key: "sidePanel" }, 475 + ] as const 476 + ).map(({ icon: Icon, key }) => ( 477 + <div key={key}> 478 + <div className="flex items-center gap-2.5 mb-2"> 479 + <Icon 480 + size={15} 481 + className="text-primary-500 dark:text-primary-400" 482 + /> 483 + <h4 className="font-display font-semibold text-base text-surface-900 dark:text-white tracking-tight"> 484 + {t(`about.extension.features.${key}.title`)} 485 + </h4> 486 + </div> 487 + <p className="text-sm text-surface-500 dark:text-surface-400 leading-relaxed"> 488 + {t(`about.extension.features.${key}.description`)} 489 + </p> 490 + </div> 491 + ))} 557 492 </div> 558 - <div className="pl-8"> 559 - <span className="text-green-400">"body"</span> 560 - <span className="text-surface-400">: </span> 561 - <span className="text-amber-400">"Great insight..."</span> 562 - <span className="text-surface-400">,</span> 493 + </div> 494 + 495 + <div className="lg:sticky lg:top-24"> 496 + <div className="rounded-2xl bg-surface-50 dark:bg-surface-800/50 border border-surface-200/60 dark:border-surface-700/60 p-6"> 497 + <div className="text-[10px] font-mono uppercase tracking-[0.12em] text-surface-400 dark:text-surface-500 mb-4"> 498 + Install 499 + </div> 500 + <div className="flex flex-col gap-2"> 501 + <a 502 + href={extensionLink} 503 + target="_blank" 504 + rel="noopener noreferrer" 505 + className="inline-flex items-center justify-between gap-2 px-4 py-3 bg-surface-900 dark:bg-white text-white dark:text-surface-900 rounded-lg font-medium text-sm transition-all hover:opacity-90" 506 + > 507 + <span className="inline-flex items-center gap-2"> 508 + <ExtensionIcon size={15} /> 509 + {t("about.hero.installFor", { 510 + browser: extensionLabel, 511 + })} 512 + </span> 513 + <ExternalLink size={13} /> 514 + </a> 515 + {browser !== "chrome" && ( 516 + <a 517 + href="https://chromewebstore.google.com/detail/margin/cgpmbiiagnehkikhcbnhiagfomajncpa" 518 + target="_blank" 519 + rel="noopener noreferrer" 520 + className="inline-flex items-center justify-between gap-2 px-4 py-2.5 bg-white dark:bg-surface-800 text-surface-700 dark:text-surface-200 rounded-lg font-medium text-sm transition-all hover:bg-surface-100 dark:hover:bg-surface-700 border border-surface-200/80 dark:border-surface-700/80" 521 + > 522 + <span className="inline-flex items-center gap-2"> 523 + <Chrome size={14} /> 524 + Chrome 525 + </span> 526 + <ExternalLink size={12} /> 527 + </a> 528 + )} 529 + {browser !== "firefox" && ( 530 + <a 531 + href="https://addons.mozilla.org/en-US/firefox/addon/margin/" 532 + target="_blank" 533 + rel="noopener noreferrer" 534 + className="inline-flex items-center justify-between gap-2 px-4 py-2.5 bg-white dark:bg-surface-800 text-surface-700 dark:text-surface-200 rounded-lg font-medium text-sm transition-all hover:bg-surface-100 dark:hover:bg-surface-700 border border-surface-200/80 dark:border-surface-700/80" 535 + > 536 + <span className="inline-flex items-center gap-2"> 537 + <FaFirefox size={14} /> 538 + Firefox 539 + </span> 540 + <ExternalLink size={12} /> 541 + </a> 542 + )} 543 + {browser !== "edge" && ( 544 + <a 545 + href="https://microsoftedge.microsoft.com/addons/detail/margin/nfjnmllpdgcdnhmmggjihjbidmeadddn" 546 + target="_blank" 547 + rel="noopener noreferrer" 548 + className="inline-flex items-center justify-between gap-2 px-4 py-2.5 bg-white dark:bg-surface-800 text-surface-700 dark:text-surface-200 rounded-lg font-medium text-sm transition-all hover:bg-surface-100 dark:hover:bg-surface-700 border border-surface-200/80 dark:border-surface-700/80" 549 + > 550 + <span className="inline-flex items-center gap-2"> 551 + <FaEdge size={14} /> 552 + Edge 553 + </span> 554 + <ExternalLink size={12} /> 555 + </a> 556 + )} 557 + <a 558 + href="https://www.icloud.com/shortcuts/1e33ebf52f55431fae1e187cfe9738c3" 559 + target="_blank" 560 + rel="noopener noreferrer" 561 + className="inline-flex items-center justify-between gap-2 px-4 py-2.5 bg-white dark:bg-surface-800 text-surface-700 dark:text-surface-200 rounded-lg font-medium text-sm transition-all hover:bg-surface-100 dark:hover:bg-surface-700 border border-surface-200/80 dark:border-surface-700/80" 562 + > 563 + <span className="inline-flex items-center gap-2"> 564 + <AppleIcon size={14} /> 565 + {t("about.extension.iosShortcut")} 566 + </span> 567 + <ExternalLink size={12} /> 568 + </a> 569 + </div> 563 570 </div> 564 - <div className="pl-8"> 565 - <span className="text-green-400">"target"</span> 566 - <span className="text-surface-400">: {"{"}</span> 571 + </div> 572 + </div> 573 + </div> 574 + </section> 575 + 576 + <section className="border-t border-surface-200/60 dark:border-surface-800/60 bg-white dark:bg-surface-900/40"> 577 + <div className="max-w-6xl mx-auto px-6 py-24 md:py-32"> 578 + <div className="grid grid-cols-1 lg:grid-cols-2 gap-14 lg:gap-20 items-center"> 579 + <div> 580 + <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"> 581 + <Shield size={13} /> 582 + {t("about.protocol.badge")} 567 583 </div> 568 - <div className="pl-12"> 569 - <span className="text-green-400">"source"</span> 570 - <span className="text-surface-400">: </span> 571 - <span className="text-sky-400">"https://..."</span> 572 - <span className="text-surface-400">,</span> 584 + <h2 className="font-display text-4xl md:text-5xl font-bold tracking-tight text-surface-900 dark:text-white mb-5 leading-[1.05]"> 585 + {t("about.protocol.title")} 586 + </h2> 587 + <p className="text-lg text-surface-500 dark:text-surface-400 leading-relaxed mb-10 max-w-lg"> 588 + {t("about.protocol.descriptionPre")}{" "} 589 + <a 590 + href="https://atproto.com" 591 + target="_blank" 592 + rel="noreferrer" 593 + className="text-primary-600 dark:text-primary-400 hover:underline font-medium" 594 + > 595 + {t("about.hero.atProtocol")} 596 + </a> 597 + {t("about.protocol.descriptionPost")} 598 + </p> 599 + <ul className="space-y-4"> 600 + {([0, 1, 2, 3] as const).map((i) => ( 601 + <li key={i} className="flex items-start gap-3"> 602 + <div className="mt-0.5 flex-shrink-0 w-5 h-5 rounded-md bg-primary-100 dark:bg-primary-950/60 flex items-center justify-center"> 603 + <Check 604 + size={12} 605 + className="text-primary-600 dark:text-primary-400" 606 + strokeWidth={2.5} 607 + /> 608 + </div> 609 + <span className="text-[15px] text-surface-700 dark:text-surface-300 leading-relaxed"> 610 + {t(`about.protocol.point${i}`)} 611 + </span> 612 + </li> 613 + ))} 614 + </ul> 615 + </div> 616 + 617 + <div className="rounded-2xl bg-surface-900 dark:bg-surface-950 p-5 md:p-6 text-sm font-mono shadow-2xl shadow-surface-900/10 border border-surface-800"> 618 + <div className="flex items-center gap-2 mb-4 pb-3 border-b border-surface-800"> 619 + <div className="flex gap-1"> 620 + <div className="w-2 h-2 rounded-full bg-surface-700" /> 621 + <div className="w-2 h-2 rounded-full bg-surface-700" /> 622 + <div className="w-2 h-2 rounded-full bg-surface-700" /> 623 + </div> 624 + <div className="text-xs text-surface-500 ml-2">lexicon</div> 625 + <div className="text-xs text-primary-400 px-2 py-0.5 rounded bg-primary-400/10 ml-auto"> 626 + at.margin.note 627 + </div> 573 628 </div> 574 - <div className="pl-12"> 575 - <span className="text-green-400">"selector"</span> 576 - <span className="text-surface-400">: {"{"}</span> 577 - </div> 578 - <div className="pl-16"> 579 - <span className="text-green-400">"exact"</span> 580 - <span className="text-surface-400">: </span> 581 - <span className="text-amber-400">"selected text"</span> 582 - </div> 583 - <div className="pl-12"> 584 - <span className="text-surface-400">{"}"}</span> 629 + <div className="space-y-1 text-[13px] leading-relaxed"> 630 + <span className="text-surface-500">{"{"}</span> 631 + <div className="pl-4"> 632 + <span className="text-green-400">"$type"</span> 633 + <span className="text-surface-400">: </span> 634 + <span className="text-amber-400">"at.margin.note"</span> 635 + <span className="text-surface-400">,</span> 636 + </div> 637 + <div className="pl-4"> 638 + <span className="text-green-400">"motivation"</span> 639 + <span className="text-surface-400">: </span> 640 + <span className="text-amber-400">"highlighting"</span> 641 + <span className="text-surface-400">,</span> 642 + </div> 643 + <div className="pl-4"> 644 + <span className="text-green-400">"body"</span> 645 + <span className="text-surface-400">: {"{"}</span> 646 + </div> 647 + <div className="pl-8"> 648 + <span className="text-green-400">"value"</span> 649 + <span className="text-surface-400">: </span> 650 + <span className="text-amber-400">"Great insight..."</span> 651 + </div> 652 + <div className="pl-4"> 653 + <span className="text-surface-400">{"}"}</span> 654 + <span className="text-surface-400">,</span> 655 + </div> 656 + <div className="pl-4"> 657 + <span className="text-green-400">"target"</span> 658 + <span className="text-surface-400">: {"{"}</span> 659 + </div> 660 + <div className="pl-8"> 661 + <span className="text-green-400">"source"</span> 662 + <span className="text-surface-400">: </span> 663 + <span className="text-sky-400">"https://..."</span> 664 + <span className="text-surface-400">,</span> 665 + </div> 666 + <div className="pl-8"> 667 + <span className="text-green-400">"selector"</span> 668 + <span className="text-surface-400">: {"{"}</span> 669 + </div> 670 + <div className="pl-12"> 671 + <span className="text-green-400">"type"</span> 672 + <span className="text-surface-400">: </span> 673 + <span className="text-amber-400">"TextQuoteSelector"</span> 674 + <span className="text-surface-400">,</span> 675 + </div> 676 + <div className="pl-12"> 677 + <span className="text-green-400">"exact"</span> 678 + <span className="text-surface-400">: </span> 679 + <span className="text-amber-400">"selected text"</span> 680 + </div> 681 + <div className="pl-8"> 682 + <span className="text-surface-400">{"}"}</span> 683 + </div> 684 + <div className="pl-4"> 685 + <span className="text-surface-400">{"}"}</span> 686 + </div> 687 + <span className="text-surface-500">{"}"}</span> 585 688 </div> 586 - <div className="pl-8"> 587 - <span className="text-surface-400">{"}"}</span> 588 - </div> 589 - <div className="pl-4"> 590 - <span className="text-surface-400">{"}"}</span> 591 - </div> 592 - <span className="text-surface-500">{"}"}</span> 593 689 </div> 594 690 </div> 595 691 </div> 596 692 </section> 597 693 598 - <section className="border-t border-surface-200/60 dark:border-surface-800/60"> 599 - <div className="max-w-5xl mx-auto px-6 py-20 md:py-24 text-center"> 600 - <h2 className="font-display text-2xl md:text-3xl font-bold tracking-tight text-surface-900 dark:text-white mb-4"> 694 + <section className="bg-primary-600 dark:bg-primary-700"> 695 + <div className="max-w-6xl mx-auto px-6 py-24 md:py-32"> 696 + <h2 className="font-display text-4xl md:text-6xl lg:text-7xl font-bold text-white mb-6 max-w-3xl tracking-tight leading-[1.02]"> 601 697 {t("about.cta.title")} 602 698 </h2> 603 - <p className="text-surface-500 dark:text-surface-400 max-w-lg mx-auto mb-8"> 699 + <p className="text-primary-100 text-lg max-w-xl mb-12 leading-relaxed"> 604 700 {t("about.cta.description")} 605 701 </p> 606 - <div className="flex flex-col sm:flex-row items-center justify-center gap-3"> 702 + <div className="flex flex-col sm:flex-row items-start gap-3 flex-wrap"> 607 703 <a 608 704 href={user ? "/home" : "/login"} 609 - 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" 705 + className="group inline-flex items-center gap-2 px-7 py-3.5 bg-white text-primary-700 hover:bg-primary-50 rounded-xl font-semibold transition-colors text-[15px] shadow-lg shadow-primary-900/20" 610 706 > 611 707 {user ? t("about.hero.openApp") : t("about.cta.signIn")} 612 - <ArrowRight size={16} /> 708 + <ArrowRight 709 + size={16} 710 + className="transition-transform group-hover:translate-x-0.5" 711 + /> 613 712 </a> 614 713 <a 615 714 href="https://github.com/margin-at" 616 715 target="_blank" 617 716 rel="noreferrer" 618 - 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" 717 + className="inline-flex items-center gap-2 px-7 py-3.5 text-white/90 hover:text-white border border-white/30 hover:border-white/50 hover:bg-white/5 rounded-xl font-semibold transition-colors text-[15px]" 619 718 > 620 719 <Github size={16} /> 621 720 {t("about.cta.viewGitHub")} ··· 624 723 href="https://tangled.org/margin.at/margin" 625 724 target="_blank" 626 725 rel="noreferrer" 627 - 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" 726 + className="inline-flex items-center gap-2 px-7 py-3.5 text-white/90 hover:text-white border border-white/30 hover:border-white/50 hover:bg-white/5 rounded-xl font-semibold transition-colors text-[15px]" 628 727 > 629 728 <TangledIcon size={16} /> 630 729 {t("about.cta.viewTangled")} 631 730 </a> 632 731 </div> 633 - <div className="mt-10 flex items-center gap-5 flex-wrap justify-center"> 732 + <div className="mt-16 pt-8 border-t border-white/15 flex items-center gap-6 flex-wrap"> 634 733 <a 635 734 href="https://ko-fi.com/scan" 636 735 target="_blank" 637 736 rel="noopener noreferrer" 638 - 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" 737 + className="inline-flex items-center gap-2 text-primary-100 hover:text-white transition-colors text-sm font-medium" 639 738 > 640 - <Coffee size={16} /> 739 + <Coffee size={15} /> 641 740 Ko-fi 642 741 </a> 742 + <a 743 + href="https://opencollective.com/margin" 744 + target="_blank" 745 + rel="noopener noreferrer" 746 + className="inline-flex items-center gap-2 text-primary-100 hover:text-white transition-colors text-sm font-medium" 747 + > 748 + <Heart size={15} /> 749 + Open Collective 750 + </a> 643 751 </div> 644 752 </div> 645 753 </section> 646 754 647 755 <footer className="border-t border-surface-200/60 dark:border-surface-800/60"> 648 - <div className="max-w-5xl mx-auto px-6 py-8"> 756 + <div className="max-w-6xl mx-auto px-6 py-8"> 649 757 <div className="flex flex-col sm:flex-row items-center justify-between gap-4"> 650 758 <div className="flex items-center gap-2.5"> 651 759 <img ··· 657 765 {t("sidebar.copyright")} 658 766 </span> 659 767 </div> 660 - <div className="flex items-center gap-5 text-sm text-surface-400 dark:text-surface-500"> 768 + <div className="flex items-center gap-5 text-sm text-surface-400 dark:text-surface-500 flex-wrap"> 661 769 {user && ( 662 770 <a 663 771 href="/home"
+1 -2
web/src/views/content/AnnotationDetail.tsx
··· 153 153 : targetUri; 154 154 const parentCid = replyingTo ? replyingTo.cid : annotation.cid; 155 155 156 - if (!parentUri) 157 - throw new Error("Missing parent info"); 156 + if (!parentUri) throw new Error("Missing parent info"); 158 157 159 158 await createReply( 160 159 parentUri,