diff --git a/_site/styles.css b/_site/styles.css index 4ce11a18a..4fa18ba33 100644 --- a/_site/styles.css +++ b/_site/styles.css @@ -2,6 +2,38 @@ locks body scroll and the scrollbar disappears. react-remove-scroll compensates with margin-right on body, but that double-compensates when the gutter is already reserved — zero it out. */ +/* Hero cards on the home page */ +.ch-hero-card { + transition: background-color 0.12s ease, border-color 0.12s ease !important; +} +.dark .ch-hero-card { + background-color: #191919 !important; + border-color: #2B2B2B !important; +} +.ch-hero-card:hover { + background-color: #f0f0f0 !important; + border-color: #d1d5db !important; +} +.dark .ch-hero-card:hover { + background-color: #272727 !important; + border-color: #535353 !important; +} +/* Use case section dividers */ +.ch-usecase-divider { + border: none !important; + border-top: 1px solid #e5e7eb !important; +} +.dark .ch-usecase-divider { + border-top-color: #2B2B2B !important; +} +/* Use case card arrows */ +.ch-usecase-arrow { + color: #000000; +} +.dark .ch-usecase-arrow { + color: #FCFF74; +} + html { scrollbar-gutter: stable; } diff --git a/es/index.mdx b/es/index.mdx index 61a136d2a..7b0304490 100644 --- a/es/index.mdx +++ b/es/index.mdx @@ -44,7 +44,34 @@ export const ButtonGroup = ({options = [], selected, onClick, fillWidth = false, ); } -export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, href, links, icon }) => { +export const FullWidthDivider = ({ style }) => { + const ref = useRef(null); + useEffect(() => { + if (!ref.current) return; + const el = ref.current; + const update = () => { + requestAnimationFrame(() => { + el.style.marginLeft = ''; + el.style.width = ''; + const elRect = el.getBoundingClientRect(); + const sidebar = document.getElementById('sidebar'); + const sidebarRect = sidebar?.getBoundingClientRect(); + const leftEdge = (sidebarRect && sidebarRect.width > 0) ? sidebarRect.right : 0; + const rightEdge = document.documentElement.clientWidth; + const ml = Math.max(0, elRect.left - leftEdge); + const mr = Math.max(0, rightEdge - elRect.right); + el.style.marginLeft = `-${ml}px`; + el.style.width = `calc(100% + ${ml + mr}px)`; + }); + }; + update(); + window.addEventListener('resize', update); + return () => window.removeEventListener('resize', update); + }, []); + return
; +}; + +export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, body, href, links, icon, showArrow, arrowBottom, extraStyle }) => { const [isDark, setIsDark] = useState(false); useEffect(() => { @@ -68,7 +95,10 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc border: isDark ? '1px solid #3c3c3c' : '1px solid #e5e7eb', display: 'block', textDecoration: 'none', - color: 'inherit' + color: 'inherit', + position: 'relative', + overflow: 'hidden', + transition: 'background-color 0.12s ease, border-color 0.12s ease' }; const content = ( @@ -107,7 +137,7 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc )}

{title}

- {description} + {body ? body : ( + {description} + )} {links && links.length > 0 && ( )} + {showArrow && ( +
+ + + +
+ )} ); if (links && links.length > 0) { - return
{content}
; + return
{content}
; } - return {content}; + return { e.preventDefault(); window.location.href = href; }}>{content}; }; {/* @@ -186,8 +225,7 @@ export const ContentSwitcher = () => {

{selected === 'goal' && 'Explore by goal'} - {selected === 'usecase' && 'Explore by use case'} - {selected === 'product' && 'Explore by product area'} + {selected === 'product' && 'Explore by product area'}

{ {showUsecase && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by use case

-
- )} -
+ +

Explore by use case

+

Discover how ClickHouse powers real-time analytics, observability, data warehousing, and agentic AI at any scale.

+
{ href="/get-started/use_cases/real-time-analytics" /> { {showProduct && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by product area

-
- )}
{ title="Agentic Data Stack" description="The open-source stack for agentic analytics. Your chat, your models, your data. Powered by ClickHouse, LibreChat and Langfuse." href="/products/agentic-data-stack/overview" + showArrow />
diff --git a/index.mdx b/index.mdx index 13e3afa12..3951d1a73 100644 --- a/index.mdx +++ b/index.mdx @@ -42,10 +42,36 @@ export const ButtonGroup = ({options = [], selected, onClick, fillWidth = false, ); } -export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, href, links, icon }) => { - const darkFilename = darkFilenameProp || (filename ? filename.replace('-light.', '-dark.') : null); +export const FullWidthDivider = ({ style }) => { + const ref = useRef(null); + useEffect(() => { + if (!ref.current) return; + const el = ref.current; + const update = () => { + requestAnimationFrame(() => { + el.style.marginLeft = ''; + el.style.width = ''; + const elRect = el.getBoundingClientRect(); + const sidebar = document.getElementById('sidebar'); + const sidebarRect = sidebar?.getBoundingClientRect(); + const leftEdge = (sidebarRect && sidebarRect.width > 0) ? sidebarRect.right : 0; + const rightEdge = document.documentElement.clientWidth; + const ml = Math.max(0, elRect.left - leftEdge); + const mr = Math.max(0, rightEdge - elRect.right); + el.style.marginLeft = `-${ml}px`; + el.style.width = `calc(100% + ${ml + mr}px)`; + }); + }; + update(); + window.addEventListener('resize', update); + return () => window.removeEventListener('resize', update); + }, []); + return
; +}; - const cardClassName = "ch-hero-card block p-4 rounded-lg no-underline bg-[#f9f9f9] border border-[#e5e7eb]"; +export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, body, href, links, icon, showArrow, arrowBottom, extraStyle }) => { + const darkFilename = darkFilenameProp || (filename ? filename.replace('-light.', '-dark.') : null); + const cardClassName = `ch-hero-card ${arrowBottom ? 'flex flex-col' : 'block'} p-4 rounded-lg no-underline bg-[#f9f9f9] border border-[#e5e7eb]`; const content = ( <> @@ -53,7 +79,7 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc
{icon}
- ) : ( + ) : filename ? ( <> - )} + ) : null}

{title}

- {description} + {body ? body : ( + {description} + )} {links && links.length > 0 && (
    {links.map((link, index) => ( @@ -120,14 +148,24 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc ))}
)} + {showArrow && ( + <> + {arrowBottom &&
} +
+ + + +
+ + )} ); if (links && links.length > 0) { - return
{content}
; + return
{content}
; } - return { e.preventDefault(); window.location.href = href; }}>{content}; + return { e.preventDefault(); window.location.href = href; }}>{content}; }; @@ -232,7 +270,7 @@ export const ContentSwitcher = () => {

{selected === 'goal' && 'Explore by goal'} - {selected === 'usecase' && 'Explore by use case'} + {selected === 'product' && 'Explore by product area'}

{ {showUsecase && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by use case

-
- )} -
+ +

Explore by use case

+

Discover how ClickHouse powers real-time analytics, observability, data warehousing, and agentic AI at any scale.

+
+ )} {showProduct && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by product area

+

Explore by product

+

Browse ClickHouse products and integrations, from the managed cloud service to open source projects.

+
+ {/* Row 1: ClickHouse Cloud (col-span-2) + 3 stacked cards (col-span-1) */} +
+
+ +

+ This section shows how ClickHouse makes data warehousing fast, simple, and predictable. Instead of wrestling with fragile pipelines and slow query engines, you centralize data from your apps, services, and tools in minutes, not weeks. From there, you can power real-time dashboards, trigger alerts, analyze historical trends, and build event-driven products on top of the same platform. +

+ } + links={[ + { label: "How to ingest data from common sources with minimal work", href: "/integrations" }, + { label: "Best practices for organizing data for analytics and growth", href: "/data-modeling/schema-design" }, + { label: "Ways to query large datasets in real time", href: "/get-started/use-cases/real-time-analytics" }, + { label: "How to build dashboards, alerts, and event-driven features on top", href: "/get-started/use-cases/data-warehousing" }, + { label: "Tips to keep costs low while performance stays high", href: "/operations/best-practices" }, + ]} + /> +
+
+ + + +
+
+ {/* Row 2: 3 equal cards */} +
+ + +
- )} -
- - - - - - -
+ )} -
-

Set up docs MCP server

-

Query the ClickHouse documentation directly from your AI tools using the Model Context Protocol.

- +
+

Set up docs MCP server

+

Query the ClickHouse documentation directly from your AI tools using the Model Context Protocol.

+
); diff --git a/ja/index.mdx b/ja/index.mdx index 61a136d2a..7b0304490 100644 --- a/ja/index.mdx +++ b/ja/index.mdx @@ -44,7 +44,34 @@ export const ButtonGroup = ({options = [], selected, onClick, fillWidth = false, ); } -export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, href, links, icon }) => { +export const FullWidthDivider = ({ style }) => { + const ref = useRef(null); + useEffect(() => { + if (!ref.current) return; + const el = ref.current; + const update = () => { + requestAnimationFrame(() => { + el.style.marginLeft = ''; + el.style.width = ''; + const elRect = el.getBoundingClientRect(); + const sidebar = document.getElementById('sidebar'); + const sidebarRect = sidebar?.getBoundingClientRect(); + const leftEdge = (sidebarRect && sidebarRect.width > 0) ? sidebarRect.right : 0; + const rightEdge = document.documentElement.clientWidth; + const ml = Math.max(0, elRect.left - leftEdge); + const mr = Math.max(0, rightEdge - elRect.right); + el.style.marginLeft = `-${ml}px`; + el.style.width = `calc(100% + ${ml + mr}px)`; + }); + }; + update(); + window.addEventListener('resize', update); + return () => window.removeEventListener('resize', update); + }, []); + return
; +}; + +export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, body, href, links, icon, showArrow, arrowBottom, extraStyle }) => { const [isDark, setIsDark] = useState(false); useEffect(() => { @@ -68,7 +95,10 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc border: isDark ? '1px solid #3c3c3c' : '1px solid #e5e7eb', display: 'block', textDecoration: 'none', - color: 'inherit' + color: 'inherit', + position: 'relative', + overflow: 'hidden', + transition: 'background-color 0.12s ease, border-color 0.12s ease' }; const content = ( @@ -107,7 +137,7 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc )}

{title}

- {description} + {body ? body : ( + {description} + )} {links && links.length > 0 && (
    {links.map((link, index) => ( @@ -145,14 +177,21 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc ))}
)} + {showArrow && ( +
+ + + +
+ )} ); if (links && links.length > 0) { - return
{content}
; + return
{content}
; } - return {content}; + return { e.preventDefault(); window.location.href = href; }}>{content}; }; {/* @@ -186,8 +225,7 @@ export const ContentSwitcher = () => {

{selected === 'goal' && 'Explore by goal'} - {selected === 'usecase' && 'Explore by use case'} - {selected === 'product' && 'Explore by product area'} + {selected === 'product' && 'Explore by product area'}

{ {showUsecase && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by use case

-
- )} -
+ +

Explore by use case

+

Discover how ClickHouse powers real-time analytics, observability, data warehousing, and agentic AI at any scale.

+
{ href="/get-started/use_cases/real-time-analytics" /> { {showProduct && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by product area

-
- )}
{ title="Agentic Data Stack" description="The open-source stack for agentic analytics. Your chat, your models, your data. Powered by ClickHouse, LibreChat and Langfuse." href="/products/agentic-data-stack/overview" + showArrow />
diff --git a/ko/index.mdx b/ko/index.mdx index 61a136d2a..7b0304490 100644 --- a/ko/index.mdx +++ b/ko/index.mdx @@ -44,7 +44,34 @@ export const ButtonGroup = ({options = [], selected, onClick, fillWidth = false, ); } -export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, href, links, icon }) => { +export const FullWidthDivider = ({ style }) => { + const ref = useRef(null); + useEffect(() => { + if (!ref.current) return; + const el = ref.current; + const update = () => { + requestAnimationFrame(() => { + el.style.marginLeft = ''; + el.style.width = ''; + const elRect = el.getBoundingClientRect(); + const sidebar = document.getElementById('sidebar'); + const sidebarRect = sidebar?.getBoundingClientRect(); + const leftEdge = (sidebarRect && sidebarRect.width > 0) ? sidebarRect.right : 0; + const rightEdge = document.documentElement.clientWidth; + const ml = Math.max(0, elRect.left - leftEdge); + const mr = Math.max(0, rightEdge - elRect.right); + el.style.marginLeft = `-${ml}px`; + el.style.width = `calc(100% + ${ml + mr}px)`; + }); + }; + update(); + window.addEventListener('resize', update); + return () => window.removeEventListener('resize', update); + }, []); + return
; +}; + +export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, body, href, links, icon, showArrow, arrowBottom, extraStyle }) => { const [isDark, setIsDark] = useState(false); useEffect(() => { @@ -68,7 +95,10 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc border: isDark ? '1px solid #3c3c3c' : '1px solid #e5e7eb', display: 'block', textDecoration: 'none', - color: 'inherit' + color: 'inherit', + position: 'relative', + overflow: 'hidden', + transition: 'background-color 0.12s ease, border-color 0.12s ease' }; const content = ( @@ -107,7 +137,7 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc )}

{title}

- {description} + {body ? body : ( + {description} + )} {links && links.length > 0 && (
    {links.map((link, index) => ( @@ -145,14 +177,21 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc ))}
)} + {showArrow && ( +
+ + + +
+ )} ); if (links && links.length > 0) { - return
{content}
; + return
{content}
; } - return {content}; + return { e.preventDefault(); window.location.href = href; }}>{content}; }; {/* @@ -186,8 +225,7 @@ export const ContentSwitcher = () => {

{selected === 'goal' && 'Explore by goal'} - {selected === 'usecase' && 'Explore by use case'} - {selected === 'product' && 'Explore by product area'} + {selected === 'product' && 'Explore by product area'}

{ {showUsecase && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by use case

-
- )} -
+ +

Explore by use case

+

Discover how ClickHouse powers real-time analytics, observability, data warehousing, and agentic AI at any scale.

+
{ href="/get-started/use_cases/real-time-analytics" /> { {showProduct && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by product area

-
- )}
{ title="Agentic Data Stack" description="The open-source stack for agentic analytics. Your chat, your models, your data. Powered by ClickHouse, LibreChat and Langfuse." href="/products/agentic-data-stack/overview" + showArrow />
diff --git a/pt-br/index.mdx b/pt-br/index.mdx index 61a136d2a..7b0304490 100644 --- a/pt-br/index.mdx +++ b/pt-br/index.mdx @@ -44,7 +44,34 @@ export const ButtonGroup = ({options = [], selected, onClick, fillWidth = false, ); } -export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, href, links, icon }) => { +export const FullWidthDivider = ({ style }) => { + const ref = useRef(null); + useEffect(() => { + if (!ref.current) return; + const el = ref.current; + const update = () => { + requestAnimationFrame(() => { + el.style.marginLeft = ''; + el.style.width = ''; + const elRect = el.getBoundingClientRect(); + const sidebar = document.getElementById('sidebar'); + const sidebarRect = sidebar?.getBoundingClientRect(); + const leftEdge = (sidebarRect && sidebarRect.width > 0) ? sidebarRect.right : 0; + const rightEdge = document.documentElement.clientWidth; + const ml = Math.max(0, elRect.left - leftEdge); + const mr = Math.max(0, rightEdge - elRect.right); + el.style.marginLeft = `-${ml}px`; + el.style.width = `calc(100% + ${ml + mr}px)`; + }); + }; + update(); + window.addEventListener('resize', update); + return () => window.removeEventListener('resize', update); + }, []); + return
; +}; + +export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, body, href, links, icon, showArrow, arrowBottom, extraStyle }) => { const [isDark, setIsDark] = useState(false); useEffect(() => { @@ -68,7 +95,10 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc border: isDark ? '1px solid #3c3c3c' : '1px solid #e5e7eb', display: 'block', textDecoration: 'none', - color: 'inherit' + color: 'inherit', + position: 'relative', + overflow: 'hidden', + transition: 'background-color 0.12s ease, border-color 0.12s ease' }; const content = ( @@ -107,7 +137,7 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc )}

{title}

- {description} + {body ? body : ( + {description} + )} {links && links.length > 0 && (
    {links.map((link, index) => ( @@ -145,14 +177,21 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc ))}
)} + {showArrow && ( +
+ + + +
+ )} ); if (links && links.length > 0) { - return
{content}
; + return
{content}
; } - return {content}; + return { e.preventDefault(); window.location.href = href; }}>{content}; }; {/* @@ -186,8 +225,7 @@ export const ContentSwitcher = () => {

{selected === 'goal' && 'Explore by goal'} - {selected === 'usecase' && 'Explore by use case'} - {selected === 'product' && 'Explore by product area'} + {selected === 'product' && 'Explore by product area'}

{ {showUsecase && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by use case

-
- )} -
+ +

Explore by use case

+

Discover how ClickHouse powers real-time analytics, observability, data warehousing, and agentic AI at any scale.

+
{ href="/get-started/use_cases/real-time-analytics" /> { {showProduct && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by product area

-
- )}
{ title="Agentic Data Stack" description="The open-source stack for agentic analytics. Your chat, your models, your data. Powered by ClickHouse, LibreChat and Langfuse." href="/products/agentic-data-stack/overview" + showArrow />
diff --git a/ru/index.mdx b/ru/index.mdx index 61a136d2a..7b0304490 100644 --- a/ru/index.mdx +++ b/ru/index.mdx @@ -44,7 +44,34 @@ export const ButtonGroup = ({options = [], selected, onClick, fillWidth = false, ); } -export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, href, links, icon }) => { +export const FullWidthDivider = ({ style }) => { + const ref = useRef(null); + useEffect(() => { + if (!ref.current) return; + const el = ref.current; + const update = () => { + requestAnimationFrame(() => { + el.style.marginLeft = ''; + el.style.width = ''; + const elRect = el.getBoundingClientRect(); + const sidebar = document.getElementById('sidebar'); + const sidebarRect = sidebar?.getBoundingClientRect(); + const leftEdge = (sidebarRect && sidebarRect.width > 0) ? sidebarRect.right : 0; + const rightEdge = document.documentElement.clientWidth; + const ml = Math.max(0, elRect.left - leftEdge); + const mr = Math.max(0, rightEdge - elRect.right); + el.style.marginLeft = `-${ml}px`; + el.style.width = `calc(100% + ${ml + mr}px)`; + }); + }; + update(); + window.addEventListener('resize', update); + return () => window.removeEventListener('resize', update); + }, []); + return
; +}; + +export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, body, href, links, icon, showArrow, arrowBottom, extraStyle }) => { const [isDark, setIsDark] = useState(false); useEffect(() => { @@ -68,7 +95,10 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc border: isDark ? '1px solid #3c3c3c' : '1px solid #e5e7eb', display: 'block', textDecoration: 'none', - color: 'inherit' + color: 'inherit', + position: 'relative', + overflow: 'hidden', + transition: 'background-color 0.12s ease, border-color 0.12s ease' }; const content = ( @@ -107,7 +137,7 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc )}

{title}

- {description} + {body ? body : ( + {description} + )} {links && links.length > 0 && (
    {links.map((link, index) => ( @@ -145,14 +177,21 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc ))}
)} + {showArrow && ( +
+ + + +
+ )} ); if (links && links.length > 0) { - return
{content}
; + return
{content}
; } - return {content}; + return { e.preventDefault(); window.location.href = href; }}>{content}; }; {/* @@ -186,8 +225,7 @@ export const ContentSwitcher = () => {

{selected === 'goal' && 'Explore by goal'} - {selected === 'usecase' && 'Explore by use case'} - {selected === 'product' && 'Explore by product area'} + {selected === 'product' && 'Explore by product area'}

{ {showUsecase && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by use case

-
- )} -
+ +

Explore by use case

+

Discover how ClickHouse powers real-time analytics, observability, data warehousing, and agentic AI at any scale.

+
{ href="/get-started/use_cases/real-time-analytics" /> { {showProduct && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by product area

-
- )}
{ title="Agentic Data Stack" description="The open-source stack for agentic analytics. Your chat, your models, your data. Powered by ClickHouse, LibreChat and Langfuse." href="/products/agentic-data-stack/overview" + showArrow />
diff --git a/zh/index.mdx b/zh/index.mdx index 61a136d2a..7b0304490 100644 --- a/zh/index.mdx +++ b/zh/index.mdx @@ -44,7 +44,34 @@ export const ButtonGroup = ({options = [], selected, onClick, fillWidth = false, ); } -export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, href, links, icon }) => { +export const FullWidthDivider = ({ style }) => { + const ref = useRef(null); + useEffect(() => { + if (!ref.current) return; + const el = ref.current; + const update = () => { + requestAnimationFrame(() => { + el.style.marginLeft = ''; + el.style.width = ''; + const elRect = el.getBoundingClientRect(); + const sidebar = document.getElementById('sidebar'); + const sidebarRect = sidebar?.getBoundingClientRect(); + const leftEdge = (sidebarRect && sidebarRect.width > 0) ? sidebarRect.right : 0; + const rightEdge = document.documentElement.clientWidth; + const ml = Math.max(0, elRect.left - leftEdge); + const mr = Math.max(0, rightEdge - elRect.right); + el.style.marginLeft = `-${ml}px`; + el.style.width = `calc(100% + ${ml + mr}px)`; + }); + }; + update(); + window.addEventListener('resize', update); + return () => window.removeEventListener('resize', update); + }, []); + return
; +}; + +export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, description, body, href, links, icon, showArrow, arrowBottom, extraStyle }) => { const [isDark, setIsDark] = useState(false); useEffect(() => { @@ -68,7 +95,10 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc border: isDark ? '1px solid #3c3c3c' : '1px solid #e5e7eb', display: 'block', textDecoration: 'none', - color: 'inherit' + color: 'inherit', + position: 'relative', + overflow: 'hidden', + transition: 'background-color 0.12s ease, border-color 0.12s ease' }; const content = ( @@ -107,7 +137,7 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc )}

{title}

- {description} + {body ? body : ( + {description} + )} {links && links.length > 0 && (
    {links.map((link, index) => ( @@ -145,14 +177,21 @@ export const HeroCard = ({ filename, darkFilename: darkFilenameProp, title, desc ))}
)} + {showArrow && ( +
+ + + +
+ )} ); if (links && links.length > 0) { - return
{content}
; + return
{content}
; } - return {content}; + return { e.preventDefault(); window.location.href = href; }}>{content}; }; {/* @@ -186,8 +225,7 @@ export const ContentSwitcher = () => {

{selected === 'goal' && 'Explore by goal'} - {selected === 'usecase' && 'Explore by use case'} - {selected === 'product' && 'Explore by product area'} + {selected === 'product' && 'Explore by product area'}

{ {showUsecase && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by use case

-
- )} -
+ +

Explore by use case

+

Discover how ClickHouse powers real-time analytics, observability, data warehousing, and agentic AI at any scale.

+
{ href="/get-started/use_cases/real-time-analytics" /> { {showProduct && ( <> - {CONTENT_MODE === 'stacked' && ( -
-

Explore by product area

-
- )}
{ title="Agentic Data Stack" description="The open-source stack for agentic analytics. Your chat, your models, your data. Powered by ClickHouse, LibreChat and Langfuse." href="/products/agentic-data-stack/overview" + showArrow />