diff --git a/src/renderer/src/components/sidebar/FilterToggleRow.test.tsx b/src/renderer/src/components/sidebar/FilterToggleRow.test.tsx new file mode 100644 index 00000000000..0035a682479 --- /dev/null +++ b/src/renderer/src/components/sidebar/FilterToggleRow.test.tsx @@ -0,0 +1,61 @@ +// @vitest-environment happy-dom + +/** + * Guards the sub-option indent: Tailwind v4 emits `px-*` as `padding-inline`, + * which outranks a physical `pl-*` override and silently flattens the nesting. + */ + +import { act } from 'react' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { FilterToggleRow } from './FilterToggleRow' + +let container: HTMLDivElement +let root: Root + +function renderRow(indented: boolean): HTMLElement { + act(() => { + root.render( + + ) + }) + const row = container.querySelector('[role="switch"]') + if (!(row instanceof HTMLElement)) { + throw new Error('FilterToggleRow did not render a switch') + } + return row +} + +function paddingClasses(row: HTMLElement): string[] { + return row.className.split(/\s+/).filter((cls) => /^p[xlr]?-/.test(cls)) +} + +beforeEach(() => { + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) +}) + +afterEach(() => { + act(() => root.unmount()) + container.remove() +}) + +describe('FilterToggleRow', () => { + it('indents a sub-option past the row above it', () => { + const indented = paddingClasses(renderRow(true)) + const flat = paddingClasses(renderRow(false)) + expect(indented).toContain('pl-7') + expect(flat).toContain('pl-2') + }) + + it('never pairs the indent with a padding-inline utility that would outrank it', () => { + expect(paddingClasses(renderRow(true)).filter((cls) => cls.startsWith('px-'))).toEqual([]) + }) +}) diff --git a/src/renderer/src/components/sidebar/FilterToggleRow.tsx b/src/renderer/src/components/sidebar/FilterToggleRow.tsx index 60930a19c44..7fbc0b77874 100644 --- a/src/renderer/src/components/sidebar/FilterToggleRow.tsx +++ b/src/renderer/src/components/sidebar/FilterToggleRow.tsx @@ -34,8 +34,10 @@ export function FilterToggleRow({ aria-label={ariaLabel} onClick={() => onChange(!checked)} className={cn( - 'flex w-full items-center justify-between gap-2 rounded-[5px] px-2 py-1.5 text-[12px] font-medium hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring', - indented && 'pl-6' + // Why pl-* and not px-2 + pl-6: Tailwind v4 emits px as padding-inline, + // which outranks a physical pl-6 override and flattens the indent. + 'flex w-full items-center justify-between gap-2 rounded-[5px] py-1.5 pr-2 text-[12px] font-medium hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring', + indented ? 'pl-7' : 'pl-2' )} >