Repository navigation
fix(rendering): stabilize Phase 4 parity and editor lifecycle - #18
Conversation
|
Warning Review limit reached
Next review available in: 13 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (21)
📝 WalkthroughWalkthroughThe PR adds deferred revision delivery, persisted-artifact publishing, canonical render validation, canvas selection resizing, list and description-list semantics, editable-tree mutations, save retries, and expanded validation coverage. ChangesRendering and persistence
Canvas and editor
List rendering
Supporting validation
Estimated code review effort: 5 (Critical) | ~120 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 10
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
aria/lib/storage/internal/domains/pageLifecycle.ts (1)
394-415: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick winThe unchanged-content early return omits linked-layout media sync.
This branch runs when
preparedLinkedLayoutexists and is unchanged. It calls onlysyncPageUsage. The reconciliation branch at Lines 350-363 also callssyncMediaUsageBestEffort("layout", ...)for the same unchanged-layout state. Make the two branches perform the same post-commit work.🐛 Proposed fix
await settlePostCommit([ () => context.syncPageUsage(id, normalizedDSL), + ...(preparedLinkedLayout + ? [ + () => + context.syncMediaUsageBestEffort( + "layout", + preparedLinkedLayout.id, + preparedLinkedLayout.dsl, + ), + ] + : []), ]);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@aria/lib/storage/internal/domains/pageLifecycle.ts` around lines 394 - 415, The unchanged-content early-return branch in the page lifecycle flow omits linked-layout media synchronization. Update the settlePostCommit callbacks in the branch using shouldSkipIfContentUnchanged and preparedLinkedLayout so it also invokes syncMediaUsageBestEffort("layout", ...) with the same arguments as the reconciliation branch, while preserving the existing syncPageUsage call and return behavior.
🧹 Nitpick comments (10)
aria/tests/features/nodes/nodeEventHandlers.extracted.test.ts (2)
1324-1392: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd coverage for the unresolved-node branch.
The new tests cover missing content and fetch failure. No test calls
handleDetachComponentorhandleReplaceBlockWithComponentwith anodeIdthat is absent from the editable tree. That branch returns early fromresolveEditableComponentTreeand emits the error toast. Add a case that asserts no mutation, no history entry, and the expected message.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@aria/tests/features/nodes/nodeEventHandlers.extracted.test.ts` around lines 1324 - 1392, Add test coverage for the unresolved-node branch by invoking handleDetachComponent (or handleReplaceBlockWithComponent) with a nodeId absent from the editable tree. Assert the tree remains unchanged, executeNodeEventOperation is not called, and the error toast receives the expected unresolved-node message.
1497-1502: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAssert that the component fields are removed after undo.
toMatchObjectchecks only the listed keys. If a future change restored the node with a stalecomponentReforreference, this assertion would still pass and the block would still render as a component instance. Add explicit checks for the removed fields.♻️ Proposed stronger undo assertion
await historyCallbacks?.undo(); - expect(currentLayout.value?.slots?.[0]?.defaultContent?.[0]).toMatchObject({ - id: "header-heading", - type: "Heading", - }); + const restored = currentLayout.value?.slots?.[0]?.defaultContent?.[0]; + expect(restored).toMatchObject({ + id: "header-heading", + type: "Heading", + }); + expect(restored?.componentRef).toBeUndefined(); + expect(restored?.reference).toBeUndefined();🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@aria/tests/features/nodes/nodeEventHandlers.extracted.test.ts` around lines 1497 - 1502, Strengthen the undo assertion after historyCallbacks?.undo() by explicitly verifying that the restored header-heading node does not contain the removed component fields, including componentRef and reference. Keep the existing id and type checks while asserting those fields are absent rather than relying solely on toMatchObject.aria/admin/features/Stage/components/CanvasOverlayLayer.vue (2)
1006-1008: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRepeated identical announcements are not read out.
resizeAnnouncementkeeps its previous value after a commit. If the next resize produces the same size text, the value does not change and assistive technology announces nothing. Clear the value before you set the new text, or append a changing suffix.♿ Proposed fix in `commitResizeSession`
+ resizeAnnouncement.value = ""; resizeAnnouncement.value = `Resized to ${formatCanvasSelectionSize(finalSize)} pixels`;🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@aria/admin/features/Stage/components/CanvasOverlayLayer.vue` around lines 1006 - 1008, Update commitResizeSession so resizeAnnouncement is cleared before assigning the newly computed resize message, ensuring identical consecutive resize announcements are exposed as value changes while preserving the existing announcement text.
488-521: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winThe 2px dead zone freezes the preview near the start point.
The handler computes
nextSizefirst, then returns when both movement components are below 2px. After the drag passes the threshold, a move back toward the start point re-enters the dead zone and stops updatingcurrentSize. The committed size then does not match the pointer position.Evaluate the threshold once, at drag start, instead of on every move.
♻️ Proposed change
- const movementX = Math.abs( - event.clientX - (session.startClientX ?? event.clientX), - ); - const movementY = Math.abs( - event.clientY - (session.startClientY ?? event.clientY), - ); - if (movementX < 2 && movementY < 2) { - return; - } - session.hasChanged = true; + if (!session.hasChanged) { + const movementX = Math.abs( + event.clientX - (session.startClientX ?? event.clientX), + ); + const movementY = Math.abs( + event.clientY - (session.startClientY ?? event.clientY), + ); + if (movementX < 2 && movementY < 2) { + return; + } + session.hasChanged = true; + }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@aria/admin/features/Stage/components/CanvasOverlayLayer.vue` around lines 488 - 521, Update handleResizePointerMove so the 2px movement threshold is evaluated only once before marking the resize session as changed, such as by guarding the initial movement in the session state. After the threshold is crossed, continue updating currentSize and queueResizePreview for every subsequent pointer move, including movement back toward the start point.aria/lib/cloudflare/waitUntil.ts (1)
23-29: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winHandle a throwing
waitUntilcall.
context.waitUntilthrows when the Cloudflare execution context is already finalized. The exception then propagates into the caller, and the task is neither deferred nor awaited. Returnfalseon failure so the caller awaits the same work.♻️ Proposed refactor
const context = locals?.cfContext; if (!isWaitUntilContext(context)) { return false; } - context.waitUntil(task); - return true; + try { + context.waitUntil(task); + return true; + } catch { + return false; + } }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@aria/lib/cloudflare/waitUntil.ts` around lines 23 - 29, Update the waitUntil handling in the visible context-checking function to catch exceptions thrown by context.waitUntil(task). Return true only when scheduling succeeds; on failure, return false so the caller awaits the task, while preserving the existing invalid-context behavior.aria/admin/features/Stage/composables/useIframeSetup.ts (1)
111-113: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winShare one global stylesheet URL resolver between the iframe bootstrap and the live head sync. Both sites now implement the same contract: skip the link when inline
globalCSSexists, otherwise build/styles/global.cssand append?v=<encoded cacheKey>when a cache key is available. The route insrc/pages/styles/global.css.tsderives itsCache-Controlvalue from thatvparameter, so any drift between the two producers changes caching behavior.
aria/admin/features/Stage/composables/useIframeSetup.ts#L111-L113: exportresolveStageGlobalCssHrefas the single source of truth for this URL.aria/admin/features/Stage/components/StageFrame.vue#L680-L684: import that helper insyncGlobalCssLinkand remove the inlinecacheKeyandhrefcomputation.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@aria/admin/features/Stage/composables/useIframeSetup.ts` around lines 111 - 113, The global stylesheet URL logic is duplicated between the iframe setup and live head sync. In aria/admin/features/Stage/composables/useIframeSetup.ts:111-113, export resolveStageGlobalCssHref as the shared resolver; in aria/admin/features/Stage/components/StageFrame.vue:680-684, import and use it within syncGlobalCssLink, removing the local cacheKey and href computation.aria/actions/publishing.ts (2)
194-194: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winMark
skipCSSRegenerationas ignored in the publish input contract.The single-page publish path now discards
skipCSSRegeneration, butPublishPageInputSchemastill accepts it. Batch publish still honors the same field name. A caller can reasonably expect the flag to control CSS regeneration in both paths. Document the field as deprecated on the schema, or remove it and keep the batch-only flag distinct.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@aria/actions/publishing.ts` at line 194, Update PublishPageInputSchema to reflect that skipCSSRegeneration is ignored by the single-page publish path: either mark the field deprecated with appropriate schema documentation while preserving batch compatibility, or remove it from the single-page schema and use a distinct batch-only field name. Keep the existing batch publish behavior intact.
205-205: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
htmlSizeis now always zero in the publish response.Publishing no longer renders HTML, so
htmlSizeis a constant0in both the scheduled and published responses.useSavePublish.tsstill logs it as${(publishedData.htmlSize / 1024).toFixed(2)}KB, which always prints0.00KB. Remove the field from the response payload, or replace it with the stored snapshot size.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@aria/actions/publishing.ts` at line 205, Update the publishing response construction around htmlSize so it no longer returns a misleading constant zero; remove htmlSize from both scheduled and published payloads, or populate it from the stored snapshot size. Ensure useSavePublish.ts no longer expects or logs the obsolete zero-valued field.aria/tests/core/useSavePublish.test.ts (1)
750-765: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd coverage for the returned-error retry branch.
Both new tests reject the promise, which exercises only the
catchpath ofrunAmbiguousSaveRetry. The branch atuseSavePublish.tsline 311 handles a resolved result whoseerroris ambiguous, for example{ error: { code: "SERVICE_UNAVAILABLE" } }or{ error: { status: 503 } }. Add one test that returns such a result and asserts a second attempt.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@aria/tests/core/useSavePublish.test.ts` around lines 750 - 765, Add a test alongside the existing ambiguous component save retry test that makes the first save attempt resolve with an ambiguous error object, such as SERVICE_UNAVAILABLE or status 503, instead of rejecting. Assert that runAmbiguousSaveRetry performs a second save attempt and preserves the same payload, covering the resolved-error branch in useSavePublish.aria/actions/library.ts (1)
217-225: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winDeduplicate the
packIdfallback logic.Line 218 and Line 848 both compute
ARIA_FREE_BUTTON_COMPONENT.packId ?? "aria-free-pack"independently. If a future change updates one occurrence and not the other,resolveStarterButtonPackVersioncan resolve against a different pack manifest entry than the one recorded on the installed component. Extract a single helper or constant for the starter button pack ID and reuse it in both places.♻️ Proposed refactor
+const STARTER_BUTTON_PACK_ID = + ARIA_FREE_BUTTON_COMPONENT.packId ?? "aria-free-pack"; + export function resolveStarterButtonPackVersion(): string { - const packId = ARIA_FREE_BUTTON_COMPONENT.packId ?? "aria-free-pack"; return ( - SEEDED_REGISTRY_MANIFEST.packs.find((pack) => pack.id === packId) + SEEDED_REGISTRY_MANIFEST.packs.find( + (pack) => pack.id === STARTER_BUTTON_PACK_ID, + ) ?.version ?? ARIA_FREE_BUTTON_COMPONENT.version ?? "1.0.0" ); }const normalized = { ...ARIA_FREE_BUTTON_COMPONENT, source: "aria" as const, - packId: ARIA_FREE_BUTTON_COMPONENT.packId ?? "aria-free-pack", + packId: STARTER_BUTTON_PACK_ID, packVersion: resolveStarterButtonPackVersion(),Also applies to: 845-853
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@aria/actions/library.ts` around lines 217 - 225, Deduplicate the starter pack ID fallback used by resolveStarterButtonPackVersion and the installed-component logic around the second occurrence. Extract a shared helper or constant for ARIA_FREE_BUTTON_COMPONENT.packId ?? "aria-free-pack", then reuse it in both locations so manifest lookup and component recording always use the same pack ID.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/publish-npm.yml:
- Line 38: Add npm run check:type-safety to the publish workflow before the
existing test/check commands, alongside check:push-guards. Keep the command
ordering consistent with ci.yml so type-safety validation runs before tests.
In `@aria/actions/_shared.ts`:
- Around line 191-196: Update all three save paths that call
touchContentRevision so failures after the resource write commits are handled as
best-effort: catch and log revision errors without propagating them from
saveResource or reporting the already-persisted save as failed. Preserve the
successful revision logging and include appropriate diagnostics in the failure
log.
In `@aria/actions/nodes.ts`:
- Around line 77-127: Update withGeneratedNodeId to recursively process each
node’s children, generating an ID for every descendant while preserving existing
valid IDs and non-node values. Ensure parsePreflightedBuilderNode with
generateMissingId: true can successfully validate complete BuilderNode subtrees
through BuilderNodeSchema.safeParse.
In `@aria/admin/features/Core/composables/useSavePublish.ts`:
- Around line 305-320: The retry flow in runAmbiguousSaveRetry must reconcile
the expected version before re-sending ambiguous saves. Ensure retries of
actions.saveComponent and actions.updateItem for layouts refresh or otherwise
synchronize their stale expected-version state after a failed-to-fetch response,
while preserving the existing two-attempt and unknown-status behavior.
In `@aria/admin/features/Nodes/events/useNodeComponentHandlers.ts`:
- Around line 167-172: Update the missing-tree branch in handleDetachComponent
when resolveEditableComponentTree(nodeId) returns null to display a distinct
“node not found” error message instead of “Not a component instance”; leave the
component-instance handling unchanged.
In `@aria/admin/features/Stage/components/CanvasOverlayLayer.vue`:
- Around line 260-262: Update getResizeHandleLabel to use the component’s
existing useStudioI18n t() helper with a new localized message key, preserving
the handle-specific label. Also replace the hardcoded resize announcement around
the existing line-406 logic with t() and add the corresponding message key(s),
following the established composer.toolbar.* or common.* localization pattern.
In `@aria/lib/blocks/htmlToNodes.ts`:
- Around line 569-574: Update IMPORTED_LIST_STYLE_UTILITY_PATTERN to accept
list-circle and list-square, and update IMPORTED_PADDING_UTILITY_PATTERN to
accept py, pt, and pb utilities alongside the existing variants. Add regression
coverage for classes such as list-square py-6, verifying the fallback preserves
the list marker and vertical padding instead of applying listStyleType: none or
padding: 0.
In `@aria/lib/storage/internal/domains/dslAssets.ts`:
- Around line 158-180: Revalidate the version before unchanged-content early
returns in both dslAssets.ts sites: the layout path around lines 158-180 must
call context.resolveLayoutVersionState(id), and the component path around lines
456-486 must call context.resolveComponentVersionState(id). Compare the
re-resolved currentVersion with the expected version and raise
VersionConflictError if it changed; only then return the latest version after
syncing usage.
In `@aria/tests/storage/cloudflare-storage.test.ts`:
- Around line 468-483: Add an explicit expect(atomicLayoutVersion).toBeDefined()
immediately after the atomicLayoutVersion assignment in
aria/tests/storage/cloudflare-storage.test.ts lines 468-483 and
aria/tests/storage/sqlite-storage.test.ts lines 685-700, so the subsequent
layout-version comparisons cannot pass when getLayoutDSL returns null.
In `@src/pages/styles/global.css.ts`:
- Around line 56-60: Update the 304 response branch before the main
Cache-Control logic to include the same Cache-Control value derived from
isPreviewRequest and hasMatchingVersion, alongside ETag. Ensure matching preview
requests receive no-store, must-revalidate and requests without a matching v
receive no-cache, must-revalidate.
---
Outside diff comments:
In `@aria/lib/storage/internal/domains/pageLifecycle.ts`:
- Around line 394-415: The unchanged-content early-return branch in the page
lifecycle flow omits linked-layout media synchronization. Update the
settlePostCommit callbacks in the branch using shouldSkipIfContentUnchanged and
preparedLinkedLayout so it also invokes syncMediaUsageBestEffort("layout", ...)
with the same arguments as the reconciliation branch, while preserving the
existing syncPageUsage call and return behavior.
---
Nitpick comments:
In `@aria/actions/library.ts`:
- Around line 217-225: Deduplicate the starter pack ID fallback used by
resolveStarterButtonPackVersion and the installed-component logic around the
second occurrence. Extract a shared helper or constant for
ARIA_FREE_BUTTON_COMPONENT.packId ?? "aria-free-pack", then reuse it in both
locations so manifest lookup and component recording always use the same pack
ID.
In `@aria/actions/publishing.ts`:
- Line 194: Update PublishPageInputSchema to reflect that skipCSSRegeneration is
ignored by the single-page publish path: either mark the field deprecated with
appropriate schema documentation while preserving batch compatibility, or remove
it from the single-page schema and use a distinct batch-only field name. Keep
the existing batch publish behavior intact.
- Line 205: Update the publishing response construction around htmlSize so it no
longer returns a misleading constant zero; remove htmlSize from both scheduled
and published payloads, or populate it from the stored snapshot size. Ensure
useSavePublish.ts no longer expects or logs the obsolete zero-valued field.
In `@aria/admin/features/Stage/components/CanvasOverlayLayer.vue`:
- Around line 1006-1008: Update commitResizeSession so resizeAnnouncement is
cleared before assigning the newly computed resize message, ensuring identical
consecutive resize announcements are exposed as value changes while preserving
the existing announcement text.
- Around line 488-521: Update handleResizePointerMove so the 2px movement
threshold is evaluated only once before marking the resize session as changed,
such as by guarding the initial movement in the session state. After the
threshold is crossed, continue updating currentSize and queueResizePreview for
every subsequent pointer move, including movement back toward the start point.
In `@aria/admin/features/Stage/composables/useIframeSetup.ts`:
- Around line 111-113: The global stylesheet URL logic is duplicated between the
iframe setup and live head sync. In
aria/admin/features/Stage/composables/useIframeSetup.ts:111-113, export
resolveStageGlobalCssHref as the shared resolver; in
aria/admin/features/Stage/components/StageFrame.vue:680-684, import and use it
within syncGlobalCssLink, removing the local cacheKey and href computation.
In `@aria/lib/cloudflare/waitUntil.ts`:
- Around line 23-29: Update the waitUntil handling in the visible
context-checking function to catch exceptions thrown by context.waitUntil(task).
Return true only when scheduling succeeds; on failure, return false so the
caller awaits the task, while preserving the existing invalid-context behavior.
In `@aria/tests/core/useSavePublish.test.ts`:
- Around line 750-765: Add a test alongside the existing ambiguous component
save retry test that makes the first save attempt resolve with an ambiguous
error object, such as SERVICE_UNAVAILABLE or status 503, instead of rejecting.
Assert that runAmbiguousSaveRetry performs a second save attempt and preserves
the same payload, covering the resolved-error branch in useSavePublish.
In `@aria/tests/features/nodes/nodeEventHandlers.extracted.test.ts`:
- Around line 1324-1392: Add test coverage for the unresolved-node branch by
invoking handleDetachComponent (or handleReplaceBlockWithComponent) with a
nodeId absent from the editable tree. Assert the tree remains unchanged,
executeNodeEventOperation is not called, and the error toast receives the
expected unresolved-node message.
- Around line 1497-1502: Strengthen the undo assertion after
historyCallbacks?.undo() by explicitly verifying that the restored
header-heading node does not contain the removed component fields, including
componentRef and reference. Keep the existing id and type checks while asserting
those fields are absent rather than relying solely on toMatchObject.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 0d57d05c-e4f8-43a1-9503-2468b925cf72
📒 Files selected for processing (92)
.github/workflows/ci.yml.github/workflows/publish-npm.ymlaria/actions/_shared.tsaria/actions/library.tsaria/actions/nodes.tsaria/actions/publishing.tsaria/actions/save.tsaria/actions/styles/renderStyles.tsaria/admin/components/ui/color-picker/ColorField.vuearia/admin/composables/useCanvasOverlays.tsaria/admin/features/Agent/client/composables/useAgentClientTools.tsaria/admin/features/Agent/lib/tools/content/nodeWriteTools.tsaria/admin/features/Composer/components/ComposerCanvasOptionsMenu.vuearia/admin/features/Composer/components/ComposerSidebar.vuearia/admin/features/Composer/components/ComposerStage.vuearia/admin/features/Core/components/AppCanvasShell.vuearia/admin/features/Core/composables/useSavePublish.tsaria/admin/features/Core/types/shell.tsaria/admin/features/Inspector/inputs/ListProperty.vuearia/admin/features/Inspector/schemas/list.schema.tsaria/admin/features/Nodes/events/useNodeComponentHandlers.tsaria/admin/features/Stage/StageApp.vuearia/admin/features/Stage/components/CanvasOverlayLayer.vuearia/admin/features/Stage/components/CmsQuickPicker.vuearia/admin/features/Stage/components/MotionQuickPicker.vuearia/admin/features/Stage/components/SelectionToolbarCmsControls.vuearia/admin/features/Stage/components/SelectionToolbarMotionControl.vuearia/admin/features/Stage/components/StageCanvasRuntime.vuearia/admin/features/Stage/components/StageFrame.vuearia/admin/features/Stage/components/StageSidebar.vuearia/admin/features/Stage/composables/useIframeSetup.tsaria/admin/features/Stage/composables/useStageAppBindings.tsaria/admin/features/Stage/composables/useStageDisplayState.tsaria/admin/features/Stage/composables/useStageShellBindings.tsaria/admin/features/Stage/composables/useStageWorkspaceBindings.tsaria/admin/features/Stage/types/index.tsaria/admin/features/Stage/utils/canvasRenderAttributes.tsaria/admin/features/Stage/utils/canvasSelectionResize.tsaria/admin/features/Studio/pages/PageDetailView.vuearia/admin/features/Studio/pages/composables/usePageActions.tsaria/admin/i18n/messages/composer/core.tsaria/admin/lib/actions/actionResult.tsaria/admin/types/app.tsaria/lib/blocks/htmlToNodes.tsaria/lib/blocks/listNodes.tsaria/lib/blocks/nodesToHtml.tsaria/lib/blocks/renderSemantics.tsaria/lib/cloudflare/waitUntil.tsaria/lib/content-sync/mutations.tsaria/lib/migrations/propMigrations.tsaria/lib/rendering/canonical/contract.tsaria/lib/rendering/canonical/index.tsaria/lib/schemas/nodes.tsaria/lib/storage/internal/domains/dslAssets.tsaria/lib/storage/internal/domains/pageLifecycle.tsaria/lib/storage/internal/domains/surfaceNormalization.tsaria/scripts/check-rendering-writer-boundaries.tsaria/scripts/project-command.tsaria/tests/actions/library-pack-version.test.tsaria/tests/actions/nodes-render-contract.test.tsaria/tests/actions/render-styles-action.test.tsaria/tests/actions/save-action-nonce.test.tsaria/tests/actions/save-resource-lifecycle.test.tsaria/tests/cache/public-page-cache.test.tsaria/tests/composables/actionResult.test.tsaria/tests/composables/useCanvasOverlays.test.tsaria/tests/composables/useIframeSetup.test.tsaria/tests/core/useSavePublish.test.tsaria/tests/features/composer/ComposerCanvasOptionsMenu.test.tsaria/tests/features/nodes/nodeEventHandlers.extracted.test.tsaria/tests/features/stage/canvasRenderAttributes.test.tsaria/tests/features/stage/canvasSelectionResize.test.tsaria/tests/features/stage/stageCanvasRuntimeLoading.test.tsaria/tests/features/stage/useStageDisplayState.test.tsaria/tests/fixtures/renderingDescriptionListUtilityPaste.tsaria/tests/inputs/ListProperty.test.tsaria/tests/integration/global-css-route.test.tsaria/tests/integration/publishing-snapshot-injection.test.tsaria/tests/lib/descriptionListPasteParity.test.tsaria/tests/lib/htmlToNodes.test.tsaria/tests/lib/listNodes.test.tsaria/tests/lib/nodesToHtml.test.tsaria/tests/mocks/astro-actions.tsaria/tests/rendering-foundation/description-list-semantics.parity.test.tsaria/tests/rendering-foundation/normalization.parity.test.tsaria/tests/scripts/rendering-writer-boundaries.test.tsaria/tests/storage/cloudflare-storage.test.tsaria/tests/storage/sqlite-storage.test.tsscripts/check-repository-push-guards.mjssrc/pages/styles/global.css.tsvitest.rendering-foundation.node.config.tsvitest.rendering-foundation.workerd.config.ts
Summary
The resulting OSS source tree is byte-identical to the verified aria-demo correction checkpoint.
Verification
npm run check: 0 errorsgit diff --checkpassedRelease
No release, package publish, version bump, tag, or deployment is included. The release remains deferred until the full Render v2 implementation is complete.
Summary by CodeRabbit
New Features
Bug Fixes
Style