forlogic-core 2.0.3 → 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.
@@ -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
+ ---