blocks/multiplatform/case-studies/grid.tsx (48 lines of code) (raw):

import cn from 'classnames'; import { useTextStyles } from '@rescui/typography'; import { CaseStudiesGrid } from '../../case-studies/grid/case-studies-grid'; import { FilteredCasesProvider, FilterOptions } from '../../case-studies/filter/use-filtered-cases'; import { CaseItem } from '../../case-studies/case-studies'; import styles from './grid.module.css'; import { Button } from '@rescui/button'; import { useRouter } from 'next/router'; import { useCallback } from 'react'; import { useMS } from '@jetbrains/kotlin-web-site-ui/out/components/breakpoints-v2'; const FILTER: FilterOptions = { type: 'multiplatform' } as const; const CASES_HIGHLIGHTED: Readonly<CaseItem['id'][]> = Object.freeze([ 'case-study-mcdonalds-umain', 'case-study-wrike', 'case-study-netflix', 'case-study-google-workspace', 'case-study-bilibili', 'case-study-x', 'case-study-duolingo' ].reverse()); function filterHighlighted(items: CaseItem[]) { const lastOfHighlighted = Math.min(items.length, Math.max(CASES_HIGHLIGHTED.length, 7)); return [...items] .sort((a, b) => CASES_HIGHLIGHTED.indexOf(b.id) - CASES_HIGHLIGHTED.indexOf(a.id)) .slice(0, lastOfHighlighted); } const LINK_CASES = '/case-studies/?type=multiplatform' as const; export function CaseStudies() { const router = useRouter(); const textCn = useTextStyles(); const isMS = useMS(); const handleNavigate = useCallback((e) => { e.preventDefault(); router.replace({ hash: '' }, undefined, { scroll: false, shallow: true }); router.push(LINK_CASES); }, [router]); return ( <FilteredCasesProvider filter={FILTER} preprocess={filterHighlighted}> <section className={cn(styles.section, 'ktl-layout', 'ktl-layout--center')}> <h2 className={cn(styles.title, textCn('rs-h1'))}>Real-world success stories</h2> <CaseStudiesGrid mode={'rock'} className={styles.grid}/> <Button className={styles.btn} size={isMS ? 'm' : 'l'} mode={'outline'} href={LINK_CASES} onClick={handleNavigate}> Explore more customer stories </Button> </section> </FilteredCasesProvider> ); }