docs/sync/shadcn/runs/2026-05-29-4a4dc8e-to-efdec3c-editors-blocks-style/plan.md
shadcn-ui/ui../shadcn/apps/v44a4dc8eb0fc793d8e9225e780183ad605f15d2c2360e8a19c3ee13ac78b656027462007c8bdaa6d5efdec3ca4523e5edd8a714f633002a7addc203a1 (2026-05-29, fix(styles): restore primary button hover for Nova and Lyra (#10807))http://localhost:3003/editors to upstream /blocks styleapps/wwwdocs/sync/shadcn/status.jsonRecommendation: smart-merge the upstream /blocks page framing into Plate /editors, but keep Plate's editor demo content and remove the upstream product controls the user rejected.
The useful upstream shape is:
PageHeader with the same page header/action rhythmcontainer-wrapper flex-1 section-soft md:py-12flex flex-col gap-12 md:gap-24Do not import:
PageNav/BlocksNav category stripBrowse all blocksOpen in v0Browse more blocks, and do not create Browse more editorsThis scoped plan cannot advance lastSyncedCommit; it accounts only for the /editors visual parity slice and a small set of upstream block-demo rows.
Screenshots are saved under screenshots/:
shadcn-blocks-desktop.png: http://localhost:4000/blocks, 1175x1239plate-editors-desktop-before.png: http://localhost:3003/editors, 1175x1239shadcn-blocks-mobile.png: http://localhost:4000/blocks, 390x844plate-editors-mobile-before.png: http://localhost:3003/editors, 390x844Measured deltas:
| Surface | Upstream /blocks | Plate /editors | Decision |
|---|---|---|---|
| Header | centered PageHeader, desktop top=64 height=335 | left-aligned header inside route container, desktop top=64 height=220 | smart-merge centered upstream header style with Plate copy |
| Page nav | present, top=399 height=64, includes Featured/Sidebar/Login/Signup and Browse all blocks | absent | keep absent; user explicitly rejected this wrapper |
| Content background | section-soft full-width band, desktop top=463 height=5620 | no section-soft, white body | adopt section-soft wrapper |
| First card desktop | left=40 top=511 width=1095 height=1048 | left=16 top=284 width=1143 height=694 | adopt upstream content-band spacing, keep Plate cards |
| First card mobile | left=24 top=410 width=342 height=243 | left=16 top=270 width=358 height=694 | adopt upstream mobile side padding/top rhythm, keep Plate card heights |
| v0 | upstream block viewer includes Open in v0 | Plate currently absent | keep absent |
| bottom CTA | upstream /blocks includes Browse more blocks | Plate /editors currently absent | keep absent; user explicitly said no Browse more editors |
The first upstream screenshot attempt failed because NEXT_PUBLIC_APP_URL was missing; the upstream dev server was restarted with NEXT_PUBLIC_APP_URL=http://localhost:4000, then screenshots were recaptured successfully.
Full table: inventory.md
| Decision | Count | Notes |
|---|---|---|
smart-merge | 4 | Current upstream /blocks route/display files used as visual reference. |
exclude-upstream | 15 | User-rejected nav/v0/browse surfaces plus upstream block demo content. |
no-op | 1 | Category route not relevant after excluding category nav. |
| out-of-scope | 739 | Default full sync lane remains pending. |
None in the scoped changed rows.
Scoped changed upstream rows are 12 registry block-demo files under apps/v4/registry/bases/{base,radix}/blocks/**. They are upstream product demo content from the Rhea/block surface. Decision: exclude-upstream.
Current upstream reference files used for smart merge:
apps/v4/app/(app)/blocks/layout.tsxapps/v4/app/(app)/blocks/page.tsxapps/v4/components/block-display.tsxapps/v4/components/block-viewer.tsxNone in the scoped changed rows.
| Order | Slice | Class | Files | Why | Verification |
|---|---|---|---|---|---|
| 1 | Editors page shell parity | smart-merge | apps/www/src/app/(app)/editors/layout.tsx, apps/www/src/app/(app)/editors/editor-description.tsx, apps/www/src/app/(app)/editors/page.tsx | Best take: make /editors read like shadcn /blocks while preserving Plate editor demos. Move to centered PageHeader, add section-soft, use upstream vertical list spacing, remove old left-aligned header rhythm. | Browser screenshots /editors desktop/mobile; assert no Featured, Sidebar, Login, Signup, Browse all blocks, Open in v0, or Browse more editors; run focused eslint/typecheck. |
| 2 | BlockViewer toolbar cleanup for editors | smart-merge | apps/www/src/components/block-viewer.tsx, maybe apps/www/src/components/block-display.tsx | Only if slice 1 still leaves toolbar density mismatched. Copy upstream spacing/button proportions where useful, but keep Plate install command, code/source model, /view/[name], Pro button, and no v0. | Browser metrics on first /editors block toolbar; eslint/typecheck. |
PageNav and BlocksNav category strip. The user pasted the wrapper as unwanted.Browse all blocks.Open in v0 and all v0 buttons/routes/copy.Browse more blocks; do not replace it with Browse more editors.apps/v4/registry/bases/**/blocks/**./create, /charts, /colors, Rhea/style/theme, and generated style registry surfaces unless the user explicitly opens those lanes.getAllBlocks() and apps/www/src/registry/**.BlockViewer registry-source/code-view behavior and /view/[name].@plate/*.Take from upstream:
Keep Plate-owned:
Browse Editors hero action if retained, but point only to #blocks@plate install commandsNone. The user already made the policy calls for the three ambiguous surfaces: no category nav wrapper, no Open in v0, no Browse more editors.
This scoped plan must not advance lastSyncedCommit. It updates lastPlannedCommit to the current upstream target because the plan was written against origin/main, but it only accounts for this /editors visual scope. The default full sync lane remains pending for 739 out-of-scope rows.
Implemented slices 1 and 2 on 2026-05-29.
Files changed:
apps/www/src/app/(app)/editors/layout.tsxapps/www/src/app/(app)/editors/editor-description.tsxapps/www/src/app/(app)/editors/page.tsxapps/www/src/components/block-viewer.tsxdocs/sync/shadcn/status.jsonResult:
/editors uses the upstream-style centered PageHeader.container-wrapper flex-1 section-soft md:py-12.flex flex-col gap-12 md:gap-24.PageNav/BlocksNav, Browse all blocks, Open in v0, and Browse more editors remain excluded.lastSyncedCommit remains 4a4dc8eb0fc793d8e9225e780183ad605f15d2c2; this landed as a partialSyncs entry only.BlockViewer adopts the upstream /blocks toolbar order and density: device controls, open-new-tab, refresh, then command/pro action.@plate install command model, lazy source/code behavior, /view/[name], and Pro/Potion Get the code behavior.Open in v0 action remains excluded.Verification:
pnpm --filter www exec eslint 'src/app/(app)/editors/layout.tsx' 'src/app/(app)/editors/editor-description.tsx' 'src/app/(app)/editors/page.tsx' --fixpnpm --filter www exec eslint src/components/block-viewer.tsx --fixpnpm --filter www typecheckhttp://localhost:3003/editors at 1175x1239 and 390x844: centered header, section-soft present, Plate demos retained, no Featured/Sidebar/Login/Signup category nav, no Browse all blocks, no Open in v0, no Browse more editors, and no horizontal overflow.http://localhost:3002/editors at 1175x1239 and 390x844: toolbar has visible device controls/open-new-tab/refresh before the command pill on desktop, refresh reloads iframe content, Open in v0 remains absent, and mobile has no horizontal overflow.Screenshots:
screenshots/plate-editors-desktop-after.pngscreenshots/plate-editors-mobile-after.pngscreenshots/plate-editors-toolbar-desktop-after.pngscreenshots/plate-editors-toolbar-mobile-after.pngupstream-name-status.tsvupstream-numstat.tsvupstream-commits.txtscope-name-status.tsvtarget-reference-files.tsvinventory.mdscreenshots/*.png