22
33import { Download , FileText , Github , Home , Linkedin , Twitter , Youtube } from 'lucide-react'
44import { useTranslations } from 'next-intl'
5- import { useEffect , useRef , useState } from 'react'
65import ComparisonTable , { type ComparisonColumn } from '@/components/ComparisonTable'
6+ import { Breadcrumb } from '@/components/controls/Breadcrumb'
77import { AppleIcon , LinuxIcon , WindowsIcon } from '@/components/controls/PlatformIcons'
88import Footer from '@/components/Footer'
99import Header from '@/components/Header'
@@ -19,38 +19,9 @@ type Props = {
1919
2020export default function CLIComparisonPageClient ( { locale } : Props ) {
2121 const tComparison = useTranslations ( 'comparison' )
22+ const tStacks = useTranslations ( 'stacks' )
2223 const tCommunity = useTranslations ( 'community' )
2324 const t = useTranslations ( )
24- const breadcrumbRef = useRef < HTMLElement > ( null )
25- const [ isBreadcrumbFixed , setIsBreadcrumbFixed ] = useState ( false )
26- const [ breadcrumbHeight , setBreadcrumbHeight ] = useState ( 0 )
27-
28- useEffect ( ( ) => {
29- const handleScroll = ( ) => {
30- if ( ! breadcrumbRef . current ) return
31-
32- const headerHeight = 60 // Height of the site header
33- const breadcrumbTop = breadcrumbRef . current . offsetTop
34-
35- if ( window . scrollY > breadcrumbTop - headerHeight ) {
36- if ( ! isBreadcrumbFixed ) {
37- setBreadcrumbHeight ( breadcrumbRef . current . offsetHeight )
38- }
39- setIsBreadcrumbFixed ( true )
40- } else {
41- setIsBreadcrumbFixed ( false )
42- }
43- }
44-
45- window . addEventListener ( 'scroll' , handleScroll )
46- window . addEventListener ( 'resize' , handleScroll )
47- handleScroll ( )
48-
49- return ( ) => {
50- window . removeEventListener ( 'scroll' , handleScroll )
51- window . removeEventListener ( 'resize' , handleScroll )
52- }
53- } , [ isBreadcrumbFixed ] )
5425
5526 const columns : ComparisonColumn [ ] = [
5627 {
@@ -307,67 +278,19 @@ export default function CLIComparisonPageClient({ locale }: Props) {
307278 < >
308279 < Header />
309280
310- { /* Fixed Breadcrumb (when scrolled) */ }
311- { isBreadcrumbFixed && (
312- < section className = "fixed top-[60px] left-0 right-0 z-30 py-[var(--spacing-sm)] bg-[var(--color-hover)] border-b border-[var(--color-border)] shadow-sm" >
313- < div className = "max-w-8xl mx-auto px-[var(--spacing-md)]" >
314- < nav className = "flex items-center gap-[var(--spacing-xs)] text-[0.8125rem]" >
315- < Link
316- href = { `/${ locale } /ai-coding-stack` }
317- className = "text-[var(--color-text-secondary)] hover:text-[var(--color-text)] transition-colors"
318- >
319- { tComparison ( 'breadcrumb.aiCodingStack' ) }
320- </ Link >
321- < span className = "text-[var(--color-text-muted)]" > /</ span >
322- < Link
323- href = { `/${ locale } /clis` }
324- className = "text-[var(--color-text-secondary)] hover:text-[var(--color-text)] transition-colors"
325- >
326- { tComparison ( 'breadcrumb.clis' ) }
327- </ Link >
328- < span className = "text-[var(--color-text-muted)]" > /</ span >
329- < span className = "text-[var(--color-text)] font-medium" >
330- { tComparison ( 'breadcrumb.comparison' ) }
331- </ span >
332- </ nav >
333- </ div >
334- </ section >
335- ) }
336-
337- { /* Breadcrumb (original position) */ }
338- < section
339- ref = { breadcrumbRef }
340- className = "py-[var(--spacing-sm)] bg-[var(--color-hover)] border-b border-[var(--color-border)]"
341- >
342- < div className = "max-w-8xl mx-auto px-[var(--spacing-md)]" >
343- < nav
344- className = { `flex items-center gap-[var(--spacing-xs)] text-[0.8125rem] ${ isBreadcrumbFixed ? 'invisible' : '' } ` }
345- >
346- < Link
347- href = { `/${ locale } /ai-coding-stack` }
348- className = "text-[var(--color-text-secondary)] hover:text-[var(--color-text)] transition-colors"
349- >
350- { tComparison ( 'breadcrumb.aiCodingStack' ) }
351- </ Link >
352- < span className = "text-[var(--color-text-muted)]" > /</ span >
353- < Link
354- href = { `/${ locale } /clis` }
355- className = "text-[var(--color-text-secondary)] hover:text-[var(--color-text)] transition-colors"
356- >
357- { tComparison ( 'breadcrumb.clis' ) }
358- </ Link >
359- < span className = "text-[var(--color-text-muted)]" > /</ span >
360- < span className = "text-[var(--color-text)] font-medium" >
361- { tComparison ( 'breadcrumb.comparison' ) }
362- </ span >
363- </ nav >
364- </ div >
365- </ section >
281+ < Breadcrumb
282+ sticky
283+ items = { [
284+ { name : tStacks ( 'aiCodingStack' ) , href : '/ai-coding-stack' } ,
285+ { name : tStacks ( 'clis' ) , href : '/clis' } ,
286+ { name : tStacks ( 'comparison' ) , href : '/clis/comparison' } ,
287+ ] }
288+ />
366289
367290 { /* Page Header */ }
368291 < section className = "py-[var(--spacing-lg)] border-[var(--color-border)]" >
369292 < div className = "max-w-8xl mx-auto px-[var(--spacing-md)]" >
370- < h1 className = "text-[2rem] font-semibold tracking-[-0.03em] mb-[var(--spacing-sm)]" >
293+ < h1 className = "text-3xl font-semibold tracking-[-0.03em] mb-[var(--spacing-sm)]" >
371294 { tComparison ( 'clis.title' ) }
372295 </ h1 >
373296 < p className = "text-base text-[var(--color-text-secondary)] font-light" >
@@ -383,7 +306,6 @@ export default function CLIComparisonPageClient({ locale }: Props) {
383306 items = { clis as unknown as Record < string , unknown > [ ] }
384307 columns = { columns }
385308 itemLinkPrefix = { `/${ locale } /clis` }
386- stickyTopOffset = { 60 + ( isBreadcrumbFixed ? breadcrumbHeight : 0 ) }
387309 />
388310 </ div >
389311 </ section >
0 commit comments