Skip to content

Commit be142bd

Browse files
committed
fix(hub-ui): normalize explicit mask URLs
1 parent 13e57cf commit be142bd

4 files changed

Lines changed: 14 additions & 3 deletions

File tree

packages/hub-ui/src/client/components/icons/IconifyIcon.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const props = defineProps<{
66
icon: string
77
}>()
88
9-
const maskUrl = computed(() => props.icon.startsWith('mask:') ? props.icon.slice(5) : undefined)
9+
const maskUrl = computed(() => props.icon.startsWith('mask:') ? props.icon.slice(5).trim() : undefined)
1010
const isUrlIcon = computed(() => maskUrl.value !== undefined || props.icon.includes('/') || props.icon.startsWith('data:') || props.icon.startsWith('builtin:'))
1111
const iconifyParsed = computed(() => {
1212
if (isUrlIcon.value)

packages/hub/src/client/dock-resources.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ describe('dock resource resolution', () => {
3939
expect(resolveDockIcon(icon, connection)).toEqual({ light: data, dark: 'mask:http://localhost:5173/__devtools/dark.svg' })
4040
})
4141

42+
it('trims mask URLs and preserves empty masks without resolving the metadata URL', () => {
43+
expect.assertions(4)
44+
expect(resolveDockIcon('mask: ./icon.svg ', connection)).toBe('mask:http://localhost:5173/__devtools/icon.svg')
45+
expect(resolveDockIcon('mask: data:image/svg+xml,%3Csvg%2F%3E ', connection)).toBe('mask:data:image/svg+xml,%3Csvg%2F%3E')
46+
expect(resolveDockIcon('mask:', connection)).toBe('mask:')
47+
expect(resolveDockIcon('mask: ', connection)).toBe('mask:')
48+
})
49+
4250
it('resolves light and dark icon variants independently', () => {
4351
expect(resolveDockIcon({
4452
light: './icons/light.svg',

packages/hub/src/client/dock-resources.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@ function resolveResourceUrl(value: string, connection: DevframeConnection): stri
2222
function resolveIconUrl(value: string, connection: DevframeConnection): string {
2323
const url = value.trim()
2424
if (url.startsWith('mask:')) {
25+
const maskUrl = url.slice(5).trim()
26+
if (!maskUrl)
27+
return 'mask:'
2528
try {
26-
return `mask:${new URL(url.slice(5), connection.metaBaseUrl).href}`
29+
return `mask:${new URL(maskUrl, connection.metaBaseUrl).href}`
2730
}
2831
catch {
2932
return url

plugins/terminals/app/client/App.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@
357357
class="shrink-0 w-1em h-1em {className}"
358358
aria-hidden="true"
359359
style:background-color="currentColor"
360-
style:mask={`url(${JSON.stringify(icon.slice(5))}) center / contain no-repeat`}
360+
style:mask={`url(${JSON.stringify(icon.slice(5).trim())}) center / contain no-repeat`}
361361
style:mask-mode="alpha"
362362
></div>
363363
{:else}

0 commit comments

Comments
 (0)