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.
@@ -0,0 +1,651 @@
1
+ <!-- ⚠️ ARQUIVO GERADO AUTOMATICAMENTE — NÃO EDITAR MANUALMENTE -->
2
+ <!-- Fonte: src/design-system/docs/ | Regenerar: npx tsx scripts/generate-ds-docs.ts -->
3
+
4
+ # Business Components
5
+
6
+ Categoria: **Business Components** | 12 componentes
7
+
8
+ ### Action Plan
9
+
10
+ Componente de página completa para gerenciar planos de ação. Inclui formulário com abas (Geral, Progresso, Predecessores, Custos, Comentários, Histórico, Anexos), mudança de status e reportes de progresso. As abas de Comentários, Histórico e Anexos são componentes internos portados das libs Angular (flc-comments, flc-history, flc-attachments) e são renderizados automaticamente quando habilitados via config.
11
+
12
+ **Uso:**
13
+ ```tsx
14
+ import { ActionPlanPage, ETaskPlanStatus } from "forlogic-core"
15
+
16
+ <ActionPlanPage
17
+ actionPlan={actionPlan}
18
+ config={{
19
+ enablePredecessors: true,
20
+ enableCosts: true,
21
+ enableAttachments: true,
22
+ enableComments: true,
23
+ enableHistory: true,
24
+ }}
25
+ users={users}
26
+ places={places}
27
+ progress={progress}
28
+ comments={comments}
29
+ history={history}
30
+ attachments={attachments}
31
+ onSave={handleSave}
32
+ onCancel={() => navigate(-1)}
33
+ onChangeStatus={handleChangeStatus}
34
+ onReportProgress={handleReportProgress}
35
+ onAddComment={handleAddComment}
36
+ onUploadAttachment={handleUploadAttachment}
37
+ />
38
+ ```
39
+
40
+ **Props:**
41
+ | Prop | Tipo | Padrão | Descrição |
42
+ |------|------|--------|-----------|
43
+ | `actionPlan` | `ActionPlan | null` | - | Dados do plano de ação. null/undefined para novo. |
44
+ | `isNew` | `boolean` | - | Se é um novo plano (oculta tabs extras e status). |
45
+ | `config` | `ActionPlanFormConfig` | - | Configuração do formulário: campos obrigatórios, visíveis, tabs habilitadas (enableComments, enableHistory, enableAttachments). |
46
+ | `isLoading` | `boolean` | - | Estado de loading global. |
47
+
48
+ **Exemplos:**
49
+ ```tsx
50
+ <ActionPlanPage
51
+ actionPlan={actionPlan}
52
+ config={{
53
+ enablePredecessors: true,
54
+ enableCosts: true,
55
+ enableAttachments: true,
56
+ enableComments: true,
57
+ enableHistory: true,
58
+ hasComments: true,
59
+ }}
60
+ users={users}
61
+ places={places}
62
+ actionTypes={actionTypes}
63
+ causes={causes}
64
+ progress={progress}
65
+ predecessors={predecessors}
66
+ costs={costs}
67
+ comments={comments}
68
+ history={history}
69
+ attachments={attachments}
70
+ onSave={handleSave}
71
+ onChangeStatus={handleChangeStatus}
72
+ onReportProgress={handleReportProgress}
73
+ onAddComment={handleAddComment}
74
+ onEditComment={handleEditComment}
75
+ onDeleteComment={handleDeleteComment}
76
+ onUploadAttachment={handleUploadAttachment}
77
+ onDeleteAttachment={handleDeleteAttachment}
78
+ onRenameAttachment={handleRenameAttachment}
79
+ onDownloadAttachment={handleDownloadAttachment}
80
+ onViewAttachment={handleViewAttachment}
81
+ />
82
+ ```
83
+ ```tsx
84
+ <ActionPlanPage
85
+ isNew
86
+ config={{}}
87
+ users={users}
88
+ places={places}
89
+ onSave={handleSave}
90
+ onCancel={() => navigate(-1)}
91
+ />
92
+ ```
93
+ ```tsx
94
+ import { ActionPlanStatusBadge, ETaskPlanStatus } from
95
+ ```
96
+
97
+ **Notas:**
98
+ - Os componentes internos de Comentários, Histórico e Anexos foram portados das libs Angular (flc-comments, flc-history, flc-attachments).
99
+ - Comentários suportam CRUD completo com avatar, timestamps e label
100
+ - . @menções e Rich Text Editor serão adicionados em versão futura.
101
+ - Histórico exibe timeline vertical com ícone, descrição, avatar do usuário, data/hora e indicador
102
+ - para requisições mobile.
103
+ - Anexos suportam upload múltiplo, barra de progresso, renomear inline, context menu (visualizar, download, excluir) e detecção de duplicatas.
104
+ - Slots (attachmentsSlot, commentsSlot, historySlot) permitem substituir os componentes padrão por implementações customizadas do projeto consumidor.
105
+
106
+ > Fonte: `src\design-system\docs\components\ActionPlanDoc.tsx`
107
+
108
+ ---
109
+
110
+ ### Approval Flow (Fluxo de Aprovação)
111
+
112
+ *Documentação não extraída automaticamente. Consulte o Design System interativo em `/ds`.*
113
+
114
+ ---
115
+
116
+ ### Audit Trail
117
+
118
+ Componente completo para visualização de trilha de auditoria (logs de alterações). Inclui filtros por módulo, evento, usuário e período, com visualização detalhada de cada registro.
119
+
120
+ **Uso:**
121
+ ```tsx
122
+ import { AuditTrailPage } from 'forlogic-core';
123
+
124
+ <AuditTrailPage
125
+ softwares={softwares}
126
+ onFetchEvents={fetchEvents}
127
+ onSearch={searchAuditTrails}
128
+ onFetchDetails={fetchDetails}
129
+ onFetchUsers={fetchUsers}
130
+ />
131
+ ```
132
+
133
+ **Props:**
134
+ | Prop | Tipo | Padrão | Descrição |
135
+ |------|------|--------|-----------|
136
+ | `softwares` | `AuditTrailSoftware[]` | - | Lista de módulos disponíveis para filtro |
137
+ | `onFetchEvents` | `(softwareId) => Promise<AuditTrailEvent[]>` | - | Busca eventos por módulo |
138
+ | `onSearch` | `(params) => Promise<AuditTrail[]>` | - | Busca registros de auditoria |
139
+ | `onFetchDetails` | `(id) => Promise<AuditTrailDetails>` | - | Busca detalhes de um registro |
140
+ | `onFetchUsers` | `(query) => Promise<AuditTrailUserOption[]>` | - | Busca usuários para filtro |
141
+
142
+ **Notas:**
143
+ - Componente de página completa — inclui toolbar, filtros e tabela
144
+ - Requer implementação dos callbacks de busca no backend
145
+
146
+ > Fonte: `src\design-system\docs\components\AuditTrailDoc.tsx`
147
+
148
+ ---
149
+
150
+ ### Custom Form Fields
151
+
152
+ Componente container que renderiza campos de formulário dinâmicos baseados em configuração. Suporta 9 tipos de campo: Texto Somente Leitura, Texto, Data, Hora, URL, Numérico, Seleção Única, Seleção Múltipla e Questões. Portado de FlcCustomFormFieldsComponent (flc-custom-form-fields).
153
+
154
+ **Uso:**
155
+ ```tsx
156
+ import { CustomFormFields, ECustomFormFieldType, validateFields } from "forlogic-core"
157
+ import type { FieldAssociation } from "forlogic-core"
158
+
159
+ const fields: FieldAssociation[] = [
160
+ {
161
+ id: 'f1',
162
+ type: ECustomFormFieldType.text,
163
+ name: 'Nome',
164
+ required: true,
165
+ config: { multiline: false },
166
+ isActive: true,
167
+ },
168
+ // ...mais campos
169
+ ];
170
+
171
+ const [formFields, setFormFields] = useState(fields);
172
+
173
+ <CustomFormFields
174
+ fields={formFields}
175
+ onChange={setFormFields}
176
+ onFieldChange={(field) => console.log('Changed:', field)}
177
+ />
178
+ ```
179
+
180
+ **Notas:**
181
+ - Portado de FlcCustomFormFieldsComponent (flc-custom-form-fields) Angular.
182
+ - Tipos de campo: readOnlyText (1), text (2), date (3), time (4), url (5), number (6), singleSelection (7), multiSelection (8), questions (9).
183
+ - Use validateFields() para validar campos obrigatórios e restrições numéricas.
184
+ - Use getFormFieldValues() para extrair valores no formato de envio ao backend.
185
+ - Use setFormFieldValues() para aplicar valores salvos a uma lista de campos.
186
+ - Campos de seleção suportam dataSource custom (dados estáticos) e users (lista de usuários do sistema).
187
+
188
+ > Fonte: `src\design-system\docs\components\CustomFormFieldsDoc.tsx`
189
+
190
+ ---
191
+
192
+ ### Select
193
+
194
+ Exibe uma lista de opções para o usuário escolher—acionada por um botão.
195
+
196
+ **Uso:**
197
+ ```tsx
198
+ import {
199
+ Select,
200
+ SelectContent,
201
+ SelectItem,
202
+ SelectTrigger,
203
+ SelectValue,
204
+ } from "forlogic-core"
205
+
206
+ <Select>
207
+ <SelectTrigger className="w-[180px]">
208
+ <SelectValue placeholder="Theme" />
209
+ </SelectTrigger>
210
+ <SelectContent>
211
+ <SelectItem value="light">Light</SelectItem>
212
+ <SelectItem value="dark">Dark</SelectItem>
213
+ </SelectContent>
214
+ </Select>
215
+ ```
216
+
217
+ **Props:**
218
+ | Prop | Tipo | Padrão | Descrição |
219
+ |------|------|--------|-----------|
220
+ | `defaultValue` | `string` | - | O valor selecionado padrão. |
221
+ | `value` | `string` | - | O valor selecionado controlado. |
222
+ | `onValueChange` | `(value: string) => void` | - | Manipulador de evento quando o valor muda. |
223
+ | `disabled` | `boolean` | false | Se o select está desabilitado. |
224
+ | `container (SelectContent)` | `HTMLElement` | - | Container HTML para portal (útil dentro de Dialog). |
225
+ | `collisionBoundary (SelectContent)` | `HTMLElement` | - | Elemento para detecção de colisão de posicionamento. |
226
+
227
+ **Acessibilidade:**
228
+ - Navegação completa por teclado
229
+ - Busca por digitação antecipada
230
+ - Segue o padrão de listbox WAI-ARIA
231
+ - Anúncios para leitores de tela
232
+
233
+ **Notas:**
234
+ - 💡 Use
235
+ - e
236
+ - quando o Select estiver dentro de um Dialog para evitar problemas de scroll
237
+ - 💡 Para seleção com busca, considere usar
238
+ - ao invés de
239
+
240
+ > Fonte: `src\design-system\docs\components\SelectDoc.tsx`
241
+
242
+ ---
243
+
244
+ ### Leadership
245
+
246
+ Módulo hierárquico de liderança para gerenciar relações de liderança entre usuários do Qualiex. Inclui componentes visuais, hooks de API e utilitários para construção de árvores hierárquicas.
247
+
248
+ **Uso:**
249
+ ```tsx
250
+ // Página completa de liderança
251
+ import { LeadershipPage } from 'forlogic-core';
252
+
253
+ function MyLeadershipPage() {
254
+ return <LeadershipPage />;
255
+ }
256
+
257
+ // Ou use componentes individuais
258
+ import {
259
+ LeadershipDialog,
260
+ useLeadershipApi
261
+ } from 'forlogic-core';
262
+
263
+ function CustomLeadershipView() {
264
+ const { data: leaders, isLoading } = useLeadershipApi();
265
+ const [dialogOpen, setDialogOpen] = useState(false);
266
+
267
+ if (isLoading) return <div>Carregando...</div>;
268
+
269
+ return (
270
+ <div>
271
+ <Button onClick={() => setDialogOpen(true)}>
272
+ Adicionar Líder
273
+ </Button>
274
+
275
+ <LeadershipDialog
276
+ open={dialogOpen}
277
+ onOpenChange={setDialogOpen}
278
+ title="Novo Líder"
279
+ />
280
+
281
+ {/* Renderizar hierarquia */}
282
+ </div>
283
+ );
284
+ }
285
+ ```
286
+
287
+ **Props:**
288
+ | Prop | Tipo | Padrão | Descrição |
289
+ |------|------|--------|-----------|
290
+ | `LeadershipDialog.open` | `boolean` | - | Controla a visibilidade do dialog. |
291
+ | `LeadershipDialog.onOpenChange` | `(open: boolean) => void` | - | Callback quando o estado de abertura muda. |
292
+ | `LeadershipDialog.leader` | `Leader` | - | Líder a ser editado (se não fornecido, cria novo). |
293
+ | `LeadershipDialog.prefilledLeaderId` | `string | null` | - | ID do líder superior pré-selecionado (para criação). |
294
+ | `LeadershipDialog.title` | `string` | - | Título do dialog. |
295
+ | `LeaderRow.leader` | `LeaderNode` | - | Nó do líder a ser renderizado. |
296
+ | `LeaderRow.expandedIds` | `Set<string>` | - | IDs dos nós atualmente expandidos. |
297
+ | `LeaderRow.onToggleExpand` | `(id: string) => void` | - | Callback para alternar expansão de um nó. |
298
+ | `LeaderRow.onEdit` | `(leader: Leader) => void` | - | Callback quando o nome do líder é clicado. |
299
+ | `LeadershipForm.leader` | `Leader` | - | Líder a ser editado (modo edição). |
300
+ | `LeadershipForm.prefilledLeaderId` | `string | null` | - | ID do líder superior pré-selecionado. |
301
+ | `LeadershipForm.onSuccess` | `() => void` | - | Callback executado após salvar com sucesso. |
302
+
303
+ **Acessibilidade:**
304
+ - Os botões de expandir/colapsar são acessíveis via teclado.
305
+ - Os nomes clicáveis têm role=
306
+ - implícito.
307
+ - O dialog segue padrões WAI-ARIA para modais.
308
+ - Checkboxes de seleção de usuários são navegáveis via Tab.
309
+ - Estados de loading são anunciados para leitores de tela.
310
+
311
+ **Notas:**
312
+ - O módulo requer autenticação ativa (useAuth) e integração com Qualiex.
313
+ - Os dados são enriquecidos automaticamente com nomes/emails do Qualiex.
314
+ - Líderes
315
+ - são criados automaticamente para referências não cadastradas.
316
+ - Validação de ciclos na hierarquia é feita automaticamente.
317
+ - O estado de expansão é persistido no localStorage por alias.
318
+ - Soft delete é usado para remoção (is_removed = true).
319
+
320
+ > Fonte: `src\design-system\docs\components\LeadershipDoc.tsx`
321
+
322
+ ---
323
+
324
+ ### Media
325
+
326
+ Módulo completo para upload, edição e renderização de imagens e vídeos. Inclui editores interativos, renderizadores otimizados e hook genérico de upload.
327
+
328
+ **Uso:**
329
+ ```tsx
330
+ // Exemplo básico de upload de imagem
331
+ const { upload, uploading, progress } = useMediaUpload({
332
+ uploadFunction: async (file, options) => {
333
+ // Implementação do upload para seu storage
334
+ const url = await uploadToStorage(file, options);
335
+ return { url, path: file.name };
336
+ }
337
+ });
338
+
339
+ // Renderizar uma imagem
340
+ <ImageRenderer
341
+ content={{
342
+ imageUrl: 'https://example.com/image.jpg',
343
+ caption: 'Legenda da imagem',
344
+ alignment: 'center'
345
+ }}
346
+ />
347
+
348
+ // Renderizar um vídeo
349
+ <VideoRenderer
350
+ content={{
351
+ videoUrl: 'https://youtube.com/watch?v=...',
352
+ controls: true
353
+ }}
354
+ />
355
+ ```
356
+
357
+ **Props:**
358
+ | Prop | Tipo | Padrão | Descrição |
359
+ |------|------|--------|-----------|
360
+ | `uploadFunction` | `UploadFunction` | - | Função de upload customizada (obrigatória para uploads) |
361
+ | `deleteFunction` | `DeleteFunction` | - | Função de delete customizada |
362
+ | `defaultOptions` | `UploadOptions` | - | Opções padrão: bucket, maxSize, allowedTypes |
363
+ | `onSuccess` | `(result: UploadResult) => void` | - | Callback executado após upload bem-sucedido |
364
+ | `onError` | `(error: Error) => void` | - | Callback executado em caso de erro |
365
+ | `value` | `ImageBlockContent | VideoBlockContent` | - | Valor atual do conteúdo |
366
+ | `onChange` | `(value) => void` | - | Callback para mudanças no conteúdo |
367
+ | `onSubmit` | `(value) => void` | - | Callback ao salvar o conteúdo |
368
+ | `onCancel` | `() => void` | - | Callback ao cancelar edição |
369
+ | `uploadOptions` | `UploadOptions` | - | Opções de upload específicas para o editor |
370
+ | `content` | `ImageBlockContent | VideoBlockContent` | - | Conteúdo a ser renderizado |
371
+ | `className` | `string` | - | Classes CSS adicionais |
372
+ | `style` | `CSSProperties` | - | Estilos inline adicionais |
373
+
374
+ **Exemplos:**
375
+ ```tsx
376
+ import { useMediaUpload, getSupabaseClient } from
377
+ ```
378
+
379
+ **Acessibilidade:**
380
+ - ImageRenderer inclui atributo alt obrigatório para acessibilidade
381
+ - VideoRenderer usa atributo title no iframe para identificação
382
+ - Controles de vídeo habilitados por padrão para navegação por teclado
383
+ - Autoplay sempre acompanhado de muted para conformidade com navegadores
384
+ - Links de download possuem texto descritivo
385
+ - Todos os inputs dos editores possuem labels associados
386
+
387
+ **Notas:**
388
+ - O hook useMediaUpload requer que o projeto forneça as funções de upload/delete
389
+ - A função uploadFunction deve retornar { url: string, path?: string }
390
+ - VideoRenderer detecta automaticamente YouTube e Vimeo pela URL
391
+ - Para vídeos locais, use o player HTML5 nativo com controles
392
+ - Dimensões são opcionais; imagens usam max-width: 100% por padrão
393
+ - O módulo não inclui implementação de storage - use Supabase, S3, etc.
394
+ - Helpers de imagem usam Canvas API para compressão e resize
395
+
396
+ > Fonte: `src\design-system\docs\components\MediaDoc.tsx`
397
+
398
+ ---
399
+
400
+ ### Places
401
+
402
+ Módulo para gerenciar estruturas hierárquicas de locais integrado com a API Qualiex. Inclui visualização em árvore, gestão de acessos e componentes reutilizáveis.
403
+
404
+ **Uso:**
405
+ ```tsx
406
+ // =====================
407
+ // BUSCAR LOCAIS
408
+ // =====================
409
+ import { placeService } from 'forlogic-core';
410
+
411
+ async function loadPlaces() {
412
+ const places = await placeService.getPlaces(alias, companyId);
413
+ // places já vem em estrutura hierárquica
414
+ console.log(places);
415
+ }
416
+
417
+ // =====================
418
+ // LISTA SIMPLES (SEM GESTÃO DE ACESSOS)
419
+ // =====================
420
+ import { PlacesList } from 'forlogic-core';
421
+
422
+ function MyPlacesPage() {
423
+ const [places, setPlaces] = useState<Place[]>([]);
424
+ const [isLoading, setIsLoading] = useState(true);
425
+
426
+ useEffect(() => {
427
+ placeService.getPlaces(alias, companyId)
428
+ .then(setPlaces)
429
+ .finally(() => setIsLoading(false));
430
+ }, [alias, companyId]);
431
+
432
+ return (
433
+ <PlacesList
434
+ places={places}
435
+ isLoading={isLoading}
436
+ />
437
+ );
438
+ }
439
+
440
+ // =====================
441
+ // COM GESTÃO DE ACESSOS
442
+ // =====================
443
+ import { PlacesList, PlaceCard } from 'forlogic-core';
444
+
445
+ function PlacesWithAccess() {
446
+ const [places, setPlaces] = useState<Place[]>([]);
447
+ const [managers, setManagers] = useState<Record<string, string>>({});
448
+ const [members, setMembers] = useState<Record<string, string[]>>({});
449
+
450
+ const manageAccessConfig = {
451
+ onMakeManager: async (userId, placeId) => {
452
+ setManagers(prev => ({ ...prev, [placeId]: userId }));
453
+ // Chamar API para salvar
454
+ },
455
+ onMakeMembers: async (userIds, placeId) => {
456
+ setMembers(prev => ({ ...prev, [placeId]: userIds }));
457
+ // Chamar API para salvar
458
+ },
459
+ getCurrentManagerId: (placeId) => managers[placeId],
460
+ getCurrentMemberIds: (placeId) => members[placeId] || []
461
+ };
462
+
463
+ return (
464
+ <PlacesList
465
+ places={places}
466
+ isLoading={false}
467
+ manageAccessConfig={manageAccessConfig}
468
+ />
469
+ );
470
+ }
471
+
472
+ // =====================
473
+ // PLACECARD INDIVIDUAL
474
+ // =====================
475
+ import { PlaceCard } from 'forlogic-core';
476
+
477
+ <PlaceCard
478
+ place={myPlace}
479
+ level={0}
480
+ manageAccessConfig={manageAccessConfig}
481
+ />
482
+ ```
483
+
484
+ **Acessibilidade:**
485
+ - Botões de expandir/colapsar acessíveis via teclado.
486
+ - Modal segue padrões WAI-ARIA.
487
+ - Checkboxes navegáveis por Tab.
488
+ - Estados de loading anunciados para leitores de tela.
489
+ - Busca de usuários com feedback visual.
490
+
491
+ **Notas:**
492
+ - Requer integração com API Qualiex configurada.
493
+ - O placeService monta a hierarquia automaticamente.
494
+ - O ManageAccessModal usa o hook useQualiexUsers internamente.
495
+ - A gestão de acessos é opcional - sem manageAccessConfig, apenas exibe.
496
+ - Níveis de hierarquia são controlados pela prop level no PlaceCard.
497
+
498
+ > Fonte: `src\design-system\docs\components\PlacesDoc.tsx`
499
+
500
+ ---
501
+
502
+ ### QualiexUserField
503
+
504
+ Campo de seleção de usuários integrado com a API Qualiex. Suporta seleção única ou múltipla, display customizado, filtros e funciona perfeitamente dentro de Dialogs.
505
+
506
+ **Uso:**
507
+ ```tsx
508
+ import { QualiexUserField } from "forlogic-core"
509
+
510
+ // =====================
511
+ // USO BÁSICO
512
+ // =====================
513
+ <QualiexUserField
514
+ value={userId}
515
+ onChange={setUserId}
516
+ placeholder="Selecione..."
517
+ />
518
+
519
+ // =====================
520
+ // COM LABEL E REQUIRED
521
+ // =====================
522
+ import { UserCheck } from "lucide-react"
523
+
524
+ <QualiexUserField
525
+ label="Responsável"
526
+ required
527
+ icon={UserCheck}
528
+ value={userId}
529
+ onChange={setUserId}
530
+ />
531
+
532
+ // =====================
533
+ // SELEÇÃO MÚLTIPLA
534
+ // =====================
535
+ const [userIds, setUserIds] = useState<string[]>([])
536
+
537
+ <QualiexUserField
538
+ multiple
539
+ label="Avaliadores"
540
+ required
541
+ value={userIds}
542
+ onChange={setUserIds}
543
+ maxDisplayedBadges={3}
544
+ />
545
+
546
+ // =====================
547
+ // DISPLAY CUSTOMIZADO
548
+ // =====================
549
+
550
+ // Exibir nome + email
551
+ <QualiexUserField
552
+ displayFormat="name-email"
553
+ value={userId}
554
+ onChange={setUserId}
555
+ />
556
+
557
+ // Exibir nome + cargo
558
+ <QualiexUserField
559
+ displayFormat="name-role"
560
+ value={userId}
561
+ onChange={setUserId}
562
+ />
563
+
564
+ // Custom display function
565
+ <QualiexUserField
566
+ displayFormat="custom"
567
+ customDisplayFn={(user) => \`\${user.userName} - \${user.placeName || 'Sem local'}\
568
+ ```
569
+
570
+ **Acessibilidade:**
571
+ - Navegação completa por teclado
572
+ - Busca inteligente (sem acentos, case-insensitive)
573
+ - Segue padrão WAI-ARIA combobox
574
+ - Badges removíveis com teclado (modo múltiplo)
575
+ - Estados de loading e erro acessíveis
576
+ - Labels associados corretamente
577
+
578
+ **Notas:**
579
+ - Requer configuração Qualiex (apiUrl e apiToken) no projeto
580
+ - Use enabled={false} para lazy loading e chame refetch() manualmente
581
+ - Em Dialogs, sempre passe popoverContainer para evitar problemas de z-index
582
+ - O hook useQualiexUsers é usado internamente para buscar os usuários
583
+ - Integrado automaticamente com BaseForm via type=
584
+
585
+ > Fonte: `src\design-system\docs\components\QualiexUserFieldDoc.tsx`
586
+
587
+ ---
588
+
589
+ ### Report Request List
590
+
591
+ *Documentação não extraída automaticamente. Consulte o Design System interativo em `/ds`.*
592
+
593
+ ---
594
+
595
+ ### Select
596
+
597
+ Exibe uma lista de opções para o usuário escolher—acionada por um botão.
598
+
599
+ **Uso:**
600
+ ```tsx
601
+ import {
602
+ Select,
603
+ SelectContent,
604
+ SelectItem,
605
+ SelectTrigger,
606
+ SelectValue,
607
+ } from "forlogic-core"
608
+
609
+ <Select>
610
+ <SelectTrigger className="w-[180px]">
611
+ <SelectValue placeholder="Theme" />
612
+ </SelectTrigger>
613
+ <SelectContent>
614
+ <SelectItem value="light">Light</SelectItem>
615
+ <SelectItem value="dark">Dark</SelectItem>
616
+ </SelectContent>
617
+ </Select>
618
+ ```
619
+
620
+ **Props:**
621
+ | Prop | Tipo | Padrão | Descrição |
622
+ |------|------|--------|-----------|
623
+ | `defaultValue` | `string` | - | O valor selecionado padrão. |
624
+ | `value` | `string` | - | O valor selecionado controlado. |
625
+ | `onValueChange` | `(value: string) => void` | - | Manipulador de evento quando o valor muda. |
626
+ | `disabled` | `boolean` | false | Se o select está desabilitado. |
627
+ | `container (SelectContent)` | `HTMLElement` | - | Container HTML para portal (útil dentro de Dialog). |
628
+ | `collisionBoundary (SelectContent)` | `HTMLElement` | - | Elemento para detecção de colisão de posicionamento. |
629
+
630
+ **Acessibilidade:**
631
+ - Navegação completa por teclado
632
+ - Busca por digitação antecipada
633
+ - Segue o padrão de listbox WAI-ARIA
634
+ - Anúncios para leitores de tela
635
+
636
+ **Notas:**
637
+ - 💡 Use
638
+ - e
639
+ - quando o Select estiver dentro de um Dialog para evitar problemas de scroll
640
+ - 💡 Para seleção com busca, considere usar
641
+ - ao invés de
642
+
643
+ > Fonte: `src\design-system\docs\components\SelectDoc.tsx`
644
+
645
+ ---
646
+
647
+ ### Internacionalização (i18n)
648
+
649
+ *Documentação não extraída automaticamente. Consulte o Design System interativo em `/ds`.*
650
+
651
+ ---