From ef4e4a69d5d694042291e797e7200a40cf4862de Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Thu, 5 Mar 2026 17:24:34 -0800 Subject: [PATCH] fix: enable enforce-consistent-class-order tailwind lint rule (#9428) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Enable `better-tailwindcss/enforce-consistent-class-order` lint rule and auto-fix all 1027 violations across 263 files. Stacked on #9427. ## Changes - **What**: Sort Tailwind classes into consistent order via `eslint --fix` - Enable `enforce-consistent-class-order` as `'error'` in eslint config - Purely cosmetic reordering — no behavioral or visual changes ## Review Focus Mechanical auto-fix PR — all changes are class reordering only. This is the largest diff but lowest risk since it changes no class names, only their order. **Stack:** #9417 → #9427 → **this PR** Fixes #9300 (partial — 3 of 3 rules) ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-9428-fix-enable-enforce-consistent-class-order-tailwind-lint-rule-31a6d73d3650811c9065f5178ba3e724) by [Unito](https://www.unito.io) --- eslint.config.ts | 2 +- .../LiteGraphCanvasSplitterOverlay.vue | 16 +++--- src/components/MenuHamburger.vue | 2 +- src/components/TopMenuSection.vue | 2 +- src/components/actionbar/ComfyActionbar.vue | 12 ++-- src/components/appMode/AppModeToolbar.vue | 6 +- .../tabs/terminal/BaseTerminal.vue | 2 +- .../breadcrumb/SubgraphBreadcrumb.vue | 4 +- src/components/builder/AppBuilder.vue | 30 +++++----- src/components/builder/BuilderMenu.vue | 8 +-- src/components/builder/BuilderToolbar.vue | 6 +- .../builder/ConnectOutputPopover.vue | 2 +- src/components/builder/IoItem.vue | 6 +- src/components/builder/StepLabel.vue | 2 +- src/components/button/IconGroup.vue | 2 +- src/components/card/CardBottom.vue | 2 +- src/components/card/CardContainer.vue | 2 +- src/components/chip/SquareChip.vue | 4 +- src/components/common/DraggableList.vue | 2 +- src/components/common/DropdownItem.vue | 4 +- src/components/common/DropdownMenu.vue | 4 +- src/components/common/MarqueeLine.vue | 4 +- src/components/common/OverlayIcon.vue | 4 +- .../common/ScrubableNumberInput.vue | 8 +-- src/components/common/SearchBox.vue | 8 +-- src/components/common/SearchBoxV2.vue | 6 +- src/components/common/TextTickerMultiLine.vue | 4 +- src/components/common/TreeExplorer.vue | 2 +- .../common/TreeExplorerTreeNode.vue | 2 +- src/components/common/TreeExplorerV2.vue | 2 +- src/components/common/TreeExplorerV2Node.vue | 6 +- src/components/common/VirtualGrid.vue | 2 +- .../common/WorkflowActionsDropdown.vue | 4 +- src/components/common/WorkflowActionsList.vue | 8 +-- src/components/dialog/confirm/ConfirmBody.vue | 2 +- .../dialog/confirm/ConfirmFooter.vue | 2 +- .../dialog/confirm/ConfirmHeader.vue | 2 +- .../content/ConfirmationDialogContent.vue | 6 +- .../dialog/content/MissingModelsContent.vue | 10 ++-- .../dialog/content/MissingNodesContent.vue | 36 ++++++------ .../dialog/content/MissingNodesFooter.vue | 6 +- .../TopUpCreditsDialogContentLegacy.vue | 16 +++--- .../content/credit/CreditTopUpOption.vue | 6 +- .../dialog/content/setting/UserPanel.vue | 2 +- .../CancelSubscriptionDialogContent.vue | 2 +- src/components/error/ErrorOverlay.vue | 6 +- .../gradientslider/GradientSlider.vue | 2 +- src/components/graph/GraphCanvas.vue | 2 +- src/components/graph/NodeContextMenu.vue | 2 +- .../selectionToolbox/ColorPickerMenu.vue | 8 +-- .../helpcenter/HelpCenterMenuContent.vue | 2 +- src/components/honeyToast/HoneyToast.vue | 6 +- src/components/input/MultiSelect.vue | 8 +-- src/components/input/SingleSelect.vue | 4 +- .../load3d/controls/PopupSlider.vue | 4 +- .../load3d/controls/RecordingControls.vue | 2 +- .../maskeditor/BrushSettingsPanel.vue | 30 +++++----- .../maskeditor/ColorSelectSettingsPanel.vue | 2 +- .../maskeditor/ImageLayerSettingsPanel.vue | 18 +++--- .../maskeditor/MaskEditorContent.vue | 10 ++-- .../maskeditor/PaintBucketSettingsPanel.vue | 2 +- src/components/maskeditor/PointerZone.vue | 2 +- src/components/maskeditor/SidePanel.vue | 6 +- src/components/maskeditor/ToolPanel.vue | 4 +- .../maskeditor/controls/DropdownControl.vue | 6 +- .../maskeditor/controls/SliderControl.vue | 2 +- .../maskeditor/controls/ToggleControl.vue | 4 +- .../maskeditor/dialog/TopBarHeader.vue | 14 ++--- src/components/node/NodePreviewCard.vue | 16 +++--- src/components/painter/WidgetPainter.vue | 18 +++--- .../queue/JobHistoryActionsMenu.vue | 4 +- .../queue/QueueInlineProgressSummary.vue | 2 +- .../queue/QueueNotificationBanner.vue | 2 +- src/components/queue/QueueOverlayExpanded.vue | 2 +- src/components/queue/QueueProgressOverlay.vue | 4 +- .../queue/dialogs/QueueClearHistoryDialog.vue | 4 +- src/components/queue/job/QueueJobItem.vue | 2 +- .../rightSidePanel/RightSidePanel.vue | 10 ++-- .../rightSidePanel/errors/ErrorNodeCard.vue | 20 +++---- .../rightSidePanel/errors/MissingNodeCard.vue | 8 +-- .../errors/MissingPackGroupRow.vue | 42 +++++++------- .../rightSidePanel/errors/TabErrors.vue | 30 +++++----- .../layout/CollapseToggleButton.vue | 2 +- .../layout/PropertiesAccordionItem.vue | 8 +-- .../parameters/SectionWidgets.vue | 14 ++--- .../parameters/TabGlobalParameters.vue | 6 +- .../rightSidePanel/parameters/TabNodes.vue | 4 +- .../parameters/TabNormalInputs.vue | 4 +- .../parameters/TabSubgraphInputs.vue | 4 +- .../parameters/WidgetActions.vue | 10 ++-- .../rightSidePanel/parameters/WidgetItem.vue | 18 +++--- .../rightSidePanel/settings/LayoutField.vue | 4 +- .../rightSidePanel/settings/SetNodeColor.vue | 4 +- .../settings/TabGlobalSettings.vue | 6 +- .../subgraph/SubgraphEditor.vue | 18 +++--- .../subgraph/SubgraphNodeWidget.vue | 10 ++-- .../v2/NodeSearchCategorySidebar.vue | 2 +- .../searchbox/v2/NodeSearchContent.vue | 2 +- .../searchbox/v2/NodeSearchFilterBar.vue | 4 +- .../searchbox/v2/NodeSearchFilterPanel.vue | 4 +- .../searchbox/v2/NodeSearchInput.vue | 10 ++-- .../searchbox/v2/NodeSearchListItem.vue | 4 +- src/components/sidebar/SideToolbar.vue | 6 +- src/components/sidebar/SidebarIcon.vue | 2 +- .../sidebar/tabs/AppsSidebarTab.vue | 2 +- .../sidebar/tabs/AssetsSidebarGridView.vue | 2 +- .../sidebar/tabs/AssetsSidebarListView.vue | 4 +- .../sidebar/tabs/AssetsSidebarTab.vue | 6 +- .../sidebar/tabs/NodeLibrarySidebarTabV2.vue | 10 ++-- .../sidebar/tabs/SidebarTabTemplate.vue | 4 +- .../tabs/nodeLibrary/AllNodesPanel.vue | 6 +- .../tabs/nodeLibrary/BlueprintsPanel.vue | 4 +- .../tabs/nodeLibrary/CustomNodesPanel.vue | 8 +-- .../tabs/nodeLibrary/EssentialNodeCard.vue | 4 +- .../tabs/nodeLibrary/EssentialNodesPanel.vue | 4 +- src/components/tab/Tab.vue | 8 +-- src/components/topbar/CurrentUserButton.vue | 2 +- .../topbar/CurrentUserPopoverLegacy.vue | 46 +++++++-------- src/components/topbar/LoginButton.vue | 2 +- src/components/topbar/TopMenuHelpButton.vue | 2 +- src/components/topbar/TopbarBadge.vue | 4 +- .../topbar/WorkflowOverflowMenu.vue | 2 +- src/components/topbar/WorkflowTab.vue | 2 +- src/components/topbar/WorkflowTabs.vue | 8 +-- src/components/ui/Popover.vue | 8 +-- src/components/ui/ZoomPane.vue | 2 +- src/components/ui/button/button.variants.ts | 10 ++-- src/components/ui/input/Input.vue | 2 +- .../ui/search-input/SearchInput.vue | 6 +- src/components/ui/select/SelectContent.vue | 4 +- src/components/ui/select/SelectItem.vue | 2 +- src/components/ui/select/SelectLabel.vue | 2 +- src/components/ui/select/SelectTrigger.vue | 2 +- src/components/ui/slider/Slider.vue | 6 +- .../ui/stepper/FormattedNumberStepper.vue | 10 ++-- src/components/ui/tags-input/TagsInput.vue | 4 +- .../ui/tags-input/TagsInputInput.vue | 2 +- .../ui/tags-input/TagsInputItem.vue | 2 +- .../ui/tags-input/TagsInputItemDelete.vue | 2 +- src/components/ui/textarea/Textarea.vue | 2 +- .../ui/toggle-group/ToggleGroupItem.vue | 2 +- .../ui/toggle-group/toggleGroup.variants.ts | 4 +- .../widget/layout/BaseModalLayout.vue | 20 +++---- src/components/widget/nav/NavIcon.vue | 2 +- src/components/widget/nav/NavItem.vue | 4 +- src/components/widget/nav/NavTitle.vue | 4 +- src/components/widget/panel/LeftSidePanel.vue | 2 +- .../components/ActiveMediaAssetCard.vue | 6 +- .../assets/components/AssetBadgeGroup.vue | 4 +- .../assets/components/AssetBrowserModal.vue | 4 +- src/platform/assets/components/AssetCard.vue | 20 +++---- .../components/AssetExportProgressDialog.vue | 8 +-- .../assets/components/AssetFilterBar.vue | 4 +- src/platform/assets/components/AssetGrid.vue | 4 +- .../assets/components/MediaAssetCard.vue | 10 ++-- .../assets/components/MediaAssetFilterBar.vue | 4 +- .../components/MediaAssetFilterMenu.vue | 4 +- .../components/MediaAssetSettingsMenu.vue | 14 ++--- src/platform/assets/components/MediaTitle.vue | 2 +- .../components/ModelImportProgressDialog.vue | 4 +- .../components/UploadModelDialogHeader.vue | 2 +- .../assets/components/UploadModelFooter.vue | 2 +- .../assets/components/UploadModelProgress.vue | 2 +- .../components/UploadModelUpgradeModal.vue | 2 +- .../UploadModelUpgradeModalFooter.vue | 4 +- .../assets/components/UploadModelUrlInput.vue | 8 +-- .../components/modelInfo/ModelInfoField.vue | 2 +- .../components/modelInfo/ModelInfoPanel.vue | 26 ++++----- .../cloud/onboarding/CloudAuthTimeoutView.vue | 4 +- .../CloudSubscriptionRedirectView.vue | 2 +- .../components/FreeTierDialogContent.vue | 2 +- .../subscription/components/PricingTable.vue | 50 ++++++++--------- .../components/SubscriptionPanel.vue | 10 ++-- .../SubscriptionPanelContentLegacy.vue | 20 +++---- .../SubscriptionRequiredDialogContent.vue | 12 ++-- .../components/SwapNodeGroupRow.vue | 26 ++++----- .../components/SwapNodesCard.vue | 2 +- .../secrets/components/SecretFormDialog.vue | 2 +- .../secrets/components/SecretListItem.vue | 4 +- .../secrets/components/SecretsPanel.vue | 4 +- .../settings/components/SettingDialog.vue | 2 +- src/platform/surveys/NightlySurveyPopover.vue | 4 +- .../components/ReleaseNotificationToast.vue | 20 +++---- .../updates/components/WhatsNewPopup.vue | 8 +-- .../sharing/components/AssetSectionList.vue | 2 +- .../OpenSharedWorkflowDialogContent.vue | 2 +- .../components/ShareAssetWarningBox.vue | 2 +- .../components/ShareWorkflowDialogContent.vue | 2 +- .../profile/ComfyHubCreateProfileForm.vue | 4 +- .../profile/ComfyHubPublishIntroPanel.vue | 2 +- .../publish/ComfyHubDescribeStep.vue | 10 ++-- .../publish/ComfyHubExamplesStep.vue | 6 +- .../publish/ComfyHubPublishDialog.vue | 2 +- .../components/publish/ComfyHubPublishNav.vue | 2 +- .../publish/ComfyHubPublishWizardContent.vue | 2 +- .../publish/ComfyHubThumbnailStep.vue | 6 +- .../CurrentUserPopoverWorkspace.vue | 6 +- .../components/PricingTableWorkspace.vue | 56 +++++++++---------- ...SubscriptionAddPaymentPreviewWorkspace.vue | 24 ++++---- .../SubscriptionPanelContentWorkspace.vue | 34 +++++------ ...criptionRequiredDialogContentWorkspace.vue | 8 +-- ...SubscriptionTransitionPreviewWorkspace.vue | 32 +++++------ .../TopUpCreditsDialogContentWorkspace.vue | 16 +++--- .../components/WorkspaceSwitcherPopover.vue | 2 +- .../dialogs/CreateWorkspaceDialogContent.vue | 4 +- .../dialogs/DeleteWorkspaceDialogContent.vue | 2 +- .../dialogs/EditWorkspaceDialogContent.vue | 4 +- .../dialogs/InviteMemberDialogContent.vue | 6 +- .../InviteMemberUpsellDialogContent.vue | 2 +- .../dialogs/LeaveWorkspaceDialogContent.vue | 2 +- .../dialogs/RemoveMemberDialogContent.vue | 2 +- .../dialogs/RevokeInviteDialogContent.vue | 2 +- .../dialogs/settings/MembersPanelContent.vue | 16 +++--- .../settings/WorkspacePanelContent.vue | 4 +- .../components/toasts/InviteAcceptedToast.vue | 4 +- .../core/layout/transform/TransformPane.vue | 2 +- .../extensions/linearMode/AppInput.vue | 12 ++-- .../extensions/linearMode/AppOutput.vue | 8 +-- .../extensions/linearMode/DropZone.vue | 6 +- .../extensions/linearMode/ImagePreview.vue | 4 +- .../extensions/linearMode/LatentPreview.vue | 4 +- .../extensions/linearMode/LinearArrange.vue | 12 ++-- .../extensions/linearMode/LinearControls.vue | 34 +++++------ .../extensions/linearMode/LinearFeedback.vue | 2 +- .../extensions/linearMode/LinearPreview.vue | 10 ++-- .../extensions/linearMode/LinearWelcome.vue | 10 ++-- .../extensions/linearMode/MobileDisplay.vue | 28 +++++----- .../extensions/linearMode/OutputHistory.vue | 14 ++--- .../OutputHistoryActiveQueueItem.vue | 8 +-- .../linearMode/OutputHistoryItem.vue | 2 +- .../linearMode/OutputPreviewItem.vue | 4 +- .../extensions/linearMode/Preview3d.vue | 2 +- .../extensions/linearMode/VideoPreview.vue | 2 +- .../extensions/vueNodes/VideoPreview.vue | 2 +- .../vueNodes/components/ImagePreview.vue | 8 +-- .../vueNodes/components/InputSlot.vue | 10 ++-- .../vueNodes/components/LGraphNode.vue | 30 +++++----- .../vueNodes/components/LGraphNodePreview.vue | 6 +- .../vueNodes/components/LivePreview.vue | 2 +- .../vueNodes/components/NodeBadge.vue | 2 +- .../vueNodes/components/NodeBadges.vue | 10 ++-- .../vueNodes/components/NodeContent.vue | 2 +- .../vueNodes/components/NodeHeader.vue | 16 +++--- .../vueNodes/components/NodeSlots.vue | 10 ++-- .../vueNodes/components/NodeWidgets.vue | 4 +- .../vueNodes/components/OutputSlot.vue | 4 +- .../vueNodes/components/SlotConnectionDot.vue | 8 +-- .../components/ValueControlPopover.vue | 12 ++-- .../widgets/components/WidgetButton.vue | 2 +- .../widgets/components/WidgetColorPicker.vue | 4 +- .../WidgetInputNumberGradientSlider.vue | 4 +- .../components/WidgetInputNumberInput.vue | 6 +- .../components/WidgetInputNumberSlider.vue | 2 +- .../widgets/components/WidgetInputText.vue | 4 +- .../widgets/components/WidgetRecordAudio.vue | 14 ++--- .../components/WidgetSelectDefault.vue | 4 +- .../widgets/components/WidgetTextarea.vue | 8 +-- .../widgets/components/WidgetToggleSwitch.vue | 2 +- .../widgets/components/WidgetWithControl.vue | 4 +- .../components/audio/AudioPreviewPlayer.vue | 4 +- .../components/form/FormSearchInput.vue | 14 ++--- .../components/form/FormSelectButton.vue | 8 +-- .../form/dropdown/FormDropdownInput.vue | 14 ++--- .../form/dropdown/FormDropdownMenuActions.vue | 20 +++---- .../form/dropdown/FormDropdownMenuFilter.vue | 6 +- .../form/dropdown/FormDropdownMenuItem.vue | 18 +++--- .../components/layout/WidgetLayoutField.vue | 6 +- .../composables/useNumberWidgetButtonPt.ts | 2 +- src/views/LinearView.vue | 24 ++++---- .../manager/ImportFailedNodeContent.vue | 4 +- .../components/manager/ManagerDialog.vue | 6 +- .../manager/NodeConflictDialogContent.vue | 6 +- .../manager/infoPanel/InfoPanel.vue | 14 ++--- .../manager/infoPanel/InfoPanelMultiItem.vue | 8 +-- .../infoPanel/tabs/DescriptionTabPanel.vue | 6 +- .../infoPanel/tabs/WarningTabPanel.vue | 2 +- .../manager/packBanner/PackBanner.vue | 6 +- .../components/manager/packCard/PackCard.vue | 6 +- 278 files changed, 1027 insertions(+), 1027 deletions(-) diff --git a/eslint.config.ts b/eslint.config.ts index 892a94ab9c..f59be99063 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -127,7 +127,7 @@ export default defineConfig([ // Off: may conflict with oxfmt formatting 'better-tailwindcss/enforce-consistent-line-wrapping': 'off', // Off: large batch change, enable and apply with `eslint --fix` - 'better-tailwindcss/enforce-consistent-class-order': 'off', + 'better-tailwindcss/enforce-consistent-class-order': 'error', 'better-tailwindcss/enforce-canonical-classes': 'error', 'better-tailwindcss/no-deprecated-classes': 'error' } diff --git a/src/components/LiteGraphCanvasSplitterOverlay.vue b/src/components/LiteGraphCanvasSplitterOverlay.vue index 498dc680bd..0ed3737133 100644 --- a/src/components/LiteGraphCanvasSplitterOverlay.vue +++ b/src/components/LiteGraphCanvasSplitterOverlay.vue @@ -1,6 +1,6 @@