@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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-21T15:34:49.320Z",
3
+ "generatedAt": "2026-07-23T02:50:28.389Z",
4
4
  "packageName": "@praxisui/tabs",
5
- "packageVersion": "9.0.0-beta.85",
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": 4,
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": 5,
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": 6,
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": 7,
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": "e6dfc9afd083ab441d649a8733d497006b3ef8b642fec674756a607f50822867",
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": 8,
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": 9,
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": 10,
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": 11,
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": 12,
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
1295
- class="help-icon-button"
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 mat-icon-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')"><mat-icon aria-hidden="true" [praxisIcon]="'arrow_upward'"></mat-icon></button>
1341
- <button mat-icon-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')"><mat-icon aria-hidden="true" [praxisIcon]="'arrow_downward'"></mat-icon></button>
1342
- <button mat-icon-button color="warn" (click)="removeTab(i)" [matTooltip]="t('editor.actions.removeTab', 'Remover aba')" [attr.aria-label]="t('editor.actions.removeTab', 'Remover aba')"><mat-icon aria-hidden="true" [praxisIcon]="'delete'"></mat-icon></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 mat-icon-button cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')">
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 mat-icon-button color="warn" (click)="removeWidgetFromTab(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"><mat-icon [praxisIcon]="'delete'"></mat-icon></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 mat-icon-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')"><mat-icon aria-hidden="true" [praxisIcon]="'arrow_upward'"></mat-icon></button>
1447
- <button mat-icon-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')"><mat-icon aria-hidden="true" [praxisIcon]="'arrow_downward'"></mat-icon></button>
1448
- <button mat-icon-button color="warn" (click)="removeLink(i)" [matTooltip]="t('editor.actions.removeLink', 'Remover link')" [attr.aria-label]="t('editor.actions.removeLink', 'Remover link')"><mat-icon aria-hidden="true" [praxisIcon]="'delete'"></mat-icon></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 mat-icon-button cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')">
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 mat-icon-button color="warn" (click)="removeWidgetFromLink(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"><mat-icon [praxisIcon]="'delete'"></mat-icon></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}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\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: "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: "component", type: i6.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", 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"] }] });
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
1837
- class="help-icon-button"
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 mat-icon-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')"><mat-icon aria-hidden="true" [praxisIcon]="'arrow_upward'"></mat-icon></button>
1883
- <button mat-icon-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')"><mat-icon aria-hidden="true" [praxisIcon]="'arrow_downward'"></mat-icon></button>
1884
- <button mat-icon-button color="warn" (click)="removeTab(i)" [matTooltip]="t('editor.actions.removeTab', 'Remover aba')" [attr.aria-label]="t('editor.actions.removeTab', 'Remover aba')"><mat-icon aria-hidden="true" [praxisIcon]="'delete'"></mat-icon></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 mat-icon-button cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')">
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 mat-icon-button color="warn" (click)="removeWidgetFromTab(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"><mat-icon [praxisIcon]="'delete'"></mat-icon></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 mat-icon-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')"><mat-icon aria-hidden="true" [praxisIcon]="'arrow_upward'"></mat-icon></button>
1989
- <button mat-icon-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')"><mat-icon aria-hidden="true" [praxisIcon]="'arrow_downward'"></mat-icon></button>
1990
- <button mat-icon-button color="warn" (click)="removeLink(i)" [matTooltip]="t('editor.actions.removeLink', 'Remover link')" [attr.aria-label]="t('editor.actions.removeLink', 'Remover link')"><mat-icon aria-hidden="true" [praxisIcon]="'delete'"></mat-icon></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 mat-icon-button cdkDragHandle [matTooltip]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')" [attr.aria-label]="t('editor.actions.dragToReorder', 'Arrastar para reordenar')">
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 mat-icon-button color="warn" (click)="removeWidgetFromLink(i, wi)" [matTooltip]="t('editor.actions.removeComponent', 'Remover componente')" [attr.aria-label]="t('editor.actions.removeComponent', 'Remover componente')"><mat-icon [praxisIcon]="'delete'"></mat-icon></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}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
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 mat-icon-button (click)="removeLabel(i)" [attr.aria-label]="t('editor.actions.removeLabel', 'Remover rotulo')"><mat-icon [praxisIcon]="'close'"></mat-icon></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: "component", type: i6.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", 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"] }] });
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 mat-icon-button (click)="removeLabel(i)" [attr.aria-label]="t('editor.actions.removeLabel', 'Remover rotulo')"><mat-icon [praxisIcon]="'close'"></mat-icon></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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone", "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 });
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
- mat-icon-button
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
- mat-icon-button
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
- mat-icon-button
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.85",
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.85",
11
- "@praxisui/dynamic-fields": "^9.0.0-beta.85",
12
- "@praxisui/settings-panel": "^9.0.0-beta.85",
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.85",
15
+ "@praxisui/ai": "^9.0.0-beta.88",
16
16
  "rxjs": "~7.8.0"
17
17
  },
18
18
  "dependencies": {