Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TEC-4404: Badge component #35

Merged
merged 7 commits into from
Nov 11, 2024
Merged

Conversation

joelsalmeida
Copy link
Contributor

@joelsalmeida joelsalmeida commented Nov 8, 2024

Task link

Task link from JIRA

Layout link

Figma layout link

Task description

Create Badge component.

Screenshots

Screenshot 2024-11-08 173217

Ambient to test

Local

@joelsalmeida joelsalmeida added the enhancement New feature or request label Nov 8, 2024
@joelsalmeida joelsalmeida self-assigned this Nov 8, 2024
Copy link

coderabbitai bot commented Nov 8, 2024

Caution

Review failed

The pull request is closed.

Walkthrough

Este pull request introduz um novo componente chamado Badge, que é configurado no Storybook para permitir a visualização de diferentes variações. O componente Badge aceita propriedades como size, backgroundColor e fullWidth, com valores padrão definidos. Várias histórias são criadas para demonstrar as diferentes opções de exibição do componente, incluindo variações com ícones e cores personalizadas. Além disso, componentes e tipos relacionados são exportados para uso em outras partes da aplicação.

Changes

Arquivo Resumo das Mudanças
src/components/Badge/index.stories.tsx Adicionada configuração do Storybook com metadados e seis histórias para o componente Badge.
src/components/Badge/index.tsx Introduzido o componente Badge que aceita propriedades size, backgroundColor e fullWidth.
src/components/Badge/style.tsx Criado o componente estilizado BadgeStyled que aplica estilos com base nas propriedades fornecidas.
src/components/Badge/type.ts Definido o tipo BadgeProps com propriedades opcionais size, backgroundColor, children e fullWidth.
src/components/index.ts Adicionada a importação do componente Badge para exportação.
src/index.ts Adicionada a importação e exportação do componente Badge.

Poem

🐇 No campo a brilhar, um novo Badge surgiu,
Com cores e tamanhos, um encanto que fluiu.
Histórias contadas, com ícones a dançar,
Um toque de magia, pronto pra encantar!
Vamos celebrar, com alegria e amor,
O Badge chegou, trazendo seu esplendor! ✨


🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@joelsalmeida joelsalmeida marked this pull request as ready for review November 8, 2024 20:11
@joelsalmeida joelsalmeida added publish_docs Publish Chromatic and removed publish_docs Publish Chromatic labels Nov 8, 2024
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (9)
src/components/Badge/type.ts (1)

1-5: Adicione documentação JSDoc para melhorar a manutenibilidade.

A estrutura do tipo está correta, mas seria benéfico adicionar documentação JSDoc descrevendo o propósito de cada propriedade.

Sugiro adicionar a seguinte documentação:

+/**
+ * Props do componente Badge
+ * @property {('small' | 'normal')} [size] - Tamanho do badge
+ * @property {string} [backgroundColor] - Cor de fundo personalizada
+ * @property {React.ReactNode} [children] - Conteúdo do badge
+ */
 type BadgeProps = {
   size?: 'small' | 'normal'
   backgroundColor?: string
   children?: React.ReactNode
 }
src/components/Badge/index.tsx (2)

4-8: Documente as props do componente

Recomendo adicionar documentação JSDoc para descrever o propósito de cada prop e seus valores possíveis, especialmente para size e backgroundColor.

+/**
+ * Componente Badge para exibir indicadores visuais
+ * @param {('small'|'medium'|'large')} size - Tamanho do badge
+ * @param {string} backgroundColor - Cor de fundo em formato hexadecimal
+ * @param {React.ReactNode} children - Conteúdo do badge
+ */
const Badge = ({
  size = 'small',
  backgroundColor = '#2391E1',
  children,
}: BadgeProps) => {

10-12: Considere adicionar validação para backgroundColor

O componente aceita qualquer string como cor de fundo. Seria útil adicionar uma validação para garantir que apenas cores válidas sejam aceitas.

+const isValidHexColor = (color: string) => /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(color);

const Badge = ({
  size = 'small',
  backgroundColor = '#2391E1',
  children,
}: BadgeProps) => {
+  if (backgroundColor && !isValidHexColor(backgroundColor)) {
+    console.warn('Badge: backgroundColor deve ser uma cor hexadecimal válida');
+  }

  return (
    <BadgeStyled $size={size} $backgroundColor={backgroundColor}>
      {children}
    </BadgeStyled>
  );
}
src/components/Badge/style.tsx (3)

3-3: Considere adicionar validação de tipos mais específica

A tipagem atual permite qualquer string para $size, o que pode levar a valores inesperados. Recomendo utilizar um tipo mais específico.

-const BadgeStyled = styled.div<{ $size?: string; $backgroundColor?: string }>`
+type BadgeSize = 'small' | 'default';
+const BadgeStyled = styled.div<{ $size?: BadgeSize; $backgroundColor?: string }>`

8-8: Considere usar theme tokens para padronização

Os valores de padding estão hardcoded. Seria interessante utilizar tokens do theme para manter consistência com outros componentes.

-  padding: ${(props) => (props.$size === 'small' ? '4px 6px' : '6px 8px')};
+  padding: ${(props) => (props.$size === 'small' ? props.theme.spacing.xxs : props.theme.spacing.xs)};

13-14: Considere usar theme tokens para tipografia

Os valores de font-size e line-height poderiam vir do theme para manter consistência tipográfica.

-  font-size: 0.75rem;
-  line-height: 1;
+  font-size: ${props => props.theme.typography.sizes.xs};
+  line-height: ${props => props.theme.typography.lineHeight.compact};
src/components/Badge/index.stories.tsx (3)

67-69: Considerar uso de styled-components

O uso de estilos inline pode dificultar a manutenção. Considere mover estes estilos para um componente estilizado.

Sugestão de implementação:

const StyledLabel = styled.span`
  color: #1B6AA3;
  font-size: 12px;
  line-height: 1;
`

E então usar:

-      <span style={{ color: '#1B6AA3', fontSize: '12px', lineHeight: '1' }}>
-        A nice label
-      </span>
+      <StyledLabel>A nice label</StyledLabel>

65-66: Remover linha em branco desnecessária

Há uma linha em branco desnecessária entre os elementos do Badge.

    <Badge {...args}>
      <Money color="#1B6AA3" size={16} />
-
      <span style={{ color: '#1B6AA3', fontSize: '12px', lineHeight: '1' }}>

5-29: Sugerir testes de acessibilidade

O componente Badge parece bem implementado, mas seria importante adicionar testes de acessibilidade. Considere adicionar:

  • Verificação de contraste para diferentes combinações de cores
  • Testes com screen readers
  • Documentação sobre práticas de acessibilidade

Você pode utilizar o addon @storybook/addon-a11y para realizar testes automáticos de acessibilidade. Adicione ao meta:

const meta: Meta<typeof Badge> = {
  component: Badge,
  tags: ['autodocs'],
+ parameters: {
+   a11y: {
+     config: {
+       rules: [
+         {
+           id: 'color-contrast',
+           enabled: true
+         }
+       ]
+     }
+   }
+ },
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ae7ef26 and 2928968.

📒 Files selected for processing (6)
  • src/components/Badge/index.stories.tsx (1 hunks)
  • src/components/Badge/index.tsx (1 hunks)
  • src/components/Badge/style.tsx (1 hunks)
  • src/components/Badge/type.ts (1 hunks)
  • src/components/index.ts (2 hunks)
  • src/index.ts (2 hunks)
🔇 Additional comments (8)
src/components/Badge/type.ts (1)

7-7: Exportação adequada do tipo!

A exportação nomeada do tipo está correta e segue as boas práticas.

src/components/Badge/index.tsx (2)

16-16: LGTM! Exportação correta do componente.

A exportação nomeada está adequada e segue as boas práticas.


1-2: Considere adicionar validação de tipos para as importações

Embora as importações estejam corretas, seria útil garantir que os tipos e componentes estilizados existam verificando os arquivos relacionados.

✅ Verification successful

As importações estão corretamente tipadas e implementadas

Os arquivos type.ts e style.tsx existem e estão corretamente implementados:

  • type.ts define adequadamente a interface BadgeProps com todas as props necessárias
  • style.tsx implementa o componente estilizado com os props tipados usando o prefixo $
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Verificar a existência dos arquivos de tipo e estilo
echo "Verificando arquivos relacionados ao Badge..."
fd --type f "type.ts|style.ts" --parent-dir "src/components/Badge"

Length of output: 436


Script:

#!/bin/bash
# Verificar a existência dos arquivos de tipo e estilo
echo "Verificando arquivos relacionados ao Badge..."
fd "type.ts|style.ts" src/components/Badge

# Verificar o conteúdo dos arquivos se existirem
echo -e "\nConteúdo dos arquivos (se encontrados):"
for file in $(fd "type.ts|style.ts" src/components/Badge); do
  echo -e "\n=== $file ==="
  cat "$file"
done

Length of output: 1335

src/components/Badge/style.tsx (1)

4-8: LGTM! Boas práticas de layout flexbox aplicadas

A implementação do layout usando flexbox com gap e width: fit-content está adequada e segue boas práticas.

src/index.ts (1)

35-35: LGTM! Importação e exportação do componente Badge adicionadas corretamente.

O componente Badge foi adicionado de forma consistente tanto na lista de importações quanto na lista de exportações, seguindo o padrão alfabético existente no arquivo.

Also applies to: 73-73

src/components/index.ts (2)

31-31: LGTM! Importação do componente Badge.

A importação do novo componente Badge está correta e segue o padrão existente no arquivo.


64-64: LGTM! Exportação do componente Badge.

A exportação do componente Badge está correta e mantém a consistência com os outros componentes do arquivo.

src/components/Badge/index.stories.tsx (1)

32-32: Definição de tipo correta

A definição do tipo Story está adequada e segue as melhores práticas do Storybook.

src/components/Badge/style.tsx Show resolved Hide resolved
src/components/Badge/index.stories.tsx Outdated Show resolved Hide resolved
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (8)
src/components/Badge/type.ts (3)

1-6: Considere adicionar documentação JSDoc para melhor DX

Recomendo adicionar documentação JSDoc para melhorar a experiência do desenvolvedor (DX) e tornar o componente mais fácil de usar.

Sugestão de implementação:

+/**
+ * Props do componente Badge
+ * @property {('small' | 'normal')} [size='normal'] - Tamanho do badge
+ * @property {string} [backgroundColor] - Cor de fundo personalizada
+ * @property {React.ReactNode} [children] - Conteúdo do badge
+ * @property {boolean} [fullWidth=false] - Se o badge deve ocupar toda a largura disponível
+ */
type BadgeProps = {
  size?: 'small' | 'normal'
  backgroundColor?: string
  children?: React.ReactNode
  fullWidth?: boolean
}

2-2: Considere adicionar um valor padrão explícito no tipo

Para melhor clareza na API do componente, seria interessante indicar o valor padrão diretamente no tipo.

Sugestão:

-  size?: 'small' | 'normal'
+  size?: 'small' | 'normal' // default: 'normal'

3-3: Considere usar um tipo mais específico para cores

Para garantir maior type safety, poderia ser interessante criar um tipo específico para as cores permitidas, baseado no seu design system.

Exemplo de implementação:

type BadgeColors = 'primary' | 'secondary' | 'success' | 'warning' | 'error' | string

E então usar:

-  backgroundColor?: string
+  backgroundColor?: BadgeColors
src/components/Badge/index.tsx (2)

4-9: Considere documentar as props com JSDoc

Seria útil adicionar documentação JSDoc para descrever o propósito de cada prop e seus valores possíveis, especialmente para size que parece ter valores específicos permitidos.

+/**
+ * Componente Badge para exibir indicadores visuais
+ * @param {object} props
+ * @param {'small' | 'medium' | 'large'} [props.size='small'] - Tamanho do badge
+ * @param {string} [props.backgroundColor='#2391E1'] - Cor de fundo do badge
+ * @param {boolean} [props.fullWidth=false] - Se o badge deve ocupar toda a largura disponível
+ */
const Badge = ({
  size = 'small',
  backgroundColor = '#2391E1',
  children,
  fullWidth = false,
}: BadgeProps) => {

21-21: Considere exportar os tipos junto com o componente

Para melhorar a experiência do desenvolvedor, seria útil exportar também a interface BadgeProps.

-export { Badge }
+export { Badge, type BadgeProps }
src/components/Badge/style.tsx (1)

13-14: Considere utilizar tokens de design

Os valores de padding e border-radius estão hardcoded. Recomendo utilizar tokens de design do tema para maior consistência.

Sugestão de refatoração:

-  padding: ${(props) => (props.$size === 'small' ? '4px 6px' : '6px 8px')};
-  border-radius: 4px;
+  padding: ${(props) => (props.$size === 'small' ? theme.spacing.xxs : theme.spacing.xs)};
+  border-radius: ${theme.borderRadius.sm};
src/components/Badge/index.stories.tsx (2)

5-31: Melhorar a documentação dos argTypes

A configuração está bem estruturada, mas poderia beneficiar de documentação mais detalhada. Sugiro:

  1. Adicionar exemplos de valores válidos nas descrições
  2. Documentar valores padrão
  3. Especificar unidades de medida quando aplicável

Exemplo de melhoria:

    size: {
      control: { type: 'select' },
      options: ['small', 'normal'],
-     description: 'The size of the Badge.',
+     description: 'Tamanho do Badge. Padrão: normal',
    },
    backgroundColor: {
      control: { type: 'color' },
-     description: 'The background color of the Badge.',
+     description: 'Cor de fundo do Badge. Ex: #000000, rgb(0,0,0)',
    },

36-94: Padronizar textos e melhorar acessibilidade

Existem algumas inconsistências e pontos de melhoria nas stories:

  1. O texto "A nice label" está em inglês em todas as stories
  2. Stories com ícones não possuem aria-label ou texto alternativo
  3. Estilos inline no WithCustomTextColor poderiam ser movidos para componentes estilizados

Sugestões de melhorias:

// Para stories com ícones
export const WithIcon: Story = {
  render: (args) => (
    <Badge {...args}>
-     <Money color="white" size={16} />A nice label
+     <Money color="white" size={16} aria-hidden="true" />
+     <span>Valor monetário</span>
    </Badge>
  ),
}

// Para WithCustomTextColor
export const WithCustomTextColor: Story = {
  render: (args) => (
    <Badge {...args}>
-     <Money color="#1B6AA3" size={16} />
+     <Money color="#1B6AA3" size={16} aria-hidden="true" />
-     <span style={{ color: '#1B6AA3', fontSize: '12px', lineHeight: '1' }}>
+     <StyledLabel>
        A nice label
-     </span>
+     </StyledLabel>
    </Badge>
  ),
}

Crie um novo arquivo de estilos para o componente:

// styles.ts
export const StyledLabel = styled.span`
  color: #1B6AA3;
  font-size: 12px;
  line-height: 1;
`;
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 7eaece7 and c7b6685.

📒 Files selected for processing (4)
  • src/components/Badge/index.stories.tsx (1 hunks)
  • src/components/Badge/index.tsx (1 hunks)
  • src/components/Badge/style.tsx (1 hunks)
  • src/components/Badge/type.ts (1 hunks)
🔇 Additional comments (7)
src/components/Badge/type.ts (1)

8-8: LGTM! Padrão de exportação adequado

A exportação nomeada do tipo está correta e segue as boas práticas do TypeScript.

src/components/Badge/index.tsx (2)

1-2: Imports organizados e claros

As importações estão bem estruturadas, separando tipos e estilos de forma adequada.


11-17: Verifique a necessidade de validação de cores

O componente aceita qualquer string como backgroundColor. Considere adicionar validação para garantir que apenas cores válidas sejam aceitas.

Sugestão de implementação:

const isValidColor = (color: string): boolean => {
  const s = new Option().style;
  s.color = color;
  return s.color !== '';
};
src/components/Badge/style.tsx (3)

3-7: Interface de props bem estruturada

A interface das props está bem definida com prefixo $ seguindo as convenções do styled-components, e todos os props são opcionais conforme necessário.


8-12: Layout flexível implementado corretamente

O uso de display: flex com alinhamento centralizado e gap proporciona um layout consistente. A propriedade width está corretamente condicionada ao prop $fullWidth.


15-19: ⚠️ Potential issue

Problema crítico de contraste - Implementar validação

O comentário anterior sobre o problema de contraste continua válido. A cor do texto está fixa em branco (color: white), o que pode causar problemas de acessibilidade quando o backgroundColor for muito claro.

Sugestão de implementação usando polished:

+ import { getContrast } from 'polished';
+ import { theme } from '../../theme';

  background-color: ${(props) =>
-   props.$backgroundColor ? `${props.$backgroundColor}` : '#2391E1'};
-  color: white;
+   props.$backgroundColor ? `${props.$backgroundColor}` : theme.colors.primary};
+  color: ${(props) => {
+    const bgColor = props.$backgroundColor || theme.colors.primary;
+    return getContrast(bgColor, '#FFF') < 3.5 ? '#000' : '#FFF';
+  }};
src/components/Badge/index.stories.tsx (1)

84-94: Verificar contraste de cores

No story WithCustomBackgroundColor, é importante garantir que a cor de fundo (#CE2A36) tenha contraste suficiente com a cor do texto para manter a acessibilidade.

Execute o script abaixo para verificar outras ocorrências de cores personalizadas no código:

✅ Verification successful

Atenção ao contraste entre texto e fundo no Badge

A cor de fundo #CE2A36 (vermelho) está sendo usada com texto branco (#FFFFFF). Esta combinação possui uma razão de contraste adequada para acessibilidade. No entanto, é importante notar que:

  • O componente Badge sempre usa texto branco (#FFFFFF) por padrão
  • A cor #CE2A36 corresponde ao token brand100 do tema light
  • Recomenda-se usar os tokens de cor do sistema ao invés de valores hexadecimais diretos

Sugestões:

  • Utilize o token colors.light.brand.brand100 ao invés do valor hexadecimal direto
  • Documente no story que cores de fundo personalizadas devem manter contraste mínimo de 4.5:1 com texto branco para conformidade WCAG 2.1
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Procurar por definições de cores hexadecimais ou RGB no código
rg -i '(#[0-9A-F]{6}|rgb\([0-9,\s]+\))' --type tsx

Length of output: 80


Script:

#!/bin/bash
# Procurar por definições de cores hexadecimais ou RGB em todos os arquivos
rg -i '(#[0-9A-F]{6}|rgb\([0-9,\s]+\))' 

# Procurar pelo arquivo de tema ou configuração de cores
fd -e ts -e tsx -e js -e jsx theme
fd -e ts -e tsx -e js -e jsx color

Length of output: 9315


Script:

#!/bin/bash
# Verificar o conteúdo do arquivo de tema para entender as configurações de cores do texto
cat src/theme.ts

# Verificar o conteúdo do arquivo de cores para entender as definições de cores do sistema
cat src/tokens/colors.ts

# Verificar a implementação do componente Badge para entender como as cores são aplicadas
cat src/components/Badge/style.tsx

Length of output: 3749

src/components/Badge/index.tsx Outdated Show resolved Hide resolved
@joelsalmeida joelsalmeida merged commit 6fa9fd5 into main Nov 11, 2024
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Development

Successfully merging this pull request may close these issues.

2 participants