angular/adev/shared-docs/components/icon/icon.component.ts
2026-03-25 12:58:39 -07:00

43 lines
1.2 KiB
TypeScript

/*!
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
import {DOCUMENT} from '@angular/common';
import {Component, afterNextRender, computed, inject, signal} from '@angular/core';
@Component({
selector: 'docs-icon',
host: {
'class': 'material-symbols-outlined',
'[style.font-size.px]': 'fontSize()',
'aria-hidden': 'true',
'translate': 'no',
},
template: '<ng-content />',
styleUrl: './icon.component.scss',
})
export class IconComponent {
private static isFontLoaded = signal(false);
protected readonly fontSize = computed(() => (IconComponent.isFontLoaded() ? null : 0));
/** Share the same promise across different instances of the component */
private static whenFontLoad?: Promise<FontFace[]> | undefined;
constructor() {
if (IconComponent.isFontLoaded()) {
return;
}
const document = inject(DOCUMENT);
afterNextRender(async () => {
IconComponent.whenFontLoad ??= document.fonts.load('normal 1px "Material Symbols Outlined"');
await IconComponent.whenFontLoad;
IconComponent.isFontLoaded.set(true);
});
}
}