import { html, nothing, type TemplateResult } from 'lit';
import { unsafeSVG } from 'lit/directives/unsafe-svg.js';
import type { NuiType } from '../../types/nui-type.js';
import { LOGO_DARKER_PATH, LOGO_LIGHTER_PATH } from './logo-paths.js';
export interface NuiLogoViewState {
dimensions: number;
useSymbol: boolean;
lighterColorClass: string;
darkerColorClass: string;
nuiType: NuiType;
logoClass: string;
}
const LOGO_LIGHTER_FALLBACK = '#10b981';
const LOGO_DARKER_FALLBACK = '#125148';
export function resolveLogoDimensions(dimensions: number | string): number {
const parsed = Number(dimensions);
return Number.isFinite(parsed) && parsed > 0 ? parsed : 44;
}
export function getLogoClass(logoClass: string): string {
return ['nui-logo', logoClass].filter(Boolean).join(' ');
}
export function getLogoStyle(nuiType: string): string | undefined {
const type = nuiType.trim();
if (!type) {
return undefined;
}
const lighter = `var(--${type}-c-s, var(--${type}-c-u, ${LOGO_LIGHTER_FALLBACK}))`;
const darker = `var(--${type}-d-s, var(--${type}-d-u, ${LOGO_DARKER_FALLBACK}))`;
return `--logo-lighter-color:${lighter};--logo-darker-color:${darker}`;
}
function getPathFill(
varName: string,
fallback: string,
themed: boolean,
): string {
return themed ? `var(${varName}, ${fallback})` : fallback;
}
function renderInlineLogo(
state: NuiLogoViewState,
size: number,
): TemplateResult {
const themed = Boolean(state.nuiType.trim());
const className = getLogoClass(state.logoClass);
const style = getLogoStyle(state.nuiType);
const lighterClass = ['nui-logo-lighter', state.lighterColorClass]
.filter(Boolean)
.join(' ');
const darkerClass = ['nui-logo-darker', state.darkerColorClass]
.filter(Boolean)
.join(' ');
const lighterFill = getPathFill(
'--logo-lighter-color',
LOGO_LIGHTER_FALLBACK,
themed,
);
const darkerFill = getPathFill(
'--logo-darker-color',
LOGO_DARKER_FALLBACK,
themed,
);
const styleAttr = style ? ` style="${style}"` : '';
const typeAttr = state.nuiType ? ` nui-type="${state.nuiType}"` : '';
return html`${unsafeSVG(`
`)}`;
}
export function renderLogo(state: NuiLogoViewState): TemplateResult {
const size = resolveLogoDimensions(state.dimensions);
const style = getLogoStyle(state.nuiType);
const className = getLogoClass(state.logoClass);
if (state.useSymbol) {
return html`
`;
}
return renderInlineLogo(state, size);
}