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.
- package/.note/memory/features/import/attachment-idempotency-registry.md +8 -8
- package/.note/memory/features/import/attachment-strategy.md +30 -30
- package/.note/memory/patterns/admin-i18n-policy.md +20 -20
- package/.note/memory/patterns/alias-url-resolution.md +69 -69
- package/.note/memory/patterns/doc-sync-rule.md +35 -35
- package/.note/memory/patterns/documentation-standard.md +17 -17
- package/.note/memory/patterns/dynamic-supabase-config.md +4 -4
- package/.note/memory/patterns/environment-detection-logic.md +35 -35
- package/.note/memory/patterns/i18n-architecture.md +3 -3
- package/README.md +68 -68
- package/dist/action-plans/components/ActionPlanStatusBadge.d.ts +6 -2
- package/dist/components/ui/__tests__/status-badge.test.d.ts +1 -0
- package/dist/components/ui/status-badge.d.ts +49 -0
- package/dist/crud/primitives/Table.d.ts +1 -1
- package/dist/crud/primitives/types.d.ts +6 -0
- package/dist/exports/crud.d.ts +5 -0
- package/dist/exports/ui.d.ts +1 -0
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/utils/color.d.ts +26 -0
- package/dist/utils/index.d.ts +1 -0
- package/docs/PUBLISH.md +168 -0
- package/docs/WORKSPACE_KNOWLEDGE.md +119 -119
- package/docs/design-system/README.md +1 -1
- package/docs/design-system/buttons-actions.md +130 -130
- package/docs/design-system/charts-dashboards.md +340 -301
- package/docs/design-system/crud.md +174 -114
- package/docs/design-system/data-display.md +108 -103
- package/docs/design-system/dialogs.md +212 -212
- package/docs/design-system/domain.md +317 -317
- package/docs/design-system/examples.md +275 -275
- package/docs/design-system/foundation.md +1 -1
- package/docs/design-system/inputs.md +131 -131
- package/docs/design-system/layout.md +202 -154
- package/docs/design-system/navigation.md +271 -325
- package/docs/design-system/notifications-feedback.md +34 -34
- package/docs/design-system/patterns/README.md +53 -53
- package/docs/design-system/patterns/action-button.md +22 -22
- package/docs/design-system/patterns/alertdialog-deletion.md +46 -46
- package/docs/design-system/patterns/baseform-custom-fields.md +59 -59
- package/docs/design-system/patterns/baseform-usage.md +42 -42
- package/docs/design-system/patterns/body-content-scroll.md +56 -56
- package/docs/design-system/patterns/combo-tree.md +23 -23
- package/docs/design-system/patterns/components-registry.md +17 -17
- package/docs/design-system/patterns/core-providers.md +39 -39
- package/docs/design-system/patterns/crud-bulk-actions.md +12 -12
- package/docs/design-system/patterns/crud-config-props.md +16 -16
- package/docs/design-system/patterns/crud-defaults.md +17 -17
- package/docs/design-system/patterns/crud-toolbar.md +28 -28
- package/docs/design-system/patterns/delete-confirmation.md +40 -40
- package/docs/design-system/patterns/dialog-body-scroll.md +26 -26
- package/docs/design-system/patterns/dialog-structure.md +32 -32
- package/docs/design-system/patterns/dialog-variants.md +41 -41
- package/docs/design-system/patterns/feature-flags.md +24 -20
- package/docs/design-system/patterns/header-metadata.md +57 -57
- package/docs/design-system/patterns/i18n-setup.md +117 -117
- package/docs/design-system/patterns/pagination.md +27 -27
- package/docs/design-system/patterns/single-scroll.md +39 -39
- package/docs/design-system/patterns/vite-tailwind-setup.md +48 -48
- package/docs/design-system/platform.md +18 -18
- package/docs/design-system/selectors.md +236 -236
- package/docs/design-system/tables-grids.md +95 -38
- package/package.json +144 -144
- package/dist/README.md +0 -1079
- package/dist/bin/bootstrap.js +0 -40
- package/dist/bin/pull-docs.js +0 -186
- package/dist/docs/KNOWLEDGE.md +0 -109
|
@@ -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 {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|