Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions browser_tests/tests/customIcons.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { expect } from '@playwright/test'
import type { Locator } from '@playwright/test'

import { comfyPageFixture as test } from '../fixtures/ComfyPage'

async function verifyCustomIconSvg(iconElement: Locator) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do the errors for this look like in a failure state?

const svgVariable = await iconElement.evaluate((element) => {
const styles = getComputedStyle(element)
return styles.getPropertyValue('--svg')
})

expect(svgVariable).toBeTruthy()
const dataUrlMatch = svgVariable.match(
/url\("data:image\/svg\+xml,([^"]+)"\)/
)
expect(dataUrlMatch).toBeTruthy()

const encodedSvg = dataUrlMatch![1]
const decodedSvg = decodeURIComponent(encodedSvg)

// Check for SVG header to confirm it's a valid SVG
expect(decodedSvg).toContain("<svg xmlns='http://www.w3.org/2000/svg'")
}

test.describe('Custom Icons', () => {
test.beforeEach(async ({ comfyPage }) => {
await comfyPage.setSetting('Comfy.UseNewMenu', 'Top')
})

test('sidebar tab icons use custom SVGs', async ({ comfyPage }) => {
// Find the icon in the sidebar
const icon = comfyPage.page.locator(
'.icon-\\[comfy--ai-model\\].side-bar-button-icon'
)
await expect(icon).toBeVisible()

// Verify the custom SVG content
await verifyCustomIconSvg(icon)
})

test('Browse Templates menu item uses custom template icon', async ({
comfyPage
}) => {
// Open the topbar menu
await comfyPage.menu.topbar.openTopbarMenu()
const menuItem = comfyPage.menu.topbar.getMenuItem('Browse Templates')

// Find the icon as a previous sibling of the menu item label
const templateIcon = menuItem
.locator('..')
.locator('.icon-\\[comfy--template\\]')
await expect(templateIcon).toBeVisible()

// Verify the custom SVG content
await verifyCustomIconSvg(templateIcon)
})
})
29 changes: 29 additions & 0 deletions build/customIconCollection.js
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not TypeScript?

Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { readFileSync, readdirSync } from 'fs'
import { join } from 'path'
import { dirname } from 'path'
import { fileURLToPath } from 'url'

const fileName = fileURLToPath(import.meta.url)
const dirName = dirname(fileName)
const customIconsPath = join(dirName, '..', 'src', 'assets', 'icons', 'custom')

// Create an Iconify collection for custom icons
export const iconCollection = {
prefix: 'comfy',
icons: {},
width: 16,
height: 16
}

// Read all SVG files from the custom icons directory
const files = readdirSync(customIconsPath)
files.forEach((file) => {
if (file.endsWith('.svg')) {
const name = file.replace('.svg', '')
const content = readFileSync(join(customIconsPath, file), 'utf-8')

iconCollection.icons[name] = {
body: content
}
}
})
Loading