omnivore/packages/web/components/patterns/LibraryCards/LibraryGridCard.tsx

98 lines
2.6 KiB
TypeScript
Raw Normal View History

import { VStack, HStack, SpanBox } from '../../elements/LayoutPrimitives'
2022-08-11 09:36:09 +00:00
import { StyledText } from '../../elements/StyledText'
import { removeHTMLTags } from '../ArticleSubtitle'
2022-08-11 09:36:09 +00:00
import { theme } from '../../tokens/stitches.config'
import { LabelChip } from '../../elements/LabelChip'
import type { LinkedItemCardProps } from './CardTypes'
2022-09-26 18:57:18 +00:00
import { ProgressBarVertical } from '../../elements/ProgressBarVertical'
//Styles
const ellipsisText = {
overflow: 'hidden',
display: '-webkit-box',
WebkitLineClamp: 1,
WebkitBoxOrient: 'vertical',
pl: '10px',
margin: 'auto 0',
}
2022-08-11 09:36:09 +00:00
export function LibraryGridCard(props: LinkedItemCardProps): JSX.Element {
return (
<VStack
2022-08-11 09:36:09 +00:00
distribution="start"
alignment="start"
css={{
width: '100%',
2022-08-11 09:36:09 +00:00
}}
>
<HStack
2022-08-11 09:36:09 +00:00
alignment="start"
distribution="between"
2022-08-11 09:36:09 +00:00
css={{
width: '100%',
display: 'grid',
gridTemplateColumns: '0.01fr 1fr 2fr 150px',
gridTemplateRows: '1fr',
2022-09-27 02:20:14 +00:00
borderBottom: '1px solid $graySeparator',
height: '45px',
2022-08-11 09:36:09 +00:00
}}
>
<ProgressBarVertical
fillPercentage={props.item.readingProgressPercent}
fillColor={theme.colors.highlight.toString()}
2022-09-27 02:20:14 +00:00
backgroundColor={theme.colors.grayProgressBackground.toString()}
borderRadius={
props.item.readingProgressPercent === 100 ? '0' : '0px 8px 8px 0px'
}
height={'45px'}
/>
<CardTitle title={props.item.title} />
<StyledText
2022-08-11 09:36:09 +00:00
css={{
...ellipsisText,
color: '$grayTextContrast',
2022-08-11 09:36:09 +00:00
}}
data-testid="listDesc"
2022-08-11 09:36:09 +00:00
>
{/* <Box css={{ display: 'block', py: '12px' }}> */}
{props.item.labels?.map(({ name, color }, index) => (
<LabelChip key={index} text={name || ''} color={color} />
))}
{/* </Box> */}
{props.item.description}
</StyledText>
2022-09-26 18:57:18 +00:00
<StyledText
style="caption"
css={{ ...ellipsisText, fontWeight: '400' }}
>
{props.item.author && (
<SpanBox>{removeHTMLTags(props.item.author)}</SpanBox>
)}
</StyledText>
</HStack>
</VStack>
2022-08-11 09:36:09 +00:00
)
}
type CardTitleProps = {
title: string
}
function CardTitle(props: CardTitleProps): JSX.Element {
return (
<StyledText
style="listTitle"
data-testid="listTitle"
css={{
2022-09-26 18:57:18 +00:00
...ellipsisText,
2022-09-27 02:20:14 +00:00
fontSize: '14px',
fontWeight: '600',
2022-08-11 09:36:09 +00:00
textAlign: 'left',
}}
>
{props.title}
</StyledText>
)
}