@praxisui/tabs 9.0.0-beta.85 → 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/fesm2022/praxisui-tabs.mjs +120 -149
- 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",
|
|
@@ -10,7 +10,7 @@ import { MatIconModule } from '@angular/material/icon';
|
|
|
10
10
|
import * as i10 from '@angular/material/tooltip';
|
|
11
11
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
12
12
|
import * as i1 from '@praxisui/core';
|
|
13
|
-
import { providePraxisI18n, PraxisI18nService, PraxisIconDirective, providePraxisI18nConfig, deepMerge, ASYNC_CONFIG_STORAGE, ComponentKeyService, LoggerService, EmptyStateCardComponent, DynamicWidgetLoaderDirective, ComponentMetadataRegistry } from '@praxisui/core';
|
|
13
|
+
import { providePraxisI18n, PraxisI18nService, PraxisIconDirective, PraxisIconButtonComponent, providePraxisI18nConfig, deepMerge, ASYNC_CONFIG_STORAGE, ComponentKeyService, LoggerService, EmptyStateCardComponent, DynamicWidgetLoaderDirective, ComponentMetadataRegistry } from '@praxisui/core';
|
|
14
14
|
import * as i6 from '@angular/material/button';
|
|
15
15
|
import { MatButtonModule } from '@angular/material/button';
|
|
16
16
|
import * as i2_1 from '@angular/forms';
|
|
@@ -1058,28 +1058,26 @@ class PraxisTabsConfigEditor {
|
|
|
1058
1058
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.selectedIndex', 'Indice selecionado') }}</mat-label>
|
|
1059
1059
|
<input matInput type="number" [(ngModel)]="group.selectedIndex" (ngModelChange)="onAppearanceChange()" />
|
|
1060
1060
|
<button
|
|
1061
|
-
|
|
1061
|
+
praxisIconButton="help_outline"
|
|
1062
|
+
size="dense"
|
|
1062
1063
|
matSuffix
|
|
1063
|
-
class="help-icon-button"
|
|
1064
1064
|
type="button"
|
|
1065
1065
|
[matTooltip]="t('editor.hints.selectedIndex', 'selectedIndex')"
|
|
1066
|
+
[attr.aria-label]="t('editor.hints.selectedIndex', 'selectedIndex')"
|
|
1066
1067
|
matTooltipPosition="above"
|
|
1067
|
-
|
|
1068
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1069
|
-
</button>
|
|
1068
|
+
></button>
|
|
1070
1069
|
</mat-form-field>
|
|
1071
1070
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.animationDuration', 'Duracao da animacao') }}</mat-label>
|
|
1072
1071
|
<input matInput [(ngModel)]="group.animationDuration" (ngModelChange)="onAppearanceChange()" [placeholder]="t('editor.fields.placeholder.animationDuration', '500ms')" />
|
|
1073
1072
|
<button
|
|
1074
|
-
|
|
1073
|
+
praxisIconButton="help_outline"
|
|
1074
|
+
size="dense"
|
|
1075
1075
|
matSuffix
|
|
1076
|
-
class="help-icon-button"
|
|
1077
1076
|
type="button"
|
|
1078
1077
|
[matTooltip]="t('editor.hints.animationDuration', 'animationDuration')"
|
|
1078
|
+
[attr.aria-label]="t('editor.hints.animationDuration', 'animationDuration')"
|
|
1079
1079
|
matTooltipPosition="above"
|
|
1080
|
-
|
|
1081
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1082
|
-
</button>
|
|
1080
|
+
></button>
|
|
1083
1081
|
</mat-form-field>
|
|
1084
1082
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.color', 'Cor (M2)') }}</mat-label>
|
|
1085
1083
|
<select matNativeControl [(ngModel)]="group.color" (ngModelChange)="onAppearanceChange()">
|
|
@@ -1089,15 +1087,14 @@ class PraxisTabsConfigEditor {
|
|
|
1089
1087
|
<option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
|
|
1090
1088
|
</select>
|
|
1091
1089
|
<button
|
|
1092
|
-
|
|
1090
|
+
praxisIconButton="help_outline"
|
|
1091
|
+
size="dense"
|
|
1093
1092
|
matSuffix
|
|
1094
|
-
class="help-icon-button"
|
|
1095
1093
|
type="button"
|
|
1096
1094
|
[matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1095
|
+
[attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1097
1096
|
matTooltipPosition="above"
|
|
1098
|
-
|
|
1099
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1100
|
-
</button>
|
|
1097
|
+
></button>
|
|
1101
1098
|
</mat-form-field>
|
|
1102
1099
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.backgroundColor', 'Cor de fundo (M2)') }}</mat-label>
|
|
1103
1100
|
<select matNativeControl [(ngModel)]="group.backgroundColor" (ngModelChange)="onAppearanceChange()">
|
|
@@ -1107,15 +1104,14 @@ class PraxisTabsConfigEditor {
|
|
|
1107
1104
|
<option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
|
|
1108
1105
|
</select>
|
|
1109
1106
|
<button
|
|
1110
|
-
|
|
1107
|
+
praxisIconButton="help_outline"
|
|
1108
|
+
size="dense"
|
|
1111
1109
|
matSuffix
|
|
1112
|
-
class="help-icon-button"
|
|
1113
1110
|
type="button"
|
|
1114
1111
|
[matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1112
|
+
[attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1115
1113
|
matTooltipPosition="above"
|
|
1116
|
-
|
|
1117
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1118
|
-
</button>
|
|
1114
|
+
></button>
|
|
1119
1115
|
</mat-form-field>
|
|
1120
1116
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.ariaLabel', 'aria-label') }}</mat-label>
|
|
1121
1117
|
<input matInput [(ngModel)]="group.ariaLabel" (ngModelChange)="onAppearanceChange()" />
|
|
@@ -1142,28 +1138,26 @@ class PraxisTabsConfigEditor {
|
|
|
1142
1138
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.selectedIndex', 'Indice selecionado') }}</mat-label>
|
|
1143
1139
|
<input matInput type="number" [(ngModel)]="nav.selectedIndex" (ngModelChange)="onAppearanceChange()" />
|
|
1144
1140
|
<button
|
|
1145
|
-
|
|
1141
|
+
praxisIconButton="help_outline"
|
|
1142
|
+
size="dense"
|
|
1146
1143
|
matSuffix
|
|
1147
|
-
class="help-icon-button"
|
|
1148
1144
|
type="button"
|
|
1149
1145
|
[matTooltip]="t('editor.hints.selectedIndex', 'selectedIndex')"
|
|
1146
|
+
[attr.aria-label]="t('editor.hints.selectedIndex', 'selectedIndex')"
|
|
1150
1147
|
matTooltipPosition="above"
|
|
1151
|
-
|
|
1152
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1153
|
-
</button>
|
|
1148
|
+
></button>
|
|
1154
1149
|
</mat-form-field>
|
|
1155
1150
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.animationDuration', 'Duracao da animacao') }}</mat-label>
|
|
1156
1151
|
<input matInput [(ngModel)]="nav.animationDuration" (ngModelChange)="onAppearanceChange()" [placeholder]="t('editor.fields.placeholder.animationDuration', '500ms')" />
|
|
1157
1152
|
<button
|
|
1158
|
-
|
|
1153
|
+
praxisIconButton="help_outline"
|
|
1154
|
+
size="dense"
|
|
1159
1155
|
matSuffix
|
|
1160
|
-
class="help-icon-button"
|
|
1161
1156
|
type="button"
|
|
1162
1157
|
[matTooltip]="t('editor.hints.animationDuration', 'animationDuration')"
|
|
1158
|
+
[attr.aria-label]="t('editor.hints.animationDuration', 'animationDuration')"
|
|
1163
1159
|
matTooltipPosition="above"
|
|
1164
|
-
|
|
1165
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1166
|
-
</button>
|
|
1160
|
+
></button>
|
|
1167
1161
|
</mat-form-field>
|
|
1168
1162
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.ariaLabel', 'aria-label') }}</mat-label>
|
|
1169
1163
|
<input matInput [(ngModel)]="nav.ariaLabel" (ngModelChange)="onAppearanceChange()" />
|
|
@@ -1179,15 +1173,14 @@ class PraxisTabsConfigEditor {
|
|
|
1179
1173
|
<option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
|
|
1180
1174
|
</select>
|
|
1181
1175
|
<button
|
|
1182
|
-
|
|
1176
|
+
praxisIconButton="help_outline"
|
|
1177
|
+
size="dense"
|
|
1183
1178
|
matSuffix
|
|
1184
|
-
class="help-icon-button"
|
|
1185
1179
|
type="button"
|
|
1186
1180
|
[matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1181
|
+
[attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1187
1182
|
matTooltipPosition="above"
|
|
1188
|
-
|
|
1189
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1190
|
-
</button>
|
|
1183
|
+
></button>
|
|
1191
1184
|
</mat-form-field>
|
|
1192
1185
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.backgroundColor', 'Cor de fundo (M2)') }}</mat-label>
|
|
1193
1186
|
<select matNativeControl [(ngModel)]="nav.backgroundColor" (ngModelChange)="onAppearanceChange()">
|
|
@@ -1197,15 +1190,14 @@ class PraxisTabsConfigEditor {
|
|
|
1197
1190
|
<option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
|
|
1198
1191
|
</select>
|
|
1199
1192
|
<button
|
|
1200
|
-
|
|
1193
|
+
praxisIconButton="help_outline"
|
|
1194
|
+
size="dense"
|
|
1201
1195
|
matSuffix
|
|
1202
|
-
class="help-icon-button"
|
|
1203
1196
|
type="button"
|
|
1204
1197
|
[matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1198
|
+
[attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1205
1199
|
matTooltipPosition="above"
|
|
1206
|
-
|
|
1207
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1208
|
-
</button>
|
|
1200
|
+
></button>
|
|
1209
1201
|
</mat-form-field>
|
|
1210
1202
|
</div>
|
|
1211
1203
|
<div class="editor-row">
|
|
@@ -1291,14 +1283,13 @@ class PraxisTabsConfigEditor {
|
|
|
1291
1283
|
<div class="editor-title-row">
|
|
1292
1284
|
<h3 class="editor-title">{{ t('editor.sections.tokens', 'Tokens (Material 3)') }}</h3>
|
|
1293
1285
|
<button
|
|
1294
|
-
|
|
1295
|
-
|
|
1286
|
+
praxisIconButton="help_outline"
|
|
1287
|
+
size="dense"
|
|
1296
1288
|
type="button"
|
|
1297
1289
|
[matTooltip]="t('editor.hints.tokenValueHelp', 'Valores aceitam CSS vars ou cores hex/rgb.')"
|
|
1290
|
+
[attr.aria-label]="t('editor.hints.tokenValueHelp', 'Valores aceitam CSS vars ou cores hex/rgb.')"
|
|
1298
1291
|
matTooltipPosition="above"
|
|
1299
|
-
|
|
1300
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1301
|
-
</button>
|
|
1292
|
+
></button>
|
|
1302
1293
|
</div>
|
|
1303
1294
|
<div class="editor-grid two">
|
|
1304
1295
|
@for (token of tokenList; track token) {
|
|
@@ -1337,9 +1328,9 @@ class PraxisTabsConfigEditor {
|
|
|
1337
1328
|
<div class="editor-card">
|
|
1338
1329
|
<div class="editor-card-header">
|
|
1339
1330
|
<strong class="editor-card-title">{{ t('editor.cards.tab', 'Aba') }} #{{ i+1 }}</strong>
|
|
1340
|
-
<button
|
|
1341
|
-
<button
|
|
1342
|
-
<button
|
|
1331
|
+
<button praxisIconButton="arrow_upward" size="compact" type="button" (click)="moveTab(i, -1)" [disabled]="i===0" [matTooltip]="t('editor.actions.moveTabUp', 'Mover aba para cima')" [attr.aria-label]="t('editor.actions.moveTabUp', 'Mover aba para cima')"></button>
|
|
1332
|
+
<button praxisIconButton="arrow_downward" size="compact" type="button" (click)="moveTab(i, 1)" [disabled]="i===editedConfig.tabs!.length-1" [matTooltip]="t('editor.actions.moveTabDown', 'Mover aba para baixo')" [attr.aria-label]="t('editor.actions.moveTabDown', 'Mover aba para baixo')"></button>
|
|
1333
|
+
<button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeTab(i)" [matTooltip]="t('editor.actions.removeTab', 'Remover aba')" [attr.aria-label]="t('editor.actions.removeTab', 'Remover aba')"></button>
|
|
1343
1334
|
</div>
|
|
1344
1335
|
<div class="editor-grid two tight">
|
|
1345
1336
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.id', 'ID') }}</mat-label>
|
|
@@ -1395,11 +1386,9 @@ class PraxisTabsConfigEditor {
|
|
|
1395
1386
|
@for (w of tab.widgets; track w; let wi = $index) {
|
|
1396
1387
|
<div cdkDrag class="editor-card dashed">
|
|
1397
1388
|
<div class="editor-card-header">
|
|
1398
|
-
<button
|
|
1399
|
-
<mat-icon [praxisIcon]="'drag_indicator'"></mat-icon>
|
|
1400
|
-
</button>
|
|
1389
|
+
<button praxisIconButton="drag_indicator" size="compact" type="button" cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')"></button>
|
|
1401
1390
|
<strong class="editor-card-title">{{ getCompName(w.id) }}</strong>
|
|
1402
|
-
<button
|
|
1391
|
+
<button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeWidgetFromTab(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"></button>
|
|
1403
1392
|
</div>
|
|
1404
1393
|
<div class="editor-grid two tight">
|
|
1405
1394
|
<mat-form-field appearance="outline">
|
|
@@ -1443,9 +1432,9 @@ class PraxisTabsConfigEditor {
|
|
|
1443
1432
|
<div class="editor-card">
|
|
1444
1433
|
<div class="editor-card-header">
|
|
1445
1434
|
<strong class="editor-card-title">{{ t('editor.cards.link', 'Link') }} #{{ i+1 }}</strong>
|
|
1446
|
-
<button
|
|
1447
|
-
<button
|
|
1448
|
-
<button
|
|
1435
|
+
<button praxisIconButton="arrow_upward" size="compact" type="button" (click)="moveLink(i, -1)" [disabled]="i===0" [matTooltip]="t('editor.actions.moveLinkUp', 'Mover link para cima')" [attr.aria-label]="t('editor.actions.moveLinkUp', 'Mover link para cima')"></button>
|
|
1436
|
+
<button praxisIconButton="arrow_downward" size="compact" type="button" (click)="moveLink(i, 1)" [disabled]="i===nav.links!.length-1" [matTooltip]="t('editor.actions.moveLinkDown', 'Mover link para baixo')" [attr.aria-label]="t('editor.actions.moveLinkDown', 'Mover link para baixo')"></button>
|
|
1437
|
+
<button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeLink(i)" [matTooltip]="t('editor.actions.removeLink', 'Remover link')" [attr.aria-label]="t('editor.actions.removeLink', 'Remover link')"></button>
|
|
1449
1438
|
</div>
|
|
1450
1439
|
<div class="editor-grid two tight">
|
|
1451
1440
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.id', 'ID') }}</mat-label>
|
|
@@ -1491,11 +1480,9 @@ class PraxisTabsConfigEditor {
|
|
|
1491
1480
|
@for (w of l.widgets; track w; let wi = $index) {
|
|
1492
1481
|
<div cdkDrag class="editor-card dashed">
|
|
1493
1482
|
<div class="editor-card-header">
|
|
1494
|
-
<button
|
|
1495
|
-
<mat-icon [praxisIcon]="'drag_indicator'"></mat-icon>
|
|
1496
|
-
</button>
|
|
1483
|
+
<button praxisIconButton="drag_indicator" size="compact" type="button" cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')"></button>
|
|
1497
1484
|
<strong class="editor-card-title">{{ getCompName(w.id) }}</strong>
|
|
1498
|
-
<button
|
|
1485
|
+
<button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeWidgetFromLink(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"></button>
|
|
1499
1486
|
</div>
|
|
1500
1487
|
<div class="editor-grid two tight">
|
|
1501
1488
|
<mat-form-field appearance="outline">
|
|
@@ -1522,7 +1509,7 @@ class PraxisTabsConfigEditor {
|
|
|
1522
1509
|
</mat-tab>
|
|
1523
1510
|
</mat-tab-group>
|
|
1524
1511
|
</div>
|
|
1525
|
-
`, isInline: true, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.editor-shell{display:grid;gap:12px}.editor-topbar{display:flex;align-items:start;justify-content:flex-start}.editor-mode-field{width:min(320px,100%)}.editor-diagnostics{display:grid;gap:8px}.editor-diagnostics-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.editor-diagnostic{display:grid;gap:4px;padding:10px 12px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface)}.editor-diagnostic code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:var(--md-sys-color-on-surface-variant)}.editor-diagnostic.level-error{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error)}.editor-diagnostic.level-warning{background:var(--md-sys-color-tertiary-container, var(--md-sys-color-surface-container));color:var(--md-sys-color-on-tertiary-container, var(--md-sys-color-on-surface));border-color:var(--md-sys-color-outline-variant)}.editor-tabs{--editor-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--editor-border: 1px solid var(--md-sys-color-outline-variant);--editor-radius: 12px;--editor-muted: var(--md-sys-color-on-surface-variant)}.editor-section{padding:12px;display:grid;gap:12px;background:var(--editor-surface);border:var(--editor-border);border-radius:var(--editor-radius)}.editor-section-lg{gap:16px}.editor-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.editor-grid{display:grid;gap:12px}.editor-grid.two{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.editor-grid.tight{gap:8px}.editor-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.editor-muted{color:var(--editor-muted)}.editor-title{margin:6px 0 8px;font-size:1rem}.editor-title-row{display:flex;align-items:center;gap:8px}.editor-code{white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:8px;border-radius:6px;border:1px solid var(--md-sys-color-outline-variant)}.editor-card{border:1px solid var(--md-sys-color-outline-variant);padding:10px;border-radius:10px;display:grid;gap:8px;background:var(--md-sys-color-surface)}.editor-card.dashed{border-style:dashed}.editor-card-header{display:flex;align-items:center;gap:8px}.editor-card-title{flex:1;font-weight:600}.editor-divider{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.editor-spacer{flex:1}.editor-field-min{min-width:260px}.editor-section .editor-field-min{width:260px;max-width:260px}.editor-field-240{width:240px}.editor-section .editor-field-240{width:240px;max-width:240px}.editor-json{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.editor-section .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.editor-section .mat-mdc-form-field.full{max-width:none}.
|
|
1512
|
+
`, isInline: true, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.editor-shell{display:grid;gap:12px}.editor-topbar{display:flex;align-items:start;justify-content:flex-start}.editor-mode-field{width:min(320px,100%)}.editor-diagnostics{display:grid;gap:8px}.editor-diagnostics-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.editor-diagnostic{display:grid;gap:4px;padding:10px 12px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface)}.editor-diagnostic code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:var(--md-sys-color-on-surface-variant)}.editor-diagnostic.level-error{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error)}.editor-diagnostic.level-warning{background:var(--md-sys-color-tertiary-container, var(--md-sys-color-surface-container));color:var(--md-sys-color-on-tertiary-container, var(--md-sys-color-on-surface));border-color:var(--md-sys-color-outline-variant)}.editor-tabs{--editor-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--editor-border: 1px solid var(--md-sys-color-outline-variant);--editor-radius: 12px;--editor-muted: var(--md-sys-color-on-surface-variant)}.editor-section{padding:12px;display:grid;gap:12px;background:var(--editor-surface);border:var(--editor-border);border-radius:var(--editor-radius)}.editor-section-lg{gap:16px}.editor-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.editor-grid{display:grid;gap:12px}.editor-grid.two{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.editor-grid.tight{gap:8px}.editor-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.editor-muted{color:var(--editor-muted)}.editor-title{margin:6px 0 8px;font-size:1rem}.editor-title-row{display:flex;align-items:center;gap:8px}.editor-code{white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:8px;border-radius:6px;border:1px solid var(--md-sys-color-outline-variant)}.editor-card{border:1px solid var(--md-sys-color-outline-variant);padding:10px;border-radius:10px;display:grid;gap:8px;background:var(--md-sys-color-surface)}.editor-card.dashed{border-style:dashed}.editor-card-header{display:flex;align-items:center;gap:8px}.editor-card-title{flex:1;font-weight:600}.editor-divider{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.editor-spacer{flex:1}.editor-field-min{min-width:260px}.editor-section .editor-field-min{width:260px;max-width:260px}.editor-field-240{width:240px}.editor-section .editor-field-240{width:240px;max-width:240px}.editor-json{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.editor-section .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.editor-section .mat-mdc-form-field.full{max-width:none}.editor-icon-action--danger{color:var(--md-sys-color-error)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2_1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2_1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2_1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2_1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2_1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2_1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2_1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i8.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
|
|
1526
1513
|
}
|
|
1527
1514
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTabsConfigEditor, decorators: [{
|
|
1528
1515
|
type: Component,
|
|
@@ -1533,6 +1520,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1533
1520
|
MatInputModule,
|
|
1534
1521
|
MatIconModule,
|
|
1535
1522
|
PraxisIconDirective,
|
|
1523
|
+
PraxisIconButtonComponent,
|
|
1536
1524
|
MatButtonModule,
|
|
1537
1525
|
MatSlideToggleModule,
|
|
1538
1526
|
DragDropModule,
|
|
@@ -1600,28 +1588,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1600
1588
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.selectedIndex', 'Indice selecionado') }}</mat-label>
|
|
1601
1589
|
<input matInput type="number" [(ngModel)]="group.selectedIndex" (ngModelChange)="onAppearanceChange()" />
|
|
1602
1590
|
<button
|
|
1603
|
-
|
|
1591
|
+
praxisIconButton="help_outline"
|
|
1592
|
+
size="dense"
|
|
1604
1593
|
matSuffix
|
|
1605
|
-
class="help-icon-button"
|
|
1606
1594
|
type="button"
|
|
1607
1595
|
[matTooltip]="t('editor.hints.selectedIndex', 'selectedIndex')"
|
|
1596
|
+
[attr.aria-label]="t('editor.hints.selectedIndex', 'selectedIndex')"
|
|
1608
1597
|
matTooltipPosition="above"
|
|
1609
|
-
|
|
1610
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1611
|
-
</button>
|
|
1598
|
+
></button>
|
|
1612
1599
|
</mat-form-field>
|
|
1613
1600
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.animationDuration', 'Duracao da animacao') }}</mat-label>
|
|
1614
1601
|
<input matInput [(ngModel)]="group.animationDuration" (ngModelChange)="onAppearanceChange()" [placeholder]="t('editor.fields.placeholder.animationDuration', '500ms')" />
|
|
1615
1602
|
<button
|
|
1616
|
-
|
|
1603
|
+
praxisIconButton="help_outline"
|
|
1604
|
+
size="dense"
|
|
1617
1605
|
matSuffix
|
|
1618
|
-
class="help-icon-button"
|
|
1619
1606
|
type="button"
|
|
1620
1607
|
[matTooltip]="t('editor.hints.animationDuration', 'animationDuration')"
|
|
1608
|
+
[attr.aria-label]="t('editor.hints.animationDuration', 'animationDuration')"
|
|
1621
1609
|
matTooltipPosition="above"
|
|
1622
|
-
|
|
1623
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1624
|
-
</button>
|
|
1610
|
+
></button>
|
|
1625
1611
|
</mat-form-field>
|
|
1626
1612
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.color', 'Cor (M2)') }}</mat-label>
|
|
1627
1613
|
<select matNativeControl [(ngModel)]="group.color" (ngModelChange)="onAppearanceChange()">
|
|
@@ -1631,15 +1617,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1631
1617
|
<option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
|
|
1632
1618
|
</select>
|
|
1633
1619
|
<button
|
|
1634
|
-
|
|
1620
|
+
praxisIconButton="help_outline"
|
|
1621
|
+
size="dense"
|
|
1635
1622
|
matSuffix
|
|
1636
|
-
class="help-icon-button"
|
|
1637
1623
|
type="button"
|
|
1638
1624
|
[matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1625
|
+
[attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1639
1626
|
matTooltipPosition="above"
|
|
1640
|
-
|
|
1641
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1642
|
-
</button>
|
|
1627
|
+
></button>
|
|
1643
1628
|
</mat-form-field>
|
|
1644
1629
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.backgroundColor', 'Cor de fundo (M2)') }}</mat-label>
|
|
1645
1630
|
<select matNativeControl [(ngModel)]="group.backgroundColor" (ngModelChange)="onAppearanceChange()">
|
|
@@ -1649,15 +1634,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1649
1634
|
<option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
|
|
1650
1635
|
</select>
|
|
1651
1636
|
<button
|
|
1652
|
-
|
|
1637
|
+
praxisIconButton="help_outline"
|
|
1638
|
+
size="dense"
|
|
1653
1639
|
matSuffix
|
|
1654
|
-
class="help-icon-button"
|
|
1655
1640
|
type="button"
|
|
1656
1641
|
[matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1642
|
+
[attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1657
1643
|
matTooltipPosition="above"
|
|
1658
|
-
|
|
1659
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1660
|
-
</button>
|
|
1644
|
+
></button>
|
|
1661
1645
|
</mat-form-field>
|
|
1662
1646
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.ariaLabel', 'aria-label') }}</mat-label>
|
|
1663
1647
|
<input matInput [(ngModel)]="group.ariaLabel" (ngModelChange)="onAppearanceChange()" />
|
|
@@ -1684,28 +1668,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1684
1668
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.selectedIndex', 'Indice selecionado') }}</mat-label>
|
|
1685
1669
|
<input matInput type="number" [(ngModel)]="nav.selectedIndex" (ngModelChange)="onAppearanceChange()" />
|
|
1686
1670
|
<button
|
|
1687
|
-
|
|
1671
|
+
praxisIconButton="help_outline"
|
|
1672
|
+
size="dense"
|
|
1688
1673
|
matSuffix
|
|
1689
|
-
class="help-icon-button"
|
|
1690
1674
|
type="button"
|
|
1691
1675
|
[matTooltip]="t('editor.hints.selectedIndex', 'selectedIndex')"
|
|
1676
|
+
[attr.aria-label]="t('editor.hints.selectedIndex', 'selectedIndex')"
|
|
1692
1677
|
matTooltipPosition="above"
|
|
1693
|
-
|
|
1694
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1695
|
-
</button>
|
|
1678
|
+
></button>
|
|
1696
1679
|
</mat-form-field>
|
|
1697
1680
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.animationDuration', 'Duracao da animacao') }}</mat-label>
|
|
1698
1681
|
<input matInput [(ngModel)]="nav.animationDuration" (ngModelChange)="onAppearanceChange()" [placeholder]="t('editor.fields.placeholder.animationDuration', '500ms')" />
|
|
1699
1682
|
<button
|
|
1700
|
-
|
|
1683
|
+
praxisIconButton="help_outline"
|
|
1684
|
+
size="dense"
|
|
1701
1685
|
matSuffix
|
|
1702
|
-
class="help-icon-button"
|
|
1703
1686
|
type="button"
|
|
1704
1687
|
[matTooltip]="t('editor.hints.animationDuration', 'animationDuration')"
|
|
1688
|
+
[attr.aria-label]="t('editor.hints.animationDuration', 'animationDuration')"
|
|
1705
1689
|
matTooltipPosition="above"
|
|
1706
|
-
|
|
1707
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1708
|
-
</button>
|
|
1690
|
+
></button>
|
|
1709
1691
|
</mat-form-field>
|
|
1710
1692
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.ariaLabel', 'aria-label') }}</mat-label>
|
|
1711
1693
|
<input matInput [(ngModel)]="nav.ariaLabel" (ngModelChange)="onAppearanceChange()" />
|
|
@@ -1721,15 +1703,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1721
1703
|
<option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
|
|
1722
1704
|
</select>
|
|
1723
1705
|
<button
|
|
1724
|
-
|
|
1706
|
+
praxisIconButton="help_outline"
|
|
1707
|
+
size="dense"
|
|
1725
1708
|
matSuffix
|
|
1726
|
-
class="help-icon-button"
|
|
1727
1709
|
type="button"
|
|
1728
1710
|
[matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1711
|
+
[attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1729
1712
|
matTooltipPosition="above"
|
|
1730
|
-
|
|
1731
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1732
|
-
</button>
|
|
1713
|
+
></button>
|
|
1733
1714
|
</mat-form-field>
|
|
1734
1715
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.backgroundColor', 'Cor de fundo (M2)') }}</mat-label>
|
|
1735
1716
|
<select matNativeControl [(ngModel)]="nav.backgroundColor" (ngModelChange)="onAppearanceChange()">
|
|
@@ -1739,15 +1720,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1739
1720
|
<option value="warn">{{ t('editor.options.warn', 'Warn') }}</option>
|
|
1740
1721
|
</select>
|
|
1741
1722
|
<button
|
|
1742
|
-
|
|
1723
|
+
praxisIconButton="help_outline"
|
|
1724
|
+
size="dense"
|
|
1743
1725
|
matSuffix
|
|
1744
|
-
class="help-icon-button"
|
|
1745
1726
|
type="button"
|
|
1746
1727
|
[matTooltip]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1728
|
+
[attr.aria-label]="t('editor.hints.preferTokens', 'Preferir tokens em Estilo.')"
|
|
1747
1729
|
matTooltipPosition="above"
|
|
1748
|
-
|
|
1749
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1750
|
-
</button>
|
|
1730
|
+
></button>
|
|
1751
1731
|
</mat-form-field>
|
|
1752
1732
|
</div>
|
|
1753
1733
|
<div class="editor-row">
|
|
@@ -1833,14 +1813,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1833
1813
|
<div class="editor-title-row">
|
|
1834
1814
|
<h3 class="editor-title">{{ t('editor.sections.tokens', 'Tokens (Material 3)') }}</h3>
|
|
1835
1815
|
<button
|
|
1836
|
-
|
|
1837
|
-
|
|
1816
|
+
praxisIconButton="help_outline"
|
|
1817
|
+
size="dense"
|
|
1838
1818
|
type="button"
|
|
1839
1819
|
[matTooltip]="t('editor.hints.tokenValueHelp', 'Valores aceitam CSS vars ou cores hex/rgb.')"
|
|
1820
|
+
[attr.aria-label]="t('editor.hints.tokenValueHelp', 'Valores aceitam CSS vars ou cores hex/rgb.')"
|
|
1840
1821
|
matTooltipPosition="above"
|
|
1841
|
-
|
|
1842
|
-
<mat-icon [praxisIcon]="'help_outline'"></mat-icon>
|
|
1843
|
-
</button>
|
|
1822
|
+
></button>
|
|
1844
1823
|
</div>
|
|
1845
1824
|
<div class="editor-grid two">
|
|
1846
1825
|
@for (token of tokenList; track token) {
|
|
@@ -1879,9 +1858,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1879
1858
|
<div class="editor-card">
|
|
1880
1859
|
<div class="editor-card-header">
|
|
1881
1860
|
<strong class="editor-card-title">{{ t('editor.cards.tab', 'Aba') }} #{{ i+1 }}</strong>
|
|
1882
|
-
<button
|
|
1883
|
-
<button
|
|
1884
|
-
<button
|
|
1861
|
+
<button praxisIconButton="arrow_upward" size="compact" type="button" (click)="moveTab(i, -1)" [disabled]="i===0" [matTooltip]="t('editor.actions.moveTabUp', 'Mover aba para cima')" [attr.aria-label]="t('editor.actions.moveTabUp', 'Mover aba para cima')"></button>
|
|
1862
|
+
<button praxisIconButton="arrow_downward" size="compact" type="button" (click)="moveTab(i, 1)" [disabled]="i===editedConfig.tabs!.length-1" [matTooltip]="t('editor.actions.moveTabDown', 'Mover aba para baixo')" [attr.aria-label]="t('editor.actions.moveTabDown', 'Mover aba para baixo')"></button>
|
|
1863
|
+
<button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeTab(i)" [matTooltip]="t('editor.actions.removeTab', 'Remover aba')" [attr.aria-label]="t('editor.actions.removeTab', 'Remover aba')"></button>
|
|
1885
1864
|
</div>
|
|
1886
1865
|
<div class="editor-grid two tight">
|
|
1887
1866
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.id', 'ID') }}</mat-label>
|
|
@@ -1937,11 +1916,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1937
1916
|
@for (w of tab.widgets; track w; let wi = $index) {
|
|
1938
1917
|
<div cdkDrag class="editor-card dashed">
|
|
1939
1918
|
<div class="editor-card-header">
|
|
1940
|
-
<button
|
|
1941
|
-
<mat-icon [praxisIcon]="'drag_indicator'"></mat-icon>
|
|
1942
|
-
</button>
|
|
1919
|
+
<button praxisIconButton="drag_indicator" size="compact" type="button" cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')"></button>
|
|
1943
1920
|
<strong class="editor-card-title">{{ getCompName(w.id) }}</strong>
|
|
1944
|
-
<button
|
|
1921
|
+
<button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeWidgetFromTab(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"></button>
|
|
1945
1922
|
</div>
|
|
1946
1923
|
<div class="editor-grid two tight">
|
|
1947
1924
|
<mat-form-field appearance="outline">
|
|
@@ -1985,9 +1962,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1985
1962
|
<div class="editor-card">
|
|
1986
1963
|
<div class="editor-card-header">
|
|
1987
1964
|
<strong class="editor-card-title">{{ t('editor.cards.link', 'Link') }} #{{ i+1 }}</strong>
|
|
1988
|
-
<button
|
|
1989
|
-
<button
|
|
1990
|
-
<button
|
|
1965
|
+
<button praxisIconButton="arrow_upward" size="compact" type="button" (click)="moveLink(i, -1)" [disabled]="i===0" [matTooltip]="t('editor.actions.moveLinkUp', 'Mover link para cima')" [attr.aria-label]="t('editor.actions.moveLinkUp', 'Mover link para cima')"></button>
|
|
1966
|
+
<button praxisIconButton="arrow_downward" size="compact" type="button" (click)="moveLink(i, 1)" [disabled]="i===nav.links!.length-1" [matTooltip]="t('editor.actions.moveLinkDown', 'Mover link para baixo')" [attr.aria-label]="t('editor.actions.moveLinkDown', 'Mover link para baixo')"></button>
|
|
1967
|
+
<button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeLink(i)" [matTooltip]="t('editor.actions.removeLink', 'Remover link')" [attr.aria-label]="t('editor.actions.removeLink', 'Remover link')"></button>
|
|
1991
1968
|
</div>
|
|
1992
1969
|
<div class="editor-grid two tight">
|
|
1993
1970
|
<mat-form-field appearance="outline"><mat-label>{{ t('editor.fields.id', 'ID') }}</mat-label>
|
|
@@ -2033,11 +2010,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2033
2010
|
@for (w of l.widgets; track w; let wi = $index) {
|
|
2034
2011
|
<div cdkDrag class="editor-card dashed">
|
|
2035
2012
|
<div class="editor-card-header">
|
|
2036
|
-
<button
|
|
2037
|
-
<mat-icon [praxisIcon]="'drag_indicator'"></mat-icon>
|
|
2038
|
-
</button>
|
|
2013
|
+
<button praxisIconButton="drag_indicator" size="compact" type="button" cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')"></button>
|
|
2039
2014
|
<strong class="editor-card-title">{{ getCompName(w.id) }}</strong>
|
|
2040
|
-
<button
|
|
2015
|
+
<button praxisIconButton="delete" size="compact" type="button" class="editor-icon-action--danger" (click)="removeWidgetFromLink(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"></button>
|
|
2041
2016
|
</div>
|
|
2042
2017
|
<div class="editor-grid two tight">
|
|
2043
2018
|
<mat-form-field appearance="outline">
|
|
@@ -2064,7 +2039,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2064
2039
|
</mat-tab>
|
|
2065
2040
|
</mat-tab-group>
|
|
2066
2041
|
</div>
|
|
2067
|
-
`, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.editor-shell{display:grid;gap:12px}.editor-topbar{display:flex;align-items:start;justify-content:flex-start}.editor-mode-field{width:min(320px,100%)}.editor-diagnostics{display:grid;gap:8px}.editor-diagnostics-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.editor-diagnostic{display:grid;gap:4px;padding:10px 12px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface)}.editor-diagnostic code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:var(--md-sys-color-on-surface-variant)}.editor-diagnostic.level-error{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error)}.editor-diagnostic.level-warning{background:var(--md-sys-color-tertiary-container, var(--md-sys-color-surface-container));color:var(--md-sys-color-on-tertiary-container, var(--md-sys-color-on-surface));border-color:var(--md-sys-color-outline-variant)}.editor-tabs{--editor-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--editor-border: 1px solid var(--md-sys-color-outline-variant);--editor-radius: 12px;--editor-muted: var(--md-sys-color-on-surface-variant)}.editor-section{padding:12px;display:grid;gap:12px;background:var(--editor-surface);border:var(--editor-border);border-radius:var(--editor-radius)}.editor-section-lg{gap:16px}.editor-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.editor-grid{display:grid;gap:12px}.editor-grid.two{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.editor-grid.tight{gap:8px}.editor-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.editor-muted{color:var(--editor-muted)}.editor-title{margin:6px 0 8px;font-size:1rem}.editor-title-row{display:flex;align-items:center;gap:8px}.editor-code{white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:8px;border-radius:6px;border:1px solid var(--md-sys-color-outline-variant)}.editor-card{border:1px solid var(--md-sys-color-outline-variant);padding:10px;border-radius:10px;display:grid;gap:8px;background:var(--md-sys-color-surface)}.editor-card.dashed{border-style:dashed}.editor-card-header{display:flex;align-items:center;gap:8px}.editor-card-title{flex:1;font-weight:600}.editor-divider{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.editor-spacer{flex:1}.editor-field-min{min-width:260px}.editor-section .editor-field-min{width:260px;max-width:260px}.editor-field-240{width:240px}.editor-section .editor-field-240{width:240px;max-width:240px}.editor-json{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.editor-section .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.editor-section .mat-mdc-form-field.full{max-width:none}.
|
|
2042
|
+
`, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.editor-shell{display:grid;gap:12px}.editor-topbar{display:flex;align-items:start;justify-content:flex-start}.editor-mode-field{width:min(320px,100%)}.editor-diagnostics{display:grid;gap:8px}.editor-diagnostics-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.editor-diagnostic{display:grid;gap:4px;padding:10px 12px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface)}.editor-diagnostic code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:var(--md-sys-color-on-surface-variant)}.editor-diagnostic.level-error{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error)}.editor-diagnostic.level-warning{background:var(--md-sys-color-tertiary-container, var(--md-sys-color-surface-container));color:var(--md-sys-color-on-tertiary-container, var(--md-sys-color-on-surface));border-color:var(--md-sys-color-outline-variant)}.editor-tabs{--editor-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--editor-border: 1px solid var(--md-sys-color-outline-variant);--editor-radius: 12px;--editor-muted: var(--md-sys-color-on-surface-variant)}.editor-section{padding:12px;display:grid;gap:12px;background:var(--editor-surface);border:var(--editor-border);border-radius:var(--editor-radius)}.editor-section-lg{gap:16px}.editor-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.editor-grid{display:grid;gap:12px}.editor-grid.two{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.editor-grid.tight{gap:8px}.editor-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.editor-muted{color:var(--editor-muted)}.editor-title{margin:6px 0 8px;font-size:1rem}.editor-title-row{display:flex;align-items:center;gap:8px}.editor-code{white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:8px;border-radius:6px;border:1px solid var(--md-sys-color-outline-variant)}.editor-card{border:1px solid var(--md-sys-color-outline-variant);padding:10px;border-radius:10px;display:grid;gap:8px;background:var(--md-sys-color-surface)}.editor-card.dashed{border-style:dashed}.editor-card-header{display:flex;align-items:center;gap:8px}.editor-card-title{flex:1;font-weight:600}.editor-divider{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.editor-spacer{flex:1}.editor-field-min{min-width:260px}.editor-section .editor-field-min{width:260px;max-width:260px}.editor-field-240{width:240px}.editor-section .editor-field-240{width:240px;max-width:240px}.editor-json{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.editor-section .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.editor-section .mat-mdc-form-field.full{max-width:none}.editor-icon-action--danger{color:var(--md-sys-color-error)}\n"] }]
|
|
2068
2043
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
2069
2044
|
type: Inject,
|
|
2070
2045
|
args: [SETTINGS_PANEL_DATA]
|
|
@@ -2196,7 +2171,7 @@ class TabsQuickSetupComponent {
|
|
|
2196
2171
|
@for (l of model.labels; track l; let i = $index) {
|
|
2197
2172
|
<div class="chip">
|
|
2198
2173
|
<span>{{ l }}</span>
|
|
2199
|
-
<button
|
|
2174
|
+
<button praxisIconButton="close" size="dense" type="button" (click)="removeLabel(i)" [attr.aria-label]="t('editor.actions.removeLabel', 'Remover rotulo')"></button>
|
|
2200
2175
|
</div>
|
|
2201
2176
|
}
|
|
2202
2177
|
</div>
|
|
@@ -2209,7 +2184,7 @@ class TabsQuickSetupComponent {
|
|
|
2209
2184
|
<mat-slide-toggle [(ngModel)]="model.stretchTabs" (ngModelChange)="updateState()">{{ t('editor.toggles.stretchTabs', 'Esticar abas') }}</mat-slide-toggle>
|
|
2210
2185
|
</div>
|
|
2211
2186
|
</div>
|
|
2212
|
-
`, isInline: true, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.setup-root{display:grid;gap:12px;padding:8px;background:var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));border:1px solid var(--md-sys-color-outline-variant);border-radius:12px}.setup-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.setup-row.wrap{flex-wrap:wrap}.setup-grid{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:start}.setup-root .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.chip{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:16px;background:var(--md-sys-color-surface)}.hint{color:var(--md-sys-color-on-surface-variant)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2_1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2_1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2_1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "
|
|
2187
|
+
`, isInline: true, styles: [":host{display:block;color:var(--md-sys-color-on-surface)}.setup-root{display:grid;gap:12px;padding:8px;background:var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));border:1px solid var(--md-sys-color-outline-variant);border-radius:12px}.setup-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.setup-row.wrap{flex-wrap:wrap}.setup-grid{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:start}.setup-root .mat-mdc-form-field{width:100%;max-width:520px;--mdc-outlined-text-field-container-height: 48px;--mdc-outlined-text-field-outline-color: var(--md-sys-color-outline-variant);--mdc-outlined-text-field-hover-outline-color: var(--md-sys-color-outline);--mdc-outlined-text-field-focus-outline-color: var(--md-sys-color-primary);--mdc-outlined-text-field-error-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-focus-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-error-hover-outline-color: var(--md-sys-color-error);--mdc-outlined-text-field-label-text-color: var(--md-sys-color-on-surface-variant);--mdc-outlined-text-field-input-text-color: var(--md-sys-color-on-surface);--mdc-outlined-text-field-supporting-text-color: var(--md-sys-color-on-surface-variant)}.chip{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border:1px solid var(--md-sys-color-outline-variant);border-radius:16px;background:var(--md-sys-color-surface)}.hint{color:var(--md-sys-color-on-surface-variant)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2_1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2_1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2_1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i8.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }] });
|
|
2213
2188
|
}
|
|
2214
2189
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TabsQuickSetupComponent, decorators: [{
|
|
2215
2190
|
type: Component,
|
|
@@ -2219,6 +2194,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2219
2194
|
MatInputModule,
|
|
2220
2195
|
MatIconModule,
|
|
2221
2196
|
PraxisIconDirective,
|
|
2197
|
+
PraxisIconButtonComponent,
|
|
2222
2198
|
MatButtonModule,
|
|
2223
2199
|
MatSlideToggleModule
|
|
2224
2200
|
], providers: [providePraxisI18nConfig(PRAXIS_TABS_I18N_CONFIG)], template: `
|
|
@@ -2250,7 +2226,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2250
2226
|
@for (l of model.labels; track l; let i = $index) {
|
|
2251
2227
|
<div class="chip">
|
|
2252
2228
|
<span>{{ l }}</span>
|
|
2253
|
-
<button
|
|
2229
|
+
<button praxisIconButton="close" size="dense" type="button" (click)="removeLabel(i)" [attr.aria-label]="t('editor.actions.removeLabel', 'Remover rotulo')"></button>
|
|
2254
2230
|
</div>
|
|
2255
2231
|
}
|
|
2256
2232
|
</div>
|
|
@@ -4460,39 +4436,36 @@ class PraxisTabs {
|
|
|
4460
4436
|
<span>{{ entry.tab.textLabel }}</span>
|
|
4461
4437
|
@if (config?.behavior?.closeable) {
|
|
4462
4438
|
<button
|
|
4463
|
-
|
|
4439
|
+
praxisIconButton="close"
|
|
4440
|
+
size="dense"
|
|
4464
4441
|
type="button"
|
|
4465
4442
|
(click)="closeTab(entry.index); $event.stopPropagation()"
|
|
4466
4443
|
(keydown.enter)="$event.stopPropagation()"
|
|
4467
4444
|
(keydown.space)="$event.stopPropagation()"
|
|
4468
4445
|
[attr.aria-label]="t('chrome.closeTab', 'Fechar aba')"
|
|
4469
|
-
|
|
4470
|
-
<mat-icon aria-hidden="true" fontIcon="close"></mat-icon>
|
|
4471
|
-
</button>
|
|
4446
|
+
></button>
|
|
4472
4447
|
}
|
|
4473
4448
|
@if (config?.behavior?.reorderable) {
|
|
4474
4449
|
<button
|
|
4475
|
-
|
|
4450
|
+
praxisIconButton="arrow_back"
|
|
4451
|
+
size="dense"
|
|
4476
4452
|
type="button"
|
|
4477
4453
|
(click)="moveTab(entry.index, -1); $event.stopPropagation()"
|
|
4478
4454
|
(keydown.enter)="$event.stopPropagation()"
|
|
4479
4455
|
(keydown.space)="$event.stopPropagation()"
|
|
4480
4456
|
[disabled]="entry.index===0"
|
|
4481
4457
|
[attr.aria-label]="t('chrome.moveTabLeft', 'Mover aba para esquerda')"
|
|
4482
|
-
|
|
4483
|
-
<mat-icon aria-hidden="true" fontIcon="arrow_back"></mat-icon>
|
|
4484
|
-
</button>
|
|
4458
|
+
></button>
|
|
4485
4459
|
<button
|
|
4486
|
-
|
|
4460
|
+
praxisIconButton="arrow_forward"
|
|
4461
|
+
size="dense"
|
|
4487
4462
|
type="button"
|
|
4488
4463
|
(click)="moveTab(entry.index, 1); $event.stopPropagation()"
|
|
4489
4464
|
(keydown.enter)="$event.stopPropagation()"
|
|
4490
4465
|
(keydown.space)="$event.stopPropagation()"
|
|
4491
4466
|
[disabled]="entry.index===(config?.tabs?.length||1)-1"
|
|
4492
4467
|
[attr.aria-label]="t('chrome.moveTabRight', 'Mover aba para direita')"
|
|
4493
|
-
|
|
4494
|
-
<mat-icon aria-hidden="true" fontIcon="arrow_forward"></mat-icon>
|
|
4495
|
-
</button>
|
|
4468
|
+
></button>
|
|
4496
4469
|
}
|
|
4497
4470
|
</ng-template>
|
|
4498
4471
|
@if (shouldRenderGroupBody()) {
|
|
@@ -4554,7 +4527,7 @@ class PraxisTabs {
|
|
|
4554
4527
|
</button>
|
|
4555
4528
|
}
|
|
4556
4529
|
</div>
|
|
4557
|
-
`, isInline: true, styles: [".praxis-tabs-root{position:relative;display:block}.praxis-tabs-group.align-start .mat-mdc-tab-header{justify-content:flex-start}.praxis-tabs-group.align-center .mat-mdc-tab-header{justify-content:center}.praxis-tabs-group.align-end .mat-mdc-tab-header{justify-content:flex-end}.praxis-tabs-group--header-only .mat-mdc-tab-body-wrapper,.praxis-tabs-nav-panel--header-only{display:none}.density-compact .mat-mdc-tab-body-content{padding:8px}.density-comfortable .mat-mdc-tab-body-content{padding:16px}.density-spacious .mat-mdc-tab-body-content{padding:24px}.tabs-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.tabs-ai-assistant-trigger{box-shadow:var(--md-sys-elevation-level2)}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.edit-fab-secondary{right:56px}.tab-empty{padding:16px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.high-contrast{filter:contrast(1.2)}.reduce-motion{--mat-animation-duration: 0ms}.drag-handle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px;cursor:grab}.tab-label-icon{font-size:18px;width:18px;height:18px;margin-right:6px;vertical-align:middle}:host-context(.pdx-gridster-item) .praxis-tabs-root{display:flex;flex-direction:column;height:100%;min-height:0}:host-context(.pdx-gridster-item) .praxis-tabs-group,:host-context(.pdx-gridster-item) .mat-mdc-tab-group{flex:1 1 auto;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{height:100%;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{overflow:auto}:host-context(.pdx-gridster-item) .praxis-tabnav-content{flex:1 1 auto;min-height:0;overflow:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2_1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2_1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "directive", type: i3.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i3.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i3.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i3.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "
|
|
4530
|
+
`, isInline: true, styles: [".praxis-tabs-root{position:relative;display:block}.praxis-tabs-group.align-start .mat-mdc-tab-header{justify-content:flex-start}.praxis-tabs-group.align-center .mat-mdc-tab-header{justify-content:center}.praxis-tabs-group.align-end .mat-mdc-tab-header{justify-content:flex-end}.praxis-tabs-group--header-only .mat-mdc-tab-body-wrapper,.praxis-tabs-nav-panel--header-only{display:none}.density-compact .mat-mdc-tab-body-content{padding:8px}.density-comfortable .mat-mdc-tab-body-content{padding:16px}.density-spacious .mat-mdc-tab-body-content{padding:24px}.tabs-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.tabs-ai-assistant-trigger{box-shadow:var(--md-sys-elevation-level2)}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.edit-fab-secondary{right:56px}.tab-empty{padding:16px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.high-contrast{filter:contrast(1.2)}.reduce-motion{--mat-animation-duration: 0ms}.drag-handle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px;cursor:grab}.tab-label-icon{font-size:18px;width:18px;height:18px;margin-right:6px;vertical-align:middle}:host-context(.pdx-gridster-item) .praxis-tabs-root{display:flex;flex-direction:column;height:100%;min-height:0}:host-context(.pdx-gridster-item) .praxis-tabs-group,:host-context(.pdx-gridster-item) .mat-mdc-tab-group{flex:1 1 auto;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-wrapper,:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{height:100%;min-height:0}:host-context(.pdx-gridster-item) .mat-mdc-tab-body-content{overflow:auto}:host-context(.pdx-gridster-item) .praxis-tabnav-content{flex:1 1 auto;min-height:0;overflow:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2_1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2_1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "directive", type: i3.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i3.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i3.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i3.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone", "variant", "alignment", "density", "iconContainer"] }, { kind: "directive", type: DynamicFieldLoaderDirective, selector: "[dynamicFieldLoader]", inputs: ["fields", "formGroup", "enableExternalControlBinding", "itemTemplate", "debugTrace", "debugTraceLabel", "readonlyMode", "disabledMode", "presentationMode", "visible", "canvasMode"], outputs: ["componentsCreated", "fieldCreated", "fieldDestroyed", "renderError", "canvasMouseEnter", "canvasMouseLeave", "canvasClick", "canvasFocus"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4558
4531
|
}
|
|
4559
4532
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisTabs, decorators: [{
|
|
4560
4533
|
type: Component,
|
|
@@ -4565,6 +4538,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
4565
4538
|
MatIconModule,
|
|
4566
4539
|
MatTooltipModule,
|
|
4567
4540
|
PraxisIconDirective,
|
|
4541
|
+
PraxisIconButtonComponent,
|
|
4568
4542
|
MatButtonModule,
|
|
4569
4543
|
DragDropModule,
|
|
4570
4544
|
EmptyStateCardComponent,
|
|
@@ -4775,39 +4749,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
4775
4749
|
<span>{{ entry.tab.textLabel }}</span>
|
|
4776
4750
|
@if (config?.behavior?.closeable) {
|
|
4777
4751
|
<button
|
|
4778
|
-
|
|
4752
|
+
praxisIconButton="close"
|
|
4753
|
+
size="dense"
|
|
4779
4754
|
type="button"
|
|
4780
4755
|
(click)="closeTab(entry.index); $event.stopPropagation()"
|
|
4781
4756
|
(keydown.enter)="$event.stopPropagation()"
|
|
4782
4757
|
(keydown.space)="$event.stopPropagation()"
|
|
4783
4758
|
[attr.aria-label]="t('chrome.closeTab', 'Fechar aba')"
|
|
4784
|
-
|
|
4785
|
-
<mat-icon aria-hidden="true" fontIcon="close"></mat-icon>
|
|
4786
|
-
</button>
|
|
4759
|
+
></button>
|
|
4787
4760
|
}
|
|
4788
4761
|
@if (config?.behavior?.reorderable) {
|
|
4789
4762
|
<button
|
|
4790
|
-
|
|
4763
|
+
praxisIconButton="arrow_back"
|
|
4764
|
+
size="dense"
|
|
4791
4765
|
type="button"
|
|
4792
4766
|
(click)="moveTab(entry.index, -1); $event.stopPropagation()"
|
|
4793
4767
|
(keydown.enter)="$event.stopPropagation()"
|
|
4794
4768
|
(keydown.space)="$event.stopPropagation()"
|
|
4795
4769
|
[disabled]="entry.index===0"
|
|
4796
4770
|
[attr.aria-label]="t('chrome.moveTabLeft', 'Mover aba para esquerda')"
|
|
4797
|
-
|
|
4798
|
-
<mat-icon aria-hidden="true" fontIcon="arrow_back"></mat-icon>
|
|
4799
|
-
</button>
|
|
4771
|
+
></button>
|
|
4800
4772
|
<button
|
|
4801
|
-
|
|
4773
|
+
praxisIconButton="arrow_forward"
|
|
4774
|
+
size="dense"
|
|
4802
4775
|
type="button"
|
|
4803
4776
|
(click)="moveTab(entry.index, 1); $event.stopPropagation()"
|
|
4804
4777
|
(keydown.enter)="$event.stopPropagation()"
|
|
4805
4778
|
(keydown.space)="$event.stopPropagation()"
|
|
4806
4779
|
[disabled]="entry.index===(config?.tabs?.length||1)-1"
|
|
4807
4780
|
[attr.aria-label]="t('chrome.moveTabRight', 'Mover aba para direita')"
|
|
4808
|
-
|
|
4809
|
-
<mat-icon aria-hidden="true" fontIcon="arrow_forward"></mat-icon>
|
|
4810
|
-
</button>
|
|
4781
|
+
></button>
|
|
4811
4782
|
}
|
|
4812
4783
|
</ng-template>
|
|
4813
4784
|
@if (shouldRenderGroupBody()) {
|
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": {
|