Skip to content

spec(leaf): mount(el,props) escape hatch — cross-Vue-major leaf render (fixes #44 systemically)#2127

Open
rubenvdlinde wants to merge 1 commit into
developmentfrom
spec/leaf-mount-render-escape-hatch
Open

spec(leaf): mount(el,props) escape hatch — cross-Vue-major leaf render (fixes #44 systemically)#2127
rubenvdlinde wants to merge 1 commit into
developmentfrom
spec/leaf-mount-render-escape-hatch

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

What

OpenSpec change proposal (spec only — no implementation) for a mount(el, props) / unmount(el) render escape hatch on the cross-app leaf registry, so a sibling app's render-surface leaf renders on an OpenRegister host object page even when host and leaf are on different Vue majors. Resolves hermiq#44 systemically and unblocks the hermiq, decidesk, and openconnector leaves.

Problem (confirmed live — hermiq#44)

ADR-019 leaf rendering passes a sibling app's SFC to the host's dynamic-component renderer. It works only when host and leaf share a Vue major. Host (OpenBuild/OR via @conduction/nextcloud-vue v1) = Vue 2.7; hermiq/decidesk/openconnector leaves = Vue 3. A Vue-3-compiled SFC crashes under the Vue-2.7 renderer (blank body, undefined data reads). Only built-ins render, because the host swaps them to its own local SFC (LIB_INTEGRATION_COMPONENTS, openregister#1958). A bespoke cross-major component has no local twin, so it hits the raw cross-Vue trap.

Design

A render-surface leaf MAY supply mount(el, props) + unmount(el) (renderMode: 'mount') instead of the SFC tab/widget. The host renders a bare container element; the leaf instantiates its own framework (createApp(...).mount(el)) inside it and tears down on unmount. The DOM element is the neutral hand-off — each side runs its own Vue. Host consumers (CnObjectSidebar / CnDetailPage / CnDashboardPage) grow the mount lifecycle (mount on show, unmount on hide/teardown, re-mount on object change, error isolation). LeafDescriptor.renderMode carries the mode to discovery + parity. The SFC path stays the default for same-major/built-in leaves (backward compatible). Command boundary is unchanged (ADR-041); ADR-066 (render-and-read boundary) is amended with the mount clause.

Deliverable

openspec/changes/leaf-mount-render-escape-hatch/proposal.md, design.md (mount contract, host lifecycle, renderMode metadata, gate-24 parity implication, ADR-066 amendment text, leaf migration list), specs/leaf-mount-render/spec.md (6 normative requirements), tasks.md (split by repo). openspec validate --strict clean.

Proposal only — do NOT merge. For human review.

@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/openregister @ cdaad0f

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 174/174
npm ✅ 555/555
PHPUnit
Newman
Playwright ⏭️

Quality workflow — 2026-07-25 21:05 UTC

Download the full PDF report from the workflow artifacts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant