Skip to content

fix: stop converting defaultInput to forceInput on migration#10706

Closed
Lidang-Jiang wants to merge 3 commits into
Comfy-Org:mainfrom
Lidang-Jiang:fix/default-input-widget-reload
Closed

fix: stop converting defaultInput to forceInput on migration#10706
Lidang-Jiang wants to merge 3 commits into
Comfy-Org:mainfrom
Lidang-Jiang:fix/default-input-widget-reload

Conversation

@Lidang-Jiang
Copy link
Copy Markdown

@Lidang-Jiang Lidang-Jiang commented Mar 29, 2026

Summary

Widgets with defaultInput: true that are toggled back to widget mode revert to socket-only inputs on reload. The _migrateDefaultInput method was setting forceInput = true for all optional inputs with defaultInput, which prevented widgets from being created and overrode user preferences on every load.

Since frontend 1.16+, widgets and sockets co-exist on every input, so this conversion is no longer needed. This PR removes the forceInput = true assignment while keeping the deprecation warning.

Changes

  • What: Remove inputOptions.forceInput = true from _migrateDefaultInput for optional inputs
  • Dependencies: None

Review Focus

  • The deprecation warning for defaultInput is preserved — only the forceInput = true assignment is removed
  • Required inputs are unaffected (they were never converted to forceInput)
  • Inputs with explicit forceInput: true are unaffected (their value comes from the node definition, not from migration)

Fixes Comfy-Org/ComfyUI#1500

Test output
 ✓ src/schemas/nodeDef/migration.test.ts (25 tests) 11ms
   ✓ ComfyNodeDefImpl > defaultInput migration > should not set forceInput on optional input with defaultInput
   ✓ ComfyNodeDefImpl > defaultInput migration > should preserve widget type on optional input with defaultInput
   ✓ ComfyNodeDefImpl > defaultInput migration > should not affect required inputs with defaultInput
   ✓ ComfyNodeDefImpl > defaultInput migration > should preserve explicit forceInput when set alongside defaultInput
   ✓ ComfyNodeDefImpl > defaultInput migration > should not mutate the original node definition

 Test Files  1 passed (1)
      Tests  25 passed (25)

Test plan

  • Unit tests for defaultInput migration behavior (5 new tests)
  • Manual: create node with defaultInput: true optional input, toggle to widget, save, reload — verify it stays as widget

┆Issue is synchronized with this Notion page by Unito

The _migrateDefaultInput method set forceInput = true for every
optional input with defaultInput, preventing the widget from being
created. When users toggled a defaultInput socket back to a widget and
saved, the next reload re-applied forceInput, reverting it to a
socket-only input.

Since frontend 1.16+, widgets and sockets co-exist on every input, so
defaultInput no longer needs conversion to forceInput. Remove the
assignment while keeping the deprecation warning.

Fixes Comfy-Org/ComfyUI#1500
@Lidang-Jiang Lidang-Jiang requested a review from a team March 29, 2026 07:09
@dosubot dosubot Bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Mar 29, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 29, 2026

🎨 Storybook: loading Building...

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 29, 2026

🎭 Playwright: ❌ 1467 passed, 1 failed · 1 flaky

❌ Failed Tests

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

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 29, 2026

📝 Walkthrough

Walkthrough

Preserve optional input widgets when defaultInput is present: _migrateDefaultInput no longer rewrites defaultInput to forceInput for optional inputs, emits a deprecation console.warn, and tests added to validate non-mutation and flag-preservation behavior.

Changes

Cohort / File(s) Summary
Migration Logic Update
src/stores/nodeDefStore.ts
Changed _migrateDefaultInput to stop mutating inputOptions.forceInput for optional inputs with defaultInput. Now it emits a deprecation console.warn and preserves the original widget/input configuration; updated comments reflect frontend behavior since 1.16+.
Migration Test Suite
src/schemas/nodeDef/migration.test.ts
Added tests (imports vi from vitest) verifying: optional inputs with { defaultInput: true, default: ... } do not gain forceInput; widget type, isOptional, and default remain; required inputs unaffected; explicit forceInput is preserved; a deprecation console.warn is emitted; original spec object is not mutated.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 I nibbled at flags in the code tonight,
Found defaultInput hiding in plain sight.
I left widgets cozy where they belong,
Warned them gently — "this flag is wrong."
Hop, patch, and test — the workflow's bright! 🥕


Caution

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

  • Ignore (reviewers only)

❌ Failed checks (1 error)

Check name Status Explanation Resolution
End-To-End Regression Coverage For Fixes ❌ Error PR uses bug-fix language and modifies implementation, but lacks browser_tests changes or explanation for missing e2e test. Add Playwright regression test under browser_tests/ for widget state persistence, or explain why e2e testing is not practical for this fix.
✅ Passed checks (6 passed)
Check name Status Explanation
Title check ✅ Passed The PR title 'fix: stop converting defaultInput to forceInput on migration' accurately and concisely describes the core change: removing the automatic forceInput conversion while preserving deprecation warnings.
Description check ✅ Passed The PR description includes all required sections: Summary explaining the problem and solution, Changes section with 'What' and 'Dependencies', and Review Focus highlighting critical aspects. It is well-structured and complete.
Linked Issues check ✅ Passed The PR directly addresses issue #1500 by removing the forceInput assignment that was causing widgets to revert to socket-only inputs on reload, while preserving the deprecation warning as intended.
Out of Scope Changes check ✅ Passed All changes are scoped to the migration fix and related test coverage. File modifications are limited to migration logic and test files without introducing unrelated functionality or dependencies.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Adr Compliance For Entity/Litegraph Changes ✅ Passed PR modifies schema/store layer files not in trigger paths (src/lib/litegraph/ or src/ecs/); changes are migration logic adjustments, not direct graph entity manipulations.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

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: 1

🧹 Nitpick comments (1)
src/schemas/nodeDef/migration.test.ts (1)

541-657: Add one regression test for deprecation warning emission.

This suite validates forceInput migration behavior well, but it doesn’t lock in the “warning is still emitted” requirement. Adding a console.warn spy test would prevent accidental removal of the deprecation signal.

Suggested test addition
-import { describe, expect, it } from 'vitest'
+import { describe, expect, it, vi } from 'vitest'
   describe('defaultInput migration', () => {
+    it('should emit deprecation warning for optional defaultInput', () => {
+      const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
+
+      new ComfyNodeDefImpl({
+        name: 'WarnNode',
+        display_name: 'Warn Node',
+        category: 'Test',
+        python_module: 'test_module',
+        description: 'A test node',
+        input: {
+          optional: {
+            seed_override: ['INT', { defaultInput: true }]
+          }
+        },
+        output: [],
+        output_is_list: [],
+        output_name: [],
+        output_node: false
+      } as ComfyNodeDefV1)
+
+      expect(warnSpy).toHaveBeenCalledWith(
+        expect.stringContaining(
+          'Use of defaultInput on optional input test_module:WarnNode:seed_override is deprecated'
+        )
+      )
+
+      warnSpy.mockRestore()
+    })
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/schemas/nodeDef/migration.test.ts` around lines 541 - 657, Add a
regression test in the "defaultInput migration" suite that verifies a
deprecation warning is emitted: spy on console.warn, instantiate a
ComfyNodeDefImpl using an input entry with defaultInput: true (e.g.
optional.param or required.value as used in other tests), assert console.warn
was called (optionally check message includes "defaultInput" or "deprecated"),
and restore/clear the spy after the assertion to avoid test bleed. Ensure the
test references ComfyNodeDefImpl and the same V1-style input payload as other
tests so it exercises the migration path.
🤖 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/stores/nodeDefStore.ts`:
- Around line 132-137: The deprecation warning for defaultInput (inside the loop
over def.input.optional) should not instruct authors to use forceInput because
that reintroduces the old socket-only behavior; update the console.warn in that
block so it removes the "Please use forceInput instead." phrasing and instead
tells authors to migrate to the new preferred pattern (for example: make the
input required where appropriate or handle defaults at runtime) and to consult
the node authoring docs — keep the message concise and reference the node as
currently done via nodeDef.python_module, nodeDef.name, and the input name.

---

Nitpick comments:
In `@src/schemas/nodeDef/migration.test.ts`:
- Around line 541-657: Add a regression test in the "defaultInput migration"
suite that verifies a deprecation warning is emitted: spy on console.warn,
instantiate a ComfyNodeDefImpl using an input entry with defaultInput: true
(e.g. optional.param or required.value as used in other tests), assert
console.warn was called (optionally check message includes "defaultInput" or
"deprecated"), and restore/clear the spy after the assertion to avoid test
bleed. Ensure the test references ComfyNodeDefImpl and the same V1-style input
payload as other tests so it exercises the migration path.
🪄 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: 315415e8-ad61-4c06-beb5-80bf6aae53bc

📥 Commits

Reviewing files that changed from the base of the PR and between bce7a16 and b9b6903.

📒 Files selected for processing (2)
  • src/schemas/nodeDef/migration.test.ts
  • src/stores/nodeDefStore.ts

Comment on lines 132 to 137
for (const [name, spec] of Object.entries(def.input.optional ?? {})) {
const inputOptions = spec[1]
if (inputOptions && inputOptions.defaultInput) {
console.warn(
`Use of defaultInput on optional input ${nodeDef.python_module}:${nodeDef.name}:${name} is deprecated. Please use forceInput instead.`
)
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot Mar 29, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Update the optional-input deprecation warning to avoid reintroducing the old behavior.

At Line 136, the warning says to use forceInput as a replacement for defaultInput. With this fix, that guidance can push node authors back to socket-only configs and effectively undo the intended UX improvement.

Suggested wording update
-          `Use of defaultInput on optional input ${nodeDef.python_module}:${nodeDef.name}:${name} is deprecated. Please use forceInput instead.`
+          `Use of defaultInput on optional input ${nodeDef.python_module}:${nodeDef.name}:${name} is deprecated and ignored. Remove defaultInput. Use forceInput only if you intentionally want a socket-only input.`
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
for (const [name, spec] of Object.entries(def.input.optional ?? {})) {
const inputOptions = spec[1]
if (inputOptions && inputOptions.defaultInput) {
console.warn(
`Use of defaultInput on optional input ${nodeDef.python_module}:${nodeDef.name}:${name} is deprecated. Please use forceInput instead.`
)
for (const [name, spec] of Object.entries(def.input.optional ?? {})) {
const inputOptions = spec[1]
if (inputOptions && inputOptions.defaultInput) {
console.warn(
`Use of defaultInput on optional input ${nodeDef.python_module}:${nodeDef.name}:${name} is deprecated and ignored. Remove defaultInput. Use forceInput only if you intentionally want a socket-only input.`
)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stores/nodeDefStore.ts` around lines 132 - 137, The deprecation warning
for defaultInput (inside the loop over def.input.optional) should not instruct
authors to use forceInput because that reintroduces the old socket-only
behavior; update the console.warn in that block so it removes the "Please use
forceInput instead." phrasing and instead tells authors to migrate to the new
preferred pattern (for example: make the input required where appropriate or
handle defaults at runtime) and to consult the node authoring docs — keep the
message concise and reference the node as currently done via
nodeDef.python_module, nodeDef.name, and the input name.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Good catch, fixed in 1f4c20b. Updated the warning to clarify that defaultInput is now ignored and forceInput should only be used intentionally for socket-only inputs.

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.

@Lidang-Jiang, thanks for the update! The revised warning in the ai_summary matches the suggested wording — it now correctly conveys that defaultInput is deprecated and ignored, and that forceInput is only for intentional socket-only behavior.


🧠 Learnings used
Learnt from: jtydhr88
Repo: Comfy-Org/ComfyUI_frontend PR: 10349
File: src/renderer/glsl/useGLSLPreview.ts:31-34
Timestamp: 2026-03-21T00:15:21.439Z
Learning: In Comfy-Org/ComfyUI_frontend `src/renderer/glsl/useGLSLPreview.ts`, for the direct GLSLShader node branch: when an autogrow uniform input is connected to an upstream node, the corresponding widget is removed from the widget value store (`getWidget()` returns undefined). This makes the "local widget present" and "upstream input connected" code paths mutually exclusive by design. Do not flag the early-continue on widget presence as a precedence bug that prevents upstream values from overriding local defaults.

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-29T06:46:23.514Z
Learning: Changes to entity callbacks (`onConnectionsChange`, `onRemoved`, `onAdded`, `onConnectInput/Output`, `onConfigure`, `onWidgetChanged`), `node.widgets` access, `node.serialize`, or `graph._version++` affect 40+ custom node repos and require migration guidance

Learnt from: artokun
Repo: Comfy-Org/ComfyUI_frontend PR: 10286
File: src/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.ts:0-0
Timestamp: 2026-03-23T02:54:33.758Z
Learning: In Comfy-Org/ComfyUI_frontend, `useRemoteWidget.onFirstLoad()` (in `src/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.ts`) uses the `widget.configuredByLoad` flag (set by `LGraphNode.configure()` after restoring each widget value from serialized workflow data) to decide whether to skip overwriting `widget.value` with the first remote item. Do NOT suggest value-comparison guards (e.g., `widget.value !== defaultValue`, `widget.value !== ''`) as a substitute — the flag approach is intentional and avoids the ambiguous case where a legitimately saved value equals the default.

Learnt from: jaeone94
Repo: Comfy-Org/ComfyUI_frontend PR: 10309
File: src/platform/missingMedia/composables/useMissingMediaInteractions.ts:56-71
Timestamp: 2026-03-25T15:00:58.823Z
Learning: In `src/platform/missingMedia/composables/useMissingMediaInteractions.ts` (Comfy-Org/ComfyUI_frontend), the `applyValueToNodes` function intentionally omits `node.onWidgetChanged()` and `graph._version++` after setting the combo widget value. This mirrors the identical pattern in `src/platform/missingModel/composables/useMissingModelInteractions.ts` (lines 184-186). Undo/redo has been verified working in both pipelines. Do not flag the absence of `onWidgetChanged` or `_version++` as a bug in either pipeline; any change to add them must be applied consistently to both pipelines together in a dedicated follow-up PR.

Learnt from: jaeone94
Repo: Comfy-Org/ComfyUI_frontend PR: 10395
File: src/core/graph/subgraph/promotedWidgetView.ts:203-213
Timestamp: 2026-03-23T15:06:29.846Z
Learning: In `src/core/graph/subgraph/promotedWidgetView.ts` (Comfy-Org/ComfyUI_frontend), all production `PromotedWidgetView` instances are created exclusively through `SubgraphNode._setWidget()` (line ~1219) and `SubgraphNode._syncPromotions()` (line ~279). Both call sites always bind an `input._subgraphSlot`, so `getBoundSubgraphSlot()` returning `undefined` cannot occur during normal rename/label operations. The `displayName` fallback in the `label` getter and the silent no-op in the `label` setter are intentional defensive patterns for transient state and test-only scenarios only. Do not flag the slotless fallback as a missing rename path for "independently promoted widgets."

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: coderabbit-custom-pre-merge-checks-unique-id-file-non-traceable-F7F2B60C-1728-4C9A-8889-4F2235E186CA.txt:0-0
Timestamp: 2026-03-31T00:52:02.705Z
Learning: Applies to {src/lib/litegraph/**,src/ecs/**} : ADR compliance for entity/litegraph changes: Extension ecosystem compatibility — changes to extension-facing callbacks (onConnectionsChange, onRemoved, onAdded, onConfigure, onConnectInput/Output, onWidgetChanged), node.widgets access, node.serialize overrides, or graph._version++ require migration guidance as these affect 40+ custom node repos.

Learnt from: jtydhr88
Repo: Comfy-Org/ComfyUI_frontend PR: 10349
File: src/renderer/glsl/useGLSLPreview.ts:31-34
Timestamp: 2026-03-21T00:15:21.439Z
Learning: In Comfy-Org/ComfyUI_frontend, the autogrow system in `src/renderer/glsl/useGLSLPreview.ts` (GLSLShader nodes) creates sequential uniform inputs (u_float0, u_float1, …). When an earlier input is disconnected, later inputs contract to fill the gap, so the input array is always dense. Replaying linked uniform values by array position is therefore correct; do not flag this as a sparse-wiring / index-shift bug.

Learnt from: jaeone94
Repo: Comfy-Org/ComfyUI_frontend PR: 10648
File: src/components/rightSidePanel/subgraph/SubgraphEditor.vue:0-0
Timestamp: 2026-03-28T08:51:13.602Z
Learning: In `src/components/rightSidePanel/subgraph/SubgraphEditor.vue` (Comfy-Org/ComfyUI_frontend), `input._widget` on subgraph input slots is WeakRef-backed and non-reactive. A `linkedKeys` computed that reads `input._widget` in a loop cannot reliably trigger Vue reactivity updates. The current approach avoids this by depending on `promotionEntries` (reactive) as the computed dependency and delegating per-call linked checks to `isLinkedPromotion()`.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7459
File: src/lib/litegraph/src/canvas/LinkConnector.ts:875-881
Timestamp: 2026-02-23T19:49:55.224Z
Learning: ComfyUI_frontend TypeScript review preference: Prefer user-defined type guards (e.g., function isMovingInputLink(x): x is MovingInputLink) over inline type assertions when narrowing union types like RenderLinkUnion in src/lib/litegraph/**/*.ts. Apply especially in LinkConnector and related canvas classes to avoid casts and improve reuse.

Learnt from: dante01yoon
Repo: Comfy-Org/ComfyUI_frontend PR: 9742
File: src/components/input/SingleSelect.vue:70-86
Timestamp: 2026-03-11T09:16:39.665Z
Learning: In `src/components/input/SingleSelect.vue` (Comfy-Org/ComfyUI_frontend), the previous PrimeVue implementation hardcoded `option-label="name"` and `option-value="value"`. There was never an `optionLabel`/`optionValue` prop exposed to consumers. All callers pass `SelectOption[]` (i.e., `{ name: string, value: string }`). The new Reka UI implementation using `SelectItem`/`SelectItemText` with `opt.name`/`opt.value` preserves full API parity. Do not flag the hardcoded `{ name, value }` access as a regression or missing mapping props in code reviews for this component.

Learnt from: viva-jinyi
Repo: Comfy-Org/ComfyUI_frontend PR: 10499
File: src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue:146-150
Timestamp: 2026-03-25T03:30:27.889Z
Learning: In `src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue` (and similar canvas node widget dropdowns in ComfyUI_frontend), do not flag the absence of focus restoration when the dropdown closes as a blocker issue. The component lives inside a canvas node that is overwhelmingly mouse-driven, and the previous PrimeVue Popover implementation also did not restore focus. Focus-restoration improvements are valid enhancements but should be raised as separate issues/PRs, not blocking the current change.

Learnt from: jaeone94
Repo: Comfy-Org/ComfyUI_frontend PR: 10648
File: src/components/rightSidePanel/subgraph/SubgraphEditor.vue:0-0
Timestamp: 2026-03-28T08:51:13.602Z
Learning: In `src/components/rightSidePanel/subgraph/SubgraphEditor.vue` (Comfy-Org/ComfyUI_frontend PR `#10648`), linked-promotion detection uses direct `isLinkedPromotion(node, sourceNodeId, sourceWidgetName)` calls rather than a `linkedKeys` Set lookup. `isLinkedPromotion` iterates over `node.inputs` and checks `input._widget` per slot; since each slot holds at most one `_widget`, two promoted widgets sharing `sourceNodeId:sourceWidgetName` but differing by `disambiguatingSourceNodeId` occupy separate slots and are matched independently — there is no false-positive collapse risk. Do not flag `linkedKeys` key construction (when it exists as a Set) as a disambiguation collision issue when the actual linked-state check is done via direct `isLinkedPromotion()` calls.

Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 10547
File: browser_tests/tests/workflowPersistence.spec.ts:459-471
Timestamp: 2026-03-27T05:12:16.400Z
Learning: In `browser_tests/tests/workflowPersistence.spec.ts` (Comfy-Org/ComfyUI_frontend PR `#10547`), the G10 test for PR `#8715` (transient blob:/api-view URL serialization) intentionally validates only the static/default workflow export — not an executed/transient widget state. Putting an image widget into its executed state requires actual model inference (image output generation), which is not available in the current E2E test infrastructure. The test still covers the regression if the `widget.serialize` disable path breaks. Do not flag the absence of transient-state setup in this test; full integration coverage is tracked separately.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: :0-0
Timestamp: 2026-03-20T19:58:37.779Z
Learning: In Comfy-Org/ComfyUI_frontend PR `#10348`, the PR titled "fix: clean up knip config, upgrade to v6, remove unused exports" is a dependency upgrade (knip v5 → v6) + config cleanup, not a bug fix. The appropriate conventional commit type is `chore:` or `build:`, not `fix:`.

Learnt from: pythongosssss
Repo: Comfy-Org/ComfyUI_frontend PR: 10341
File: src/components/builder/AppBuilder.vue:77-85
Timestamp: 2026-03-20T18:53:45.378Z
Learning: In Comfy-Org/ComfyUI_frontend, `widget.callback` should only be triggered when the widget's **value** changes, not when only the widget's **label** is renamed. In `inlineRenameInput` (AppBuilder.vue), the label rename via `renameWidget()` does not change the widget value, so invoking `widget.callback?.(widget.value)` is incorrect and unnecessary.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7169
File: src/platform/remote/comfyui/jobs/jobTypes.ts:1-107
Timestamp: 2025-12-09T03:39:54.501Z
Learning: In the ComfyUI_frontend project, Zod is on v3.x. Do not suggest Zod v4 standalone validators (z.uuid, z.ulid, z.cuid2, z.nanoid) until an upgrade to Zod 4 is performed. When reviewing TypeScript files (e.g., src/platform/remote/comfyui/jobs/jobTypes.ts) validate against Zod 3 capabilities and avoid introducing v4-specific features; flag any proposal to upgrade or incorporate v4-only validators and propose staying with compatible 3.x patterns.

Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7358
File: src/components/dialog/content/signin/SignUpForm.vue:45-54
Timestamp: 2025-12-11T12:25:15.470Z
Learning: This repository uses CI automation to format code (pnpm format). Do not include manual formatting suggestions in code reviews for Comfy-Org/ComfyUI_frontend. If formatting issues are detected, rely on the CI formatter or re-run pnpm format. Focus reviews on correctness, readability, performance, accessibility, and maintainability rather than style formatting.

Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7416
File: src/stores/imagePreviewStore.ts:5-7
Timestamp: 2025-12-13T11:03:11.264Z
Learning: In the ComfyUI_frontend repository, lint rules require keeping 'import type' statements separate from non-type imports, even if importing from the same module. Do not suggest consolidating them into a single import statement. Ensure type imports remain on their own line (import type { ... } from 'module') and regular imports stay on separate lines.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7537
File: src/components/ui/button/Button.stories.ts:45-55
Timestamp: 2025-12-17T00:40:09.635Z
Learning: Prefer pure function declarations over function expressions (e.g., use function foo() { ... } instead of const foo = () => { ... }) for pure functions in the repository. Function declarations are more functional-leaning, offer better hoisting clarity, and can improve readability and tooling consistency. Apply this guideline across TypeScript files in Comfy-Org/ComfyUI_frontend, including story and UI component code, except where a function expression is semantically required (e.g., callbacks, higher-order functions with closures).

Learnt from: kaili-yang
Repo: Comfy-Org/ComfyUI_frontend PR: 7805
File: src/composables/useCoreCommands.ts:439-439
Timestamp: 2025-12-30T22:22:33.836Z
Learning: When accessing reactive properties from Pinia stores in TypeScript files, avoid using .value on direct property access (e.g., useStore().isOverlayExpanded). Pinia auto-wraps refs when accessed directly, returning the primitive value. The .value accessor is only needed when destructuring store properties or when using storeToRefs().

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7906
File: src/components/sidebar/tabs/AssetsSidebarTab.vue:545-552
Timestamp: 2026-01-12T17:39:27.738Z
Learning: In Vue/TypeScript files (src/**/*.{ts,tsx,vue}), prefer if/else statements over ternary operators when performing side effects or actions (e.g., mutating state, calling methods with side effects). Ternaries should be reserved for computing and returning values.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 8248
File: src/platform/assets/schemas/assetSchema.ts:109-118
Timestamp: 2026-01-22T23:44:59.888Z
Learning: Do not export declarations (e.g., schemas, constants, types) unless they are actually used elsewhere in the codebase. Keep the public API surface minimal by exporting only items with concrete usage. This reduces coupling and keeps imports explicit. In src/platform/assets/schemas/assetSchema.ts, ensure only necessary exports are exposed; remove unused exports or switch to non-exported/internal where appropriate.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 8307
File: src/stores/bootstrapStore.ts:61-78
Timestamp: 2026-01-26T18:39:22.294Z
Learning: Do not expose internal state or error refs from stores unless there is demonstrated active usage elsewhere in the codebase. Keep internal state private by default; only expose what is actively consumed. Applies to all TypeScript files under src/stores (e.g., bootstrapStore.ts and siblings). Ensure exported API only includes properties/methods that are actually used by consumers; avoid leaking implementation details.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 8722
File: src/composables/maskeditor/useBrushDrawing.ts:5-5
Timestamp: 2026-02-08T03:19:12.009Z
Learning: Treat unresolved import warnings caused by pnpm workspace catalog mappings (pnpm-workspace.yaml) and unplugin-typegpu in vite.config.mts as false positives. Do not flag these in PR reviews; they are expected in sandboxes without node_modules and are not indicative of actual missing dependencies in the TS codebase.

Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 8966
File: src/extensions/core/load3d.ts:427-430
Timestamp: 2026-02-19T02:06:23.468Z
Learning: In TypeScript, you can use typeof SomeClass in type annotation positions (e.g., param: typeof LGraphNode) even when SomeClass is imported with import type. This is a type query that only exists at compile time and is erased in runtime, so it is safe to combine with type-only imports. Apply this pattern to TS files broadly when you need a type that references the shape of a class or constructor function without importing the value at runtime.

Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 8966
File: src/extensions/core/uploadAudio.ts:91-94
Timestamp: 2026-02-19T02:06:38.395Z
Learning: In TypeScript files, you can use a type annotation like 'nodeType: typeof MyClass' even if MyClass is imported via 'import type'. Both the type-only import and 'typeof' operate at the type level and are erased at compile time. This pattern is commonly used for constructor types (e.g., 'nodeType: typeof LGraphNode'). Apply this pattern across TypeScript files in the repository (src/**/*.ts) as appropriate, ensuring the imported symbol is a type-only import when possible for clarity and to avoid runtime imports.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 8992
File: src/lib/litegraph/src/widgets/GradientSliderWidget.ts:18-18
Timestamp: 2026-02-20T21:08:19.814Z
Learning: When drawing with CanvasRenderingContext2D in TypeScript/JavaScript, wrap the drawing logic with ctx.save() at the start and ctx.restore() at the end to preserve and restore the canvas state. Do not manually destructure and restore individual properties (e.g., fillStyle, strokeStyle); rely on save/restore to manage state changes in a scoped manner. This should be applied to all TS files that perform canvas drawing.

Learnt from: dante01yoon
Repo: Comfy-Org/ComfyUI_frontend PR: 9075
File: src/scripts/api.featureFlags.test.ts:237-268
Timestamp: 2026-02-22T04:27:33.379Z
Learning: In Vite/Vitest, import.meta.env.DEV is true for any mode that is not 'production' (i.e., DEV is the opposite of PROD, and can be true in 'test', 'development', etc.). Do not assume DEV implies only 'development' mode. When reviewing code and tests, treat DEV as a non-production flag and verify environment-specific logic accordingly. Reference: https://vite.dev/guide/env-and-mode#modes

Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 9427
File: src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuFilter.vue:33-33
Timestamp: 2026-03-06T00:53:28.835Z
Learning: When reviewing code, note that the enforce-canonical-classes (better-tailwindcss) rule may auto-fix Tailwind v3 !class-name syntax by converting it to v4 class-name! syntax. Do not treat these auto-fixed class-name! instances as newly introduced issues; the perceived change is in syntax placement, not in usage or intent. This guidance applies across all .vue and .ts files in the repository.

Learnt from: sonnybox
Repo: Comfy-Org/ComfyUI_frontend PR: 9446
File: src/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue:45-45
Timestamp: 2026-03-06T01:55:00.013Z
Learning: Treat wrap-break-word as a valid Tailwind CSS utility for overflow-wrap: break-word in Tailwind v4+ projects. Do not flag this class as invalid in any Vue (.vue) or TypeScript (.ts/.tsx) files within the repository (e.g., Comfy-Org/ComfyUI_frontend) or other Tailwind v4+ projects. When reviewing, verify that the class is used to enable word breaking in long text content and reference the Tailwind docs: https://tailwindcss.com/docs/overflow-wrap.

If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!

Address CodeRabbit review:
- Update defaultInput deprecation message to not recommend forceInput
- Add test verifying deprecation warning emission
@lishunyang12
Copy link
Copy Markdown

hello, can you update the doc.

@Lidang-Jiang
Copy link
Copy Markdown
Author

Hi @lishunyang12, thanks for the feedback! I've updated the deprecation warning message in commit 1f4c20b to clarify that defaultInput is now ignored and guide node authors on when to use forceInput.

Could you let me know which specific doc you'd like updated? If you mean the console warning itself, that's already addressed. If you're referring to external documentation (e.g. docs.comfy.org), happy to open a follow-up.

@dosubot dosubot Bot added size:S This PR changes 10-29 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels May 4, 2026
@christian-byrne christian-byrne self-assigned this May 4, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 4, 2026

📦 Bundle: 5.26 MB gzip 🟢 -128 B

Details

Summary

  • Raw size: 24.2 MB baseline 24.2 MB — 🟢 -267 B
  • Gzip: 5.26 MB baseline 5.26 MB — 🟢 -128 B
  • Brotli: 4.07 MB baseline 4.07 MB — 🟢 -255 B
  • Bundles: 259 current • 259 baseline • 118 added / 118 removed

Category Glance
Other 🟢 -730 B (8.82 MB) · Data & Services 🔴 +463 B (3.05 MB) · Vendor & Third-Party ⚪ 0 B (9.94 MB) · Graph Workspace ⚪ 0 B (1.24 MB) · Panels & Settings ⚪ 0 B (489 kB) · Utilities & Hooks ⚪ 0 B (365 kB) · + 5 more

App Entry Points — 22.6 kB (baseline 22.6 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-B_cnUOBb.js (removed) 22.6 kB 🟢 -22.6 kB 🟢 -8 kB 🟢 -6.88 kB
assets/index-CquNdQEj.js (new) 22.6 kB 🔴 +22.6 kB 🔴 +8.01 kB 🔴 +6.85 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CwvBUNBN.js (removed) 1.24 MB 🟢 -1.24 MB 🟢 -265 kB 🟢 -199 kB
assets/GraphView-DcjbhLWS.js (new) 1.24 MB 🔴 +1.24 MB 🔴 +265 kB 🔴 +199 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-30rxCyhS.js (new) 19.6 kB 🔴 +19.6 kB 🔴 +5.14 kB 🔴 +4.58 kB
assets/CloudSurveyView-D8r-edUT.js (removed) 19.6 kB 🟢 -19.6 kB 🟢 -5.14 kB 🟢 -4.57 kB
assets/CloudLoginView-jlIHz_aa.js (removed) 12.4 kB 🟢 -12.4 kB 🟢 -3.51 kB 🟢 -3.1 kB
assets/CloudLoginView-XwctQvGA.js (new) 12.4 kB 🔴 +12.4 kB 🔴 +3.51 kB 🔴 +3.1 kB
assets/CloudSignupView-ByxroyOP.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -3 kB 🟢 -2.64 kB
assets/CloudSignupView-CF3-42Mi.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +3 kB 🔴 +2.64 kB
assets/UserCheckView-BcaowpAw.js (new) 9.07 kB 🔴 +9.07 kB 🔴 +2.33 kB 🔴 +2.04 kB
assets/UserCheckView-CYdzkePl.js (removed) 9.07 kB 🟢 -9.07 kB 🟢 -2.33 kB 🟢 -2.04 kB
assets/CloudLayoutView-ClEp-lj-.js (removed) 7.73 kB 🟢 -7.73 kB 🟢 -2.45 kB 🟢 -2.14 kB
assets/CloudLayoutView-Dx-AtIPB.js (new) 7.73 kB 🔴 +7.73 kB 🔴 +2.45 kB 🔴 +2.15 kB
assets/CloudForgotPasswordView-CCYGsIyI.js (new) 6.14 kB 🔴 +6.14 kB 🔴 +2.18 kB 🔴 +1.93 kB
assets/CloudForgotPasswordView-Uai6LZM6.js (removed) 6.14 kB 🟢 -6.14 kB 🟢 -2.19 kB 🟢 -1.95 kB
assets/CloudAuthTimeoutView-BAUXpEIO.js (new) 5.5 kB 🔴 +5.5 kB 🔴 +2.01 kB 🔴 +1.76 kB
assets/CloudAuthTimeoutView-DxRgqVGN.js (removed) 5.5 kB 🟢 -5.5 kB 🟢 -2.02 kB 🟢 -1.78 kB
assets/CloudSubscriptionRedirectView-D6DHHKsD.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -2 kB 🟢 -1.77 kB
assets/CloudSubscriptionRedirectView-eQFsmOkE.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +2 kB 🔴 +1.77 kB
assets/UserSelectView-B4vCSuHa.js (removed) 4.73 kB 🟢 -4.73 kB 🟢 -1.75 kB 🟢 -1.56 kB
assets/UserSelectView-BUXt1Qbd.js (new) 4.73 kB 🔴 +4.73 kB 🔴 +1.75 kB 🔴 +1.55 kB

Status: 9 added / 9 removed / 2 unchanged

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-C9yjXHro.js (new) 46.7 kB 🔴 +46.7 kB 🔴 +9.62 kB 🔴 +8.56 kB
assets/KeybindingPanel-DsbOcnrY.js (removed) 46.7 kB 🟢 -46.7 kB 🟢 -9.63 kB 🟢 -8.55 kB
assets/SecretsPanel-C97_apGN.js (new) 22.9 kB 🔴 +22.9 kB 🔴 +5.54 kB 🔴 +4.87 kB
assets/SecretsPanel-D36pu8tN.js (removed) 22.9 kB 🟢 -22.9 kB 🟢 -5.54 kB 🟢 -4.87 kB
assets/LegacyCreditsPanel-C63lyNC_.js (removed) 21.7 kB 🟢 -21.7 kB 🟢 -5.91 kB 🟢 -5.21 kB
assets/LegacyCreditsPanel-t9KT6Akx.js (new) 21.7 kB 🔴 +21.7 kB 🔴 +5.91 kB 🔴 +5.2 kB
assets/SubscriptionPanel-BWoBhZby.js (removed) 20 kB 🟢 -20 kB 🟢 -5.11 kB 🟢 -4.5 kB
assets/SubscriptionPanel-ByB0_ANA.js (new) 20 kB 🔴 +20 kB 🔴 +5.11 kB 🔴 +4.49 kB
assets/AboutPanel-BA61Ln9Z.js (new) 12 kB 🔴 +12 kB 🔴 +3.32 kB 🔴 +2.99 kB
assets/AboutPanel-Fz9pqdc0.js (removed) 12 kB 🟢 -12 kB 🟢 -3.32 kB 🟢 -2.99 kB
assets/ExtensionPanel-BDWpsNZf.js (removed) 9.97 kB 🟢 -9.97 kB 🟢 -2.91 kB 🟢 -2.59 kB
assets/ExtensionPanel-KKAig1Yd.js (new) 9.97 kB 🔴 +9.97 kB 🔴 +2.91 kB 🔴 +2.59 kB
assets/ServerConfigPanel-Cwe6yfeq.js (removed) 7.05 kB 🟢 -7.05 kB 🟢 -2.36 kB 🟢 -2.1 kB
assets/ServerConfigPanel-TZAZy6E9.js (new) 7.05 kB 🔴 +7.05 kB 🔴 +2.36 kB 🔴 +2.12 kB
assets/UserPanel-DjAjcEz2.js (new) 6.75 kB 🔴 +6.75 kB 🔴 +2.24 kB 🔴 +1.98 kB
assets/UserPanel-DsyoZ0m6.js (removed) 6.75 kB 🟢 -6.75 kB 🟢 -2.25 kB 🟢 -1.97 kB
assets/cloudRemoteConfig-CxLSbbI4.js (new) 2.05 kB 🔴 +2.05 kB 🔴 +986 B 🔴 +855 B
assets/cloudRemoteConfig-Dp35QnRf.js (removed) 2.05 kB 🟢 -2.05 kB 🟢 -988 B 🟢 -851 B
assets/refreshRemoteConfig-CC3QUTiS.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +649 B 🔴 +556 B
assets/refreshRemoteConfig-CqYJ_tgS.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -648 B 🟢 -549 B

Status: 10 added / 10 removed / 11 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-C7b1yEZE.js (new) 3.65 kB 🔴 +3.65 kB 🔴 +1.29 kB 🔴 +1.12 kB
assets/auth-Cv1WcNBO.js (removed) 3.65 kB 🟢 -3.65 kB 🟢 -1.29 kB 🟢 -1.11 kB
assets/SignUpForm-DkNDtVc4.js (new) 3.19 kB 🔴 +3.19 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/SignUpForm-DVY_Sdw-.js (removed) 3.19 kB 🟢 -3.19 kB 🟢 -1.29 kB 🟢 -1.15 kB
assets/UpdatePasswordContent-BQshfmUF.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -1.3 kB 🟢 -1.16 kB
assets/UpdatePasswordContent-CqcdY3zF.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +1.3 kB 🔴 +1.17 kB
assets/authStore-DR_t2_o9.js (new) 1.19 kB 🔴 +1.19 kB 🔴 +566 B 🔴 +510 B
assets/authStore-WoUv-ZJ2.js (removed) 1.19 kB 🟢 -1.19 kB 🟢 -566 B 🟢 -508 B
assets/auth-Cdk4DqCQ.js (new) 348 B 🔴 +348 B 🔴 +213 B 🔴 +188 B
assets/auth-CZpFdkg5.js (removed) 348 B 🟢 -348 B 🟢 -214 B 🟢 -186 B

Status: 5 added / 5 removed / 2 unchanged

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-B0pp9aa8.js (removed) 85.8 kB 🟢 -85.8 kB 🟢 -18.6 kB 🟢 -15.9 kB
assets/ComfyHubPublishDialog-CD7_lXi0.js (new) 85.8 kB 🔴 +85.8 kB 🔴 +18.6 kB 🔴 +15.9 kB
assets/useShareDialog-D_vUeSiR.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.78 kB 🟢 -5.12 kB
assets/useShareDialog-Dnso5om1.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.78 kB 🔴 +5.13 kB
assets/ComfyHubPublishDialog-DHI2nrmG.js (removed) 1.35 kB 🟢 -1.35 kB 🟢 -626 B 🟢 -549 B
assets/ComfyHubPublishDialog-Dq0A03wH.js (new) 1.35 kB 🔴 +1.35 kB 🔴 +626 B 🔴 +553 B
assets/useSubscriptionDialog-BghKcMVa.js (new) 1.17 kB 🔴 +1.17 kB 🔴 +556 B 🔴 +488 B
assets/useSubscriptionDialog-Dyk3-jGD.js (removed) 1.17 kB 🟢 -1.17 kB 🟢 -556 B 🟢 -488 B

Status: 4 added / 4 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-jHH5ExYn.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.79 kB 🟢 -3.38 kB
assets/ComfyQueueButton-WeODKINO.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.79 kB 🔴 +3.39 kB
assets/useTerminalTabs-BnjlPwik.js (removed) 11 kB 🟢 -11 kB 🟢 -3.73 kB 🟢 -3.28 kB
assets/useTerminalTabs-MpXe2Fuh.js (new) 11 kB 🔴 +11 kB 🔴 +3.73 kB 🔴 +3.28 kB
assets/SubscribeButton-C8q1pdda.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +925 B
assets/SubscribeButton-Dq9J1573.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.05 kB 🟢 -933 B
assets/cloudFeedbackTopbarButton-CSCWiLmA.js (removed) 1.83 kB 🟢 -1.83 kB 🟢 -941 B 🟢 -828 B
assets/cloudFeedbackTopbarButton-D-LpPTBU.js (new) 1.83 kB 🔴 +1.83 kB 🔴 +941 B 🔴 +830 B
assets/ComfyQueueButton-Cm6jxznb.js (removed) 1.27 kB 🟢 -1.27 kB 🟢 -593 B 🟢 -525 B
assets/ComfyQueueButton-Dzi1mM4H.js (new) 1.27 kB 🔴 +1.27 kB 🔴 +593 B 🔴 +531 B

Status: 5 added / 5 removed / 9 unchanged

Data & Services — 3.05 MB (baseline 3.05 MB) • 🔴 +463 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-BNxEVmtA.js (new) 1.99 MB 🔴 +1.99 MB 🔴 +458 kB 🔴 +347 kB
assets/dialogService-BJxIH8HC.js (removed) 1.99 MB 🟢 -1.99 MB 🟢 -458 kB 🟢 -347 kB
assets/api-CPZ-DmUE.js (removed) 887 kB 🟢 -887 kB 🟢 -212 kB 🟢 -167 kB
assets/api-rnEip0NY.js (new) 887 kB 🔴 +887 kB 🔴 +212 kB 🔴 +167 kB
assets/load3dService-DjivRBJS.js (removed) 115 kB 🟢 -115 kB 🟢 -25.1 kB 🟢 -21.3 kB
assets/load3dService-zSSwmIu4.js (new) 115 kB 🔴 +115 kB 🔴 +25.1 kB 🔴 +21.3 kB
assets/workflowShareService-C71nJ9Xi.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.89 kB 🔴 +4.33 kB
assets/workflowShareService-DryWTkJ0.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.89 kB 🟢 -4.33 kB
assets/keybindingService-BrxktKAg.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.67 kB 🔴 +3.21 kB
assets/keybindingService-DA31FAA4.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.67 kB 🟢 -3.21 kB
assets/releaseStore-BTwEsXvI.js (removed) 8.12 kB 🟢 -8.12 kB 🟢 -2.28 kB 🟢 -2 kB
assets/releaseStore-DhVKw1MM.js (new) 8.12 kB 🔴 +8.12 kB 🔴 +2.28 kB 🔴 +2 kB
assets/userStore-C0hiIzut.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +867 B 🔴 +760 B
assets/userStore-DPYAC3CN.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -871 B 🟢 -763 B
assets/audioService-bWsn76x5.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +876 B 🔴 +762 B
assets/audioService-D7rkFw3S.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -876 B 🟢 -767 B
assets/releaseStore-C51ps8yO.js (new) 1.19 kB 🔴 +1.19 kB 🔴 +560 B 🔴 +498 B
assets/releaseStore-DvnagRsE.js (removed) 1.19 kB 🟢 -1.19 kB 🟢 -559 B 🟢 -496 B
assets/workflowDraftStore-BQYM71oA.js (new) 1.17 kB 🔴 +1.17 kB 🔴 +555 B 🔴 +491 B
assets/workflowDraftStore-Ds9RP0Ub.js (removed) 1.17 kB 🟢 -1.17 kB 🟢 -554 B 🟢 -495 B
assets/dialogService-C9LzZ3Ge.js (new) 1.16 kB 🔴 +1.16 kB 🔴 +546 B 🔴 +492 B
assets/dialogService-DoD7PRcw.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -547 B 🟢 -491 B
assets/settingStore-B0Zeg1kg.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +550 B 🔴 +489 B
assets/settingStore-CJv8KLJk.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -549 B 🟢 -489 B
assets/assetsStore-nynOVdAE.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +551 B 🔴 +489 B
assets/assetsStore-yTkQvJYr.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -550 B 🟢 -491 B

Status: 13 added / 13 removed / 4 unchanged

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-C5CFkpw2.js (new) 233 kB 🔴 +233 kB 🔴 +51.8 kB 🔴 +42.2 kB
assets/useConflictDetection-Cb1MzuDu.js (removed) 233 kB 🟢 -233 kB 🟢 -51.8 kB 🟢 -42.3 kB
assets/useLoad3d-CNAl66kn.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.09 kB 🔴 +4.5 kB
assets/useLoad3d-DixGTEjJ.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.09 kB 🟢 -4.49 kB
assets/useLoad3dViewer-CE-rpMPX.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +4.91 kB 🔴 +4.29 kB
assets/useLoad3dViewer-D_F37X3r.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -4.91 kB 🟢 -4.3 kB
assets/useFeatureFlags-BII83RER.js (new) 5.95 kB 🔴 +5.95 kB 🔴 +1.79 kB 🔴 +1.52 kB
assets/useFeatureFlags-BYJpjia0.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -1.79 kB 🟢 -1.53 kB
assets/useCopyToClipboard-CxloohLV.js (removed) 5.29 kB 🟢 -5.29 kB 🟢 -1.86 kB 🟢 -1.57 kB
assets/useCopyToClipboard-DZ4oKL9H.js (new) 5.29 kB 🔴 +5.29 kB 🔴 +1.86 kB 🔴 +1.57 kB
assets/useWorkspaceUI-CroGEgo2.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -982 B 🟢 -809 B
assets/useWorkspaceUI-izxyoFmf.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +982 B 🔴 +808 B
assets/subscriptionCheckoutUtil-Bel9XJis.js (removed) 3.31 kB 🟢 -3.31 kB 🟢 -1.36 kB 🟢 -1.18 kB
assets/subscriptionCheckoutUtil-DdS7adWh.js (new) 3.31 kB 🔴 +3.31 kB 🔴 +1.36 kB 🔴 +1.18 kB
assets/assetPreviewUtil-C02aSwMI.js (new) 2.27 kB 🔴 +2.27 kB 🔴 +959 B 🔴 +837 B
assets/assetPreviewUtil-DoKa_Ipp.js (removed) 2.27 kB 🟢 -2.27 kB 🟢 -958 B 🟢 -834 B
assets/useUpstreamValue-CD8OZZac.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -806 B 🟢 -714 B
assets/useUpstreamValue-DDGQ7ipc.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +804 B 🔴 +715 B
assets/useLoad3d-66mtWPbD.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +619 B 🔴 +567 B
assets/useLoad3d-BPv4PjiB.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -617 B 🟢 -561 B
assets/useLoad3dViewer-B3p-qegl.js (removed) 1.27 kB 🟢 -1.27 kB 🟢 -586 B 🟢 -527 B
assets/useLoad3dViewer-OT5k4idR.js (new) 1.27 kB 🔴 +1.27 kB 🔴 +585 B 🔴 +525 B
assets/useCurrentUser-DamSc-G1.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +551 B 🔴 +488 B
assets/useCurrentUser-Dmfe6WvX.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -550 B 🟢 -490 B
assets/useWorkspaceSwitch-Cy76QxgM.js (new) 747 B 🔴 +747 B 🔴 +384 B 🔴 +332 B
assets/useWorkspaceSwitch-DJEW3JFg.js (removed) 747 B 🟢 -747 B 🟢 -385 B 🟢 -333 B

Status: 13 added / 13 removed / 18 unchanged

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

External libraries and shared vendor chunks

Status: 16 unchanged

Other — 8.82 MB (baseline 8.82 MB) • 🟢 -730 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-BBUBT3wk.js (removed) 76.7 kB 🟢 -76.7 kB 🟢 -19.9 kB 🟢 -16.9 kB
assets/core-vY73GCYS.js (new) 76.7 kB 🔴 +76.7 kB 🔴 +19.9 kB 🔴 +16.9 kB
assets/groupNode-C3jiXk5w.js (new) 74.9 kB 🔴 +74.9 kB 🔴 +18.7 kB 🔴 +16.5 kB
assets/groupNode-TOP5gTMQ.js (removed) 74.9 kB 🟢 -74.9 kB 🟢 -18.7 kB 🟢 -16.5 kB
assets/WidgetSelect-B7OcXL9c.js (removed) 67.4 kB 🟢 -67.4 kB 🟢 -14.6 kB 🟢 -12.7 kB
assets/WidgetSelect-CuOpkTVN.js (new) 67.2 kB 🔴 +67.2 kB 🔴 +14.6 kB 🔴 +12.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-BNalfniI.js (new) 48.8 kB 🔴 +48.8 kB 🔴 +9.52 kB 🔴 +8.21 kB
assets/SubscriptionRequiredDialogContentWorkspace-Lp44g3Cn.js (removed) 48.8 kB 🟢 -48.8 kB 🟢 -9.52 kB 🟢 -8.24 kB
assets/Load3DControls-D5sVPJAp.js (new) 46.1 kB 🔴 +46.1 kB 🔴 +7.51 kB 🔴 +6.56 kB
assets/Load3DControls-T1kgRtz2.js (removed) 46.1 kB 🟢 -46.1 kB 🟢 -7.51 kB 🟢 -6.55 kB
assets/WidgetPainter-B0TVOR0k.js (new) 34 kB 🔴 +34 kB 🔴 +8.3 kB 🔴 +7.34 kB
assets/WidgetPainter-DppuyjAq.js (removed) 34 kB 🟢 -34 kB 🟢 -8.3 kB 🟢 -7.37 kB
assets/WorkspacePanelContent-CSTz0zB3.js (removed) 32.8 kB 🟢 -32.8 kB 🟢 -7.01 kB 🟢 -6.2 kB
assets/WorkspacePanelContent-DKpugwsr.js (new) 32.8 kB 🔴 +32.8 kB 🔴 +7.01 kB 🔴 +6.19 kB
assets/Load3dViewerContent-90bcsn-f.js (new) 28 kB 🔴 +28 kB 🔴 +5.85 kB 🔴 +5.08 kB
assets/Load3dViewerContent-DcVFhH-9.js (removed) 28 kB 🟢 -28 kB 🟢 -5.85 kB 🟢 -5.07 kB
assets/SubscriptionRequiredDialogContent-CUwNWjgc.js (removed) 27.5 kB 🟢 -27.5 kB 🟢 -6.98 kB 🟢 -6.16 kB
assets/SubscriptionRequiredDialogContent-DIZV5Zyv.js (new) 27.5 kB 🔴 +27.5 kB 🔴 +6.98 kB 🔴 +6.19 kB
assets/WidgetImageCrop-CRnF2_Gn.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +6.2 kB 🔴 +5.47 kB
assets/WidgetImageCrop-Cv65l7RI.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -6.2 kB 🟢 -5.46 kB
assets/SubscriptionPanelContentWorkspace-CBVSsjY1.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.18 kB 🟢 -4.57 kB
assets/SubscriptionPanelContentWorkspace-Cw1eJcdi.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.17 kB 🔴 +4.55 kB
assets/SignInContent-Bj_tw-Rf.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -5.44 kB 🟢 -4.75 kB
assets/SignInContent-DhRU-clV.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +5.43 kB 🔴 +4.76 kB
assets/CurrentUserPopoverWorkspace-CohaMOw0.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -4.91 kB 🟢 -4.4 kB
assets/CurrentUserPopoverWorkspace-Dqcqr6g1.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +4.91 kB 🔴 +4.39 kB
assets/WidgetInputNumber-DAHNNp62.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.29 kB
assets/WidgetInputNumber-hg8tYm88.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.29 kB
assets/Load3D-Cl2nmcs-.js (new) 18.5 kB 🔴 +18.5 kB 🔴 +4.39 kB 🔴 +3.84 kB
assets/Load3D-DsUkyFE-.js (removed) 18.5 kB 🟢 -18.5 kB 🟢 -4.39 kB 🟢 -3.83 kB
assets/WidgetRecordAudio-D0O8kI4o.js (removed) 17.5 kB 🟢 -17.5 kB 🟢 -5.04 kB 🟢 -4.51 kB
assets/WidgetRecordAudio-Dzd0_rVP.js (new) 17.5 kB 🔴 +17.5 kB 🔴 +5.03 kB 🔴 +4.5 kB
assets/WidgetRange-CzNUbLv6.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.61 kB 🔴 +4.12 kB
assets/WidgetRange-DnceJoo5.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.61 kB 🟢 -4.11 kB
assets/load3d-CewXXir1.js (new) 15.8 kB 🔴 +15.8 kB 🔴 +4.58 kB 🔴 +3.98 kB
assets/load3d-CT-G1RLj.js (removed) 15.8 kB 🟢 -15.8 kB 🟢 -4.59 kB 🟢 -3.98 kB
assets/WaveAudioPlayer-Bs4x3fMB.js (removed) 13.4 kB 🟢 -13.4 kB 🟢 -3.69 kB 🟢 -3.22 kB
assets/WaveAudioPlayer-BUQydoHB.js (new) 13.4 kB 🔴 +13.4 kB 🔴 +3.69 kB 🔴 +3.23 kB
assets/WidgetCurve-C4YtmR0O.js (removed) 12.2 kB 🟢 -12.2 kB 🟢 -3.93 kB 🟢 -3.56 kB
assets/WidgetCurve-HmyEl4vj.js (new) 12.2 kB 🔴 +12.2 kB 🔴 +3.93 kB 🔴 +3.56 kB
assets/TeamWorkspacesDialogContent-0EO7jQ10.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.42 kB 🔴 +3.05 kB
assets/TeamWorkspacesDialogContent-CldeEG6r.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.42 kB 🟢 -3.04 kB
assets/nodeTemplates-NOrOPhe0.js (new) 9.84 kB 🔴 +9.84 kB 🔴 +3.48 kB 🔴 +3.07 kB
assets/nodeTemplates-Ru0JgpvX.js (removed) 9.84 kB 🟢 -9.84 kB 🟢 -3.48 kB 🟢 -3.06 kB
assets/NightlySurveyController-D363yqdD.js (removed) 8.97 kB 🟢 -8.97 kB 🟢 -3.15 kB 🟢 -2.79 kB
assets/NightlySurveyController-zRt0UrTj.js (new) 8.97 kB 🔴 +8.97 kB 🔴 +3.15 kB 🔴 +2.78 kB
assets/Load3DConfiguration-DA1yOJ_g.js (removed) 8.61 kB 🟢 -8.61 kB 🟢 -2.54 kB 🟢 -2.23 kB
assets/Load3DConfiguration-CCDI-54t.js (new) 8.03 kB 🔴 +8.03 kB 🔴 +2.36 kB 🔴 +2.06 kB
assets/InviteMemberDialogContent-BtRwmFeQ.js (removed) 7.94 kB 🟢 -7.94 kB 🟢 -2.53 kB 🟢 -2.21 kB
assets/InviteMemberDialogContent-ID3eMN69.js (new) 7.94 kB 🔴 +7.94 kB 🔴 +2.53 kB 🔴 +2.23 kB
assets/onboardingCloudRoutes-B6QsUBdb.js (removed) 6.73 kB 🟢 -6.73 kB 🟢 -2.12 kB 🟢 -1.82 kB
assets/onboardingCloudRoutes-bZxdc9sj.js (new) 6.73 kB 🔴 +6.73 kB 🔴 +2.12 kB 🔴 +1.81 kB
assets/CreateWorkspaceDialogContent-c4QuYzQA.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +2.23 kB 🔴 +1.96 kB
assets/CreateWorkspaceDialogContent-PkENm0AC.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -2.24 kB 🟢 -1.96 kB
assets/WidgetWithControl-BT4dPmyc.js (new) 6.09 kB 🔴 +6.09 kB 🔴 +2.44 kB 🔴 +2.17 kB
assets/WidgetWithControl-D6bReHFS.js (removed) 6.09 kB 🟢 -6.09 kB 🟢 -2.44 kB 🟢 -2.17 kB
assets/FreeTierDialogContent-BTV3OhPV.js (new) 6.01 kB 🔴 +6.01 kB 🔴 +2.13 kB 🔴 +1.89 kB
assets/FreeTierDialogContent-DkSO1Mu2.js (removed) 6.01 kB 🟢 -6.01 kB 🟢 -2.13 kB 🟢 -1.9 kB
assets/EditWorkspaceDialogContent-CPRYyA8L.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -2.2 kB 🟢 -1.93 kB
assets/EditWorkspaceDialogContent-Df63e_wb.js (new) 5.95 kB 🔴 +5.95 kB 🔴 +2.2 kB 🔴 +1.93 kB
assets/WidgetTextarea-C1tEmVPS.js (new) 5.76 kB 🔴 +5.76 kB 🔴 +2.27 kB 🔴 +2.01 kB
assets/WidgetTextarea-mF8X__ll.js (removed) 5.76 kB 🟢 -5.76 kB 🟢 -2.27 kB 🟢 -2.01 kB
assets/Preview3d-CFbOSTPQ.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -1.92 kB 🟢 -1.68 kB
assets/Preview3d-DKG0qAhD.js (new) 5.73 kB 🔴 +5.73 kB 🔴 +1.92 kB 🔴 +1.69 kB
assets/ValueControlPopover-B1YwfznW.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -2.02 kB 🟢 -1.81 kB
assets/ValueControlPopover-CmkhTp-2.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +2.01 kB 🔴 +1.81 kB
assets/CancelSubscriptionDialogContent-DagKPhLK.js (removed) 5.49 kB 🟢 -5.49 kB 🟢 -2.06 kB 🟢 -1.8 kB
assets/CancelSubscriptionDialogContent-iGkB5EwV.js (new) 5.49 kB 🔴 +5.49 kB 🔴 +2.06 kB 🔴 +1.8 kB
assets/DeleteWorkspaceDialogContent-D-fRESSF.js (new) 4.85 kB 🔴 +4.85 kB 🔴 +1.87 kB 🔴 +1.64 kB
assets/DeleteWorkspaceDialogContent-DkSzXTET.js (removed) 4.85 kB 🟢 -4.85 kB 🟢 -1.88 kB 🟢 -1.63 kB
assets/LeaveWorkspaceDialogContent-gHa2oO5p.js (new) 4.68 kB 🔴 +4.68 kB 🔴 +1.82 kB 🔴 +1.59 kB
assets/LeaveWorkspaceDialogContent-UNVkZWnD.js (removed) 4.68 kB 🟢 -4.68 kB 🟢 -1.82 kB 🟢 -1.58 kB
assets/RemoveMemberDialogContent-BcRO4hho.js (new) 4.66 kB 🔴 +4.66 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/RemoveMemberDialogContent-BEiWfHk9.js (removed) 4.66 kB 🟢 -4.66 kB 🟢 -1.78 kB 🟢 -1.55 kB
assets/RevokeInviteDialogContent-C3-NYhPP.js (removed) 4.57 kB 🟢 -4.57 kB 🟢 -1.79 kB 🟢 -1.58 kB
assets/RevokeInviteDialogContent-CCml4WLg.js (new) 4.57 kB 🔴 +4.57 kB 🔴 +1.78 kB 🔴 +1.57 kB
assets/InviteMemberUpsellDialogContent-B9RIg-cW.js (new) 4.47 kB 🔴 +4.47 kB 🔴 +1.65 kB 🔴 +1.46 kB
assets/InviteMemberUpsellDialogContent-DvAU6Tg1.js (removed) 4.47 kB 🟢 -4.47 kB 🟢 -1.65 kB 🟢 -1.45 kB
assets/tierBenefits-CfctCR4j.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.58 kB 🟢 -1.36 kB
assets/tierBenefits-CyDkFxfb.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.57 kB 🔴 +1.36 kB
assets/cloudSessionCookie-FQU2jagD.js (removed) 4.31 kB 🟢 -4.31 kB 🟢 -1.57 kB 🟢 -1.38 kB
assets/cloudSessionCookie-I5wIXcT2.js (new) 4.31 kB 🔴 +4.31 kB 🔴 +1.57 kB 🔴 +1.38 kB
assets/Media3DTop-Bko9V5_v.js (removed) 4.04 kB 🟢 -4.04 kB 🟢 -1.71 kB 🟢 -1.52 kB
assets/Media3DTop-DkMCEize.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.71 kB 🔴 +1.51 kB
assets/saveMesh-DGU5unJK.js (removed) 4.03 kB 🟢 -4.03 kB 🟢 -1.76 kB 🟢 -1.55 kB
assets/saveMesh-DgXVR0QJ.js (new) 4.03 kB 🔴 +4.03 kB 🔴 +1.76 kB 🔴 +1.55 kB
assets/GlobalToast-B2L_olvI.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.11 kB
assets/GlobalToast-Ct3CvJwI.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/CloudRunButtonWrapper-Bk-FUxMe.js (new) 2.23 kB 🔴 +2.23 kB 🔴 +1.01 kB 🔴 +910 B
assets/CloudRunButtonWrapper-CWcRHiTh.js (removed) 2.23 kB 🟢 -2.23 kB 🟢 -1.02 kB 🟢 -910 B
assets/SubscribeToRun-CmuxlcQB.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +980 B 🔴 +879 B
assets/SubscribeToRun-CZ08xP1C.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -983 B 🟢 -880 B
assets/MediaAudioTop-BJQhQfB-.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +1 kB 🔴 +859 B
assets/MediaAudioTop-vSG6ng07.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -1 kB 🟢 -864 B
assets/cloudBadges-CaK-ms0p.js (removed) 1.96 kB 🟢 -1.96 kB 🟢 -975 B 🟢 -851 B
assets/cloudBadges-CH-H4jGj.js (new) 1.96 kB 🔴 +1.96 kB 🔴 +977 B 🔴 +848 B
assets/cloudSubscription-Bf-wE1Oo.js (new) 1.88 kB 🔴 +1.88 kB 🔴 +897 B 🔴 +778 B
assets/cloudSubscription-ghL9qC7Z.js (removed) 1.88 kB 🟢 -1.88 kB 🟢 -895 B 🟢 -779 B
assets/graphHasMissingNodes-BC39FcHX.js (removed) 1.83 kB 🟢 -1.83 kB 🟢 -862 B 🟢 -778 B
assets/graphHasMissingNodes-DyAdZEof.js (new) 1.83 kB 🔴 +1.83 kB 🔴 +860 B 🔴 +758 B
assets/Load3D-B9pMg8V8.js (new) 1.58 kB 🔴 +1.58 kB 🔴 +709 B 🔴 +631 B
assets/Load3D-DklMXIRC.js (removed) 1.58 kB 🟢 -1.58 kB 🟢 -707 B 🟢 -626 B
assets/previousFullPath-Cc0nSFm1.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -695 B 🟢 -596 B
assets/previousFullPath-CSKTPhLY.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +696 B 🔴 +616 B
assets/nightlyBadges-CMnyaNxK.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +742 B 🔴 +677 B
assets/nightlyBadges-Dc_PEdn1.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -744 B 🟢 -654 B
assets/Load3dViewerContent-BsC5wpyC.js (new) 1.46 kB 🔴 +1.46 kB 🔴 +662 B 🔴 +588 B
assets/Load3dViewerContent-COjSh8EF.js (removed) 1.46 kB 🟢 -1.46 kB 🟢 -661 B 🟢 -590 B
assets/SubscriptionPanelContentWorkspace-C8NDD45C.js (new) 1.35 kB 🔴 +1.35 kB 🔴 +614 B 🔴 +540 B
assets/SubscriptionPanelContentWorkspace-g3amgFsD.js (removed) 1.35 kB 🟢 -1.35 kB 🟢 -613 B 🟢 -533 B
assets/WidgetLegacy-ByBiF_u4.js (new) 1.18 kB 🔴 +1.18 kB 🔴 +562 B 🔴 +501 B
assets/WidgetLegacy-DSA9glJ3.js (removed) 1.18 kB 🟢 -1.18 kB 🟢 -562 B 🟢 -499 B
assets/changeTracker--SBicO84.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -549 B 🟢 -485 B
assets/changeTracker-vl5t4Z4h.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +551 B 🔴 +488 B

Status: 57 added / 57 removed / 79 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.8 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 50.1 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 46.6 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.7 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 60.7 MB heap
large-graph-pan: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 60.8 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.4 MB heap
minimap-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 63.1 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 55.1 MB heap
subgraph-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.9 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 59.8 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.8 MB heap
vue-large-graph-idle: · 58.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 163.7 MB heap
vue-large-graph-pan: · 58.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 29ms TBT · 157.8 MB heap
workflow-execution: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 52.7 MB heap

⚠️ 1 regression detected

Metric Baseline PR (median) Δ Sig
canvas-zoom-sweep: avg frame time 17ms 17ms +0% ⚠️ z=2.2
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 -1%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 9ms 6ms -29% z=-4.9
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 10 8 -20% z=-5.6
canvas-idle: task duration 384ms 382ms -1% z=-0.4
canvas-idle: script duration 20ms 16ms -18% z=-4.1
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 68.1 MB 67.8 MB -0%
canvas-idle: DOM nodes 20 14 -30% z=-6.7
canvas-idle: event listeners 6 4 -33% z=-1.6
canvas-mouse-sweep: avg frame time 17ms 17ms +0% z=-0.4
canvas-mouse-sweep: p95 frame time 17ms 17ms +0%
canvas-mouse-sweep: layout duration 4ms 4ms -3% z=-0.5
canvas-mouse-sweep: style recalc duration 39ms 37ms -3% z=-1.7
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 75 78 +4% z=-0.3
canvas-mouse-sweep: task duration 817ms 934ms +14% z=1.2
canvas-mouse-sweep: script duration 120ms 113ms -5% z=-3.4
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 52.9 MB 50.1 MB -5%
canvas-mouse-sweep: DOM nodes -264 -260 -2% z=-124.6
canvas-mouse-sweep: event listeners -131 -131 +0% z=-33.5
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 -15% z=-1.7
canvas-zoom-sweep: style recalc duration 18ms 15ms -18% z=-2.6
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 32 32 +0% z=1.6
canvas-zoom-sweep: task duration 315ms 280ms -11% z=-2.0
canvas-zoom-sweep: script duration 25ms 18ms -30% z=-3.2
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 47.2 MB 46.6 MB -1%
canvas-zoom-sweep: DOM nodes 80 76 -5% z=-4.1
canvas-zoom-sweep: event listeners 21 19 -10% z=-0.9
dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
dom-widget-clipping: p95 frame time 17ms 17ms +1%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 7ms 7ms +2% z=-3.4
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 10 10 +0% z=-6.2
dom-widget-clipping: task duration 332ms 315ms -5% z=-3.0
dom-widget-clipping: script duration 55ms 52ms -4% z=-4.7
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 54.5 MB 54.7 MB +0%
dom-widget-clipping: DOM nodes 16 16 +0% z=-4.3
dom-widget-clipping: event listeners 2 0 -100% variance too high
large-graph-idle: avg frame time 17ms 17ms +0% z=-0.2
large-graph-idle: p95 frame time 17ms 17ms -1%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 8ms 8ms -5% z=-4.2
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 571ms 524ms -8% z=-0.3
large-graph-idle: script duration 94ms 83ms -12% z=-1.8
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 58.9 MB 60.7 MB +3%
large-graph-idle: DOM nodes -260 -262 +1% z=-317.2
large-graph-idle: event listeners -129 -129 +0% z=-25.4
large-graph-pan: avg frame time 17ms 17ms +0% z=0.3
large-graph-pan: p95 frame time 17ms 17ms +1%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 18ms 17ms -6% z=-0.1
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 69 68 -1% z=-2.4
large-graph-pan: task duration 1144ms 1035ms -10% z=-1.1
large-graph-pan: script duration 400ms 366ms -9% z=-2.1
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 59.4 MB 60.8 MB +2%
large-graph-pan: DOM nodes -266 -264 -1% 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 -0%
large-graph-zoom: layout duration 8ms 8ms +2%
large-graph-zoom: style recalc duration 19ms 18ms -5%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 65 65 +0%
large-graph-zoom: task duration 1314ms 1262ms -4%
large-graph-zoom: script duration 464ms 467ms +1%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 72.4 MB 69.4 MB -4%
large-graph-zoom: DOM nodes -266 -268 +1%
large-graph-zoom: event listeners -125 -125 +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 9ms 6ms -29% z=-3.8
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 10 8 -20% z=-2.3
minimap-idle: task duration 593ms 511ms -14% z=-0.4
minimap-idle: script duration 96ms 78ms -18% z=-2.0
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 62.4 MB 63.1 MB +1%
minimap-idle: DOM nodes -262 -265 +1% z=-207.7
minimap-idle: event listeners -129 -129 +0% z=-202.3
subgraph-dom-widget-clipping: avg frame time 17ms 17ms +0% z=-0.9
subgraph-dom-widget-clipping: p95 frame time 17ms 17ms -1%
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 10ms 10ms +1% z=-2.4
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 46 47 +2% z=-1.6
subgraph-dom-widget-clipping: task duration 343ms 356ms +4% z=-1.2
subgraph-dom-widget-clipping: script duration 114ms 128ms +12% z=-0.1
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 55.1 MB 55.1 MB +0%
subgraph-dom-widget-clipping: DOM nodes 18 20 +11% 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 8ms 7ms -17% z=-4.6
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 9 9 +0% z=-2.9
subgraph-idle: task duration 382ms 323ms -15% z=-1.5
subgraph-idle: script duration 18ms 13ms -29% z=-2.9
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 67.9 MB 67.9 MB +0%
subgraph-idle: DOM nodes 18 18 +0% z=-2.5
subgraph-idle: event listeners 6 4 -33% 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 4ms -7% z=-1.3
subgraph-mouse-sweep: style recalc duration 42ms 35ms -16% z=-2.2
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 77 77 +0% z=-1.6
subgraph-mouse-sweep: task duration 708ms 643ms -9% z=-1.8
subgraph-mouse-sweep: script duration 86ms 82ms -5% z=-2.9
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 59.8 MB 59.8 MB +0%
subgraph-mouse-sweep: DOM nodes 61 60 -2% z=-3.1
subgraph-mouse-sweep: event listeners 6 4 -33% variance too high
viewport-pan-sweep: avg frame time 17ms 17ms +0%
viewport-pan-sweep: p95 frame time 17ms 17ms -1%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 54ms 53ms -1%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 250 249 -0%
viewport-pan-sweep: task duration 3805ms 3419ms -10%
viewport-pan-sweep: script duration 1217ms 1129ms -7%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 65.2 MB 68.8 MB +6%
viewport-pan-sweep: DOM nodes -263 -263 +0%
viewport-pan-sweep: event listeners -113 -113 +0%
vue-large-graph-idle: avg frame time 17ms 17ms +3%
vue-large-graph-idle: p95 frame time 17ms 17ms +1%
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 10817ms 12259ms +13%
vue-large-graph-idle: script duration 575ms 555ms -4%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 156.5 MB 163.7 MB +5%
vue-large-graph-idle: DOM nodes -8331 -8331 +0%
vue-large-graph-idle: event listeners -16466 -16464 -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 18ms 18ms +2%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 66 68 +3%
vue-large-graph-pan: task duration 12732ms 14724ms +16%
vue-large-graph-pan: script duration 816ms 853ms +5%
vue-large-graph-pan: TBT 0ms 29ms
vue-large-graph-pan: heap used 157.7 MB 157.8 MB +0%
vue-large-graph-pan: DOM nodes -8331 -8331 +0%
vue-large-graph-pan: event listeners -16462 -16460 -0%
workflow-execution: avg frame time 17ms 17ms +0% z=0.6
workflow-execution: p95 frame time 17ms 17ms +0%
workflow-execution: layout duration 1ms 2ms +14% z=0.1
workflow-execution: style recalc duration 25ms 21ms -16% z=-1.4
workflow-execution: layout count 5 5 +0% z=0.1
workflow-execution: style recalc count 20 15 -25% z=-1.4
workflow-execution: task duration 126ms 114ms -9% z=-0.8
workflow-execution: script duration 26ms 23ms -9% z=-2.0
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 52.8 MB 52.7 MB -0%
workflow-execution: DOM nodes 159 153 -4% z=-1.1
workflow-execution: event listeners 69 69 +0% z=3.9
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-05-04T23:07:57.878Z",
  "gitSha": "03471f0e6cf9ad36e6bfadc5c63857d5998d4a5d",
  "branch": "fix/default-input-widget-reload",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2071.302000000003,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 5.4209999999999985,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 381.5729999999999,
      "heapDeltaBytes": 22804808,
      "heapUsedBytes": 71111276,
      "domNodes": 14,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 16.205,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-idle",
      "durationMs": 2028.8419999999974,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.231999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 349.732,
      "heapDeltaBytes": 23846340,
      "heapUsedBytes": 72749940,
      "domNodes": 22,
      "jsHeapTotalBytes": 15204352,
      "scriptDurationMs": 21.505000000000003,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 2046.8949999999495,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 6.485999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 386.40000000000003,
      "heapDeltaBytes": -5331908,
      "heapUsedBytes": 43126208,
      "domNodes": -265,
      "jsHeapTotalBytes": 14807040,
      "scriptDurationMs": 14.923000000000002,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1816.0109999999747,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 37.382,
      "layouts": 12,
      "layoutDurationMs": 3.596,
      "taskDurationMs": 721.9259999999999,
      "heapDeltaBytes": -1509496,
      "heapUsedBytes": 67007588,
      "domNodes": 61,
      "jsHeapTotalBytes": 19398656,
      "scriptDurationMs": 113.376,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2015.925999999979,
      "styleRecalcs": 85,
      "styleRecalcDurationMs": 40.166,
      "layouts": 12,
      "layoutDurationMs": 3.511,
      "taskDurationMs": 973.6999999999999,
      "heapDeltaBytes": 4739256,
      "heapUsedBytes": 52561524,
      "domNodes": -260,
      "jsHeapTotalBytes": 15331328,
      "scriptDurationMs": 117.148,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2018.024999999966,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 37.183,
      "layouts": 12,
      "layoutDurationMs": 3.273,
      "taskDurationMs": 933.97,
      "heapDeltaBytes": -2130240,
      "heapUsedBytes": 46757664,
      "domNodes": -263,
      "jsHeapTotalBytes": 16642048,
      "scriptDurationMs": 109.685,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1713.5069999999928,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 15.154999999999998,
      "layouts": 6,
      "layoutDurationMs": 0.568,
      "taskDurationMs": 280.326,
      "heapDeltaBytes": 215820,
      "heapUsedBytes": 48478272,
      "domNodes": 77,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 17.610999999999997,
      "eventListeners": 21,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1718.60300000003,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 15.043000000000001,
      "layouts": 6,
      "layoutDurationMs": 0.6329999999999999,
      "taskDurationMs": 278.68399999999997,
      "heapDeltaBytes": 208804,
      "heapUsedBytes": 48838412,
      "domNodes": 75,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 17.217999999999996,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1711.4860000000363,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 15.292,
      "layouts": 6,
      "layoutDurationMs": 0.561,
      "taskDurationMs": 292.718,
      "heapDeltaBytes": 5103276,
      "heapUsedBytes": 70854248,
      "domNodes": 76,
      "jsHeapTotalBytes": 20541440,
      "scriptDurationMs": 17.598999999999997,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 583.4479999999758,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 7.189000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 339.555,
      "heapDeltaBytes": 8786048,
      "heapUsedBytes": 57387356,
      "domNodes": 18,
      "jsHeapTotalBytes": 15990784,
      "scriptDurationMs": 55.602,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999727
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 569.1739999999754,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.412999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 314.538,
      "heapDeltaBytes": 9136372,
      "heapUsedBytes": 57442396,
      "domNodes": 16,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 52.468,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999727
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 519.7660000000042,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 6.193999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 309.23400000000004,
      "heapDeltaBytes": 8753816,
      "heapUsedBytes": 57151820,
      "domNodes": 16,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 50.417,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2033.1189999999992,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.828000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 524.2450000000001,
      "heapDeltaBytes": 6541700,
      "heapUsedBytes": 63658276,
      "domNodes": -262,
      "jsHeapTotalBytes": 815104,
      "scriptDurationMs": 83.76299999999999,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2024.3679999999813,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.861,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 525.3939999999999,
      "heapDeltaBytes": 4653076,
      "heapUsedBytes": 61662904,
      "domNodes": -259,
      "jsHeapTotalBytes": 28672,
      "scriptDurationMs": 83.099,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2037.6850000000104,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 6.584,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 523.766,
      "heapDeltaBytes": 8852004,
      "heapUsedBytes": 67330908,
      "domNodes": -262,
      "jsHeapTotalBytes": -233472,
      "scriptDurationMs": 78.906,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2098.774999999989,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 16.881000000000004,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1042.277,
      "heapDeltaBytes": 4353112,
      "heapUsedBytes": 63716468,
      "domNodes": -266,
      "jsHeapTotalBytes": 1544192,
      "scriptDurationMs": 383.759,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2114.6850000000086,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 17.208000000000006,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1034.5760000000002,
      "heapDeltaBytes": -640492,
      "heapUsedBytes": 59153616,
      "domNodes": -262,
      "jsHeapTotalBytes": 6524928,
      "scriptDurationMs": 365.672,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2143.493000000035,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 17.18,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1022.356,
      "heapDeltaBytes": 6807056,
      "heapUsedBytes": 66207172,
      "domNodes": -264,
      "jsHeapTotalBytes": 495616,
      "scriptDurationMs": 356.839,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3134.5339999999737,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 17.868000000000002,
      "layouts": 60,
      "layoutDurationMs": 7.708000000000001,
      "taskDurationMs": 1253.314,
      "heapDeltaBytes": 12002516,
      "heapUsedBytes": 72721288,
      "domNodes": -269,
      "jsHeapTotalBytes": 290816,
      "scriptDurationMs": 463.87500000000006,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3114.215999999999,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 18.448000000000004,
      "layouts": 60,
      "layoutDurationMs": 7.757999999999999,
      "taskDurationMs": 1262.336,
      "heapDeltaBytes": 18170636,
      "heapUsedBytes": 79342720,
      "domNodes": -268,
      "jsHeapTotalBytes": 1077248,
      "scriptDurationMs": 467.13200000000006,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3134.488000000033,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 17.942999999999998,
      "layouts": 60,
      "layoutDurationMs": 7.732,
      "taskDurationMs": 1268.727,
      "heapDeltaBytes": 8965784,
      "heapUsedBytes": 69737296,
      "domNodes": -268,
      "jsHeapTotalBytes": 5533696,
      "scriptDurationMs": 467.543,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "minimap-idle",
      "durationMs": 2009.4290000000115,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 6.533999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 510.7759999999999,
      "heapDeltaBytes": 3759716,
      "heapUsedBytes": 64181088,
      "domNodes": -264,
      "jsHeapTotalBytes": 552960,
      "scriptDurationMs": 78.24199999999999,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "minimap-idle",
      "durationMs": 2014.2610000000332,
      "styleRecalcs": 6,
      "styleRecalcDurationMs": 5.034000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 504.572,
      "heapDeltaBytes": 11965560,
      "heapUsedBytes": 71982028,
      "domNodes": -269,
      "jsHeapTotalBytes": 290816,
      "scriptDurationMs": 75.967,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2007.9999999999245,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 6.414999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 514.998,
      "heapDeltaBytes": 5280368,
      "heapUsedBytes": 66213664,
      "domNodes": -265,
      "jsHeapTotalBytes": 1077248,
      "scriptDurationMs": 78.97099999999999,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 545.2700000000164,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 12.366999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 361.253,
      "heapDeltaBytes": 9605068,
      "heapUsedBytes": 57546900,
      "domNodes": 22,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 130.381,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.663333333333338,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 560.5879999999956,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 10.475999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 356.326,
      "heapDeltaBytes": 9876472,
      "heapUsedBytes": 57822648,
      "domNodes": 20,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 127.891,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999727
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 579.84399999998,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 9.581000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 345.59299999999996,
      "heapDeltaBytes": 9036672,
      "heapUsedBytes": 57890380,
      "domNodes": 18,
      "jsHeapTotalBytes": 15728640,
      "scriptDurationMs": 123.002,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2021.729999999991,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.118000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 323.303,
      "heapDeltaBytes": 22283324,
      "heapUsedBytes": 70664196,
      "domNodes": 18,
      "jsHeapTotalBytes": 15204352,
      "scriptDurationMs": 12.714,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2003.9750000000254,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 6.710000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 323.44700000000006,
      "heapDeltaBytes": 22561640,
      "heapUsedBytes": 71250540,
      "domNodes": 18,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 12.596,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2007.1430000000419,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 6.785000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 323.741,
      "heapDeltaBytes": 22559800,
      "heapUsedBytes": 71261036,
      "domNodes": 19,
      "jsHeapTotalBytes": 14680064,
      "scriptDurationMs": 12.584999999999999,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1690.9109999999714,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 32.742999999999995,
      "layouts": 16,
      "layoutDurationMs": 3.796,
      "taskDurationMs": 648.518,
      "heapDeltaBytes": -3498604,
      "heapUsedBytes": 44842008,
      "domNodes": -261,
      "jsHeapTotalBytes": 15331328,
      "scriptDurationMs": 80.839,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1735.5019999999968,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 39.626000000000005,
      "layouts": 16,
      "layoutDurationMs": 4.277,
      "taskDurationMs": 643.4009999999998,
      "heapDeltaBytes": 14119504,
      "heapUsedBytes": 62678880,
      "domNodes": 60,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 81.656,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1722.0629999999346,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 35.034000000000006,
      "layouts": 16,
      "layoutDurationMs": 4.458,
      "taskDurationMs": 611.5710000000001,
      "heapDeltaBytes": 14301484,
      "heapUsedBytes": 62945220,
      "domNodes": 62,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 82.586,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8125.9939999999915,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 53.786,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3387.966,
      "heapDeltaBytes": 12520472,
      "heapUsedBytes": 71029404,
      "domNodes": -261,
      "jsHeapTotalBytes": 7573504,
      "scriptDurationMs": 1125.88,
      "eventListeners": -113,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8124.104000000045,
      "styleRecalcs": 248,
      "styleRecalcDurationMs": 51.99999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3457.2960000000003,
      "heapDeltaBytes": 13706624,
      "heapUsedBytes": 72114172,
      "domNodes": -264,
      "jsHeapTotalBytes": 2592768,
      "scriptDurationMs": 1128.797,
      "eventListeners": -113,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8162.454000000025,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 53.456,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3419.3379999999997,
      "heapDeltaBytes": 15205164,
      "heapUsedBytes": 74153976,
      "domNodes": -263,
      "jsHeapTotalBytes": 6815744,
      "scriptDurationMs": 1142.4299999999998,
      "eventListeners": -113,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12574.239999999974,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12508.316,
      "heapDeltaBytes": -43128312,
      "heapUsedBytes": 171693128,
      "domNodes": -8362,
      "jsHeapTotalBytes": 26275840,
      "scriptDurationMs": 638.6619999999999,
      "eventListeners": -16466,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12224.909000000025,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12214.551999999998,
      "heapDeltaBytes": -27283288,
      "heapUsedBytes": 171626096,
      "domNodes": -8331,
      "jsHeapTotalBytes": 23654400,
      "scriptDurationMs": 540.822,
      "eventListeners": -16464,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12268.63000000003,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12259.164000000002,
      "heapDeltaBytes": -34864008,
      "heapUsedBytes": 172177008,
      "domNodes": -8331,
      "jsHeapTotalBytes": 25227264,
      "scriptDurationMs": 554.767,
      "eventListeners": -16462,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14778.911999999991,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 17.737000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14748.04,
      "heapDeltaBytes": -34137916,
      "heapUsedBytes": 165351436,
      "domNodes": -8331,
      "jsHeapTotalBytes": -4132864,
      "scriptDurationMs": 895.048,
      "eventListeners": -16460,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.780000000000047,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14528.998000000001,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 19.78800000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14510.441,
      "heapDeltaBytes": -47738256,
      "heapUsedBytes": 165414868,
      "domNodes": -8331,
      "jsHeapTotalBytes": -4218880,
      "scriptDurationMs": 853.0609999999999,
      "eventListeners": -16460,
      "totalBlockingTimeMs": 40,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14743.533999999954,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 17.946999999999992,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14723.867,
      "heapDeltaBytes": -23417184,
      "heapUsedBytes": 174109680,
      "domNodes": -8329,
      "jsHeapTotalBytes": -1597440,
      "scriptDurationMs": 845.726,
      "eventListeners": -16488,
      "totalBlockingTimeMs": 29,
      "frameDurationMs": 17.223333333333237,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 463.9380000000415,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 23.294,
      "layouts": 5,
      "layoutDurationMs": 1.7419999999999998,
      "taskDurationMs": 128.102,
      "heapDeltaBytes": 5405636,
      "heapUsedBytes": 55821412,
      "domNodes": 170,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 27.632000000000005,
      "eventListeners": 69,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999727
    },
    {
      "name": "workflow-execution",
      "durationMs": 132.3370000000068,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 19.897,
      "layouts": 4,
      "layoutDurationMs": 1.566,
      "taskDurationMs": 96.104,
      "heapDeltaBytes": 3466272,
      "heapUsedBytes": 53236720,
      "domNodes": 146,
      "jsHeapTotalBytes": 524288,
      "scriptDurationMs": 22.715,
      "eventListeners": 37,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.663333333333338,
      "p95FrameDurationMs": 16.799999999999727
    },
    {
      "name": "workflow-execution",
      "durationMs": 451.2929999999642,
      "styleRecalcs": 15,
      "styleRecalcDurationMs": 21.125999999999998,
      "layouts": 5,
      "layoutDurationMs": 1.36,
      "taskDurationMs": 114.145,
      "heapDeltaBytes": 5034676,
      "heapUsedBytes": 55217840,
      "domNodes": 153,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 23.241,
      "eventListeners": 69,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    }
  ]
}

@codecov
Copy link
Copy Markdown

codecov Bot commented May 4, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@             Coverage Diff             @@
##             main   #10706       +/-   ##
===========================================
- Coverage   71.80%   56.10%   -15.71%     
===========================================
  Files        1494     1385      -109     
  Lines       84384    70883    -13501     
  Branches    23265    19759     -3506     
===========================================
- Hits        60593    39766    -20827     
- Misses      22923    30587     +7664     
+ Partials      868      530      -338     
Flag Coverage Δ
e2e ?
unit 56.10% <ø> (+<0.01%) ⬆️

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

Files with missing lines Coverage Δ
src/stores/nodeDefStore.ts 80.00% <ø> (-15.56%) ⬇️

... and 991 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.

@christian-byrne christian-byrne added the New Browser Test Expectations New browser test screenshot should be set by github action label May 14, 2026
@christian-byrne
Copy link
Copy Markdown
Contributor

Superseded by #12279 (same changes, but from main repo to avoid fork workflow permission issues). Thank you @Lidang-Jiang for the contribution!

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

Labels

New Browser Test Expectations New browser test screenshot should be set by github action size:S This PR changes 10-29 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

defaultInput changes widget to input on reload

3 participants