From 7f67e1a2fc1bf0123196f50b835fc2ae50a7a770 Mon Sep 17 00:00:00 2001 From: yyh <92089059+lyzno1@users.noreply.github.com> Date: Tue, 3 Mar 2026 16:56:13 +0800 Subject: [PATCH] feat(web): overlay migration guardrails + Base UI primitives (#32824) Signed-off-by: yyh Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- web/app/components/base/modal/index.tsx | 5 + web/app/components/base/modal/modal.tsx | 5 + .../base/portal-to-follow-elem/index.tsx | 16 + web/app/components/base/select/index.tsx | 7 +- web/app/components/base/tooltip/index.tsx | 7 +- web/app/components/base/ui/dialog/index.tsx | 58 + .../base/ui/dropdown-menu/index.tsx | 277 +++ web/app/components/base/ui/placement.ts | 29 + web/app/components/base/ui/popover/index.tsx | 67 + web/app/components/base/ui/select/index.tsx | 163 ++ web/app/components/base/ui/tooltip/index.tsx | 59 + .../account-dropdown/compliance.spec.tsx | 19 +- .../header/account-dropdown/compliance.tsx | 258 +-- .../header/account-dropdown/index.spec.tsx | 10 + .../header/account-dropdown/index.tsx | 369 ++-- .../account-dropdown/menu-item-content.tsx | 31 + .../header/account-dropdown/support.spec.tsx | 38 +- .../header/account-dropdown/support.tsx | 158 +- web/app/layout.tsx | 5 +- web/docs/lint.md | 2 + web/docs/overlay-migration.md | 50 + web/eslint-suppressions.json | 1585 ++++++++++++++++- web/eslint.config.mjs | 48 + web/eslint.constants.mjs | 29 + web/package.json | 1 + web/pnpm-lock.yaml | 53 + 26 files changed, 2926 insertions(+), 423 deletions(-) create mode 100644 web/app/components/base/ui/dialog/index.tsx create mode 100644 web/app/components/base/ui/dropdown-menu/index.tsx create mode 100644 web/app/components/base/ui/placement.ts create mode 100644 web/app/components/base/ui/popover/index.tsx create mode 100644 web/app/components/base/ui/select/index.tsx create mode 100644 web/app/components/base/ui/tooltip/index.tsx create mode 100644 web/app/components/header/account-dropdown/menu-item-content.tsx create mode 100644 web/docs/overlay-migration.md create mode 100644 web/eslint.constants.mjs diff --git a/web/app/components/base/modal/index.tsx b/web/app/components/base/modal/index.tsx index 023934b674..af11e5aa69 100644 --- a/web/app/components/base/modal/index.tsx +++ b/web/app/components/base/modal/index.tsx @@ -1,3 +1,8 @@ +/** + * @deprecated Use `@/app/components/base/ui/dialog` instead. + * This component will be removed after migration is complete. + * See: https://github.com/langgenius/dify/issues/32767 + */ import { Dialog, DialogPanel, DialogTitle, Transition, TransitionChild } from '@headlessui/react' import { noop } from 'es-toolkit/function' import { Fragment } from 'react' diff --git a/web/app/components/base/modal/modal.tsx b/web/app/components/base/modal/modal.tsx index 3ad08e2493..5a3e4d74c1 100644 --- a/web/app/components/base/modal/modal.tsx +++ b/web/app/components/base/modal/modal.tsx @@ -1,3 +1,8 @@ +/** + * @deprecated Use `@/app/components/base/ui/dialog` instead. + * This component will be removed after migration is complete. + * See: https://github.com/langgenius/dify/issues/32767 + */ import type { ButtonProps } from '@/app/components/base/button' import { noop } from 'es-toolkit/function' import { memo } from 'react' diff --git a/web/app/components/base/portal-to-follow-elem/index.tsx b/web/app/components/base/portal-to-follow-elem/index.tsx index c57fba9dd0..7d4f6baa9b 100644 --- a/web/app/components/base/portal-to-follow-elem/index.tsx +++ b/web/app/components/base/portal-to-follow-elem/index.tsx @@ -1,4 +1,16 @@ 'use client' +/** + * @deprecated Use semantic overlay primitives from `@/app/components/base/ui/` instead. + * This component will be removed after migration is complete. + * See: https://github.com/langgenius/dify/issues/32767 + * + * Migration guide: + * - Tooltip → `@/app/components/base/ui/tooltip` + * - Menu/Dropdown → `@/app/components/base/ui/dropdown-menu` + * - Popover → `@/app/components/base/ui/popover` + * - Dialog/Modal → `@/app/components/base/ui/dialog` + * - Select → `@/app/components/base/ui/select` + */ import type { OffsetOptions, Placement } from '@floating-ui/react' import { autoUpdate, @@ -33,6 +45,7 @@ export type PortalToFollowElemOptions = { triggerPopupSameWidth?: boolean } +/** @deprecated Use semantic overlay primitives instead. See #32767. */ export function usePortalToFollowElem({ placement = 'bottom', open: controlledOpen, @@ -110,6 +123,7 @@ export function usePortalToFollowElemContext() { return context } +/** @deprecated Use semantic overlay primitives instead. See #32767. */ export function PortalToFollowElem({ children, ...options @@ -124,6 +138,7 @@ export function PortalToFollowElem({ ) } +/** @deprecated Use semantic overlay primitives instead. See #32767. */ export const PortalToFollowElemTrigger = ( { ref: propRef, @@ -164,6 +179,7 @@ export const PortalToFollowElemTrigger = ( } PortalToFollowElemTrigger.displayName = 'PortalToFollowElemTrigger' +/** @deprecated Use semantic overlay primitives instead. See #32767. */ export const PortalToFollowElemContent = ( { ref: propRef, diff --git a/web/app/components/base/select/index.tsx b/web/app/components/base/select/index.tsx index ac59894771..144629c380 100644 --- a/web/app/components/base/select/index.tsx +++ b/web/app/components/base/select/index.tsx @@ -1,4 +1,9 @@ 'use client' +/** + * @deprecated Use `@/app/components/base/ui/select` instead. + * This component will be removed after migration is complete. + * See: https://github.com/langgenius/dify/issues/32767 + */ import type { FC } from 'react' import { Combobox, ComboboxButton, ComboboxInput, ComboboxOption, ComboboxOptions, Listbox, ListboxButton, ListboxOption, ListboxOptions } from '@headlessui/react' import { ChevronDownIcon, ChevronUpIcon, XMarkIcon } from '@heroicons/react/20/solid' @@ -236,7 +241,7 @@ const SimpleSelect: FC = ({ }} className={cn(`flex h-full w-full items-center rounded-lg border-0 bg-components-input-bg-normal pl-3 pr-10 focus-visible:bg-state-base-hover-alt focus-visible:outline-none group-hover/simple-select:bg-state-base-hover-alt sm:text-sm sm:leading-6 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`, className)} > - {selectedItem?.name ?? localPlaceholder} + {selectedItem?.name ?? localPlaceholder} {isLoading ? diff --git a/web/app/components/base/tooltip/index.tsx b/web/app/components/base/tooltip/index.tsx index d1047ff902..7eb15b2c19 100644 --- a/web/app/components/base/tooltip/index.tsx +++ b/web/app/components/base/tooltip/index.tsx @@ -1,4 +1,9 @@ 'use client' +/** + * @deprecated Use `@/app/components/base/ui/tooltip` instead. + * This component will be removed after migration is complete. + * See: https://github.com/langgenius/dify/issues/32767 + */ import type { OffsetOptions, Placement } from '@floating-ui/react' import type { FC } from 'react' import { RiQuestionLine } from '@remixicon/react' @@ -130,7 +135,7 @@ const Tooltip: FC = ({ {!!popupContent && (
{ diff --git a/web/app/components/base/ui/dialog/index.tsx b/web/app/components/base/ui/dialog/index.tsx new file mode 100644 index 0000000000..605fccee09 --- /dev/null +++ b/web/app/components/base/ui/dialog/index.tsx @@ -0,0 +1,58 @@ +'use client' + +// z-index strategy (relies on root `isolation: isolate` in layout.tsx): +// All overlay primitives (Tooltip / Popover / Dropdown / Select / Dialog) — z-50 +// Overlays share the same z-index; DOM order handles stacking when multiple are open. +// This ensures overlays inside a Dialog (e.g. a Tooltip on a dialog button) render +// above the dialog backdrop instead of being clipped by it. +// Toast — z-[99], always on top (defined in toast component) + +import { Dialog as BaseDialog } from '@base-ui/react/dialog' +import * as React from 'react' +import { cn } from '@/utils/classnames' + +export const Dialog = BaseDialog.Root +export const DialogTrigger = BaseDialog.Trigger +export const DialogTitle = BaseDialog.Title +export const DialogDescription = BaseDialog.Description +export const DialogClose = BaseDialog.Close + +type DialogContentProps = { + children: React.ReactNode + className?: string + overlayClassName?: string + closable?: boolean +} + +export function DialogContent({ + children, + className, + overlayClassName, + closable = false, +}: DialogContentProps) { + return ( + + + + {closable && ( + + + + )} + {children} + + + ) +} diff --git a/web/app/components/base/ui/dropdown-menu/index.tsx b/web/app/components/base/ui/dropdown-menu/index.tsx new file mode 100644 index 0000000000..e839fd24ef --- /dev/null +++ b/web/app/components/base/ui/dropdown-menu/index.tsx @@ -0,0 +1,277 @@ +'use client' + +import type { Placement } from '@/app/components/base/ui/placement' +import { Menu } from '@base-ui/react/menu' +import * as React from 'react' +import { parsePlacement } from '@/app/components/base/ui/placement' +import { cn } from '@/utils/classnames' + +export const DropdownMenu = Menu.Root +export const DropdownMenuPortal = Menu.Portal +export const DropdownMenuTrigger = Menu.Trigger +export const DropdownMenuSub = Menu.SubmenuRoot +export const DropdownMenuGroup = Menu.Group +export const DropdownMenuRadioGroup = Menu.RadioGroup + +const menuRowBaseClassName = 'mx-1 flex h-8 cursor-pointer select-none items-center rounded-lg px-2 outline-none' +const menuRowStateClassName = 'data-[highlighted]:bg-state-base-hover data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50' + +export function DropdownMenuRadioItem({ + className, + ...props +}: React.ComponentPropsWithoutRef) { + return ( + + ) +} + +export function DropdownMenuRadioItemIndicator({ + className, + ...props +}: Omit, 'children'>) { + return ( + + + + ) +} + +export function DropdownMenuCheckboxItem({ + className, + ...props +}: React.ComponentPropsWithoutRef) { + return ( + + ) +} + +export function DropdownMenuCheckboxItemIndicator({ + className, + ...props +}: Omit, 'children'>) { + return ( + + + + ) +} + +export function DropdownMenuGroupLabel({ + className, + ...props +}: React.ComponentPropsWithoutRef) { + return ( + + ) +} + +type DropdownMenuContentProps = { + children: React.ReactNode + placement?: Placement + sideOffset?: number + alignOffset?: number + className?: string + popupClassName?: string + positionerProps?: Omit< + React.ComponentPropsWithoutRef, + 'children' | 'className' | 'side' | 'align' | 'sideOffset' | 'alignOffset' + > + popupProps?: Omit< + React.ComponentPropsWithoutRef, + 'children' | 'className' + > +} + +type DropdownMenuPopupRenderProps = Required> & { + placement: Placement + sideOffset: number + alignOffset: number + className?: string + popupClassName?: string + positionerProps?: DropdownMenuContentProps['positionerProps'] + popupProps?: DropdownMenuContentProps['popupProps'] +} + +function renderDropdownMenuPopup({ + children, + placement, + sideOffset, + alignOffset, + className, + popupClassName, + positionerProps, + popupProps, +}: DropdownMenuPopupRenderProps) { + const { side, align } = parsePlacement(placement) + + return ( + + + + {children} + + + + ) +} + +export function DropdownMenuContent({ + children, + placement = 'bottom-end', + sideOffset = 4, + alignOffset = 0, + className, + popupClassName, + positionerProps, + popupProps, +}: DropdownMenuContentProps) { + return renderDropdownMenuPopup({ + children, + placement, + sideOffset, + alignOffset, + className, + popupClassName, + positionerProps, + popupProps, + }) +} + +type DropdownMenuSubTriggerProps = React.ComponentPropsWithoutRef & { + destructive?: boolean +} + +export function DropdownMenuSubTrigger({ + className, + destructive, + children, + ...props +}: DropdownMenuSubTriggerProps) { + return ( + + {children} + + + ) +} + +type DropdownMenuSubContentProps = { + children: React.ReactNode + placement?: Placement + sideOffset?: number + alignOffset?: number + className?: string + popupClassName?: string + positionerProps?: DropdownMenuContentProps['positionerProps'] + popupProps?: DropdownMenuContentProps['popupProps'] +} + +export function DropdownMenuSubContent({ + children, + placement = 'left-start', + sideOffset = 4, + alignOffset = 0, + className, + popupClassName, + positionerProps, + popupProps, +}: DropdownMenuSubContentProps) { + return renderDropdownMenuPopup({ + children, + placement, + sideOffset, + alignOffset, + className, + popupClassName, + positionerProps, + popupProps, + }) +} + +type DropdownMenuItemProps = React.ComponentPropsWithoutRef & { + destructive?: boolean +} + +export function DropdownMenuItem({ + className, + destructive, + ...props +}: DropdownMenuItemProps) { + return ( + + ) +} + +export function DropdownMenuSeparator({ + className, + ...props +}: React.ComponentPropsWithoutRef) { + return ( + + ) +} diff --git a/web/app/components/base/ui/placement.ts b/web/app/components/base/ui/placement.ts new file mode 100644 index 0000000000..95f233fd56 --- /dev/null +++ b/web/app/components/base/ui/placement.ts @@ -0,0 +1,29 @@ +// Placement type for overlay positioning. +// Mirrors the Floating UI Placement spec — a stable set of 12 CSS-based position values. +// Reference: https://floating-ui.com/docs/useFloating#placement + +type Side = 'top' | 'bottom' | 'left' | 'right' +type Align = 'start' | 'center' | 'end' + +export type Placement + = 'top' + | 'top-start' + | 'top-end' + | 'right' + | 'right-start' + | 'right-end' + | 'bottom' + | 'bottom-start' + | 'bottom-end' + | 'left' + | 'left-start' + | 'left-end' + +export function parsePlacement(placement: Placement): { side: Side, align: Align } { + const [side, align] = placement.split('-') as [Side, Align | undefined] + + return { + side, + align: align ?? 'center', + } +} diff --git a/web/app/components/base/ui/popover/index.tsx b/web/app/components/base/ui/popover/index.tsx new file mode 100644 index 0000000000..8c806cd9da --- /dev/null +++ b/web/app/components/base/ui/popover/index.tsx @@ -0,0 +1,67 @@ +'use client' + +import type { Placement } from '@/app/components/base/ui/placement' +import { Popover as BasePopover } from '@base-ui/react/popover' +import * as React from 'react' +import { parsePlacement } from '@/app/components/base/ui/placement' +import { cn } from '@/utils/classnames' + +export const Popover = BasePopover.Root +export const PopoverTrigger = BasePopover.Trigger +export const PopoverClose = BasePopover.Close +export const PopoverTitle = BasePopover.Title +export const PopoverDescription = BasePopover.Description + +type PopoverContentProps = { + children: React.ReactNode + placement?: Placement + sideOffset?: number + alignOffset?: number + className?: string + popupClassName?: string + positionerProps?: Omit< + React.ComponentPropsWithoutRef, + 'children' | 'className' | 'side' | 'align' | 'sideOffset' | 'alignOffset' + > + popupProps?: Omit< + React.ComponentPropsWithoutRef, + 'children' | 'className' + > +} + +export function PopoverContent({ + children, + placement = 'bottom', + sideOffset = 8, + alignOffset = 0, + className, + popupClassName, + positionerProps, + popupProps, +}: PopoverContentProps) { + const { side, align } = parsePlacement(placement) + + return ( + + + + {children} + + + + ) +} diff --git a/web/app/components/base/ui/select/index.tsx b/web/app/components/base/ui/select/index.tsx new file mode 100644 index 0000000000..c7e51e0939 --- /dev/null +++ b/web/app/components/base/ui/select/index.tsx @@ -0,0 +1,163 @@ +'use client' + +import type { Placement } from '@/app/components/base/ui/placement' +import { Select as BaseSelect } from '@base-ui/react/select' +import * as React from 'react' +import { parsePlacement } from '@/app/components/base/ui/placement' +import { cn } from '@/utils/classnames' + +export const Select = BaseSelect.Root +export const SelectValue = BaseSelect.Value +export const SelectGroup = BaseSelect.Group +export const SelectGroupLabel = BaseSelect.GroupLabel +export const SelectSeparator = BaseSelect.Separator + +type SelectTriggerProps = React.ComponentPropsWithoutRef & { + clearable?: boolean + onClear?: () => void + loading?: boolean +} + +export function SelectTrigger({ + className, + children, + clearable = false, + onClear, + loading = false, + ...props +}: SelectTriggerProps) { + const showClear = clearable && !loading + + return ( + + {children} + {loading + ? ( + + + + ) + : showClear + ? ( + { + e.stopPropagation() + onClear?.() + }} + onMouseDown={(e) => { + e.stopPropagation() + }} + > + + + ) + : ( + + + + )} + + ) +} + +type SelectContentProps = { + children: React.ReactNode + placement?: Placement + sideOffset?: number + alignOffset?: number + className?: string + popupClassName?: string + listClassName?: string + positionerProps?: Omit< + React.ComponentPropsWithoutRef, + 'children' | 'className' | 'side' | 'align' | 'sideOffset' | 'alignOffset' + > + popupProps?: Omit< + React.ComponentPropsWithoutRef, + 'children' | 'className' + > + listProps?: Omit< + React.ComponentPropsWithoutRef, + 'children' | 'className' + > +} + +export function SelectContent({ + children, + placement = 'bottom-start', + sideOffset = 4, + alignOffset = 0, + className, + popupClassName, + listClassName, + positionerProps, + popupProps, + listProps, +}: SelectContentProps) { + const { side, align } = parsePlacement(placement) + + return ( + + + + + {children} + + + + + ) +} + +export function SelectItem({ + className, + children, + ...props +}: React.ComponentPropsWithoutRef) { + return ( + + + {children} + + + + + + ) +} diff --git a/web/app/components/base/ui/tooltip/index.tsx b/web/app/components/base/ui/tooltip/index.tsx new file mode 100644 index 0000000000..1a41cc0f56 --- /dev/null +++ b/web/app/components/base/ui/tooltip/index.tsx @@ -0,0 +1,59 @@ +'use client' + +import type { Placement } from '@/app/components/base/ui/placement' +import { Tooltip as BaseTooltip } from '@base-ui/react/tooltip' +import * as React from 'react' +import { parsePlacement } from '@/app/components/base/ui/placement' +import { cn } from '@/utils/classnames' + +type TooltipContentVariant = 'default' | 'plain' + +export type TooltipContentProps = { + children: React.ReactNode + placement?: Placement + sideOffset?: number + alignOffset?: number + className?: string + popupClassName?: string + variant?: TooltipContentVariant +} & Omit, 'children' | 'className'> + +export function TooltipContent({ + children, + placement = 'top', + sideOffset = 8, + alignOffset = 0, + className, + popupClassName, + variant = 'default', + ...props +}: TooltipContentProps) { + const { side, align } = parsePlacement(placement) + + return ( + + + + {children} + + + + ) +} + +export const TooltipProvider = BaseTooltip.Provider +export const Tooltip = BaseTooltip.Root +export const TooltipTrigger = BaseTooltip.Trigger diff --git a/web/app/components/header/account-dropdown/compliance.spec.tsx b/web/app/components/header/account-dropdown/compliance.spec.tsx index 54a0460f82..1eb747e154 100644 --- a/web/app/components/header/account-dropdown/compliance.spec.tsx +++ b/web/app/components/header/account-dropdown/compliance.spec.tsx @@ -1,6 +1,7 @@ import type { ModalContextState } from '@/context/modal-context' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { fireEvent, render, screen, waitFor } from '@testing-library/react' +import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '@/app/components/base/ui/dropdown-menu' import { Plan } from '@/app/components/billing/type' import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/constants' import { useModalContext } from '@/context/modal-context' @@ -70,16 +71,26 @@ describe('Compliance', () => { ) } - // Wrapper for tests that need the menu open + const renderCompliance = () => { + return renderWithQueryClient( + {}}> + open + + + + , + ) + } + const openMenuAndRender = () => { - renderWithQueryClient() - fireEvent.click(screen.getByRole('button')) + renderCompliance() + fireEvent.click(screen.getByText('common.userProfile.compliance')) } describe('Rendering', () => { it('should render compliance menu trigger', () => { // Act - renderWithQueryClient() + renderCompliance() // Assert expect(screen.getByText('common.userProfile.compliance')).toBeInTheDocument() diff --git a/web/app/components/header/account-dropdown/compliance.tsx b/web/app/components/header/account-dropdown/compliance.tsx index 6bc5b5c3f1..1627a5a052 100644 --- a/web/app/components/header/account-dropdown/compliance.tsx +++ b/web/app/components/header/account-dropdown/compliance.tsx @@ -1,9 +1,9 @@ -import type { FC, MouseEvent } from 'react' -import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react' -import { RiArrowDownCircleLine, RiArrowRightSLine, RiVerifiedBadgeLine } from '@remixicon/react' +import type { ReactNode } from 'react' import { useMutation } from '@tanstack/react-query' -import { Fragment, useCallback } from 'react' +import { useCallback } from 'react' import { useTranslation } from 'react-i18next' +import { DropdownMenuGroup, DropdownMenuItem, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger } from '@/app/components/base/ui/dropdown-menu' +import { Tooltip, TooltipContent, TooltipTrigger } from '@/app/components/base/ui/tooltip' import { Plan } from '@/app/components/billing/type' import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/constants' import { useModalContext } from '@/context/modal-context' @@ -11,14 +11,14 @@ import { useProviderContext } from '@/context/provider-context' import { getDocDownloadUrl } from '@/service/common' import { cn } from '@/utils/classnames' import { downloadUrl } from '@/utils/download' -import Button from '../../base/button' import Gdpr from '../../base/icons/src/public/common/Gdpr' import Iso from '../../base/icons/src/public/common/Iso' import Soc2 from '../../base/icons/src/public/common/Soc2' import SparklesSoft from '../../base/icons/src/public/common/SparklesSoft' import PremiumBadge from '../../base/premium-badge' +import Spinner from '../../base/spinner' import Toast from '../../base/toast' -import Tooltip from '../../base/tooltip' +import { MenuItemContent } from './menu-item-content' enum DocName { SOC2_Type_I = 'SOC2_Type_I', @@ -27,27 +27,83 @@ enum DocName { GDPR = 'GDPR', } -type UpgradeOrDownloadProps = { - doc_name: DocName +type ComplianceDocActionVisualProps = { + isCurrentPlanCanDownload: boolean + isPending: boolean + tooltipText: string + downloadText: string + upgradeText: string } -const UpgradeOrDownload: FC = ({ doc_name }) => { + +function ComplianceDocActionVisual({ + isCurrentPlanCanDownload, + isPending, + tooltipText, + downloadText, + upgradeText, +}: ComplianceDocActionVisualProps) { + if (isCurrentPlanCanDownload) { + return ( +
+ + {downloadText} + {isPending && } +
+ ) + } + + const canShowUpgradeTooltip = tooltipText.length > 0 + + return ( + + + +
+ {upgradeText} +
+ + )} + /> + {canShowUpgradeTooltip && ( + + {tooltipText} + + )} +
+ ) +} + +type ComplianceDocRowItemProps = { + icon: ReactNode + label: ReactNode + docName: DocName +} + +function ComplianceDocRowItem({ + icon, + label, + docName, +}: ComplianceDocRowItemProps) { const { t } = useTranslation() const { plan } = useProviderContext() const { setShowPricingModal, setShowAccountSettingModal } = useModalContext() const isFreePlan = plan.type === Plan.sandbox - const handlePlanClick = useCallback(() => { - if (isFreePlan) - setShowPricingModal() - else - setShowAccountSettingModal({ payload: ACCOUNT_SETTING_TAB.BILLING }) - }, [isFreePlan, setShowAccountSettingModal, setShowPricingModal]) - const { isPending, mutate: downloadCompliance } = useMutation({ - mutationKey: ['downloadCompliance', doc_name], + mutationKey: ['downloadCompliance', docName], mutationFn: async () => { try { - const ret = await getDocDownloadUrl(doc_name) + const ret = await getDocDownloadUrl(docName) downloadUrl({ url: ret.url }) Toast.notify({ type: 'success', @@ -63,6 +119,7 @@ const UpgradeOrDownload: FC = ({ doc_name }) => { } }, }) + const whichPlanCanDownloadCompliance = { [DocName.SOC2_Type_I]: [Plan.professional, Plan.team], [DocName.SOC2_Type_II]: [Plan.team], @@ -70,118 +127,85 @@ const UpgradeOrDownload: FC = ({ doc_name }) => { [DocName.GDPR]: [Plan.team, Plan.professional, Plan.sandbox], } - const isCurrentPlanCanDownload = whichPlanCanDownloadCompliance[doc_name].includes(plan.type) - const handleDownloadClick = useCallback((e: MouseEvent) => { - e.preventDefault() - downloadCompliance() - }, [downloadCompliance]) - if (isCurrentPlanCanDownload) { - return ( - - ) - } + const isCurrentPlanCanDownload = whichPlanCanDownloadCompliance[docName].includes(plan.type) + + const handleSelect = useCallback(() => { + if (isCurrentPlanCanDownload) { + if (!isPending) + downloadCompliance() + return + } + + if (isFreePlan) + setShowPricingModal() + else + setShowAccountSettingModal({ payload: ACCOUNT_SETTING_TAB.BILLING }) + }, [downloadCompliance, isCurrentPlanCanDownload, isFreePlan, isPending, setShowAccountSettingModal, setShowPricingModal]) + const upgradeTooltip: Record = { [Plan.sandbox]: t('compliance.sandboxUpgradeTooltip', { ns: 'common' }), [Plan.professional]: t('compliance.professionalUpgradeTooltip', { ns: 'common' }), [Plan.team]: '', [Plan.enterprise]: '', } + return ( - - - -
- - {t('upgradeBtn.encourageShort', { ns: 'billing' })} - -
-
-
+ + {icon} +
{label}
+ +
) } +// Submenu-only: this component must be rendered within an existing DropdownMenu root. export default function Compliance() { - const itemClassName = ` - flex items-center w-full h-10 pl-1 pr-2 py-1 text-text-secondary system-md-regular - rounded-lg hover:bg-state-base-hover gap-1 -` const { t } = useTranslation() return ( - - { - ({ open }) => ( - <> - - -
{t('userProfile.compliance', { ns: 'common' })}
- -
- - -
- -
- -
{t('compliance.soc2Type1', { ns: 'common' })}
- -
-
- -
- -
{t('compliance.soc2Type2', { ns: 'common' })}
- -
-
- -
- -
{t('compliance.iso27001', { ns: 'common' })}
- -
-
- -
- -
{t('compliance.gdpr', { ns: 'common' })}
- -
-
-
-
-
- - ) - } -
+ + + + + + + } + label={t('compliance.soc2Type1', { ns: 'common' })} + docName={DocName.SOC2_Type_I} + /> + } + label={t('compliance.soc2Type2', { ns: 'common' })} + docName={DocName.SOC2_Type_II} + /> + } + label={t('compliance.iso27001', { ns: 'common' })} + docName={DocName.ISO_27001} + /> + } + label={t('compliance.gdpr', { ns: 'common' })} + docName={DocName.GDPR} + /> + + + ) } diff --git a/web/app/components/header/account-dropdown/index.spec.tsx b/web/app/components/header/account-dropdown/index.spec.tsx index a954351267..60e00868c1 100644 --- a/web/app/components/header/account-dropdown/index.spec.tsx +++ b/web/app/components/header/account-dropdown/index.spec.tsx @@ -65,6 +65,7 @@ vi.mock('@/context/i18n', () => ({ const { mockConfig, mockEnv } = vi.hoisted(() => ({ mockConfig: { IS_CLOUD_EDITION: false, + ZENDESK_WIDGET_KEY: '', }, mockEnv: { env: { @@ -74,6 +75,7 @@ const { mockConfig, mockEnv } = vi.hoisted(() => ({ })) vi.mock('@/config', () => ({ get IS_CLOUD_EDITION() { return mockConfig.IS_CLOUD_EDITION }, + get ZENDESK_WIDGET_KEY() { return mockConfig.ZENDESK_WIDGET_KEY }, IS_DEV: false, IS_CE_EDITION: false, })) @@ -187,6 +189,14 @@ describe('AccountDropdown', () => { expect(screen.getByText('test@example.com')).toBeInTheDocument() }) + it('should set an accessible label on avatar trigger when menu trigger is rendered', () => { + // Act + renderWithRouter() + + // Assert + expect(screen.getByRole('button', { name: 'common.account.account' })).toBeInTheDocument() + }) + it('should show EDU badge for education accounts', () => { // Arrange vi.mocked(useProviderContext).mockReturnValue({ diff --git a/web/app/components/header/account-dropdown/index.tsx b/web/app/components/header/account-dropdown/index.tsx index 983f9e434d..4cf1f4efda 100644 --- a/web/app/components/header/account-dropdown/index.tsx +++ b/web/app/components/header/account-dropdown/index.tsx @@ -1,26 +1,15 @@ 'use client' -import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react' -import { - RiAccountCircleLine, - RiArrowRightUpLine, - RiBookOpenLine, - RiGithubLine, - RiGraduationCapFill, - RiInformation2Line, - RiLogoutBoxRLine, - RiMap2Line, - RiSettings3Line, - RiStarLine, - RiTShirt2Line, -} from '@remixicon/react' + +import type { MouseEventHandler, ReactNode } from 'react' import Link from 'next/link' import { useRouter } from 'next/navigation' -import { Fragment, useState } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { resetUser } from '@/app/components/base/amplitude/utils' import Avatar from '@/app/components/base/avatar' import PremiumBadge from '@/app/components/base/premium-badge' import ThemeSwitcher from '@/app/components/base/theme-switcher' +import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from '@/app/components/base/ui/dropdown-menu' import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/constants' import { IS_CLOUD_EDITION } from '@/config' import { useAppContext } from '@/context/app-context' @@ -35,15 +24,90 @@ import AccountAbout from '../account-about' import GithubStar from '../github-star' import Indicator from '../indicator' import Compliance from './compliance' +import { ExternalLinkIndicator, MenuItemContent } from './menu-item-content' import Support from './support' +type AccountMenuRouteItemProps = { + href: string + iconClassName: string + label: ReactNode + trailing?: ReactNode +} + +function AccountMenuRouteItem({ + href, + iconClassName, + label, + trailing, +}: AccountMenuRouteItemProps) { + return ( + } + > + + + ) +} + +type AccountMenuExternalItemProps = { + href: string + iconClassName: string + label: ReactNode + trailing?: ReactNode +} + +function AccountMenuExternalItem({ + href, + iconClassName, + label, + trailing, +}: AccountMenuExternalItemProps) { + return ( + } + > + + + ) +} + +type AccountMenuActionItemProps = { + iconClassName: string + label: ReactNode + onClick?: MouseEventHandler + trailing?: ReactNode +} + +function AccountMenuActionItem({ + iconClassName, + label, + onClick, + trailing, +}: AccountMenuActionItemProps) { + return ( + + + + ) +} + +type AccountMenuSectionProps = { + children: ReactNode +} + +function AccountMenuSection({ children }: AccountMenuSectionProps) { + return {children} +} + export default function AppSelector() { - const itemClassName = ` - flex items-center w-full h-8 pl-3 pr-2 text-text-secondary system-md-regular - rounded-lg hover:bg-state-base-hover cursor-pointer gap-1 - ` const router = useRouter() const [aboutVisible, setAboutVisible] = useState(false) + const [isAccountMenuOpen, setIsAccountMenuOpen] = useState(false) const { systemFeatures } = useGlobalPublicStore() const { t } = useTranslation() @@ -68,161 +132,124 @@ export default function AppSelector() { } return ( -
- - { - ({ open, close }) => ( - <> - - - - - -
- -
-
-
- {userProfile.name} - {isEducationAccount && ( - - - EDU - - )} -
-
{userProfile.email}
-
- -
-
- - - -
{t('account.account', { ns: 'common' })}
- - -
- -
setShowAccountSettingModal({ payload: ACCOUNT_SETTING_TAB.MEMBERS })} - > - -
{t('userProfile.settings', { ns: 'common' })}
-
-
-
- {!systemFeatures.branding.enabled && ( - <> -
- - - -
{t('userProfile.helpCenter', { ns: 'common' })}
- - -
- - {IS_CLOUD_EDITION && isCurrentWorkspaceOwner && } -
-
- - - -
{t('userProfile.roadmap', { ns: 'common' })}
- - -
- - - -
{t('userProfile.github', { ns: 'common' })}
-
- - -
- -
- { - env.NEXT_PUBLIC_SITE_ABOUT !== 'hide' && ( - -
setAboutVisible(true)} - > - -
{t('userProfile.about', { ns: 'common' })}
-
-
{langGeniusVersionInfo.current_version}
- -
-
-
- ) - } -
- +
+ + + + + + +
+
+
+ {userProfile.name} + {isEducationAccount && ( + + + EDU + )} - -
-
- -
{t('theme.theme', { ns: 'common' })}
- -
+
+
{userProfile.email}
+
+ +
+ } + /> + setShowAccountSettingModal({ payload: ACCOUNT_SETTING_TAB.MEMBERS })} + /> + + + {!systemFeatures.branding.enabled && ( + <> + + } + /> + setIsAccountMenuOpen(false)} /> + {IS_CLOUD_EDITION && isCurrentWorkspaceOwner && } + + + + } + /> + + +
- - -
handleLogout()}> -
- -
{t('userProfile.logout', { ns: 'common' })}
-
-
-
- - + )} + /> + { + env.NEXT_PUBLIC_SITE_ABOUT !== 'hide' && ( + { + setAboutVisible(true) + setIsAccountMenuOpen(false) + }} + trailing={( +
+
{langGeniusVersionInfo.current_version}
+ +
+ )} + /> + ) + } + + - ) - } -
+ )} + + e.preventDefault()} + > + } + /> + + + + + { + void handleLogout() + }} + /> + + + { aboutVisible && setAboutVisible(false)} langGeniusVersionInfo={langGeniusVersionInfo} /> } diff --git a/web/app/components/header/account-dropdown/menu-item-content.tsx b/web/app/components/header/account-dropdown/menu-item-content.tsx new file mode 100644 index 0000000000..47f0042047 --- /dev/null +++ b/web/app/components/header/account-dropdown/menu-item-content.tsx @@ -0,0 +1,31 @@ +import type { ReactNode } from 'react' +import { cn } from '@/utils/classnames' + +const menuLabelClassName = 'min-w-0 grow truncate px-1 text-text-secondary system-md-regular' +const menuLeadingIconClassName = 'size-4 shrink-0 text-text-tertiary' + +export const menuTrailingIconClassName = 'size-[14px] shrink-0 text-text-tertiary' + +type MenuItemContentProps = { + iconClassName: string + label: ReactNode + trailing?: ReactNode +} + +export function MenuItemContent({ + iconClassName, + label, + trailing, +}: MenuItemContentProps) { + return ( + <> + +
{label}
+ {trailing} + + ) +} + +export function ExternalLinkIndicator() { + return +} diff --git a/web/app/components/header/account-dropdown/support.spec.tsx b/web/app/components/header/account-dropdown/support.spec.tsx index b30a290ea5..90bcb9f3ec 100644 --- a/web/app/components/header/account-dropdown/support.spec.tsx +++ b/web/app/components/header/account-dropdown/support.spec.tsx @@ -1,6 +1,7 @@ import type { AppContextValue } from '@/context/app-context' import { fireEvent, render, screen } from '@testing-library/react' +import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '@/app/components/base/ui/dropdown-menu' import { Plan } from '@/app/components/billing/type' import { useAppContext } from '@/context/app-context' import { baseProviderContextValue, useProviderContext } from '@/context/provider-context' @@ -93,10 +94,21 @@ describe('Support', () => { }) }) + const renderSupport = () => { + return render( + {}}> + open + + + + , + ) + } + describe('Rendering', () => { it('should render support menu trigger', () => { // Act - render() + renderSupport() // Assert expect(screen.getByText('common.userProfile.support')).toBeInTheDocument() @@ -104,8 +116,8 @@ describe('Support', () => { it('should show forum and community links when opened', () => { // Act - render() - fireEvent.click(screen.getByRole('button')) + renderSupport() + fireEvent.click(screen.getByText('common.userProfile.support')) // Assert expect(screen.getByText('common.userProfile.forum')).toBeInTheDocument() @@ -116,8 +128,8 @@ describe('Support', () => { describe('Plan-based Channels', () => { it('should show "Contact Us" when ZENDESK_WIDGET_KEY is present', () => { // Act - render() - fireEvent.click(screen.getByRole('button')) + renderSupport() + fireEvent.click(screen.getByText('common.userProfile.support')) // Assert expect(screen.getByText('common.userProfile.contactUs')).toBeInTheDocument() @@ -134,8 +146,8 @@ describe('Support', () => { }) // Act - render() - fireEvent.click(screen.getByRole('button')) + renderSupport() + fireEvent.click(screen.getByText('common.userProfile.support')) // Assert expect(screen.queryByText('common.userProfile.contactUs')).not.toBeInTheDocument() @@ -147,8 +159,8 @@ describe('Support', () => { mockZendeskKey.value = '' // Act - render() - fireEvent.click(screen.getByRole('button')) + renderSupport() + fireEvent.click(screen.getByText('common.userProfile.support')) // Assert expect(screen.getByText('common.userProfile.emailSupport')).toBeInTheDocument() @@ -159,8 +171,8 @@ describe('Support', () => { describe('Interactions and Links', () => { it('should call toggleZendeskWindow and closeAccountDropdown when "Contact Us" is clicked', () => { // Act - render() - fireEvent.click(screen.getByRole('button')) + renderSupport() + fireEvent.click(screen.getByText('common.userProfile.support')) fireEvent.click(screen.getByText('common.userProfile.contactUs')) // Assert @@ -170,8 +182,8 @@ describe('Support', () => { it('should have correct forum and community links', () => { // Act - render() - fireEvent.click(screen.getByRole('button')) + renderSupport() + fireEvent.click(screen.getByText('common.userProfile.support')) // Assert const forumLink = screen.getByText('common.userProfile.forum').closest('a') diff --git a/web/app/components/header/account-dropdown/support.tsx b/web/app/components/header/account-dropdown/support.tsx index 7873b676c3..7ec2766977 100644 --- a/web/app/components/header/account-dropdown/support.tsx +++ b/web/app/components/header/account-dropdown/support.tsx @@ -1,119 +1,85 @@ -import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react' -import { RiArrowRightSLine, RiArrowRightUpLine, RiChatSmile2Line, RiDiscordLine, RiDiscussLine, RiMailSendLine, RiQuestionLine } from '@remixicon/react' -import Link from 'next/link' -import { Fragment } from 'react' import { useTranslation } from 'react-i18next' +import { DropdownMenuGroup, DropdownMenuItem, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger } from '@/app/components/base/ui/dropdown-menu' import { toggleZendeskWindow } from '@/app/components/base/zendesk/utils' import { Plan } from '@/app/components/billing/type' import { ZENDESK_WIDGET_KEY } from '@/config' import { useAppContext } from '@/context/app-context' import { useProviderContext } from '@/context/provider-context' -import { cn } from '@/utils/classnames' import { mailToSupport } from '../utils/util' +import { ExternalLinkIndicator, MenuItemContent } from './menu-item-content' type SupportProps = { closeAccountDropdown: () => void } +// Submenu-only: this component must be rendered within an existing DropdownMenu root. export default function Support({ closeAccountDropdown }: SupportProps) { - const itemClassName = ` - flex items-center w-full h-9 pl-3 pr-2 text-text-secondary system-md-regular - rounded-lg hover:bg-state-base-hover cursor-pointer gap-1 -` const { t } = useTranslation() const { plan } = useProviderContext() const { userProfile, langGeniusVersionInfo } = useAppContext() const hasDedicatedChannel = plan.type !== Plan.sandbox + const hasZendeskWidget = !!ZENDESK_WIDGET_KEY?.trim() return ( - - { - ({ open }) => ( - <> - + + + + + + {hasDedicatedChannel && hasZendeskWidget && ( + { + toggleZendeskWindow(true) + closeAccountDropdown() + }} > - -
{t('userProfile.support', { ns: 'common' })}
- -
- + + )} + {hasDedicatedChannel && !hasZendeskWidget && ( + } > - -
- {hasDedicatedChannel && ( - - {ZENDESK_WIDGET_KEY && ZENDESK_WIDGET_KEY.trim() !== '' - ? ( - - ) - : ( - - -
{t('userProfile.emailSupport', { ns: 'common' })}
- -
- )} -
- )} - - - -
{t('userProfile.forum', { ns: 'common' })}
- - -
- - - -
{t('userProfile.community', { ns: 'common' })}
- - -
-
-
-
- - ) - } -
+ } + /> + + )} + } + > + } + /> + + } + > + } + /> + + + + ) } diff --git a/web/app/layout.tsx b/web/app/layout.tsx index fd81e09cb6..318cad3a6c 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -9,6 +9,7 @@ import { getDatasetMap } from '@/env' import { getLocaleOnServer } from '@/i18n-config/server' import { cn } from '@/utils/classnames' import { ToastProvider } from './components/base/toast' +import { TooltipProvider } from './components/base/ui/tooltip' import BrowserInitializer from './components/browser-initializer' import { ReactScanLoader } from './components/devtools/react-scan/loader' import { I18nServerProvider } from './components/provider/i18n-server' @@ -79,7 +80,9 @@ const LocaleLayout = async ({ - {children} + + {children} + diff --git a/web/docs/lint.md b/web/docs/lint.md index a0ec9d58ad..1105d4af08 100644 --- a/web/docs/lint.md +++ b/web/docs/lint.md @@ -43,6 +43,8 @@ This command lints the entire project and is intended for final verification bef If a new rule causes many existing code errors or automatic fixes generate too many diffs, do not use the `--fix` option for automatic fixes. You can introduce the rule first, then use the `--suppress-all` option to temporarily suppress these errors, and gradually fix them in subsequent changes. +For overlay migration policy and cleanup phases, see [Overlay Migration Guide](./overlay-migration.md). + ## Type Check You should be able to see suggestions from TypeScript in your editor for all open files. diff --git a/web/docs/overlay-migration.md b/web/docs/overlay-migration.md new file mode 100644 index 0000000000..77c5fe5b04 --- /dev/null +++ b/web/docs/overlay-migration.md @@ -0,0 +1,50 @@ +# Overlay Migration Guide + +This document tracks the migration away from legacy `portal-to-follow-elem` APIs. + +## Scope + +- Deprecated API: `@/app/components/base/portal-to-follow-elem` +- Replacement primitives: + - `@/app/components/base/ui/tooltip` + - `@/app/components/base/ui/dropdown-menu` + - `@/app/components/base/ui/popover` + - `@/app/components/base/ui/dialog` + - `@/app/components/base/ui/select` +- Tracking issue: https://github.com/langgenius/dify/issues/32767 + +## ESLint policy + +- `no-restricted-imports` blocks new usage of `portal-to-follow-elem`. +- The rule is enabled for normal source files and test files are excluded. +- Legacy `app/components/base/*` callers are temporarily allowlisted in ESLint config. +- New files must not be added to the allowlist without migration owner approval. + +## Migration phases + +1. Business/UI features outside `app/components/base/**` + - Migrate old calls to semantic primitives. + - Keep `eslint-suppressions.json` stable or shrinking. +1. Legacy base components in allowlist + - Migrate allowlisted base callers gradually. + - Remove migrated files from allowlist immediately. +1. Cleanup + - Remove remaining suppressions for `no-restricted-imports`. + - Remove legacy `portal-to-follow-elem` implementation. + +## Suppression maintenance + +- After each migration batch, run: + +```sh +pnpm eslint --prune-suppressions --pass-on-unpruned-suppressions +``` + +- Never increase suppressions to bypass new code. +- Prefer direct migration over adding suppression entries. + +## React Refresh policy for base UI primitives + +- We keep primitive aliases (for example `DropdownMenu = Menu.Root`) in the same module. +- For `app/components/base/ui/**/*.tsx`, `react-refresh/only-export-components` is currently set to `off` in ESLint to avoid false positives and IDE noise during migration. +- Do not use file-level `eslint-disable` comments for this policy; keep control in the scoped ESLint override. diff --git a/web/eslint-suppressions.json b/web/eslint-suppressions.json index c5307cbe8e..95f00e92b3 100644 --- a/web/eslint-suppressions.json +++ b/web/eslint-suppressions.json @@ -81,12 +81,20 @@ "count": 1 } }, + "app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/long-time-range-picker.tsx": { + "no-restricted-imports": { + "count": 2 + } + }, "app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker/date-picker.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker/range-selector.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -102,7 +110,15 @@ "count": 3 } }, + "app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/config-button.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/config-popup.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 6 } @@ -113,6 +129,9 @@ } }, "app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/provider-config-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -213,11 +232,17 @@ } }, "app/account/(commonLayout)/account-page/AvatarWithEdit.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/account/(commonLayout)/account-page/email-change-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 21 }, @@ -226,6 +251,9 @@ } }, "app/account/(commonLayout)/account-page/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 14 }, @@ -278,20 +306,46 @@ } }, "app/components/app-sidebar/app-info/app-operations.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 4 } }, + "app/components/app-sidebar/app-sidebar-dropdown.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/app-sidebar/basic.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/app-sidebar/dataset-info/dropdown.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 1 } }, + "app/components/app-sidebar/dataset-sidebar-dropdown.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/app-sidebar/index.tsx": { "ts/no-explicit-any": { "count": 1 } }, + "app/components/app-sidebar/toggle-button.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/app/annotation/add-annotation-modal/edit-item/index.tsx": { "react-refresh/only-export-components": { "count": 1 @@ -321,6 +375,9 @@ } }, "app/components/app/annotation/batch-add-annotation-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 }, @@ -416,6 +473,9 @@ } }, "app/components/app/app-access-control/add-member-or-group-pop.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 8 } @@ -426,6 +486,9 @@ } }, "app/components/app/app-access-control/specific-groups-or-members.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 8 } @@ -436,16 +499,27 @@ } }, "app/components/app/app-publisher/index.tsx": { + "no-restricted-imports": { + "count": 2 + }, "ts/no-explicit-any": { "count": 5 } }, + "app/components/app/app-publisher/publish-with-multiple-model.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/app/app-publisher/suggested-action.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/app/app-publisher/version-info-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -461,6 +535,9 @@ } }, "app/components/app/configuration/config-prompt/advanced-prompt-input.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 2 } @@ -471,6 +548,9 @@ } }, "app/components/app/configuration/config-prompt/conversation-history/edit-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 1 } @@ -486,6 +566,9 @@ } }, "app/components/app/configuration/config-prompt/simple-prompt-input.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 }, @@ -494,6 +577,9 @@ } }, "app/components/app/configuration/config-var/config-modal/index.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -501,6 +587,11 @@ "count": 6 } }, + "app/components/app/configuration/config-var/config-modal/type-select.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/app/configuration/config-var/config-select/index.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -509,6 +600,11 @@ "count": 1 } }, + "app/components/app/configuration/config-var/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/app/configuration/config-var/input-type-icon.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -523,6 +619,9 @@ } }, "app/components/app/configuration/config-var/select-var-type.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 1 } @@ -541,6 +640,9 @@ } }, "app/components/app/configuration/config-vision/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -549,10 +651,18 @@ } }, "app/components/app/configuration/config-vision/param-config-content.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 1 } }, + "app/components/app/configuration/config-vision/param-config.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/app/configuration/config/agent-setting-button.spec.tsx": { "ts/no-explicit-any": { "count": 2 @@ -566,12 +676,20 @@ "count": 1 } }, + "app/components/app/configuration/config/agent/agent-setting/item-panel.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/app/configuration/config/agent/agent-tools/index.spec.tsx": { "ts/no-explicit-any": { "count": 5 } }, "app/components/app/configuration/config/agent/agent-tools/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -607,6 +725,9 @@ } }, "app/components/app/configuration/config/assistant-type-picker/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 3 }, @@ -615,6 +736,9 @@ } }, "app/components/app/configuration/config/automatic/get-automatic-res.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 4 }, @@ -652,6 +776,9 @@ } }, "app/components/app/configuration/config/automatic/version-selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 }, @@ -660,6 +787,9 @@ } }, "app/components/app/configuration/config/code-generator/get-code-generator-res.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 4 }, @@ -679,6 +809,9 @@ } }, "app/components/app/configuration/config/config-audio.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -689,6 +822,9 @@ } }, "app/components/app/configuration/config/config-document.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -709,11 +845,17 @@ } }, "app/components/app/configuration/dataset-config/context-var/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 1 } }, "app/components/app/configuration/dataset-config/context-var/var-picker.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 4 } @@ -728,7 +870,15 @@ "count": 1 } }, + "app/components/app/configuration/dataset-config/params-config/config-content.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/app/configuration/dataset-config/params-config/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 } @@ -744,6 +894,9 @@ } }, "app/components/app/configuration/dataset-config/select-dataset/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 2 }, @@ -771,6 +924,9 @@ } }, "app/components/app/configuration/debug/chat-user-input.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -795,6 +951,11 @@ "count": 2 } }, + "app/components/app/configuration/debug/debug-with-multiple-model/model-parameter-trigger.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/app/configuration/debug/debug-with-multiple-model/text-generation-item.tsx": { "ts/no-explicit-any": { "count": 8 @@ -819,6 +980,9 @@ } }, "app/components/app/configuration/debug/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 2 }, @@ -857,6 +1021,9 @@ } }, "app/components/app/configuration/prompt-value-panel/index.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 } @@ -867,6 +1034,9 @@ } }, "app/components/app/configuration/tools/external-data-tool-modal.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 1 }, @@ -874,6 +1044,11 @@ "count": 2 } }, + "app/components/app/configuration/tools/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/app/create-app-dialog/app-card/index.spec.tsx": { "ts/no-explicit-any": { "count": 1 @@ -917,11 +1092,17 @@ } }, "app/components/app/create-from-dsl-modal/dsl-confirm-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/app/create-from-dsl-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 2 }, @@ -938,6 +1119,9 @@ } }, "app/components/app/duplicate-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -961,6 +1145,9 @@ } }, "app/components/app/log/list.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 6 }, @@ -975,6 +1162,9 @@ } }, "app/components/app/log/model-info.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 }, @@ -998,6 +1188,9 @@ } }, "app/components/app/overview/app-card.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 3 }, @@ -1017,11 +1210,17 @@ } }, "app/components/app/overview/customize/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/app/overview/embedded/index.tsx": { + "no-restricted-imports": { + "count": 2 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 }, @@ -1033,6 +1232,9 @@ } }, "app/components/app/overview/settings/index.tsx": { + "no-restricted-imports": { + "count": 3 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 3 }, @@ -1052,6 +1254,9 @@ } }, "app/components/app/switch-app-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 } @@ -1095,11 +1300,17 @@ } }, "app/components/app/type-selector/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } }, "app/components/app/workflow-log/detail.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -1136,6 +1347,9 @@ } }, "app/components/apps/app-card.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 }, @@ -1227,6 +1441,11 @@ "count": 3 } }, + "app/components/base/audio-btn/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/audio-gallery/AudioPlayer.tsx": { "ts/no-explicit-any": { "count": 2 @@ -1284,6 +1503,11 @@ "count": 1 } }, + "app/components/base/button/sync-button.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/carousel/index.tsx": { "react-refresh/only-export-components": { "count": 1 @@ -1308,6 +1532,9 @@ } }, "app/components/base/chat/chat-with-history/header/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 }, @@ -1337,6 +1564,9 @@ } }, "app/components/base/chat/chat-with-history/inputs-form/content.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 }, @@ -1377,6 +1607,11 @@ "count": 3 } }, + "app/components/base/chat/chat-with-history/sidebar/rename-modal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/chat/chat/answer/agent-content.tsx": { "style/multiline-ternary": { "count": 2 @@ -1401,6 +1636,11 @@ "count": 1 } }, + "app/components/base/chat/chat/answer/operation.tsx": { + "no-restricted-imports": { + "count": 2 + } + }, "app/components/base/chat/chat/answer/tool-detail.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 5 @@ -1478,6 +1718,11 @@ "count": 7 } }, + "app/components/base/chat/embedded-chatbot/header/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/chat/embedded-chatbot/hooks.tsx": { "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 3 @@ -1489,6 +1734,9 @@ } }, "app/components/base/chat/embedded-chatbot/inputs-form/content.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 3 } @@ -1535,6 +1783,11 @@ "count": 1 } }, + "app/components/base/copy-feedback/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/corner-label/index.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -1621,6 +1874,11 @@ "count": 1 } }, + "app/components/base/emoji-picker/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/encrypted-bottom/index.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -1639,12 +1897,23 @@ "count": 1 } }, + "app/components/base/features/new-feature-panel/annotation-reply/annotation-ctrl-button.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/features/new-feature-panel/annotation-reply/config-param-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/base/features/new-feature-panel/annotation-reply/config-param.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -1681,16 +1950,25 @@ } }, "app/components/base/features/new-feature-panel/conversation-opener/modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 } }, "app/components/base/features/new-feature-panel/feature-bar.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/base/features/new-feature-panel/feature-card.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -1718,6 +1996,11 @@ "count": 3 } }, + "app/components/base/features/new-feature-panel/moderation/form-generation.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/features/new-feature-panel/moderation/index.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 5 @@ -1727,6 +2010,9 @@ } }, "app/components/base/features/new-feature-panel/moderation/moderation-setting-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 2 } @@ -1736,6 +2022,11 @@ "count": 7 } }, + "app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx": { + "no-restricted-imports": { + "count": 2 + } + }, "app/components/base/features/new-feature-panel/text-to-speech/voice-settings.tsx": { "ts/no-explicit-any": { "count": 1 @@ -1762,6 +2053,9 @@ } }, "app/components/base/file-uploader/file-list-in-log.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react/no-missing-key": { "count": 1 }, @@ -1787,6 +2081,11 @@ "count": 3 } }, + "app/components/base/file-uploader/pdf-preview.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/file-uploader/store.tsx": { "react-refresh/only-export-components": { "count": 4 @@ -1798,6 +2097,9 @@ } }, "app/components/base/form/components/base/base-field.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 }, @@ -1926,7 +2228,15 @@ "count": 1 } }, + "app/components/base/image-uploader/image-list.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/image-uploader/image-preview.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 1 } @@ -2017,6 +2327,9 @@ } }, "app/components/base/markdown-blocks/form.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 }, @@ -2147,6 +2460,9 @@ } }, "app/components/base/new-audio-button/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 1 } @@ -2190,6 +2506,9 @@ } }, "app/components/base/param-item/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -2298,6 +2617,11 @@ "count": 1 } }, + "app/components/base/prompt-editor/plugins/hitl-input-block/variable-block.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/prompt-editor/plugins/last-run-block/component.tsx": { "tailwindcss/no-unnecessary-whitespace": { "count": 2 @@ -2343,6 +2667,11 @@ "count": 2 } }, + "app/components/base/prompt-editor/plugins/workflow-variable-block/component.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/prompt-editor/plugins/workflow-variable-block/index.tsx": { "react-refresh/only-export-components": { "count": 4 @@ -2368,6 +2697,11 @@ "count": 1 } }, + "app/components/base/qrcode/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/radio-card/index.stories.tsx": { "ts/no-explicit-any": { "count": 1 @@ -2431,9 +2765,6 @@ "style/multiline-ternary": { "count": 2 }, - "tailwindcss/enforce-consistent-class-order": { - "count": 1 - }, "ts/no-explicit-any": { "count": 1 } @@ -2495,6 +2826,21 @@ "count": 1 } }, + "app/components/base/tag-management/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/base/tag-management/tag-item-editor.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/base/tag-management/tag-remove-modal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/base/text-generation/hooks.ts": { "ts/no-explicit-any": { "count": 1 @@ -2521,11 +2867,6 @@ "count": 2 } }, - "app/components/base/tooltip/index.tsx": { - "tailwindcss/enforce-consistent-class-order": { - "count": 1 - } - }, "app/components/base/video-gallery/VideoPlayer.tsx": { "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 @@ -2559,6 +2900,11 @@ "count": 4 } }, + "app/components/billing/annotation-full/modal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/billing/apps-full-in-dialog/index.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 5 @@ -2570,6 +2916,9 @@ } }, "app/components/billing/plan-upgrade-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -2646,6 +2995,9 @@ } }, "app/components/billing/priority-label/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -2656,6 +3008,9 @@ } }, "app/components/billing/usage-info/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 8 } @@ -2676,11 +3031,17 @@ } }, "app/components/datasets/common/document-picker/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/datasets/common/document-picker/preview-document-picker.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -2709,6 +3070,9 @@ } }, "app/components/datasets/common/image-uploader/image-uploader-in-retrieval-testing/image-input.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -2724,11 +3088,17 @@ } }, "app/components/datasets/common/retrieval-param-config/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } }, "app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/dsl-confirm-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -2739,6 +3109,9 @@ } }, "app/components/datasets/create-from-pipeline/create-options/create-from-dsl-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -2787,6 +3160,9 @@ } }, "app/components/datasets/create-from-pipeline/list/template-card/details/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 } @@ -2796,6 +3172,11 @@ "count": 3 } }, + "app/components/datasets/create-from-pipeline/list/template-card/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/create-from-pipeline/list/template-card/operations.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 3 @@ -2807,10 +3188,18 @@ } }, "app/components/datasets/create/embedding-process/indexing-progress-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/datasets/create/empty-dataset-creation-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/create/file-preview/index.tsx": { "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 @@ -2840,16 +3229,25 @@ } }, "app/components/datasets/create/step-two/components/general-chunking-options.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 } }, "app/components/datasets/create/step-two/components/indexing-mode-section.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 8 } }, "app/components/datasets/create/step-two/components/inputs.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -2889,16 +3287,31 @@ "count": 2 } }, + "app/components/datasets/create/stop-embedding-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/create/top-bar/index.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/datasets/create/website/base/checkbox-with-label.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/create/website/base/error-message.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, + "app/components/datasets/create/website/base/field.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/create/website/base/header.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -2981,11 +3394,31 @@ "count": 1 } }, + "app/components/datasets/documents/components/document-list/components/document-table-row.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/datasets/documents/components/documents-header.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/documents/components/list.tsx": { "react-refresh/only-export-components": { "count": 1 } }, + "app/components/datasets/documents/components/operations.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/datasets/documents/components/rename-modal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/documents/create-from-pipeline/actions/index.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 @@ -2996,6 +3429,11 @@ "count": 1 } }, + "app/components/datasets/documents/create-from-pipeline/data-source/base/credential-selector/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/documents/create-from-pipeline/data-source/base/credential-selector/item.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -3007,6 +3445,9 @@ } }, "app/components/datasets/documents/create-from-pipeline/data-source/base/header.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -3032,6 +3473,9 @@ } }, "app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/bucket.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 } @@ -3042,6 +3486,9 @@ } }, "app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/dropdown/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -3072,6 +3519,9 @@ } }, "app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/list/item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -3102,6 +3552,9 @@ } }, "app/components/datasets/documents/create-from-pipeline/data-source/website-crawl/base/checkbox-with-label.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -3181,6 +3634,9 @@ } }, "app/components/datasets/documents/create-from-pipeline/processing/embedding-process/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -3196,6 +3652,9 @@ } }, "app/components/datasets/documents/detail/batch-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 } @@ -3249,6 +3708,9 @@ } }, "app/components/datasets/documents/detail/completed/common/regeneration-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 6 } @@ -3263,16 +3725,34 @@ "count": 2 } }, + "app/components/datasets/documents/detail/completed/common/summary-status.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/documents/detail/completed/common/summary-text.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/datasets/documents/detail/completed/components/menu-bar.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/datasets/documents/detail/completed/display-toggle.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/datasets/documents/detail/completed/hooks/use-search-filter.ts": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/documents/detail/completed/index.tsx": { "react-refresh/only-export-components": { "count": 1 @@ -3292,6 +3772,9 @@ } }, "app/components/datasets/documents/detail/completed/segment-card/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -3306,6 +3789,11 @@ "count": 1 } }, + "app/components/datasets/documents/detail/completed/status-item.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/documents/detail/context.ts": { "ts/no-explicit-any": { "count": 1 @@ -3321,6 +3809,16 @@ "count": 3 } }, + "app/components/datasets/documents/detail/metadata/components/doc-type-selector.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/datasets/documents/detail/metadata/components/field-info.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/documents/detail/new-segment.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 3 @@ -3365,12 +3863,20 @@ "count": 2 } }, + "app/components/datasets/documents/status-item/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/external-api/external-api-modal/Form.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/datasets/external-api/external-api-modal/index.tsx": { + "no-restricted-imports": { + "count": 2 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 }, @@ -3430,6 +3936,9 @@ } }, "app/components/datasets/extra-info/api-access/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -3440,11 +3949,17 @@ } }, "app/components/datasets/extra-info/service-api/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/datasets/extra-info/statistics.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 } @@ -3463,6 +3978,9 @@ } }, "app/components/datasets/hit-testing/components/chunk-detail-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -3473,6 +3991,9 @@ } }, "app/components/datasets/hit-testing/components/query-input/textarea.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -3483,6 +4004,9 @@ } }, "app/components/datasets/hit-testing/components/result-item-external.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -3503,6 +4027,9 @@ } }, "app/components/datasets/list/dataset-card/components/dataset-card-footer.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -3537,6 +4064,11 @@ "count": 1 } }, + "app/components/datasets/metadata/edit-metadata-batch/edited-beacon.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/metadata/edit-metadata-batch/input-combined.tsx": { "ts/no-explicit-any": { "count": 2 @@ -3556,6 +4088,9 @@ } }, "app/components/datasets/metadata/edit-metadata-batch/modal.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -3576,11 +4111,17 @@ } }, "app/components/datasets/metadata/metadata-dataset/create-metadata-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 1 } }, "app/components/datasets/metadata/metadata-dataset/dataset-metadata-drawer.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 5 }, @@ -3593,6 +4134,11 @@ "count": 1 } }, + "app/components/datasets/metadata/metadata-dataset/select-metadata-modal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/metadata/metadata-dataset/select-metadata.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 3 @@ -3607,6 +4153,9 @@ } }, "app/components/datasets/metadata/metadata-document/info-group.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 }, @@ -3624,6 +4173,11 @@ "count": 1 } }, + "app/components/datasets/rename-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/settings/form/components/basic-info-section.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 3 @@ -3639,7 +4193,15 @@ "count": 7 } }, + "app/components/datasets/settings/index-method/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/datasets/settings/index-method/keyword-number.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -3650,6 +4212,9 @@ } }, "app/components/datasets/settings/permission-selector/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react/no-missing-key": { "count": 1 }, @@ -3668,6 +4233,9 @@ } }, "app/components/datasets/settings/summary-index-setting.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 11 } @@ -3688,11 +4256,26 @@ "count": 2 } }, + "app/components/develop/secret-key/input-copy.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/develop/secret-key/secret-key-button.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/develop/secret-key/secret-key-generate.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/develop/secret-key/secret-key-modal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/explore/banner/banner-item.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 4 @@ -3712,6 +4295,9 @@ } }, "app/components/explore/create-app-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -3723,6 +4309,9 @@ } }, "app/components/explore/item-operation/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 } @@ -3738,6 +4327,9 @@ } }, "app/components/explore/try-app/app/chat.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -3750,6 +4342,11 @@ "count": 1 } }, + "app/components/explore/try-app/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/explore/try-app/preview/basic-app-preview.tsx": { "tailwindcss/no-unnecessary-whitespace": { "count": 2 @@ -3796,19 +4393,14 @@ "count": 1 } }, - "app/components/header/account-dropdown/compliance.tsx": { - "tailwindcss/enforce-consistent-class-order": { - "count": 6 + "app/components/goto-anything/index.tsx": { + "no-restricted-imports": { + "count": 1 } }, - "app/components/header/account-dropdown/index.tsx": { - "tailwindcss/enforce-consistent-class-order": { - "count": 12 - } - }, - "app/components/header/account-dropdown/support.tsx": { - "tailwindcss/enforce-consistent-class-order": { - "count": 5 + "app/components/header/account-about/index.tsx": { + "no-restricted-imports": { + "count": 1 } }, "app/components/header/account-dropdown/workplace-selector/index.tsx": { @@ -3824,6 +4416,16 @@ "count": 2 } }, + "app/components/header/account-setting/api-based-extension-page/modal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/header/account-setting/api-based-extension-page/selector.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/header/account-setting/data-source-page-new/card.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 4 @@ -3833,6 +4435,9 @@ } }, "app/components/header/account-setting/data-source-page-new/configure.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -3874,16 +4479,25 @@ } }, "app/components/header/account-setting/data-source-page/data-source-website/config-firecrawl-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/header/account-setting/data-source-page/data-source-website/config-jina-reader-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/header/account-setting/data-source-page/data-source-website/config-watercrawl-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -3916,12 +4530,48 @@ "count": 1 } }, + "app/components/header/account-setting/language-page/index.tsx": { + "no-restricted-imports": { + "count": 2 + } + }, + "app/components/header/account-setting/members-page/edit-workspace-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/header/account-setting/members-page/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/header/account-setting/members-page/invite-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 3 } }, + "app/components/header/account-setting/members-page/invite-modal/role-selector.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/header/account-setting/members-page/invited-modal/index.tsx": { + "no-restricted-imports": { + "count": 2 + } + }, + "app/components/header/account-setting/members-page/invited-modal/invitation-link.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/header/account-setting/members-page/operation/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 5 } @@ -3932,11 +4582,17 @@ } }, "app/components/header/account-setting/members-page/transfer-ownership-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 3 } }, "app/components/header/account-setting/members-page/transfer-ownership-modal/member-selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 2 } @@ -3973,6 +4629,9 @@ } }, "app/components/header/account-setting/model-provider-page/model-auth/add-custom-model.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -3983,11 +4642,17 @@ } }, "app/components/header/account-setting/model-provider-page/model-auth/authorized/credential-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/header/account-setting/model-provider-page/model-auth/authorized/index.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -4000,7 +4665,15 @@ "count": 1 } }, + "app/components/header/account-setting/model-provider-page/model-auth/config-provider.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/header/account-setting/model-provider-page/model-auth/credential-selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 } @@ -4016,6 +4689,9 @@ } }, "app/components/header/account-setting/model-provider-page/model-auth/switch-credential-in-load-balancing.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 3 } @@ -4026,6 +4702,9 @@ } }, "app/components/header/account-setting/model-provider-page/model-modal/Form.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 10 }, @@ -4039,6 +4718,9 @@ } }, "app/components/header/account-setting/model-provider-page/model-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 6 }, @@ -4065,6 +4747,9 @@ } }, "app/components/header/account-setting/model-provider-page/model-parameter-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -4077,12 +4762,20 @@ "count": 1 } }, + "app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item.tsx": { + "no-restricted-imports": { + "count": 2 + } + }, "app/components/header/account-setting/model-provider-page/model-parameter-modal/presets-parameter.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/header/account-setting/model-provider-page/model-parameter-modal/status-indicators.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 }, @@ -4091,26 +4784,58 @@ } }, "app/components/header/account-setting/model-provider-page/model-parameter-modal/trigger.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 2 } }, "app/components/header/account-setting/model-provider-page/model-selector/deprecated-model-trigger.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/header/account-setting/model-provider-page/model-selector/feature-icon.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/header/account-setting/model-provider-page/model-selector/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/header/account-setting/model-provider-page/model-selector/model-trigger.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } }, + "app/components/header/account-setting/model-provider-page/model-selector/popup.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/header/account-setting/model-provider-page/provider-added-card/add-model-button.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/header/account-setting/model-provider-page/provider-added-card/cooldown-timer.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 2 } @@ -4129,6 +4854,9 @@ } }, "app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4139,11 +4867,17 @@ } }, "app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 5 } }, "app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 }, @@ -4154,7 +4888,15 @@ "count": 3 } }, + "app/components/header/account-setting/model-provider-page/provider-added-card/priority-use-tip.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -4164,6 +4906,11 @@ "count": 1 } }, + "app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx": { + "no-restricted-imports": { + "count": 2 + } + }, "app/components/header/account-setting/plugin-page/utils.ts": { "ts/no-explicit-any": { "count": 4 @@ -4202,12 +4949,20 @@ "count": 1 } }, + "app/components/plugins/base/badges/icon-with-tooltip.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/plugins/base/deprecation-notice.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/plugins/base/key-value-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -4264,6 +5019,9 @@ } }, "app/components/plugins/install-plugin/install-bundle/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-refresh/only-export-components": { "count": 1 }, @@ -4282,6 +5040,9 @@ } }, "app/components/plugins/install-plugin/install-from-github/index.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -4295,6 +5056,9 @@ } }, "app/components/plugins/install-plugin/install-from-github/steps/selectPackage.tsx": { + "no-restricted-imports": { + "count": 2 + }, "ts/no-explicit-any": { "count": 1 } @@ -4305,6 +5069,9 @@ } }, "app/components/plugins/install-plugin/install-from-local-package/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4323,6 +5090,9 @@ } }, "app/components/plugins/install-plugin/install-from-marketplace/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4371,6 +5141,9 @@ } }, "app/components/plugins/marketplace/search-box/tags-filter.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4386,6 +5159,9 @@ } }, "app/components/plugins/marketplace/sort-dropdown/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -4399,16 +5175,25 @@ } }, "app/components/plugins/plugin-auth/authorize/api-key-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 2 } }, "app/components/plugins/plugin-auth/authorize/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/plugins/plugin-auth/authorize/oauth-client-settings.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 2 } @@ -4419,6 +5204,9 @@ } }, "app/components/plugins/plugin-auth/authorized/index.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -4427,6 +5215,9 @@ } }, "app/components/plugins/plugin-auth/authorized/item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 }, @@ -4473,6 +5264,9 @@ } }, "app/components/plugins/plugin-detail-panel/app-selector/app-inputs-form.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -4486,6 +5280,9 @@ } }, "app/components/plugins/plugin-detail-panel/app-selector/app-picker.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -4496,6 +5293,9 @@ } }, "app/components/plugins/plugin-detail-panel/app-selector/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4509,11 +5309,22 @@ } }, "app/components/plugins/plugin-detail-panel/detail-header/components/plugin-source-badge.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/plugins/plugin-detail-panel/detail-header/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/plugins/plugin-detail-panel/endpoint-card.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 5 }, @@ -4522,6 +5333,9 @@ } }, "app/components/plugins/plugin-detail-panel/endpoint-list.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 }, @@ -4546,6 +5360,9 @@ } }, "app/components/plugins/plugin-detail-panel/model-selector/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 }, @@ -4559,6 +5376,9 @@ } }, "app/components/plugins/plugin-detail-panel/model-selector/tts-params-panel.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -4567,6 +5387,9 @@ } }, "app/components/plugins/plugin-detail-panel/multiple-tool-selector/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 }, @@ -4575,6 +5398,9 @@ } }, "app/components/plugins/plugin-detail-panel/operation-dropdown.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 } @@ -4592,12 +5418,25 @@ "count": 2 } }, + "app/components/plugins/plugin-detail-panel/subscription-list/create/common-modal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/plugins/plugin-detail-panel/subscription-list/create/components/modal-steps.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 3 } }, + "app/components/plugins/plugin-detail-panel/subscription-list/create/index.tsx": { + "no-restricted-imports": { + "count": 3 + } + }, "app/components/plugins/plugin-detail-panel/subscription-list/create/oauth-client.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -4611,16 +5450,32 @@ } }, "app/components/plugins/plugin-detail-panel/subscription-list/edit/apikey-edit-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/plugins/plugin-detail-panel/subscription-list/edit/manual-edit-modal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/plugins/plugin-detail-panel/subscription-list/edit/oauth-edit-modal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/plugins/plugin-detail-panel/subscription-list/index.tsx": { "react-refresh/only-export-components": { "count": 1 } }, "app/components/plugins/plugin-detail-panel/subscription-list/list-view.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4634,26 +5489,41 @@ } }, "app/components/plugins/plugin-detail-panel/subscription-list/selector-entry.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/plugins/plugin-detail-panel/subscription-list/selector-view.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/plugins/plugin-detail-panel/subscription-list/subscription-card.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } }, "app/components/plugins/plugin-detail-panel/tool-selector/components/reasoning-config-form.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 6 } }, "app/components/plugins/plugin-detail-panel/tool-selector/components/schema-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4663,6 +5533,11 @@ "count": 2 } }, + "app/components/plugins/plugin-detail-panel/tool-selector/components/tool-item.tsx": { + "no-restricted-imports": { + "count": 2 + } + }, "app/components/plugins/plugin-detail-panel/tool-selector/components/tool-settings-panel.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 4 @@ -4674,6 +5549,9 @@ } }, "app/components/plugins/plugin-detail-panel/tool-selector/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4691,7 +5569,15 @@ "count": 3 } }, + "app/components/plugins/plugin-item/action.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/plugins/plugin-item/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 7 }, @@ -4700,6 +5586,9 @@ } }, "app/components/plugins/plugin-mutation-model/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4713,6 +5602,9 @@ } }, "app/components/plugins/plugin-page/debug-info.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4726,16 +5618,30 @@ } }, "app/components/plugins/plugin-page/filter-management/category-filter.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } }, "app/components/plugins/plugin-page/filter-management/tag-filter.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } }, + "app/components/plugins/plugin-page/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/plugins/plugin-page/install-plugin-dropdown.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 2 }, @@ -4743,11 +5649,26 @@ "count": 2 } }, + "app/components/plugins/plugin-page/plugin-info.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/plugins/plugin-page/plugin-tasks/components/plugin-task-list.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, + "app/components/plugins/plugin-page/plugin-tasks/components/task-status-indicator.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/plugins/plugin-page/plugin-tasks/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/plugins/provider-card.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 @@ -4779,6 +5700,9 @@ } }, "app/components/plugins/reference-setting-modal/auto-update-setting/strategy-picker.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -4791,7 +5715,15 @@ "count": 1 } }, + "app/components/plugins/reference-setting-modal/auto-update-setting/tool-picker.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/plugins/reference-setting-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4812,11 +5744,17 @@ } }, "app/components/plugins/update-plugin/from-market-place.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/plugins/update-plugin/plugin-version-picker.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -4880,6 +5818,9 @@ } }, "app/components/rag-pipeline/components/panel/input-field/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -4890,6 +5831,9 @@ } }, "app/components/rag-pipeline/components/panel/input-field/label-right-content/global-inputs.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -4958,6 +5902,9 @@ } }, "app/components/rag-pipeline/components/publish-as-knowledge-pipeline-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 }, @@ -4975,6 +5922,11 @@ "count": 1 } }, + "app/components/rag-pipeline/components/rag-pipeline-header/publisher/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 8 @@ -4994,11 +5946,17 @@ } }, "app/components/rag-pipeline/components/update-dsl-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } }, "app/components/rag-pipeline/components/version-mismatch-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -5055,11 +6013,17 @@ } }, "app/components/share/text-generation/info-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/share/text-generation/menu-dropdown.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 }, @@ -5097,6 +6061,9 @@ } }, "app/components/share/text-generation/run-once/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 }, @@ -5118,6 +6085,9 @@ } }, "app/components/tools/edit-custom-collection-modal/config-credentials.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 7 } @@ -5159,11 +6129,17 @@ } }, "app/components/tools/labels/filter.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 1 } }, "app/components/tools/labels/selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 1 } @@ -5182,6 +6158,9 @@ } }, "app/components/tools/mcp/detail/content.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 12 }, @@ -5190,11 +6169,17 @@ } }, "app/components/tools/mcp/detail/operation-dropdown.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/tools/mcp/detail/tool-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 8 } @@ -5205,6 +6190,9 @@ } }, "app/components/tools/mcp/mcp-server-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 5 }, @@ -5221,11 +6209,17 @@ } }, "app/components/tools/mcp/mcp-service-card.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } }, "app/components/tools/mcp/modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 7 } @@ -5294,7 +6288,15 @@ "count": 4 } }, + "app/components/tools/workflow-tool/confirm-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/tools/workflow-tool/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 7 }, @@ -5303,6 +6305,9 @@ } }, "app/components/tools/workflow-tool/method-selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 1 } @@ -5321,6 +6326,9 @@ } }, "app/components/workflow-app/components/workflow-onboarding-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -5389,11 +6397,17 @@ } }, "app/components/workflow/block-selector/blocks.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/workflow/block-selector/featured-tools.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 2 }, @@ -5408,6 +6422,9 @@ } }, "app/components/workflow/block-selector/featured-triggers.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 2 }, @@ -5431,7 +6448,15 @@ "count": 1 } }, + "app/components/workflow/block-selector/main.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/block-selector/market-place-plugin/action.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 }, @@ -5466,16 +6491,30 @@ } }, "app/components/workflow/block-selector/start-blocks.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 } }, "app/components/workflow/block-selector/tabs.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/workflow/block-selector/tool-picker.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/block-selector/tool/action-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -5494,6 +6533,9 @@ } }, "app/components/workflow/block-selector/trigger-plugin/action-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -5541,10 +6583,18 @@ } }, "app/components/workflow/dsl-export-confirm-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 6 } }, + "app/components/workflow/header/checklist.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/header/editing-title.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -5577,6 +6627,9 @@ } }, "app/components/workflow/header/test-run-menu.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-refresh/only-export-components": { "count": 1 }, @@ -5590,11 +6643,22 @@ } }, "app/components/workflow/header/version-history-button.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/workflow/header/view-history.tsx": { + "no-restricted-imports": { + "count": 2 + } + }, "app/components/workflow/header/view-workflow-history.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 1 } @@ -5688,6 +6752,9 @@ } }, "app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx": { + "no-restricted-imports": { + "count": 3 + }, "ts/no-explicit-any": { "count": 4 } @@ -5706,6 +6773,9 @@ } }, "app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 11 } @@ -5733,6 +6803,11 @@ "count": 1 } }, + "app/components/workflow/nodes/_base/components/config-vision.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/_base/components/editor/base.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -5773,6 +6848,9 @@ } }, "app/components/workflow/nodes/_base/components/error-handle/error-handle-on-panel.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -5783,6 +6861,9 @@ } }, "app/components/workflow/nodes/_base/components/error-handle/error-handle-type-selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -5798,6 +6879,9 @@ } }, "app/components/workflow/nodes/_base/components/field.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -5818,6 +6902,9 @@ } }, "app/components/workflow/nodes/_base/components/form-input-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -5825,17 +6912,30 @@ "count": 33 } }, + "app/components/workflow/nodes/_base/components/form-input-type-switch.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/_base/components/group.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/workflow/nodes/_base/components/help-link.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/_base/components/info-panel.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/workflow/nodes/_base/components/input-support-select-var.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 1 }, @@ -5849,6 +6949,9 @@ } }, "app/components/workflow/nodes/_base/components/layout/field-title.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -5868,6 +6971,11 @@ "count": 1 } }, + "app/components/workflow/nodes/_base/components/mcp-tool-not-support-tooltip.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/_base/components/memory-config.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -5900,10 +7008,18 @@ } }, "app/components/workflow/nodes/_base/components/next-step/operator.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/workflow/nodes/_base/components/node-control.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/_base/components/node-handle.tsx": { "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 @@ -5916,6 +7032,9 @@ } }, "app/components/workflow/nodes/_base/components/option-card.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -5925,7 +7044,15 @@ "count": 3 } }, + "app/components/workflow/nodes/_base/components/panel-operator/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/_base/components/prompt/editor.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 2 }, @@ -5952,6 +7079,9 @@ } }, "app/components/workflow/nodes/_base/components/setting-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -5960,6 +7090,9 @@ } }, "app/components/workflow/nodes/_base/components/switch-plugin-version.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -5969,6 +7102,11 @@ "count": 1 } }, + "app/components/workflow/nodes/_base/components/variable/constant-field.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/_base/components/variable/manage-input-field.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 @@ -5980,6 +7118,9 @@ } }, "app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/picker/field.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -6008,6 +7149,9 @@ } }, "app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx": { + "no-restricted-imports": { + "count": 2 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 2 }, @@ -6027,6 +7171,9 @@ } }, "app/components/workflow/nodes/_base/components/variable/var-reference-vars.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 6 }, @@ -6034,7 +7181,15 @@ "count": 3 } }, + "app/components/workflow/nodes/_base/components/variable/var-type-picker.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/_base/components/variable/variable-label/base/variable-label.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -6050,6 +7205,9 @@ } }, "app/components/workflow/nodes/_base/components/workflow-panel/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 3 }, @@ -6116,6 +7274,9 @@ } }, "app/components/workflow/nodes/_base/node.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 3 } @@ -6126,10 +7287,18 @@ } }, "app/components/workflow/nodes/agent/components/model-bar.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-empty-object-type": { "count": 1 } }, + "app/components/workflow/nodes/agent/components/tool-icon.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/agent/default.ts": { "ts/no-explicit-any": { "count": 3 @@ -6169,6 +7338,9 @@ } }, "app/components/workflow/nodes/assigner/components/operation-selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -6213,6 +7385,11 @@ "count": 1 } }, + "app/components/workflow/nodes/code/dependency-picker.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/code/use-config.ts": { "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 2 @@ -6309,11 +7486,21 @@ "count": 1 } }, + "app/components/workflow/nodes/http/components/authorization/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/http/components/authorization/radio-group.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, + "app/components/workflow/nodes/http/components/curl-panel.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/http/components/key-value/key-value-edit/index.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -6323,6 +7510,9 @@ } }, "app/components/workflow/nodes/http/components/key-value/key-value-edit/item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 }, @@ -6354,31 +7544,49 @@ } }, "app/components/workflow/nodes/human-input/components/button-style-dropdown.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/workflow/nodes/human-input/components/delivery-method/email-configure-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 8 } }, "app/components/workflow/nodes/human-input/components/delivery-method/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/workflow/nodes/human-input/components/delivery-method/method-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/workflow/nodes/human-input/components/delivery-method/method-selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 14 } }, "app/components/workflow/nodes/human-input/components/delivery-method/recipient/email-input.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -6398,7 +7606,15 @@ "count": 6 } }, + "app/components/workflow/nodes/human-input/components/delivery-method/recipient/member-selector.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/human-input/components/delivery-method/test-email-sender.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 21 }, @@ -6407,6 +7623,9 @@ } }, "app/components/workflow/nodes/human-input/components/delivery-method/upgrade-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -6457,6 +7676,9 @@ } }, "app/components/workflow/nodes/human-input/panel.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 }, @@ -6464,6 +7686,11 @@ "count": 1 } }, + "app/components/workflow/nodes/if-else/components/condition-add.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/if-else/components/condition-files-list-value.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 3 @@ -6478,11 +7705,27 @@ } }, "app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, + "app/components/workflow/nodes/if-else/components/condition-list/condition-operator.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/workflow/nodes/if-else/components/condition-list/condition-var-selector.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/if-else/components/condition-number-input.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 }, @@ -6491,6 +7734,9 @@ } }, "app/components/workflow/nodes/if-else/components/condition-wrap.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 2 } @@ -6505,6 +7751,11 @@ "count": 5 } }, + "app/components/workflow/nodes/iteration-start/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/iteration/add-block.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -6521,6 +7772,9 @@ } }, "app/components/workflow/nodes/iteration/panel.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -6528,6 +7782,11 @@ "count": 1 } }, + "app/components/workflow/nodes/iteration/use-config.ts": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/iteration/use-single-run-form-params.ts": { "ts/no-explicit-any": { "count": 6 @@ -6539,11 +7798,17 @@ } }, "app/components/workflow/nodes/knowledge-base/components/chunk-structure/selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/workflow/nodes/knowledge-base/components/index-method.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -6563,6 +7828,16 @@ "count": 1 } }, + "app/components/workflow/nodes/knowledge-base/components/retrieval-setting/search-method-option.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/workflow/nodes/knowledge-base/components/retrieval-setting/top-k-and-score-threshold.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/knowledge-base/components/retrieval-setting/type.ts": { "ts/no-explicit-any": { "count": 2 @@ -6587,11 +7862,17 @@ } }, "app/components/workflow/nodes/knowledge-retrieval/components/metadata/add-condition.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-common-variable-selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 } @@ -6609,17 +7890,36 @@ "count": 1 } }, + "app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-operator.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-value-method.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-variable-selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-filter/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, "app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-filter/metadata-filter-selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -6630,11 +7930,17 @@ } }, "app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-trigger.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/workflow/nodes/knowledge-retrieval/components/retrieval-config.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 2 } @@ -6673,11 +7979,17 @@ } }, "app/components/workflow/nodes/list-operator/components/filter-condition.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 1 } }, "app/components/workflow/nodes/list-operator/components/sub-variable-picker.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 }, @@ -6699,6 +8011,9 @@ } }, "app/components/workflow/nodes/llm/components/config-prompt-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "ts/no-explicit-any": { "count": 3 } @@ -6709,6 +8024,9 @@ } }, "app/components/workflow/nodes/llm/components/json-schema-config-modal/code-editor.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 }, @@ -6721,7 +8039,15 @@ "count": 1 } }, + "app/components/workflow/nodes/llm/components/json-schema-config-modal/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/llm/components/json-schema-config-modal/json-importer.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -6738,11 +8064,17 @@ } }, "app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 2 } }, "app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/prompt-editor.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 } @@ -6757,6 +8089,11 @@ "count": 3 } }, + "app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/actions.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/advanced-options.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 @@ -6781,6 +8118,9 @@ } }, "app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/type-selector.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -6804,6 +8144,9 @@ } }, "app/components/workflow/nodes/llm/panel.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -6826,11 +8169,21 @@ "count": 10 } }, + "app/components/workflow/nodes/loop-start/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/loop/add-block.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, + "app/components/workflow/nodes/loop/components/condition-add.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/loop/components/condition-files-list-value.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 3 @@ -6845,11 +8198,27 @@ } }, "app/components/workflow/nodes/loop/components/condition-list/condition-item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } }, + "app/components/workflow/nodes/loop/components/condition-list/condition-operator.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/workflow/nodes/loop/components/condition-list/condition-var-selector.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/loop/components/condition-number-input.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 }, @@ -6858,6 +8227,9 @@ } }, "app/components/workflow/nodes/loop/components/condition-wrap.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 1 } @@ -6872,11 +8244,21 @@ "count": 3 } }, + "app/components/workflow/nodes/loop/components/loop-variables/input-mode-selec.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/loop/components/loop-variables/item.tsx": { "ts/no-explicit-any": { "count": 4 } }, + "app/components/workflow/nodes/loop/components/loop-variables/variable-type-select.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/loop/default.ts": { "ts/no-explicit-any": { "count": 1 @@ -6898,6 +8280,9 @@ } }, "app/components/workflow/nodes/parameter-extractor/components/extract-parameter/update.tsx": { + "no-restricted-imports": { + "count": 2 + }, "ts/no-explicit-any": { "count": 1 } @@ -6907,6 +8292,11 @@ "count": 1 } }, + "app/components/workflow/nodes/parameter-extractor/panel.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/parameter-extractor/use-config.ts": { "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 2 @@ -6920,6 +8310,11 @@ "count": 9 } }, + "app/components/workflow/nodes/question-classifier/components/advanced-setting.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/question-classifier/components/class-item.tsx": { "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 @@ -6936,6 +8331,9 @@ } }, "app/components/workflow/nodes/question-classifier/node.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -6997,6 +8395,9 @@ } }, "app/components/workflow/nodes/tool/components/copy-id.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 }, @@ -7031,6 +8432,9 @@ } }, "app/components/workflow/nodes/tool/components/tool-form/item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 5 }, @@ -7079,6 +8483,9 @@ } }, "app/components/workflow/nodes/trigger-plugin/components/trigger-form/item.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 5 }, @@ -7121,6 +8528,16 @@ "count": 7 } }, + "app/components/workflow/nodes/trigger-schedule/components/frequency-selector.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/workflow/nodes/trigger-schedule/components/monthly-days-selector.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/trigger-schedule/default.ts": { "regexp/no-unused-capturing-group": { "count": 2 @@ -7130,6 +8547,9 @@ } }, "app/components/workflow/nodes/trigger-webhook/components/generic-table.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -7140,6 +8560,9 @@ } }, "app/components/workflow/nodes/trigger-webhook/panel.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 } @@ -7154,6 +8577,11 @@ "count": 1 } }, + "app/components/workflow/nodes/variable-assigner/components/add-variable/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/nodes/variable-assigner/components/node-variable-item.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -7189,10 +8617,28 @@ } }, "app/components/workflow/note-node/note-editor/toolbar/color-picker.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-refresh/only-export-components": { "count": 1 } }, + "app/components/workflow/note-node/note-editor/toolbar/command.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/workflow/note-node/note-editor/toolbar/font-size-selector.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/workflow/note-node/note-editor/toolbar/operator.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/note-node/note-editor/utils.ts": { "regexp/no-useless-quantifier": { "count": 1 @@ -7209,16 +8655,25 @@ } }, "app/components/workflow/operator/more-actions.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 6 } }, "app/components/workflow/operator/tip-popup.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } }, "app/components/workflow/operator/zoom-in-out.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -7273,6 +8728,11 @@ "count": 6 } }, + "app/components/workflow/panel/chat-variable-panel/components/variable-modal-trigger.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/panel/chat-variable-panel/components/variable-modal.tsx": { "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 8 @@ -7285,6 +8745,9 @@ } }, "app/components/workflow/panel/chat-variable-panel/components/variable-type-select.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 6 }, @@ -7303,6 +8766,9 @@ } }, "app/components/workflow/panel/debug-and-preview/conversation-variable-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 9 }, @@ -7316,6 +8782,9 @@ } }, "app/components/workflow/panel/debug-and-preview/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -7331,6 +8800,9 @@ } }, "app/components/workflow/panel/env-panel/variable-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 4 }, @@ -7341,6 +8813,11 @@ "count": 1 } }, + "app/components/workflow/panel/env-panel/variable-trigger.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/panel/global-variable-panel/index.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 2 @@ -7366,6 +8843,11 @@ "count": 1 } }, + "app/components/workflow/panel/version-history-panel/context-menu/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/panel/version-history-panel/context-menu/menu-item.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -7375,6 +8857,9 @@ } }, "app/components/workflow/panel/version-history-panel/delete-confirm-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -7398,6 +8883,9 @@ } }, "app/components/workflow/panel/version-history-panel/filter/index.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/no-unnecessary-whitespace": { "count": 1 } @@ -7418,6 +8906,9 @@ } }, "app/components/workflow/panel/version-history-panel/restore-confirm-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 }, @@ -7444,6 +8935,9 @@ } }, "app/components/workflow/run/agent-log/agent-log-nav-more.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 } @@ -7519,6 +9013,9 @@ } }, "app/components/workflow/run/node.tsx": { + "no-restricted-imports": { + "count": 1 + }, "react-hooks-extra/no-direct-set-state-in-use-effect": { "count": 1 }, @@ -7657,6 +9154,9 @@ } }, "app/components/workflow/update-dsl-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 5 }, @@ -7713,6 +9213,9 @@ } }, "app/components/workflow/variable-inspect/group.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 }, @@ -7734,6 +9237,9 @@ } }, "app/components/workflow/variable-inspect/listening.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 }, @@ -7750,6 +9256,9 @@ } }, "app/components/workflow/variable-inspect/right.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 }, @@ -7758,6 +9267,9 @@ } }, "app/components/workflow/variable-inspect/trigger.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 }, @@ -7795,6 +9307,9 @@ } }, "app/components/workflow/workflow-preview/components/nodes/base.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 3 }, @@ -7807,7 +9322,20 @@ "count": 1 } }, + "app/components/workflow/workflow-preview/components/nodes/iteration-start/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "app/components/workflow/workflow-preview/components/nodes/loop-start/index.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/components/workflow/workflow-preview/components/zoom-in-out.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 2 } @@ -7818,6 +9346,9 @@ } }, "app/education-apply/expire-notice-modal.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 4 } @@ -7836,6 +9367,9 @@ } }, "app/education-apply/search-input.tsx": { + "no-restricted-imports": { + "count": 1 + }, "tailwindcss/enforce-consistent-class-order": { "count": 1 }, @@ -7894,6 +9428,11 @@ "count": 6 } }, + "app/signin/_header.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/signin/components/mail-and-code-auth.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -7904,6 +9443,11 @@ "count": 1 } }, + "app/signin/invite-settings/page.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "app/signin/layout.tsx": { "tailwindcss/enforce-consistent-class-order": { "count": 1 @@ -7913,6 +9457,9 @@ } }, "app/signin/one-more-step.tsx": { + "no-restricted-imports": { + "count": 2 + }, "tailwindcss/enforce-consistent-class-order": { "count": 7 }, diff --git a/web/eslint.config.mjs b/web/eslint.config.mjs index cf7825fc61..acc585ca7e 100644 --- a/web/eslint.config.mjs +++ b/web/eslint.config.mjs @@ -6,6 +6,7 @@ import hyoban from 'eslint-plugin-hyoban' import sonar from 'eslint-plugin-sonarjs' import storybook from 'eslint-plugin-storybook' import dify from './eslint-rules/index.js' +import { OVERLAY_MIGRATION_LEGACY_BASE_FILES } from './eslint.constants.mjs' // Enable Tailwind CSS IntelliSense mode for ESLint runs // See: tailwind-css-plugin.ts @@ -145,4 +146,51 @@ export default antfu( 'hyoban/no-dependency-version-prefix': 'error', }, }, + { + name: 'dify/base-ui-primitives', + files: ['app/components/base/ui/**/*.tsx'], + rules: { + 'react-refresh/only-export-components': 'off', + }, + }, + { + name: 'dify/overlay-migration', + files: [GLOB_TS, GLOB_TSX], + ignores: [ + ...GLOB_TESTS, + ...OVERLAY_MIGRATION_LEGACY_BASE_FILES, + ], + rules: { + 'no-restricted-imports': ['error', { + patterns: [{ + group: [ + '**/portal-to-follow-elem', + '**/portal-to-follow-elem/index', + ], + message: 'Deprecated: use semantic overlay primitives from @/app/components/base/ui/ instead. See issue #32767.', + }, { + group: [ + '**/base/tooltip', + '**/base/tooltip/index', + ], + message: 'Deprecated: use @/app/components/base/ui/tooltip instead. See issue #32767.', + }, { + group: [ + '**/base/modal', + '**/base/modal/index', + '**/base/modal/modal', + ], + message: 'Deprecated: use @/app/components/base/ui/dialog instead. See issue #32767.', + }, { + group: [ + '**/base/select', + '**/base/select/index', + '**/base/select/custom', + '**/base/select/pure', + ], + message: 'Deprecated: use @/app/components/base/ui/select instead. See issue #32767.', + }], + }], + }, + }, ) diff --git a/web/eslint.constants.mjs b/web/eslint.constants.mjs new file mode 100644 index 0000000000..2ec571de84 --- /dev/null +++ b/web/eslint.constants.mjs @@ -0,0 +1,29 @@ +export const OVERLAY_MIGRATION_LEGACY_BASE_FILES = [ + 'app/components/base/chat/chat-with-history/header/mobile-operation-dropdown.tsx', + 'app/components/base/chat/chat-with-history/header/operation.tsx', + 'app/components/base/chat/chat-with-history/inputs-form/view-form-dropdown.tsx', + 'app/components/base/chat/chat-with-history/sidebar/operation.tsx', + 'app/components/base/chat/chat/citation/popup.tsx', + 'app/components/base/chat/chat/citation/progress-tooltip.tsx', + 'app/components/base/chat/chat/citation/tooltip.tsx', + 'app/components/base/chat/embedded-chatbot/inputs-form/view-form-dropdown.tsx', + 'app/components/base/chip/index.tsx', + 'app/components/base/date-and-time-picker/date-picker/index.tsx', + 'app/components/base/date-and-time-picker/time-picker/index.tsx', + 'app/components/base/dropdown/index.tsx', + 'app/components/base/features/new-feature-panel/file-upload/setting-modal.tsx', + 'app/components/base/features/new-feature-panel/text-to-speech/voice-settings.tsx', + 'app/components/base/file-uploader/file-from-link-or-local/index.tsx', + 'app/components/base/image-uploader/chat-image-uploader.tsx', + 'app/components/base/image-uploader/text-generation-image-uploader.tsx', + 'app/components/base/modal/modal.tsx', + 'app/components/base/prompt-editor/plugins/context-block/component.tsx', + 'app/components/base/prompt-editor/plugins/history-block/component.tsx', + 'app/components/base/select/custom.tsx', + 'app/components/base/select/index.tsx', + 'app/components/base/select/pure.tsx', + 'app/components/base/sort/index.tsx', + 'app/components/base/tag-management/filter.tsx', + 'app/components/base/theme-selector.tsx', + 'app/components/base/tooltip/index.tsx', +] diff --git a/web/package.json b/web/package.json index 2291d78998..a120f5718d 100644 --- a/web/package.json +++ b/web/package.json @@ -63,6 +63,7 @@ "dependencies": { "@amplitude/analytics-browser": "2.33.1", "@amplitude/plugin-session-replay-browser": "1.23.6", + "@base-ui/react": "1.2.0", "@emoji-mart/data": "1.2.1", "@floating-ui/react": "0.26.28", "@formatjs/intl-localematcher": "0.5.10", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 338cae78ca..17c3fb7f06 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -60,6 +60,9 @@ importers: '@amplitude/plugin-session-replay-browser': specifier: 1.23.6 version: 1.23.6(@amplitude/rrweb@2.0.0-alpha.35)(rollup@4.56.0) + '@base-ui/react': + specifier: 1.2.0 + version: 1.2.0(@types/react@19.2.9)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@emoji-mart/data': specifier: 1.2.1 version: 1.2.1 @@ -900,6 +903,27 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@base-ui/react@1.2.0': + resolution: {integrity: sha512-O6aEQHcm+QyGTFY28xuwRD3SEJGZOBDpyjN2WvpfWYFVhg+3zfXPysAILqtM0C1kWC82MccOE/v1j+GHXE4qIw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17 || ^18 || ^19 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@types/react': + optional: true + + '@base-ui/utils@0.2.5': + resolution: {integrity: sha512-oYC7w0gp76RI5MxprlGLV0wze0SErZaRl3AAkeP3OnNB/UBMb6RqNf6ZSIlxOc9Qp68Ab3C2VOcJQyRs7Xc7Vw==} + peerDependencies: + '@types/react': ^17 || ^18 || ^19 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@types/react': + optional: true + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -6812,6 +6836,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + reselect@5.1.1: + resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + reserved-identifiers@1.2.0: resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} engines: {node: '>=18'} @@ -8316,6 +8343,30 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@base-ui/react@1.2.0(@types/react@19.2.9)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + '@base-ui/utils': 0.2.5(@types/react@19.2.9)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/utils': 0.2.10 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + tabbable: 6.4.0 + use-sync-external-store: 1.6.0(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.9 + + '@base-ui/utils@0.2.5(@types/react@19.2.9)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + '@floating-ui/utils': 0.2.10 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + reselect: 5.1.1 + use-sync-external-store: 1.6.0(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.9 + '@bcoe/v8-coverage@1.0.2': {} '@braintree/sanitize-url@7.1.1': {} @@ -15127,6 +15178,8 @@ snapshots: require-from-string@2.0.2: {} + reselect@5.1.1: {} + reserved-identifiers@1.2.0: {} resize-observer-polyfill@1.5.1: {}