Skip to content

feat(dialog): introduce Reka-UI dialog primitives + opt-in renderer branch (Phase 0)#11719

Open
dante01yoon wants to merge 1 commit intomainfrom
jaewon/dialog-reka-migration-phase-0
Open

feat(dialog): introduce Reka-UI dialog primitives + opt-in renderer branch (Phase 0)#11719
dante01yoon wants to merge 1 commit intomainfrom
jaewon/dialog-reka-migration-phase-0

Conversation

@dante01yoon
Copy link
Copy Markdown
Collaborator

@dante01yoon dante01yoon commented Apr 28, 2026

Summary

Lands the renderer infrastructure for migrating ComfyUI Frontend's central dialog system from PrimeVue to Reka-UI. Phase 0 of a phased migration. No production dialog migrates in this PR — every existing dialog continues to render through PrimeVue exactly as before.

Motivation

GitHub issue #11688 surfaced a PrimeVue Dialog max-width design limitation that is awkward to address through PrimeVue's pass-through styling. ADR 0004 (Rejected, 2025-08-27) explicitly endorses selective component replacement with shadcn/Reka-UI as the path forward for problematic PrimeVue components, and AGENTS.md already directs contributors to "Avoid new usage of PrimeVue components." The dialog system is a strong first candidate: clean public API boundary (useDialogService / dialogStore), bounded surface (~12 dialogs), and Reka-UI is already in use elsewhere in the codebase. The #11688 fix arrives naturally in Phase 1 once prompt/confirm migrate to the new primitive's md default (max-width: 36rem).

Phased migration plan

This PR is Phase 0 only. Each subsequent phase is shipped as its own PR.

Phase Scope Approx LOC
0 (this PR) Reka-UI primitive set under src/components/ui/dialog/ + opt-in renderer branch in GlobalDialog.vue + tests + Storybook ~600
1 Migrate PromptDialogContent + ConfirmationDialogContent; closes #11688 ~250
2 Migrate ErrorDialogContent, NodeSearchBox(Popover), SecretFormDialog, VideoHelpDialog, CustomizationDialog ~400
3 Migrate Settings dialog (workspace + non-workspace variants) — designer review ~300
4 Migrate Manager dialog — designer review ~300
5 Migrate ConfirmDialog callers (SecretsPanel, BaseWorkflowsSidebarTab) ~150
6 Remove PrimeVue Dialog/ConfirmDialog imports + clean up CSS overrides ~200

Full plan in temp/plans/dialog-migration-phase-0.md and ADR draft at temp/plans/adr-0009-dialog-reka-migration-DRAFT.md (will move to docs/adr/ after team review).

Changes

  • What:
    • New shadcn-style primitives at src/components/ui/dialog/ wrapping Reka-UI's Dialog* components: Dialog, DialogPortal, DialogOverlay, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, DialogClose. Variants via cva with sizes sm | md | lg | xl | full.
    • dialogStore.CustomDialogComponentProps gains opt-in renderer?: 'primevue' | 'reka' (default 'primevue') and size?: 'sm' | 'md' | 'lg' | 'xl' | 'full'.
    • GlobalDialog.vue branches the per-stack-item template based on the renderer flag. PrimeVue path is byte-identical to before.
    • Storybook stories: Default, LongContent, Headless, AllSizes.
    • Unit tests verifying branch selection and that the opt-in flag is preserved on the dialog stack item.
  • Breaking: None. Default renderer is primevue and no production dialog opts in.
  • Dependencies: None. Reka-UI is already a workspace dependency.

Review Focus

  1. API surface: useDialogService / dialogStore public API is unchanged. Custom-node extensions calling app.extensionManager.dialog.* continue to work.
  2. Renderer branch wiring in GlobalDialog.vueescape-key-down / pointer-down-outside map to closeOnEscape / dismissableMask; mousedown calls dialogStore.riseDialog to mirror the PrimeVue PT-based behavior.
  3. Primitive defaultsmd size = 36rem max-width (chosen to resolve Native ComfyUI prompt dialogs should have a max-width set #11688 in Phase 1); full = calc(100vw - 1rem) escape hatch for Settings/Manager later.
  4. No behavior change: existing dialogs continue to render unchanged because nothing opts into renderer: 'reka' in this PR.

Quality gates

  • pnpm typecheck — clean
  • pnpm lint — clean (1 pre-existing warning unrelated to this PR)
  • pnpm test:unit — 48 dialog-adjacent tests pass including 3 new tests in GlobalDialog.test.ts
  • pnpm format — applied

knip pre-push noise (unused deps in workspace packages, unused types.gen.ts) is pre-existing on main and not introduced by this PR.

Out of scope (deferred)

  • Migrating any production dialog — Phase 1+
  • Removing PrimeVue dependency — Phase 6
  • Touching legacy ComfyDialog (src/scripts/ui/dialog.ts) — separate cleanup
  • Deduplicating Dialogue.vue / ImageLightbox.vue against the new primitives — separate cleanup

Refs #11688

┆Issue is synchronized with this Notion page by Unito

…hase 0)

Introduces shadcn-style dialog primitives at src/components/ui/dialog/ wrapping
Reka-UI's Dialog* components, with size variants (sm/md/lg/xl/full).

Adds an opt-in renderer flag (`dialogComponentProps.renderer: 'primevue' |
'reka'`) to dialogStore. GlobalDialog.vue branches between PrimeVue (default,
unchanged) and the new Reka-UI path. No production dialog opts in yet — this
PR only lands the infrastructure.

Motivation: GitHub issue #11688 surfaced PrimeVue Dialog max-width limitations
that are hard to fix cleanly through PrimeVue's pass-through styling. ADR 0004
(Rejected) endorses selective shadcn/Reka-UI replacement of problematic
PrimeVue components. This is Phase 0 of a phased migration; the #11688 fix
arrives naturally in Phase 1 once prompt/confirm dialogs migrate to the new
primitive's `md` default (max-width 36rem).

See temp/plans/adr-0009-dialog-reka-migration-DRAFT.md and
temp/plans/dialog-migration-phase-0.md for the full plan.
@dante01yoon dante01yoon requested a review from a team April 28, 2026 07:54
@dosubot dosubot Bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Apr 28, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 28, 2026

📝 Walkthrough

Walkthrough

A new dialog system based on reka-ui is introduced alongside the existing PrimeVue implementation. GlobalDialog now conditionally renders either PrimeVue or ReKa dialogs based on a renderer prop. Multiple new reka-ui wrapper components, styling variants, storybook documentation, and tests are added.

Changes

Cohort / File(s) Summary
Dialog UI Components
src/components/ui/dialog/Dialog.vue, DialogClose.vue, DialogContent.vue, DialogDescription.vue, DialogFooter.vue, DialogHeader.vue, DialogOverlay.vue, DialogPortal.vue, DialogTitle.vue
New wrapper components around reka-ui dialog primitives with optional class/prop customization, styled defaults, and localized labels.
Dialog Styling & Variants
src/components/ui/dialog/dialog.variants.ts
Defines cva style generator for dialog content with size variants (sm–full), sets md as default, and exports typed sizes for storybook.
Dialog System Core
src/components/dialog/GlobalDialog.vue, src/stores/dialogStore.ts
GlobalDialog now conditionally renders PrimeVue or ReKa dialogs based on renderer prop; dialogStore types extended to support renderer and size options.
Dialog Testing & Stories
src/components/dialog/GlobalDialog.test.ts, src/components/ui/dialog/Dialog.stories.ts
New test suite for GlobalDialog covering renderer selection and DOM assertions; four storybook stories (Default, LongContent, Headless, AllSizes) demonstrating dialog variations.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant GlobalDialog
    participant DialogStore as Dialog Store
    participant Renderer as Renderer Decision
    participant PrimeVueDialog as PrimeVue Dialog
    participant RekaDialog as ReKa Dialog

    User->>DialogStore: showDialog(config)
    DialogStore->>DialogStore: Push item to dialogStack
    DialogStore-->>GlobalDialog: Update dialogStack (reactive)
    GlobalDialog->>Renderer: Check item.dialogComponentProps.renderer
    
    alt renderer === 'reka'
        Renderer->>RekaDialog: Render with DialogPortal, DialogOverlay, DialogContent, etc.
        RekaDialog->>RekaDialog: Handle open/close via :open, `@update`:open
        RekaDialog-->>User: Display ReKa dialog
    else renderer === 'primevue' or undefined
        Renderer->>PrimeVueDialog: Render with v-model:visible and pass-through props
        PrimeVueDialog-->>User: Display PrimeVue dialog
    end

    User->>RekaDialog: Interact (click close, escape, etc.)
    RekaDialog->>DialogStore: riseDialog({ key }) / update:open event
    DialogStore->>DialogStore: Remove/modify dialogStack entry
    DialogStore-->>GlobalDialog: Trigger re-render
    GlobalDialog-->>User: Dialog closes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐰 whispers from the warren

New dialogs bloom in ReKa's garden,
PrimeVue friends don't need no pardon,
Both paths twist through GlobalDialog's heart,
With close buttons and overlays—pure art! ✨

🚥 Pre-merge checks | ✅ 6 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (6 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: introducing Reka-UI dialog primitives with an opt-in renderer branch as Phase 0 of a phased migration.
Description check ✅ Passed The description is comprehensive and well-structured, covering summary, motivation, phased plan, detailed changes, breaking changes confirmation, review focus areas, and quality gates. All template sections are thoroughly addressed.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
End-To-End Regression Coverage For Fixes ✅ Passed PR title and commit subject use 'feat' prefix, not bug-fix language, indicating new feature rather than bug fix.
Adr Compliance For Entity/Litegraph Changes ✅ Passed The custom check for ADR compliance on entity/litegraph changes does not apply to this PR as all modified files are UI dialog components with no changes to src/lib/litegraph/, src/ecs/, or graph entity structures.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch jaewon/dialog-reka-migration-phase-0

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 28, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 04/28/2026, 07:55:54 AM UTC

Links

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 28, 2026

🎭 Playwright: ✅ 1357 passed, 0 failed · 4 flaky

📊 Browser Reports
  • chromium: View Report (✅ 1342 / ❌ 0 / ⚠️ 4 / ⏭️ 5)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 12 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 28, 2026

📦 Bundle: 5.23 MB gzip 🔴 +1.73 kB

Details

Summary

  • Raw size: 24.1 MB baseline 24.1 MB — 🔴 +8.63 kB
  • Gzip: 5.23 MB baseline 5.23 MB — 🔴 +1.73 kB
  • Brotli: 4.05 MB baseline 4.05 MB — 🔴 +1.41 kB
  • Bundles: 257 current • 257 baseline • 118 added / 118 removed

Category Glance
App Entry Points 🔴 +8.63 kB (31.2 kB) · Vendor & Third-Party ⚪ 0 B (9.88 MB) · Other ⚪ 0 B (8.83 MB) · Data & Services ⚪ 0 B (3.04 MB) · Graph Workspace ⚪ 0 B (1.23 MB) · Panels & Settings ⚪ 0 B (484 kB) · + 5 more

App Entry Points — 31.2 kB (baseline 22.5 kB) • 🔴 +8.63 kB

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-8f-rRg-n.js (new) 31.2 kB 🔴 +31.2 kB 🔴 +9.69 kB 🔴 +8.37 kB
assets/index-DbSSQoxn.js (removed) 22.5 kB 🟢 -22.5 kB 🟢 -7.99 kB 🟢 -6.83 kB

Status: 1 added / 1 removed

Graph Workspace — 1.23 MB (baseline 1.23 MB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BXQBaqhv.js (new) 1.23 MB 🔴 +1.23 MB 🔴 +264 kB 🔴 +199 kB
assets/GraphView-C8b6ivMF.js (removed) 1.23 MB 🟢 -1.23 MB 🟢 -264 kB 🟢 -199 kB

Status: 1 added / 1 removed

Views & Navigation — 77.7 kB (baseline 77.7 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-B6K0KR1w.js (removed) 15.7 kB 🟢 -15.7 kB 🟢 -3.41 kB 🟢 -2.92 kB
assets/CloudSurveyView-YZ9snFvE.js (new) 15.7 kB 🔴 +15.7 kB 🔴 +3.41 kB 🔴 +2.92 kB
assets/CloudLoginView-BIbx2nte.js (new) 12.2 kB 🔴 +12.2 kB 🔴 +3.43 kB 🔴 +3.02 kB
assets/CloudLoginView-CAZJo9cQ.js (removed) 12.2 kB 🟢 -12.2 kB 🟢 -3.43 kB 🟢 -3.04 kB
assets/CloudSignupView-BkXzAFO6.js (new) 9.94 kB 🔴 +9.94 kB 🔴 +2.93 kB 🔴 +2.6 kB
assets/CloudSignupView-DRLNkZc9.js (removed) 9.94 kB 🟢 -9.94 kB 🟢 -2.93 kB 🟢 -2.57 kB
assets/UserCheckView-B1ZTk0tm.js (new) 9.07 kB 🔴 +9.07 kB 🔴 +2.33 kB 🔴 +2.04 kB
assets/UserCheckView-CHMbfRVy.js (removed) 9.07 kB 🟢 -9.07 kB 🟢 -2.33 kB 🟢 -2.04 kB
assets/CloudLayoutView-Ca24tI3n.js (removed) 7.7 kB 🟢 -7.7 kB 🟢 -2.43 kB 🟢 -2.12 kB
assets/CloudLayoutView-D7HPqfXq.js (new) 7.7 kB 🔴 +7.7 kB 🔴 +2.44 kB 🔴 +2.12 kB
assets/CloudForgotPasswordView-BngIsBXg.js (removed) 6.11 kB 🟢 -6.11 kB 🟢 -2.17 kB 🟢 -1.9 kB
assets/CloudForgotPasswordView-CIS4lLiJ.js (new) 6.11 kB 🔴 +6.11 kB 🔴 +2.17 kB 🔴 +1.91 kB
assets/CloudAuthTimeoutView-BI1yb2UR.js (removed) 5.47 kB 🟢 -5.47 kB 🟢 -2 kB 🟢 -1.76 kB
assets/CloudAuthTimeoutView-DJhcrNvJ.js (new) 5.47 kB 🔴 +5.47 kB 🔴 +2 kB 🔴 +1.75 kB
assets/CloudSubscriptionRedirectView-BPFt92zQ.js (removed) 5.25 kB 🟢 -5.25 kB 🟢 -1.98 kB 🟢 -1.76 kB
assets/CloudSubscriptionRedirectView-COlB3N4x.js (new) 5.25 kB 🔴 +5.25 kB 🔴 +1.98 kB 🔴 +1.76 kB
assets/UserSelectView-B0eMkT7J.js (removed) 4.73 kB 🟢 -4.73 kB 🟢 -1.76 kB 🟢 -1.55 kB
assets/UserSelectView-BiV_Q9oN.js (new) 4.73 kB 🔴 +4.73 kB 🔴 +1.75 kB 🔴 +1.55 kB

Status: 9 added / 9 removed / 2 unchanged

Panels & Settings — 484 kB (baseline 484 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-BCM4YX29.js (removed) 46.7 kB 🟢 -46.7 kB 🟢 -9.61 kB 🟢 -8.54 kB
assets/KeybindingPanel-CabmJIue.js (new) 46.7 kB 🔴 +46.7 kB 🔴 +9.61 kB 🔴 +8.53 kB
assets/SecretsPanel-AkVSnQ5m.js (new) 22.9 kB 🔴 +22.9 kB 🔴 +5.54 kB 🔴 +4.87 kB
assets/SecretsPanel-B3H-qAoF.js (removed) 22.9 kB 🟢 -22.9 kB 🟢 -5.54 kB 🟢 -4.87 kB
assets/LegacyCreditsPanel-DjBYYO-t.js (new) 21.7 kB 🔴 +21.7 kB 🔴 +5.89 kB 🔴 +5.2 kB
assets/LegacyCreditsPanel-Dn7ceo7p.js (removed) 21.7 kB 🟢 -21.7 kB 🟢 -5.89 kB 🟢 -5.2 kB
assets/SubscriptionPanel-BzDUARCT.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -5.06 kB 🟢 -4.46 kB
assets/SubscriptionPanel-rIQ4zyJz.js (new) 19.9 kB 🔴 +19.9 kB 🔴 +5.06 kB 🔴 +4.46 kB
assets/AboutPanel-BxojFcXi.js (new) 12 kB 🔴 +12 kB 🔴 +3.33 kB 🔴 +2.98 kB
assets/AboutPanel-C3zxYbWr.js (removed) 12 kB 🟢 -12 kB 🟢 -3.33 kB 🟢 -2.98 kB
assets/ExtensionPanel-BSseiYjH.js (new) 9.94 kB 🔴 +9.94 kB 🔴 +2.9 kB 🔴 +2.57 kB
assets/ExtensionPanel-CDI3NbNY.js (removed) 9.94 kB 🟢 -9.94 kB 🟢 -2.9 kB 🟢 -2.58 kB
assets/ServerConfigPanel-BM_jFYlq.js (removed) 7.02 kB 🟢 -7.02 kB 🟢 -2.35 kB 🟢 -2.08 kB
assets/ServerConfigPanel-DSbHyAuF.js (new) 7.02 kB 🔴 +7.02 kB 🔴 +2.35 kB 🔴 +2.1 kB
assets/UserPanel-CGk7XefK.js (new) 6.73 kB 🔴 +6.73 kB 🔴 +2.23 kB 🔴 +1.96 kB
assets/UserPanel-rfXOjPcI.js (removed) 6.73 kB 🟢 -6.73 kB 🟢 -2.22 kB 🟢 -1.97 kB
assets/cloudRemoteConfig-CkRdEvSN.js (new) 2.02 kB 🔴 +2.02 kB 🔴 +977 B 🔴 +838 B
assets/cloudRemoteConfig-CxgONhQP.js (removed) 2.02 kB 🟢 -2.02 kB 🟢 -976 B 🟢 -837 B
assets/refreshRemoteConfig-BuA67-Hw.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -648 B 🟢 -551 B
assets/refreshRemoteConfig-DSwSwU7u.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +648 B 🔴 +558 B

Status: 10 added / 10 removed / 11 unchanged

User & Accounts — 17.4 kB (baseline 17.4 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-DlZ-KzeS.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/auth-DVDYe0i9.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/SignUpForm-B-hGRz2Z.js (removed) 3.16 kB 🟢 -3.16 kB 🟢 -1.29 kB 🟢 -1.16 kB
assets/SignUpForm-Cc_oEgn6.js (new) 3.16 kB 🔴 +3.16 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/UpdatePasswordContent-CyRK383i.js (new) 2.87 kB 🔴 +2.87 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/UpdatePasswordContent-D0a12rFQ.js (removed) 2.87 kB 🟢 -2.87 kB 🟢 -1.29 kB 🟢 -1.14 kB
assets/authStore-B_ulWA4X.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -554 B 🟢 -492 B
assets/authStore-C9kV1v7A.js (new) 1.16 kB 🔴 +1.16 kB 🔴 +555 B 🔴 +495 B
assets/auth-B5VN1mkS.js (removed) 348 B 🟢 -348 B 🟢 -215 B 🟢 -213 B
assets/auth-D60YQkAm.js (new) 348 B 🔴 +348 B 🔴 +214 B 🔴 +190 B

Status: 5 added / 5 removed / 2 unchanged

Editors & Dialogs — 113 kB (baseline 113 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-5PEpUlQb.js (removed) 86.9 kB 🟢 -86.9 kB 🟢 -18.8 kB 🟢 -16 kB
assets/ComfyHubPublishDialog-Cv2vLpCS.js (new) 86.9 kB 🔴 +86.9 kB 🔴 +18.8 kB 🔴 +16.1 kB
assets/useShareDialog-Bt7i5EIK.js (new) 23.7 kB 🔴 +23.7 kB 🔴 +5.77 kB 🔴 +5.12 kB
assets/useShareDialog-hjI6HLXF.js (removed) 23.7 kB 🟢 -23.7 kB 🟢 -5.77 kB 🟢 -5.11 kB
assets/ComfyHubPublishDialog-DAyUcL13.js (new) 1.32 kB 🔴 +1.32 kB 🔴 +617 B 🔴 +541 B
assets/ComfyHubPublishDialog-DjWEI0lB.js (removed) 1.32 kB 🟢 -1.32 kB 🟢 -616 B 🟢 -549 B
assets/useSubscriptionDialog-CQkR-7H2.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +546 B 🔴 +478 B
assets/useSubscriptionDialog-DCePSruS.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -544 B 🟢 -478 B

Status: 4 added / 4 removed

UI Components — 61 kB (baseline 61 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-D0w_A97M.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.79 kB 🟢 -3.38 kB
assets/ComfyQueueButton-ZzF5WXDw.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.79 kB 🔴 +3.38 kB
assets/useTerminalTabs--gdaHDqK.js (new) 11 kB 🔴 +11 kB 🔴 +3.71 kB 🔴 +3.27 kB
assets/useTerminalTabs-Cb5N2LCK.js (removed) 11 kB 🟢 -11 kB 🟢 -3.71 kB 🟢 -3.27 kB
assets/SubscribeButton-B4E3w3J4.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.05 kB 🟢 -934 B
assets/SubscribeButton-HhIz8mf_.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.05 kB 🔴 +944 B
assets/cloudFeedbackTopbarButton-BWbrzn5I.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +930 B 🔴 +814 B
assets/cloudFeedbackTopbarButton-Dm8aiohs.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -931 B 🟢 -815 B
assets/ComfyQueueButton-Bphwu5No.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +581 B 🔴 +517 B
assets/ComfyQueueButton-DJaHkP1P.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -582 B 🟢 -518 B

Status: 5 added / 5 removed / 8 unchanged

Data & Services — 3.04 MB (baseline 3.04 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-B7Gqw-IL.js (removed) 1.97 MB 🟢 -1.97 MB 🟢 -454 kB 🟢 -344 kB
assets/dialogService-Ch68KklC.js (new) 1.97 MB 🔴 +1.97 MB 🔴 +454 kB 🔴 +344 kB
assets/api-D2u413JU.js (removed) 894 kB 🟢 -894 kB 🟢 -214 kB 🟢 -168 kB
assets/api-Dye9RtXp.js (new) 894 kB 🔴 +894 kB 🔴 +214 kB 🔴 +168 kB
assets/load3dService-Cm-DBFsx.js (new) 114 kB 🔴 +114 kB 🔴 +24.8 kB 🔴 +21.1 kB
assets/load3dService-DHv88Dwj.js (removed) 114 kB 🟢 -114 kB 🟢 -24.8 kB 🟢 -21 kB
assets/workflowShareService-BVFESX6G.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.89 kB 🔴 +4.33 kB
assets/workflowShareService-CBCLN5fO.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.89 kB 🟢 -4.33 kB
assets/keybindingService-BWuv0fhm.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.67 kB 🟢 -3.22 kB
assets/keybindingService-CDH4FWup.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.67 kB 🔴 +3.22 kB
assets/releaseStore-BFJ2NjcC.js (removed) 8.12 kB 🟢 -8.12 kB 🟢 -2.28 kB 🟢 -2 kB
assets/releaseStore-DzFXdNeD.js (new) 8.12 kB 🔴 +8.12 kB 🔴 +2.28 kB 🔴 +2 kB
assets/userStore-CAmkKzJM.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +870 B 🔴 +762 B
assets/userStore-CT32WhQV.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -872 B 🟢 -762 B
assets/audioService-BJQYlkGY.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +877 B 🔴 +763 B
assets/audioService-D0NADxDy.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -878 B 🟢 -760 B
assets/releaseStore-COhhucY2.js (new) 1.16 kB 🔴 +1.16 kB 🔴 +548 B 🔴 +484 B
assets/releaseStore-DQhcAO_n.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -548 B 🟢 -491 B
assets/workflowDraftStore-CaapQcWM.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +544 B 🔴 +481 B
assets/workflowDraftStore-eGlRGrXE.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -544 B 🟢 -477 B
assets/dialogService-CRF_UbAZ.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -537 B 🟢 -476 B
assets/dialogService-x9rSlmMr.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +537 B 🔴 +478 B
assets/settingStore-DapNs7tW.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -539 B 🟢 -475 B
assets/settingStore-yUHjzFwQ.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +540 B 🔴 +476 B
assets/assetsStore-DmLzSiL4.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +540 B 🔴 +477 B
assets/assetsStore-Dxzu6W3p.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -539 B 🟢 -481 B

Status: 13 added / 13 removed / 4 unchanged

Utilities & Hooks — 363 kB (baseline 363 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-Bm6E26a5.js (removed) 233 kB 🟢 -233 kB 🟢 -51.8 kB 🟢 -42.2 kB
assets/useConflictDetection-o1gYW8vs.js (new) 233 kB 🔴 +233 kB 🔴 +51.8 kB 🔴 +42.2 kB
assets/useLoad3d-D0ToreHD.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -4.92 kB 🟢 -4.38 kB
assets/useLoad3d-vqa87fYP.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +4.92 kB 🔴 +4.35 kB
assets/useLoad3dViewer-_NliQpCS.js (new) 20.3 kB 🔴 +20.3 kB 🔴 +4.75 kB 🔴 +4.13 kB
assets/useLoad3dViewer-C6WIaiG-.js (removed) 20.3 kB 🟢 -20.3 kB 🟢 -4.75 kB 🟢 -4.13 kB
assets/useFeatureFlags-CaBnbp-a.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -1.8 kB 🟢 -1.52 kB
assets/useFeatureFlags-DIhWXoWT.js (new) 5.95 kB 🔴 +5.95 kB 🔴 +1.8 kB 🔴 +1.52 kB
assets/useCopyToClipboard-_O_jhput.js (new) 5.29 kB 🔴 +5.29 kB 🔴 +1.86 kB 🔴 +1.57 kB
assets/useCopyToClipboard-BfpjTmP9.js (removed) 5.29 kB 🟢 -5.29 kB 🟢 -1.86 kB 🟢 -1.58 kB
assets/useWorkspaceUI-8lqmDu1T.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -982 B 🟢 -808 B
assets/useWorkspaceUI-Bt5BAA3h.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +982 B 🔴 +810 B
assets/subscriptionCheckoutUtil-BCIedZR6.js (removed) 3.31 kB 🟢 -3.31 kB 🟢 -1.36 kB 🟢 -1.19 kB
assets/subscriptionCheckoutUtil-D0g9kYJ2.js (new) 3.31 kB 🔴 +3.31 kB 🔴 +1.36 kB 🔴 +1.19 kB
assets/assetPreviewUtil-C1geVO2i.js (removed) 2.27 kB 🟢 -2.27 kB 🟢 -960 B 🟢 -835 B
assets/assetPreviewUtil-DttMtWkA.js (new) 2.27 kB 🔴 +2.27 kB 🔴 +957 B 🔴 +840 B
assets/useUpstreamValue-C-Obh0wi.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +805 B 🔴 +708 B
assets/useUpstreamValue-D9U7ioAo.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -806 B 🟢 -708 B
assets/useLoad3d-BqNFtMm6.js (removed) 1.3 kB 🟢 -1.3 kB 🟢 -606 B 🟢 -562 B
assets/useLoad3d-CbJNiMyb.js (new) 1.3 kB 🔴 +1.3 kB 🔴 +606 B 🔴 +552 B
assets/useLoad3dViewer-CetcTD12.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -572 B 🟢 -513 B
assets/useLoad3dViewer-CqZcVYg-.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +572 B 🔴 +515 B
assets/useCurrentUser-C8GyqewZ.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -540 B 🟢 -477 B
assets/useCurrentUser-DPwcE0at.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +540 B 🔴 +476 B
assets/useWorkspaceSwitch-B-FpHqDs.js (removed) 747 B 🟢 -747 B 🟢 -386 B 🟢 -332 B
assets/useWorkspaceSwitch-CsXntVBP.js (new) 747 B 🔴 +747 B 🔴 +383 B 🔴 +332 B

Status: 13 added / 13 removed / 18 unchanged

Vendor & Third-Party — 9.88 MB (baseline 9.88 MB) • ⚪ 0 B

External libraries and shared vendor chunks

Status: 16 unchanged

Other — 8.83 MB (baseline 8.83 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-B0S1v1C5.js (new) 76.6 kB 🔴 +76.6 kB 🔴 +19.8 kB 🔴 +16.9 kB
assets/core-CpWGHM_8.js (removed) 76.6 kB 🟢 -76.6 kB 🟢 -19.8 kB 🟢 -16.9 kB
assets/groupNode-C6WAsxv8.js (new) 74.9 kB 🔴 +74.9 kB 🔴 +18.7 kB 🔴 +16.5 kB
assets/groupNode-C8vmumRz.js (removed) 74.9 kB 🟢 -74.9 kB 🟢 -18.7 kB 🟢 -16.5 kB
assets/WidgetSelect-B2IQm5u7.js (removed) 67.2 kB 🟢 -67.2 kB 🟢 -14.6 kB 🟢 -12.6 kB
assets/WidgetSelect-DB4WnpHE.js (new) 67.2 kB 🔴 +67.2 kB 🔴 +14.6 kB 🔴 +12.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-2m6i6KYj.js (removed) 49.3 kB 🟢 -49.3 kB 🟢 -9.41 kB 🟢 -8.06 kB
assets/SubscriptionRequiredDialogContentWorkspace-Df15jngD.js (new) 49.3 kB 🔴 +49.3 kB 🔴 +9.41 kB 🔴 +8.03 kB
assets/Load3DControls-CC_PWU8V.js (new) 45.9 kB 🔴 +45.9 kB 🔴 +7.47 kB 🔴 +6.53 kB
assets/Load3DControls-CCyg0Zv3.js (removed) 45.9 kB 🟢 -45.9 kB 🟢 -7.47 kB 🟢 -6.53 kB
assets/WidgetPainter-BqiFQqsK.js (new) 34 kB 🔴 +34 kB 🔴 +8.29 kB 🔴 +7.35 kB
assets/WidgetPainter-DLrvmDWg.js (removed) 34 kB 🟢 -34 kB 🟢 -8.28 kB 🟢 -7.33 kB
assets/WorkspacePanelContent-CxmAGxQR.js (removed) 32.8 kB 🟢 -32.8 kB 🟢 -7 kB 🟢 -6.19 kB
assets/WorkspacePanelContent-DrX-1GEQ.js (new) 32.8 kB 🔴 +32.8 kB 🔴 +7 kB 🔴 +6.18 kB
assets/Load3dViewerContent-ClUKiEMu.js (new) 28.3 kB 🔴 +28.3 kB 🔴 +5.89 kB 🔴 +5.12 kB
assets/Load3dViewerContent-xZH44kky.js (removed) 28.3 kB 🟢 -28.3 kB 🟢 -5.9 kB 🟢 -5.12 kB
assets/SubscriptionRequiredDialogContent-BAhUXGtP.js (new) 27.5 kB 🔴 +27.5 kB 🔴 +6.96 kB 🔴 +6.16 kB
assets/SubscriptionRequiredDialogContent-C-Wmbcuj.js (removed) 27.5 kB 🟢 -27.5 kB 🟢 -6.96 kB 🟢 -6.15 kB
assets/WidgetImageCrop-D72toeFJ.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +6.18 kB 🔴 +5.43 kB
assets/WidgetImageCrop-QHfry2-H.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -6.18 kB 🟢 -5.45 kB
assets/SubscriptionPanelContentWorkspace-BeyftUNb.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.17 kB 🔴 +4.56 kB
assets/SubscriptionPanelContentWorkspace-DKzV0ows.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.18 kB 🟢 -4.57 kB
assets/SignInContent-Cav3Sfwi.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.36 kB 🟢 -4.68 kB
assets/SignInContent-Df02mF0M.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.35 kB 🔴 +4.68 kB
assets/CurrentUserPopoverWorkspace-B2jFCjS9.js (new) 20.5 kB 🔴 +20.5 kB 🔴 +4.9 kB 🔴 +4.38 kB
assets/CurrentUserPopoverWorkspace-DOjQtFkc.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -4.89 kB 🟢 -4.38 kB
assets/WidgetInputNumber-B5oVJ65K.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.3 kB
assets/WidgetInputNumber-xFV6GlfL.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.29 kB
assets/Load3D-CI5etHK3.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.34 kB 🟢 -3.79 kB
assets/Load3D-D-0QCe-W.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.34 kB 🔴 +3.8 kB
assets/WidgetRecordAudio-B8GauSFg.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +5.01 kB 🔴 +4.48 kB
assets/WidgetRecordAudio-BHJIhh5E.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -5 kB 🟢 -4.47 kB
assets/WidgetRange-CboB4WbW.js (removed) 17 kB 🟢 -17 kB 🟢 -4.59 kB 🟢 -4.11 kB
assets/WidgetRange-CvXB51hz.js (new) 17 kB 🔴 +17 kB 🔴 +4.59 kB 🔴 +4.11 kB
assets/load3d-BqXiP5KE.js (new) 15.7 kB 🔴 +15.7 kB 🔴 +4.56 kB 🔴 +3.95 kB
assets/load3d-CUCxKebt.js (removed) 15.7 kB 🟢 -15.7 kB 🟢 -4.56 kB 🟢 -3.94 kB
assets/WaveAudioPlayer-LhRVdLvM.js (new) 13.4 kB 🔴 +13.4 kB 🔴 +3.69 kB 🔴 +3.23 kB
assets/WaveAudioPlayer-TZ6CUBeN.js (removed) 13.4 kB 🟢 -13.4 kB 🟢 -3.69 kB 🟢 -3.23 kB
assets/WidgetCurve-bzwfKsjG.js (removed) 12.1 kB 🟢 -12.1 kB 🟢 -3.91 kB 🟢 -3.54 kB
assets/WidgetCurve-D_b92Rm8.js (new) 12.1 kB 🔴 +12.1 kB 🔴 +3.91 kB 🔴 +3.54 kB
assets/TeamWorkspacesDialogContent-D2rVxu3N.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.41 kB 🔴 +3.04 kB
assets/TeamWorkspacesDialogContent-DavyWlEU.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.4 kB 🟢 -3.03 kB
assets/nodeTemplates-90XBfWWd.js (new) 9.81 kB 🔴 +9.81 kB 🔴 +3.47 kB 🔴 +3.06 kB
assets/nodeTemplates-DCcTa3oQ.js (removed) 9.81 kB 🟢 -9.81 kB 🟢 -3.47 kB 🟢 -3.05 kB
assets/NightlySurveyController-B95-NuDJ.js (removed) 8.99 kB 🟢 -8.99 kB 🟢 -3.15 kB 🟢 -2.78 kB
assets/NightlySurveyController-E7Fj3-tb.js (new) 8.99 kB 🔴 +8.99 kB 🔴 +3.15 kB 🔴 +2.78 kB
assets/InviteMemberDialogContent-B44GlAtb.js (removed) 7.91 kB 🟢 -7.91 kB 🟢 -2.51 kB 🟢 -2.21 kB
assets/InviteMemberDialogContent-BcsTdRUO.js (new) 7.91 kB 🔴 +7.91 kB 🔴 +2.51 kB 🔴 +2.21 kB
assets/Load3DConfiguration-CBvp5BP1.js (new) 7.82 kB 🔴 +7.82 kB 🔴 +2.31 kB 🔴 +2.02 kB
assets/Load3DConfiguration-DKcKBqFt.js (removed) 7.82 kB 🟢 -7.82 kB 🟢 -2.31 kB 🟢 -2.02 kB
assets/onboardingCloudRoutes-Ct-jMWdA.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +2.05 kB 🔴 +1.76 kB
assets/onboardingCloudRoutes-HEzwnRrF.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -2.05 kB 🟢 -1.76 kB
assets/CreateWorkspaceDialogContent-aTxvFjYJ.js (new) 6.12 kB 🔴 +6.12 kB 🔴 +2.23 kB 🔴 +1.95 kB
assets/CreateWorkspaceDialogContent-CfesemVi.js (removed) 6.12 kB 🟢 -6.12 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/WidgetWithControl-BfPcuOz9.js (new) 6.02 kB 🔴 +6.02 kB 🔴 +2.4 kB 🔴 +2.14 kB
assets/WidgetWithControl-BhEtrdTD.js (removed) 6.02 kB 🟢 -6.02 kB 🟢 -2.4 kB 🟢 -2.12 kB
assets/FreeTierDialogContent-DkVvmfq2.js (removed) 5.99 kB 🟢 -5.99 kB 🟢 -2.12 kB 🟢 -1.88 kB
assets/FreeTierDialogContent-VhHD2YIU.js (new) 5.99 kB 🔴 +5.99 kB 🔴 +2.12 kB 🔴 +1.88 kB
assets/EditWorkspaceDialogContent-CCWyoMGW.js (new) 5.92 kB 🔴 +5.92 kB 🔴 +2.19 kB 🔴 +1.91 kB
assets/EditWorkspaceDialogContent-D6YVIg7W.js (removed) 5.92 kB 🟢 -5.92 kB 🟢 -2.18 kB 🟢 -1.91 kB
assets/WidgetTextarea-CuHCCWKn.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -2.26 kB 🟢 -2 kB
assets/WidgetTextarea-Dx4dfE-7.js (new) 5.73 kB 🔴 +5.73 kB 🔴 +2.26 kB 🔴 +1.99 kB
assets/Preview3d-Dixg5DFY.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.88 kB 🔴 +1.65 kB
assets/Preview3d-zmpZFsof.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.87 kB 🟢 -1.64 kB
assets/ValueControlPopover-aBygJlEt.js (new) 5.5 kB 🔴 +5.5 kB 🔴 +2 kB 🔴 +1.8 kB
assets/ValueControlPopover-BY9I0Fy5.js (removed) 5.5 kB 🟢 -5.5 kB 🟢 -2 kB 🟢 -1.8 kB
assets/CancelSubscriptionDialogContent-B01PvFAH.js (new) 5.46 kB 🔴 +5.46 kB 🔴 +2.04 kB 🔴 +1.79 kB
assets/CancelSubscriptionDialogContent-C1HdN2Ad.js (removed) 5.46 kB 🟢 -5.46 kB 🟢 -2.04 kB 🟢 -1.79 kB
assets/DeleteWorkspaceDialogContent-CmyfB7xV.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.86 kB 🟢 -1.61 kB
assets/DeleteWorkspaceDialogContent-D4_8j5x7.js (new) 4.82 kB 🔴 +4.82 kB 🔴 +1.86 kB 🔴 +1.62 kB
assets/LeaveWorkspaceDialogContent-C4hMPzK9.js (removed) 4.65 kB 🟢 -4.65 kB 🟢 -1.8 kB 🟢 -1.56 kB
assets/LeaveWorkspaceDialogContent-LbhKoJ-o.js (new) 4.65 kB 🔴 +4.65 kB 🔴 +1.81 kB 🔴 +1.57 kB
assets/RemoveMemberDialogContent-C3g6YuDE.js (new) 4.63 kB 🔴 +4.63 kB 🔴 +1.76 kB 🔴 +1.54 kB
assets/RemoveMemberDialogContent-DE30NHDx.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.76 kB 🟢 -1.53 kB
assets/RevokeInviteDialogContent-CIhqRm_p.js (new) 4.54 kB 🔴 +4.54 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/RevokeInviteDialogContent-DTfHv_7A.js (removed) 4.54 kB 🟢 -4.54 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/tierBenefits-B8JYxTVf.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.58 kB 🟢 -1.36 kB
assets/tierBenefits-DgaNZfT0.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.57 kB 🔴 +1.36 kB
assets/InviteMemberUpsellDialogContent-5gBs5pkz.js (removed) 4.44 kB 🟢 -4.44 kB 🟢 -1.64 kB 🟢 -1.44 kB
assets/InviteMemberUpsellDialogContent-CeXY0U9j.js (new) 4.44 kB 🔴 +4.44 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/cloudSessionCookie-CIJCV_6t.js (removed) 4.28 kB 🟢 -4.28 kB 🟢 -1.56 kB 🟢 -1.36 kB
assets/cloudSessionCookie-CXwIsc2b.js (new) 4.28 kB 🔴 +4.28 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/Media3DTop-DELPrXOi.js (removed) 4.01 kB 🟢 -4.01 kB 🟢 -1.69 kB 🟢 -1.5 kB
assets/Media3DTop-k_SLqQFs.js (new) 4.01 kB 🔴 +4.01 kB 🔴 +1.7 kB 🔴 +1.5 kB
assets/saveMesh-CdlKNmHy.js (removed) 3.98 kB 🟢 -3.98 kB 🟢 -1.73 kB 🟢 -1.52 kB
assets/saveMesh-CMwaPzQP.js (new) 3.98 kB 🔴 +3.98 kB 🔴 +1.73 kB 🔴 +1.53 kB
assets/GlobalToast-mi2iajsr.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.11 kB
assets/GlobalToast-OkSZjYAf.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.26 kB 🔴 +1.08 kB
assets/CloudRunButtonWrapper-Bm_pMsRr.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1 kB 🔴 +892 B
assets/CloudRunButtonWrapper-D1chQGXV.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1 kB 🟢 -894 B
assets/SubscribeToRun-BZzOWyz_.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +983 B 🔴 +864 B
assets/SubscribeToRun-CNw0kJve.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -983 B 🟢 -876 B
assets/MediaAudioTop-CMEZ6oW2.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -1.01 kB 🟢 -860 B
assets/MediaAudioTop-DJ1JBWHO.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +1.01 kB 🔴 +868 B
assets/cloudBadges-Bpue31ed.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -961 B 🟢 -831 B
assets/cloudBadges-SHQL-rX8.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +963 B 🔴 +833 B
assets/cloudSubscription-C389FFCo.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -884 B 🟢 -765 B
assets/cloudSubscription-DxlZPN5k.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +886 B 🔴 +767 B
assets/graphHasMissingNodes-BQzWQSZk.js (removed) 1.84 kB 🟢 -1.84 kB 🟢 -861 B 🟢 -756 B
assets/graphHasMissingNodes-DvLRuQUi.js (new) 1.84 kB 🔴 +1.84 kB 🔴 +859 B 🔴 +758 B
assets/Load3D-Co8tSY5B.js (removed) 1.55 kB 🟢 -1.55 kB 🟢 -695 B 🟢 -619 B
assets/Load3D-D7Ujf-vN.js (new) 1.55 kB 🔴 +1.55 kB 🔴 +693 B 🔴 +618 B
assets/previousFullPath-BrdF2mP-.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +694 B 🔴 +616 B
assets/previousFullPath-D6TIm82n.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -692 B 🟢 -597 B
assets/nightlyBadges-DlcuwmzO.js (new) 1.46 kB 🔴 +1.46 kB 🔴 +731 B 🔴 +668 B
assets/nightlyBadges-hnEMu_RI.js (removed) 1.46 kB 🟢 -1.46 kB 🟢 -730 B 🟢 -644 B
assets/Load3dViewerContent-CNCD7GBn.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -649 B 🟢 -593 B
assets/Load3dViewerContent-DAz_iXlN.js (new) 1.43 kB 🔴 +1.43 kB 🔴 +650 B 🔴 +585 B
assets/SubscriptionPanelContentWorkspace-C2Igb3zY.js (new) 1.32 kB 🔴 +1.32 kB 🔴 +604 B 🔴 +526 B
assets/SubscriptionPanelContentWorkspace-VotMPlOg.js (removed) 1.32 kB 🟢 -1.32 kB 🟢 -604 B 🟢 -525 B
assets/WidgetLegacy-CAQkiX_U.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -552 B 🟢 -488 B
assets/WidgetLegacy-rdv6_o7p.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +551 B 🔴 +486 B
assets/changeTracker-B2DpbcKd.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +540 B 🔴 +470 B
assets/changeTracker-DrCqhrp9.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -540 B 🟢 -470 B

Status: 57 added / 57 removed / 78 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 61.4 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.0 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.6 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 48.4 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.5 MB heap
large-graph-pan: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.8 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.9 MB heap
minimap-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.3 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 48.7 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 61.3 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.5 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 76.5 MB heap
vue-large-graph-idle: · 56.3 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 178.4 MB heap
vue-large-graph-pan: · 58.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 160.9 MB heap
workflow-execution: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 48.3 MB heap

⚠️ 2 regressions detected

Metric Baseline PR (median) Δ Sig
canvas-zoom-sweep: avg frame time 17ms 17ms +0% ⚠️ z=2.2
subgraph-mouse-sweep: task duration 977ms 922ms -6% ⚠️ z=2.3
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms +0% z=-0.1
canvas-idle: p95 frame time 17ms 17ms -0%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 9ms 8ms -6% z=-3.1
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 8 9 +13% z=-3.8
canvas-idle: task duration 415ms 338ms -19% z=-1.8
canvas-idle: script duration 22ms 16ms -26% z=-4.1
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 61.2 MB 61.4 MB +0%
canvas-idle: DOM nodes 16 18 +13% z=-3.6
canvas-idle: event listeners 6 6 +0% z=-1.2
canvas-mouse-sweep: avg frame time 17ms 17ms -0% z=-1.5
canvas-mouse-sweep: p95 frame time 17ms 17ms -1%
canvas-mouse-sweep: layout duration 4ms 4ms -6% z=0.3
canvas-mouse-sweep: style recalc duration 55ms 45ms -17% z=0.9
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 84 83 -1% z=1.8
canvas-mouse-sweep: task duration 1128ms 961ms -15% z=1.7
canvas-mouse-sweep: script duration 146ms 137ms -6% z=0.2
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 57.0 MB 57.0 MB +0%
canvas-mouse-sweep: DOM nodes 66 64 -3% z=0.7
canvas-mouse-sweep: event listeners 6 6 +0% z=-0.6
canvas-zoom-sweep: avg frame time 17ms 17ms +0% ⚠️ z=2.2
canvas-zoom-sweep: p95 frame time 17ms 17ms -1%
canvas-zoom-sweep: layout duration 1ms 1ms -7% z=-0.9
canvas-zoom-sweep: style recalc duration 18ms 17ms -5% z=-1.4
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 31 30 -3% z=-2.8
canvas-zoom-sweep: task duration 340ms 302ms -11% z=-1.1
canvas-zoom-sweep: script duration 26ms 22ms -15% z=-1.6
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 65.5 MB 65.6 MB +0%
canvas-zoom-sweep: DOM nodes 76 76 +0% z=-4.1
canvas-zoom-sweep: event listeners 19 19 +0% z=-0.9
dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
dom-widget-clipping: p95 frame time 17ms 17ms +0%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 8ms 8ms -1% z=-2.7
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 11 11 +0% z=-4.2
dom-widget-clipping: task duration 418ms 325ms -22% z=-2.4
dom-widget-clipping: script duration 70ms 58ms -18% z=-3.1
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 48.5 MB 48.4 MB -0%
dom-widget-clipping: DOM nodes 18 18 +0% z=-2.9
dom-widget-clipping: event listeners 2 2 +0% variance too high
large-graph-idle: avg frame time 17ms 17ms -0% z=-1.0
large-graph-idle: p95 frame time 17ms 17ms -1%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 8ms 10ms +24% z=-1.9
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 9 10 +11% z=-5.1
large-graph-idle: task duration 744ms 555ms -25% z=0.2
large-graph-idle: script duration 119ms 104ms -12% z=0.1
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 54.0 MB 54.5 MB +1%
large-graph-idle: DOM nodes -261 -258 -1% z=-312.8
large-graph-idle: event listeners -127 -127 +0% z=-25.1
large-graph-pan: avg frame time 17ms 17ms +0% z=0.3
large-graph-pan: p95 frame time 17ms 17ms +0%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 20ms 17ms -14% z=0.1
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 68 68 +0% z=-2.4
large-graph-pan: task duration 1250ms 1091ms -13% z=0.2
large-graph-pan: script duration 446ms 399ms -10% z=-0.4
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 68.1 MB 67.8 MB -0%
large-graph-pan: DOM nodes -263 -264 +0% z=-171.5
large-graph-pan: event listeners -127 -127 +0% z=-159.3
large-graph-zoom: avg frame time 17ms 17ms -0%
large-graph-zoom: p95 frame time 17ms 17ms +1%
large-graph-zoom: layout duration 9ms 7ms -19%
large-graph-zoom: style recalc duration 21ms 19ms -8%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 65 66 +2%
large-graph-zoom: task duration 1422ms 1318ms -7%
large-graph-zoom: script duration 524ms 491ms -6%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 61.6 MB 56.9 MB -8%
large-graph-zoom: DOM nodes -267 -264 -1%
large-graph-zoom: event listeners -123 -123 +0%
minimap-idle: avg frame time 17ms 17ms +0% z=0.1
minimap-idle: p95 frame time 17ms 17ms +1%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 7ms 9ms +22% z=-0.7
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 7 10 +43% z=0.6
minimap-idle: task duration 619ms 558ms -10% z=0.6
minimap-idle: script duration 97ms 101ms +5% z=0.3
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 55.8 MB 56.3 MB +1%
minimap-idle: DOM nodes -265 -260 -2% z=-204.1
minimap-idle: event listeners -127 -127 +0% z=-199.3
subgraph-dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
subgraph-dom-widget-clipping: p95 frame time 17ms 17ms +0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 12ms 12ms +1% z=-0.9
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 47 47 +0% z=-1.6
subgraph-dom-widget-clipping: task duration 401ms 360ms -10% z=-1.0
subgraph-dom-widget-clipping: script duration 132ms 127ms -4% z=-0.2
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 48.9 MB 48.7 MB -0%
subgraph-dom-widget-clipping: DOM nodes 20 20 +0% z=-1.9
subgraph-dom-widget-clipping: event listeners 8 8 +0% z=-1.4
subgraph-idle: avg frame time 17ms 17ms +0% z=0.4
subgraph-idle: p95 frame time 17ms 17ms -1%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 10ms 10ms +5% z=-0.6
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 10 10 +0% z=-1.4
subgraph-idle: task duration 462ms 348ms -25% z=-0.7
subgraph-idle: script duration 23ms 16ms -28% z=-1.5
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 61.6 MB 61.3 MB -0%
subgraph-idle: DOM nodes 20 20 +0% z=-1.2
subgraph-idle: event listeners 6 6 +0% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms +0% z=0.4
subgraph-mouse-sweep: p95 frame time 17ms 17ms +0%
subgraph-mouse-sweep: layout duration 5ms 5ms -12% z=-0.1
subgraph-mouse-sweep: style recalc duration 51ms 48ms -6% z=1.7
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 87 87 +0% z=3.6
subgraph-mouse-sweep: task duration 977ms 922ms -6% ⚠️ z=2.3
subgraph-mouse-sweep: script duration 108ms 98ms -9% z=-0.5
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 53.4 MB 53.5 MB +0%
subgraph-mouse-sweep: DOM nodes 71 72 +1% z=2.3
subgraph-mouse-sweep: event listeners 6 6 +0% variance too high
viewport-pan-sweep: avg frame time 17ms 17ms +0%
viewport-pan-sweep: p95 frame time 17ms 17ms +0%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 62ms 51ms -18%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 250 251 +0%
viewport-pan-sweep: task duration 4430ms 3675ms -17%
viewport-pan-sweep: script duration 1427ms 1241ms -13%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 58.2 MB 76.5 MB +31%
viewport-pan-sweep: DOM nodes -260 -259 -0%
viewport-pan-sweep: event listeners -111 -111 +0%
vue-large-graph-idle: avg frame time 18ms 18ms -0%
vue-large-graph-idle: p95 frame time 17ms 17ms +0%
vue-large-graph-idle: layout duration 0ms 0ms +0%
vue-large-graph-idle: style recalc duration 0ms 0ms +0%
vue-large-graph-idle: layout count 0 0 +0%
vue-large-graph-idle: style recalc count 0 0 +0%
vue-large-graph-idle: task duration 14705ms 12153ms -17%
vue-large-graph-idle: script duration 650ms 615ms -5%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 153.7 MB 178.4 MB +16%
vue-large-graph-idle: DOM nodes -9850 -9850 +0%
vue-large-graph-idle: event listeners -23955 -23959 +0%
vue-large-graph-pan: avg frame time 17ms 17ms +0%
vue-large-graph-pan: p95 frame time 17ms 17ms -0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 24ms 17ms -31%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 100 66 -34%
vue-large-graph-pan: task duration 17132ms 14201ms -17%
vue-large-graph-pan: script duration 973ms 906ms -7%
vue-large-graph-pan: TBT 213ms 0ms -100%
vue-large-graph-pan: heap used 164.1 MB 160.9 MB -2%
vue-large-graph-pan: DOM nodes -9848 -9850 +0%
vue-large-graph-pan: event listeners -23983 -23955 -0%
workflow-execution: avg frame time 17ms 17ms -0% z=-0.4
workflow-execution: p95 frame time 17ms 17ms -1%
workflow-execution: layout duration 2ms 1ms -24% z=-2.1
workflow-execution: style recalc duration 28ms 23ms -15% z=-0.4
workflow-execution: layout count 5 5 +0% z=0.1
workflow-execution: style recalc count 17 17 +0% z=-0.4
workflow-execution: task duration 134ms 128ms -4% z=0.5
workflow-execution: script duration 26ms 29ms +10% z=-0.2
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 48.6 MB 48.3 MB -1%
workflow-execution: DOM nodes 157 156 -1% z=-0.7
workflow-execution: event listeners 71 71 +0% z=4.4
Historical variance (last 15 runs)
Metric μ σ CV
canvas-idle: avg frame time 17ms 0ms 0.0%
canvas-idle: layout duration 0ms 0ms 0.0%
canvas-idle: style recalc duration 11ms 1ms 8.2%
canvas-idle: layout count 0 0 0.0%
canvas-idle: style recalc count 11 1 5.0%
canvas-idle: task duration 395ms 31ms 7.9%
canvas-idle: script duration 25ms 2ms 8.8%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
canvas-mouse-sweep: avg frame time 17ms 0ms 0.0%
canvas-mouse-sweep: layout duration 4ms 0ms 5.4%
canvas-mouse-sweep: style recalc duration 43ms 3ms 7.4%
canvas-mouse-sweep: layout count 12 0 0.0%
canvas-mouse-sweep: style recalc count 79 2 3.0%
canvas-mouse-sweep: task duration 865ms 58ms 6.7%
canvas-mouse-sweep: script duration 136ms 6ms 4.8%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
canvas-zoom-sweep: avg frame time 17ms 0ms 0.0%
canvas-zoom-sweep: layout duration 1ms 0ms 7.0%
canvas-zoom-sweep: style recalc duration 19ms 2ms 8.0%
canvas-zoom-sweep: layout count 6 0 0.0%
canvas-zoom-sweep: style recalc count 31 0 1.5%
canvas-zoom-sweep: task duration 327ms 23ms 7.1%
canvas-zoom-sweep: script duration 27ms 3ms 11.1%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
dom-widget-clipping: avg frame time 17ms 0ms 0.0%
dom-widget-clipping: layout duration 0ms 0ms 0.0%
dom-widget-clipping: style recalc duration 10ms 1ms 8.0%
dom-widget-clipping: layout count 0 0 0.0%
dom-widget-clipping: style recalc count 13 0 3.8%
dom-widget-clipping: task duration 365ms 16ms 4.5%
dom-widget-clipping: script duration 68ms 3ms 4.8%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
large-graph-idle: avg frame time 17ms 0ms 0.0%
large-graph-idle: layout duration 0ms 0ms 0.0%
large-graph-idle: style recalc duration 12ms 1ms 8.6%
large-graph-idle: layout count 0 0 0.0%
large-graph-idle: style recalc count 12 0 2.7%
large-graph-idle: task duration 542ms 54ms 10.0%
large-graph-idle: script duration 102ms 11ms 10.3%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
large-graph-pan: avg frame time 17ms 0ms 0.0%
large-graph-pan: layout duration 0ms 0ms 0.0%
large-graph-pan: style recalc duration 17ms 1ms 4.6%
large-graph-pan: layout count 0 0 0.0%
large-graph-pan: style recalc count 70 1 0.9%
large-graph-pan: task duration 1082ms 43ms 4.0%
large-graph-pan: script duration 408ms 20ms 4.8%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
minimap-idle: avg frame time 17ms 0ms 0.0%
minimap-idle: layout duration 0ms 0ms 0.0%
minimap-idle: style recalc duration 10ms 1ms 8.6%
minimap-idle: layout count 0 0 0.0%
minimap-idle: style recalc count 10 1 7.1%
minimap-idle: task duration 527ms 47ms 9.0%
minimap-idle: script duration 98ms 10ms 10.1%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
subgraph-dom-widget-clipping: avg frame time 17ms 0ms 0.0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalc duration 13ms 1ms 7.4%
subgraph-dom-widget-clipping: layout count 0 0 0.0%
subgraph-dom-widget-clipping: style recalc count 48 1 1.2%
subgraph-dom-widget-clipping: task duration 378ms 18ms 4.9%
subgraph-dom-widget-clipping: script duration 128ms 6ms 4.9%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.0%
subgraph-dom-widget-clipping: event listeners 16 6 36.0%
subgraph-idle: avg frame time 17ms 0ms 0.0%
subgraph-idle: layout duration 0ms 0ms 0.0%
subgraph-idle: style recalc duration 10ms 1ms 7.5%
subgraph-idle: layout count 0 0 0.0%
subgraph-idle: style recalc count 11 1 6.0%
subgraph-idle: task duration 370ms 31ms 8.5%
subgraph-idle: script duration 20ms 3ms 13.2%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
subgraph-mouse-sweep: avg frame time 17ms 0ms 0.0%
subgraph-mouse-sweep: layout duration 5ms 0ms 6.8%
subgraph-mouse-sweep: style recalc duration 42ms 3ms 7.8%
subgraph-mouse-sweep: layout count 16 0 0.0%
subgraph-mouse-sweep: style recalc count 80 2 2.4%
subgraph-mouse-sweep: task duration 766ms 69ms 9.0%
subgraph-mouse-sweep: script duration 101ms 7ms 6.5%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
workflow-execution: avg frame time 17ms 0ms 0.0%
workflow-execution: layout duration 2ms 0ms 9.4%
workflow-execution: style recalc duration 24ms 2ms 9.1%
workflow-execution: layout count 5 1 11.0%
workflow-execution: style recalc count 18 2 11.5%
workflow-execution: task duration 123ms 11ms 8.8%
workflow-execution: script duration 29ms 3ms 10.2%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: DOM nodes 161 7 4.4%
workflow-execution: event listeners 52 4 8.4%
Trend (last 15 commits on main)
Metric Trend Dir Latest
canvas-idle: avg frame time ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: p95 frame time ➡️ NaNms
canvas-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: style recalc duration ▇▇▆▆▃█▄▃▄▃▇▄▁▆▇ ➡️ 11ms
canvas-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: style recalc count █▃▅▂▅▆▃▁▂▁▂▅▆▅▆ ➡️ 12
canvas-idle: task duration ▃▃▃▆▂▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: script duration ▄▃▅▇▂▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
canvas-mouse-sweep: avg frame time ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: p95 frame time ➡️ NaNms
canvas-mouse-sweep: layout duration ▁▃▂▄▁▂▁▃▆▂█▇▆▄▃ ➡️ 4ms
canvas-mouse-sweep: style recalc duration ▄▄▂▄▁▂▃▃▅▄█▆▂▄▄ ➡️ 43ms
canvas-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: style recalc count █▅▄▃▂▂▁▄▄▅▆▅▂▇▄ ➡️ 79
canvas-mouse-sweep: task duration █▆▄▂▂▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: script duration ▄▅▄▆▄▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
canvas-zoom-sweep: avg frame time ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: p95 frame time ➡️ NaNms
canvas-zoom-sweep: layout duration ▆▅▅▄▁▁█▅▃▅▇▆▁▂▆ ➡️ 1ms
canvas-zoom-sweep: style recalc duration ▆▅▄▆▅▃█▆▇▅▇▄▁▃▅ ➡️ 20ms
canvas-zoom-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: style recalc count ▁▁▃▄▆▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: task duration ▄▂▁▇▂▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: script duration ▃▃▂▇▂▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
dom-widget-clipping: avg frame time ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: p95 frame time ➡️ NaNms
dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: style recalc duration ▆▆▂▆▄▃██▄▁▆▇▆▃▅ ➡️ 10ms
dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: style recalc count ▇█▅█▅▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: task duration ▃▃▁▅▄▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: script duration ▅▄▄▆▆▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
large-graph-idle: avg frame time ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: p95 frame time ➡️ NaNms
large-graph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: style recalc duration ▅▅▅▆▄▅▃▄▅▅▆█▁▄▆ ➡️ 13ms
large-graph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: style recalc count █▆█▃▃▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: task duration ▂▃▂▆▂▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: script duration ▄▅▄▆▄▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
large-graph-pan: avg frame time ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: p95 frame time ➡️ NaNms
large-graph-pan: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: style recalc duration ▃▂▄▄▁▅▂▂▁▄▄█▃▁▂ ➡️ 17ms
large-graph-pan: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: style recalc count ▆▃█▂▃▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: task duration ▄▃▄▆▄▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: script duration ▅▄▅▆▆▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
minimap-idle: avg frame time ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: p95 frame time ➡️ NaNms
minimap-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: style recalc duration ▄█▁█▅▅█▅▅▃▅▁▁▄▆ ➡️ 10ms
minimap-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: style recalc count ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 9
minimap-idle: task duration ▃▄▁▅▁▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: script duration ▄▆▃▇▃▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
subgraph-dom-widget-clipping: avg frame time ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: p95 frame time ➡️ NaNms
subgraph-dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: style recalc duration ▂▄▃▅▅▃▂▅▇▃▄█▁▄▆ ➡️ 14ms
subgraph-dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: style recalc count ▇█▆▃▆▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: task duration ▂▃▃▆▅▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: script duration ▃▃▃▄▅▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
subgraph-idle: avg frame time ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: p95 frame time ➡️ NaNms
subgraph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: style recalc duration ▁▇▃▆▂▄▂▃▃▆▆▄▃▇█ ➡️ 12ms
subgraph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: style recalc count ▃▆▃▃▂▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: task duration ▁▃▁▇▁▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: script duration ▁▃▂▇▁▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
subgraph-mouse-sweep: avg frame time ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: p95 frame time ➡️ NaNms
subgraph-mouse-sweep: layout duration ▁▄▄▄▃▃▅▅▅▂█▇▂▃▆ ➡️ 5ms
subgraph-mouse-sweep: style recalc duration ▃▂▄▅▂▃▄▅█▃█▆▁▂▅ ➡️ 43ms
subgraph-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: style recalc count ▅▂▅▅▁▄▃▅█▅▆▄▂▄▅ ➡️ 81
subgraph-mouse-sweep: task duration ▃▂▄▅▂▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: script duration ▄▅▄▇▅▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
workflow-execution: avg frame time ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: p95 frame time ➡️ NaNms
workflow-execution: layout duration ▁▆▁▃▂▄▃▂▃▃▅█▄▂▅ ➡️ 2ms
workflow-execution: style recalc duration ▃▇▅▇▁▅▆▇█▁██▂▄▆ ➡️ 25ms
workflow-execution: layout count ▁█▂▃▂▃▃▁▃▃▄▃▂▃▂ ➡️ 5
workflow-execution: style recalc count ▃█▅▇▁▄▅▆▅▅▅▅▄▄▂ ➡️ 15
workflow-execution: task duration ▂▅▄▅▁▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: script duration ▄▃▄▄▃▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-04-28T08:08:08.072Z",
  "gitSha": "096922422621646f613eead42dc80ebf37a8e60a",
  "branch": "jaewon/dialog-reka-migration-phase-0",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2029.5860000000516,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 8.049,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 350.735,
      "heapDeltaBytes": 20421400,
      "heapUsedBytes": 64427856,
      "domNodes": 16,
      "jsHeapTotalBytes": 22806528,
      "scriptDurationMs": 16.233999999999998,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-idle",
      "durationMs": 2014.6540000000073,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.218,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 337.634,
      "heapDeltaBytes": 21221356,
      "heapUsedBytes": 65095636,
      "domNodes": 22,
      "jsHeapTotalBytes": 22806528,
      "scriptDurationMs": 17.722,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 1995.480999999927,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.82,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 328.4050000000001,
      "heapDeltaBytes": 20367536,
      "heapUsedBytes": 64433316,
      "domNodes": 18,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 15.406000000000002,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2026.219000000026,
      "styleRecalcs": 83,
      "styleRecalcDurationMs": 46.556,
      "layouts": 12,
      "layoutDurationMs": 3.903,
      "taskDurationMs": 1021.8990000000001,
      "heapDeltaBytes": 15661056,
      "heapUsedBytes": 59695956,
      "domNodes": 64,
      "jsHeapTotalBytes": 23855104,
      "scriptDurationMs": 141.582,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1999.0469999999618,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 38.729,
      "layouts": 12,
      "layoutDurationMs": 3.333,
      "taskDurationMs": 915.2829999999999,
      "heapDeltaBytes": 15708892,
      "heapUsedBytes": 59775884,
      "domNodes": 62,
      "jsHeapTotalBytes": 23330816,
      "scriptDurationMs": 124.82100000000001,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2022.9409999999461,
      "styleRecalcs": 84,
      "styleRecalcDurationMs": 45.406,
      "layouts": 12,
      "layoutDurationMs": 3.6769999999999996,
      "taskDurationMs": 961.3399999999999,
      "heapDeltaBytes": 18620440,
      "heapUsedBytes": 68526976,
      "domNodes": 66,
      "jsHeapTotalBytes": 25165824,
      "scriptDurationMs": 136.763,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1731.1990000000037,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 16.215,
      "layouts": 6,
      "layoutDurationMs": 0.604,
      "taskDurationMs": 293.13200000000006,
      "heapDeltaBytes": 24749272,
      "heapUsedBytes": 68790556,
      "domNodes": 76,
      "jsHeapTotalBytes": 21495808,
      "scriptDurationMs": 18.383000000000003,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1726.8810000000485,
      "styleRecalcs": 30,
      "styleRecalcDurationMs": 21.284999999999997,
      "layouts": 6,
      "layoutDurationMs": 0.7390000000000001,
      "taskDurationMs": 324.128,
      "heapDeltaBytes": 24695572,
      "heapUsedBytes": 68123628,
      "domNodes": 76,
      "jsHeapTotalBytes": 21233664,
      "scriptDurationMs": 22.235,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1723.555000000033,
      "styleRecalcs": 30,
      "styleRecalcDurationMs": 16.995000000000005,
      "layouts": 6,
      "layoutDurationMs": 0.541,
      "taskDurationMs": 302.18,
      "heapDeltaBytes": 25036524,
      "heapUsedBytes": 68763660,
      "domNodes": 77,
      "jsHeapTotalBytes": 21495808,
      "scriptDurationMs": 25.998,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 545.7269999999994,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 7.558999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 325.624,
      "heapDeltaBytes": 6735964,
      "heapUsedBytes": 50780760,
      "domNodes": 17,
      "jsHeapTotalBytes": 12845056,
      "scriptDurationMs": 57.836999999999996,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 551.5800000000013,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 8.562,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 325.29999999999995,
      "heapDeltaBytes": 6959392,
      "heapUsedBytes": 50754488,
      "domNodes": 21,
      "jsHeapTotalBytes": 12582912,
      "scriptDurationMs": 63.54,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 529.3689999999742,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 7.754000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 316.109,
      "heapDeltaBytes": 6764896,
      "heapUsedBytes": 50788392,
      "domNodes": 18,
      "jsHeapTotalBytes": 12582912,
      "scriptDurationMs": 57.153,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.669999999999998,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2037.7690000000257,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 9.797999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 554.7599999999999,
      "heapDeltaBytes": 4776136,
      "heapUsedBytes": 57332756,
      "domNodes": -260,
      "jsHeapTotalBytes": 15892480,
      "scriptDurationMs": 102.632,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2081.446000000028,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 10.526,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 559.8000000000001,
      "heapDeltaBytes": 4750392,
      "heapUsedBytes": 57165368,
      "domNodes": -257,
      "jsHeapTotalBytes": 16941056,
      "scriptDurationMs": 106.752,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2036.7539999999735,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 10.280000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 548.7040000000001,
      "heapDeltaBytes": 4425240,
      "heapUsedBytes": 56523556,
      "domNodes": -258,
      "jsHeapTotalBytes": 16416768,
      "scriptDurationMs": 103.88399999999999,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2123.2860000000073,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 18.954,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1090.589,
      "heapDeltaBytes": -822572,
      "heapUsedBytes": 54214580,
      "domNodes": -265,
      "jsHeapTotalBytes": 17932288,
      "scriptDurationMs": 399.262,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2132.7989999999772,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 17.307999999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1109.9589999999998,
      "heapDeltaBytes": 15601096,
      "heapUsedBytes": 71088632,
      "domNodes": -263,
      "jsHeapTotalBytes": 18194432,
      "scriptDurationMs": 405.64500000000004,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2126.062999999931,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 17.394999999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1082.6009999999999,
      "heapDeltaBytes": 20469324,
      "heapUsedBytes": 75658000,
      "domNodes": -264,
      "jsHeapTotalBytes": 17145856,
      "scriptDurationMs": 389.634,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3153.300999999999,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 18.253,
      "layouts": 60,
      "layoutDurationMs": 7.1450000000000005,
      "taskDurationMs": 1318.2179999999998,
      "heapDeltaBytes": 1033944,
      "heapUsedBytes": 57497564,
      "domNodes": -266,
      "jsHeapTotalBytes": 16678912,
      "scriptDurationMs": 482.093,
      "eventListeners": -123,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3133.066000000042,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 18.952999999999996,
      "layouts": 60,
      "layoutDurationMs": 7.433999999999999,
      "taskDurationMs": 1336.106,
      "heapDeltaBytes": -5745896,
      "heapUsedBytes": 59671044,
      "domNodes": -263,
      "jsHeapTotalBytes": 14172160,
      "scriptDurationMs": 491.62799999999993,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3184.933000000001,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 19.076000000000004,
      "layouts": 60,
      "layoutDurationMs": 7.079000000000001,
      "taskDurationMs": 1300.017,
      "heapDeltaBytes": 8362752,
      "heapUsedBytes": 64749016,
      "domNodes": -264,
      "jsHeapTotalBytes": 15630336,
      "scriptDurationMs": 491.23799999999994,
      "eventListeners": -123,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2019.3360000000098,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.979999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 557.712,
      "heapDeltaBytes": 4479572,
      "heapUsedBytes": 68453500,
      "domNodes": -260,
      "jsHeapTotalBytes": 16093184,
      "scriptDurationMs": 101.19,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2035.9680000000253,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.923000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 563.9320000000001,
      "heapDeltaBytes": 4533780,
      "heapUsedBytes": 59022908,
      "domNodes": -260,
      "jsHeapTotalBytes": 15892480,
      "scriptDurationMs": 109.63600000000001,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2010.114999999928,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.859000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 519.0819999999999,
      "heapDeltaBytes": 2455168,
      "heapUsedBytes": 58672460,
      "domNodes": -264,
      "jsHeapTotalBytes": 16154624,
      "scriptDurationMs": 90.79699999999998,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 548.5089999999673,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 11.066999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 359.64799999999997,
      "heapDeltaBytes": 8643016,
      "heapUsedBytes": 58897440,
      "domNodes": 20,
      "jsHeapTotalBytes": 13893632,
      "scriptDurationMs": 127.073,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 592.5290000000132,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 12.702,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 367.71299999999997,
      "heapDeltaBytes": 7048188,
      "heapUsedBytes": 51081336,
      "domNodes": 20,
      "jsHeapTotalBytes": 12845056,
      "scriptDurationMs": 128.672,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999727
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 551.6340000000355,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 11.838,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 348.472,
      "heapDeltaBytes": 7015516,
      "heapUsedBytes": 51093100,
      "domNodes": 20,
      "jsHeapTotalBytes": 12320768,
      "scriptDurationMs": 122.93199999999999,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999727
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2004.9109999999928,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.112,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 324.11,
      "heapDeltaBytes": 20111176,
      "heapUsedBytes": 64287116,
      "domNodes": 18,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 12.133000000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1991.579999999999,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.974999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 347.75800000000004,
      "heapDeltaBytes": 20909840,
      "heapUsedBytes": 64420124,
      "domNodes": 20,
      "jsHeapTotalBytes": 22544384,
      "scriptDurationMs": 19.904999999999998,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1999.2670000000317,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 11.259,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 351.988,
      "heapDeltaBytes": 19935372,
      "heapUsedBytes": 63994204,
      "domNodes": 21,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 16.209,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1722.6029999999923,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 36.699999999999996,
      "layouts": 16,
      "layoutDurationMs": 4.401999999999999,
      "taskDurationMs": 645.956,
      "heapDeltaBytes": 11758304,
      "heapUsedBytes": 56220644,
      "domNodes": 64,
      "jsHeapTotalBytes": 23330816,
      "scriptDurationMs": 96.721,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1983.1930000000284,
      "styleRecalcs": 88,
      "styleRecalcDurationMs": 48.065,
      "layouts": 16,
      "layoutDurationMs": 4.843999999999999,
      "taskDurationMs": 922.152,
      "heapDeltaBytes": 11892292,
      "heapUsedBytes": 55932192,
      "domNodes": 73,
      "jsHeapTotalBytes": 22282240,
      "scriptDurationMs": 98.67500000000001,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1990.3410000000576,
      "styleRecalcs": 87,
      "styleRecalcDurationMs": 48.167,
      "layouts": 16,
      "layoutDurationMs": 4.651,
      "taskDurationMs": 932.9719999999999,
      "heapDeltaBytes": 11819524,
      "heapUsedBytes": 56061592,
      "domNodes": 72,
      "jsHeapTotalBytes": 22544384,
      "scriptDurationMs": 97.679,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8184.910000000002,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 51.37899999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3615.965,
      "heapDeltaBytes": 27721108,
      "heapUsedBytes": 80193072,
      "domNodes": -259,
      "jsHeapTotalBytes": 18980864,
      "scriptDurationMs": 1236.3069999999998,
      "eventListeners": -111,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8179.059999999992,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 51.18,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3762.7360000000003,
      "heapDeltaBytes": 27223808,
      "heapUsedBytes": 79625260,
      "domNodes": -258,
      "jsHeapTotalBytes": 19505152,
      "scriptDurationMs": 1269.626,
      "eventListeners": -111,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8167.371000000003,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 51.91,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3675.34,
      "heapDeltaBytes": 27498724,
      "heapUsedBytes": 80965104,
      "domNodes": -260,
      "jsHeapTotalBytes": 18980864,
      "scriptDurationMs": 1241.208,
      "eventListeners": -111,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12178.802000000018,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12152.940999999999,
      "heapDeltaBytes": -48310936,
      "heapUsedBytes": 169130464,
      "domNodes": -9850,
      "jsHeapTotalBytes": 25751552,
      "scriptDurationMs": 614.877,
      "eventListeners": -23959,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12600.783999999976,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12590.730999999998,
      "heapDeltaBytes": -9229620,
      "heapUsedBytes": 187900524,
      "domNodes": -9850,
      "jsHeapTotalBytes": 20770816,
      "scriptDurationMs": 641.062,
      "eventListeners": -23959,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.773333333333238,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11922.195999999985,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11911.432999999999,
      "heapDeltaBytes": -30147056,
      "heapUsedBytes": 187055444,
      "domNodes": -9850,
      "jsHeapTotalBytes": 20770816,
      "scriptDurationMs": 596.643,
      "eventListeners": -23959,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666763,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14126.78900000003,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 15.806000000000042,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14083.157,
      "heapDeltaBytes": -44321812,
      "heapUsedBytes": 168764572,
      "domNodes": -9849,
      "jsHeapTotalBytes": 25751552,
      "scriptDurationMs": 945.097,
      "eventListeners": -23955,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14672.05899999999,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 16.901,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14648.67,
      "heapDeltaBytes": -40515076,
      "heapUsedBytes": 173893052,
      "domNodes": -9850,
      "jsHeapTotalBytes": -23093248,
      "scriptDurationMs": 890.72,
      "eventListeners": -23957,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14223.138000000063,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 16.59700000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14201.477999999997,
      "heapDeltaBytes": -45356536,
      "heapUsedBytes": 168615236,
      "domNodes": -9850,
      "jsHeapTotalBytes": -20733952,
      "scriptDurationMs": 906.227,
      "eventListeners": -23955,
      "totalBlockingTimeMs": 22,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 463.6810000000082,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 27.736000000000004,
      "layouts": 6,
      "layoutDurationMs": 1.8139999999999996,
      "taskDurationMs": 138.51900000000003,
      "heapDeltaBytes": 5394756,
      "heapUsedBytes": 56734348,
      "domNodes": 167,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 29.661000000000005,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.663333333333338,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "workflow-execution",
      "durationMs": 456.02900000005775,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 18.837999999999997,
      "layouts": 5,
      "layoutDurationMs": 1.192,
      "taskDurationMs": 109.09299999999996,
      "heapDeltaBytes": 4952576,
      "heapUsedBytes": 50618796,
      "domNodes": 150,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 23.423999999999996,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "workflow-execution",
      "durationMs": 462.8889999999046,
      "styleRecalcs": 17,
      "styleRecalcDurationMs": 23.454,
      "layouts": 5,
      "layoutDurationMs": 1.2459999999999998,
      "taskDurationMs": 128.029,
      "heapDeltaBytes": 5108888,
      "heapUsedBytes": 50333124,
      "domNodes": 156,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 28.506000000000004,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000273
    }
  ]
}

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 28, 2026

Codecov Report

❌ Patch coverage is 72.13115% with 17 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/components/dialog/GlobalDialog.vue 63.63% 8 Missing and 4 partials ⚠️
src/components/ui/dialog/DialogDescription.vue 0.00% 3 Missing and 1 partial ⚠️
src/components/ui/dialog/DialogFooter.vue 0.00% 1 Missing ⚠️
@@             Coverage Diff             @@
##             main   #11719       +/-   ##
===========================================
- Coverage   69.30%   51.51%   -17.79%     
===========================================
  Files        1483     1384       -99     
  Lines       83853    70391    -13462     
  Branches    23134    19576     -3558     
===========================================
- Hits        58114    36263    -21851     
- Misses      24794    33527     +8733     
+ Partials      945      601      -344     
Flag Coverage Δ
e2e ?
unit 51.51% <72.13%> (+0.03%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/components/ui/dialog/Dialog.vue 100.00% <100.00%> (ø)
src/components/ui/dialog/DialogClose.vue 100.00% <100.00%> (ø)
src/components/ui/dialog/DialogContent.vue 100.00% <100.00%> (ø)
src/components/ui/dialog/DialogHeader.vue 100.00% <100.00%> (ø)
src/components/ui/dialog/DialogOverlay.vue 100.00% <100.00%> (ø)
src/components/ui/dialog/DialogPortal.vue 100.00% <100.00%> (ø)
src/components/ui/dialog/DialogTitle.vue 100.00% <100.00%> (ø)
src/components/ui/dialog/dialog.variants.ts 100.00% <100.00%> (ø)
src/stores/dialogStore.ts 71.60% <ø> (-5.51%) ⬇️
src/components/ui/dialog/DialogFooter.vue 0.00% <0.00%> (ø)
... and 2 more

... and 1002 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (6)
src/components/ui/dialog/DialogPortal.vue (1)

5-10: Prefer useForwardProps here to match the Reka wrapper convention.

Directly binding props works, but this diverges from the standardized forwarding pattern used for these primitives.

As per coding guidelines, "Use useForwardProps(restProps) for prop forwarding, or computed() if adding defaults" in src/components/ui/**/*.vue.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/dialog/DialogPortal.vue` around lines 5 - 10, Replace the
direct v-bind="props" forwarding with the standardized useForwardProps pattern:
import/use useForwardProps, pass the component props (from
defineProps<DialogPortalProps>()) into useForwardProps to get a forwardProps
object, and change the template to v-bind="forwardProps"; if you need defaults
instead of straight forwarding use a computed wrapper around props before
calling useForwardProps. Ensure you reference the existing
defineProps<DialogPortalProps>() and the DialogPortal component when making this
change.
src/components/ui/dialog/DialogDescription.vue (1)

8-16: Use useForwardProps for forwarded props here as well.

This keeps the wrapper consistent with the expected Reka primitive pattern and avoids drift between dialog subcomponents.

As per coding guidelines, "Use useForwardProps(restProps) for prop forwarding, or computed() if adding defaults" in src/components/ui/**/*.vue.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/dialog/DialogDescription.vue` around lines 8 - 16, The
wrapper should forward props using useForwardProps instead of manually spreading
delegated; keep the customClass default from defineProps but pass the remaining
props into useForwardProps so DialogDescription receives the forwarded props.
Locate the defineProps destructuring (symbols: defineProps, customClass,
delegated) and replace the delegated spread with delegated =
useForwardProps(restProps) (or call useForwardProps on the rest object returned
from defineProps) and continue using :class="cn('text-sm text-muted-foreground',
customClass)" when binding to DialogDescription.
src/stores/dialogStore.ts (1)

23-28: Consider removing this new prose block and relying on self-documenting type names.

This context already exists in ADR/planning docs, so keeping the type section lean would better match repo conventions.

As per coding guidelines, "Avoid new usage of code comments; do not add or retain redundant comments" and "Write code that is expressive and self-documenting to minimize need for code comments."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stores/dialogStore.ts` around lines 23 - 28, The new explanatory comment
block above the dialog renderer type is redundant — remove the prose comment so
the code relies on self-documenting type names ('primevue' and 'reka') and
existing ADR docs; specifically delete the multi-line comment that mentions
GlobalDialog, 'primevue', 'reka', and the migration note (and any reference to
src/components/ui/dialog/) in src/stores/dialogStore.ts so the type declaration
stands alone and remains clear.
src/components/ui/dialog/DialogOverlay.vue (1)

8-16: Align prop forwarding with useForwardProps in this Reka wrapper.

Please switch from direct v-bind="delegated" to forwarded props to keep wrapper behavior consistent across the dialog primitives.

As per coding guidelines, "Use useForwardProps(restProps) for prop forwarding, or computed() if adding defaults" in src/components/ui/**/*.vue.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/dialog/DialogOverlay.vue` around lines 8 - 16, The wrapper
currently forwards props via the local delegated object (const { class:
customClass = '', ...delegated } = defineProps(...)) and uses
v-bind="delegated"; change this to use the shared helper by creating a
forwardedProps constant: const forwardedProps = useForwardProps(delegated)
(import/use useForwardProps in the <script setup>), then update the template to
v-bind="forwardedProps" on the <DialogOverlay> (keep :class binding/ customClass
handling as needed). This aligns prop forwarding with useForwardProps while
preserving the existing customClass handling and DialogOverlay usage.
src/components/ui/dialog/Dialog.stories.ts (1)

21-27: Consider removing deprecated defaultValue from argTypes.

In Storybook 7+, defaultValue in argTypes is deprecated. The default is already correctly set in args at line 29. The defaultValue at line 25 can be removed.

♻️ Suggested cleanup
   argTypes: {
     size: {
       control: { type: 'select' },
-      options: sizes,
-      defaultValue: 'md'
+      options: sizes
     }
   },
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/dialog/Dialog.stories.ts` around lines 21 - 27, Remove the
deprecated defaultValue from the argTypes entry for size: in the
Dialog.stories.ts story, locate the argTypes object (the size property that uses
control: { type: 'select' }, options: sizes) and delete the defaultValue: 'md'
key so the story relies on the existing default in args; leave the control and
options intact and ensure args still sets the default size.
src/components/dialog/GlobalDialog.test.ts (1)

48-49: Consider using findBy queries instead of double nextTick.

The double await nextTick() pattern can be fragile if rendering takes additional ticks. Testing Library's findByRole queries (or waitFor) automatically wait for elements to appear and are more resilient to timing variations.

♻️ Suggested improvement
-    await nextTick()
-    await nextTick()
-
-    const dialogs = screen.queryAllByRole('dialog')
+    const dialogs = await screen.findAllByRole('dialog')

Also applies to: 65-66

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/dialog/GlobalDialog.test.ts` around lines 48 - 49, Replace the
fragile double "await nextTick()" usage in GlobalDialog.test.ts with Testing
Library async queries: remove the two nextTick calls (the occurrences currently
surrounding the assertions) and use a findBy* query (e.g.,
screen.findByRole('dialog') or screen.findByText(...)) or wrap assertions in
waitFor so the test waits for the DOM change reliably; update both occurrences
(around the two nextTick calls at lines shown) to use
screen.findByRole/findByText or waitFor and then assert on the returned element.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/ui/dialog/dialog.variants.ts`:
- Around line 4-18: The Tailwind class in dialogContentVariants' base string
uses an invalid token "z-1700"; update the cva base value to use Tailwind's
arbitrary value syntax "z-[1700]" instead (locate the dialogContentVariants
constant and its cva({ base: '...'} ) call and replace z-1700 with z-[1700]).
Ensure the change is applied inside the base string without altering other
classes or variants.

In `@src/components/ui/dialog/DialogTitle.vue`:
- Around line 8-16: The wrapper currently manually extracts props via
defineProps (const { class: customClass = '', ...delegated } =
defineProps<DialogTitleProps & { class?: HTMLAttributes['class'] }>() ) and
binds delegated to <DialogTitle>, which deviates from the Reka pattern; replace
this with the useForwardProps helper to collect and forward props
(useForwardProps<DialogTitleProps>() or the project-specific generic) and use
its returned forwarded props instead of delegated, keep class extraction only
for customClass and pass classes into cn('text-base font-semibold
text-base-foreground', customClass), and apply the same change to
DialogOverlay.vue, DialogDescription.vue, and DialogContent.vue so all dialog
wrappers use useForwardProps for prop forwarding.

---

Nitpick comments:
In `@src/components/dialog/GlobalDialog.test.ts`:
- Around line 48-49: Replace the fragile double "await nextTick()" usage in
GlobalDialog.test.ts with Testing Library async queries: remove the two nextTick
calls (the occurrences currently surrounding the assertions) and use a findBy*
query (e.g., screen.findByRole('dialog') or screen.findByText(...)) or wrap
assertions in waitFor so the test waits for the DOM change reliably; update both
occurrences (around the two nextTick calls at lines shown) to use
screen.findByRole/findByText or waitFor and then assert on the returned element.

In `@src/components/ui/dialog/Dialog.stories.ts`:
- Around line 21-27: Remove the deprecated defaultValue from the argTypes entry
for size: in the Dialog.stories.ts story, locate the argTypes object (the size
property that uses control: { type: 'select' }, options: sizes) and delete the
defaultValue: 'md' key so the story relies on the existing default in args;
leave the control and options intact and ensure args still sets the default
size.

In `@src/components/ui/dialog/DialogDescription.vue`:
- Around line 8-16: The wrapper should forward props using useForwardProps
instead of manually spreading delegated; keep the customClass default from
defineProps but pass the remaining props into useForwardProps so
DialogDescription receives the forwarded props. Locate the defineProps
destructuring (symbols: defineProps, customClass, delegated) and replace the
delegated spread with delegated = useForwardProps(restProps) (or call
useForwardProps on the rest object returned from defineProps) and continue using
:class="cn('text-sm text-muted-foreground', customClass)" when binding to
DialogDescription.

In `@src/components/ui/dialog/DialogOverlay.vue`:
- Around line 8-16: The wrapper currently forwards props via the local delegated
object (const { class: customClass = '', ...delegated } = defineProps(...)) and
uses v-bind="delegated"; change this to use the shared helper by creating a
forwardedProps constant: const forwardedProps = useForwardProps(delegated)
(import/use useForwardProps in the <script setup>), then update the template to
v-bind="forwardedProps" on the <DialogOverlay> (keep :class binding/ customClass
handling as needed). This aligns prop forwarding with useForwardProps while
preserving the existing customClass handling and DialogOverlay usage.

In `@src/components/ui/dialog/DialogPortal.vue`:
- Around line 5-10: Replace the direct v-bind="props" forwarding with the
standardized useForwardProps pattern: import/use useForwardProps, pass the
component props (from defineProps<DialogPortalProps>()) into useForwardProps to
get a forwardProps object, and change the template to v-bind="forwardProps"; if
you need defaults instead of straight forwarding use a computed wrapper around
props before calling useForwardProps. Ensure you reference the existing
defineProps<DialogPortalProps>() and the DialogPortal component when making this
change.

In `@src/stores/dialogStore.ts`:
- Around line 23-28: The new explanatory comment block above the dialog renderer
type is redundant — remove the prose comment so the code relies on
self-documenting type names ('primevue' and 'reka') and existing ADR docs;
specifically delete the multi-line comment that mentions GlobalDialog,
'primevue', 'reka', and the migration note (and any reference to
src/components/ui/dialog/) in src/stores/dialogStore.ts so the type declaration
stands alone and remains clear.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 06c9d703-e98b-4a6f-b6a5-f749bd8083b7

📥 Commits

Reviewing files that changed from the base of the PR and between c404363 and 4acbac0.

📒 Files selected for processing (14)
  • src/components/dialog/GlobalDialog.test.ts
  • src/components/dialog/GlobalDialog.vue
  • src/components/ui/dialog/Dialog.stories.ts
  • src/components/ui/dialog/Dialog.vue
  • src/components/ui/dialog/DialogClose.vue
  • src/components/ui/dialog/DialogContent.vue
  • src/components/ui/dialog/DialogDescription.vue
  • src/components/ui/dialog/DialogFooter.vue
  • src/components/ui/dialog/DialogHeader.vue
  • src/components/ui/dialog/DialogOverlay.vue
  • src/components/ui/dialog/DialogPortal.vue
  • src/components/ui/dialog/DialogTitle.vue
  • src/components/ui/dialog/dialog.variants.ts
  • src/stores/dialogStore.ts

Comment on lines +4 to +18
export const dialogContentVariants = cva({
base: 'data-[state=open]:animate-contentShow fixed top-1/2 left-1/2 z-1700 flex max-h-[85vh] w-[calc(100vw-1rem)] -translate-x-1/2 -translate-y-1/2 flex-col rounded-lg border border-border-subtle bg-base-background shadow-lg outline-none',
variants: {
size: {
sm: 'sm:max-w-sm',
md: 'sm:max-w-xl',
lg: 'sm:max-w-3xl',
xl: 'sm:max-w-5xl',
full: 'sm:max-w-[calc(100vw-1rem)]'
}
},
defaultVariants: {
size: 'md'
}
})
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for z-1700 definition in tailwind config or CSS
rg -n 'z-1700|1700' --type=css --type=ts -g '*.config.*' -g 'style.css' -g 'tailwind*'

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Find tailwind config files
find . -name "tailwind.config.*" -o -name "tailwind.*.config.*" 2>/dev/null | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Search for z-index definitions more broadly
rg -i 'z-index|zindex|z:\s*\{' --type=js --type=ts --type=json -g '*config*' -g '*tailwind*' -A 5 | head -100

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Check CSS files for z-1700 or z-index definitions
find . -name "*.css" -o -name "*.scss" | xargs grep -l "1700\|z-1700" 2>/dev/null

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 221


🏁 Script executed:

# Check if tailwind config is in package.json
cat package.json | head -100

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 5011


🏁 Script executed:

# Look for postcss config
find . -maxdepth 2 -name "postcss.config.*" -o -name "tailwind.config.*" 2>/dev/null

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Check the actual file to verify it exists and see full content
cat src/components/ui/dialog/dialog.variants.ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 881


🏁 Script executed:

# Find the tailwind-utils package location
find . -type d -name "tailwind-utils" 2>/dev/null

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 96


🏁 Script executed:

# Look for tailwind config in packages directory
find packages -name "tailwind.config.*" 2>/dev/null

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Search for z-index definitions more broadly
rg -i "z-1700|1700" --type=ts --type=js --type=json -g "packages/*" | head -50

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 219


🏁 Script executed:

# Explore tailwind-utils package structure
ls -la packages/tailwind-utils/

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 413


🏁 Script executed:

# Find all files in tailwind-utils
find packages/tailwind-utils -type f -name "*.ts" -o -name "*.js" -o -name "*.json" | head -30

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 182


🏁 Script executed:

# Search for z-1700 or 1700 in tailwind-utils
rg -i "z-1700|1700" packages/tailwind-utils/

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Search for z-index definitions in tailwind-utils
rg -i "z-index|zindex|z:" packages/tailwind-utils/ -A 3

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Read the tailwind-utils index file
cat packages/tailwind-utils/src/index.ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 436


🏁 Script executed:

# Search for any tailwind.config file anywhere in the repo
find . -name "tailwind.config.*" 2>/dev/null

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Check if there's a vite or postcss config with tailwind theme
find . -maxdepth 3 -name "vite.config.*" -o -name "postcss.config.*" 2>/dev/null | grep -v node_modules

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 122


Use z-[1700] with arbitrary value syntax instead of z-1700.

Standard Tailwind z-index utilities only support z-0 through z-50. To use custom z-index values, use the arbitrary value syntax z-[1700]. The current z-1700 class is not a valid Tailwind utility and will be ignored at runtime.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/dialog/dialog.variants.ts` around lines 4 - 18, The
Tailwind class in dialogContentVariants' base string uses an invalid token
"z-1700"; update the cva base value to use Tailwind's arbitrary value syntax
"z-[1700]" instead (locate the dialogContentVariants constant and its cva({
base: '...'} ) call and replace z-1700 with z-[1700]). Ensure the change is
applied inside the base string without altering other classes or variants.

Comment on lines +8 to +16
const { class: customClass = '', ...delegated } = defineProps<
DialogTitleProps & { class?: HTMLAttributes['class'] }
>()
</script>

<template>
<DialogTitle
v-bind="delegated"
:class="cn('text-base font-semibold text-base-foreground', customClass)"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify forwarding pattern in dialog wrappers
rg -n "useForwardProps|v-bind=\"(delegated|props|restProps|forwarded)\"" src/components/ui/dialog/*.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 544


🏁 Script executed:

# Search for actual useForwardProps usage in codebase
rg "useForwardProps" src/

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2389


🏁 Script executed:

# Check what's being imported from reka-ui across the codebase
rg "from 'reka-ui'" src/ -A 2 | head -100

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 6790


🏁 Script executed:

# Look at one of the other UI wrapper components to see the pattern
cat -n src/components/ui/button/Button.vue | head -30

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 946


🏁 Script executed:

cat -n src/components/ui/dialog/DialogTitle.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 718


Use useForwardProps for Reka prop forwarding in this wrapper.

This dialog wrapper deviates from the established pattern used across other Reka UI components (ButtonGroup, TagsInput, ToggleGroup, etc.). Align it with the codebase convention.

Proposed refactor
 <script setup lang="ts">
 import type { DialogTitleProps } from 'reka-ui'
-import { DialogTitle } from 'reka-ui'
+import { DialogTitle, useForwardProps } from 'reka-ui'
 import type { HTMLAttributes } from 'vue'
 
 import { cn } from '@comfyorg/tailwind-utils'
 
-const { class: customClass = '', ...delegated } = defineProps<
+const { class: customClass = '', ...restProps } = defineProps<
   DialogTitleProps & { class?: HTMLAttributes['class'] }
 >()
+const forwarded = useForwardProps(restProps)
 </script>
 
 <template>
   <DialogTitle
-    v-bind="delegated"
+    v-bind="forwarded"
     :class="cn('text-base font-semibold text-base-foreground', customClass)"
   >

Note: DialogOverlay.vue, DialogDescription.vue, and DialogContent.vue use the same pattern and should be updated similarly.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/dialog/DialogTitle.vue` around lines 8 - 16, The wrapper
currently manually extracts props via defineProps (const { class: customClass =
'', ...delegated } = defineProps<DialogTitleProps & { class?:
HTMLAttributes['class'] }>() ) and binds delegated to <DialogTitle>, which
deviates from the Reka pattern; replace this with the useForwardProps helper to
collect and forward props (useForwardProps<DialogTitleProps>() or the
project-specific generic) and use its returned forwarded props instead of
delegated, keep class extraction only for customClass and pass classes into
cn('text-base font-semibold text-base-foreground', customClass), and apply the
same change to DialogOverlay.vue, DialogDescription.vue, and DialogContent.vue
so all dialog wrappers use useForwardProps for prop forwarding.

@andreszs
Copy link
Copy Markdown

Phase 0 looks clean, the opt-in branch is well-scoped and the PrimeVue path is genuinely unchanged, so no concerns there. The thing I want to flag explicitly now, before Phase 1 lands, is that the public behavioral contract of app.extensionManager.dialog.confirm() and app.extensionManager.dialog.prompt() must be preserved exactly across every migration phase, not just Phase 0. Existing extensions already call these APIs and have concrete expectations about how they resolve. Breaking that contract (even as an accidental side-effect of swapping the internal renderer) would silently break third-party plugins that had no reason to change, and would send a strong signal to extension authors that adopting ComfyUI's native dialog APIs is risky because the guarantees can disappear mid-migration. That outcome would be counterproductive for the whole ecosystem.

The minimum behavioral contract that must hold after Phase 1 migrates PromptDialogContent / ConfirmationDialogContent:

// This pattern is already live in third-party extensions and must keep working:

const confirmed = await app.extensionManager.dialog.confirm({
  title: "Delete pose?",
  message: "This cannot be undone.",
});
// confirmed must be boolean-like (true = OK, false/null = cancel/escape)

const name = await app.extensionManager.dialog.prompt({
  title: "Save pose",
  message: "Enter a name:",
  defaultValue: "my_pose",
});
// name must be a non-empty string on confirm, or null on cancel/escape
// it must NEVER leave the caller's await hanging (unresolved promise)

Specifically: if the user dismisses via Escape, clicking the overlay, or the close button, the Promise must resolve (to false / null) rather than staying pending. And no caller should need to change their call site just because the renderer switched internally from PrimeVue to Reka. Please make sure the Phase 1 PR explicitly tests and documents these resolution paths so the contract is treated as a first-class concern, not an afterthought.

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

Labels

size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Native ComfyUI prompt dialogs should have a max-width set

4 participants