@praxisui/tabs 9.0.0-beta.77 → 9.0.0-beta.78
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/ai/component-registry.json +92 -12
- package/package.json +5 -5
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-07-
|
|
3
|
+
"generatedAt": "2026-07-19T03:55:15.480Z",
|
|
4
4
|
"packageName": "@praxisui/tabs",
|
|
5
|
-
"packageVersion": "9.0.0-beta.
|
|
5
|
+
"packageVersion": "9.0.0-beta.78",
|
|
6
6
|
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
7
|
"sourceRegistryVersion": "1.0.0",
|
|
8
8
|
"componentCount": 1,
|
|
@@ -2246,39 +2246,119 @@
|
|
|
2246
2246
|
{
|
|
2247
2247
|
"chunkIndex": 1,
|
|
2248
2248
|
"chunkKind": "capabilities",
|
|
2249
|
-
"content": "Component
|
|
2249
|
+
"content": "Component Capability:\n - Path: meta\n Category: meta\n Kind: object\n Description: Metadata bag for tabs.\n\nComponent Capability:\n - Path: appearance\n Category: appearance\n Kind: object\n Description: Appearance settings.\n\nComponent Capability:\n - Path: appearance.density\n Category: appearance\n Kind: enum\n Description: Density preset.\n\nComponent Capability:\n - Path: appearance.themeClass\n Category: appearance\n Kind: string\n Description: Theme CSS class applied to root.\n\nComponent Capability:\n - Path: appearance.customCss\n Category: appearance\n Kind: string\n Description: Custom CSS injected into component.\n\nComponent Capability:\n - Path: appearance.tokens\n Category: appearance\n Kind: object\n Description: Style tokens mapped to runtime CSS.\n\nComponent Capability:\n - Path: behavior\n Category: behavior\n Kind: object\n Description: Behavior settings.\n\nComponent Capability:\n - Path: behavior.lazyLoad\n Category: behavior\n Kind: boolean\n Description: Lazy load tab content.\n\nComponent Capability:\n - Path: behavior.closeable\n Category: behavior\n Kind: boolean\n Description: Show close button on tabs.\n\nComponent Capability:\n - Path: behavior.reorderable\n Category: behavior\n Kind: boolean\n Description: Allow reorder tabs/links.\n\nComponent Capability:\n - Path: accessibility\n Category: accessibility\n Kind: object\n Description: Accessibility settings.\n\nComponent Capability:\n - Path: accessibility.highContrast\n Category: accessibility\n Kind: boolean\n Description: High contrast mode.\n\nComponent Capability:\n - Path: accessibility.reduceMotion\n Category: accessibility\n Kind: boolean\n Description: Reduce motion.\n\nComponent Capability:\n - Path: group\n Category: group\n Kind: object\n Description: MatTabGroup settings.\n\nComponent Capability:\n - Path: group.alignTabs\n Category: group\n Kind: enum\n Description: Align tabs in header.\n\nComponent Capability:\n - Path: group.animationDuration\n Category: group\n Kind: string\n Description: Animation duration (e.g., 500ms).\n\nComponent Capability:\n - Path: group.ariaLabel\n Category: group\n Kind: string\n Description: aria-label for tab group.\n\nComponent Capability:\n - Path: group.ariaLabelledby\n Category: group\n Kind: string\n Description: aria-labelledby for tab group.\n\nComponent Capability:\n - Path: group.color\n Category: group\n Kind: enum\n Description: M2 color.\n\nComponent Capability:\n - Path: group.backgroundColor\n Category: group\n Kind: enum\n Description: M2 background color.\n\nComponent Capability:\n - Path: group.disablePagination\n Category: group\n Kind: boolean\n Description: Disable pagination of header.\n\nComponent Capability:\n - Path: group.disableRipple\n Category: group\n Kind: boolean\n Description: Disable ripple.\n\nComponent Capability:\n - Path: group.dynamicHeight\n Category: group\n Kind: boolean\n Description: Enable dynamic height.\n\nComponent Capability:\n - Path: group.fitInkBarToContent\n Category: group\n Kind: boolean\n Description: Fit ink bar to content.\n\nComponent Capability:\n - Path: group.headerPosition\n Category: group\n Kind: enum\n Description: Header position.\n\nComponent Capability:\n - Path: group.preserveContent\n Category: group\n Kind: boolean\n Description: Preserve content of inactive tabs.\n\nComponent Capability:\n - Path: group.selectedIndex\n Category: group\n Kind: number\n Description: Selected tab index.\n\nComponent Capability:\n - Path: group.stretchTabs\n Category: group\n Kind: boolean\n Description: Stretch tabs.\n\nComponent Capability:\n - Path: nav\n Category: nav\n Kind: object\n Description: Tab nav settings.\n\nComponent Capability:\n - Path: nav.animationDuration\n Category: nav\n Kind: string\n Description: Animation duration (e.g., 500ms).\n\nComponent Capability:\n - Path: nav.ariaLabel\n Category: nav\n Kind: string\n Description: aria-label for nav mode.\n\nComponent Capability:\n - Path: nav.ariaLabelledby\n Category: nav\n Kind: string\n Description: aria-labelledby for nav mode.\n\nComponent Capability:\n - Path: nav.color\n Category: nav\n Kind: enum\n Description: M2 color.\n\nComponent Capability:\n - Path: nav.backgroundColor\n Category: nav\n Kind: enum\n Description: M2 background color.\n\nComponent Capability:\n - Path: nav.disablePagination\n Category: nav\n Kind: boolean\n Description: Disable pagination of nav.\n\nComponent Capability:\n - Path: nav.disableRipple\n Category: nav\n Kind: boolean\n Description: Disable ripple.\n\nComponent Capability:\n - Path: nav.fitInkBarToContent\n Category: nav\n Kind: boolean\n Description: Fit ink bar to content.\n\nComponent Capability:\n - Path: nav.selectedIndex\n Category: nav\n Kind: number\n Description: Selected nav link index.\n\nComponent Capability:\n - Path: nav.stretchTabs\n Category: nav\n Kind: boolean\n Description: Stretch nav tabs.\n\nComponent Capability:\n - Path: nav.links\n Category: nav\n Kind: array\n Description: Nav links array.\n\nComponent Capability:\n - Path: nav.links[].id\n Category: nav\n Kind: string\n Description: Link id.\n\nComponent Capability:\n - Path: nav.links[].label\n Category: nav\n Kind: string\n Description: Link label.\n\nComponent Capability:\n - Path: nav.links[].active\n Category: nav\n Kind: boolean\n Description: Link active flag.\n\nComponent Capability:\n - Path: nav.links[].disabled\n Category: nav\n Kind: boolean\n Description: Disable link.\n\nComponent Capability:\n - Path: nav.links[].disableRipple\n Category: nav\n Kind: boolean\n Description: Disable ripple on link.\n\nComponent Capability:\n - Path: nav.links[].fitInkBarToContent\n Category: nav\n Kind: boolean\n Description: Fit ink bar to link content.\n\nComponent Capability:\n - Path: nav.links[].content\n Category: nav\n Kind: array\n Description: Dynamic field metadata list.\n\nComponent Capability:\n - Path: nav.links[].widgets\n Category: nav\n Kind: array\n Description: Widget definitions for link content.\n\nComponent Capability:\n - Path: tabs\n Category: tabs\n Kind: array\n Description: Tabs array.\n\nComponent Capability:\n - Path: tabs[].id\n Category: tabs\n Kind: string\n Description: Tab id.\n\nComponent Capability:\n - Path: tabs[].textLabel\n Category: tabs\n Kind: string\n Description: Tab label.\n\nComponent Capability:\n - Path: tabs[].labelClass\n Category: tabs\n Kind: string\n Description: Label class (string or string[]).\n\nComponent Capability:\n - Path: tabs[].bodyClass\n Category: tabs\n Kind: string\n Description: Body class (string or string[]).\n\nComponent Capability:\n - Path: tabs[].ariaLabel\n Category: tabs\n Kind: string\n Description: aria-label for tab.\n\nComponent Capability:\n - Path: tabs[].ariaLabelledby\n Category: tabs\n Kind: string\n Description: aria-labelledby for tab.\n\nComponent Capability:\n - Path: tabs[].disabled\n Category: tabs\n Kind: boolean\n Description: Disable tab.\n\nComponent Capability:\n - Path: tabs[].content\n Category: tabs\n Kind: array\n Description: Dynamic field metadata list.\n\nComponent Capability:\n - Path: tabs[].widgets\n Category: tabs\n Kind: array\n Description: Widget definitions for tab content.\n\nComponent Capability:\n - Path: tabs[].isActive\n Category: tabs\n Kind: boolean\n Description: Active flag (metadata only).\n\nComponent Capability:\n - Path: tabs[].origin\n Category: tabs\n Kind: number\n Description: Origin index (metadata only).\n\nComponent Capability:\n - Path: tabs[].position\n Category: tabs\n Kind: number\n Description: Position index (metadata only).\n\nComponent Capability:\n - Path: events\n Category: events\n Kind: object\n Description: Event config (placeholder).",
|
|
2250
2250
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/tabs-ai-capabilities.ts",
|
|
2251
|
-
"contentHash": "
|
|
2251
|
+
"contentHash": "32f46e4030686b5b4eff35826b6f78562cbd31c71c117e545209637e214d7db8",
|
|
2252
2252
|
"sourceKind": "component_definition",
|
|
2253
2253
|
"sourceId": "praxis-tabs",
|
|
2254
2254
|
"corpusVersion": "1.0.0"
|
|
2255
2255
|
},
|
|
2256
2256
|
{
|
|
2257
2257
|
"chunkIndex": 2,
|
|
2258
|
+
"chunkKind": "capabilities",
|
|
2259
|
+
"content": "Capability Note:\n - TabsMetadata drives both group and nav modes. Use nav.* when links are present.\n\nCapability Note:\n - appearance.customCss is injected into a <style> tag; avoid unsafe CSS from untrusted sources.\n\nCapability Note:\n - tabs[].content expects DynamicFieldMetadata[] and widgets[] expects WidgetDefinition[].",
|
|
2260
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/tabs-ai-capabilities.ts",
|
|
2261
|
+
"contentHash": "5243146af193f1d6cbd613899a33776262bf8ab7b5ed0706c120910d79d28b78",
|
|
2262
|
+
"sourceKind": "component_definition",
|
|
2263
|
+
"sourceId": "praxis-tabs",
|
|
2264
|
+
"corpusVersion": "1.0.0"
|
|
2265
|
+
},
|
|
2266
|
+
{
|
|
2267
|
+
"chunkIndex": 3,
|
|
2258
2268
|
"chunkKind": "authoring_manifest",
|
|
2259
|
-
"content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-tabs\",\n \"ownerPackage\": \"@praxisui/tabs\",\n \"configSchemaId\": \"TabsMetadata\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"config\",\n \"type\": \"TabsMetadata\",\n \"description\": \"Canonical tabs/nav configuration.\"\n },\n {\n \"name\": \"tabsId\",\n \"type\": \"string\",\n \"description\": \"Stable id used to derive persistence scope.\"\n },\n {\n \"name\": \"componentInstanceId\",\n \"type\": \"string\",\n \"description\": \"Optional instance discriminator for persistence scope.\"\n },\n {\n \"name\": \"configPersistenceStrategy\",\n \"type\": \"\\\"storage-first\\\" | \\\"input-first\\\"\",\n \"description\": \"Controls whether persisted customization or explicit input config governs the runtime. Governed previews with nested widgets should use input-first.\"\n },\n {\n \"name\": \"form\",\n \"type\": \"FormGroup\",\n \"description\": \"FormGroup consumed by dynamic field content.\"\n },\n {\n \"name\": \"context\",\n \"type\": \"Record<string, any>\",\n \"description\": \"Context passed to nested widgets.\"\n },\n {\n \"name\": \"enableCustomization\",\n \"type\": \"boolean\",\n \"description\": \"Enables Settings Panel authoring surfaces.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"tab\",\n \"resolver\": \"tab-by-id-or-label\",\n \"description\": \"A group-mode tab in config.tabs[].\"\n },\n {\n \"kind\": \"tabLabel\",\n \"resolver\": \"tab-by-id-or-label\",\n \"description\": \"The text label of a group-mode tab.\"\n },\n {\n \"kind\": \"tabIcon\",\n \"resolver\": \"tab-by-id-or-label\",\n \"description\": \"Icon metadata rendered in a group tab label.\"\n },\n {\n \"kind\": \"tabContent\",\n \"resolver\": \"tab-or-link-by-id\",\n \"description\": \"Dynamic fields or widgets hosted by a tab or nav link.\"\n },\n {\n \"kind\": \"activeTab\",\n \"resolver\": \"tab-index-or-id\",\n \"description\": \"Selected tab or nav link index.\"\n },\n {\n \"kind\": \"visibility\",\n \"resolver\": \"tab-or-link-by-id\",\n \"description\": \"Runtime visibility flag for a group tab or nav link.\"\n },\n {\n \"kind\": \"disabledState\",\n \"resolver\": \"tab-or-link-by-id\",\n \"description\": \"Disabled state of a tab or nav link.\"\n },\n {\n \"kind\": \"layout\",\n \"resolver\": \"tabs-layout-config\",\n \"description\": \"Group/nav mode, header position, density, stretch and behavior settings.\"\n },\n {\n \"kind\": \"renderBody\",\n \"resolver\": \"tabs-render-body-config\",\n \"description\": \"Config paths group.renderBody and nav.renderBody that let the host own external body content.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"tab.add\",\n \"title\": \"Add tab\",\n \"scope\": \"global\",\n \"targetKind\": \"tab\",\n \"target\": {\n \"kind\": \"tab\",\n \"resolver\": \"tabs-array\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"textLabel\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"textLabel\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"disabled\": {\n \"type\": \"boolean\"\n },\n \"visible\": {\n \"type\": \"boolean\",\n \"default\": true\n },\n \"content\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"widgets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"tabs[]\",\n \"key\": \"id\"\n }\n ],\n \"validators\": [\n \"tab-id-unique\",\n \"tabs-mode-compatible\",\n \"tab-content-valid\"\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"affectedPaths\": [\n \"tabs[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"tab.remove\",\n \"title\": \"Remove tab\",\n \"scope\": \"layout\",\n \"targetKind\": \"tab\",\n \"target\": {\n \"kind\": \"tab\",\n \"resolver\": \"tab-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"replacementActiveTabId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"tabs.remove-tab-and-reselect\",\n \"handlerContract\": {\n \"reads\": [\n \"tabs[]\",\n \"group.selectedIndex\"\n ],\n \"writes\": [\n \"tabs[]\",\n \"group.selectedIndex\"\n ],\n \"identityKeys\": [\n \"tabs[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"replacementActiveTabId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"target-tab-missing\",\n \"replacement-tab-missing\",\n \"confirmation-missing\"\n ],\n \"description\": \"Removes the target tab by stable id and reselects a safe replacement when the active/default tab is removed.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"tab-exists\",\n \"active-tab-removal-safe\",\n \"tab-content-removal-confirmed\"\n ],\n \"affectedPaths\": [\n \"tabs[]\",\n \"group.selectedIndex\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-tab-exists\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"tab.label.set\",\n \"title\": \"Set tab label\",\n \"scope\": \"layout\",\n \"targetKind\": \"tabLabel\",\n \"target\": {\n \"kind\": \"tabLabel\",\n \"resolver\": \"tab-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"textLabel\"\n ],\n \"properties\": {\n \"textLabel\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"tabs[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"tab-exists\",\n \"tab-label-valid\"\n ],\n \"affectedPaths\": [\n \"tabs[].textLabel\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-tab-exists\"\n ]\n },\n {\n \"operationId\": \"tab.icon.set\",\n \"title\": \"Set tab icon\",\n \"scope\": \"layout\",\n \"targetKind\": \"tabIcon\",\n \"target\": {\n \"kind\": \"tabIcon\",\n \"resolver\": \"tab-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"icon\"\n ],\n \"properties\": {\n \"icon\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"tabs[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"tab-exists\",\n \"tab-icon-valid\"\n ],\n \"affectedPaths\": [\n \"tabs[].icon\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-tab-exists\"\n ]\n },\n {\n \"operationId\": \"tab.order.set\",\n \"title\": \"Reorder tabs\",\n \"scope\": \"layout\",\n \"targetKind\": \"tab\",\n \"target\": {\n \"kind\": \"tab\",\n \"resolver\": \"tab-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"beforeTabId\"\n ],\n \"properties\": {\n \"beforeTabId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"tabs.reorder-tab-and-preserve-selection\",\n \"handlerContract\": {\n \"reads\": [\n \"tabs[]\",\n \"group.selectedIndex\"\n ],\n \"writes\": [\n \"tabs[]\",\n \"group.selectedIndex\"\n ],\n \"identityKeys\": [\n \"tabs[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"beforeTabId\"\n ],\n \"properties\": {\n \"beforeTabId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"target-tab-missing\",\n \"before-tab-missing\",\n \"unstable-tab-id\"\n ],\n \"description\": \"Reorders tabs by stable id and remaps group.selectedIndex when the selected tab crosses positions.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"tab-exists\",\n \"tab-order-deterministic\"\n ],\n \"affectedPaths\": [\n \"tabs[]\",\n \"group.selectedIndex\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-tab-exists\"\n ]\n },\n {\n \"operationId\": \"tab.disabled.set\",\n \"title\": \"Set tab disabled state\",\n \"scope\": \"interaction\",\n \"targetKind\": \"disabledState\",\n \"target\": {\n \"kind\": \"disabledState\",\n \"resolver\": \"tab-or-link-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"disabled\"\n ],\n \"properties\": {\n \"disabled\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"tabs.set-tab-or-link-disabled\",\n \"handlerContract\": {\n \"reads\": [\n \"tabs[]\",\n \"nav.links[]\",\n \"group.selectedIndex\",\n \"nav.selectedIndex\"\n ],\n \"writes\": [\n \"tabs[].disabled\",\n \"nav.links[].disabled\"\n ],\n \"identityKeys\": [\n \"tabs[].id\",\n \"nav.links[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"disabled\"\n ],\n \"properties\": {\n \"disabled\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"target-tab-or-link-missing\",\n \"ambiguous-target\",\n \"active-item-disabled-without-reselection\"\n ],\n \"description\": \"Sets disabled on the resolved group tab or nav link without guessing between modes.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"tab-or-link-exists\",\n \"active-tab-disabled-safe\"\n ],\n \"affectedPaths\": [\n \"tabs[].disabled\",\n \"nav.links[].disabled\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-tab-or-link-exists\"\n ]\n },\n {\n \"operationId\": \"tab.visible.set\",\n \"title\": \"Set tab visibility\",\n \"scope\": \"interaction\",\n \"targetKind\": \"visibility\",\n \"target\": {\n \"kind\": \"visibility\",\n \"resolver\": \"tab-or-link-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"visible\"\n ],\n \"properties\": {\n \"visible\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"tabs.set-tab-or-link-visible\",\n \"handlerContract\": {\n \"reads\": [\n \"tabs[]\",\n \"nav.links[]\",\n \"group.selectedIndex\",\n \"nav.selectedIndex\"\n ],\n \"writes\": [\n \"tabs[].visible\",\n \"nav.links[].visible\"\n ],\n \"identityKeys\": [\n \"tabs[].id\",\n \"nav.links[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"visible\"\n ],\n \"properties\": {\n \"visible\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"target-tab-or-link-missing\",\n \"ambiguous-target\",\n \"active-item-hidden-without-reselection\"\n ],\n \"description\": \"Sets visible on the resolved group tab or nav link and preserves deterministic visible-index mapping.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"tab-or-link-exists\",\n \"active-tab-visibility-safe\"\n ],\n \"affectedPaths\": [\n \"tabs[].visible\",\n \"nav.links[].visible\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-tab-or-link-exists\"\n ]\n },\n {\n \"operationId\": \"tab.active.set\",\n \"title\": \"Set active tab\",\n \"scope\": \"interaction\",\n \"targetKind\": \"activeTab\",\n \"target\": {\n \"kind\": \"activeTab\",\n \"resolver\": \"tab-index-or-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"selectedIndex\"\n ],\n \"properties\": {\n \"selectedIndex\": {\n \"type\": \"number\"\n },\n \"tabId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"tabs.set-active-item\",\n \"handlerContract\": {\n \"reads\": [\n \"tabs[]\",\n \"nav.links[]\",\n \"group.selectedIndex\",\n \"nav.selectedIndex\"\n ],\n \"writes\": [\n \"group.selectedIndex\",\n \"nav.selectedIndex\"\n ],\n \"identityKeys\": [\n \"tabs[].id\",\n \"nav.links[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"selectedIndex\"\n ],\n \"properties\": {\n \"selectedIndex\": {\n \"type\": \"number\"\n },\n \"tabId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"target-tab-or-link-missing\",\n \"selected-index-out-of-range\",\n \"hidden-or-disabled-target\"\n ],\n \"description\": \"Sets the active index for the current primary mode using either selectedIndex or a resolved tab/link id.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"active-tab-exists\",\n \"selected-index-in-range\"\n ],\n \"affectedPaths\": [\n \"group.selectedIndex\",\n \"nav.selectedIndex\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-tab-or-link-exists\"\n ]\n },\n {\n \"operationId\": \"layout.variant.set\",\n \"title\": \"Set tabs layout variant\",\n \"scope\": \"layout\",\n \"targetKind\": \"layout\",\n \"target\": {\n \"kind\": \"layout\",\n \"resolver\": \"tabs-layout-config\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"mode\"\n ],\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"group\",\n \"nav\"\n ]\n },\n \"density\": {\n \"enum\": [\n \"compact\",\n \"comfortable\",\n \"spacious\"\n ]\n },\n \"headerPosition\": {\n \"enum\": [\n \"above\",\n \"below\"\n ]\n },\n \"alignTabs\": {\n \"enum\": [\n \"start\",\n \"center\",\n \"end\"\n ]\n },\n \"stretchTabs\": {\n \"type\": \"boolean\"\n },\n \"lazyLoad\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"appearance\"\n },\n {\n \"kind\": \"merge-object\",\n \"path\": \"group\"\n },\n {\n \"kind\": \"merge-object\",\n \"path\": \"nav\"\n },\n {\n \"kind\": \"merge-object\",\n \"path\": \"behavior\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"tabs-mode-compatible\",\n \"layout-values-valid\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"appearance.density\",\n \"group.headerPosition\",\n \"group.alignTabs\",\n \"group.stretchTabs\",\n \"nav.stretchTabs\",\n \"behavior.lazyLoad\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"tab.content.set\",\n \"title\": \"Set tab content\",\n \"scope\": \"layout\",\n \"targetKind\": \"tabContent\",\n \"target\": {\n \"kind\": \"tabContent\",\n \"resolver\": \"tab-or-link-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"textLabel\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"disabled\": {\n \"type\": \"boolean\"\n },\n \"visible\": {\n \"type\": \"boolean\"\n },\n \"content\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"widgets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"tabs.set-tab-or-link-content\",\n \"handlerContract\": {\n \"reads\": [\n \"tabs[]\",\n \"nav.links[]\"\n ],\n \"writes\": [\n \"tabs[].content\",\n \"tabs[].widgets\",\n \"nav.links[].content\",\n \"nav.links[].widgets\"\n ],\n \"identityKeys\": [\n \"tabs[].id\",\n \"nav.links[].id\"\n ],\n \"failureModes\": [\n \"target-tab-or-link-missing\",\n \"invalid-dynamic-field-content\",\n \"invalid-widget-definition\"\n ],\n \"description\": \"Updates content/widgets only on the resolved group tab or nav link while preserving nested widget identity.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"tab-or-link-exists\",\n \"tab-content-valid\",\n \"widget-event-delegated\"\n ],\n \"affectedPaths\": [\n \"tabs[].content\",\n \"tabs[].widgets\",\n \"nav.links[].content\",\n \"nav.links[].widgets\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-tab-or-link-exists\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"tab-id-unique\",\n \"level\": \"error\",\n \"code\": \"PTABS001\",\n \"description\": \"Tab ids and nav link ids must be unique within their mode.\"\n },\n {\n \"validatorId\": \"tab-exists\",\n \"level\": \"error\",\n \"code\": \"PTABS002\",\n \"description\": \"Target tab must exist before applying the operation.\"\n },\n {\n \"validatorId\": \"tab-or-link-exists\",\n \"level\": \"error\",\n \"code\": \"PTABS003\",\n \"description\": \"Target must resolve to an existing group tab or nav link.\"\n },\n {\n \"validatorId\": \"active-tab-exists\",\n \"level\": \"error\",\n \"code\": \"PTABS004\",\n \"description\": \"Active tab or nav link selection must reference an existing item.\"\n },\n {\n \"validatorId\": \"selected-index-in-range\",\n \"level\": \"error\",\n \"code\": \"PTABS005\",\n \"description\": \"Selected index must be clamped to the target mode item count.\"\n },\n {\n \"validatorId\": \"active-tab-removal-safe\",\n \"level\": \"error\",\n \"code\": \"PTABS006\",\n \"description\": \"Removing the active/default tab requires confirmation or a replacement active tab.\"\n },\n {\n \"validatorId\": \"tab-content-removal-confirmed\",\n \"level\": \"error\",\n \"code\": \"PTABS007\",\n \"description\": \"Removing a tab or link with content/widgets is destructive and requires confirmation.\"\n },\n {\n \"validatorId\": \"tab-label-valid\",\n \"level\": \"error\",\n \"code\": \"PTABS008\",\n \"description\": \"Tab labels must be non-empty text values after localization/domain projection.\"\n },\n {\n \"validatorId\": \"tab-icon-valid\",\n \"level\": \"warning\",\n \"code\": \"PTABS009\",\n \"description\": \"Tab icon metadata must remain compatible with the icon directive and editor round-trip.\"\n },\n {\n \"validatorId\": \"tab-order-deterministic\",\n \"level\": \"error\",\n \"code\": \"PTABS010\",\n \"description\": \"Tab ordering must use stable ids, not transient array index as identity.\"\n },\n {\n \"validatorId\": \"tabs-mode-compatible\",\n \"level\": \"error\",\n \"code\": \"PTABS011\",\n \"description\": \"Authoring must resolve to one primary mode: group tabs or nav links.\"\n },\n {\n \"validatorId\": \"layout-values-valid\",\n \"level\": \"error\",\n \"code\": \"PTABS012\",\n \"description\": \"Layout values must match TabsMetadata enums and runtime bindings.\"\n },\n {\n \"validatorId\": \"editor-runtime-round-trip\",\n \"level\": \"error\",\n \"code\": \"PTABS013\",\n \"description\": \"Settings Panel, quick setup, JSON editor and runtime must preserve ids, order and selected index.\"\n },\n {\n \"validatorId\": \"active-tab-disabled-safe\",\n \"level\": \"warning\",\n \"code\": \"PTABS014\",\n \"description\": \"Disabling the active item should move selection or request explicit confirmation.\"\n },\n {\n \"validatorId\": \"active-tab-visibility-safe\",\n \"level\": \"warning\",\n \"code\": \"PTABS015\",\n \"description\": \"Hiding the active item should move selection or request explicit confirmation.\"\n },\n {\n \"validatorId\": \"tab-content-valid\",\n \"level\": \"error\",\n \"code\": \"PTABS016\",\n \"description\": \"Tab content must be valid DynamicFieldMetadata[] or WidgetDefinition[] and preserve nested widget identity.\"\n },\n {\n \"validatorId\": \"widget-event-delegated\",\n \"level\": \"info\",\n \"code\": \"PTABS017\",\n \"description\": \"Nested widget event paths remain delegated to the tabs runtime contract and are not redefined by authoring.\"\n }\n ],\n \"roundTripRequirements\": [\n \"Operations must preserve stable tab/link ids; array index may be used only as a resolver fallback, never as canonical identity.\",\n \"Settings Panel, quick setup and JSON editor must round-trip through TabsAuthoringDocument without losing config or bindings.\",\n \"Group and nav modes must remain mutually explicit; authoring cannot silently mix config.tabs and nav.links as competing primary modes.\",\n \"Nested widget events remain delegated through widgetEvent path enrichment and component-port nestedPath semantics.\"\n ],\n \"examples\": [\n {\n \"id\": \"add-overview-tab\",\n \"request\": \"Add an Overview tab before the details tab.\",\n \"operationId\": \"tab.add\",\n \"params\": {\n \"id\": \"overview\",\n \"textLabel\": \"Overview\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-list-to-current-tab\",\n \"request\": \"Create a list widget inside the current training tab.\",\n \"operationId\": \"tab.content.set\",\n \"target\": \"training\",\n \"params\": {\n \"widgets\": [\n {\n \"id\": \"training-list\",\n \"component\": \"praxis-list\",\n \"title\": \"Training list\"\n }\n ]\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-form-fields-to-existing-tab\",\n \"request\": \"Add name, date and status fields to the existing onboarding tab.\",\n \"operationId\": \"tab.content.set\",\n \"target\": \"onboarding\",\n \"params\": {\n \"content\": [\n {\n \"name\": \"name\",\n \"label\": \"Name\",\n \"controlType\": \"text\"\n },\n {\n \"name\": \"plannedDate\",\n \"label\": \"Planned date\",\n \"controlType\": \"date\"\n },\n {\n \"name\": \"status\",\n \"label\": \"Status\",\n \"controlType\": \"select\"\n }\n ]\n },\n \"isPositive\": true\n },\n {\n \"id\": \"rename-tab\",\n \"request\": \"Rename the details tab to Account Details.\",\n \"operationId\": \"tab.label.set\",\n \"target\": \"details\",\n \"params\": {\n \"textLabel\": \"Account Details\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reorder-tabs\",\n \"request\": \"Move billing before overview.\",\n \"operationId\": \"tab.order.set\",\n \"target\": \"billing\",\n \"params\": {\n \"beforeTabId\": \"overview\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"disable-tab\",\n \"request\": \"Disable the audit tab until the user has permission.\",\n \"operationId\": \"tab.disabled.set\",\n \"target\": \"audit\",\n \"params\": {\n \"disabled\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"activate-tab\",\n \"request\": \"Open the documents tab by default.\",\n \"operationId\": \"tab.active.set\",\n \"target\": \"documents\",\n \"params\": {\n \"tabId\": \"documents\",\n \"selectedIndex\": 2\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-duplicate-tab-id\",\n \"request\": \"Add another tab with id overview.\",\n \"operationId\": \"tab.add\",\n \"params\": {\n \"id\": \"overview\",\n \"textLabel\": \"Duplicate Overview\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-current-tab-content-as-tab-add\",\n \"request\": \"Create a list in this tab; do not add a new tab.\",\n \"operationId\": \"tab.add\",\n \"params\": {\n \"id\": \"list-in-this-tab\",\n \"textLabel\": \"List in this tab\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"confirm-remove-content-tab\",\n \"request\": \"Remove the details tab that contains widgets.\",\n \"operationId\": \"tab.remove\",\n \"target\": \"details\",\n \"params\": {\n \"replacementActiveTabId\": \"overview\"\n },\n \"isPositive\": true\n }\n ]\n}",
|
|
2269
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"identity\"}",
|
|
2260
2270
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2261
|
-
"contentHash": "
|
|
2271
|
+
"contentHash": "4c5c643176676f4d2f95e1c154851c10be0412a7edd8338bb58c029d74dea3b8",
|
|
2262
2272
|
"sourceKind": "component_definition",
|
|
2263
2273
|
"sourceId": "praxis-tabs",
|
|
2264
2274
|
"corpusVersion": "1.0.0"
|
|
2265
2275
|
},
|
|
2266
2276
|
{
|
|
2267
|
-
"chunkIndex":
|
|
2277
|
+
"chunkIndex": 4,
|
|
2278
|
+
"chunkKind": "authoring_manifest",
|
|
2279
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"config\",\"type\":\"TabsMetadata\",\"description\":\"Canonical tabs/nav configuration.\"},{\"name\":\"tabsId\",\"type\":\"string\",\"description\":\"Stable id used to derive persistence scope.\"},{\"name\":\"componentInstanceId\",\"type\":\"string\",\"description\":\"Optional instance discriminator for persistence scope.\"},{\"name\":\"configPersistenceStrategy\",\"type\":\"\\\"storage-first\\\" | \\\"input-first\\\"\",\"description\":\"Controls whether persisted customization or explicit input config governs the runtime. Governed previews with nested widgets should use input-first.\"},{\"name\":\"form\",\"type\":\"FormGroup\",\"description\":\"FormGroup consumed by dynamic field content.\"},{\"name\":\"context\",\"type\":\"Record<string, any>\",\"description\":\"Context passed to nested widgets.\"},{\"name\":\"enableCustomization\",\"type\":\"boolean\",\"description\":\"Enables Settings Panel authoring surfaces.\"}]}",
|
|
2280
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2281
|
+
"contentHash": "457e2818a3e5ece3ea0f7a91413938af411d792e456fad2c583531e637960002",
|
|
2282
|
+
"sourceKind": "component_definition",
|
|
2283
|
+
"sourceId": "praxis-tabs",
|
|
2284
|
+
"corpusVersion": "1.0.0"
|
|
2285
|
+
},
|
|
2286
|
+
{
|
|
2287
|
+
"chunkIndex": 5,
|
|
2288
|
+
"chunkKind": "authoring_manifest",
|
|
2289
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"tab\",\"resolver\":\"tab-by-id-or-label\",\"description\":\"A group-mode tab in config.tabs[].\"},{\"kind\":\"tabLabel\",\"resolver\":\"tab-by-id-or-label\",\"description\":\"The text label of a group-mode tab.\"},{\"kind\":\"tabIcon\",\"resolver\":\"tab-by-id-or-label\",\"description\":\"Icon metadata rendered in a group tab label.\"},{\"kind\":\"tabContent\",\"resolver\":\"tab-or-link-by-id\",\"description\":\"Dynamic fields or widgets hosted by a tab or nav link.\"},{\"kind\":\"activeTab\",\"resolver\":\"tab-index-or-id\",\"description\":\"Selected tab or nav link index.\"},{\"kind\":\"visibility\",\"resolver\":\"tab-or-link-by-id\",\"description\":\"Runtime visibility flag for a group tab or nav link.\"},{\"kind\":\"disabledState\",\"resolver\":\"tab-or-link-by-id\",\"description\":\"Disabled state of a tab or nav link.\"},{\"kind\":\"layout\",\"resolver\":\"tabs-layout-config\",\"description\":\"Group/nav mode, header position, density, stretch and behavior settings.\"},{\"kind\":\"renderBody\",\"resolver\":\"tabs-render-body-config\",\"description\":\"Config paths group.renderBody and nav.renderBody that let the host own external body content.\"}]}",
|
|
2290
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2291
|
+
"contentHash": "2c573a42f12216f9fa412a8e1a0110c1c801558d89840290e39561640cbc07c4",
|
|
2292
|
+
"sourceKind": "component_definition",
|
|
2293
|
+
"sourceId": "praxis-tabs",
|
|
2294
|
+
"corpusVersion": "1.0.0"
|
|
2295
|
+
},
|
|
2296
|
+
{
|
|
2297
|
+
"chunkIndex": 6,
|
|
2298
|
+
"chunkKind": "authoring_manifest",
|
|
2299
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"tab.add\",\"title\":\"Add tab\",\"scope\":\"global\",\"targetKind\":\"tab\",\"target\":{\"kind\":\"tab\",\"resolver\":\"tabs-array\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"textLabel\"],\"properties\":{\"id\":{\"type\":\"string\"},\"textLabel\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"disabled\":{\"type\":\"boolean\"},\"visible\":{\"type\":\"boolean\",\"default\":true},\"content\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"widgets\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"tabs[]\",\"key\":\"id\"}],\"validators\":[\"tab-id-unique\",\"tabs-mode-compatible\",\"tab-content-valid\"],\"destructive\":false,\"requiresConfirmation\":false,\"affectedPaths\":[\"tabs[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"tab.remove\",\"title\":\"Remove tab\",\"scope\":\"layout\",\"targetKind\":\"tab\",\"target\":{\"kind\":\"tab\",\"resolver\":\"tab-by-id-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"replacementActiveTabId\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"tabs.remove-tab-and-reselect\",\"handlerContract\":{\"reads\":[\"tabs[]\",\"group.selectedIndex\"],\"writes\":[\"tabs[]\",\"group.selectedIndex\"],\"identityKeys\":[\"tabs[].id\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"replacementActiveTabId\":{\"type\":\"string\"}}},\"failureModes\":[\"target-tab-missing\",\"replacement-tab-missing\",\"confirmation-missing\"],\"description\":\"Removes the target tab by stable id and reselects a safe replacement when the active/default tab is removed.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"tab-exists\",\"active-tab-removal-safe\",\"tab-content-removal-confirmed\"],\"affectedPaths\":[\"tabs[]\",\"group.selectedIndex\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-tab-exists\",\"confirmation-collected\"]},{\"operationId\":\"tab.label.set\",\"title\":\"Set tab label\",\"scope\":\"layout\",\"targetKind\":\"tabLabel\",\"target\":{\"kind\":\"tabLabel\",\"resolver\":\"tab-by-id-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"textLabel\"],\"properties\":{\"textLabel\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"tabs[]\",\"key\":\"id\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"tab-exists\",\"tab-label-valid\"],\"affectedPaths\":[\"tabs[].textLabel\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-tab-exists\"]},{\"operationId\":\"tab.icon.set\",\"title\":\"Set tab icon\",\"scope\":\"layout\",\"targetKind\":\"tabIcon\",\"target\":{\"kind\":\"tabIcon\",\"resolver\":\"tab-by-id-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"icon\"],\"properties\":{\"icon\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"tabs[]\",\"key\":\"id\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"tab-exists\",\"tab-icon-valid\"],\"affectedPaths\":[\"tabs[].icon\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-tab-exists\"]},{\"operationId\":\"tab.order.set\",\"title\":\"Reorder tabs\",\"scope\":\"layout\",\"targetKind\":\"tab\",\"target\":{\"kind\":\"tab\",\"resolver\":\"tab-by-id-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"beforeTabId\"],\"properties\":{\"beforeTabId\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"tabs.reorder-tab-and-preserve-selection\",\"handlerContract\":{\"reads\":[\"tabs[]\",\"group.selectedIndex\"],\"writes\":[\"tabs[]\",\"group.selectedIndex\"],\"identityKeys\":[\"tabs[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"beforeTabId\"],\"properties\":{\"beforeTabId\":{\"type\":\"string\"}}},\"failureModes\":[\"target-tab-missing\",\"before-tab-missing\",\"unstable-tab-id\"],\"description\":\"Reorders tabs by stable id and remaps group.selectedIndex when the selected tab crosses positions.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"tab-exists\",\"tab-order-deterministic\"],\"affectedPaths\":[\"tabs[]\",\"group.selectedIndex\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-tab-exists\"]},{\"operationId\":\"tab.disabled.set\",\"title\":\"Set tab disabled state\",\"scope\":\"interaction\",\"targetKind\":\"disabledState\",\"target\":{\"kind\":\"disabledState\",\"resolver\":\"tab-or-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"disabled\"],\"properties\":{\"disabled\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"tabs.set-tab-or-link-disabled\",\"handlerContract\":{\"reads\":[\"tabs[]\",\"nav.links[]\",\"group.selectedIndex\",\"nav.selectedIndex\"],\"writes\":[\"tabs[].disabled\",\"nav.links[].disabled\"],\"identityKeys\":[\"tabs[].id\",\"nav.links[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"disabled\"],\"properties\":{\"disabled\":{\"type\":\"boolean\"}}},\"failureModes\":[\"target-tab-or-link-missing\",\"ambiguous-target\",\"active-item-disabled-without-reselection\"],\"description\":\"Sets disabled on the resolved group tab or nav link without guessing between modes.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"tab-or-link-exists\",\"active-tab-disabled-safe\"],\"affectedPaths\":[\"tabs[].disabled\",\"nav.links[].disabled\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-tab-or-link-exists\"]},{\"operationId\":\"tab.visible.set\",\"title\":\"Set tab visibility\",\"scope\":\"interaction\",\"targetKind\":\"visibility\",\"target\":{\"kind\":\"visibility\",\"resolver\":\"tab-or-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"visible\"],\"properties\":{\"visible\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"tabs.set-tab-or-link-visible\",\"handlerContract\":{\"reads\":[\"tabs[]\",\"nav.links[]\",\"group.selectedIndex\",\"nav.selectedIndex\"],\"writes\":[\"tabs[].visible\",\"nav.links[].visible\"],\"identityKeys\":[\"tabs[].id\",\"nav.links[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"visible\"],\"properties\":{\"visible\":{\"type\":\"boolean\"}}},\"failureModes\":[\"target-tab-or-link-missing\",\"ambiguous-target\",\"active-item-hidden-without-reselection\"],\"description\":\"Sets visible on the resolved group tab or nav link and preserves deterministic visible-index mapping.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"tab-or-link-exists\",\"active-tab-visibility-safe\"],\"affectedPaths\":[\"tabs[].visible\",\"nav.links[].visible\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-tab-or-link-exists\"]},{\"operationId\":\"tab.active.set\",\"title\":\"Set active tab\",\"scope\":\"interaction\",\"targetKind\":\"activeTab\",\"target\":{\"kind\":\"activeTab\",\"resolver\":\"tab-index-or-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"selectedIndex\"],\"properties\":{\"selectedIndex\":{\"type\":\"number\"},\"tabId\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"tabs.set-active-item\",\"handlerContract\":{\"reads\":[\"tabs[]\",\"nav.links[]\",\"group.selectedIndex\",\"nav.selectedIndex\"],\"writes\":[\"group.selectedIndex\",\"nav.selectedIndex\"],\"identityKeys\":[\"tabs[].id\",\"nav.links[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"selectedIndex\"],\"properties\":{\"selectedIndex\":{\"type\":\"number\"},\"tabId\":{\"type\":\"string\"}}},\"failureModes\":[\"target-tab-or-link-missing\",\"selected-index-out-of-range\",\"hidden-or-disabled-target\"],\"description\":\"Sets the active index for the current primary mode using either selectedIndex or a resolved tab/link id.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"active-tab-exists\",\"selected-index-in-range\"],\"affectedPaths\":[\"group.selectedIndex\",\"nav.selectedIndex\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-tab-or-link-exists\"]}]}",
|
|
2300
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2301
|
+
"contentHash": "f07305f793398695f08c285b3e11410db67f67e9b6c21dc76e6f5a75b0850eec",
|
|
2302
|
+
"sourceKind": "component_definition",
|
|
2303
|
+
"sourceId": "praxis-tabs",
|
|
2304
|
+
"corpusVersion": "1.0.0"
|
|
2305
|
+
},
|
|
2306
|
+
{
|
|
2307
|
+
"chunkIndex": 7,
|
|
2308
|
+
"chunkKind": "authoring_manifest",
|
|
2309
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"layout.variant.set\",\"title\":\"Set tabs layout variant\",\"scope\":\"layout\",\"targetKind\":\"layout\",\"target\":{\"kind\":\"layout\",\"resolver\":\"tabs-layout-config\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"mode\"],\"properties\":{\"mode\":{\"enum\":[\"group\",\"nav\"]},\"density\":{\"enum\":[\"compact\",\"comfortable\",\"spacious\"]},\"headerPosition\":{\"enum\":[\"above\",\"below\"]},\"alignTabs\":{\"enum\":[\"start\",\"center\",\"end\"]},\"stretchTabs\":{\"type\":\"boolean\"},\"lazyLoad\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"appearance\"},{\"kind\":\"merge-object\",\"path\":\"group\"},{\"kind\":\"merge-object\",\"path\":\"nav\"},{\"kind\":\"merge-object\",\"path\":\"behavior\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"tabs-mode-compatible\",\"layout-values-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"appearance.density\",\"group.headerPosition\",\"group.alignTabs\",\"group.stretchTabs\",\"nav.stretchTabs\",\"behavior.lazyLoad\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"tab.content.set\",\"title\":\"Set tab content\",\"scope\":\"layout\",\"targetKind\":\"tabContent\",\"target\":{\"kind\":\"tabContent\",\"resolver\":\"tab-or-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"id\":{\"type\":\"string\"},\"textLabel\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"disabled\":{\"type\":\"boolean\"},\"visible\":{\"type\":\"boolean\"},\"content\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"widgets\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"tabs.set-tab-or-link-content\",\"handlerContract\":{\"reads\":[\"tabs[]\",\"nav.links[]\"],\"writes\":[\"tabs[].content\",\"tabs[].widgets\",\"nav.links[].content\",\"nav.links[].widgets\"],\"identityKeys\":[\"tabs[].id\",\"nav.links[].id\"],\"failureModes\":[\"target-tab-or-link-missing\",\"invalid-dynamic-field-content\",\"invalid-widget-definition\"],\"description\":\"Updates content/widgets only on the resolved group tab or nav link while preserving nested widget identity.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"tab-or-link-exists\",\"tab-content-valid\",\"widget-event-delegated\"],\"affectedPaths\":[\"tabs[].content\",\"tabs[].widgets\",\"nav.links[].content\",\"nav.links[].widgets\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-tab-or-link-exists\"]}]}",
|
|
2310
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2311
|
+
"contentHash": "e6dfc9afd083ab441d649a8733d497006b3ef8b642fec674756a607f50822867",
|
|
2312
|
+
"sourceKind": "component_definition",
|
|
2313
|
+
"sourceId": "praxis-tabs",
|
|
2314
|
+
"corpusVersion": "1.0.0"
|
|
2315
|
+
},
|
|
2316
|
+
{
|
|
2317
|
+
"chunkIndex": 8,
|
|
2318
|
+
"chunkKind": "authoring_manifest",
|
|
2319
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"tab-id-unique\",\"level\":\"error\",\"code\":\"PTABS001\",\"description\":\"Tab ids and nav link ids must be unique within their mode.\"},{\"validatorId\":\"tab-exists\",\"level\":\"error\",\"code\":\"PTABS002\",\"description\":\"Target tab must exist before applying the operation.\"},{\"validatorId\":\"tab-or-link-exists\",\"level\":\"error\",\"code\":\"PTABS003\",\"description\":\"Target must resolve to an existing group tab or nav link.\"},{\"validatorId\":\"active-tab-exists\",\"level\":\"error\",\"code\":\"PTABS004\",\"description\":\"Active tab or nav link selection must reference an existing item.\"},{\"validatorId\":\"selected-index-in-range\",\"level\":\"error\",\"code\":\"PTABS005\",\"description\":\"Selected index must be clamped to the target mode item count.\"},{\"validatorId\":\"active-tab-removal-safe\",\"level\":\"error\",\"code\":\"PTABS006\",\"description\":\"Removing the active/default tab requires confirmation or a replacement active tab.\"},{\"validatorId\":\"tab-content-removal-confirmed\",\"level\":\"error\",\"code\":\"PTABS007\",\"description\":\"Removing a tab or link with content/widgets is destructive and requires confirmation.\"},{\"validatorId\":\"tab-label-valid\",\"level\":\"error\",\"code\":\"PTABS008\",\"description\":\"Tab labels must be non-empty text values after localization/domain projection.\"},{\"validatorId\":\"tab-icon-valid\",\"level\":\"warning\",\"code\":\"PTABS009\",\"description\":\"Tab icon metadata must remain compatible with the icon directive and editor round-trip.\"},{\"validatorId\":\"tab-order-deterministic\",\"level\":\"error\",\"code\":\"PTABS010\",\"description\":\"Tab ordering must use stable ids, not transient array index as identity.\"},{\"validatorId\":\"tabs-mode-compatible\",\"level\":\"error\",\"code\":\"PTABS011\",\"description\":\"Authoring must resolve to one primary mode: group tabs or nav links.\"},{\"validatorId\":\"layout-values-valid\",\"level\":\"error\",\"code\":\"PTABS012\",\"description\":\"Layout values must match TabsMetadata enums and runtime bindings.\"},{\"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.\"},{\"validatorId\":\"active-tab-disabled-safe\",\"level\":\"warning\",\"code\":\"PTABS014\",\"description\":\"Disabling the active item should move selection or request explicit confirmation.\"},{\"validatorId\":\"active-tab-visibility-safe\",\"level\":\"warning\",\"code\":\"PTABS015\",\"description\":\"Hiding the active item should move selection or request explicit confirmation.\"},{\"validatorId\":\"tab-content-valid\",\"level\":\"error\",\"code\":\"PTABS016\",\"description\":\"Tab content must be valid DynamicFieldMetadata[] or WidgetDefinition[] and preserve nested widget identity.\"},{\"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.\"}]}",
|
|
2320
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2321
|
+
"contentHash": "e41c7d7b291c61716f36abe8eb8d893b0f77c57cde9edc04c375ed10265cb60e",
|
|
2322
|
+
"sourceKind": "component_definition",
|
|
2323
|
+
"sourceId": "praxis-tabs",
|
|
2324
|
+
"corpusVersion": "1.0.0"
|
|
2325
|
+
},
|
|
2326
|
+
{
|
|
2327
|
+
"chunkIndex": 9,
|
|
2328
|
+
"chunkKind": "authoring_manifest",
|
|
2329
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"Operations must preserve stable tab/link ids; array index may be used only as a resolver fallback, never as canonical identity.\",\"Settings Panel, quick setup and JSON editor must round-trip through TabsAuthoringDocument without losing config or bindings.\",\"Group and nav modes must remain mutually explicit; authoring cannot silently mix config.tabs and nav.links as competing primary modes.\",\"Nested widget events remain delegated through widgetEvent path enrichment and component-port nestedPath semantics.\"]}",
|
|
2330
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2331
|
+
"contentHash": "56286a66841786c8e0a2987ac8fbd13bf1dbf5d09ce24e2ce3f0c1d632d0dc5b",
|
|
2332
|
+
"sourceKind": "component_definition",
|
|
2333
|
+
"sourceId": "praxis-tabs",
|
|
2334
|
+
"corpusVersion": "1.0.0"
|
|
2335
|
+
},
|
|
2336
|
+
{
|
|
2337
|
+
"chunkIndex": 10,
|
|
2338
|
+
"chunkKind": "authoring_manifest",
|
|
2339
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"add-overview-tab\",\"request\":\"Add an Overview tab before the details tab.\",\"operationId\":\"tab.add\",\"params\":{\"id\":\"overview\",\"textLabel\":\"Overview\"},\"isPositive\":true},{\"id\":\"add-list-to-current-tab\",\"request\":\"Create a list widget inside the current training tab.\",\"operationId\":\"tab.content.set\",\"target\":\"training\",\"params\":{\"widgets\":[{\"id\":\"training-list\",\"component\":\"praxis-list\",\"title\":\"Training list\"}]},\"isPositive\":true},{\"id\":\"add-form-fields-to-existing-tab\",\"request\":\"Add name, date and status fields to the existing onboarding tab.\",\"operationId\":\"tab.content.set\",\"target\":\"onboarding\",\"params\":{\"content\":[{\"name\":\"name\",\"label\":\"Name\",\"controlType\":\"text\"},{\"name\":\"plannedDate\",\"label\":\"Planned date\",\"controlType\":\"date\"},{\"name\":\"status\",\"label\":\"Status\",\"controlType\":\"select\"}]},\"isPositive\":true},{\"id\":\"rename-tab\",\"request\":\"Rename the details tab to Account Details.\",\"operationId\":\"tab.label.set\",\"target\":\"details\",\"params\":{\"textLabel\":\"Account Details\"},\"isPositive\":true},{\"id\":\"reorder-tabs\",\"request\":\"Move billing before overview.\",\"operationId\":\"tab.order.set\",\"target\":\"billing\",\"params\":{\"beforeTabId\":\"overview\"},\"isPositive\":true},{\"id\":\"disable-tab\",\"request\":\"Disable the audit tab until the user has permission.\",\"operationId\":\"tab.disabled.set\",\"target\":\"audit\",\"params\":{\"disabled\":true},\"isPositive\":true},{\"id\":\"activate-tab\",\"request\":\"Open the documents tab by default.\",\"operationId\":\"tab.active.set\",\"target\":\"documents\",\"params\":{\"tabId\":\"documents\",\"selectedIndex\":2},\"isPositive\":true},{\"id\":\"reject-duplicate-tab-id\",\"request\":\"Add another tab with id overview.\",\"operationId\":\"tab.add\",\"params\":{\"id\":\"overview\",\"textLabel\":\"Duplicate Overview\"},\"isPositive\":false},{\"id\":\"reject-current-tab-content-as-tab-add\",\"request\":\"Create a list in this tab; do not add a new tab.\",\"operationId\":\"tab.add\",\"params\":{\"id\":\"list-in-this-tab\",\"textLabel\":\"List in this tab\"},\"isPositive\":false},{\"id\":\"confirm-remove-content-tab\",\"request\":\"Remove the details tab that contains widgets.\",\"operationId\":\"tab.remove\",\"target\":\"details\",\"params\":{\"replacementActiveTabId\":\"overview\"},\"isPositive\":true}]}",
|
|
2340
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2341
|
+
"contentHash": "7a02a2c8ba28585150adbf4e598b0c052a680bb61ce95b3877bf6dbba0d81ad0",
|
|
2342
|
+
"sourceKind": "component_definition",
|
|
2343
|
+
"sourceId": "praxis-tabs",
|
|
2344
|
+
"corpusVersion": "1.0.0"
|
|
2345
|
+
},
|
|
2346
|
+
{
|
|
2347
|
+
"chunkIndex": 11,
|
|
2268
2348
|
"chunkKind": "context_pack",
|
|
2269
|
-
"content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {\n \"appearance.density\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"compact\",\n \"label\": \"Compact\"\n },\n {\n \"value\": \"comfortable\",\n \"label\": \"Comfortable\"\n },\n {\n \"value\": \"spacious\",\n \"label\": \"Spacious\"\n }\n ]\n },\n \"group.alignTabs\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"start\",\n \"label\": \"Start\"\n },\n {\n \"value\": \"center\",\n \"label\": \"Center\"\n },\n {\n \"value\": \"end\",\n \"label\": \"End\"\n }\n ]\n },\n \"group.headerPosition\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"above\",\n \"label\": \"Above\"\n },\n {\n \"value\": \"below\",\n \"label\": \"Below\"\n }\n ]\n },\n \"group.color\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n }\n ]\n },\n \"group.backgroundColor\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n }\n ]\n },\n \"nav.color\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n }\n ]\n },\n \"nav.backgroundColor\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n }\n ]\n }\n },\n \"actionCatalog\": [\n {\n \"id\": \"appearance.density.set\",\n \"intentExamples\": [\n \"density\",\n \"compact\",\n \"spacious\"\n ],\n \"patchTemplate\": {\n \"appearance\": {\n \"density\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"group.alignTabs.set\",\n \"intentExamples\": [\n \"align tabs\",\n \"tab alignment\",\n \"align header\"\n ],\n \"patchTemplate\": {\n \"group\": {\n \"alignTabs\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"group.headerPosition.set\",\n \"intentExamples\": [\n \"header position\",\n \"tabs position\"\n ],\n \"patchTemplate\": {\n \"group\": {\n \"headerPosition\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"group.selectedIndex.set\",\n \"intentExamples\": [\n \"select tab\",\n \"active tab\",\n \"selected index\"\n ],\n \"patchTemplate\": {\n \"group\": {\n \"selectedIndex\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"nav.selectedIndex.set\",\n \"intentExamples\": [\n \"select link\",\n \"active link\",\n \"selected nav\"\n ],\n \"patchTemplate\": {\n \"nav\": {\n \"selectedIndex\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"behavior.lazyLoad.enable\",\n \"intentExamples\": [\n \"lazy load\",\n \"load on demand\",\n \"lazy\"\n ],\n \"patchTemplate\": {\n \"behavior\": {\n \"lazyLoad\": true\n }\n }\n },\n {\n \"id\": \"behavior.lazyLoad.disable\",\n \"intentExamples\": [\n \"no lazy\",\n \"eager load\"\n ],\n \"patchTemplate\": {\n \"behavior\": {\n \"lazyLoad\": false\n }\n }\n },\n {\n \"id\": \"group.stretchTabs.enable\",\n \"intentExamples\": [\n \"stretch tabs\",\n \"full width tabs\"\n ],\n \"patchTemplate\": {\n \"group\": {\n \"stretchTabs\": true\n }\n }\n },\n {\n \"id\": \"group.stretchTabs.disable\",\n \"intentExamples\": [\n \"no stretch tabs\",\n \"compact tabs\"\n ],\n \"patchTemplate\": {\n \"group\": {\n \"stretchTabs\": false\n }\n }\n },\n {\n \"id\": \"group.disablePagination.enable\",\n \"intentExamples\": [\n \"disable pagination\",\n \"no pagination\"\n ],\n \"patchTemplate\": {\n \"group\": {\n \"disablePagination\": true\n }\n }\n },\n {\n \"id\": \"group.disablePagination.disable\",\n \"intentExamples\": [\n \"enable pagination\",\n \"allow pagination\"\n ],\n \"patchTemplate\": {\n \"group\": {\n \"disablePagination\": false\n }\n }\n },\n {\n \"id\": \"tab.add\",\n \"intentExamples\": [\n \"add tab\",\n \"new tab\",\n \"create tab\",\n \"nova aba\",\n \"adicionar aba\",\n \"criar aba\"\n ],\n \"patchTemplate\": {\n \"tabs\": [\n {\n \"id\": \"{{target}}\",\n \"textLabel\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"tab.content.set\",\n \"intentExamples\": [\n \"tab content\",\n \"current tab content\",\n \"add widget to tab\",\n \"list in current tab\",\n \"inside tab\",\n \"conteudo da aba\",\n \"nesta aba\",\n \"aba atual\",\n \"componente dentro da aba\"\n ],\n \"patchTemplate\": {\n \"tabs\": [\n {\n \"id\": \"{{target}}\",\n \"content\": \"{{params.content}}\",\n \"widgets\": \"{{params.widgets}}\"\n }\n ]\n }\n },\n {\n \"id\": \"tab.label.set\",\n \"intentExamples\": [\n \"rename tab\",\n \"tab label\",\n \"tab title\"\n ],\n \"patchTemplate\": {\n \"tabs\": [\n {\n \"id\": \"{{target}}\",\n \"textLabel\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"tab.disable\",\n \"intentExamples\": [\n \"disable tab\",\n \"lock tab\"\n ],\n \"patchTemplate\": {\n \"tabs\": [\n {\n \"id\": \"{{target}}\",\n \"disabled\": true\n }\n ]\n }\n },\n {\n \"id\": \"tab.enable\",\n \"intentExamples\": [\n \"enable tab\",\n \"unlock tab\"\n ],\n \"patchTemplate\": {\n \"tabs\": [\n {\n \"id\": \"{{target}}\",\n \"disabled\": false\n }\n ]\n }\n },\n {\n \"id\": \"nav.link.add\",\n \"intentExamples\": [\n \"add link\",\n \"add nav link\",\n \"new link\"\n ],\n \"patchTemplate\": {\n \"nav\": {\n \"links\": [\n {\n \"id\": \"{{target}}\",\n \"label\": \"{{value}}\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"nav.link.label.set\",\n \"intentExamples\": [\n \"rename link\",\n \"link label\"\n ],\n \"patchTemplate\": {\n \"nav\": {\n \"links\": [\n {\n \"id\": \"{{target}}\",\n \"label\": \"{{value}}\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"nav.link.disable\",\n \"intentExamples\": [\n \"disable link\",\n \"lock link\"\n ],\n \"patchTemplate\": {\n \"nav\": {\n \"links\": [\n {\n \"id\": \"{{target}}\",\n \"disabled\": true\n }\n ]\n }\n }\n },\n {\n \"id\": \"nav.link.enable\",\n \"intentExamples\": [\n \"enable link\",\n \"unlock link\"\n ],\n \"patchTemplate\": {\n \"nav\": {\n \"links\": [\n {\n \"id\": \"{{target}}\",\n \"disabled\": false\n }\n ]\n }\n }\n }\n ],\n \"fieldResolvers\": {\n \"tabs[]\": [\n \"id\",\n \"textLabel\"\n ],\n \"nav.links[]\": [\n \"id\",\n \"label\"\n ]\n },\n \"hints\": [\n \"Use tabs[].id or tabs[].textLabel as merge keys; avoid array indexes.\",\n \"When using nav mode, prefer nav.links[]; when using group mode, prefer tabs[].\",\n \"Selected index expects a zero-based number.\",\n \"DOC: Widget purpose: tabs or nav links with dynamic content.\",\n \"DOC: Host inputs: tabsId (required), config (optional), and configPersistenceStrategy. Use input-first for governed previews that must render the explicit nested widget config.\",\n \"DOC: Provide either tabs[] (group mode) or nav.links[] (nav mode).\",\n \"DOC: Each tab/link should define a label (tabs[].textLabel or nav.links[].label).\"\n ]\n }\n}",
|
|
2349
|
+
"content": "{\"componentContext\":{\"version\":\"v1\",\"optionsByPath\":{\"appearance.density\":{\"mode\":\"enum\",\"options\":[{\"value\":\"compact\",\"label\":\"Compact\"},{\"value\":\"comfortable\",\"label\":\"Comfortable\"},{\"value\":\"spacious\",\"label\":\"Spacious\"}]},\"group.alignTabs\":{\"mode\":\"enum\",\"options\":[{\"value\":\"start\",\"label\":\"Start\"},{\"value\":\"center\",\"label\":\"Center\"},{\"value\":\"end\",\"label\":\"End\"}]},\"group.headerPosition\":{\"mode\":\"enum\",\"options\":[{\"value\":\"above\",\"label\":\"Above\"},{\"value\":\"below\",\"label\":\"Below\"}]},\"group.color\":{\"mode\":\"enum\",\"options\":[{\"value\":\"primary\",\"label\":\"Primary\"},{\"value\":\"accent\",\"label\":\"Accent\"},{\"value\":\"warn\",\"label\":\"Warn\"}]},\"group.backgroundColor\":{\"mode\":\"enum\",\"options\":[{\"value\":\"primary\",\"label\":\"Primary\"},{\"value\":\"accent\",\"label\":\"Accent\"},{\"value\":\"warn\",\"label\":\"Warn\"}]},\"nav.color\":{\"mode\":\"enum\",\"options\":[{\"value\":\"primary\",\"label\":\"Primary\"},{\"value\":\"accent\",\"label\":\"Accent\"},{\"value\":\"warn\",\"label\":\"Warn\"}]},\"nav.backgroundColor\":{\"mode\":\"enum\",\"options\":[{\"value\":\"primary\",\"label\":\"Primary\"},{\"value\":\"accent\",\"label\":\"Accent\"},{\"value\":\"warn\",\"label\":\"Warn\"}]}},\"actionCatalog\":[{\"id\":\"appearance.density.set\",\"intentExamples\":[\"density\",\"compact\",\"spacious\"],\"patchTemplate\":{\"appearance\":{\"density\":\"{{value}}\"}}},{\"id\":\"group.alignTabs.set\",\"intentExamples\":[\"align tabs\",\"tab alignment\",\"align header\"],\"patchTemplate\":{\"group\":{\"alignTabs\":\"{{value}}\"}}},{\"id\":\"group.headerPosition.set\",\"intentExamples\":[\"header position\",\"tabs position\"],\"patchTemplate\":{\"group\":{\"headerPosition\":\"{{value}}\"}}},{\"id\":\"group.selectedIndex.set\",\"intentExamples\":[\"select tab\",\"active tab\",\"selected index\"],\"patchTemplate\":{\"group\":{\"selectedIndex\":\"{{value}}\"}}},{\"id\":\"nav.selectedIndex.set\",\"intentExamples\":[\"select link\",\"active link\",\"selected nav\"],\"patchTemplate\":{\"nav\":{\"selectedIndex\":\"{{value}}\"}}},{\"id\":\"behavior.lazyLoad.enable\",\"intentExamples\":[\"lazy load\",\"load on demand\",\"lazy\"],\"patchTemplate\":{\"behavior\":{\"lazyLoad\":true}}},{\"id\":\"behavior.lazyLoad.disable\",\"intentExamples\":[\"no lazy\",\"eager load\"],\"patchTemplate\":{\"behavior\":{\"lazyLoad\":false}}},{\"id\":\"group.stretchTabs.enable\",\"intentExamples\":[\"stretch tabs\",\"full width tabs\"],\"patchTemplate\":{\"group\":{\"stretchTabs\":true}}},{\"id\":\"group.stretchTabs.disable\",\"intentExamples\":[\"no stretch tabs\",\"compact tabs\"],\"patchTemplate\":{\"group\":{\"stretchTabs\":false}}},{\"id\":\"group.disablePagination.enable\",\"intentExamples\":[\"disable pagination\",\"no pagination\"],\"patchTemplate\":{\"group\":{\"disablePagination\":true}}},{\"id\":\"group.disablePagination.disable\",\"intentExamples\":[\"enable pagination\",\"allow pagination\"],\"patchTemplate\":{\"group\":{\"disablePagination\":false}}},{\"id\":\"tab.add\",\"intentExamples\":[\"add tab\",\"new tab\",\"create tab\",\"nova aba\",\"adicionar aba\",\"criar aba\"],\"patchTemplate\":{\"tabs\":[{\"id\":\"{{target}}\",\"textLabel\":\"{{value}}\"}]}},{\"id\":\"tab.content.set\",\"intentExamples\":[\"tab content\",\"current tab content\",\"add widget to tab\",\"list in current tab\",\"inside tab\",\"conteudo da aba\",\"nesta aba\",\"aba atual\",\"componente dentro da aba\"],\"patchTemplate\":{\"tabs\":[{\"id\":\"{{target}}\",\"content\":\"{{params.content}}\",\"widgets\":\"{{params.widgets}}\"}]}},{\"id\":\"tab.label.set\",\"intentExamples\":[\"rename tab\",\"tab label\",\"tab title\"],\"patchTemplate\":{\"tabs\":[{\"id\":\"{{target}}\",\"textLabel\":\"{{value}}\"}]}},{\"id\":\"tab.disable\",\"intentExamples\":[\"disable tab\",\"lock tab\"],\"patchTemplate\":{\"tabs\":[{\"id\":\"{{target}}\",\"disabled\":true}]}},{\"id\":\"tab.enable\",\"intentExamples\":[\"enable tab\",\"unlock tab\"],\"patchTemplate\":{\"tabs\":[{\"id\":\"{{target}}\",\"disabled\":false}]}},{\"id\":\"nav.link.add\",\"intentExamples\":[\"add link\",\"add nav link\",\"new link\"],\"patchTemplate\":{\"nav\":{\"links\":[{\"id\":\"{{target}}\",\"label\":\"{{value}}\"}]}}},{\"id\":\"nav.link.label.set\",\"intentExamples\":[\"rename link\",\"link label\"],\"patchTemplate\":{\"nav\":{\"links\":[{\"id\":\"{{target}}\",\"label\":\"{{value}}\"}]}}},{\"id\":\"nav.link.disable\",\"intentExamples\":[\"disable link\",\"lock link\"],\"patchTemplate\":{\"nav\":{\"links\":[{\"id\":\"{{target}}\",\"disabled\":true}]}}},{\"id\":\"nav.link.enable\",\"intentExamples\":[\"enable link\",\"unlock link\"],\"patchTemplate\":{\"nav\":{\"links\":[{\"id\":\"{{target}}\",\"disabled\":false}]}}}],\"fieldResolvers\":{\"tabs[]\":[\"id\",\"textLabel\"],\"nav.links[]\":[\"id\",\"label\"]},\"hints\":[\"Use tabs[].id or tabs[].textLabel as merge keys; avoid array indexes.\",\"When using nav mode, prefer nav.links[]; when using group mode, prefer tabs[].\",\"Selected index expects a zero-based number.\",\"DOC: Widget purpose: tabs or nav links with dynamic content.\",\"DOC: Host inputs: tabsId (required), config (optional), and configPersistenceStrategy. Use input-first for governed previews that must render the explicit nested widget config.\",\"DOC: Provide either tabs[] (group mode) or nav.links[] (nav mode).\",\"DOC: Each tab/link should define a label (tabs[].textLabel or nav.links[].label).\"]}}",
|
|
2270
2350
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/tabs-context-pack.ts",
|
|
2271
|
-
"contentHash": "
|
|
2351
|
+
"contentHash": "6b52d218edc6c5a338e530fb87db3d2f656659513bec58437a792e4e34908cf2",
|
|
2272
2352
|
"sourceKind": "component_definition",
|
|
2273
2353
|
"sourceId": "praxis-tabs",
|
|
2274
2354
|
"corpusVersion": "1.0.0"
|
|
2275
2355
|
},
|
|
2276
2356
|
{
|
|
2277
|
-
"chunkIndex":
|
|
2357
|
+
"chunkIndex": 12,
|
|
2278
2358
|
"chunkKind": "recipe",
|
|
2279
|
-
"content": "{\
|
|
2359
|
+
"content": "{\"_comment\":\"Receita para configuração de Abas (Praxis Tabs).\",\"templateMeta\":{\"registryKey\":\"praxis-tabs\",\"variantId\":\"base\",\"useWhen\":\"Base tabs configuration.\",\"examplePrompts\":[\"create a tabs layout\",\"add tabs with icons and routes\"]},\"config\":{\"orientation\":\"horizontal\",\"lazyLoad\":true,\"animation\":true,\"keepAlive\":true,\"tabs\":[{\"id\":\"tab-overview\",\"label\":\"Visão Geral\",\"icon\":\"dashboard\",\"route\":\"./overview\"},{\"id\":\"tab-details\",\"label\":\"Detalhes\",\"icon\":\"list\",\"badge\":{\"content\":\"3\",\"color\":\"warn\"},\"route\":\"./details\"},{\"id\":\"tab-settings\",\"label\":\"Configurações\",\"icon\":\"settings\",\"disabled\":false,\"content\":{\"type\":\"component\",\"componentId\":\"settings-panel\"}}]}}",
|
|
2280
2360
|
"sourcePointer": "examples/ai-recipes/praxis-tabs.json",
|
|
2281
|
-
"contentHash": "
|
|
2361
|
+
"contentHash": "857aa6729027c1fc5dbc425e907df89f8b0eb28789bfd977120cdb0667f011a0",
|
|
2282
2362
|
"sourceKind": "component_definition",
|
|
2283
2363
|
"sourceId": "praxis-tabs",
|
|
2284
2364
|
"corpusVersion": "1.0.0"
|
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.78",
|
|
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.78",
|
|
11
|
+
"@praxisui/dynamic-fields": "^9.0.0-beta.78",
|
|
12
|
+
"@praxisui/settings-panel": "^9.0.0-beta.78",
|
|
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.78",
|
|
16
16
|
"rxjs": "~7.8.0"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|