From 0441d27cac47c37e6bf9fce297e54f435c670e9f Mon Sep 17 00:00:00 2001 From: Stephen Zhou Date: Wed, 29 Jul 2026 19:58:14 +0800 Subject: [PATCH] chore: canonicalize Tailwind classes (#39762) --- lint.config.ts | 27 ++ package.json | 3 + packages/dify-ui/src/autocomplete/index.tsx | 2 +- packages/dify-ui/src/button/index.tsx | 22 +- packages/dify-ui/src/combobox/index.tsx | 2 +- packages/dify-ui/src/dialog/index.stories.tsx | 8 +- packages/dify-ui/src/drawer/index.stories.tsx | 88 +++--- packages/dify-ui/src/file-tree/index.tsx | 6 +- packages/dify-ui/src/form-control-shared.ts | 6 +- packages/dify-ui/src/number-field/index.tsx | 2 +- .../dify-ui/src/scroll-area/index.stories.tsx | 2 +- packages/dify-ui/src/slider/index.tsx | 2 +- packages/dify-ui/src/switch/index.tsx | 6 +- pnpm-lock.yaml | 293 +++++------------- pnpm-workspace.yaml | 1 + web/__tests__/base/chat-flow.test.tsx | 2 +- .../[appId]/overview/chart-view.tsx | 2 +- .../time-range-picker/range-selector.tsx | 4 +- .../[appId]/overview/tracing/config-popup.tsx | 2 +- .../[appId]/overview/tracing/field.tsx | 4 +- .../[appId]/overview/tracing/panel.tsx | 2 +- .../tracing/provider-config-modal.tsx | 6 +- web/app/(shareLayout)/layout.tsx | 2 +- .../webapp-reset-password/layout.tsx | 4 +- .../set-password/page.tsx | 10 +- .../webapp-signin/check-code/page.tsx | 2 +- .../(shareLayout)/webapp-signin/layout.tsx | 6 +- .../webapp-signin/normalForm.tsx | 6 +- web/app/(shareLayout)/webapp-signin/page.tsx | 2 +- .../account-page/AvatarWithEdit.tsx | 4 +- .../(commonLayout)/account-page/index.tsx | 4 +- .../delete-account/components/feed-back.tsx | 2 +- .../(commonLayout)/delete-account/index.tsx | 2 +- web/app/account/(commonLayout)/header.tsx | 4 +- web/app/account/(commonLayout)/page.tsx | 2 +- web/app/account/oauth/authorize/layout.tsx | 4 +- web/app/account/oauth/authorize/page.tsx | 2 +- web/app/activate/activateForm.tsx | 8 +- .../app-sidebar/app-detail-section.tsx | 4 +- .../app-info/app-info-detail-drawer.tsx | 2 +- .../app-info/app-info-detail-panel.tsx | 2 +- .../app-sidebar/app-info/app-info-modals.tsx | 2 +- .../app-sidebar/dataset-detail-section.tsx | 4 +- .../app-sidebar/dataset-info/menu.tsx | 2 +- .../components/app-sidebar/nav-link/index.tsx | 2 +- .../csv-downloader.tsx | 4 +- .../batch-add-annotation-modal/index.tsx | 4 +- .../edit-annotation-modal/edit-item/index.tsx | 2 +- .../app/annotation/empty-element.tsx | 2 +- .../hit-history-no-data.tsx | 2 +- .../view-annotation-modal/index.tsx | 12 +- .../access-control-dialog.tsx | 2 +- .../add-member-or-group-pop.tsx | 6 +- .../specific-groups-or-members.tsx | 6 +- .../publish-with-multiple-model.tsx | 4 +- .../components/app/app-publisher/sections.tsx | 2 +- .../app/app-publisher/version-info-modal.tsx | 4 +- .../configuration/base/group-name/index.tsx | 2 +- .../warning-mask/cannot-query-dataset.tsx | 2 +- .../base/warning-mask/has-not-set-api.tsx | 4 +- .../config-prompt/advanced-prompt-input.tsx | 8 +- .../config-prompt/confirm-add-var/index.tsx | 4 +- .../conversation-history/edit-modal.tsx | 6 +- .../conversation-history/history-panel.tsx | 2 +- .../config-prompt/message-type-selector.tsx | 6 +- .../prompt-editor-height-resize-wrap.tsx | 2 +- .../config-prompt/simple-prompt-input.tsx | 6 +- .../config-var/config-modal/form-fields.tsx | 2 +- .../app/configuration/config-var/var-item.tsx | 2 +- .../config-vision/param-config-content.tsx | 4 +- .../config-vision/param-config.tsx | 2 +- .../config/agent/agent-setting/index.tsx | 12 +- .../config/agent/agent-tools/index.tsx | 2 +- .../agent-tools/setting-built-in-tool.tsx | 2 +- .../config/automatic/get-automatic-res.tsx | 8 +- .../config/automatic/idea-output.tsx | 2 +- .../config/automatic/instruction-editor.tsx | 2 +- .../config/automatic/version-selector.tsx | 2 +- .../code-generator/get-code-generator-res.tsx | 6 +- .../app/configuration/config/index.tsx | 2 +- .../app/configuration/configuration-view.tsx | 6 +- .../dataset-config/card-item/index.tsx | 2 +- .../dataset-config/context-var/var-picker.tsx | 8 +- .../params-config/config-content.tsx | 4 +- .../dataset-config/params-config/index.tsx | 2 +- .../params-config/weighted-score.tsx | 4 +- .../dataset-config/select-dataset/index.tsx | 2 +- .../dataset-config/settings-modal/index.tsx | 2 +- .../settings-modal/retrieval-section.tsx | 12 +- .../configuration/debug/chat-user-input.tsx | 2 +- .../debug/debug-with-multiple-model/index.tsx | 2 +- .../model-parameter-trigger.tsx | 2 +- .../app/configuration/debug/index.tsx | 8 +- .../prompt-value-panel/index.tsx | 10 +- .../tools/external-data-tool-modal.tsx | 2 +- .../app/create-app-dialog/app-card/index.tsx | 2 +- .../app/create-app-dialog/app-list/index.tsx | 12 +- .../components/app/create-app-modal/index.tsx | 14 +- .../dsl-confirm-modal.tsx | 2 +- .../app/create-from-dsl-modal/uploader.tsx | 2 +- .../components/app/duplicate-modal/index.tsx | 4 +- .../components/app/in-site-message/index.tsx | 4 +- web/app/components/app/log/empty-element.tsx | 2 +- web/app/components/app/log/filter.tsx | 4 +- web/app/components/app/log/list.tsx | 14 +- web/app/components/app/log/model-info.tsx | 2 +- web/app/components/app/log/var-panel.tsx | 6 +- .../app/overview/apikey-info-panel/index.tsx | 2 +- .../app/overview/app-card-sections.tsx | 12 +- web/app/components/app/overview/app-chart.tsx | 4 +- .../app/overview/customize/index.tsx | 2 +- .../app/overview/embedded/index.tsx | 5 +- .../app/overview/settings/index.tsx | 18 +- .../components/app/switch-app-modal/index.tsx | 6 +- .../app/text-generate/item/index.tsx | 4 +- .../components/app/type-selector/index.tsx | 2 +- .../components/app/workflow-log/filter.tsx | 2 +- web/app/components/app/workflow-log/list.tsx | 6 +- web/app/components/apps/app-card-skeleton.tsx | 2 +- web/app/components/apps/app-card.tsx | 14 +- .../apps/first-empty-state/action-card.tsx | 6 +- .../apps/first-empty-state/index.tsx | 4 +- ...import-from-marketplace-template-modal.tsx | 2 +- web/app/components/apps/starred-app-card.tsx | 2 +- .../components/apps/studio-list-header.tsx | 2 +- .../agent-log-modal/__tests__/index.spec.tsx | 2 +- .../base/agent-log-modal/detail.tsx | 4 +- .../base/agent-log-modal/index.stories.tsx | 2 +- .../components/base/agent-log-modal/index.tsx | 2 +- .../base/agent-log-modal/iteration.tsx | 4 +- .../base/agent-log-modal/result.tsx | 32 +- .../base/agent-log-modal/tool-call.tsx | 20 +- .../base/app-icon-picker/ImageInput.tsx | 4 +- .../base/app-icon-picker/index.stories.tsx | 2 +- .../components/base/app-icon-picker/index.tsx | 2 +- web/app/components/base/app-icon/index.tsx | 2 +- web/app/components/base/app-unavailable.tsx | 2 +- .../base/audio-gallery/AudioPlayer.tsx | 4 +- web/app/components/base/badge.tsx | 4 +- web/app/components/base/badge/index.tsx | 6 +- .../chat/chat-with-history/chat-wrapper.tsx | 8 +- .../chat-with-history/header-in-mobile.tsx | 2 +- .../chat/chat-with-history/header/index.tsx | 8 +- .../header/mobile-operation-dropdown.tsx | 2 +- .../base/chat/chat-with-history/index.tsx | 4 +- .../chat-with-history/inputs-form/content.tsx | 2 +- .../chat-with-history/inputs-form/index.tsx | 4 +- .../inputs-form/view-form-dropdown.tsx | 4 +- .../chat/chat-with-history/sidebar/index.tsx | 4 +- .../sidebar/rename-modal.tsx | 2 +- .../__tests__/workflow-process.spec.tsx | 2 +- .../human-input-content/executed-action.tsx | 2 +- .../human-input-content/field-renderer.tsx | 2 +- .../submitted-content-item.tsx | 2 +- .../submitted-field-values.tsx | 2 +- .../chat/answer/human-input-content/tips.tsx | 2 +- .../base/chat/chat/answer/index.tsx | 2 +- .../base/chat/chat/answer/operation.tsx | 2 +- .../chat/chat/answer/workflow-process.tsx | 6 +- .../base/chat/chat/chat-input-area/index.tsx | 10 +- .../base/chat/chat/citation/index.tsx | 2 +- .../base/chat/chat/citation/popup.tsx | 10 +- .../base/chat/chat/content-switch.tsx | 4 +- web/app/components/base/chat/chat/index.tsx | 2 +- .../components/base/chat/chat/question.tsx | 6 +- .../chat/embedded-chatbot/chat-wrapper.tsx | 8 +- .../chat/embedded-chatbot/header/index.tsx | 18 +- .../base/chat/embedded-chatbot/index.tsx | 2 +- .../embedded-chatbot/inputs-form/content.tsx | 2 +- .../embedded-chatbot/inputs-form/index.tsx | 4 +- .../inputs-form/view-form-dropdown.tsx | 4 +- web/app/components/base/chip/index.tsx | 2 +- .../components/base/corner-label/index.tsx | 2 +- .../common/option-list.tsx | 2 +- .../date-picker/footer.tsx | 2 +- .../date-picker/header.tsx | 4 +- .../date-picker/index.tsx | 4 +- .../date-and-time-picker/index.stories.tsx | 2 +- .../time-picker/index.tsx | 4 +- web/app/components/base/effect/index.tsx | 2 +- .../base/emoji-picker/Inner.stories.tsx | 2 +- .../components/base/emoji-picker/Inner.tsx | 2 +- .../base/emoji-picker/index.stories.tsx | 2 +- .../components/base/emoji-picker/index.tsx | 2 +- .../components/base/error-boundary/index.tsx | 2 +- .../base/features/index.stories.tsx | 2 +- .../annotation-reply/config-param-modal.tsx | 2 +- .../annotation-reply/index.tsx | 6 +- .../annotation-reply/score-slider/index.tsx | 6 +- .../conversation-opener/modal.tsx | 6 +- .../feature-panel-drawer.tsx | 6 +- .../new-feature-panel/file-upload/index.tsx | 2 +- .../file-upload/setting-modal.tsx | 2 +- .../follow-up-setting-modal.tsx | 2 +- .../new-feature-panel/image-upload/index.tsx | 2 +- .../new-feature-panel/moderation/index.tsx | 2 +- .../moderation/moderation-setting-modal.tsx | 14 +- .../text-to-speech/index.tsx | 4 +- .../text-to-speech/voice-settings.tsx | 2 +- .../file-from-link-or-local/index.tsx | 6 +- .../file-image-item.tsx | 2 +- .../file-uploader-in-chat-input/file-item.tsx | 2 +- .../index.stories.tsx | 2 +- .../float-right-container/index.stories.tsx | 2 +- .../base/form/components/base/base-field.tsx | 6 +- .../field/input-type-select/trigger.tsx | 2 +- .../base/form/components/field/select.tsx | 2 +- .../base/image-uploader/image-link-input.tsx | 2 +- .../image-uploader/image-list.stories.tsx | 2 +- .../base/image-uploader/image-list.tsx | 2 +- web/app/components/base/infotip/index.tsx | 2 +- .../base/inline-delete-confirm/index.tsx | 2 +- .../components/base/input-with-copy/index.tsx | 2 +- web/app/components/base/input/index.tsx | 8 +- web/app/components/base/logo/dify-logo.tsx | 2 +- web/app/components/base/mermaid/index.tsx | 6 +- .../base/message-log-modal/index.stories.tsx | 2 +- .../base/message-log-modal/index.tsx | 2 +- .../base/notion-page-selector/base.tsx | 2 +- .../credential-selector/index.tsx | 2 +- .../page-selector/index.tsx | 2 +- .../page-selector/page-row.tsx | 4 +- .../page-selector/virtual-page-list.tsx | 2 +- .../search-input/index.tsx | 6 +- web/app/components/base/page-unavailable.tsx | 2 +- .../components/base/premium-badge/index.tsx | 2 +- .../base/prompt-editor/index.stories.tsx | 12 +- .../plugins/agent-output-block/component.tsx | 4 +- .../plugins/component-picker-block/hooks.tsx | 8 +- .../plugins/component-picker-block/index.tsx | 2 +- .../plugins/context-block/component.tsx | 14 +- .../plugins/current-block/component.tsx | 4 +- .../plugins/draggable-plugin/index.tsx | 4 +- .../plugins/error-message-block/component.tsx | 4 +- .../plugins/history-block/component.tsx | 8 +- .../__tests__/input-field.spec.tsx | 2 +- .../plugins/hitl-input-block/component-ui.tsx | 4 +- .../plugins/hitl-input-block/input-field.tsx | 4 +- .../plugins/hitl-input-block/pre-populate.tsx | 8 +- .../plugins/last-run-block/component.tsx | 4 +- .../plugins/query-block/component.tsx | 2 +- .../plugins/request-url-block/component.tsx | 2 +- .../roster-reference-block/component.tsx | 4 +- .../components/base/prompt-log-modal/card.tsx | 2 +- .../base/prompt-log-modal/index.stories.tsx | 2 +- .../base/prompt-log-modal/index.tsx | 2 +- web/app/components/base/qrcode/index.tsx | 2 +- web/app/components/base/radio-card/index.tsx | 2 +- .../base/search-input/index.stories.tsx | 2 +- web/app/components/base/sort/index.tsx | 2 +- .../components/base/tab-slider-new/index.tsx | 2 +- web/app/components/base/tag-input/index.tsx | 6 +- web/app/components/base/theme-selector.tsx | 2 +- web/app/components/base/theme-switcher.tsx | 4 +- .../components/base/upgrade-modal/index.tsx | 2 +- .../base/user-avatar-list/index.tsx | 2 +- .../base/voice-input/index.stories.tsx | 8 +- web/app/components/base/voice-input/index.tsx | 4 +- .../billing/annotation-full/index.tsx | 2 +- .../billing/annotation-full/modal.tsx | 2 +- web/app/components/billing/pricing/header.tsx | 8 +- .../pricing/plans/cloud-plan-item/index.tsx | 2 +- .../cloud-plan-item/list/item/tooltip.tsx | 2 +- .../plans/self-hosted-plan-item/button.tsx | 2 +- .../plans/self-hosted-plan-item/index.tsx | 2 +- .../self-hosted-plan-item/list/index.tsx | 2 +- .../billing/priority-label/index.tsx | 2 +- .../components/billing/upgrade-btn/index.tsx | 2 +- .../billing/vector-space-full/index.tsx | 2 +- .../components/custom/custom-page/index.tsx | 4 +- .../components/chat-preview-card.tsx | 20 +- .../components/workflow-preview-card.tsx | 2 +- web/app/components/datasets/chunk.tsx | 10 +- .../preview-document-picker.spec.tsx | 2 +- .../datasets/common/document-picker/index.tsx | 8 +- .../preview-document-picker.tsx | 8 +- .../status-with-action.tsx | 2 +- .../image-uploader-in-chunk/image-item.tsx | 5 +- .../dsl-confirm-modal.tsx | 2 +- .../create-from-dsl-modal/header.tsx | 2 +- .../create-from-dsl-modal/index.tsx | 2 +- .../create-from-dsl-modal/uploader.tsx | 2 +- .../datasets/create-from-pipeline/index.tsx | 2 +- .../list/__tests__/create-card.spec.tsx | 2 +- .../create-from-pipeline/list/create-card.tsx | 2 +- .../create-from-pipeline/list/index.tsx | 2 +- .../template-card/__tests__/index.spec.tsx | 2 +- .../details/__tests__/index.spec.tsx | 2 +- .../list/template-card/details/index.tsx | 2 +- .../list/template-card/index.tsx | 4 +- .../indexing-progress-item.tsx | 6 +- .../empty-dataset-creation-modal/index.tsx | 2 +- .../file-uploader/__tests__/index.spec.tsx | 2 +- .../components/file-list-item.tsx | 2 +- .../components/upload-dropzone.tsx | 2 +- .../datasets/create/file-uploader/index.tsx | 4 +- .../step-one/components/next-step-button.tsx | 4 +- .../datasets/create/step-one/index.tsx | 16 +- .../datasets/create/step-three/index.tsx | 8 +- .../components/__tests__/inputs.spec.tsx | 4 +- .../components/indexing-mode-section.tsx | 4 +- .../create/step-two/components/inputs.tsx | 2 +- .../components/parent-child-options.tsx | 2 +- .../step-two/components/preview-panel.tsx | 4 +- .../datasets/create/top-bar/index.tsx | 2 +- .../create/website/base/crawled-result.tsx | 2 +- .../datasets/create/website/base/crawling.tsx | 4 +- .../datasets/create/website/base/field.tsx | 4 +- .../create/website/base/options-wrap.tsx | 4 +- .../create/website/firecrawl/index.tsx | 2 +- .../create/website/jina-reader/index.tsx | 2 +- .../datasets/create/website/no-data.tsx | 2 +- .../create/website/watercrawl/index.tsx | 2 +- .../components/document-table-row.tsx | 2 +- .../documents/components/documents-header.tsx | 2 +- .../datasets/documents/components/list.tsx | 4 +- .../documents/components/operations.tsx | 2 +- .../documents/components/rename-modal.tsx | 2 +- .../create-from-pipeline/actions/index.tsx | 2 +- .../base/credential-selector/list.tsx | 2 +- .../data-source/online-documents/index.tsx | 2 +- .../online-documents/page-selector/index.tsx | 2 +- .../data-source/online-documents/title.tsx | 2 +- .../file-list/header/breadcrumbs/bucket.tsx | 2 +- .../file-list/header/breadcrumbs/drive.tsx | 2 +- .../header/breadcrumbs/dropdown/menu.tsx | 2 +- .../file-list/header/breadcrumbs/index.tsx | 4 +- .../file-list/header/breadcrumbs/item.tsx | 2 +- .../online-drive/file-list/index.tsx | 2 +- .../file-list/list/empty-search-result.tsx | 2 +- .../online-drive/file-list/list/file-icon.tsx | 6 +- .../online-drive/file-list/list/item.tsx | 2 +- .../base/__tests__/index.spec.tsx | 2 +- .../website-crawl/base/crawling.tsx | 4 +- .../documents/create-from-pipeline/index.tsx | 2 +- .../create-from-pipeline/left-header.tsx | 2 +- .../preview/chunk-preview.tsx | 2 +- .../preview/file-preview.tsx | 2 +- .../preview/online-document-preview.tsx | 2 +- .../preview/web-preview.tsx | 2 +- .../processing/embedding-process/index.tsx | 6 +- .../create-from-pipeline/processing/index.tsx | 6 +- .../detail/batch-modal/csv-downloader.tsx | 4 +- .../documents/detail/batch-modal/index.tsx | 6 +- .../detail/completed/child-segment-list.tsx | 2 +- .../completed/common/full-screen-drawer.tsx | 2 +- .../detail/completed/common/keywords.tsx | 2 +- .../completed/common/regeneration-modal.tsx | 2 +- .../detail/completed/components/menu-bar.tsx | 2 +- .../completed/segment-card/chunk-content.tsx | 8 +- .../skeleton/full-doc-list-skeleton.tsx | 2 +- .../skeleton/general-list-skeleton.tsx | 4 +- .../skeleton/paragraph-list-skeleton.tsx | 2 +- .../skeleton/parent-chunk-card-skeleton.tsx | 2 +- .../embedding/components/status-header.tsx | 4 +- .../detail/embedding/skeleton/index.tsx | 4 +- .../datasets/documents/detail/index.tsx | 4 +- .../detail/metadata/components/field-info.tsx | 2 +- .../documents/detail/segment-add/index.tsx | 5 +- .../settings/pipeline-settings/index.tsx | 2 +- .../pipeline-settings/left-header.tsx | 2 +- .../external-api/external-api-modal/index.tsx | 4 +- .../external-api/external-api-panel/index.tsx | 2 +- .../create/InfoPanel.tsx | 4 +- .../create/RetrievalSettings.tsx | 5 +- .../external-knowledge-base/create/index.tsx | 8 +- .../datasets/extra-info/api-access/card.tsx | 4 +- .../datasets/extra-info/service-api/card.tsx | 6 +- .../datasets/extra-info/statistics.tsx | 4 +- .../components/child-chunks-item.tsx | 2 +- .../components/chunk-detail-modal.tsx | 8 +- .../components/query-input/index.tsx | 4 +- .../hit-testing/components/records.tsx | 4 +- .../components/result-item-external.tsx | 2 +- .../hit-testing/components/result-item.tsx | 2 +- .../datasets/hit-testing/components/score.tsx | 4 +- .../components/datasets/hit-testing/index.tsx | 2 +- .../modify-external-retrieval-modal.tsx | 6 +- .../hit-testing/modify-retrieval-modal.tsx | 2 +- .../datasets/list/first-empty-state/index.tsx | 6 +- web/app/components/datasets/list/header.tsx | 4 +- .../edit-metadata-batch/edited-beacon.tsx | 2 +- .../metadata/edit-metadata-batch/label.tsx | 2 +- .../metadata/edit-metadata-batch/modal.tsx | 6 +- .../metadata-dataset/create-content.tsx | 2 +- .../dataset-metadata-drawer.tsx | 4 +- .../metadata/metadata-document/field.tsx | 4 +- .../metadata/metadata-document/index.tsx | 2 +- .../datasets/no-linked-apps-panel.tsx | 2 +- .../datasets/rename-modal/index.tsx | 8 +- .../settings/chunk-structure/hooks.tsx | 6 +- .../form/components/indexing-section.tsx | 4 +- .../datasets/settings/form/index.tsx | 4 +- .../datasets/settings/index-method/index.tsx | 4 +- .../settings/index-method/keyword-number.tsx | 4 +- .../datasets/settings/option-card.tsx | 6 +- .../settings/permission-selector/index.tsx | 6 +- .../permission-selector/member-item.tsx | 4 +- .../settings/summary-index-setting.tsx | 6 +- web/app/components/develop/ApiServer.tsx | 4 +- web/app/components/develop/doc.tsx | 2 +- .../__tests__/secret-key-button.spec.tsx | 2 +- .../develop/secret-key/secret-key-button.tsx | 2 +- .../secret-key/secret-key-generate.tsx | 2 +- .../develop/secret-key/secret-key-modal.tsx | 10 +- web/app/components/develop/toc-panel.tsx | 4 +- .../explore/app-list/loading-skeletons.tsx | 8 +- .../explore/banner/indicator-button.tsx | 4 +- web/app/components/explore/sidebar/index.tsx | 2 +- .../explore/sidebar/no-apps/index.tsx | 2 +- .../explore/try-app/app-info/index.tsx | 4 +- .../components/explore/try-app/app/chat.tsx | 4 +- .../explore/try-app/app/text-generation.tsx | 6 +- web/app/components/explore/try-app/index.tsx | 4 +- .../try-app/preview/basic-app-preview.tsx | 2 +- .../goto-anything/actions/knowledge.tsx | 4 +- .../goto-anything/components/footer.tsx | 2 +- web/app/components/goto-anything/index.tsx | 6 +- .../components/header/account-about/index.tsx | 2 +- .../header/account-dropdown/compliance.tsx | 6 +- .../account-dropdown/default-menu-content.tsx | 2 +- .../main-nav-menu-content.tsx | 2 +- .../api-based-extension-page/index.tsx | 2 +- .../api-based-extension-page/selector.tsx | 6 +- .../header/account-setting/collapse/index.tsx | 2 +- .../install-from-marketplace.spec.tsx | 2 +- .../data-source-page-new/configure.tsx | 2 +- .../data-source-page-new/index.tsx | 2 +- .../install-from-marketplace.tsx | 2 +- .../header/account-setting/index.tsx | 10 +- .../members-page/invited-modal/index.tsx | 6 +- .../invited-modal/invitation-link.tsx | 2 +- .../permission-role-chip.tsx | 4 +- .../transfer-ownership-modal/index.tsx | 2 +- .../member-selector.tsx | 2 +- .../install-from-marketplace.spec.tsx | 2 +- .../model-provider-page/index.tsx | 2 +- .../install-from-marketplace.tsx | 4 +- .../model-auth/add-custom-model.tsx | 2 +- .../model-auth/authorized/index.tsx | 8 +- .../model-auth/config-model.tsx | 2 +- .../model-auth/credential-selector.tsx | 2 +- .../model-provider-page/model-badge/index.tsx | 2 +- .../model-provider-page/model-modal/Input.tsx | 2 +- .../model-provider-page/model-modal/index.tsx | 4 +- .../configuration-button.tsx | 4 +- .../model-parameter-modal/index.tsx | 8 +- .../model-parameter-modal/model-display.tsx | 4 +- .../model-parameter-modal/parameter-item.tsx | 20 +- .../presets-parameter.tsx | 6 +- .../status-indicators.tsx | 4 +- .../model-selector/__tests__/index.spec.tsx | 5 +- .../model-selector/index.tsx | 2 +- .../model-selector/popup-empty-state.tsx | 2 +- .../provider-added-card/index.tsx | 2 +- .../model-load-balancing-configs.tsx | 4 +- .../model-load-balancing-modal.tsx | 6 +- .../provider-added-card/quota-panel.tsx | 2 +- .../provider-added-card/system-quota-card.tsx | 2 +- .../provider-icon/index.tsx | 6 +- .../system-model-selector/index.tsx | 8 +- .../permissions-page/index.tsx | 2 +- .../update-setting-dialog-form.tsx | 2 +- .../account-setting/update-setting-dialog.tsx | 12 +- .../workflow-log-archives-page/index.tsx | 10 +- web/app/components/header/env-nav/index.tsx | 2 +- web/app/components/header/header-wrapper.tsx | 2 +- .../components/header/maintenance-notice.tsx | 4 +- .../components/header/plan-badge/index.tsx | 2 +- web/app/components/integrations/page.tsx | 2 +- .../integrations/permission-quick-panel.tsx | 2 +- .../integrations/tool-provider-card.tsx | 6 +- .../integrations/tool-provider-list.tsx | 4 +- .../integrations/tool-provider-toolbar.tsx | 4 +- .../main-nav/__tests__/index.spec.tsx | 2 +- .../main-nav/components/account-section.tsx | 2 +- .../main-nav/components/help-menu.tsx | 2 +- .../main-nav/components/workspace-card.tsx | 2 +- web/app/components/main-nav/index.tsx | 4 +- .../plugins/card/base/corner-mark.tsx | 2 +- .../plugins/card/base/placeholder.tsx | 8 +- .../plugins/card/card-more-info.tsx | 9 +- web/app/components/plugins/card/index.tsx | 2 +- .../plugins/install-plugin/base/installed.tsx | 2 +- .../install-plugin/base/loading-error.tsx | 4 +- .../install-plugin/install-bundle/index.tsx | 4 +- .../install-bundle/steps/install.tsx | 4 +- .../install-bundle/steps/installed.tsx | 2 +- .../install-from-github/index.tsx | 4 +- .../install-from-github/steps/loaded.tsx | 4 +- .../steps/selectPackage.tsx | 9 +- .../install-from-local-package/index.tsx | 4 +- .../steps/install.tsx | 4 +- .../steps/uploading.tsx | 4 +- .../install-from-marketplace/index.tsx | 4 +- .../steps/install.tsx | 4 +- .../plugins/marketplace/description/index.tsx | 6 +- .../plugins/marketplace/empty/index.tsx | 2 +- .../__tests__/list-with-collection.spec.tsx | 2 +- .../plugins/marketplace/list/card-wrapper.tsx | 2 +- .../plugins/marketplace/list/carousel.tsx | 4 +- .../marketplace/list/list-with-collection.tsx | 2 +- .../marketplace/search-box/tags-filter.tsx | 4 +- .../plugin-auth/authorize/api-key-modal.tsx | 2 +- .../authorize/oauth-client-settings.tsx | 2 +- .../plugins/plugin-auth/authorized/index.tsx | 2 +- .../__tests__/endpoint-modal.spec.tsx | 2 +- .../__tests__/strategy-detail.spec.tsx | 2 +- .../app-selector/app-inputs-panel.tsx | 6 +- .../app-selector/index.tsx | 2 +- .../plugin-detail-panel/endpoint-modal.tsx | 2 +- .../plugins/plugin-detail-panel/index.tsx | 2 +- .../model-selector/index.tsx | 6 +- .../operation-dropdown.tsx | 2 +- .../plugin-detail-panel/strategy-detail.tsx | 2 +- .../subscription-list/create/common-modal.tsx | 6 +- .../subscription-list/create/oauth-client.tsx | 5 +- .../subscription-list/log-viewer.tsx | 2 +- .../subscription-list/selector-view.tsx | 2 +- .../components/reasoning-config-form.tsx | 2 +- .../tool-selector/components/schema-modal.tsx | 6 +- .../tool-selector/index.tsx | 4 +- .../__tests__/event-detail-drawer.spec.tsx | 2 +- .../trigger/event-detail-drawer.tsx | 4 +- .../components/plugins/plugin-item/index.tsx | 2 +- .../plugins/plugin-mutation-model/index.tsx | 2 +- .../plugin-page/__tests__/debug-info.spec.tsx | 2 +- .../plugins/plugin-page/empty/index.tsx | 2 +- .../filter-management/category-filter.tsx | 4 +- .../filter-management/tag-filter.tsx | 4 +- .../components/plugins/plugin-page/index.tsx | 2 +- .../plugin-page/install-plugin-dropdown.tsx | 2 +- .../plugins/plugin-page/plugin-info.tsx | 2 +- .../plugin-page/plugin-sidecar-panel.tsx | 2 +- .../components/error-plugin-item.tsx | 2 +- .../plugin-tasks/components/plugin-item.tsx | 4 +- .../components/plugin-task-list.tsx | 4 +- .../auto-update-setting/index.tsx | 2 +- .../auto-update-setting/strategy-picker.tsx | 2 +- .../auto-update-setting/tool-picker.tsx | 8 +- .../update-plugin/from-market-place.tsx | 2 +- .../update-plugin/plugin-version-picker.tsx | 2 +- .../__tests__/publish-toast.spec.tsx | 4 +- .../rag-pipeline/components/conversion.tsx | 4 +- .../panel/input-field/editor/index.tsx | 2 +- .../input-field/field-list/field-item.tsx | 2 +- .../components/panel/input-field/index.tsx | 4 +- .../components/panel/test-run/index.tsx | 2 +- .../publish-as-knowledge-pipeline-modal.tsx | 2 +- .../rag-pipeline/components/publish-toast.tsx | 4 +- .../publisher/__tests__/index.spec.tsx | 4 +- .../rag-pipeline-header/publisher/popup.tsx | 2 +- .../components/update-dsl-modal.tsx | 8 +- .../components/version-mismatch-modal.tsx | 2 +- .../share/text-generation/menu-dropdown.tsx | 2 +- .../share/text-generation/result/index.tsx | 4 +- .../run-batch/csv-download/index.tsx | 4 +- .../share/text-generation/run-once/index.tsx | 4 +- .../text-generation-result-panel.tsx | 2 +- .../text-generation-sidebar.tsx | 4 +- .../snippets/components/snippet-run-panel.tsx | 16 +- .../step-by-step-tour/coachmark.tsx | 4 +- .../step-by-step-tour/floating-widget.tsx | 12 +- .../components/step-by-step-tour/mount.tsx | 6 +- .../get-schema.tsx | 2 +- .../edit-custom-collection-modal/index.tsx | 12 +- .../edit-custom-collection-modal/test-api.tsx | 2 +- web/app/components/tools/labels/filter.tsx | 4 +- web/app/components/tools/labels/selector.tsx | 8 +- .../components/tools/marketplace/index.tsx | 4 +- .../tools/mcp/detail/list-loading.tsx | 10 +- .../tools/mcp/detail/provider-detail.tsx | 2 +- .../components/tools/mcp/mcp-server-modal.tsx | 4 +- .../components/tools/mcp/mcp-service-card.tsx | 2 +- web/app/components/tools/mcp/modal.tsx | 2 +- .../__tests__/custom-create-card.spec.tsx | 2 +- .../tools/provider/__tests__/detail.spec.tsx | 2 +- .../tools/provider/create-entry-card.tsx | 4 +- web/app/components/tools/provider/detail.tsx | 4 +- web/app/components/tools/provider/empty.tsx | 12 +- .../tools/provider/tool-card-skeleton.tsx | 6 +- .../components/tools/tool-provider-grid.tsx | 2 +- .../tools/workflow-tool/configure-button.tsx | 13 +- .../workflow-tool/confirm-modal/index.tsx | 7 +- .../components/tools/workflow-tool/index.tsx | 38 +-- .../tools/workflow-tool/method-selector.tsx | 12 +- .../workflow-onboarding-modal/index.tsx | 2 +- .../start-node-option.tsx | 4 +- .../block-selector/all-start-blocks.tsx | 6 +- .../workflow/block-selector/blocks.tsx | 6 +- .../workflow/block-selector/data-sources.tsx | 4 +- .../block-selector/featured-tools.tsx | 2 +- .../block-selector/featured-triggers.tsx | 2 +- .../block-selector/tool/action-item.tsx | 4 +- .../tool/tool-list-tree-view/item.tsx | 2 +- .../workflow/block-selector/tool/tool.tsx | 2 +- .../trigger-plugin/action-item.tsx | 4 +- .../block-selector/trigger-plugin/item.tsx | 6 +- .../collaboration/components/user-cursors.tsx | 2 +- .../workflow/comment/comment-icon.tsx | 2 +- .../workflow/comment/comment-input.tsx | 8 +- .../workflow/comment/mention-input.tsx | 2 +- .../components/workflow/comment/thread.tsx | 6 +- .../workflow/header/checklist/index.tsx | 4 +- .../workflow/header/editing-title.tsx | 2 +- .../workflow/header/online-users.tsx | 8 +- .../workflow/header/running-title.tsx | 4 +- .../workflow/header/view-history.tsx | 8 +- .../workflow/header/view-workflow-history.tsx | 20 +- web/app/components/workflow/index.tsx | 2 +- .../workflow/node-actions-menu/shared.tsx | 6 +- .../_base/components/add-variable-popup.tsx | 4 +- .../nodes/_base/components/agent-strategy.tsx | 2 +- .../components/before-run-form/form-item.tsx | 6 +- .../code-editor/editor-support-vars.tsx | 2 +- .../components/editor/code-editor/index.tsx | 2 +- .../_base/components/editor/text-editor.tsx | 2 +- .../_base/components/entry-node-container.tsx | 2 +- .../error-handle/error-handle-on-node.tsx | 2 +- .../error-handle/error-handle-tip.tsx | 2 +- .../workflow/nodes/_base/components/field.tsx | 2 +- .../nodes/_base/components/info-panel.tsx | 2 +- .../components/input-support-select-var.tsx | 4 +- .../_base/components/layout/field-title.tsx | 2 +- .../components/list-no-data-placeholder.tsx | 2 +- .../nodes/_base/components/memory-config.tsx | 4 +- .../_base/components/next-step/operator.tsx | 2 +- .../nodes/_base/components/output-vars.tsx | 4 +- .../nodes/_base/components/prompt/editor.tsx | 18 +- .../readonly-input-with-select-var.tsx | 4 +- .../_base/components/retry/retry-on-node.tsx | 2 +- .../_base/components/retry/retry-on-panel.tsx | 4 +- .../nodes/_base/components/selector.tsx | 6 +- .../nodes/_base/components/setting-item.tsx | 2 +- .../components/title-description-input.tsx | 4 +- .../object-child-tree-panel/picker/index.tsx | 4 +- .../object-child-tree-panel/show/field.tsx | 8 +- .../object-child-tree-panel/show/index.tsx | 2 +- .../variable/var-full-path-panel.tsx | 2 +- .../variable/var-reference-vars.tsx | 10 +- .../components/variable/var-type-picker.tsx | 4 +- .../base/variable-node-label.tsx | 5 +- .../variable-label-in-editor.tsx | 2 +- .../variable-label/variable-label-in-text.tsx | 2 +- .../_base/components/workflow-panel/index.tsx | 2 +- .../workflow/nodes/_base/node-sections.tsx | 4 +- .../components/workflow/nodes/_base/node.tsx | 4 +- .../components/agent-roster-field.tsx | 2 +- .../workflow/nodes/agent-v2/panel.tsx | 2 +- .../components/operation-selector.tsx | 2 +- .../workflow/nodes/assigner/node.tsx | 2 +- .../nodes/data-source-empty/index.tsx | 4 +- .../nodes/http/components/api-input.tsx | 4 +- .../http/components/authorization/index.tsx | 2 +- .../nodes/http/components/curl-panel.tsx | 6 +- .../nodes/http/components/edit-body/index.tsx | 2 +- .../key-value/key-value-edit/index.tsx | 4 +- .../key-value/key-value-edit/input-item.tsx | 4 +- .../key-value/key-value-edit/item.tsx | 7 +- .../nodes/http/components/timeout/index.tsx | 2 +- .../components/button-style-dropdown.tsx | 10 +- .../delivery-method/email-configure-modal.tsx | 6 +- .../delivery-method/mail-body-input.tsx | 2 +- .../delivery-method/method-selector.tsx | 14 +- .../delivery-method/recipient/email-input.tsx | 2 +- .../delivery-method/recipient/email-item.tsx | 5 +- .../delivery-method/recipient/index.tsx | 2 +- .../delivery-method/recipient/member-list.tsx | 2 +- .../delivery-method/test-email-sender.tsx | 4 +- .../delivery-method/upgrade-modal.tsx | 6 +- .../components/form-content-preview.tsx | 4 +- .../human-input/components/form-content.tsx | 6 +- .../workflow/nodes/human-input/panel.tsx | 2 +- .../if-else/components/condition-add.tsx | 2 +- .../components/condition-files-list-value.tsx | 4 +- .../condition-list/condition-item.tsx | 6 +- .../condition-list/condition-var-selector.tsx | 2 +- .../components/condition-list/index.tsx | 14 +- .../components/condition-number-input.tsx | 4 +- .../if-else/components/condition-wrap.tsx | 8 +- .../workflow/nodes/if-else/node.tsx | 4 +- .../workflow/nodes/if-else/panel.tsx | 2 +- .../workflow/nodes/iteration-start/index.tsx | 2 +- .../workflow/nodes/iteration/node.tsx | 2 +- .../workflow/nodes/iteration/panel.tsx | 10 +- .../components/chunk-structure/hooks.tsx | 6 +- .../chunk-structure/instruction/index.tsx | 8 +- .../components/chunk-structure/selector.tsx | 2 +- .../components/index-method.tsx | 4 +- .../knowledge-base/components/option-card.tsx | 6 +- .../workflow/nodes/knowledge-base/node.tsx | 2 +- .../components/dataset-item.tsx | 2 +- .../condition-common-variable-selector.tsx | 6 +- .../condition-list/condition-value-method.tsx | 2 +- .../condition-variable-selector.tsx | 4 +- .../metadata/condition-list/index.tsx | 10 +- .../components/metadata/metadata-panel.tsx | 2 +- .../components/retrieval-config.tsx | 2 +- .../nodes/knowledge-retrieval/node.tsx | 2 +- .../components/extract-input.tsx | 2 +- .../components/filter-condition.tsx | 4 +- .../components/sub-variable-picker.tsx | 2 +- .../llm/components/config-prompt-item.tsx | 2 +- .../nodes/llm/components/config-prompt.tsx | 2 +- .../json-schema-config-modal/index.tsx | 2 +- .../json-importer.tsx | 2 +- .../json-schema-config.tsx | 2 +- .../generated-result.tsx | 4 +- .../json-schema-generator/prompt-editor.tsx | 4 +- .../schema-editor.tsx | 2 +- .../visual-editor/add-field.tsx | 2 +- .../llm/components/panel-memory-section.tsx | 4 +- .../llm/components/panel-output-section.tsx | 2 +- .../nodes/llm/components/structure-output.tsx | 2 +- .../components/workflow/nodes/llm/panel.tsx | 2 +- .../workflow/nodes/loop-start/index.tsx | 2 +- .../nodes/loop/components/condition-add.tsx | 2 +- .../condition-list/condition-item.tsx | 6 +- .../condition-list/condition-var-selector.tsx | 2 +- .../loop/components/condition-list/index.tsx | 14 +- .../components/condition-number-input.tsx | 4 +- .../nodes/loop/components/condition-wrap.tsx | 6 +- .../components/workflow/nodes/loop/node.tsx | 2 +- .../components/extract-parameter/item.tsx | 4 +- .../components/extract-parameter/update.tsx | 8 +- .../components/class-list.tsx | 2 +- .../nodes/question-classifier/node.tsx | 2 +- .../workflow/nodes/start-placeholder/node.tsx | 2 +- .../nodes/start/components/var-item.tsx | 4 +- .../nodes/start/components/var-list.tsx | 2 +- .../nodes/template-transform/panel.tsx | 2 +- .../components/workflow/nodes/tool/node.tsx | 4 +- .../components/workflow/nodes/tool/panel.tsx | 2 +- .../components/next-execution-times.tsx | 2 +- .../workflow/nodes/trigger-schedule/node.tsx | 4 +- .../components/generic-table.tsx | 2 +- .../components/paragraph-input.tsx | 4 +- .../workflow/nodes/trigger-webhook/node.tsx | 4 +- .../workflow/nodes/trigger-webhook/panel.tsx | 6 +- .../utils/render-output-vars.tsx | 2 +- .../components/node-group-item.tsx | 4 +- .../components/var-group-item.tsx | 2 +- .../components/workflow/note-node/index.tsx | 2 +- .../plugins/link-editor-plugin/component.tsx | 4 +- .../toolbar/font-size-selector.tsx | 2 +- .../note-editor/toolbar/operator.tsx | 2 +- .../operator/__tests__/zoom-in-out.spec.tsx | 2 +- .../components/workflow/operator/index.tsx | 2 +- .../workflow/operator/zoom-in-out.tsx | 6 +- .../workflow/panel/chat-record/index.tsx | 2 +- .../workflow/panel/chat-record/user-input.tsx | 2 +- .../components/object-value-item.tsx | 6 +- .../components/object-value-list.tsx | 6 +- .../components/variable-modal.tsx | 6 +- .../components/variable-type-select.tsx | 2 +- .../panel/chat-variable-panel/index.tsx | 6 +- .../workflow/panel/comments-panel/index.tsx | 4 +- .../conversation-variable-modal.tsx | 4 +- .../panel/debug-and-preview/index.tsx | 2 +- .../workflow/panel/env-panel/env-item.tsx | 2 +- .../workflow/panel/env-panel/index.tsx | 2 +- .../panel/env-panel/variable-modal.tsx | 8 +- .../panel/global-variable-panel/index.tsx | 2 +- web/app/components/workflow/panel/record.tsx | 2 +- .../version-history-panel/filter/index.tsx | 2 +- .../panel/version-history-panel/index.tsx | 2 +- .../version-history-panel/loading/item.tsx | 2 +- .../version-history-item.tsx | 4 +- .../workflow/panel/workflow-preview.tsx | 10 +- .../workflow/run/agent-log/agent-log-nav.tsx | 6 +- web/app/components/workflow/run/meta.tsx | 22 +- web/app/components/workflow/run/node.tsx | 2 +- .../components/workflow/run/output-panel.tsx | 2 +- .../components/workflow/run/result-text.tsx | 4 +- .../workflow/run/status-container.tsx | 2 +- web/app/components/workflow/run/status.tsx | 9 +- .../components/workflow/run/tracing-panel.tsx | 2 +- .../components/workflow/simple-node/index.tsx | 2 +- .../components/workflow/update-dsl-modal.tsx | 10 +- .../variable-inspect/display-content.tsx | 2 +- .../workflow/variable-inspect/listening.tsx | 2 +- .../workflow/variable-inspect/panel.tsx | 2 +- .../workflow/variable-inspect/right.tsx | 2 +- .../value-content-sections.tsx | 8 +- .../variable-inspect/value-content.tsx | 2 +- .../workflow-generator/example-prompts.tsx | 2 +- .../workflow/workflow-generator/index.tsx | 8 +- .../components/__tests__/zoom-in-out.spec.tsx | 2 +- .../components/error-handle-on-node.tsx | 2 +- .../components/nodes/base.tsx | 2 +- .../components/nodes/if-else/node.tsx | 4 +- .../components/nodes/iteration/node.tsx | 2 +- .../components/nodes/loop/node.tsx | 2 +- .../components/zoom-in-out.tsx | 6 +- .../workflow/workflow-preview/index.tsx | 2 +- web/app/device/layout.tsx | 6 +- web/app/device/page.tsx | 20 +- .../applied-education-content.tsx | 2 +- .../education-apply/education-apply-page.tsx | 10 +- .../education-apply/expire-notice-modal.tsx | 2 +- web/app/education-apply/search-input.tsx | 2 +- web/app/education-apply/user-info.tsx | 4 +- .../forgot-password/ChangePasswordForm.tsx | 12 +- web/app/reset-password/layout.tsx | 4 +- web/app/reset-password/set-password/page.tsx | 10 +- web/app/signin/_locale-menu.tsx | 2 +- web/app/signin/invite-settings/page.tsx | 2 +- web/app/signin/layout.tsx | 6 +- web/app/signin/normal-form.tsx | 6 +- web/app/signin/split.tsx | 2 +- web/app/signup/layout.tsx | 6 +- web/app/signup/set-password/page.tsx | 8 +- web/docs/lint.md | 2 + .../access/components/agent-api-key-modal.tsx | 14 +- .../components/workflow-references-table.tsx | 6 +- .../advanced/content-moderation.tsx | 2 +- .../components/orchestrate/bottom-actions.tsx | 8 +- .../orchestrate/build-draft-bar.tsx | 4 +- .../orchestrate/build-draft-change-dot.tsx | 2 +- .../orchestrate/build-draft-changes-panel.tsx | 4 +- .../components/orchestrate/files/index.tsx | 2 +- .../orchestrate/files/upload-dialog.tsx | 2 +- .../components/orchestrate/header.tsx | 2 +- .../orchestrate/knowledge/dialog.tsx | 2 +- .../orchestrate/knowledge/index.tsx | 2 +- .../orchestrate/prompt-editor/index.tsx | 4 +- .../orchestrate/prompt-editor/slash.tsx | 26 +- .../publish-bar/publish-impact-details.tsx | 2 +- .../skills/__tests__/index.spec.tsx | 4 +- .../orchestrate/skills/detail-dialog.tsx | 4 +- .../orchestrate/skills/upload-dialog.tsx | 2 +- .../orchestrate/tools/cli-tool/dialog.tsx | 2 +- .../components/preview/build-chat.tsx | 2 +- .../components/preview/chat-conversation.tsx | 2 +- .../preview/versions-panel/filter.tsx | 2 +- .../preview/versions-panel/index.tsx | 2 +- .../preview/versions-panel/version-item.tsx | 2 +- .../versions-panel/version-timeline-dot.tsx | 4 +- .../preview/working-directory-breadcrumb.tsx | 2 +- .../agent-detail/monitoring/chart.tsx | 2 +- .../agent-v2/agent-detail/monitoring/page.tsx | 4 +- .../agent-v2/agent-detail/navigation.tsx | 4 +- .../roster/components/create-agent-dialog.tsx | 2 +- .../deployments/create-guide/ui/layout.tsx | 4 +- .../create-guide/ui/source-step.tsx | 2 +- .../deployments/deploy-drawer/index.tsx | 2 +- .../deployments/deployment-actions/index.tsx | 2 +- .../deployments/detail/access/index.tsx | 2 +- .../permissions/access-control-dialog.tsx | 2 +- .../access-subject-selector/add-button.tsx | 2 +- .../selection-list.tsx | 8 +- .../subject-options.tsx | 8 +- .../detail/api-tokens/docs/docs-drawer.tsx | 2 +- .../deployments/detail/api-tokens/index.tsx | 2 +- .../deployments/detail/deployment-sidebar.tsx | 4 +- .../row-actions/deployment-error-dialog.tsx | 2 +- .../release-history/release-history-rows.tsx | 2 +- .../release-history-table-skeleton.tsx | 2 +- .../list/ui/environment-filter.tsx | 4 +- .../shared/components/detail-table.tsx | 9 +- .../new-rag/__tests__/documents-page.spec.tsx | 2 +- web/features/new-rag/add-source-page.tsx | 2 +- .../create-knowledge-dialog-parts.tsx | 8 +- .../components/knowledge-space-card.tsx | 2 +- .../components/knowledge-view-switcher.tsx | 10 +- .../components/new-knowledge-list-states.tsx | 16 +- web/features/new-rag/crawl-selection-form.tsx | 2 +- .../new-rag/create-knowledge-page.tsx | 6 +- .../new-rag/document-chunk-detail.tsx | 12 +- web/features/new-rag/document-list.tsx | 4 +- .../new-rag/knowledge-space-shell.tsx | 2 +- web/features/new-rag/new-knowledge-list.tsx | 4 +- .../new-rag/processing-tasks-drawer.tsx | 6 +- web/features/new-rag/sources-page.tsx | 4 +- 874 files changed, 1860 insertions(+), 2079 deletions(-) diff --git a/lint.config.ts b/lint.config.ts index 6ee726761a9..367f6c55165 100644 --- a/lint.config.ts +++ b/lint.config.ts @@ -3,6 +3,22 @@ import path from 'node:path' const rootDir = import.meta.dirname const difyUiPackageJson = path.resolve(rootDir, 'packages/dify-ui/package.json') +const enableTailwindCanonicalClasses = process.env.TAILWIND_CANONICAL_CLASSES === 'true' +const tailwindCanonicalClassesOverride = { + files: [ + 'web/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}', + 'packages/dify-ui/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}', + ], + rules: { + 'better-tailwindcss/enforce-canonical-classes': [ + 'warn', + { + collapse: false, + logical: false, + }, + ], + }, +} satisfies NonNullable[number] /** * Oxlint equivalent of the ESLint configurations that were active before the migration. @@ -55,6 +71,7 @@ export const lintConfig = { jsPlugins: [ '@tanstack/eslint-plugin-query', 'eslint-plugin-antfu', + ...(enableTailwindCanonicalClasses ? ['eslint-plugin-better-tailwindcss'] : []), 'eslint-plugin-command', 'eslint-plugin-erasable-syntax-only', { @@ -86,6 +103,15 @@ export const lintConfig = { typeCheck: true, }, settings: { + ...(enableTailwindCanonicalClasses + ? { + 'better-tailwindcss': { + cwd: path.resolve(rootDir, 'web'), + entryPoint: 'app/styles/globals.css', + rootFontSize: 16, + }, + } + : {}), 'react-x': { additionalStateHooks: '/^use\\w*State(?:s)?|useAtom$/u', }, @@ -425,6 +451,7 @@ export const lintConfig = { 'no-undef': 'error', }, overrides: [ + ...(enableTailwindCanonicalClasses ? [tailwindCanonicalClassesOverride] : []), { files: ['**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}'], rules: { diff --git a/package.json b/package.json index fa39d23fd73..16c8d9b5ec3 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ "lint:oxlint": "vp lint", "lint:oxlint:fix": "vp lint --fix", "lint:oxlint:quiet": "vp lint --quiet", + "lint:tailwind": "TAILWIND_CANONICAL_CLASSES=true vp lint web packages/dify-ui", + "lint:tailwind:fix": "TAILWIND_CANONICAL_CLASSES=true vp lint --fix web packages/dify-ui", "lint:eslint": "eslint --concurrency=auto", "lint:eslint:fix": "eslint --fix --concurrency=auto", "lint:eslint:quiet": "eslint --quiet --concurrency=auto" @@ -27,6 +29,7 @@ "eslint": "catalog:", "eslint-markdown": "catalog:", "eslint-plugin-antfu": "catalog:", + "eslint-plugin-better-tailwindcss": "catalog:", "eslint-plugin-command": "catalog:", "eslint-plugin-erasable-syntax-only": "catalog:", "eslint-plugin-hyoban": "catalog:", diff --git a/packages/dify-ui/src/autocomplete/index.tsx b/packages/dify-ui/src/autocomplete/index.tsx index dede962654b..9127a5cbef0 100644 --- a/packages/dify-ui/src/autocomplete/index.tsx +++ b/packages/dify-ui/src/autocomplete/index.tsx @@ -119,7 +119,7 @@ const autocompleteInputVariants = cva( variants: { size: { small: 'px-2 py-1 system-xs-regular', - medium: 'px-3 py-[7px] system-sm-regular', + medium: 'px-3 py-1.75 system-sm-regular', large: 'px-4 py-2 system-md-regular', }, }, diff --git a/packages/dify-ui/src/button/index.tsx b/packages/dify-ui/src/button/index.tsx index cd8d0a8b7bb..18a812ee0ad 100644 --- a/packages/dify-ui/src/button/index.tsx +++ b/packages/dify-ui/src/button/index.tsx @@ -7,41 +7,41 @@ import { cva } from 'class-variance-authority' import { cn } from '../cn' export const buttonVariants = cva( - 'inline-flex cursor-pointer items-center justify-center whitespace-nowrap outline-hidden focus-visible:ring-2 focus-visible:ring-state-accent-solid data-[disabled]:cursor-not-allowed', + 'inline-flex cursor-pointer items-center justify-center whitespace-nowrap outline-hidden focus-visible:ring-2 focus-visible:ring-state-accent-solid data-disabled:cursor-not-allowed', { variants: { variant: { primary: [ 'border-components-button-primary-border bg-components-button-primary-bg text-components-button-primary-text shadow-sm', 'hover:border-components-button-primary-border-hover hover:bg-components-button-primary-bg-hover', - 'data-[disabled]:border-components-button-primary-border-disabled data-[disabled]:bg-components-button-primary-bg-disabled data-[disabled]:text-components-button-primary-text-disabled data-[disabled]:shadow-none', + 'data-disabled:border-components-button-primary-border-disabled data-disabled:bg-components-button-primary-bg-disabled data-disabled:text-components-button-primary-text-disabled data-disabled:shadow-none', ], secondary: [ 'border-[0.5px] shadow-xs backdrop-blur-[5px]', 'border-components-button-secondary-border bg-components-button-secondary-bg text-components-button-secondary-text', 'hover:border-components-button-secondary-border-hover hover:bg-components-button-secondary-bg-hover', - 'data-[disabled]:border-components-button-secondary-border-disabled data-[disabled]:bg-components-button-secondary-bg-disabled data-[disabled]:text-components-button-secondary-text-disabled data-[disabled]:backdrop-blur-xs', + 'data-disabled:border-components-button-secondary-border-disabled data-disabled:bg-components-button-secondary-bg-disabled data-disabled:text-components-button-secondary-text-disabled data-disabled:backdrop-blur-xs', ], 'secondary-accent': [ 'border-[0.5px] shadow-xs', 'border-components-button-secondary-border bg-components-button-secondary-bg text-components-button-secondary-accent-text', 'hover:border-components-button-secondary-border-hover hover:bg-components-button-secondary-bg-hover', - 'data-[disabled]:border-components-button-secondary-border-disabled data-[disabled]:bg-components-button-secondary-bg-disabled data-[disabled]:text-components-button-secondary-accent-text-disabled', + 'data-disabled:border-components-button-secondary-border-disabled data-disabled:bg-components-button-secondary-bg-disabled data-disabled:text-components-button-secondary-accent-text-disabled', ], tertiary: [ 'bg-components-button-tertiary-bg text-components-button-tertiary-text', 'hover:bg-components-button-tertiary-bg-hover', - 'data-[disabled]:bg-components-button-tertiary-bg-disabled data-[disabled]:text-components-button-tertiary-text-disabled', + 'data-disabled:bg-components-button-tertiary-bg-disabled data-disabled:text-components-button-tertiary-text-disabled', ], ghost: [ 'text-components-button-ghost-text', 'hover:bg-components-button-ghost-bg-hover', - 'data-[disabled]:text-components-button-ghost-text-disabled', + 'data-disabled:text-components-button-ghost-text-disabled', ], 'ghost-accent': [ 'text-components-button-secondary-accent-text', 'hover:bg-state-accent-hover', - 'data-[disabled]:text-components-button-secondary-accent-text-disabled', + 'data-disabled:text-components-button-secondary-accent-text-disabled', ], }, size: { @@ -61,7 +61,7 @@ export const buttonVariants = cva( class: [ 'border-components-button-destructive-primary-border bg-components-button-destructive-primary-bg text-components-button-destructive-primary-text', 'hover:border-components-button-destructive-primary-border-hover hover:bg-components-button-destructive-primary-bg-hover', - 'data-[disabled]:border-components-button-destructive-primary-border-disabled data-[disabled]:bg-components-button-destructive-primary-bg-disabled data-[disabled]:text-components-button-destructive-primary-text-disabled data-[disabled]:shadow-none', + 'data-disabled:border-components-button-destructive-primary-border-disabled data-disabled:bg-components-button-destructive-primary-bg-disabled data-disabled:text-components-button-destructive-primary-text-disabled data-disabled:shadow-none', ], }, { @@ -70,7 +70,7 @@ export const buttonVariants = cva( class: [ 'border-components-button-destructive-secondary-border bg-components-button-destructive-secondary-bg text-components-button-destructive-secondary-text', 'hover:border-components-button-destructive-secondary-border-hover hover:bg-components-button-destructive-secondary-bg-hover', - 'data-[disabled]:border-components-button-destructive-secondary-border-disabled data-[disabled]:bg-components-button-destructive-secondary-bg-disabled data-[disabled]:text-components-button-destructive-secondary-text-disabled', + 'data-disabled:border-components-button-destructive-secondary-border-disabled data-disabled:bg-components-button-destructive-secondary-bg-disabled data-disabled:text-components-button-destructive-secondary-text-disabled', ], }, { @@ -79,7 +79,7 @@ export const buttonVariants = cva( class: [ 'bg-components-button-destructive-tertiary-bg text-components-button-destructive-tertiary-text', 'hover:bg-components-button-destructive-tertiary-bg-hover', - 'data-[disabled]:bg-components-button-destructive-tertiary-bg-disabled data-[disabled]:text-components-button-destructive-tertiary-text-disabled', + 'data-disabled:bg-components-button-destructive-tertiary-bg-disabled data-disabled:text-components-button-destructive-tertiary-text-disabled', ], }, { @@ -88,7 +88,7 @@ export const buttonVariants = cva( class: [ 'text-components-button-destructive-ghost-text', 'hover:bg-components-button-destructive-ghost-bg-hover', - 'data-[disabled]:text-components-button-destructive-ghost-text-disabled', + 'data-disabled:text-components-button-destructive-ghost-text-disabled', ], }, ], diff --git a/packages/dify-ui/src/combobox/index.tsx b/packages/dify-ui/src/combobox/index.tsx index d25474d400e..40dc1dfb84c 100644 --- a/packages/dify-ui/src/combobox/index.tsx +++ b/packages/dify-ui/src/combobox/index.tsx @@ -166,7 +166,7 @@ const comboboxInputVariants = cva( variants: { size: { small: 'px-2 py-1 system-xs-regular', - medium: 'px-3 py-[7px] system-sm-regular', + medium: 'px-3 py-1.75 system-sm-regular', large: 'px-4 py-2 system-md-regular', }, }, diff --git a/packages/dify-ui/src/dialog/index.stories.tsx b/packages/dify-ui/src/dialog/index.stories.tsx index 725cdd01874..6ba8df0148e 100644 --- a/packages/dify-ui/src/dialog/index.stories.tsx +++ b/packages/dify-ui/src/dialog/index.stories.tsx @@ -278,7 +278,7 @@ const OutsideScrollingContentDemo = () => { }>Review long release notes - + { - + -
+
Knowledge review diff --git a/packages/dify-ui/src/drawer/index.stories.tsx b/packages/dify-ui/src/drawer/index.stories.tsx index b12cf82b4e3..093f348366f 100644 --- a/packages/dify-ui/src/drawer/index.stories.tsx +++ b/packages/dify-ui/src/drawer/index.stories.tsx @@ -247,7 +247,7 @@ export const Positions: Story = { - +
@@ -258,7 +258,7 @@ export const Positions: Story = { This drawer uses the default swipeDirection="down" bottom sheet behavior.
-
+
The drag handle sits at the top because the sheet dismisses downward.
@@ -278,9 +278,9 @@ export const Positions: Story = { - + -
+
Top sheet @@ -288,7 +288,7 @@ export const Positions: Story = { This drawer is positioned with swipeDirection="up" and dismisses upward.
-
+
The drag handle sits at the bottom because the sheet dismisses upward.
@@ -331,9 +331,9 @@ function SnapPointsDemo() { className={cn( 'relative touch-none overflow-visible', '[--bleed:3rem] [--top-margin:1rem]', - 'pb-[max(0px,calc(var(--drawer-snap-point-offset,0px)_+_var(--drawer-swipe-movement-y,0px)))]', + 'pb-[max(0px,calc(var(--drawer-snap-point-offset,0px)+var(--drawer-swipe-movement-y,0px)))]', 'after:pointer-events-none after:absolute after:inset-x-0 after:top-full after:h-(--bleed) after:bg-inherit after:content-[""]', - 'data-[swipe-direction=down]:max-h-[calc(100dvh_-_var(--top-margin))]', + 'data-[swipe-direction=down]:max-h-[calc(100dvh-var(--top-margin))]', 'data-ending-style:pb-0 data-starting-style:pb-0', )} > @@ -343,7 +343,7 @@ function SnapPointsDemo() { Snap points
- +
Drag the sheet to snap between a compact peek and a near full-height view. @@ -392,19 +392,19 @@ export const NestedDrawers: Story = {
@@ -591,7 +591,7 @@ function IndentEffectDemo() { - +
@@ -646,7 +646,7 @@ function NonModalDemo() {
- +
@@ -732,7 +732,7 @@ export const MobileNavigation: Story = { aria-label="Mobile drawer viewport" > - +