From 13c7d473b1632fd98482dc1e27f879e086d6ab4a Mon Sep 17 00:00:00 2001 From: Roman Timashev Date: Sat, 22 Feb 2020 00:08:31 +0300 Subject: [PATCH] add Card component --- src/components/Card/index.tsx | 36 +++++++++++++ src/components/Card/styles.css | 85 ++++++++++++++++++++++++++++++ src/components/CardGrid/styles.css | 2 +- 3 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 src/components/Card/index.tsx create mode 100644 src/components/Card/styles.css diff --git a/src/components/Card/index.tsx b/src/components/Card/index.tsx new file mode 100644 index 00000000..2f0510f8 --- /dev/null +++ b/src/components/Card/index.tsx @@ -0,0 +1,36 @@ +import './styles.css' +import cx from 'classnames' +import Link from 'next/link' + +export type CardLayout = 'simple' | 'featured' +export type CardProps = { + style?: React.CSSProperties + href: string + img: { + alt: string + src: string + srcSet: string + } + layout: CardLayout +} + +export const Card: React.FC = props => ( +
+ + +
+ {props.img.alt} +
+ +
+ {props.children} +
+
+ +
+) diff --git a/src/components/Card/styles.css b/src/components/Card/styles.css new file mode 100644 index 00000000..211cb0ab --- /dev/null +++ b/src/components/Card/styles.css @@ -0,0 +1,85 @@ +.card { + border-radius: var(--radius); + box-shadow: var(--shadow); + overflow: hidden; + transition: box-shadow 150ms; +} + +.card:hover { + box-shadow: var(--shadow-active); +} + +.card:hover img { + width: 104%; + height: 104%; + + top: -2%; + left: -2%; +} + +.card > a { + display: block; + height: 100%; + position: relative; +} + +.card-image { + position: relative; + width: 100%; + height: 100%; +} + +.card-image img { + width: 100%; + height: 100%; + object-fit: cover; + + transition: all 150ms ease-out; + + position: absolute; + top: 0; + left: 0; +} + +.card-body { + background-color: var(--color-back-main); + padding: var(--size-m); +} + +/* SIMPLE */ + +.card.simple .card-body { + position: relative; + padding-top: 0; +} + +.card.simple .card-body:before { + position: absolute; + content: ''; + background-color: var(--color-back-main); + + border-radius: var(--radius) var(--radius) 0 0; + width: 100%; + height: var(--radius); + top: calc(var(--radius) * -1); + left: 0; +} + +.card.simple > a { + display: flex; + flex-direction: column; +} + +/* FEATURED */ + +.card.featured .card-body { + position: absolute; + + --offset: var(--size-m); + --r: var(--size-s); + left: var(--offset); + right: var(--offset); + bottom: var(--offset); + + border-radius: var(--radius) var(--radius) var(--r) var(--r); +} diff --git a/src/components/CardGrid/styles.css b/src/components/CardGrid/styles.css index 4fccc77c..9a93eaca 100644 --- a/src/components/CardGrid/styles.css +++ b/src/components/CardGrid/styles.css @@ -3,7 +3,7 @@ display: grid; /* grid-template-columns: 1fr 1fr 1fr; */ grid-template-columns: repeat(auto-fill, minmax(var(--min-cell-size), 1fr)); - grid-auto-rows: 1fr; + grid-auto-rows: 20em; grid-gap: var(--size-xl) var(--size-l); }