From f1f6ab0ac6945de0b02ea56bbca4ccee7d4c78cc Mon Sep 17 00:00:00 2001 From: yyh <92089059+lyzno1@users.noreply.github.com> Date: Wed, 1 Jul 2026 20:23:23 +0800 Subject: [PATCH] refactor(ui): use inset ring utilities (#38275) --- packages/dify-ui/src/autocomplete/index.tsx | 2 +- packages/dify-ui/src/combobox/index.tsx | 4 ++-- packages/dify-ui/src/file-tree/index.tsx | 2 +- packages/dify-ui/src/number-field/index.tsx | 2 +- .../__tests__/index.spec.tsx | 10 --------- .../dify-ui/src/segmented-control/index.tsx | 2 +- .../src/select/__tests__/index.spec.tsx | 10 --------- packages/dify-ui/src/select/index.tsx | 2 +- .../__tests__/app-operations.spec.tsx | 15 ------------- .../config/agent/agent-setting/index.tsx | 2 +- .../base/chip/__tests__/index.spec.tsx | 15 ------------- web/app/components/base/chip/index.tsx | 2 +- .../common/option-list-item.tsx | 2 +- .../__tests__/index.spec.tsx | 8 ------- .../file-uploader-in-chat-input/index.tsx | 2 +- .../search-input/__tests__/index.spec.tsx | 17 -------------- .../components/base/search-input/index.tsx | 2 +- .../datasets/create/step-two/index.module.css | 2 +- .../data-source-options/option-card.tsx | 2 +- .../__tests__/operations-dropdown.spec.tsx | 11 ---------- .../components/operations-dropdown.tsx | 4 ++-- .../components/develop/__tests__/md.spec.tsx | 7 ------ .../components/develop/__tests__/tag.spec.tsx | 2 -- web/app/components/develop/code.tsx | 2 +- .../explore/app-card/__tests__/index.spec.tsx | 1 - web/app/components/explore/app-card/index.tsx | 2 +- .../app-nav-item/__tests__/index.spec.tsx | 10 --------- .../explore/sidebar/app-nav-item/index.tsx | 4 ++-- web/app/components/explore/sidebar/index.tsx | 2 +- .../__tests__/tool-provider-list.spec.tsx | 12 ---------- .../integrations/tool-provider-card.tsx | 4 ++-- .../main-nav/components/account-section.tsx | 2 +- .../main-nav/components/support-menu.tsx | 2 +- .../main-nav/components/workspace-card.tsx | 10 ++++----- .../components/workspace-switcher.tsx | 2 +- .../data-source-options/option-card.tsx | 2 +- .../snippet-list/components/snippet-card.tsx | 2 +- .../components/orchestrate/files/index.tsx | 2 +- .../components/orchestrate/skills/item.tsx | 2 +- .../agent-v2/agent-detail/monitoring/page.tsx | 2 +- .../__tests__/agent-roster-list.spec.tsx | 22 ------------------- .../roster/components/agent-roster-list.tsx | 2 +- .../create-guide/ui/source-step.tsx | 2 +- .../permissions/access-control-dialog.tsx | 2 +- .../permissions/permission-summary-button.tsx | 2 +- .../components/tag-search-content.tsx | 2 +- 46 files changed, 41 insertions(+), 181 deletions(-) diff --git a/packages/dify-ui/src/autocomplete/index.tsx b/packages/dify-ui/src/autocomplete/index.tsx index 4d115024ab1..fb25700a51b 100644 --- a/packages/dify-ui/src/autocomplete/index.tsx +++ b/packages/dify-ui/src/autocomplete/index.tsx @@ -136,7 +136,7 @@ const autocompleteControlVariants = cva( [ 'flex shrink-0 touch-manipulation items-center justify-center rounded-md text-text-tertiary outline-hidden transition-colors', 'hover:bg-components-input-bg-hover hover:text-text-secondary focus-visible:bg-components-input-bg-hover focus-visible:text-text-secondary', - 'focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:ring-inset', + 'focus-visible:inset-ring-2 focus-visible:inset-ring-state-accent-solid', 'disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-text-tertiary disabled:focus-visible:bg-transparent disabled:focus-visible:ring-0', 'group-data-disabled/autocomplete:cursor-not-allowed group-data-disabled/autocomplete:hover:bg-transparent group-data-disabled/autocomplete:focus-visible:bg-transparent group-data-disabled/autocomplete:focus-visible:ring-0', 'group-data-readonly/autocomplete:hidden', diff --git a/packages/dify-ui/src/combobox/index.tsx b/packages/dify-ui/src/combobox/index.tsx index c97abc7db32..d1d9204f977 100644 --- a/packages/dify-ui/src/combobox/index.tsx +++ b/packages/dify-ui/src/combobox/index.tsx @@ -52,7 +52,7 @@ const comboboxTriggerVariants = cva( [ 'group/combobox-trigger flex w-full min-w-0 items-center border-0 bg-components-input-bg-normal text-start text-components-input-text-filled outline-hidden transition-colors', 'hover:bg-state-base-hover-alt focus-visible:bg-state-base-hover-alt data-popup-open:bg-state-base-hover-alt', - 'focus-visible:ring-1 focus-visible:ring-components-input-border-active focus-visible:ring-inset', + 'focus-visible:inset-ring-1 focus-visible:inset-ring-components-input-border-active', 'data-placeholder:text-components-input-text-placeholder', 'data-readonly:cursor-default data-readonly:bg-transparent data-readonly:hover:bg-transparent', 'data-disabled:cursor-not-allowed data-disabled:bg-components-input-bg-disabled data-disabled:text-components-input-text-filled-disabled data-disabled:hover:bg-components-input-bg-disabled', @@ -198,7 +198,7 @@ const comboboxControlVariants = cva( [ 'flex shrink-0 touch-manipulation items-center justify-center rounded-md text-text-tertiary outline-hidden transition-colors', 'hover:bg-components-input-bg-hover hover:text-text-secondary focus-visible:bg-components-input-bg-hover focus-visible:text-text-secondary', - 'focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:ring-inset', + 'focus-visible:inset-ring-2 focus-visible:inset-ring-state-accent-solid', 'disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-text-tertiary disabled:focus-visible:bg-transparent disabled:focus-visible:ring-0', 'group-data-disabled/combobox:cursor-not-allowed group-data-disabled/combobox:hover:bg-transparent group-data-disabled/combobox:focus-visible:bg-transparent group-data-disabled/combobox:focus-visible:ring-0', 'group-data-readonly/combobox:hidden', diff --git a/packages/dify-ui/src/file-tree/index.tsx b/packages/dify-ui/src/file-tree/index.tsx index b085fc5c79b..64555d3ca48 100644 --- a/packages/dify-ui/src/file-tree/index.tsx +++ b/packages/dify-ui/src/file-tree/index.tsx @@ -37,7 +37,7 @@ function fileTreeRowClassName({ }) { return cn( 'group/file-tree-row relative flex h-6 w-full min-w-0 cursor-pointer items-center rounded-md ps-2 pe-1.5 text-start outline-hidden select-none', - 'hover:bg-state-base-hover focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-state-accent-solid', + 'hover:bg-state-base-hover focus-visible:inset-ring-2 focus-visible:inset-ring-state-accent-solid', 'data-[selected]:bg-state-base-active', 'data-disabled:cursor-not-allowed data-disabled:opacity-50 data-disabled:hover:bg-transparent', 'aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-disabled:hover:bg-transparent', diff --git a/packages/dify-ui/src/number-field/index.tsx b/packages/dify-ui/src/number-field/index.tsx index f5babeea95e..435be738199 100644 --- a/packages/dify-ui/src/number-field/index.tsx +++ b/packages/dify-ui/src/number-field/index.tsx @@ -147,7 +147,7 @@ const numberFieldControlButtonVariants = cva( [ 'flex touch-manipulation items-center justify-center px-1.5 text-text-tertiary outline-hidden transition-colors select-none', 'hover:bg-components-input-bg-hover focus-visible:bg-components-input-bg-hover', - 'focus-visible:ring-2 focus-visible:ring-state-accent-solid focus-visible:ring-inset', + 'focus-visible:inset-ring-2 focus-visible:inset-ring-state-accent-solid', 'disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:focus-visible:bg-transparent disabled:focus-visible:ring-0', 'group-data-disabled/number-field:cursor-not-allowed hover:group-data-disabled/number-field:bg-transparent focus-visible:group-data-disabled/number-field:bg-transparent focus-visible:group-data-disabled/number-field:ring-0', 'group-data-readonly/number-field:cursor-default hover:group-data-readonly/number-field:bg-transparent focus-visible:group-data-readonly/number-field:bg-transparent focus-visible:group-data-readonly/number-field:ring-0', diff --git a/packages/dify-ui/src/segmented-control/__tests__/index.spec.tsx b/packages/dify-ui/src/segmented-control/__tests__/index.spec.tsx index 46adc5122d6..c68088feebb 100644 --- a/packages/dify-ui/src/segmented-control/__tests__/index.spec.tsx +++ b/packages/dify-ui/src/segmented-control/__tests__/index.spec.tsx @@ -16,17 +16,7 @@ describe('SegmentedControl wrappers', () => { , ) - await expect.element(screen.getByRole('group')).toHaveClass( - 'bg-components-segmented-control-bg-normal', - 'p-0.5', - 'rounded-[10px]', - ) await expect.element(screen.getByRole('button', { name: 'One' })).toHaveAttribute('aria-pressed', 'true') - await expect.element(screen.getByRole('button', { name: 'One' })).toHaveClass( - 'data-pressed:bg-components-segmented-control-item-active-bg', - 'data-pressed:text-text-accent-light-mode-only', - 'focus-visible:ring-inset', - ) }) it('uses single selection by default', async () => { diff --git a/packages/dify-ui/src/segmented-control/index.tsx b/packages/dify-ui/src/segmented-control/index.tsx index ba347b58f18..6fff4bfa6ec 100644 --- a/packages/dify-ui/src/segmented-control/index.tsx +++ b/packages/dify-ui/src/segmented-control/index.tsx @@ -33,7 +33,7 @@ export function SegmentedControlItem({ }: SegmentedControlItemProps) { return ( ) diff --git a/packages/dify-ui/src/select/__tests__/index.spec.tsx b/packages/dify-ui/src/select/__tests__/index.spec.tsx index cdfeffe61bd..430cdcaaf8a 100644 --- a/packages/dify-ui/src/select/__tests__/index.spec.tsx +++ b/packages/dify-ui/src/select/__tests__/index.spec.tsx @@ -208,16 +208,6 @@ describe('Select wrappers', () => { expect(screen.getByRole('combobox', { name: 'city select' }).element().className).toContain('data-popup-open:bg-state-base-hover-alt') }) - - it('should include keyboard focus ring classes', async () => { - const screen = await renderOpenSelect() - - await expect.element(screen.getByRole('combobox', { name: 'city select' })).toHaveClass( - 'focus-visible:ring-1', - 'focus-visible:ring-components-input-border-active', - 'focus-visible:ring-inset', - ) - }) }) describe('SelectContent', () => { diff --git a/packages/dify-ui/src/select/index.tsx b/packages/dify-ui/src/select/index.tsx index 6667f06770f..60c026342d0 100644 --- a/packages/dify-ui/src/select/index.tsx +++ b/packages/dify-ui/src/select/index.tsx @@ -24,7 +24,7 @@ const selectTriggerVariants = cva( [ 'group flex w-full items-center border-0 bg-components-input-bg-normal text-start text-components-input-text-filled outline-hidden', 'hover:bg-state-base-hover-alt focus-visible:bg-state-base-hover-alt data-popup-open:bg-state-base-hover-alt', - 'focus-visible:ring-1 focus-visible:ring-components-input-border-active focus-visible:ring-inset', + 'focus-visible:inset-ring-1 focus-visible:inset-ring-components-input-border-active', 'data-placeholder:text-components-input-text-placeholder', 'data-readonly:cursor-default data-readonly:bg-components-input-bg-normal data-readonly:hover:bg-components-input-bg-normal', 'data-disabled:cursor-not-allowed data-disabled:bg-components-input-bg-disabled data-disabled:text-components-input-text-filled-disabled data-disabled:hover:bg-components-input-bg-disabled', diff --git a/web/app/components/app-sidebar/app-info/__tests__/app-operations.spec.tsx b/web/app/components/app-sidebar/app-info/__tests__/app-operations.spec.tsx index 5daf0c71004..ff6aed2c716 100644 --- a/web/app/components/app-sidebar/app-info/__tests__/app-operations.spec.tsx +++ b/web/app/components/app-sidebar/app-info/__tests__/app-operations.spec.tsx @@ -228,21 +228,6 @@ describe('AppOperations', () => { }) describe('Visible operations click', () => { - it('should keep focus ring inside visible operation buttons', () => { - const cleanup = setupDomMeasurements(500, 60, [80]) - const editOp = createOperation('edit', 'Edit') - - render() - - const visibleButton = screen.getAllByText('Edit') - .map(label => label.closest('button')) - .find(button => button?.tabIndex !== -1) - - expect(visibleButton).toHaveClass('focus-visible:ring-inset') - - cleanup() - }) - it('should call onClick when a visible operation is clicked', async () => { const cleanup = setupDomMeasurements(500, 60, [80, 80]) const user = userEvent.setup() diff --git a/web/app/components/app/configuration/config/agent/agent-setting/index.tsx b/web/app/components/app/configuration/config/agent/agent-setting/index.tsx index 04f1b4b2a61..b0e365349cd 100644 --- a/web/app/components/app/configuration/config/agent/agent-setting/index.tsx +++ b/web/app/components/app/configuration/config/agent/agent-setting/index.tsx @@ -123,7 +123,7 @@ const AgentSetting: FC = ({ min={maxIterationsMin} max={MAX_ITERATIONS_NUM} step={1} - className="block h-7 w-11 rounded-lg border-0 bg-components-input-bg-normal px-1.5 pl-1 leading-7 text-text-primary placeholder:text-text-tertiary focus:ring-1 focus:ring-primary-600 focus:ring-inset" + className="block h-7 w-11 rounded-lg border-0 bg-components-input-bg-normal px-1.5 pl-1 leading-7 text-text-primary placeholder:text-text-tertiary focus:inset-ring-1 focus:inset-ring-primary-600" value={tempPayload.max_iteration} onChange={(e) => { let value = Number.parseInt(e.target.value, 10) diff --git a/web/app/components/base/chip/__tests__/index.spec.tsx b/web/app/components/base/chip/__tests__/index.spec.tsx index 95dd3e0e05c..d4268ec6b99 100644 --- a/web/app/components/base/chip/__tests__/index.spec.tsx +++ b/web/app/components/base/chip/__tests__/index.spec.tsx @@ -164,15 +164,6 @@ describe('Chip', () => { const panel = document.body.querySelector(`.${customPanelClass}`) expect(panel)!.toBeInTheDocument() }) - - it('should use visible focus styles on the trigger', () => { - const { container } = renderChip() - - expect(getTrigger(container)).toHaveClass( - 'focus-visible:ring-2', - 'focus-visible:ring-state-accent-solid', - ) - }) }) describe('State Management', () => { @@ -221,12 +212,6 @@ describe('Chip', () => { const clearButton = screen.getByRole('button', { name: /common\.operation\.clear/ }) expect(clearButton).toHaveAccessibleName(/Active/) - expect(clearButton).toHaveClass( - 'outline-hidden', - 'focus-visible:ring-2', - 'focus-visible:ring-state-accent-solid', - 'focus-visible:ring-inset', - ) expect(clearButton.querySelector('.i-ri-close-circle-fill')).toHaveAttribute('aria-hidden') await user.click(clearButton) diff --git a/web/app/components/base/chip/index.tsx b/web/app/components/base/chip/index.tsx index 3aa78cd86f6..c4b6c21ebab 100644 --- a/web/app/components/base/chip/index.tsx +++ b/web/app/components/base/chip/index.tsx @@ -91,7 +91,7 @@ function Chip({