Skip to content

feat(shadcn-renderers): DialogRender — 12/12, the last placeholder closed - #52

Open
ryandmonk wants to merge 3 commits into
mainfrom
feat/shadcn-dialog-renderer
Open

feat(shadcn-renderers): DialogRender — 12/12, the last placeholder closed#52
ryandmonk wants to merge 3 commits into
mainfrom
feat/shadcn-dialog-renderer

Conversation

@ryandmonk

Copy link
Copy Markdown
Contributor

Measured first: across the whole studio corpus (19 files: contracts-build surfaces + replay fixtures) the shadcn registry already renders 100% of emitted instances. The 11/12 coverage was a completeness asymmetry with Astryx, not a rendering gap — Dialog is declared catalog vocabulary no corpus surface emits (0 instances).

  • DialogRender: inline canvas posture (title + child, role=dialog, no portal/Radix), matching AlertDialogRender; variant widens, purpose is a data attribute.
  • Parity invariant inverted to the correctness direction: every emitted component has a renderer (non-vacuous via >100 instances), rather than requiring the corpus to exercise every renderer — a registry may cover vocabulary a given corpus doesn't use.
  • Focused dialog-render.test.tsx verifies the markup (Dialog has no corpus parity coverage by construction).

shadcn-renderers 20/20; web typecheck clean. Closes the advertised placeholder; restores Astryx/shadcn symmetry.

🤖 Generated with Claude Code

ryandmonk and others added 2 commits August 6, 2026 21:45
…sion, at last

The 0.5.0 foundation release integration, and the retirement of a trace-risk
on the register since July: the dependency tree previously carried TWO
emitter versions (0.4.1 direct, 0.3.1 via dspack-gen's lockfile-frozen
range), which is exactly the divergence that could evade gate A3. With
dspack-gen 0.2.1 admitting the new emitter, the tree now resolves exactly
one dspack-emit@0.5.0 and one dspack-gen@0.2.1, regenerated from the npm
registry with no file, tarball, override, or worktree references.

Consumer behavior is proven identical, not assumed: the committed catalogs
rebuild byte-identically under 0.5.0 (v1 profiles are byte-frozen by the
emitter's own pinned gates), the shadcn contract pin stays at v2.3.0 @
805732c (sha256 verified, self-announcing), and the full battery is green —
155 unit tests across seven packages plus agent and web, renderer parity,
typechecks, both static exports, exhibit Playwright 106, composer
agent-mode + accessibility 42.

Ranges: packages/contracts pins emit exactly (0.5.0, the byte-sync
discipline); apps/agent and apps/composer take ^0.5.0 (composer's was in
devDependencies — the single-version proof caught the miss); web/composer/
agent take gen ^0.2.1.

No representation capabilities are consumed by this swap: profile v2,
fidelity, --strict-surface and functions ship in the emitter but Studio's
profiles remain v1 and byte-identical. T1-T5 remain unimplemented. No
contract pin moves. No v3 migration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…lder — 12/12

Measured first (2026-08-08): across the whole studio corpus — 19 files,
contracts-build surfaces + replay fixtures — the shadcn registry already
renders 100% of emitted instances. The 11/12 coverage was a completeness
asymmetry with Astryx, not a rendering gap: 'Dialog' is declared catalog
vocabulary that NO worked example, scenario, or replay fixture emits (0
instances), so the placeholder was never actually hit in production.

DialogRender draws the governed content (title + child) inline with
shadcn's dialog-content idiom — same canvas posture as AlertDialogRender,
no portal, no Radix in the bundle. variant widens the surface; purpose is
carried as a data attribute without inventing chrome the catalog doesn't
model. This removes the advertised placeholder and restores Astryx/shadcn
symmetry at near-zero cost.

The corpus-exercise parity invariant was inverted to the direction that is
actually a correctness property: every EMITTED component must have a
renderer (no unimplemented instance), non-vacuous via >100 instances. The
reverse — every renderer must be exercised by THIS corpus — is not
correctness: a registry may cover catalog vocabulary a given corpus does
not use. DialogRender is verified by a focused render test instead.

shadcn-renderers 20/20; web typecheck clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings August 8, 2026 04:02

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR completes the shadcn renderer registry by adding a concrete Dialog visual (DialogRender) and updates parity/guard tests to reflect full catalog coverage, alongside bumping related dspack-* dependencies.

Changes:

  • Add DialogRender and register it in the shadcn registry (12/12 catalog components now have visuals).
  • Update parity tests to assert no unimplemented catalog names remain, and add a focused dialog-render.test.tsx.
  • Bump @aestheticfunction/dspack-emit to 0.5.0 and @aestheticfunction/dspack-gen to 0.2.1 across apps/packages and lockfile.

Reviewed changes

Copilot reviewed 10 out of 11 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
pnpm-lock.yaml Updates lockfile entries for bumped dspack-* dependencies.
packages/shadcn-renderers/src/registry.tsx Registers DialogRender and updates registry coverage commentary.
packages/shadcn-renderers/src/registry-parity.test.ts Updates parity assertion to require zero unimplemented components and includes Dialog in custom.
packages/shadcn-renderers/src/emitted-prop-parity.test.tsx Adjusts “corpus exercises registry” guard to assert emitted components are renderer-backed.
packages/shadcn-renderers/src/dialog-render.test.tsx Adds focused tests for the new DialogRender markup and variants.
packages/shadcn-renderers/src/components/DialogRender.tsx Introduces the new inline dialog renderer implementation.
packages/contracts/package.json Bumps @aestheticfunction/dspack-emit to 0.5.0.
apps/web/package.json Bumps @aestheticfunction/dspack-gen to ^0.2.1.
apps/web/app/design-system.tsx Updates shadcn design-system note to reflect full 12/12 rendering coverage.
apps/composer/package.json Bumps @aestheticfunction/dspack-gen to ^0.2.1 and @aestheticfunction/dspack-emit to ^0.5.0.
apps/agent/package.json Bumps @aestheticfunction/dspack-emit to ^0.5.0 and @aestheticfunction/dspack-gen to ^0.2.1.
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +9 to 11
* measured production renderer gap. The placeholder mechanism itself stays
* exercised by the parity suite, which proves the complement is now empty.
*/
Comment on lines +26 to +27
aria-labelledby={props.title ? titleId : undefined}
data-purpose={props.purpose ?? undefined}
Comment on lines +44 to +45
expect(html).not.toContain("<h2");
expect(html).toContain("body:c");
…laceholder

The two design-swap honesty specs asserted the old '11 of 12' / 'unimplemented
placeholder' copy — the note that advertised the Dialog gap. shadcn is now
12/12 (DialogRender), so the honest note reads 'All 12 catalog components
render through vendored shadcn/ui visuals', and the specs assert that instead.
The check still verifies the note reflects true coverage — the honesty
property is preserved, its value updated.

docs/renderer-abstraction.md updated: the swap covers all 12 names; the
unimplemented FALLBACK mechanism remains (a registry may still leave a name
unrendered) and is exercised by the parity suite rather than a shipped gap.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.

2 participants