@praxisui/page-builder 9.0.68-rc.0 → 9.0.68-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -65,6 +65,20 @@ content-aware minimums remain important, including in restored layouts; changing
65
65
  recipe does not silently rewrite a saved user page. Auto-content rows still do not
66
66
  provide pixel-continuous vertical shrinking of a one-row widget.
67
67
 
68
+ ### Organization references and inherited appearance
69
+
70
+ Selecting an organization reference preserves an existing canvas and does not convert a
71
+ flow page into a canvas. Explicitly editing the base grid creates a canvas when none exists,
72
+ placing every widget while preserving its identity and inputs. Untouched row units, gaps and
73
+ row-height defaults remain omitted; the editor does not freeze resolved runtime defaults.
74
+ **Inherit appearance** keeps the page shell preset unset so the theme/context can continue
75
+ to supply it. Selecting a shell preset writes an explicit override; clearing it restores
76
+ inheritance, including after Apply and reopen.
77
+
78
+ Inside Widget Settings, **Undo last resize** prepares the inverse preview; **Apply** commits
79
+ it to the page. This differs from discarding an unapplied draft and from saving the page
80
+ through its host. Preset selection does not introduce collective repacking or new AI operations.
81
+
68
82
  ### Device composition
69
83
 
70
84
  **Page settings → Responsiveness** opens on Mobile and shows one device at a time.
@@ -741,9 +755,20 @@ adjustments are counted; **Use style only** clears those adjustments while prese
741
755
  the chosen preset, identity and actions. The sample illustrates the shell, not the
742
756
  widget's real content or dimensions.
743
757
 
744
- The local Dynamic Page Lab includes an appearance studio comparing the six built-in
745
- presets with identical metric, trend or exception-list content. Its data is illustrative;
746
- the trend is a static visual specimen, not a ChartDocument integration example.
758
+ The local Dynamic Page Lab reads all 14 styles from the canonical shell catalog.
759
+ Its comparison applies identical content to 13 card styles, with a separate compact
760
+ specimen for `filter-bar`. Choose people/capacity, finance/purchasing or operations/services;
761
+ compare metrics, trends, queues, tables, record details or filter summaries; inspect
762
+ ready, empty, simulated loading, recoverable error and read-only presentations.
763
+ These are illustrative content/state specimens, not integrations with data adapters,
764
+ ChartDocument or domain permissions. Recovery preserves the selected domain and content.
765
+
766
+ Both page configuration editors include a collapsible comparison of the four canonical
767
+ organizations, their structural roles and intended uses. The diagram is schematic;
768
+ it does not preview or rearrange the user's canvas. Effective theme and layout suggestion
769
+ are distinguished: an explicit theme wins over the layout default. Explicit layout/grouping
770
+ and canvas coordinates remain authoritative. Mobile preferences describe composition intent;
771
+ selecting an organization alone does not create tabs, hide content or wire master/detail.
747
772
 
748
773
 
749
774
  The shell editor gives the active topic the available editing width. Its illustrative sample follows
@@ -872,3 +897,122 @@ O modo **Somente conteúdo** altera apenas `shell.kind`: título, descrição, a
872
897
  aparência e ações continuam sendo editados e preservados em Aplicar/Salvar/Redefinir e na
873
898
  reabertura. Ocultar a moldura no runtime não autoriza descartar o rascunho dos demais campos.
874
899
  Os campos de aparência mantêm rótulos flutuantes visíveis mesmo quando estão vazios.
900
+
901
+ ### Preset studio: inherited organization and operational scenarios
902
+
903
+ Both page editors pass `layoutPresetOptions` to the comparison and use Core's shared
904
+ `resolveWidgetPageLayoutPreset` behavior. The comparison identifies inherited organization,
905
+ marks the effective layout, distinguishes explicit/inherited themes, and exposes all diagram
906
+ roles as a semantic list. The separate required-role list describes mandatory slots.
907
+ Shell style labels resolve through Core in Portuguese and English, including outside editors.
908
+
909
+ The local `/dynamic-page-lab` preset studio links six governed scenarios from
910
+ `ERGON_COMPOSITION_CASES` by task: catalog maintenance, record detail, tabbed dossier,
911
+ missions/teams, actions with justification, and partial outcomes in bulk actions. These routes consume the existing composition
912
+ recipes and real Quick Start data; navigation does not apply the selected appearance to them.
913
+ They may write data when their existing actions are confirmed. The style specimens remain
914
+ illustrative and keep keyboard focus on the recovered specimen after simulated failure.
915
+ These scenarios demonstrate existing capabilities; they do not define new shell presets or business contracts.
916
+
917
+
918
+ ### Effective shell style and material authoring
919
+
920
+ The widget Styles topic shows the base finish, whether it is explicit or inherited from the
921
+ page/theme, and the number of appearance overrides. Changing the base finish preserves those
922
+ overrides. “Use style only” clears appearance overrides without removing identity or actions.
923
+ The live preview uses the runtime-resolved inherited preset; saving an inherited choice leaves
924
+ `shell.preset` absent. Content-only presentation explicitly indicates that the outer shell is disabled.
925
+
926
+ Advanced appearance round-trips `card.backdropFilter` and `card.fallbackBackground`, including
927
+ CSS variables. The existing `widget.shell.configure` AI operation describes those paths; they
928
+ configure the shell only. Dark glass uses transparency and blur in normal flow, with an opaque
929
+ fallback for reduced transparency, unavailable filters and expanded/fullscreen surfaces.
930
+
931
+
932
+ The advanced shell editor also round-trips `card.borderWidth`, `card.borderStyle`,
933
+ `header.borderWidth` and `header.borderStyle`. Card controls accept per-side CSS
934
+ shorthands; header controls validate a single bottom-divider width/style. Invalid
935
+ CSS marks the Appearance topic invalid. Preview, custom preset thumbnails, override
936
+ counting and “Use style only” consume/clear these same canonical fields. The existing
937
+ `widget.shell.configure` operation advertises them without another operation or preset ID.
938
+
939
+ In `/dynamic-page-lab`, open **Estúdio de presets → Testar com componentes reais →
940
+ Explorar cores e bordas**. The optional experiment combines five demonstration palettes,
941
+ two surface tones, four fills and six stroke choices over the actual table, chart,
942
+ form and indicator. It is disabled by default; turning it off restores the selected
943
+ preset without recreating the component's inputs. These are illustrative appearance
944
+ overrides, not business status colors or additional public presets. The UI explains
945
+ the continuous-layer limitation of gradient borders combined with non-solid strokes.
946
+
947
+ Empty or whitespace-only appearance fields are omitted so inheritance can resume.
948
+ Header border color accepts one bottom-divider color; card border color may vary by
949
+ side. Invalid values block Save, and correcting them restores the editor's validity.
950
+
951
+ ### Dedicated template studio
952
+
953
+ The canvas page settings editor separates four tasks into exclusive tabs:
954
+
955
+ - **Visual templates**: four themes with token-based illustrative samples, effective-theme
956
+ inheritance and fourteen canonical widget-surface choices under a dedicated disclosure.
957
+ - **Layout templates**: the existing composition catalog, open for comparison with role
958
+ diagrams, required roles and theme precedence. Canvas positions remain explicit.
959
+ - **Arrange**: nine visual distributions for existing widgets: stack, equal halves,
960
+ left/right two-thirds emphasis, equal thirds, broad center, left/right three-quarter
961
+ emphasis and equal quarters. Choices show their actual integer column widths.
962
+ - **Adjustments**: grid, grouping, device layouts, context, state and widget limits.
963
+
964
+ Indivisible columns are apportioned by fractional remainder, keeping equal lanes within
965
+ one column. Arrangement thumbnails use those actual integer widths. Text details include
966
+ both source and proposed positions and sizes.
967
+
968
+ Navigation does not dirty the document. Gallery thumbnails are illustrative; arrangement
969
+ review maps use the actual before/after canvas geometry and stable widget numbers, with
970
+ accessible details of names and positions. A proposal receives focus above the gallery.
971
+ Page theme tokens come from Core; per-widget overrides retain their existing priority.
972
+ The editor provides pt-BR/en-US copy, keyboard focus, reduced-motion behavior and layouts
973
+ for narrow panels. This introduces no persisted template type or parallel layout engine.
974
+
975
+ ### Explicit collective canvas arrangement
976
+
977
+ In **Page settings → Arrange**, choose a visual distribution. This is an
978
+ explicit arrangement of a complete existing base canvas, independent of layout preset
979
+ selection. The current geometric reading order assigns columns; no titles or business
980
+ roles are inferred. Heights, content, shell appearance, widget keys and composition links
981
+ are preserved. The last column receives any remainder when the grid is indivisible.
982
+
983
+ Review the numbered before/after maps and widget names, then choose **Use arrangement
984
+ in draft** and the Settings Panel's **Apply**. Preparation does not dirty or emit the page.
985
+ A changed draft immediately removes the stale proposal and clears its selection. **Undo arrangement** restores the previous
986
+ geometry in the draft and can be applied through the same panel. The single undo survives
987
+ an exact page echo after Apply; replacing the page or resetting the editor clears it.
988
+ Save continues to use the existing persistence flow. Core confirms a successful
989
+ Apply through the session's transient `appliedValues$`; the page editor uses the existing
990
+ `SettingsValueProvider.acceptAppliedValue` contract to advance its baseline. The receipt
991
+ contains the authored document captured before runtime enrichment, not materialized data.
992
+
993
+ Core's `prepareCanvasArrangement(page, widths)` owns the atomic calculation. Widths are
994
+ positive integer grid spans whose sum equals `canvas.columns`; they are not preset IDs or
995
+ semantic roles. Success returns a canvas and changed keys. Failure returns no canvas,
996
+ blocked keys and `geometry`, `limits` or `device-overrides`. Position locks are fixed
997
+ obstacles; size locks retain their size; limits are never rewritten to fit an arrangement.
998
+ Overlapping or incomplete source geometry is rejected instead of repaired implicitly.
999
+
1000
+ The scope is the base canvas. Inheriting devices follow the base. Complete device geometry
1001
+ remains untouched. Partial device anchors that would inherit changed geometry block the
1002
+ proposal; this action does not invent overrides or provide a device-specific solver.
1003
+ This manual geometry operation adds no assistant tool or intent-routing shortcut. The
1004
+ existing AI manifest's canvas operation remains separate and is not certified as invoking
1005
+ this preparation helper.
1006
+
1007
+
1008
+ Collective arrangement admission is repeated when producing the final provider value,
1009
+ using Core `validateCanvasArrangement(candidate, source)`. A grid reduction cannot emit
1010
+ items outside the current columns; correcting the columns restores eligibility without
1011
+ silently calculating a different arrangement. Effective numeric limits are checked for
1012
+ inheriting devices too, even when they author no positions. A changed rendered diagnostic
1013
+ invalidates the proposal safely and requires preparation again.
1014
+
1015
+ Undo restores only `col`, `row`, `colSpan` and `rowSpan`. Additional gap, theme, content-size
1016
+ or limit edits remain in the draft. The owner-confirmed Apply receipt retains the undo
1017
+ when the reviewed geometry matches, including when unrelated fields were edited before
1018
+ Apply. Reset or replacement of the page still invalidates the transaction.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-09-09T10:03:24.330Z",
3
+ "generatedAt": "2026-09-10T01:25:13.157Z",
4
4
  "packageName": "@praxisui/page-builder",
5
- "packageVersion": "9.0.68-rc.0",
5
+ "packageVersion": "9.0.68-rc.2",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -2073,6 +2073,72 @@
2073
2073
  "shell": {
2074
2074
  "type": "object",
2075
2075
  "properties": {
2076
+ "appearance": {
2077
+ "type": "object",
2078
+ "properties": {
2079
+ "card": {
2080
+ "type": "object",
2081
+ "properties": {
2082
+ "background": {
2083
+ "type": "string"
2084
+ },
2085
+ "borderColor": {
2086
+ "type": "string"
2087
+ },
2088
+ "borderWidth": {
2089
+ "type": "string",
2090
+ "description": "CSS border width; accepts per-side values."
2091
+ },
2092
+ "borderStyle": {
2093
+ "type": "string",
2094
+ "description": "CSS border style: solid, dashed, dotted, double, none; accepts per-side values."
2095
+ },
2096
+ "borderRadius": {
2097
+ "type": "string"
2098
+ },
2099
+ "shadow": {
2100
+ "type": "string"
2101
+ },
2102
+ "backdropFilter": {
2103
+ "type": "string",
2104
+ "description": "CSS backdrop effect for a translucent card, e.g. blur(16px) saturate(125%). none disables it."
2105
+ },
2106
+ "fallbackBackground": {
2107
+ "type": "string",
2108
+ "description": "Opaque background for reduced transparency, unsupported blur and fullscreen/expanded modes."
2109
+ }
2110
+ }
2111
+ },
2112
+ "header": {
2113
+ "type": "object",
2114
+ "properties": {
2115
+ "background": {
2116
+ "type": "string"
2117
+ },
2118
+ "borderColor": {
2119
+ "type": "string"
2120
+ },
2121
+ "borderWidth": {
2122
+ "type": "string",
2123
+ "description": "CSS width of the bottom header divider."
2124
+ },
2125
+ "borderStyle": {
2126
+ "type": "string",
2127
+ "description": "CSS style of the bottom header divider."
2128
+ },
2129
+ "titleColor": {
2130
+ "type": "string"
2131
+ },
2132
+ "subtitleColor": {
2133
+ "type": "string"
2134
+ },
2135
+ "iconColor": {
2136
+ "type": "string"
2137
+ }
2138
+ }
2139
+ }
2140
+ }
2141
+ },
2076
2142
  "avatar": {
2077
2143
  "type": "object",
2078
2144
  "additionalProperties": false,
@@ -3821,9 +3887,9 @@
3821
3887
  {
3822
3888
  "chunkIndex": 10,
3823
3889
  "chunkKind": "authoring_manifest",
3824
- "content": "{\"operationId\":\"widget.shell.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure widget shell Effects: compile-domain-patch. Rename the employees widget card and enable the refresh shell action.\",\"scope\":\"templating\",\"target\":{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\"],\"properties\":[\"widgetKey\",\"shell\"],\"semanticTerms\":[\"widgetKey\",\"shell\",\"shell.avatar\",\"shell.stickyHeader\",\"shell.avatar.imageSrc\",\"shell.avatar.name\",\"shell.avatar.initials\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[].shell\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"widget-shell-shape-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SHELL_SHAPE\",\"description\":\"Widget shell config must match the shell editor contract.\"},{\"validatorId\":\"settings-panel-bridge-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_BRIDGE\",\"description\":\"Settings panel bridge must be available for shell/page editors.\"},{\"validatorId\":\"child-inputs-not-mutated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_NOT_MUTATED\",\"description\":\"Shell edits cannot mutate child inputs.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-widget-shell\",\"request\":\"Rename the employees widget card and enable the refresh shell action.\",\"operationId\":\"widget.shell.configure\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"shell\":{\"title\":\"Employees\",\"actions\":[{\"id\":\"refresh\"}]}},\"isPositive\":true}],\"negativeExamples\":[]}",
3890
+ "content": "{\"operationId\":\"widget.shell.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure widget shell Effects: compile-domain-patch. Rename the employees widget card and enable the refresh shell action.\",\"scope\":\"templating\",\"target\":{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\"],\"properties\":[\"widgetKey\",\"shell\"],\"semanticTerms\":[\"widgetKey\",\"shell\",\"shell.appearance\",\"shell.avatar\",\"shell.stickyHeader\",\"shell.appearance.card\",\"shell.appearance.header\",\"shell.avatar.imageSrc\",\"shell.avatar.name\",\"shell.avatar.initials\",\"shell.appearance.card.background\",\"shell.appearance.card.borderColor\",\"shell.appearance.card.borderWidth\",\"shell.appearance.card.borderStyle\",\"shell.appearance.card.borderRadius\",\"shell.appearance.card.shadow\",\"shell.appearance.card.backdropFilter\",\"shell.appearance.card.fallbackBackground\",\"shell.appearance.header.background\",\"shell.appearance.header.borderColor\",\"shell.appearance.header.borderWidth\",\"shell.appearance.header.borderStyle\",\"shell.appearance.header.titleColor\",\"shell.appearance.header.subtitleColor\",\"shell.appearance.header.iconColor\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[].shell\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"widget-shell-shape-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SHELL_SHAPE\",\"description\":\"Widget shell config must match the shell editor contract.\"},{\"validatorId\":\"settings-panel-bridge-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_BRIDGE\",\"description\":\"Settings panel bridge must be available for shell/page editors.\"},{\"validatorId\":\"child-inputs-not-mutated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_NOT_MUTATED\",\"description\":\"Shell edits cannot mutate child inputs.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-widget-shell\",\"request\":\"Rename the employees widget card and enable the refresh shell action.\",\"operationId\":\"widget.shell.configure\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"shell\":{\"title\":\"Employees\",\"actions\":[{\"id\":\"refresh\"}]}},\"isPositive\":true}],\"negativeExamples\":[]}",
3825
3891
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3826
- "contentHash": "5186f1865976a4f68245eb5891d95c41dca70de0eea153f296f7298981716ca5",
3892
+ "contentHash": "a21737f13478c3a046020e438cacdb33ad1733d554608317954901b4480b7a19",
3827
3893
  "sourceKind": "component_definition",
3828
3894
  "sourceId": "praxis-page-builder",
3829
3895
  "corpusVersion": "1.0.0"
@@ -3941,9 +4007,9 @@
3941
4007
  {
3942
4008
  "chunkIndex": 22,
3943
4009
  "chunkKind": "authoring_manifest",
3944
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"widget.shell.configure\",\"title\":\"Configure widget shell\",\"scope\":\"templating\",\"targetKind\":\"widgetShell\",\"target\":{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"shell\":{\"type\":\"object\",\"properties\":{\"avatar\":{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"imageSrc\":{\"type\":\"string\",\"description\":\"Photo URL or shell template, including ${transient.employee.avatarUrl}.\"},\"name\":{\"type\":\"string\",\"description\":\"Accessible name and initials fallback; supports shell templates.\"},\"initials\":{\"type\":\"string\",\"description\":\"Optional explicit initials fallback.\"}}},\"stickyHeader\":{\"type\":\"boolean\",\"description\":\"Retain the existing header within the widget during page scrolling; suspended for drag authoring, collapsed/overlay states and scroll recovery.\"}}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-shell-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetShellEditorComponent\",\"SettingsPanelBridge\"],\"writes\":[\"page.widgets[].shell\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"settings-panel-bridge-missing\",\"shell-config-invalid\"],\"description\":\"Updates the page-builder-owned widget shell without editing child component inputs.\"}}],\"validators\":[\"widget-exists\",\"widget-shell-shape-valid\",\"settings-panel-bridge-available\",\"child-inputs-not-mutated\"],\"affectedPaths\":[\"widgets[].shell\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]},{\"operationId\":\"composition.link.add\",\"title\":\"Add page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-add\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\",\"WidgetPageDefinition.widgets\",\"PAGE_BUILDER_AI_CAPABILITIES\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"failureModes\":[\"link-id-duplicate\",\"endpoint-not-found\",\"nested-path-invalid\",\"json-logic-invalid\"],\"description\":\"Adds canonical declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"}}],\"validators\":[\"composition-link-id-unique\",\"composition-endpoints-resolve\",\"nested-path-terminal-widget-key-required\",\"json-logic-condition-valid\",\"no-legacy-connections-write\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"widgets-resolvable\"]}]}",
4010
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"widget.shell.configure\",\"title\":\"Configure widget shell\",\"scope\":\"templating\",\"targetKind\":\"widgetShell\",\"target\":{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"shell\":{\"type\":\"object\",\"properties\":{\"appearance\":{\"type\":\"object\",\"properties\":{\"card\":{\"type\":\"object\",\"properties\":{\"background\":{\"type\":\"string\"},\"borderColor\":{\"type\":\"string\"},\"borderWidth\":{\"type\":\"string\",\"description\":\"CSS border width; accepts per-side values.\"},\"borderStyle\":{\"type\":\"string\",\"description\":\"CSS border style: solid, dashed, dotted, double, none; accepts per-side values.\"},\"borderRadius\":{\"type\":\"string\"},\"shadow\":{\"type\":\"string\"},\"backdropFilter\":{\"type\":\"string\",\"description\":\"CSS backdrop effect for a translucent card, e.g. blur(16px) saturate(125%). none disables it.\"},\"fallbackBackground\":{\"type\":\"string\",\"description\":\"Opaque background for reduced transparency, unsupported blur and fullscreen/expanded modes.\"}}},\"header\":{\"type\":\"object\",\"properties\":{\"background\":{\"type\":\"string\"},\"borderColor\":{\"type\":\"string\"},\"borderWidth\":{\"type\":\"string\",\"description\":\"CSS width of the bottom header divider.\"},\"borderStyle\":{\"type\":\"string\",\"description\":\"CSS style of the bottom header divider.\"},\"titleColor\":{\"type\":\"string\"},\"subtitleColor\":{\"type\":\"string\"},\"iconColor\":{\"type\":\"string\"}}}}},\"avatar\":{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"imageSrc\":{\"type\":\"string\",\"description\":\"Photo URL or shell template, including ${transient.employee.avatarUrl}.\"},\"name\":{\"type\":\"string\",\"description\":\"Accessible name and initials fallback; supports shell templates.\"},\"initials\":{\"type\":\"string\",\"description\":\"Optional explicit initials fallback.\"}}},\"stickyHeader\":{\"type\":\"boolean\",\"description\":\"Retain the existing header within the widget during page scrolling; suspended for drag authoring, collapsed/overlay states and scroll recovery.\"}}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-shell-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetShellEditorComponent\",\"SettingsPanelBridge\"],\"writes\":[\"page.widgets[].shell\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"settings-panel-bridge-missing\",\"shell-config-invalid\"],\"description\":\"Updates the page-builder-owned widget shell without editing child component inputs.\"}}],\"validators\":[\"widget-exists\",\"widget-shell-shape-valid\",\"settings-panel-bridge-available\",\"child-inputs-not-mutated\"],\"affectedPaths\":[\"widgets[].shell\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]}]}",
3945
4011
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3946
- "contentHash": "16f9dc001bd8f81587dc824a4e82c0bc835aaa7d6a154b27041bcf2d1f780acb",
4012
+ "contentHash": "25fb9a56747225c1826dbbadb9ffaeb717872428bfe6a325d7a5ee1dac3ecd0a",
3947
4013
  "sourceKind": "component_definition",
3948
4014
  "sourceId": "praxis-page-builder",
3949
4015
  "corpusVersion": "1.0.0"
@@ -3951,9 +4017,9 @@
3951
4017
  {
3952
4018
  "chunkIndex": 23,
3953
4019
  "chunkKind": "authoring_manifest",
3954
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"composition.link.remove\",\"title\":\"Remove page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\"],\"properties\":{\"id\":{\"type\":\"string\"},\"confirmed\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-remove\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"failureModes\":[\"composition-link-not-found\",\"destructive-removal-not-confirmed\"],\"description\":\"Removes a canonical composition link by stable id.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"composition-link-exists\",\"destructive-removal-confirmed\",\"composition-links-still-valid\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-link-exists\"]},{\"operationId\":\"composition.plan.compile\",\"title\":\"Compile UI composition plan\",\"scope\":\"rules\",\"targetKind\":\"agenticPreview\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"uiCompositionPlan\"],\"properties\":{\"uiCompositionPlan\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-ui-composition-plan-compile\",\"handlerContract\":{\"reads\":[\"UiCompositionPlanAuthoringInput\",\"UiCompositionPlan\",\"UiCompositionPlanTemplateReference\",\"UiCompositionPlanTemplateMaterialization\",\"UiCompositionPlan.i18n\",\"UiCompositionPlan.context\",\"UiCompositionPlan.layout\",\"UiCompositionPlan.selectionSyncs\",\"UiCompositionPlan.contextScopes\",\"UiCompositionPlan.bindings[].transform.fallbackValue\",\"UiCompositionPlan.bindings[].transform.select-case\",\"resolveUiCompositionPlanTemplate\",\"compileUiCompositionPlan\",\"preflightUiCompositionPlan\",\"ComponentMetadataRegistry\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\",\"ComponentDocMeta.configEditor\"],\"writes\":[\"compiledFormPatch.patch.page\"],\"identityKeys\":[\"uiCompositionPlan.id\",\"widgetKey\",\"uiCompositionPlan.bindings[].id\",\"uiCompositionPlan.selectionSyncs[].id\",\"uiCompositionPlan.contextScopes[].id\"],\"failureModes\":[\"ui-composition-plan-invalid\",\"ui-composition-template-reference-invalid\",\"ui-composition-template-not-found\",\"ui-composition-template-hash-mismatch\",\"ui-composition-template-overrides-unsupported\",\"widget-catalog-missing\",\"compiled-page-invalid\",\"child-config-editor-missing\"],\"description\":\"Resolves an optional exact governed template reference and compiles the expanded UiCompositionPlan into a renderable WidgetPageDefinition patch.page.\"}}],\"validators\":[\"ui-composition-plan-valid\",\"compiled-page-valid\",\"widget-keys-unique\",\"composition-endpoints-resolve\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\"],\"submissionImpact\":\"none\",\"preconditions\":[\"agentic-preview-loaded\",\"component-catalog-loaded\"]},{\"operationId\":\"state.set\",\"title\":\"Set page state value\",\"scope\":\"dataBinding\",\"targetKind\":\"state\",\"target\":{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"path\",\"value\"],\"properties\":{\"path\":{\"type\":\"string\"},\"value\":{},\"layer\":{\"enum\":[\"page\",\"session\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-state-set\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.state\",\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.state\"],\"identityKeys\":[\"path\"],\"failureModes\":[\"state-path-invalid\",\"state-json-invalid\",\"composition-state-link-invalid\"],\"description\":\"Sets canonical page state used by composition links without creating host-only binding paths.\"}}],\"validators\":[\"state-path-valid\",\"state-layer-valid\",\"state-json-valid\",\"composition-state-links-still-valid\"],\"affectedPaths\":[\"state\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"page.preview.apply\",\"title\":\"Apply agentic preview locally\",\"scope\":\"interaction\",\"targetKind\":\"agenticPreview\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"previewId\"],\"properties\":{\"previewId\":{\"type\":\"string\"},\"compiledFormPatch\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-preview-apply\",\"handlerContract\":{\"reads\":[\"UiCompositionPlan\",\"PageBuilderAiAdapter.applyUiCompositionPlan\",\"ComponentMetadataRegistry\",\"CompositionValidatorService.validatePage\",\"compiledFormPatch.patch.page\",\"PraxisAssistantTurnViewState\"],\"writes\":[\"DynamicPageBuilderComponent.page\",\"pageChange\"],\"identityKeys\":[\"previewId\"],\"failureModes\":[\"preview-result-invalid\",\"target-registry-missing\",\"component-not-registered\",\"component-not-materializable\",\"port-not-registered\",\"port-contract-incompatible\",\"patch-page-missing\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Preflights UiCompositionPlan against the target runtime registry and canonical Core composition validator before applying the attested WidgetPageDefinition locally.\"}}],\"validators\":[\"preview-result-valid\",\"ui-composition-target-registry-available\",\"ui-composition-components-materializable\",\"composition-endpoints-resolve\",\"compiled-page-patch-present\",\"no-envelope-runtime-persistence\",\"runtime-page-valid\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\",\"page\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"agentic-preview-loaded\"]},{\"operationId\":\"page.persist.save\",\"title\":\"Persist page through config API\",\"scope\":\"interaction\",\"targetKind\":\"pageIdentity\",\"target\":{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"pageIdentity\"],\"properties\":{\"pageIdentity\":{\"type\":\"object\"},\"page\":{\"type\":\"object\"},\"etag\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-page-persist-save\",\"handlerContract\":{\"reads\":[\"pageIdentity\",\"WidgetPageDefinition\",\"PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS\",\"ui_user_config ETag\"],\"writes\":[\"POST/PUT /api/praxis/config/ui-user-config\",\"If-Match\"],\"identityKeys\":[\"pageIdentity.componentType\",\"pageIdentity.componentId\",\"pageIdentity.scope\"],\"failureModes\":[\"page-identity-incomplete\",\"etag-conflict\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Persists the renderable WidgetPageDefinition with pageIdentity and ETag delegated to praxis-config-starter.\"}}],\"validators\":[\"page-identity-complete\",\"etag-policy-valid\",\"runtime-page-valid\",\"no-envelope-runtime-persistence\"],\"affectedPaths\":[\"page\",\"pageIdentity\",\"etag\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"page-identity-known\"]}]}",
4020
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"composition.link.add\",\"title\":\"Add page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-add\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\",\"WidgetPageDefinition.widgets\",\"PAGE_BUILDER_AI_CAPABILITIES\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"failureModes\":[\"link-id-duplicate\",\"endpoint-not-found\",\"nested-path-invalid\",\"json-logic-invalid\"],\"description\":\"Adds canonical declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"}}],\"validators\":[\"composition-link-id-unique\",\"composition-endpoints-resolve\",\"nested-path-terminal-widget-key-required\",\"json-logic-condition-valid\",\"no-legacy-connections-write\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"widgets-resolvable\"]},{\"operationId\":\"composition.link.remove\",\"title\":\"Remove page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\"],\"properties\":{\"id\":{\"type\":\"string\"},\"confirmed\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-remove\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"failureModes\":[\"composition-link-not-found\",\"destructive-removal-not-confirmed\"],\"description\":\"Removes a canonical composition link by stable id.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"composition-link-exists\",\"destructive-removal-confirmed\",\"composition-links-still-valid\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-link-exists\"]}]}",
3955
4021
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3956
- "contentHash": "2daee98ccc409f7dae96a0744b6d05b5f36198af4160e9d6e67474c9427de839",
4022
+ "contentHash": "bf19a7dd9c2b8b8dbb3a5137f8ea66247b891c76197a9443dde5f589b031afee",
3957
4023
  "sourceKind": "component_definition",
3958
4024
  "sourceId": "praxis-page-builder",
3959
4025
  "corpusVersion": "1.0.0"
@@ -3961,9 +4027,9 @@
3961
4027
  {
3962
4028
  "chunkIndex": 24,
3963
4029
  "chunkKind": "authoring_manifest",
3964
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"childOperation.delegate\",\"title\":\"Delegate widget child operation\",\"scope\":\"global\",\"targetKind\":\"childOperation\",\"target\":{\"kind\":\"childOperation\",\"resolver\":\"widget-child-authoring-manifest-operation\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"childComponentId\":{\"type\":\"string\"},\"childOperationId\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"},\"childTarget\":{\"type\":\"object\"},\"childParams\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-child-operation-delegate\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"ComponentDocMeta.configEditor\",\"child ComponentAuthoringManifest\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\"],\"writes\":[\"page.widgets[].definition.inputs\"],\"identityKeys\":[\"widgetKey\",\"childComponentId\",\"childOperationId\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"childComponentId\":{\"type\":\"string\"},\"childOperationId\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"},\"childTarget\":{\"type\":\"object\"},\"childParams\":{\"type\":\"object\"}}},\"failureModes\":[\"widget-not-found\",\"child-manifest-missing\",\"child-operation-unknown\",\"local-child-input-write-attempted\"],\"description\":\"Delegates child widget input edits to the owning manifest or configEditor instead of redefining child semantics in page-builder.\"}}],\"validators\":[\"widget-exists\",\"child-manifest-available\",\"child-operation-known\",\"component-config-editor-respected\",\"no-local-child-input-write\"],\"affectedPaths\":[\"widgets[].definition.inputs\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\",\"child-authoring-contract-available\"]}]}",
4030
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"composition.plan.compile\",\"title\":\"Compile UI composition plan\",\"scope\":\"rules\",\"targetKind\":\"agenticPreview\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"uiCompositionPlan\"],\"properties\":{\"uiCompositionPlan\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-ui-composition-plan-compile\",\"handlerContract\":{\"reads\":[\"UiCompositionPlanAuthoringInput\",\"UiCompositionPlan\",\"UiCompositionPlanTemplateReference\",\"UiCompositionPlanTemplateMaterialization\",\"UiCompositionPlan.i18n\",\"UiCompositionPlan.context\",\"UiCompositionPlan.layout\",\"UiCompositionPlan.selectionSyncs\",\"UiCompositionPlan.contextScopes\",\"UiCompositionPlan.bindings[].transform.fallbackValue\",\"UiCompositionPlan.bindings[].transform.select-case\",\"resolveUiCompositionPlanTemplate\",\"compileUiCompositionPlan\",\"preflightUiCompositionPlan\",\"ComponentMetadataRegistry\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\",\"ComponentDocMeta.configEditor\"],\"writes\":[\"compiledFormPatch.patch.page\"],\"identityKeys\":[\"uiCompositionPlan.id\",\"widgetKey\",\"uiCompositionPlan.bindings[].id\",\"uiCompositionPlan.selectionSyncs[].id\",\"uiCompositionPlan.contextScopes[].id\"],\"failureModes\":[\"ui-composition-plan-invalid\",\"ui-composition-template-reference-invalid\",\"ui-composition-template-not-found\",\"ui-composition-template-hash-mismatch\",\"ui-composition-template-overrides-unsupported\",\"widget-catalog-missing\",\"compiled-page-invalid\",\"child-config-editor-missing\"],\"description\":\"Resolves an optional exact governed template reference and compiles the expanded UiCompositionPlan into a renderable WidgetPageDefinition patch.page.\"}}],\"validators\":[\"ui-composition-plan-valid\",\"compiled-page-valid\",\"widget-keys-unique\",\"composition-endpoints-resolve\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\"],\"submissionImpact\":\"none\",\"preconditions\":[\"agentic-preview-loaded\",\"component-catalog-loaded\"]},{\"operationId\":\"state.set\",\"title\":\"Set page state value\",\"scope\":\"dataBinding\",\"targetKind\":\"state\",\"target\":{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"path\",\"value\"],\"properties\":{\"path\":{\"type\":\"string\"},\"value\":{},\"layer\":{\"enum\":[\"page\",\"session\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-state-set\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.state\",\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.state\"],\"identityKeys\":[\"path\"],\"failureModes\":[\"state-path-invalid\",\"state-json-invalid\",\"composition-state-link-invalid\"],\"description\":\"Sets canonical page state used by composition links without creating host-only binding paths.\"}}],\"validators\":[\"state-path-valid\",\"state-layer-valid\",\"state-json-valid\",\"composition-state-links-still-valid\"],\"affectedPaths\":[\"state\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"page.preview.apply\",\"title\":\"Apply agentic preview locally\",\"scope\":\"interaction\",\"targetKind\":\"agenticPreview\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"previewId\"],\"properties\":{\"previewId\":{\"type\":\"string\"},\"compiledFormPatch\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-preview-apply\",\"handlerContract\":{\"reads\":[\"UiCompositionPlan\",\"PageBuilderAiAdapter.applyUiCompositionPlan\",\"ComponentMetadataRegistry\",\"CompositionValidatorService.validatePage\",\"compiledFormPatch.patch.page\",\"PraxisAssistantTurnViewState\"],\"writes\":[\"DynamicPageBuilderComponent.page\",\"pageChange\"],\"identityKeys\":[\"previewId\"],\"failureModes\":[\"preview-result-invalid\",\"target-registry-missing\",\"component-not-registered\",\"component-not-materializable\",\"port-not-registered\",\"port-contract-incompatible\",\"patch-page-missing\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Preflights UiCompositionPlan against the target runtime registry and canonical Core composition validator before applying the attested WidgetPageDefinition locally.\"}}],\"validators\":[\"preview-result-valid\",\"ui-composition-target-registry-available\",\"ui-composition-components-materializable\",\"composition-endpoints-resolve\",\"compiled-page-patch-present\",\"no-envelope-runtime-persistence\",\"runtime-page-valid\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\",\"page\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"agentic-preview-loaded\"]},{\"operationId\":\"page.persist.save\",\"title\":\"Persist page through config API\",\"scope\":\"interaction\",\"targetKind\":\"pageIdentity\",\"target\":{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"pageIdentity\"],\"properties\":{\"pageIdentity\":{\"type\":\"object\"},\"page\":{\"type\":\"object\"},\"etag\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-page-persist-save\",\"handlerContract\":{\"reads\":[\"pageIdentity\",\"WidgetPageDefinition\",\"PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS\",\"ui_user_config ETag\"],\"writes\":[\"POST/PUT /api/praxis/config/ui-user-config\",\"If-Match\"],\"identityKeys\":[\"pageIdentity.componentType\",\"pageIdentity.componentId\",\"pageIdentity.scope\"],\"failureModes\":[\"page-identity-incomplete\",\"etag-conflict\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Persists the renderable WidgetPageDefinition with pageIdentity and ETag delegated to praxis-config-starter.\"}}],\"validators\":[\"page-identity-complete\",\"etag-policy-valid\",\"runtime-page-valid\",\"no-envelope-runtime-persistence\"],\"affectedPaths\":[\"page\",\"pageIdentity\",\"etag\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"page-identity-known\"]},{\"operationId\":\"childOperation.delegate\",\"title\":\"Delegate widget child operation\",\"scope\":\"global\",\"targetKind\":\"childOperation\",\"target\":{\"kind\":\"childOperation\",\"resolver\":\"widget-child-authoring-manifest-operation\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"childComponentId\":{\"type\":\"string\"},\"childOperationId\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"},\"childTarget\":{\"type\":\"object\"},\"childParams\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-child-operation-delegate\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"ComponentDocMeta.configEditor\",\"child ComponentAuthoringManifest\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\"],\"writes\":[\"page.widgets[].definition.inputs\"],\"identityKeys\":[\"widgetKey\",\"childComponentId\",\"childOperationId\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"childComponentId\":{\"type\":\"string\"},\"childOperationId\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"},\"childTarget\":{\"type\":\"object\"},\"childParams\":{\"type\":\"object\"}}},\"failureModes\":[\"widget-not-found\",\"child-manifest-missing\",\"child-operation-unknown\",\"local-child-input-write-attempted\"],\"description\":\"Delegates child widget input edits to the owning manifest or configEditor instead of redefining child semantics in page-builder.\"}}],\"validators\":[\"widget-exists\",\"child-manifest-available\",\"child-operation-known\",\"component-config-editor-respected\",\"no-local-child-input-write\"],\"affectedPaths\":[\"widgets[].definition.inputs\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\",\"child-authoring-contract-available\"]}]}",
3965
4031
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3966
- "contentHash": "d6e7801eb3e562cafd948e46d36fb9e81de0bdba7dcc39768a2c359e6efca892",
4032
+ "contentHash": "dfd7f811bca3134c51a4bd1f7a1329bdc271caaf7813735c4326660bf33c0156",
3967
4033
  "sourceKind": "component_definition",
3968
4034
  "sourceId": "praxis-page-builder",
3969
4035
  "corpusVersion": "1.0.0"