Site Elas@Computação Docs

Site Elas@Computação Docs

  • Docs
  • Blog

›Site

Projetos

  • Site

Site

  • Primeiros Passos
  • Estrutura
  • Enums
  • Functions
  • Components
  • Pages
  • Como adicionar uma tradução?

Components

Visão Geral

Esse diretório compreende todos os componentes desenvolvidos para o site.

De modo geral, todos estão organizados em pastas que contém dois arquivos:

  • index.tsx: Código em TSX do componente.

  • styles.css: Estilo aplicado no componente.

Os componentes existentes são:

  • ContactCard: Card para informações de contato

  • DropDown: Botão com efeito de expansão. Utilizado para os idiomas.

  • EventCard: Card para eventos.

  • IconStatus: Ícone com status. Utilizado para mostrar as causas apoiadas pelo Elas@Computação.

  • ItemContent: Item contido no DropDown.

  • LinkButton: Botão com link de redirecionamento.

  • PictureLink: Link com imagem. Utilizado para representar as membras no painel e também os parceiros.

  • ProjectCard: Card para projetos.

  • Section: Seções do site.

  • Tooltip: Componente com efeito de tooltip.

Abaixo estão especificados detalhes de todos os componentes.

ContactCard

O componente ContactCard compreende a estutura utilizada para representar uma informação de contato ou localização. No site, pode ser encontrado no footer, mostrando o e-mail e o endereço da comunidade.

Visão geral do código:

import React, { useState } from 'react';
import {CopyToClipboard} from 'react-copy-to-clipboard';

import './styles.css'

interface Properties {
    icon?: string;
    content: string;
    copy?: boolean;
    href?:string;
}
const ContactCard:React.FC<Properties> = ({content, copy, href, children}) => {

  const [status, setStatus] = useState(false)

  function showStatus(val) {
    const element = window.document.getElementById("status");
    if (val && copy) {
      element.style.visibility = "visible";
    } else if (copy){
      element.style.visibility = "hidden";
      setStatus(false);
    }
  }

  return (
      <div onMouseOver={() => showStatus(true)}
      onMouseOut={() => showStatus(false)}>
        {
          copy ? 
          <CopyToClipboard text={content} 
            onCopy={() => setStatus(true)}>
            <div id="contactcard-component">
              <div className="icon">
                {children}
              </div>
              <p id="text-content" className="copy">
                {content}
              <span id="status">
                {status ? "Copiado!" : "Clique para copiar!"}
              </span>
              </p>
            </div>
          </CopyToClipboard> :
          <a href={href} target="_blank" id="contactcard-component">
            <div className="icon">
              {children}
            </div>
            <p id="text-content">
              {content}
            </p>
          </a>
        }
      </div>
  );
}

export default ContactCard;

Propriedades

  • content: Conteúdo em texto que deverá aparecer no componente. Ex: elas@computacao.ufcg.edu.br

  • copy: Booleano que indica se o conteúdo pode ser copiado ao clicar

  • href: Endereço para redirecionar o usuário ao clicar no componente.

  • children: Por padrão, no children pode ser passado um ícone que será exibido juntamente da informação de contato/localização. Isso dá mais liberdade para que se possam passar também ícones de bibliotecas muito utilizadas em React, como a Feather Icons.

Mais informações

Para o efeito de copiar ao clicar, utilizamos o módulo CopyToClipboard.

DropDown

Esse componente é consiste em uma lista suspensa. No site, ele é utilizado para optar pelos idiomas disponíveis.

Visão geral do código:

import React, { useEffect, useState } from 'react';
import {css} from 'emotion';
import { useMenuState, Menu, MenuItem, MenuButton } from "reakit/Menu";
import ItemContent from '../ItemContent';
import { ChevronDown, ChevronUp } from 'react-feather';

import './styles.css'

const styles = css`
  display: flex;
  flex-direction: column;
  background: white;
  transition: opacity 250ms ease-in-out, transform 250ms ease-in-out;
  opacity: 0;
  transform-origin: top center;
  transform: scaleY(0);
  [data-enter] & {
    opacity: 1;
    transform: scaleY(1);
  }
`;

interface Properties {
  title: string;
  defaultImg: string;
  items: {
    src: string;
    subtitle: string;
    ref: string;
  }[];
};

const DropDown:React.FC<Properties> = ({title, defaultImg, items}) => {
  const menu = useMenuState({ animated: 250 });

  const [url, setURL] = useState("");

  useEffect(() => {
    setURL(window.location.href)
  }, []);

  function verifyLocation(href) {
    if (!url.split("/").includes(href)) {
      return href;
    } else {
      return "#";
    }
  }

  return (
      <div id="dropdown-component">
          <MenuButton {...menu} className="button">
            <span>{title}</span>
            <img src={defaultImg} alt="Lang" className="selected"/>
            <ChevronDown className="icon"/>
          </MenuButton>
          <Menu
            {...menu}
            aria-label={title}
            style={{ border: 0, background: "none", padding: 0 }}
          >
            <div className={styles}>
              {items.map((item) => {
                return(
                <MenuItem {...menu} className="menu-item">
                  <a href={verifyLocation(item.ref)}>
                    <ItemContent
                      title={item.subtitle}
                      src={item.src}
                    />
                  </a>
                </MenuItem>);
              })}
            </div>
          </Menu>
      </div>
  );
}

export default DropDown;

Propriedades

  • title: Título a ser exibido no botão. Ex: Idioma

  • defaultImg: Imagem default a ser mostrada no botão junto do título. Ex: icons.brasilFlag

  • items: Array de objetos que representam um item a ser listado pela lista suspensa. No nosso caso, a lista passada é a contida no arquivo langs.ts

Mais informações

Esse componente é escrito em cima do Menu do Reakit, adaptando apenas para o funcionamento dentro da finalidade que desejamos no site.

Além disso, o componente ItemContent é utilizado em seu conteúdo para representar cada item da lista suspensa.

EventCard

Aqui temos o componente utilizado para representar um evento no site. A estilização desse é feita baseada em uma nota adesiva e utilizamos na seção de Eventos.

Visão geral do código:

import React, { useState } from 'react';

import './styles.css'

interface Properties {
    title?: string;
    day?: string;
    month?: string;
    year?: string;
    description: string;
    time?: string;
    eventURL?: string;
    href?: string;
    local?: string;
    note?: boolean;
}
const EventCard:React.FC<Properties> = ({note, title, day, month, year, description, time, local, eventURL, href}) => {
  const [isOver, setIsOver] = useState(false);
  const dateTime = day != "" && month != "" && year != "" && time != "" ? `${day}/${month}/${year} - ${time}` : ""

  return (
    note ? 
    <div id="eventcard-component" onMouseOver={() => setIsOver(true)} onMouseOut={() => setIsOver(false)}>
    <div className="header-note">
      <div className="pin">
         <div className="pin-part">
         </div>
       </div>
      </div>
      <p className="note">
        {description}
      </p>
   </div>:
    <div id="eventcard-component" onMouseOver={() => setIsOver(true)} onMouseOut={() => setIsOver(false)}>
     <div className="header-note">
       <div className="pin">
          <div className="pin-part">
          </div>
        </div>
        <div className="title">
          <h3>{title}</h3>
          <div className="infos">
            <span>{dateTime}</span>
            <span>{local}</span>
          </div>
        </div>
       </div>
       <p>
         {description}
       </p>
      <div className={isOver ?  "more" : "more-hidden"}>
        {eventURL.trim() == "" ?
        <a className="block">Adicionar à agenda</a>
        :
        <a href={eventURL}>Adicionar à agenda</a>
        }

        {href.trim() == "" ?
        <a className="block">Saber mais</a>
        :
        <a href={href}>Saber mais</a>
        }
      </div> 
    </div>
  );
}

Propriedades

  • title: Título da nota adesiva. Ex: Café com Elas

  • day: Dia do evento. Ex: 05

  • month: Mês do evento. Ex: 11

  • year: Ano do evento. Ex: 2020

  • description: Descrição breve sobre o evento. Ex: Café com elas na JACC

  • time: Horário que irá ocorrer o evento. Ex: 19h

  • eventURL: URL para adicionar o evento à agenda ou acessar uma plataforma que sediará o evento de forma remota

  • href: URL para site ou ambiente para mais informações sobre o evento

  • local: Onde o evento irá ocorrer. Ex: Google Meet

  • note: Booleano que representa opção para a nota apenas mostrar a descrição passada, em caso de não houver eventos a serem listados

Mais informações

Esse componente foi todo feito à mão para ser adicionado à proposta do site.

IconStatus

O IconStatus é um componente utilizado para mostrar uma imagem que contém um ícone de status abaixo. No site, ele é utilizado para mostrar as causas que o Elas@Computação apoia, deixando em evidência algum movimento em campanha no momento.

Visão geral do código:

import React from 'react';

import Tooltip from '../Tooltip';

import './styles.css'

interface Properties {
    icon: string;
    status: string;
    statusText: string;
}

const IconStatus:React.FC<Properties> = ({icon, status, statusText}) => {
  return (
    <div id="iconstatus-component">
      <img className="icon" src={icon} alt="Icon"/>     
      <Tooltip position="bottom" slim={false} text={statusText}>
        <img src={status}  alt="Status" className="status"/>
      </Tooltip>
    </div>
  );
}

export default IconStatus;

Propriedades

  • icon: Imagem principal do componente, que ficará em evidência. Ex: elas_vertical

  • status: Imagem que aparecerá como status atual da imagem, ficará no canto inferior direito da imagem original. Ex: icons.lgbtFlag

  • statusText: Texto que será exibido ao passar o mouse por cima do status em um Tooltip. Ex: O Elas@Computação é favorável a todo tipo de amor.

Mais informações

O componente Tooltip é utilizado dentro desse para o efeito de mostrar o texto de apoio à causa ao passar o mouse por cima do ícone de status.

ItemContent

Esse componente representa um item de um DropDown.

Visão geral do código:

import React from 'react';

import './styles.css'

interface Properties {
    src: string;
    title: string;
}

const ItemContent:React.FC<Properties> = ({src, title}) => {
  return (
    <div id="itemcontent-component">
        <img src={src} alt={title}/>
        <span>{title}</span>
    </div>
  );
}

export default ItemContent;

Propriedades

  • src: Caminho/endereço para uma imagem que representa o item. Ex: icons.brasilFlag

  • title: Título do item. Ex: Português

Mais informações

Esse componente foi feito apenas para representar de maneira mais adequada um item em uma lista suspensa no formato que se desejava no site.

LinkButton

Componente de botão com redirecionamento para uma URL. Utilizado nas seções e nos cards de projeto.

Visão geral do código:

import React from 'react';

import './styles.css'

interface Properties {
    href: string;
    title: string;
}

const LinkButton:React.FC<Properties> = ({href, title}) => {
  return (
    <a id="linkbutton-component" href={href} target="_blank">
        <span>{title}</span>
    </a>
  );
}

export default LinkButton;

Propriedades

  • href: URL que o botão irá redirecionar. Ex: /schedule

  • title: Título do botão. Ex: Conferir

Mais informações

Esse componente foi feito com a finalidade de reaproveitamento do código e do estilo de botão.

PictureLink

Componente de link com imagem. Utilizamos em duas seções do site: no Painel, para representar as membras e redirecionar para seus respectivos GitHubs e nas Parcerias, para representar nossos parceiros e redirecionar para seus sites/GitHubs.

Visão geral do código:

import React from 'react';
import Tooltip from '../Tooltip';

import './styles.css'

interface Properties {
    pic: string;
    href: string;
    text: string;
};

const PictureLink:React.FC<Properties> = ({pic, href, text}) =>  {

  return (
    <div id="picturelink-component">
        <Tooltip position="bottom" slim={true} text={`${text}`}>
            <a href={href} target="_blank">
              <img src={pic} alt={text}/>
            </a>
        </Tooltip>
    </div>
  );
}

export default PictureLink;

Propriedades

  • pic: URL ou caminho para imagem que aparecerá no componente. Ex: icons.brasilFlag

  • href: URL que irá redirecionar o usuário. Ex: https://www.github.com/elasComputacao

  • text: Texto que aparecerá no tooltip com informações acerca do que se trata o link. Ex: OpenDev UFCG

Mais informações

O componente Tooltip também é utilizado na implementação desse componente.

ProjectCard

ProjectCard é o componente que representa um card de projeto. No site, podemos vê-los no carrossel de projetos na seção Projetos.

Visão geral do código:

import React from 'react';
import LinkButton from '../LinkButton';

import './styles.css'

interface Properties {
    title: string;
    description: string;
    imageURL: string;
    href: string;
    type: string;
    color?: string;
    buttonText: string;
}
const ProjectCard:React.FC<Properties> = ({title, description, imageURL, href, type, color, buttonText}) => {
  
  const DEFAULT_COLOR = "#fff6f3";

  const backgroundStyle = {
    backgroundColor: color && color == "" ? DEFAULT_COLOR : color
  }


  return (
    <div id="projectcard-component" className={type}>
      <div className="img-content" style={backgroundStyle}>
        <img src={imageURL}/>
      </div>
      <div className="content">
        <h3>{title}</h3>
        <p>
          {description}
        </p>
        <LinkButton
        href={href}
        title={buttonText}
        />
      </div>
    </div>
  );
}

export default ProjectCard;

Propriedades

  • title: Título/nome do card. Ex: Café com Elas

  • description: Descrição breve sobre o conteúdo. Ex: O Café com Elas promove conversas e palestras de mulheres da TI, para estimular discussões voltadas para a área, nosso lugar, espaço e papel, buscando criar um ambiente acolhedor para a participação das meninas na comunidade.

  • imageURL: URL ou caminho para imagem que ilustra o card.

  • href: URL para site ou outra plataforma com mais informações. Ex: https://github.com/elasComputacao

  • type: Sinalização para se o card deve ficar em destaque ou não. Pode assumir os valores "normal" para demonstração comum e "spotlight" para evidenciar.

  • color: Cor de fundo para a imagem. Caso não seja recebida uma cor, por default é setada a cor "#fff6f3". O padrão utilizado é o hexadecimal. Ex: #ffffff

  • buttonText: Texto a ser apresentado no LinkButton. Ex: Conferir

Mais informações

O componente LinkButton é utilizado na implementação desse componente.

Section

Componente utilizado para representar as seções do site.

Visão geral do código:

import React, { useEffect, useState } from 'react';
import { ChevronsDown, ChevronsUp } from 'react-feather';
import LinkButton from '../LinkButton';

import './styles.css'

interface Properties {
    title: string;
    className?: string;
    toggle?: boolean;
    subtitle?: string;
    link?:string;
    color?:string;
}
const Section:React.FC<Properties> = ({title, children, className, toggle, subtitle, link, color}) => {
  
  const [hidden, setHidden] = useState(true);
  const [text, setText] = useState("");

  useEffect(() => {
    if (toggle) {
      handleToggle();
    }
  }, [])

  function handleToggle() {
    const section = window.document.getElementById(className);
    if (hidden) {
      if (window.innerWidth > 1080) {
        section.style.maxHeight = "416px";
      } else {
        section.style.maxHeight = "246px";
      }
    } else {
      section.style.maxHeight = "600vh";
    }
    setHidden(!hidden);
  }

  return (
    <div id="section-component" className={className} style={{backgroundColor: color}}>
        <div id={title}></div>
          <h1>{title}</h1>
          <div className="children" id={className}>
              {children}
          </div>
          {toggle ? 
            <button className="toggle" 
            onClick={handleToggle}
            onMouseOver={() => {hidden ? setText("Mostrar menos") : setText("Mostrar mais")}}
            onMouseOut={() => setText("")}
            >
              {hidden ? <ChevronsUp className="icon"/> : <ChevronsDown className="icon"/>}
            </button> : <></>
          }
          {toggle ? 
            <span className="status">{text}</span> : <></>
          }
          {link ? <LinkButton title={subtitle} href={link}/> : <></>}
    </div>
  );
}

export default Section;

Propriedades

  • title: Título da seção. Ex: Sobre

  • className: Nome da classe CSS para estilização exclusiva. Ex: section-about

  • toggle: Booleano que, se passado (true), adiciona uma opção de esconder ou expandir parte do conteúdo da seção.

  • subtitle: Texto utilizado no LinkButton para redirecionamento, caso passado. Ex: Confira a agenda

  • link: Booleano que indica se a seção tem um link de redirecionamento que completa seu conteúdo. Um exemplo para tal pode ser visto na seção Eventos do site, que redireciona para a agenda.

  • color: Cor de fundo da section, padrão em hexadecimal.

Mais informações

LinkButton também é utilizado na implementação desse componente.

Tooltip

Componente de efeito de tooltip.

Visão geral do código:

import React from "react";

import {
  useTooltipState,
  Tooltip as ReakitTooltip,
  TooltipReference,
} from "reakit/Tooltip";

import './styles.css'

const Tooltip = ({ children, text, slim, position, ...props }) => {
  const tooltip = useTooltipState({placement: position});
  return (
    <>
      <TooltipReference {...tooltip} ref={children.ref} {...children.props}>
        {(referenceProps) => React.cloneElement(children, referenceProps)}
      </TooltipReference>
      <ReakitTooltip {...tooltip} {...props} id={slim ? "text-slim" : "text"}>
        <p>
            {text}
        </p>
      </ReakitTooltip>
    </>
  );
}

export default Tooltip;

Propriedades

  • children: Componente que ativará o tooltip ao passar com mouse por cima. A tag deverá envolver esse componente.

  • text: Texto que aparecerá no conteúdo do tooltip. Ex: CAESI

  • slim: Booleano que indica se o tooltip deve ter uma área menor, para receber apenas uma frase pequena ou palavra, como nos ícones do Painel.

  • position: Indica a posição que ele deve aparecer em relação ao componente que o ativa. Os padrões são seguidos de acordo com o Reakit.

Mais informações

Esse componente é escrito em cima do Tooltip do Reakit, adaptando-o apenas para facilitar nosso uso no contexto do site.

← FunctionsPages →
  • Visão Geral
  • ContactCard
    • Propriedades
    • Mais informações
  • DropDown
    • Propriedades
    • Mais informações
  • EventCard
    • Propriedades
    • Mais informações
  • IconStatus
    • Propriedades
    • Mais informações
  • ItemContent
    • Propriedades
    • Mais informações
  • LinkButton
    • Propriedades
    • Mais informações
  • PictureLink
    • Propriedades
    • Mais informações
  • ProjectCard
    • Propriedades
    • Mais informações
  • Section
    • Propriedades
    • Mais informações
  • Tooltip
    • Propriedades
    • Mais informações
Site Elas@Computação Docs
Docs
Projetos
Community
InstagramTwitter
More
BlogGitHubStar
Facebook Open Source
Copyright © 2020 Elas@Computação