import { html, nothing, type TemplateResult } from 'lit';
import type { NuiType } from '../../types/nui-type.js';
import type {
BadgeSeverity,
ButtonIconPosition,
ButtonMedia,
ButtonSeverity,
ButtonSize,
ButtonType,
ButtonVariant,
} from './types.js';
export interface NuiButtonViewState {
label: string;
variant: ButtonVariant;
severity: ButtonSeverity | '';
disabled: boolean;
type: ButtonType;
icon: string;
iconPos: ButtonIconPosition;
iconClass: string;
badge: string;
badgeClass: string;
badgeSeverity: BadgeSeverity;
loading: boolean;
loadingIcon: string;
link: boolean;
raised: boolean;
rounded: boolean;
text: boolean;
outlined: boolean;
size: ButtonSize | '';
plain: boolean;
fluid: boolean;
nuiType: NuiType;
media: ButtonMedia | '';
alt: string;
width: string;
height: string;
gap: string;
padding: string;
src: string;
buttonClass: string;
buttonStyle: string;
}
export function resolveSeverity(
state: Pick,
): ButtonSeverity | 'primary' {
if (state.severity) {
return state.severity;
}
if (state.variant === 'secondary') {
return 'secondary';
}
return 'primary';
}
export function resolveVisualVariant(
state: Pick<
NuiButtonViewState,
'link' | 'variant' | 'text' | 'plain' | 'outlined'
>,
): 'solid' | 'outlined' | 'text' | 'link' {
if (state.link || state.variant === 'link') {
return 'link';
}
if (state.text || state.variant === 'text' || state.plain) {
return 'text';
}
if (state.outlined || state.variant === 'outlined') {
return 'outlined';
}
return 'solid';
}
export function getButtonClass(buttonClass: string): string {
return ['nui-button', buttonClass].filter(Boolean).join(' ');
}
export function getInlineStyles(
state: Pick<
NuiButtonViewState,
'width' | 'height' | 'gap' | 'padding' | 'buttonStyle'
>,
): string {
const stylesList: string[] = [];
if (state.width) stylesList.push(`width:${state.width}`);
if (state.height) stylesList.push(`height:${state.height}`);
if (state.gap) stylesList.push(`gap:${state.gap}`);
if (state.padding) stylesList.push(`padding:${state.padding}`);
if (state.buttonStyle) stylesList.push(state.buttonStyle);
return stylesList.join(';');
}
export const DEFAULT_LOADING_ICON = 'svg-spinners:90-ring-with-bg';
export function renderIcon(
icon: string,
iconWrapperClass: string,
): TemplateResult {
return html`
`;
}
export function renderLoadingIcon(
loadingIcon: string,
iconClass: string,
): TemplateResult {
const icon = loadingIcon || DEFAULT_LOADING_ICON;
return html`
`;
}
export function renderMedia(
state: Pick,
): TemplateResult | typeof nothing {
if (!state.src && state.media !== 'image') {
return nothing;
}
return html`
`;
}
export function renderBadge(
state: Pick,
): TemplateResult | typeof nothing {
if (!state.badge) {
return nothing;
}
return html`
${state.badge}
`;
}
export function renderLabel(label: string): TemplateResult | typeof nothing {
if (!label) {
return nothing;
}
return html`${label}`;
}
export function renderButton(state: NuiButtonViewState): TemplateResult {
const showIcon = Boolean(state.icon) && !state.loading;
const isDisabled = state.disabled || state.loading;
const inlineStyles = getInlineStyles(state);
const severity = resolveSeverity(state);
const visualVariant = resolveVisualVariant(state);
const showSeverity = Boolean(state.severity) || state.variant === 'secondary';
return html`
`;
}