Compare commits

...

1 Commits

Author SHA1 Message Date
Test
b9879b15c9 fix: keep note list icons inline 2026-04-09 13:01:28 +02:00
2 changed files with 45 additions and 27 deletions

View File

@@ -10,18 +10,20 @@ describe('NoteTitleIcon', () => {
})
it('renders a Phosphor icon when the name is recognized', () => {
render(<NoteTitleIcon icon="cooking pot" testId="note-title-icon" />)
const { container } = render(<NoteTitleIcon icon="cooking pot" testId="note-title-icon" className="mr-1" />)
const icon = screen.getByTestId('note-title-icon')
expect(icon.tagName.toLowerCase()).toBe('svg')
expect(container.querySelector('span.inline-flex.mr-1')).not.toBeNull()
})
it('renders an image when the icon is an http url', () => {
render(<NoteTitleIcon icon="https://example.com/favicon.png" testId="note-title-icon" />)
const { container } = render(<NoteTitleIcon icon="https://example.com/favicon.png" testId="note-title-icon" className="mr-1" />)
const icon = screen.getByTestId('note-title-icon')
expect(icon.tagName.toLowerCase()).toBe('img')
expect(icon).toHaveAttribute('src', 'https://example.com/favicon.png')
expect(container.querySelector('span.inline-flex.mr-1')).not.toBeNull()
})
it('renders nothing for an unrecognized icon value', () => {

View File

@@ -9,6 +9,21 @@ interface NoteTitleIconProps {
testId?: string
}
function IconWrapper({
children,
className,
size,
}: Pick<NoteTitleIconProps, 'className' | 'size'> & { children: React.ReactNode }) {
return (
<span
className={cn('inline-flex shrink-0 items-center justify-center align-middle', className)}
style={{ width: size, height: size, lineHeight: 1 }}
>
{children}
</span>
)
}
export function NoteTitleIcon({ icon, size = 14, className, color, testId }: NoteTitleIconProps) {
const resolved = resolveNoteIcon(icon)
@@ -16,39 +31,40 @@ export function NoteTitleIcon({ icon, size = 14, className, color, testId }: Not
if (resolved.kind === 'emoji') {
return (
<span
className={cn('inline-flex shrink-0 items-center justify-center', className)}
style={{ fontSize: size, lineHeight: 1 }}
data-testid={testId}
>
{resolved.value}
</span>
<IconWrapper className={className} size={size}>
<span style={{ fontSize: size, lineHeight: 1 }} data-testid={testId}>
{resolved.value}
</span>
</IconWrapper>
)
}
if (resolved.kind === 'image') {
return (
<img
src={resolved.src}
alt=""
aria-hidden="true"
className={cn('shrink-0 rounded-sm object-cover', className)}
style={{ width: size, height: size }}
onError={(event) => {
event.currentTarget.style.display = 'none'
}}
data-testid={testId}
/>
<IconWrapper className={className} size={size}>
<img
src={resolved.src}
alt=""
aria-hidden="true"
className="block h-full w-full rounded-sm object-cover"
onError={(event) => {
event.currentTarget.style.display = 'none'
}}
data-testid={testId}
/>
</IconWrapper>
)
}
return (
<resolved.Icon
width={size}
height={size}
className={cn('shrink-0', className)}
style={color ? { color } : undefined}
data-testid={testId}
/>
<IconWrapper className={className} size={size}>
<resolved.Icon
width={size}
height={size}
className="block"
style={color ? { color } : undefined}
data-testid={testId}
/>
</IconWrapper>
)
}