forlogic-core 2.1.4 → 2.2.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 (248) hide show
  1. package/.note/memory/features/import/attachment-idempotency-registry.md +8 -8
  2. package/.note/memory/features/import/attachment-strategy.md +30 -30
  3. package/.note/memory/patterns/admin-i18n-policy.md +20 -20
  4. package/.note/memory/patterns/alias-url-resolution.md +69 -69
  5. package/.note/memory/patterns/doc-sync-rule.md +35 -35
  6. package/.note/memory/patterns/documentation-standard.md +17 -17
  7. package/.note/memory/patterns/dynamic-supabase-config.md +4 -4
  8. package/.note/memory/patterns/environment-detection-logic.md +35 -35
  9. package/.note/memory/patterns/i18n-architecture.md +3 -3
  10. package/README.md +120 -68
  11. package/dist/action-plans/components/ActionPlanAttachmentsTab.d.ts +3 -0
  12. package/dist/action-plans/components/ActionPlanCommentsTab.d.ts +3 -0
  13. package/dist/action-plans/components/ActionPlanCostTab.d.ts +5 -0
  14. package/dist/action-plans/components/ActionPlanGeneralTab.d.ts +3 -0
  15. package/dist/action-plans/components/ActionPlanHistoryTab.d.ts +3 -0
  16. package/dist/action-plans/components/ActionPlanPredecessorsTab.d.ts +5 -0
  17. package/dist/action-plans/components/ActionPlanProgressDialog.d.ts +3 -0
  18. package/dist/action-plans/components/ActionPlanProgressTab.d.ts +5 -0
  19. package/dist/action-plans/components/ActionPlanStatusBadge.d.ts +9 -2
  20. package/dist/action-plans/constants.d.ts +24 -0
  21. package/dist/action-plans/hooks/useActionPlan.d.ts +5 -0
  22. package/dist/action-plans/hooks/useActionPlanProgress.d.ts +5 -0
  23. package/dist/action-plans/types.d.ts +60 -0
  24. package/dist/action-plans/utils/formatTime.d.ts +9 -0
  25. package/dist/audit-trail/components/AuditTrailDetails.d.ts +10 -0
  26. package/dist/audit-trail/components/AuditTrailFilter.d.ts +10 -0
  27. package/dist/audit-trail/components/AuditTrailPage.d.ts +10 -0
  28. package/dist/audit-trail/types.d.ts +58 -0
  29. package/dist/audit-trail/utils.d.ts +18 -2
  30. package/dist/auth/components/EditProfileDialog.d.ts +1 -0
  31. package/dist/auth/components/ProtectedRoute.d.ts +5 -0
  32. package/dist/auth/contexts/AuthContext.d.ts +5 -0
  33. package/dist/auth/pages/CallbackPage.d.ts +5 -0
  34. package/dist/auth/services/AuthService.d.ts +5 -0
  35. package/dist/auth/services/TokenManager.d.ts +5 -0
  36. package/dist/auth/services/TokenService.d.ts +10 -0
  37. package/dist/auth/utils/ErrorInterceptor.d.ts +5 -0
  38. package/dist/components/dashboards/dashboard-form.d.ts +15 -0
  39. package/dist/components/dashboards/dashboard-general-view.d.ts +15 -0
  40. package/dist/components/dashboards/dashboard-grid.d.ts +25 -0
  41. package/dist/components/dashboards/dashboard-list.d.ts +10 -0
  42. package/dist/components/dashboards/dashboard-panel-renderer.d.ts +10 -0
  43. package/dist/components/dashboards/dashboard-view.d.ts +10 -0
  44. package/dist/components/dashboards/helpers.d.ts +44 -5
  45. package/dist/components/dashboards/panels/burndown-panel.d.ts +15 -0
  46. package/dist/components/dashboards/panels/cartesian-panel.d.ts +20 -0
  47. package/dist/components/dashboards/panels/list-panel.d.ts +15 -0
  48. package/dist/components/dashboards/panels/matrix-risk-panel.d.ts +25 -0
  49. package/dist/components/dashboards/panels/numeric-panel.d.ts +10 -0
  50. package/dist/components/dashboards/panels/panel-error.d.ts +10 -0
  51. package/dist/components/dashboards/panels/panel-header.d.ts +10 -0
  52. package/dist/components/dashboards/panels/panel-loader.d.ts +10 -0
  53. package/dist/components/dashboards/panels/panel-no-data.d.ts +10 -0
  54. package/dist/components/dashboards/panels/panel-unavailable.d.ts +10 -0
  55. package/dist/components/dashboards/panels/pareto-panel.d.ts +10 -0
  56. package/dist/components/dashboards/panels/performance-panel.d.ts +15 -0
  57. package/dist/components/dashboards/panels/pie-panel.d.ts +10 -0
  58. package/dist/components/dashboards/panels/text-panel.d.ts +10 -0
  59. package/dist/components/dashboards/types.d.ts +230 -0
  60. package/dist/components/modules/AccessDeniedDialog.d.ts +3 -1
  61. package/dist/components/modules/ModuleAccessGuard.d.ts +3 -1
  62. package/dist/components/modules/ModulesContent.d.ts +3 -1
  63. package/dist/components/modules/ModulesDialog.d.ts +1 -1
  64. package/dist/components/modules/ModulesFooterCards.d.ts +3 -1
  65. package/dist/components/modules/types.d.ts +2 -0
  66. package/dist/components/ui/accordion.d.ts +35 -0
  67. package/dist/components/ui/action-button.d.ts +5 -0
  68. package/dist/components/ui/alert-dialog.d.ts +82 -0
  69. package/dist/components/ui/alert.d.ts +32 -0
  70. package/dist/components/ui/avatar.d.ts +30 -0
  71. package/dist/components/ui/badge.d.ts +32 -0
  72. package/dist/components/ui/breadcrumb.d.ts +54 -0
  73. package/dist/components/ui/button-group.d.ts +15 -0
  74. package/dist/components/ui/button.d.ts +55 -0
  75. package/dist/components/ui/calendar.d.ts +16 -0
  76. package/dist/components/ui/card.d.ts +49 -0
  77. package/dist/components/ui/chart.d.ts +35 -0
  78. package/dist/components/ui/checkbox.d.ts +11 -0
  79. package/dist/components/ui/collapsible.d.ts +15 -0
  80. package/dist/components/ui/color-picker.d.ts +5 -0
  81. package/dist/components/ui/combo-tree.d.ts +23 -0
  82. package/dist/components/ui/combobox.d.ts +28 -0
  83. package/dist/components/ui/command.d.ts +66 -0
  84. package/dist/components/ui/context-menu.d.ts +95 -0
  85. package/dist/components/ui/date-picker.d.ts +10 -0
  86. package/dist/components/ui/dialog-wizard.d.ts +22 -4
  87. package/dist/components/ui/dialog.d.ts +181 -0
  88. package/dist/components/ui/drawer.d.ts +72 -0
  89. package/dist/components/ui/dropdown-menu.d.ts +153 -0
  90. package/dist/components/ui/electronic-signature-dialog.d.ts +10 -0
  91. package/dist/components/ui/export-dialog.d.ts +20 -0
  92. package/dist/components/ui/form.d.ts +96 -0
  93. package/dist/components/ui/hover-card.d.ts +15 -0
  94. package/dist/components/ui/icon-picker.d.ts +5 -0
  95. package/dist/components/ui/iframe-dialog.d.ts +10 -0
  96. package/dist/components/ui/input-group.d.ts +16 -0
  97. package/dist/components/ui/input.d.ts +5 -0
  98. package/dist/components/ui/menubar.d.ts +80 -0
  99. package/dist/components/ui/multiselect-permissions.d.ts +25 -0
  100. package/dist/components/ui/navigation-menu.d.ts +45 -0
  101. package/dist/components/ui/onboarding-dialog.d.ts +15 -0
  102. package/dist/components/ui/online-editor-dialog.d.ts +10 -0
  103. package/dist/components/ui/pagination.d.ts +53 -0
  104. package/dist/components/ui/popover.d.ts +8 -0
  105. package/dist/components/ui/radio-group.d.ts +3 -0
  106. package/dist/components/ui/report-request-list.d.ts +20 -0
  107. package/dist/components/ui/resizable.d.ts +15 -0
  108. package/dist/components/ui/rich-text-editor.d.ts +13 -0
  109. package/dist/components/ui/scroll-area.d.ts +3 -0
  110. package/dist/components/ui/select.d.ts +71 -0
  111. package/dist/components/ui/separator.d.ts +13 -0
  112. package/dist/components/ui/sheet.d.ts +76 -0
  113. package/dist/components/ui/sidebar.d.ts +203 -0
  114. package/dist/components/ui/skeleton-variants.d.ts +25 -0
  115. package/dist/components/ui/skeleton.d.ts +12 -0
  116. package/dist/components/ui/slider.d.ts +5 -0
  117. package/dist/components/ui/sonner.d.ts +5 -0
  118. package/dist/components/ui/spinner.d.ts +5 -0
  119. package/dist/components/ui/split-button.d.ts +6 -0
  120. package/dist/components/ui/stack.d.ts +5 -0
  121. package/dist/components/ui/status-badge.d.ts +52 -0
  122. package/dist/components/ui/step-selector.d.ts +5 -0
  123. package/dist/components/ui/stimulsoft-viewer.d.ts +8 -0
  124. package/dist/components/ui/switch.d.ts +21 -0
  125. package/dist/components/ui/tab-page-layout.d.ts +33 -0
  126. package/dist/components/ui/table-resize-handle.d.ts +10 -3
  127. package/dist/components/ui/table.d.ts +102 -0
  128. package/dist/components/ui/tabs.d.ts +59 -0
  129. package/dist/components/ui/terms-of-use-dialog.d.ts +50 -4
  130. package/dist/components/ui/textarea.d.ts +27 -0
  131. package/dist/components/ui/timepicker.d.ts +23 -0
  132. package/dist/components/ui/toggle-group.d.ts +25 -0
  133. package/dist/components/ui/toggle.d.ts +21 -0
  134. package/dist/components/ui/tooltip.d.ts +48 -0
  135. package/dist/components/ui/truncated-cell.d.ts +13 -0
  136. package/dist/components/ui/typography.d.ts +119 -0
  137. package/dist/components/ui/updates-notification.d.ts +33 -0
  138. package/dist/components/ui/users-groups-selector.d.ts +43 -0
  139. package/dist/components/ui/viewer-dialog.d.ts +107 -0
  140. package/dist/crud/components/ActionMenuItems.d.ts +5 -0
  141. package/dist/crud/components/BaseForm.d.ts +46 -0
  142. package/dist/crud/components/ColumnSettingsPopover.d.ts +10 -0
  143. package/dist/crud/components/CrudActionBar.d.ts +20 -0
  144. package/dist/crud/components/CrudGrid.d.ts +10 -0
  145. package/dist/crud/components/CrudPagination.d.ts +5 -0
  146. package/dist/crud/components/CrudTable.d.ts +5 -0
  147. package/dist/crud/components/TableRowActions.d.ts +5 -0
  148. package/dist/crud/createCrudPage.d.ts +41 -8
  149. package/dist/crud/generateCrudConfig.d.ts +13 -8
  150. package/dist/crud/hooks/useBaseForm.d.ts +39 -0
  151. package/dist/crud/hooks/useColumnManager.d.ts +25 -0
  152. package/dist/crud/hooks/useCrud.d.ts +35 -0
  153. package/dist/crud/primitives/ActionMenu.d.ts +41 -0
  154. package/dist/crud/primitives/FilterBar.d.ts +45 -0
  155. package/dist/crud/primitives/Pagination.d.ts +5 -0
  156. package/dist/crud/primitives/Table.d.ts +6 -1
  157. package/dist/crud/primitives/TreeTable.d.ts +5 -0
  158. package/dist/crud/primitives/types.d.ts +63 -0
  159. package/dist/crud/utils/routingHelpers.d.ts +11 -0
  160. package/dist/custom-form-fields/components/CustomFormFields.d.ts +3 -0
  161. package/dist/custom-form-fields/fields/FormDateField.d.ts +3 -0
  162. package/dist/custom-form-fields/fields/FormMultiSelectionField.d.ts +3 -0
  163. package/dist/custom-form-fields/fields/FormNumericField.d.ts +3 -0
  164. package/dist/custom-form-fields/fields/FormQuestionsField.d.ts +3 -0
  165. package/dist/custom-form-fields/fields/FormSingleSelectionField.d.ts +3 -0
  166. package/dist/custom-form-fields/fields/FormTextField.d.ts +3 -0
  167. package/dist/custom-form-fields/fields/FormTimeField.d.ts +3 -0
  168. package/dist/custom-form-fields/fields/FormUrlField.d.ts +3 -0
  169. package/dist/custom-form-fields/fields/ReadOnlyTextField.d.ts +3 -0
  170. package/dist/custom-form-fields/types.d.ts +84 -21
  171. package/dist/exports/crud.d.ts +5 -0
  172. package/dist/exports/integrations.d.ts +1 -0
  173. package/dist/exports/ui.d.ts +1 -0
  174. package/dist/file-upload/components/SingleFileUpload.d.ts +59 -0
  175. package/dist/file-upload/types.d.ts +15 -0
  176. package/dist/file-upload/utils/formatBytes.d.ts +5 -0
  177. package/dist/file-upload/utils/getFileExtension.d.ts +5 -0
  178. package/dist/hooks/useColumnResize.d.ts +24 -0
  179. package/dist/hooks/useRowResize.d.ts +18 -0
  180. package/dist/hooks/useSidebarResize.d.ts +18 -0
  181. package/dist/hooks/useUpdatesNotification.d.ts +16 -0
  182. package/dist/index.css +1 -1
  183. package/dist/index.css.map +1 -1
  184. package/dist/index.esm.js +1 -1
  185. package/dist/index.js +1 -1
  186. package/dist/integrations/clarity/clarityTracking.d.ts +31 -0
  187. package/dist/integrations/clarity/index.d.ts +3 -0
  188. package/dist/integrations/clarity/types.d.ts +46 -0
  189. package/dist/integrations/clarity/useClarity.d.ts +34 -0
  190. package/dist/integrations/index.d.ts +5 -0
  191. package/dist/providers/CoreProviders.d.ts +16 -1
  192. package/dist/qualiex/components/QualiexUserField.d.ts +8 -0
  193. package/dist/qualiex/hooks/useQualiexUsers.d.ts +16 -26
  194. package/dist/qualiex/services/qualiexApi.d.ts +38 -2
  195. package/dist/qualiex/utils/QualiexErrorInterceptor.d.ts +5 -0
  196. package/dist/supabase/SupabaseSingleton.d.ts +34 -0
  197. package/dist/types.d.ts +51 -2
  198. package/dist/utils/color.d.ts +26 -0
  199. package/dist/utils/index.d.ts +1 -0
  200. package/dist/vite/index.esm.js +4 -1
  201. package/dist/vite/index.js +4 -1
  202. package/docs/PUBLISH.md +168 -0
  203. package/docs/STORAGE_BUCKETS.md +384 -0
  204. package/docs/WORKSPACE_KNOWLEDGE.md +120 -119
  205. package/docs/design-system/README.md +1 -1
  206. package/docs/design-system/buttons-actions.md +130 -130
  207. package/docs/design-system/charts-dashboards.md +340 -301
  208. package/docs/design-system/crud.md +174 -114
  209. package/docs/design-system/data-display.md +108 -103
  210. package/docs/design-system/dialogs.md +212 -212
  211. package/docs/design-system/domain.md +317 -317
  212. package/docs/design-system/examples.md +275 -275
  213. package/docs/design-system/foundation.md +1 -1
  214. package/docs/design-system/inputs.md +131 -131
  215. package/docs/design-system/layout.md +202 -154
  216. package/docs/design-system/navigation.md +271 -325
  217. package/docs/design-system/notifications-feedback.md +34 -34
  218. package/docs/design-system/patterns/README.md +53 -53
  219. package/docs/design-system/patterns/action-button.md +22 -22
  220. package/docs/design-system/patterns/alertdialog-deletion.md +46 -46
  221. package/docs/design-system/patterns/baseform-custom-fields.md +59 -59
  222. package/docs/design-system/patterns/baseform-usage.md +42 -42
  223. package/docs/design-system/patterns/body-content-scroll.md +56 -56
  224. package/docs/design-system/patterns/combo-tree.md +23 -23
  225. package/docs/design-system/patterns/components-registry.md +17 -17
  226. package/docs/design-system/patterns/core-providers.md +41 -39
  227. package/docs/design-system/patterns/crud-bulk-actions.md +12 -12
  228. package/docs/design-system/patterns/crud-config-props.md +16 -16
  229. package/docs/design-system/patterns/crud-defaults.md +17 -17
  230. package/docs/design-system/patterns/crud-toolbar.md +28 -28
  231. package/docs/design-system/patterns/delete-confirmation.md +40 -40
  232. package/docs/design-system/patterns/dialog-body-scroll.md +26 -26
  233. package/docs/design-system/patterns/dialog-structure.md +32 -32
  234. package/docs/design-system/patterns/dialog-variants.md +41 -41
  235. package/docs/design-system/patterns/feature-flags.md +24 -20
  236. package/docs/design-system/patterns/header-metadata.md +57 -57
  237. package/docs/design-system/patterns/i18n-setup.md +117 -117
  238. package/docs/design-system/patterns/pagination.md +27 -27
  239. package/docs/design-system/patterns/single-scroll.md +39 -39
  240. package/docs/design-system/patterns/vite-tailwind-setup.md +48 -48
  241. package/docs/design-system/platform.md +18 -18
  242. package/docs/design-system/selectors.md +240 -236
  243. package/docs/design-system/tables-grids.md +95 -38
  244. package/package.json +150 -144
  245. package/dist/README.md +0 -1079
  246. package/dist/bin/bootstrap.js +0 -40
  247. package/dist/bin/pull-docs.js +0 -186
  248. package/dist/docs/KNOWLEDGE.md +0 -109
@@ -1,8 +1,8 @@
1
- # Memory: features/import/attachment-idempotency-registry
2
- Updated: now
3
-
4
- ## REMOVIDO
5
-
6
- O controle de idempotência via tabela `common.imports_file_registry` foi removido para simplificar o fluxo de importação de anexos. Agora todo arquivo válido (>0 bytes) é enviado diretamente ao Azure Blob Storage sem verificar se já existe no registry. As funções `lookupExistingFiles`, `registerUploadedFiles` e o campo `newFiles` do `UploadResult` foram removidos de `attachmentUploadService.ts`.
7
-
8
- A tabela `common.imports_file_registry` no Supabase pode ser removida manualmente se desejado — a aplicação não a consulta mais.
1
+ # Memory: features/import/attachment-idempotency-registry
2
+ Updated: now
3
+
4
+ ## REMOVIDO
5
+
6
+ O controle de idempotência via tabela `common.imports_file_registry` foi removido para simplificar o fluxo de importação de anexos. Agora todo arquivo válido (>0 bytes) é enviado diretamente ao Azure Blob Storage sem verificar se já existe no registry. As funções `lookupExistingFiles`, `registerUploadedFiles` e o campo `newFiles` do `UploadResult` foram removidos de `attachmentUploadService.ts`.
7
+
8
+ A tabela `common.imports_file_registry` no Supabase pode ser removida manualmente se desejado — a aplicação não a consulta mais.
@@ -1,30 +1,30 @@
1
- # Memory: features/import/attachment-strategy
2
- Updated: now
3
-
4
- O sistema de anexos usa upload direto ao Azure Blob Storage (sem staging). O .zip contém pastas nomeadas pelo código do registro (ex: `OC-001/foto.pdf`). Cada arquivo recebe um `id_file_revision` de 8 caracteres alfanuméricos (`crypto.randomUUID().slice(0,8)`) gerado no front-end. O arquivo é enviado ao container `un{id_company}` com nome `{id_file_revision}.{ext}`. Esse mesmo ID é incluído no CSV como coluna `id_file_revision` para que a API grave no banco com a mesma referência.
5
-
6
- ## Idempotência via `common.imports_file_registry`
7
-
8
- Tabela Supabase com PK `CHAR(8)` (o próprio `id_file_revision`) e constraint `UNIQUE(alias, code, file_name)`:
9
- - Se `(alias, code, file_name)` já existe com **mesmo tamanho** → reutiliza `id_file_revision` e `blob_url`, **não faz upload**
10
- - Se existe com **tamanho diferente** → erro de conflito
11
- - Se não existe → gera novo ID, faz upload, registra no registry **somente após sucesso da API**
12
- - Arquivos com 0 bytes são rejeitados imediatamente
13
-
14
- ## Fluxo de consistência
15
-
16
- 1. Upload para Azure (novos arquivos)
17
- 2. Envio do CSV para API staging
18
- 3. **Se API sucesso** → `registerUploadedFiles()` grava no registry
19
- 4. **Se API falhar** → registry NÃO é gravado, próxima tentativa refaz upload
20
-
21
- ## Templates de anexo (attachment-only)
22
-
23
- Quando `import_target === 'attachments'` ou todos os campos ativos são `file`/`file_metadata`, o sistema detecta automaticamente. Nesse modo:
24
- - O .zip **não precisa conter xlsx** — apenas pastas com arquivos
25
- - O código é extraído do **diretório pai imediato** do arquivo
26
- - As linhas do CSV são geradas automaticamente a partir dos metadados
27
- - Função `executeAttachmentOnlyImport` orquestra o fluxo completo
28
- - `buildRowsFromAttachments` gera as linhas
29
- - `extractZipAttachmentsOnly` extrai sem exigir xlsx
30
- - `isAttachmentOnlyTemplate` detecta o tipo
1
+ # Memory: features/import/attachment-strategy
2
+ Updated: now
3
+
4
+ O sistema de anexos usa upload direto ao Azure Blob Storage (sem staging). O .zip contém pastas nomeadas pelo código do registro (ex: `OC-001/foto.pdf`). Cada arquivo recebe um `id_file_revision` de 8 caracteres alfanuméricos (`crypto.randomUUID().slice(0,8)`) gerado no front-end. O arquivo é enviado ao container `un{id_company}` com nome `{id_file_revision}.{ext}`. Esse mesmo ID é incluído no CSV como coluna `id_file_revision` para que a API grave no banco com a mesma referência.
5
+
6
+ ## Idempotência via `common.imports_file_registry`
7
+
8
+ Tabela Supabase com PK `CHAR(8)` (o próprio `id_file_revision`) e constraint `UNIQUE(alias, code, file_name)`:
9
+ - Se `(alias, code, file_name)` já existe com **mesmo tamanho** → reutiliza `id_file_revision` e `blob_url`, **não faz upload**
10
+ - Se existe com **tamanho diferente** → erro de conflito
11
+ - Se não existe → gera novo ID, faz upload, registra no registry **somente após sucesso da API**
12
+ - Arquivos com 0 bytes são rejeitados imediatamente
13
+
14
+ ## Fluxo de consistência
15
+
16
+ 1. Upload para Azure (novos arquivos)
17
+ 2. Envio do CSV para API staging
18
+ 3. **Se API sucesso** → `registerUploadedFiles()` grava no registry
19
+ 4. **Se API falhar** → registry NÃO é gravado, próxima tentativa refaz upload
20
+
21
+ ## Templates de anexo (attachment-only)
22
+
23
+ Quando `import_target === 'attachments'` ou todos os campos ativos são `file`/`file_metadata`, o sistema detecta automaticamente. Nesse modo:
24
+ - O .zip **não precisa conter xlsx** — apenas pastas com arquivos
25
+ - O código é extraído do **diretório pai imediato** do arquivo
26
+ - As linhas do CSV são geradas automaticamente a partir dos metadados
27
+ - Função `executeAttachmentOnlyImport` orquestra o fluxo completo
28
+ - `buildRowsFromAttachments` gera as linhas
29
+ - `extractZipAttachmentsOnly` extrai sem exigir xlsx
30
+ - `isAttachmentOnlyTemplate` detecta o tipo
@@ -1,20 +1,20 @@
1
- # Política de Idioma — Admin, Design System e Lib
2
-
3
- ## Decisão
4
-
5
- | Camada | Idioma | i18n (useTranslation) |
6
- |--------|--------|-----------------------|
7
- | **Projeto Admin (`src/`)** | Português (Brasil) — hardcoded | ❌ Não usa |
8
- | **Design System (`src/design-system/`)** | Português (Brasil) — hardcoded | ❌ Não usa |
9
- | **Lib (`lib/`)** | Multi-idioma (pt-BR, en-US, es-ES) | ✅ Usa `t()` + JSONs |
10
-
11
- ## Regras
12
-
13
- 1. **Nenhum arquivo em `src/`** deve importar `useTranslation` ou usar `t()` — todos os textos são strings fixas em português.
14
- 2. **A documentação interativa do Design System** (páginas `*Doc.tsx`, sidebar, home) é escrita diretamente em português, sem chaves de tradução.
15
- 3. **A lib (`lib/`)** mantém o sistema completo de i18n com namespaces, JSONs por idioma e integração com Tolgee, pois é consumida por projetos que precisam de múltiplos idiomas.
16
- 4. **Arquivos de tradução da lib** (`lib/i18n/locales/`) contêm apenas chaves usadas pelos componentes internos da lib.
17
-
18
- ## Contexto
19
-
20
- O Admin é um painel interno da Forlogic usado exclusivamente em português. Manter i18n no Admin adiciona complexidade sem benefício. A lib, por outro lado, é distribuída para projetos consumidores que operam em múltiplos idiomas.
1
+ # Política de Idioma — Admin, Design System e Lib
2
+
3
+ ## Decisão
4
+
5
+ | Camada | Idioma | i18n (useTranslation) |
6
+ |--------|--------|-----------------------|
7
+ | **Projeto Admin (`src/`)** | Português (Brasil) — hardcoded | ❌ Não usa |
8
+ | **Design System (`src/design-system/`)** | Português (Brasil) — hardcoded | ❌ Não usa |
9
+ | **Lib (`lib/`)** | Multi-idioma (pt-BR, en-US, es-ES) | ✅ Usa `t()` + JSONs |
10
+
11
+ ## Regras
12
+
13
+ 1. **Nenhum arquivo em `src/`** deve importar `useTranslation` ou usar `t()` — todos os textos são strings fixas em português.
14
+ 2. **A documentação interativa do Design System** (páginas `*Doc.tsx`, sidebar, home) é escrita diretamente em português, sem chaves de tradução.
15
+ 3. **A lib (`lib/`)** mantém o sistema completo de i18n com namespaces, JSONs por idioma e integração com Tolgee, pois é consumida por projetos que precisam de múltiplos idiomas.
16
+ 4. **Arquivos de tradução da lib** (`lib/i18n/locales/`) contêm apenas chaves usadas pelos componentes internos da lib.
17
+
18
+ ## Contexto
19
+
20
+ O Admin é um painel interno da Forlogic usado exclusivamente em português. Manter i18n no Admin adiciona complexidade sem benefício. A lib, por outro lado, é distribuída para projetos consumidores que operam em múltiplos idiomas.
@@ -1,69 +1,69 @@
1
- # Alias via URL — Resolução de Unidade por Rota
2
-
3
- ## Padrão
4
-
5
- O alias da unidade ativa deve **sempre** estar presente na URL como primeiro segmento de rota (`/:alias/...`). A **URL é a fonte única de verdade** para o alias ativo.
6
-
7
- ## Arquitetura (URL como Source of Truth)
8
-
9
- ```
10
- Header/Seletor → navigate(/{novoAlias}/...) → URL muda → AliasRouteGuard → switchUnit()
11
- ```
12
-
13
- - **Header/UI**: Apenas navega (muda a URL). Nunca chama `switchUnit` diretamente.
14
- - **AliasRouteGuard**: Detecta que `urlAlias !== activeAlias` e chama `switchUnit()` para sincronizar a sessão.
15
- - **Resultado**: Um único writer (guard) controla a sessão, eliminando race conditions.
16
-
17
- ## Componentes
18
-
19
- ### `useAliasFromUrl(options?)`
20
- Hook que extrai o alias do param de rota e valida contra `companies` do `useAuth()`.
21
-
22
- Retorna: `{ urlAlias, isAliasMismatch, isValidAlias, isMissing, matchedCompany }`
23
-
24
- ### `AliasRouteGuard`
25
- Wrapper de rota com **auto-detect de modo**:
26
-
27
- - **Modo URL** (`:alias` presente na rota): comportamento padrão com 1 effect de decisão
28
- - **Modo Legado** (sem `:alias` na rota): passthrough transparente, sem redirects
29
-
30
- | Cenário (Modo URL) | Ação |
31
- |---------|------|
32
- | Alias ausente na URL | Redireciona para `/{aliasAtivo}/{path}` |
33
- | Alias inválido | Redireciona para `/{aliasAtivo}/{path}` |
34
- | Alias válido e diferente do ativo | Chama `switchUnit()` |
35
- | Alias correto | Renderiza children |
36
-
37
- Proteção de concorrência: `switchingRef` evita chamadas duplicadas no mesmo ciclo.
38
-
39
- ### `AppHeader` (mudança de unidade)
40
-
41
- O header usa `navigate()` para trocar o segmento de alias na URL:
42
-
43
- ```tsx
44
- const handleUnitChangeNavigate = (company) => {
45
- const segments = pathname.split('/');
46
- const aliasIndex = segments.indexOf(alias);
47
- segments[aliasIndex] = company.alias;
48
- navigate(segments.join('/') + search + hash);
49
- };
50
-
51
- <UserInfo onUnitChange={handleUnitChangeNavigate} />
52
- ```
53
-
54
- ## Uso nos Consumidores
55
-
56
- ```tsx
57
- <Route element={<ProtectedRoute><AliasRouteGuard><Outlet /></AliasRouteGuard></ProtectedRoute>}>
58
- <Route path="/:alias/documents" element={<DocumentsPage />} />
59
- <Route path="/:alias/documents/:id" element={<DocumentDetailPage />} />
60
- </Route>
61
- ```
62
-
63
- ## Regras
64
- - Guard só age após `isLoading=false && isAuthenticated=true`
65
- - Usa `replace: true` para evitar poluir o histórico
66
- - Se `switchUnit` falha, mantém alias atual (sem loop)
67
- - `switchUnit` já faz `queryClient.clear()` — cache é limpo automaticamente
68
- - Navegação inter-módulos já usa `{alias}` nas URLs (`modulesData.ts`)
69
- - **Header/seletor NUNCA chama switchUnit diretamente** — apenas navega
1
+ # Alias via URL — Resolução de Unidade por Rota
2
+
3
+ ## Padrão
4
+
5
+ O alias da unidade ativa deve **sempre** estar presente na URL como primeiro segmento de rota (`/:alias/...`). A **URL é a fonte única de verdade** para o alias ativo.
6
+
7
+ ## Arquitetura (URL como Source of Truth)
8
+
9
+ ```
10
+ Header/Seletor → navigate(/{novoAlias}/...) → URL muda → AliasRouteGuard → switchUnit()
11
+ ```
12
+
13
+ - **Header/UI**: Apenas navega (muda a URL). Nunca chama `switchUnit` diretamente.
14
+ - **AliasRouteGuard**: Detecta que `urlAlias !== activeAlias` e chama `switchUnit()` para sincronizar a sessão.
15
+ - **Resultado**: Um único writer (guard) controla a sessão, eliminando race conditions.
16
+
17
+ ## Componentes
18
+
19
+ ### `useAliasFromUrl(options?)`
20
+ Hook que extrai o alias do param de rota e valida contra `companies` do `useAuth()`.
21
+
22
+ Retorna: `{ urlAlias, isAliasMismatch, isValidAlias, isMissing, matchedCompany }`
23
+
24
+ ### `AliasRouteGuard`
25
+ Wrapper de rota com **auto-detect de modo**:
26
+
27
+ - **Modo URL** (`:alias` presente na rota): comportamento padrão com 1 effect de decisão
28
+ - **Modo Legado** (sem `:alias` na rota): passthrough transparente, sem redirects
29
+
30
+ | Cenário (Modo URL) | Ação |
31
+ |---------|------|
32
+ | Alias ausente na URL | Redireciona para `/{aliasAtivo}/{path}` |
33
+ | Alias inválido | Redireciona para `/{aliasAtivo}/{path}` |
34
+ | Alias válido e diferente do ativo | Chama `switchUnit()` |
35
+ | Alias correto | Renderiza children |
36
+
37
+ Proteção de concorrência: `switchingRef` evita chamadas duplicadas no mesmo ciclo.
38
+
39
+ ### `AppHeader` (mudança de unidade)
40
+
41
+ O header usa `navigate()` para trocar o segmento de alias na URL:
42
+
43
+ ```tsx
44
+ const handleUnitChangeNavigate = (company) => {
45
+ const segments = pathname.split('/');
46
+ const aliasIndex = segments.indexOf(alias);
47
+ segments[aliasIndex] = company.alias;
48
+ navigate(segments.join('/') + search + hash);
49
+ };
50
+
51
+ <UserInfo onUnitChange={handleUnitChangeNavigate} />
52
+ ```
53
+
54
+ ## Uso nos Consumidores
55
+
56
+ ```tsx
57
+ <Route element={<ProtectedRoute><AliasRouteGuard><Outlet /></AliasRouteGuard></ProtectedRoute>}>
58
+ <Route path="/:alias/documents" element={<DocumentsPage />} />
59
+ <Route path="/:alias/documents/:id" element={<DocumentDetailPage />} />
60
+ </Route>
61
+ ```
62
+
63
+ ## Regras
64
+ - Guard só age após `isLoading=false && isAuthenticated=true`
65
+ - Usa `replace: true` para evitar poluir o histórico
66
+ - Se `switchUnit` falha, mantém alias atual (sem loop)
67
+ - `switchUnit` já faz `queryClient.clear()` — cache é limpo automaticamente
68
+ - Navegação inter-módulos já usa `{alias}` nas URLs (`modulesData.ts`)
69
+ - **Header/seletor NUNCA chama switchUnit diretamente** — apenas navega
@@ -1,35 +1,35 @@
1
- # Regra: Sincronização Automática de Documentação
2
-
3
- ## Gatilho
4
-
5
- Sempre que modificar qualquer arquivo em `lib/`, verificar se existe documentação correspondente em `src/design-system/docs/`.
6
-
7
- **Esta regra é obrigatória e deve ser aplicada em toda alteração de componente, sem exceção.**
8
-
9
- ## Ações obrigatórias
10
-
11
- ### 1. Componente/hook existente com doc existente
12
- - Atualizar props, exemplos, hierarquias e descrições no `*Doc.tsx` correspondente para refletir a mudança
13
- - Atualizar previews interativos para que reflitam o comportamento atual do componente
14
-
15
- ### 2. Componente/hook novo sem doc
16
- - Criar `*Doc.tsx` usando `ComponentDocTemplate` (com prop `usage` obrigatória)
17
- - Registrar no `src/design-system/config/docRegistry.ts` (lazy import)
18
- - Registrar no `src/design-system/config/sections.ts` (sidebar + breadcrumb)
19
-
20
- ### 3. Mudanças arquiteturais
21
- - Atualizar `docs/KNOWLEDGE.md` se afetar regras, mapa de módulos ou convenções
22
- - Atualizar `.note/memory/` se afetar padrões documentados
23
-
24
- ## Mapeamento de referência
25
-
26
- ```
27
- lib/components/ui/<comp>.tsx → src/design-system/docs/components/<Comp>Doc.tsx
28
- lib/crud/components/<comp>.tsx → src/design-system/docs/components/crud/<Comp>Doc.tsx
29
- lib/contexts/<Context>.tsx → src/design-system/docs/ContextsDoc.tsx
30
- lib/hooks/<hook>.ts → src/design-system/docs/HooksDoc.tsx
31
- lib/services/<Service>.ts → src/design-system/docs/ServicesDoc.tsx
32
- lib/components/layout/<comp>.tsx → src/design-system/docs/components/layout/<Comp>Doc.tsx
33
- ```
34
-
35
- Consultar `.note/memory/patterns/components-registry.md` para componentes agrupados sob uma única doc.
1
+ # Regra: Sincronização Automática de Documentação
2
+
3
+ ## Gatilho
4
+
5
+ Sempre que modificar qualquer arquivo em `lib/`, verificar se existe documentação correspondente em `src/design-system/docs/`.
6
+
7
+ **Esta regra é obrigatória e deve ser aplicada em toda alteração de componente, sem exceção.**
8
+
9
+ ## Ações obrigatórias
10
+
11
+ ### 1. Componente/hook existente com doc existente
12
+ - Atualizar props, exemplos, hierarquias e descrições no `*Doc.tsx` correspondente para refletir a mudança
13
+ - Atualizar previews interativos para que reflitam o comportamento atual do componente
14
+
15
+ ### 2. Componente/hook novo sem doc
16
+ - Criar `*Doc.tsx` usando `ComponentDocTemplate` (com prop `usage` obrigatória)
17
+ - Registrar no `src/design-system/config/docRegistry.ts` (lazy import)
18
+ - Registrar no `src/design-system/config/sections.ts` (sidebar + breadcrumb)
19
+
20
+ ### 3. Mudanças arquiteturais
21
+ - Atualizar `docs/KNOWLEDGE.md` se afetar regras, mapa de módulos ou convenções
22
+ - Atualizar `.note/memory/` se afetar padrões documentados
23
+
24
+ ## Mapeamento de referência
25
+
26
+ ```
27
+ lib/components/ui/<comp>.tsx → src/design-system/docs/components/<Comp>Doc.tsx
28
+ lib/crud/components/<comp>.tsx → src/design-system/docs/components/crud/<Comp>Doc.tsx
29
+ lib/contexts/<Context>.tsx → src/design-system/docs/ContextsDoc.tsx
30
+ lib/hooks/<hook>.ts → src/design-system/docs/HooksDoc.tsx
31
+ lib/services/<Service>.ts → src/design-system/docs/ServicesDoc.tsx
32
+ lib/components/layout/<comp>.tsx → src/design-system/docs/components/layout/<Comp>Doc.tsx
33
+ ```
34
+
35
+ Consultar `.note/memory/patterns/components-registry.md` para componentes agrupados sob uma única doc.
@@ -1,17 +1,17 @@
1
- # Design System Documentation Standard
2
-
3
- ## Fonte de verdade
4
-
5
- Os arquivos `*Doc.tsx` em `src/design-system/docs/` são a fonte de verdade para documentação de componentes. Eles alimentam a rota `/ds` no app.
6
-
7
- ## Regras para *Doc.tsx
8
-
9
- - Devem usar `ComponentDocTemplate` com a prop `usage` obrigatória (snippet de código)
10
- - Seções críticas como ModuleAccess e Audit Log devem incluir padrões SQL e configurações
11
- - Exemplos visuais interativos são obrigatórios para componentes complexos
12
-
13
- ## Acesso à documentação
14
-
15
- - **Rota `/ds`**: Design system interativo no app
16
- - **Cross-project**: IA lê `*Doc.tsx` diretamente do código-fonte do projeto **Admin** (forlogic-core)
17
- - **Não há mais geração automática** de `DESIGN_SYSTEM.md` — foi removido em favor de leitura direta
1
+ # Design System Documentation Standard
2
+
3
+ ## Fonte de verdade
4
+
5
+ Os arquivos `*Doc.tsx` em `src/design-system/docs/` são a fonte de verdade para documentação de componentes. Eles alimentam a rota `/ds` no app.
6
+
7
+ ## Regras para *Doc.tsx
8
+
9
+ - Devem usar `ComponentDocTemplate` com a prop `usage` obrigatória (snippet de código)
10
+ - Seções críticas como ModuleAccess e Audit Log devem incluir padrões SQL e configurações
11
+ - Exemplos visuais interativos são obrigatórios para componentes complexos
12
+
13
+ ## Acesso à documentação
14
+
15
+ - **Rota `/ds`**: Design system interativo no app
16
+ - **Cross-project**: IA lê `*Doc.tsx` diretamente do código-fonte do projeto **Admin** (forlogic-core)
17
+ - **Não há mais geração automática** de `DESIGN_SYSTEM.md` — foi removido em favor de leitura direta
@@ -1,4 +1,4 @@
1
- # Memory: patterns/dynamic-supabase-config
2
- Updated: 2026-03-24
3
-
4
- As credenciais do Supabase vêm exclusivamente do `.env` (auto-populado pelo Lovable ao trocar banco). O Vite injeta automaticamente variáveis `VITE_*` em `import.meta.env` — não há bloco `define` manual nem extração de `client.ts`. O `vite.config.ts` usa `loadEnv()` apenas para ler o project ID no contexto Node (CSP headers). O `SupabaseSingleton` lê `import.meta.env.VITE_SUPABASE_URL` e `VITE_SUPABASE_PUBLISHABLE_KEY` em runtime no browser.
1
+ # Memory: patterns/dynamic-supabase-config
2
+ Updated: 2026-03-24
3
+
4
+ As credenciais do Supabase vêm exclusivamente do `.env` (auto-populado pelo Lovable ao trocar banco). O Vite injeta automaticamente variáveis `VITE_*` em `import.meta.env` — não há bloco `define` manual nem extração de `client.ts`. O `vite.config.ts` usa `loadEnv()` apenas para ler o project ID no contexto Node (CSP headers). O `SupabaseSingleton` lê `import.meta.env.VITE_SUPABASE_URL` e `VITE_SUPABASE_PUBLISHABLE_KEY` em runtime no browser.
@@ -1,35 +1,35 @@
1
- # Memory: patterns/environment-detection-logic
2
- Updated: 2026-03-24
3
-
4
- O sistema separa duas preocupações independentes de ambiente:
5
-
6
- ## 1. Método de autenticação (`shouldUseDevTokens()` / `isLovablePreview()`)
7
- Detecta se o app roda em contexto de desenvolvimento (preview Lovable via iframe, `*.lovable.dev`, localhost ou `import.meta.env.DEV`). Quando true, usa a edge function `dev-tokens` do Supabase conectado para autenticar. Quando false (app publicado), usa OAuth padrão do Qualiex.
8
-
9
- ## 2. Qual API usar (`getEnvironmentConfig()` / `isDevSupabaseProject()`)
10
- Compara o project ID do Supabase conectado com `PROD_PROJECT_ID` (`ccjfvpnndclajkleyqkc`). Se igual → config PROD (API prod, OAuth prod). Se diferente → config DEV (API dev, OAuth dev).
11
-
12
- ## Fonte de verdade do Project ID
13
- O project ID vem do `.env` (auto-populado pelo Lovable ao trocar banco), que o Vite injeta automaticamente em `import.meta.env.VITE_SUPABASE_PROJECT_ID`. **Não** é extraído de `src/integrations/supabase/client.ts`. O `vite.config.ts` usa `loadEnv()` apenas no contexto Node para configurar CSP headers.
14
-
15
- ## Tabela de regras
16
-
17
- | Cenário | API | Auth |
18
- |------------------------------|------|------------|
19
- | Preview + Prod Supabase | Prod | dev-tokens |
20
- | Preview + Dev Supabase | Dev | dev-tokens |
21
- | Publicado + Prod Supabase | Prod | OAuth |
22
- | Publicado + Dev Supabase | Dev | OAuth |
23
-
24
- ## Guard de troca de projeto (`TokenManager.checkProjectMismatch()`)
25
- Ao inicializar (`AuthService.initialize()`), o sistema compara `import.meta.env.VITE_SUPABASE_PROJECT_ID` com o valor armazenado em `localStorage('supabase_project_id')`. Se diferente, limpa todos os tokens stale automaticamente antes de qualquer chamada a `validate-token`, evitando 401 desnecessários. Após a limpeza, armazena o novo project ID. Isso garante transição limpa ao trocar de banco Supabase sem erros ou blank screen.
26
-
27
- ## Funções (lib/config/index.ts)
28
- - `isLovablePreview()` — detecta contexto de preview/localhost
29
- - `shouldUseDevTokens()` — wrapper semântico sobre `isLovablePreview()`
30
- - `isDevEnvironment` — alias deprecated, mantido para compatibilidade
31
- - `getEnvironmentConfig()` — retorna config PROD ou DEV baseado no project ID
32
- - `isDevSupabaseProject()` — true se project ID ≠ PROD_PROJECT_ID
33
-
34
- ## Funções (lib/auth/services/TokenManager.ts)
35
- - `checkProjectMismatch()` — detecta troca de projeto Supabase e limpa tokens stale
1
+ # Memory: patterns/environment-detection-logic
2
+ Updated: 2026-03-24
3
+
4
+ O sistema separa duas preocupações independentes de ambiente:
5
+
6
+ ## 1. Método de autenticação (`shouldUseDevTokens()` / `isLovablePreview()`)
7
+ Detecta se o app roda em contexto de desenvolvimento (preview Lovable via iframe, `*.lovable.dev`, localhost ou `import.meta.env.DEV`). Quando true, usa a edge function `dev-tokens` do Supabase conectado para autenticar. Quando false (app publicado), usa OAuth padrão do Qualiex.
8
+
9
+ ## 2. Qual API usar (`getEnvironmentConfig()` / `isDevSupabaseProject()`)
10
+ Compara o project ID do Supabase conectado com `PROD_PROJECT_ID` (`ccjfvpnndclajkleyqkc`). Se igual → config PROD (API prod, OAuth prod). Se diferente → config DEV (API dev, OAuth dev).
11
+
12
+ ## Fonte de verdade do Project ID
13
+ O project ID vem do `.env` (auto-populado pelo Lovable ao trocar banco), que o Vite injeta automaticamente em `import.meta.env.VITE_SUPABASE_PROJECT_ID`. **Não** é extraído de `src/integrations/supabase/client.ts`. O `vite.config.ts` usa `loadEnv()` apenas no contexto Node para configurar CSP headers.
14
+
15
+ ## Tabela de regras
16
+
17
+ | Cenário | API | Auth |
18
+ |------------------------------|------|------------|
19
+ | Preview + Prod Supabase | Prod | dev-tokens |
20
+ | Preview + Dev Supabase | Dev | dev-tokens |
21
+ | Publicado + Prod Supabase | Prod | OAuth |
22
+ | Publicado + Dev Supabase | Dev | OAuth |
23
+
24
+ ## Guard de troca de projeto (`TokenManager.checkProjectMismatch()`)
25
+ Ao inicializar (`AuthService.initialize()`), o sistema compara `import.meta.env.VITE_SUPABASE_PROJECT_ID` com o valor armazenado em `localStorage('supabase_project_id')`. Se diferente, limpa todos os tokens stale automaticamente antes de qualquer chamada a `validate-token`, evitando 401 desnecessários. Após a limpeza, armazena o novo project ID. Isso garante transição limpa ao trocar de banco Supabase sem erros ou blank screen.
26
+
27
+ ## Funções (lib/config/index.ts)
28
+ - `isLovablePreview()` — detecta contexto de preview/localhost
29
+ - `shouldUseDevTokens()` — wrapper semântico sobre `isLovablePreview()`
30
+ - `isDevEnvironment` — alias deprecated, mantido para compatibilidade
31
+ - `getEnvironmentConfig()` — retorna config PROD ou DEV baseado no project ID
32
+ - `isDevSupabaseProject()` — true se project ID ≠ PROD_PROJECT_ID
33
+
34
+ ## Funções (lib/auth/services/TokenManager.ts)
35
+ - `checkProjectMismatch()` — detecta troca de projeto Supabase e limpa tokens stale
@@ -1,3 +1,3 @@
1
- # i18n Architecture
2
-
3
- A internacionalização utiliza namespaces 'core' (lib) e 'app' (consumidor). Traduções do consumidor são modularizadas em arquivos JSON por feature e mescladas via `mergeTranslationFiles`. Usa apenas i18next + JSONs estáticos (sem serviço externo de tradução). É mandatório o uso do hook `useTranslation` da biblioteca, garantindo fallback e suporte a flags de depuração. Os arquivos de tradução da biblioteca (`lib/i18n/locales/`) são restritos exclusivamente a chaves utilizadas por seus componentes internos; chaves órfãs ou termos de domínio de negócio devem ser geridos e traduzidos nos projetos consumidores no namespace 'app'.
1
+ # i18n Architecture
2
+
3
+ A internacionalização utiliza namespaces 'core' (lib) e 'app' (consumidor). Traduções do consumidor são modularizadas em arquivos JSON por feature e mescladas via `mergeTranslationFiles`. Usa apenas i18next + JSONs estáticos (sem serviço externo de tradução). É mandatório o uso do hook `useTranslation` da biblioteca, garantindo fallback e suporte a flags de depuração. Os arquivos de tradução da biblioteca (`lib/i18n/locales/`) são restritos exclusivamente a chaves utilizadas por seus componentes internos; chaves órfãs ou termos de domínio de negócio devem ser geridos e traduzidos nos projetos consumidores no namespace 'app'.