Descrição: Biblioteca de componentes React focada em aplicações de saúde, criada para ser publicada como pacote reutilizável. Fornece componentes UI, ícones, hooks e estilos prontos para uso. Para impulsionar o reuso e escalabilidade dos componentes, está sendo aplicatido o padrão de composição (composition pattern).
- Versão recomendada: Node.js 18.x ou superior
- Download: https://nodejs.org/
- Como verificar se está instalado:
node --version- Vem junto com Node.js
- Versão recomendada: npm 9.x ou superior (confira em
package.json:npm 11.6.0+) - Como verificar:
npm --version- Para clonar o repositório e fazer contribuições
- Download: https://git-scm.com/
- Download: https://code.visualstudio.com/
- Extensões recomendadas:
- ES7+ React/Redux/React-Native snippets
- ESLint
- Prettier
- Storybook
git clone https://github.com/designsystematomic-blip/dados-saude-lib-components.git
cd dados-saude-lib-componentsnpm installIsso instala automaticamente:
- React e React DOM (peer dependencies)
- Vite (build tool)
- TypeScript (tipagem)
- ESLint e Prettier (linting e formatação)
- Storybook (documentação visual)
- Plop (gerador de componentes)
- Todas as outras devDependencies listadas em
package.json
npm run buildSe não houver erros, está pronto para usar!
- React ^19.1.0
- React DOM ^19.1.0
- react-webcam ^7.2.0 (para componente Camera)
- react-webcam ^7.2.0 (para captura de câmera)
- Vite ^7.1.7 (bundler)
- TypeScript ~5.8.3 (linguagem)
- Storybook ^9.1.8 (documentação de componentes)
- ESLint ^9.38.0 (linter)
- Prettier ^3.6.2 (formatador de código)
- Plop ^4.0.3 (gerador de código)
- Vitest ^3.2.4 (testes unitários)
Ferramentas e Dependências de Desenvolvimento
- Build:
viteerollup(via Vite internamente). - Tipos:
typescript,vite-plugin-dts. - Lint:
eslint,prettier. - Storybook:
@storybook/react-vite. - Gerador automatizado de componentes:
plop. - Biblioteca:
ReactJS - Gerenciador de pacotes:
npm 11.6.0+
Tecnologias necessárias
Para desenvolvedor localmente
Após instalar os pré-requisitos (Node.js, npm) e clonar o repositório:
- Instalar dependências do projeto:
npm install- Iniciar ambiente de desenvolvimento (com hot-reload):
npm run devAcesse em http://localhost:5173 (porta padrão do Vite).
- Visualizar componentes no Storybook (recomendado para desenvolvimento):
npm run storybookAcesse em http://localhost:6006.
- Gerar um novo componente rapidamente:
npm run generateSiga as instruções do prompt.
- Fazer build para produção:
npm run build- Fazer lint do código:
npm run lintFaça o login no npm
npm link
Após o login, pode executar a cli abaixo. Antes, certifique-se que não há arquivos para commitar:
npm run release
Essa etapa é fundamental para que os componentes criados localmente sejam visíveis por outro repositório, para isso:
Tornar o repositório linkável localmente
npm link
Buildar os componentes em tempo real
npm run watch
No repositório que desejar, abra o terminal e execute o seguinte comando:
npm link design-system-atomic
- Button
- Camera
- Card
- CardAction
- Checkbox
- Divider
- Drawer
- Droplist
- EmptyState
- Header
- Image
- Input
- Menu
- Modal
- Select
- Snackbar
- Tag
- Text
- Textarea
- Title
- ToggleSwitch
- UploadFile
- VetorialImage
- Wrapper
Observação: os componentes acima correspondem às pastas encontradas em
lib/components. Alguns componentes podem ter subcomponentes ou arquivos de tipagem separados.
- O projeto inclui suporte a Storybook para documentar e visualizar componentes isoladamente.
- Como rodar localmente:
npm run storybook- O Storybook roda em
http://localhost:6006por padrão e mostra cada componente em diferentes estados (stories). Use-o para revisar visuais, acessibilidade e exemplos de props. - Para gerar uma build estática do Storybook (útil para documentação pública):
npm run build-storybookPlop (Gerador de Componentes)
- O repositório inclui templates Plop em
generate/plop-templatese umplopfile.tsemgenerate/para criar rapidamente novos componentes seguindo o padrão do projeto. - Para executar o gerador:
npm run generate- O comando irá executar o plop com o
plopfiledo projeto e promptar informações (nome do componente, criar arquivos de teste, story, etc.). Ele automatiza:- criação de pasta do componente
- arquivos
.tsx,.module.css,.stories.tsxe.types.tsa partir de templates
Como executar os exemplos localmente
- Copie o conteúdo do exemplo desejado para
src/App.tsx(ou importe o componente deexamples/— veja abaixo). - Rode o ambiente de desenvolvimento:
npm install
npm run devExemplos Detalhados (Componentes Principais)
Observação: os exemplos abaixo assumem que você está desenvolvendo dentro do monorepo. Para consumir a lib como pacote publicado use import { Button } from 'dados-saude';.
- Button
import React from 'react';
import { Button } from '@lib/components/Button';
export default function ButtonExample() {
return (
<div style={{ padding: 20 }}>
<Button onClick={() => alert('Salvo')}>Salvar</Button>
<Button onClick={() => {}} disabled style={{ marginLeft: 8 }}>
Desabilitado
</Button>
</div>
);
}- Input
import React, { useState } from 'react';
import { Input } from '@lib/components/Input';
export default function InputExample() {
const [value, setValue] = useState('');
return (
<div style={{ padding: 20 }}>
<Input
value={value}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
setValue(e.target.value)
}
placeholder="Digite seu nome"
/>
<p>Valor atual: {value}</p>
</div>
);
}- Modal
import React, { useState } from 'react';
import { Modal } from '@lib/components/Modal';
import { Button } from '@lib/components/Button';
export default function ModalExample() {
const [open, setOpen] = useState(false);
return (
<div style={{ padding: 20 }}>
<Button onClick={() => setOpen(true)}>Abrir modal</Button>
<Modal open={open} onClose={() => setOpen(false)}>
<div style={{ padding: 16 }}>
<h3>Título da Modal</h3>
<p>Conteúdo interno da modal.</p>
<Button onClick={() => setOpen(false)}>Fechar</Button>
</div>
</Modal>
</div>
);
}- Camera
import React from 'react';
import { Camera } from '@lib/components/Camera';
export default function CameraExample() {
function handleCapture(dataUrl: string) {
// dataUrl é a imagem capturada em base64
console.log('captured', dataUrl);
}
return (
<div style={{ padding: 20 }}>
<Camera onCapture={handleCapture} />
</div>
);
}- Select (exemplo rápido)
import React, { useState } from 'react';
import { Select } from '@lib/components/Select';
export default function SelectExample() {
const [value, setValue] = useState('');
const options = [
{ label: 'Opção 1', value: '1' },
{ label: 'Opção 2', value: '2' },
];
return (
<div style={{ padding: 20 }}>
<Select options={options} value={value} onChange={(v) => setValue(v)} />
<p>Selecionado: {value}</p>
</div>
);
}Arquivos de exemplo
Há exemplos prontos em examples/ (componentes individuais). Você pode importar qualquer um em src/App.tsx para rodar rapidamente.
Exemplos de Uso
Import básico de um componente (após instalar o pacote):
import React from 'react';
import { Button } from 'dados-saude';
export default function Example() {
return (
<div>
<Button onClick={() => alert('clicou')}>Salvar</Button>
</div>
);
}Import por subpath (quando disponível):
import { Button } from 'dados-saude/components';
import { Camera } from 'dados-saude/components/Camera';Importando estilos da biblioteca (se preferir aplicar globalmente):
@import 'dados-saude/styles/style.css';
/* ou importar arquivos específicos em seu entrypoint */Uso de componentes comuns — exemplos rápidos:
- Button:
<Button onClick={...}>Texto</Button> - Input:
<Input value={value} onChange={...} /> - Checkbox:
<Checkbox checked={x} onChange={...} /> - Camera:
<Camera onCapture={...} />(usareact-webcamcomo peer dependency) - Modal:
<Modal open={open} onClose={...}><p>Conteúdo</p></Modal> - Select:
<Select options={[...]} value={v} onChange={...} /> - UploadFile:
<UploadFile onUpload={...} />
Se precisar, eu posso adicionar exemplos de uso por prop para componentes específicos.
Export Map / Entradas Principais
package.jsonfornece entradas exportáveis, por exemplo:."aponta para./dist/main.js(main import),./componentsaponta para./dist/components/index.js.
Verifique package.json para o mapa completo de exports caso precise de import por subpath.
Dicas e Troubleshooting
- Se receber erros de peer dependency, instale a versão apropriada do
react/react-domno projeto consumidor. - Se os tipos não aparecerem após instalar o pacote, confirme se
typesempackage.jsonaponta paradist/main.d.tse que o pacote foi publicado com as declarações. - Para ver os arquivos que serão publicados, confira a seção
filesempackage.json.
MIT