feat(shadcn-renderers): DialogRender — 12/12, the last placeholder closed - #52
Open
ryandmonk wants to merge 3 commits into
Open
feat(shadcn-renderers): DialogRender — 12/12, the last placeholder closed#52ryandmonk wants to merge 3 commits into
ryandmonk wants to merge 3 commits into
Conversation
…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>
There was a problem hiding this comment.
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
DialogRenderand 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-emitto0.5.0and@aestheticfunction/dspack-gento0.2.1across 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 —
Dialogis declared catalog vocabulary no corpus surface emits (0 instances).DialogRender: inline canvas posture (title + child, role=dialog, no portal/Radix), matchingAlertDialogRender; variant widens, purpose is a data attribute.dialog-render.test.tsxverifies 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