@praxisui/tabs 9.0.0-beta.2 → 9.0.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -43
- package/ai/component-registry.json +2061 -0
- package/fesm2022/praxisui-tabs.mjs +32 -7
- package/package.json +11 -14
- package/src/lib/praxis-tabs-config-editor.json-api.md +6 -2
- package/types/praxisui-tabs.d.ts +6 -0
|
@@ -364,6 +364,7 @@ const PRAXIS_TABS_PT_BR = {
|
|
|
364
364
|
'editor.toggles.disablePagination': 'Sem paginação',
|
|
365
365
|
'editor.toggles.disableRipple': 'Sem ripple',
|
|
366
366
|
'editor.toggles.preserveContent': 'Preservar conteúdo',
|
|
367
|
+
'editor.toggles.renderBody': 'Renderizar conteúdo interno',
|
|
367
368
|
'editor.toggles.stretchTabs': 'Esticar abas',
|
|
368
369
|
'editor.toggles.highContrast': 'Alto contraste',
|
|
369
370
|
'editor.toggles.reduceMotion': 'Reduzir movimento',
|
|
@@ -509,6 +510,7 @@ const PRAXIS_TABS_EN_US = {
|
|
|
509
510
|
'editor.toggles.disablePagination': 'Disable pagination',
|
|
510
511
|
'editor.toggles.disableRipple': 'Disable ripple',
|
|
511
512
|
'editor.toggles.preserveContent': 'Preserve content',
|
|
513
|
+
'editor.toggles.renderBody': 'Render internal content',
|
|
512
514
|
'editor.toggles.stretchTabs': 'Stretch tabs',
|
|
513
515
|
'editor.toggles.highContrast': 'High contrast',
|
|
514
516
|
'editor.toggles.reduceMotion': 'Reduce motion',
|
|
@@ -1116,6 +1118,7 @@ class PraxisTabsConfigEditor {
|
|
|
1116
1118
|
<mat-slide-toggle [(ngModel)]="group.disablePagination" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disablePagination', 'Sem paginacao') }}</mat-slide-toggle>
|
|
1117
1119
|
<mat-slide-toggle [(ngModel)]="group.disableRipple" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disableRipple', 'Sem ripple') }}</mat-slide-toggle>
|
|
1118
1120
|
<mat-slide-toggle [(ngModel)]="group.preserveContent" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.preserveContent', 'Preservar conteudo') }}</mat-slide-toggle>
|
|
1121
|
+
<mat-slide-toggle [ngModel]="group.renderBody !== false" (ngModelChange)="group.renderBody = $event ? undefined : false; onAppearanceChange()">{{ t('editor.toggles.renderBody', 'Renderizar conteudo interno') }}</mat-slide-toggle>
|
|
1119
1122
|
<mat-slide-toggle [(ngModel)]="group.stretchTabs" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>
|
|
1120
1123
|
</div>
|
|
1121
1124
|
</div>
|
|
@@ -1197,6 +1200,7 @@ class PraxisTabsConfigEditor {
|
|
|
1197
1200
|
<mat-slide-toggle [(ngModel)]="nav.fitInkBarToContent" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.fitInkBarToContent', 'Indicador ajustado ao conteudo') }}</mat-slide-toggle>
|
|
1198
1201
|
<mat-slide-toggle [(ngModel)]="nav.disablePagination" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disablePagination', 'Sem paginacao') }}</mat-slide-toggle>
|
|
1199
1202
|
<mat-slide-toggle [(ngModel)]="nav.disableRipple" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disableRipple', 'Sem ripple') }}</mat-slide-toggle>
|
|
1203
|
+
<mat-slide-toggle [ngModel]="nav.renderBody !== false" (ngModelChange)="nav.renderBody = $event ? undefined : false; onAppearanceChange()">{{ t('editor.toggles.renderBody', 'Renderizar conteudo interno') }}</mat-slide-toggle>
|
|
1200
1204
|
<mat-slide-toggle [(ngModel)]="nav.stretchTabs" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>
|
|
1201
1205
|
</div>
|
|
1202
1206
|
</div>
|
|
@@ -1656,6 +1660,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1656
1660
|
<mat-slide-toggle [(ngModel)]="group.disablePagination" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disablePagination', 'Sem paginacao') }}</mat-slide-toggle>
|
|
1657
1661
|
<mat-slide-toggle [(ngModel)]="group.disableRipple" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disableRipple', 'Sem ripple') }}</mat-slide-toggle>
|
|
1658
1662
|
<mat-slide-toggle [(ngModel)]="group.preserveContent" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.preserveContent', 'Preservar conteudo') }}</mat-slide-toggle>
|
|
1663
|
+
<mat-slide-toggle [ngModel]="group.renderBody !== false" (ngModelChange)="group.renderBody = $event ? undefined : false; onAppearanceChange()">{{ t('editor.toggles.renderBody', 'Renderizar conteudo interno') }}</mat-slide-toggle>
|
|
1659
1664
|
<mat-slide-toggle [(ngModel)]="group.stretchTabs" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>
|
|
1660
1665
|
</div>
|
|
1661
1666
|
</div>
|
|
@@ -1737,6 +1742,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1737
1742
|
<mat-slide-toggle [(ngModel)]="nav.fitInkBarToContent" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.fitInkBarToContent', 'Indicador ajustado ao conteudo') }}</mat-slide-toggle>
|
|
1738
1743
|
<mat-slide-toggle [(ngModel)]="nav.disablePagination" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disablePagination', 'Sem paginacao') }}</mat-slide-toggle>
|
|
1739
1744
|
<mat-slide-toggle [(ngModel)]="nav.disableRipple" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.disableRipple', 'Sem ripple') }}</mat-slide-toggle>
|
|
1745
|
+
<mat-slide-toggle [ngModel]="nav.renderBody !== false" (ngModelChange)="nav.renderBody = $event ? undefined : false; onAppearanceChange()">{{ t('editor.toggles.renderBody', 'Renderizar conteudo interno') }}</mat-slide-toggle>
|
|
1740
1746
|
<mat-slide-toggle [(ngModel)]="nav.stretchTabs" (ngModelChange)="onAppearanceChange()">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>
|
|
1741
1747
|
</div>
|
|
1742
1748
|
</div>
|
|
@@ -3964,6 +3970,12 @@ class PraxisTabs {
|
|
|
3964
3970
|
groupContentReady(index) {
|
|
3965
3971
|
return !this.isLazy() || this.groupLoaded.has(index) || this.selectedIndexSignal() === index;
|
|
3966
3972
|
}
|
|
3973
|
+
shouldRenderGroupBody() {
|
|
3974
|
+
return this.config?.group?.renderBody !== false;
|
|
3975
|
+
}
|
|
3976
|
+
shouldRenderNavBody() {
|
|
3977
|
+
return this.config?.nav?.renderBody !== false;
|
|
3978
|
+
}
|
|
3967
3979
|
navContentReady(index) {
|
|
3968
3980
|
return !this.isLazy() || this.navLoaded.has(index) || this.currentNavIndex() === index;
|
|
3969
3981
|
}
|
|
@@ -4360,8 +4372,11 @@ class PraxisTabs {
|
|
|
4360
4372
|
</a>
|
|
4361
4373
|
}
|
|
4362
4374
|
</nav>
|
|
4363
|
-
<mat-tab-nav-panel
|
|
4364
|
-
|
|
4375
|
+
<mat-tab-nav-panel
|
|
4376
|
+
#tabPanel
|
|
4377
|
+
[class.praxis-tabs-nav-panel--header-only]="!shouldRenderNavBody()"
|
|
4378
|
+
>
|
|
4379
|
+
@if (shouldRenderNavBody() && currentNavIndex() >= 0) {
|
|
4365
4380
|
<div class="praxis-tabnav-content">
|
|
4366
4381
|
@if (config?.nav?.links?.[currentNavIndex()]; as l) {
|
|
4367
4382
|
@if ((l.content?.length || safeWidgetDefinitions(l.widgets).length) && navContentReady(currentNavIndex())) {
|
|
@@ -4396,6 +4411,7 @@ class PraxisTabs {
|
|
|
4396
4411
|
</mat-tab-nav-panel>
|
|
4397
4412
|
} @else {
|
|
4398
4413
|
<mat-tab-group
|
|
4414
|
+
[class.praxis-tabs-group--header-only]="!shouldRenderGroupBody()"
|
|
4399
4415
|
[dynamicHeight]="config?.group?.dynamicHeight"
|
|
4400
4416
|
[disableRipple]="config?.group?.disableRipple"
|
|
4401
4417
|
[disablePagination]="config?.group?.disablePagination"
|
|
@@ -4467,6 +4483,7 @@ class PraxisTabs {
|
|
|
4467
4483
|
</button>
|
|
4468
4484
|
}
|
|
4469
4485
|
</ng-template>
|
|
4486
|
+
@if (shouldRenderGroupBody()) {
|
|
4470
4487
|
@if ((entry.tab.content?.length || safeWidgetDefinitions(entry.tab.widgets).length) && groupContentReady(entry.index)) {
|
|
4471
4488
|
@if (entry.tab.content) {
|
|
4472
4489
|
<ng-container
|
|
@@ -4493,6 +4510,7 @@ class PraxisTabs {
|
|
|
4493
4510
|
[primaryAction]="{ label: t('emptyState.openEditor', 'Abrir editor'), icon: 'tune', action: openEditor.bind(this) }"
|
|
4494
4511
|
></praxis-empty-state-card>
|
|
4495
4512
|
}
|
|
4513
|
+
}
|
|
4496
4514
|
</mat-tab>
|
|
4497
4515
|
}
|
|
4498
4516
|
</mat-tab-group>
|
|
@@ -4524,7 +4542,7 @@ class PraxisTabs {
|
|
|
4524
4542
|
</button>
|
|
4525
4543
|
}
|
|
4526
4544
|
</div>
|
|
4527
|
-
`, isInline: true, styles: [".praxis-tabs-root{position:relative;display:block}.praxis-tabs-group.align-start .mat-mdc-tab-header{justify-content:flex-start}.praxis-tabs-group.align-center .mat-mdc-tab-header{justify-content:center}.praxis-tabs-group.align-end .mat-mdc-tab-header{justify-content:flex-end}.density-compact .mat-mdc-tab-body-content{padding:8px}.density-comfortable .mat-mdc-tab-body-content{padding:16px}.density-spacious .mat-mdc-tab-body-content{padding:24px}.tabs-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.tabs-ai-assistant-trigger{box-shadow:var(--md-sys-elevation-level2)}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.edit-fab-secondary{right:56px}.tab-empty{padding:16px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.high-contrast{filter:contrast(1.2)}.reduce-motion{--mat-animation-duration: 0ms}.drag-handle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px;cursor:grab}.tab-label-icon{font-size:18px;width:18px;height:18px;margin-right:6px;vertical-align:middle}:host-context(.pdx-gridster-item) .praxis-tabs-root{display:flex;flex-direction:column;height:100%;min-height:0}:host-context(.pdx-gridster-item) .praxis-tabs-group,:host-context(.pdx-gridster-item) .mat-mdc-tab-group{flex:1 1 auto;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{height:100%;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{overflow:auto}:host-context(.pdx-gridster-item) .praxis-tabnav-content{flex:1 1 auto;min-height:0;overflow:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2_1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2_1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "directive", type: i3.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i3.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i3.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i3.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone"] }, { kind: "directive", type: DynamicFieldLoaderDirective, selector: "[dynamicFieldLoader]", inputs: ["fields", "formGroup", "enableExternalControlBinding", "itemTemplate", "debugTrace", "debugTraceLabel", "readonlyMode", "disabledMode", "presentationMode", "visible", "canvasMode"], outputs: ["componentsCreated", "fieldCreated", "fieldDestroyed", "renderError", "canvasMouseEnter", "canvasMouseLeave", "canvasClick", "canvasFocus"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4545
|
+
`, isInline: true, styles: [".praxis-tabs-root{position:relative;display:block}.praxis-tabs-group.align-start .mat-mdc-tab-header{justify-content:flex-start}.praxis-tabs-group.align-center .mat-mdc-tab-header{justify-content:center}.praxis-tabs-group.align-end .mat-mdc-tab-header{justify-content:flex-end}.praxis-tabs-group--header-only .mat-mdc-tab-body-wrapper,.praxis-tabs-nav-panel--header-only{display:none}.density-compact .mat-mdc-tab-body-content{padding:8px}.density-comfortable .mat-mdc-tab-body-content{padding:16px}.density-spacious .mat-mdc-tab-body-content{padding:24px}.tabs-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.tabs-ai-assistant-trigger{box-shadow:var(--md-sys-elevation-level2)}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.edit-fab-secondary{right:56px}.tab-empty{padding:16px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.high-contrast{filter:contrast(1.2)}.reduce-motion{--mat-animation-duration: 0ms}.drag-handle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px;cursor:grab}.tab-label-icon{font-size:18px;width:18px;height:18px;margin-right:6px;vertical-align:middle}:host-context(.pdx-gridster-item) .praxis-tabs-root{display:flex;flex-direction:column;height:100%;min-height:0}:host-context(.pdx-gridster-item) .praxis-tabs-group,:host-context(.pdx-gridster-item) .mat-mdc-tab-group{flex:1 1 auto;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{height:100%;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{overflow:auto}:host-context(.pdx-gridster-item) .praxis-tabnav-content{flex:1 1 auto;min-height:0;overflow:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2_1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2_1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "directive", type: i3.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i3.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i3.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i3.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone"] }, { kind: "directive", type: DynamicFieldLoaderDirective, selector: "[dynamicFieldLoader]", inputs: ["fields", "formGroup", "enableExternalControlBinding", "itemTemplate", "debugTrace", "debugTraceLabel", "readonlyMode", "disabledMode", "presentationMode", "visible", "canvasMode"], outputs: ["componentsCreated", "fieldCreated", "fieldDestroyed", "renderError", "canvasMouseEnter", "canvasMouseLeave", "canvasClick", "canvasFocus"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4528
4546
|
}
|
|
4529
4547
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTabs, decorators: [{
|
|
4530
4548
|
type: Component,
|
|
@@ -4669,8 +4687,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
4669
4687
|
</a>
|
|
4670
4688
|
}
|
|
4671
4689
|
</nav>
|
|
4672
|
-
<mat-tab-nav-panel
|
|
4673
|
-
|
|
4690
|
+
<mat-tab-nav-panel
|
|
4691
|
+
#tabPanel
|
|
4692
|
+
[class.praxis-tabs-nav-panel--header-only]="!shouldRenderNavBody()"
|
|
4693
|
+
>
|
|
4694
|
+
@if (shouldRenderNavBody() && currentNavIndex() >= 0) {
|
|
4674
4695
|
<div class="praxis-tabnav-content">
|
|
4675
4696
|
@if (config?.nav?.links?.[currentNavIndex()]; as l) {
|
|
4676
4697
|
@if ((l.content?.length || safeWidgetDefinitions(l.widgets).length) && navContentReady(currentNavIndex())) {
|
|
@@ -4705,6 +4726,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
4705
4726
|
</mat-tab-nav-panel>
|
|
4706
4727
|
} @else {
|
|
4707
4728
|
<mat-tab-group
|
|
4729
|
+
[class.praxis-tabs-group--header-only]="!shouldRenderGroupBody()"
|
|
4708
4730
|
[dynamicHeight]="config?.group?.dynamicHeight"
|
|
4709
4731
|
[disableRipple]="config?.group?.disableRipple"
|
|
4710
4732
|
[disablePagination]="config?.group?.disablePagination"
|
|
@@ -4776,6 +4798,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
4776
4798
|
</button>
|
|
4777
4799
|
}
|
|
4778
4800
|
</ng-template>
|
|
4801
|
+
@if (shouldRenderGroupBody()) {
|
|
4779
4802
|
@if ((entry.tab.content?.length || safeWidgetDefinitions(entry.tab.widgets).length) && groupContentReady(entry.index)) {
|
|
4780
4803
|
@if (entry.tab.content) {
|
|
4781
4804
|
<ng-container
|
|
@@ -4802,6 +4825,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
4802
4825
|
[primaryAction]="{ label: t('emptyState.openEditor', 'Abrir editor'), icon: 'tune', action: openEditor.bind(this) }"
|
|
4803
4826
|
></praxis-empty-state-card>
|
|
4804
4827
|
}
|
|
4828
|
+
}
|
|
4805
4829
|
</mat-tab>
|
|
4806
4830
|
}
|
|
4807
4831
|
</mat-tab-group>
|
|
@@ -4833,7 +4857,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
4833
4857
|
</button>
|
|
4834
4858
|
}
|
|
4835
4859
|
</div>
|
|
4836
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".praxis-tabs-root{position:relative;display:block}.praxis-tabs-group.align-start .mat-mdc-tab-header{justify-content:flex-start}.praxis-tabs-group.align-center .mat-mdc-tab-header{justify-content:center}.praxis-tabs-group.align-end .mat-mdc-tab-header{justify-content:flex-end}.density-compact .mat-mdc-tab-body-content{padding:8px}.density-comfortable .mat-mdc-tab-body-content{padding:16px}.density-spacious .mat-mdc-tab-body-content{padding:24px}.tabs-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.tabs-ai-assistant-trigger{box-shadow:var(--md-sys-elevation-level2)}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.edit-fab-secondary{right:56px}.tab-empty{padding:16px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.high-contrast{filter:contrast(1.2)}.reduce-motion{--mat-animation-duration: 0ms}.drag-handle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px;cursor:grab}.tab-label-icon{font-size:18px;width:18px;height:18px;margin-right:6px;vertical-align:middle}:host-context(.pdx-gridster-item) .praxis-tabs-root{display:flex;flex-direction:column;height:100%;min-height:0}:host-context(.pdx-gridster-item) .praxis-tabs-group,:host-context(.pdx-gridster-item) .mat-mdc-tab-group{flex:1 1 auto;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{height:100%;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{overflow:auto}:host-context(.pdx-gridster-item) .praxis-tabnav-content{flex:1 1 auto;min-height:0;overflow:auto}\n"] }]
|
|
4860
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".praxis-tabs-root{position:relative;display:block}.praxis-tabs-group.align-start .mat-mdc-tab-header{justify-content:flex-start}.praxis-tabs-group.align-center .mat-mdc-tab-header{justify-content:center}.praxis-tabs-group.align-end .mat-mdc-tab-header{justify-content:flex-end}.praxis-tabs-group--header-only .mat-mdc-tab-body-wrapper,.praxis-tabs-nav-panel--header-only{display:none}.density-compact .mat-mdc-tab-body-content{padding:8px}.density-comfortable .mat-mdc-tab-body-content{padding:16px}.density-spacious .mat-mdc-tab-body-content{padding:24px}.tabs-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.tabs-ai-assistant-trigger{box-shadow:var(--md-sys-elevation-level2)}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.edit-fab-secondary{right:56px}.tab-empty{padding:16px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.high-contrast{filter:contrast(1.2)}.reduce-motion{--mat-animation-duration: 0ms}.drag-handle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px;cursor:grab}.tab-label-icon{font-size:18px;width:18px;height:18px;margin-right:6px;vertical-align:middle}:host-context(.pdx-gridster-item) .praxis-tabs-root{display:flex;flex-direction:column;height:100%;min-height:0}:host-context(.pdx-gridster-item) .praxis-tabs-group,:host-context(.pdx-gridster-item) .mat-mdc-tab-group{flex:1 1 auto;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{height:100%;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{overflow:auto}:host-context(.pdx-gridster-item) .praxis-tabnav-content{flex:1 1 auto;min-height:0;overflow:auto}\n"] }]
|
|
4837
4861
|
}], propDecorators: { config: [{
|
|
4838
4862
|
type: Input
|
|
4839
4863
|
}], tabsId: [{
|
|
@@ -5094,7 +5118,7 @@ const PRAXIS_TABS_COMPONENT_METADATA = {
|
|
|
5094
5118
|
name: 'selectedIndex',
|
|
5095
5119
|
type: 'number',
|
|
5096
5120
|
label: 'Indice selecionado',
|
|
5097
|
-
description: 'Indice ativo de abas/nav controlavel externamente pela composicao',
|
|
5121
|
+
description: 'Indice ativo de abas/nav controlavel externamente pela composicao. Para usar tabs como header de navegacao com conteudo externo, configure group.renderBody=false ou nav.renderBody=false.',
|
|
5098
5122
|
},
|
|
5099
5123
|
{
|
|
5100
5124
|
name: 'enableCustomization',
|
|
@@ -5277,6 +5301,7 @@ const PRAXIS_TABS_AUTHORING_MANIFEST = {
|
|
|
5277
5301
|
{ kind: 'visibility', resolver: 'tab-or-link-by-id', description: 'Runtime visibility flag for a group tab or nav link.' },
|
|
5278
5302
|
{ kind: 'disabledState', resolver: 'tab-or-link-by-id', description: 'Disabled state of a tab or nav link.' },
|
|
5279
5303
|
{ kind: 'layout', resolver: 'tabs-layout-config', description: 'Group/nav mode, header position, density, stretch and behavior settings.' },
|
|
5304
|
+
{ kind: 'renderBody', resolver: 'tabs-render-body-config', description: 'Config paths group.renderBody and nav.renderBody that let the host own external body content.' },
|
|
5280
5305
|
],
|
|
5281
5306
|
operations: [
|
|
5282
5307
|
{
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/tabs",
|
|
3
|
-
"version": "9.0.0-beta.
|
|
3
|
+
"version": "9.0.0-beta.20",
|
|
4
4
|
"description": "Configurable tabs (group and nav) for Praxis UI with metadata-driven content and runtime editor.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^21.0.0",
|
|
7
7
|
"@angular/core": "^21.0.0",
|
|
8
8
|
"@angular/material": "^21.0.0",
|
|
9
9
|
"@angular/cdk": "^21.0.0",
|
|
10
|
-
"@praxisui/core": "^9.0.0-beta.
|
|
11
|
-
"@praxisui/dynamic-fields": "^9.0.0-beta.
|
|
12
|
-
"@praxisui/settings-panel": "^9.0.0-beta.
|
|
10
|
+
"@praxisui/core": "^9.0.0-beta.20",
|
|
11
|
+
"@praxisui/dynamic-fields": "^9.0.0-beta.20",
|
|
12
|
+
"@praxisui/settings-panel": "^9.0.0-beta.20",
|
|
13
13
|
"@angular/forms": "^21.0.0",
|
|
14
14
|
"@angular/router": "^21.0.0",
|
|
15
|
-
"@praxisui/ai": "^9.0.0-beta.
|
|
15
|
+
"@praxisui/ai": "^9.0.0-beta.20",
|
|
16
16
|
"rxjs": "~7.8.0"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
@@ -23,17 +23,11 @@
|
|
|
23
23
|
"publishConfig": {
|
|
24
24
|
"access": "public"
|
|
25
25
|
},
|
|
26
|
-
"
|
|
27
|
-
"type": "git",
|
|
28
|
-
"url": "git+https://github.com/codexrodrigues/praxis-ui-angular.git"
|
|
29
|
-
},
|
|
30
|
-
"homepage": "https://praxisui.dev",
|
|
31
|
-
"bugs": {
|
|
32
|
-
"url": "https://github.com/codexrodrigues/praxis-ui-angular/issues"
|
|
33
|
-
},
|
|
26
|
+
"homepage": "https://praxisui.dev/components/tabs",
|
|
34
27
|
"keywords": [
|
|
35
28
|
"angular",
|
|
36
29
|
"praxisui",
|
|
30
|
+
"praxis",
|
|
37
31
|
"tabs",
|
|
38
32
|
"navigation",
|
|
39
33
|
"material",
|
|
@@ -49,7 +43,10 @@
|
|
|
49
43
|
".": {
|
|
50
44
|
"types": "./types/praxisui-tabs.d.ts",
|
|
51
45
|
"default": "./fesm2022/praxisui-tabs.mjs"
|
|
46
|
+
},
|
|
47
|
+
"./ai/component-registry.json": {
|
|
48
|
+
"default": "./ai/component-registry.json"
|
|
52
49
|
}
|
|
53
50
|
},
|
|
54
51
|
"type": "module"
|
|
55
|
-
}
|
|
52
|
+
}
|
|
@@ -22,8 +22,8 @@ source_of_truth:
|
|
|
22
22
|
- "projects/praxis-tabs/src/lib/praxis-tabs.ts"
|
|
23
23
|
- "projects/praxis-tabs/src/lib/quick-setup/tabs-quick-setup.component.ts"
|
|
24
24
|
- "projects/praxis-tabs/src/lib/ai/tabs-ai-capabilities.ts"
|
|
25
|
-
source_of_truth_last_verified: "2026-
|
|
26
|
-
last_updated: "2026-
|
|
25
|
+
source_of_truth_last_verified: "2026-06-24"
|
|
26
|
+
last_updated: "2026-06-24"
|
|
27
27
|
toc: true
|
|
28
28
|
sidebar: true
|
|
29
29
|
tags:
|
|
@@ -90,9 +90,11 @@ Este documento e a referencia canonica da API JSON de praxis-tabs-config-editor.
|
|
|
90
90
|
| `accessibility.highContrast/reduceMotion` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
91
91
|
| `accessibility.ariaLabels/keyboardNavigation` | not-specified | not-specified | n/a | Declared-only | Preservado no contrato JSON, sem superficie ativa na UI. |
|
|
92
92
|
| `group.*` | not-specified | not-specified | n/a | Partial | Preservado da documentação anterior. |
|
|
93
|
+
| `group.renderBody` | boolean | no | true | Active | Quando `false`, o group mode renderiza apenas o header de abas; o conteudo ativo fica sob controle externo do host. |
|
|
93
94
|
| `tabs[]` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
94
95
|
| `tabs[].content` | not-specified | not-specified | n/a | Partial | Preservado da documentação anterior. |
|
|
95
96
|
| `nav.*` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
97
|
+
| `nav.renderBody` | boolean | no | true | Active | Quando `false`, o nav mode renderiza apenas o header de links; o conteudo ativo fica sob controle externo do host. |
|
|
96
98
|
| `nav.links[]` | not-specified | not-specified | n/a | Active | Preservado da documentação anterior. |
|
|
97
99
|
|
|
98
100
|
### Supported legacy paths
|
|
@@ -493,11 +495,13 @@ Risco conhecido:
|
|
|
493
495
|
| `group.disablePagination` | Active | guia Grupo |
|
|
494
496
|
| `group.disableRipple` | Active | guia Grupo |
|
|
495
497
|
| `group.preserveContent` | Active | guia Grupo |
|
|
498
|
+
| `group.renderBody` | Active | guia Grupo |
|
|
496
499
|
| `group.stretchTabs` | Active | guia Grupo |
|
|
497
500
|
| `nav.selectedIndex` | Active | guia Navegacao |
|
|
498
501
|
| `nav.animationDuration` | Active | guia Navegacao |
|
|
499
502
|
| `nav.ariaLabel` | Active | guia Navegacao |
|
|
500
503
|
| `nav.ariaLabelledby` | Active | guia Navegacao |
|
|
504
|
+
| `nav.renderBody` | Active | guia Navegacao |
|
|
501
505
|
| `nav.color` | Active | guia Navegacao |
|
|
502
506
|
| `nav.backgroundColor` | Active | guia Navegacao |
|
|
503
507
|
| `nav.fitInkBarToContent` | Active | guia Navegacao |
|
package/types/praxisui-tabs.d.ts
CHANGED
|
@@ -98,6 +98,8 @@ interface TabGroupMetadata {
|
|
|
98
98
|
fitInkBarToContent?: boolean;
|
|
99
99
|
headerPosition?: 'above' | 'below';
|
|
100
100
|
preserveContent?: boolean;
|
|
101
|
+
/** Quando false, renderiza apenas o header de abas; o conteudo fica sob controle externo do host. */
|
|
102
|
+
renderBody?: boolean;
|
|
101
103
|
selectedIndex?: number;
|
|
102
104
|
stretchTabs?: boolean;
|
|
103
105
|
backgroundColor?: 'primary' | 'accent' | 'warn' | undefined;
|
|
@@ -127,6 +129,8 @@ interface TabNavMetadata {
|
|
|
127
129
|
disablePagination?: boolean;
|
|
128
130
|
disableRipple?: boolean;
|
|
129
131
|
fitInkBarToContent?: boolean;
|
|
132
|
+
/** Quando false, renderiza apenas o header de nav; o conteudo fica sob controle externo do host. */
|
|
133
|
+
renderBody?: boolean;
|
|
130
134
|
selectedIndex?: number;
|
|
131
135
|
stretchTabs?: boolean;
|
|
132
136
|
links: TabLinkMetadata[];
|
|
@@ -276,6 +280,8 @@ declare class PraxisTabs implements OnInit, OnChanges, OnDestroy {
|
|
|
276
280
|
applyConfigFromAdapter(next: TabsMetadata): void;
|
|
277
281
|
private isLazy;
|
|
278
282
|
protected groupContentReady(index: number): boolean;
|
|
283
|
+
protected shouldRenderGroupBody(): boolean;
|
|
284
|
+
protected shouldRenderNavBody(): boolean;
|
|
279
285
|
protected navContentReady(index: number): boolean;
|
|
280
286
|
protected isEmptyGlobal(): boolean;
|
|
281
287
|
protected trackVisibleNavLink(index: number, entry: {
|