Skip to content

feat: add eslint-plugin-better-tailwindcss for Tailwind v4 linting#9245

Merged
christian-byrne merged 3 commits intomainfrom
ci/tailwind-v4-linter-re-enable
Mar 4, 2026
Merged

feat: add eslint-plugin-better-tailwindcss for Tailwind v4 linting#9245
christian-byrne merged 3 commits intomainfrom
ci/tailwind-v4-linter-re-enable

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Feb 26, 2026

Summary

Add eslint-plugin-better-tailwindcss to the ESLint toolchain for Tailwind CSS v4 class linting.

Changes

  • What: Integrate eslint-plugin-better-tailwindcss (v4.3.1) with the recommended config, pointed at the design-system CSS entry point for v4 theme resolution. Five rules are enabled initially: enforce-canonical-classes, no-deprecated-classes, no-conflicting-classes, no-duplicate-classes, no-unnecessary-whitespace. Three rules are disabled pending follow-up: no-unknown-classes (needs PrimeIcon/custom class whitelisting), enforce-consistent-line-wrapping (oxfmt conflict risk), enforce-consistent-class-order (large batch change).
  • Dependencies: eslint-plugin-better-tailwindcss ^4.3.1
  • Fix conflicting outline outline-1 classes in FormDropdownMenuActions.vue (caught by the new no-conflicting-classes rule).

Review Focus

  • Is the rule severity/enablement strategy appropriate for incremental adoption?
  • The 700 warnings (mostly enforce-canonical-classes and no-deprecated-classes) are all auto-fixable via eslint --fix — should we batch-fix them in this PR or a follow-up?

Fixes COM-15518

┆Issue is synchronized with this Notion page by Unito

@christian-byrne christian-byrne requested a review from a team as a code owner February 26, 2026 09:07
@dosubot dosubot bot added the size:S This PR changes 10-29 lines, ignoring generated files. label Feb 26, 2026
@notion-workspace
Copy link

@github-actions
Copy link

github-actions bot commented Feb 26, 2026

🎭 Playwright: ❌ 545 passed, 1 failed · 6 flaky

❌ Failed Tests

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 26, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d4a57515-c7d5-4dec-ab8e-e05a525c37ef

📥 Commits

Reviewing files that changed from the base of the PR and between b6c6d8e and 2795178.

📒 Files selected for processing (2)
  • package.json
  • src/components/LiteGraphCanvasSplitterOverlay.vue
✅ Files skipped from review due to trivial changes (1)
  • package.json
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/LiteGraphCanvasSplitterOverlay.vue

📝 Walkthrough

Walkthrough

Adds the better-tailwindcss ESLint plugin and recommended config (Tailwind v4) to the repo and workspace catalog, disables five specific better-tailwindcss rules via an inline config pointing at packages/design-system/src/css/style.css, and makes minor class/whitespace adjustments in several Vue files.

Changes

Cohort / File(s) Summary
ESLint & Tailwind config
eslint.config.ts, package.json, pnpm-workspace.yaml
Added eslint-plugin-better-tailwindcss to devDependencies and workspace catalog; included betterTailwindcss.configs.recommended and an inline better-tailwindcss config with entryPoint: packages/design-system/src/css/style.css; disabled five specific better-tailwindcss rules.
Dropdown outline styling
src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue
Replaced outline outline-offset-[-1px] with outline -outline-offset-1 in action button and dropdown panel containers (visual CSS utility change only).
Minor class/whitespace cleanups
src/components/LiteGraphCanvasSplitterOverlay.vue, src/components/topbar/CurrentUserButton.vue, src/components/widget/nav/NavTitle.vue, src/renderer/extensions/vueNodes/composables/useNodeTooltips.ts, src/renderer/extensions/vueNodes/widgets/composables/useNumberWidgetButtonPt.ts
Removed trailing spaces and adjusted class string literals in several Vue files and a composable; no logic or API changes.

Estimated Code Review Effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐇 I munched some classes, neat and small,

Brought linting whispers to the hall,
Outlines snug, stray spaces gone,
A tidy hop at break of dawn,
Tailwind hums — the code's a ball 🥕

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and concisely describes the main change—adding eslint-plugin-better-tailwindcss for Tailwind v4 linting—which aligns with the core objective of the PR.
Description check ✅ Passed The description follows the template structure and provides comprehensive details: summary, changes with specific rules/dependencies, and review focus with outstanding decisions about auto-fixable warnings.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch ci/tailwind-v4-linter-re-enable

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

@github-actions
Copy link

github-actions bot commented Feb 26, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/04/2026, 10:25:54 PM UTC

Links

@github-actions
Copy link

github-actions bot commented Feb 26, 2026

📦 Bundle: 4.49 MB gzip 🔴 +189 B

Details

Summary

  • Raw size: 21.1 MB baseline 21.1 MB — 🟢 -29 B
  • Gzip: 4.49 MB baseline 4.49 MB — 🔴 +189 B
  • Brotli: 3.46 MB baseline 3.46 MB — 🔴 +75 B
  • Bundles: 227 current • 227 baseline • 107 added / 107 removed

Category Glance
Other 🟢 -25 B (7.91 MB) · Data & Services 🟢 -2 B (2.73 MB) · Graph Workspace 🟢 -2 B (912 kB) · Vendor & Third-Party ⚪ 0 B (8.86 MB) · Panels & Settings ⚪ 0 B (436 kB) · Views & Navigation ⚪ 0 B (72.1 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-B_xzPhAc.js (new) 17.7 kB 🔴 +17.7 kB 🔴 +6.25 kB 🔴 +5.43 kB
assets/index-dGTlnQol.js (removed) 17.7 kB 🟢 -17.7 kB 🟢 -6.26 kB 🟢 -5.42 kB

Status: 1 added / 1 removed

Graph Workspace — 912 kB (baseline 912 kB) • 🟢 -2 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-1Zo-e7q4.js (removed) 912 kB 🟢 -912 kB 🟢 -194 kB 🟢 -147 kB
assets/GraphView-BZNlKvsS.js (new) 912 kB 🔴 +912 kB 🔴 +194 kB 🔴 +147 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-DSFFb5E0.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.31 kB 🔴 +2.82 kB
assets/CloudSurveyView-Loy-Li_d.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.82 kB
assets/CloudLoginView-AkDc2ah6.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.19 kB 🟢 -2.81 kB
assets/CloudLoginView-CwmiXDJA.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.19 kB 🔴 +2.82 kB
assets/CloudSignupView-BVD-6nZ6.js (new) 9.37 kB 🔴 +9.37 kB 🔴 +2.7 kB 🔴 +2.35 kB
assets/CloudSignupView-CNL3pdC-.js (removed) 9.37 kB 🟢 -9.37 kB 🟢 -2.69 kB 🟢 -2.36 kB
assets/UserCheckView-4L9PrZcj.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.23 kB 🟢 -1.93 kB
assets/UserCheckView-BY7-7uxv.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.22 kB 🔴 +1.93 kB
assets/CloudLayoutView-ByqjZF0Q.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.1 kB 🔴 +1.82 kB
assets/CloudLayoutView-C0okXIyZ.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.1 kB 🟢 -1.83 kB
assets/CloudForgotPasswordView-CuGMBoQn.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.93 kB 🟢 -1.7 kB
assets/CloudForgotPasswordView-M2FZfjVd.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.93 kB 🔴 +1.7 kB
assets/CloudAuthTimeoutView-C7tz6N7Z.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/CloudAuthTimeoutView-CvRdAY1w.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CloudSubscriptionRedirectView-B8QxfqHT.js (new) 4.75 kB 🔴 +4.75 kB 🔴 +1.78 kB 🔴 +1.58 kB
assets/CloudSubscriptionRedirectView-Jj_k1EKq.js (removed) 4.75 kB 🟢 -4.75 kB 🟢 -1.79 kB 🟢 -1.58 kB
assets/UserSelectView-BGlz5W_f.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/UserSelectView-CDEF6z41.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.46 kB
assets/CloudSorryContactSupportView-oBJgqwAb.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-C7HwWHX2.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-CO6FleU9.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.3 kB 🔴 +4.66 kB
assets/SecretsPanel-DE7Kcuwr.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.65 kB
assets/LegacyCreditsPanel-C83aEtC_.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.56 kB 🔴 +4.89 kB
assets/LegacyCreditsPanel-Dz5-w2H7.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.56 kB 🟢 -4.88 kB
assets/SubscriptionPanel-CHBEAARf.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.72 kB 🟢 -4.15 kB
assets/SubscriptionPanel-DkktyQ3f.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.72 kB 🔴 +4.15 kB
assets/KeybindingPanel-BSWPbERm.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.51 kB 🔴 +3.11 kB
assets/KeybindingPanel-Di1MUJYl.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.51 kB 🟢 -3.11 kB
assets/AboutPanel-BEAAua0v.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.45 kB
assets/AboutPanel-CuHhe5fT.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.73 kB 🔴 +2.46 kB
assets/ExtensionPanel-CRdVu6LY.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.65 kB 🔴 +2.35 kB
assets/ExtensionPanel-DM9k55eK.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.65 kB 🟢 -2.35 kB
assets/ServerConfigPanel-BzVxkAhc.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.12 kB 🟢 -1.91 kB
assets/ServerConfigPanel-DQyNZbL1.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.12 kB 🔴 +1.92 kB
assets/UserPanel-BJG-qWut.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +1.99 kB 🔴 +1.74 kB
assets/UserPanel-Ch0qyKYO.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -1.99 kB 🟢 -1.75 kB
assets/cloudRemoteConfig-CG9hFvo6.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -699 B 🟢 -611 B
assets/cloudRemoteConfig-qIKUxlKU.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +701 B 🔴 +610 B
assets/refreshRemoteConfig-BmjfmDKg.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +518 B 🔴 +446 B
assets/refreshRemoteConfig-DpuIfkfr.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -516 B 🟢 -468 B
assets/config-CGn5JFmU.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B5oF6TeI.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BVYOg4dh.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CBEvSL1z.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CGx1t8IZ.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CNcb_4nC.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cx1dZM6H.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dw-QS6Nb.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DXxgnCSn.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-GRFn4guL.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-mgwKIVQ2.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-s83B801I.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BAd5rou1.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +990 B
assets/auth-WnXC7j-W.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -990 B
assets/SignUpForm-BkMwmT4l.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/SignUpForm-DYAe99Cv.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/UpdatePasswordContent-DfmUghqT.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +941 B
assets/UpdatePasswordContent-DNbu7USP.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -947 B
assets/firebaseAuthStore-gsIPO2tj.js (removed) 788 B 🟢 -788 B 🟢 -382 B 🟢 -344 B
assets/firebaseAuthStore-OSoAiKJm.js (new) 788 B 🔴 +788 B 🔴 +381 B 🔴 +343 B
assets/auth-D4C1JSp6.js (new) 357 B 🔴 +357 B 🔴 +223 B 🔴 +213 B
assets/auth-DSsp18is.js (removed) 357 B 🟢 -357 B 🟢 -224 B 🟢 -190 B
assets/PasswordFields-D2N9Ml9Z.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-D9lCv5xq.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Editors & Dialogs — 736 B (baseline 736 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-CI6Tlioo.js (new) 736 B 🔴 +736 B 🔴 +377 B 🔴 +324 B
assets/useSubscriptionDialog-DVZX5B0Y.js (removed) 736 B 🟢 -736 B 🟢 -373 B 🟢 -323 B

Status: 1 added / 1 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-B2B4uP3R.js (new) 9.84 kB 🔴 +9.84 kB 🔴 +3.39 kB 🔴 +2.99 kB
assets/useTerminalTabs-B4mFByU1.js (removed) 9.84 kB 🟢 -9.84 kB 🟢 -3.39 kB 🟢 -3 kB
assets/ComfyQueueButton-BWlE_u-l.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.49 kB 🔴 +2.23 kB
assets/ComfyQueueButton-QVT6OFsa.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.49 kB 🟢 -2.22 kB
assets/SubscribeButton-BJHuSMwV.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.01 kB 🔴 +881 B
assets/SubscribeButton-CLbsB-ko.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1.01 kB 🟢 -881 B
assets/cloudFeedbackTopbarButton-DmPsZTCt.js (new) 1.59 kB 🔴 +1.59 kB 🔴 +851 B 🔴 +752 B
assets/cloudFeedbackTopbarButton-wirWAuvS.js (removed) 1.59 kB 🟢 -1.59 kB 🟢 -848 B 🟢 -754 B
assets/ComfyQueueButton-BirDIRaF.js (removed) 793 B 🟢 -793 B 🟢 -389 B 🟢 -349 B
assets/ComfyQueueButton-DiJPopvB.js (new) 793 B 🔴 +793 B 🔴 +390 B 🔴 +346 B
assets/Button-Dw6K3LMw.js 3.08 kB 3.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-y8d0lfIa.js 1.16 kB 1.16 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-BJeGeP_m.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-_Rw93HFG.js 5.95 kB 5.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-BpSw2jyq.js 7.44 kB 7.44 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-4quz6WWI.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DQ_BOv-g.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.73 MB (baseline 2.73 MB) • 🟢 -2 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-DCuSFno-.js (removed) 1.91 MB 🟢 -1.91 MB 🟢 -429 kB 🟢 -321 kB
assets/dialogService-Dmm0-9Nw.js (new) 1.91 MB 🔴 +1.91 MB 🔴 +429 kB 🔴 +321 kB
assets/api-DgoBagOU.js (removed) 689 kB 🟢 -689 kB 🟢 -155 kB 🟢 -124 kB
assets/api-DVB80hcs.js (new) 689 kB 🔴 +689 kB 🔴 +155 kB 🔴 +124 kB
assets/load3dService-DVhKhIek.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/load3dService-DxI0cBzG.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/extensionStore-BKpFb9pP.js (removed) 13 kB 🟢 -13 kB 🟢 -4.42 kB 🟢 -3.9 kB
assets/extensionStore-Di44gZM5.js (new) 13 kB 🔴 +13 kB 🔴 +4.42 kB 🔴 +3.91 kB
assets/releaseStore-CDaALh_U.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/releaseStore-YoqqFwKr.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/keybindingService-CEOEI7VO.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -1.7 kB 🟢 -1.48 kB
assets/keybindingService-DC_Lx-jA.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +1.71 kB 🔴 +1.47 kB
assets/bootstrapStore-AbyrVRPs.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -873 B 🟢 -792 B
assets/bootstrapStore-B9-14UEJ.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +876 B 🔴 +794 B
assets/userStore-BNXsqY9P.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +721 B 🔴 +678 B
assets/userStore-DtMfd3Bf.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -717 B 🟢 -670 B
assets/audioService-C-TQskhY.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +850 B 🔴 +722 B
assets/audioService-DpL7yxiM.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -849 B 🟢 -726 B
assets/releaseStore-D2YbBiHt.js (removed) 760 B 🟢 -760 B 🟢 -377 B 🟢 -341 B
assets/releaseStore-DETXNao9.js (new) 760 B 🔴 +760 B 🔴 +379 B 🔴 +339 B
assets/settingStore-C1KeF19e.js (new) 744 B 🔴 +744 B 🔴 +385 B 🔴 +340 B
assets/settingStore-E5siUYtY.js (removed) 744 B 🟢 -744 B 🟢 -382 B 🟢 -341 B
assets/workflowDraftStore-DDsJ_otr.js (removed) 736 B 🟢 -736 B 🟢 -370 B 🟢 -335 B
assets/workflowDraftStore-RqqqO88g.js (new) 736 B 🔴 +736 B 🔴 +376 B 🔴 +327 B
assets/dialogService-BEID2e91.js (removed) 725 B 🟢 -725 B 🟢 -362 B 🟢 -322 B
assets/dialogService-BiGg350e.js (new) 725 B 🔴 +725 B 🔴 +365 B 🔴 +323 B
assets/serverConfigStore-CjFLR4Tj.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-DvsH1sAp.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-UTyQCnJm.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.2 kB
assets/useLoad3dViewer-fnSb8vJM.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.8 kB
assets/useLoad3dViewer-SlOVEF_Z.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useFeatureFlags-DoumKB1J.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.23 kB 🟢 -1.06 kB
assets/useFeatureFlags-nt7jKdyp.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.23 kB 🔴 +1.05 kB
assets/useWorkspaceUI-gVWEZw1w.js (removed) 3 kB 🟢 -3 kB 🟢 -821 B 🟢 -703 B
assets/useWorkspaceUI-WvCHpArM.js (new) 3 kB 🔴 +3 kB 🔴 +821 B 🔴 +703 B
assets/subscriptionCheckoutUtil-B0ElxrLT.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +936 B
assets/subscriptionCheckoutUtil-D9gBJGPF.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -957 B
assets/useErrorHandling-CI6s3w32.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -630 B 🟢 -535 B
assets/useErrorHandling-D8nPY-To.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +630 B 🔴 +534 B
assets/useWorkspaceSwitch-CMUqaEY_.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +543 B 🔴 +486 B
assets/useWorkspaceSwitch-U5vLQ0F4.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -542 B 🟢 -487 B
assets/useLoad3d-B4yzMMPf.js (new) 859 B 🔴 +859 B 🔴 +422 B 🔴 +374 B
assets/useLoad3d-DEHuVQpQ.js (removed) 859 B 🟢 -859 B 🟢 -420 B 🟢 -374 B
assets/audioUtils-HtFv3uN-.js (new) 858 B 🔴 +858 B 🔴 +498 B 🔴 +404 B
assets/audioUtils-V0Q10ICB.js (removed) 858 B 🟢 -858 B 🟢 -498 B 🟢 -416 B
assets/useLoad3dViewer-kqCC_u0v.js (new) 838 B 🔴 +838 B 🔴 +407 B 🔴 +363 B
assets/useLoad3dViewer-N6ut2-Cd.js (removed) 838 B 🟢 -838 B 🟢 -405 B 🟢 -365 B
assets/useCurrentUser-D11v51_u.js (removed) 722 B 🟢 -722 B 🟢 -366 B 🟢 -325 B
assets/useCurrentUser-NzEGxu4P.js (new) 722 B 🔴 +722 B 🔴 +368 B 🔴 +326 B
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-BdnFBncR.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Clzmwvt4.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-BwTAJqBg.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BputJAFn.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-Cbx5Gxws.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-BxkFiWzp.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DccD0mxo.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-5I_5Qfg0.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-BleJN4K0.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-C-tDe-KL.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-LBLOE6BD.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-z9_RK3Ae.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-CmHHRvL9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-cYXYo6hi.js 121 kB 121 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-MKpa1ZAW.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.91 MB (baseline 7.91 MB) • 🟢 -25 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-CxYnlmOT.js (new) 73.6 kB 🔴 +73.6 kB 🔴 +19 kB 🔴 +16.2 kB
assets/core-DgtVfG5I.js (removed) 73.6 kB 🟢 -73.6 kB 🟢 -19 kB 🟢 -16.2 kB
assets/groupNode-AIuFAI2I.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.6 kB
assets/groupNode-D2ttUXG0.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.6 kB
assets/WidgetSelect-i1wAsB_T.js (removed) 58.3 kB 🟢 -58.3 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/WidgetSelect-BbAe2LmP.js (new) 58.3 kB 🔴 +58.3 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-CHSHCasJ.js (new) 46.3 kB 🔴 +46.3 kB 🔴 +8.65 kB 🔴 +7.49 kB
assets/SubscriptionRequiredDialogContentWorkspace-DfGLDm9T.js (removed) 46.3 kB 🟢 -46.3 kB 🟢 -8.65 kB 🟢 -7.48 kB
assets/WidgetPainter-BCmXzac1.js (new) 32.5 kB 🔴 +32.5 kB 🔴 +7.95 kB 🔴 +7.04 kB
assets/WidgetPainter-DIZFFh8f.js (removed) 32.5 kB 🟢 -32.5 kB 🟢 -7.95 kB 🟢 -7.04 kB
assets/Load3DControls-BPJvdh3K.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/Load3DControls-C8MOZ9N8.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/WorkspacePanelContent-B_iPIe6M.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.14 kB 🟢 -5.41 kB
assets/WorkspacePanelContent-D6HMvEqi.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.14 kB 🔴 +5.39 kB
assets/SubscriptionRequiredDialogContent-CmlGURO0.js (removed) 25.7 kB 🟢 -25.7 kB 🟢 -6.57 kB 🟢 -5.77 kB
assets/SubscriptionRequiredDialogContent-qrDCWBxd.js (new) 25.7 kB 🔴 +25.7 kB 🔴 +6.57 kB 🔴 +5.77 kB
assets/Load3dViewerContent-Ca1aK0iD.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.49 kB
assets/Load3dViewerContent-Cra6dMk0.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.49 kB
assets/WidgetImageCrop-DlLKmzSv.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.51 kB 🟢 -4.84 kB
assets/WidgetImageCrop-DvhHFj48.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.51 kB 🔴 +4.84 kB
assets/SubscriptionPanelContentWorkspace-D4JCQaHK.js (new) 22 kB 🔴 +22 kB 🔴 +5.11 kB 🔴 +4.5 kB
assets/SubscriptionPanelContentWorkspace-DpVAh8gx.js (removed) 22 kB 🟢 -22 kB 🟢 -5.11 kB 🟢 -4.5 kB
assets/CurrentUserPopoverWorkspace-B9TaHdV4.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +4.94 kB 🔴 +4.4 kB
assets/CurrentUserPopoverWorkspace-fJFjmcdR.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -4.93 kB 🟢 -4.4 kB
assets/SignInContent--TjhATPk.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.76 kB 🔴 +4.17 kB
assets/SignInContent-nqRXbvj7.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.76 kB 🟢 -4.17 kB
assets/WidgetInputNumber-DJd7qhfM.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -4.8 kB 🟢 -4.27 kB
assets/WidgetInputNumber-D6RcDn4F.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +4.8 kB 🔴 +4.28 kB
assets/WidgetRecordAudio-DGGLrQL-.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -4.99 kB 🟢 -4.45 kB
assets/WidgetRecordAudio-DhRJOZqM.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +4.99 kB 🔴 +4.46 kB
assets/Load3D-BqJWCRay.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.52 kB
assets/Load3D-BZPQ0_k2.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.51 kB
assets/load3d-4BWx99Yf.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.19 kB 🔴 +3.63 kB
assets/load3d-dWo-n-dG.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.19 kB 🟢 -3.63 kB
assets/AudioPreviewPlayer-B05QRV2j.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.24 kB 🔴 +2.89 kB
assets/AudioPreviewPlayer-BmTPwZQ2.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.23 kB 🟢 -2.88 kB
assets/changeTracker-B50aOdOK.js (new) 9.43 kB 🔴 +9.43 kB 🔴 +2.9 kB 🔴 +2.55 kB
assets/changeTracker-DBdD528B.js (removed) 9.43 kB 🟢 -9.43 kB 🟢 -2.9 kB 🟢 -2.55 kB
assets/nodeTemplates-CcqnxTP0.js (new) 9.29 kB 🔴 +9.29 kB 🔴 +3.25 kB 🔴 +2.86 kB
assets/nodeTemplates-DtS5tOP8.js (removed) 9.29 kB 🟢 -9.29 kB 🟢 -3.25 kB 🟢 -2.85 kB
assets/InviteMemberDialogContent-B33xWBFO.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.29 kB 🟢 -1.99 kB
assets/InviteMemberDialogContent-CsOgyaie.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.29 kB 🔴 +1.99 kB
assets/Load3DConfiguration-BOTAhhxX.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.67 kB
assets/Load3DConfiguration-Buu8pOLH.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.91 kB 🔴 +1.67 kB
assets/CreateWorkspaceDialogContent-BCj1nskF.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -1.99 kB 🟢 -1.73 kB
assets/CreateWorkspaceDialogContent-n4gSmhEu.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +1.99 kB 🔴 +1.73 kB
assets/onboardingCloudRoutes-BG8mghWY.js (new) 5.41 kB 🔴 +5.41 kB 🔴 +1.84 kB 🔴 +1.59 kB
assets/onboardingCloudRoutes-BxiFVv_W.js (removed) 5.41 kB 🟢 -5.41 kB 🟢 -1.84 kB 🟢 -1.61 kB
assets/FreeTierDialogContent-CKvfiwa_.js (new) 5.39 kB 🔴 +5.39 kB 🔴 +1.9 kB 🔴 +1.67 kB
assets/FreeTierDialogContent-CY5GfwAp.js (removed) 5.39 kB 🟢 -5.39 kB 🟢 -1.89 kB 🟢 -1.67 kB
assets/EditWorkspaceDialogContent-C7qWYAZD.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.95 kB 🔴 +1.69 kB
assets/EditWorkspaceDialogContent-COwaEHtW.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.94 kB 🟢 -1.69 kB
assets/ValueControlPopover-A4kKtAzT.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.76 kB 🟢 -1.58 kB
assets/ValueControlPopover-Bq1ltBvS.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/Preview3d-CD6qLSXO.js (removed) 4.85 kB 🟢 -4.85 kB 🟢 -1.59 kB 🟢 -1.4 kB
assets/Preview3d-D9oSb5FT.js (new) 4.85 kB 🔴 +4.85 kB 🔴 +1.59 kB 🔴 +1.39 kB
assets/CancelSubscriptionDialogContent-BU3ONYeH.js (new) 4.79 kB 🔴 +4.79 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/CancelSubscriptionDialogContent-D18dQ8Q0.js (removed) 4.79 kB 🟢 -4.79 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/DeleteWorkspaceDialogContent-B2EKEvw-.js (removed) 4.23 kB 🟢 -4.23 kB 🟢 -1.63 kB 🟢 -1.42 kB
assets/DeleteWorkspaceDialogContent-Cq26CwqI.js (new) 4.23 kB 🔴 +4.23 kB 🔴 +1.63 kB 🔴 +1.42 kB
assets/WidgetWithControl-CLh4Zn4J.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.78 kB 🔴 +1.59 kB
assets/WidgetWithControl-DMMELLbl.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.77 kB 🟢 -1.59 kB
assets/LeaveWorkspaceDialogContent-CQtRf8_b.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/LeaveWorkspaceDialogContent-Vntdi4w0.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/RemoveMemberDialogContent-DKrqXuk8.js (removed) 4.04 kB 🟢 -4.04 kB 🟢 -1.52 kB 🟢 -1.33 kB
assets/RemoveMemberDialogContent-DvWC4N8l.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.52 kB 🔴 +1.33 kB
assets/RevokeInviteDialogContent-DKqU_PbB.js (new) 3.95 kB 🔴 +3.95 kB 🔴 +1.54 kB 🔴 +1.35 kB
assets/RevokeInviteDialogContent-Y50DBdXb.js (removed) 3.95 kB 🟢 -3.95 kB 🟢 -1.54 kB 🟢 -1.36 kB
assets/InviteMemberUpsellDialogContent-CYSAk0cG.js (removed) 3.82 kB 🟢 -3.82 kB 🟢 -1.4 kB 🟢 -1.23 kB
assets/InviteMemberUpsellDialogContent-DBLi0Q4V.js (new) 3.82 kB 🔴 +3.82 kB 🔴 +1.4 kB 🔴 +1.23 kB
assets/tierBenefits-CECGo8FK.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.3 kB 🔴 +1.16 kB
assets/tierBenefits-CpepENSZ.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.3 kB 🟢 -1.15 kB
assets/saveMesh-CCvlHpQX.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.29 kB
assets/saveMesh-DIsuytOO.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.45 kB 🔴 +1.29 kB
assets/cloudSessionCookie-ByacqpEf.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.08 kB 🟢 -977 B
assets/cloudSessionCookie-CdQZB-jW.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.08 kB 🔴 +943 B
assets/GlobalToast-B6GXBXmK.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.03 kB
assets/GlobalToast-CXfVuM_U.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/SubscribeToRun-BTqGcxdn.js (removed) 2.06 kB 🟢 -2.06 kB 🟢 -949 B 🟢 -830 B
assets/SubscribeToRun-BxLzrZBg.js (new) 2.06 kB 🔴 +2.06 kB 🔴 +949 B 🔴 +838 B
assets/CloudRunButtonWrapper-ipIVWIIX.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -781 B 🟢 -713 B
assets/CloudRunButtonWrapper-MiIrqbwj.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +782 B 🔴 +709 B
assets/previousFullPath-BXOgQ-OW.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +651 B 🔴 +583 B
assets/previousFullPath-fPz-S114.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -649 B 🟢 -566 B
assets/cloudBadges-CDL882bI.js (new) 1.36 kB 🔴 +1.36 kB 🔴 +704 B 🔴 +615 B
assets/cloudBadges-DeLGoTtY.js (removed) 1.36 kB 🟢 -1.36 kB 🟢 -703 B 🟢 -613 B
assets/cloudSubscription-AcZRxZI1.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -652 B 🟢 -573 B
assets/cloudSubscription-DtcuEftK.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +653 B 🔴 +565 B
assets/Load3D-3sV_PZ9a.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +493 B 🔴 +435 B
assets/Load3D-Boxz-edt.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -491 B 🟢 -441 B
assets/nightlyBadges-DaWTr2m2.js (new) 1 kB 🔴 +1 kB 🔴 +528 B 🔴 +477 B
assets/nightlyBadges-pbSLuGjg.js (removed) 1 kB 🟢 -1 kB 🟢 -525 B 🟢 -470 B
assets/Load3dViewerContent-BgORjceB.js (new) 993 B 🔴 +993 B 🔴 +464 B 🔴 +412 B
assets/Load3dViewerContent-DcG15IQm.js (removed) 993 B 🟢 -993 B 🟢 -461 B 🟢 -415 B
assets/SubscriptionPanelContentWorkspace-CK8ltaig.js (removed) 920 B 🟢 -920 B 🟢 -434 B 🟢 -377 B
assets/SubscriptionPanelContentWorkspace-nnmYtG82.js (new) 920 B 🔴 +920 B 🔴 +435 B 🔴 +376 B
assets/graphHasMissingNodes-CfjR43PB.js (new) 761 B 🔴 +761 B 🔴 +374 B 🔴 +319 B
assets/graphHasMissingNodes-CvTgpJS2.js (removed) 761 B 🟢 -761 B 🟢 -373 B 🟢 -323 B
assets/changeTracker-BOL6A97M.js (removed) 757 B 🟢 -757 B 🟢 -379 B 🟢 -333 B
assets/changeTracker-DD5KhLFH.js (new) 757 B 🔴 +757 B 🔴 +379 B 🔴 +367 B
assets/WidgetLegacy-BsF8ULRE.js (removed) 744 B 🟢 -744 B 🟢 -381 B 🟢 -335 B
assets/WidgetLegacy-CcHfl-5j.js (new) 744 B 🔴 +744 B 🔴 +379 B 🔴 +331 B
assets/AnimationControls-rvj0ANn9.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-CV6ueEHE.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-BTnZwrs2.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-BNRU5hKJ.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-D9MrYETV.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-BbfHqQlJ.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BEYCqLzR.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BFgRi4P3.js 19 kB 19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BUxt8PgP.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BWxUDagn.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CaYVZOZt.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CQAp--Ck.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CTQPlIVl.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DBek0Hch.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DU-y2_NM.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-g_-oH-q2.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ji49gKfP.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-htt0vt7m.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-BSY-PFQs.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-DWSIB0xb.js 535 kB 535 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BEMY9ugQ.js 158 kB 158 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BfwPzKFt.js 173 kB 173 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bii6Trku.js 150 kB 150 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bpn2Hd-v.js 188 kB 188 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BSlofMTK.js 155 kB 155 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BwvjM7NS.js 210 kB 210 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BzFhiL9M.js 150 kB 150 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C2qCKfdm.js 181 kB 181 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cu-O7-UJ.js 153 kB 153 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D_rzH3JH.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DWCBhr37.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-DjGAidD-.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-CXjvquTX.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-CCi6hDYh.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-z-FoiFro.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-BUmyBrmT.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-C5eK56v1.js 2.77 kB 2.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BRiV_JqD.js 451 kB 451 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BRNi4BQJ.js 404 kB 404 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BYxgBGHq.js 400 kB 400 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CRJ1lnRc.js 396 kB 396 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CYplVYdX.js 364 kB 364 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Czw9YrJ_.js 368 kB 368 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dp7_2zi-.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DY1M9TFM.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-EIvY3SXE.js 491 kB 491 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-TppPBr5S.js 416 kB 416 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-WGHIzLau.js 450 kB 450 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-CiXBGsU8.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-mHgijvCJ.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-D4M-Ad2-.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-CQRjYlXR.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-DqM23qfs.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-CC52XK_P.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-D_dHFUc0.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DIRwAHBY.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-aM9dgT_H.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BYsbWVeN.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-BF6Uqf9O.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-DfzN4kvf.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-D_JEKVtF.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-BHbklsS7.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-C6hTlaKi.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-CwLynoNC.js 1.86 kB 1.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-CIhDMEfL.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-CFetMknf.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DN03zIgB.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-D4ckclZT.js 3.96 kB 3.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-BBrQMwt0.js 6.8 kB 6.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DYLaC2lj.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 51 added / 51 removed

@github-actions
Copy link

github-actions bot commented Feb 26, 2026

⚡ Performance Report

Metric Baseline PR Δ
canvas-idle: style recalcs 123 126 +2% ⚪
canvas-idle: layouts 0 1 new 🔴
canvas-idle: task duration 425ms 447ms +5% ⚪
canvas-mouse-sweep: style recalcs 168 190 +13% 🟠
canvas-mouse-sweep: layouts 12 12 +0% ⚪
canvas-mouse-sweep: task duration 824ms 1166ms +41% 🔴
dom-widget-clipping: style recalcs 51 40 -22% 🟢
dom-widget-clipping: layouts 0 0 +0% ⚪
dom-widget-clipping: task duration 456ms 362ms -21% 🟢
subgraph-dom-widget-clipping: style recalcs 74 78 +5% ⚪
subgraph-dom-widget-clipping: layouts 0 1 new 🔴
subgraph-dom-widget-clipping: task duration 436ms 463ms +6% ⚪
subgraph-idle: style recalcs 121 121 +0% ⚪
subgraph-idle: layouts 0 0 +0% ⚪
subgraph-idle: task duration 401ms 412ms +3% ⚪
subgraph-mouse-sweep: style recalcs 158 174 +10% 🟠
subgraph-mouse-sweep: layouts 16 16 +0% ⚪
subgraph-mouse-sweep: task duration 796ms 1035ms +30% 🔴
Raw data
{
  "timestamp": "2026-03-04T22:28:14.194Z",
  "gitSha": "3601e100df602875fbd82b261b5fb14fa20f0495",
  "branch": "ci/tailwind-v4-linter-re-enable",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2039.9580000000128,
      "styleRecalcs": 126,
      "styleRecalcDurationMs": 28.96,
      "layouts": 1,
      "layoutDurationMs": 0.18999999999999995,
      "taskDurationMs": 446.69499999999994,
      "heapDeltaBytes": -1316604
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2122.6179999999886,
      "styleRecalcs": 190,
      "styleRecalcDurationMs": 63.038999999999994,
      "layouts": 12,
      "layoutDurationMs": 4.186999999999999,
      "taskDurationMs": 1165.519,
      "heapDeltaBytes": -1894380
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 571.5250000000083,
      "styleRecalcs": 40,
      "styleRecalcDurationMs": 12.417,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 362.076,
      "heapDeltaBytes": 7551836
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 645.5500000000143,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 22.455999999999996,
      "layouts": 1,
      "layoutDurationMs": 0.18600000000000008,
      "taskDurationMs": 462.734,
      "heapDeltaBytes": -8635136
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2008.1380000000308,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 22.8,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 412.01500000000004,
      "heapDeltaBytes": -2113244
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 2027.1510000000035,
      "styleRecalcs": 174,
      "styleRecalcDurationMs": 62.36899999999999,
      "layouts": 16,
      "layoutDurationMs": 5.146,
      "taskDurationMs": 1034.519,
      "heapDeltaBytes": -3240492
    }
  ]
}

@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:S This PR changes 10-29 lines, ignoring generated files. labels Feb 26, 2026
@christian-byrne christian-byrne force-pushed the ci/tailwind-v4-linter-re-enable branch from c7d09d0 to 7d62603 Compare February 26, 2026 09:29
@dosubot dosubot bot added size:S This PR changes 10-29 lines, ignoring generated files. size:L This PR changes 100-499 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. size:S This PR changes 10-29 lines, ignoring generated files. labels Feb 26, 2026
@christian-byrne christian-byrne force-pushed the ci/tailwind-v4-linter-re-enable branch from e914794 to 349a32b Compare February 26, 2026 09:56
@dosubot dosubot bot added size:M This PR changes 30-99 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Feb 26, 2026
Copy link
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.

🧹 Nitpick comments (1)
eslint.config.ts (1)

132-134: Consider enabling enforce-canonical-classes and no-deprecated-classes as warnings.

Per the PR summary, ~700 issues from these rules are auto-fixable via eslint --fix. Rather than keeping them 'off', you could set them to 'warn' so developers see the deprecation notices during development, while still passing CI. This provides visibility without blocking merges.

-      'better-tailwindcss/enforce-canonical-classes': 'off',
-      // Off: large batch change, enable and apply with `eslint --fix`
-      'better-tailwindcss/no-deprecated-classes': 'off'
+      // Warn: large batch change (v3→v4 renames), auto-fixable with `eslint --fix`
+      'better-tailwindcss/enforce-canonical-classes': 'warn',
+      // Warn: large batch change, auto-fixable with `eslint --fix`
+      'better-tailwindcss/no-deprecated-classes': 'warn'

Alternatively, if ~700 warnings would be too noisy, keeping them 'off' until a dedicated cleanup PR is reasonable.

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

In `@eslint.config.ts` around lines 132 - 134, Change the two Better Tailwind CSS
rules in eslint.config.ts—'better-tailwindcss/enforce-canonical-classes' and
'better-tailwindcss/no-deprecated-classes'—from 'off' to 'warn' so developers
see deprecation notices during development without failing CI; if the ~700
auto-fixable warnings are too noisy, keep them 'off' for now but add a TODO
comment and create a follow-up cleanup PR that runs `eslint --fix` to apply
fixes and then flip both rules to 'warn' (or 'error' after cleanup).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@eslint.config.ts`:
- Around line 132-134: Change the two Better Tailwind CSS rules in
eslint.config.ts—'better-tailwindcss/enforce-canonical-classes' and
'better-tailwindcss/no-deprecated-classes'—from 'off' to 'warn' so developers
see deprecation notices during development without failing CI; if the ~700
auto-fixable warnings are too noisy, keep them 'off' for now but add a TODO
comment and create a follow-up cleanup PR that runs `eslint --fix` to apply
fixes and then flip both rules to 'warn' (or 'error' after cleanup).

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1935ffb and cacb119.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (9)
  • eslint.config.ts
  • package.json
  • pnpm-workspace.yaml
  • src/components/LiteGraphCanvasSplitterOverlay.vue
  • src/components/topbar/CurrentUserButton.vue
  • src/components/widget/nav/NavTitle.vue
  • src/renderer/extensions/vueNodes/composables/useNodeTooltips.ts
  • src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue
  • src/renderer/extensions/vueNodes/widgets/composables/useNumberWidgetButtonPt.ts
✅ Files skipped from review due to trivial changes (1)
  • src/components/widget/nav/NavTitle.vue
🚧 Files skipped from review as they are similar to previous changes (1)
  • package.json

- Install eslint-plugin-better-tailwindcss with recommended config
- Configure entryPoint to design-system CSS for v4 theme resolution
- Enable: enforce-canonical-classes, no-deprecated-classes,
  no-conflicting-classes, no-duplicate-classes, no-unnecessary-whitespace
- Disable initially: no-unknown-classes (needs class whitelisting),
  enforce-consistent-line-wrapping (oxfmt conflict risk),
  enforce-consistent-class-order (large batch change)
- Fix conflicting outline classes in FormDropdownMenuActions

Fixes COM-15518

Amp-Thread-ID: https://ampcode.com/threads/T-019c9935-71bc-7193-b0a4-18c7c40249c3
@christian-byrne christian-byrne force-pushed the ci/tailwind-v4-linter-re-enable branch from cacb119 to d6c007f Compare February 28, 2026 05:25
@socket-security
Copy link

socket-security bot commented Feb 28, 2026

Copy link
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.

🧹 Nitpick comments (1)
eslint.config.ts (1)

130-135: Prefer warn over off for canonical/deprecated rules during migration.

Lines 132 and 134 disable both rules entirely, which removes visibility of new violations during the migration window. Since the lint script does not fail on warnings, switching to warn preserves guardrails and allows the team to see new violations landing while planning the cleanup PR.

Suggested config tweak
-      'better-tailwindcss/enforce-canonical-classes': 'off',
+      'better-tailwindcss/enforce-canonical-classes': 'warn',
...
-      'better-tailwindcss/no-deprecated-classes': 'off'
+      'better-tailwindcss/no-deprecated-classes': 'warn'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@eslint.config.ts` around lines 130 - 135, Change the two Tailwind rule
settings from 'off' to 'warn' so violations are surfaced during migration:
update the entries for 'better-tailwindcss/enforce-canonical-classes' and
'better-tailwindcss/no-deprecated-classes' in eslint.config.ts to use 'warn'
instead of 'off' to preserve visibility without failing CI.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@eslint.config.ts`:
- Around line 130-135: Change the two Tailwind rule settings from 'off' to
'warn' so violations are surfaced during migration: update the entries for
'better-tailwindcss/enforce-canonical-classes' and
'better-tailwindcss/no-deprecated-classes' in eslint.config.ts to use 'warn'
instead of 'off' to preserve visibility without failing CI.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cacb119 and d6c007f.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (4)
  • eslint.config.ts
  • package.json
  • pnpm-workspace.yaml
  • src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue
🚧 Files skipped from review as they are similar to previous changes (2)
  • package.json
  • src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdownMenuActions.vue

@christian-byrne
Copy link
Contributor Author

This is working on Ubuntu for me now, seems safe to add back.


const actionButtonStyle = cn(
'h-8 bg-zinc-500/20 rounded-lg outline outline-1 outline-offset-[-1px] outline-node-component-border transition-all duration-150'
'h-8 bg-zinc-500/20 rounded-lg outline-1 -outline-offset-1 outline-node-component-border transition-all duration-150'
Copy link
Contributor

Choose a reason for hiding this comment

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

I would have expected -1 to be 4px and -px to be 1px

Copy link
Contributor

Choose a reason for hiding this comment

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

Might be able to reduce the changes here with a pnpm dedupe

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@coderabbitai make an Issue to try this out later.

Copy link
Contributor

Choose a reason for hiding this comment

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

Oops, something went wrong! Please try again later. 🐰 💔

@DrJKL DrJKL assigned christian-byrne and unassigned DrJKL Mar 4, 2026
@christian-byrne christian-byrne merged commit b8edb11 into main Mar 4, 2026
33 of 34 checks passed
@christian-byrne christian-byrne deleted the ci/tailwind-v4-linter-re-enable branch March 4, 2026 23:34
Myestery pushed a commit that referenced this pull request Mar 5, 2026
…9245)

## Summary

Add `eslint-plugin-better-tailwindcss` to the ESLint toolchain for
Tailwind CSS v4 class linting.

## Changes

- **What**: Integrate `eslint-plugin-better-tailwindcss` (v4.3.1) with
the recommended config, pointed at the design-system CSS entry point for
v4 theme resolution. Five rules are enabled initially:
`enforce-canonical-classes`, `no-deprecated-classes`,
`no-conflicting-classes`, `no-duplicate-classes`,
`no-unnecessary-whitespace`. Three rules are disabled pending follow-up:
`no-unknown-classes` (needs PrimeIcon/custom class whitelisting),
`enforce-consistent-line-wrapping` (oxfmt conflict risk),
`enforce-consistent-class-order` (large batch change).
- **Dependencies**: `eslint-plugin-better-tailwindcss` ^4.3.1
- Fix conflicting `outline outline-1` classes in
`FormDropdownMenuActions.vue` (caught by the new
`no-conflicting-classes` rule).

## Review Focus

- Is the rule severity/enablement strategy appropriate for incremental
adoption?
- The 700 warnings (mostly `enforce-canonical-classes` and
`no-deprecated-classes`) are all auto-fixable via `eslint --fix` —
should we batch-fix them in this PR or a follow-up?

Fixes COM-15518

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9245-feat-add-eslint-plugin-better-tailwindcss-for-Tailwind-v4-linting-3136d73d365081df8a64dd55962d073f)
by [Unito](https://www.unito.io)

---------

Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Alexander Brown <drjkl@comfy.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants