@praxisui/tabs 8.0.0-beta.2 → 8.0.0-beta.21

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.
@@ -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 |