Website for the Lede browser extension.
1---
2import "../styles/global.css";
3
4interface Props {
5 title?: string;
6 description?: string;
7 ogUrl?: string;
8 /** Absolute URL for Open Graph / Twitter image */
9 ogImage?: string;
10}
11
12const {
13 title = "Lede — page summarizer & chat",
14 description =
15 "Lede — page summarizer & chat. Don't bury the main point—summarize and discuss any article.",
16 ogUrl = "https://lede.app",
17 ogImage,
18} = Astro.props;
19
20const resolvedOgImage = ogImage ?? `${String(ogUrl).replace(/\/$/, "")}/images/summarizer-logo.svg`;
21---
22
23<!doctype html>
24<html lang="en">
25 <head>
26 <meta charset="UTF-8" />
27 <meta name="viewport" content="width=device-width, initial-scale=1" />
28 <meta name="theme-color" content="#f4f1eb" media="(prefers-color-scheme: light)" />
29 <meta name="theme-color" content="#1c1b19" media="(prefers-color-scheme: dark)" />
30 <meta name="generator" content={Astro.generator} />
31 <title>{title}</title>
32 <meta name="description" content={description} />
33 <meta property="og:title" content={title} />
34 <meta property="og:description" content={description} />
35 <meta property="og:type" content="website" />
36 <meta property="og:url" content={ogUrl} />
37 <meta property="og:image" content={resolvedOgImage} />
38 <meta name="twitter:card" content="summary_large_image" />
39 <meta name="twitter:image" content={resolvedOgImage} />
40 <link rel="icon" href="/images/summarizer-logo.svg" type="image/svg+xml" />
41 <link rel="preconnect" href="https://fonts.googleapis.com" />
42 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
43 <link
44 href="https://fonts.googleapis.com/css2?family=Sora:wght@500;600;700&display=swap"
45 rel="stylesheet"
46 />
47 </head>
48 <body>
49 <a class="skip-link" href="#main">Skip to content</a>
50 <slot />
51 <script is:inline>
52 (function () {
53 if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
54 if (typeof CSS !== "undefined" && CSS.supports && CSS.supports("animation-timeline: view(block)")) return;
55 var nodes = document.querySelectorAll(".reveal-scroll");
56 if (!nodes.length || !("IntersectionObserver" in window)) return;
57 var io = new IntersectionObserver(
58 function (entries) {
59 entries.forEach(function (entry) {
60 if (!entry.isIntersecting) return;
61 entry.target.classList.add("reveal-scroll--visible");
62 io.unobserve(entry.target);
63 });
64 },
65 { rootMargin: "0px 0px -10% 0px", threshold: 0.06 }
66 );
67 nodes.forEach(function (el) {
68 io.observe(el);
69 });
70 })();
71 </script>
72 <script is:inline>
73 try {
74 if (typeof console !== "undefined" && console.log) {
75 console.log(
76 "%cLede%c — If you found this in the console, you already get the product.",
77 "font-weight:700;font-family:Sora,system-ui,sans-serif;color:#F15B2F",
78 "font-weight:500;color:inherit"
79 );
80 }
81 } catch (e) {}
82 </script>
83 </body>
84</html>