forlogic-core 2.0.0 → 2.0.1
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 +0 -46
- package/dist/assets/AccordionDoc-CGNlubG3.js +31 -0
- package/dist/assets/ActionButtonDoc-CYtkXR0k.js +47 -0
- package/dist/assets/ActionPlanDoc-BSuPRftQ.js +65 -0
- package/dist/assets/AlertDoc-Cpvxneqg.js +37 -0
- package/dist/assets/AliasUrlDoc-DIpUWf4Y.js +189 -0
- package/dist/assets/AppHeaderDoc-DNQErj_t.js +74 -0
- package/dist/assets/AppSidebarDoc-DkeQarDu.js +221 -0
- package/dist/assets/ApprovalFlowDoc-8YgXbhKJ.js +31 -0
- package/dist/assets/AuditLogDoc-BBvNcHIo.js +67 -0
- package/dist/assets/AuditTrailDoc-DgFHO-uo.js +17 -0
- package/dist/assets/AuthDoc-WIA_Aetl.js +200 -0
- package/dist/assets/AvatarDoc-B6go1C1T.js +11 -0
- package/dist/assets/BadgeDoc-BONhfqB_.js +36 -0
- package/dist/assets/BaseFormDoc-CuyUArcj.js +169 -0
- package/dist/assets/BodyContentDoc-CterHC1E.js +83 -0
- package/dist/assets/BreadcrumbDoc-Dwn9nLeO.js +75 -0
- package/dist/assets/ButtonDoc-BOjRseZT.js +41 -0
- package/dist/assets/ButtonGroupDoc-8IS6PPh4.js +7 -0
- package/dist/assets/CalendarDoc-CMwIEqgT.js +81 -0
- package/dist/assets/CardDoc-BZz1CVg2.js +49 -0
- package/dist/assets/ChartDoc-B5vZVtqD.js +76 -0
- package/dist/assets/CheckboxDoc-lAbYO9I5.js +55 -0
- package/dist/assets/ColorPickerDoc-Dpsprp4N.js +10 -0
- package/dist/assets/ColorsFoundationDoc-CCHeSL3p.js +13 -0
- package/dist/assets/ComboTreeDoc-D4dTkIt-.js +46 -0
- package/dist/assets/ComboboxDoc-CqqZPvZq.js +134 -0
- package/dist/assets/ComponentDocTemplate-CQbBhfvZ.js +1 -0
- package/dist/assets/ContextMenuDoc-D3jC-MVA.js +182 -0
- package/dist/assets/ContextsDoc-XFH0-JdS.js +211 -0
- package/dist/assets/CreateCrudPageDoc-CpuiWI-g.js +106 -0
- package/dist/assets/CrudActionBarDoc-wuBGXD9Y.js +112 -0
- package/dist/assets/CrudGridDoc-BYWqSXBH.js +85 -0
- package/dist/assets/CrudOverviewDoc-B_bk2a2t.js +14 -0
- package/dist/assets/CrudPrimitivesDoc-CxaTB94A.js +164 -0
- package/dist/assets/CrudTableDoc-Dga1VgCu.js +113 -0
- package/dist/assets/CustomFormFieldsDoc-C1hwwSl3.js +33 -0
- package/dist/assets/DashboardFormDoc-BUDCmrMl.js +49 -0
- package/dist/assets/DashboardGeneralViewDoc-Cyg1SIiG.js +71 -0
- package/dist/assets/DashboardGridDoc-BavePiRF.js +49 -0
- package/dist/assets/DashboardListDoc-CLyMA6UK.js +37 -0
- package/dist/assets/DashboardOverviewDoc-DRVvNIF1.js +35 -0
- package/dist/assets/DashboardPanelRendererDoc--mfwb8Nc.js +60 -0
- package/dist/assets/DashboardPanelsBasicDoc-BQ2V_52D.js +62 -0
- package/dist/assets/DashboardPanelsCartesianDoc-sy-hcVQY.js +75 -0
- package/dist/assets/DashboardPanelsSpecialDoc-DsIUCRRP.js +83 -0
- package/dist/assets/DashboardViewDoc-CtlCNlEF.js +45 -0
- package/dist/assets/DataListDoc-DUy88lCQ.js +13 -0
- package/dist/assets/DesignSystemHome-DHl9YtbH.js +1 -0
- package/dist/assets/DialogDoc-CMQqnTV-.js +981 -0
- package/dist/assets/DropdownMenuDoc-S7X9csGt.js +175 -0
- package/dist/assets/ElectronicSignatureDialogDoc-BfithaL_.js +57 -0
- package/dist/assets/EmptyStateDoc-CHGCiGIk.js +35 -0
- package/dist/assets/EnvironmentsDoc-DZHJZ2nm.js +96 -0
- package/dist/assets/ErrorBoundaryDoc-DoaAg68p.js +111 -0
- package/dist/assets/ExampleActionPlanPage-C0fIMZCD.js +1 -0
- package/dist/assets/ExampleAppDoc-DzIU81Fn.js +1 -0
- package/dist/assets/ExampleCard-DuLrb3t-.js +1 -0
- package/dist/assets/ExampleCrudReportsPage-M0pz6tdM.js +1 -0
- package/dist/assets/ExampleDashboardPage-CRG5r3Vw.js +1 -0
- package/dist/assets/ExampleIdeasPage-I84ZMLY4.js +1 -0
- package/dist/assets/ExampleImportWizardPage-h4YqrrSe.js +1 -0
- package/dist/assets/ExampleSettingsPage-CwdWqoaP.js +1 -0
- package/dist/assets/FileUploadDoc-9-UujFNX.js +34 -0
- package/dist/assets/FilterBar-DDTqqUfZ.js +1 -0
- package/dist/assets/FormDoc-CVES6n3d.js +81 -0
- package/dist/assets/FoundationOverview-DT0u11Gz.js +1 -0
- package/dist/assets/GridDoc-CbHFSILF.js +28 -0
- package/dist/assets/HooksDoc-Ctxdk6Wq.js +665 -0
- package/dist/assets/HoverCardDoc-8Wkaafdj.js +31 -0
- package/dist/assets/I18nDoc-D3Q2m7ik.js +167 -0
- package/dist/assets/IconPickerDoc-DZ26Gdpg.js +10 -0
- package/dist/assets/IconsFoundationDoc-xOxtC7CW.js +33 -0
- package/dist/assets/InputDoc-BhztAiuJ.js +211 -0
- package/dist/assets/LabelDoc-A4hmTRRV.js +42 -0
- package/dist/assets/LeadershipDoc-CqOSfWsP.js +452 -0
- package/dist/assets/MediaDoc-C78gvC8p.js +459 -0
- package/dist/assets/MenubarDoc-DCnmd2tO.js +165 -0
- package/dist/assets/ModuleAccessDoc-CmD5nHDp.js +153 -0
- package/dist/assets/ModulesDialogDoc-DVit1CA-.js +46 -0
- package/dist/assets/MultiselectPermissionsDoc-tlJMs04L.js +34 -0
- package/dist/assets/NavigationMenuDoc-q1fbc89j.js +116 -0
- package/dist/assets/OnboardingDialogDoc-3A3eBYrq.js +55 -0
- package/dist/assets/PaginationDoc-B8-bMz5J.js +27 -0
- package/dist/assets/PaginationDoc-BkGdxHL3.js +98 -0
- package/dist/assets/PlacesDoc-CKPO6ATs.js +226 -0
- package/dist/assets/PopoverDoc-CJPU4Ags.js +64 -0
- package/dist/assets/ProgressDoc-CpjbTL4o.js +29 -0
- package/dist/assets/QualiexUserFieldDoc-DDwumlRw.js +149 -0
- package/dist/assets/RadioGroupDoc-D6tSZz8G.js +57 -0
- package/dist/assets/RadiusDoc-B4xSnajw.js +7 -0
- package/dist/assets/ReportRequestListDoc-C0LIaU8P.js +15 -0
- package/dist/assets/RequiredFieldsCounterDoc-COesoSdx.js +58 -0
- package/dist/assets/ResizableDoc-CW0-XQuB.js +104 -0
- package/dist/assets/RichTextEditorDoc-C8c_XA9P.js +24 -0
- package/dist/assets/ScrollAreaDoc-BxtoAPaZ.js +28 -0
- package/dist/assets/SecurityDoc-wOVqpg2F.js +204 -0
- package/dist/assets/SelectDoc-C75gtY9D.js +80 -0
- package/dist/assets/SeparatorDoc-BjQBPB1P.js +4 -0
- package/dist/assets/ServicesDoc-CXTctwBl.js +308 -0
- package/dist/assets/ShadowsDoc-C6Lw8_x2.js +9 -0
- package/dist/assets/SignDoc-Bh5ZUg5x.js +66 -0
- package/dist/assets/SkeletonDoc-rTLGK5VE.js +54 -0
- package/dist/assets/SliderDoc-JMAMDub7.js +41 -0
- package/dist/assets/SpacingDoc-RljOrpwA.js +12 -0
- package/dist/assets/SplitButtonDoc-CvShUW3w.js +53 -0
- package/dist/assets/StepSelectorDoc-C-nAap9H.js +41 -0
- package/dist/assets/SwitchDoc-DLnqmkPr.js +56 -0
- package/dist/assets/TableDoc-B8EpWLVg.js +128 -0
- package/dist/assets/TabsDoc-DIBtl_uC.js +42 -0
- package/dist/assets/TeamSelectorDoc-B7OnCbL7.js +10 -0
- package/dist/assets/TermsOfUseDoc-Bb-pw08s.js +16 -0
- package/dist/assets/TextareaDoc-DGnqMqEC.js +46 -0
- package/dist/assets/ToastDoc-DjYyc7ae.js +157 -0
- package/dist/assets/ToggleDoc-C9ZOVjkY.js +51 -0
- package/dist/assets/TooltipDoc-BEx4l9-i.js +58 -0
- package/dist/assets/TruncatedCellDoc-BbV1bRSY.js +12 -0
- package/dist/assets/TypographyFoundationDoc-CUDYjRo9.js +7 -0
- package/dist/assets/UpdatesNotificationDoc-7nyjzLMJ.js +29 -0
- package/dist/assets/UsersGroupsSelectorDoc-C0KlTAL5.js +18 -0
- package/dist/assets/UtilitiesDoc-DGxaHVV1.js +145 -0
- package/dist/assets/ViewerDialogsDoc-CnTPTEz0.js +1 -0
- package/dist/assets/blocks-B6LrJeAM.js +1 -0
- package/dist/assets/building-DeVappnD.js +1 -0
- package/dist/assets/calendar-days-BQ0na5kM.js +1 -0
- package/dist/assets/check-check-C_-PJCJa.js +1 -0
- package/dist/assets/circle-plus-CpIcep-O.js +1 -0
- package/dist/assets/circle-x-jPpBPew0.js +1 -0
- package/dist/assets/clipboard-list-CXNPdciZ.js +1 -0
- package/dist/assets/cloud-upload-BEjzumjl.js +1 -0
- package/dist/assets/crown-CqNsQIsm.js +1 -0
- package/dist/assets/date-picker-BW3eGOe_.js +1 -0
- package/dist/assets/disabled-menu-item-C2YaMvSt.js +1 -0
- package/dist/assets/drawer-D5rflIcD.js +3 -0
- package/dist/assets/file-braces-DFb5X9so.js +1 -0
- package/dist/assets/file-pen-line-CyUGKkEN.js +1 -0
- package/dist/assets/git-branch-BcXv9mpp.js +1 -0
- package/dist/assets/globe-CpMIWAcv.js +1 -0
- package/dist/assets/hash-cQWdKjya.js +1 -0
- package/dist/assets/hourglass-BahQ3eDv.js +1 -0
- package/dist/assets/hover-card-R66N85sZ.js +1 -0
- package/dist/assets/iframe-dialog-V0mW5aBb.js +1 -0
- package/dist/assets/index-DkiftrvI.js +352 -0
- package/dist/assets/index-nmBjO9Th.css +1 -0
- package/dist/assets/life-buoy-ByXiPddz.js +1 -0
- package/dist/assets/loading-state-Cb5_t5uE.js +1 -0
- package/dist/assets/lucide-react-Cp3Yw3Zm.js +1 -0
- package/dist/assets/package-B3-pVvPM.js +1 -0
- package/dist/assets/pen-Bi_lmmKT.js +1 -0
- package/dist/assets/pin-DVsSl8QA.js +1 -0
- package/dist/assets/printer-BnJ8B6m-.js +1 -0
- package/dist/assets/radio-group-BHAaNGsm.js +1 -0
- package/dist/assets/server-CtzFTfKR.js +1 -0
- package/dist/assets/share-2-Dv8Do445.js +1 -0
- package/dist/assets/shield-check-CFXjOV_w.js +1 -0
- package/dist/assets/shield-x-DJTRfVux.js +1 -0
- package/dist/assets/slider-v9tXBSnB.js +1 -0
- package/dist/assets/smartphone-BSNR60L7.js +1 -0
- package/dist/assets/step-selector-ATTh_9Wa.js +1 -0
- package/dist/assets/text-align-start-qE-MbYYw.js +1 -0
- package/dist/assets/thumbs-up-D_XIW_uX.js +1 -0
- package/dist/assets/trash-DTWQwpwA.js +1 -0
- package/dist/assets/trending-up-jip5-leJ.js +1 -0
- package/dist/assets/useMockCrud-CN4vjyOZ.js +1 -0
- package/dist/assets/user-check-BlH3EDWK.js +1 -0
- package/dist/assets/user-plus-BqwXwD-c.js +1 -0
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/resizable.d.ts +1 -1
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +1 -1
- package/dist/index.html +33 -0
- package/dist/index.js +1 -1
- package/dist/setup/favicon.d.ts +1 -0
- package/docs/PUBLISH.md +3 -3
- package/package.json +1 -5
- package/dist/README.md +0 -1079
- package/dist/bin/bootstrap.js +0 -40
- package/dist/bin/pull-docs.js +0 -186
- package/dist/docs/KNOWLEDGE.md +0 -109
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import{j as e}from"./index-DkiftrvI.js";import{C as o}from"./ComponentDocTemplate-CQbBhfvZ.js";import"./ExampleCard-DuLrb3t-.js";const t=`import {
|
|
2
|
+
// Services
|
|
3
|
+
createService,
|
|
4
|
+
emailService,
|
|
5
|
+
errorService,
|
|
6
|
+
// Qualiex Enrichment
|
|
7
|
+
QualiexEnrichmentService,
|
|
8
|
+
resolveFieldMappings,
|
|
9
|
+
deriveNameField,
|
|
10
|
+
deriveEmailField,
|
|
11
|
+
deriveUsernameField,
|
|
12
|
+
} from 'forlogic-core';`,d=`import { createService } from 'forlogic-core';
|
|
13
|
+
|
|
14
|
+
// Definir tipos
|
|
15
|
+
interface Employee {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
email: string;
|
|
19
|
+
department_id: string;
|
|
20
|
+
is_removed: boolean;
|
|
21
|
+
created_at: string;
|
|
22
|
+
updated_at: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface EmployeeInsert {
|
|
26
|
+
name: string;
|
|
27
|
+
email: string;
|
|
28
|
+
department_id: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface EmployeeUpdate {
|
|
32
|
+
name?: string;
|
|
33
|
+
email?: string;
|
|
34
|
+
department_id?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Criar serviço CRUD
|
|
38
|
+
const employeeService = createService<Employee, EmployeeInsert, EmployeeUpdate>({
|
|
39
|
+
tableName: 'employees',
|
|
40
|
+
schemaName: 'common',
|
|
41
|
+
searchFields: ['name', 'email'],
|
|
42
|
+
selectFields: '*, departments(name)', // Joins automáticos
|
|
43
|
+
enableQualiexEnrichment: true, // Enriquecer com dados do Qualiex
|
|
44
|
+
userIdFields: ['id_user'], // Campos de usuário para enriquecimento
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// Uso do serviço
|
|
48
|
+
async function loadEmployees() {
|
|
49
|
+
// Buscar com paginação e filtros
|
|
50
|
+
const result = await employeeService.getAll({
|
|
51
|
+
search: 'João',
|
|
52
|
+
sortField: 'name',
|
|
53
|
+
sortDirection: 'asc',
|
|
54
|
+
page: 1,
|
|
55
|
+
limit: 25,
|
|
56
|
+
department_id: 'dept-123', // Filtro adicional
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
console.log(result.data); // Array de funcionários
|
|
60
|
+
console.log(result.totalItems); // Total de registros
|
|
61
|
+
console.log(result.hasNextPage); // Se há próxima página
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// CRUD completo
|
|
65
|
+
const employee = await employeeService.create({
|
|
66
|
+
name: 'Maria Silva',
|
|
67
|
+
email: 'maria@empresa.com',
|
|
68
|
+
department_id: 'dept-123'
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const updated = await employeeService.update(employee.id, {
|
|
72
|
+
name: 'Maria Santos'
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
await employeeService.delete(employee.id); // Soft delete (is_removed = true)`,n=`import { emailService } from 'forlogic-core';
|
|
76
|
+
|
|
77
|
+
// Enviar email de boas-vindas
|
|
78
|
+
await emailService.sendEmail({
|
|
79
|
+
templateCode: 'WELCOME',
|
|
80
|
+
to: 'usuario@exemplo.com',
|
|
81
|
+
variables: {
|
|
82
|
+
userName: 'João Silva',
|
|
83
|
+
activationLink: 'https://app.com/activate',
|
|
84
|
+
companyName: 'Minha Empresa'
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// Enviar para múltiplos destinatários com cópia
|
|
89
|
+
await emailService.sendEmail({
|
|
90
|
+
templateCode: 'NOTIFICATION',
|
|
91
|
+
to: ['usuario1@exemplo.com', 'usuario2@exemplo.com'],
|
|
92
|
+
variables: {
|
|
93
|
+
title: 'Novo documento disponível',
|
|
94
|
+
message: 'Um novo documento foi compartilhado com você',
|
|
95
|
+
actionUrl: 'https://app.com/documents/123',
|
|
96
|
+
actionLabel: 'Ver Documento'
|
|
97
|
+
},
|
|
98
|
+
cc: ['gestor@exemplo.com'],
|
|
99
|
+
bcc: ['admin@exemplo.com'],
|
|
100
|
+
replyTo: 'suporte@empresa.com'
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Templates são cadastrados na tabela common.email_templates
|
|
104
|
+
// Variáveis são substituídas automaticamente: {{userName}} -> João Silva`,l=`import { errorService } from 'forlogic-core';
|
|
105
|
+
|
|
106
|
+
// Tratamento de erros com toast automático
|
|
107
|
+
try {
|
|
108
|
+
await fetchData();
|
|
109
|
+
} catch (error) {
|
|
110
|
+
errorService.handleError(error);
|
|
111
|
+
// Exibe toast com título apropriado baseado no erro
|
|
112
|
+
// Ex: "Sessão Expirada", "Erro de Conexão", "Erro de Autenticação"
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Tratamento silencioso (sem toast)
|
|
116
|
+
try {
|
|
117
|
+
await fetchData();
|
|
118
|
+
} catch (error) {
|
|
119
|
+
errorService.handleError(error, false); // showToast = false
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Notificação de sucesso
|
|
123
|
+
errorService.success('Sucesso!', 'Dados salvos com sucesso');
|
|
124
|
+
|
|
125
|
+
// Acessar histórico de erros
|
|
126
|
+
const recentErrors = errorService.getErrors(); // Últimos 50 erros
|
|
127
|
+
console.log(recentErrors);
|
|
128
|
+
|
|
129
|
+
// Limpar histórico
|
|
130
|
+
errorService.clearErrors();
|
|
131
|
+
|
|
132
|
+
// Rate limiting automático: máximo 3 toasts por minuto`,m=`import { QualiexEnrichmentService } from 'forlogic-core';
|
|
133
|
+
|
|
134
|
+
// Enriquecer entidades com dados de usuário do Qualiex
|
|
135
|
+
// Adiciona automaticamente: nome, email, username dos usuários
|
|
136
|
+
|
|
137
|
+
// Uso simples: lista de campos de ID
|
|
138
|
+
const enrichedItems = await QualiexEnrichmentService.enrichWithUserData(items, {
|
|
139
|
+
entityName: 'Avaliações',
|
|
140
|
+
userIdFields: ['target_user_id', 'evaluator_user_id']
|
|
141
|
+
});
|
|
142
|
+
// Resultado: target_user_name, evaluator_user_name preenchidos automaticamente
|
|
143
|
+
|
|
144
|
+
// Uso avançado: mapeamento customizado de campos
|
|
145
|
+
const enrichedItems = await QualiexEnrichmentService.enrichWithUserData(items, {
|
|
146
|
+
entityName: 'Avaliações',
|
|
147
|
+
userFieldsMapping: [
|
|
148
|
+
{
|
|
149
|
+
idField: 'target_user_id',
|
|
150
|
+
nameField: 'avaliado_nome',
|
|
151
|
+
emailField: 'avaliado_email'
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
idField: 'evaluator_user_id',
|
|
155
|
+
nameField: 'avaliador_nome'
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// Características:
|
|
161
|
+
// - Cache inteligente de 5 minutos por companyId
|
|
162
|
+
// - Validação automática de tokens
|
|
163
|
+
// - Resiliência: retorna entidades originais em caso de erro
|
|
164
|
+
// - Suporta múltiplos campos de usuário por entidade`,c=`import {
|
|
165
|
+
resolveFieldMappings,
|
|
166
|
+
deriveNameField,
|
|
167
|
+
deriveEmailField,
|
|
168
|
+
deriveUsernameField
|
|
169
|
+
} from 'forlogic-core';
|
|
170
|
+
|
|
171
|
+
// Derivar nome do campo de saída baseado no campo de ID
|
|
172
|
+
deriveNameField('target_user_id'); // → 'target_user_name'
|
|
173
|
+
deriveNameField('id_user'); // → 'id_user_name'
|
|
174
|
+
deriveNameField('id_user', '_nome'); // → 'id_user_nome' (sufixo customizado)
|
|
175
|
+
|
|
176
|
+
deriveEmailField('target_user_id'); // → 'target_user_email'
|
|
177
|
+
deriveUsernameField('target_user_id'); // → 'target_user_username'
|
|
178
|
+
|
|
179
|
+
// Resolver mapeamentos automaticamente
|
|
180
|
+
// Prioridade: userFieldsMapping > userIdFields > default
|
|
181
|
+
|
|
182
|
+
// Uso com lista simples de campos
|
|
183
|
+
const mappings = resolveFieldMappings(['target_user_id', 'evaluator_user_id']);
|
|
184
|
+
// Resultado:
|
|
185
|
+
// [
|
|
186
|
+
// { idField: 'target_user_id', nameField: 'target_user_name', ... },
|
|
187
|
+
// { idField: 'evaluator_user_id', nameField: 'evaluator_user_name', ... }
|
|
188
|
+
// ]
|
|
189
|
+
|
|
190
|
+
// Uso com mapeamento explícito
|
|
191
|
+
const mappings = resolveFieldMappings(undefined, [
|
|
192
|
+
{ idField: 'id_user', nameField: 'responsible_name' }
|
|
193
|
+
]);
|
|
194
|
+
|
|
195
|
+
// Default (sem parâmetros): id_user → responsible_name
|
|
196
|
+
const mappings = resolveFieldMappings();
|
|
197
|
+
// [{ idField: 'id_user', nameField: 'responsible_name' }]`,u=[{name:"createService<T, TInsert, TUpdate>(options)",type:"CrudService<T>",default:"-",description:"Factory para criar serviço CRUD completo com Supabase. Implementa soft delete e RLS."},{name:"options.tableName",type:"string",default:"-",description:"Nome da tabela no Supabase."},{name:"options.schemaName",type:"string",default:"'common'",description:"Schema do banco de dados."},{name:"options.searchFields",type:"string[]",default:"[]",description:"Campos para busca textual (ilike)."},{name:"options.selectFields",type:"string",default:"'*'",description:'Campos para select, suporta joins (ex: "*, categories(name)").'},{name:"options.enableQualiexEnrichment",type:"boolean",default:"false",description:"Se deve enriquecer dados com informações do Qualiex."},{name:"emailService.sendEmail(params)",type:"Promise<any>",default:"-",description:"Envia email usando template do banco de dados via edge function."},{name:"params.templateCode",type:"string",default:"-",description:"Código do template em common.email_templates."},{name:"params.to",type:"string | string[]",default:"-",description:"Destinatário(s) do email."},{name:"params.variables",type:"Record<string, any>",default:"-",description:"Variáveis para substituição no template ({{variableName}})."},{name:"errorService.handleError(error, showToast?)",type:"void",default:"showToast: true",description:"Trata erro e exibe toast com título apropriado. Rate limiting: máx 3/min."},{name:"errorService.success(title, description?)",type:"void",default:"-",description:"Exibe toast de sucesso."},{name:"errorService.getErrors()",type:"ErrorEntry[]",default:"-",description:"Retorna os últimos 50 erros registrados."},{name:"QualiexEnrichmentService.enrichWithUserData(entities, options)",type:"Promise<T[]>",default:"-",description:"Enriquece entidades com dados de usuários do Qualiex (nome, email, username). Cache de 5 min."},{name:"options.entityName",type:"string",default:"-",description:"Nome da entidade para logs de debug."},{name:"options.userIdFields",type:"string[]",default:"-",description:"Lista de campos de ID de usuário para enriquecer."},{name:"options.userFieldsMapping",type:"QualiexUserFieldMapping[]",default:"-",description:"Mapeamento customizado de campos (prioridade sobre userIdFields)."},{name:"deriveNameField(idField, suffix?)",type:"string",default:"suffix: '_name'",description:"Deriva campo de nome a partir do ID (ex: target_user_id → target_user_name)."},{name:"deriveEmailField(idField, suffix?)",type:"string",default:"suffix: '_email'",description:"Deriva campo de email a partir do ID (ex: target_user_id → target_user_email)."},{name:"deriveUsernameField(idField, suffix?)",type:"string",default:"suffix: '_username'",description:"Deriva campo de username a partir do ID."},{name:"resolveFieldMappings(userIdFields?, userFieldsMapping?)",type:"QualiexUserFieldMapping[]",default:"-",description:"Resolve mapeamentos com prioridade: userFieldsMapping > userIdFields > default."}];function a({title:i,description:r,code:s}){return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold",children:i}),e.jsx("p",{className:"text-sm text-muted-foreground",children:r})]}),e.jsx("pre",{className:"rounded-lg border bg-muted/50 p-4 overflow-x-auto",children:e.jsx("code",{className:"text-sm font-mono",children:s})})]})}function x(){const i=[{id:"exemplos",label:"Exemplos"},{id:"baseservice-createservice",label:"BaseService (createService)"},{id:"emailservice",label:"EmailService"},{id:"errorservice",label:"ErrorService"},{id:"qualiexenrichmentservice",label:"QualiexEnrichmentService"},{id:"qualiexenrichmentservice",label:"QualiexEnrichmentService"},{id:"qualiexfieldhelpers",label:"QualiexFieldHelpers"},{id:"tipos",label:"Tipos"}];return e.jsx(o,{title:"Services",description:"Serviços utilitários da biblioteca forlogic-core para operações CRUD, envio de emails, tratamento de erros e gerenciamento de traduções. Todos os serviços são singletons prontos para uso.",usage:t,props:u,tocItems:i,notes:["createService implementa soft delete automaticamente (is_removed = true).","createService valida token de autenticação antes de cada operação.","EmailService usa templates cadastrados em common.email_templates via edge function send-email.","ErrorService possui rate limiting: máximo 3 toasts por minuto para evitar spam.","createService suporta joins automáticos via selectFields.","QualiexEnrichmentService usa cache de 5 minutos por companyId para evitar chamadas desnecessárias.","QualiexEnrichmentService é resiliente: retorna entidades originais em caso de erro.",'QualiexFieldHelpers remove sufixo "_id" automaticamente antes de adicionar o novo sufixo.'],children:e.jsxs("div",{id:"exemplos",className:"space-y-8 scroll-mt-4",children:[e.jsx("h2",{className:"text-2xl font-semibold tracking-tight border-b pb-2",children:"Exemplos"}),e.jsx("div",{id:"baseservice-createservice",className:"scroll-mt-4",children:e.jsx(a,{title:"BaseService (createService)",description:"Factory para criar serviços CRUD completos com Supabase. Suporta paginação, busca, ordenação, filtros, joins e soft delete.",code:d})}),e.jsx("div",{id:"emailservice",className:"scroll-mt-4",children:e.jsx(a,{title:"EmailService",description:"Envia emails usando templates cadastrados no banco de dados. Suporta variáveis de substituição e múltiplos destinatários.",code:n})}),e.jsx("div",{id:"errorservice",className:"scroll-mt-4",children:e.jsx(a,{title:"ErrorService",description:"Tratamento centralizado de erros com toasts inteligentes e rate limiting. Mantém histórico dos últimos 50 erros.",code:l})}),e.jsx("div",{id:"qualiexenrichmentservice",className:"scroll-mt-4",children:e.jsx(a,{title:"QualiexEnrichmentService",description:"Enriquece entidades com dados de usuários do Qualiex (nome, email, username). Usa cache inteligente de 5 minutos por companyId.",code:m})}),e.jsx("div",{id:"qualiexfieldhelpers",className:"scroll-mt-4",children:e.jsx(a,{title:"QualiexFieldHelpers",description:"Utilitários para derivar automaticamente nomes de campos de saída baseado nos campos de ID de usuário.",code:c})}),e.jsx("div",{id:"tipos",className:"scroll-mt-4",children:e.jsx("h2",{className:"text-2xl font-semibold tracking-tight border-b pb-2",children:"Tipos"})}),e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"QualiexUserFieldMapping"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Define o mapeamento entre um campo de ID de usuário e seus campos de saída correspondentes (nome, email, username)."}),e.jsx("pre",{className:"rounded-lg border bg-muted/50 p-4 overflow-x-auto",children:e.jsx("code",{className:"text-sm font-mono",children:`interface QualiexUserFieldMapping {
|
|
198
|
+
/** Nome do campo de ID de usuário na entidade (ex: "target_user_id") */
|
|
199
|
+
idField: string;
|
|
200
|
+
|
|
201
|
+
/** Nome do campo de saída para o nome (ex: "target_user_name")
|
|
202
|
+
* Default: idField + "_name" (remove "_id" se presente) */
|
|
203
|
+
nameField?: string;
|
|
204
|
+
|
|
205
|
+
/** Nome do campo de saída para o email (ex: "target_user_email")
|
|
206
|
+
* Default: idField + "_email" (remove "_id" se presente) */
|
|
207
|
+
emailField?: string;
|
|
208
|
+
|
|
209
|
+
/** Nome do campo de saída para o username (ex: "target_user_username")
|
|
210
|
+
* Default: idField + "_username" (remove "_id" se presente) */
|
|
211
|
+
usernameField?: string;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Exemplos de uso:
|
|
215
|
+
const mappings: QualiexUserFieldMapping[] = [
|
|
216
|
+
// Mapeamento simples (só nome)
|
|
217
|
+
{ idField: 'id_user', nameField: 'responsible_name' },
|
|
218
|
+
|
|
219
|
+
// Mapeamento completo
|
|
220
|
+
{
|
|
221
|
+
idField: 'target_user_id',
|
|
222
|
+
nameField: 'target_name',
|
|
223
|
+
emailField: 'target_email',
|
|
224
|
+
usernameField: 'target_username'
|
|
225
|
+
},
|
|
226
|
+
|
|
227
|
+
// Mapeamento parcial (nome e email)
|
|
228
|
+
{
|
|
229
|
+
idField: 'evaluator_user_id',
|
|
230
|
+
nameField: 'evaluator_name',
|
|
231
|
+
emailField: 'evaluator_email'
|
|
232
|
+
}
|
|
233
|
+
];`})})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"QualiexEnrichmentConfig"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Configuração global de sufixos padrão para derivação automática de campos. Usado internamente pelo QualiexFieldHelpers."}),e.jsx("pre",{className:"rounded-lg border bg-muted/50 p-4 overflow-x-auto",children:e.jsx("code",{className:"text-sm font-mono",children:`interface QualiexEnrichmentConfig {
|
|
234
|
+
/** Sufixo padrão para campos de nome (default: "_name") */
|
|
235
|
+
userNameFieldSuffix?: string;
|
|
236
|
+
|
|
237
|
+
/** Sufixo padrão para campos de email (default: "_email") */
|
|
238
|
+
userEmailFieldSuffix?: string;
|
|
239
|
+
|
|
240
|
+
/** Sufixo padrão para campos de username (default: "_username") */
|
|
241
|
+
userUsernameFieldSuffix?: string;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Exemplo de configuração customizada:
|
|
245
|
+
const config: QualiexEnrichmentConfig = {
|
|
246
|
+
userNameFieldSuffix: '_nome', // target_user_id → target_user_nome
|
|
247
|
+
userEmailFieldSuffix: '_email', // target_user_id → target_user_email
|
|
248
|
+
userUsernameFieldSuffix: '_login' // target_user_id → target_user_login
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
// Valores padrão:
|
|
252
|
+
// - userNameFieldSuffix: '_name'
|
|
253
|
+
// - userEmailFieldSuffix: '_email'
|
|
254
|
+
// - userUsernameFieldSuffix: '_username'`})})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-lg font-semibold",children:"QualiexUser"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Representa um usuário do sistema Qualiex. Retornado pelo hook useQualiexUsers e usado internamente pelo QualiexEnrichmentService."}),e.jsx("pre",{className:"rounded-lg border bg-muted/50 p-4 overflow-x-auto",children:e.jsx("code",{className:"text-sm font-mono",children:`interface QualiexUser {
|
|
255
|
+
/** ID único do usuário (formato UUID) */
|
|
256
|
+
id?: string;
|
|
257
|
+
|
|
258
|
+
/** ID alternativo do usuário (alguns endpoints retornam neste campo) */
|
|
259
|
+
userId?: string;
|
|
260
|
+
|
|
261
|
+
/** Nome de usuário (login) */
|
|
262
|
+
userName?: string;
|
|
263
|
+
|
|
264
|
+
/** Email do usuário */
|
|
265
|
+
userEmail?: string;
|
|
266
|
+
|
|
267
|
+
/** Nome de exibição (nome completo) */
|
|
268
|
+
displayName?: string;
|
|
269
|
+
|
|
270
|
+
/** ID do local/unidade do usuário */
|
|
271
|
+
placeId?: string | null;
|
|
272
|
+
|
|
273
|
+
/** Nome do local/unidade do usuário */
|
|
274
|
+
placeName?: string | null;
|
|
275
|
+
|
|
276
|
+
/** ID do cargo/função do usuário */
|
|
277
|
+
roleId?: string;
|
|
278
|
+
|
|
279
|
+
/** Nome do cargo/função do usuário */
|
|
280
|
+
roleName?: string;
|
|
281
|
+
|
|
282
|
+
/** ID da empresa do usuário */
|
|
283
|
+
companyId?: string;
|
|
284
|
+
|
|
285
|
+
/** Nome da empresa do usuário */
|
|
286
|
+
companyName?: string;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Exemplo de uso com useQualiexUsers:
|
|
290
|
+
import { useQualiexUsers } from 'forlogic-core';
|
|
291
|
+
|
|
292
|
+
function UserSelector() {
|
|
293
|
+
const { data: users, isLoading } = useQualiexUsers({ enabled: true });
|
|
294
|
+
|
|
295
|
+
// users é QualiexUser[]
|
|
296
|
+
return (
|
|
297
|
+
<select>
|
|
298
|
+
{users?.map(user => (
|
|
299
|
+
<option key={user.id || user.userId} value={user.id || user.userId}>
|
|
300
|
+
{user.displayName || user.userName} ({user.userEmail})
|
|
301
|
+
</option>
|
|
302
|
+
))}
|
|
303
|
+
</select>
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Nota: A API retorna apenas usuários ativos (filterStatus='active').
|
|
308
|
+
// O campo isActive foi removido pois a API não o fornece.`})})]})]})]})})}export{x as ServicesDoc};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{j as e,a,b as r,c as i,e as o,d}from"./index-DkiftrvI.js";function c(){const l=[{name:"sm",value:"shadow-sm",description:"Elevação sutil para cards e containers"},{name:"default",value:"shadow",description:"Elevação padrão para elementos interativos"},{name:"md",value:"shadow-md",description:"Elevação média para dropdowns e popovers"},{name:"lg",value:"shadow-lg",description:"Elevação alta para modais e diálogos"},{name:"xl",value:"shadow-xl",description:"Elevação máxima para overlays"},{name:"primary",value:"shadow-primary",description:"Sombra colorida para elementos primários"}];return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h1",{className:"text-4xl font-bold tracking-tight",children:"Sistema de Sombras e Elevação"}),e.jsx("p",{className:"text-lg text-muted-foreground",children:"Sombras criam profundidade e hierarquia, ajudando usuários a entender as relações espaciais entre elementos e seus estados interativos."})]}),e.jsxs(a,{children:[e.jsxs(r,{children:[e.jsx(i,{children:"Escala de Sombras"}),e.jsx(o,{children:"5 níveis de elevação mais sombras semânticas"})]}),e.jsx(d,{className:"space-y-8",children:l.map(s=>e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium capitalize",children:s.name}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s.description})]}),e.jsx("code",{className:"text-xs text-muted-foreground",children:s.value})]}),e.jsx("div",{className:`p-6 bg-card rounded-lg ${s.value}`,children:e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Card with ",s.name," shadow"]})})]},s.name))})]}),e.jsxs(a,{children:[e.jsxs(r,{children:[e.jsx(i,{children:"Estados Interativos"}),e.jsx(o,{children:"Mudanças de sombra no hover e foco"})]}),e.jsxs(d,{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium",children:"Efeito Hover"}),e.jsx("p",{className:"text-xs text-muted-foreground mb-3",children:"Eleva no hover para indicar interatividade"}),e.jsx("div",{className:"p-6 bg-card border rounded-lg shadow-sm hover:shadow-lg transition-shadow cursor-pointer",children:e.jsx("p",{className:"text-sm",children:"Passe o mouse sobre este card para ver a sombra aumentar"})}),e.jsx("code",{className:"text-xs text-muted-foreground block",children:"shadow-sm hover:shadow-lg transition-shadow"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium",children:"Anel de Foco"}),e.jsx("p",{className:"text-xs text-muted-foreground mb-3",children:"Indicador de foco claro para acessibilidade"}),e.jsx("button",{className:"px-4 py-2 bg-primary text-primary-foreground rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",children:"Clique para focar"}),e.jsx("code",{className:"text-xs text-muted-foreground block",children:"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"})]})]})]}),e.jsxs(a,{children:[e.jsx(r,{children:e.jsx(i,{children:"Uso por Tipo de Componente"})}),e.jsx(d,{className:"space-y-6",children:e.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"Cards & Containers"}),e.jsxs("ul",{className:"space-y-1 text-sm text-muted-foreground",children:[e.jsxs("li",{children:["• Padrão: ",e.jsx("code",{children:"shadow-sm"})]}),e.jsxs("li",{children:["• Hover: ",e.jsx("code",{children:"hover:shadow-md"})]}),e.jsxs("li",{children:["• Ativo: ",e.jsx("code",{children:"shadow"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"Dropdowns & Popovers"}),e.jsxs("ul",{className:"space-y-1 text-sm text-muted-foreground",children:[e.jsxs("li",{children:["• Padrão: ",e.jsx("code",{children:"shadow-md"})]}),e.jsxs("li",{children:["• Menus grandes: ",e.jsx("code",{children:"shadow-lg"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"Modais & Diálogos"}),e.jsxs("ul",{className:"space-y-1 text-sm text-muted-foreground",children:[e.jsxs("li",{children:["• Padrão: ",e.jsx("code",{children:"shadow-lg"})]}),e.jsxs("li",{children:["• Crítico: ",e.jsx("code",{children:"shadow-xl"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-semibold",children:"Botões & Ações"}),e.jsxs("ul",{className:"space-y-1 text-sm text-muted-foreground",children:[e.jsxs("li",{children:["• Primário: ",e.jsx("code",{children:"shadow-primary"})]}),e.jsxs("li",{children:["• Elevado: ",e.jsx("code",{children:"shadow-sm"})]}),e.jsxs("li",{children:["• Hover: ",e.jsx("code",{children:"hover:shadow-md"})]})]})]})]})})]}),e.jsxs(a,{children:[e.jsx(r,{children:e.jsx(i,{children:"Diretrizes de Sombra"})}),e.jsxs(d,{className:"prose prose-slate dark:prose-invert max-w-none",children:[e.jsx("h3",{children:"Princípios"}),e.jsxs("ul",{children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Hierarquia"}),": Maior elevação = maior importância na hierarquia visual"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Consistência"}),": Use sombras de forma consistente para tipos de componentes similares"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Sutileza"}),": Sombras devem realçar, não dominar o design"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Performance"}),": Evite desfoque excessivo de sombra para melhor performance de renderização"]})]}),e.jsx("h3",{children:"Acessibilidade"}),e.jsxs("ul",{children:[e.jsx("li",{children:"Não dependa apenas de sombras para indicar estados interativos"}),e.jsx("li",{children:"Sempre inclua anéis focus-visible para navegação por teclado"}),e.jsx("li",{children:"Garanta contraste suficiente entre elementos sombreados e fundo"}),e.jsx("li",{children:"Considere preferências de movimento reduzido ao animar sombras"})]}),e.jsx("h3",{children:"Melhores Práticas"}),e.jsxs("ul",{children:[e.jsxs("li",{children:["Use ",e.jsx("code",{children:"transition-shadow"})," para efeitos de hover suaves"]}),e.jsxs("li",{children:["Combine com ",e.jsx("code",{children:"hover:translate-y-1"})," para efeito de elevação sutil"]}),e.jsx("li",{children:"Use sombras coloridas com moderação (apenas ações primárias)"}),e.jsx("li",{children:"Teste sombras em modos claro e escuro"})]}),e.jsx("h4",{className:"font-semibold mb-3 mt-6",children:"Exemplos de Código"}),e.jsxs("div",{className:"space-y-4 not-prose",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium mb-2 text-green-600 dark:text-green-400",children:"✅ Correto"}),e.jsx("pre",{className:"bg-muted p-3 rounded-md text-xs overflow-x-auto",children:e.jsx("code",{children:`<Card className="shadow-sm hover:shadow-lg transition-shadow">
|
|
2
|
+
Card interativo
|
|
3
|
+
</Card>
|
|
4
|
+
|
|
5
|
+
<Button className="focus-visible:ring-2 focus-visible:ring-ring">
|
|
6
|
+
Botão acessível
|
|
7
|
+
</Button>`})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium mb-2 text-red-600 dark:text-red-400",children:"❌ Incorreto"}),e.jsx("pre",{className:"bg-muted p-3 rounded-md text-xs overflow-x-auto",children:e.jsx("code",{children:`<div className="shadow-2xl">
|
|
8
|
+
Elevação demais
|
|
9
|
+
</div>`})})]})]})]})]})]})}export{c as ShadowsDoc};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import{gf as oe,r as n,gO as ae,gP as xe,j as e,aY as F,aK as he,aM as fe,aN as je,u as Ne,Y as E,a as N,d as v,dw as ve,x as ne,aJ as de,ei as be,U as z,a4 as ie,ar as ye,B as I,b as P,c as T,e0 as M}from"./index-DkiftrvI.js";import{C as Se}from"./ComponentDocTemplate-CQbBhfvZ.js";import{F as R}from"./file-pen-line-CyUGKkEN.js";import{G as _e}from"./globe-CpMIWAcv.js";import"./ExampleCard-DuLrb3t-.js";function we(){const{alias:s}=oe(),[o,r]=n.useState(null),[l,t]=n.useState(!0);n.useEffect(()=>{if(!s){t(!1);return}let u=!1;return(async()=>{t(!0);try{const a=ae(),{data:h,error:f}=await a.schema("common").from("sign_configs").select("*").eq("alias",s).is("deleted_at",null).maybeSingle();u||(f&&console.error("[useSignConfig] Error fetching config:",f),r(h))}catch(a){console.error("[useSignConfig] Unexpected error:",a),u||r(null)}finally{u||t(!1)}})(),()=>{u=!0}},[s]);const i=n.useCallback(async(u,x)=>{if(!s)throw new Error("Alias not available");const a=ae(),{data:h,error:f}=await a.schema("common").from("sign_configs").upsert({alias:s,api_key:u,environment:x,updated_at:new Date().toISOString()},{onConflict:"alias"}).select().maybeSingle();if(f)throw f;return r(h),h},[s]);return{config:o,isLoading:l,saveConfig:i}}const Ce="https://ccjfvpnndclajkleyqkc.supabase.co",Ee="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImNjamZ2cG5uZGNsYWprbGV5cWtjIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTA5NTQ1OTksImV4cCI6MjA2NjUzMDU5OX0.j7ASp7OYaR5oXfnVmK77VGNH-5hDa9JpzbAYJBUpfa8";async function re(s,o,r){const l=xe.getSupabaseToken(),t={"Content-Type":"application/json",apikey:Ee};l&&(t.Authorization=`Bearer ${l}`);const i=await fetch(`${Ce}/functions/v1/${s}`,{method:"POST",headers:t,body:JSON.stringify({action:o,data:r})});if(!i.ok){const u=await i.json().catch(()=>({}));throw new Error(u.error||`Erro na requisição: ${i.status}`)}return i}const te={async createEnvelopeWithSigner(s){const o=s.provider==="d4sign"?"d4sign":"clicksign",r=s.provider==="d4sign"?"create_and_send":"create_envelope_with_signer";return(await re(o,r,{content_base64:s.contentBase64,filename:s.filename,signer_email:s.signerEmail,signer_name:s.signerName})).json()},async getSignedDocument(s){const o=s.provider==="d4sign"?"d4sign":"clicksign";return(await re(o,"get_signed_document",{envelope_id:s.envelopeId,document_id:s.documentId})).json()}},De="https://cdn-public-library.clicksign.com/embedded/embedded.min-2.1.0.js";let L=null;function ke(){return window.Clicksign?Promise.resolve():L||(L=new Promise((s,o)=>{const r=document.createElement("script");r.src=De,r.onload=()=>s(),r.onerror=()=>o(new Error("Falha ao carregar script do Clicksign")),document.head.appendChild(r)}),L)}const W="clicksign-container";function Ae({signerId:s,environment:o="sandbox",onSign:r,onError:l,onClose:t}){const i=n.useRef(null),[u,x]=n.useState(!0),[a,h]=n.useState(null);return n.useEffect(()=>{let f=!1;return i.current&&(i.current.unmount(),i.current=null),h(null),x(!0),ke().then(()=>{if(f)return;const m=new window.Clicksign(s);m.endpoint=o==="production"?"https://app.clicksign.com":"https://sandbox.clicksign.com",m.origin=window.origin,m.mount(W),m.on("loaded",function(){x(!1)}),m.on("signed",function(){r?.()}),m.on("resized",function(w){const b=w,y=document.getElementById(W);y&&b?.data?.height&&(y.style.height=b.data.height+"px")}),m.on("error",function(w){console.error("[SignWidget] Widget error",w),x(!1),l?.(w instanceof Error?w:new Error("Erro no widget de assinatura"))}),m.on("closed",function(){t?.()}),i.current=m}).catch(m=>{f||(console.error("[SignWidget] Failed to load Clicksign script",m),h("Falha ao carregar o script de assinatura."),x(!1),l?.(m))}),()=>{f=!0,i.current&&(i.current.unmount(),i.current=null)}},[s,o]),e.jsxs("div",{className:"relative h-full",children:[u&&e.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:e.jsxs("div",{className:"flex items-center gap-2 text-muted-foreground",children:[e.jsx(F,{className:"h-5 w-5 animate-spin"}),e.jsx("span",{className:"text-sm",children:"Carregando documento..."})]})}),a&&e.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:e.jsx("p",{className:"text-sm text-destructive",children:a})}),e.jsx("div",{id:W,style:{height:"600px"}})]})}const Ie="d4sign-container";function Pe({documentKey:s,signerEmail:o,signerName:r,keySigner:l,environment:t,onSign:i,onError:u}){const x=n.useRef(null),[a,h]=n.useState("loading"),[f,m]=n.useState(null),w=t==="production"?"https://secure.d4sign.com.br/embed/viewblob":"https://sandbox.d4sign.com.br/embed/viewblob",b=(()=>{const C=new URLSearchParams({email:o,display_name:r||"",disable_preview:"0"});return l&&C.set("key_signer",l),`${w}/${s}?${C.toString()}`})(),y=n.useCallback(C=>{if(C.data==="signed"){h("ready"),i?.();return}if(C.data==="wrong-data"){console.error("[D4SignWidget] Wrong data reported by signer"),h("error"),m("O signatário reportou dados incorretos."),u?.(new Error("O signatário reportou dados incorretos"));return}},[i,u]);n.useEffect(()=>(window.addEventListener("message",y,!1),()=>{window.removeEventListener("message",y,!1)}),[y]);const D=n.useCallback(()=>{a==="loading"&&h("ready")},[a]);return a==="error"?e.jsxs(he,{variant:"danger",className:"my-4",children:[e.jsx(fe,{children:"Erro ao carregar documento"}),e.jsx(je,{children:f||"Ocorreu um erro inesperado ao carregar o documento para assinatura. Tente novamente."})]}):e.jsxs("div",{className:"relative h-full",children:[a==="loading"&&e.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:e.jsxs("div",{className:"flex items-center gap-2 text-muted-foreground",children:[e.jsx(F,{className:"h-5 w-5 animate-spin"}),e.jsx("span",{className:"text-sm",children:"Carregando documento..."})]})}),e.jsx("iframe",{ref:x,id:Ie,src:b,width:"100%",style:{height:"600px",border:0},allow:"geolocation",onLoad:D})]})}function Te({file:s,onDocumentSigned:o,onError:r,showEventLog:l=!1}){const{user:t,alias:i}=oe(),{config:u,isLoading:x}=we(),{t:a}=Ne(),[h,f]=n.useState(null),[m,w]=n.useState(!1),[b,y]=n.useState(null),[D,C]=n.useState("sandbox"),[k,J]=n.useState("clicksign"),[S,K]=n.useState(null),[O,Y]=n.useState(null),[G,U]=n.useState(!1),[ce,X]=n.useState(0),[V,H]=n.useState(!1),[Z,le]=n.useState([]),Q=n.useRef(null),ee=n.useRef(null),d=n.useCallback(g=>{l&&le(c=>[...c,`[${new Date().toLocaleTimeString()}] ${g}`])},[l]),$=n.useCallback(async g=>{if(f(g),y(null),K(null),Y(null),d(`Arquivo selecionado: ${g.name}`),!(!i||!t)){w(!0);try{const c=u?.provider??"clicksign";J(c),d(`Provedor resolvido: ${c}`);const p=new FileReader,j=await new Promise((A,ge)=>{p.onload=()=>{const pe=p.result;A(pe)},p.onerror=ge,p.readAsDataURL(g)});d(`Criando envelope para assinatura via ${c}...`);const _=await te.createEnvelopeWithSigner({alias:i,contentBase64:j,filename:g.name,signerEmail:t.email||"",signerName:t.name||"",provider:c});d(`Envelope criado: ${_.envelope_id}`),K({envelope_id:_.envelope_id,document_id:_.document_id,signer_email:_.signer_email,key_signer:_.signer_id}),C(_.environment),J(_.provider||c),c==="d4sign"?(d("Documento enviado para D4Sign. Abrindo widget de assinatura..."),await new Promise(A=>setTimeout(A,2e3)),y(_.document_id),E.success(a("sign_doc_sent","Documento enviado! Assine abaixo."))):_.signer_id?(d(`Signer ID obtido: ${_.signer_id}. Aguardando processamento (3s)...`),await new Promise(A=>setTimeout(A,3e3)),y(_.signer_id),E.success(a("sign_doc_sent","Documento enviado! Assine abaixo."))):(d("AVISO: Nenhum signer ID disponível."),E.error(a("sign_access_error","Não foi possível obter o acesso para assinatura. Tente novamente.")),r?.(new Error("Signer ID não disponível")))}catch(c){const p=c instanceof Error?c:new Error(a("sign_process_error","Erro ao processar documento")),j=p.message||"";j.includes("MONTHLY_LIMIT_REACHED")?(d("Limite mensal de assinaturas atingido"),E.error(a("sign_monthly_limit","Limite mensal de assinaturas atingido. Entre em contato com o administrador para ampliar seu plano."))):(d(`Erro: ${j}`),E.error(j)),r?.(p)}finally{w(!1)}}},[i,t,d,r,u]);n.useEffect(()=>{s&&i&&t&&!x&&s!==ee.current&&(ee.current=s,$(s))},[s,i,t,x,$]);const me=g=>{const c=g.target.files?.[0];c&&c.type==="application/pdf"?$(c):E.error(a("sign_select_pdf","Selecione um arquivo PDF"))},q=n.useCallback(async()=>{if(!S||!i)return;U(!0),X(0),H(!1),d("Buscando documento assinado...");const g=6,c=1e4;for(let p=1;p<=g;p++){X(p),d(`Tentativa ${p}/${g}...`);try{const j=await te.getSignedDocument({alias:i,envelopeId:S.envelope_id,documentId:S.document_id,provider:k});if(j.download_url){d("Documento assinado disponível para download"),Y(j.download_url),U(!1);return}}catch(j){d(`Erro na tentativa ${p}: ${j instanceof Error?j.message:"Erro desconhecido"}`)}p<g&&(d("Aguardando 10 segundos para próxima tentativa..."),await new Promise(j=>setTimeout(j,c)))}d("Não foi possível obter o documento assinado após 6 tentativas."),U(!1),H(!0)},[S,i,d,k]),se=n.useCallback(async()=>{d("Documento assinado com sucesso!"),E.success(a("sign_signed_success","Documento assinado com sucesso!")),y(null),S&&i&&(o?.({success:!0,provider:k,envelope_id:S.envelope_id,document_id:S.document_id,signer_id:b||"",environment:D}),await q())},[d,o,S,b,i,D,k,q]);if(!i)return e.jsx(N,{className:"border-amber-200 bg-amber-50",children:e.jsx(v,{className:"flex items-start gap-3 py-6",children:e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-amber-800",children:a("sign_auth_required","Autenticação necessária")}),e.jsx("p",{className:"text-sm text-amber-700 mt-1",children:a("sign_login_required","Faça login para utilizar a assinatura digital.")})]})})});const ue=k==="d4sign"?"D4Sign":"Clicksign",B=()=>l&&Z.length>0?e.jsx("div",{className:"bg-muted p-3 rounded-md text-xs font-mono space-y-1 max-h-40 overflow-auto",children:Z.map((g,c)=>e.jsx("div",{children:g},c))}):null;return S&&!b&&(O||G||V)?e.jsxs("div",{className:"space-y-4",children:[e.jsx(N,{className:"border-green-200 bg-green-50",children:e.jsxs(v,{className:"flex flex-col items-center gap-4 py-8",children:[e.jsx(ve,{className:"h-12 w-12 text-green-600"}),e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg font-semibold text-green-800",children:a("sign_signed_success","Documento assinado com sucesso!")}),e.jsx("p",{className:"text-sm text-green-700 mt-1",children:h?.name})]}),G?e.jsxs("div",{className:"flex flex-col items-center gap-2 text-sm text-muted-foreground",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(F,{className:"h-4 w-4 animate-spin"}),a("sign_preparing_doc","Preparando documento assinado...")," (",a("sign_attempt","tentativa")," ",ce,"/6)"]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:a("sign_waiting_provider",`Aguardando processamento pelo ${ue}...`)})]}):O?e.jsx(ne,{asChild:!0,variant:"default",className:"gap-2",children:e.jsxs("a",{href:O,target:"_blank",rel:"noopener noreferrer",children:[e.jsx(de,{className:"h-4 w-4"}),a("sign_download_signed","Baixar documento assinado")]})}):V?e.jsxs("div",{className:"text-center space-y-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:a("sign_fetch_failed","Não foi possível obter o documento assinado após 1 minuto.")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:a("sign_email_fallback","O documento será enviado para o seu e-mail assim que estiver disponível.")})]}),e.jsxs(ne,{variant:"secondary",className:"gap-2",onClick:q,children:[e.jsx(be,{className:"h-4 w-4"}),a("sign_try_again","Tentar novamente")]})]}):null]})}),e.jsx(B,{})]}):b?e.jsxs("div",{className:"space-y-4",children:[k==="d4sign"?e.jsx(Pe,{documentKey:b,signerEmail:S?.signer_email||t?.email||"",signerName:t?.name,keySigner:S?.key_signer,environment:D,onSign:se,onError:r}):e.jsx(Ae,{signerId:b,environment:D,onSign:se,onError:r}),e.jsx(B,{})]}):s&&(m||x)?e.jsx(N,{children:e.jsxs(v,{className:"flex items-center justify-center gap-3 py-10",children:[e.jsx(F,{className:"h-6 w-6 animate-spin text-primary"}),e.jsx("p",{className:"font-medium",children:a("sign_sending_doc","Enviando documento para assinatura...")})]})}):e.jsxs("div",{className:"space-y-4",children:[e.jsx("input",{ref:Q,type:"file",accept:"application/pdf",className:"hidden",onChange:me}),m?e.jsx(N,{children:e.jsxs(v,{className:"flex items-center justify-center gap-3 py-10",children:[e.jsx(F,{className:"h-6 w-6 animate-spin text-primary"}),e.jsx("p",{className:"font-medium",children:a("sign_sending_doc","Enviando documento para assinatura...")})]})}):e.jsx(N,{className:"border-dashed border-2 cursor-pointer hover:bg-muted/50 transition-colors",onClick:()=>Q.current?.click(),children:e.jsxs(v,{className:"flex flex-col items-center justify-center py-10 gap-3",children:[e.jsx(z,{className:"h-8 w-8 text-muted-foreground"}),e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"font-medium",children:a("sign_select_pdf","Selecione um arquivo PDF")}),e.jsx("p",{className:"text-sm text-muted-foreground",children:a("sign_click_to_select","Clique para escolher o documento para assinatura")})]})]})}),e.jsx(B,{})]})}function Fe(){return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3",children:[e.jsx(N,{className:"border-primary bg-primary/5",children:e.jsxs(v,{className:"flex items-center gap-3 p-4",children:[e.jsx(R,{className:"h-5 w-5 text-primary shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium text-sm",children:"Clicksign"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"API v3 + Widget Embedded 2.1.0"})]}),e.jsx(I,{variant:"default",children:"Ativo"})]})}),e.jsx(N,{className:"border-primary bg-primary/5",children:e.jsxs(v,{className:"flex items-center gap-3 p-4",children:[e.jsx(R,{className:"h-5 w-5 text-primary shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium text-sm",children:"D4Sign"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"API v1 + iframe Embedded"})]}),e.jsx(I,{variant:"default",children:"Ativo"})]})})]}),e.jsxs(N,{children:[e.jsx(P,{className:"pb-2",children:e.jsxs(T,{className:"text-sm flex items-center gap-2",children:[e.jsx(R,{className:"h-4 w-4 text-primary"}),"Componente Único — 3 Fases"]})}),e.jsxs(v,{className:"text-xs text-muted-foreground space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(I,{variant:"outline",className:"text-xs",children:"1"}),e.jsx(z,{className:"h-3.5 w-3.5"}),e.jsxs("span",{children:[e.jsx("strong",{children:"Upload:"})," Seleciona o PDF (ou recebe via prop ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"file"}),")"]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(I,{variant:"outline",className:"text-xs",children:"2"}),e.jsx(R,{className:"h-3.5 w-3.5"}),e.jsxs("span",{children:[e.jsx("strong",{children:"Assinatura:"})," Widget do provedor configurado (Clicksign embedded ou D4Sign iframe)"]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(I,{variant:"outline",className:"text-xs",children:"3"}),e.jsx(de,{className:"h-3.5 w-3.5"}),e.jsxs("span",{children:[e.jsx("strong",{children:"Assinado:"})," Polling automático (6 tentativas, 10s cada) + botão de retry manual"]})]})]})]}),e.jsxs(N,{children:[e.jsx(P,{className:"pb-2",children:e.jsxs(T,{className:"text-sm flex items-center gap-2",children:[e.jsx(_e,{className:"h-4 w-4 text-primary"}),"Comparação dos Provedores"]})}),e.jsx(v,{className:"text-xs text-muted-foreground",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-left",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b",children:[e.jsx("th",{className:"py-1.5 pr-4 font-medium text-foreground",children:"Característica"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium text-foreground",children:"Clicksign"}),e.jsx("th",{className:"py-1.5 font-medium text-foreground",children:"D4Sign"})]})}),e.jsxs("tbody",{className:"space-y-1",children:[e.jsxs("tr",{className:"border-b border-dashed",children:[e.jsx("td",{className:"py-1.5 pr-4",children:"API"}),e.jsx("td",{className:"py-1.5 pr-4",children:"v3 (JSON:API)"}),e.jsx("td",{className:"py-1.5",children:"v1 (REST)"})]}),e.jsxs("tr",{className:"border-b border-dashed",children:[e.jsx("td",{className:"py-1.5 pr-4",children:"Auth"}),e.jsxs("td",{className:"py-1.5 pr-4",children:["Header ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"Authorization: apiKey"})]}),e.jsxs("td",{className:"py-1.5",children:["Query params ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"tokenAPI + cryptKey"})]})]}),e.jsxs("tr",{className:"border-b border-dashed",children:[e.jsx("td",{className:"py-1.5 pr-4",children:"Widget"}),e.jsx("td",{className:"py-1.5 pr-4",children:"JavaScript embedded (CDN)"}),e.jsx("td",{className:"py-1.5",children:"iframe embedded"})]}),e.jsxs("tr",{className:"border-b border-dashed",children:[e.jsx("td",{className:"py-1.5 pr-4",children:"Callback"}),e.jsx("td",{className:"py-1.5 pr-4",children:e.jsx("code",{className:"bg-muted px-1 rounded",children:"widget.on('signed')"})}),e.jsx("td",{className:"py-1.5",children:e.jsx("code",{className:"bg-muted px-1 rounded",children:"window.postMessage('signed')"})})]}),e.jsxs("tr",{className:"border-b border-dashed",children:[e.jsx("td",{className:"py-1.5 pr-4",children:"Config extra"}),e.jsx("td",{className:"py-1.5 pr-4",children:"—"}),e.jsxs("td",{className:"py-1.5",children:[e.jsx("code",{className:"bg-muted px-1 rounded",children:"crypt_key"}),", ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"uuid_safe"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-1.5 pr-4",children:"Sandbox"}),e.jsx("td",{className:"py-1.5 pr-4",children:"Secret automático"}),e.jsx("td",{className:"py-1.5",children:"Config por unidade (não há sandbox automático)"})]})]})]})})})]}),e.jsxs(N,{children:[e.jsx(P,{className:"pb-2",children:e.jsxs(T,{className:"text-sm flex items-center gap-2",children:[e.jsx(M,{className:"h-4 w-4 text-primary"}),"Clicksign — Widget Embedded + Edge Function"]})}),e.jsxs(v,{className:"text-xs text-muted-foreground space-y-2",children:[e.jsx("p",{className:"font-medium text-foreground",children:"Edge Function (5 passos):"}),e.jsxs("ol",{className:"list-decimal list-inside ml-2 space-y-1",children:[e.jsxs("li",{children:["Cria envelope (",e.jsx("code",{className:"bg-muted px-1 rounded",children:"POST /envelopes"}),")"]}),e.jsxs("li",{children:["Upload do documento (",e.jsx("code",{className:"bg-muted px-1 rounded",children:"POST /envelopes/:id/documents"}),")"]}),e.jsx("li",{children:"Adiciona signatário — apenas nome e e-mail"}),e.jsxs("li",{children:["Cria 2 requirements: ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"agree/sign"})," + ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"provide_evidence/email"})]}),e.jsxs("li",{children:["Ativa envelope via ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"PATCH"})," com ",e.jsx("code",{className:"bg-muted px-1 rounded",children:'status: "running"'})]})]}),e.jsx("p",{className:"font-medium text-foreground mt-3",children:"Frontend:"}),e.jsxs("ul",{className:"list-disc list-inside ml-2 space-y-1",children:[e.jsxs("li",{children:["Aguarda ",e.jsx("strong",{children:"3 segundos"})," para processamento"]}),e.jsxs("li",{children:["Inicializa widget: ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"new window.Clicksign(signerId)"})]}),e.jsxs("li",{children:["Script carregado ",e.jsx("strong",{children:"automaticamente"})," pela lib (lazy load sob demanda)"]})]})]})]}),e.jsxs(N,{children:[e.jsx(P,{className:"pb-2",children:e.jsxs(T,{className:"text-sm flex items-center gap-2",children:[e.jsx(M,{className:"h-4 w-4 text-primary"}),"D4Sign — iframe Embedded + Edge Function"]})}),e.jsxs(v,{className:"text-xs text-muted-foreground space-y-2",children:[e.jsx("p",{className:"font-medium text-foreground",children:"Edge Function (3 passos):"}),e.jsxs("ol",{className:"list-decimal list-inside ml-2 space-y-1",children:[e.jsxs("li",{children:["Upload binary (",e.jsx("code",{className:"bg-muted px-1 rounded",children:"POST /documents/:safe/uploadbinary"}),")"]}),e.jsxs("li",{children:["Registra signatário (",e.jsx("code",{className:"bg-muted px-1 rounded",children:"POST /documents/:uuid/createlist"}),") com ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"skipemail=1"})]}),e.jsxs("li",{children:["Envia para assinatura (",e.jsx("code",{className:"bg-muted px-1 rounded",children:"POST /documents/:uuid/sendtosigner"}),") com ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"skip_email=1"})]})]}),e.jsx("p",{className:"font-medium text-foreground mt-3",children:"Frontend:"}),e.jsxs("ul",{className:"list-disc list-inside ml-2 space-y-1",children:[e.jsxs("li",{children:["iframe: ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"secure.d4sign.com.br/embed/viewblob/{uuid}?email=..."})]}),e.jsxs("li",{children:["Listener: ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"window.addEventListener('message')"})]}),e.jsxs("li",{children:["Eventos: ",e.jsx("code",{className:"bg-muted px-1 rounded",children:'"signed"'})," (sucesso) ou ",e.jsx("code",{className:"bg-muted px-1 rounded",children:'"wrong-data"'})," (erro)"]})]})]})]}),e.jsxs(N,{children:[e.jsx(P,{className:"pb-2",children:e.jsxs(T,{className:"text-sm flex items-center gap-2",children:[e.jsx(M,{className:"h-4 w-4 text-primary"}),"Resolução de Ambiente e Provedor"]})}),e.jsxs(v,{className:"text-xs text-muted-foreground space-y-2",children:[e.jsxs("p",{children:["O frontend envia apenas o ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"alias"})," da unidade."]}),e.jsx("p",{children:"A Edge Function resolve automaticamente qual provedor e chave usar:"}),e.jsxs("ul",{className:"list-disc list-inside ml-2 space-y-1",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Tabela:"})," ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"sign_configs"})," (coluna ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"provider"}),")"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Clicksign:"})," produção via tabela ou sandbox via secret ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"CLICKSIGN_SANDBOX_API_KEY"})]}),e.jsxs("li",{children:[e.jsx("strong",{children:"D4Sign:"})," configuração obrigatória na tabela (não há sandbox automático)"]})]})]})]})]})}function Re(){const[s,o]=n.useState(null),[r,l]=n.useState(null);return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-start gap-2 p-3 rounded-md bg-amber-50 border border-amber-200",children:[e.jsx(ie,{className:"h-4 w-4 text-amber-600 mt-0.5 shrink-0"}),e.jsxs("div",{className:"text-sm text-amber-800",children:[e.jsx("p",{className:"font-medium",children:"Ambiente de Teste"}),e.jsxs("p",{className:"mt-1",children:[e.jsx("strong",{children:"Clicksign:"})," Unidades sem configuração de produção usam sandbox automaticamente.",e.jsx("br",{}),e.jsx("strong",{children:"D4Sign:"})," Requer configuração na unidade (não há sandbox automático).",e.jsx("br",{}),"Para configurar, acesse ",e.jsx("strong",{children:"/a/cs"})," (aba Assinatura digital no Admin)."]})]})]}),e.jsx(Te,{showEventLog:!0,onDocumentSigned:t=>{o(t),l(null)},onError:t=>{l(t.message),o(null)}}),s&&e.jsxs("div",{className:"flex items-start gap-2 p-3 rounded-md bg-emerald-50 border border-emerald-200",children:[e.jsx(ye,{className:"h-4 w-4 text-emerald-600 mt-0.5 shrink-0"}),e.jsxs("div",{className:"text-sm text-emerald-800",children:[e.jsx("p",{className:"font-medium",children:"Documento assinado com sucesso!"}),e.jsx("pre",{className:"mt-2 text-xs font-mono bg-emerald-100 p-2 rounded",children:JSON.stringify(s,null,2)})]})]}),r&&e.jsxs("div",{className:"flex items-start gap-2 p-3 rounded-md bg-destructive/10 border border-destructive/20",children:[e.jsx(ie,{className:"h-4 w-4 text-destructive mt-0.5 shrink-0"}),e.jsxs("div",{className:"text-sm text-destructive",children:[e.jsx("p",{className:"font-medium",children:"Erro"}),e.jsx("p",{className:"mt-1",children:r})]})]})]})}function Be(){return e.jsx(Se,{title:"Assinatura Digital (Sign)",description:"Componente único multi-provider de assinatura digital com fluxo em 3 fases: Upload → Assinatura → Download. Suporta Clicksign (widget JavaScript embedded v2.1.0, API v3) e D4Sign (iframe embedded, API v1). O provedor é resolvido automaticamente pela configuração da unidade na tabela sign_configs.",component:e.jsx(Fe,{}),installation:`// Nenhuma configuração manual necessária!
|
|
2
|
+
// O script do Clicksign é carregado automaticamente pela lib (lazy load)
|
|
3
|
+
// D4Sign usa iframe — também não precisa de script externo
|
|
4
|
+
|
|
5
|
+
// Importação do componente principal
|
|
6
|
+
import { DocumentSigner } from 'forlogic-core';
|
|
7
|
+
|
|
8
|
+
// Importação de tipos
|
|
9
|
+
import type {
|
|
10
|
+
SignEnvelopeResult,
|
|
11
|
+
SignedDocumentResult,
|
|
12
|
+
DocumentSignerProps,
|
|
13
|
+
SignProvider, // 'clicksign' | 'd4sign'
|
|
14
|
+
} from 'forlogic-core';`,usage:`// Uso básico — provedor resolvido automaticamente pela config da unidade
|
|
15
|
+
<DocumentSigner
|
|
16
|
+
showEventLog
|
|
17
|
+
onDocumentSigned={(data) => {
|
|
18
|
+
// data.provider → 'clicksign' ou 'd4sign'
|
|
19
|
+
// data.envelope_id, data.document_id, data.signer_id, data.environment
|
|
20
|
+
console.log('Assinado:', data);
|
|
21
|
+
}}
|
|
22
|
+
onError={(error) => {
|
|
23
|
+
console.error('Erro:', error.message);
|
|
24
|
+
}}
|
|
25
|
+
/>
|
|
26
|
+
|
|
27
|
+
// Passando PDF programaticamente (sem upload manual)
|
|
28
|
+
<DocumentSigner
|
|
29
|
+
file={meuArquivoPdf}
|
|
30
|
+
onDocumentSigned={(data) => console.log('Assinado:', data)}
|
|
31
|
+
/>`,examples:[{title:"Fluxo Completo (Multi-Provider)",description:"Selecione um PDF → assine no widget do provedor configurado → baixe o documento assinado.",preview:e.jsx(Re,{}),code:`import { DocumentSigner } from 'forlogic-core';
|
|
32
|
+
|
|
33
|
+
function AssinaturaPage() {
|
|
34
|
+
return (
|
|
35
|
+
<DocumentSigner
|
|
36
|
+
showEventLog
|
|
37
|
+
onDocumentSigned={(data) => {
|
|
38
|
+
// data.provider será 'clicksign' ou 'd4sign'
|
|
39
|
+
console.log('Documento assinado:', data);
|
|
40
|
+
}}
|
|
41
|
+
onError={(error) => {
|
|
42
|
+
console.error('Erro:', error.message);
|
|
43
|
+
}}
|
|
44
|
+
/>
|
|
45
|
+
);
|
|
46
|
+
}`},{title:"Com PDF via prop",description:"Informe o arquivo PDF diretamente, sem upload manual pelo usuário.",preview:e.jsx(N,{children:e.jsx(v,{className:"pt-4",children:e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(z,{className:"h-4 w-4 text-primary"}),e.jsx("span",{className:"font-medium",children:"Prop file"})]}),e.jsxs("ul",{className:"list-disc list-inside text-muted-foreground space-y-1 text-xs",children:[e.jsxs("li",{children:["Aceita um ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"File"})," diretamente"]}),e.jsx("li",{children:"Inicia o processamento automaticamente"}),e.jsx("li",{children:"Pula a fase de upload manual"}),e.jsx("li",{children:"Ideal para integração com formulários existentes"}),e.jsx("li",{children:"Funciona com ambos os provedores"})]})]})})}),code:`import { DocumentSigner } from 'forlogic-core';
|
|
47
|
+
|
|
48
|
+
function MinhaPage() {
|
|
49
|
+
const [file, setFile] = useState<File | null>(null);
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<>
|
|
53
|
+
<input
|
|
54
|
+
type="file"
|
|
55
|
+
accept=".pdf"
|
|
56
|
+
onChange={(e) => setFile(e.target.files?.[0] || null)}
|
|
57
|
+
/>
|
|
58
|
+
{file && (
|
|
59
|
+
<DocumentSigner
|
|
60
|
+
file={file}
|
|
61
|
+
onDocumentSigned={(data) => console.log('Assinado:', data)}
|
|
62
|
+
/>
|
|
63
|
+
)}
|
|
64
|
+
</>
|
|
65
|
+
);
|
|
66
|
+
}`}],props:[{name:"file",type:"File",description:"PDF passado programaticamente (pula upload manual)"},{name:"onDocumentSigned",type:"(data: SignEnvelopeResult) => void",description:"Callback quando o documento é assinado. Retorna provider, envelope_id, document_id, signer_id, environment."},{name:"onError",type:"(error: Error) => void",description:"Callback em caso de erro"},{name:"showEventLog",type:"boolean",default:"false",description:"Exibe log de eventos no componente"}],notes:["Multi-provider: suporta Clicksign e D4Sign. O provedor é resolvido automaticamente pela configuração da unidade na tabela sign_configs.",'Clicksign: Widget embedded v2.1.0 com script carregado automaticamente pela lib (lazy load sob demanda). Usa API v3 com header "Authorization: apiKey" (sem Bearer). Não é necessário adicionar nenhum script no index.html.',"D4Sign: iframe embedded apontando para secure.d4sign.com.br/embed/viewblob/{uuid}. Usa API v1 com tokenAPI + cryptKey como query params.","D4Sign NÃO possui sandbox automático via secrets. É necessário configurar a unidade diretamente na tabela sign_configs (via /a/cs).","Clicksign possui fallback automático para sandbox via secret CLICKSIGN_SANDBOX_API_KEY.","Tabela unificada sign_configs com coluna provider (clicksign | d4sign). Campos extras do D4Sign: crypt_key, uuid_safe.","Após assinatura: polling automático busca documento assinado a cada 10s, até 6 tentativas (~1 min).",'Se polling falhar, botão "Tentar novamente" permite busca manual ilimitada.',"Configuração de produção: Admin → /a/cs (aba Assinatura digital)."]})}export{Be as SignDoc};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import{r,j as e,h as a,eC as v,eD as C,eE as j,eF as f,eG as k,eH as s,x as o,a as l,b as c,c as m,d as p}from"./index-DkiftrvI.js";import{C as L}from"./ComponentDocTemplate-CQbBhfvZ.js";import{L as x}from"./loading-state-Cb5_t5uE.js";import"./ExampleCard-DuLrb3t-.js";function T(){const[n,g]=r.useState(!1),[i,u]=r.useState(!1),[d,h]=r.useState(!1),t=S=>{S(!0),setTimeout(()=>S(!1),2e3)};return e.jsx(L,{title:"Loading",description:"Componentes para estados de carregamento: Skeleton (placeholders), Spinner (indicador de loading), e LoadingState (gerenciamento declarativo).",component:e.jsxs("div",{className:"flex items-center space-x-4",children:[e.jsx(a,{className:"h-12 w-12 rounded-full"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(a,{className:"h-4 w-[250px]"}),e.jsx(a,{className:"h-4 w-[200px]"})]})]}),usage:`import { Skeleton, Spinner, LoadingState } from "forlogic-core"
|
|
2
|
+
|
|
3
|
+
// Skeleton básico
|
|
4
|
+
<Skeleton className="h-4 w-[200px]" />
|
|
5
|
+
|
|
6
|
+
// Spinner
|
|
7
|
+
<Spinner size="md" />
|
|
8
|
+
|
|
9
|
+
// LoadingState declarativo
|
|
10
|
+
<LoadingState isLoading={isLoading} type="spinner">
|
|
11
|
+
<div>Conteúdo carregado</div>
|
|
12
|
+
</LoadingState>`,examples:[{title:"Skeleton de Card",preview:e.jsxs("div",{className:"flex flex-col space-y-3 max-w-md",children:[e.jsx(a,{className:"h-[125px] w-full rounded-xl"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(a,{className:"h-4 w-full"}),e.jsx(a,{className:"h-4 w-4/5"})]})]}),code:`<div className="flex flex-col space-y-3">
|
|
13
|
+
<Skeleton className="h-[125px] w-full rounded-xl" />
|
|
14
|
+
<div className="space-y-2">
|
|
15
|
+
<Skeleton className="h-4 w-full" />
|
|
16
|
+
<Skeleton className="h-4 w-4/5" />
|
|
17
|
+
</div>
|
|
18
|
+
</div>`},{title:"Table Skeleton",preview:e.jsx(v,{rows:3,columns:4}),code:"<TableSkeleton rows={3} columns={4} />"},{title:"Card Skeleton",preview:e.jsx(C,{count:2}),code:"<CardSkeleton count={2} />"},{title:"Form Skeleton",preview:e.jsx(j,{fields:3}),code:"<FormSkeleton fields={3} />"},{title:"Header Skeleton",preview:e.jsx(f,{}),code:"<HeaderSkeleton />"},{title:"Sidebar Skeleton",preview:e.jsx("div",{className:"h-48 rounded-lg overflow-hidden border",children:e.jsx(k,{})}),code:"<SidebarSkeleton />"},{title:"Spinner - Tamanhos",preview:e.jsxs("div",{className:"flex items-center gap-6",children:[e.jsxs("div",{className:"flex flex-col items-center gap-2",children:[e.jsx(s,{size:"sm"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"sm"})]}),e.jsxs("div",{className:"flex flex-col items-center gap-2",children:[e.jsx(s,{size:"md"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"md"})]}),e.jsxs("div",{className:"flex flex-col items-center gap-2",children:[e.jsx(s,{size:"lg"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"lg"})]})]}),code:`import { Spinner } from "forlogic-core"
|
|
19
|
+
|
|
20
|
+
<Spinner size="sm" />
|
|
21
|
+
<Spinner size="md" />
|
|
22
|
+
<Spinner size="lg" />`},{title:"Spinner - Em Botão",preview:e.jsxs("div",{className:"flex gap-4",children:[e.jsxs(o,{disabled:!0,children:[e.jsx(s,{size:"sm",className:"mr-2"}),"Salvando..."]}),e.jsxs(o,{variant:"secondary",disabled:!0,children:[e.jsx(s,{size:"sm",className:"mr-2"}),"Carregando..."]})]}),code:`<Button disabled>
|
|
23
|
+
<Spinner size="sm" className="mr-2" />
|
|
24
|
+
Salvando...
|
|
25
|
+
</Button>`},{title:"LoadingState - Tipo Spinner",preview:e.jsxs("div",{className:"space-y-4",children:[e.jsx(o,{onClick:()=>t(g),disabled:n,children:n?"Carregando...":"Simular Loading"}),e.jsx(x,{isLoading:n,type:"spinner",children:e.jsxs(l,{children:[e.jsx(c,{children:e.jsx(m,{children:"Conteúdo Carregado"})}),e.jsx(p,{children:"Este conteúdo aparece quando o loading termina."})]})})]}),code:`const [isLoading, setIsLoading] = useState(false);
|
|
26
|
+
|
|
27
|
+
<LoadingState isLoading={isLoading} type="spinner">
|
|
28
|
+
<Card>
|
|
29
|
+
<CardHeader>
|
|
30
|
+
<CardTitle>Conteúdo Carregado</CardTitle>
|
|
31
|
+
</CardHeader>
|
|
32
|
+
<CardContent>
|
|
33
|
+
Este conteúdo aparece quando o loading termina.
|
|
34
|
+
</CardContent>
|
|
35
|
+
</Card>
|
|
36
|
+
</LoadingState>`},{title:"LoadingState - Tipo Overlay",preview:e.jsxs("div",{className:"space-y-4",children:[e.jsx(o,{onClick:()=>t(u),disabled:i,children:i?"Salvando...":"Simular Overlay"}),e.jsx(x,{isLoading:i,type:"overlay",children:e.jsxs(l,{children:[e.jsx(c,{children:e.jsx(m,{children:"Formulário"})}),e.jsxs(p,{className:"space-y-2",children:[e.jsx("p",{children:"O conteúdo fica visível mas com overlay."}),e.jsx("p",{children:"Útil para salvar sem perder contexto visual."})]})]})})]}),code:`<LoadingState isLoading={isSaving} type="overlay">
|
|
37
|
+
<Card>
|
|
38
|
+
<CardHeader>
|
|
39
|
+
<CardTitle>Formulário</CardTitle>
|
|
40
|
+
</CardHeader>
|
|
41
|
+
<CardContent>
|
|
42
|
+
O conteúdo fica visível mas com overlay.
|
|
43
|
+
</CardContent>
|
|
44
|
+
</Card>
|
|
45
|
+
</LoadingState>`},{title:"LoadingState - Tipo Skeleton",preview:e.jsxs("div",{className:"space-y-4",children:[e.jsx(o,{onClick:()=>t(h),disabled:d,children:d?"Carregando...":"Simular Skeleton"}),e.jsx(x,{isLoading:d,type:"skeleton",className:"h-24 w-full",children:e.jsxs(l,{children:[e.jsx(c,{children:e.jsx(m,{children:"Dados Carregados"})}),e.jsx(p,{children:"Este card substitui o skeleton quando carrega."})]})})]}),code:`<LoadingState isLoading={isLoading} type="skeleton" className="h-24 w-full">
|
|
46
|
+
<Card>
|
|
47
|
+
<CardHeader>
|
|
48
|
+
<CardTitle>Dados Carregados</CardTitle>
|
|
49
|
+
</CardHeader>
|
|
50
|
+
<CardContent>
|
|
51
|
+
Este card substitui o skeleton quando carrega.
|
|
52
|
+
</CardContent>
|
|
53
|
+
</Card>
|
|
54
|
+
</LoadingState>`}],props:[{name:"className",type:"string",default:"-",description:"Classes CSS para customizar dimensões e formato."},{name:"rows",type:"number",default:"5",description:"Número de linhas (TableSkeleton)."},{name:"columns",type:"number",default:"4",description:"Número de colunas (TableSkeleton)."},{name:"count",type:"number",default:"3",description:"Número de cards (CardSkeleton)."},{name:"fields",type:"number",default:"4",description:"Número de campos (FormSkeleton)."},{name:"size",type:'"sm" | "md" | "lg"',default:'"md"',description:"Tamanho do Spinner."},{name:"isLoading",type:"boolean",default:"-",description:"Estado de loading (LoadingState)."},{name:"type",type:'"spinner" | "skeleton" | "overlay"',default:'"spinner"',description:"Tipo de loading state."}],notes:["**Skeleton**: Placeholder animado que imita o formato do conteúdo. Use para carregamentos iniciais.","**Spinner**: Indicador circular de loading. Use em botões ou áreas pequenas.","**LoadingState**: Componente declarativo que gerencia exibição de loading vs conteúdo.",'**type="spinner"**: Esconde children e mostra apenas o spinner centralizado.','**type="overlay"**: Mantém children visíveis com um spinner sobreposto. Ideal para salvar.','**type="skeleton"**: Mostra um placeholder animado no lugar dos children.'],accessibility:["Usa animação para indicar estado de carregamento","Dimensionamento corresponde ao conteúdo esperado","Não interfere com leitores de tela","Animação respeita preferências de movimento reduzido","LoadingState com overlay mantém contexto visual para usuários",'Spinner tem role="status" implícito para leitores de tela']})}export{T as SkeletonDoc};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import{j as e,r as i,J as t}from"./index-DkiftrvI.js";import{C as c}from"./ComponentDocTemplate-CQbBhfvZ.js";import{S as a}from"./slider-v9tXBSnB.js";import"./ExampleCard-DuLrb3t-.js";function v(){return e.jsx(c,{title:"Slider",description:"Um input onde o usuário seleciona um valor dentro de um intervalo determinado.",component:e.jsx(a,{defaultValue:[50],max:100,step:1,className:"w-[60%]"}),usage:`import { Slider } from "forlogic-core"
|
|
2
|
+
|
|
3
|
+
<Slider defaultValue={[50]} max={100} step={1} />`,examples:[{title:"Padrão",preview:e.jsx(a,{defaultValue:[50],max:100,step:1,className:"w-[60%]"}),code:"<Slider defaultValue={[50]} max={100} step={1} />"},{title:"Com Valor Exibido",preview:(()=>{const[s,l]=i.useState([50]);return e.jsxs("div",{className:"space-y-4 w-[60%]",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(t,{children:"Volume"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[s[0],"%"]})]}),e.jsx(a,{value:s,onValueChange:l,max:100,step:1})]})})(),code:`const [value, setValue] = useState([50]);
|
|
4
|
+
|
|
5
|
+
<div className="space-y-4">
|
|
6
|
+
<div className="flex justify-between">
|
|
7
|
+
<Label>Volume</Label>
|
|
8
|
+
<span>{value[0]}%</span>
|
|
9
|
+
</div>
|
|
10
|
+
<Slider value={value} onValueChange={setValue} max={100} step={1} />
|
|
11
|
+
</div>`},{title:"Intervalo (Range)",preview:(()=>{const[s,l]=i.useState([25,75]);return e.jsxs("div",{className:"space-y-4 w-[60%]",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(t,{children:"Faixa de Preço"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["R$ ",s[0]," - R$ ",s[1]]})]}),e.jsx(a,{value:s,onValueChange:l,max:100,step:1})]})})(),code:`const [range, setRange] = useState([25, 75]);
|
|
12
|
+
|
|
13
|
+
<Slider value={range} onValueChange={setRange} max={100} step={1} />`},{title:"Estados",preview:e.jsxs("div",{className:"space-y-6 w-[60%]",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{children:"Normal"}),e.jsx(a,{defaultValue:[50],max:100,step:1})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{className:"text-muted-foreground",children:"Desabilitado"}),e.jsx(a,{defaultValue:[50],max:100,step:1,disabled:!0})]})]}),code:`<Slider defaultValue={[50]} max={100} step={1} />
|
|
14
|
+
<Slider defaultValue={[50]} max={100} step={1} disabled />`},{title:"Casos de Uso - Configurações",preview:(()=>{const[s,l]=i.useState([70]),[n,r]=i.useState([50]),[d,o]=i.useState([60]);return e.jsxs("div",{className:"space-y-6 w-[70%]",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(t,{children:"Brilho"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[s[0],"%"]})]}),e.jsx(a,{value:s,onValueChange:l,max:100,step:1})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(t,{children:"Contraste"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[n[0],"%"]})]}),e.jsx(a,{value:n,onValueChange:r,max:100,step:1})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(t,{children:"Saturação"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:[d[0],"%"]})]}),e.jsx(a,{value:d,onValueChange:o,max:100,step:1})]})]})})(),code:`const [brightness, setBrightness] = useState([70]);
|
|
15
|
+
|
|
16
|
+
<div className="space-y-2">
|
|
17
|
+
<div className="flex justify-between">
|
|
18
|
+
<Label>Brilho</Label>
|
|
19
|
+
<span>{brightness[0]}%</span>
|
|
20
|
+
</div>
|
|
21
|
+
<Slider
|
|
22
|
+
value={brightness}
|
|
23
|
+
onValueChange={setBrightness}
|
|
24
|
+
max={100}
|
|
25
|
+
step={1}
|
|
26
|
+
/>
|
|
27
|
+
</div>`},{title:"Casos de Uso - Filtro de Busca",preview:(()=>{const[s,l]=i.useState([200,800]),[n,r]=i.useState([4]);return e.jsxs("div",{className:"space-y-6 w-[70%]",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(t,{children:"Faixa de Preço"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["R$ ",s[0]," - R$ ",s[1]]})]}),e.jsx(a,{value:s,onValueChange:l,min:0,max:1e3,step:10})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx(t,{children:"Avaliação Mínima"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["⭐ ",n[0]," estrelas"]})]}),e.jsx(a,{value:n,onValueChange:r,min:1,max:5,step:1})]})]})})(),code:`const [priceRange, setPriceRange] = useState([200, 800]);
|
|
28
|
+
|
|
29
|
+
<div className="space-y-2">
|
|
30
|
+
<div className="flex justify-between">
|
|
31
|
+
<Label>Faixa de Preço</Label>
|
|
32
|
+
<span>R$ {priceRange[0]} - R$ {priceRange[1]}</span>
|
|
33
|
+
</div>
|
|
34
|
+
<Slider
|
|
35
|
+
value={priceRange}
|
|
36
|
+
onValueChange={setPriceRange}
|
|
37
|
+
min={0}
|
|
38
|
+
max={1000}
|
|
39
|
+
step={10}
|
|
40
|
+
/>
|
|
41
|
+
</div>`}],props:[{name:"defaultValue",type:"number[]",default:"-",description:"O(s) valor(es) padrão."},{name:"value",type:"number[]",default:"-",description:"O(s) valor(es) controlado(s)."},{name:"min",type:"number",default:"0",description:"O valor mínimo."},{name:"max",type:"number",default:"100",description:"O valor máximo."},{name:"step",type:"number",default:"1",description:"O incremento do passo."},{name:"disabled",type:"boolean",default:"false",description:"Se o slider está desabilitado."}],accessibility:["Suporte completo de teclado (teclas de seta para ajustar)","Segue o padrão WAI-ARIA de slider","Labels e valores ARIA adequados","Indicadores de foco visíveis"]})}export{v as SliderDoc};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import{j as e,a as n,b as d,c as l,e as c,d as r,o}from"./index-DkiftrvI.js";function x(){const i=[{name:"0",value:"0px",class:"p-0"},{name:"0.5",value:"2px",class:"p-0.5"},{name:"1",value:"4px",class:"p-1"},{name:"1.5",value:"6px",class:"p-1.5"},{name:"2",value:"8px",class:"p-2"},{name:"2.5",value:"10px",class:"p-2.5"},{name:"3",value:"12px",class:"p-3"},{name:"3.5",value:"14px",class:"p-3.5"},{name:"4",value:"16px",class:"p-4"},{name:"5",value:"20px",class:"p-5"},{name:"6",value:"24px",class:"p-6"},{name:"7",value:"28px",class:"p-7"},{name:"8",value:"32px",class:"p-8"},{name:"9",value:"36px",class:"p-9"},{name:"10",value:"40px",class:"p-10"},{name:"11",value:"44px",class:"p-11"},{name:"12",value:"48px",class:"p-12"},{name:"14",value:"56px",class:"p-14"},{name:"16",value:"64px",class:"p-16"},{name:"20",value:"80px",class:"p-20"},{name:"24",value:"96px",class:"p-24"}];return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h1",{className:"text-4xl font-bold tracking-tight",children:"Sistema de Espaçamento"}),e.jsx("p",{className:"text-lg text-muted-foreground",children:"Escala de espaçamento consistente baseada em uma unidade base de 4px (0.25rem), garantindo ritmo visual e alinhamento em todos os componentes."})]}),e.jsxs(n,{children:[e.jsxs(d,{children:[e.jsx(l,{children:"Escala de Espaçamento"}),e.jsx(c,{children:"Escala base-4 de 0px a 96px"})]}),e.jsx(r,{children:e.jsx("div",{className:"space-y-4",children:i.map(s=>e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"w-16 text-sm font-mono text-muted-foreground",children:s.name}),e.jsx("div",{className:"w-20 text-sm font-mono text-muted-foreground",children:s.value}),e.jsx("div",{className:"flex-1 bg-muted rounded-lg overflow-hidden",children:e.jsx("div",{className:"bg-primary h-8",style:{width:s.value}})}),e.jsx("code",{className:"text-xs text-muted-foreground w-16",children:s.class.replace("p-","")})]},s.name))})})]}),e.jsxs(n,{children:[e.jsxs(d,{children:[e.jsx(l,{children:"Espaçamento Semântico"}),e.jsx(c,{children:"Padrões comuns de espaçamento com nomes semânticos"})]}),e.jsxs(r,{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold mb-3",children:"Espaçamento de Componentes"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(a,{label:"Compacto (gap-2)",description:"Espaçamento apertado para itens relacionados",className:"gap-2"}),e.jsx(a,{label:"Padrão (gap-4)",description:"Espaçamento padrão entre elementos",className:"gap-4"}),e.jsx(a,{label:"Confortável (gap-6)",description:"Espaçamento generoso para respiro",className:"gap-6"})]})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold mb-3",children:"Espaçamento de Seções"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(a,{label:"Pequeno (space-y-4)",description:"Seções pequenas ou conteúdo aninhado",className:"gap-4"}),e.jsx(a,{label:"Médio (space-y-8)",description:"Espaçamento padrão de seção",className:"gap-8"}),e.jsx(a,{label:"Grande (space-y-12)",description:"Seções principais ou divisões de página",className:"gap-12"})]})]})]})]}),e.jsxs(n,{children:[e.jsxs(d,{children:[e.jsx(l,{children:"Exemplos de Padding"}),e.jsx(c,{children:"Padrões comuns de padding para componentes"})]}),e.jsx(r,{className:"space-y-4",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:"Button (px-4 py-2)"}),e.jsx("div",{className:"inline-flex px-4 py-2 bg-primary text-primary-foreground rounded-md",children:"Button Text"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:"Card (p-6)"}),e.jsx("div",{className:"p-6 bg-card border rounded-lg",children:"Card content with standard padding"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:"Input (px-3 py-2)"}),e.jsx("div",{className:"px-3 py-2 bg-background border rounded-md",children:"Input field padding"})]})]})})]}),e.jsxs(n,{children:[e.jsx(d,{children:e.jsx(l,{children:"Diretrizes de Espaçamento"})}),e.jsxs(r,{className:"prose prose-slate dark:prose-invert max-w-none",children:[e.jsx("h3",{children:"Princípios"}),e.jsxs("ul",{children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Consistência"}),": Use tokens de espaçamento de forma consistente em toda a aplicação"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Ritmo"}),": Mantenha ritmo visual usando múltiplos de 4px"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Respiro"}),": Garanta espaçamento suficiente para leitura e interação confortáveis"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Agrupamento"}),": Use espaçamento para criar relações visuais entre elementos"]})]}),e.jsx("h3",{children:"Padrões Comuns"}),e.jsxs("ul",{children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Itens relacionados"}),": gap-2 ou gap-3 (8-12px)"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Componentes"}),": gap-4 ou gap-6 (16-24px)"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Seções"}),": space-y-8 ou space-y-12 (32-48px)"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Margens de página"}),": p-6 ou p-8 (24-32px)"]})]}),e.jsx("h3",{children:"Melhores Práticas"}),e.jsxs("ul",{children:[e.jsx("li",{children:"Use utilitários gap para layouts flex/grid ao invés de margins"}),e.jsx("li",{children:"Prefira space-y/space-x para espaçamento consistente entre filhos"}),e.jsxs("li",{children:["Use espaçamento responsivo (ex: ",e.jsx("code",{children:"p-4 md:p-6 lg:p-8"}),") para melhor experiência mobile"]}),e.jsx("li",{children:"Evite valores arbitrários - mantenha-se na escala de espaçamento"})]}),e.jsx("h4",{className:"font-semibold mb-3 mt-6",children:"Exemplos de Código"}),e.jsxs("div",{className:"space-y-4 not-prose",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium mb-2 text-green-600 dark:text-green-400",children:"✅ Correto"}),e.jsx("pre",{className:"bg-muted p-3 rounded-md text-xs overflow-x-auto",children:e.jsx("code",{children:`<div className="space-y-6">
|
|
2
|
+
<Card className="p-6">
|
|
3
|
+
<div className="flex gap-4">
|
|
4
|
+
<Button>Ação</Button>
|
|
5
|
+
<Button variant="outline">Cancelar</Button>
|
|
6
|
+
</div>
|
|
7
|
+
</Card>
|
|
8
|
+
</div>`})})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium mb-2 text-red-600 dark:text-red-400",children:"❌ Incorreto"}),e.jsx("pre",{className:"bg-muted p-3 rounded-md text-xs overflow-x-auto",children:e.jsx("code",{children:`<div style={{ marginBottom: '25px' }}>
|
|
9
|
+
<Card style={{ padding: '22px' }}>
|
|
10
|
+
...
|
|
11
|
+
</Card>
|
|
12
|
+
</div>`})})]})]})]})]})]})}function a({label:i,description:s,className:t}){return e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium",children:i}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s})]})}),e.jsxs("div",{className:o("flex bg-muted p-4 rounded-lg",t),children:[e.jsx("div",{className:"h-12 w-20 bg-primary rounded"}),e.jsx("div",{className:"h-12 w-20 bg-primary rounded"}),e.jsx("div",{className:"h-12 w-20 bg-primary rounded"})]})]})}export{x as SpacingDoc};
|