mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
Fixed sidebar width (never concedes), figma session-row rail (16px twist + status slots, triangle arrows, mount fade), exact brand wordmark svg with tooltip'd rail controls, form controls inheriting the app font stack, and inlined the twist button reset since the tsdown CSS pipeline drops composes.
59 lines
2.5 KiB
TypeScript
59 lines
2.5 KiB
TypeScript
// @vitest-environment jsdom
|
|
import { cleanup, render } from '@testing-library/react'
|
|
import { afterEach, describe, expect, it } from 'vitest'
|
|
import * as primitives from '@deepseek-ai/dsh-client-ui-primitives'
|
|
import { IconApiOutline14, IconFolderClose16, IconSendOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'
|
|
|
|
afterEach(cleanup)
|
|
|
|
// Icon components all share the IconProps signature; the barrel also exports
|
|
// non-icon atoms (different props shapes), so filter by prefix BEFORE typing.
|
|
const icons = Object.fromEntries(
|
|
Object.entries(primitives).filter(([name]) => name.startsWith('Icon')),
|
|
) as Record<string, (p: primitives.IconProps) => React.JSX.Element>
|
|
const iconNames = Object.keys(icons)
|
|
|
|
describe('ic_ds_ icon set', () => {
|
|
it('exports the full P-I set (43 deepsuite + 7 figma extracts)', () => {
|
|
expect(iconNames.length).toBe(50)
|
|
})
|
|
|
|
it.each(iconNames)('%s renders an svg with currentColor fills and no hardcoded palette', name => {
|
|
const Icon = icons[name]!
|
|
const { container } = render(<Icon />)
|
|
const svg = container.querySelector('svg')
|
|
expect(svg).not.toBeNull()
|
|
const markup = container.innerHTML
|
|
expect(markup).not.toMatch(/#[0-9a-fA-F]{3,8}"/)
|
|
expect(markup).toContain('currentColor')
|
|
})
|
|
|
|
it('size and className props land on the root svg', () => {
|
|
const { container } = render(<IconSendOutline16 size={20} className="x" />)
|
|
const svg = container.querySelector('svg')!
|
|
expect(svg.getAttribute('width')).toBe('20')
|
|
expect(svg.getAttribute('height')).toBe('20')
|
|
expect(svg.classList.contains('x')).toBe(true)
|
|
})
|
|
|
|
it('native defaults: 14-glyphs default 14, 16-glyphs default 16', () => {
|
|
const api = render(<IconApiOutline14 />)
|
|
expect(api.container.querySelector('svg')!.getAttribute('width')).toBe('14')
|
|
const folder = render(<IconFolderClose16 />)
|
|
expect(folder.container.querySelector('svg')!.getAttribute('width')).toBe('16')
|
|
})
|
|
})
|
|
|
|
describe('FishLogo', () => {
|
|
it('renders the fish path in currentColor at the native ratio', () => {
|
|
const { container } = render(<primitives.FishLogo />)
|
|
const svg = container.querySelector('svg')!
|
|
expect(svg.getAttribute('width')).toBe('24')
|
|
expect(Number(svg.getAttribute('height'))).toBeCloseTo(17.66, 1)
|
|
expect(svg.getAttribute('viewBox')).toBe('0 0 23.16 17.04')
|
|
expect(container.querySelectorAll('path')).toHaveLength(1)
|
|
expect(container.innerHTML).toContain('currentColor')
|
|
expect(container.innerHTML).not.toContain('M0 0L23.16')
|
|
})
|
|
})
|