Radix
A biblioteca Radix nos permite importar componentes com lógica pronta, como Modais ou Collapsibles, deixando a parte de layout e estilos para criarmos. Para cada componente que desejarmos usar, devemos adicionar o pacote ao nosso projeto e seguir a documentação da biblioteca.
Modais
Documentação oficial
Para a criação de modais, utilizamos o componente Dialog da biblioteca.
yarn add @radix-ui/react-dialog
Seguindo a documentação oficial, devemos montar uma grande estrutura. Disponibilizamos, porém, esta estrutura pronta nos projetos, nos preocupando apenas com o conteúdo do modal.
Estrutura padrão
// Importando todos os componentes de Dialog
import * as Dialog from '@radix-ui/react-dialog';
function Modal() {
return (
<Dialog.Root>
<Dialog.Trigger />
<Dialog.Portal>
// Overlay para deixar o fundo com blur
<Dialog.Overlay />
//Todo o conteúdo do modal
<Dialog.Content>
// Título do modal
<Dialog.Title />
// Descrição do modal
<Dialog.Description />
// Componente para fechamento do modal
<Dialog.Close />
</Dialog.Content>
</Dialog.Portal>
</Dialog.Root>
)
}
Criação
Para criarmos um modal, devemos criar um novo componente com alguns componentes prontos:
import { DialogClose, DialogIconButton, DialogSeparator, DialogTitle, DialogDescription } from '../modal';
export function ModalTeste( /*Props que precisar*/ props) {
// Podem ser criados quaisquer estados, variáveis, ou utilizar qualquer hook
return (
<>
/*
DialogClose é o componente que envolve qualquer item que terá como
função fechar o modal. Neste caso, é passado um ícone de "X" com borda.
asChild define que DialogClose será representado como a tag que for
passada dentro.
*/
<DialogClose asChild>
<DialogIconButton>
<IoCloseSharp />
</DialogIconButton>
</DialogClose>
/*
Título do modal, que ficará em destaque.
*/
<Title>Modal Teste</Title>
/*
Separador de seção do modal.
*/
<DialogSeparator />
// ...
// Todo o conteúdo desejado.
// ...
/*
Outro DialogClose, que envolve um botão para fecharmos o modal.
*/
<DialogClose asChild>
<FullButton warning>Cancelar</FullButton>
</DialogClose>
</>
)
}
Importe os componentes padrões do nosso componente modal
, e não os da biblioteca.
Utilização
Utilizamos o componente ModalTrigger e passamos a ele o modal que desejamos abrir:
function Pagina() {
...
<ModalTrigger
// Propriedade que define se o modal será fechado caso clique fora.
// Não é necessário passar quando for desejado.
isClosableOutside={true}
// Passamos na propriedade "component" o modal que será aberto ao clicar
// no conteúdo de dentro.
component={<ModalTeste />}
>
// Conteúdo que será visto pelo usuário e terá a função de abrir o modal
<FullButton success>Abrir modal</FullButton>
</ModalTrigger>
<ModalTrigger isOverlay={false} component={<ModalTeste />}>
<LargeButton success>Modal sem overlay</LargeButton>
</ModalTrigger>
...
}
Resultado:
Collapsible
Documentação oficial
Para a criação de collapsibles (seções que expandem/retraem), utilizamos o componente Collapsible da biblioteca.
yarn add @radix-ui/react-collapsible
Seguindo a documentação oficial, devemos montar uma estrutura. Disponibilizamos, porém, esta estrutura pronta nos projetos, nos preocupando apenas com o conteúdo do collapsible.
Estrutura padrão
import * as Collapsible from '@radix-ui/react-collapsible';
function Collapsible() {
<Collapsible.Root>
// Componente responsável por expandir/retrair ao clicar
<Collapsible.Trigger />
// Conteúdo
<Collapsible.Content />
</Collapsible.Root>
}
Criação
Para criarmos um Collapsible, criamos um componente e utilizamos alguns componentes prontos:
import { CollapsibleContent } from "{components}/collapsible";
function CollapsibleExemplo(/* Props necessários */ props) {
return(
// Container customizado
<CollapsibleContent>
//Conteúdo
<p>Collapsible text</p>
</CollapsibleContent>
)
}
Utilização
Para utilizarmos o collapsible, o passamos como propriedade do componente CollapsibleTrigger:
import { CollapsibleTrigger } from "{components}/collapsible";
import { CollapsibleExemplo } from "..."
function PaginaExemplo() {
// ...
// Elemento que terá função de abrir/fechar o collapsible
<CollapsibleTrigger component={<CollapsibleExemplo />}>
// Visual
<FilterButton />
</CollapsibleTrigger>
// ...
}
Resultado:
Clique para abrir/fechar: