Skip to content

Commit ff5e633

Browse files
committed
fix: Refine design — tighten line-height, animate FAQ accordion, improve accessibility
- Reduce body text line-height from 200% to 185% across all components - Replace FAQ hidden toggle with CSS grid-rows transition for smooth accordion - Improve muted-foreground contrast (light: 42%→38%, dark: 50%→58%) - Add skip-to-content link and #main landmark on all pages - Remove mobile install panel, center GitHub/Discord buttons on mobile - Remove hero entrance animations — content renders immediately - Remove unused text-gradient-brand utility and !important overrides - Update Docs nav link to point directly to README.md - Rewrite supported technology copy to focus on stored injections and JPA
1 parent 13b31e5 commit ff5e633

12 files changed

Lines changed: 47 additions & 44 deletions

src/components/AnimatedHero.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,16 @@ export function AnimatedHero() {
3939
The open source taint analysis engine for the AI era
4040
</h1>
4141

42-
<p className="mt-5 font-mono text-[15px] leading-[200%] text-muted-foreground sm:max-w-[82%] lg:text-base lg:mt-6">
42+
<p className="mt-5 font-mono text-[15px] leading-[185%] text-muted-foreground sm:max-w-[82%] lg:text-base lg:mt-6">
4343
Formal inter-procedural taint analysis — finds what pattern matching engines miss, enacts what LLM agents discover as rules, scales where neither can alone.
4444
</p>
4545

46-
<div className="mt-8 flex gap-3 sm:hidden">
46+
<div className="mt-8 flex justify-center gap-3 sm:hidden">
4747
<a
4848
href="https://github.com/seqra/opentaint"
4949
target="_blank"
5050
rel="noopener noreferrer"
51-
className="inline-flex items-center gap-2 rounded border border-border bg-secondary/50 px-4 py-2.5 font-mono text-xs uppercase tracking-[0.14em] text-foreground/80 transition-colors hover:border-border-strong hover:text-foreground"
51+
className="inline-flex items-center gap-2 rounded border border-border bg-secondary/50 px-4 min-h-11 font-mono text-xs uppercase tracking-[0.14em] text-foreground/80 transition-colors hover:border-border-strong hover:text-foreground"
5252
>
5353
<svg role="img" viewBox="0 0 98 96" xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" fill="currentColor" aria-hidden="true">
5454
<path d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" />
@@ -59,7 +59,7 @@ export function AnimatedHero() {
5959
href="https://discord.gg/6BXDfbP4p9"
6060
target="_blank"
6161
rel="noopener noreferrer"
62-
className="inline-flex items-center gap-2 rounded border border-border bg-secondary/50 px-4 py-2.5 font-mono text-xs uppercase tracking-[0.14em] text-foreground/80 transition-colors hover:border-border-strong hover:text-foreground"
62+
className="inline-flex items-center gap-2 rounded border border-border bg-secondary/50 px-4 min-h-11 font-mono text-xs uppercase tracking-[0.14em] text-foreground/80 transition-colors hover:border-border-strong hover:text-foreground"
6363
>
6464
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" fill="currentColor" aria-hidden="true">
6565
<path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.947 2.418-2.157 2.418z" />

src/components/astro/BlogPostView.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ const formattedDate = new Date(post.date).toLocaleDateString("en-US", {
7474
</section>
7575

7676
<section class="page-section">
77-
<div class="blog-prose max-w-none break-words font-mono text-[15px] leading-[190%] text-foreground/85 lg:text-base">
77+
<div class="blog-prose max-w-none break-words font-mono text-[15px] leading-[185%] text-foreground/85 lg:text-base">
7878
<slot />
7979
</div>
8080
</section>

src/components/astro/FAQ.astro

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,26 @@ const faqItems = [
7171
</svg>
7272
<span>{item.question}</span>
7373
</button>
74-
<div id={`faq-answer-${index}`} class="hidden pb-4 pl-4 font-mono text-[15px] leading-[200%] text-muted-foreground lg:text-base lg:pb-5 lg:pl-5" data-faq-answer>
75-
{item.isContact ? (
76-
<span>
77-
Ask us on{" "}
78-
<a
79-
href="https://discord.gg/6BXDfbP4p9"
80-
target="_blank"
81-
rel="noopener noreferrer"
82-
class="text-primary underline transition-colors hover:text-foreground"
83-
>
84-
Discord
85-
</a>
86-
</span>
87-
) : (
88-
item.answer
89-
)}
74+
<div id={`faq-answer-${index}`} class="grid grid-rows-[0fr] transition-[grid-template-rows] duration-250 ease-out" data-faq-answer>
75+
<div class="overflow-hidden">
76+
<div class="pb-4 pl-4 font-mono text-[15px] leading-[185%] text-muted-foreground lg:text-base lg:pb-5 lg:pl-5">
77+
{item.isContact ? (
78+
<span>
79+
Ask us on{" "}
80+
<a
81+
href="https://discord.gg/6BXDfbP4p9"
82+
target="_blank"
83+
rel="noopener noreferrer"
84+
class="text-primary underline transition-colors hover:text-foreground"
85+
>
86+
Discord
87+
</a>
88+
</span>
89+
) : (
90+
item.answer
91+
)}
92+
</div>
93+
</div>
9094
</div>
9195
</li>
9296
))}
@@ -103,7 +107,9 @@ const faqItems = [
103107
const isOpen = btn.getAttribute("aria-expanded") === "true";
104108
const chevron = btn.querySelector("[data-faq-chevron]");
105109
btn.setAttribute("aria-expanded", String(!isOpen));
106-
answer.classList.toggle("hidden", isOpen);
110+
if (answer instanceof HTMLElement) {
111+
answer.style.gridTemplateRows = !isOpen ? "1fr" : "0fr";
112+
}
107113
item.classList.toggle("border-transparent", isOpen);
108114
item.classList.toggle("border-primary", !isOpen);
109115
if (chevron) chevron.classList.toggle("rotate-90", !isOpen);

src/components/astro/SiteHeader.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
const navItems = [
33
{ href: "/", label: "Home" },
44
{ href: "/blog", label: "Blog" },
5-
{ href: "https://github.com/seqra/opentaint/tree/main/docs", label: "Docs", external: true },
5+
{ href: "https://github.com/seqra/opentaint/blob/main/docs/README.md", label: "Docs", external: true },
66
];
77
---
88

src/components/astro/SupportedTechnology.astro

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@
1010
<img src="/pictures/gitlab-logo.svg" alt="GitLab" class="h-10 w-10 sm:h-14 sm:w-14 lg:h-16 lg:w-16" />
1111
</div>
1212

13-
<h2 class="mt-10 section-title lg:mt-12">The most thorough taint analysis engine for Spring apps</h2>
13+
<p class="section-subtitle mt-8 font-mono lg:mt-10">
14+
The most thorough taint analysis engine for Spring apps.
15+
</p>
16+
<p class="section-subtitle font-mono">
17+
Tracks taint through JPA persistence layers to catch stored injections that other tools miss.
18+
</p>
1419

1520
<h2 class="mt-10 section-title lg:mt-12">Roadmap</h2>
1621
<div class="mt-4 flex flex-wrap items-center justify-center gap-y-5 gap-x-8 sm:gap-10 lg:mt-6 lg:gap-12">

src/components/astro/WhatIsOpenTaint.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const features = [
3232

3333
<ul class="mt-8 space-y-3 lg:mt-10 lg:space-y-4">
3434
{features.map((feature) => (
35-
<li class="flex gap-3 font-mono text-[15px] leading-[200%] lg:text-base lg:gap-4">
35+
<li class="flex gap-3 font-mono text-[15px] leading-[185%] lg:text-base lg:gap-4">
3636
<span class="mt-[0.65em] h-1.5 w-1.5 shrink-0 rounded-full bg-primary" aria-hidden="true"></span>
3737
<div>
3838
<strong class="feature-title">{feature.title}</strong>

src/index.css

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
--secondary: 215 10% 94%;
2020
--secondary-foreground: 215 10% 10%;
2121
--muted: 215 10% 94%;
22-
--muted-foreground: 215 8% 42%;
22+
--muted-foreground: 215 8% 38%;
2323
--accent: 0 72% 46%;
2424
--accent-foreground: 0 0% 100%;
2525
--destructive: 12 80% 46%;
@@ -59,7 +59,7 @@
5959
--secondary: 215 8% 11%;
6060
--secondary-foreground: 215 6% 80%;
6161
--muted: 215 8% 11%;
62-
--muted-foreground: 215 6% 50%;
62+
--muted-foreground: 215 6% 58%;
6363
--accent: 0 72% 52%;
6464
--accent-foreground: 0 0% 100%;
6565
--destructive: 12 80% 50%;
@@ -219,7 +219,7 @@
219219
}
220220

221221
.section-subtitle {
222-
@apply mt-3 font-mono leading-[200%] text-muted-foreground lg:mt-4;
222+
@apply mt-3 font-mono leading-[185%] text-muted-foreground lg:mt-4;
223223
font-size: 15px;
224224
}
225225

@@ -292,16 +292,7 @@
292292
border-radius: 999px;
293293
}
294294

295-
.text-gradient-brand {
296-
background-image: linear-gradient(
297-
135deg,
298-
hsl(var(--brand)),
299-
hsl(var(--foreground))
300-
);
301-
-webkit-background-clip: text;
302-
background-clip: text;
303-
color: transparent;
304-
}
295+
305296
}
306297

307298
.expressive-code .copy .feedback {

src/layouts/BaseLayout.astro

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ const dataBlocks = Array.isArray(structuredData) ? structuredData : [structuredD
8181
))}
8282
</head>
8383
<body class="min-h-screen bg-background text-foreground antialiased">
84+
<a href="#main" class="sr-only focus:not-sr-only focus:fixed focus:top-2 focus:left-2 focus:z-[100] focus:rounded focus:bg-primary focus:px-4 focus:py-2 focus:font-mono focus:text-sm focus:text-primary-foreground">Skip to content</a>
8485
<slot />
8586
</body>
8687
</html>

src/pages/404.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import LandingFooter from "@/components/astro/LandingFooter.astro";
77
<BaseLayout title="Page not found" description="The requested page could not be found." noIndex={true}>
88
<div class="min-h-screen bg-background flex flex-col">
99
<SiteHeader />
10-
<main class="flex-1 pt-16">
10+
<main id="main" class="flex-1 pt-16">
1111
<div class="page-container">
1212
<section class="page-section flex items-center justify-center" style="min-height: calc(100vh - 4rem - 10rem);">
1313
<div class="mx-auto max-w-2xl text-center">

src/pages/blog/[slug].astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ const blogPostingSchema = {
6464
<BaseLayout title={post.title} description={post.description} canonical={post.canonicalUrl} image={`${siteConfig.url}/og/${post.slug}.png`} keywords={post.keywords} structuredData={blogPostingSchema}>
6565
<div class="min-h-screen bg-background flex flex-col">
6666
<SiteHeader />
67-
<main class="flex-1 pt-28 xl:pt-16">
67+
<main id="main" class="flex-1 pt-28 xl:pt-16">
6868
<div class="page-container min-w-0">
6969
<div class="xl:grid xl:grid-cols-[1fr_14rem] xl:gap-x-14">
7070
<div class="min-w-0">

0 commit comments

Comments
 (0)