forlogic-core 2.0.2 → 2.0.4
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/README.md +187 -917
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/types/sidebar.d.ts +2 -1
- package/docs/AUDIT_PROMPT.md +74 -0
- package/docs/PROJECT_KNOWLEDGE_TEMPLATE.md +117 -0
- package/docs/PROMPT_TEMPLATE.md +77 -0
- package/docs/STARTER_TEMPLATE.md +114 -0
- package/docs/design-system/README.md +45 -0
- package/docs/design-system/buttons-actions.md +427 -0
- package/docs/design-system/charts-dashboards.md +547 -0
- package/docs/design-system/crud.md +243 -0
- package/docs/design-system/data-display.md +360 -0
- package/docs/design-system/dialogs.md +588 -0
- package/docs/design-system/domain.md +651 -0
- package/docs/design-system/examples.md +275 -0
- package/docs/design-system/foundation.md +82 -0
- package/docs/design-system/infra-utils.md +36 -0
- package/docs/design-system/inputs.md +536 -0
- package/docs/design-system/layout.md +351 -0
- package/docs/design-system/navigation.md +599 -0
- package/docs/design-system/notifications-feedback.md +137 -0
- package/docs/design-system/platform.md +95 -0
- package/docs/design-system/selectors.md +424 -0
- package/docs/design-system/tables-grids.md +114 -0
- package/package.json +2 -2
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
<!-- ⚠️ ARQUIVO GERADO AUTOMATICAMENTE — NÃO EDITAR MANUALMENTE -->
|
|
2
|
+
<!-- Fonte: src/design-system/docs/ | Regenerar: npx tsx scripts/generate-ds-docs.ts -->
|
|
3
|
+
|
|
4
|
+
# Layout
|
|
5
|
+
|
|
6
|
+
Categoria: **Layout** | 6 componentes
|
|
7
|
+
|
|
8
|
+
### AppHeader
|
|
9
|
+
|
|
10
|
+
Header principal da aplicação com título dinâmico, busca global integrada ao CRUD, ações customizáveis e informações do usuário. Altura fixa de 56px (h-14).
|
|
11
|
+
|
|
12
|
+
**Uso:**
|
|
13
|
+
```tsx
|
|
14
|
+
import { AppLayout, usePageMetadata } from 'forlogic-core';
|
|
15
|
+
|
|
16
|
+
// O AppHeader é renderizado automaticamente pelo AppLayout
|
|
17
|
+
<AppLayout sidebarConfig={sidebarConfig}>
|
|
18
|
+
<Routes>...</Routes>
|
|
19
|
+
</AppLayout>
|
|
20
|
+
|
|
21
|
+
// Para configurar título, subtítulo e breadcrumbs
|
|
22
|
+
function UsersPage() {
|
|
23
|
+
usePageMetadata({
|
|
24
|
+
title: 'Usuários',
|
|
25
|
+
subtitle: 'Gerenciamento de usuários do sistema'
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Com breadcrumbs
|
|
30
|
+
function EditUserPage() {
|
|
31
|
+
usePageMetadata({
|
|
32
|
+
title: 'Editar Usuário',
|
|
33
|
+
subtitle: 'Atualize os dados cadastrais',
|
|
34
|
+
breadcrumbs: [
|
|
35
|
+
{ label: 'Usuários', href: '/users' },
|
|
36
|
+
{ label: 'João Silva' }
|
|
37
|
+
]
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Subtitle com ReactNode
|
|
42
|
+
function DetailPage() {
|
|
43
|
+
usePageMetadata({
|
|
44
|
+
title: 'Detalhes',
|
|
45
|
+
subtitle: <span>Veja a <Link to="/docs">documentação</Link></span>
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Props:**
|
|
51
|
+
| Prop | Tipo | Padrão | Descrição |
|
|
52
|
+
|------|------|--------|-----------|
|
|
53
|
+
| `actions` | `ReactNode` | - | Botões de ação à direita do header (via PageMetadataContext) |
|
|
54
|
+
| `selectedUnit (UserInfo)` | `Company | null` | - | Unidade selecionada |
|
|
55
|
+
| `onUnitChange (UserInfo)` | `(unit: Company) => void` | - | Callback ao trocar unidade |
|
|
56
|
+
|
|
57
|
+
**Exemplos:**
|
|
58
|
+
```tsx
|
|
59
|
+
// Áreas do AppHeader
|
|
60
|
+
// 1. Título: Título da página + Subtítulo + Badge do módulo
|
|
61
|
+
// 2. Busca: Input de busca global (visível quando habilitado)
|
|
62
|
+
// 3. Ações: Botões customizáveis via PageMetadataContext
|
|
63
|
+
// 4. Perfil: UserInfo com dropdown de usuário
|
|
64
|
+
|
|
65
|
+
// Altura fixa: 56px (h-14 no Tailwind)
|
|
66
|
+
```
|
|
67
|
+
```tsx
|
|
68
|
+
// UserInfo com variantes
|
|
69
|
+
<UserInfo variant=
|
|
70
|
+
```
|
|
71
|
+
```tsx
|
|
72
|
+
// Configurar campos pesquisáveis no service
|
|
73
|
+
const userService = createSimpleService({
|
|
74
|
+
tableName:
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Acessibilidade:**
|
|
78
|
+
- Busca acessível via teclado (Tab para navegar, Escape para limpar)
|
|
79
|
+
- UserInfo dropdown acessível via teclado
|
|
80
|
+
- Botões de ação com foco visível (focus-visible)
|
|
81
|
+
- Título da página anunciado por leitores de tela (role=
|
|
82
|
+
- )
|
|
83
|
+
- Atalho de teclado para busca (/ ou Ctrl+K pode ser implementado)
|
|
84
|
+
|
|
85
|
+
**Notas:**
|
|
86
|
+
- ✅ Use PageMetadataContext para ações dinâmicas
|
|
87
|
+
- ✅ Mantenha título curto e descritivo (máx. 3 palavras)
|
|
88
|
+
- ✅ Use um único header por página
|
|
89
|
+
- ✅ Limpe ações no useEffect cleanup
|
|
90
|
+
- ✅ Use ícones do Lucide nos botões de ação
|
|
91
|
+
- ❌ Não adicione múltiplos headers na mesma página
|
|
92
|
+
- ❌ Não modifique a altura do header (fixo em 56px)
|
|
93
|
+
- ❌ Não coloque formulários complexos no header
|
|
94
|
+
- ❌ Não use mais de 3 botões de ação
|
|
95
|
+
- ❌ Não esconda o UserInfo em páginas autenticadas
|
|
96
|
+
|
|
97
|
+
> Fonte: `src\design-system\docs\components\layout\AppHeaderDoc.tsx`
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### AppSidebar
|
|
102
|
+
|
|
103
|
+
Sidebar de navegação principal da aplicação com suporte a pin/unpin, permissões assíncronas, ações de módulo (SidebarActionTrigger), redimensionamento, navegação hierárquica e separadores visuais.
|
|
104
|
+
|
|
105
|
+
**Uso:**
|
|
106
|
+
```tsx
|
|
107
|
+
import { AppLayout } from 'forlogic-core';
|
|
108
|
+
import type { SidebarConfig } from 'forlogic-core';
|
|
109
|
+
import { Home, Users, Settings, Shield, Plus, FileText, Folder } from 'lucide-react';
|
|
110
|
+
|
|
111
|
+
const sidebarConfig: SidebarConfig = {
|
|
112
|
+
appName: 'Minha Aplicação',
|
|
113
|
+
|
|
114
|
+
// Ações do módulo (opcional)
|
|
115
|
+
moduleActions: {
|
|
116
|
+
triggerLabel: 'Criar',
|
|
117
|
+
triggerIcon: Plus,
|
|
118
|
+
actions: [
|
|
119
|
+
{ id: 'new-doc', label: 'Novo Documento', icon: FileText, onClick: () => {} },
|
|
120
|
+
{ id: 'new-folder', label: 'Nova Pasta', icon: Folder, onClick: () => {} },
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
// Navegação (com suporte a hierarquia e separadores)
|
|
125
|
+
navigation: [
|
|
126
|
+
{ label: 'Início', path: '/', icon: Home },
|
|
127
|
+
{ label: 'Usuários', path: '/users', icon: Users },
|
|
128
|
+
{ label: '', path: '', type: 'separator' }, // Linha horizontal separadora
|
|
129
|
+
{
|
|
130
|
+
label: 'Configurações',
|
|
131
|
+
path: '/settings',
|
|
132
|
+
icon: Settings,
|
|
133
|
+
children: [
|
|
134
|
+
{ label: 'Perfil', path: '/settings/profile', icon: Users },
|
|
135
|
+
{ label: 'Segurança', path: '/settings/security', icon: Shield },
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
// Uso via AppLayout (recomendado)
|
|
142
|
+
<AppLayout sidebarConfig={sidebarConfig}>
|
|
143
|
+
<Routes>...</Routes>
|
|
144
|
+
</AppLayout>
|
|
145
|
+
|
|
146
|
+
// Uso direto (casos avançados)
|
|
147
|
+
<AppSidebar
|
|
148
|
+
config={sidebarConfig}
|
|
149
|
+
resizable={true}
|
|
150
|
+
minWidth={224}
|
|
151
|
+
maxWidth={384}
|
|
152
|
+
/>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Exemplos:**
|
|
156
|
+
```tsx
|
|
157
|
+
// Estrutura do AppSidebar
|
|
158
|
+
<Sidebar collapsible=
|
|
159
|
+
```
|
|
160
|
+
```tsx
|
|
161
|
+
// Matching de rota ativa (hierárquico)
|
|
162
|
+
const isActive = (path: string) =>
|
|
163
|
+
location.pathname === path ||
|
|
164
|
+
location.pathname.startsWith(path +
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Acessibilidade:**
|
|
168
|
+
- Navegação acessível via teclado (Tab, Arrow keys, Enter)
|
|
169
|
+
- Submenus expansíveis com Enter ou Space (via Collapsible)
|
|
170
|
+
- Estado ativo comunicado via isActive no SidebarMenuButton
|
|
171
|
+
- Itens desabilitados com cursor-not-allowed e opacity reduzida
|
|
172
|
+
- Tooltips em modo colapsado para identificação de todos os itens
|
|
173
|
+
- Botão pin/unpin oculto em mobile (hidden md:block) para evitar conflito com drawer
|
|
174
|
+
- Contraste adequado entre estados ativo/inativo usando tokens semânticos
|
|
175
|
+
|
|
176
|
+
**Notas:**
|
|
177
|
+
- ✅ Use ícones consistentes do Lucide React para todos os itens
|
|
178
|
+
- ✅ Máximo 2 níveis de aninhamento (item → children)
|
|
179
|
+
- ✅ Labels curtas: 1-3 palavras, máximo 20 caracteres
|
|
180
|
+
- ✅ Agrupe itens relacionados logicamente
|
|
181
|
+
- ✅ Use permissionCheck para controle de acesso assíncrono
|
|
182
|
+
- ✅ Use moduleActions para ações de criação/adição do módulo
|
|
183
|
+
- ✅ Prefira AppLayout ao invés de usar AppSidebar diretamente
|
|
184
|
+
- ❌ Não use mais de 10 itens no nível raiz
|
|
185
|
+
- ❌ Não crie 3+ níveis de submenu (hierarquia profunda)
|
|
186
|
+
- ❌ Não deixe itens sem ícones
|
|
187
|
+
- ❌ Não misture ícones de bibliotecas diferentes
|
|
188
|
+
- ❌ Não use labels com mais de 20 caracteres
|
|
189
|
+
|
|
190
|
+
> Fonte: `src\design-system\docs\components\layout\AppSidebarDoc.tsx`
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
### BodyContent
|
|
195
|
+
|
|
196
|
+
Container principal de página com breadcrumb, background neutro e suporte a múltiplos containers de conteúdo.
|
|
197
|
+
|
|
198
|
+
**Uso:**
|
|
199
|
+
```tsx
|
|
200
|
+
import { BodyContent, ContentContainer } from 'forlogic-core';
|
|
201
|
+
|
|
202
|
+
<BodyContent
|
|
203
|
+
breadcrumbs={[
|
|
204
|
+
{ label: 'Módulo', href: '/modulo' },
|
|
205
|
+
{ label: 'Seção', href: '/modulo/secao' },
|
|
206
|
+
{ label: 'Página Atual' }, // Sem href = página atual
|
|
207
|
+
]}
|
|
208
|
+
>
|
|
209
|
+
<ContentContainer
|
|
210
|
+
title="Título do Container"
|
|
211
|
+
subtitle="Subtítulo com informações adicionais"
|
|
212
|
+
>
|
|
213
|
+
<p>Conteúdo principal aqui...</p>
|
|
214
|
+
</ContentContainer>
|
|
215
|
+
</BodyContent>
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Exemplos:**
|
|
219
|
+
```tsx
|
|
220
|
+
<BodyContent
|
|
221
|
+
breadcrumbs={[
|
|
222
|
+
{ label:
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Acessibilidade:**
|
|
226
|
+
- O breadcrumb usa a tag nav com aria-label=
|
|
227
|
+
- para identificação por leitores de tela
|
|
228
|
+
- A página atual no breadcrumb é marcada com aria-current=
|
|
229
|
+
- ,
|
|
230
|
+
|
|
231
|
+
- ,
|
|
232
|
+
|
|
233
|
+
- true
|
|
234
|
+
|
|
235
|
+
**Notas:**
|
|
236
|
+
- O background externo usa a cor Escala Neutra 100 (#F5F5F5) para separar visualmente do conteúdo
|
|
237
|
+
- Os ContentContainers têm background branco (#FFFFFF) com sombra sutil e border-radius
|
|
238
|
+
- Use múltiplos ContentContainers para agrupar conteúdos relacionados na mesma página
|
|
239
|
+
- O último item do breadcrumb é automaticamente tratado como página atual (sem link)
|
|
240
|
+
- Para integração com React Router, use asChild=true e passe o Link como children
|
|
241
|
+
- O espaçamento entre containers segue o padrão do Design System (space-y-6)
|
|
242
|
+
|
|
243
|
+
> Fonte: `src\design-system\docs\components\layout\BodyContentDoc.tsx`
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
### CrudGrid
|
|
248
|
+
|
|
249
|
+
Componente para exibir dados em formato de grade (cards) com todas as funcionalidades CRUD. Alternativa visual ao CrudTable para listagens com layout mais visual.
|
|
250
|
+
|
|
251
|
+
> Fonte: `src\design-system\docs\components\crud\CrudGridDoc.tsx`
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
### Resizable
|
|
256
|
+
|
|
257
|
+
Painéis redimensionáveis para criar layouts flexíveis e adaptáveis. Baseado em react-resizable-panels.
|
|
258
|
+
|
|
259
|
+
**Uso:**
|
|
260
|
+
```tsx
|
|
261
|
+
import {
|
|
262
|
+
ResizablePanelGroup,
|
|
263
|
+
ResizablePanel,
|
|
264
|
+
ResizableHandle
|
|
265
|
+
} from 'forlogic-core/modular';
|
|
266
|
+
|
|
267
|
+
function ResizableLayout() {
|
|
268
|
+
return (
|
|
269
|
+
<ResizablePanelGroup direction="horizontal" className="min-h-[200px]">
|
|
270
|
+
<ResizablePanel defaultSize={25}>
|
|
271
|
+
<div className="p-4">Painel Esquerdo</div>
|
|
272
|
+
</ResizablePanel>
|
|
273
|
+
<ResizableHandle withHandle />
|
|
274
|
+
<ResizablePanel defaultSize={75}>
|
|
275
|
+
<div className="p-4">Painel Direito</div>
|
|
276
|
+
</ResizablePanel>
|
|
277
|
+
</ResizablePanelGroup>
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**Acessibilidade:**
|
|
283
|
+
- Suporte completo a navegação por teclado
|
|
284
|
+
- Alças de redimensionamento focáveis com Tab
|
|
285
|
+
- Use setas do teclado para redimensionar quando focado na alça
|
|
286
|
+
- Focus ring visível para acessibilidade
|
|
287
|
+
|
|
288
|
+
**Notas:**
|
|
289
|
+
- ResizablePanelGroup deve envolver todos os ResizablePanel e ResizableHandle.
|
|
290
|
+
- Use withHandle no ResizableHandle para melhor UX com indicador visual.
|
|
291
|
+
- minSize e maxSize são valores percentuais (0-100).
|
|
292
|
+
- A soma de defaultSize dos painéis deve ser 100.
|
|
293
|
+
- Combine com hooks de resize (useColumnResize, useSidebarResize) para casos específicos.
|
|
294
|
+
|
|
295
|
+
> Fonte: `src\design-system\docs\components\ResizableDoc.tsx`
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
### ScrollArea
|
|
300
|
+
|
|
301
|
+
Área de rolagem customizada com scrollbars estilizadas, baseada no Radix UI ScrollArea.
|
|
302
|
+
|
|
303
|
+
**Uso:**
|
|
304
|
+
```tsx
|
|
305
|
+
import { ScrollArea, ScrollBar } from "forlogic-core"
|
|
306
|
+
|
|
307
|
+
<ScrollArea className="h-72 w-48 rounded-md border">
|
|
308
|
+
<div className="p-4">
|
|
309
|
+
{items.map((item) => (
|
|
310
|
+
<div key={item.id}>{item.content}</div>
|
|
311
|
+
))}
|
|
312
|
+
</div>
|
|
313
|
+
</ScrollArea>
|
|
314
|
+
|
|
315
|
+
// Scroll horizontal:
|
|
316
|
+
<ScrollArea className="w-96 whitespace-nowrap rounded-md border">
|
|
317
|
+
<div className="flex w-max space-x-4 p-4">
|
|
318
|
+
{items.map((item) => (
|
|
319
|
+
<div key={item.id} className="w-[150px] shrink-0">{item.content}</div>
|
|
320
|
+
))}
|
|
321
|
+
</div>
|
|
322
|
+
<ScrollBar orientation="horizontal" />
|
|
323
|
+
</ScrollArea>
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
**Props:**
|
|
327
|
+
| Prop | Tipo | Padrão | Descrição |
|
|
328
|
+
|------|------|--------|-----------|
|
|
329
|
+
| `className` | `string` | - | Classes CSS para o container root. |
|
|
330
|
+
| `children` | `ReactNode` | - | Conteúdo rolável. |
|
|
331
|
+
|
|
332
|
+
**Exemplos:**
|
|
333
|
+
```tsx
|
|
334
|
+
<ScrollArea className=
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
**Acessibilidade:**
|
|
338
|
+
- Scrollbars customizadas mantêm comportamento nativo de rolagem.
|
|
339
|
+
- Funciona com teclado, trackpad e touch.
|
|
340
|
+
- Compatível com leitores de tela.
|
|
341
|
+
|
|
342
|
+
**Notas:**
|
|
343
|
+
- O ScrollArea vertical é o padrão — não precisa de ScrollBar explícito.
|
|
344
|
+
- Para scroll horizontal, adicione <ScrollBar orientation=
|
|
345
|
+
- /> como filho direto.
|
|
346
|
+
- Usado internamente pela DesignSystemSidebar, AppSidebar, e outros componentes com overflow.
|
|
347
|
+
- Mantém bordas arredondadas do container pai (rounded-[inherit]).
|
|
348
|
+
|
|
349
|
+
> Fonte: `src\design-system\docs\components\ScrollAreaDoc.tsx`
|
|
350
|
+
|
|
351
|
+
---
|