Skip to content

Commit 95e2480

Browse files
committed
feat(blocklists): redesign getting started page with path cards and comparison table
1 parent 8944c46 commit 95e2480

6 files changed

Lines changed: 158 additions & 53 deletions

File tree

crowdsec-docs/src/components/docs/PathCard/index.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export default function PathCard({ eyebrow, color, icon, title, desc, tag, tags
3939
href={href}
4040
onMouseEnter={() => setHover(true)}
4141
onMouseLeave={() => setHover(false)}
42-
className="relative p-6 rounded-[14px] overflow-hidden cursor-pointer flex flex-col no-underline min-w-0 transition-[border-color,background,box-shadow] duration-200"
42+
className="relative p-6 rounded-[14px] overflow-hidden cursor-pointer flex flex-col no-underline hover:no-underline min-w-0 transition-[border-color,background,box-shadow] duration-200"
4343
style={{
4444
color: "inherit",
4545
background: hover ? "var(--cs-surface-2)" : "var(--cs-surface)",
@@ -94,12 +94,14 @@ export default function PathCard({ eyebrow, color, icon, title, desc, tag, tags
9494
</div>
9595
)}
9696

97-
<div className="mt-5 pt-4 border-t border-dashed border-cs-border flex items-center justify-between">
98-
{audience && (
99-
<div className="font-cs-mono text-[10.5px] text-cs-ink-mute tracking-[0.06em] leading-[1.4] min-w-0 overflow-hidden">
97+
{audience && (
98+
<div className="font-cs-mono text-[10.5px] text-cs-ink-mute tracking-[0.06em] leading-[1.4] min-w-0 overflow-hidden mt-4">
10099
{audience}
101100
</div>
102101
)}
102+
103+
<div className="mt-3 pt-4 border-t border-cs-border flex items-center justify-between">
104+
103105
<div
104106
className="inline-flex items-center gap-1.5 font-semibold text-[13px] ml-auto whitespace-nowrap shrink-0 transition-[gap] duration-[160ms]"
105107
style={{ color }}

crowdsec-docs/src/css/alerts.css

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@
1212
top: 0.2rem !important;
1313
}
1414

15+
.alert .cs-admon__icon {
16+
@apply p-0.5;
17+
}
18+
1519
.alert svg {
16-
@apply !w-5 !h-5 mb-0;
20+
@apply !w-4 !h-4 mb-0;
1721
}
1822

1923
.alert--info {

crowdsec-docs/src/css/crowdsec-components.css

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -413,10 +413,6 @@ code:not(pre code):not(.cs-ic) {
413413
overflow: hidden;
414414
background: var(--cs-surface);
415415
}
416-
.cs-table-wrap table {
417-
margin: 0 !important;
418-
border: none !important;
419-
}
420416

421417
/* ── Direct table targeting (catches HTML tables too) ─────────── */
422418

@@ -515,6 +511,14 @@ article table tbody tr:hover td {
515511
background: color-mix(in srgb, var(--cs-orange) 4%, transparent) !important;
516512
}
517513

514+
/* ── Reset table styles when inside cs-table-wrap (after all general rules so this wins) */
515+
.cs-table-wrap table {
516+
margin: 0 !important;
517+
border: none !important;
518+
border-radius: 0 !important;
519+
overflow: visible !important;
520+
}
521+
518522
/* ── Pill component ─────────────────────────────────────────────── */
519523
.cs-pill {
520524
display: inline-flex;
@@ -578,6 +582,13 @@ article table tbody tr:hover td {
578582
border-bottom: 1px solid var(--cs-border) !important;
579583
margin-bottom: 0 !important;
580584
gap: 8px !important;
585+
flex-wrap: nowrap !important;
586+
overflow-x: auto !important;
587+
scrollbar-width: none !important;
588+
}
589+
590+
.tabs::-webkit-scrollbar {
591+
display: none !important;
581592
}
582593

583594
/* Individual tab items */
@@ -592,6 +603,8 @@ article table tbody tr:hover td {
592603
border-radius: 6px 6px 0 0 !important;
593604
border: none !important;
594605
border-bottom: 2px solid transparent !important;
606+
white-space: nowrap !important;
607+
flex-shrink: 0 !important;
595608
transition:
596609
color 0.12s,
597610
background 0.12s,

crowdsec-docs/src/css/crowdsec-tokens.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@
167167
}
168168

169169
.theme-doc-sidebar-item-link hr {
170-
visibility: hidden;
170+
background-color: var(--cs-border-hi) !important;
171171
margin: 0.25rem 0 !important;
172172
}
173173

crowdsec-docs/src/pages/index.tsx

Lines changed: 102 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
import { cilBarChart, cilCompass, cilGlobeAlt, cilRss, cilShieldAlt, cilSpeedometer } from "@coreui/icons";
1+
import {
2+
cilBarChart,
3+
cilCompass,
4+
cilGlobeAlt,
5+
cilRss,
6+
cilShieldAlt,
7+
cilSpeedometer,
8+
} from "@coreui/icons";
29
import { CIcon } from "@coreui/icons-react";
310
import Layout from "@theme/Layout";
411
import SearchBar from "@theme/SearchBar";
5-
import { useEffect } from "react";
12+
import React, { useEffect } from "react";
613
import GuidedSetupCard from "../components/docs/GuidedSetupCard";
714
import PathCard from "../components/docs/PathCard";
815
import PathCards from "../components/docs/PathCards";
@@ -44,11 +51,20 @@ const blocklistSteps = [
4451
title: "Create an integration endpoint",
4552
desc: "Generates a dedicated URL and credentials to serve blocklists to your perimeter devices.",
4653
},
47-
{ title: "Choose blocklists to serve", desc: "Select from curated feeds: scanners, bots, TOR exits, exploits, and more." },
48-
{ title: "Plug in as a threat feed", desc: "Point your firewall, CDN, or WAF at the endpoint. No agent to install." },
54+
{
55+
title: "Choose blocklists to serve",
56+
desc: "Select from curated feeds: scanners, bots, TOR exits, exploits, and more.",
57+
},
58+
{
59+
title: "Plug in as a threat feed",
60+
desc: "Point your firewall, CDN, or WAF at the endpoint. No agent to install.",
61+
},
4962
];
5063
const ctiSteps = [
51-
{ title: "Look up any IP in the Console", desc: "Get reputation score, behaviors, attack history, and CVE links instantly." },
64+
{
65+
title: "Look up any IP in the Console",
66+
desc: "Get reputation score, behaviors, attack history, and CVE links instantly.",
67+
},
5268
{
5369
title: "Generate a CTI API key",
5470
hint: "OPTIONAL" as const,
@@ -90,7 +106,12 @@ const alreadyRunningLinks = [
90106
];
91107

92108
const popularLinks = [
93-
{ icon: <CIcon icon={cilCompass} style={ICON_SM} aria-hidden="true" />, label: "Console", href: "/u/console/intro", color: CS_ORANGE },
109+
{
110+
icon: <CIcon icon={cilCompass} style={ICON_SM} aria-hidden="true" />,
111+
label: "Console",
112+
href: "/u/console/intro",
113+
color: CS_ORANGE,
114+
},
94115
{
95116
icon: <CIcon icon={cilShieldAlt} style={ICON_SM} aria-hidden="true" />,
96117
label: "AppSec / WAF",
@@ -114,10 +135,20 @@ export default function HomePage() {
114135
}, []);
115136

116137
return (
117-
<Layout title="Documentation" description="CrowdSec — the open-source & participative IPS">
138+
<Layout
139+
title="Documentation"
140+
description="CrowdSec — the open-source & participative IPS"
141+
>
118142
<main>
119143
{/* ── Hero ── full-width so grid bg spans the viewport ── */}
120-
<section style={{ position: "relative", padding: "92px 24px 48px", textAlign: "center", overflow: "hidden" }}>
144+
<section
145+
style={{
146+
position: "relative",
147+
padding: "92px 24px 48px",
148+
textAlign: "center",
149+
overflow: "hidden",
150+
}}
151+
>
121152
{/* Radial glow */}
122153
<div
123154
style={{
@@ -138,14 +169,17 @@ export default function HomePage() {
138169
backgroundImage:
139170
"linear-gradient(var(--cs-border-hi) 1px, transparent 1px), linear-gradient(90deg, var(--cs-border-hi) 1px, transparent 1px)",
140171
backgroundSize: "64px 64px",
141-
maskImage: "radial-gradient(ellipse 700px 320px at 50% 30%, black 30%, transparent 75%)",
172+
maskImage:
173+
"radial-gradient(ellipse 700px 320px at 50% 30%, black 30%, transparent 75%)",
142174
opacity: 0.4,
143175
pointerEvents: "none",
144176
}}
145177
aria-hidden="true"
146178
/>
147179

148-
<div style={{ position: "relative", maxWidth: 760, margin: "0 auto" }}>
180+
<div
181+
style={{ position: "relative", maxWidth: 760, margin: "0 auto" }}
182+
>
149183
{/* Badge */}
150184
<div
151185
style={{
@@ -154,8 +188,10 @@ export default function HomePage() {
154188
gap: 8,
155189
padding: "5px 12px",
156190
borderRadius: 999,
157-
background: "color-mix(in srgb, var(--cs-orange) 12%, transparent)",
158-
border: "1px solid color-mix(in srgb, var(--cs-orange) 33%, transparent)",
191+
background:
192+
"color-mix(in srgb, var(--cs-orange) 12%, transparent)",
193+
border:
194+
"1px solid color-mix(in srgb, var(--cs-orange) 33%, transparent)",
159195
marginBottom: 28,
160196
fontFamily: "var(--cs-font-mono)",
161197
fontSize: 11.5,
@@ -192,7 +228,8 @@ export default function HomePage() {
192228
<br />
193229
<span
194230
style={{
195-
background: "linear-gradient(120deg, var(--cs-ink) 30%, var(--cs-orange) 70%, var(--cs-ink))",
231+
background:
232+
"linear-gradient(120deg, var(--cs-ink) 30%, var(--cs-orange) 70%, var(--cs-ink))",
196233
WebkitBackgroundClip: "text",
197234
WebkitTextFillColor: "transparent",
198235
backgroundClip: "text",
@@ -214,18 +251,23 @@ export default function HomePage() {
214251
marginRight: "auto",
215252
}}
216253
>
217-
Three paths — one platform. Detect attacks at the edge, push curated threat feeds into your stack, or query
218-
intel on demand.
254+
Three paths — one platform. Detect attacks at the edge, push
255+
curated threat feeds into your stack, or query intel on demand.
219256
</p>
220257

221258
{/* Search */}
222-
<div className="homepage-search" style={{ marginTop: 36, maxWidth: 560, margin: "36px auto 0" }}>
259+
<div
260+
className="homepage-search"
261+
style={{ marginTop: 36, maxWidth: 560, margin: "36px auto 0" }}
262+
>
223263
<SearchBar />
224264
</div>
225265
</div>
226266
</section>
227267

228-
<div style={{ maxWidth: 1080, margin: "0 auto", padding: "0 24px 80px" }}>
268+
<div
269+
style={{ maxWidth: 1080, margin: "0 auto", padding: "0 24px 80px" }}
270+
>
229271
{/* ── "I want to…" eyebrow ── */}
230272
<div
231273
style={{
@@ -245,35 +287,53 @@ export default function HomePage() {
245287
{/* ── Path cards ── */}
246288
<PathCards>
247289
<PathCard
248-
eyebrow="01 · DETECT"
290+
// eyebrow="01 · DETECT"
249291
color={CS_ORANGE}
250-
icon={<CIcon icon={cilShieldAlt} style={{ width: 20, height: 20 }} aria-hidden="true" />}
292+
icon={
293+
<CIcon
294+
icon={cilShieldAlt}
295+
style={{ width: 20, height: 20 }}
296+
aria-hidden="true"
297+
/>
298+
}
251299
title="Detect & block attacks on my servers"
252300
desc="Identify and ban bad-behaving IPs from your logs and requests using CrowdSec Detection Scenarios and Virtual-Patching collections."
253301
tag="Security Engine"
254-
tags={["IDS", "IPS", "WAF", "CrowdSec FOSS"]}
302+
tags={["IDPS", "WAF", "CrowdSec FOSS"]}
255303
audience="Sysadmins · DevOps · SRE"
256304
href="/security-engine"
257305
/>
258306
<PathCard
259-
eyebrow="02 · PROTECT"
307+
// eyebrow="02 · PROTECT"
260308
color={CS_TEAL}
261-
icon={<CIcon icon={cilRss} style={{ width: 20, height: 20 }} aria-hidden="true" />}
309+
icon={
310+
<CIcon
311+
icon={cilRss}
312+
style={{ width: 20, height: 20 }}
313+
aria-hidden="true"
314+
/>
315+
}
262316
title="Push blocklists into my firewall, CDN or WAF"
263317
desc="Manage network-perimeter devices and want a URL to subscribe to — no agent to install, just curated feeds your equipment can pull."
264318
tag="Blocklist Endpoint"
265-
tags={["AWS", "Threat Feeds", "NGINX", "Cloudflare"]}
319+
tags={["Threat Feeds", "IOC Streams", "Deny-list"]}
266320
audience="Network · Platform teams"
267321
href="/blocklists"
268322
/>
269323
<PathCard
270-
eyebrow="03 · INVESTIGATE"
324+
// eyebrow="03 · INVESTIGATE"
271325
color={CS_VIOLET}
272-
icon={<CIcon icon={cilGlobeAlt} style={{ width: 20, height: 20 }} aria-hidden="true" />}
326+
icon={
327+
<CIcon
328+
icon={cilGlobeAlt}
329+
style={{ width: 20, height: 20 }}
330+
aria-hidden="true"
331+
/>
332+
}
273333
title="Investigate IP behaviors & enrich alerts"
274334
desc="Security analyst or developer who wants IP context, behaviors, CVEs, aggressivity… in a browser or via REST API."
275335
tag="IP Reputation & CTI"
276-
tags={["SOC", "Lookup", "Threat Intel", "API"]}
336+
tags={["IOC Lookup", "Threat Intel", "API Access"]}
277337
audience="SOC · Threat Intel"
278338
href="/u/cti_api/intro"
279339
/>
@@ -293,7 +353,9 @@ export default function HomePage() {
293353
justifyContent: "center",
294354
}}
295355
>
296-
<div style={{ height: 1, flex: 1, background: "var(--cs-border)" }} />
356+
<div
357+
style={{ height: 1, flex: 1, background: "var(--cs-border)" }}
358+
/>
297359
<div
298360
style={{
299361
fontFamily: "var(--cs-font-mono)",
@@ -306,7 +368,9 @@ export default function HomePage() {
306368
>
307369
How each path works
308370
</div>
309-
<div style={{ height: 1, flex: 1, background: "var(--cs-border)" }} />
371+
<div
372+
style={{ height: 1, flex: 1, background: "var(--cs-border)" }}
373+
/>
310374
</div>
311375

312376
<PathwayRow
@@ -315,7 +379,7 @@ export default function HomePage() {
315379
title="Detect and block malicious behaviors on your infrastructure"
316380
sub="Open-source agent that parses logs, applies scenarios, and bans IPs."
317381
steps={securityEngineSteps}
318-
ctaLabel="Get started"
382+
ctaLabel="Install CrowdSec"
319383
ctaHref="/security-engine"
320384
defaultOpen
321385
/>
@@ -325,7 +389,7 @@ export default function HomePage() {
325389
title="Push curated threat feeds directly into your firewall, CDN or WAF"
326390
sub="Subscribe via URL. Compatible with AWS, Cloudflare, NGINX, Fastly, F5, and more."
327391
steps={blocklistSteps}
328-
ctaLabel="Get started"
392+
ctaLabel="Integrate Blocklist"
329393
ctaHref="/blocklists"
330394
/>
331395
<PathwayRow
@@ -342,8 +406,14 @@ export default function HomePage() {
342406
<GuidedSetupCard
343407
title="Not sure where to start?"
344408
desc="Answer a few questions and get a recommended path with install steps for your stack."
345-
primaryCta={{ label: "Use Case Questionnaire", href: "https://start.crowdsec.net/" }}
346-
secondaryCta={{ label: "Try in Sandbox", href: "https://killercoda.com/iiamloz/scenario/crowdsec-setup" }}
409+
primaryCta={{
410+
label: "Use Case Questionnaire",
411+
href: "https://start.crowdsec.net/",
412+
}}
413+
secondaryCta={{
414+
label: "Try in Sandbox",
415+
href: "https://killercoda.com/iiamloz/scenario/crowdsec-setup",
416+
}}
347417
/>
348418

349419
{/* ── Popular docs ── */}

0 commit comments

Comments
 (0)