diff --git a/src/components/icon/library.default.ts b/src/components/icon/library.default.ts index 928dc5a611..c979f39138 100644 --- a/src/components/icon/library.default.ts +++ b/src/components/icon/library.default.ts @@ -1,9 +1,20 @@ import { getBasePath } from '../../utilities/base-path.js'; import type { IconLibrary } from './library.js'; +const inlineIcons: Record = { +} const library: IconLibrary = { name: 'default', - resolver: name => getBasePath(`assets/icons/${name}.svg`) + resolver: name => { + if (name in inlineIcons) { + return `data:image/svg+xml,${encodeURIComponent(inlineIcons[name])}`; + } else { + return getBasePath(`assets/icons/${name}.svg`) + } + }, + add: (name: string, svgData: string) => { + (inlineIcons as any)[name] = svgData; + } }; export default library; diff --git a/src/components/icon/library.system.ts b/src/components/icon/library.system.ts index 6654ae5d7c..17b165ff7e 100644 --- a/src/components/icon/library.system.ts +++ b/src/components/icon/library.system.ts @@ -127,6 +127,9 @@ const systemLibrary: IconLibrary = { return `data:image/svg+xml,${encodeURIComponent(icons[name])}`; } return ''; + }, + add: (name: string, svgData: string) => { + (icons as any)[name] = svgData } }; diff --git a/src/components/icon/library.ts b/src/components/icon/library.ts index 202f54acfb..9137a881ec 100644 --- a/src/components/icon/library.ts +++ b/src/components/icon/library.ts @@ -9,6 +9,8 @@ export interface IconLibrary { resolver: IconLibraryResolver; mutator?: IconLibraryMutator; spriteSheet?: boolean; + add: (name: string, svgData: string) => void; + inlineIcons?: Record } let registry: IconLibrary[] = [defaultLibrary, systemLibrary]; @@ -32,11 +34,22 @@ export function getIconLibrary(name?: string) { /** Adds an icon library to the registry, or overrides an existing one. */ export function registerIconLibrary(name: string, options: Omit) { unregisterIconLibrary(name); + const inlineIcons = options.inlineIcons || {}; registry.push({ name, - resolver: options.resolver, + resolver: (name: string) => { + if (name in inlineIcons) { + return `data:image/svg+xml,${encodeURIComponent(inlineIcons[name])}`; + } else { + return options.resolver(name) + } + }, mutator: options.mutator, - spriteSheet: options.spriteSheet + spriteSheet: options.spriteSheet, + inlineIcons, + add: (name: string, svgData: string) => { + inlineIcons[name] = svgData; + } }); // Redraw watched icons