forlogic-core 2.1.4 → 2.1.5

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 (69) 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 +68 -68
  11. package/dist/action-plans/components/ActionPlanStatusBadge.d.ts +6 -2
  12. package/dist/components/ui/__tests__/status-badge.test.d.ts +1 -0
  13. package/dist/components/ui/status-badge.d.ts +49 -0
  14. package/dist/crud/primitives/Table.d.ts +1 -1
  15. package/dist/crud/primitives/types.d.ts +6 -0
  16. package/dist/exports/crud.d.ts +5 -0
  17. package/dist/exports/ui.d.ts +1 -0
  18. package/dist/index.css +1 -1
  19. package/dist/index.css.map +1 -1
  20. package/dist/index.esm.js +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/utils/color.d.ts +26 -0
  23. package/dist/utils/index.d.ts +1 -0
  24. package/docs/PUBLISH.md +168 -0
  25. package/docs/WORKSPACE_KNOWLEDGE.md +119 -119
  26. package/docs/design-system/README.md +1 -1
  27. package/docs/design-system/buttons-actions.md +130 -130
  28. package/docs/design-system/charts-dashboards.md +340 -301
  29. package/docs/design-system/crud.md +174 -114
  30. package/docs/design-system/data-display.md +108 -103
  31. package/docs/design-system/dialogs.md +212 -212
  32. package/docs/design-system/domain.md +317 -317
  33. package/docs/design-system/examples.md +275 -275
  34. package/docs/design-system/foundation.md +1 -1
  35. package/docs/design-system/inputs.md +131 -131
  36. package/docs/design-system/layout.md +202 -154
  37. package/docs/design-system/navigation.md +271 -325
  38. package/docs/design-system/notifications-feedback.md +34 -34
  39. package/docs/design-system/patterns/README.md +53 -53
  40. package/docs/design-system/patterns/action-button.md +22 -22
  41. package/docs/design-system/patterns/alertdialog-deletion.md +46 -46
  42. package/docs/design-system/patterns/baseform-custom-fields.md +59 -59
  43. package/docs/design-system/patterns/baseform-usage.md +42 -42
  44. package/docs/design-system/patterns/body-content-scroll.md +56 -56
  45. package/docs/design-system/patterns/combo-tree.md +23 -23
  46. package/docs/design-system/patterns/components-registry.md +17 -17
  47. package/docs/design-system/patterns/core-providers.md +39 -39
  48. package/docs/design-system/patterns/crud-bulk-actions.md +12 -12
  49. package/docs/design-system/patterns/crud-config-props.md +16 -16
  50. package/docs/design-system/patterns/crud-defaults.md +17 -17
  51. package/docs/design-system/patterns/crud-toolbar.md +28 -28
  52. package/docs/design-system/patterns/delete-confirmation.md +40 -40
  53. package/docs/design-system/patterns/dialog-body-scroll.md +26 -26
  54. package/docs/design-system/patterns/dialog-structure.md +32 -32
  55. package/docs/design-system/patterns/dialog-variants.md +41 -41
  56. package/docs/design-system/patterns/feature-flags.md +24 -20
  57. package/docs/design-system/patterns/header-metadata.md +57 -57
  58. package/docs/design-system/patterns/i18n-setup.md +117 -117
  59. package/docs/design-system/patterns/pagination.md +27 -27
  60. package/docs/design-system/patterns/single-scroll.md +39 -39
  61. package/docs/design-system/patterns/vite-tailwind-setup.md +48 -48
  62. package/docs/design-system/platform.md +18 -18
  63. package/docs/design-system/selectors.md +236 -236
  64. package/docs/design-system/tables-grids.md +95 -38
  65. package/package.json +144 -144
  66. package/dist/README.md +0 -1079
  67. package/dist/bin/bootstrap.js +0 -40
  68. package/dist/bin/pull-docs.js +0 -186
  69. 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'.
package/README.md CHANGED
@@ -1,68 +1,68 @@
1
- # forlogic-core
2
-
3
- > Biblioteca compartilhada de componentes, hooks, serviços e configuração para projetos Forlogic/Qualiex.
4
-
5
- ---
6
-
7
- ## Schema do Projeto
8
-
9
- > ⚠️ **SCHEMA = `common`**
10
- >
11
- > Este é o **único local** onde o schema é definido. Toda query Supabase **DEVE** usar `.schema('common')`.
12
-
13
- ```ts
14
- // ✅ CORRETO
15
- supabase.schema('common').from('tabela').select('*');
16
-
17
- // ❌ ERRADO (vai falhar em produção)
18
- supabase.from('tabela').select('*');
19
- ```
20
-
21
- ---
22
-
23
- ## Documentação
24
-
25
- | Documento | Caminho | Conteúdo |
26
- |-----------|---------|----------|
27
- | **Constituição** | [`spec/constitution.md`](spec/constitution.md) | Regras, convenções e melhores práticas obrigatórias |
28
- | **Design System** | `docs/design-system/` | Documentação de componentes, props e exemplos |
29
- | **Design System (visual)** | Rota `/ds` no app | Documentação interativa |
30
-
31
- ---
32
-
33
- ## Cross-Project: Projeto Admin (DS + Lib)
34
-
35
- > Para consultar componentes, props, tipos, exemplos e implementação: use cross-project (`@Admin`).
36
-
37
- | O que procurar | Caminho no Admin |
38
- |----------------|------------------|
39
- | Código-fonte dos componentes UI | `lib/components/ui/` |
40
- | Sistema CRUD | `lib/crud/` |
41
- | Barrel exports (lista completa) | `lib/exports/ui.ts`, `lib/exports/index.ts` |
42
- | Documentação MD do Design System | `docs/design-system/` |
43
- | Docs interativos (código-fonte) | `src/design-system/docs/` |
44
- | Hooks compartilhados | `lib/hooks/` |
45
- | Providers (CoreProviders) | `lib/providers/` |
46
- | Serviços (Base, Email, Error) | `lib/services/` |
47
- | Config Vite/Tailwind | `lib/vite/`, `lib/tailwind/` |
48
- | Prompt template | `docs/PROMPT_TEMPLATE.md` |
49
- | Project Knowledge template | `docs/PROJECT_KNOWLEDGE_TEMPLATE.md` |
50
- | Starter template | `docs/STARTER_TEMPLATE.md` |
51
- | Prompt de auditoria | `docs/AUDIT_PROMPT.md` |
52
- | Golden snippets | `docs/design-system/examples.md` |
53
-
54
- ---
55
-
56
- ## Instrução para IA
57
-
58
- **QUANDO** criar ou modificar qualquer arquivo `.tsx` com JSX:
59
-
60
- - **SE** contém tabela, listagem ou CRUD → **LER** `@Admin docs/design-system/crud.md` e `@Admin docs/design-system/tables-grids.md` ANTES
61
- - **SE** contém formulário, input ou campo → **LER** `@Admin docs/design-system/inputs.md` e `@Admin docs/design-system/selectors.md` ANTES
62
- - **SE** contém modal ou confirmação → **LER** `@Admin docs/design-system/dialogs.md` ANTES
63
- - **SE** contém botões ou ações de linha → **LER** `@Admin docs/design-system/buttons-actions.md` ANTES
64
- - **SE** é estrutura de página/layout → **LER** `@Admin docs/design-system/layout.md` ANTES
65
-
66
- **SEMPRE** consultar `@Admin docs/design-system/examples.md` como referência de implementação.
67
-
68
- **VALIDAÇÃO pós-geração**: Todo import de componente visual DEVE vir de `forlogic-core`. Se criou componente local que existe na lib, refatore imediatamente.
1
+ # forlogic-core
2
+
3
+ > Biblioteca compartilhada de componentes, hooks, serviços e configuração para projetos Forlogic/Qualiex.
4
+
5
+ ---
6
+
7
+ ## Schema do Projeto
8
+
9
+ > ⚠️ **SCHEMA = `common`**
10
+ >
11
+ > Este é o **único local** onde o schema é definido. Toda query Supabase **DEVE** usar `.schema('common')`.
12
+
13
+ ```ts
14
+ // ✅ CORRETO
15
+ supabase.schema('common').from('tabela').select('*');
16
+
17
+ // ❌ ERRADO (vai falhar em produção)
18
+ supabase.from('tabela').select('*');
19
+ ```
20
+
21
+ ---
22
+
23
+ ## Documentação
24
+
25
+ | Documento | Caminho | Conteúdo |
26
+ |-----------|---------|----------|
27
+ | **Constituição** | [`spec/constitution.md`](spec/constitution.md) | Regras, convenções e melhores práticas obrigatórias |
28
+ | **Design System** | `docs/design-system/` | Documentação de componentes, props e exemplos |
29
+ | **Design System (visual)** | Rota `/ds` no app | Documentação interativa |
30
+
31
+ ---
32
+
33
+ ## Cross-Project: Projeto Admin (DS + Lib)
34
+
35
+ > Para consultar componentes, props, tipos, exemplos e implementação: use cross-project (`@Admin`).
36
+
37
+ | O que procurar | Caminho no Admin |
38
+ |----------------|------------------|
39
+ | Código-fonte dos componentes UI | `lib/components/ui/` |
40
+ | Sistema CRUD | `lib/crud/` |
41
+ | Barrel exports (lista completa) | `lib/exports/ui.ts`, `lib/exports/index.ts` |
42
+ | Documentação MD do Design System | `docs/design-system/` |
43
+ | Docs interativos (código-fonte) | `src/design-system/docs/` |
44
+ | Hooks compartilhados | `lib/hooks/` |
45
+ | Providers (CoreProviders) | `lib/providers/` |
46
+ | Serviços (Base, Email, Error) | `lib/services/` |
47
+ | Config Vite/Tailwind | `lib/vite/`, `lib/tailwind/` |
48
+ | Prompt template | `docs/PROMPT_TEMPLATE.md` |
49
+ | Project Knowledge template | `docs/PROJECT_KNOWLEDGE_TEMPLATE.md` |
50
+ | Starter template | `docs/STARTER_TEMPLATE.md` |
51
+ | Prompt de auditoria | `docs/AUDIT_PROMPT.md` |
52
+ | Golden snippets | `docs/design-system/examples.md` |
53
+
54
+ ---
55
+
56
+ ## Instrução para IA
57
+
58
+ **QUANDO** criar ou modificar qualquer arquivo `.tsx` com JSX:
59
+
60
+ - **SE** contém tabela, listagem ou CRUD → **LER** `@Admin docs/design-system/crud.md` e `@Admin docs/design-system/tables-grids.md` ANTES
61
+ - **SE** contém formulário, input ou campo → **LER** `@Admin docs/design-system/inputs.md` e `@Admin docs/design-system/selectors.md` ANTES
62
+ - **SE** contém modal ou confirmação → **LER** `@Admin docs/design-system/dialogs.md` ANTES
63
+ - **SE** contém botões ou ações de linha → **LER** `@Admin docs/design-system/buttons-actions.md` ANTES
64
+ - **SE** é estrutura de página/layout → **LER** `@Admin docs/design-system/layout.md` ANTES
65
+
66
+ **SEMPRE** consultar `@Admin docs/design-system/examples.md` como referência de implementação.
67
+
68
+ **VALIDAÇÃO pós-geração**: Todo import de componente visual DEVE vir de `forlogic-core`. Se criou componente local que existe na lib, refatore imediatamente.
@@ -3,9 +3,13 @@ interface ActionPlanStatusBadgeProps {
3
3
  status: ETaskPlanStatus;
4
4
  labels?: Record<ETaskPlanStatus, string>;
5
5
  className?: string;
6
+ size?: 'sm' | 'md' | 'lg';
7
+ showIcon?: boolean;
8
+ variant?: 'filled' | 'outline' | 'ghost';
6
9
  }
7
10
  /**
8
- * Badge de status do plano de ação com cores dinâmicas
11
+ * Badge de status do plano de ação com cores dinâmicas.
12
+ * Wrapper do StatusBadge genérico com mapeamento de ETaskPlanStatus.
9
13
  */
10
- export declare function ActionPlanStatusBadge({ status, labels, className }: ActionPlanStatusBadgeProps): import("react/jsx-runtime").JSX.Element;
14
+ export declare function ActionPlanStatusBadge({ status, labels, className, size, showIcon, variant, }: ActionPlanStatusBadgeProps): import("react/jsx-runtime").JSX.Element;
11
15
  export {};