mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-08 00:50:05 +00:00
## Summary Small updates to the UI to make it more visually distinct from the graph nodes and improving the login button ## Changes - **What**: - Improve theme support with dynamic colors - Standardize surface colors/borders - Add shadows to all floating UI elements - Change side toolbar to be docked by default - Decrease side toolbar width - Change login button to icon only - Update C button to be more distinctive ## Review Focus - Theme tokens, I am not sure what the overall plan for how these tokens will be supported for custom user palettes. I've implemented a method where default variables are chosen that look nice over all existing themes, but they can be overridden. ## Screenshots Dark theme updated color <img width="958" height="615" alt="image" src="https://github.com/user-attachments/assets/a2c540cf-6c05-4ad3-996b-8b7b80df8d2d" /> Themed & updated menu button (active vs hover vs default) <img width="58" height="338" alt="github" src="https://github.com/user-attachments/assets/90244ee2-d5ee-4b26-9d99-f4b8439aa372" /><img width="58" height="338" alt="nord" src="https://github.com/user-attachments/assets/053e8e7b-d639-4b72-92d2-ec7e2167aab8" /><img width="58" height="338" alt="arc" src="https://github.com/user-attachments/assets/3caeb07b-d41b-4d88-83b4-ef8d45d4e5a6" /><img width="58" height="338" alt="solarized" src="https://github.com/user-attachments/assets/6ebf6afb-ec3a-436b-90eb-bda40be1c79f" /><img width="58" height="338" alt="light" src="https://github.com/user-attachments/assets/fbb7f96a-b722-40c5-86fa-a0732e166972" /><img width="58" height="338" alt="dark" src="https://github.com/user-attachments/assets/5459208b-9256-4c55-9373-169e9cd9f09a" /> With labels <img width="58" height="394" alt="labels" src="https://github.com/user-attachments/assets/f97ee354-35cd-42b8-896f-57ac39644c1d" /> Logged out (only visible on desktop) <img width="323" height="48" alt="logged out" src="https://github.com/user-attachments/assets/75b71420-0c1b-446f-8cdd-43c68674d346" /> Logged in <img width="355" height="48" alt="logged in" src="https://github.com/user-attachments/assets/324fd133-a793-49dd-844a-f93dd5d1effb" /> ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6381-UI-color-updates-tweaks-29b6d73d3650816384d2ef5617a776a0) by [Unito](https://www.unito.io) --------- Co-authored-by: GitHub Action <action@github.com> Co-authored-by: github-actions <github-actions@github.com>
107 lines
2.8 KiB
TypeScript
107 lines
2.8 KiB
TypeScript
import { mount } from '@vue/test-utils'
|
|
import Avatar from 'primevue/avatar'
|
|
import PrimeVue from 'primevue/config'
|
|
import { beforeEach, describe, expect, it } from 'vitest'
|
|
import { createApp, nextTick } from 'vue'
|
|
import { createI18n } from 'vue-i18n'
|
|
|
|
import UserAvatar from './UserAvatar.vue'
|
|
|
|
const i18n = createI18n({
|
|
legacy: false,
|
|
locale: 'en',
|
|
messages: {
|
|
en: {
|
|
auth: {
|
|
login: {
|
|
userAvatar: 'User Avatar'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
describe('UserAvatar', () => {
|
|
beforeEach(() => {
|
|
const app = createApp({})
|
|
app.use(PrimeVue)
|
|
})
|
|
|
|
const mountComponent = (props: any = {}) => {
|
|
return mount(UserAvatar, {
|
|
global: {
|
|
plugins: [PrimeVue, i18n],
|
|
components: { Avatar }
|
|
},
|
|
props
|
|
})
|
|
}
|
|
|
|
it('renders correctly with photo Url', async () => {
|
|
const wrapper = mountComponent({
|
|
photoUrl: 'https://example.com/avatar.jpg'
|
|
})
|
|
|
|
const avatar = wrapper.findComponent(Avatar)
|
|
expect(avatar.exists()).toBe(true)
|
|
expect(avatar.props('image')).toBe('https://example.com/avatar.jpg')
|
|
expect(avatar.props('icon')).toBeNull()
|
|
})
|
|
|
|
it('renders with default icon when no photo Url is provided', () => {
|
|
const wrapper = mountComponent({
|
|
photoUrl: undefined
|
|
})
|
|
|
|
const avatar = wrapper.findComponent(Avatar)
|
|
expect(avatar.exists()).toBe(true)
|
|
expect(avatar.props('image')).toBeNull()
|
|
expect(avatar.props('icon')).toBe('icon-[lucide--user]')
|
|
})
|
|
|
|
it('renders with default icon when provided photo Url is null', () => {
|
|
const wrapper = mountComponent({
|
|
photoUrl: null
|
|
})
|
|
|
|
const avatar = wrapper.findComponent(Avatar)
|
|
expect(avatar.exists()).toBe(true)
|
|
expect(avatar.props('image')).toBeNull()
|
|
expect(avatar.props('icon')).toBe('icon-[lucide--user]')
|
|
})
|
|
|
|
it('falls back to icon when image fails to load', async () => {
|
|
const wrapper = mountComponent({
|
|
photoUrl: 'https://example.com/broken-image.jpg'
|
|
})
|
|
|
|
const avatar = wrapper.findComponent(Avatar)
|
|
expect(avatar.props('icon')).toBeNull()
|
|
|
|
// Simulate image load error
|
|
avatar.vm.$emit('error')
|
|
await nextTick()
|
|
|
|
expect(avatar.props('icon')).toBe('icon-[lucide--user]')
|
|
})
|
|
|
|
it('uses provided ariaLabel', () => {
|
|
const wrapper = mountComponent({
|
|
photoUrl: 'https://example.com/avatar.jpg',
|
|
ariaLabel: 'Custom Label'
|
|
})
|
|
|
|
const avatar = wrapper.findComponent(Avatar)
|
|
expect(avatar.attributes('aria-label')).toBe('Custom Label')
|
|
})
|
|
|
|
it('falls back to i18n translation when no ariaLabel is provided', () => {
|
|
const wrapper = mountComponent({
|
|
photoUrl: 'https://example.com/avatar.jpg'
|
|
})
|
|
|
|
const avatar = wrapper.findComponent(Avatar)
|
|
expect(avatar.attributes('aria-label')).toBe('User Avatar')
|
|
})
|
|
})
|