@praxisui/tabs 3.0.0-beta.8 → 4.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -240,28 +240,28 @@ function infoDiagnostic(code, message, path) {
|
|
|
240
240
|
const PRAXIS_TABS_I18N_NAMESPACE = 'praxisTabs';
|
|
241
241
|
const PRAXIS_TABS_PT_BR = {
|
|
242
242
|
'settings.title': 'Configurar abas',
|
|
243
|
-
'settings.resetPreferences': 'Redefinir
|
|
244
|
-
'settings.resetDone': '
|
|
243
|
+
'settings.resetPreferences': 'Redefinir preferências de abas',
|
|
244
|
+
'settings.resetDone': 'Preferências de abas redefinidas',
|
|
245
245
|
'quickSetup.title': 'Criar abas rapidamente',
|
|
246
246
|
'emptyState.title': 'Nenhuma aba configurada',
|
|
247
247
|
'emptyState.description': 'Crie rapidamente suas abas ou abra o editor completo.',
|
|
248
248
|
'emptyState.primaryAction': 'Criar abas rapidamente',
|
|
249
249
|
'emptyState.secondaryAddEmpty': 'Adicionar aba vazia',
|
|
250
250
|
'emptyState.secondaryOpenEditor': 'Abrir editor completo',
|
|
251
|
-
'emptyState.navTitle': 'Sem
|
|
252
|
-
'emptyState.navDescription': 'Adicione
|
|
253
|
-
'emptyState.tabTitle': 'Sem
|
|
254
|
-
'emptyState.tabDescription': 'Adicione
|
|
251
|
+
'emptyState.navTitle': 'Sem conteúdo neste link',
|
|
252
|
+
'emptyState.navDescription': 'Adicione conteúdo ou use o editor para configurar.',
|
|
253
|
+
'emptyState.tabTitle': 'Sem conteúdo nesta aba',
|
|
254
|
+
'emptyState.tabDescription': 'Adicione conteúdo ou use o editor para configurar.',
|
|
255
255
|
'emptyState.openEditor': 'Abrir editor',
|
|
256
256
|
'chrome.closeTab': 'Fechar aba',
|
|
257
257
|
'chrome.moveTabLeft': 'Mover aba para esquerda',
|
|
258
258
|
'chrome.moveTabRight': 'Mover aba para direita',
|
|
259
259
|
'chrome.editTabs': 'Editar abas',
|
|
260
|
-
'defaults.newTabLabel': '
|
|
261
|
-
'defaults.newLinkLabel': '
|
|
260
|
+
'defaults.newTabLabel': 'Nova Aba',
|
|
261
|
+
'defaults.newLinkLabel': 'Novo Link',
|
|
262
262
|
'editor.tabs.behavior': 'Comportamento',
|
|
263
263
|
'editor.tabs.group': 'Grupo',
|
|
264
|
-
'editor.tabs.nav': '
|
|
264
|
+
'editor.tabs.nav': 'Navegação',
|
|
265
265
|
'editor.tabs.json': 'JSON',
|
|
266
266
|
'editor.tabs.style': 'Estilo',
|
|
267
267
|
'editor.tabs.items': 'Abas',
|
|
@@ -273,73 +273,73 @@ const PRAXIS_TABS_PT_BR = {
|
|
|
273
273
|
'editor.actions.addTab': 'Adicionar aba',
|
|
274
274
|
'editor.actions.addLink': 'Adicionar link',
|
|
275
275
|
'editor.actions.add': 'Adicionar',
|
|
276
|
-
'editor.actions.removeLabel': 'Remover
|
|
276
|
+
'editor.actions.removeLabel': 'Remover rótulo',
|
|
277
277
|
'editor.actions.dragToReorder': 'Arrastar para reordenar',
|
|
278
278
|
'editor.actions.removeComponent': 'Remover componente',
|
|
279
279
|
'editor.fields.groupAlignTabs': 'Alinhamento das abas',
|
|
280
|
-
'editor.fields.groupHeaderPosition': '
|
|
281
|
-
'editor.fields.selectedIndex': '
|
|
282
|
-
'editor.fields.animationDuration': '
|
|
280
|
+
'editor.fields.groupHeaderPosition': 'Posição do cabeçalho (header)',
|
|
281
|
+
'editor.fields.selectedIndex': 'Índice selecionado',
|
|
282
|
+
'editor.fields.animationDuration': 'Duração da animação',
|
|
283
283
|
'editor.fields.mode': 'Modo principal',
|
|
284
284
|
'editor.fields.color': 'Cor (M2)',
|
|
285
285
|
'editor.fields.backgroundColor': 'Cor de fundo (M2)',
|
|
286
286
|
'editor.fields.ariaLabel': 'aria-label',
|
|
287
287
|
'editor.fields.ariaLabelledby': 'aria-labelledby',
|
|
288
|
-
'editor.fields.jsonConfig': '
|
|
288
|
+
'editor.fields.jsonConfig': 'Configuração JSON',
|
|
289
289
|
'editor.fields.themeClass': 'Classe de tema (opcional)',
|
|
290
290
|
'editor.fields.density': 'Densidade',
|
|
291
291
|
'editor.fields.customCss': 'CSS a ser injetado no componente',
|
|
292
|
-
'editor.fields.addLabel': 'Adicionar
|
|
292
|
+
'editor.fields.addLabel': 'Adicionar rótulo',
|
|
293
293
|
'editor.fields.inputsJson': 'Inputs (JSON)',
|
|
294
294
|
'editor.fields.outputsJson': 'Outputs (JSON)',
|
|
295
295
|
'editor.fields.id': 'ID',
|
|
296
|
-
'editor.fields.label': '
|
|
297
|
-
'editor.fields.labelClass': 'Classe do
|
|
298
|
-
'editor.fields.bodyClass': 'Classe do
|
|
296
|
+
'editor.fields.label': 'Rótulo',
|
|
297
|
+
'editor.fields.labelClass': 'Classe do rótulo',
|
|
298
|
+
'editor.fields.bodyClass': 'Classe do conteúdo',
|
|
299
299
|
'editor.fields.resourcePath': 'Recurso (resourcePath)',
|
|
300
300
|
'editor.fields.addComponent': 'Adicionar componente',
|
|
301
301
|
'editor.fields.selectPlaceholder': '(selecione)',
|
|
302
302
|
'editor.fields.placeholder.animationDuration': '500ms',
|
|
303
303
|
'editor.fields.placeholder.themeClass': 'ex.: tabs-accented',
|
|
304
|
-
'editor.fields.placeholder.resourcePath': 'ex.:
|
|
304
|
+
'editor.fields.placeholder.resourcePath': 'ex.: usuários',
|
|
305
305
|
'editor.hints.selectedIndex': 'selectedIndex',
|
|
306
306
|
'editor.hints.animationDuration': 'animationDuration',
|
|
307
307
|
'editor.hints.preferTokens': 'Preferir tokens em Estilo.',
|
|
308
308
|
'editor.hints.tokenValueHelp': 'Valores aceitam CSS vars ou cores hex/rgb.',
|
|
309
|
-
'editor.json.valid': 'JSON
|
|
310
|
-
'editor.json.invalidPrefix': 'JSON
|
|
309
|
+
'editor.json.valid': 'JSON válido',
|
|
310
|
+
'editor.json.invalidPrefix': 'JSON inválido:',
|
|
311
311
|
'editor.json.syntaxError': 'Erro de sintaxe JSON',
|
|
312
312
|
'editor.sections.tokens': 'Tokens (Material 3)',
|
|
313
313
|
'editor.sections.customCss': 'CSS personalizado',
|
|
314
314
|
'editor.sections.scssSnippet': 'Snippet SCSS (para uso em styles.scss)',
|
|
315
315
|
'editor.mode.group': 'Grupo de abas',
|
|
316
|
-
'editor.mode.nav': '
|
|
317
|
-
'editor.diagnostics.title': '
|
|
316
|
+
'editor.mode.nav': 'Navegação por links',
|
|
317
|
+
'editor.diagnostics.title': 'Diagnósticos de authoring',
|
|
318
318
|
'editor.diagnostics.error': 'Erro',
|
|
319
319
|
'editor.diagnostics.warning': 'Aviso',
|
|
320
|
-
'editor.diagnostics.info': '
|
|
320
|
+
'editor.diagnostics.info': 'Informação',
|
|
321
321
|
'editor.cards.tab': 'Aba',
|
|
322
322
|
'editor.cards.link': 'Link',
|
|
323
323
|
'editor.presets.title': 'Presets:',
|
|
324
|
-
'editor.presets.primary': '
|
|
324
|
+
'editor.presets.primary': 'Primário',
|
|
325
325
|
'editor.presets.neutral': 'Neutro',
|
|
326
326
|
'editor.presets.highContrast': 'Alto contraste',
|
|
327
|
-
'editor.density.default': '
|
|
327
|
+
'editor.density.default': 'Padrão',
|
|
328
328
|
'editor.density.compact': 'Compacta',
|
|
329
|
-
'editor.density.comfortable': '
|
|
330
|
-
'editor.density.spacious': '
|
|
329
|
+
'editor.density.comfortable': 'Confortável',
|
|
330
|
+
'editor.density.spacious': 'Espaçosa',
|
|
331
331
|
'editor.options.none': '(nenhuma)',
|
|
332
|
-
'editor.options.default': '
|
|
333
|
-
'editor.options.start': '
|
|
332
|
+
'editor.options.default': 'Padrão',
|
|
333
|
+
'editor.options.start': 'Início',
|
|
334
334
|
'editor.options.center': 'Centro',
|
|
335
335
|
'editor.options.end': 'Fim',
|
|
336
|
-
'editor.options.aboveDefault': 'Acima (
|
|
336
|
+
'editor.options.aboveDefault': 'Acima (padrão)',
|
|
337
337
|
'editor.options.above': 'Acima',
|
|
338
338
|
'editor.options.below': 'Abaixo',
|
|
339
|
-
'editor.options.primary': 'Primary',
|
|
340
|
-
'editor.options.accent': 'Accent',
|
|
341
|
-
'editor.options.warn': 'Warn',
|
|
342
|
-
'editor.templates.form': '
|
|
339
|
+
'editor.options.primary': 'Primário (Primary)',
|
|
340
|
+
'editor.options.accent': 'Destaque (Accent)',
|
|
341
|
+
'editor.options.warn': 'Aviso (Warn)',
|
|
342
|
+
'editor.templates.form': 'Formulário',
|
|
343
343
|
'editor.templates.table': 'Tabela',
|
|
344
344
|
'editor.templates.crud': 'CRUD',
|
|
345
345
|
'editor.placeholders.tokenValue': 'var(--md-sys-color-primary) / #RRGGBB',
|
|
@@ -353,17 +353,17 @@ const PRAXIS_TABS_PT_BR = {
|
|
|
353
353
|
'editor.tokens.inactiveLabel': 'Texto inativo',
|
|
354
354
|
'editor.tokens.inactiveHoverLabel': 'Texto inativo (hover)',
|
|
355
355
|
'editor.tokens.inactiveFocusLabel': 'Texto inativo (focus)',
|
|
356
|
-
'editor.tokens.paginationIcon': '
|
|
356
|
+
'editor.tokens.paginationIcon': 'Ícones de paginação',
|
|
357
357
|
'editor.tokens.divider': 'Divisor/linha',
|
|
358
|
-
'editor.tokens.headerBackground': 'Fundo do header',
|
|
359
|
-
'editor.toggles.closeable': '
|
|
358
|
+
'editor.tokens.headerBackground': 'Fundo do cabeçalho (header)',
|
|
359
|
+
'editor.toggles.closeable': 'Fechável',
|
|
360
360
|
'editor.toggles.lazyLoad': 'Carregar sob demanda',
|
|
361
|
-
'editor.toggles.reorderable': '
|
|
362
|
-
'editor.toggles.dynamicHeight': 'Altura
|
|
363
|
-
'editor.toggles.fitInkBarToContent': 'Indicador ajustado ao
|
|
364
|
-
'editor.toggles.disablePagination': 'Sem
|
|
361
|
+
'editor.toggles.reorderable': 'Reordenável',
|
|
362
|
+
'editor.toggles.dynamicHeight': 'Altura dinâmica',
|
|
363
|
+
'editor.toggles.fitInkBarToContent': 'Indicador ajustado ao conteúdo',
|
|
364
|
+
'editor.toggles.disablePagination': 'Sem paginação',
|
|
365
365
|
'editor.toggles.disableRipple': 'Sem ripple',
|
|
366
|
-
'editor.toggles.preserveContent': 'Preservar
|
|
366
|
+
'editor.toggles.preserveContent': 'Preservar conteúdo',
|
|
367
367
|
'editor.toggles.stretchTabs': 'Esticar abas',
|
|
368
368
|
'editor.toggles.highContrast': 'Alto contraste',
|
|
369
369
|
'editor.toggles.reduceMotion': 'Reduzir movimento',
|
|
@@ -372,9 +372,9 @@ const PRAXIS_TABS_PT_BR = {
|
|
|
372
372
|
'editor.empty.noLinks': 'Nenhum link definido.',
|
|
373
373
|
'editor.empty.noTabs': 'Nenhuma aba definida.',
|
|
374
374
|
'quickSetup.mode.group': 'Grupo de abas',
|
|
375
|
-
'quickSetup.mode.nav': '
|
|
375
|
+
'quickSetup.mode.nav': 'Navegação por links',
|
|
376
376
|
'quickSetup.fields.addLabelPlaceholder': 'Ex.: Dados Gerais',
|
|
377
|
-
'quickSetup.hints.emptyLabels': 'Adicione um ou mais
|
|
377
|
+
'quickSetup.hints.emptyLabels': 'Adicione um ou mais rótulos para criar as abas.',
|
|
378
378
|
};
|
|
379
379
|
const PRAXIS_TABS_EN_US = {
|
|
380
380
|
'settings.title': 'Configure tabs',
|
|
@@ -3684,4 +3684,3 @@ function providePraxisTabsMetadata() {
|
|
|
3684
3684
|
*/
|
|
3685
3685
|
|
|
3686
3686
|
export { PRAXIS_TABS_COMPONENT_METADATA, PRAXIS_TABS_I18N_CONFIG, PRAXIS_TABS_I18N_NAMESPACE, PraxisTabs, PraxisTabsConfigEditor, TABS_AI_CAPABILITIES, buildTabsApplyPlan, createPraxisTabsI18nConfig, createTabsAuthoringDocument, normalizeTabsAuthoringDocument, providePraxisTabsI18n, providePraxisTabsMetadata, serializeTabsAuthoringDocument, toCanonicalTabsConfig, validateTabsAuthoringDocument };
|
|
3687
|
-
//# sourceMappingURL=praxisui-tabs.mjs.map
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/tabs",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0-beta.0",
|
|
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": "^
|
|
11
|
-
"@praxisui/dynamic-fields": "^
|
|
12
|
-
"@praxisui/settings-panel": "^
|
|
10
|
+
"@praxisui/core": "^4.0.0-beta.0",
|
|
11
|
+
"@praxisui/dynamic-fields": "^4.0.0-beta.0",
|
|
12
|
+
"@praxisui/settings-panel": "^4.0.0-beta.0"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"tslib": "^2.3.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"praxisui-tabs.mjs","sources":["../../../projects/praxis-tabs/src/lib/tabs-editor-capability.ts","../../../projects/praxis-tabs/src/lib/praxis-tabs.i18n.ts","../../../projects/praxis-tabs/src/lib/praxis-tabs-config-editor.ts","../../../projects/praxis-tabs/src/lib/quick-setup/tabs-quick-setup.component.ts","../../../projects/praxis-tabs/src/lib/ai/tabs-ai-capabilities.ts","../../../projects/praxis-tabs/src/lib/ai/tabs-ai.adapter.ts","../../../projects/praxis-tabs/src/lib/praxis-tabs.ts","../../../projects/praxis-tabs/src/lib/praxis-tabs.metadata.ts","../../../projects/praxis-tabs/src/public-api.ts","../../../projects/praxis-tabs/src/praxisui-tabs.ts"],"sourcesContent":["import { TabsMetadata } from './praxis-tabs';\nimport {\n TabsApplyPlan,\n TabsAuthoringBindings,\n TabsAuthoringDocument,\n TabsBindingsDiff,\n TabsEditorDiagnostic,\n TabsRuntimeContext,\n} from './tabs-editor-document.model';\n\nconst DOCUMENT_KIND = 'praxis.tabs.editor';\nconst DOCUMENT_VERSION = 1;\n\nexport function createTabsAuthoringDocument(source: {\n config?: TabsMetadata | null;\n bindings?: TabsAuthoringBindings;\n}): TabsAuthoringDocument {\n return normalizeTabsAuthoringDocument({\n kind: DOCUMENT_KIND,\n version: DOCUMENT_VERSION,\n config: source.config ?? {},\n bindings: source.bindings,\n });\n}\n\nexport function normalizeTabsAuthoringDocument(\n doc: TabsAuthoringDocument,\n): TabsAuthoringDocument {\n return {\n kind: DOCUMENT_KIND,\n version: DOCUMENT_VERSION,\n config: normalizeTabsConfig(doc?.config),\n bindings: normalizeBindings(doc?.bindings),\n };\n}\n\nexport function validateTabsAuthoringDocument(\n doc: TabsAuthoringDocument,\n _context?: TabsRuntimeContext,\n): TabsEditorDiagnostic[] {\n const normalized = normalizeTabsAuthoringDocument(doc);\n const diagnostics: TabsEditorDiagnostic[] = [];\n\n validateModeAmbiguity(normalized.config, diagnostics);\n validateDuplicateTabIds(normalized.config, diagnostics);\n validateDuplicateLinkIds(normalized.config, diagnostics);\n validateUnsupportedGuidedFields(normalized.config, diagnostics);\n\n return diagnostics;\n}\n\nexport function toCanonicalTabsConfig(\n doc: TabsAuthoringDocument,\n _context?: TabsRuntimeContext,\n): TabsMetadata {\n const normalized = normalizeTabsAuthoringDocument(doc);\n return normalizeTabsConfig(stripUnsupportedAuthoringFields(normalized.config));\n}\n\nexport function buildTabsApplyPlan(\n doc: TabsAuthoringDocument,\n runtime?: TabsRuntimeContext,\n options?: {\n saveConfig?: boolean;\n saveBindings?: boolean;\n },\n): TabsApplyPlan {\n const normalized = normalizeTabsAuthoringDocument(doc);\n const bindingsPatch = normalized.bindings;\n const diff = deriveBindingsDiff(bindingsPatch, runtime?.currentBindings);\n const diagnostics = validateTabsAuthoringDocument(normalized, runtime);\n\n return {\n canonicalConfig: toCanonicalTabsConfig(normalized, runtime),\n bindingsPatch,\n persistence: {\n saveConfig: options?.saveConfig === true,\n saveBindings: options?.saveBindings === true,\n },\n runtime: {\n refreshSelection: true,\n rebuildLazyState: true,\n refreshPersistenceScope: diff.requiresPersistenceKeyRefresh,\n },\n diff,\n diagnostics,\n };\n}\n\nexport function serializeTabsAuthoringDocument(\n doc: TabsAuthoringDocument,\n): TabsAuthoringDocument {\n return normalizeTabsAuthoringDocument(doc);\n}\n\nfunction normalizeTabsConfig(config: TabsMetadata | null | undefined): TabsMetadata {\n const next = cloneJson(config ?? {});\n\n if (!Array.isArray(next.tabs) || next.tabs.length === 0) {\n delete next.tabs;\n }\n\n if (!next.nav || typeof next.nav !== 'object') {\n delete next.nav;\n } else if (!Array.isArray(next.nav.links) || next.nav.links.length === 0) {\n delete (next.nav as { links?: unknown }).links;\n }\n\n if (next.group) {\n next.group.selectedIndex = clampIndex(\n next.group.selectedIndex,\n next.tabs?.length ?? 0,\n );\n }\n\n if (next.nav) {\n next.nav.selectedIndex = clampIndex(\n next.nav.selectedIndex,\n next.nav.links?.length ?? 0,\n );\n }\n\n if (Array.isArray(next.nav?.links)) {\n next.nav.links = next.nav.links.map((link) => {\n const copy = { ...link };\n delete copy.active;\n return copy;\n });\n }\n\n return next;\n}\n\nfunction normalizeBindings(\n bindings: TabsAuthoringBindings | undefined,\n): TabsAuthoringBindings | undefined {\n if (!bindings) return undefined;\n\n const next: TabsAuthoringBindings = {\n tabsId: normalizeNullableString(bindings.tabsId),\n componentInstanceId: normalizeNullableString(bindings.componentInstanceId),\n };\n\n if (next.tabsId === undefined && next.componentInstanceId === undefined) {\n return undefined;\n }\n\n return next;\n}\n\nfunction deriveBindingsDiff(\n next?: TabsAuthoringBindings,\n current?: TabsAuthoringBindings,\n): TabsBindingsDiff {\n const normalizedNext = normalizeBindings(next) ?? {};\n const normalizedCurrent = normalizeBindings(current) ?? {};\n\n const tabsIdChanged = normalizedNext.tabsId !== normalizedCurrent.tabsId;\n const componentInstanceIdChanged =\n normalizedNext.componentInstanceId !== normalizedCurrent.componentInstanceId;\n\n return {\n tabsIdChanged,\n componentInstanceIdChanged,\n requiresPersistenceKeyRefresh: tabsIdChanged || componentInstanceIdChanged,\n };\n}\n\nfunction validateModeAmbiguity(\n config: TabsMetadata,\n diagnostics: TabsEditorDiagnostic[],\n): void {\n if (config.tabs?.length && config.nav?.links?.length) {\n diagnostics.push(warnDiagnostic(\n 'tabs.config.mode.ambiguous',\n 'Tabs authoring must resolve to a single primary mode: group or nav.',\n 'config',\n ));\n }\n}\n\nfunction validateDuplicateTabIds(\n config: TabsMetadata,\n diagnostics: TabsEditorDiagnostic[],\n): void {\n const seen = new Set<string>();\n\n (config.tabs ?? []).forEach((tab, index) => {\n const id = normalizeId(tab.id);\n if (!id) return;\n if (seen.has(id)) {\n diagnostics.push(errorDiagnostic(\n 'tabs.config.tabs.id.duplicate',\n 'Duplicate tab id detected.',\n `config.tabs[${index}].id`,\n ));\n return;\n }\n seen.add(id);\n });\n}\n\nfunction validateDuplicateLinkIds(\n config: TabsMetadata,\n diagnostics: TabsEditorDiagnostic[],\n): void {\n const seen = new Set<string>();\n\n (config.nav?.links ?? []).forEach((link, index) => {\n const id = normalizeId(link.id);\n if (!id) return;\n if (seen.has(id)) {\n diagnostics.push(errorDiagnostic(\n 'tabs.config.nav.links.id.duplicate',\n 'Duplicate nav link id detected.',\n `config.nav.links[${index}].id`,\n ));\n return;\n }\n seen.add(id);\n });\n}\n\nfunction validateUnsupportedGuidedFields(\n config: TabsMetadata,\n diagnostics: TabsEditorDiagnostic[],\n): void {\n if (config.group?.contentTabIndex !== undefined) {\n diagnostics.push(infoDiagnostic(\n 'tabs.config.group.contentTabIndex.unsupported',\n 'group.contentTabIndex is outside the supported authoring surface.',\n 'config.group.contentTabIndex',\n ));\n }\n\n if (config.accessibility?.ariaLabels !== undefined) {\n diagnostics.push(infoDiagnostic(\n 'tabs.config.accessibility.ariaLabels.unsupported',\n 'accessibility.ariaLabels is outside the supported authoring surface.',\n 'config.accessibility.ariaLabels',\n ));\n }\n\n if (config.accessibility?.keyboardNavigation !== undefined) {\n diagnostics.push(infoDiagnostic(\n 'tabs.config.accessibility.keyboardNavigation.unsupported',\n 'accessibility.keyboardNavigation is outside the supported authoring surface.',\n 'config.accessibility.keyboardNavigation',\n ));\n }\n\n if (config.appearance?.tokens?.['inactive-ripple-color'] !== undefined) {\n diagnostics.push(infoDiagnostic(\n 'tabs.config.appearance.tokens.inactiveRippleColor.unsupported',\n 'appearance.tokens.inactive-ripple-color is outside the supported authoring surface.',\n 'config.appearance.tokens.inactive-ripple-color',\n ));\n }\n}\n\nfunction stripUnsupportedAuthoringFields(config: TabsMetadata): TabsMetadata {\n const next = cloneJson(config);\n\n if (next.group) {\n delete next.group.contentTabIndex;\n }\n\n if (next.accessibility) {\n delete next.accessibility.ariaLabels;\n delete next.accessibility.keyboardNavigation;\n }\n\n if (next.appearance?.tokens) {\n delete next.appearance.tokens['inactive-ripple-color'];\n }\n\n if (Array.isArray(next.nav?.links)) {\n next.nav.links = next.nav.links.map((link) => {\n const copy = { ...link };\n delete copy.active;\n return copy;\n });\n }\n\n return next;\n}\n\nfunction clampIndex(index: number | undefined, size: number): number {\n if (size <= 0) return 0;\n const numeric = Number(index);\n const safe = Number.isFinite(numeric) ? Math.trunc(numeric) : 0;\n return Math.min(Math.max(safe, 0), size - 1);\n}\n\nfunction normalizeNullableString(value: unknown): string | null | undefined {\n if (value === undefined) return undefined;\n if (value === null) return null;\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n return trimmed || null;\n}\n\nfunction normalizeId(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n return trimmed || null;\n}\n\nfunction cloneJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value ?? null));\n}\n\nfunction errorDiagnostic(\n code: string,\n message: string,\n path?: string,\n): TabsEditorDiagnostic {\n return { level: 'error', code, message, path };\n}\n\nfunction warnDiagnostic(\n code: string,\n message: string,\n path?: string,\n): TabsEditorDiagnostic {\n return { level: 'warning', code, message, path };\n}\n\nfunction infoDiagnostic(\n code: string,\n message: string,\n path?: string,\n): TabsEditorDiagnostic {\n return { level: 'info', code, message, path };\n}\n","import {\n providePraxisI18n,\n type PraxisI18nConfig,\n type PraxisI18nDictionary,\n} from '@praxisui/core';\nimport type { Provider } from '@angular/core';\n\nexport const PRAXIS_TABS_I18N_NAMESPACE = 'praxisTabs';\n\nconst PRAXIS_TABS_PT_BR: PraxisI18nDictionary = {\n 'settings.title': 'Configurar abas',\n 'settings.resetPreferences': 'Redefinir preferencias de abas',\n 'settings.resetDone': 'Preferencias de abas redefinidas',\n 'quickSetup.title': 'Criar abas rapidamente',\n 'emptyState.title': 'Nenhuma aba configurada',\n 'emptyState.description': 'Crie rapidamente suas abas ou abra o editor completo.',\n 'emptyState.primaryAction': 'Criar abas rapidamente',\n 'emptyState.secondaryAddEmpty': 'Adicionar aba vazia',\n 'emptyState.secondaryOpenEditor': 'Abrir editor completo',\n 'emptyState.navTitle': 'Sem conteudo neste link',\n 'emptyState.navDescription': 'Adicione conteudo ou use o editor para configurar.',\n 'emptyState.tabTitle': 'Sem conteudo nesta aba',\n 'emptyState.tabDescription': 'Adicione conteudo ou use o editor para configurar.',\n 'emptyState.openEditor': 'Abrir editor',\n 'chrome.closeTab': 'Fechar aba',\n 'chrome.moveTabLeft': 'Mover aba para esquerda',\n 'chrome.moveTabRight': 'Mover aba para direita',\n 'chrome.editTabs': 'Editar abas',\n 'defaults.newTabLabel': 'New Tab',\n 'defaults.newLinkLabel': 'New Link',\n 'editor.tabs.behavior': 'Comportamento',\n 'editor.tabs.group': 'Grupo',\n 'editor.tabs.nav': 'Navegacao',\n 'editor.tabs.json': 'JSON',\n 'editor.tabs.style': 'Estilo',\n 'editor.tabs.items': 'Abas',\n 'editor.tabs.accessibility': 'Acessibilidade',\n 'editor.tabs.links': 'Links',\n 'editor.actions.format': 'Formatar',\n 'editor.actions.reset': 'Resetar',\n 'editor.actions.clearTokens': 'Limpar tokens',\n 'editor.actions.addTab': 'Adicionar aba',\n 'editor.actions.addLink': 'Adicionar link',\n 'editor.actions.add': 'Adicionar',\n 'editor.actions.removeLabel': 'Remover rotulo',\n 'editor.actions.dragToReorder': 'Arrastar para reordenar',\n 'editor.actions.removeComponent': 'Remover componente',\n 'editor.fields.groupAlignTabs': 'Alinhamento das abas',\n 'editor.fields.groupHeaderPosition': 'Posicao do header',\n 'editor.fields.selectedIndex': 'Indice selecionado',\n 'editor.fields.animationDuration': 'Duracao da animacao',\n 'editor.fields.mode': 'Modo principal',\n 'editor.fields.color': 'Cor (M2)',\n 'editor.fields.backgroundColor': 'Cor de fundo (M2)',\n 'editor.fields.ariaLabel': 'aria-label',\n 'editor.fields.ariaLabelledby': 'aria-labelledby',\n 'editor.fields.jsonConfig': 'Configuracao JSON',\n 'editor.fields.themeClass': 'Classe de tema (opcional)',\n 'editor.fields.density': 'Densidade',\n 'editor.fields.customCss': 'CSS a ser injetado no componente',\n 'editor.fields.addLabel': 'Adicionar rotulo',\n 'editor.fields.inputsJson': 'Inputs (JSON)',\n 'editor.fields.outputsJson': 'Outputs (JSON)',\n 'editor.fields.id': 'ID',\n 'editor.fields.label': 'Rotulo',\n 'editor.fields.labelClass': 'Classe do rotulo',\n 'editor.fields.bodyClass': 'Classe do conteudo',\n 'editor.fields.resourcePath': 'Recurso (resourcePath)',\n 'editor.fields.addComponent': 'Adicionar componente',\n 'editor.fields.selectPlaceholder': '(selecione)',\n 'editor.fields.placeholder.animationDuration': '500ms',\n 'editor.fields.placeholder.themeClass': 'ex.: tabs-accented',\n 'editor.fields.placeholder.resourcePath': 'ex.: usuarios',\n 'editor.hints.selectedIndex': 'selectedIndex',\n 'editor.hints.animationDuration': 'animationDuration',\n 'editor.hints.preferTokens': 'Preferir tokens em Estilo.',\n 'editor.hints.tokenValueHelp': 'Valores aceitam CSS vars ou cores hex/rgb.',\n 'editor.json.valid': 'JSON valido',\n 'editor.json.invalidPrefix': 'JSON invalido:',\n 'editor.json.syntaxError': 'Erro de sintaxe JSON',\n 'editor.sections.tokens': 'Tokens (Material 3)',\n 'editor.sections.customCss': 'CSS personalizado',\n 'editor.sections.scssSnippet': 'Snippet SCSS (para uso em styles.scss)',\n 'editor.mode.group': 'Grupo de abas',\n 'editor.mode.nav': 'Navegacao por links',\n 'editor.diagnostics.title': 'Diagnosticos de authoring',\n 'editor.diagnostics.error': 'Erro',\n 'editor.diagnostics.warning': 'Aviso',\n 'editor.diagnostics.info': 'Informacao',\n 'editor.cards.tab': 'Aba',\n 'editor.cards.link': 'Link',\n 'editor.presets.title': 'Presets:',\n 'editor.presets.primary': 'Primario',\n 'editor.presets.neutral': 'Neutro',\n 'editor.presets.highContrast': 'Alto contraste',\n 'editor.density.default': 'Padrao',\n 'editor.density.compact': 'Compacta',\n 'editor.density.comfortable': 'Confortavel',\n 'editor.density.spacious': 'Espacosa',\n 'editor.options.none': '(nenhuma)',\n 'editor.options.default': 'Padrao',\n 'editor.options.start': 'Inicio',\n 'editor.options.center': 'Centro',\n 'editor.options.end': 'Fim',\n 'editor.options.aboveDefault': 'Acima (padrao)',\n 'editor.options.above': 'Acima',\n 'editor.options.below': 'Abaixo',\n 'editor.options.primary': 'Primary',\n 'editor.options.accent': 'Accent',\n 'editor.options.warn': 'Warn',\n 'editor.templates.form': 'Form',\n 'editor.templates.table': 'Tabela',\n 'editor.templates.crud': 'CRUD',\n 'editor.placeholders.tokenValue': 'var(--md-sys-color-primary) / #RRGGBB',\n 'editor.placeholders.customCssExample': '.praxis-tabs-root .mdc-tab__text-label { font-weight: 600; }',\n 'editor.tokens.activeIndicator': 'Indicador ativo',\n 'editor.tokens.activeLabel': 'Texto ativo',\n 'editor.tokens.activeHoverIndicator': 'Indicador ativo (hover)',\n 'editor.tokens.activeHoverLabel': 'Texto ativo (hover)',\n 'editor.tokens.activeFocusIndicator': 'Indicador ativo (focus)',\n 'editor.tokens.activeFocusLabel': 'Texto ativo (focus)',\n 'editor.tokens.inactiveLabel': 'Texto inativo',\n 'editor.tokens.inactiveHoverLabel': 'Texto inativo (hover)',\n 'editor.tokens.inactiveFocusLabel': 'Texto inativo (focus)',\n 'editor.tokens.paginationIcon': 'Icones de paginacao',\n 'editor.tokens.divider': 'Divisor/linha',\n 'editor.tokens.headerBackground': 'Fundo do header',\n 'editor.toggles.closeable': 'Fechavel',\n 'editor.toggles.lazyLoad': 'Carregar sob demanda',\n 'editor.toggles.reorderable': 'Reordenavel',\n 'editor.toggles.dynamicHeight': 'Altura dinamica',\n 'editor.toggles.fitInkBarToContent': 'Indicador ajustado ao conteudo',\n 'editor.toggles.disablePagination': 'Sem paginacao',\n 'editor.toggles.disableRipple': 'Sem ripple',\n 'editor.toggles.preserveContent': 'Preservar conteudo',\n 'editor.toggles.stretchTabs': 'Esticar abas',\n 'editor.toggles.highContrast': 'Alto contraste',\n 'editor.toggles.reduceMotion': 'Reduzir movimento',\n 'editor.toggles.disabled': 'Desativada',\n 'editor.toggles.linkDisabled': 'Desativado',\n 'editor.empty.noLinks': 'Nenhum link definido.',\n 'editor.empty.noTabs': 'Nenhuma aba definida.',\n 'quickSetup.mode.group': 'Grupo de abas',\n 'quickSetup.mode.nav': 'Navegacao por links',\n 'quickSetup.fields.addLabelPlaceholder': 'Ex.: Dados Gerais',\n 'quickSetup.hints.emptyLabels': 'Adicione um ou mais rotulos para criar as abas.',\n};\n\nconst PRAXIS_TABS_EN_US: PraxisI18nDictionary = {\n 'settings.title': 'Configure tabs',\n 'settings.resetPreferences': 'Reset tab preferences',\n 'settings.resetDone': 'Tab preferences reset',\n 'quickSetup.title': 'Create tabs quickly',\n 'emptyState.title': 'No tabs configured',\n 'emptyState.description': 'Create tabs quickly or open the full editor.',\n 'emptyState.primaryAction': 'Create tabs quickly',\n 'emptyState.secondaryAddEmpty': 'Add empty tab',\n 'emptyState.secondaryOpenEditor': 'Open full editor',\n 'emptyState.navTitle': 'No content in this link',\n 'emptyState.navDescription': 'Add content or use the editor to configure it.',\n 'emptyState.tabTitle': 'No content in this tab',\n 'emptyState.tabDescription': 'Add content or use the editor to configure it.',\n 'emptyState.openEditor': 'Open editor',\n 'chrome.closeTab': 'Close tab',\n 'chrome.moveTabLeft': 'Move tab left',\n 'chrome.moveTabRight': 'Move tab right',\n 'chrome.editTabs': 'Edit tabs',\n 'defaults.newTabLabel': 'New Tab',\n 'defaults.newLinkLabel': 'New Link',\n 'editor.tabs.behavior': 'Behavior',\n 'editor.tabs.group': 'Group',\n 'editor.tabs.nav': 'Navigation',\n 'editor.tabs.json': 'JSON',\n 'editor.tabs.style': 'Style',\n 'editor.tabs.items': 'Tabs',\n 'editor.tabs.accessibility': 'Accessibility',\n 'editor.tabs.links': 'Links',\n 'editor.actions.format': 'Format',\n 'editor.actions.reset': 'Reset',\n 'editor.actions.clearTokens': 'Clear tokens',\n 'editor.actions.addTab': 'Add tab',\n 'editor.actions.addLink': 'Add link',\n 'editor.actions.add': 'Add',\n 'editor.actions.removeLabel': 'Remove label',\n 'editor.actions.dragToReorder': 'Drag to reorder',\n 'editor.actions.removeComponent': 'Remove component',\n 'editor.fields.groupAlignTabs': 'Tab alignment',\n 'editor.fields.groupHeaderPosition': 'Header position',\n 'editor.fields.selectedIndex': 'Selected index',\n 'editor.fields.animationDuration': 'Animation duration',\n 'editor.fields.mode': 'Primary mode',\n 'editor.fields.color': 'Color (M2)',\n 'editor.fields.backgroundColor': 'Background color (M2)',\n 'editor.fields.ariaLabel': 'aria-label',\n 'editor.fields.ariaLabelledby': 'aria-labelledby',\n 'editor.fields.jsonConfig': 'JSON configuration',\n 'editor.fields.themeClass': 'Theme class (optional)',\n 'editor.fields.density': 'Density',\n 'editor.fields.customCss': 'CSS injected into the component',\n 'editor.fields.addLabel': 'Add label',\n 'editor.fields.inputsJson': 'Inputs (JSON)',\n 'editor.fields.outputsJson': 'Outputs (JSON)',\n 'editor.fields.id': 'ID',\n 'editor.fields.label': 'Label',\n 'editor.fields.labelClass': 'Label class',\n 'editor.fields.bodyClass': 'Body class',\n 'editor.fields.resourcePath': 'Resource (resourcePath)',\n 'editor.fields.addComponent': 'Add component',\n 'editor.fields.selectPlaceholder': '(select)',\n 'editor.fields.placeholder.animationDuration': '500ms',\n 'editor.fields.placeholder.themeClass': 'e.g. tabs-accented',\n 'editor.fields.placeholder.resourcePath': 'e.g. users',\n 'editor.hints.selectedIndex': 'selectedIndex',\n 'editor.hints.animationDuration': 'animationDuration',\n 'editor.hints.preferTokens': 'Prefer tokens in Style.',\n 'editor.hints.tokenValueHelp': 'Values accept CSS vars or hex/rgb colors.',\n 'editor.json.valid': 'Valid JSON',\n 'editor.json.invalidPrefix': 'Invalid JSON:',\n 'editor.json.syntaxError': 'JSON syntax error',\n 'editor.sections.tokens': 'Tokens (Material 3)',\n 'editor.sections.customCss': 'Custom CSS',\n 'editor.sections.scssSnippet': 'SCSS snippet (for styles.scss)',\n 'editor.mode.group': 'Tab group',\n 'editor.mode.nav': 'Link navigation',\n 'editor.diagnostics.title': 'Authoring diagnostics',\n 'editor.diagnostics.error': 'Error',\n 'editor.diagnostics.warning': 'Warning',\n 'editor.diagnostics.info': 'Info',\n 'editor.cards.tab': 'Tab',\n 'editor.cards.link': 'Link',\n 'editor.presets.title': 'Presets:',\n 'editor.presets.primary': 'Primary',\n 'editor.presets.neutral': 'Neutral',\n 'editor.presets.highContrast': 'High contrast',\n 'editor.density.default': 'Default',\n 'editor.density.compact': 'Compact',\n 'editor.density.comfortable': 'Comfortable',\n 'editor.density.spacious': 'Spacious',\n 'editor.options.none': '(none)',\n 'editor.options.default': 'Default',\n 'editor.options.start': 'Start',\n 'editor.options.center': 'Center',\n 'editor.options.end': 'End',\n 'editor.options.aboveDefault': 'Above (default)',\n 'editor.options.above': 'Above',\n 'editor.options.below': 'Below',\n 'editor.options.primary': 'Primary',\n 'editor.options.accent': 'Accent',\n 'editor.options.warn': 'Warn',\n 'editor.templates.form': 'Form',\n 'editor.templates.table': 'Table',\n 'editor.templates.crud': 'CRUD',\n 'editor.placeholders.tokenValue': 'var(--md-sys-color-primary) / #RRGGBB',\n 'editor.placeholders.customCssExample': '.praxis-tabs-root .mdc-tab__text-label { font-weight: 600; }',\n 'editor.tokens.activeIndicator': 'Active indicator',\n 'editor.tokens.activeLabel': 'Active label',\n 'editor.tokens.activeHoverIndicator': 'Active indicator (hover)',\n 'editor.tokens.activeHoverLabel': 'Active label (hover)',\n 'editor.tokens.activeFocusIndicator': 'Active indicator (focus)',\n 'editor.tokens.activeFocusLabel': 'Active label (focus)',\n 'editor.tokens.inactiveLabel': 'Inactive label',\n 'editor.tokens.inactiveHoverLabel': 'Inactive label (hover)',\n 'editor.tokens.inactiveFocusLabel': 'Inactive label (focus)',\n 'editor.tokens.paginationIcon': 'Pagination icons',\n 'editor.tokens.divider': 'Divider',\n 'editor.tokens.headerBackground': 'Header background',\n 'editor.toggles.closeable': 'Closeable',\n 'editor.toggles.lazyLoad': 'Lazy load',\n 'editor.toggles.reorderable': 'Reorderable',\n 'editor.toggles.dynamicHeight': 'Dynamic height',\n 'editor.toggles.fitInkBarToContent': 'Fit indicator to content',\n 'editor.toggles.disablePagination': 'Disable pagination',\n 'editor.toggles.disableRipple': 'Disable ripple',\n 'editor.toggles.preserveContent': 'Preserve content',\n 'editor.toggles.stretchTabs': 'Stretch tabs',\n 'editor.toggles.highContrast': 'High contrast',\n 'editor.toggles.reduceMotion': 'Reduce motion',\n 'editor.toggles.disabled': 'Disabled',\n 'editor.toggles.linkDisabled': 'Disabled',\n 'editor.empty.noLinks': 'No links defined.',\n 'editor.empty.noTabs': 'No tabs defined.',\n 'quickSetup.mode.group': 'Tab group',\n 'quickSetup.mode.nav': 'Link navigation',\n 'quickSetup.fields.addLabelPlaceholder': 'e.g. General Data',\n 'quickSetup.hints.emptyLabels': 'Add one or more labels to create the tabs.',\n};\n\nexport function createPraxisTabsI18nConfig(): Partial<PraxisI18nConfig> {\n return {\n fallbackLocale: 'pt-BR',\n namespaces: {\n [PRAXIS_TABS_I18N_NAMESPACE]: {\n 'pt-BR': PRAXIS_TABS_PT_BR,\n 'en-US': PRAXIS_TABS_EN_US,\n },\n },\n };\n}\n\nexport const PRAXIS_TABS_I18N_CONFIG = createPraxisTabsI18nConfig();\n\nexport function providePraxisTabsI18n(): Provider {\n return providePraxisI18n(PRAXIS_TABS_I18N_CONFIG as PraxisI18nConfig);\n}\n","import {\n Component,\n Inject,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { BehaviorSubject } from 'rxjs';\nimport { SETTINGS_PANEL_DATA, SettingsValueProvider } from '@praxisui/settings-panel';\nimport { TabsMetadata } from './praxis-tabs';\nimport {\n ComponentMetadataRegistry,\n PraxisI18nService,\n WidgetDefinition,\n providePraxisI18nConfig,\n} from '@praxisui/core';\nimport {\n createTabsAuthoringDocument,\n normalizeTabsAuthoringDocument,\n validateTabsAuthoringDocument,\n} from './tabs-editor-capability';\nimport {\n TabsAuthoringBindings,\n TabsAuthoringDocument,\n TabsEditorDiagnostic,\n} from './tabs-editor-document.model';\nimport { PRAXIS_TABS_I18N_CONFIG, PRAXIS_TABS_I18N_NAMESPACE } from './praxis-tabs.i18n';\n\n@Component({\n selector: 'praxis-tabs-config-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatTabsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n PraxisIconDirective,\n MatButtonModule,\n MatSlideToggleModule,\n DragDropModule,\n MatTooltipModule,\n ],\n providers: [providePraxisI18nConfig(PRAXIS_TABS_I18N_CONFIG)],\n template: `\n <div class=\"editor-shell\">\n <div class=\"editor-topbar\">\n <mat-form-field appearance=\"outline\" class=\"editor-mode-field\">\n <mat-label>{{ t('editor.fields.mode', 'Modo principal') }}</mat-label>\n <select matNativeControl [ngModel]=\"primaryMode\" (ngModelChange)=\"setPrimaryMode($event)\">\n <option value=\"group\">{{ t('editor.mode.group', 'Grupo de abas') }}</option>\n <option value=\"nav\">{{ t('editor.mode.nav', 'Navegacao por links') }}</option>\n </select>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"diagnostics.length\" class=\"editor-diagnostics\">\n <div class=\"editor-diagnostics-title\">{{ t('editor.diagnostics.title', 'Diagnosticos de authoring') }}</div>\n <div\n *ngFor=\"let diagnostic of diagnostics\"\n class=\"editor-diagnostic\"\n [class.level-error]=\"diagnostic.level === 'error'\"\n [class.level-warning]=\"diagnostic.level === 'warning'\"\n [class.level-info]=\"diagnostic.level === 'info'\"\n >\n <strong>{{ diagnosticLevelLabel(diagnostic.level) }}</strong>\n <span>{{ diagnostic.message }}</span>\n <code *ngIf=\"diagnostic.path\">{{ diagnostic.path }}</code>\n </div>\n </div>\n\n <mat-tab-group class=\"editor-tabs\">\n <mat-tab [label]=\"t('editor.tabs.behavior', 'Comportamento')\">\n <div class=\"editor-section\">\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"behavior.closeable\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.closeable', 'Fechavel') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"behavior.lazyLoad\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.lazyLoad', 'Carregar sob demanda') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"behavior.reorderable\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.reorderable', 'Reordenavel') }}</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n <mat-tab [label]=\"t('editor.tabs.group', 'Grupo')\" [disabled]=\"primaryMode !== 'group'\">\n <div class=\"editor-section\">\n <div class=\"editor-grid two\">\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.groupAlignTabs', 'Alinhamento das abas') }}</mat-label>\n <select matNativeControl [(ngModel)]=\"group.alignTabs\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">{{ t('editor.options.default', 'Padrao') }}</option>\n <option value=\"start\">{{ t('editor.options.start', 'Inicio') }}</option>\n <option value=\"center\">{{ t('editor.options.center', 'Centro') }}</option>\n <option value=\"end\">{{ t('editor.options.end', 'Fim') }}</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.groupHeaderPosition', 'Posicao do header') }}</mat-label>\n <select matNativeControl [(ngModel)]=\"group.headerPosition\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">{{ t('editor.options.aboveDefault', 'Acima (padrao)') }}</option>\n <option value=\"above\">{{ t('editor.options.above', 'Acima') }}</option>\n <option value=\"below\">{{ t('editor.options.below', 'Abaixo') }}</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.selectedIndex', 'Indice selecionado') }}</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"group.selectedIndex\" (ngModelChange)=\"onAppearanceChange()\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"t('editor.hints.selectedIndex', 'selectedIndex')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.animationDuration', 'Duracao da animacao') }}</mat-label>\n <input matInput [(ngModel)]=\"group.animationDuration\" (ngModelChange)=\"onAppearanceChange()\" [placeholder]=\"t('editor.fields.placeholder.animationDuration', '500ms')\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"t('editor.hints.animationDuration', 'animationDuration')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.color', 'Cor (M2)') }}</mat-label>\n <select matNativeControl [(ngModel)]=\"group.color\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">{{ t('editor.options.none', '(nenhuma)') }}</option>\n <option value=\"primary\">{{ t('editor.options.primary', 'Primary') }}</option>\n <option value=\"accent\">{{ t('editor.options.accent', 'Accent') }}</option>\n <option value=\"warn\">{{ t('editor.options.warn', 'Warn') }}</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.backgroundColor', 'Cor de fundo (M2)') }}</mat-label>\n <select matNativeControl [(ngModel)]=\"group.backgroundColor\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">{{ t('editor.options.none', '(nenhuma)') }}</option>\n <option value=\"primary\">{{ t('editor.options.primary', 'Primary') }}</option>\n <option value=\"accent\">{{ t('editor.options.accent', 'Accent') }}</option>\n <option value=\"warn\">{{ t('editor.options.warn', 'Warn') }}</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.ariaLabel', 'aria-label') }}</mat-label>\n <input matInput [(ngModel)]=\"group.ariaLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.ariaLabelledby', 'aria-labelledby') }}</mat-label>\n <input matInput [(ngModel)]=\"group.ariaLabelledby\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n </div>\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"group.dynamicHeight\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.dynamicHeight', 'Altura dinamica') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.fitInkBarToContent', 'Indicador ajustado ao conteudo') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.disablePagination\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.disablePagination', 'Sem paginacao') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.disableRipple', 'Sem ripple') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.preserveContent\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.preserveContent', 'Preservar conteudo') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"group.stretchTabs\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab [label]=\"t('editor.tabs.nav', 'Navegacao')\" [disabled]=\"primaryMode !== 'nav'\">\n <div class=\"editor-section\">\n <div class=\"editor-grid two\">\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.selectedIndex', 'Indice selecionado') }}</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"nav.selectedIndex\" (ngModelChange)=\"onAppearanceChange()\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"t('editor.hints.selectedIndex', 'selectedIndex')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.animationDuration', 'Duracao da animacao') }}</mat-label>\n <input matInput [(ngModel)]=\"nav.animationDuration\" (ngModelChange)=\"onAppearanceChange()\" [placeholder]=\"t('editor.fields.placeholder.animationDuration', '500ms')\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"t('editor.hints.animationDuration', 'animationDuration')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.ariaLabel', 'aria-label') }}</mat-label>\n <input matInput [(ngModel)]=\"nav.ariaLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.ariaLabelledby', 'aria-labelledby') }}</mat-label>\n <input matInput [(ngModel)]=\"nav.ariaLabelledby\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.color', 'Cor (M2)') }}</mat-label>\n <select matNativeControl [(ngModel)]=\"nav.color\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">{{ t('editor.options.none', '(nenhuma)') }}</option>\n <option value=\"primary\">{{ t('editor.options.primary', 'Primary') }}</option>\n <option value=\"accent\">{{ t('editor.options.accent', 'Accent') }}</option>\n <option value=\"warn\">{{ t('editor.options.warn', 'Warn') }}</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.backgroundColor', 'Cor de fundo (M2)') }}</mat-label>\n <select matNativeControl [(ngModel)]=\"nav.backgroundColor\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">{{ t('editor.options.none', '(nenhuma)') }}</option>\n <option value=\"primary\">{{ t('editor.options.primary', 'Primary') }}</option>\n <option value=\"accent\">{{ t('editor.options.accent', 'Accent') }}</option>\n <option value=\"warn\">{{ t('editor.options.warn', 'Warn') }}</option>\n </select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </mat-form-field>\n </div>\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"nav.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.fitInkBarToContent', 'Indicador ajustado ao conteudo') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.disablePagination\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.disablePagination', 'Sem paginacao') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.disableRipple', 'Sem ripple') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"nav.stretchTabs\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n <mat-tab [label]=\"t('editor.tabs.json', 'JSON')\">\n <div class=\"editor-section\">\n <div class=\"editor-toolbar\">\n <button mat-button (click)=\"formatJson()\" [disabled]=\"!isValid\">\n <mat-icon [praxisIcon]=\"'format_align_left'\"></mat-icon>{{ t('editor.actions.format', 'Formatar') }}\n </button>\n <button mat-button (click)=\"reset()\">\n <mat-icon [praxisIcon]=\"'restart_alt'\"></mat-icon>{{ t('editor.actions.reset', 'Resetar') }}\n </button>\n </div>\n\n <mat-form-field appearance=\"outline\" class=\"json-textarea-field full\">\n <mat-label>{{ t('editor.fields.jsonConfig', 'Configuracao JSON') }}</mat-label>\n <textarea\n matInput\n [(ngModel)]=\"jsonText\"\n (ngModelChange)=\"onJsonTextChange($event)\"\n rows=\"22\"\n spellcheck=\"false\"\n class=\"editor-json\"\n ></textarea>\n <mat-hint *ngIf=\"isValid\">{{ t('editor.json.valid', 'JSON valido') }}</mat-hint>\n <mat-error *ngIf=\"!isValid && jsonText\">{{ t('editor.json.invalidPrefix', 'JSON invalido:') }} {{ errorMsg }}</mat-error>\n </mat-form-field>\n </div>\n </mat-tab>\n\n <mat-tab [label]=\"t('editor.tabs.style', 'Estilo')\">\n <div class=\"editor-section editor-section-lg\">\n <div class=\"editor-row\">\n <span class=\"editor-muted\">{{ t('editor.presets.title', 'Presets:') }}</span>\n <button mat-button color=\"primary\" (click)=\"applyPreset('primary')\">\n <mat-icon [praxisIcon]=\"'palette'\"></mat-icon>\n {{ t('editor.presets.primary', 'Primario') }}\n </button>\n <button mat-button (click)=\"applyPreset('neutral')\">\n <mat-icon [praxisIcon]=\"'contrast'\"></mat-icon>\n {{ t('editor.presets.neutral', 'Neutro') }}\n </button>\n <button mat-button (click)=\"applyPreset('high-contrast')\">\n <mat-icon [praxisIcon]=\"'visibility'\"></mat-icon>\n {{ t('editor.presets.highContrast', 'Alto contraste') }}\n </button>\n <button mat-button (click)=\"clearTokens()\">\n <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n {{ t('editor.actions.clearTokens', 'Limpar tokens') }}\n </button>\n </div>\n\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ t('editor.fields.themeClass', 'Classe de tema (opcional)') }}</mat-label>\n <input matInput [(ngModel)]=\"appearance.themeClass\" (ngModelChange)=\"onAppearanceChange()\" [placeholder]=\"t('editor.fields.placeholder.themeClass', 'ex.: tabs-accented')\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ t('editor.fields.density', 'Densidade') }}</mat-label>\n <select matNativeControl [(ngModel)]=\"appearance.density\" (ngModelChange)=\"onAppearanceChange()\">\n <option [ngValue]=\"undefined\">{{ t('editor.density.default', 'Padrao') }}</option>\n <option value=\"compact\">{{ t('editor.density.compact', 'Compacta') }}</option>\n <option value=\"comfortable\">{{ t('editor.density.comfortable', 'Confortavel') }}</option>\n <option value=\"spacious\">{{ t('editor.density.spacious', 'Espacosa') }}</option>\n </select>\n </mat-form-field>\n </div>\n\n <div>\n <div class=\"editor-title-row\">\n <h3 class=\"editor-title\">{{ t('editor.sections.tokens', 'Tokens (Material 3)') }}</h3>\n <button\n mat-icon-button\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"t('editor.hints.tokenValueHelp', 'Valores aceitam CSS vars ou cores hex/rgb.')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon [praxisIcon]=\"'help_outline'\"></mat-icon>\n </button>\n </div>\n <div class=\"editor-grid two\">\n <ng-container *ngFor=\"let token of tokenList\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ t(token.labelKey, token.fallback) }}</mat-label>\n <input matInput [placeholder]=\"t('editor.placeholders.tokenValue', 'var(--md-sys-color-primary) / #RRGGBB')\" [ngModel]=\"appearance.tokens?.[token.key]\" (ngModelChange)=\"onTokenChange(token.key, $event)\" />\n </mat-form-field>\n </ng-container>\n </div>\n </div>\n\n <div>\n <h3 class=\"editor-title\">{{ t('editor.sections.customCss', 'CSS personalizado') }}</h3>\n <mat-form-field appearance=\"outline\" class=\"json-textarea-field full\">\n <mat-label>{{ t('editor.fields.customCss', 'CSS a ser injetado no componente') }}</mat-label>\n <textarea matInput rows=\"10\" [(ngModel)]=\"appearance.customCss\" (ngModelChange)=\"onAppearanceChange()\" [placeholder]=\"t('editor.placeholders.customCssExample', '.praxis-tabs-root .mdc-tab__text-label { font-weight: 600; }')\"></textarea>\n </mat-form-field>\n </div>\n\n <div>\n <h3 class=\"editor-title\">{{ t('editor.sections.scssSnippet', 'Snippet SCSS (para uso em styles.scss)') }}</h3>\n <pre class=\"editor-code\">\n@use '@angular/material' as mat;\n{{ scssSnippet() }}\n </pre>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab [label]=\"t('editor.tabs.items', 'Abas')\" [disabled]=\"primaryMode !== 'group'\">\n <div class=\"editor-section\">\n <button mat-stroked-button color=\"primary\" (click)=\"addTab()\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon>{{ t('editor.actions.addTab', 'Adicionar aba') }}</button>\n <div *ngIf=\"editedConfig.tabs?.length; else noTabs\" class=\"editor-grid\">\n <div *ngFor=\"let tab of editedConfig.tabs; let i = index\" class=\"editor-card\">\n <div class=\"editor-card-header\">\n <strong class=\"editor-card-title\">{{ t('editor.cards.tab', 'Aba') }} #{{ i+1 }}</strong>\n <button mat-icon-button (click)=\"moveTab(i, -1)\" [disabled]=\"i===0\"><mat-icon [praxisIcon]=\"'arrow_upward'\"></mat-icon></button>\n <button mat-icon-button (click)=\"moveTab(i, 1)\" [disabled]=\"i===editedConfig.tabs!.length-1\"><mat-icon [praxisIcon]=\"'arrow_downward'\"></mat-icon></button>\n <button mat-icon-button color=\"warn\" (click)=\"removeTab(i)\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.id', 'ID') }}</mat-label>\n <input matInput [(ngModel)]=\"tab.id\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.label', 'Rotulo') }}</mat-label>\n <input matInput [(ngModel)]=\"tab.textLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.labelClass', 'Classe do rotulo') }}</mat-label>\n <input matInput [(ngModel)]=\"tab.labelClass\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.bodyClass', 'Classe do conteudo') }}</mat-label>\n <input matInput [(ngModel)]=\"tab.bodyClass\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.ariaLabel', 'aria-label') }}</mat-label>\n <input matInput [(ngModel)]=\"tab.ariaLabel\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.ariaLabelledby', 'aria-labelledby') }}</mat-label>\n <input matInput [(ngModel)]=\"tab.ariaLabelledby\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n </div>\n <mat-slide-toggle [(ngModel)]=\"tab.disabled\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.disabled', 'Desativada') }}</mat-slide-toggle>\n\n <!-- Widgets (componentes dinâmicos) -->\n <div class=\"editor-divider editor-grid\">\n <div class=\"editor-row\">\n <mat-form-field appearance=\"outline\" class=\"editor-field-min\">\n <mat-label>{{ t('editor.fields.addComponent', 'Adicionar componente') }}</mat-label>\n <select matNativeControl [(ngModel)]=\"selectedTabWidgetId[i]\">\n <option [ngValue]=\"''\">{{ t('editor.fields.selectPlaceholder', '(selecione)') }}</option>\n <option *ngFor=\"let c of componentOptions\" [ngValue]=\"c.id\">{{ c.friendlyName || c.id }}</option>\n </select>\n </mat-form-field>\n <button mat-stroked-button (click)=\"addWidgetToTab(i)\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon>{{ t('editor.actions.add', 'Adicionar') }}</button>\n <span class=\"editor-spacer\"></span>\n <mat-form-field appearance=\"outline\" class=\"editor-field-240\">\n <mat-label>{{ t('editor.fields.resourcePath', 'Recurso (resourcePath)') }}</mat-label>\n <input matInput [(ngModel)]=\"quickResourcePathTab[i]\" [placeholder]=\"t('editor.fields.placeholder.resourcePath', 'ex.: usuarios')\" />\n </mat-form-field>\n <button mat-button (click)=\"addPresetToTab(i, 'form')\"><mat-icon [praxisIcon]=\"'description'\"></mat-icon>{{ t('editor.templates.form', 'Form') }}</button>\n <button mat-button (click)=\"addPresetToTab(i, 'table')\"><mat-icon [praxisIcon]=\"'grid_on'\"></mat-icon>{{ t('editor.templates.table', 'Tabela') }}</button>\n <button mat-button (click)=\"addPresetToTab(i, 'crud')\"><mat-icon [praxisIcon]=\"'dynamic_form'\"></mat-icon>{{ t('editor.templates.crud', 'CRUD') }}</button>\n </div>\n\n <div *ngIf=\"tab.widgets?.length\" class=\"editor-grid\" cdkDropList [cdkDropListData]=\"tab.widgets || []\" (cdkDropListDropped)=\"onTabWidgetDrop(i, $event)\">\n <div *ngFor=\"let w of tab.widgets; let wi = index\" cdkDrag class=\"editor-card dashed\">\n <div class=\"editor-card-header\">\n <button mat-icon-button cdkDragHandle [matTooltip]=\"t('editor.actions.dragToReorder', 'Arrastar para reordenar')\" [attr.aria-label]=\"t('editor.actions.dragToReorder', 'Arrastar para reordenar')\">\n <mat-icon [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n </button>\n <strong class=\"editor-card-title\">{{ getCompName(w.id) }}</strong>\n <button mat-icon-button color=\"warn\" (click)=\"removeWidgetFromTab(i, wi)\" [matTooltip]=\"t('editor.actions.removeComponent', 'Remover componente')\" [attr.aria-label]=\"t('editor.actions.removeComponent', 'Remover componente')\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ t('editor.fields.inputsJson', 'Inputs (JSON)') }}</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.inputs)\" (ngModelChange)=\"updateWidgetInputsTab(i, wi, $event)\"></textarea>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ t('editor.fields.outputsJson', 'Outputs (JSON)') }}</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.outputs)\" (ngModelChange)=\"updateWidgetOutputsTab(i, wi, $event)\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <ng-template #noTabs><em class=\"editor-muted\">{{ t('editor.empty.noTabs', 'Nenhuma aba definida.') }}</em></ng-template>\n </div>\n </mat-tab>\n\n <mat-tab [label]=\"t('editor.tabs.accessibility', 'Acessibilidade')\">\n <div class=\"editor-section\">\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"accessibility.highContrast\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.highContrast', 'Alto contraste') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"accessibility.reduceMotion\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.reduceMotion', 'Reduzir movimento') }}</mat-slide-toggle>\n </div>\n </div>\n </mat-tab>\n\n <mat-tab [label]=\"t('editor.tabs.links', 'Links')\" [disabled]=\"primaryMode !== 'nav'\">\n <div class=\"editor-section\">\n <button mat-stroked-button color=\"primary\" (click)=\"addLink()\"><mat-icon [praxisIcon]=\"'add_link'\"></mat-icon>{{ t('editor.actions.addLink', 'Adicionar link') }}</button>\n <div *ngIf=\"nav.links?.length; else noLinks\" class=\"editor-grid\">\n <div *ngFor=\"let l of nav.links; let i = index\" class=\"editor-card\">\n <div class=\"editor-card-header\">\n <strong class=\"editor-card-title\">{{ t('editor.cards.link', 'Link') }} #{{ i+1 }}</strong>\n <button mat-icon-button (click)=\"moveLink(i, -1)\" [disabled]=\"i===0\"><mat-icon [praxisIcon]=\"'arrow_upward'\"></mat-icon></button>\n <button mat-icon-button (click)=\"moveLink(i, 1)\" [disabled]=\"i===nav.links!.length-1\"><mat-icon [praxisIcon]=\"'arrow_downward'\"></mat-icon></button>\n <button mat-icon-button color=\"warn\" (click)=\"removeLink(i)\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.id', 'ID') }}</mat-label>\n <input matInput [(ngModel)]=\"l.id\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\"><mat-label>{{ t('editor.fields.label', 'Rotulo') }}</mat-label>\n <input matInput [(ngModel)]=\"l.label\" (ngModelChange)=\"onAppearanceChange()\" />\n </mat-form-field>\n </div>\n <div class=\"editor-row\">\n <mat-slide-toggle [(ngModel)]=\"l.disabled\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.linkDisabled', 'Desativado') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"l.disableRipple\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.disableRipple', 'Sem ripple') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"l.fitInkBarToContent\" (ngModelChange)=\"onAppearanceChange()\">{{ t('editor.toggles.fitInkBarToContent', 'Indicador ajustado ao conteudo') }}</mat-slide-toggle>\n </div>\n\n <!-- Widgets para Links -->\n <div class=\"editor-divider editor-grid\">\n <div class=\"editor-row\">\n <mat-form-field appearance=\"outline\" class=\"editor-field-min\">\n <mat-label>{{ t('editor.fields.addComponent', 'Adicionar componente') }}</mat-label>\n <select matNativeControl [(ngModel)]=\"selectedLinkWidgetId[i]\">\n <option [ngValue]=\"''\">{{ t('editor.fields.selectPlaceholder', '(selecione)') }}</option>\n <option *ngFor=\"let c of componentOptions\" [ngValue]=\"c.id\">{{ c.friendlyName || c.id }}</option>\n </select>\n </mat-form-field>\n <button mat-stroked-button (click)=\"addWidgetToLink(i)\"><mat-icon [praxisIcon]=\"'add'\"></mat-icon>{{ t('editor.actions.add', 'Adicionar') }}</button>\n <span class=\"editor-spacer\"></span>\n <mat-form-field appearance=\"outline\" class=\"editor-field-240\">\n <mat-label>{{ t('editor.fields.resourcePath', 'Recurso (resourcePath)') }}</mat-label>\n <input matInput [(ngModel)]=\"quickResourcePathLink[i]\" [placeholder]=\"t('editor.fields.placeholder.resourcePath', 'ex.: usuarios')\" />\n </mat-form-field>\n <button mat-button (click)=\"addPresetToLink(i, 'form')\"><mat-icon [praxisIcon]=\"'description'\"></mat-icon>{{ t('editor.templates.form', 'Form') }}</button>\n <button mat-button (click)=\"addPresetToLink(i, 'table')\"><mat-icon [praxisIcon]=\"'grid_on'\"></mat-icon>{{ t('editor.templates.table', 'Tabela') }}</button>\n <button mat-button (click)=\"addPresetToLink(i, 'crud')\"><mat-icon [praxisIcon]=\"'dynamic_form'\"></mat-icon>{{ t('editor.templates.crud', 'CRUD') }}</button>\n </div>\n\n <div *ngIf=\"l.widgets?.length\" class=\"editor-grid\" cdkDropList [cdkDropListData]=\"l.widgets || []\" (cdkDropListDropped)=\"onLinkWidgetDrop(i, $event)\">\n <div *ngFor=\"let w of l.widgets; let wi = index\" cdkDrag class=\"editor-card dashed\">\n <div class=\"editor-card-header\">\n <button mat-icon-button cdkDragHandle [matTooltip]=\"t('editor.actions.dragToReorder', 'Arrastar para reordenar')\" [attr.aria-label]=\"t('editor.actions.dragToReorder', 'Arrastar para reordenar')\">\n <mat-icon [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n </button>\n <strong class=\"editor-card-title\">{{ getCompName(w.id) }}</strong>\n <button mat-icon-button color=\"warn\" (click)=\"removeWidgetFromLink(i, wi)\" [matTooltip]=\"t('editor.actions.removeComponent', 'Remover componente')\" [attr.aria-label]=\"t('editor.actions.removeComponent', 'Remover componente')\"><mat-icon [praxisIcon]=\"'delete'\"></mat-icon></button>\n </div>\n <div class=\"editor-grid two tight\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ t('editor.fields.inputsJson', 'Inputs (JSON)') }}</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.inputs)\" (ngModelChange)=\"updateWidgetInputsLink(i, wi, $event)\"></textarea>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ t('editor.fields.outputsJson', 'Outputs (JSON)') }}</mat-label>\n <textarea matInput rows=\"4\" [ngModel]=\"stringify(w.outputs)\" (ngModelChange)=\"updateWidgetOutputsLink(i, wi, $event)\"></textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <ng-template #noLinks><em class=\"editor-muted\">{{ t('editor.empty.noLinks', 'Nenhum link definido.') }}</em></ng-template>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n color: var(--md-sys-color-on-surface);\n }\n .editor-shell {\n display: grid;\n gap: 12px;\n }\n .editor-topbar {\n display: flex;\n align-items: start;\n justify-content: flex-start;\n }\n .editor-mode-field {\n width: min(320px, 100%);\n }\n .editor-diagnostics {\n display: grid;\n gap: 8px;\n }\n .editor-diagnostics-title {\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--md-sys-color-on-surface);\n }\n .editor-diagnostic {\n display: grid;\n gap: 4px;\n padding: 10px 12px;\n border-radius: 10px;\n border: 1px solid var(--md-sys-color-outline-variant);\n background: var(--md-sys-color-surface-container);\n color: var(--md-sys-color-on-surface);\n }\n .editor-diagnostic code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n color: var(--md-sys-color-on-surface-variant);\n }\n .editor-diagnostic.level-error {\n background: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n border-color: var(--md-sys-color-error);\n }\n .editor-diagnostic.level-warning {\n background: var(--md-sys-color-tertiary-container, var(--md-sys-color-surface-container));\n color: var(--md-sys-color-on-tertiary-container, var(--md-sys-color-on-surface));\n border-color: var(--md-sys-color-outline-variant);\n }\n .editor-tabs {\n --editor-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));\n --editor-border: 1px solid var(--md-sys-color-outline-variant);\n --editor-radius: 12px;\n --editor-muted: var(--md-sys-color-on-surface-variant);\n }\n .editor-section {\n padding: 12px;\n display: grid;\n gap: 12px;\n background: var(--editor-surface);\n border: var(--editor-border);\n border-radius: var(--editor-radius);\n }\n .editor-section-lg { gap: 16px; }\n .editor-row {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n align-items: center;\n }\n .editor-grid {\n display: grid;\n gap: 12px;\n }\n .editor-grid.two {\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n }\n .editor-grid.tight { gap: 8px; }\n .editor-toolbar {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n align-items: center;\n }\n .editor-muted { color: var(--editor-muted); }\n .editor-title { margin: 6px 0 8px; font-size: 1rem; }\n .editor-title-row { display: flex; align-items: center; gap: 8px; }\n .editor-code {\n white-space: pre-wrap;\n background: var(--md-sys-color-surface-container);\n padding: 8px;\n border-radius: 6px;\n border: 1px solid var(--md-sys-color-outline-variant);\n }\n .editor-card {\n border: 1px solid var(--md-sys-color-outline-variant);\n padding: 10px;\n border-radius: 10px;\n display: grid;\n gap: 8px;\n background: var(--md-sys-color-surface);\n }\n .editor-card.dashed { border-style: dashed; }\n .editor-card-header {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .editor-card-title { flex: 1; font-weight: 600; }\n .editor-divider {\n border-top: 1px solid var(--md-sys-color-outline-variant);\n padding-top: 8px;\n }\n .editor-spacer { flex: 1; }\n .editor-field-min { min-width: 260px; }\n .editor-section .editor-field-min { width: 260px; max-width: 260px; }\n .editor-field-240 { width: 240px; }\n .editor-section .editor-field-240 { width: 240px; max-width: 240px; }\n .editor-json { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; }\n .editor-section .mat-mdc-form-field {\n width: 100%;\n max-width: 520px;\n --mdc-outlined-text-field-container-height: 48px;\n --mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);\n --mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);\n --mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);\n --mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);\n --mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);\n --mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant);\n }\n .editor-section .mat-mdc-form-field.full { max-width: none; }\n .help-icon-button {\n --mdc-icon-button-state-layer-size: 28px;\n --mdc-icon-button-icon-size: 18px;\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n }\n .help-icon-button mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .mat-mdc-form-field-icon-suffix { align-self: center; }\n `],\n})\nexport class PraxisTabsConfigEditor implements SettingsValueProvider {\n private readonly i18n = inject(PraxisI18nService);\n primaryMode: 'group' | 'nav' = 'group';\n editedDocument: TabsAuthoringDocument;\n editedConfig: TabsMetadata;\n private initialDocument: TabsAuthoringDocument;\n private bindings: TabsAuthoringBindings | undefined;\n jsonText = '';\n isValid = true;\n errorMsg = '';\n diagnostics: TabsEditorDiagnostic[] = [];\n componentOptions: Array<{ id: string; friendlyName?: string }> = [];\n selectedTabWidgetId: Record<number, string> = {};\n selectedLinkWidgetId: Record<number, string> = {};\n quickResourcePathTab: Record<number, string> = {};\n quickResourcePathLink: Record<number, string> = {};\n\n protected t(key: string, fallback: string): string {\n return this.i18n.t(key, undefined, fallback, PRAXIS_TABS_I18N_NAMESPACE);\n }\n\n protected diagnosticLevelLabel(level: TabsEditorDiagnostic['level']): string {\n if (level === 'error') {\n return this.t('editor.diagnostics.error', 'Erro');\n }\n if (level === 'warning') {\n return this.t('editor.diagnostics.warning', 'Aviso');\n }\n return this.t('editor.diagnostics.info', 'Informacao');\n }\n\n // Simplified token list we support at runtime\n tokenList = [\n { key: 'active-indicator-color', labelKey: 'editor.tokens.activeIndicator', fallback: 'Indicador ativo' },\n { key: 'active-label-text-color', labelKey: 'editor.tokens.activeLabel', fallback: 'Texto ativo' },\n { key: 'active-hover-indicator-color', labelKey: 'editor.tokens.activeHoverIndicator', fallback: 'Indicador ativo (hover)' },\n { key: 'active-hover-label-text-color', labelKey: 'editor.tokens.activeHoverLabel', fallback: 'Texto ativo (hover)' },\n { key: 'active-focus-indicator-color', labelKey: 'editor.tokens.activeFocusIndicator', fallback: 'Indicador ativo (focus)' },\n { key: 'active-focus-label-text-color', labelKey: 'editor.tokens.activeFocusLabel', fallback: 'Texto ativo (focus)' },\n { key: 'inactive-label-text-color', labelKey: 'editor.tokens.inactiveLabel', fallback: 'Texto inativo' },\n { key: 'inactive-hover-label-text-color', labelKey: 'editor.tokens.inactiveHoverLabel', fallback: 'Texto inativo (hover)' },\n { key: 'inactive-focus-label-text-color', labelKey: 'editor.tokens.inactiveFocusLabel', fallback: 'Texto inativo (focus)' },\n { key: 'pagination-icon-color', labelKey: 'editor.tokens.paginationIcon', fallback: 'Icones de paginacao' },\n { key: 'divider-color', labelKey: 'editor.tokens.divider', fallback: 'Divisor/linha' },\n { key: 'background-color', labelKey: 'editor.tokens.headerBackground', fallback: 'Fundo do header' },\n ] as const;\n\n private presets: Record<string, Record<string, string>> = {\n primary: {\n 'active-indicator-color': 'var(--md-sys-color-primary)',\n 'active-label-text-color': 'var(--md-sys-color-primary)',\n 'inactive-label-text-color': 'var(--md-sys-color-on-surface-variant)',\n 'inactive-hover-label-text-color': 'var(--md-sys-color-on-surface)',\n 'divider-color': 'var(--md-sys-color-outline-variant)',\n 'background-color': 'var(--md-sys-color-surface-container)',\n 'pagination-icon-color': 'var(--md-sys-color-on-surface)'\n },\n neutral: {\n 'active-indicator-color': 'var(--md-sys-color-on-surface)',\n 'active-label-text-color': 'var(--md-sys-color-on-surface)',\n 'inactive-label-text-color': 'var(--md-sys-color-on-surface-variant)',\n 'inactive-hover-label-text-color': 'var(--md-sys-color-on-surface)',\n 'divider-color': 'var(--md-sys-color-outline-variant)',\n 'background-color': 'var(--md-sys-color-surface-container)',\n 'pagination-icon-color': 'var(--md-sys-color-on-surface)'\n },\n 'high-contrast': {\n 'active-indicator-color': 'var(--md-sys-color-primary)',\n 'active-label-text-color': 'var(--md-sys-color-on-primary)',\n 'inactive-label-text-color': 'var(--md-sys-color-on-surface-variant)',\n 'inactive-hover-label-text-color': 'var(--md-sys-color-on-surface)',\n 'divider-color': 'var(--md-sys-color-outline)',\n 'background-color': 'var(--md-sys-color-surface)',\n 'pagination-icon-color': 'var(--md-sys-color-on-surface)'\n }\n };\n\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$ = new BehaviorSubject<boolean>(true);\n isBusy$ = new BehaviorSubject<boolean>(false);\n\n constructor(@Inject(SETTINGS_PANEL_DATA) data: any, private registry: ComponentMetadataRegistry) {\n const incomingDocument = normalizeTabsAuthoringDocument(\n data?.document ?? createTabsAuthoringDocument({ config: {} }),\n );\n this.initialDocument = structuredClone(incomingDocument);\n this.editedDocument = structuredClone(incomingDocument);\n this.editedConfig = this.editedDocument.config;\n this.bindings = this.editedDocument.bindings;\n this.primaryMode = this.inferPrimaryMode(this.editedConfig);\n this.jsonText = this.stringify(this.editedDocument);\n this.updateDirty();\n this.refreshDiagnostics();\n this.componentOptions = this.registry.getAll().map((m) => ({ id: m.id, friendlyName: m.friendlyName }));\n }\n\n private inferPrimaryMode(config: TabsMetadata | null | undefined): 'group' | 'nav' {\n return config?.nav?.links?.length ? 'nav' : 'group';\n }\n\n setPrimaryMode(mode: 'group' | 'nav'): void {\n if (this.primaryMode === mode) return;\n this.primaryMode = mode;\n\n if (mode === 'group') {\n delete this.editedConfig.nav;\n if (!this.editedConfig.group) {\n this.editedConfig.group = { selectedIndex: 0 };\n }\n if (!Array.isArray(this.editedConfig.tabs)) {\n this.editedConfig.tabs = [];\n }\n } else {\n delete this.editedConfig.tabs;\n if (!this.editedConfig.nav) {\n this.editedConfig.nav = { links: [], selectedIndex: 0 };\n }\n if (!Array.isArray(this.editedConfig.nav.links)) {\n this.editedConfig.nav.links = [];\n }\n }\n\n this.onAppearanceChange();\n }\n\n private updateDirty(): void {\n this.isDirty$.next(\n JSON.stringify(this.initialDocument) !== JSON.stringify(this.editedDocument),\n );\n }\n\n private syncEditedDocumentFromConfig(): void {\n this.editedDocument = createTabsAuthoringDocument({\n config: this.editedConfig,\n bindings: this.bindings,\n });\n }\n\n private syncEditorStateFromDocument(document: TabsAuthoringDocument): void {\n this.editedDocument = structuredClone(document);\n this.editedConfig = this.editedDocument.config;\n this.bindings = this.editedDocument.bindings;\n this.primaryMode = this.inferPrimaryMode(this.editedConfig);\n }\n\n private refreshDiagnostics(): void {\n this.syncEditedDocumentFromConfig();\n this.diagnostics = validateTabsAuthoringDocument(this.editedDocument);\n this.isValid$.next(\n this.isValid && !this.diagnostics.some((item) => item.level === 'error'),\n );\n }\n\n onJsonTextChange(text: string): void {\n try {\n const parsed = normalizeTabsAuthoringDocument(\n JSON.parse(text) as TabsAuthoringDocument,\n );\n this.errorMsg = '';\n this.isValid = true;\n this.syncEditorStateFromDocument(parsed);\n this.updateDirty();\n this.refreshDiagnostics();\n } catch (e: any) {\n this.isValid = false;\n this.isValid$.next(false);\n this.errorMsg = e?.message || this.t('editor.json.syntaxError', 'Erro de sintaxe JSON');\n this.diagnostics = [];\n }\n }\n\n // stringify helper is public to be used in the template\n\n formatJson(): void {\n if (!this.isValid) return;\n this.syncEditedDocumentFromConfig();\n this.jsonText = this.stringify(this.editedDocument);\n }\n\n getSettingsValue(): TabsAuthoringDocument {\n this.syncEditedDocumentFromConfig();\n return this.editedDocument;\n }\n\n onSave(): TabsAuthoringDocument {\n this.syncEditedDocumentFromConfig();\n return this.editedDocument;\n }\n\n reset(): void {\n this.syncEditorStateFromDocument(this.initialDocument);\n this.jsonText = this.stringify(this.editedDocument);\n this.isValid = true;\n this.updateDirty();\n this.refreshDiagnostics();\n }\n\n // Appearance helpers\n get appearance(): NonNullable<TabsMetadata['appearance']> {\n const ap = (this.editedConfig.appearance ??= {} as any);\n (ap.tokens ??= {} as any);\n return ap as any;\n }\n\n onAppearanceChange(): void {\n this.syncEditedDocumentFromConfig();\n this.updateDirty();\n this.jsonText = this.stringify(this.editedDocument);\n this.refreshDiagnostics();\n }\n\n onTokenChange(key: string, value: string): void {\n const ap = this.appearance;\n const tokens = (ap.tokens = ap.tokens || {});\n if (!value) {\n delete tokens[key as keyof typeof tokens];\n } else {\n (tokens as any)[key] = value;\n }\n this.onAppearanceChange();\n }\n\n clearTokens(): void {\n const ap = this.appearance;\n ap.tokens = {} as any;\n this.onAppearanceChange();\n }\n\n applyPreset(id: 'primary' | 'neutral' | 'high-contrast'): void {\n const preset = this.presets[id];\n if (!preset) return;\n const ap = this.appearance;\n const tokens = (ap.tokens = ap.tokens || {});\n for (const [k, v] of Object.entries(preset)) {\n (tokens as any)[k] = v;\n }\n this.onAppearanceChange();\n }\n\n scssSnippet(): string {\n const tokens = this.editedConfig.appearance?.tokens || {};\n const entries = Object.entries(tokens).filter(([, v]) => !!v);\n const selector = this.editedConfig.appearance?.themeClass\n ? `.${this.editedConfig.appearance.themeClass}`\n : ':root';\n const map = entries.map(([k, v]) => ` ${k}: ${v},`).join('\\n');\n return `${selector} {\\n @include mat.tabs-overrides((\\n${map}\\n ));\\n}`;\n }\n\n // Group/Nav helpers and list editors\n get group(): any {\n if (!this.editedConfig.group) this.editedConfig.group = {} as any;\n return this.editedConfig.group as any;\n }\n\n get nav(): any {\n const nav = (this.editedConfig.nav ??= { links: [] } as any);\n if (!nav.links) nav.links = [] as any;\n return nav as any;\n }\n\n get behavior(): any {\n if (!this.editedConfig.behavior) this.editedConfig.behavior = {} as any;\n // Default to lazy load to improve UX/perf with heavy widgets (table/form)\n if (typeof (this.editedConfig.behavior as any).lazyLoad === 'undefined') {\n (this.editedConfig.behavior as any).lazyLoad = true;\n }\n return this.editedConfig.behavior as any;\n }\n\n get accessibility(): any {\n if (!this.editedConfig.accessibility) this.editedConfig.accessibility = {} as any;\n return this.editedConfig.accessibility as any;\n }\n\n addTab(): void {\n if (!this.editedConfig.tabs) this.editedConfig.tabs = [];\n this.editedConfig.tabs.push({\n id: `tab${(this.editedConfig.tabs.length + 1)}`,\n textLabel: this.t('defaults.newTabLabel', 'New Tab'),\n } as any);\n this.onAppearanceChange();\n }\n\n removeTab(index: number): void {\n this.editedConfig.tabs?.splice(index, 1);\n this.onAppearanceChange();\n }\n\n moveTab(index: number, delta: number): void {\n if (!this.editedConfig.tabs) return;\n const i2 = index + delta;\n if (i2 < 0 || i2 >= this.editedConfig.tabs.length) return;\n const [item] = this.editedConfig.tabs.splice(index, 1);\n this.editedConfig.tabs.splice(i2, 0, item);\n this.onAppearanceChange();\n }\n // ===== Widgets (Tabs) =====\n addWidgetToTab(tabIndex: number): void {\n const id = (this.selectedTabWidgetId[tabIndex] || '').trim();\n if (!id) return;\n const t = this.editedConfig.tabs![tabIndex] as any;\n t.widgets = t.widgets || [];\n t.widgets.push({ id } as WidgetDefinition);\n this.onAppearanceChange();\n }\n removeWidgetFromTab(tabIndex: number, widgetIndex: number): void {\n const t = this.editedConfig.tabs![tabIndex] as any;\n if (!t.widgets) return;\n t.widgets.splice(widgetIndex, 1);\n this.onAppearanceChange();\n }\n updateWidgetInputsTab(tabIndex: number, widgetIndex: number, text: string): void {\n const t = this.editedConfig.tabs![tabIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; t.widgets[widgetIndex].inputs = obj; this.onAppearanceChange(); } catch {}\n }\n updateWidgetOutputsTab(tabIndex: number, widgetIndex: number, text: string): void {\n const t = this.editedConfig.tabs![tabIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; t.widgets[widgetIndex].outputs = obj; this.onAppearanceChange(); } catch {}\n }\n addPresetToTab(tabIndex: number, type: 'form' | 'table' | 'crud'): void {\n const rp = (this.quickResourcePathTab[tabIndex] || '').trim();\n if (!rp) return;\n const t = this.editedConfig.tabs![tabIndex] as any;\n t.widgets = t.widgets || [];\n if (type === 'form') {\n t.widgets.push({ id: 'praxis-dynamic-form', inputs: { resourcePath: rp } });\n } else if (type === 'table') {\n t.widgets.push({ id: 'praxis-table', inputs: { resourcePath: rp, tableId: rp } });\n } else {\n t.widgets.push({ id: 'praxis-crud', inputs: { crudId: rp, metadata: { resource: { path: rp } } } });\n }\n this.onAppearanceChange();\n }\n\n addLink(): void {\n if (!this.nav.links) this.nav.links = [];\n this.nav.links.push({\n id: `link${this.nav.links.length + 1}`,\n label: this.t('defaults.newLinkLabel', 'New Link'),\n });\n this.onAppearanceChange();\n }\n\n removeLink(index: number): void {\n if (!this.nav.links) return;\n this.nav.links.splice(index, 1);\n this.onAppearanceChange();\n }\n\n moveLink(index: number, delta: number): void {\n if (!this.nav.links) return;\n const i2 = index + delta;\n if (i2 < 0 || i2 >= this.nav.links.length) return;\n const [item] = this.nav.links.splice(index, 1);\n this.nav.links.splice(i2, 0, item);\n this.onAppearanceChange();\n }\n // ===== Widgets (Links) =====\n addWidgetToLink(linkIndex: number): void {\n const id = (this.selectedLinkWidgetId[linkIndex] || '').trim();\n if (!id) return;\n const l = this.nav.links[linkIndex] as any;\n l.widgets = l.widgets || [];\n l.widgets.push({ id } as WidgetDefinition);\n this.onAppearanceChange();\n }\n removeWidgetFromLink(linkIndex: number, widgetIndex: number): void {\n const l = this.nav.links[linkIndex] as any;\n if (!l.widgets) return;\n l.widgets.splice(widgetIndex, 1);\n this.onAppearanceChange();\n }\n updateWidgetInputsLink(linkIndex: number, widgetIndex: number, text: string): void {\n const l = this.nav.links[linkIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; l.widgets[widgetIndex].inputs = obj; this.onAppearanceChange(); } catch {}\n }\n updateWidgetOutputsLink(linkIndex: number, widgetIndex: number, text: string): void {\n const l = this.nav.links[linkIndex] as any;\n try { const obj = text ? JSON.parse(text) : undefined; l.widgets[widgetIndex].outputs = obj; this.onAppearanceChange(); } catch {}\n }\n addPresetToLink(linkIndex: number, type: 'form' | 'table' | 'crud'): void {\n const rp = (this.quickResourcePathLink[linkIndex] || '').trim();\n if (!rp) return;\n const l = this.nav.links[linkIndex] as any;\n l.widgets = l.widgets || [];\n if (type === 'form') {\n l.widgets.push({ id: 'praxis-dynamic-form', inputs: { resourcePath: rp } });\n } else if (type === 'table') {\n l.widgets.push({ id: 'praxis-table', inputs: { resourcePath: rp, tableId: rp } });\n } else {\n l.widgets.push({ id: 'praxis-crud', inputs: { crudId: rp, metadata: { resource: { path: rp } } } });\n }\n this.onAppearanceChange();\n }\n\n stringify(v: any): string { try { return v ? JSON.stringify(v, null, 2) : ''; } catch { return ''; } }\n getCompName(id: string): string { const c = this.componentOptions.find(o => o.id === id); return c?.friendlyName || id; }\n\n // Reorder handlers (drag & drop)\n onTabWidgetDrop(tabIndex: number, event: CdkDragDrop<WidgetDefinition[]>): void {\n const t = this.editedConfig.tabs?.[tabIndex] as any;\n if (!t?.widgets) return;\n moveItemInArray(t.widgets, event.previousIndex, event.currentIndex);\n this.onAppearanceChange();\n }\n\n onLinkWidgetDrop(linkIndex: number, event: CdkDragDrop<WidgetDefinition[]>): void {\n const l = this.nav.links?.[linkIndex] as any;\n if (!l?.widgets) return;\n moveItemInArray(l.widgets, event.previousIndex, event.currentIndex);\n this.onAppearanceChange();\n }\n}\n","import { Component, Inject, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport {\n PraxisI18nService,\n PraxisIconDirective,\n providePraxisI18nConfig,\n} from '@praxisui/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { BehaviorSubject } from 'rxjs';\nimport { SETTINGS_PANEL_DATA, SettingsValueProvider } from '@praxisui/settings-panel';\nimport { TabsMetadata } from '../praxis-tabs';\nimport {\n createTabsAuthoringDocument,\n normalizeTabsAuthoringDocument,\n} from '../tabs-editor-capability';\nimport { TabsAuthoringDocument } from '../tabs-editor-document.model';\nimport { PRAXIS_TABS_I18N_CONFIG, PRAXIS_TABS_I18N_NAMESPACE } from '../praxis-tabs.i18n';\n\ninterface QuickSetupModel {\n mode: 'group' | 'nav';\n labels: string[];\n dynamicHeight?: boolean;\n stretchTabs?: boolean;\n}\n\n@Component({\n selector: 'praxis-tabs-quick-setup',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n PraxisIconDirective,\n MatButtonModule,\n MatSlideToggleModule,\n ],\n providers: [providePraxisI18nConfig(PRAXIS_TABS_I18N_CONFIG)],\n template: `\n <div class=\"setup-root\">\n <div class=\"setup-row\">\n <button mat-stroked-button [color]=\"model.mode==='group' ? 'primary' : undefined\" (click)=\"setMode('group')\">\n <mat-icon [praxisIcon]=\"'tab'\"></mat-icon>\n {{ t('quickSetup.mode.group', 'Grupo de abas') }}\n </button>\n <button mat-stroked-button [color]=\"model.mode==='nav' ? 'primary' : undefined\" (click)=\"setMode('nav')\">\n <mat-icon [praxisIcon]=\"'segment'\"></mat-icon>\n {{ t('quickSetup.mode.nav', 'Navegacao por links') }}\n </button>\n </div>\n\n <div class=\"setup-grid\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ t('editor.fields.addLabel', 'Adicionar rotulo') }}</mat-label>\n <input matInput [(ngModel)]=\"newLabel\" (keyup.enter)=\"addLabel()\" [placeholder]=\"t('quickSetup.fields.addLabelPlaceholder', 'Ex.: Dados Gerais')\" />\n </mat-form-field>\n <button mat-flat-button color=\"primary\" (click)=\"addLabel()\">\n <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n {{ t('editor.actions.add', 'Adicionar') }}\n </button>\n </div>\n\n <div *ngIf=\"model.labels.length; else emptyLabels\" class=\"setup-row wrap\">\n <div *ngFor=\"let l of model.labels; let i = index\" class=\"chip\">\n <span>{{ l }}</span>\n <button mat-icon-button (click)=\"removeLabel(i)\" [attr.aria-label]=\"t('editor.actions.removeLabel', 'Remover rotulo')\"><mat-icon [praxisIcon]=\"'close'\"></mat-icon></button>\n </div>\n </div>\n <ng-template #emptyLabels>\n <em class=\"hint\">{{ t('quickSetup.hints.emptyLabels', 'Adicione um ou mais rotulos para criar as abas.') }}</em>\n </ng-template>\n\n <div class=\"setup-row\">\n <mat-slide-toggle [(ngModel)]=\"model.dynamicHeight\" (ngModelChange)=\"updateState()\">{{ t('editor.toggles.dynamicHeight', 'Altura dinamica') }}</mat-slide-toggle>\n <mat-slide-toggle [(ngModel)]=\"model.stretchTabs\" (ngModelChange)=\"updateState()\">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n color: var(--md-sys-color-on-surface);\n }\n .setup-root {\n display: grid;\n gap: 12px;\n padding: 8px;\n background: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 12px;\n }\n .setup-row {\n display: flex;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n }\n .setup-row.wrap { flex-wrap: wrap; }\n .setup-grid {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 8px;\n align-items: start;\n }\n .setup-root .mat-mdc-form-field {\n width: 100%;\n max-width: 520px;\n --mdc-outlined-text-field-container-height: 48px;\n --mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);\n --mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);\n --mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);\n --mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);\n --mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);\n --mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);\n --mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant);\n }\n .chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 16px;\n background: var(--md-sys-color-surface);\n }\n .hint { color: var(--md-sys-color-on-surface-variant); }\n `],\n})\nexport class TabsQuickSetupComponent implements SettingsValueProvider {\n private readonly i18n = inject(PraxisI18nService);\n document!: TabsAuthoringDocument;\n model: QuickSetupModel = { mode: 'group', labels: [], dynamicHeight: true, stretchTabs: true };\n private initial: QuickSetupModel = { ...this.model };\n newLabel = '';\n\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$ = new BehaviorSubject<boolean>(false);\n isBusy$ = new BehaviorSubject<boolean>(false);\n\n protected t(key: string, fallback: string): string {\n return this.i18n.t(key, undefined, fallback, PRAXIS_TABS_I18N_NAMESPACE);\n }\n\n constructor(@Inject(SETTINGS_PANEL_DATA) data: any) {\n const incomingDocument = normalizeTabsAuthoringDocument(\n data?.document ?? createTabsAuthoringDocument({ config: {} }),\n );\n this.document = structuredClone(incomingDocument);\n const cfg = this.document.config as TabsMetadata | undefined;\n if (cfg) {\n if (cfg.tabs?.length) {\n this.model.mode = 'group';\n this.model.labels = cfg.tabs\n .map((t) => String(t.textLabel || '').trim())\n .filter((label) => label.length > 0);\n this.model.dynamicHeight = cfg.group?.dynamicHeight ?? true;\n this.model.stretchTabs = cfg.group?.stretchTabs ?? true;\n } else if (cfg.nav?.links?.length) {\n this.model.mode = 'nav';\n this.model.labels = cfg.nav.links\n .map((l) => String(l.label || '').trim())\n .filter((label) => label.length > 0);\n this.model.stretchTabs = cfg.nav.stretchTabs ?? true;\n }\n this.initial = { ...this.model, labels: [...this.model.labels] };\n }\n this.updateState();\n }\n\n private normalizedLabels(): string[] {\n return this.model.labels\n .map((label) => String(label || '').trim())\n .filter((label) => label.length > 0);\n }\n\n updateState(): void {\n const dirty = JSON.stringify(this.model) !== JSON.stringify(this.initial);\n this.isDirty$.next(dirty);\n this.isValid$.next(this.normalizedLabels().length > 0);\n }\n\n setMode(mode: 'group' | 'nav'): void {\n this.model.mode = mode;\n this.updateState();\n }\n\n addLabel(): void {\n const l = (this.newLabel || '').trim();\n if (!l) return;\n this.model.labels.push(l);\n this.newLabel = '';\n this.updateState();\n }\n\n removeLabel(i: number): void {\n this.model.labels.splice(i, 1);\n this.updateState();\n }\n\n private buildConfig(): TabsMetadata {\n const labels = this.normalizedLabels();\n if (this.model.mode === 'group') {\n return {\n group: {\n dynamicHeight: !!this.model.dynamicHeight,\n stretchTabs: !!this.model.stretchTabs,\n selectedIndex: 0,\n },\n tabs: labels.map((label, idx) => ({ id: `tab${idx + 1}`, textLabel: label })),\n };\n }\n return {\n nav: {\n selectedIndex: 0,\n stretchTabs: !!this.model.stretchTabs,\n links: labels.map((label, idx) => ({ id: `link${idx + 1}`, label })),\n },\n } as TabsMetadata;\n }\n\n private buildOutputDocument(): TabsAuthoringDocument {\n return createTabsAuthoringDocument({\n config: this.buildConfig(),\n bindings: this.document?.bindings,\n });\n }\n\n getSettingsValue(): TabsAuthoringDocument {\n return this.buildOutputDocument();\n }\n\n onSave(): TabsAuthoringDocument {\n return this.buildOutputDocument();\n }\n}\n","/**\n * Capabilities catalog for Praxis Tabs (TabsMetadata).\n * Paths follow TabsMetadata shape (patches are merged at config root).\n */\n\nimport type {\n AiCapability,\n AiCapabilityCatalog,\n AiCapabilityCategory,\n AiValueKind,\n} from '@praxisui/core';\n\ndeclare module '@praxisui/core' {\n interface AiCapabilityCategoryMap {\n meta: true;\n group: true;\n nav: true;\n tabs: true;\n }\n}\n\nexport type CapabilityCategory = AiCapabilityCategory;\nexport type ValueKind = AiValueKind;\n\nexport interface Capability extends AiCapability {\n category: CapabilityCategory;\n}\n\nexport interface CapabilityCatalog extends AiCapabilityCatalog {\n capabilities: Capability[];\n}\n\nconst ENUMS: Record<string, Array<string | number>> = {\n appearanceDensity: ['compact', 'comfortable', 'spacious'],\n alignTabs: ['start', 'center', 'end'],\n headerPosition: ['above', 'below'],\n matColor: ['primary', 'accent', 'warn'],\n};\n\nconst TOKENS = [\n 'active-indicator-color',\n 'active-label-text-color',\n 'active-hover-indicator-color',\n 'active-hover-label-text-color',\n 'active-focus-indicator-color',\n 'active-focus-label-text-color',\n 'inactive-label-text-color',\n 'inactive-hover-label-text-color',\n 'inactive-focus-label-text-color',\n 'inactive-ripple-color',\n 'pagination-icon-color',\n 'divider-color',\n 'background-color',\n];\n\nconst TOKEN_CAPS: Capability[] = TOKENS.map((t): Capability => ({\n path: `appearance.tokens.${t}`,\n category: 'appearance',\n valueKind: 'string',\n description: `Token ${t} (CSS color or var).`,\n}));\n\nconst CAPS: Capability[] = [\n { path: 'meta', category: 'meta', valueKind: 'object', description: 'Metadata bag for tabs.' },\n\n { path: 'appearance', category: 'appearance', valueKind: 'object', description: 'Appearance settings.' },\n { path: 'appearance.density', category: 'appearance', valueKind: 'enum', allowedValues: ENUMS.appearanceDensity, description: 'Density preset.' },\n { path: 'appearance.themeClass', category: 'appearance', valueKind: 'string', description: 'Theme CSS class applied to root.' },\n { path: 'appearance.customCss', category: 'appearance', valueKind: 'string', description: 'Custom CSS injected into component.', safetyNotes: 'CSS is injected as raw string.' },\n { path: 'appearance.tokens', category: 'appearance', valueKind: 'object', description: 'Style tokens mapped to runtime CSS.' },\n ...TOKEN_CAPS,\n\n { path: 'behavior', category: 'behavior', valueKind: 'object', description: 'Behavior settings.' },\n { path: 'behavior.lazyLoad', category: 'behavior', valueKind: 'boolean', description: 'Lazy load tab content.' },\n { path: 'behavior.closeable', category: 'behavior', valueKind: 'boolean', description: 'Show close button on tabs.' },\n { path: 'behavior.reorderable', category: 'behavior', valueKind: 'boolean', description: 'Allow reorder tabs/links.' },\n\n { path: 'accessibility', category: 'accessibility', valueKind: 'object', description: 'Accessibility settings.' },\n { path: 'accessibility.highContrast', category: 'accessibility', valueKind: 'boolean', description: 'High contrast mode.' },\n { path: 'accessibility.reduceMotion', category: 'accessibility', valueKind: 'boolean', description: 'Reduce motion.' },\n\n { path: 'group', category: 'group', valueKind: 'object', description: 'MatTabGroup settings.' },\n { path: 'group.alignTabs', category: 'group', valueKind: 'enum', allowedValues: ENUMS.alignTabs, description: 'Align tabs in header.' },\n { path: 'group.animationDuration', category: 'group', valueKind: 'string', description: 'Animation duration (e.g., 500ms).' },\n { path: 'group.ariaLabel', category: 'group', valueKind: 'string', description: 'aria-label for tab group.' },\n { path: 'group.ariaLabelledby', category: 'group', valueKind: 'string', description: 'aria-labelledby for tab group.' },\n { path: 'group.color', category: 'group', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 color.' },\n { path: 'group.backgroundColor', category: 'group', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 background color.' },\n { path: 'group.disablePagination', category: 'group', valueKind: 'boolean', description: 'Disable pagination of header.' },\n { path: 'group.disableRipple', category: 'group', valueKind: 'boolean', description: 'Disable ripple.' },\n { path: 'group.dynamicHeight', category: 'group', valueKind: 'boolean', description: 'Enable dynamic height.' },\n { path: 'group.fitInkBarToContent', category: 'group', valueKind: 'boolean', description: 'Fit ink bar to content.' },\n { path: 'group.headerPosition', category: 'group', valueKind: 'enum', allowedValues: ENUMS.headerPosition, description: 'Header position.' },\n { path: 'group.preserveContent', category: 'group', valueKind: 'boolean', description: 'Preserve content of inactive tabs.' },\n { path: 'group.selectedIndex', category: 'group', valueKind: 'number', description: 'Selected tab index.' },\n { path: 'group.stretchTabs', category: 'group', valueKind: 'boolean', description: 'Stretch tabs.' },\n\n { path: 'nav', category: 'nav', valueKind: 'object', description: 'Tab nav settings.' },\n { path: 'nav.animationDuration', category: 'nav', valueKind: 'string', description: 'Animation duration (e.g., 500ms).' },\n { path: 'nav.ariaLabel', category: 'nav', valueKind: 'string', description: 'aria-label for nav mode.' },\n { path: 'nav.ariaLabelledby', category: 'nav', valueKind: 'string', description: 'aria-labelledby for nav mode.' },\n { path: 'nav.color', category: 'nav', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 color.' },\n { path: 'nav.backgroundColor', category: 'nav', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'M2 background color.' },\n { path: 'nav.disablePagination', category: 'nav', valueKind: 'boolean', description: 'Disable pagination of nav.' },\n { path: 'nav.disableRipple', category: 'nav', valueKind: 'boolean', description: 'Disable ripple.' },\n { path: 'nav.fitInkBarToContent', category: 'nav', valueKind: 'boolean', description: 'Fit ink bar to content.' },\n { path: 'nav.selectedIndex', category: 'nav', valueKind: 'number', description: 'Selected nav link index.' },\n { path: 'nav.stretchTabs', category: 'nav', valueKind: 'boolean', description: 'Stretch nav tabs.' },\n { path: 'nav.links', category: 'nav', valueKind: 'array', description: 'Nav links array.' },\n { path: 'nav.links[].id', category: 'nav', valueKind: 'string', description: 'Link id.' },\n { path: 'nav.links[].label', category: 'nav', valueKind: 'string', description: 'Link label.' },\n { path: 'nav.links[].active', category: 'nav', valueKind: 'boolean', description: 'Link active flag.' },\n { path: 'nav.links[].disabled', category: 'nav', valueKind: 'boolean', description: 'Disable link.' },\n { path: 'nav.links[].disableRipple', category: 'nav', valueKind: 'boolean', description: 'Disable ripple on link.' },\n { path: 'nav.links[].fitInkBarToContent', category: 'nav', valueKind: 'boolean', description: 'Fit ink bar to link content.' },\n { path: 'nav.links[].content', category: 'nav', valueKind: 'array', description: 'Dynamic field metadata list.' },\n { path: 'nav.links[].widgets', category: 'nav', valueKind: 'array', description: 'Widget definitions for link content.' },\n\n { path: 'tabs', category: 'tabs', valueKind: 'array', description: 'Tabs array.' },\n { path: 'tabs[].id', category: 'tabs', valueKind: 'string', description: 'Tab id.' },\n { path: 'tabs[].textLabel', category: 'tabs', valueKind: 'string', description: 'Tab label.' },\n { path: 'tabs[].labelClass', category: 'tabs', valueKind: 'string', description: 'Label class (string or string[]).' },\n { path: 'tabs[].bodyClass', category: 'tabs', valueKind: 'string', description: 'Body class (string or string[]).' },\n { path: 'tabs[].ariaLabel', category: 'tabs', valueKind: 'string', description: 'aria-label for tab.' },\n { path: 'tabs[].ariaLabelledby', category: 'tabs', valueKind: 'string', description: 'aria-labelledby for tab.' },\n { path: 'tabs[].disabled', category: 'tabs', valueKind: 'boolean', description: 'Disable tab.' },\n { path: 'tabs[].content', category: 'tabs', valueKind: 'array', description: 'Dynamic field metadata list.' },\n { path: 'tabs[].widgets', category: 'tabs', valueKind: 'array', description: 'Widget definitions for tab content.' },\n { path: 'tabs[].isActive', category: 'tabs', valueKind: 'boolean', description: 'Active flag (metadata only).' },\n { path: 'tabs[].origin', category: 'tabs', valueKind: 'number', description: 'Origin index (metadata only).' },\n { path: 'tabs[].position', category: 'tabs', valueKind: 'number', description: 'Position index (metadata only).' },\n\n { path: 'events', category: 'events', valueKind: 'object', description: 'Event config (placeholder).' },\n];\n\nexport const TABS_AI_CAPABILITIES: CapabilityCatalog = {\n version: 'v1.0',\n enums: ENUMS,\n targets: [\n 'praxis-tabs',\n 'tab-group',\n 'tab-item',\n 'praxis-tabs-config-editor',\n 'praxis-tabs-quick-setup',\n ],\n notes: [\n 'TabsMetadata drives both group and nav modes. Use nav.* when links are present.',\n 'appearance.customCss is injected into a <style> tag; avoid unsafe CSS from untrusted sources.',\n 'tabs[].content expects DynamicFieldMetadata[] and widgets[] expects WidgetDefinition[].',\n ],\n capabilities: CAPS,\n};\n","import { BaseAiAdapter, Capability, PatchResult } from '@praxisui/ai';\nimport { deepMerge } from '@praxisui/core';\nimport { TabsMetadata } from '../praxis-tabs';\nimport { TABS_AI_CAPABILITIES } from './tabs-ai-capabilities';\nimport { PraxisTabs } from '../praxis-tabs';\n\nexport class TabsAiAdapter extends BaseAiAdapter<TabsMetadata> {\n componentName = 'Praxis Tabs';\n\n constructor(private tabs: PraxisTabs) {\n super();\n }\n\n getCurrentConfig(): TabsMetadata {\n return this.cloneConfig(this.tabs.config || {});\n }\n\n getCapabilities(): Capability[] {\n return TABS_AI_CAPABILITIES.capabilities as unknown as Capability[];\n }\n\n override getRuntimeState(): Record<string, any> {\n const cfg = this.tabs.config;\n return {\n mode: cfg?.nav?.links?.length ? 'nav' : 'group',\n tabsCount: cfg?.tabs?.length ?? 0,\n linksCount: cfg?.nav?.links?.length ?? 0,\n lazyLoad: !!cfg?.behavior?.lazyLoad,\n selectedIndex: cfg?.group?.selectedIndex ?? 0,\n navIndex: cfg?.nav?.selectedIndex ?? 0,\n };\n }\n\n createSnapshot(): TabsMetadata {\n return this.cloneConfig(this.tabs.config || {});\n }\n\n async restoreSnapshot(snapshot: TabsMetadata): Promise<void> {\n if (!snapshot) return;\n this.applyConfig(snapshot);\n }\n\n async applyPatch(patch: Partial<TabsMetadata>): Promise<PatchResult> {\n try {\n const current = this.getCurrentConfig();\n const next = this.smartMergeTabsConfig(current, patch);\n this.applyConfig(next);\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error applying patch';\n return { success: false, error: message };\n }\n }\n\n private applyConfig(config: TabsMetadata): void {\n const apply = (this.tabs as any).applyConfigFromAdapter;\n if (typeof apply === 'function') {\n apply.call(this.tabs, config);\n return;\n }\n const prev = this.tabs.config;\n this.tabs.config = config;\n this.tabs.ngOnChanges({\n config: {\n previousValue: prev,\n currentValue: config,\n firstChange: false,\n isFirstChange: () => false,\n },\n } as any);\n }\n\n private smartMergeTabsConfig(base: TabsMetadata, patch: Partial<TabsMetadata>): TabsMetadata {\n const result = deepMerge(base, patch);\n\n if (patch.tabs && Array.isArray(patch.tabs)) {\n const merged = this.mergeByKey(\n base.tabs || [],\n patch.tabs,\n (t) => t.id || t.textLabel || '',\n );\n result.tabs = merged;\n }\n\n const patchLinks = patch.nav?.links;\n if (patchLinks && Array.isArray(patchLinks)) {\n const merged = this.mergeByKey(\n base.nav?.links || [],\n patchLinks,\n (l) => l.id || l.label || '',\n );\n result.nav = { ...(result.nav || {}), links: merged };\n }\n\n return result;\n }\n\n private mergeByKey<T extends Record<string, any>>(\n baseArr: T[],\n patchArr: T[],\n keyFn: (item: T) => string,\n ): T[] {\n const merged = baseArr.map((orig) => {\n const key = keyFn(orig);\n const match = key ? patchArr.find((p) => keyFn(p) === key) : undefined;\n return match ? deepMerge(orig as any, match as any) : orig;\n });\n\n patchArr.forEach((item) => {\n const key = keyFn(item);\n if (!key || !baseArr.find((o) => keyFn(o) === key)) {\n merged.push(item);\n }\n });\n\n return merged;\n }\n\n private cloneConfig(config: TabsMetadata): TabsMetadata {\n try {\n return structuredClone(config);\n } catch {\n return JSON.parse(JSON.stringify(config));\n }\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n OnChanges,\n SimpleChanges,\n OnInit,\n OnDestroy,\n inject,\n signal,\n computed,\n} from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { MatTabsModule, MatTabChangeEvent } from '@angular/material/tabs';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {\n PraxisIconDirective,\n ComponentKeyService,\n WidgetEventEnvelope,\n WidgetEventPathSegment,\n PraxisI18nService,\n providePraxisI18nConfig,\n} from '@praxisui/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { DynamicFieldLoaderDirective } from '@praxisui/dynamic-fields';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport {\n ASYNC_CONFIG_STORAGE,\n AsyncConfigStorage,\n LoggerService,\n} from '@praxisui/core';\nimport { PraxisTabsConfigEditor } from './praxis-tabs-config-editor';\nimport { produce } from 'immer';\nimport { DragDropModule, CdkDragDrop } from '@angular/cdk/drag-drop';\nimport { EmptyStateCardComponent, DynamicWidgetLoaderDirective, WidgetDefinition } from '@praxisui/core';\nimport { TabsQuickSetupComponent } from './quick-setup/tabs-quick-setup.component';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { PraxisAiAssistantComponent } from '@praxisui/ai';\nimport { TabsAiAdapter } from './ai/tabs-ai.adapter';\nimport {\n buildTabsApplyPlan,\n createTabsAuthoringDocument,\n normalizeTabsAuthoringDocument,\n} from './tabs-editor-capability';\nimport {\n TabsApplyPlan,\n TabsAuthoringDocument,\n} from './tabs-editor-document.model';\nimport { PRAXIS_TABS_I18N_CONFIG, PRAXIS_TABS_I18N_NAMESPACE } from './praxis-tabs.i18n';\n\n// =====================\n// Metadata interfaces\n// =====================\nexport interface TabsMetadata {\n meta?: any;\n appearance?: TabsAppearanceConfig;\n behavior?: TabsBehaviorConfig;\n events?: TabsEventConfig;\n accessibility?: TabsAccessibilityConfig;\n group?: TabGroupMetadata;\n tabs?: TabMetadata[];\n nav?: TabNavMetadata;\n}\n\nexport interface TabsAppearanceConfig {\n density?: 'compact' | 'comfortable' | 'spacious';\n themeClass?: string;\n customCss?: string;\n /** Optional runtime tokens mapped to CSS for per-instance styling */\n tokens?: Partial<TabsStyleTokens>;\n}\n\nexport interface TabsBehaviorConfig {\n lazyLoad?: boolean;\n closeable?: boolean;\n reorderable?: boolean;\n}\n\nexport interface TabsEventConfig {\n // Placeholder for docs parity; events are component outputs\n}\n\nexport interface TabsAccessibilityConfig {\n /** @deprecated Declared-only. No direct runtime binding; prefer mode-specific aria fields instead. */\n ariaLabels?: { [key: string]: string };\n /** @deprecated Declared-only. Keyboard navigation follows Angular Material defaults; no dedicated runtime gate exists. */\n keyboardNavigation?: boolean;\n highContrast?: boolean;\n reduceMotion?: boolean;\n}\n\nexport interface TabGroupMetadata {\n alignTabs?: 'start' | 'center' | 'end';\n animationDuration?: string;\n ariaLabel?: string;\n ariaLabelledby?: string;\n color?: 'primary' | 'accent' | 'warn';\n /** @deprecated Declared-only. No template binding in the current runtime. */\n contentTabIndex?: number;\n disablePagination?: boolean;\n disableRipple?: boolean;\n dynamicHeight?: boolean;\n fitInkBarToContent?: boolean;\n headerPosition?: 'above' | 'below';\n preserveContent?: boolean;\n selectedIndex?: number;\n stretchTabs?: boolean;\n backgroundColor?: 'primary' | 'accent' | 'warn' | undefined;\n}\n\nexport interface TabMetadata {\n id?: string;\n ariaLabel?: string;\n ariaLabelledby?: string;\n textLabel?: string;\n labelClass?: string | string[];\n bodyClass?: string | string[];\n disabled?: boolean;\n content?: any[]; // DynamicFieldMetadata[]\n widgets?: WidgetDefinition[];\n isActive?: boolean;\n origin?: number;\n position?: number;\n}\n\nexport interface TabNavMetadata {\n animationDuration?: string;\n color?: 'primary' | 'accent' | 'warn';\n backgroundColor?: 'primary' | 'accent' | 'warn' | undefined;\n ariaLabel?: string;\n ariaLabelledby?: string;\n disablePagination?: boolean;\n disableRipple?: boolean;\n fitInkBarToContent?: boolean;\n selectedIndex?: number;\n stretchTabs?: boolean;\n links: TabLinkMetadata[];\n}\n\nexport interface TabLinkMetadata {\n id?: string;\n label: string;\n active?: boolean;\n disabled?: boolean;\n disableRipple?: boolean;\n fitInkBarToContent?: boolean;\n content?: any[]; // DynamicFieldMetadata[]\n widgets?: WidgetDefinition[];\n}\n\n// A minimal set of style tokens mapped to CSS at runtime.\nexport interface TabsStyleTokens {\n 'active-indicator-color': string;\n 'active-focus-indicator-color': string;\n 'active-hover-indicator-color': string;\n 'active-label-text-color': string;\n 'active-focus-label-text-color': string;\n 'active-hover-label-text-color': string;\n 'inactive-label-text-color': string;\n 'inactive-hover-label-text-color': string;\n 'inactive-focus-label-text-color': string;\n 'inactive-ripple-color': string;\n 'pagination-icon-color': string;\n 'divider-color': string;\n 'background-color': string;\n}\n\n@Component({\n selector: 'praxis-tabs',\n standalone: true,\n providers: [providePraxisI18nConfig(PRAXIS_TABS_I18N_CONFIG)],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatTabsModule,\n MatIconModule,\n MatTooltipModule,\n PraxisIconDirective,\n MatButtonModule,\n DragDropModule,\n EmptyStateCardComponent,\n DynamicFieldLoaderDirective,\n DynamicWidgetLoaderDirective,\n PraxisAiAssistantComponent,\n ],\n template: `\n <div\n class=\"praxis-tabs-root\"\n [class.density-compact]=\"config?.appearance?.density === 'compact'\"\n [class.density-comfortable]=\"config?.appearance?.density === 'comfortable'\"\n [class.density-spacious]=\"config?.appearance?.density === 'spacious'\"\n [class.high-contrast]=\"config?.accessibility?.highContrast\"\n [class.reduce-motion]=\"config?.accessibility?.reduceMotion\"\n [ngClass]=\"config?.appearance?.themeClass || ''\"\n [attr.data-tabs-id]=\"styleScopeId()\"\n >\n <!-- Inline custom CSS, if provided -->\n <style *ngIf=\"safeCustomCss() as css\" [innerHTML]=\"css\"></style>\n <!-- Runtime style derived from tokens -->\n <style *ngIf=\"styleCss() as s\" [innerHTML]=\"s\"></style>\n\n <div class=\"tabs-ai-assistant\" *ngIf=\"enableCustomization\">\n <praxis-ai-assistant [adapter]=\"aiAdapter\"></praxis-ai-assistant>\n </div>\n\n <!-- Empty state (global) -->\n <ng-container *ngIf=\"isEmptyGlobal(); else notEmpty\">\n <praxis-empty-state-card\n icon=\"tab\"\n [title]=\"t('emptyState.title', 'Nenhuma aba configurada')\"\n [description]=\"t('emptyState.description', 'Crie rapidamente suas abas ou abra o editor completo.')\"\n [primaryAction]=\"{ label: t('emptyState.primaryAction', 'Criar abas rapidamente'), icon: 'add', action: openQuickSetup.bind(this) }\"\n [secondaryActions]=\"[\n { label: t('emptyState.secondaryAddEmpty', 'Adicionar aba vazia'), icon: 'tab', action: addEmptyTab.bind(this) },\n { label: t('emptyState.secondaryOpenEditor', 'Abrir editor completo'), icon: 'tune', action: openEditor.bind(this) }\n ]\"\n ></praxis-empty-state-card>\n </ng-container>\n\n <ng-template #notEmpty>\n <!-- Tab Nav variant -->\n <ng-container *ngIf=\"isNavMode(); else groupMode\">\n <nav\n mat-tab-nav-bar\n [tabPanel]=\"tabPanel\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n [cdkDropListDisabled]=\"!config?.behavior?.reorderable\"\n (cdkDropListDropped)=\"onNavDrop($event)\"\n [disablePagination]=\"config?.nav?.disablePagination\"\n [fitInkBarToContent]=\"config?.nav?.fitInkBarToContent\"\n [mat-stretch-tabs]=\"config?.nav?.stretchTabs\"\n [color]=\"config?.nav?.color\"\n [backgroundColor]=\"config?.nav?.backgroundColor\"\n [selectedIndex]=\"currentNavIndex()\"\n [attr.aria-label]=\"config?.nav?.ariaLabel || config?.group?.ariaLabel || null\"\n [attr.aria-labelledby]=\"config?.nav?.ariaLabelledby || config?.group?.ariaLabelledby || null\"\n [animationDuration]=\"effectiveAnimationDuration()\"\n (indexFocused)=\"indexFocused.emit($event)\"\n (selectFocusedIndex)=\"selectFocusedIndex.emit($event)\"\n >\n <a\n mat-tab-link\n *ngFor=\"let link of config?.nav?.links; let i = index; trackBy: trackNavLink\"\n cdkDrag\n [cdkDragDisabled]=\"!config?.behavior?.reorderable\"\n cdkDragLockAxis=\"x\"\n [active]=\"getNavActive(i)\"\n [disabled]=\"link.disabled\"\n [disableRipple]=\"config?.nav?.disableRipple || link.disableRipple\"\n [fitInkBarToContent]=\"link.fitInkBarToContent || false\"\n [id]=\"link.id || ''\"\n (click)=\"onNavClick(i)\"\n >\n <span *ngIf=\"config?.behavior?.reorderable\" class=\"drag-handle\" cdkDragHandle>\n <mat-icon fontIcon=\"drag_indicator\"></mat-icon>\n </span>\n {{ link.label }}\n </a>\n </nav>\n\n <mat-tab-nav-panel #tabPanel>\n <div class=\"praxis-tabnav-content\" *ngIf=\"currentNavIndex() >= 0\">\n <ng-container\n *ngIf=\"config?.nav?.links?.[currentNavIndex()] as l\"\n >\n <ng-container *ngIf=\"(l.content?.length || l.widgets?.length) && navContentReady(currentNavIndex()); else emptyNav\">\n <ng-container *ngIf=\"l.content && form\">\n <ng-container\n dynamicFieldLoader\n [fields]=\"l.content || []\"\n [formGroup]=\"form!\"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"l.widgets?.length\">\n <ng-container *ngFor=\"let w of l.widgets; let wi = index; trackBy: trackWidgetDefinition\">\n <ng-container\n [dynamicWidgetLoader]=\"resolveWidgetDefinition(w)\"\n [context]=\"context || {}\"\n (widgetEvent)=\"emitWidgetEvent(linkEventPath(l.id, currentNavIndex()), $event)\"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template #emptyNav>\n <praxis-empty-state-card\n [inline]=\"true\"\n icon=\"add_to_queue\"\n [title]=\"t('emptyState.navTitle', 'Sem conteudo neste link')\"\n [description]=\"t('emptyState.navDescription', 'Adicione conteudo ou use o editor para configurar.')\"\n [primaryAction]=\"{ label: t('emptyState.openEditor', 'Abrir editor'), icon: 'tune', action: openEditor.bind(this) }\"\n ></praxis-empty-state-card>\n </ng-template>\n </ng-container>\n </div>\n </mat-tab-nav-panel>\n </ng-container>\n\n <!-- Tab Group variant -->\n <ng-template #groupMode>\n <mat-tab-group\n [dynamicHeight]=\"config?.group?.dynamicHeight\"\n [disableRipple]=\"config?.group?.disableRipple\"\n [disablePagination]=\"config?.group?.disablePagination\"\n [fitInkBarToContent]=\"config?.group?.fitInkBarToContent\"\n [headerPosition]=\"config?.group?.headerPosition ?? 'above'\"\n [preserveContent]=\"config?.group?.preserveContent\"\n [selectedIndex]=\"selectedIndexSignal()\"\n [mat-stretch-tabs]=\"config?.group?.stretchTabs\"\n [mat-align-tabs]=\"config?.group?.alignTabs || 'start'\"\n [color]=\"config?.group?.color\"\n [backgroundColor]=\"config?.group?.backgroundColor\"\n [animationDuration]=\"effectiveAnimationDuration()\"\n [attr.aria-label]=\"config?.group?.ariaLabel || null\"\n [attr.aria-labelledby]=\"config?.group?.ariaLabelledby || null\"\n (animationDone)=\"animationDone.emit()\"\n (focusChange)=\"focusChange.emit($event)\"\n (selectedIndexChange)=\"onSelectedIndexChange($event)\"\n (selectedTabChange)=\"selectedTabChange.emit($event)\"\n class=\"praxis-tabs-group\"\n >\n <mat-tab\n *ngFor=\"let tab of config?.tabs; let i = index; trackBy: trackTab\"\n [disabled]=\"tab.disabled\"\n [labelClass]=\"tab.labelClass ?? ''\"\n [bodyClass]=\"tab.bodyClass ?? ''\"\n [id]=\"tab.id || ''\"\n [attr.aria-label]=\"tab.ariaLabel || null\"\n [attr.aria-labelledby]=\"tab.ariaLabelledby || null\"\n >\n <ng-template mat-tab-label>\n <span>{{ tab.textLabel }}</span>\n <button\n *ngIf=\"config?.behavior?.closeable\"\n mat-icon-button\n type=\"button\"\n (click)=\"closeTab(i); $event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"t('chrome.closeTab', 'Fechar aba')\"\n >\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n <ng-container *ngIf=\"config?.behavior?.reorderable\">\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"moveTab(i, -1); $event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n [disabled]=\"i===0\"\n [attr.aria-label]=\"t('chrome.moveTabLeft', 'Mover aba para esquerda')\"\n >\n <mat-icon fontIcon=\"arrow_back\"></mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"moveTab(i, 1); $event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n [disabled]=\"i===(config?.tabs?.length||1)-1\"\n [attr.aria-label]=\"t('chrome.moveTabRight', 'Mover aba para direita')\"\n >\n <mat-icon fontIcon=\"arrow_forward\"></mat-icon>\n </button>\n </ng-container>\n </ng-template>\n\n <ng-template matTabContent>\n <ng-container *ngIf=\"(tab.content?.length || tab.widgets?.length) && groupContentReady(i); else emptyTab\">\n <ng-container *ngIf=\"tab.content && form\">\n <ng-container\n dynamicFieldLoader\n [fields]=\"tab.content || []\"\n [formGroup]=\"form!\"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"tab.widgets?.length\">\n <ng-container *ngFor=\"let w of tab.widgets; let wi = index; trackBy: trackWidgetDefinition\">\n <ng-container\n [dynamicWidgetLoader]=\"resolveWidgetDefinition(w)\"\n [context]=\"context || {}\"\n (widgetEvent)=\"emitWidgetEvent(tabEventPath(tab.id, i), $event)\"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template #emptyTab>\n <praxis-empty-state-card\n [inline]=\"true\"\n icon=\"dashboard_customize\"\n [title]=\"t('emptyState.tabTitle', 'Sem conteudo nesta aba')\"\n [description]=\"t('emptyState.tabDescription', 'Adicione conteudo ou use o editor para configurar.')\"\n [primaryAction]=\"{ label: t('emptyState.openEditor', 'Abrir editor'), icon: 'tune', action: openEditor.bind(this) }\"\n ></praxis-empty-state-card>\n </ng-template>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </ng-template>\n </ng-template>\n\n <!-- Edit button -->\n <button\n *ngIf=\"enableCustomization\"\n mat-fab\n class=\"edit-fab\"\n [attr.aria-label]=\"t('chrome.editTabs', 'Editar abas')\"\n (click)=\"openEditor()\"\n >\n <mat-icon fontIcon=\"edit\"></mat-icon>\n </button>\n <button\n *ngIf=\"enableCustomization && tabsId\"\n mat-mini-fab\n class=\"edit-fab edit-fab-secondary\"\n [attr.aria-label]=\"t('settings.resetPreferences', 'Redefinir preferencias de abas')\"\n (click)=\"resetPreferences()\"\n [matTooltip]=\"t('settings.resetPreferences', 'Redefinir preferencias de abas')\"\n >\n <mat-icon [praxisIcon]=\"'restart_alt'\"></mat-icon>\n </button>\n </div>\n `,\n styles: [\n `\n .praxis-tabs-root { position: relative; display: block; }\n .praxis-tabs-group.align-start .mat-mdc-tab-header { justify-content: flex-start; }\n .praxis-tabs-group.align-center .mat-mdc-tab-header { justify-content: center; }\n .praxis-tabs-group.align-end .mat-mdc-tab-header { justify-content: flex-end; }\n .density-compact .mat-mdc-tab-body-content { padding: 8px; }\n .density-comfortable .mat-mdc-tab-body-content { padding: 16px; }\n .density-spacious .mat-mdc-tab-body-content { padding: 24px; }\n .tabs-ai-assistant { position: absolute; right: 12px; bottom: 72px; z-index: 3; }\n .edit-fab { position: absolute; right: 12px; bottom: 12px; z-index: 2; }\n .edit-fab-secondary { right: 56px; }\n .tab-empty { padding: 16px; color: var(--md-sys-color-on-surface-variant); font-style: italic; }\n .high-contrast { filter: contrast(1.2); }\n .reduce-motion { --mat-animation-duration: 0ms; }\n .drag-handle { display: inline-flex; align-items: center; vertical-align: middle; margin-right: 4px; cursor: grab; }\n\n /* Gridster integration: make tabs fill the tile height */\n :host-context(.pdx-gridster-item) .praxis-tabs-root {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0; /* allow children to shrink */\n }\n :host-context(.pdx-gridster-item) .praxis-tabs-group,\n :host-context(.pdx-gridster-item) .mat-mdc-tab-group {\n flex: 1 1 auto;\n min-height: 0;\n }\n :host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,\n :host-context(.pdx-gridster-item) .mat-mdc-tab-body-content {\n height: 100%;\n min-height: 0;\n }\n :host-context(.pdx-gridster-item) .mat-mdc-tab-body-content {\n overflow: auto;\n }\n /* Nav variant content should expand and scroll inside tile */\n :host-context(.pdx-gridster-item) .praxis-tabnav-content {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PraxisTabs implements OnInit, OnChanges, OnDestroy {\n private readonly i18n = inject(PraxisI18nService);\n private readonly settings = inject(SettingsPanelService);\n private readonly storage = inject<AsyncConfigStorage>(ASYNC_CONFIG_STORAGE);\n private readonly snack = inject(MatSnackBar);\n private readonly componentKeys = inject(ComponentKeyService);\n private readonly logger = inject(LoggerService);\n private readonly route = (() => { try { return inject(ActivatedRoute); } catch { return undefined as ActivatedRoute | undefined; } })();\n private warnedMissingId = false;\n\n @Input() config: TabsMetadata | null = null;\n @Input({ required: true }) tabsId!: string;\n @Input() componentInstanceId?: string;\n @Input() enableCustomization = false;\n @Input() form: FormGroup | null = null;\n @Input() context: Record<string, any> | null = null;\n\n @Output() animationDone = new EventEmitter<void>();\n @Output() focusChange = new EventEmitter<MatTabChangeEvent>();\n @Output() selectedIndexChange = new EventEmitter<number>();\n @Output() selectedTabChange = new EventEmitter<MatTabChangeEvent>();\n @Output() indexFocused = new EventEmitter<number>();\n @Output() selectFocusedIndex = new EventEmitter<number>();\n @Output() widgetEvent = new EventEmitter<WidgetEventEnvelope>();\n\n public aiAdapter = new TabsAiAdapter(this);\n\n // Signals to manage local state for selection in Nav mode and Group mode\n protected currentNavIndex = signal<number>(0);\n protected selectedIndexSignal = signal<number>(0);\n private groupLoaded = new Set<number>();\n private navLoaded = new Set<number>();\n private readonly destroy$ = new Subject<void>();\n private readonly widgetDefinitionCache = new WeakMap<WidgetDefinition, WidgetDefinition>();\n\n ngOnInit(): void {\n this.syncSelectionFromConfig();\n // Load stored config if tabsId provided\n const key = this.storageKey();\n if (key) {\n this.storage.loadConfig<TabsMetadata>(key).pipe(take(1)).subscribe((stored) => {\n if (stored) {\n this.config = stored;\n }\n this.syncSelectionFromConfig();\n });\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && this.config) {\n // Reset loaded caches on config change and seed with current selections\n this.syncSelectionFromConfig();\n\n // Persist when tabsId provided\n this.persistConfig(this.config);\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n isNavMode(): boolean {\n return !!this.config?.nav && !!this.config?.nav?.links?.length;\n }\n\n effectiveAnimationDuration(): string {\n const reduce = this.config?.accessibility?.reduceMotion;\n if (reduce) return '0ms';\n return (\n this.config?.group?.animationDuration || this.config?.nav?.animationDuration || '500ms'\n );\n }\n\n getNavActive(i: number): boolean {\n return this.currentNavIndex() === i;\n }\n\n onNavClick(i: number): void {\n if (!this.config?.nav?.links?.length) return;\n const linksCount = this.config.nav.links.length;\n if (i < 0 || i >= linksCount) return;\n this.currentNavIndex.set(i);\n this.config = produce(this.config, (draft) => {\n if (!draft.nav) return;\n draft.nav.selectedIndex = i;\n });\n this.persistConfig(this.config);\n // Lazy: mark as loaded\n this.navLoaded.add(i);\n // Emit as index change for consumers to track\n this.selectedIndexChange.emit(i);\n }\n\n onNavDrop(event: CdkDragDrop<any>): void {\n if (!this.config?.nav?.links) return;\n const prev = event.previousIndex;\n const curr = event.currentIndex;\n const linksLength = this.config.nav.links.length;\n if (prev < 0 || curr < 0 || prev >= linksLength || curr >= linksLength) return;\n if (prev === curr) return;\n const selectedId = this.config.nav.links[this.currentNavIndex()]?.id;\n this.config = produce(this.config, (draft) => {\n const arr = draft.nav!.links as any[];\n const [moved] = arr.splice(prev, 1);\n arr.splice(curr, 0, moved);\n });\n // Update selected index based on id\n if (selectedId) {\n const idx = this.config.nav!.links.findIndex((l) => l.id === selectedId);\n if (idx >= 0) this.currentNavIndex.set(idx);\n } else {\n // If no id, preserve selected index around move.\n const selected = this.currentNavIndex();\n if (selected === prev) {\n this.currentNavIndex.set(curr);\n } else if (prev < selected && curr >= selected) {\n this.currentNavIndex.set(selected - 1);\n } else if (prev > selected && curr <= selected) {\n this.currentNavIndex.set(selected + 1);\n }\n }\n // Reset lazy cache for nav except current\n const currIdx = this.currentNavIndex();\n this.navLoaded.clear();\n this.navLoaded.add(currIdx);\n this.config = produce(this.config, (draft) => {\n if (!draft.nav) return;\n draft.nav.selectedIndex = currIdx;\n });\n this.persistConfig(this.config);\n }\n\n onSelectedIndexChange(index: number): void {\n const selected = this.clampIndex(index, this.config?.tabs?.length ?? 0);\n this.selectedIndexSignal.set(selected);\n // Update config immutably\n if (this.config) {\n this.config = produce(this.config, (draft) => {\n if (!draft.group) {\n (draft as any).group = { selectedIndex: selected } as TabGroupMetadata;\n } else {\n draft.group.selectedIndex = selected;\n }\n });\n this.persistConfig(this.config);\n }\n // Lazy: mark as loaded\n this.groupLoaded.add(selected);\n this.selectedIndexChange.emit(selected);\n }\n\n closeTab(index: number): void {\n if (!this.config?.tabs) return;\n if (index < 0 || index >= this.config.tabs.length) return;\n const currentSelected = this.selectedIndexSignal();\n this.config = produce(this.config, (draft) => {\n draft.tabs!.splice(index, 1);\n const tabsLength = draft.tabs!.length;\n if (!draft.group) {\n (draft as any).group = {} as TabGroupMetadata;\n }\n if (tabsLength <= 0) {\n draft.group!.selectedIndex = 0;\n return;\n }\n const adjusted = currentSelected > index ? currentSelected - 1 : currentSelected;\n draft.group!.selectedIndex = this.clampIndex(adjusted, tabsLength);\n });\n const nextSelected = this.clampIndex(\n this.config?.group?.selectedIndex,\n this.config?.tabs?.length ?? 0,\n );\n this.selectedIndexSignal.set(nextSelected);\n this.groupLoaded.clear();\n if ((this.config?.tabs?.length ?? 0) > 0) {\n this.groupLoaded.add(nextSelected);\n }\n this.persistConfig(this.config);\n }\n\n moveTab(index: number, delta: number): void {\n if (!this.config?.tabs) return;\n const to = index + delta;\n if (to < 0 || to >= this.config.tabs.length) return;\n const wasSelected = this.selectedIndexSignal() === index;\n this.config = produce(this.config, (draft) => {\n const arr = draft.tabs! as any[];\n const [m] = arr.splice(index, 1);\n arr.splice(to, 0, m);\n if (!draft.group) (draft as any).group = { selectedIndex: to } as TabGroupMetadata;\n else if (wasSelected) draft.group.selectedIndex = to;\n else if (draft.group.selectedIndex != null) {\n // Adjust selection if it lies between moved indices\n const sel = draft.group.selectedIndex as number;\n if (index < sel && to >= sel) draft.group.selectedIndex = sel - 1;\n else if (index > sel && to <= sel) draft.group.selectedIndex = sel + 1;\n }\n });\n this.selectedIndexSignal.set(this.config.group?.selectedIndex ?? this.selectedIndexSignal());\n // Reset lazy cache for group except current\n const sel = this.selectedIndexSignal() ?? 0;\n this.groupLoaded.clear();\n this.groupLoaded.add(sel);\n this.persistConfig(this.config);\n }\n\n openEditor(): void {\n const key = this.storageKey() || this.tabsId || 'default';\n const initialDocument = createTabsAuthoringDocument({\n config: this.config ?? {},\n bindings: this.currentTabsBindings(),\n });\n const ref = this.settings.open({\n id: `praxis-tabs-editor:${key}`,\n title: this.t('settings.title', 'Configurar abas'),\n content: {\n component: PraxisTabsConfigEditor,\n inputs: { document: initialDocument },\n },\n });\n\n const applyDocument = (value: TabsAuthoringDocument) => {\n const document = normalizeTabsAuthoringDocument(value);\n const plan = buildTabsApplyPlan(\n document,\n {\n currentBindings: this.currentTabsBindings(),\n currentConfig: this.config,\n },\n {\n saveConfig: true,\n saveBindings: false,\n },\n );\n this.applyTabsAuthoringPlan(plan);\n };\n\n ref.applied$.pipe(takeUntil(this.destroy$)).subscribe(applyDocument);\n ref.saved$.pipe(takeUntil(this.destroy$)).subscribe(applyDocument);\n }\n\n addEmptyTab(): void {\n const next = produce(this.config || {}, (draft: any) => {\n if (!draft.group) draft.group = { selectedIndex: 0 };\n if (!draft.tabs) draft.tabs = [];\n draft.tabs.push({\n id: `tab${(draft.tabs.length || 0) + 1}`,\n textLabel: this.t('defaults.newTabLabel', 'New Tab'),\n });\n draft.group.selectedIndex = (draft.tabs.length || 1) - 1;\n }) as TabsMetadata;\n this.config = next;\n this.persistConfig(this.config);\n this.selectedIndexSignal.set(this.config?.group?.selectedIndex ?? 0);\n }\n\n /** Clears persisted tabs configuration to fallback to defaults */\n resetPreferences(): void {\n const key = this.storageKey();\n if (!key) return;\n try {\n this.storage.clearConfig(key).pipe(take(1)).subscribe({ error: () => {} });\n } catch {}\n try {\n this.snack.open(\n this.t('settings.resetDone', 'Preferencias de abas redefinidas'),\n undefined,\n { duration: 2000 },\n );\n } catch {}\n // keep current in-memory config; caller may choose to reload\n }\n\n openQuickSetup(): void {\n const key = this.storageKey() || this.tabsId || 'default';\n const initialDocument = createTabsAuthoringDocument({\n config: this.config ?? {},\n bindings: this.currentTabsBindings(),\n });\n const ref = this.settings.open({\n id: `praxis-tabs-quick-setup:${key}`,\n title: this.t('quickSetup.title', 'Criar abas rapidamente'),\n content: {\n component: TabsQuickSetupComponent,\n inputs: { document: initialDocument },\n },\n });\n\n const applyDocument = (value: TabsAuthoringDocument) => {\n const document = normalizeTabsAuthoringDocument(value);\n const plan = buildTabsApplyPlan(\n document,\n {\n currentBindings: this.currentTabsBindings(),\n currentConfig: this.config,\n },\n {\n saveConfig: true,\n saveBindings: false,\n },\n );\n this.applyTabsAuthoringPlan(plan);\n };\n\n ref.applied$.pipe(takeUntil(this.destroy$)).subscribe(applyDocument);\n ref.saved$.pipe(takeUntil(this.destroy$)).subscribe(applyDocument);\n }\n\n private currentTabsBindings() {\n return {\n tabsId: this.tabsId ?? null,\n componentInstanceId: this.componentInstanceId ?? null,\n };\n }\n\n t(key: string, fallback: string): string {\n return this.i18n.t(key, undefined, fallback, PRAXIS_TABS_I18N_NAMESPACE);\n }\n\n private applyTabsAuthoringPlan(plan: TabsApplyPlan): void {\n if (plan.diagnostics.some((item) => item.level === 'error')) {\n return;\n }\n\n this.config = plan.canonicalConfig;\n this.syncSelectionFromConfig();\n\n if (plan.runtime.rebuildLazyState) {\n this.groupLoaded.clear();\n this.navLoaded.clear();\n\n const groupIndex = this.selectedIndexSignal();\n const navIndex = this.currentNavIndex();\n\n if ((this.config?.tabs?.length ?? 0) > 0) {\n this.groupLoaded.add(groupIndex);\n }\n if ((this.config?.nav?.links?.length ?? 0) > 0) {\n this.navLoaded.add(navIndex);\n }\n }\n\n if (plan.persistence.saveConfig) {\n this.persistConfig(this.config);\n }\n }\n\n private storageKey(): string | null {\n const id = this.componentKeyId();\n return id ? `tabs:${id}` : null;\n }\n\n private syncSelectionFromConfig(): void {\n this.groupLoaded.clear();\n this.navLoaded.clear();\n const tabsLength = this.config?.tabs?.length ?? 0;\n const linksLength = this.config?.nav?.links?.length ?? 0;\n const groupIndex = this.clampIndex(this.config?.group?.selectedIndex, tabsLength);\n const navIndex = this.clampIndex(this.config?.nav?.selectedIndex, linksLength);\n this.selectedIndexSignal.set(groupIndex);\n this.currentNavIndex.set(navIndex);\n if (tabsLength > 0) this.groupLoaded.add(groupIndex);\n if (linksLength > 0) this.navLoaded.add(navIndex);\n }\n\n private persistConfig(config?: TabsMetadata | null): void {\n const key = this.storageKey();\n if (!key || !config) return;\n this.storage.saveConfig(key, config).pipe(take(1)).subscribe({ error: () => {} });\n }\n\n private componentKeyId(): string | null {\n const key = this.componentKeys.buildComponentId({\n componentType: 'praxis-tabs',\n componentId: this.tabsId,\n instanceKey: this.componentInstanceId,\n componentRef: this,\n route: this.route,\n requireComponentId: true,\n });\n if (!key) this.warnMissingId();\n return key;\n }\n\n private warnMissingId(): void {\n if (this.warnedMissingId) return;\n this.warnedMissingId = true;\n this.logger.warnOnce(\n '[PraxisTabs] tabsId is required for config persistence.',\n {\n context: {\n lib: 'praxis-tabs',\n component: 'PraxisTabs',\n },\n data: {\n tabsId: this.tabsId,\n componentInstanceId: this.componentInstanceId,\n },\n dedupeKey: 'praxis-tabs:missing-tabs-id',\n },\n );\n }\n\n private clampIndex(index: number | undefined, size: number): number {\n if (size <= 0) return 0;\n const numeric = Number(index);\n const safe = Number.isFinite(numeric) ? Math.trunc(numeric) : 0;\n return Math.min(Math.max(safe, 0), size - 1);\n }\n\n public applyConfigFromAdapter(next: TabsMetadata): void {\n this.config = next;\n this.syncSelectionFromConfig();\n this.persistConfig(this.config);\n }\n\n // =====================\n // Lazy load helpers\n // =====================\n private isLazy(): boolean {\n return !!this.config?.behavior?.lazyLoad;\n }\n\n protected groupContentReady(index: number): boolean {\n return !this.isLazy() || this.groupLoaded.has(index) || this.selectedIndexSignal() === index;\n }\n\n protected navContentReady(index: number): boolean {\n return !this.isLazy() || this.navLoaded.has(index) || this.currentNavIndex() === index;\n }\n\n protected isEmptyGlobal(): boolean {\n const hasTabs = !!(this.config?.tabs && this.config.tabs.length > 0);\n const hasLinks = !!(this.config?.nav?.links && this.config.nav!.links.length > 0);\n return !(hasTabs || hasLinks);\n }\n\n protected trackNavLink(index: number, link: TabLinkMetadata): string {\n return link.id || `${link.label || 'nav-link'}:${index}`;\n }\n\n protected trackTab(index: number, tab: TabMetadata): string {\n return tab.id || tab.textLabel || `tab:${index}`;\n }\n\n protected trackWidgetDefinition(index: number, widget: WidgetDefinition): string {\n return widget.childWidgetKey || widget.id || `widget:${index}`;\n }\n\n protected resolveWidgetDefinition(widget: WidgetDefinition): WidgetDefinition {\n const cached = this.widgetDefinitionCache.get(widget);\n if (cached) {\n return cached;\n }\n\n const clone = this.cloneWidgetDefinition(widget);\n this.widgetDefinitionCache.set(widget, clone);\n return clone;\n }\n\n protected emitWidgetEvent(\n path: WidgetEventPathSegment[],\n ev: WidgetEventEnvelope,\n ): void {\n this.widgetEvent.emit({\n ...ev,\n path: [...path, ...(ev.path || [])],\n });\n }\n\n protected tabEventPath(tabId: string | undefined, tabIndex: number): WidgetEventPathSegment[] {\n return [\n { kind: 'tabs', id: this.tabsId },\n { kind: 'tab', id: tabId, index: tabIndex },\n ];\n }\n\n protected linkEventPath(linkId: string | undefined, linkIndex: number): WidgetEventPathSegment[] {\n return [\n { kind: 'tabs', id: this.tabsId },\n { kind: 'nav', id: this.tabsId },\n { kind: 'link', id: linkId, index: linkIndex },\n ];\n }\n\n protected styleScopeId(): string {\n const scopeSeed = [this.tabsId, this.componentInstanceId]\n .filter((v): v is string => typeof v === 'string' && !!v.trim())\n .join('--');\n const raw = String(scopeSeed || 'default').trim();\n const sanitized = raw\n .replace(/[^a-zA-Z0-9_-]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n return sanitized || 'default';\n }\n\n protected safeCustomCss(): string | null {\n const css = this.config?.appearance?.customCss;\n if (!css) return null;\n const value = String(css).trim();\n if (!value) return null;\n const forbidden = [\n /@import/i,\n /expression\\s*\\(/i,\n /behavior\\s*:/i,\n /<\\/style/i,\n /<script/i,\n /url\\s*\\(\\s*(['\"]?)\\s*(javascript:|data:text\\/html)/i,\n ];\n if (forbidden.some((pattern) => pattern.test(value))) {\n return null;\n }\n return value;\n }\n\n private sanitizeCssValue(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n const forbidden = [\n /@import/i,\n /expression\\s*\\(/i,\n /behavior\\s*:/i,\n /url\\s*\\(\\s*(['\"]?)\\s*(javascript:|data:text\\/html)/i,\n ];\n if (forbidden.some((pattern) => pattern.test(trimmed))) {\n return null;\n }\n const sanitized = trimmed.replace(/[{};<>]/g, '').trim();\n return sanitized || null;\n }\n\n protected styleCss(): string | null {\n const t = this.config?.appearance?.tokens;\n if (!t) return null;\n const scope = `.praxis-tabs-root[data-tabs-id=\"${this.styleScopeId()}\"]`;\n const rules: string[] = [];\n const push = (selector: string, decls: string[]) => {\n rules.push(`${scope} ${selector}{${decls.join('')}}`);\n };\n\n // Active indicator underline\n const activeIndicatorColor = this.sanitizeCssValue(t['active-indicator-color']);\n if (activeIndicatorColor) {\n push(\n ' .mat-mdc-tab .mdc-tab-indicator__content--underline',\n [`background-color:${activeIndicatorColor}!important;`],\n );\n }\n // Active label\n const activeLabelColor = this.sanitizeCssValue(t['active-label-text-color']);\n if (activeLabelColor) {\n push(' .mdc-tab--active .mdc-tab__text-label', [\n `color:${activeLabelColor}!important;`,\n ]);\n }\n const activeHoverLabelColor = this.sanitizeCssValue(t['active-hover-label-text-color']);\n if (activeHoverLabelColor) {\n push(' .mdc-tab--active:hover .mdc-tab__text-label', [\n `color:${activeHoverLabelColor}!important;`,\n ]);\n }\n const activeFocusLabelColor = this.sanitizeCssValue(t['active-focus-label-text-color']);\n if (activeFocusLabelColor) {\n push(' .mdc-tab--active:focus .mdc-tab__text-label', [\n `color:${activeFocusLabelColor}!important;`,\n ]);\n }\n const activeFocusIndicatorColor = this.sanitizeCssValue(t['active-focus-indicator-color']);\n if (activeFocusIndicatorColor) {\n push(' .mdc-tab--active:focus .mdc-tab-indicator__content--underline', [\n `background-color:${activeFocusIndicatorColor}!important;`,\n ]);\n }\n const activeHoverIndicatorColor = this.sanitizeCssValue(t['active-hover-indicator-color']);\n if (activeHoverIndicatorColor) {\n push(' .mdc-tab--active:hover .mdc-tab-indicator__content--underline', [\n `background-color:${activeHoverIndicatorColor}!important;`,\n ]);\n }\n // Inactive label\n const inactiveLabelColor = this.sanitizeCssValue(t['inactive-label-text-color']);\n if (inactiveLabelColor) {\n push(' .mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label', [\n `color:${inactiveLabelColor}!important;`,\n ]);\n }\n const inactiveHoverLabelColor = this.sanitizeCssValue(t['inactive-hover-label-text-color']);\n if (inactiveHoverLabelColor) {\n push(' .mdc-tab:not(.mdc-tab--active):hover .mdc-tab__text-label', [\n `color:${inactiveHoverLabelColor}!important;`,\n ]);\n }\n const inactiveFocusLabelColor = this.sanitizeCssValue(t['inactive-focus-label-text-color']);\n if (inactiveFocusLabelColor) {\n push(' .mdc-tab:not(.mdc-tab--active):focus .mdc-tab__text-label', [\n `color:${inactiveFocusLabelColor}!important;`,\n ]);\n }\n // Pagination chevrons\n const paginationIconColor = this.sanitizeCssValue(t['pagination-icon-color']);\n if (paginationIconColor) {\n push(' .mat-mdc-tab-header-pagination-chevron', [\n `color:${paginationIconColor}!important;`,\n ]);\n }\n // Divider / background\n const containerDecls: string[] = [];\n const dividerColor = this.sanitizeCssValue(t['divider-color']);\n if (dividerColor) {\n containerDecls.push(`border-bottom-color:${dividerColor}!important;`);\n }\n if (containerDecls.length) {\n push(' .mat-mdc-tab-header', containerDecls);\n push(' .mat-mdc-tab-nav-bar', containerDecls);\n }\n const backgroundColor = this.sanitizeCssValue(t['background-color']);\n if (backgroundColor) {\n push(' .mat-mdc-tab-header', [`background:${backgroundColor}!important;`]);\n push(' .mat-mdc-tab-nav-bar', [`background:${backgroundColor}!important;`]);\n }\n\n return rules.length ? rules.join('\\n') : null;\n }\n\n private cloneWidgetDefinition(widget: WidgetDefinition): WidgetDefinition {\n try {\n if (typeof structuredClone === 'function') {\n return structuredClone(widget);\n }\n } catch {}\n\n return JSON.parse(JSON.stringify(widget)) as WidgetDefinition;\n }\n}\n","import { ComponentDocMeta, ComponentMetadataRegistry, PortContract } from '@praxisui/core';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\nimport { PraxisTabs } from './praxis-tabs';\n\nconst PRAXIS_TABS_PORTS: PortContract[] = [\n {\n id: 'context',\n label: 'Contexto',\n direction: 'input',\n semanticKind: 'view-context',\n schema: {\n id: 'Record<string, unknown>',\n kind: 'ts-type',\n ref: 'Record<string, unknown>',\n },\n description: 'Contexto de visualizacao entregue ao container e aos widgets internos.',\n exposure: { public: true, group: 'context' },\n },\n {\n id: 'config',\n label: 'Configuracao',\n direction: 'input',\n semanticKind: 'config-fragment',\n schema: {\n id: 'TabsMetadata',\n kind: 'ts-type',\n ref: 'TabsMetadata',\n },\n description: 'Fragmento canonico de configuracao das tabs/nav e dos widgets internos.',\n exposure: { public: true, group: 'config' },\n },\n {\n id: 'selectedIndexChange',\n label: 'Troca de indice selecionado',\n direction: 'output',\n semanticKind: 'event',\n schema: {\n id: 'number',\n kind: 'ts-type',\n ref: 'number',\n },\n cardinality: 'stream',\n description: 'Evento canonico emitido quando a selecao de aba muda.',\n exposure: { public: true, group: 'events' },\n },\n {\n id: 'widgetEvent',\n label: 'Evento interno de widget',\n direction: 'output',\n semanticKind: 'event',\n schema: {\n id: 'WidgetEventEnvelope',\n kind: 'ts-type',\n ref: 'WidgetEventEnvelope',\n },\n cardinality: 'stream',\n description:\n 'Bridge composta temporaria para eventos internos de widgets. Nao representa o contrato final de nested ports.',\n exposure: { public: true, advanced: true, group: 'composite' },\n },\n];\n\nexport const PRAXIS_TABS_COMPONENT_METADATA: ComponentDocMeta = {\n id: 'praxis-tabs',\n selector: 'praxis-tabs',\n component: PraxisTabs,\n friendlyName: 'Praxis Tabs',\n description:\n 'Abas dinâmicas baseadas em metadata, com MatTabGroup/TabNav e suporte a tokens M3 via appearance.',\n icon: 'tab',\n inputs: [\n { name: 'config', type: 'TabsMetadata', label: 'Configuração', description: 'Configuração JSON (tabs/nav, aparência e widgets internos)' },\n {\n name: 'tabsId',\n type: 'string',\n label: 'ID das Tabs',\n description: 'Identificador para persistência (obrigatório)',\n },\n {\n name: 'componentInstanceId',\n type: 'string',\n label: 'ID da instância',\n description: 'Identificador opcional para múltiplas instâncias na mesma rota',\n },\n {\n name: 'enableCustomization',\n type: 'boolean',\n default: false,\n label: 'Modo de customização',\n description: 'Habilita customização runtime via Settings Panel',\n },\n {\n name: 'form',\n type: 'FormGroup',\n label: 'FormGroup',\n description: 'FormGroup para conteúdo com campos dinâmicos',\n },\n {\n name: 'context',\n type: 'Record<string, any>',\n label: 'Contexto',\n description: 'Contexto entregue aos widgets internos',\n },\n ],\n outputs: [\n { name: 'selectedIndexChange', type: 'number', label: 'Índice selecionado' },\n { name: 'selectedTabChange', type: 'MatTabChangeEvent', label: 'Troca de aba' },\n { name: 'animationDone', type: 'void' },\n { name: 'focusChange', type: 'MatTabChangeEvent', label: 'Foco alterado' },\n { name: 'indexFocused', type: 'number', label: 'Índice focado' },\n { name: 'selectFocusedIndex', type: 'number', label: 'Selecionar foco' },\n {\n name: 'widgetEvent',\n type: 'WidgetEventEnvelope',\n label: 'Evento interno',\n description: 'Eventos reemitidos de componentes dinâmicos dentro da aba/link, enriquecidos com contexto hierárquico em `path`.',\n },\n ],\n actions: [\n {\n id: 'select-tab',\n label: 'Selecionar aba',\n icon: 'tab',\n description: 'Emite alteração do índice selecionado',\n emit: 'selectedIndexChange',\n payloadSchema: {\n type: 'number',\n example: 0,\n },\n scope: 'any',\n },\n {\n id: 'tab-change',\n label: 'Troca de aba',\n icon: 'swap_horiz',\n description: 'Emite evento de troca de aba',\n emit: 'selectedTabChange',\n payloadSchema: {\n type: 'object',\n properties: {\n index: { type: 'number', description: 'Índice selecionado' },\n tab: { type: 'object', description: 'Referência da aba' },\n },\n required: ['index'],\n example: { index: 1 },\n },\n scope: 'any',\n },\n {\n id: 'focus-change',\n label: 'Foco alterado',\n icon: 'center_focus_strong',\n description: 'Emite evento quando o foco muda',\n emit: 'focusChange',\n payloadSchema: {\n type: 'object',\n properties: {\n index: { type: 'number', description: 'Índice focado' },\n tab: { type: 'object', description: 'Referência da aba' },\n },\n required: ['index'],\n example: { index: 1 },\n },\n scope: 'any',\n },\n {\n id: 'focus-index',\n label: 'Índice focado',\n icon: 'filter_center_focus',\n description: 'Emite o índice focado',\n emit: 'indexFocused',\n payloadSchema: {\n type: 'number',\n example: 0,\n },\n scope: 'any',\n },\n {\n id: 'select-focus',\n label: 'Selecionar foco',\n icon: 'gps_fixed',\n description: 'Emite seleção do índice focado',\n emit: 'selectFocusedIndex',\n payloadSchema: {\n type: 'number',\n example: 0,\n },\n scope: 'any',\n },\n ],\n tags: ['widget', 'tabs', 'configurable', 'stable'],\n lib: '@praxisui/tabs',\n ports: PRAXIS_TABS_PORTS,\n};\n\nexport function providePraxisTabsMetadata(): Provider {\n return {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (registry: ComponentMetadataRegistry) => () => {\n registry.register(PRAXIS_TABS_COMPONENT_METADATA);\n },\n deps: [ComponentMetadataRegistry],\n } as Provider;\n}\n","/*\n * Public API Surface of praxis-tabs\n */\n\nexport * from './lib/praxis-tabs';\nexport * from './lib/praxis-tabs.i18n';\nexport * from './lib/praxis-tabs.metadata';\nexport * from './lib/praxis-tabs-config-editor';\nexport * from './lib/tabs-editor-document.model';\nexport * from './lib/tabs-editor-capability';\nexport * from './lib/ai/tabs-ai-capabilities';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4","i8","i1","i2","i3","i5","i7","i6"],"mappings":"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"}
|