@praxisui/tabs 9.0.0-beta.86 → 9.0.0-beta.88
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 +146 -13
- 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-23T02:50:28.389Z",
|
|
4
4
|
"packageName": "@praxisui/tabs",
|
|
5
|
-
"packageVersion": "9.0.0-beta.
|
|
5
|
+
"packageVersion": "9.0.0-beta.88",
|
|
6
6
|
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
7
|
"sourceRegistryVersion": "1.0.0",
|
|
8
8
|
"componentCount": 1,
|
|
@@ -1967,6 +1967,39 @@
|
|
|
1967
1967
|
"tabs[].id",
|
|
1968
1968
|
"nav.links[].id"
|
|
1969
1969
|
],
|
|
1970
|
+
"inputSchema": {
|
|
1971
|
+
"type": "object",
|
|
1972
|
+
"minProperties": 1,
|
|
1973
|
+
"properties": {
|
|
1974
|
+
"id": {
|
|
1975
|
+
"type": "string"
|
|
1976
|
+
},
|
|
1977
|
+
"textLabel": {
|
|
1978
|
+
"type": "string"
|
|
1979
|
+
},
|
|
1980
|
+
"icon": {
|
|
1981
|
+
"type": "string"
|
|
1982
|
+
},
|
|
1983
|
+
"disabled": {
|
|
1984
|
+
"type": "boolean"
|
|
1985
|
+
},
|
|
1986
|
+
"visible": {
|
|
1987
|
+
"type": "boolean"
|
|
1988
|
+
},
|
|
1989
|
+
"content": {
|
|
1990
|
+
"type": "array",
|
|
1991
|
+
"items": {
|
|
1992
|
+
"type": "object"
|
|
1993
|
+
}
|
|
1994
|
+
},
|
|
1995
|
+
"widgets": {
|
|
1996
|
+
"type": "array",
|
|
1997
|
+
"items": {
|
|
1998
|
+
"type": "object"
|
|
1999
|
+
}
|
|
2000
|
+
}
|
|
2001
|
+
}
|
|
2002
|
+
},
|
|
1970
2003
|
"failureModes": [
|
|
1971
2004
|
"target-tab-or-link-missing",
|
|
1972
2005
|
"invalid-dynamic-field-content",
|
|
@@ -2266,6 +2299,106 @@
|
|
|
2266
2299
|
{
|
|
2267
2300
|
"chunkIndex": 3,
|
|
2268
2301
|
"chunkKind": "authoring_manifest",
|
|
2302
|
+
"content": "{\"operationId\":\"tab.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Add tab Effects: append-unique. Add an Overview tab before the details tab. Add another tab with id overview. Create a list in this tab; do not add a new tab.\",\"scope\":\"global\",\"target\":{\"kind\":\"tab\",\"resolver\":\"tabs-array\",\"required\":false},\"inputContract\":{\"required\":[\"id\",\"textLabel\"],\"properties\":[\"id\",\"textLabel\",\"icon\",\"disabled\",\"visible\",\"content\",\"widgets\"],\"semanticTerms\":[\"id\",\"textLabel\",\"icon\",\"disabled\",\"visible\",\"content\",\"widgets\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"tabs[]\"],\"validators\":[{\"validatorId\":\"tab-id-unique\",\"level\":\"error\",\"code\":\"PTABS001\",\"description\":\"Tab ids and nav link ids must be unique within their mode.\"},{\"validatorId\":\"tabs-mode-compatible\",\"level\":\"error\",\"code\":\"PTABS011\",\"description\":\"Authoring must resolve to one primary mode: group tabs or nav links.\"},{\"validatorId\":\"tab-content-valid\",\"level\":\"error\",\"code\":\"PTABS016\",\"description\":\"Tab content must be valid DynamicFieldMetadata[] or WidgetDefinition[] and preserve nested widget identity.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-overview-tab\",\"request\":\"Add an Overview tab before the details tab.\",\"operationId\":\"tab.add\",\"params\":{\"id\":\"overview\",\"textLabel\":\"Overview\"},\"isPositive\":true}],\"negativeExamples\":[{\"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}]}",
|
|
2303
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2304
|
+
"contentHash": "9c83cd8fd8ce269911902b6331b53fd1aa7822680fcc8bf90a3f20350d327b0e",
|
|
2305
|
+
"sourceKind": "component_definition",
|
|
2306
|
+
"sourceId": "praxis-tabs",
|
|
2307
|
+
"corpusVersion": "1.0.0"
|
|
2308
|
+
},
|
|
2309
|
+
{
|
|
2310
|
+
"chunkIndex": 4,
|
|
2311
|
+
"chunkKind": "authoring_manifest",
|
|
2312
|
+
"content": "{\"operationId\":\"tab.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remove tab Effects: compile-domain-patch. Remove the details tab that contains widgets.\",\"scope\":\"layout\",\"target\":{\"kind\":\"tab\",\"resolver\":\"tab-by-id-or-label\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[\"replacementActiveTabId\"],\"semanticTerms\":[\"replacementActiveTabId\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"tabs[]\",\"group.selectedIndex\"],\"validators\":[{\"validatorId\":\"tab-exists\",\"level\":\"error\",\"code\":\"PTABS002\",\"description\":\"Target tab must exist before applying the operation.\"},{\"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.\"}],\"preconditions\":[\"config-initialized\",\"target-tab-exists\",\"confirmation-collected\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"confirm-remove-content-tab\",\"request\":\"Remove the details tab that contains widgets.\",\"operationId\":\"tab.remove\",\"target\":\"details\",\"params\":{\"replacementActiveTabId\":\"overview\"},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
2313
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2314
|
+
"contentHash": "db3b912a41d4b7b9c8820a6230a45e5fbb4720e7f17bf25bd58fcc180394fb94",
|
|
2315
|
+
"sourceKind": "component_definition",
|
|
2316
|
+
"sourceId": "praxis-tabs",
|
|
2317
|
+
"corpusVersion": "1.0.0"
|
|
2318
|
+
},
|
|
2319
|
+
{
|
|
2320
|
+
"chunkIndex": 5,
|
|
2321
|
+
"chunkKind": "authoring_manifest",
|
|
2322
|
+
"content": "{\"operationId\":\"tab.label.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set tab label Effects: merge-by-key. Rename the details tab to Account Details.\",\"scope\":\"layout\",\"target\":{\"kind\":\"tabLabel\",\"resolver\":\"tab-by-id-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"textLabel\"],\"properties\":[\"textLabel\"],\"semanticTerms\":[\"textLabel\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"tabs[].textLabel\"],\"validators\":[{\"validatorId\":\"tab-exists\",\"level\":\"error\",\"code\":\"PTABS002\",\"description\":\"Target tab must exist before applying the operation.\"},{\"validatorId\":\"tab-label-valid\",\"level\":\"error\",\"code\":\"PTABS008\",\"description\":\"Tab labels must be non-empty text values after localization/domain projection.\"}],\"preconditions\":[\"config-initialized\",\"target-tab-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"rename-tab\",\"request\":\"Rename the details tab to Account Details.\",\"operationId\":\"tab.label.set\",\"target\":\"details\",\"params\":{\"textLabel\":\"Account Details\"},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
2323
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2324
|
+
"contentHash": "568f804c768b2ebf7955db7c59a95bb6733d31e78247610dba51b48e0ad98fcd",
|
|
2325
|
+
"sourceKind": "component_definition",
|
|
2326
|
+
"sourceId": "praxis-tabs",
|
|
2327
|
+
"corpusVersion": "1.0.0"
|
|
2328
|
+
},
|
|
2329
|
+
{
|
|
2330
|
+
"chunkIndex": 6,
|
|
2331
|
+
"chunkKind": "authoring_manifest",
|
|
2332
|
+
"content": "{\"operationId\":\"tab.icon.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set tab icon Effects: merge-by-key.\",\"scope\":\"layout\",\"target\":{\"kind\":\"tabIcon\",\"resolver\":\"tab-by-id-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"icon\"],\"properties\":[\"icon\"],\"semanticTerms\":[\"icon\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"tabs[].icon\"],\"validators\":[{\"validatorId\":\"tab-exists\",\"level\":\"error\",\"code\":\"PTABS002\",\"description\":\"Target tab must exist before applying the operation.\"},{\"validatorId\":\"tab-icon-valid\",\"level\":\"warning\",\"code\":\"PTABS009\",\"description\":\"Tab icon metadata must remain compatible with the icon directive and editor round-trip.\"}],\"preconditions\":[\"config-initialized\",\"target-tab-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
|
|
2333
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2334
|
+
"contentHash": "81e1b95049419836613778f2abdf4f0a25a82cd9faa98eacbce6d3ed55a59951",
|
|
2335
|
+
"sourceKind": "component_definition",
|
|
2336
|
+
"sourceId": "praxis-tabs",
|
|
2337
|
+
"corpusVersion": "1.0.0"
|
|
2338
|
+
},
|
|
2339
|
+
{
|
|
2340
|
+
"chunkIndex": 7,
|
|
2341
|
+
"chunkKind": "authoring_manifest",
|
|
2342
|
+
"content": "{\"operationId\":\"tab.order.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Reorder tabs Effects: compile-domain-patch. Move billing before overview.\",\"scope\":\"layout\",\"target\":{\"kind\":\"tab\",\"resolver\":\"tab-by-id-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"beforeTabId\"],\"properties\":[\"beforeTabId\"],\"semanticTerms\":[\"beforeTabId\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"tabs[]\",\"group.selectedIndex\"],\"validators\":[{\"validatorId\":\"tab-exists\",\"level\":\"error\",\"code\":\"PTABS002\",\"description\":\"Target tab must exist before applying the operation.\"},{\"validatorId\":\"tab-order-deterministic\",\"level\":\"error\",\"code\":\"PTABS010\",\"description\":\"Tab ordering must use stable ids, not transient array index as identity.\"}],\"preconditions\":[\"config-initialized\",\"target-tab-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"reorder-tabs\",\"request\":\"Move billing before overview.\",\"operationId\":\"tab.order.set\",\"target\":\"billing\",\"params\":{\"beforeTabId\":\"overview\"},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
2343
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2344
|
+
"contentHash": "e68b79e375d835c6b3cd7ab8f6584816e0cd6f5c87730133c7ce999d00d1b654",
|
|
2345
|
+
"sourceKind": "component_definition",
|
|
2346
|
+
"sourceId": "praxis-tabs",
|
|
2347
|
+
"corpusVersion": "1.0.0"
|
|
2348
|
+
},
|
|
2349
|
+
{
|
|
2350
|
+
"chunkIndex": 8,
|
|
2351
|
+
"chunkKind": "authoring_manifest",
|
|
2352
|
+
"content": "{\"operationId\":\"tab.disabled.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set tab disabled state Effects: compile-domain-patch. Disable the audit tab until the user has permission.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"disabledState\",\"resolver\":\"tab-or-link-by-id\",\"required\":true},\"inputContract\":{\"required\":[\"disabled\"],\"properties\":[\"disabled\"],\"semanticTerms\":[\"disabled\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"tabs[].disabled\",\"nav.links[].disabled\"],\"validators\":[{\"validatorId\":\"tab-or-link-exists\",\"level\":\"error\",\"code\":\"PTABS003\",\"description\":\"Target must resolve to an existing group tab or nav link.\"},{\"validatorId\":\"active-tab-disabled-safe\",\"level\":\"warning\",\"code\":\"PTABS014\",\"description\":\"Disabling the active item should move selection or request explicit confirmation.\"}],\"preconditions\":[\"config-initialized\",\"target-tab-or-link-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"disable-tab\",\"request\":\"Disable the audit tab until the user has permission.\",\"operationId\":\"tab.disabled.set\",\"target\":\"audit\",\"params\":{\"disabled\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
2353
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2354
|
+
"contentHash": "51700df31cbe1a9695a7b633cfcccbeb9e2ad85a740366c0a6f274cf7a82f919",
|
|
2355
|
+
"sourceKind": "component_definition",
|
|
2356
|
+
"sourceId": "praxis-tabs",
|
|
2357
|
+
"corpusVersion": "1.0.0"
|
|
2358
|
+
},
|
|
2359
|
+
{
|
|
2360
|
+
"chunkIndex": 9,
|
|
2361
|
+
"chunkKind": "authoring_manifest",
|
|
2362
|
+
"content": "{\"operationId\":\"tab.visible.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set tab visibility Effects: compile-domain-patch.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"visibility\",\"resolver\":\"tab-or-link-by-id\",\"required\":true},\"inputContract\":{\"required\":[\"visible\"],\"properties\":[\"visible\"],\"semanticTerms\":[\"visible\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"tabs[].visible\",\"nav.links[].visible\"],\"validators\":[{\"validatorId\":\"tab-or-link-exists\",\"level\":\"error\",\"code\":\"PTABS003\",\"description\":\"Target must resolve to an existing group tab or nav link.\"},{\"validatorId\":\"active-tab-visibility-safe\",\"level\":\"warning\",\"code\":\"PTABS015\",\"description\":\"Hiding the active item should move selection or request explicit confirmation.\"}],\"preconditions\":[\"config-initialized\",\"target-tab-or-link-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
|
|
2363
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2364
|
+
"contentHash": "bc274ea9ca6f42f01e092e3a66e9017a32051a63cfc648c8c64462a0a1f4ecd0",
|
|
2365
|
+
"sourceKind": "component_definition",
|
|
2366
|
+
"sourceId": "praxis-tabs",
|
|
2367
|
+
"corpusVersion": "1.0.0"
|
|
2368
|
+
},
|
|
2369
|
+
{
|
|
2370
|
+
"chunkIndex": 10,
|
|
2371
|
+
"chunkKind": "authoring_manifest",
|
|
2372
|
+
"content": "{\"operationId\":\"tab.active.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set active tab Effects: compile-domain-patch. Open the documents tab by default.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"activeTab\",\"resolver\":\"tab-index-or-id\",\"required\":true},\"inputContract\":{\"required\":[\"selectedIndex\"],\"properties\":[\"selectedIndex\",\"tabId\"],\"semanticTerms\":[\"selectedIndex\",\"tabId\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"group.selectedIndex\",\"nav.selectedIndex\"],\"validators\":[{\"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.\"}],\"preconditions\":[\"config-initialized\",\"target-tab-or-link-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"activate-tab\",\"request\":\"Open the documents tab by default.\",\"operationId\":\"tab.active.set\",\"target\":\"documents\",\"params\":{\"tabId\":\"documents\",\"selectedIndex\":2},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
2373
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2374
|
+
"contentHash": "d19dfef3b55f971a91cdfc5cb37552fcfb6cafaeac7863aa4da6b9a2715a9ee8",
|
|
2375
|
+
"sourceKind": "component_definition",
|
|
2376
|
+
"sourceId": "praxis-tabs",
|
|
2377
|
+
"corpusVersion": "1.0.0"
|
|
2378
|
+
},
|
|
2379
|
+
{
|
|
2380
|
+
"chunkIndex": 11,
|
|
2381
|
+
"chunkKind": "authoring_manifest",
|
|
2382
|
+
"content": "{\"operationId\":\"layout.variant.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set tabs layout variant Effects: merge-object, merge-object, merge-object, merge-object.\",\"scope\":\"layout\",\"target\":{\"kind\":\"layout\",\"resolver\":\"tabs-layout-config\",\"required\":true},\"inputContract\":{\"required\":[\"mode\"],\"properties\":[\"mode\",\"density\",\"headerPosition\",\"alignTabs\",\"stretchTabs\",\"lazyLoad\"],\"semanticTerms\":[\"mode\",\"density\",\"headerPosition\",\"alignTabs\",\"stretchTabs\",\"lazyLoad\",\"group\",\"nav\",\"compact\",\"comfortable\",\"spacious\",\"above\",\"below\",\"start\",\"center\",\"end\"]},\"effects\":[\"merge-object\",\"merge-object\",\"merge-object\",\"merge-object\"],\"affectedPaths\":[\"appearance.density\",\"group.headerPosition\",\"group.alignTabs\",\"group.stretchTabs\",\"nav.stretchTabs\",\"behavior.lazyLoad\"],\"validators\":[{\"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.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
|
|
2383
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2384
|
+
"contentHash": "b8f1c5aeee5e423525a8af7c5a2880695b2ec04b3e78d5510661c67be407dfa8",
|
|
2385
|
+
"sourceKind": "component_definition",
|
|
2386
|
+
"sourceId": "praxis-tabs",
|
|
2387
|
+
"corpusVersion": "1.0.0"
|
|
2388
|
+
},
|
|
2389
|
+
{
|
|
2390
|
+
"chunkIndex": 12,
|
|
2391
|
+
"chunkKind": "authoring_manifest",
|
|
2392
|
+
"content": "{\"operationId\":\"tab.content.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set tab content Effects: compile-domain-patch. Create a list widget inside the current training tab. Add name, date and status fields to the existing onboarding tab.\",\"scope\":\"layout\",\"target\":{\"kind\":\"tabContent\",\"resolver\":\"tab-or-link-by-id\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[\"id\",\"textLabel\",\"icon\",\"disabled\",\"visible\",\"content\",\"widgets\"],\"semanticTerms\":[\"id\",\"textLabel\",\"icon\",\"disabled\",\"visible\",\"content\",\"widgets\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"tabs[].content\",\"tabs[].widgets\",\"nav.links[].content\",\"nav.links[].widgets\"],\"validators\":[{\"validatorId\":\"tab-or-link-exists\",\"level\":\"error\",\"code\":\"PTABS003\",\"description\":\"Target must resolve to an existing group tab or nav link.\"},{\"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.\"}],\"preconditions\":[\"config-initialized\",\"target-tab-or-link-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"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}],\"negativeExamples\":[]}",
|
|
2393
|
+
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2394
|
+
"contentHash": "3f619f89019a752a08ad858f7102295f158518185906c3baafb6cb57897faee9",
|
|
2395
|
+
"sourceKind": "component_definition",
|
|
2396
|
+
"sourceId": "praxis-tabs",
|
|
2397
|
+
"corpusVersion": "1.0.0"
|
|
2398
|
+
},
|
|
2399
|
+
{
|
|
2400
|
+
"chunkIndex": 13,
|
|
2401
|
+
"chunkKind": "authoring_manifest",
|
|
2269
2402
|
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-tabs\",\"ownerPackage\":\"@praxisui/tabs\",\"configSchemaId\":\"TabsMetadata\",\"chunkSection\":\"identity\"}",
|
|
2270
2403
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2271
2404
|
"contentHash": "4c5c643176676f4d2f95e1c154851c10be0412a7edd8338bb58c029d74dea3b8",
|
|
@@ -2274,7 +2407,7 @@
|
|
|
2274
2407
|
"corpusVersion": "1.0.0"
|
|
2275
2408
|
},
|
|
2276
2409
|
{
|
|
2277
|
-
"chunkIndex":
|
|
2410
|
+
"chunkIndex": 14,
|
|
2278
2411
|
"chunkKind": "authoring_manifest",
|
|
2279
2412
|
"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
2413
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
@@ -2284,7 +2417,7 @@
|
|
|
2284
2417
|
"corpusVersion": "1.0.0"
|
|
2285
2418
|
},
|
|
2286
2419
|
{
|
|
2287
|
-
"chunkIndex":
|
|
2420
|
+
"chunkIndex": 15,
|
|
2288
2421
|
"chunkKind": "authoring_manifest",
|
|
2289
2422
|
"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
2423
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
@@ -2294,7 +2427,7 @@
|
|
|
2294
2427
|
"corpusVersion": "1.0.0"
|
|
2295
2428
|
},
|
|
2296
2429
|
{
|
|
2297
|
-
"chunkIndex":
|
|
2430
|
+
"chunkIndex": 16,
|
|
2298
2431
|
"chunkKind": "authoring_manifest",
|
|
2299
2432
|
"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
2433
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
@@ -2304,17 +2437,17 @@
|
|
|
2304
2437
|
"corpusVersion": "1.0.0"
|
|
2305
2438
|
},
|
|
2306
2439
|
{
|
|
2307
|
-
"chunkIndex":
|
|
2440
|
+
"chunkIndex": 17,
|
|
2308
2441
|
"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\"]}]}",
|
|
2442
|
+
"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\"],\"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\"}}}},\"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
2443
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
2311
|
-
"contentHash": "
|
|
2444
|
+
"contentHash": "45b97f1413f371e2fe418da2a5ab989798208096154e6ddd1a8a775c0ab39671",
|
|
2312
2445
|
"sourceKind": "component_definition",
|
|
2313
2446
|
"sourceId": "praxis-tabs",
|
|
2314
2447
|
"corpusVersion": "1.0.0"
|
|
2315
2448
|
},
|
|
2316
2449
|
{
|
|
2317
|
-
"chunkIndex":
|
|
2450
|
+
"chunkIndex": 18,
|
|
2318
2451
|
"chunkKind": "authoring_manifest",
|
|
2319
2452
|
"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
2453
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
@@ -2324,7 +2457,7 @@
|
|
|
2324
2457
|
"corpusVersion": "1.0.0"
|
|
2325
2458
|
},
|
|
2326
2459
|
{
|
|
2327
|
-
"chunkIndex":
|
|
2460
|
+
"chunkIndex": 19,
|
|
2328
2461
|
"chunkKind": "authoring_manifest",
|
|
2329
2462
|
"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
2463
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
@@ -2334,7 +2467,7 @@
|
|
|
2334
2467
|
"corpusVersion": "1.0.0"
|
|
2335
2468
|
},
|
|
2336
2469
|
{
|
|
2337
|
-
"chunkIndex":
|
|
2470
|
+
"chunkIndex": 20,
|
|
2338
2471
|
"chunkKind": "authoring_manifest",
|
|
2339
2472
|
"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
2473
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/praxis-tabs-authoring-manifest.ts",
|
|
@@ -2344,7 +2477,7 @@
|
|
|
2344
2477
|
"corpusVersion": "1.0.0"
|
|
2345
2478
|
},
|
|
2346
2479
|
{
|
|
2347
|
-
"chunkIndex":
|
|
2480
|
+
"chunkIndex": 21,
|
|
2348
2481
|
"chunkKind": "context_pack",
|
|
2349
2482
|
"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).\"]}}",
|
|
2350
2483
|
"sourcePointer": "projects/praxis-tabs/src/lib/ai/tabs-context-pack.ts",
|
|
@@ -2354,7 +2487,7 @@
|
|
|
2354
2487
|
"corpusVersion": "1.0.0"
|
|
2355
2488
|
},
|
|
2356
2489
|
{
|
|
2357
|
-
"chunkIndex":
|
|
2490
|
+
"chunkIndex": 22,
|
|
2358
2491
|
"chunkKind": "recipe",
|
|
2359
2492
|
"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\"}}]}}",
|
|
2360
2493
|
"sourcePointer": "examples/ai-recipes/praxis-tabs.json",
|
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.88",
|
|
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.88",
|
|
11
|
+
"@praxisui/dynamic-fields": "^9.0.0-beta.88",
|
|
12
|
+
"@praxisui/settings-panel": "^9.0.0-beta.88",
|
|
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.88",
|
|
16
16
|
"rxjs": "~7.8.0"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|