forlogic-core 2.5.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/.note/memory/security/react-router-dom-v7-migration.md +33 -29
  2. package/.note/memory/security/react19-migration-roadmap.md +66 -32
  3. package/dist/action-plans/components/ActionPlanAttachmentsTab.d.ts +2 -1
  4. package/dist/action-plans/components/ActionPlanCommentsTab.d.ts +2 -1
  5. package/dist/action-plans/components/ActionPlanCostTab.d.ts +2 -1
  6. package/dist/action-plans/components/ActionPlanGeneralTab.d.ts +2 -1
  7. package/dist/action-plans/components/ActionPlanHistoryTab.d.ts +2 -1
  8. package/dist/action-plans/components/ActionPlanPage.d.ts +2 -1
  9. package/dist/action-plans/components/ActionPlanPredecessorsTab.d.ts +2 -1
  10. package/dist/action-plans/components/ActionPlanProgressDialog.d.ts +2 -1
  11. package/dist/action-plans/components/ActionPlanProgressTab.d.ts +2 -1
  12. package/dist/action-plans/components/ActionPlanStatusBadge.d.ts +2 -1
  13. package/dist/approval-flow/components/ApprovalSidenav.d.ts +2 -1
  14. package/dist/approval-flow/components/ApproveDialog.d.ts +2 -1
  15. package/dist/approval-flow/components/SelectApproverDialog.d.ts +2 -1
  16. package/dist/audit-trail/components/AuditTrailDetails.d.ts +2 -1
  17. package/dist/audit-trail/components/AuditTrailFilter.d.ts +2 -1
  18. package/dist/audit-trail/components/AuditTrailPage.d.ts +2 -1
  19. package/dist/auth/components/AliasRedirect.d.ts +1 -1
  20. package/dist/auth/components/AliasRouteGuard.d.ts +1 -1
  21. package/dist/auth/contexts/AuthContext.d.ts +1 -0
  22. package/dist/auth/pages/CallbackPage.d.ts +1 -1
  23. package/dist/components/ErrorBoundary.d.ts +1 -1
  24. package/dist/components/dashboards/dashboard-form.d.ts +1 -1
  25. package/dist/components/dashboards/dashboard-general-view.d.ts +1 -1
  26. package/dist/components/dashboards/dashboard-grid.d.ts +1 -1
  27. package/dist/components/dashboards/dashboard-list.d.ts +1 -1
  28. package/dist/components/dashboards/dashboard-view.d.ts +1 -1
  29. package/dist/components/dashboards/panels/burndown-panel.d.ts +2 -1
  30. package/dist/components/dashboards/panels/cartesian-panel.d.ts +2 -1
  31. package/dist/components/dashboards/panels/list-panel.d.ts +1 -1
  32. package/dist/components/dashboards/panels/matrix-risk-panel.d.ts +2 -1
  33. package/dist/components/dashboards/panels/numeric-panel.d.ts +2 -1
  34. package/dist/components/dashboards/panels/panel-error.d.ts +2 -1
  35. package/dist/components/dashboards/panels/panel-header.d.ts +2 -2
  36. package/dist/components/dashboards/panels/panel-loader.d.ts +2 -1
  37. package/dist/components/dashboards/panels/panel-no-data.d.ts +2 -1
  38. package/dist/components/dashboards/panels/panel-unavailable.d.ts +2 -1
  39. package/dist/components/dashboards/panels/pareto-panel.d.ts +2 -1
  40. package/dist/components/dashboards/panels/performance-panel.d.ts +2 -1
  41. package/dist/components/dashboards/panels/pie-panel.d.ts +2 -1
  42. package/dist/components/dashboards/panels/text-panel.d.ts +2 -1
  43. package/dist/components/layout/AppSidebar.d.ts +1 -1
  44. package/dist/components/layout/BodyContent.d.ts +2 -2
  45. package/dist/components/layout/SidebarActionTrigger.d.ts +1 -1
  46. package/dist/components/layout/SidebarHeader.d.ts +1 -1
  47. package/dist/components/layout/SidebarLogo.d.ts +1 -1
  48. package/dist/components/modules/AccessDeniedDialog.d.ts +1 -1
  49. package/dist/components/modules/ModuleAccessGuard.d.ts +1 -1
  50. package/dist/components/modules/ModuleGrid.d.ts +1 -1
  51. package/dist/components/modules/ModuleOfferContent.d.ts +1 -1
  52. package/dist/components/modules/ModulesContent.d.ts +1 -1
  53. package/dist/components/modules/ModulesDialog.d.ts +1 -1
  54. package/dist/components/modules/ModulesFooterCards.d.ts +1 -1
  55. package/dist/components/modules/icons/ModulesCardIcons.d.ts +4 -3
  56. package/dist/components/ui/alert-dialog.d.ts +2 -2
  57. package/dist/components/ui/breadcrumb.d.ts +2 -2
  58. package/dist/components/ui/calendar.d.ts +1 -1
  59. package/dist/components/ui/chart.d.ts +1 -1
  60. package/dist/components/ui/combo-tree.d.ts +1 -1
  61. package/dist/components/ui/combobox.d.ts +1 -1
  62. package/dist/components/ui/command.d.ts +2 -2
  63. package/dist/components/ui/context-menu.d.ts +1 -1
  64. package/dist/components/ui/data-list.d.ts +3 -3
  65. package/dist/components/ui/date-picker.d.ts +2 -1
  66. package/dist/components/ui/dialog-wizard.d.ts +1 -1
  67. package/dist/components/ui/dialog.d.ts +3 -3
  68. package/dist/components/ui/drawer.d.ts +3 -3
  69. package/dist/components/ui/dropdown-menu.d.ts +1 -1
  70. package/dist/components/ui/electronic-signature-dialog.d.ts +2 -1
  71. package/dist/components/ui/empty-state.d.ts +1 -1
  72. package/dist/components/ui/export-dialog.d.ts +1 -1
  73. package/dist/components/ui/form.d.ts +1 -1
  74. package/dist/components/ui/grid.d.ts +1 -1
  75. package/dist/components/ui/iframe-dialog.d.ts +2 -1
  76. package/dist/components/ui/loading-state.d.ts +1 -1
  77. package/dist/components/ui/menubar.d.ts +2 -2
  78. package/dist/components/ui/multiselect-permissions.d.ts +1 -1
  79. package/dist/components/ui/online-editor-dialog.d.ts +2 -1
  80. package/dist/components/ui/page-breadcrumb.d.ts +1 -1
  81. package/dist/components/ui/pagination.d.ts +5 -5
  82. package/dist/components/ui/report-request-list.d.ts +2 -1
  83. package/dist/components/ui/resizable.d.ts +3 -3
  84. package/dist/components/ui/select.d.ts +1 -1
  85. package/dist/components/ui/sheet.d.ts +3 -3
  86. package/dist/components/ui/skeleton-variants.d.ts +5 -5
  87. package/dist/components/ui/skeleton.d.ts +1 -1
  88. package/dist/components/ui/sonner.d.ts +1 -1
  89. package/dist/components/ui/spinner.d.ts +1 -1
  90. package/dist/components/ui/split-button.d.ts +2 -1
  91. package/dist/components/ui/stack.d.ts +1 -1
  92. package/dist/components/ui/status-badge.d.ts +2 -1
  93. package/dist/components/ui/step-selector.d.ts +2 -1
  94. package/dist/components/ui/stimulsoft-viewer.d.ts +2 -1
  95. package/dist/components/ui/tab-page-layout.d.ts +3 -3
  96. package/dist/components/ui/terms-of-use-dialog.d.ts +3 -2
  97. package/dist/components/ui/tooltip.d.ts +1 -1
  98. package/dist/components/ui/truncated-cell.d.ts +1 -1
  99. package/dist/components/ui/users-groups-selector.d.ts +2 -1
  100. package/dist/components/ui/viewer-dialog.d.ts +2 -1
  101. package/dist/contexts/ModalStateContext.d.ts +1 -1
  102. package/dist/contexts/ModuleContext.d.ts +2 -2
  103. package/dist/contexts/NavigationContext.d.ts +2 -2
  104. package/dist/contexts/PageMetadataContext.d.ts +1 -1
  105. package/dist/crud/components/BaseForm.d.ts +2 -1
  106. package/dist/crud/components/ColumnSettingsPopover.d.ts +2 -1
  107. package/dist/crud/components/ContextMenu.d.ts +2 -1
  108. package/dist/crud/components/CrudActionBar.d.ts +1 -1
  109. package/dist/crud/components/CrudGrid.d.ts +1 -1
  110. package/dist/crud/components/CrudPagination.d.ts +2 -1
  111. package/dist/crud/components/CrudTable.d.ts +1 -1
  112. package/dist/crud/components/FilterBar.d.ts +1 -1
  113. package/dist/crud/components/GroupDropZone.d.ts +2 -1
  114. package/dist/crud/components/TableFooter.d.ts +2 -1
  115. package/dist/crud/createCrudPage.d.ts +1 -1
  116. package/dist/crud/primitives/ActionMenu.d.ts +2 -1
  117. package/dist/crud/primitives/FilterBar.d.ts +2 -1
  118. package/dist/crud/primitives/Pagination.d.ts +2 -1
  119. package/dist/crud/primitives/Table.d.ts +2 -1
  120. package/dist/crud/primitives/TreeTable.d.ts +2 -1
  121. package/dist/custom-form-fields/components/CustomFormFields.d.ts +2 -1
  122. package/dist/custom-form-fields/fields/FormDateField.d.ts +2 -1
  123. package/dist/custom-form-fields/fields/FormMultiSelectionField.d.ts +2 -1
  124. package/dist/custom-form-fields/fields/FormNumericField.d.ts +2 -1
  125. package/dist/custom-form-fields/fields/FormQuestionsField.d.ts +2 -1
  126. package/dist/custom-form-fields/fields/FormSingleSelectionField.d.ts +2 -1
  127. package/dist/custom-form-fields/fields/FormTextField.d.ts +2 -1
  128. package/dist/custom-form-fields/fields/FormTimeField.d.ts +2 -1
  129. package/dist/custom-form-fields/fields/FormUrlField.d.ts +2 -1
  130. package/dist/custom-form-fields/fields/ReadOnlyTextField.d.ts +2 -1
  131. package/dist/documents/components/DocumentFileUpload.d.ts +1 -1
  132. package/dist/file-upload/components/SingleFileUpload.d.ts +1 -1
  133. package/dist/hooks/useSidebarResize.d.ts +1 -1
  134. package/dist/index.esm.js +1 -1
  135. package/dist/index.js +1 -1
  136. package/dist/leadership/components/LeadershipDialog.d.ts +1 -1
  137. package/dist/leadership/components/LeadershipForm.d.ts +1 -1
  138. package/dist/leadership/components/LeadershipPage.d.ts +1 -1
  139. package/dist/media/components/ImageEditor.d.ts +1 -1
  140. package/dist/media/components/ImageRenderer.d.ts +1 -1
  141. package/dist/media/components/VideoEditor.d.ts +1 -1
  142. package/dist/media/components/VideoRenderer.d.ts +1 -1
  143. package/dist/places/components/ManageAccessModal.d.ts +1 -1
  144. package/dist/places/components/PlaceCard.d.ts +1 -1
  145. package/dist/places/components/PlacesList.d.ts +1 -1
  146. package/dist/providers/CoreProviders.d.ts +2 -2
  147. package/dist/sign/components/D4SignWebhookTester.d.ts +1 -1
  148. package/dist/sign/components/D4SignWidget.d.ts +1 -1
  149. package/dist/sign/components/DocumentSigner.d.ts +1 -1
  150. package/dist/sign/components/SignConfigForm.d.ts +1 -1
  151. package/dist/sign/components/SignWidget.d.ts +1 -1
  152. package/dist/team-selector/components/TeamSelector.d.ts +2 -1
  153. package/dist/updates/components/UpdatesBar.d.ts +1 -1
  154. package/dist/updates/components/UpdatesDialog.d.ts +1 -1
  155. package/dist/updates/components/UserUpdatesViewer.d.ts +1 -1
  156. package/docs/design-system/examples.md +275 -275
  157. package/docs/design-system/navigation.md +1 -1
  158. package/docs/design-system/patterns/core-providers.md +258 -258
  159. package/docs/sql/import/validate_occurrences_categories.sql +19 -20
  160. package/package.json +10 -8
@@ -1,258 +1,258 @@
1
- # Padrão: CoreProviders Setup
2
-
3
- ## Providers incluídos
4
-
5
- | Provider | Descrição |
6
- |----------|-----------|
7
- | ErrorBoundary | Captura erros de renderização React |
8
- | I18nextProvider | Sistema de internacionalização |
9
- | QueryClientProvider | Cache e queries (React Query) |
10
- | AuthProvider | Autenticação e sessão |
11
- | LocaleProvider | Idioma, timezone, formato de data |
12
- | ModuleProvider | Configuração de módulo ativo |
13
- | ModuleAccessGuard | Bloqueio de acesso por módulo |
14
-
15
- ## Uso básico
16
-
17
- ```tsx
18
- <CoreProviders moduleAlias="performance" appTranslations={{ 'pt-BR': ptBR }}>
19
- <BrowserRouter>
20
- <Routes />
21
- </BrowserRouter>
22
- </CoreProviders>
23
- ```
24
-
25
- ## Props
26
-
27
- | Prop | Tipo | Obrigatório | Descrição |
28
- |------|------|-------------|-----------|
29
- | children | ReactNode | Sim | Componentes filhos |
30
- | queryClient | QueryClient | Não | Instância customizada (default criado automaticamente) |
31
- | moduleAlias | string | Não | Alias do módulo para verificação de acesso |
32
- | moduleApiUrl | string | Não | (DEPRECATED — substituído por `associationsBaseUrl`) |
33
- | associationsBaseUrl | string | Não | Base URL completa para `/Users/{userId}/associations`. Ver seção abaixo. |
34
- | moduleAccessGuardProps | object | Não | Props para o ModuleAccessGuard |
35
- | appTranslations | Record<string, Record<string, string>> | Não | Traduções por idioma no namespace 'app' |
36
- | clarityProjectId | string | Não | Project ID do Microsoft Clarity. Sem ele, integração desativada. |
37
- | clarityMode | 'auto' \| 'disabled' | Não | Opt-out do tracking Clarity. Default `'auto'`. |
38
- | backend | 'supabase' \| 'dotnet' | Não | Backend ativo. Default `'supabase'`. Ver seção abaixo. |
39
- | signDocumentsSchema | string | Não | Schema onde a tabela de tracking do D4Sign vive neste projeto. Default `'common'`. Ver seção abaixo. |
40
- | signDocumentsTable | string | Não | Nome da tabela de tracking. Default `'sign_documents'`. |
41
-
42
- ## Tabela `sign_documents` por schema (D4Sign)
43
-
44
- Por padrão, o webhook D4Sign grava o resultado em `common.sign_documents`. Projetos que mantêm a tabela no próprio schema (ex.: Educação) podem redirecionar via:
45
-
46
- ```tsx
47
- <CoreProviders
48
- moduleAlias="educacao"
49
- signDocumentsSchema="educacao"
50
- // signDocumentsTable opcional — default 'sign_documents'
51
- >
52
- ...
53
- </CoreProviders>
54
- ```
55
-
56
- O que acontece:
57
-
58
- 1. `DocumentSigner` envia `target_schema` e `target_table` para a edge function `d4sign` no `create_and_send`.
59
- 2. A edge function `d4sign` insere a linha `pending` no schema/tabela alvo e registra o webhook do D4Sign com a URL `/functions/v1/d4sign-webhook?schema={schema}&table={table}`.
60
- 3. A edge function `d4sign-webhook` lê os query params, valida contra uma **allowlist** de schemas (`common`, `educacao`, `treinamentos`, `inovacao`, `public`) e faz o `UPDATE` no schema correto.
61
- 4. O front se inscreve no Realtime no mesmo schema/tabela.
62
-
63
- **Requisitos no projeto consumidor:**
64
-
65
- Cada projeto que redirecionar o destino precisa criar a tabela no seu próprio schema com **exatamente** o contrato abaixo — os nomes e tipos das colunas são consumidos pelas edge functions `d4sign` e `d4sign-webhook` e pelo `DocumentSigner`. Divergir quebra o fluxo.
66
-
67
- ### Contrato de campos
68
-
69
- | Campo | Tipo | Obrigatório | Default | Preenchido por |
70
- |---|---|---|---|---|
71
- | `document_id` | `text` PK | sim | — | front (`DocumentSigner`, `crypto.randomUUID()`) |
72
- | `alias` | `text` | sim | — | front |
73
- | `provider` | `text` | sim | `'d4sign'` | front |
74
- | `envelope_id` | `text` | sim | — | edge `d4sign` (UUID retornado pelo D4Sign) |
75
- | `signer_email` | `text` | sim | — | front |
76
- | `signer_name` | `text` | não | — | front |
77
- | `filename` | `text` | não | — | front |
78
- | `status` | `text` | sim | `'pending'` | webhook (`pending` → `signed` / `cancelled` / `failed`) |
79
- | `signed_at` | `timestamptz` | não | — | webhook |
80
- | `download_url` | `text` | não | — | webhook |
81
- | `download_url_expires_at` | `timestamptz` | não | — | webhook (~50 min) |
82
- | `raw_webhook_payload` | `jsonb` | não | — | webhook |
83
- | `created_at` | `timestamptz` | sim | `now()` | DB |
84
- | `updated_at` | `timestamptz` | sim | `now()` | trigger |
85
-
86
- > **PK em `document_id`** (não `id` serial) — é a chave que o front usa para correlacionar o envelope com a row.
87
-
88
- ### Script SQL (substituir `{schema}`)
89
-
90
- ```sql
91
- CREATE TABLE {schema}.sign_documents (
92
- document_id text PRIMARY KEY,
93
- alias text NOT NULL,
94
- provider text NOT NULL DEFAULT 'd4sign',
95
- envelope_id text NOT NULL,
96
- signer_email text NOT NULL,
97
- signer_name text,
98
- filename text,
99
- status text NOT NULL DEFAULT 'pending',
100
- download_url text,
101
- download_url_expires_at timestamptz,
102
- raw_webhook_payload jsonb,
103
- signed_at timestamptz,
104
- created_at timestamptz NOT NULL DEFAULT now(),
105
- updated_at timestamptz NOT NULL DEFAULT now()
106
- );
107
-
108
- CREATE INDEX sign_documents_alias_status_idx ON {schema}.sign_documents (alias, status);
109
- CREATE INDEX sign_documents_envelope_idx ON {schema}.sign_documents (envelope_id);
110
-
111
- GRANT SELECT ON {schema}.sign_documents TO authenticated;
112
- GRANT ALL ON {schema}.sign_documents TO service_role;
113
-
114
- ALTER TABLE {schema}.sign_documents ENABLE ROW LEVEL SECURITY;
115
-
116
- CREATE POLICY "sign_documents_select_own_tenant"
117
- ON {schema}.sign_documents
118
- FOR SELECT
119
- TO authenticated
120
- USING (alias = ((SELECT auth.jwt()) ->> 'alias'));
121
-
122
- CREATE OR REPLACE FUNCTION {schema}.sign_documents_set_updated_at()
123
- RETURNS TRIGGER LANGUAGE plpgsql SET search_path = {schema}, public AS $$
124
- BEGIN NEW.updated_at = now(); RETURN NEW; END;
125
- $$;
126
-
127
- CREATE TRIGGER sign_documents_updated_at
128
- BEFORE UPDATE ON {schema}.sign_documents
129
- FOR EACH ROW EXECUTE FUNCTION {schema}.sign_documents_set_updated_at();
130
-
131
- -- Realtime — obrigatório, senão o DocumentSigner nunca recebe o evento de assinatura
132
- ALTER TABLE {schema}.sign_documents REPLICA IDENTITY FULL;
133
- ALTER PUBLICATION supabase_realtime ADD TABLE {schema}.sign_documents;
134
- ```
135
-
136
- ### Notas importantes
137
-
138
- - **`sign_configs` continua em `common`** — o webhook lê de lá independentemente do schema alvo. Cada projeto que usa assinatura precisa ter `common.sign_configs` populado (via `/a/cs` no Admin).
139
- - **`REPLICA IDENTITY FULL` + entrada na publication `supabase_realtime`** são obrigatórios. Sem isso, o `DocumentSigner` fica em loading eterno após assinar.
140
- - **Schemas novos** precisam ser adicionados à constante `ALLOWED_SCHEMAS` em `supabase/functions/d4sign/index.ts` **e** `supabase/functions/d4sign-webhook/index.ts`, senão o webhook silenciosamente cai para `common` (proteção anti-SSRF).
141
-
142
- **Retrocompatibilidade:** sem essas props, tudo continua apontando para `common.sign_documents` — Admin segue funcionando inalterado.
143
-
144
-
145
- ## Associações em outra base URL
146
-
147
- Por padrão, `useModuleAccess` (e o `ModuleAccessGuard`) busca as associações em:
148
-
149
- ```
150
- {QUALIEX_API_URL}/api/common/v1/Users/{userId}/associations
151
- ```
152
-
153
- Quando o módulo expõe seu próprio endpoint de associações, informe `associationsBaseUrl` no `CoreProviders`. A lib passa a chamar:
154
-
155
- ```
156
- {associationsBaseUrl}/Users/{userId}/associations
157
- ```
158
-
159
- `associationsBaseUrl` deve incluir todo o prefixo (host + `/api/{modulo}/v1`):
160
-
161
- ```tsx
162
- <CoreProviders
163
- backend="dotnet"
164
- associationsBaseUrl={import.meta.env.VITE_ASSOCIATIONS_API_URL}
165
- // ex: "https://api.qualiex.com/api/inovacao/v1"
166
- >
167
- ...
168
- </CoreProviders>
169
- ```
170
-
171
- Características:
172
-
173
- - **Uma única variável** — não exige `moduleAlias`. Pode ser usada sem ativar o `ModuleAccessGuard` (útil enquanto o software do módulo ainda não foi cadastrado no `SOFTWARES_MAP` da lib).
174
- - A API alvo deve responder no mesmo contrato (`UserAssociation[]`) e aceitar os headers `Authorization: Bearer <token>` e `un-alias: <alias>`.
175
- - Demais endpoints (`/companiesusers`, `/softwares`) continuam consultando a common.
176
-
177
-
178
- ## Backend (Supabase opcional)
179
-
180
- A prop `backend` controla se a lib usa o stack Supabase ou apenas a API .NET do Qualiex.
181
-
182
- - `'supabase'` (default, retrocompat): inicializa o cliente Supabase, valida tokens via Edge Function `validate-token` e exige `SUPABASE_URL` + `SUPABASE_PUBLISHABLE_KEY` (ou as versões `VITE_SUPABASE_*` legadas) no `.env`. O `vite.config.ts` consolida ambos os formatos via `resolveSupabaseEnv()` — ver `docs/design-system/patterns/feature-flags.md`.
183
- - `'dotnet'`: a lib **não** chama Supabase em nenhum momento da inicialização. O `AuthProvider` autentica apenas com os tokens OAuth do Qualiex (`access_token` + `id_token`). Não exige envs do Supabase. **Importante:** defina `VITE_APP_ENV="DEV"` no `.env` quando o app rodar contra o ambiente dev do Qualiex — sem essa variável, o failsafe assume `PROD`.
184
-
185
- ### Exemplos de uso por backend
186
-
187
- ```tsx
188
- // ============================================================
189
- // Módulo COM Supabase (default — não precisa declarar backend)
190
- // ============================================================
191
- // .env obrigatório:
192
- // SUPABASE_URL="https://<project>.supabase.co"
193
- // SUPABASE_PUBLISHABLE_KEY="sb_publishable_..."
194
- // VITE_SUPABASE_PK_OVERRIDE="sb_publishable_..."
195
- //
196
- import { CoreProviders } from 'forlogic-core';
197
- import { BrowserRouter } from 'react-router-dom';
198
- import pt from '@/locales/pt-BR.json';
199
-
200
- <CoreProviders moduleAlias="performance" appTranslations={{ 'pt-BR': pt }}>
201
- <BrowserRouter>
202
- <Routes />
203
- </BrowserRouter>
204
- </CoreProviders>
205
- ```
206
-
207
- ```tsx
208
- // ============================================================
209
- // Módulo SEM Supabase (ex.: Documentos, APIs próprias)
210
- // ============================================================
211
- // .env obrigatório:
212
- // VITE_APP_ENV="DEV" // ou "PROD"
213
- //
214
- // Nenhuma env do Supabase é exigida.
215
- //
216
- import { CoreProviders } from 'forlogic-core';
217
- import { BrowserRouter } from 'react-router-dom';
218
- import pt from '@/locales/pt-BR.json';
219
-
220
- <CoreProviders
221
- backend="dotnet"
222
- moduleAlias="documents"
223
- appTranslations={{ 'pt-BR': pt }}
224
- >
225
- <BrowserRouter>
226
- <Routes />
227
- </BrowserRouter>
228
- </CoreProviders>
229
- ```
230
-
231
-
232
- ### O que funciona sem Supabase em `backend="dotnet"`
233
-
234
- A lib mantém os seguintes recursos funcionando 100% sem nenhuma env var Supabase:
235
-
236
- - **Logos e favicon** (`assets`, `logoSrc`, `smallLogoSrc`): servidos a partir de bucket público fixo embutido na lib.
237
- - **Login automático em dev/preview**: `shouldUseDevTokens()` agora exige modo Supabase, então em modo dotnet o `ProtectedRoute` sempre vai para `loginProd()` (OAuth real), mesmo em `localhost`/Lovable preview.
238
- - **Logoff manual**: `TokenManager.clearAll()` preserva o flag `manual_logout`, garantindo que `logout()` realmente deslogue (sem auto-login no próximo render).
239
- - **`LegacyKeyBanner`**: oculto automaticamente em modo dotnet.
240
-
241
- ### Features que continuam exigindo Supabase
242
-
243
- Mesmo com `backend="dotnet"`, se você importar qualquer um dos módulos abaixo eles vão falhar em runtime sem Supabase configurado:
244
-
245
- - `forlogic-core/sign`
246
- - `forlogic-core/audit-trail`
247
- - `forlogic-core/action-plans`
248
- - `forlogic-core/leadership`
249
- - `forlogic-core/places`
250
- - `EmailService` (do barrel principal)
251
-
252
- Esses módulos **foram removidos do barrel principal** (breaking change) — importe-os via subpath quando precisar. Use `isSupabaseConfigured()` para checar disponibilidade antes de chamar `getSupabaseClient()`.
253
-
254
- ## QueryClient default
255
-
256
- ```ts
257
- { defaultOptions: { queries: { staleTime: 5 * 60 * 1000, retry: 1 } } }
258
- ```
1
+ # Padrão: CoreProviders Setup
2
+
3
+ ## Providers incluídos
4
+
5
+ | Provider | Descrição |
6
+ |----------|-----------|
7
+ | ErrorBoundary | Captura erros de renderização React |
8
+ | I18nextProvider | Sistema de internacionalização |
9
+ | QueryClientProvider | Cache e queries (React Query) |
10
+ | AuthProvider | Autenticação e sessão |
11
+ | LocaleProvider | Idioma, timezone, formato de data |
12
+ | ModuleProvider | Configuração de módulo ativo |
13
+ | ModuleAccessGuard | Bloqueio de acesso por módulo |
14
+
15
+ ## Uso básico
16
+
17
+ ```tsx
18
+ <CoreProviders moduleAlias="performance" appTranslations={{ 'pt-BR': ptBR }}>
19
+ <BrowserRouter>
20
+ <Routes />
21
+ </BrowserRouter>
22
+ </CoreProviders>
23
+ ```
24
+
25
+ ## Props
26
+
27
+ | Prop | Tipo | Obrigatório | Descrição |
28
+ |------|------|-------------|-----------|
29
+ | children | ReactNode | Sim | Componentes filhos |
30
+ | queryClient | QueryClient | Não | Instância customizada (default criado automaticamente) |
31
+ | moduleAlias | string | Não | Alias do módulo para verificação de acesso |
32
+ | moduleApiUrl | string | Não | (DEPRECATED — substituído por `associationsBaseUrl`) |
33
+ | associationsBaseUrl | string | Não | Base URL completa para `/Users/{userId}/associations`. Ver seção abaixo. |
34
+ | moduleAccessGuardProps | object | Não | Props para o ModuleAccessGuard |
35
+ | appTranslations | Record<string, Record<string, string>> | Não | Traduções por idioma no namespace 'app' |
36
+ | clarityProjectId | string | Não | Project ID do Microsoft Clarity. Sem ele, integração desativada. |
37
+ | clarityMode | 'auto' \| 'disabled' | Não | Opt-out do tracking Clarity. Default `'auto'`. |
38
+ | backend | 'supabase' \| 'dotnet' | Não | Backend ativo. Default `'supabase'`. Ver seção abaixo. |
39
+ | signDocumentsSchema | string | Não | Schema onde a tabela de tracking do D4Sign vive neste projeto. Default `'common'`. Ver seção abaixo. |
40
+ | signDocumentsTable | string | Não | Nome da tabela de tracking. Default `'sign_documents'`. |
41
+
42
+ ## Tabela `sign_documents` por schema (D4Sign)
43
+
44
+ Por padrão, o webhook D4Sign grava o resultado em `common.sign_documents`. Projetos que mantêm a tabela no próprio schema (ex.: Educação) podem redirecionar via:
45
+
46
+ ```tsx
47
+ <CoreProviders
48
+ moduleAlias="educacao"
49
+ signDocumentsSchema="educacao"
50
+ // signDocumentsTable opcional — default 'sign_documents'
51
+ >
52
+ ...
53
+ </CoreProviders>
54
+ ```
55
+
56
+ O que acontece:
57
+
58
+ 1. `DocumentSigner` envia `target_schema` e `target_table` para a edge function `d4sign` no `create_and_send`.
59
+ 2. A edge function `d4sign` insere a linha `pending` no schema/tabela alvo e registra o webhook do D4Sign com a URL `/functions/v1/d4sign-webhook?schema={schema}&table={table}`.
60
+ 3. A edge function `d4sign-webhook` lê os query params, valida contra uma **allowlist** de schemas (`common`, `educacao`, `treinamentos`, `inovacao`, `public`) e faz o `UPDATE` no schema correto.
61
+ 4. O front se inscreve no Realtime no mesmo schema/tabela.
62
+
63
+ **Requisitos no projeto consumidor:**
64
+
65
+ Cada projeto que redirecionar o destino precisa criar a tabela no seu próprio schema com **exatamente** o contrato abaixo — os nomes e tipos das colunas são consumidos pelas edge functions `d4sign` e `d4sign-webhook` e pelo `DocumentSigner`. Divergir quebra o fluxo.
66
+
67
+ ### Contrato de campos
68
+
69
+ | Campo | Tipo | Obrigatório | Default | Preenchido por |
70
+ |---|---|---|---|---|
71
+ | `document_id` | `text` PK | sim | — | front (`DocumentSigner`, `crypto.randomUUID()`) |
72
+ | `alias` | `text` | sim | — | front |
73
+ | `provider` | `text` | sim | `'d4sign'` | front |
74
+ | `envelope_id` | `text` | sim | — | edge `d4sign` (UUID retornado pelo D4Sign) |
75
+ | `signer_email` | `text` | sim | — | front |
76
+ | `signer_name` | `text` | não | — | front |
77
+ | `filename` | `text` | não | — | front |
78
+ | `status` | `text` | sim | `'pending'` | webhook (`pending` → `signed` / `cancelled` / `failed`) |
79
+ | `signed_at` | `timestamptz` | não | — | webhook |
80
+ | `download_url` | `text` | não | — | webhook |
81
+ | `download_url_expires_at` | `timestamptz` | não | — | webhook (~50 min) |
82
+ | `raw_webhook_payload` | `jsonb` | não | — | webhook |
83
+ | `created_at` | `timestamptz` | sim | `now()` | DB |
84
+ | `updated_at` | `timestamptz` | sim | `now()` | trigger |
85
+
86
+ > **PK em `document_id`** (não `id` serial) — é a chave que o front usa para correlacionar o envelope com a row.
87
+
88
+ ### Script SQL (substituir `{schema}`)
89
+
90
+ ```sql
91
+ CREATE TABLE {schema}.sign_documents (
92
+ document_id text PRIMARY KEY,
93
+ alias text NOT NULL,
94
+ provider text NOT NULL DEFAULT 'd4sign',
95
+ envelope_id text NOT NULL,
96
+ signer_email text NOT NULL,
97
+ signer_name text,
98
+ filename text,
99
+ status text NOT NULL DEFAULT 'pending',
100
+ download_url text,
101
+ download_url_expires_at timestamptz,
102
+ raw_webhook_payload jsonb,
103
+ signed_at timestamptz,
104
+ created_at timestamptz NOT NULL DEFAULT now(),
105
+ updated_at timestamptz NOT NULL DEFAULT now()
106
+ );
107
+
108
+ CREATE INDEX sign_documents_alias_status_idx ON {schema}.sign_documents (alias, status);
109
+ CREATE INDEX sign_documents_envelope_idx ON {schema}.sign_documents (envelope_id);
110
+
111
+ GRANT SELECT ON {schema}.sign_documents TO authenticated;
112
+ GRANT ALL ON {schema}.sign_documents TO service_role;
113
+
114
+ ALTER TABLE {schema}.sign_documents ENABLE ROW LEVEL SECURITY;
115
+
116
+ CREATE POLICY "sign_documents_select_own_tenant"
117
+ ON {schema}.sign_documents
118
+ FOR SELECT
119
+ TO authenticated
120
+ USING (alias = ((SELECT auth.jwt()) ->> 'alias'));
121
+
122
+ CREATE OR REPLACE FUNCTION {schema}.sign_documents_set_updated_at()
123
+ RETURNS TRIGGER LANGUAGE plpgsql SET search_path = {schema}, public AS $$
124
+ BEGIN NEW.updated_at = now(); RETURN NEW; END;
125
+ $$;
126
+
127
+ CREATE TRIGGER sign_documents_updated_at
128
+ BEFORE UPDATE ON {schema}.sign_documents
129
+ FOR EACH ROW EXECUTE FUNCTION {schema}.sign_documents_set_updated_at();
130
+
131
+ -- Realtime — obrigatório, senão o DocumentSigner nunca recebe o evento de assinatura
132
+ ALTER TABLE {schema}.sign_documents REPLICA IDENTITY FULL;
133
+ ALTER PUBLICATION supabase_realtime ADD TABLE {schema}.sign_documents;
134
+ ```
135
+
136
+ ### Notas importantes
137
+
138
+ - **`sign_configs` continua em `common`** — o webhook lê de lá independentemente do schema alvo. Cada projeto que usa assinatura precisa ter `common.sign_configs` populado (via `/a/cs` no Admin).
139
+ - **`REPLICA IDENTITY FULL` + entrada na publication `supabase_realtime`** são obrigatórios. Sem isso, o `DocumentSigner` fica em loading eterno após assinar.
140
+ - **Schemas novos** precisam ser adicionados à constante `ALLOWED_SCHEMAS` em `supabase/functions/d4sign/index.ts` **e** `supabase/functions/d4sign-webhook/index.ts`, senão o webhook silenciosamente cai para `common` (proteção anti-SSRF).
141
+
142
+ **Retrocompatibilidade:** sem essas props, tudo continua apontando para `common.sign_documents` — Admin segue funcionando inalterado.
143
+
144
+
145
+ ## Associações em outra base URL
146
+
147
+ Por padrão, `useModuleAccess` (e o `ModuleAccessGuard`) busca as associações em:
148
+
149
+ ```
150
+ {QUALIEX_API_URL}/api/common/v1/Users/{userId}/associations
151
+ ```
152
+
153
+ Quando o módulo expõe seu próprio endpoint de associações, informe `associationsBaseUrl` no `CoreProviders`. A lib passa a chamar:
154
+
155
+ ```
156
+ {associationsBaseUrl}/Users/{userId}/associations
157
+ ```
158
+
159
+ `associationsBaseUrl` deve incluir todo o prefixo (host + `/api/{modulo}/v1`):
160
+
161
+ ```tsx
162
+ <CoreProviders
163
+ backend="dotnet"
164
+ associationsBaseUrl={import.meta.env.VITE_ASSOCIATIONS_API_URL}
165
+ // ex: "https://api.qualiex.com/api/inovacao/v1"
166
+ >
167
+ ...
168
+ </CoreProviders>
169
+ ```
170
+
171
+ Características:
172
+
173
+ - **Uma única variável** — não exige `moduleAlias`. Pode ser usada sem ativar o `ModuleAccessGuard` (útil enquanto o software do módulo ainda não foi cadastrado no `SOFTWARES_MAP` da lib).
174
+ - A API alvo deve responder no mesmo contrato (`UserAssociation[]`) e aceitar os headers `Authorization: Bearer <token>` e `un-alias: <alias>`.
175
+ - Demais endpoints (`/companiesusers`, `/softwares`) continuam consultando a common.
176
+
177
+
178
+ ## Backend (Supabase opcional)
179
+
180
+ A prop `backend` controla se a lib usa o stack Supabase ou apenas a API .NET do Qualiex.
181
+
182
+ - `'supabase'` (default, retrocompat): inicializa o cliente Supabase, valida tokens via Edge Function `validate-token` e exige `SUPABASE_URL` + `SUPABASE_PUBLISHABLE_KEY` (ou as versões `VITE_SUPABASE_*` legadas) no `.env`. O `vite.config.ts` consolida ambos os formatos via `resolveSupabaseEnv()` — ver `docs/design-system/patterns/feature-flags.md`.
183
+ - `'dotnet'`: a lib **não** chama Supabase em nenhum momento da inicialização. O `AuthProvider` autentica apenas com os tokens OAuth do Qualiex (`access_token` + `id_token`). Não exige envs do Supabase. **Importante:** defina `VITE_APP_ENV="DEV"` no `.env` quando o app rodar contra o ambiente dev do Qualiex — sem essa variável, o failsafe assume `PROD`.
184
+
185
+ ### Exemplos de uso por backend
186
+
187
+ ```tsx
188
+ // ============================================================
189
+ // Módulo COM Supabase (default — não precisa declarar backend)
190
+ // ============================================================
191
+ // .env obrigatório:
192
+ // SUPABASE_URL="https://<project>.supabase.co"
193
+ // SUPABASE_PUBLISHABLE_KEY="sb_publishable_..."
194
+ // VITE_SUPABASE_PK_OVERRIDE="sb_publishable_..."
195
+ //
196
+ import { CoreProviders } from 'forlogic-core';
197
+ import { BrowserRouter } from 'react-router';
198
+ import pt from '@/locales/pt-BR.json';
199
+
200
+ <CoreProviders moduleAlias="performance" appTranslations={{ 'pt-BR': pt }}>
201
+ <BrowserRouter>
202
+ <Routes />
203
+ </BrowserRouter>
204
+ </CoreProviders>
205
+ ```
206
+
207
+ ```tsx
208
+ // ============================================================
209
+ // Módulo SEM Supabase (ex.: Documentos, APIs próprias)
210
+ // ============================================================
211
+ // .env obrigatório:
212
+ // VITE_APP_ENV="DEV" // ou "PROD"
213
+ //
214
+ // Nenhuma env do Supabase é exigida.
215
+ //
216
+ import { CoreProviders } from 'forlogic-core';
217
+ import { BrowserRouter } from 'react-router';
218
+ import pt from '@/locales/pt-BR.json';
219
+
220
+ <CoreProviders
221
+ backend="dotnet"
222
+ moduleAlias="documents"
223
+ appTranslations={{ 'pt-BR': pt }}
224
+ >
225
+ <BrowserRouter>
226
+ <Routes />
227
+ </BrowserRouter>
228
+ </CoreProviders>
229
+ ```
230
+
231
+
232
+ ### O que funciona sem Supabase em `backend="dotnet"`
233
+
234
+ A lib mantém os seguintes recursos funcionando 100% sem nenhuma env var Supabase:
235
+
236
+ - **Logos e favicon** (`assets`, `logoSrc`, `smallLogoSrc`): servidos a partir de bucket público fixo embutido na lib.
237
+ - **Login automático em dev/preview**: `shouldUseDevTokens()` agora exige modo Supabase, então em modo dotnet o `ProtectedRoute` sempre vai para `loginProd()` (OAuth real), mesmo em `localhost`/Lovable preview.
238
+ - **Logoff manual**: `TokenManager.clearAll()` preserva o flag `manual_logout`, garantindo que `logout()` realmente deslogue (sem auto-login no próximo render).
239
+ - **`LegacyKeyBanner`**: oculto automaticamente em modo dotnet.
240
+
241
+ ### Features que continuam exigindo Supabase
242
+
243
+ Mesmo com `backend="dotnet"`, se você importar qualquer um dos módulos abaixo eles vão falhar em runtime sem Supabase configurado:
244
+
245
+ - `forlogic-core/sign`
246
+ - `forlogic-core/audit-trail`
247
+ - `forlogic-core/action-plans`
248
+ - `forlogic-core/leadership`
249
+ - `forlogic-core/places`
250
+ - `EmailService` (do barrel principal)
251
+
252
+ Esses módulos **foram removidos do barrel principal** (breaking change) — importe-os via subpath quando precisar. Use `isSupabaseConfigured()` para checar disponibilidade antes de chamar `getSupabaseClient()`.
253
+
254
+ ## QueryClient default
255
+
256
+ ```ts
257
+ { defaultOptions: { queries: { staleTime: 5 * 60 * 1000, retry: 1 } } }
258
+ ```
@@ -11,7 +11,7 @@ CREATE TABLE [import].[occurrences_categories_staging](
11
11
  [name] [nvarchar](150) COLLATE Latin1_General_CS_AS NOT NULL,
12
12
  [description] [nvarchar](1000) COLLATE Latin1_General_CS_AS NULL,
13
13
  [is_active] [varchar](20) COLLATE Latin1_General_CS_AS NULL,
14
- [id_method] [int] NOT NULL,
14
+ [id_method] [int] NULL,
15
15
  [icon] [varchar](30) COLLATE Latin1_General_CS_AS NULL,
16
16
  [days_causes_analysis] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
17
17
  [days_action_plan_elaboration] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
@@ -85,12 +85,6 @@ BEGIN
85
85
  (ocs.active_cause_analysis IS NOT NULL AND ocs.active_cause_analysis NOT IN ('Sim','Não'))
86
86
  OR (ocs.active_effectiveness_check IS NOT NULL AND ocs.active_effectiveness_check NOT IN ('Sim','Não'))
87
87
  OR (ocs.active_standardization IS NOT NULL AND ocs.active_standardization NOT IN ('Sim','Não'))
88
- OR (ocs.aprove_cause_analysis IS NOT NULL AND ocs.aprove_cause_analysis NOT IN ('Sim','Não'))
89
- OR (ocs.aprove_action_plan_elaboration IS NOT NULL AND ocs.aprove_action_plan_elaboration NOT IN ('Sim','Não'))
90
- OR (ocs.aprove_action_plan_execution IS NOT NULL AND ocs.aprove_action_plan_execution NOT IN ('Sim','Não'))
91
- OR (ocs.aprove_effectiveness_check IS NOT NULL AND ocs.aprove_effectiveness_check NOT IN ('Sim','Não'))
92
- OR (ocs.aprove_standardization IS NOT NULL AND ocs.aprove_standardization NOT IN ('Sim','Não'))
93
- OR (ocs.aprove_evaluation IS NOT NULL AND ocs.aprove_evaluation NOT IN ('Sim','Não'))
94
88
  OR (ocs.all_types_associated IS NOT NULL AND ocs.all_types_associated NOT IN ('Sim','Não'))
95
89
  );
96
90
 
@@ -132,20 +126,25 @@ BEGIN
132
126
  AND ocs.active_standardization = 'Sim'
133
127
  AND (ocs.days_standardization IS NULL OR LTRIM(RTRIM(ocs.days_standardization)) = '');
134
128
 
135
- -- Validação 9: Regra de priorização informada deve existir
129
+ -- Validação 9: Regra de priorização informada deve existir e estar ativa
136
130
  INSERT INTO import.errors (id_batch, row_num, error_msg)
137
- SELECT @id_batch, ocs.row_num, 'Regra de priorização não encontrada'
131
+ SELECT @id_batch, ocs.row_num, 'Regra de priorização não encontrada ou inativa'
138
132
  FROM import.occurrences_categories_staging ocs WITH (NOLOCK)
139
133
  WHERE ocs.id_batch = @id_batch
140
134
  AND ocs.id_rule_prioritization IS NOT NULL
141
135
  AND LTRIM(RTRIM(ocs.id_rule_prioritization)) <> ''
142
136
  AND NOT EXISTS (
143
- SELECT 1 FROM occurrences.rules_prioritization rp WITH (NOLOCK)
144
- -- Correção: Collation explícito aqui também!
145
- WHERE rp.id COLLATE Latin1_General_CS_AS = ocs.id_rule_prioritization
146
- AND rp.id_company COLLATE Latin1_General_CS_AS = ocs.id_company
137
+ SELECT 1 FROM dbo.prioritization_rules_template rp WITH (NOLOCK)
138
+ WHERE rp.id COLLATE Latin1_General_CS_AS = LTRIM(RTRIM(ocs.id_rule_prioritization)) COLLATE Latin1_General_CS_AS
139
+ AND rp.removed = 0
140
+ AND rp.is_active = 1
141
+ AND (
142
+ rp.id_company IS NULL
143
+ OR rp.id_company COLLATE Latin1_General_CS_AS = ocs.id_company COLLATE Latin1_General_CS_AS
144
+ )
147
145
  );
148
146
 
147
+
149
148
  -- INSERÇÃO DOS DADOS VÁLIDOS
150
149
  INSERT INTO occurrences.categories
151
150
  (
@@ -159,7 +158,7 @@ BEGIN
159
158
  )
160
159
  SELECT
161
160
  ocs.id_company,
162
- ISNULL(ocs.id_method, 1) AS id_method,
161
+ 0 AS id_method,
163
162
  ocs.name,
164
163
  NULLIF(ocs.description, '') AS description,
165
164
  NULLIF(ocs.icon, '') AS icon,
@@ -176,12 +175,12 @@ BEGIN
176
175
  CASE WHEN ocs.active_cause_analysis = 'Sim' THEN 1 ELSE 0 END,
177
176
  CASE WHEN ocs.active_effectiveness_check = 'Sim' THEN 1 ELSE 0 END,
178
177
  CASE WHEN ocs.active_standardization = 'Sim' THEN 1 ELSE 0 END,
179
- CASE WHEN ocs.aprove_cause_analysis = 'Sim' THEN 1 ELSE 0 END,
180
- CASE WHEN ocs.aprove_action_plan_elaboration = 'Sim' THEN 1 ELSE 0 END,
181
- CASE WHEN ocs.aprove_action_plan_execution = 'Sim' THEN 1 ELSE 0 END,
182
- CASE WHEN ocs.aprove_effectiveness_check = 'Sim' THEN 1 ELSE 0 END,
183
- CASE WHEN ocs.aprove_standardization = 'Sim' THEN 1 ELSE 0 END,
184
- CASE WHEN ocs.aprove_evaluation = 'Sim' THEN 1 ELSE 0 END,
178
+ 0, -- aprove_cause_analysis
179
+ 0, -- aprove_action_plan_elaboration
180
+ 0, -- aprove_action_plan_execution
181
+ 0, -- aprove_effectiveness_check
182
+ 0, -- aprove_standardization
183
+ 0, -- aprove_evaluation
185
184
  CASE WHEN ocs.all_types_associated = 'Sim' THEN 1 ELSE 0 END,
186
185
  NULLIF(LTRIM(RTRIM(ocs.id_rule_prioritization)), '')
187
186
  FROM import.occurrences_categories_staging ocs WITH (NOLOCK)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forlogic-core",
3
- "version": "2.5.3",
3
+ "version": "3.0.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -134,10 +134,8 @@
134
134
  "i18next-browser-languagedetector": "^8.2.0",
135
135
  "jszip": "^3.10.1",
136
136
  "lucide-react": "^0.553.0",
137
- "next-themes": "^0.3.0",
138
- "react": "^18.3.1",
137
+ "next-themes": "^0.4.6",
139
138
  "react-day-picker": "^9.13.0",
140
- "react-dom": "^18.3.1",
141
139
  "react-hook-form": "^7.61.1",
142
140
  "react-resizable-panels": "^3.0.6",
143
141
  "recharts": "^3.6.0",
@@ -149,8 +147,10 @@
149
147
  },
150
148
  "peerDependencies": {
151
149
  "i18next": "^25.0.0",
150
+ "react": "^19.2.7",
151
+ "react-dom": "^19.2.7",
152
152
  "react-i18next": "^16.0.0",
153
- "react-router-dom": "^7.18.1"
153
+ "react-router": "^8.3.0"
154
154
  },
155
155
  "overrides": {
156
156
  "esbuild": "^0.28.1",
@@ -171,8 +171,8 @@
171
171
  "@tailwindcss/typography": "^0.5.16",
172
172
  "@types/file-saver": "^2.0.7",
173
173
  "@types/node": "^22.16.5",
174
- "@types/react": "^18.3.23",
175
- "@types/react-dom": "^18.3.7",
174
+ "@types/react": "^19.2.18",
175
+ "@types/react-dom": "^19.2.4",
176
176
  "@vitejs/plugin-react-swc": "^3.11.0",
177
177
  "autoprefixer": "^10.4.21",
178
178
  "baseline-browser-mapping": "^2.9.12",
@@ -183,7 +183,9 @@
183
183
  "globals": "^15.15.0",
184
184
  "lovable-tagger": "^1.1.9",
185
185
  "postcss": "^8.5.18",
186
- "react-router-dom": "^7.18.1",
186
+ "react": "^19.2.8",
187
+ "react-dom": "^19.2.8",
188
+ "react-router": "^8.3.0",
187
189
  "rollup": "^4.50.1",
188
190
  "rollup-plugin-copy": "^3.5.0",
189
191
  "rollup-plugin-esbuild": "^6.2.1",