Skip to content

Commit

Permalink
feat: add card component
Browse files Browse the repository at this point in the history
  • Loading branch information
ErickPetru committed Mar 28, 2024
1 parent f05b4db commit d2152c3
Show file tree
Hide file tree
Showing 9 changed files with 579 additions and 15 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ O versionamento deste projeto é aderente aos princípios de [Semantic Versionin

### Added

- Criação do componente `<cps-card>`.
- Criação do componente `<cps-link>`.

### Changed
Expand Down
1 change: 1 addition & 0 deletions docs/_sidebar.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
- [Badge](/componentes/badge)
- [Button](/componentes/button)
- [Button Group](/componentes/button-group)
- [Card](/componentes/card)
- [Checkbox](/componentes/checkbox)
- [Chip](/componentes/chip)
- [Dropdown](/componentes/dropdown)
Expand Down
Binary file added docs/assets/images/background.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
367 changes: 367 additions & 0 deletions docs/componentes/card.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,367 @@
# Card

[component-header:cps-card]

```html preview
<cps-card>
<cps-label>Conteúdo do cartão, conforme for desejado.</cps-label>
<br />
<cps-label>Pode estruturar o conteúdo com qualquer elemento <abbr title="HyperText Markup Language">HTML</abbr>.</cps-label>
<br />
<cps-label>E também <cps-link href="/#/fundamentos/utilização">utilizar</cps-link> qualquer componente CPS Elements.</cps-label>
</cps-card>
```

```jsx react
import { CpsCard } from '@cps-elements/web/react/card';
import { CpsLabel } from '@cps-elements/web/react/label';
import { CpsLink } from '@cps-elements/web/react/link';

const App = () => (
<CpsCard>
<CpsLabel>Conteúdo do cartão, conforme for desejado.</CpsLabel>
<br />
<CpsLabel>Pode estruturar o conteúdo com qualquer elemento <abbr title="HyperText Markup Language">HTML</abbr>.</CpsLabel>
<br />
<CpsLabel>E também <CpsLink href="/#/fundamentos/utilização">utilizar</CpsLink> qualquer componente CPS Elements.</CpsLabel>
</CpsCard>
);
```

## Exemplos

### Variantes

Use o atributo `variant` para definir a variação visual do cartão. Atente-se que a variação `on-acrylic` só é recomendada para utilização sobre uma camada de grande variação visual de fundo, como ocorre com camadas de material acrílico acrílica, por isso o nome da variação.

```html preview
<div class="sample-transparent-background">
<cps-card variant="primary">
Primário
</cps-card>

<cps-card variant="secondary">
Secundário
</cps-card>

<cps-card variant="tertiary">
Terciário
</cps-card>

<cps-card variant="on-acrylic">
Sobre acrílico
</cps-card>
</div>

<div class="sample-acrylic-background">
<cps-card variant="primary">
Primário
</cps-card>

<cps-card variant="secondary">
Secundário
</cps-card>

<cps-card variant="tertiary">
Terciário
</cps-card>

<cps-card variant="on-acrylic">
Sobre acrílico
</cps-card>
</div>
```

```jsx react
import { CpsCard } from '@cps-elements/web/react/card';

const App = () => (
<>
<div className="sample-transparent-background">
<CpsCard variant="primary">
Primário
</CpsCard>

<CpsCard variant="secondary">
Secundário
</CpsCard>

<CpsCard variant="tertiary">
Terciário
</CpsCard>

<CpsCard variant="on-acrylic">
Sobre acrílico
</CpsCard>
</div>

<div className="sample-acrylic-background">
<CpsCard variant="primary">
Primário
</CpsCard>

<CpsCard variant="secondary">
Secundário
</CpsCard>

<CpsCard variant="tertiary">
Terciário
</CpsCard>

<CpsCard variant="on-acrylic">
Sobre acrílico
</CpsCard>
</div>
</>
);
```

### Acionável

Use o atributo `actionable` para tornar o cartão acionável, ou seja, que pode ser interagido pelo usuário, por exemplo, com _mouse_ e teclado.

```html preview
<div class="sample-transparent-background">
<cps-card variant="primary" actionable>
Primário
</cps-card>

<cps-card variant="secondary" actionable>
Secundário
</cps-card>

<cps-card variant="tertiary" actionable>
Terciário
</cps-card>

<cps-card variant="on-acrylic" actionable>
Sobre acrílico
</cps-card>
</div>

<div class="sample-acrylic-background">
<cps-card variant="primary" actionable>
Primário
</cps-card>

<cps-card variant="secondary" actionable>
Secundário
</cps-card>

<cps-card variant="tertiary" actionable>
Terciário
</cps-card>

<cps-card variant="on-acrylic" actionable>
Sobre acrílico
</cps-card>
</div>
```

```jsx react
import { CpsCard } from '@cps-elements/web/react/card';

const App = () => (
<>
<div className="sample-transparent-background">
<CpsCard variant="primary" actionable>
Primário
</CpsCard>

<CpsCard variant="secondary" actionable>
Secundário
</CpsCard>

<CpsCard variant="tertiary" actionable>
Terciário
</CpsCard>

<CpsCard variant="on-acrylic" actionable>
Sobre acrílico
</CpsCard>
</div>

<div className="sample-acrylic-background">
<CpsCard variant="primary" actionable>
Primário
</CpsCard>

<CpsCard variant="secondary" actionable>
Secundário
</CpsCard>

<CpsCard variant="tertiary" actionable>
Terciário
</CpsCard>

<CpsCard variant="on-acrylic" actionable>
Sobre acrílico
</CpsCard>
</div>
</>
);
```

### Com cabeçalho e rodapé

Use os _slots_ `header` e `footer` para adicionar cabeçalho e rodapé ao cartão, respectivamente.

```html preview
<cps-card>
<div slot="header" class="example-header-layout">
<cps-avatar image="https://i.pravatar.cc/48?img=3" label="John Doe" loading="lazy"></cps-avatar>
<cps-label size="body-strong">John Doe</cps-label>
<cps-label size="body" variant="secondary">Engenheiro de Software</cps-label>
</div>

<div class="example-content-layout">
<cps-label variant="secondary">Área de conteúdo, construa conforme desejar.</cps-label>
</div>

<div slot="footer" class="example-footer-layout">
<cps-button>
<cps-icon name="delete" label="Excluir"></cps-icon>
</cps-button>

<cps-button variant="accent">
<cps-icon slot="prefix" name="edit" label="Editar"></cps-icon>
Editar
</cps-button>
</div>
</cps-card>

<style>
.example-header-layout {
display: grid;
grid-template-rows: auto auto;
grid-template-columns: auto 1fr;
row-gap: 0.25rem;
column-gap: 1rem;
align-items: center;
}
.example-header-layout cps-avatar {
grid-row: span 2;
}
.example-content-layout {
border: 1px dashed var(--cps-color-stroke-card-secondary);
border-radius: var(--cps-border-radius-medium);
background: var(--cps-color-fill-alt-tertiary);
padding: 1rem;
}
.example-footer-layout {
display: flex;
gap: 1rem;
justify-content: end;
}
</style>
```

```jsx react
import { CpsAvatar } from '@cps-elements/web/react/avatar';
import { CpsButton } from '@cps-elements/web/react/button';
import { CpsCard } from '@cps-elements/web/react/card';
import { CpsIcon } from '@cps-elements/web/react/icon';
import { CpsLabel } from '@cps-elements/web/react/label';

const css = `
.example-header-layout {
display: grid;
grid-template-rows: auto auto;
grid-template-columns: auto 1fr;
row-gap: 0.25rem;
column-gap: 1rem;
align-items: center;
}
.example-header-layout cps-avatar {
grid-row: span 2;
}
.example-content-layout {
border: 1px dashed var(--cps-color-stroke-card-secondary);
border-radius: var(--cps-border-radius-medium);
background: var(--cps-color-fill-alt-tertiary);
padding: 1rem;
}
.example-footer-layout {
display: flex;
gap: 1rem;
justify-content: end;
}
`;

const App = () => (
<>
<CpsCard>
<div slot="header" className="example-header-layout">
<CpsAvatar image="https://i.pravatar.cc/48?img=3" label="John Doe" loading="lazy"></CpsAvatar>
<CpsLabel size="body-strong">John Doe</CpsLabel>
<CpsLabel size="body" variant="secondary">Engenheiro de Software</CpsLabel>
</div>

<div className="example-content-layout">
<CpsLabel variant="secondary">Área de conteúdo, construa conforme desejar.</CpsLabel>
</div>

<div slot="footer" className="example-footer-layout">
<CpsButton>
<CpsIcon name="delete" label="Excluir"></CpsIcon>
</CpsButton>

<CpsButton variant="accent">
<CpsIcon slot="prefix" name="edit" label="Editar"></CpsIcon>
Editar
</CpsButton>
</div>
</CpsCard>

<style>{css}</style>
</>
);
```

[component-metadata:cps-card]

<style>
.sample-transparent-background {
display: flex;
inset: 0;
gap: 1.5rem;
align-items: center;
margin: -1.5rem -3.25rem 0 -1.5rem;
padding: 1.5rem 3.25rem 1.5rem 1.5rem;
overflow: hidden;
}

.sample-acrylic-background {
display: flex;
position: relative;
inset: 0;
gap: 1.5rem;
align-items: center;
margin: 0 -3.25rem -1.5rem -1.5rem;
background: url('./assets/images/background.jpg') center/cover fixed;
padding: 1.5rem 3.25rem 1.5rem 1.5rem;
overflow: hidden;
}

.sample-acrylic-background::before {
position: absolute;
inset: 0;
z-index: 0;
background: var(--cps-color-background-acrylic-subtle);
content: '';
backdrop-filter: var(--cps-blur-large);
}

.sample-transparent-background > *,
.sample-acrylic-background > * {
position: relative;
flex: 1;
z-index: 1;
}
</style>
1 change: 1 addition & 0 deletions src/all.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export { CpsAvatar } from './components/avatar.js';
export { CpsBadge } from './components/badge.js';
export { CpsButton } from './components/button.js';
export { CpsButtonGroup } from './components/button-group.js';
export { CpsCard } from './components/card.js';
export { CpsCheckbox } from './components/checkbox.js';
export { CpsChip } from './components/chip.js';
export { CpsDropdown } from './components/dropdown.js';
Expand Down
Loading

0 comments on commit d2152c3

Please sign in to comment.