,
-}
-
-// Real-world example - Notification preferences
-const NotificationPreferencesDemo = () => {
- const [notifications, setNotifications] = useState({
- email: true,
- push: true,
- sms: false,
- desktop: true,
- })
-
- const allEnabled = Object.values(notifications).every(v => v)
- const someEnabled = Object.values(notifications).some(v => v)
-
- return (
-
-
-
Notification Channels
-
- {allEnabled ? 'All enabled' : someEnabled ? 'Some enabled' : 'All disabled'}
-
-
-
-
-
-
📧
-
-
Email
-
Receive notifications via email
-
-
-
setNotifications({ ...notifications, email: v })}
- />
-
-
-
-
-
🔔
-
-
Push Notifications
-
Mobile and browser push notifications
-
-
-
setNotifications({ ...notifications, push: v })}
- />
-
-
-
-
-
💬
-
-
SMS Messages
-
Receive text message notifications
-
-
-
setNotifications({ ...notifications, sms: v })}
- />
-
-
-
-
-
💻
-
-
Desktop Alerts
-
Show desktop notification popups
-
-
-
setNotifications({ ...notifications, desktop: v })}
- />
-
-
+
+
+ Regular skeleton
- )
-}
-
-export const NotificationPreferences: Story = {
- render: () =>
,
-}
-
-// Real-world example - API access control
-const APIAccessControlDemo = () => {
- const [access, setAccess] = useState({
- readAccess: true,
- writeAccess: true,
- deleteAccess: false,
- adminAccess: false,
- })
-
- return (
-
-
API Permissions
-
Configure access levels for API key
-
-
-
-
- ✓
- {' '}
- Read Access
-
-
View resources and data
-
-
setAccess({ ...access, readAccess: v })}
- />
-
-
-
-
-
- ✎
- {' '}
- Write Access
-
-
Create and update resources
-
-
setAccess({ ...access, writeAccess: v })}
- />
-
-
-
-
-
- 🗑
- {' '}
- Delete Access
-
-
Remove resources permanently
-
-
setAccess({ ...access, deleteAccess: v })}
- />
-
-
-
-
-
- ⚡
- {' '}
- Admin Access
-
-
Full administrative privileges
-
-
setAccess({ ...access, adminAccess: v })}
- />
-
-
+
+
+ Large skeleton
- )
+
+)
+
+export const Skeleton: Story = {
+ render: () =>
,
+ parameters: {
+ docs: {
+ description: {
+ story: '`SwitchSkeleton` renders a non-interactive placeholder with `bg-text-quaternary opacity-20`. Imported separately from `./skeleton`.',
+ },
+ },
+ },
}
-export const APIAccessControl: Story = {
- render: () =>
,
-}
-
-// Compact list with switches
-const CompactListDemo = () => {
- const [items, setItems] = useState([
- { id: 1, name: 'Feature A', enabled: true },
- { id: 2, name: 'Feature B', enabled: false },
- { id: 3, name: 'Feature C', enabled: true },
- { id: 4, name: 'Feature D', enabled: false },
- { id: 5, name: 'Feature E', enabled: true },
- ])
-
- const toggleItem = (id: number) => {
- setItems(items.map(item =>
- item.id === id ? { ...item, enabled: !item.enabled } : item,
- ))
- }
-
- return (
-
-
Quick Toggles
-
- {items.map(item => (
-
- {item.name}
- toggleItem(item.id)}
- />
-
- ))}
-
-
- )
-}
-
-export const CompactList: Story = {
- render: () =>
,
-}
-
-// Interactive playground
export const Playground: Story = {
render: args =>
,
args: {
size: 'md',
value: false,
disabled: false,
+ loading: false,
},
}
diff --git a/web/app/components/base/switch/index.tsx b/web/app/components/base/switch/index.tsx
index 20ac963950..b3321827b9 100644
--- a/web/app/components/base/switch/index.tsx
+++ b/web/app/components/base/switch/index.tsx
@@ -1,70 +1,125 @@
'use client'
-import { Switch as OriginalSwitch } from '@headlessui/react'
+
+import type { VariantProps } from 'class-variance-authority'
+import { Switch as BaseSwitch } from '@base-ui/react/switch'
+import { cva } from 'class-variance-authority'
import * as React from 'react'
import { cn } from '@/utils/classnames'
+const switchRootStateClassName = 'bg-components-toggle-bg-unchecked hover:bg-components-toggle-bg-unchecked-hover data-[checked]:bg-components-toggle-bg data-[checked]:hover:bg-components-toggle-bg-hover data-[disabled]:cursor-not-allowed data-[disabled]:bg-components-toggle-bg-unchecked-disabled data-[disabled]:hover:bg-components-toggle-bg-unchecked-disabled data-[disabled]:data-[checked]:bg-components-toggle-bg-disabled data-[disabled]:data-[checked]:hover:bg-components-toggle-bg-disabled'
+
+const switchRootVariants = cva(
+ `group relative inline-flex shrink-0 cursor-pointer touch-manipulation items-center transition-colors duration-200 ease-in-out focus-visible:ring-2 focus-visible:ring-components-toggle-bg motion-reduce:transition-none ${switchRootStateClassName}`,
+ {
+ variants: {
+ size: {
+ xs: 'h-2.5 w-3.5 rounded-[2px] p-0.5',
+ sm: 'h-3 w-5 rounded-[3.5px] p-0.5',
+ md: 'h-4 w-7 rounded-[5px] p-0.5',
+ lg: 'h-5 w-9 rounded-[6px] p-[3px]',
+ },
+ },
+ defaultVariants: {
+ size: 'md',
+ },
+ },
+)
+
+const switchThumbVariants = cva(
+ 'block bg-components-toggle-knob shadow-sm transition-transform duration-200 ease-in-out group-hover:bg-components-toggle-knob-hover group-hover:shadow-md group-data-[disabled]:bg-components-toggle-knob-disabled group-data-[disabled]:shadow-none motion-reduce:transition-none',
+ {
+ variants: {
+ size: {
+ xs: 'h-1.5 w-1 rounded-[1px] data-[checked]:translate-x-1.5',
+ sm: 'h-2 w-[7px] rounded-[2px] data-[checked]:translate-x-[9px]',
+ md: 'h-3 w-2.5 rounded-[3px] data-[checked]:translate-x-[14px]',
+ lg: 'size-3.5 rounded-[4px] data-[checked]:translate-x-4',
+ },
+ },
+ defaultVariants: {
+ size: 'md',
+ },
+ },
+)
+
+export type SwitchSize = NonNullable
['size']>
+
+const spinnerSizeConfig: Partial> = {
+ md: {
+ icon: 'size-2',
+ uncheckedPosition: 'left-[calc(50%+6px)]',
+ checkedPosition: 'left-[calc(50%-6px)]',
+ },
+ lg: {
+ icon: 'size-2.5',
+ uncheckedPosition: 'left-[calc(50%+8px)]',
+ checkedPosition: 'left-[calc(50%-8px)]',
+ },
+}
+
type SwitchProps = {
'value': boolean
'onChange'?: (value: boolean) => void
- 'size'?: 'xs' | 'sm' | 'md' | 'lg' | 'l'
+ 'size'?: SwitchSize
'disabled'?: boolean
+ 'loading'?: boolean
'className'?: string
+ 'aria-label'?: string
+ 'aria-labelledby'?: string
'data-testid'?: string
}
-const Switch = (
- {
- ref: propRef,
- value,
- onChange,
- size = 'md',
- disabled = false,
- className,
- 'data-testid': dataTestid,
- }: SwitchProps & {
- ref?: React.RefObject
- },
-) => {
- const wrapStyle = {
- lg: 'h-6 w-11',
- l: 'h-5 w-9',
- md: 'h-4 w-7',
- sm: 'h-3 w-5',
- xs: 'h-2.5 w-3.5',
- }
+const Switch = ({
+ ref,
+ value,
+ onChange,
+ size = 'md',
+ disabled = false,
+ loading = false,
+ className,
+ 'aria-label': ariaLabel,
+ 'aria-labelledby': ariaLabelledBy,
+ 'data-testid': dataTestid,
+}: SwitchProps & {
+ ref?: React.Ref
+}) => {
+ const isDisabled = disabled || loading
+ const spinner = loading ? spinnerSizeConfig[size] : undefined
- const circleStyle = {
- lg: 'h-5 w-5',
- l: 'h-4 w-4',
- md: 'h-3 w-3',
- sm: 'h-2 w-2',
- xs: 'h-1.5 w-1',
- }
-
- const translateLeft = {
- lg: 'translate-x-5',
- l: 'translate-x-4',
- md: 'translate-x-3',
- sm: 'translate-x-2',
- xs: 'translate-x-1.5',
- }
return (
- {
- if (disabled)
- return
- onChange?.(checked)
- }}
- className={cn(wrapStyle[size], value ? 'bg-components-toggle-bg' : 'bg-components-toggle-bg-unchecked', 'relative inline-flex shrink-0 cursor-pointer rounded-[5px] border-2 border-transparent transition-colors duration-200 ease-in-out', disabled ? '!cursor-not-allowed !opacity-50' : '', size === 'xs' && 'rounded-sm', className)}
+ onCheckedChange={checked => onChange?.(checked)}
+ disabled={isDisabled}
+ aria-busy={loading || undefined}
+ aria-label={ariaLabel}
+ aria-labelledby={ariaLabelledBy}
+ className={cn(switchRootVariants({ size }), className)}
data-testid={dataTestid}
>
-
-
+ {spinner
+ ? (
+
+
+
+ )
+ : null}
+
)
}
diff --git a/web/app/components/base/switch/skeleton.tsx b/web/app/components/base/switch/skeleton.tsx
new file mode 100644
index 0000000000..f62bcbc9f3
--- /dev/null
+++ b/web/app/components/base/switch/skeleton.tsx
@@ -0,0 +1,41 @@
+import type { SwitchSize } from './index'
+import { cva } from 'class-variance-authority'
+import { cn } from '@/utils/classnames'
+
+const skeletonVariants = cva(
+ 'bg-text-quaternary opacity-20',
+ {
+ variants: {
+ size: {
+ xs: 'h-2.5 w-3.5 rounded-[2px]',
+ sm: 'h-3 w-5 rounded-[3.5px]',
+ md: 'h-4 w-7 rounded-[5px]',
+ lg: 'h-5 w-9 rounded-[6px]',
+ },
+ },
+ defaultVariants: {
+ size: 'md',
+ },
+ },
+)
+
+type SwitchSkeletonProps = {
+ 'size'?: SwitchSize
+ 'className'?: string
+ 'data-testid'?: string
+}
+
+export function SwitchSkeleton({
+ size = 'md',
+ className,
+ 'data-testid': dataTestid,
+}: SwitchSkeletonProps) {
+ return (
+
+ )
+}
+
+SwitchSkeleton.displayName = 'SwitchSkeleton'
diff --git a/web/app/components/billing/pricing/plan-switcher/plan-range-switcher.tsx b/web/app/components/billing/pricing/plan-switcher/plan-range-switcher.tsx
index 92cbdf0e63..b2a1ae3bf5 100644
--- a/web/app/components/billing/pricing/plan-switcher/plan-range-switcher.tsx
+++ b/web/app/components/billing/pricing/plan-switcher/plan-range-switcher.tsx
@@ -23,7 +23,7 @@ const PlanRangeSwitcher: FC = ({
return (
{
onChange(v ? PlanRange.yearly : PlanRange.monthly)
diff --git a/web/app/components/custom/custom-web-app-brand/index.tsx b/web/app/components/custom/custom-web-app-brand/index.tsx
index e6f9a3837b..fa79c9540a 100644
--- a/web/app/components/custom/custom-web-app-brand/index.tsx
+++ b/web/app/components/custom/custom-web-app-brand/index.tsx
@@ -119,7 +119,7 @@ const CustomWebAppBrand = () => {
{t('webapp.removeBrand', { ns: 'custom' })}
{
it('should render disabled switch when embeddingAvailable is false in list scene', () => {
render()
- // Switch component uses opacity-50 class when disabled
- const disabledSwitch = document.querySelector('.\\!opacity-50')
- expect(disabledSwitch).toBeInTheDocument()
+ const disabledSwitch = screen.getByRole('switch')
+ expect(disabledSwitch).toHaveAttribute('aria-disabled', 'true')
})
})
diff --git a/web/app/components/datasets/documents/detail/completed/segment-card/__tests__/index.spec.tsx b/web/app/components/datasets/documents/detail/completed/segment-card/__tests__/index.spec.tsx
index f0edbb3ebc..00cf9769df 100644
--- a/web/app/components/datasets/documents/detail/completed/segment-card/__tests__/index.spec.tsx
+++ b/web/app/components/datasets/documents/detail/completed/segment-card/__tests__/index.spec.tsx
@@ -206,7 +206,7 @@ describe('SegmentCard', () => {
)
const switchElement = screen.getByRole('switch')
- expect(switchElement).toHaveClass('!cursor-not-allowed')
+ expect(switchElement).toHaveAttribute('aria-disabled', 'true')
})
it('should show action buttons when embeddingAvailable is true', () => {
@@ -792,9 +792,8 @@ describe('SegmentCard', () => {
/>,
)
- // The Switch component uses CSS classes for disabled state, not the native disabled attribute
const switchElement = screen.getByRole('switch')
- expect(switchElement).toHaveClass('!cursor-not-allowed', '!opacity-50')
+ expect(switchElement).toHaveAttribute('aria-disabled', 'true')
})
it('should handle zero word count', () => {
@@ -877,7 +876,7 @@ describe('SegmentCard', () => {
)
const switchElement = screen.getByRole('switch')
- expect(switchElement).toHaveClass('bg-components-toggle-bg')
+ expect(switchElement).toHaveAttribute('aria-checked', 'true')
})
it('should render real Switch component with unchecked state', () => {
@@ -893,7 +892,7 @@ describe('SegmentCard', () => {
)
const switchElement = screen.getByRole('switch')
- expect(switchElement).toHaveClass('bg-components-toggle-bg-unchecked')
+ expect(switchElement).toHaveAttribute('aria-checked', 'false')
})
it('should render real SegmentIndexTag with position formatting', () => {
diff --git a/web/app/components/datasets/documents/status-item/__tests__/index.spec.tsx b/web/app/components/datasets/documents/status-item/__tests__/index.spec.tsx
index ce31bdc62f..8e3cd721e2 100644
--- a/web/app/components/datasets/documents/status-item/__tests__/index.spec.tsx
+++ b/web/app/components/datasets/documents/status-item/__tests__/index.spec.tsx
@@ -169,9 +169,8 @@ describe('StatusItem', () => {
datasetId="dataset-1"
/>,
)
- const switchElement = document.querySelector('[role="switch"]')
- // Switch component uses opacity-50 and cursor-not-allowed when disabled
- expect(switchElement).toHaveClass('!opacity-50')
+ const switchElement = screen.getByRole('switch')
+ expect(switchElement).toHaveAttribute('aria-disabled', 'true')
})
it('should render switch as disabled when embedding (queuing status)', () => {
@@ -187,9 +186,8 @@ describe('StatusItem', () => {
datasetId="dataset-1"
/>,
)
- const switchElement = document.querySelector('[role="switch"]')
- // Switch component uses opacity-50 and cursor-not-allowed when disabled
- expect(switchElement).toHaveClass('!opacity-50')
+ const switchElement = screen.getByRole('switch')
+ expect(switchElement).toHaveAttribute('aria-disabled', 'true')
})
it('should render switch as disabled when embedding (indexing status)', () => {
@@ -205,9 +203,8 @@ describe('StatusItem', () => {
datasetId="dataset-1"
/>,
)
- const switchElement = document.querySelector('[role="switch"]')
- // Switch component uses opacity-50 and cursor-not-allowed when disabled
- expect(switchElement).toHaveClass('!opacity-50')
+ const switchElement = screen.getByRole('switch')
+ expect(switchElement).toHaveAttribute('aria-disabled', 'true')
})
it('should render switch as disabled when embedding (paused status)', () => {
@@ -223,9 +220,8 @@ describe('StatusItem', () => {
datasetId="dataset-1"
/>,
)
- const switchElement = document.querySelector('[role="switch"]')
- // Switch component uses opacity-50 and cursor-not-allowed when disabled
- expect(switchElement).toHaveClass('!opacity-50')
+ const switchElement = screen.getByRole('switch')
+ expect(switchElement).toHaveAttribute('aria-disabled', 'true')
})
})
diff --git a/web/app/components/datasets/extra-info/__tests__/index.spec.tsx b/web/app/components/datasets/extra-info/__tests__/index.spec.tsx
index f4e651d3c5..4a8d89e9fb 100644
--- a/web/app/components/datasets/extra-info/__tests__/index.spec.tsx
+++ b/web/app/components/datasets/extra-info/__tests__/index.spec.tsx
@@ -674,9 +674,7 @@ describe('ApiAccessCard', () => {
)
const switchButton = screen.getByRole('switch')
- // Headless UI Switch uses CSS classes for disabled state
- expect(switchButton).toHaveClass('!cursor-not-allowed')
- expect(switchButton).toHaveClass('!opacity-50')
+ expect(switchButton).toHaveAttribute('aria-disabled', 'true')
})
it('should enable switch when user is workspace manager', () => {
@@ -689,8 +687,7 @@ describe('ApiAccessCard', () => {
)
const switchButton = screen.getByRole('switch')
- expect(switchButton).not.toHaveClass('!cursor-not-allowed')
- expect(switchButton).not.toHaveClass('!opacity-50')
+ expect(switchButton).not.toHaveAttribute('aria-disabled', 'true')
})
})
diff --git a/web/app/components/datasets/extra-info/api-access/__tests__/card.spec.tsx b/web/app/components/datasets/extra-info/api-access/__tests__/card.spec.tsx
index 3fa542f002..3f9eadc705 100644
--- a/web/app/components/datasets/extra-info/api-access/__tests__/card.spec.tsx
+++ b/web/app/components/datasets/extra-info/api-access/__tests__/card.spec.tsx
@@ -155,8 +155,7 @@ describe('Card (API Access)', () => {
const switchButton = screen.getByRole('switch')
expect(switchButton).toHaveAttribute('aria-checked', 'true')
- // Headless UI Switch uses CSS classes for disabled state, not the disabled attribute
- expect(switchButton).toHaveClass('!cursor-not-allowed', '!opacity-50')
+ expect(switchButton).toHaveAttribute('aria-disabled', 'true')
})
it('should enable switch when user is workspace manager', () => {
@@ -164,7 +163,7 @@ describe('Card (API Access)', () => {
render()
const switchButton = screen.getByRole('switch')
- expect(switchButton).not.toBeDisabled()
+ expect(switchButton).not.toHaveAttribute('aria-disabled', 'true')
})
})
diff --git a/web/app/components/datasets/metadata/metadata-dataset/__tests__/dataset-metadata-drawer.spec.tsx b/web/app/components/datasets/metadata/metadata-dataset/__tests__/dataset-metadata-drawer.spec.tsx
index 89ddb76694..8fdbb53507 100644
--- a/web/app/components/datasets/metadata/metadata-dataset/__tests__/dataset-metadata-drawer.spec.tsx
+++ b/web/app/components/datasets/metadata/metadata-dataset/__tests__/dataset-metadata-drawer.spec.tsx
@@ -325,18 +325,12 @@ describe('DatasetMetadataDrawer', () => {
fireEvent.change(inputs[0], { target: { value: 'changed_name' } })
// Find and click cancel button
- const cancelBtns = screen.getAllByText(/cancel/i)
- const cancelBtn = cancelBtns.find(btn =>
- !btn.closest('button')?.classList.contains('btn-primary'),
- )
- if (cancelBtn)
- fireEvent.click(cancelBtn)
+ fireEvent.click(screen.getByRole('button', { name: 'common.operation.cancel' }))
- // Verify input resets or modal closes
+ // Verify rename modal closes while drawer stays open
await waitFor(() => {
- const currentInputs = document.querySelectorAll('input')
- // Either no inputs (modal closed) or value reset
- expect(currentInputs.length === 0 || currentInputs[0].value !== 'changed_name').toBe(true)
+ expect(screen.queryByRole('dialog', { name: 'dataset.metadata.datasetMetadata.rename' })).not.toBeInTheDocument()
+ expect(screen.getAllByRole('dialog')).toHaveLength(1)
})
})
diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.spec.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.spec.tsx
index ee3bc4b159..a1ab77b16f 100644
--- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.spec.tsx
+++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.spec.tsx
@@ -231,7 +231,7 @@ describe('ModelListItem', () => {
// Assert - ConfigModel should not render because status is not active/disabled
expect(screen.queryByRole('button', { name: 'modify load balancing' })).not.toBeInTheDocument()
const statusSwitch = screen.getByRole('switch')
- expect(statusSwitch).toHaveClass('!cursor-not-allowed')
+ expect(statusSwitch).toHaveAttribute('aria-disabled', 'true')
fireEvent.click(statusSwitch)
expect(statusSwitch).toHaveAttribute('aria-checked', 'false')
expect(enableModel).not.toHaveBeenCalled()
diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.spec.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.spec.tsx
index eb0a98e9dc..9640736fdd 100644
--- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.spec.tsx
+++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.spec.tsx
@@ -193,7 +193,7 @@ describe('ModelLoadBalancingConfigs', () => {
render()
const mainSwitch = screen.getByTestId('load-balancing-switch-main')
- expect(mainSwitch).toHaveClass('!cursor-not-allowed')
+ expect(mainSwitch).toHaveAttribute('aria-disabled', 'true')
// Clicking should not trigger any changes (effectively disabled)
await user.click(mainSwitch)
diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.tsx
index 1b1acd90fc..6c219c4e5a 100644
--- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.tsx
+++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.tsx
@@ -164,7 +164,7 @@ const ModelLoadBalancingConfigs = ({
withSwitch && (
toggleModalBalancing(value)}
diff --git a/web/app/components/tools/mcp/__tests__/mcp-service-card.spec.tsx b/web/app/components/tools/mcp/__tests__/mcp-service-card.spec.tsx
index 43ce810217..d408b3092e 100644
--- a/web/app/components/tools/mcp/__tests__/mcp-service-card.spec.tsx
+++ b/web/app/components/tools/mcp/__tests__/mcp-service-card.spec.tsx
@@ -213,8 +213,7 @@ describe('MCPServiceCard', () => {
render(, { wrapper: createWrapper() })
const switchElement = screen.getByRole('switch')
- expect(switchElement.className).toContain('!cursor-not-allowed')
- expect(switchElement.className).toContain('!opacity-50')
+ expect(switchElement.className).toContain('cursor-not-allowed')
})
})
@@ -355,8 +354,7 @@ describe('MCPServiceCard', () => {
render(, { wrapper: createWrapper() })
const switchElement = screen.getByRole('switch')
- expect(switchElement.className).toContain('!cursor-not-allowed')
- expect(switchElement.className).toContain('!opacity-50')
+ expect(switchElement.className).toContain('cursor-not-allowed')
})
})
@@ -371,8 +369,7 @@ describe('MCPServiceCard', () => {
render(, { wrapper: createWrapper() })
const switchElement = screen.getByRole('switch')
- expect(switchElement.className).toContain('!cursor-not-allowed')
- expect(switchElement.className).toContain('!opacity-50')
+ expect(switchElement.className).toContain('cursor-not-allowed')
})
})
@@ -428,11 +425,10 @@ describe('MCPServiceCard', () => {
})
describe('Accessibility', () => {
- it('should have an accessible switch with button type', () => {
+ it('should have an accessible switch element', () => {
render(, { wrapper: createWrapper() })
- const switchElement = screen.getByRole('switch')
- expect(switchElement).toHaveAttribute('type', 'button')
+ expect(screen.getByRole('switch')).toBeInTheDocument()
})
})
})
diff --git a/web/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/update.tsx b/web/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/update.tsx
index b3fb0bebbd..5a4113848a 100644
--- a/web/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/update.tsx
+++ b/web/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/update.tsx
@@ -174,7 +174,7 @@ const AddExtractParameter: FC = ({
<>
{t(`${i18nPrefix}.addExtractParameterContent.requiredContent`, { ns: 'workflow' })}
-
+
>
diff --git a/web/app/components/workflow/note-node/note-editor/toolbar/operator.tsx b/web/app/components/workflow/note-node/note-editor/toolbar/operator.tsx
index 321e8a084c..9b2fae349c 100644
--- a/web/app/components/workflow/note-node/note-editor/toolbar/operator.tsx
+++ b/web/app/components/workflow/note-node/note-editor/toolbar/operator.tsx
@@ -79,7 +79,7 @@ const Operator = ({
>
{t('nodes.note.editor.showAuthor', { ns: 'workflow' })}
diff --git a/web/eslint-suppressions.json b/web/eslint-suppressions.json
index 249955a304..edd6a2ef4c 100644
--- a/web/eslint-suppressions.json
+++ b/web/eslint-suppressions.json
@@ -2772,9 +2772,6 @@
}
},
"app/components/base/switch/index.stories.tsx": {
- "no-console": {
- "count": 1
- },
"ts/no-explicit-any": {
"count": 1
}