@praxisui/tabs 8.0.0-beta.19 → 8.0.0-beta.20
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.
|
@@ -2776,19 +2776,26 @@ class PraxisTabs {
|
|
|
2776
2776
|
return id ? `tabs:${id}` : null;
|
|
2777
2777
|
}
|
|
2778
2778
|
syncSelectionFromConfig() {
|
|
2779
|
-
this.groupLoaded.clear();
|
|
2780
|
-
this.navLoaded.clear();
|
|
2781
2779
|
const tabsLength = this.config?.tabs?.length ?? 0;
|
|
2782
2780
|
const linksLength = this.config?.nav?.links?.length ?? 0;
|
|
2783
2781
|
const groupIndex = this.clampIndex(this.config?.group?.selectedIndex, tabsLength);
|
|
2784
2782
|
const navIndex = this.clampIndex(this.config?.nav?.selectedIndex, linksLength);
|
|
2785
2783
|
this.selectedIndexSignal.set(groupIndex);
|
|
2786
2784
|
this.currentNavIndex.set(navIndex);
|
|
2785
|
+
this.pruneLoadedIndexes(this.groupLoaded, tabsLength);
|
|
2786
|
+
this.pruneLoadedIndexes(this.navLoaded, linksLength);
|
|
2787
2787
|
if (tabsLength > 0)
|
|
2788
2788
|
this.groupLoaded.add(groupIndex);
|
|
2789
2789
|
if (linksLength > 0)
|
|
2790
2790
|
this.navLoaded.add(navIndex);
|
|
2791
2791
|
}
|
|
2792
|
+
pruneLoadedIndexes(indexes, size) {
|
|
2793
|
+
for (const index of Array.from(indexes)) {
|
|
2794
|
+
if (index < 0 || index >= size) {
|
|
2795
|
+
indexes.delete(index);
|
|
2796
|
+
}
|
|
2797
|
+
}
|
|
2798
|
+
}
|
|
2792
2799
|
persistConfig(config) {
|
|
2793
2800
|
const key = this.storageKey();
|
|
2794
2801
|
if (!key || !config)
|
package/index.d.ts
CHANGED
|
@@ -198,6 +198,7 @@ declare class PraxisTabs implements OnInit, OnChanges, OnDestroy {
|
|
|
198
198
|
private applyTabsAuthoringPlan;
|
|
199
199
|
private storageKey;
|
|
200
200
|
private syncSelectionFromConfig;
|
|
201
|
+
private pruneLoadedIndexes;
|
|
201
202
|
private persistConfig;
|
|
202
203
|
private componentKeyId;
|
|
203
204
|
private warnMissingId;
|
package/package.json
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/tabs",
|
|
3
|
-
"version": "8.0.0-beta.
|
|
3
|
+
"version": "8.0.0-beta.20",
|
|
4
4
|
"description": "Configurable tabs (group and nav) for Praxis UI with metadata-driven content and runtime editor.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^20.0.0",
|
|
7
7
|
"@angular/core": "^20.0.0",
|
|
8
8
|
"@angular/material": "^20.0.0",
|
|
9
9
|
"@angular/cdk": "^20.0.0",
|
|
10
|
-
"@praxisui/core": "^8.0.0-beta.
|
|
11
|
-
"@praxisui/dynamic-fields": "^8.0.0-beta.
|
|
12
|
-
"@praxisui/settings-panel": "^8.0.0-beta.
|
|
10
|
+
"@praxisui/core": "^8.0.0-beta.20",
|
|
11
|
+
"@praxisui/dynamic-fields": "^8.0.0-beta.20",
|
|
12
|
+
"@praxisui/settings-panel": "^8.0.0-beta.20",
|
|
13
|
+
"@angular/forms": "^20.0.0",
|
|
14
|
+
"@angular/router": "^20.0.0",
|
|
15
|
+
"@praxisui/ai": "^8.0.0-beta.20",
|
|
16
|
+
"rxjs": "~7.8.0"
|
|
13
17
|
},
|
|
14
18
|
"dependencies": {
|
|
15
19
|
"tslib": "^2.3.0",
|
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "praxis-tabs-config-editor JSON API (Canonical)"
|
|
3
|
+
slug: "praxis-tabs-config-editor-json-api"
|
|
4
|
+
doc_type: "api-reference"
|
|
5
|
+
component: "praxis-tabs-config-editor"
|
|
6
|
+
document_kind: "json-api-canonical"
|
|
7
|
+
reference_mode: "canonical"
|
|
8
|
+
contract_format: "json"
|
|
9
|
+
contract_source: "runtime-and-code"
|
|
10
|
+
description: "Referencia canonica do contrato JSON do componente praxis-tabs-config-editor."
|
|
11
|
+
category: "components"
|
|
12
|
+
sub_category: "config-editor"
|
|
13
|
+
audience:
|
|
14
|
+
- "frontend"
|
|
15
|
+
- "architect"
|
|
16
|
+
- "platform-team"
|
|
17
|
+
level: "advanced"
|
|
18
|
+
status: "active"
|
|
19
|
+
owner: "praxis-ui"
|
|
20
|
+
source_of_truth:
|
|
21
|
+
- "projects/praxis-tabs/src/lib/praxis-tabs-config-editor.ts"
|
|
22
|
+
- "projects/praxis-tabs/src/lib/praxis-tabs.ts"
|
|
23
|
+
- "projects/praxis-tabs/src/lib/quick-setup/tabs-quick-setup.component.ts"
|
|
24
|
+
- "projects/praxis-tabs/src/lib/ai/tabs-ai-capabilities.ts"
|
|
25
|
+
source_of_truth_last_verified: "2026-03-05"
|
|
26
|
+
last_updated: "2026-03-05"
|
|
27
|
+
toc: true
|
|
28
|
+
sidebar: true
|
|
29
|
+
tags:
|
|
30
|
+
- "json-api"
|
|
31
|
+
- "canonical-contract"
|
|
32
|
+
- "praxis-tabs-config-editor"
|
|
33
|
+
api_stability: "canonical"
|
|
34
|
+
schema_verified: true
|
|
35
|
+
runtime_verified: false
|
|
36
|
+
editor_coverage_verified: false
|
|
37
|
+
runtime_scope: "public"
|
|
38
|
+
legacy_paths_present: false
|
|
39
|
+
has_known_mismatches: true
|
|
40
|
+
related_components: []
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
# praxis-tabs-config-editor
|
|
44
|
+
|
|
45
|
+
Este documento e a referencia canonica da API JSON de praxis-tabs-config-editor.
|
|
46
|
+
|
|
47
|
+
## Summary
|
|
48
|
+
|
|
49
|
+
- Tipo documental: API reference canonica de contrato JSON.
|
|
50
|
+
- Source of truth: runtime e codigo declarados no frontmatter.
|
|
51
|
+
- Objetivo operacional: consulta rapida, auditavel e deterministica sob pressao.
|
|
52
|
+
- Resumo funcional herdado: `praxis-tabs-config-editor` e a superficie de autoria do runtime `praxis-tabs`: ele transforma `TabsMetadata` em operacao de produto (apply/save/reset) sem obrigar o time a editar JSON manual toda hora. Nao e apenas um formulario administrativo; e o ponto de governanca para evoluir tabs config-first com controle de contrato.
|
|
53
|
+
|
|
54
|
+
## Scope and positioning
|
|
55
|
+
|
|
56
|
+
- Escopo: contrato JSON publico e limites de comportamento observavel.
|
|
57
|
+
- Fora de escopo: tutorial de adocao e walkthrough operacional detalhado.
|
|
58
|
+
- Posicionamento: referencia canonicamente governada para consumidores, arquitetos e mantenedores.
|
|
59
|
+
|
|
60
|
+
## Source of truth
|
|
61
|
+
|
|
62
|
+
| Source | Kind | Notes |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| projects/praxis-tabs/src/lib/praxis-tabs-config-editor.ts | runtime-code | Source de implementacao declarado no repositorio. |
|
|
65
|
+
| projects/praxis-tabs/src/lib/praxis-tabs.ts | runtime-code | Source de implementacao declarado no repositorio. |
|
|
66
|
+
| projects/praxis-tabs/src/lib/quick-setup/tabs-quick-setup.component.ts | runtime-code | Source de implementacao declarado no repositorio. |
|
|
67
|
+
| projects/praxis-tabs/src/lib/ai/tabs-ai-capabilities.ts | runtime-code | Source de implementacao declarado no repositorio. |
|
|
68
|
+
|
|
69
|
+
## Support legend
|
|
70
|
+
|
|
71
|
+
- Active: suportado e observado no runtime atual.
|
|
72
|
+
- Partial: suporte parcial, com restricoes conhecidas.
|
|
73
|
+
- Declared-only: declarado em tipos/schema sem ligacao runtime confirmada.
|
|
74
|
+
- Schema-only: presente em schema/modelo sem confirmacao de execucao.
|
|
75
|
+
- Deprecated: mantido por compatibilidade legada com migracao prevista.
|
|
76
|
+
|
|
77
|
+
## Contract classification
|
|
78
|
+
|
|
79
|
+
### Canonical paths (public contract)
|
|
80
|
+
|
|
81
|
+
| Path | Type | Required | Default | Status | Notes |
|
|
82
|
+
| --- | --- | --- | --- | --- | --- |
|
|
83
|
+
| `meta` | not-specified | not-specified | n/a | Partial | Preservado da documentação anterior. |
|
|
84
|
+
| `appearance.density` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
85
|
+
| `appearance.themeClass` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
86
|
+
| `appearance.customCss` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
87
|
+
| `appearance.tokens.*` | not-specified | not-specified | n/a | Partial | Preservado da documentação anterior. |
|
|
88
|
+
| `behavior.lazyLoad/closeable/reorderable` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
89
|
+
| `events` | not-specified | not-specified | n/a | Partial | Preservado da documentação anterior. |
|
|
90
|
+
| `accessibility.highContrast/reduceMotion` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
91
|
+
| `accessibility.ariaLabels/keyboardNavigation` | not-specified | not-specified | n/a | Declared-only | Preservado no contrato JSON, sem superficie ativa na UI. |
|
|
92
|
+
| `group.*` | not-specified | not-specified | n/a | Partial | Preservado da documentação anterior. |
|
|
93
|
+
| `tabs[]` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
94
|
+
| `tabs[].content` | not-specified | not-specified | n/a | Partial | Preservado da documentação anterior. |
|
|
95
|
+
| `nav.*` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
96
|
+
| `nav.links[]` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
97
|
+
|
|
98
|
+
### Supported legacy paths
|
|
99
|
+
|
|
100
|
+
Nenhum path legado suportado foi identificado nesta revisão baseada em evidência textual preservada.
|
|
101
|
+
|
|
102
|
+
### Internal-only paths
|
|
103
|
+
|
|
104
|
+
| Path | Internal consumer | Runtime presence | Public support | Notes |
|
|
105
|
+
| --- | --- | --- | --- | --- |
|
|
106
|
+
| not-yet-mapped | not-yet-verified | not-yet-verified | No | Caminhos internos nao mapeados explicitamente nesta revisao automatizada. |
|
|
107
|
+
|
|
108
|
+
### Experimental paths
|
|
109
|
+
|
|
110
|
+
| Path | Enablement (flag/guard) | Stability | Rollout notes | Notes |
|
|
111
|
+
| --- | --- | --- | --- | --- |
|
|
112
|
+
| not-yet-mapped | not-yet-verified | Experimental | not-yet-verified | Registrar somente quando houver evidencia em runtime/codigo. |
|
|
113
|
+
|
|
114
|
+
## Overview
|
|
115
|
+
|
|
116
|
+
Este arquivo foi adaptado para o padrao canonico atual sem remover conteudo tecnico existente. O conteudo detalhado anterior foi preservado para manter rastreabilidade historica e reduzir perda de contexto.
|
|
117
|
+
|
|
118
|
+
## Public contract surface
|
|
119
|
+
|
|
120
|
+
### Top-level configuration blocks
|
|
121
|
+
|
|
122
|
+
| Block | Purpose | Required | Merge strategy | Notes |
|
|
123
|
+
| --- | --- | --- | --- | --- |
|
|
124
|
+
| meta | Configuração top-level identificada na referência preservada. | not-yet-verified | component-defined | 1 path(s) mapeado(s), status predominante Partial. |
|
|
125
|
+
| appearance | Configuração top-level identificada na referência preservada. | not-yet-verified | component-defined | 4 path(s) mapeado(s), status predominante Active. |
|
|
126
|
+
| behavior | Configuração top-level identificada na referência preservada. | not-yet-verified | component-defined | 1 path(s) mapeado(s), status predominante Active. |
|
|
127
|
+
| events | Configuração top-level identificada na referência preservada. | not-yet-verified | component-defined | 1 path(s) mapeado(s), status predominante Partial. |
|
|
128
|
+
| accessibility | Configuração top-level identificada na referência preservada. | not-yet-verified | component-defined | 2 path(s) mapeado(s), status predominante Active. |
|
|
129
|
+
| group | Configuração top-level identificada na referência preservada. | not-yet-verified | component-defined | 1 path(s) mapeado(s), status predominante Partial. |
|
|
130
|
+
| tabs[] | Configuração top-level identificada na referência preservada. | not-yet-verified | component-defined | 2 path(s) mapeado(s), status predominante Active. |
|
|
131
|
+
| nav | Configuração top-level identificada na referência preservada. | not-yet-verified | component-defined | 2 path(s) mapeado(s), status predominante Active. |
|
|
132
|
+
|
|
133
|
+
### Nested configuration blocks
|
|
134
|
+
|
|
135
|
+
| Path | Type | Required | Default | Constraints | Notes |
|
|
136
|
+
| --- | --- | --- | --- | --- | --- |
|
|
137
|
+
| `meta` | not-specified | not-specified | n/a | component-defined | Preservado da documentação anterior. |
|
|
138
|
+
| `appearance.density` | not-specified | not-specified | n/a | component-defined | Preservado da documentação anterior. |
|
|
139
|
+
| `appearance.themeClass` | not-specified | not-specified | n/a | component-defined | Preservado da documentação anterior. |
|
|
140
|
+
| `appearance.customCss` | not-specified | not-specified | n/a | component-defined | Preservado da documentação anterior. |
|
|
141
|
+
| `appearance.tokens.*` | not-specified | not-specified | n/a | component-defined | Preservado da documentação anterior. |
|
|
142
|
+
| `behavior.lazyLoad/closeable/reorderable` | not-specified | not-specified | n/a | component-defined | Preservado da documentação anterior. |
|
|
143
|
+
| `events` | not-specified | not-specified | n/a | component-defined | Preservado da documentação anterior. |
|
|
144
|
+
| `accessibility.highContrast/reduceMotion` | not-specified | not-specified | n/a | component-defined | Preservado da documentação anterior. |
|
|
145
|
+
| `accessibility.ariaLabels/keyboardNavigation` | not-specified | not-specified | n/a | Declared-only | Preservado no JSON, sem exposicao dedicada no editor. |
|
|
146
|
+
| `group.*` | not-specified | not-specified | n/a | component-defined | Preservado da documentação anterior. |
|
|
147
|
+
|
|
148
|
+
### Input bindings
|
|
149
|
+
|
|
150
|
+
| Binding/Path | Type | Required | Source | Runtime normalization | Notes |
|
|
151
|
+
| --- | --- | --- | --- | --- | --- |
|
|
152
|
+
| `config` | `TabsMetadata` | recomendado | component-input | not-yet-verified | Preservado da documentação anterior. |
|
|
153
|
+
| `tabsId` | `string` | opcional | component-input | not-yet-verified | Preservado da documentação anterior. |
|
|
154
|
+
|
|
155
|
+
### Output events
|
|
156
|
+
|
|
157
|
+
| Event | Payload | Trigger | Stability | Notes |
|
|
158
|
+
| --- | --- | --- | --- | --- |
|
|
159
|
+
| component-outputs | see-detailed-api | runtime-event | Partial | Eventos preservados na referência detalhada. |
|
|
160
|
+
|
|
161
|
+
### External side channels
|
|
162
|
+
|
|
163
|
+
| Channel | Direction | Contract | Failure mode | Notes |
|
|
164
|
+
| --- | --- | --- | --- | --- |
|
|
165
|
+
| host/services/storage | bidirectional | see-detailed-api | not-yet-verified | Side channels dependem do componente e do host consumidor. |
|
|
166
|
+
|
|
167
|
+
### Host/runtime dependencies
|
|
168
|
+
|
|
169
|
+
| Dependency | Required | Environment | Purpose | Notes |
|
|
170
|
+
| --- | --- | --- | --- | --- |
|
|
171
|
+
| see-source-of-truth | true | browser/dev/prod/ssr | runtime linkage | Confirmar por componente quando necessario. |
|
|
172
|
+
|
|
173
|
+
## Coverage matrix
|
|
174
|
+
|
|
175
|
+
| Surface | Verified | Coverage status | Evidence | Notes |
|
|
176
|
+
| --- | --- | --- | --- | --- |
|
|
177
|
+
| Runtime | false | Partial | source_of_truth + conteudo preservado | Revisao estrutural concluida; validacao comportamental fina pode exigir follow-up. |
|
|
178
|
+
| Schema/Types | true | Partial | interfaces/modelos citados | Mapeamento formal de todos os campos ainda pode requerer refinamento. |
|
|
179
|
+
| Editor/Tooling | false | Partial | secoes de editor quando presentes | Cobertura de editor/tooling nem sempre confirmada por evidencia direta. |
|
|
180
|
+
|
|
181
|
+
## Runtime coverage boundaries
|
|
182
|
+
|
|
183
|
+
- Cobertura consolidada com base em documentacao existente e source of truth declarado.
|
|
184
|
+
- Comportamentos fora de evidencia direta foram marcados como not-yet-verified ou Partial.
|
|
185
|
+
- Compatibilidade legada, quando detectada, foi separada em classificacao explicita.
|
|
186
|
+
|
|
187
|
+
## Resolution model
|
|
188
|
+
|
|
189
|
+
### Merge order
|
|
190
|
+
|
|
191
|
+
1. defaults do componente
|
|
192
|
+
2. contrato JSON recebido
|
|
193
|
+
3. overrides de host/runtime
|
|
194
|
+
4. normalizacoes internas
|
|
195
|
+
|
|
196
|
+
### Fallback order
|
|
197
|
+
|
|
198
|
+
contrato explicito -> aliases legados (quando suportados) -> defaults internos -> comportamento seguro
|
|
199
|
+
|
|
200
|
+
### Override points
|
|
201
|
+
|
|
202
|
+
- inputs publicos do componente
|
|
203
|
+
- configuracao JSON de runtime
|
|
204
|
+
- integracoes de host (servicos/tokens/adapters)
|
|
205
|
+
|
|
206
|
+
### Runtime normalization
|
|
207
|
+
|
|
208
|
+
Campos e aliases preservados do documento anterior devem convergir progressivamente para paths canonicos declarados.
|
|
209
|
+
|
|
210
|
+
### Precedence rules
|
|
211
|
+
|
|
212
|
+
Quando houver conflito entre alias e path canonico, priorizar path canonico e manter alias apenas para backward compatibility.
|
|
213
|
+
|
|
214
|
+
## Validation and error semantics
|
|
215
|
+
|
|
216
|
+
### Validation model
|
|
217
|
+
|
|
218
|
+
| Path/Rule | Validation phase | Behavior on fail | Error code / warning | Notes |
|
|
219
|
+
| --- | --- | --- | --- | --- |
|
|
220
|
+
| see-detailed-api | runtime | warn-or-reject | not-yet-standardized | Semantica de validacao preservada do documento anterior. |
|
|
221
|
+
|
|
222
|
+
### Error semantics
|
|
223
|
+
|
|
224
|
+
Erros devem ser classificados em warnings recuperaveis versus falhas bloqueantes. Quando a evidencia nao estiver explicita, tratar como not yet verified.
|
|
225
|
+
|
|
226
|
+
### Fail-open / fail-closed behavior
|
|
227
|
+
|
|
228
|
+
| Condition | Mode | Runtime behavior | Consumer impact |
|
|
229
|
+
| --- | --- | --- | --- |
|
|
230
|
+
| invalid-or-unknown-field | component-defined | not-yet-verified | Variavel por componente; requer verificacao em runtime. |
|
|
231
|
+
|
|
232
|
+
### Invalid or unknown field handling
|
|
233
|
+
|
|
234
|
+
- Campos desconhecidos: comportamento depende da estrategia do componente (ignore, warn ou reject).
|
|
235
|
+
- Campos invalidos: podem gerar fallback, warning ou falha conforme implementacao.
|
|
236
|
+
- Registrar divergencias observadas em Known limitations and mismatches.
|
|
237
|
+
|
|
238
|
+
### Runtime warnings vs hard failures
|
|
239
|
+
|
|
240
|
+
| Condition | Severity | Observability | Consumer action |
|
|
241
|
+
| --- | --- | --- | --- |
|
|
242
|
+
| partial-or-declared-only-coverage | warning | logs/eventos do componente | confirmar ligacao runtime antes de uso critico |
|
|
243
|
+
|
|
244
|
+
## Detailed API
|
|
245
|
+
|
|
246
|
+
### Preserved technical reference (normalized from previous revision)
|
|
247
|
+
|
|
248
|
+
`praxis-tabs-config-editor` e a superficie de autoria do runtime `praxis-tabs`: ele transforma `TabsMetadata` em operacao de produto (apply/save/reset) sem obrigar o time a editar JSON manual toda hora. Nao e apenas um formulario administrativo; e o ponto de governanca para evoluir tabs config-first com controle de contrato.
|
|
249
|
+
|
|
250
|
+
### Prova em 20 segundos
|
|
251
|
+
|
|
252
|
+
Abra o editor no Settings Panel e aplique um payload minimo:
|
|
253
|
+
|
|
254
|
+
```json
|
|
255
|
+
{
|
|
256
|
+
"behavior": { "lazyLoad": true, "reorderable": true },
|
|
257
|
+
"group": { "selectedIndex": 0, "stretchTabs": true },
|
|
258
|
+
"tabs": [
|
|
259
|
+
{ "id": "overview", "textLabel": "Overview" },
|
|
260
|
+
{ "id": "history", "textLabel": "History" }
|
|
261
|
+
]
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
- O editor devolve `{ config }` pronto para `applied$`/`saved$`.
|
|
266
|
+
- O runtime passa a refletir o contrato sem mexer no host template.
|
|
267
|
+
- O processo fica versionavel e auditavel por JSON.
|
|
268
|
+
|
|
269
|
+
### Table of contents
|
|
270
|
+
|
|
271
|
+
- [Start here](#start-here)
|
|
272
|
+
- [Promessa e limites](#promessa-e-limites)
|
|
273
|
+
- [Status model](#status-model)
|
|
274
|
+
- [Checklist de operacao](#checklist-de-operacao)
|
|
275
|
+
- [Guia operacional (produto)](#guia-operacional-produto)
|
|
276
|
+
- [Entrada e saida do editor](#entrada-e-saida-do-editor)
|
|
277
|
+
- [Fluxo no settings panel](#fluxo-no-settings-panel)
|
|
278
|
+
- [Controle por guias](#controle-por-guias)
|
|
279
|
+
- [Widgets e presets de ecossistema](#widgets-e-presets-de-ecossistema)
|
|
280
|
+
- [Validacao, dirty state e governanca](#validacao-dirty-state-e-governanca)
|
|
281
|
+
- [Contrato tecnico completo (referencia)](#contrato-tecnico-completo-referencia)
|
|
282
|
+
- [Coverage matrix](#coverage-matrix)
|
|
283
|
+
- [Complete editable path index](#complete-editable-path-index)
|
|
284
|
+
- [Examples](#examples)
|
|
285
|
+
- [Known limitations and mismatches](#known-limitations-and-mismatches)
|
|
286
|
+
- [Source references](#source-references)
|
|
287
|
+
- [Referencias oficiais Angular](#referencias-oficiais-angular)
|
|
288
|
+
|
|
289
|
+
### Start here
|
|
290
|
+
|
|
291
|
+
#### Promessa e limites
|
|
292
|
+
|
|
293
|
+
**O que isso habilita:** autoria controlada de `TabsMetadata` em runtime com retorno padrao para persistencia e replay.
|
|
294
|
+
|
|
295
|
+
**Quando usar:** quando o time quer iterar fluxo de tabs sem abrir PR para cada ajuste de configuracao.
|
|
296
|
+
|
|
297
|
+
**Exemplo minimo:** ajustar `behavior` e `tabs[]` na UI e propagar por `applied$`.
|
|
298
|
+
|
|
299
|
+
Garantias (hoje):
|
|
300
|
+
|
|
301
|
+
- Sempre retorna payload no formato `{ config: TabsMetadata }`.
|
|
302
|
+
- Mantem estado de validacao (`isValid$`) e alteracao (`isDirty$`).
|
|
303
|
+
- Permite apply sem fechar painel e save com a mesma estrutura.
|
|
304
|
+
|
|
305
|
+
Limites (hoje):
|
|
306
|
+
|
|
307
|
+
- Nem todo campo editavel no editor tem efeito ativo no runtime final.
|
|
308
|
+
- Validacao semantica profunda de widgets/ids ainda e limitada.
|
|
309
|
+
- Parte da cobertura continua dependente de edicao JSON livre.
|
|
310
|
+
|
|
311
|
+
#### Status model
|
|
312
|
+
|
|
313
|
+
Padrao oficial de status neste documento:
|
|
314
|
+
|
|
315
|
+
- `Status: Active` - editavel e retornado no payload.
|
|
316
|
+
- `Status: Partial` - editavel com restricoes ou efeito parcial no runtime.
|
|
317
|
+
- `Status: Stored-only` - preservado no JSON sem UI dedicada.
|
|
318
|
+
- `Status: Declared-only` - mantido no contrato JSON, sem exposicao dedicada no editor atual.
|
|
319
|
+
|
|
320
|
+
#### Checklist de operacao
|
|
321
|
+
|
|
322
|
+
- Sempre abrir com seed `config` quando existir (evita sobrescrita acidental).
|
|
323
|
+
- Tratar `applied$` para preview e `saved$` para persistencia definitiva.
|
|
324
|
+
- Validar ids duplicados de `tabs[]/links[]` no host (regra externa ao editor).
|
|
325
|
+
- Revisar campos `Stored-only/Declared-only` antes de prometer efeito de UI.
|
|
326
|
+
- Em widgets, validar `inputs/outputs` no componente destino.
|
|
327
|
+
|
|
328
|
+
### Guia operacional (produto)
|
|
329
|
+
|
|
330
|
+
#### Entrada e saida do editor
|
|
331
|
+
|
|
332
|
+
**O que isso habilita:** contrato previsivel entre Settings Panel e runtime consumidor.
|
|
333
|
+
|
|
334
|
+
**Quando usar:** em qualquer fluxo de configuracao operacional de tabs.
|
|
335
|
+
|
|
336
|
+
**Exemplo minimo:** `content.component = PraxisTabsConfigEditor` com `inputs: { config, tabsId }`.
|
|
337
|
+
|
|
338
|
+
`Status: Active`.
|
|
339
|
+
|
|
340
|
+
##### Entrada (`SETTINGS_PANEL_DATA`)
|
|
341
|
+
|
|
342
|
+
| Campo | Tipo | Required | Status | Observacao |
|
|
343
|
+
| --- | --- | --- | --- | --- |
|
|
344
|
+
| `config` | `TabsMetadata` | recomendado | Active | seed principal do editor |
|
|
345
|
+
| `tabsId` | `string` | opcional | Active | compatibilidade de payload/host |
|
|
346
|
+
|
|
347
|
+
##### Saida (`SettingsValueProvider`)
|
|
348
|
+
|
|
349
|
+
| Superficie | Tipo | Status | Observacao |
|
|
350
|
+
| --- | --- | --- | --- |
|
|
351
|
+
| `isDirty$` | `BehaviorSubject<boolean>` | Active | compara snapshot inicial x editado |
|
|
352
|
+
| `isValid$` | `BehaviorSubject<boolean>` | Active | depende principalmente do parse da guia JSON |
|
|
353
|
+
| `isBusy$` | `BehaviorSubject<boolean>` | Active | reservado para fluxo async |
|
|
354
|
+
| `getSettingsValue()` | `() => { config: TabsMetadata }` | Active | usado em `applied$` |
|
|
355
|
+
| `onSave()` | `() => { config: TabsMetadata }` | Active | usado em `saved$` |
|
|
356
|
+
| `reset()` | `() => void` | Active | restaura snapshot inicial |
|
|
357
|
+
|
|
358
|
+
#### Fluxo no settings panel
|
|
359
|
+
|
|
360
|
+
**O que isso habilita:** ciclo de configuracao curto (editar, aplicar, salvar, reverter).
|
|
361
|
+
|
|
362
|
+
**Quando usar:** para operacao continua de produto sem rebuild da tela.
|
|
363
|
+
|
|
364
|
+
**Exemplo minimo:** abrir painel, ajustar guia `Estilo`, clicar aplicar e validar no runtime.
|
|
365
|
+
|
|
366
|
+
`Status: Active`.
|
|
367
|
+
|
|
368
|
+
Fluxo padrao:
|
|
369
|
+
|
|
370
|
+
1. Host abre `SettingsPanelService.open(...)`.
|
|
371
|
+
2. Editor cria snapshots (`initialConfig` e `editedConfig`).
|
|
372
|
+
3. Cada mudanca atualiza `isDirty$` e `isValid$`.
|
|
373
|
+
4. `getSettingsValue()`/`onSave()` devolvem `{ config }`.
|
|
374
|
+
5. Host aplica/persiste e runtime sincroniza selecao.
|
|
375
|
+
|
|
376
|
+
#### Controle por guias
|
|
377
|
+
|
|
378
|
+
**O que isso habilita:** autoria orientada a tarefa, nao apenas schema bruto.
|
|
379
|
+
|
|
380
|
+
**Quando usar:** para reduzir erro em campos frequentes do contrato.
|
|
381
|
+
|
|
382
|
+
**Exemplo minimo:** usar `Comportamento` para lazy/reorder e `Abas` para estrutura inicial.
|
|
383
|
+
|
|
384
|
+
`Status: Active`.
|
|
385
|
+
|
|
386
|
+
| Guia | O que edita | Impacto no `praxis-tabs` | Status |
|
|
387
|
+
| --- | --- | --- | --- |
|
|
388
|
+
| `Comportamento` | `behavior.closeable/lazyLoad/reorderable` | toggle de close/lazy/reorder | Active |
|
|
389
|
+
| `Grupo` | `group.*` | runtime `mat-tab-group` | Partial |
|
|
390
|
+
| `Navegacao` | `nav.*` | runtime `mat-tab-nav-bar` | Partial |
|
|
391
|
+
| `JSON` | objeto completo | override total do `editedConfig` | Active |
|
|
392
|
+
| `Estilo` | `appearance.themeClass/density/customCss/tokens` | classes + css runtime | Partial |
|
|
393
|
+
| `Abas` | `tabs[]` + widgets por aba | group mode | Active |
|
|
394
|
+
| `Acessibilidade` | `accessibility.highContrast/reduceMotion` | classes no root | Partial |
|
|
395
|
+
| `Links` | `nav.links[]` + widgets por link | nav mode | Active |
|
|
396
|
+
|
|
397
|
+
#### Widgets e presets de ecossistema
|
|
398
|
+
|
|
399
|
+
**O que isso habilita:** composicao rapida de modulos ricos por aba/link.
|
|
400
|
+
|
|
401
|
+
**Quando usar:** quando tabs atua como shell de pagina por dominio.
|
|
402
|
+
|
|
403
|
+
**Exemplo minimo:** adicionar preset `table` para montar `praxis-table` em uma aba.
|
|
404
|
+
|
|
405
|
+
`Status: Active`.
|
|
406
|
+
|
|
407
|
+
Operacoes suportadas:
|
|
408
|
+
|
|
409
|
+
- adicionar componente por id (`ComponentMetadataRegistry`)
|
|
410
|
+
- editar `inputs` e `outputs` em JSON
|
|
411
|
+
- reordenar widgets por drag-and-drop
|
|
412
|
+
- usar presets rapidos por `resourcePath`:
|
|
413
|
+
- `form` -> `praxis-dynamic-form`
|
|
414
|
+
- `table` -> `praxis-table`
|
|
415
|
+
- `crud` -> `praxis-crud`
|
|
416
|
+
|
|
417
|
+
#### Validacao, dirty state e governanca
|
|
418
|
+
|
|
419
|
+
**O que isso habilita:** controle de risco na autoria sem bloquear iteracao.
|
|
420
|
+
|
|
421
|
+
**Quando usar:** em ambientes com auditoria de configuracao e trilha de mudanca.
|
|
422
|
+
|
|
423
|
+
**Exemplo minimo:** impedir save operacional quando `isValid$` estiver `false`.
|
|
424
|
+
|
|
425
|
+
`Status: Partial`.
|
|
426
|
+
|
|
427
|
+
Regras atuais:
|
|
428
|
+
|
|
429
|
+
- `onJsonTextChange`:
|
|
430
|
+
- JSON valido -> atualiza `editedConfig`, `isValid=true`
|
|
431
|
+
- JSON invalido -> `isValid=false` e mantem ultimo objeto valido
|
|
432
|
+
- `isDirty$` via `JSON.stringify(initialConfig) !== JSON.stringify(editedConfig)`
|
|
433
|
+
- `onAppearanceChange` atualiza `jsonText` e dirty state
|
|
434
|
+
|
|
435
|
+
Risco conhecido:
|
|
436
|
+
|
|
437
|
+
- dirty check por stringify pode sinalizar mudanca por ordem de chaves.
|
|
438
|
+
|
|
439
|
+
### Contrato tecnico completo (referencia)
|
|
440
|
+
|
|
441
|
+
#### Coverage matrix
|
|
442
|
+
|
|
443
|
+
| JSON path | Status | Observacao |
|
|
444
|
+
| --- | --- | --- |
|
|
445
|
+
| `meta` | Stored-only | preservado no JSON, sem guia dedicada |
|
|
446
|
+
| `appearance.density` | Active | seletor visual |
|
|
447
|
+
| `appearance.themeClass` | Active | input de classe |
|
|
448
|
+
| `appearance.customCss` | Active | textarea livre |
|
|
449
|
+
| `appearance.tokens.*` | Partial | lista de tokens definida no editor |
|
|
450
|
+
| `behavior.lazyLoad/closeable/reorderable` | Active | toggles |
|
|
451
|
+
| `events` | Stored-only | sem guia dedicada |
|
|
452
|
+
| `accessibility.highContrast/reduceMotion` | Active | toggles |
|
|
453
|
+
| `accessibility.ariaLabels/keyboardNavigation` | Declared-only | mantido no JSON, sem UI dedicada |
|
|
454
|
+
| `group.*` | Partial | maioria ativa; sem validacao semantica completa |
|
|
455
|
+
| `tabs[]` | Active | CRUD + reorder + widgets |
|
|
456
|
+
| `tabs[].content` | Partial | preservado no JSON; sem wizard dedicado |
|
|
457
|
+
| `nav.*` | Active | CRUD principal de nav |
|
|
458
|
+
| `nav.links[]` | Active | CRUD + reorder + widgets |
|
|
459
|
+
| `nav.links[].content` | Partial | preservado no JSON; sem wizard dedicado |
|
|
460
|
+
|
|
461
|
+
#### Complete editable path index
|
|
462
|
+
|
|
463
|
+
| Path | Status | Observacao |
|
|
464
|
+
| --- | --- | --- |
|
|
465
|
+
| `appearance.density` | Active | guia Estilo |
|
|
466
|
+
| `appearance.themeClass` | Active | guia Estilo |
|
|
467
|
+
| `appearance.customCss` | Active | guia Estilo |
|
|
468
|
+
| `appearance.tokens.active-indicator-color` | Active | token list |
|
|
469
|
+
| `appearance.tokens.active-label-text-color` | Active | token list |
|
|
470
|
+
| `appearance.tokens.active-hover-indicator-color` | Active | token list |
|
|
471
|
+
| `appearance.tokens.active-hover-label-text-color` | Active | token list |
|
|
472
|
+
| `appearance.tokens.active-focus-indicator-color` | Active | token list |
|
|
473
|
+
| `appearance.tokens.active-focus-label-text-color` | Active | token list |
|
|
474
|
+
| `appearance.tokens.inactive-label-text-color` | Active | token list |
|
|
475
|
+
| `appearance.tokens.inactive-hover-label-text-color` | Active | token list |
|
|
476
|
+
| `appearance.tokens.inactive-focus-label-text-color` | Active | token list |
|
|
477
|
+
| `appearance.tokens.pagination-icon-color` | Active | token list |
|
|
478
|
+
| `appearance.tokens.divider-color` | Active | token list |
|
|
479
|
+
| `appearance.tokens.background-color` | Active | token list |
|
|
480
|
+
| `behavior.closeable` | Active | guia Comportamento |
|
|
481
|
+
| `behavior.lazyLoad` | Active | guia Comportamento |
|
|
482
|
+
| `behavior.reorderable` | Active | guia Comportamento |
|
|
483
|
+
| `group.alignTabs` | Active | guia Grupo |
|
|
484
|
+
| `group.headerPosition` | Active | guia Grupo |
|
|
485
|
+
| `group.selectedIndex` | Active | guia Grupo |
|
|
486
|
+
| `group.animationDuration` | Active | guia Grupo |
|
|
487
|
+
| `group.color` | Active | guia Grupo |
|
|
488
|
+
| `group.backgroundColor` | Active | guia Grupo |
|
|
489
|
+
| `group.ariaLabel` | Active | guia Grupo |
|
|
490
|
+
| `group.ariaLabelledby` | Active | guia Grupo |
|
|
491
|
+
| `group.dynamicHeight` | Active | guia Grupo |
|
|
492
|
+
| `group.fitInkBarToContent` | Active | guia Grupo |
|
|
493
|
+
| `group.disablePagination` | Active | guia Grupo |
|
|
494
|
+
| `group.disableRipple` | Active | guia Grupo |
|
|
495
|
+
| `group.preserveContent` | Active | guia Grupo |
|
|
496
|
+
| `group.stretchTabs` | Active | guia Grupo |
|
|
497
|
+
| `nav.selectedIndex` | Active | guia Navegacao |
|
|
498
|
+
| `nav.animationDuration` | Active | guia Navegacao |
|
|
499
|
+
| `nav.ariaLabel` | Active | guia Navegacao |
|
|
500
|
+
| `nav.ariaLabelledby` | Active | guia Navegacao |
|
|
501
|
+
| `nav.color` | Active | guia Navegacao |
|
|
502
|
+
| `nav.backgroundColor` | Active | guia Navegacao |
|
|
503
|
+
| `nav.fitInkBarToContent` | Active | guia Navegacao |
|
|
504
|
+
| `nav.disablePagination` | Active | guia Navegacao |
|
|
505
|
+
| `nav.disableRipple` | Active | guia Navegacao |
|
|
506
|
+
| `nav.stretchTabs` | Active | guia Navegacao |
|
|
507
|
+
| `tabs[]` | Active | guia Abas |
|
|
508
|
+
| `tabs[].id` | Active | guia Abas |
|
|
509
|
+
| `tabs[].textLabel` | Active | guia Abas |
|
|
510
|
+
| `tabs[].labelClass` | Active | guia Abas |
|
|
511
|
+
| `tabs[].bodyClass` | Active | guia Abas |
|
|
512
|
+
| `tabs[].ariaLabel` | Active | guia Abas |
|
|
513
|
+
| `tabs[].ariaLabelledby` | Active | guia Abas |
|
|
514
|
+
| `tabs[].disabled` | Active | guia Abas |
|
|
515
|
+
| `tabs[].widgets[]` | Active | guia Abas |
|
|
516
|
+
| `tabs[].widgets[].inputs` | Active | JSON livre |
|
|
517
|
+
| `tabs[].widgets[].outputs` | Active | JSON livre |
|
|
518
|
+
| `nav.links[]` | Active | guia Links |
|
|
519
|
+
| `nav.links[].id` | Active | guia Links |
|
|
520
|
+
| `nav.links[].label` | Active | guia Links |
|
|
521
|
+
| `nav.links[].active` | Stored-only | editor grava; runtime final deriva por indice |
|
|
522
|
+
| `nav.links[].disabled` | Active | guia Links |
|
|
523
|
+
| `nav.links[].disableRipple` | Active | guia Links |
|
|
524
|
+
| `nav.links[].fitInkBarToContent` | Active | guia Links |
|
|
525
|
+
| `nav.links[].widgets[]` | Active | guia Links |
|
|
526
|
+
| `nav.links[].widgets[].inputs` | Active | JSON livre |
|
|
527
|
+
| `nav.links[].widgets[].outputs` | Active | JSON livre |
|
|
528
|
+
| `accessibility.highContrast` | Active | guia Acessibilidade |
|
|
529
|
+
| `accessibility.reduceMotion` | Active | guia Acessibilidade |
|
|
530
|
+
|
|
531
|
+
### Examples
|
|
532
|
+
|
|
533
|
+
### Minimal valid
|
|
534
|
+
|
|
535
|
+
```json
|
|
536
|
+
{
|
|
537
|
+
"behavior": { "lazyLoad": true, "reorderable": true },
|
|
538
|
+
"group": { "selectedIndex": 0, "stretchTabs": true },
|
|
539
|
+
"tabs": [
|
|
540
|
+
{ "id": "overview", "textLabel": "Overview" },
|
|
541
|
+
{ "id": "history", "textLabel": "History" }
|
|
542
|
+
]
|
|
543
|
+
}
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
### Typical/common
|
|
547
|
+
|
|
548
|
+
```json
|
|
549
|
+
{
|
|
550
|
+
"behavior": { "lazyLoad": true, "reorderable": true },
|
|
551
|
+
"group": { "selectedIndex": 0, "stretchTabs": true },
|
|
552
|
+
"tabs": [
|
|
553
|
+
{ "id": "overview", "textLabel": "Overview" },
|
|
554
|
+
{ "id": "history", "textLabel": "History" }
|
|
555
|
+
]
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### Advanced
|
|
560
|
+
|
|
561
|
+
```json
|
|
562
|
+
{
|
|
563
|
+
"behavior": { "lazyLoad": true, "reorderable": true },
|
|
564
|
+
"group": { "selectedIndex": 0, "stretchTabs": true },
|
|
565
|
+
"tabs": [
|
|
566
|
+
{ "id": "overview", "textLabel": "Overview" },
|
|
567
|
+
{ "id": "history", "textLabel": "History" }
|
|
568
|
+
]
|
|
569
|
+
}
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
### Enterprise scenario
|
|
573
|
+
|
|
574
|
+
```json
|
|
575
|
+
{}
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
## Known limitations and mismatches
|
|
579
|
+
|
|
580
|
+
| Path/Behavior | Observed behavior (runtime) | Desired behavior | Impact | Tracking issue | Target fix |
|
|
581
|
+
| --- | --- | --- | --- | --- | --- |
|
|
582
|
+
| coverage/mapping | Evidência textual preservada indica itens Partial/Declared-only. | Cobertura confirmada por evidência runtime + schema + editor. | Pode gerar uso de paths não totalmente ligados. | to-be-linked | next-doc-cycle |
|
|
583
|
+
|
|
584
|
+
## Compatibility and migration notes
|
|
585
|
+
|
|
586
|
+
| Concern | Affected versions | Migration action | Deadline | Notes |
|
|
587
|
+
| --- | --- | --- | --- | --- |
|
|
588
|
+
| legacy aliases and mixed status vocabulary | pre-canonical docs | manter apenas taxonomia canonica nas secoes novas e reduzir termos legados em revisoes incrementais | ongoing | backward compatibility documental ainda existe em secoes historicas |
|
|
589
|
+
|
|
590
|
+
## Source references
|
|
591
|
+
|
|
592
|
+
| Source type | Path/URL | Why it is source of truth | Last verified (YYYY-MM-DD) | Notes |
|
|
593
|
+
| --- | --- | --- | --- | --- |
|
|
594
|
+
| local-file | projects/praxis-tabs/src/lib/praxis-tabs-config-editor.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
595
|
+
| local-file | projects/praxis-tabs/src/lib/praxis-tabs.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
596
|
+
| local-file | projects/praxis-tabs/src/lib/quick-setup/tabs-quick-setup.component.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
597
|
+
| local-file | projects/praxis-tabs/src/lib/ai/tabs-ai-capabilities.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|