import { html, nothing, type TemplateResult } from 'lit'; import type { NuiType } from '../../types/nui-type.js'; import type { InputNumberButtonLayout, InputNumberMode, InputNumberSize, InputNumberVariant, } from './types.js'; export interface NuiInputNumberViewState { inputValue: string; min: number | null; max: number | null; step: number; format: boolean; showButtons: boolean; buttonLayout: InputNumberButtonLayout; mode: InputNumberMode; locale: string; currency: string; useGrouping: boolean; minFractionDigits?: number; maxFractionDigits?: number; prefix: string; suffix: string; placeholder: string; disabled: boolean; readonly: boolean; invalid: boolean; required: boolean; allowEmpty: boolean; size: InputNumberSize | ''; variant: InputNumberVariant | ''; fluid: boolean; nuiType: NuiType; inputClass: string; name: string; inputId: string; ariaLabel: string; ariaLabelledby: string; incrementIcon: string; decrementIcon: string; canIncrement: boolean; canDecrement: boolean; } export function getInputClass(inputClass: string): string { return ['nui-input-number-input', inputClass].filter(Boolean).join(' '); } export function getRootClass(state: NuiInputNumberViewState): string { return [ 'nui-input-number', state.showButtons ? `nui-input-number-${state.buttonLayout}` : '', ] .filter(Boolean) .join(' '); } function getStepIcon( kind: 'increment' | 'decrement', state: NuiInputNumberViewState, ): string { const icon = kind === 'increment' ? state.incrementIcon : state.decrementIcon; if (state.buttonLayout === 'stacked') { return icon; } if (kind === 'increment' && icon === 'mdi:chevron-up') { return 'mdi:plus'; } if (kind === 'decrement' && icon === 'mdi:chevron-down') { return 'mdi:minus'; } return icon; } function renderStepButton( kind: 'increment' | 'decrement', state: NuiInputNumberViewState, handler: (event: Event) => void, ): TemplateResult { const icon = getStepIcon(kind, state); const disabled = state.disabled || state.readonly || (kind === 'increment' ? !state.canIncrement : !state.canDecrement); return html` `; } export function renderInputNumber( state: NuiInputNumberViewState, handlers: { onInput: (event: Event) => void; onChange: (event: Event) => void; onKeyDown: (event: KeyboardEvent) => void; onIncrement: (event: Event) => void; onDecrement: (event: Event) => void; }, ): TemplateResult { const decrement = renderStepButton('decrement', state, handlers.onDecrement); const increment = renderStepButton('increment', state, handlers.onIncrement); const input = html` `; if (!state.showButtons) { return html`
${input}
`; } if (state.buttonLayout === 'horizontal') { return html`
${decrement} ${input} ${increment}
`; } if (state.buttonLayout === 'vertical') { return html`
${increment} ${input} ${decrement}
`; } return html`
${input}
${increment} ${decrement}
`; }