@rendra-ui/web 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +433 -0
- package/bin/rendra.mjs +114 -0
- package/dist/base.css +246 -0
- package/dist/button-DIcpJwK9.js +143 -0
- package/dist/button-DIcpJwK9.js.map +1 -0
- package/dist/chart.js +520 -0
- package/dist/chart.js.map +1 -0
- package/dist/cli/auditar.js +125 -0
- package/dist/cli/auditar.js.map +1 -0
- package/dist/cli/codigos.js +15 -0
- package/dist/cli/codigos.js.map +1 -0
- package/dist/cli/help.js +17 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/trocar.js +242 -0
- package/dist/cli/trocar.js.map +1 -0
- package/dist/cli/typescript-loader.js +27 -0
- package/dist/cli/typescript-loader.js.map +1 -0
- package/dist/cn-DVPheE99.js +22 -0
- package/dist/cn-DVPheE99.js.map +1 -0
- package/dist/components-Cm2ezlPT.js +800 -0
- package/dist/components-Cm2ezlPT.js.map +1 -0
- package/dist/components.css +3365 -0
- package/dist/document-viewer.js +204 -0
- package/dist/document-viewer.js.map +1 -0
- package/dist/empty-state-DtyZAfYb.js +168 -0
- package/dist/empty-state-DtyZAfYb.js.map +1 -0
- package/dist/index.js +10530 -0
- package/dist/index.js.map +1 -0
- package/dist/rendra-provider-cCnquOZy.js +88 -0
- package/dist/rendra-provider-cCnquOZy.js.map +1 -0
- package/dist/rich-text-editor.js +439 -0
- package/dist/rich-text-editor.js.map +1 -0
- package/dist/router-bridge.js +51 -0
- package/dist/router-bridge.js.map +1 -0
- package/dist/tokens.css +732 -0
- package/dist/tooltip-DyeuGPCc.js +105 -0
- package/dist/tooltip-DyeuGPCc.js.map +1 -0
- package/dist/types/brand/apply-theme.d.ts +9 -0
- package/dist/types/brand/brand-context.d.ts +21 -0
- package/dist/types/brand/brand-provider.d.ts +49 -0
- package/dist/types/brand/palette.d.ts +63 -0
- package/dist/types/brand/public.d.ts +6 -0
- package/dist/types/brand/theme.d.ts +80 -0
- package/dist/types/brand/types.d.ts +54 -0
- package/dist/types/brand/use-brand.d.ts +1 -0
- package/dist/types/catalog/components.d.ts +81 -0
- package/dist/types/chart.d.ts +1 -0
- package/dist/types/components/app-shell/app-shell.d.ts +36 -0
- package/dist/types/components/app-shell/command-search.d.ts +1 -0
- package/dist/types/components/app-shell/header.d.ts +1 -0
- package/dist/types/components/app-shell/layout.d.ts +53 -0
- package/dist/types/components/app-shell/mega-menu.d.ts +1 -0
- package/dist/types/components/app-shell/navigation-utils.d.ts +18 -0
- package/dist/types/components/app-shell/notifications.d.ts +6 -0
- package/dist/types/components/app-shell/shell-context.d.ts +48 -0
- package/dist/types/components/app-shell/sidebar.d.ts +1 -0
- package/dist/types/components/app-shell/types.d.ts +53 -0
- package/dist/types/components/layout/index.d.ts +4 -0
- package/dist/types/components/layout/page-header.d.ts +38 -0
- package/dist/types/components/layout/primitives.d.ts +71 -0
- package/dist/types/components/layout/tokens.d.ts +43 -0
- package/dist/types/components/rendra-provider.d.ts +48 -0
- package/dist/types/components/rendra-router-bridge.d.ts +18 -0
- package/dist/types/components/ui/accordion.d.ts +16 -0
- package/dist/types/components/ui/action-bar.d.ts +35 -0
- package/dist/types/components/ui/alert.d.ts +26 -0
- package/dist/types/components/ui/avatar.d.ts +23 -0
- package/dist/types/components/ui/badge.d.ts +15 -0
- package/dist/types/components/ui/brand-feedback-icon.d.ts +26 -0
- package/dist/types/components/ui/brand-logo.d.ts +8 -0
- package/dist/types/components/ui/breadcrumb.d.ts +19 -0
- package/dist/types/components/ui/button-group.d.ts +27 -0
- package/dist/types/components/ui/button.d.ts +30 -0
- package/dist/types/components/ui/calendar.d.ts +34 -0
- package/dist/types/components/ui/card.d.ts +32 -0
- package/dist/types/components/ui/chart.d.ts +57 -0
- package/dist/types/components/ui/chat.d.ts +137 -0
- package/dist/types/components/ui/checkbox.d.ts +37 -0
- package/dist/types/components/ui/checklist.d.ts +16 -0
- package/dist/types/components/ui/color-picker.d.ts +13 -0
- package/dist/types/components/ui/data-toolbar.d.ts +37 -0
- package/dist/types/components/ui/date-picker.d.ts +41 -0
- package/dist/types/components/ui/document-viewer.d.ts +19 -0
- package/dist/types/components/ui/drawer.d.ts +30 -0
- package/dist/types/components/ui/dropdown-menu.d.ts +20 -0
- package/dist/types/components/ui/empty-state.d.ts +15 -0
- package/dist/types/components/ui/error-page.d.ts +13 -0
- package/dist/types/components/ui/field.d.ts +42 -0
- package/dist/types/components/ui/form.d.ts +42 -0
- package/dist/types/components/ui/image-cropper.d.ts +55 -0
- package/dist/types/components/ui/image-viewer.d.ts +14 -0
- package/dist/types/components/ui/info-hint.d.ts +9 -0
- package/dist/types/components/ui/input.d.ts +91 -0
- package/dist/types/components/ui/kanban.d.ts +98 -0
- package/dist/types/components/ui/list.d.ts +31 -0
- package/dist/types/components/ui/modal.d.ts +27 -0
- package/dist/types/components/ui/otp-input.d.ts +17 -0
- package/dist/types/components/ui/overlay-shell.d.ts +14 -0
- package/dist/types/components/ui/pagination.d.ts +18 -0
- package/dist/types/components/ui/picker-panel.d.ts +24 -0
- package/dist/types/components/ui/popover.d.ts +12 -0
- package/dist/types/components/ui/progress.d.ts +16 -0
- package/dist/types/components/ui/qr-code.d.ts +13 -0
- package/dist/types/components/ui/radio-group.d.ts +27 -0
- package/dist/types/components/ui/rating.d.ts +19 -0
- package/dist/types/components/ui/rendra-credit.d.ts +12 -0
- package/dist/types/components/ui/repeatable-field.d.ts +22 -0
- package/dist/types/components/ui/rich-text-editor.d.ts +21 -0
- package/dist/types/components/ui/select.d.ts +65 -0
- package/dist/types/components/ui/separator.d.ts +7 -0
- package/dist/types/components/ui/skeleton.d.ts +3 -0
- package/dist/types/components/ui/slider.d.ts +18 -0
- package/dist/types/components/ui/sortable-handle.d.ts +16 -0
- package/dist/types/components/ui/spinner.d.ts +7 -0
- package/dist/types/components/ui/stat-card.d.ts +20 -0
- package/dist/types/components/ui/switch.d.ts +15 -0
- package/dist/types/components/ui/table.d.ts +134 -0
- package/dist/types/components/ui/tabs.d.ts +25 -0
- package/dist/types/components/ui/textarea.d.ts +10 -0
- package/dist/types/components/ui/timeline.d.ts +18 -0
- package/dist/types/components/ui/toast.d.ts +18 -0
- package/dist/types/components/ui/tooltip.d.ts +17 -0
- package/dist/types/components/ui/upload.d.ts +50 -0
- package/dist/types/components/ui/widget-grid.d.ts +22 -0
- package/dist/types/components/ui/wizard.d.ts +38 -0
- package/dist/types/document-viewer.d.ts +1 -0
- package/dist/types/hooks/use-breakpoint.d.ts +21 -0
- package/dist/types/hooks/use-debounced-value.d.ts +5 -0
- package/dist/types/hooks/use-fill-height.d.ts +6 -0
- package/dist/types/hooks/use-lookup.d.ts +30 -0
- package/dist/types/hooks/use-reduced-motion.d.ts +1 -0
- package/dist/types/index.d.ts +76 -0
- package/dist/types/lib/cn.d.ts +2 -0
- package/dist/types/lib/contrast.d.ts +2 -0
- package/dist/types/lib/control.d.ts +20 -0
- package/dist/types/lib/lookup.d.ts +22 -0
- package/dist/types/lib/masks.d.ts +46 -0
- package/dist/types/lib/qr-encode.d.ts +48 -0
- package/dist/types/lib/shape.d.ts +8 -0
- package/dist/types/lib/sortable.d.ts +72 -0
- package/dist/types/lib/validators.d.ts +14 -0
- package/dist/types/rendra-router-bridge.d.ts +1 -0
- package/dist/types/rich-text-editor.d.ts +1 -0
- package/dist/types/widget-grid.d.ts +1 -0
- package/dist/use-breakpoint-BmXOZtF9.js +49 -0
- package/dist/use-breakpoint-BmXOZtF9.js.map +1 -0
- package/dist/widget-grid.js +118 -0
- package/dist/widget-grid.js.map +1 -0
- package/package.json +182 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Bruno Magalhaes
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
# Rendra Design System
|
|
2
|
+
|
|
3
|
+
**Template de sistema e layout de sistema administrativo em React, gratuito e open source: design system completo e boilerplate com tokens, três templates, componentes, AppShell, telas prontas (dashboard, listagem, cadastro, CRM kanban, agenda e chat omnichannel), Storybook e testes de layout.** Feito para ser o ponto de partida de todos os projetos: layouts previsíveis, espaçamento equilibrado e funcionamento completo no celular. Para aplicar a outro sistema, você troca cores, fonte e ícones da marca, e nenhum componente muda.
|
|
4
|
+
|
|
5
|
+
      [](https://github.com/bsmagalhaes/rendra-design-system/actions/workflows/ci.yml)
|
|
6
|
+
|
|
7
|
+
**Veja funcionando, sem instalar nada:** [demo do app](https://bsmagalhaes.github.io/rendra-design-system/) · [galeria com códigos de modelo](https://bsmagalhaes.github.io/rendra-design-system/galeria/) · [Storybook](https://bsmagalhaes.github.io/rendra-design-system/storybook/) · [vitrine de componentes](https://bsmagalhaes.github.io/rendra-design-system/componentes/) · [atendimento](https://bsmagalhaes.github.io/rendra-design-system/atendimento/) · [agenda](https://bsmagalhaes.github.io/rendra-design-system/agenda/) · [kanban](https://bsmagalhaes.github.io/rendra-design-system/kanban/). No demo, o menu do avatar troca modelo, paleta, modo e layout ao vivo.
|
|
8
|
+
|
|
9
|
+
| Atendimento omnichannel | Painel com widgets ajustáveis |
|
|
10
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
11
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=safira-atendimento) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=safira-dashboard-ajuste) |
|
|
12
|
+
|
|
13
|
+
| Calendário e agenda | Kanban |
|
|
14
|
+
| ----------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
15
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=safira-calendario) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=aurora-kanban) |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## O que é
|
|
20
|
+
|
|
21
|
+
O Rendra reúne, num único repositório, tudo o que uma equipe precisa para construir interfaces consistentes:
|
|
22
|
+
|
|
23
|
+
- um **sistema de tokens** travado (espaço, tipografia, cores, raio, sombra, degradê e densidade), em que o que está fora da escala simplesmente não existe;
|
|
24
|
+
- **três modelos** de formato e fonte (quadrado, intermediário e arredondado) e **quatro paletas**, combináveis entre si. Uma paleta é só **4 cores e o degradê da marca**: o resto (texto sobre cada cor, fundos suaves, sidebar, gráficos e o modo escuro) é gerado com contraste AA conferido, e as cores de sistema (erro, sucesso, alerta e informação) são as mesmas em todas;
|
|
25
|
+
- **mais de 50 componentes**, um por finalidade, todos reconstruídos para o celular sem versões paralelas;
|
|
26
|
+
- um **AppShell** configurável por props (menu lateral ou superior, sidebar recolhida, submenu em segunda barra, mega menu);
|
|
27
|
+
- **telas base** prontas (autenticação completa, painel, listagem, detalhe, formulário longo, wizard, configurações);
|
|
28
|
+
- uma **vitrine** navegável e um **Storybook** com mais de 100 stories;
|
|
29
|
+
- **regras escritas e verificadas por máquina**: verificador de regras de design, ESLint com acessibilidade, testes unitários e de componente (com cobertura mínima por arquivo), e testes no navegador de layout, acessibilidade (axe-core) e regressão visual, rodando no CI a cada Pull Request;
|
|
30
|
+
- um **registry do shadcn**: projetos criados a partir do Rendra recebem as melhorias dos componentes com um comando;
|
|
31
|
+
- **SEO e AEO prontos** no demo: título e descrição por tela (`src/config/seo.ts`), página estática por rota, `sitemap.xml`, `robots.txt`, `llms.txt`, Open Graph e dados estruturados (JSON-LD com perguntas frequentes).
|
|
32
|
+
|
|
33
|
+
Duas regras mestras guiam tudo:
|
|
34
|
+
|
|
35
|
+
1. **Um componente por finalidade.** Existe um Select, uma Table, um Modal, um Drawer, um Input. Diferenças são props, nunca arquivos novos.
|
|
36
|
+
2. **Mobile-first real.** Tudo é desenhado primeiro para 360px, sem rolagem horizontal, sem ação que dependa de hover e com toque mínimo de 44px.
|
|
37
|
+
|
|
38
|
+
E duas de boas práticas, verificadas pelo `npm run check:rules`: **nunca botão solto** (cada ação tem lugar previsto: rodapé fixo, barra da tabela, cabeçalho da tela ou do card, menu da linha) e **texto orientativo nunca solto no corpo da tela** (vai num ícone de informação ao lado do título, que abre um modal; só a orientação curta abaixo do campo fica visível, com limite de caracteres pela largura dele).
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Galeria
|
|
43
|
+
|
|
44
|
+
> **Clique em qualquer imagem** para abri-la em popup na [galeria do demo](https://bsmagalhaes.github.io/rendra-design-system/galeria/), com setas para passar e Esc para fechar. (O GitHub não permite popup dentro do README; por isso as telas já aparecem em tamanho de leitura aqui e os grupos extras abrem na própria página.)
|
|
45
|
+
|
|
46
|
+
## Códigos de modelo
|
|
47
|
+
|
|
48
|
+
Cada escolha visual tem um código curto: **T** para o tema (formato e fonte), **C** para as cores e **M** para o menu. `T1-C4-M5`, por exemplo, é o tema Safira com as cores Ardósia e o menu superior. Escolha na [galeria](https://bsmagalhaes.github.io/rendra-design-system/galeria/), onde cada captura mostra seu código e o bloco "Monte seu código" abre o demo já aplicado, e informe o código no briefing: a IA já sabe o que aplicar e pula essas perguntas.
|
|
49
|
+
|
|
50
|
+
| Tema | Cores | Menu |
|
|
51
|
+
| ------------------------------ | ---------------------------------------- | --------------------------------------------------- |
|
|
52
|
+
| **T1** Safira (quadrado) | **C1** Safira (azul e verde) | **M1** lateral recolhida, submenu em segunda barra |
|
|
53
|
+
| **T2** Equilíbrio (meio-termo) | **C2** Equilíbrio (violeta e ciano) | **M2** lateral recolhida, submenu dentro da sidebar |
|
|
54
|
+
| **T3** Aurora (arredondado) | **C3** Aurora (verde-petróleo e laranja) | **M3** lateral expandida, submenu em segunda barra |
|
|
55
|
+
| | **C4** Ardósia (grafite e laranja) | **M4** lateral expandida, submenu dentro da sidebar |
|
|
56
|
+
| | | **M5** menu superior com lista suspensa |
|
|
57
|
+
| | | **M6** menu superior com mega menu |
|
|
58
|
+
|
|
59
|
+
No demo, o endereço também aplica um código: [`/?codigo=T1-C4-M5`](https://bsmagalhaes.github.io/rendra-design-system/?codigo=T1-C4-M5). Os códigos ficam em [`src/config/presets.ts`](src/config/presets.ts).
|
|
60
|
+
|
|
61
|
+
### Os três templates
|
|
62
|
+
|
|
63
|
+
Cada template tem formato, fonte, símbolo e paleta próprios.
|
|
64
|
+
|
|
65
|
+
**Rendra Safira**: quadrado, como uma pedra lapidada. Azul #0B6FE0, verde #98D10A e fonte Poppins.
|
|
66
|
+
|
|
67
|
+
| Painel | Listagem de clientes |
|
|
68
|
+
| ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
69
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=safira-painel) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=safira-clientes) |
|
|
70
|
+
|
|
71
|
+
**Rendra Equilíbrio**: o meio-termo, nem quadrado nem 100% arredondado. Violeta, ciano e fonte DM Sans.
|
|
72
|
+
|
|
73
|
+
| Painel | Listagem de clientes |
|
|
74
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
75
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=equilibrio-painel) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=equilibrio-clientes) |
|
|
76
|
+
|
|
77
|
+
**Rendra Aurora**: 100% arredondado, como um novo dia. Verde-petróleo, laranja e fonte Inter.
|
|
78
|
+
|
|
79
|
+
| Painel | Listagem de clientes |
|
|
80
|
+
| ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
81
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=aurora-painel) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=aurora-clientes) |
|
|
82
|
+
|
|
83
|
+
**Paleta Ardósia**: combinável com qualquer modelo. Azul-ardósia #2E414D e laranja #EA600D; com texto branco pedido, o gerador escurece o botão laranja para #C5510B, o tom mais próximo que passa AA (aqui no modelo Equilíbrio).
|
|
84
|
+
|
|
85
|
+
| Painel | Listagem de clientes |
|
|
86
|
+
| --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
87
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=ardosia-painel) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=ardosia-clientes) |
|
|
88
|
+
|
|
89
|
+
### Calendário, agenda e kanban
|
|
90
|
+
|
|
91
|
+
| Agenda da semana (T2-C2) | Kanban no celular (T1-C1) |
|
|
92
|
+
| ---------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
93
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=equilibrio-agenda) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=safira-kanban-mobile) |
|
|
94
|
+
|
|
95
|
+
<details>
|
|
96
|
+
<summary><strong>Tipos de menu: M1 a M6</strong> (clique para abrir aqui mesmo)</summary>
|
|
97
|
+
|
|
98
|
+
| M1: lateral recolhida, segunda barra | M2: lateral recolhida, submenu na sidebar |
|
|
99
|
+
| ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ |
|
|
100
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=menu-m1) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=menu-m2) |
|
|
101
|
+
| **M3: lateral expandida, segunda barra** | **M4: lateral expandida, submenu na sidebar** |
|
|
102
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=menu-m3) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=menu-m4) |
|
|
103
|
+
| **M5: superior, lista suspensa** | **M6: superior, mega menu** |
|
|
104
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=menu-m5) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=menu-m6) |
|
|
105
|
+
|
|
106
|
+
</details>
|
|
107
|
+
|
|
108
|
+
<details>
|
|
109
|
+
<summary><strong>Modelo × paleta de cores: as 12 combinações</strong> (clique para abrir aqui mesmo)</summary>
|
|
110
|
+
|
|
111
|
+
O modelo (formato, fonte e símbolo) e a paleta (cores, degradês e sidebar) são camadas independentes: qualquer modelo aceita qualquer paleta. São 12 combinações (3 modelos × 4 paletas), todas na mesma tela de detalhe do cliente.
|
|
112
|
+
|
|
113
|
+
| Modelo \ Paleta | Safira | Equilíbrio | Aurora | Ardósia |
|
|
114
|
+
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
115
|
+
| **Safira** (quadrado) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-safira-safira) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-safira-equilibrio) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-safira-aurora) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-safira-ardosia) |
|
|
116
|
+
| **Equilíbrio** (meio-termo) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-equilibrio-safira) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-equilibrio-equilibrio) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-equilibrio-aurora) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-equilibrio-ardosia) |
|
|
117
|
+
| **Aurora** (arredondado) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-aurora-safira) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-aurora-equilibrio) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-aurora-aurora) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=matriz-aurora-ardosia) |
|
|
118
|
+
|
|
119
|
+
</details>
|
|
120
|
+
|
|
121
|
+
<details>
|
|
122
|
+
<summary><strong>No celular</strong> (clique para abrir aqui mesmo)</summary>
|
|
123
|
+
|
|
124
|
+
Mesmo componente, mesma API: no celular a tabela vira cards, a sidebar vira gaveta e a navegação ganha uma barra inferior.
|
|
125
|
+
|
|
126
|
+
| Safira | Equilíbrio | Aurora | Tabela em cards |
|
|
127
|
+
| ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
128
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=safira-mobile) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=equilibrio-mobile) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=aurora-mobile) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=equilibrio-mobile-tabela) |
|
|
129
|
+
|
|
130
|
+
</details>
|
|
131
|
+
|
|
132
|
+
<details>
|
|
133
|
+
<summary><strong>Modo escuro e outras telas</strong> (clique para abrir aqui mesmo)</summary>
|
|
134
|
+
|
|
135
|
+
| Modo escuro (Safira) | Modo escuro (Equilíbrio) |
|
|
136
|
+
| ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
137
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=safira-escuro) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=equilibrio-escuro) |
|
|
138
|
+
|
|
139
|
+
| Drawer com rodapé fixo (30/70) | Mega menu no menu superior |
|
|
140
|
+
| ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
141
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=safira-drawer) | [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=aurora-mega-menu) |
|
|
142
|
+
|
|
143
|
+
| Login (Aurora) |
|
|
144
|
+
| -------------------------------------------------------------------------------------------------------------------- |
|
|
145
|
+
| [](https://bsmagalhaes.github.io/rendra-design-system/galeria/?imagem=aurora-login) |
|
|
146
|
+
|
|
147
|
+
</details>
|
|
148
|
+
|
|
149
|
+
> As imagens são geradas a partir do app real com `npm run docs:images`.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## O que tem dentro
|
|
154
|
+
|
|
155
|
+
### Tokens
|
|
156
|
+
|
|
157
|
+
| Token | Como funciona |
|
|
158
|
+
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
159
|
+
| **Espaçamento** | Base de 4px, com os degraus 0, 1, 2, 3, 4, 6, 8, 12, 16 e 24. A escala padrão do Tailwind foi zerada: `p-5` ou `w-64` não geram CSS. Tamanhos de peça viram tokens nomeados (`h-control-md`, `size-touch`, `h-header`). |
|
|
160
|
+
| **Tipografia** | 7 tamanhos (`xs` a `3xl`) com line-height e letter-spacing, títulos menores no celular, 3 pesos e campos com 16px no celular (sem zoom no iOS). |
|
|
161
|
+
| **Cores** | Semânticas: `primary`, `secondary`, `destructive`, `success`, `warning` e `info`, cada uma com cor forte, cor de hover, texto, fundo suave e texto sobre o suave. Mais superfícies e neutros. Contraste AA medido ao vivo na página `/tokens`. |
|
|
162
|
+
| **Formato** | `rounded-control`, `rounded-surface`, `rounded-item` e `rounded-avatar`, controlados pelo formato do template (quadrado, meio-termo ou 100% arredondado). |
|
|
163
|
+
| **Sombra** | Três níveis sutis. Superfície de página usa borda de 1px. |
|
|
164
|
+
| **Degradê** | Três por template (forte, suave e detalhe), com regra de uso: nunca em botão ou atrás de texto corrido, e no máximo um forte por tela. |
|
|
165
|
+
| **Densidade** | Input, botão e select com a mesma altura: 44 a 52px no celular e 32 a 48px no desktop. |
|
|
166
|
+
|
|
167
|
+
A marca fica isolada: as 4 cores e o degradê em `src/brand/palettes.ts`, o modelo (fonte e raio) em `src/styles/theme.css`, e o nome e o logotipo em `src/brand/brand.config.ts` e `src/brand/assets`. Nenhum componente tem cor, fonte ou logotipo fixo.
|
|
168
|
+
|
|
169
|
+
### Componentes
|
|
170
|
+
|
|
171
|
+
Todos em `src/components/ui`, um por finalidade, com o ícone de feedback da marca onde houver feedback.
|
|
172
|
+
|
|
173
|
+
| Grupo | Componentes |
|
|
174
|
+
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
175
|
+
| **Ações** | Button (6 variantes, tamanhos, ícone, só ícone, carregando, largura total), ButtonGroup (agrupado ou segmentado), DropdownMenu e ActionBar (regra 100%, 30/70 e menu) |
|
|
176
|
+
| **Formulário** | Input (máscaras de CPF, CNPJ, CPF ou CNPJ automático, telefone com seletor de DDI embutido e +55 por padrão, CEP, data, hora, moeda e percentual, com ícone, limpar e senha), Textarea com contador, Select (busca, múltiplo com chips, selecionar todos, contador, criar opção, busca remota), Checkbox com indeterminado e grupo, Radio em lista e em cards, Switch, DatePicker (data, período e horário, em pt-BR), Slider, Upload com arrastar e soltar e progresso, OtpInput (2FA), Field, Form, FormField e FormSection com React Hook Form e Zod, e validadores de CPF, CNPJ, telefone, CEP e data |
|
|
177
|
+
| **Navegação** | Tabs (linha ou pílula, vira seletor quando não cabe), Breadcrumb, Pagination (completa, compacta ou "carregar mais") e Wizard/Stepper (etapas concluída, atual, pendente e com erro, com validação por etapa) |
|
|
178
|
+
| **Dados** | Table com TanStack Table (seleção, expansão, ordenação, busca, colunas visíveis, ações em massa e por linha, densidade, estados vazio, carregando e erro, forma de cards no celular e **modo remoto**: 15 por página, carregando página por página, com busca e filtros em todos os registros), Card, StatCard, Badge, Avatar e grupo, List, Timeline, Accordion e Chart com Recharts (linha, barra, área e pizza) |
|
|
179
|
+
| **Feedback** | BrandFeedbackIcon animado (check se desenhando, X se riscando), Toast com Sonner, Alert, Modal (confirmação, destrutiva, informativo e formulário), InfoHint (texto orientativo num ícone de informação que abre modal; também como `help` em PageHeader, CardTitle e FormSection), Drawer (header e rodapé fixos, confirmação de descarte, 30%, 40%, 50% ou 75% da tela), Popover, Tooltip, EmptyState, ErrorPage (404 e 500), Skeleton e Progress |
|
|
180
|
+
| **Atendimento** | Chat omnichannel: ConversationList (foto com o logotipo do canal: WhatsApp, WhatsApp Web, Instagram, Facebook, TikTok, Google Meu Negócio e Reclame Aqui), ChatThread (cliente, atendente, robô e avisos; botão direito ou "…" para responder, reagir, editar e excluir; citação que leva à mensagem original; áudio em 1x, 1,5x e 2x; baixar anexos) e ChatComposer (textarea que cresce, anexos, emoji, mensagens rápidas, gravação de áudio, arrastar e soltar ou colar prints; no celular, campo, enviar e um botão de ações) |
|
|
181
|
+
| **Conteúdo** | RichTextEditor (Tiptap): formatação completa, listas, alinhamento, links, tabela, imagem com 4 alças para redimensionar, colar print, arrastar imagens e modo HTML |
|
|
182
|
+
| **Painel** | WidgetGrid: widgets que se arrastam e redimensionam no modo "Ajustar dashboard", com a arrumação salva; Chart com velocímetro de meta, funil com conversão, barras com linha, barras coloridas e empilhadas |
|
|
183
|
+
| **Planejamento** | Calendar (mês, semana, dia e agenda em lista, no mesmo componente; no celular vira mês compacto com a lista do dia), Kanban (altura da tela, 5 etapas visíveis e rolagem lateral também pelo touchpad, rolagem infinita por etapa, (+) no título da etapa, totais em R$ de P&S e MRR por etapa e por cartão, arrastar no computador, menu "Mover para" no toque e no teclado, uma coluna por vez no celular, limite por coluna) e ImageViewer (imagens em popup, com setas, Esc, arrastar e pinça) |
|
|
184
|
+
| **Layout** | Container (respiro igual em todos os lados), Stack, Inline, Grid (por tela ou por container query), Section e PageHeader |
|
|
185
|
+
|
|
186
|
+
### AppShell
|
|
187
|
+
|
|
188
|
+
Tudo configurável por props, com o padrão em `src/config/layout.ts`:
|
|
189
|
+
|
|
190
|
+
- menu **lateral** ou **superior**;
|
|
191
|
+
- sidebar **recolhida** (só ícones, padrão) ou **expandida**, com opção de **abrir por cima do conteúdo** ao passar o mouse;
|
|
192
|
+
- submenu em **segunda barra lateral** ou **dentro da sidebar**, e, no menu superior, **submenu navegável** ou **mega menu** com seções;
|
|
193
|
+
- header sempre fixo, com título da página e trilha, busca global (**Ctrl+K**), notificações, tema e menu do usuário;
|
|
194
|
+
- no celular, gaveta de navegação e barra inferior com até 4 itens.
|
|
195
|
+
|
|
196
|
+
### Telas base
|
|
197
|
+
|
|
198
|
+
Login, esqueci a senha, verificação em duas etapas (2FA), nova senha, cadastro, painel com indicadores e gráficos, listagem com barra de ferramentas e filtros, detalhe com abas, formulário longo em seções, cadastro em wizard, configurações com navegação interna, criação e edição de registro em drawer (com busca de CNPJ e CEP), tarefas, atendimento omnichannel, agenda, funil de vendas em kanban, painel em widgets, galeria e página 404.
|
|
199
|
+
|
|
200
|
+
### Vitrine, Storybook e testes
|
|
201
|
+
|
|
202
|
+
- **Vitrine** na rota `/componentes`: cada componente com variantes, tamanhos e estados (padrão, hover, foco, ativo, desabilitado, carregando, erro) e as regras de composição.
|
|
203
|
+
- **Storybook 10** com mais de 100 stories: viewport de celular por padrão, com tablet e desktop, e alternância de template, paleta e modo claro/escuro na barra.
|
|
204
|
+
- **Testes de layout com Playwright** (`npm run test:layout`): 16 rotas × 5 larguras (360, 390, 768, 1280 e 1920) × 3 templates no modo claro, mais 360 e 1280 no escuro, somando 336 testes. Falham se houver rolagem horizontal, elemento maior que a tela, toque menor que 44px no celular ou erro de JavaScript, e geram capturas de todas as telas.
|
|
205
|
+
- **Testes de acessibilidade com axe-core** (`npm run test:a11y`): 144 testes, todas as rotas nos três templates, claro e escuro, mais a paleta Ardósia e o celular. Falham em qualquer violação WCAG 2.1 A ou AA, inclusive contraste.
|
|
206
|
+
- **Regressão visual** (`npm run test:visual`): 128 capturas comparadas com a referência aprovada. Pegam cor que mudou, espaçamento que quebrou e ícone que sumiu. As referências são geradas no Linux do CI; depois de uma mudança visual intencional, aplique o rótulo `atualizar-visual` no Pull Request.
|
|
207
|
+
- **Testes unitários e de componente com Vitest e Testing Library** (`npm test`; `npm run test:coverage` com o piso por arquivo): comportamento de Table (ordenação, busca, paginação, seleção, ações em massa, modo remoto e cartões no celular), Select, Input (máscaras, centavos e busca de CEP e CNPJ), Modal, Drawer, campos de formulário e navegação, além de validadores, máscaras, buscas e o gerador de paletas (AA garantido em todas). Cada componente tem o teste ao lado, e ele vai junto quando você copia o componente para outro projeto.
|
|
208
|
+
- **CI no GitHub Actions**: todo Pull Request passa por tipos, lint, formatação, regras, unitários, build, Storybook e os três testes no navegador. A `main` só aceita merge com tudo verde. O Dependabot abre PR semanal quando uma dependência ganha versão nova.
|
|
209
|
+
- **Verificador de regras** (`npm run check:rules`): barra cor fixa, valor arbitrário, degrau fora da escala, estilo inline, fonte fixa, `100vh` e arquivos duplicados ou mobile.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Stack
|
|
214
|
+
|
|
215
|
+
React 19, TypeScript 5.9 (estrito), Vite 8, Tailwind CSS 4 (tema via `@theme`), shadcn/ui (copiado para o projeto), Radix UI, class-variance-authority, tailwind-merge com clsx, Lucide, React Router 8, TanStack Table 8, cmdk, Sonner, React Hook Form, Zod 4, IMask, React Day Picker 10, date-fns 4, Recharts 3, Storybook 10, Playwright com axe-core, Vitest, ESLint 9 (TypeScript, React Hooks e jsx-a11y) e Prettier com prettier-plugin-tailwindcss. Somente bibliotecas gratuitas e de código aberto.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Começar com IA
|
|
220
|
+
|
|
221
|
+
O repositório vem preparado para agentes de IA de desenvolvimento. Ao abrir o projeto, a IA lê as instruções sozinha, pergunta se é **projeto novo** ou **migração de layout**, conduz um **briefing** (negócio, usuários, menu, tema, cores, telas e dados; se você já tiver um **código de modelo** da galeria, ele pula essas escolhas), registra tudo em `docs/BRIEFING.md` e só então constrói, em etapas e com as verificações passando.
|
|
222
|
+
|
|
223
|
+
| Ferramenta | Arquivo lido automaticamente |
|
|
224
|
+
| -------------------------------------------- | -------------------------------------------------------------------- |
|
|
225
|
+
| OpenAI Codex, Jules, Gemini, Cursor e outras | [`AGENTS.md`](AGENTS.md) |
|
|
226
|
+
| Claude Code | [`CLAUDE.md`](CLAUDE.md) |
|
|
227
|
+
| GitHub Copilot | [`.github/copilot-instructions.md`](.github/copilot-instructions.md) |
|
|
228
|
+
| Cursor | [`.cursor/rules/rendra.mdc`](.cursor/rules/rendra.mdc) |
|
|
229
|
+
| Windsurf | [`.windsurfrules`](.windsurfrules) |
|
|
230
|
+
| Gemini CLI | [`GEMINI.md`](GEMINI.md) |
|
|
231
|
+
|
|
232
|
+
Todos apontam para o mesmo fluxo ([`AGENTS.md`](AGENTS.md)) e as mesmas regras ([`DESIGN_RULES.md`](DESIGN_RULES.md)).
|
|
233
|
+
|
|
234
|
+
**Para um projeto novo**, cole na sua IA:
|
|
235
|
+
|
|
236
|
+
```text
|
|
237
|
+
Clone https://github.com/bsmagalhaes/rendra-design-system e use como base do meu novo sistema. Siga o AGENTS.md do repositório.
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
**Para migrar o layout de um sistema existente**, abra a IA na pasta do seu sistema e cole:
|
|
241
|
+
|
|
242
|
+
```text
|
|
243
|
+
Aplique neste projeto o design system https://github.com/bsmagalhaes/rendra-design-system. Leia o AGENTS.md e o DESIGN_RULES.md dele e siga o fluxo de migração, começando pelo briefing.
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
A versão completa do prompt de migração, com todas as regras, está em [docs/PROMPT_MIGRACAO.md](docs/PROMPT_MIGRACAO.md). O roteiro do briefing está em [docs/BRIEFING_MODELO.md](docs/BRIEFING_MODELO.md).
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Como rodar
|
|
251
|
+
|
|
252
|
+
Pré-requisito: Node.js 22 ou mais recente (o CI usa o 24).
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
npm install
|
|
256
|
+
npx playwright install chromium # só na primeira vez, para os testes
|
|
257
|
+
npm run dev # app em http://localhost:5173
|
|
258
|
+
npm run storybook # Storybook em http://localhost:6006
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
| Comando | O que faz |
|
|
262
|
+
| ---------------------------- | ----------------------------------------------------- |
|
|
263
|
+
| `npm run dev` | Sobe o app com recarga automática |
|
|
264
|
+
| `npm run build` | Checagem de tipos e build de produção |
|
|
265
|
+
| `npm run typecheck` | Checagem de tipos |
|
|
266
|
+
| `npm run lint` | ESLint com TypeScript, React Hooks e acessibilidade |
|
|
267
|
+
| `npm run check:rules` | Verificador de regras de design |
|
|
268
|
+
| `npm test` | Testes unitários e de componente (Vitest) |
|
|
269
|
+
| `npm run test:layout` | Testes de layout (capturas em `screenshots/`) |
|
|
270
|
+
| `npm run test:a11y` | Testes de acessibilidade (axe-core) |
|
|
271
|
+
| `npm run test:visual` | Regressão visual (referências do Linux, ver acima) |
|
|
272
|
+
| `npm run test:layout:report` | Relatório dos testes |
|
|
273
|
+
| `npm run storybook` | Storybook |
|
|
274
|
+
| `npm run build-storybook` | Build estático do Storybook |
|
|
275
|
+
| `npm run registry:build` | Gera o registry do shadcn (`registry.json`, `dist/r`) |
|
|
276
|
+
| `npm run docs:images` | Regenera as imagens deste README (com o app rodando) |
|
|
277
|
+
|
|
278
|
+
No app, o menu do avatar troca **modelo**, **paleta**, **tema** e **layout**. As mesmas opções estão em Configurações.
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## Estrutura
|
|
283
|
+
|
|
284
|
+
```text
|
|
285
|
+
src/
|
|
286
|
+
styles/ theme.css (marca), themes.css (temas carregados) e globals.css (tokens estruturais)
|
|
287
|
+
brand/ brand.config.ts, assets (logotipos, símbolo, fontes) e examples (Equilíbrio, Aurora)
|
|
288
|
+
components/
|
|
289
|
+
ui/ componentes, um por finalidade
|
|
290
|
+
layout/ Container, Stack, Inline, Grid, Section, PageHeader
|
|
291
|
+
app-shell/ AppShell, Sidebar, Header, busca global, mega menu, notificações
|
|
292
|
+
config/ navigation.ts (menu), layout.ts (padrão do AppShell), routes-list.ts
|
|
293
|
+
hooks/ useBreakpoint
|
|
294
|
+
lib/ cn, máscaras, validadores, estilos de campo
|
|
295
|
+
pages/ telas base, vitrine (/componentes) e tokens (/tokens)
|
|
296
|
+
stories/ Storybook
|
|
297
|
+
tests/ testes de layout (Playwright)
|
|
298
|
+
scripts/ verificador de regras, auditoria e geração de imagens
|
|
299
|
+
docs/ guia de aplicação, prompt de migração e imagens
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## Como trocar a marca em 5 passos
|
|
305
|
+
|
|
306
|
+
1. **Cores:** em `src/brand/palettes.ts`, só as 4 cores (primária, hover, secundária, hover) e o degradê da marca; depois `npm run palettes:build`, que gera o resto com AA conferido. Erro, sucesso, alerta, informação e neutros não mudam.
|
|
307
|
+
2. **Modelo e identidade:** fonte e raio em `src/styles/theme.css` (se o modelo mudar); nome, empresa, frase, formato (`square`, `rounded` ou `pill`) e logotipo na sidebar em `src/brand/brand.config.ts`.
|
|
308
|
+
3. **Arte:** substitua os SVGs de `src/brand/assets`. O símbolo usa `fill="currentColor"`, porque os ícones de feedback o tingem.
|
|
309
|
+
4. **Contraste:** abra `/tokens` nos modos claro e escuro. Nenhum selo pode marcar "falha".
|
|
310
|
+
5. **Verificação:** rode `npm run check:rules && npm test && npm run test:layout`.
|
|
311
|
+
|
|
312
|
+
Marca de cada cliente em tempo de execução (white label, sem build): `applyPalette(sementes)`. Exemplo em [docs/COMO_APLICAR.md](docs/COMO_APLICAR.md).
|
|
313
|
+
|
|
314
|
+
O passo a passo completo, inclusive como adotar o Equilíbrio ou o Aurora como marca principal, está em [docs/COMO_APLICAR.md](docs/COMO_APLICAR.md).
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## Receber atualizações nos seus projetos
|
|
319
|
+
|
|
320
|
+
Um projeto criado a partir do Rendra não fica parado no tempo, e há mais de um jeito de trazer o design system para um projeto: clonar o boilerplate inteiro, trazer um componente pelo registry, instalar o pacote publicado, rodar a CLI `rendra` ou usar a skill de migração parcial. As subseções abaixo cobrem cada um.
|
|
321
|
+
|
|
322
|
+
### Boilerplate
|
|
323
|
+
|
|
324
|
+
Comece por este repositório (`degit`, `npx create-rendra` quando existir, ou clone e apague o `.git`) quando o projeto é novo: você recebe os três templates, as quatro paletas, o AppShell, as telas base e o Storybook, e edita a marca em `src/brand` como descrito em "Como trocar a marca em 5 passos", acima.
|
|
325
|
+
|
|
326
|
+
### Registry (shadcn/ui)
|
|
327
|
+
|
|
328
|
+
Os componentes são publicados como um **registry do shadcn/ui** junto com o demo. Para trazer a versão mais nova de um componente, com as dependências dele, num projeto que **não** nasceu deste boilerplate:
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
npx shadcn@latest add https://bsmagalhaes.github.io/rendra-design-system/r/select.json
|
|
332
|
+
# ou, com o components.json do boilerplate:
|
|
333
|
+
npx shadcn@latest add @rendra/select
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Itens disponíveis: cada componente de `src/components/ui` pelo nome do arquivo (`button`, `table`, `select`...), mais `core` (funções, hooks, provedor de marca e o gerador de paleta), `tokens` (`globals.css`), `layout` e `app-shell`. A lista completa está em [`registry.json`](registry.json).
|
|
337
|
+
|
|
338
|
+
**Testes junto com o componente (opcional):** cada componente testado tem um item `<nome>-test` (por exemplo `npx shadcn@latest add @rendra/table-test`), que traz o teste de comportamento e instala as dependências de teste só como desenvolvimento. O `test-utils` traz a preparação do Vitest (`src/test/setup.ts`) e o `renderApp`. Útil quando o seu projeto exige cobertura mínima de cada componente copiado.
|
|
339
|
+
|
|
340
|
+
O registry nunca traz marca nem configuração: `theme.css`, `themes.css`, `palettes.ts`, `palettes.css`, `brand.config.ts`, `src/brand/index.ts`, os assets e `src/config` são do seu projeto e não são tocados. Arquivos iguais são pulados, e o shadcn pergunta antes de sobrescrever um arquivo que você alterou. Quando uma versão pedir um token de cor novo no tema, o [CHANGELOG](CHANGELOG.md) diz qual e com que valor.
|
|
341
|
+
|
|
342
|
+
### Pacote npm
|
|
343
|
+
|
|
344
|
+
Para um projeto que já tem o próprio roteador e a própria estrutura de telas, e só quer os componentes prontos como dependência. O pacote é `@rendra-ui/web`, escopado na organização npm `rendra-ui`:
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
npm install @rendra-ui/web react react-dom radix-ui
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
```tsx
|
|
351
|
+
import { Button, Card } from '@rendra-ui/web'
|
|
352
|
+
import '@rendra-ui/web/tokens.css'
|
|
353
|
+
import '@rendra-ui/web/base.css'
|
|
354
|
+
import '@rendra-ui/web/components.css'
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
O CSS já sai compilado (estratégia A: o host recebe `tokens.css`, `base.css` e `components.css` prontos, sem precisar ter o Tailwind instalado, e sem nenhuma variável do namespace do Tailwind vazar para o seu tema). `react-router` fica fora das dependências: quem usa React Router importa a ponte, `@rendra-ui/web/router-bridge`; quem não usa, não precisa dela. Os componentes pesados (`document-viewer`, `rich-text-editor`, `chart`, `widget-grid`) são subcaminhos próprios, para não engordar quem não usa.
|
|
358
|
+
|
|
359
|
+
**Publicação:** uma tag `vX.Y.Z` empurrada para o repositório (`git push origin vX.Y.Z`) dispara o `.github/workflows/publish.yml`, que builda o pacote, roda o `verify:pack` e publica com `npm publish --provenance --access public`, depois de conferir que a tag bate com a `version` do `package.json`. Com o _trusted publishing_ do npm configurado para este repositório, o workflow dispensa o segredo `NPM_TOKEN`.
|
|
360
|
+
|
|
361
|
+
### CLI (`rendra`)
|
|
362
|
+
|
|
363
|
+
Três comandos. Com o pacote instalado: `npx rendra <comando>` (ou `rendra` direto, se instalado global). Sem instalar o pacote no projeto: `npx @rendra-ui/web <comando>` roda a mesma CLI direto do registry:
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
rendra codigos # lista o catálogo de códigos de componente
|
|
367
|
+
rendra auditar [pasta] # regras genéricas de DESIGN_RULES.md no projeto de destino
|
|
368
|
+
rendra trocar <DE> <PARA> --dry-run # simula a troca de uma variante do catálogo pela outra
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
`rendra auditar` aplica sete regras estáticas, sem IA (cor fixa, valor arbitrário, estilo inline, fonte fixa, `100vh`, degrau fora da escala, raio fixo), o mesmo tipo de checagem do `check:rules` deste repositório, aplicado a qualquer projeto. `rendra trocar` reescreve a prop literal que distingue duas variantes do catálogo (`ABA-001` para `ABA-002`, por exemplo), sempre com `--dry-run` primeiro: um elemento sem a prop conta como a variante padrão do componente (troca também esse caso, inserindo ou removendo a prop conforme o lado); prop dinâmica (`variant={x}`) nunca é reescrita, só listada para revisão manual, e troca entre componentes diferentes nunca edita, só aponta onde o componente aparece. Só `rendra trocar` precisa do `typescript` instalado no projeto de destino (`peerDependency` opcional do pacote), para ler e reescrever o JSX; sem ele, avisa e sai com erro.
|
|
372
|
+
|
|
373
|
+
### Skill de migração parcial
|
|
374
|
+
|
|
375
|
+
[`skills/rendra-migracao-parcial/SKILL.md`](skills/rendra-migracao-parcial/SKILL.md), lida por Claude Code, Codex e Cursor: migra um sistema existente em três níveis (tokens, padrões, componentes), escolhidos por você, usando `rendra auditar` e `rendra trocar` por baixo.
|
|
376
|
+
|
|
377
|
+
### Códigos de modelo e de componente
|
|
378
|
+
|
|
379
|
+
- **Código de modelo** (`T1-C4-M5`: tema, cores e menu): a tabela completa está no item 3.0 do [`docs/BRIEFING_MODELO.md`](docs/BRIEFING_MODELO.md) e em `src/config/presets.ts`. Diz de uma vez qual template, qual paleta e qual posição de menu usar.
|
|
380
|
+
- **Código de componente** (`ABA-001`, `BTN-006`...): um por componente e por variante visual relevante, em `src/catalog/components.ts`. Aparece na vitrine (`/componentes`), no `data-rendra` do elemento raiz, no `registry.json` e na saída de `rendra codigos`.
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## Documentação
|
|
385
|
+
|
|
386
|
+
- [DESIGN_RULES.md](DESIGN_RULES.md): todas as regras de interface, o que é proibido e o checklist de revisão. **Leitura obrigatória antes de alterar qualquer interface.**
|
|
387
|
+
- [docs/COMO_APLICAR.md](docs/COMO_APLICAR.md): projeto novo ou existente, troca de marca, ordem de migração, testes, problemas comuns e checklist de aceite.
|
|
388
|
+
- [docs/PROMPT_MIGRACAO.md](docs/PROMPT_MIGRACAO.md): prompt pronto para a IA do projeto de destino aplicar o design system.
|
|
389
|
+
- [AGENTS.md](AGENTS.md): fluxo de início para qualquer IA (tipo de trabalho, briefing e etapas).
|
|
390
|
+
- [docs/BRIEFING_MODELO.md](docs/BRIEFING_MODELO.md): roteiro do briefing.
|
|
391
|
+
- [CLAUDE.md](CLAUDE.md): instruções para o Claude Code.
|
|
392
|
+
- [CHANGELOG.md](CHANGELOG.md): o que mudou em cada versão e o que fazer para atualizar.
|
|
393
|
+
- [CONTRIBUTING.md](CONTRIBUTING.md): como propor mudanças.
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## Perguntas frequentes
|
|
398
|
+
|
|
399
|
+
**O que é o Rendra Design System?**
|
|
400
|
+
Um template de sistema e design system open source em React, TypeScript e Tailwind CSS. Traz o layout de sistema administrativo pronto (menu, header fixo, rodapé de ações), telas base como dashboard, listagem, cadastro, CRM kanban, agenda e chat, e componentes acessíveis para criar sistemas novos ou migrar o layout de sistemas existentes.
|
|
401
|
+
|
|
402
|
+
**É gratuito?**
|
|
403
|
+
Sim. Licença MIT, só com bibliotecas gratuitas: React, Tailwind CSS, Radix, shadcn/ui, TanStack Table, Recharts e Tiptap. Nada de Tailwind Plus ou tema pago.
|
|
404
|
+
|
|
405
|
+
**Funciona no celular?**
|
|
406
|
+
Sim, de verdade: tudo é escrito primeiro para 360px, tabelas viram cartões, o menu vai para a barra inferior, não há rolagem horizontal e os alvos de toque têm pelo menos 44px. Os testes abrem cada tela em cinco larguras, nos três modelos, no modo claro e no escuro.
|
|
407
|
+
|
|
408
|
+
**Dá para usar como white label, com a marca de cada cliente?**
|
|
409
|
+
Sim, de dois jeitos. No build: cada marca é uma entrada de 4 cores e um degradê em `src/brand/palettes.ts`. Em tempo de execução, quando cada cliente cadastra a própria marca: `applyPalette(sementes)` gera a paleta completa, claro e escuro, com o contraste AA conferido e ajustado. As cores de sistema e os neutros não mudam, e cada combinação pronta tem um código (por exemplo `T1-C2-M3`).
|
|
410
|
+
|
|
411
|
+
**Posso migrar o layout do meu sistema com uma IA?**
|
|
412
|
+
Sim. O [`AGENTS.md`](AGENTS.md) (e o `CLAUDE.md` e o `GEMINI.md`) conduz qualquer agente de IA por um briefing guiado, as regras de design e a ordem de migração; o [`docs/PROMPT_MIGRACAO.md`](docs/PROMPT_MIGRACAO.md) traz o prompt pronto.
|
|
413
|
+
|
|
414
|
+
**Qual a diferença para um template admin comum?**
|
|
415
|
+
As regras são verificadas por máquina: valor fora da escala, cor fixa, botão solto e texto de instrução no corpo da tela ou orientação de campo acima do limite da largura quebram o `check:rules`, e layout, acessibilidade e regressão visual rodam no CI a cada Pull Request.
|
|
416
|
+
|
|
417
|
+
## Autor
|
|
418
|
+
|
|
419
|
+
Criado e mantido por **Bruno Magalhaes**.
|
|
420
|
+
|
|
421
|
+
- Site: [www.brunomagalhaes.me](https://www.brunomagalhaes.me)
|
|
422
|
+
- E-mail: [contato@brunomagalhaes.me](mailto:contato@brunomagalhaes.me)
|
|
423
|
+
- Instagram: [@brunomagalhaes.me](https://www.instagram.com/brunomagalhaes.me/)
|
|
424
|
+
|
|
425
|
+
Contribuições são bem-vindas pelo fluxo descrito em [CONTRIBUTING.md](CONTRIBUTING.md): toda mudança passa por Pull Request e revisão.
|
|
426
|
+
|
|
427
|
+
## Licença
|
|
428
|
+
|
|
429
|
+
[MIT](LICENSE) © 2026 Bruno Magalhaes. Pode usar, copiar, alterar e distribuir, inclusive em projetos comerciais, mantendo o aviso de copyright.
|
|
430
|
+
|
|
431
|
+
## Créditos
|
|
432
|
+
|
|
433
|
+
Construído sobre Tailwind CSS, shadcn/ui, Radix UI, Lucide, TanStack Table, cmdk, Sonner, React Hook Form, Zod, IMask, React Day Picker, Recharts, Storybook e Playwright. As fontes Poppins, Inter e DM Sans são distribuídas sob a SIL Open Font License. Os símbolos dos templates são ilustrativos. O logotipo é montado pelo componente `BrandLogo` com as cores da paleta ativa.
|
package/bin/rendra.mjs
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* Entrypoint da CLI publicada (`rendra`). Importa só de dist/cli (nunca de src/cli/*.ts): no
|
|
4
|
+
* pacote publicado não existe `src/`, e mesmo dentro deste repositório o comando roda depois
|
|
5
|
+
* de `npm run build:lib`, para a CLI usar sempre o mesmo código compilado que vai para o
|
|
6
|
+
* pacote, nunca um caminho de teste que o consumidor final não teria.
|
|
7
|
+
*
|
|
8
|
+
* Três subcomandos, mais `--help`/sem argumento (ver printHelp, `src/cli/help.ts`):
|
|
9
|
+
* rendra codigos lista o catálogo de códigos de componente
|
|
10
|
+
* rendra auditar [cwd] regras genéricas de DESIGN_RULES.md (padrão: cwd atual)
|
|
11
|
+
* rendra trocar <DE> <PARA> [--dry-run] troca a variante DE pela PARA no projeto
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync } from 'node:fs'
|
|
14
|
+
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
15
|
+
|
|
16
|
+
const DIST_CLI = new URL('../dist/cli/', import.meta.url)
|
|
17
|
+
|
|
18
|
+
async function importDist(name) {
|
|
19
|
+
const url = new URL(`${name}.js`, DIST_CLI)
|
|
20
|
+
if (!existsSync(fileURLToPath(url))) {
|
|
21
|
+
console.error(
|
|
22
|
+
`Não encontrei dist/cli/${name}.js. Rode "npm run build:lib" antes de usar a CLI.`,
|
|
23
|
+
)
|
|
24
|
+
process.exit(1)
|
|
25
|
+
}
|
|
26
|
+
return import(pathToFileURL(fileURLToPath(url)).href)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function printAudit(violations) {
|
|
30
|
+
if (violations.length === 0) {
|
|
31
|
+
console.log('Nenhuma violação encontrada.')
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
for (const v of violations) {
|
|
35
|
+
console.error(`\n${v.file}:${v.line} [${v.rule}] ${v.message}`)
|
|
36
|
+
console.error(` ${v.source.slice(0, 160)}`)
|
|
37
|
+
}
|
|
38
|
+
console.error(`\n${violations.length} violação(ões) das regras de design.`)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function printTrocar(resultado, dryRun) {
|
|
42
|
+
const { reescritos, paraRevisao } = resultado
|
|
43
|
+
if (reescritos.length === 0) {
|
|
44
|
+
console.log('Nenhum arquivo reescrito.')
|
|
45
|
+
} else {
|
|
46
|
+
console.log(
|
|
47
|
+
`${dryRun ? '[simulação] ' : ''}${reescritos.length} arquivo(s)/trecho(s) reescrito(s):`,
|
|
48
|
+
)
|
|
49
|
+
for (const r of reescritos) console.log(` ${r.file}:${r.line}`)
|
|
50
|
+
}
|
|
51
|
+
if (paraRevisao.length > 0) {
|
|
52
|
+
console.log(`\n${paraRevisao.length} local(is) para revisão manual (não alterados):`)
|
|
53
|
+
for (const r of paraRevisao) console.log(` ${r.file}:${r.line} [${r.motivo}] ${r.source}`)
|
|
54
|
+
}
|
|
55
|
+
if (dryRun) console.log('\nSimulação (--dry-run): nada foi gravado em disco.')
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function main() {
|
|
59
|
+
const [command, ...rest] = process.argv.slice(2)
|
|
60
|
+
|
|
61
|
+
if (!command || command === '--help' || command === '-h') {
|
|
62
|
+
const { formatHelp } = await importDist('help')
|
|
63
|
+
console.log(formatHelp())
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (command === 'codigos') {
|
|
68
|
+
const { formatCodigos } = await importDist('codigos')
|
|
69
|
+
console.log(formatCodigos())
|
|
70
|
+
return
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (command === 'auditar') {
|
|
74
|
+
const cwd = rest.find((a) => !a.startsWith('--')) ?? process.cwd()
|
|
75
|
+
const { auditar } = await importDist('auditar')
|
|
76
|
+
const violations = auditar(cwd)
|
|
77
|
+
printAudit(violations)
|
|
78
|
+
process.exitCode = violations.length > 0 ? 1 : 0
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (command === 'trocar') {
|
|
83
|
+
const positional = rest.filter((a) => !a.startsWith('--'))
|
|
84
|
+
const [de, para] = positional
|
|
85
|
+
const dryRun = rest.includes('--dry-run')
|
|
86
|
+
if (!de || !para) {
|
|
87
|
+
console.error('Uso: rendra trocar <DE> <PARA> [--dry-run]')
|
|
88
|
+
process.exitCode = 1
|
|
89
|
+
return
|
|
90
|
+
}
|
|
91
|
+
const cwd = process.cwd()
|
|
92
|
+
const { loadTypeScript, TYPESCRIPT_NOT_FOUND_MESSAGE } = await importDist('typescript-loader')
|
|
93
|
+
const ts = await loadTypeScript(cwd)
|
|
94
|
+
if (!ts) {
|
|
95
|
+
console.error(TYPESCRIPT_NOT_FOUND_MESSAGE)
|
|
96
|
+
process.exitCode = 1
|
|
97
|
+
return
|
|
98
|
+
}
|
|
99
|
+
const { trocar } = await importDist('trocar')
|
|
100
|
+
try {
|
|
101
|
+
const resultado = trocar({ ts, cwd, de, para, dryRun })
|
|
102
|
+
printTrocar(resultado, dryRun)
|
|
103
|
+
} catch (error) {
|
|
104
|
+
console.error(error instanceof Error ? error.message : String(error))
|
|
105
|
+
process.exitCode = 1
|
|
106
|
+
}
|
|
107
|
+
return
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
console.error('Uso: rendra <codigos|auditar|trocar> ...')
|
|
111
|
+
process.exitCode = 1
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
await main()
|