@praxisui/tabs 8.0.0-beta.0 → 8.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -81,7 +81,7 @@ Outputs
81
81
  - `selectedIndexChange: number` Índice selecionado atualizado (ambos modos).
82
82
  - `selectedTabChange: MatTabChangeEvent` Evento nativo do MatTabGroup.
83
83
  - `focusChange, animationDone, indexFocused, selectFocusedIndex` Eventos nativos do Angular Material.
84
- - `widgetEvent: { tabId?, tabIndex?, linkId?, linkIndex?, sourceId, output?, payload? }` Reemissão de eventos dos widgets internos com contexto da aba/link.
84
+ - `widgetEvent: WidgetEventEnvelope` Bridge avançada/legado para transporte de eventos dos widgets internos com contexto da aba/link. Para conexões novas de widgets internos, use `composition.links` com `component-port + nestedPath`.
85
85
 
86
86
  Persistência
87
87
  - Quando `tabsId` é fornecido, a configuração é salva/recuperada em `AsyncConfigStorage` na chave `tabs:<component_id>`.
@@ -146,18 +146,48 @@ Quick Setup
146
146
  - `openQuickSetup()` abre `TabsQuickSetupComponent` para criação rápida de abas/links.
147
147
  - `applied$`/`saved$` aplicam a configuração ao componente.
148
148
 
149
+ ## Agentic Authoring
150
+
151
+ `@praxisui/tabs` publica `PRAXIS_TABS_AUTHORING_MANIFEST` para orientar edições assistidas por IA sobre `TabsMetadata`.
152
+
153
+ - **Editable targets:** `tab`, `tabLabel`, `tabIcon`, `tabContent`, `activeTab`, `visibility`, `disabledState` e `layout`.
154
+ - **Operation families:** `tab.add`, `tab.remove`, `tab.label.set`, `tab.icon.set`, `tab.order.set`, `tab.disabled.set`, `tab.visible.set`, `tab.active.set`, `layout.variant.set` e `tab.content.set`.
155
+ - **Validation:** ids de abas/links devem ser estáveis e únicos, remoção destrutiva exige confirmação, `group` e `nav` não devem virar modos primários concorrentes, e o round-trip precisa preservar ordem, ids e selected index.
156
+ - **Registry projection:** o manifesto é exportado no `public-api` e projetado em `components['praxis-tabs'].authoringManifest` pelo AI Registry.
157
+
149
158
  ## Eventos e Conexões
150
159
 
151
- `widgetEvent` reemite eventos de widgets internos com contexto da origem, permitindo conexões no Builder/Graph:
160
+ Para conexoes canonicas de widgets internos, use `composition.links` com endpoint `component-port + nestedPath`.
161
+
162
+ Exemplo de output de uma lista dentro da primeira tab:
163
+
164
+ ```json
165
+ {
166
+ "kind": "component-port",
167
+ "ref": {
168
+ "widget": "tabs-widget",
169
+ "nestedPath": [
170
+ { "kind": "tab", "id": "employees-list", "index": 0 },
171
+ { "kind": "widget", "key": "employees-list", "componentType": "praxis-list" }
172
+ ],
173
+ "port": "itemClick",
174
+ "direction": "output"
175
+ }
176
+ }
177
+ ```
178
+
179
+ Regras:
180
+
181
+ - `ref.widget` e a instancia top-level de `praxis-tabs`;
182
+ - `nestedPath` e relativo a essa instancia e deve terminar em `kind: "widget"` com `key` estavel;
183
+ - `ref.port` e a porta real do widget filho;
184
+ - inputs para filhos nested devem atualizar a configuracao declarativa do filho, nao depender de dot-path publico sobre `config`.
185
+
186
+ `widgetEvent` continua existindo como bridge avancada/legado para transporte de eventos internos com contexto da origem:
152
187
 
153
188
  - Forma do evento: `{ tabId?, tabIndex?, linkId?, linkIndex?, sourceId, output?, payload }`.
154
- - De um componente interno para fora:
155
- - From: `{ widget: '<key do tabs>', output: 'widgetEvent' }`
156
- - Map (exemplo tabela interna): `payload.payload.id`
157
- - To: `<widget externo>.<input>`
158
- - De fora para um componente interno (dot-path):
159
- - Grupo: `inputs.config.tabs[<idx>].widgets[<widx>].inputs.<input>`
160
- - Nav: `inputs.config.nav.links[<idx>].widgets[<widx>].inputs.<input>`
189
+ - Nao use `widgetEvent` como caminho principal para authoring novo de nested ports.
190
+ - Nao use dot-path de `config.tabs[].widgets[]` como contrato publico para novos links nested.
161
191
 
162
192
  ## Lazy Load
163
193
 
@@ -167,7 +197,7 @@ Quick Setup
167
197
  ## Exemplo Mínimo
168
198
 
169
199
  ```html
170
- <praxis-tabs [config]="tabsCfg" [tabsId]="'cliente-tabs'" [enableCustomization]="true" (widgetEvent)="onWidgetEvent($event)"></praxis-tabs>
200
+ <praxis-tabs [config]="tabsCfg" [tabsId]="'cliente-tabs'" [enableCustomization]="true"></praxis-tabs>
171
201
  ```
172
202
 
173
203
  ```ts
@@ -3675,6 +3675,242 @@ function providePraxisTabsMetadata() {
3675
3675
  };
3676
3676
  }
3677
3677
 
3678
+ const tabItemSchema = {
3679
+ type: 'object',
3680
+ required: ['id', 'textLabel'],
3681
+ properties: {
3682
+ id: { type: 'string' },
3683
+ textLabel: { type: 'string' },
3684
+ icon: { type: 'string' },
3685
+ disabled: { type: 'boolean' },
3686
+ visible: { type: 'boolean', default: true },
3687
+ content: { type: 'array', items: { type: 'object' } },
3688
+ widgets: { type: 'array', items: { type: 'object' } },
3689
+ },
3690
+ };
3691
+ const tabPatchSchema = {
3692
+ type: 'object',
3693
+ minProperties: 1,
3694
+ properties: {
3695
+ id: { type: 'string' },
3696
+ textLabel: { type: 'string' },
3697
+ icon: { type: 'string' },
3698
+ disabled: { type: 'boolean' },
3699
+ visible: { type: 'boolean' },
3700
+ content: { type: 'array', items: { type: 'object' } },
3701
+ widgets: { type: 'array', items: { type: 'object' } },
3702
+ },
3703
+ };
3704
+ const PRAXIS_TABS_AUTHORING_MANIFEST = {
3705
+ schemaVersion: '1.0.0',
3706
+ componentId: 'praxis-tabs',
3707
+ ownerPackage: '@praxisui/tabs',
3708
+ configSchemaId: 'TabsMetadata',
3709
+ manifestVersion: '1.0.0',
3710
+ runtimeInputs: [
3711
+ { name: 'config', type: 'TabsMetadata', description: 'Canonical tabs/nav configuration.' },
3712
+ { name: 'tabsId', type: 'string', description: 'Stable id used to derive persistence scope.' },
3713
+ { name: 'componentInstanceId', type: 'string', description: 'Optional instance discriminator for persistence scope.' },
3714
+ { name: 'form', type: 'FormGroup', description: 'FormGroup consumed by dynamic field content.' },
3715
+ { name: 'context', type: 'Record<string, any>', description: 'Context passed to nested widgets.' },
3716
+ { name: 'enableCustomization', type: 'boolean', description: 'Enables Settings Panel authoring surfaces.' },
3717
+ ],
3718
+ editableTargets: [
3719
+ { kind: 'tab', resolver: 'tab-by-id-or-label', description: 'A group-mode tab in config.tabs[].' },
3720
+ { kind: 'tabLabel', resolver: 'tab-by-id-or-label', description: 'The text label of a group-mode tab.' },
3721
+ { kind: 'tabIcon', resolver: 'tab-by-id-or-label', description: 'Icon metadata for a tab label when supported by the authoring document.' },
3722
+ { kind: 'tabContent', resolver: 'tab-content-by-id', description: 'Dynamic fields or widgets hosted by a tab or nav link.' },
3723
+ { kind: 'activeTab', resolver: 'tab-index-or-id', description: 'Selected tab or nav link index.' },
3724
+ { kind: 'visibility', resolver: 'tab-by-id-or-label', description: 'Authoring visibility flag used by tools before runtime projection.' },
3725
+ { kind: 'disabledState', resolver: 'tab-by-id-or-label', description: 'Disabled state of a tab or nav link.' },
3726
+ { kind: 'layout', resolver: 'tabs-layout-config', description: 'Group/nav mode, header position, density, stretch and behavior settings.' },
3727
+ ],
3728
+ operations: [
3729
+ {
3730
+ operationId: 'tab.add',
3731
+ title: 'Add tab',
3732
+ scope: 'global',
3733
+ targetKind: 'tab',
3734
+ target: { kind: 'tab', resolver: 'tabs-array', ambiguityPolicy: 'fail', required: false },
3735
+ inputSchema: tabItemSchema,
3736
+ effects: [{ kind: 'append-unique', path: 'tabs[]', key: 'id' }],
3737
+ validators: ['tab-id-unique', 'tabs-mode-compatible', 'tab-content-valid'],
3738
+ affectedPaths: ['tabs[]', 'group.selectedIndex'],
3739
+ submissionImpact: false,
3740
+ preconditions: ['config-initialized'],
3741
+ },
3742
+ {
3743
+ operationId: 'tab.remove',
3744
+ title: 'Remove tab',
3745
+ scope: 'layout',
3746
+ targetKind: 'tab',
3747
+ target: { kind: 'tab', resolver: 'tab-by-id-or-label', ambiguityPolicy: 'fail', required: true },
3748
+ inputSchema: {
3749
+ type: 'object',
3750
+ properties: {
3751
+ replacementActiveTabId: { type: 'string' },
3752
+ },
3753
+ },
3754
+ effects: [{ kind: 'remove-by-key', path: 'tabs[]', key: 'id' }],
3755
+ destructive: true,
3756
+ requiresConfirmation: true,
3757
+ validators: ['tab-exists', 'active-tab-removal-safe', 'tab-content-removal-confirmed'],
3758
+ affectedPaths: ['tabs[]', 'group.selectedIndex'],
3759
+ submissionImpact: false,
3760
+ preconditions: ['config-initialized', 'target-tab-exists', 'confirmation-collected'],
3761
+ },
3762
+ {
3763
+ operationId: 'tab.label.set',
3764
+ title: 'Set tab label',
3765
+ scope: 'layout',
3766
+ targetKind: 'tabLabel',
3767
+ target: { kind: 'tabLabel', resolver: 'tab-by-id-or-label', ambiguityPolicy: 'fail', required: true },
3768
+ inputSchema: { type: 'object', required: ['textLabel'], properties: { textLabel: { type: 'string' } } },
3769
+ effects: [{ kind: 'merge-by-key', path: 'tabs[]', key: 'id' }],
3770
+ validators: ['tab-exists', 'tab-label-valid'],
3771
+ affectedPaths: ['tabs[].textLabel'],
3772
+ submissionImpact: false,
3773
+ preconditions: ['config-initialized', 'target-tab-exists'],
3774
+ },
3775
+ {
3776
+ operationId: 'tab.icon.set',
3777
+ title: 'Set tab icon',
3778
+ scope: 'layout',
3779
+ targetKind: 'tabIcon',
3780
+ target: { kind: 'tabIcon', resolver: 'tab-by-id-or-label', ambiguityPolicy: 'fail', required: true },
3781
+ inputSchema: { type: 'object', required: ['icon'], properties: { icon: { type: 'string' } } },
3782
+ effects: [{ kind: 'merge-by-key', path: 'tabs[]', key: 'id' }],
3783
+ validators: ['tab-exists', 'tab-icon-valid'],
3784
+ affectedPaths: ['tabs[].icon'],
3785
+ submissionImpact: false,
3786
+ preconditions: ['config-initialized', 'target-tab-exists'],
3787
+ },
3788
+ {
3789
+ operationId: 'tab.order.set',
3790
+ title: 'Reorder tabs',
3791
+ scope: 'layout',
3792
+ targetKind: 'tab',
3793
+ target: { kind: 'tab', resolver: 'tab-by-id-or-label', ambiguityPolicy: 'fail', required: true },
3794
+ inputSchema: { type: 'object', required: ['beforeTabId'], properties: { beforeTabId: { type: 'string' } } },
3795
+ effects: [{ kind: 'reorder-by-key', path: 'tabs[]', key: 'id' }],
3796
+ validators: ['tab-exists', 'tab-order-deterministic'],
3797
+ affectedPaths: ['tabs[]', 'group.selectedIndex'],
3798
+ submissionImpact: false,
3799
+ preconditions: ['config-initialized', 'target-tab-exists'],
3800
+ },
3801
+ {
3802
+ operationId: 'tab.disabled.set',
3803
+ title: 'Set tab disabled state',
3804
+ scope: 'interaction',
3805
+ targetKind: 'disabledState',
3806
+ target: { kind: 'disabledState', resolver: 'tab-or-link-by-id', ambiguityPolicy: 'fail', required: true },
3807
+ inputSchema: { type: 'object', required: ['disabled'], properties: { disabled: { type: 'boolean' } } },
3808
+ effects: [{ kind: 'merge-by-key', path: 'tabs[]', key: 'id' }],
3809
+ validators: ['tab-or-link-exists', 'active-tab-disabled-safe'],
3810
+ affectedPaths: ['tabs[].disabled', 'nav.links[].disabled'],
3811
+ submissionImpact: false,
3812
+ preconditions: ['config-initialized', 'target-tab-or-link-exists'],
3813
+ },
3814
+ {
3815
+ operationId: 'tab.visible.set',
3816
+ title: 'Set tab visibility',
3817
+ scope: 'interaction',
3818
+ targetKind: 'visibility',
3819
+ target: { kind: 'visibility', resolver: 'tab-or-link-by-id', ambiguityPolicy: 'fail', required: true },
3820
+ inputSchema: { type: 'object', required: ['visible'], properties: { visible: { type: 'boolean' } } },
3821
+ effects: [{ kind: 'merge-by-key', path: 'tabs[]', key: 'id' }],
3822
+ validators: ['tab-or-link-exists', 'active-tab-visibility-safe'],
3823
+ affectedPaths: ['tabs[].visible', 'nav.links[].visible'],
3824
+ submissionImpact: false,
3825
+ preconditions: ['config-initialized', 'target-tab-or-link-exists'],
3826
+ },
3827
+ {
3828
+ operationId: 'tab.active.set',
3829
+ title: 'Set active tab',
3830
+ scope: 'interaction',
3831
+ targetKind: 'activeTab',
3832
+ target: { kind: 'activeTab', resolver: 'tab-index-or-id', ambiguityPolicy: 'fail', required: true },
3833
+ inputSchema: { type: 'object', required: ['selectedIndex'], properties: { selectedIndex: { type: 'number' }, tabId: { type: 'string' } } },
3834
+ effects: [{ kind: 'set-value', path: 'group.selectedIndex' }],
3835
+ validators: ['active-tab-exists', 'selected-index-in-range'],
3836
+ affectedPaths: ['group.selectedIndex', 'nav.selectedIndex'],
3837
+ submissionImpact: false,
3838
+ preconditions: ['config-initialized', 'target-tab-or-link-exists'],
3839
+ },
3840
+ {
3841
+ operationId: 'layout.variant.set',
3842
+ title: 'Set tabs layout variant',
3843
+ scope: 'layout',
3844
+ targetKind: 'layout',
3845
+ target: { kind: 'layout', resolver: 'tabs-layout-config', ambiguityPolicy: 'fail', required: true },
3846
+ inputSchema: {
3847
+ type: 'object',
3848
+ required: ['mode'],
3849
+ properties: {
3850
+ mode: { enum: ['group', 'nav'] },
3851
+ density: { enum: ['compact', 'comfortable', 'spacious'] },
3852
+ headerPosition: { enum: ['above', 'below'] },
3853
+ alignTabs: { enum: ['start', 'center', 'end'] },
3854
+ stretchTabs: { type: 'boolean' },
3855
+ lazyLoad: { type: 'boolean' },
3856
+ },
3857
+ },
3858
+ effects: [{ kind: 'merge-object', path: 'appearance' }, { kind: 'merge-object', path: 'group' }, { kind: 'merge-object', path: 'nav' }, { kind: 'merge-object', path: 'behavior' }],
3859
+ validators: ['tabs-mode-compatible', 'layout-values-valid', 'editor-runtime-round-trip'],
3860
+ affectedPaths: ['appearance.density', 'group.headerPosition', 'group.alignTabs', 'group.stretchTabs', 'nav.stretchTabs', 'behavior.lazyLoad'],
3861
+ submissionImpact: false,
3862
+ preconditions: ['config-initialized'],
3863
+ },
3864
+ {
3865
+ operationId: 'tab.content.set',
3866
+ title: 'Set tab content',
3867
+ scope: 'layout',
3868
+ targetKind: 'tabContent',
3869
+ target: { kind: 'tabContent', resolver: 'tab-or-link-by-id', ambiguityPolicy: 'fail', required: true },
3870
+ inputSchema: tabPatchSchema,
3871
+ effects: [{ kind: 'merge-by-key', path: 'tabs[]', key: 'id' }],
3872
+ validators: ['tab-or-link-exists', 'tab-content-valid', 'widget-event-delegated'],
3873
+ affectedPaths: ['tabs[].content', 'tabs[].widgets', 'nav.links[].content', 'nav.links[].widgets'],
3874
+ submissionImpact: false,
3875
+ preconditions: ['config-initialized', 'target-tab-or-link-exists'],
3876
+ },
3877
+ ],
3878
+ validators: [
3879
+ { validatorId: 'tab-id-unique', level: 'error', code: 'PTABS001', description: 'Tab ids and nav link ids must be unique within their mode.' },
3880
+ { validatorId: 'tab-exists', level: 'error', code: 'PTABS002', description: 'Target tab must exist before applying the operation.' },
3881
+ { validatorId: 'tab-or-link-exists', level: 'error', code: 'PTABS003', description: 'Target must resolve to an existing group tab or nav link.' },
3882
+ { validatorId: 'active-tab-exists', level: 'error', code: 'PTABS004', description: 'Active tab or nav link selection must reference an existing item.' },
3883
+ { validatorId: 'selected-index-in-range', level: 'error', code: 'PTABS005', description: 'Selected index must be clamped to the target mode item count.' },
3884
+ { validatorId: 'active-tab-removal-safe', level: 'error', code: 'PTABS006', description: 'Removing the active/default tab requires confirmation or a replacement active tab.' },
3885
+ { validatorId: 'tab-content-removal-confirmed', level: 'error', code: 'PTABS007', description: 'Removing a tab or link with content/widgets is destructive and requires confirmation.' },
3886
+ { validatorId: 'tab-label-valid', level: 'error', code: 'PTABS008', description: 'Tab labels must be non-empty text values after localization/domain projection.' },
3887
+ { validatorId: 'tab-icon-valid', level: 'warning', code: 'PTABS009', description: 'Tab icon metadata must remain compatible with the icon directive and editor round-trip.' },
3888
+ { validatorId: 'tab-order-deterministic', level: 'error', code: 'PTABS010', description: 'Tab ordering must use stable ids, not transient array index as identity.' },
3889
+ { validatorId: 'tabs-mode-compatible', level: 'error', code: 'PTABS011', description: 'Authoring must resolve to one primary mode: group tabs or nav links.' },
3890
+ { validatorId: 'layout-values-valid', level: 'error', code: 'PTABS012', description: 'Layout values must match TabsMetadata enums and runtime bindings.' },
3891
+ { validatorId: 'editor-runtime-round-trip', level: 'error', code: 'PTABS013', description: 'Settings Panel, quick setup, JSON editor and runtime must preserve ids, order and selected index.' },
3892
+ { validatorId: 'active-tab-disabled-safe', level: 'warning', code: 'PTABS014', description: 'Disabling the active item should move selection or request explicit confirmation.' },
3893
+ { validatorId: 'active-tab-visibility-safe', level: 'warning', code: 'PTABS015', description: 'Hiding the active item should move selection or request explicit confirmation.' },
3894
+ { validatorId: 'tab-content-valid', level: 'error', code: 'PTABS016', description: 'Tab content must be valid DynamicFieldMetadata[] or WidgetDefinition[] and preserve nested widget identity.' },
3895
+ { validatorId: 'widget-event-delegated', level: 'info', code: 'PTABS017', description: 'Nested widget event paths remain delegated to the tabs runtime contract and are not redefined by authoring.' },
3896
+ ],
3897
+ roundTripRequirements: [
3898
+ 'Operations must preserve stable tab/link ids; array index may be used only as a resolver fallback, never as canonical identity.',
3899
+ 'Settings Panel, quick setup and JSON editor must round-trip through TabsAuthoringDocument without losing config or bindings.',
3900
+ 'Group and nav modes must remain mutually explicit; authoring cannot silently mix config.tabs and nav.links as competing primary modes.',
3901
+ 'Nested widget events remain delegated through widgetEvent path enrichment and component-port nestedPath semantics.',
3902
+ ],
3903
+ examples: [
3904
+ { id: 'add-overview-tab', request: 'Add an Overview tab before the details tab.', operationId: 'tab.add', params: { id: 'overview', textLabel: 'Overview' }, isPositive: true },
3905
+ { id: 'rename-tab', request: 'Rename the details tab to Account Details.', operationId: 'tab.label.set', target: 'details', params: { textLabel: 'Account Details' }, isPositive: true },
3906
+ { id: 'reorder-tabs', request: 'Move billing before overview.', operationId: 'tab.order.set', target: 'billing', params: { beforeTabId: 'overview' }, isPositive: true },
3907
+ { id: 'disable-tab', request: 'Disable the audit tab until the user has permission.', operationId: 'tab.disabled.set', target: 'audit', params: { disabled: true }, isPositive: true },
3908
+ { id: 'activate-tab', request: 'Open the documents tab by default.', operationId: 'tab.active.set', target: 'documents', params: { tabId: 'documents', selectedIndex: 2 }, isPositive: true },
3909
+ { id: 'reject-duplicate-tab-id', request: 'Add another tab with id overview.', operationId: 'tab.add', params: { id: 'overview', textLabel: 'Duplicate Overview' }, isPositive: false },
3910
+ { id: 'confirm-remove-content-tab', request: 'Remove the details tab that contains widgets.', operationId: 'tab.remove', target: 'details', params: { replacementActiveTabId: 'overview' }, isPositive: true },
3911
+ ],
3912
+ };
3913
+
3678
3914
  /*
3679
3915
  * Public API Surface of praxis-tabs
3680
3916
  */
@@ -3683,4 +3919,4 @@ function providePraxisTabsMetadata() {
3683
3919
  * Generated bundle index. Do not edit.
3684
3920
  */
3685
3921
 
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 };
3922
+ export { PRAXIS_TABS_AUTHORING_MANIFEST, 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 };
package/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { OnInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges, Provider } from '@angular/core';
3
3
  import { MatTabChangeEvent } from '@angular/material/tabs';
4
- import { AiCapability, WidgetDefinition, WidgetEventEnvelope, WidgetEventPathSegment, PraxisI18nConfig, ComponentDocMeta, ComponentMetadataRegistry, AiCapabilityCategory, AiValueKind, AiCapabilityCatalog } from '@praxisui/core';
4
+ import { AiCapability, WidgetDefinition, WidgetEventEnvelope, WidgetEventPathSegment, PraxisI18nConfig, ComponentDocMeta, ComponentMetadataRegistry, AiCapabilityCategory, AiValueKind, AiCapabilityCatalog, ComponentAuthoringManifest } from '@praxisui/core';
5
5
  import { FormGroup } from '@angular/forms';
6
6
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
7
7
  import { BaseAiAdapter, PatchResult } from '@praxisui/ai';
@@ -412,5 +412,7 @@ interface CapabilityCatalog extends AiCapabilityCatalog {
412
412
  }
413
413
  declare const TABS_AI_CAPABILITIES: CapabilityCatalog;
414
414
 
415
- 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 };
415
+ declare const PRAXIS_TABS_AUTHORING_MANIFEST: ComponentAuthoringManifest;
416
+
417
+ export { PRAXIS_TABS_AUTHORING_MANIFEST, 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 };
416
418
  export type { Capability, CapabilityCatalog, CapabilityCategory, TabGroupMetadata, TabLinkMetadata, TabMetadata, TabNavMetadata, TabsAccessibilityConfig, TabsAppearanceConfig, TabsApplyPlan, TabsAuthoringBindings, TabsAuthoringDocument, TabsBehaviorConfig, TabsBindingsDiff, TabsEditorDiagnostic, TabsEditorDiagnosticLevel, TabsEditorDocumentKind, TabsEventConfig, TabsMetadata, TabsRuntimeContext, TabsRuntimePlan, TabsStyleTokens, ValueKind };
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@praxisui/tabs",
3
- "version": "8.0.0-beta.0",
3
+ "version": "8.0.0-beta.11",
4
4
  "description": "Configurable tabs (group and nav) for Praxis UI with metadata-driven content and runtime editor.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^20.0.0",
7
7
  "@angular/core": "^20.0.0",
8
8
  "@angular/material": "^20.0.0",
9
9
  "@angular/cdk": "^20.0.0",
10
- "@praxisui/core": "^8.0.0-beta.0",
11
- "@praxisui/dynamic-fields": "^8.0.0-beta.0",
12
- "@praxisui/settings-panel": "^8.0.0-beta.0"
10
+ "@praxisui/core": "^8.0.0-beta.11",
11
+ "@praxisui/dynamic-fields": "^8.0.0-beta.11",
12
+ "@praxisui/settings-panel": "^8.0.0-beta.11"
13
13
  },
14
14
  "dependencies": {
15
15
  "tslib": "^2.3.0",