From b93232cf4c61ed9d3cbfe76d19f57be067cd3281 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 14 Jul 2026 09:41:19 +0000 Subject: [PATCH] feat(react,types): read canonical visibleWhen in renderers (ADR-0089) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `@objectstack/spec` unifies conditional visibility under the canonical key `visibleWhen`, folding the deprecated `visibleOn` (view form) / `visibility` (page component) aliases into it at parse. Update ObjectUI to read the canonical key: - SchemaRenderer (page): evaluate `visibleWhen` first (show-when-truthy), keep `visibleOn`/`visibility` as defensive reads for raw metadata; strip `visibleWhen` from DOM props. - spec-bridge: page bridge maps `visibleWhen ?? visibility` → node `visibleWhen`; form-view bridge maps `visibleWhen ?? visibleOn` → the ObjectForm view-level predicate slot. - react FormRenderer: prefer `visibleWhen` over the `visibleOn` alias. - types: component base (`BaseSchema` / `base.zod`) gains canonical `visibleWhen`; `visibleOn` marked `@deprecated`. Fully back-compat: existing `visibleOn`/`visibility` metadata keeps working via the alias reads. Addresses objectstack-ai/framework#2904. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_017fU25GeYSPKq9eEURsQffF --- .changeset/adr-0089-visible-when-renderer.md | 15 +++++++++ packages/react/src/SchemaRenderer.tsx | 18 ++++++++--- .../SchemaRenderer.expressions.test.tsx | 31 +++++++++++++++++++ .../src/components/form/FormRenderer.tsx | 11 ++++--- .../spec-bridge/__tests__/SpecBridge.test.ts | 12 ++++++- .../src/spec-bridge/bridges/form-view.ts | 10 +++++- .../react/src/spec-bridge/bridges/page.ts | 10 +++++- packages/types/src/base.ts | 9 ++++++ packages/types/src/zod/base.zod.ts | 9 +++++- 9 files changed, 112 insertions(+), 13 deletions(-) create mode 100644 .changeset/adr-0089-visible-when-renderer.md diff --git a/.changeset/adr-0089-visible-when-renderer.md b/.changeset/adr-0089-visible-when-renderer.md new file mode 100644 index 000000000..d52b32485 --- /dev/null +++ b/.changeset/adr-0089-visible-when-renderer.md @@ -0,0 +1,15 @@ +--- +"@object-ui/react": minor +"@object-ui/types": minor +--- + +ADR-0089: read the canonical `visibleWhen` conditional-visibility predicate in the form + page renderers. + +`@objectstack/spec` now unifies conditional visibility under a single canonical key, `visibleWhen`, and folds the deprecated `visibleOn` (view form) / `visibility` (page component) aliases into it at parse. This updates ObjectUI to read the canonical key: + +- **Page renderer** (`SchemaRenderer`) — evaluates `visibleWhen` first (show-when-truthy), then the deprecated `visibleOn` / `visibility` as a defensive read for raw / un-normalized metadata. `visibleWhen` is stripped from DOM props. +- **Spec→node bridges** — the page bridge maps a component's `visibleWhen ?? visibility` onto the node's canonical `visibleWhen`; the form-view bridge maps a field's `visibleWhen ?? visibleOn` onto the ObjectForm view-level predicate slot. +- **Form renderers** — the `@object-ui/react` `FormRenderer` prefers `visibleWhen` over the `visibleOn` alias. (`ObjectForm`/`form.tsx` already evaluated `visibleWhen`.) +- **Types** — the component base schema (`BaseSchema` / `base.zod`) gains the canonical `visibleWhen`; `visibleOn` is marked `@deprecated`. + +Fully back-compat: existing `visibleOn` / `visibility` metadata keeps working through the alias reads. diff --git a/packages/react/src/SchemaRenderer.tsx b/packages/react/src/SchemaRenderer.tsx index 4fbbbba4f..3e6937fef 100644 --- a/packages/react/src/SchemaRenderer.tsx +++ b/packages/react/src/SchemaRenderer.tsx @@ -272,18 +272,25 @@ export const SchemaRenderer = forwardRef