@praxisui/page-builder 9.0.64 → 9.0.66

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
@@ -4,6 +4,108 @@ Visual page and dashboard builder for Praxis UI applications.
4
4
 
5
5
  Use this package when an application must let users compose governed operational pages from registered widgets, visual layout, shell settings, component editors, `composition.links`, and optional AI-assisted authoring.
6
6
 
7
+ ## Widget shell editor integrity
8
+
9
+ Dynamic Page height validation follows viewport resize and Angular render completion
10
+ while the editor remains open. It reuses the runtime's transient validator and updates
11
+ the existing field diagnostics/Apply/Save gates only when the diagnostic changes.
12
+ The entered height and dirty baseline are preserved; rendered measurements never become
13
+ constraints or persisted page fields. Final value production also revalidates, so a late
14
+ failure must remain an invalid, open draft in Settings Panel.
15
+
16
+ This validates the active rendered geometry, not all possible devices, virtualized
17
+ contents or future CSS-only changes without a render/resize notification.
18
+
19
+ The shell editor validates non-empty appearance overrides with the browser CSS parser for
20
+ their actual property: backgrounds, colors, radius, shadow, padding and typography. Empty
21
+ overrides remain valid; tokens, gradients and CSS expressions are preserved, not resolved
22
+ into host-specific values. Invalid editable values block Apply/Save and the settings-value
23
+ provider. Hidden appearance fields in permission-limited editors remain preserved.
24
+
25
+ This is browser syntax validation, not URL sanitization, token-resolution verification or
26
+ backend authorization. SSR has no interactive CSS parser and defers this check to the browser.
27
+ Existing accepted JSON paths and the AI authoring manifest remain unchanged.
28
+
29
+ The appearance/action editor adapts to narrow panels, and validation messages reserve their
30
+ own space. The archetype lab now exposes a local edit toggle at narrow breakpoints, where
31
+ the demo's global toggle is hidden. This is a tested entrypoint, not full mobile certification.
32
+ Read the
33
+ [lab certification record](../../src/app/features/dynamic-page-lab/ERGON_ARCHETYPE_CERTIFICATION.md)
34
+ for the exact tested scope and remaining corporate gates.
35
+
36
+ ## Direct canvas manipulation
37
+
38
+ The builder consumes the shared Core canvas: select a widget to expose eight direct resize
39
+ grips, drag its header to move it, or use the focused grip's arrow keys to change size.
40
+ The global widget selector/directional controls are collapsed as an alternative. The
41
+ contextual **Resize widget** action retains larger 44px controls. These access paths share
42
+ one geometry, constraints, collision, preview and cancellation implementation; they add no
43
+ Page Builder settings, persistence flags or AI operations. `widget.moveResize` continues
44
+ to address the existing canonical `canvas.items` document.
45
+
46
+ Manual resize now previews coordinated space redistribution in Core, with green
47
+ availability, amber minimum-size feedback and red exceeded-limit feedback on the
48
+ affected widgets. Release commits the valid distribution atomically; Escape cancels
49
+ all affected items. This is not automatic repacking or a new AI operation. Explicit
50
+ content-aware minimums remain important, including in restored layouts; changing a
51
+ recipe does not silently rewrite a saved user page. Auto-content rows still do not
52
+ provide pixel-continuous vertical shrinking of a one-row widget.
53
+
54
+ ### Visual widget limits
55
+
56
+ Open **Page settings → Widget limits** in the default Dynamic Page editor to set
57
+ minimum/maximum width (columns) and height (rows). Choose the base canvas or a
58
+ desktop, tablet or mobile override, without closing the editor. Blank base fields use Core defaults (minimum one,
59
+ maximum grid width/unbounded row span); blank device fields inherit base limits.
60
+ An untouched device target does not create an override in the document. Validation
61
+ uses the final draft, including device layouts created in Responsiveness during the same session.
62
+
63
+ The editor writes existing `canvas.items[key].constraints` and
64
+ `deviceLayouts[device].canvas.items[key].constraints`, preserving locks, geometry,
65
+ unknown fields and untouched overrides. It rejects non-positive/non-integer
66
+ values, reversed or inherited conflicting ranges, minimums wider than the grid,
67
+ and newly authored limits that would change the current effective size. Existing
68
+ documents already clamped by Core remain valid on opening: declared spans need
69
+ not equal rendered spans. Invalid inherited bounds can be corrected in the same
70
+ draft. The editor does not rewrite geometry to satisfy newly authored bounds.
71
+ Dynamic title expressions are
72
+ identified by stable widget key, not evaluated in the editor.
73
+
74
+ Apply previews the same document returned by Save; Reset reloads the input baseline.
75
+ Pending changes are tracked independently of validity, including edits to an
76
+ already-invalid input document. Invalid limit fields expose Material errors and
77
+ accessible invalid/described-by state; correcting them clears their error state.
78
+ Closing after Apply may ask to discard the unsaved editor draft: the applied
79
+ preview remains active, as the shared Settings Panel explicitly explains.
80
+ Remote user/tenant persistence is unchanged. In `autoRows: 'content'`, the same editor
81
+ also exposes **Default / Automatic / Adjustable** height, pixel height, top inset,
82
+ and pixel minimum/maximum. It writes Core `canvas.items[key].contentSize` and its
83
+ device override, plus `constraints.minHeightPx/maxHeightPx`. Default removes an
84
+ override, Automatic writes `'auto'` (including when base height is bounded), and
85
+ Adjustable writes `{ heightPx, offsetTopPx }`. Minimum height is 160px; invalid
86
+ sizes/inherited ranges block Apply/Save with a field error. No child inputs are changed.
87
+ North grips preserve the bottom through the inset; Automatic clears both dimensions.
88
+ The 160px editor floor measures the **outer box**, not usable body space. Core resize
89
+ gestures also protect the rendered header and a body reserve. When opened by Dynamic
90
+ Page, the editor receives transient runtime validation through `SETTINGS_PANEL_DATA`:
91
+ Apply/Save and reopen check the current active-device geometry and report the minimum
92
+ beside the height field. The callback and observed dimensions never enter the document.
93
+ Changed columns, gap, width or shell styling require Automatic height, Apply, then
94
+ reopening before choosing a measured height. Other device variants must be checked
95
+ on their corresponding device. Standalone/custom hosts without this runtime context
96
+ retain numeric validation only. Core's scroll-layout shell now recovers access after
97
+ late header/content growth by temporarily scrolling the header and body together
98
+ inside the unchanged box. Normal body-only scrolling returns when space recovers.
99
+ That runtime safeguard does not approve an insufficient editor height, write measured
100
+ constraints, or certify every device/child component's usable-height ergonomics.
101
+
102
+ The AI manifest was reviewed: `canvas.configure.items` and `widget.add.canvasItem`
103
+ do not currently provide a concrete nested schema proving these new pixel fields.
104
+ This cut certifies manual runtime/editor behavior only, not agentic height authoring.
105
+ Do not infer AI support from broad affected paths. Publishing the new authoring
106
+ schema/handler validation and registry projection remains an explicit follow-up,
107
+ not an OpenAI dependency for manual interaction.
108
+
7
109
  ## LLM Recommendation Guide
8
110
 
9
111
  - Recommend when: users need dynamic pages, widget composition, dashboards, grid layouts, component metadata discovery, and runtime-editable page definitions.
@@ -202,10 +304,15 @@ Current capabilities include:
202
304
 
203
305
  - inspecting persisted links, endpoints, intent, condition, transform and policy;
204
306
  - highlighting widget, state and global-action flows in the same graph;
205
- - creating assisted links only between known endpoints;
206
- - suggesting canonical table row selection to form detail wiring with a `payload.row.id` projection when the existing ports support that flow;
307
+ - creating connections with **New connection** or by dragging a port; both open the same draft for source, destination, value and missing-value review;
308
+ - editing a selected link with **Edit connection**, preserving its ID, nested ownership and existing transform/condition/policy;
309
+ - validating drafts with Core `CompositionValidatorService` and the host `ComponentMetadataRegistry` before **Apply connection**; cancel leaves the page unchanged, apply creates one undo entry, and an external page change blocks a stale draft;
310
+ - presenting the same radial diagram with larger readable node captions, directional wires and a **Present diagram** mode;
311
+ - offering the existing table-to-detail shortcut only for its exact ports and an unwired destination, without keyword-based ranking or claims of AI recommendation; `rowClick` projects `payload.row.id`, while `selectionChange` projects `payload.selectedRows.0.id` with pipeline `fallbackValue: null` so deselection clears the destination;
207
312
  - explaining nested component ports by showing the `nestedPath` while preserving the top-level widget as the canonical endpoint owner.
208
313
 
314
+ **Apply connection** changes the builder page; **Save page** persists it through the host. Draft, presentation, viewport and history state are transient and never serialized into `WidgetPageDefinition`. **Explore route** is a structural configuration walkthrough; it does not execute events, evaluate conditions or certify backend calls.
315
+
209
316
  For nested components, keep `ref.widget` pointed at the top-level host widget and describe the internal target with `ref.nestedPath`. The editor should make that ownership visible instead of flattening child widgets into a second page-level widget namespace.
210
317
 
211
318
  ## Settings Panel Bridge
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-09-05T22:17:32.983Z",
3
+ "generatedAt": "2026-09-06T19:09:46.917Z",
4
4
  "packageName": "@praxisui/page-builder",
5
- "packageVersion": "9.0.64",
5
+ "packageVersion": "9.0.66",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,