component FileInput { outputs { input(payload: { files: File[]; name: string; sourceEvent: Event }) change(payload: { files: File[]; name: string; sourceEvent: Event }) focus(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) blur(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) select(payload: { files: File[]; name: string; sourceEvent: Event }) clear(payload: { name: string; sourceEvent: Event }) invalid(payload: { message?: string; value: string | number | boolean | null | object; sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) } props { size: string = "default" color: string = "primary" id: string = "" name: string = "" label: string = "File" hiddenLabel: boolean = false placeholder: string = "Choose a file" value: string = "" icon: string = "icon-[lucide--upload]" iconPosition: string = "start" accept: string = "" multiple: boolean = false helperText: string = "" cornerHint: string = "" error: string = "" inline: boolean = false variant: string = "normal" readonly: boolean = false disabled: boolean = false required: boolean = false class: string = "" } state selectedName: string = "" functions { client function handleChange(sourceEvent) { sourceEvent.stopPropagation() selectedName = sourceEvent.currentTarget.files && sourceEvent.currentTarget.files.length ? sourceEvent.currentTarget.files[0].name : "" output.input({ files: sourceEvent.currentTarget.files, name: name, sourceEvent: sourceEvent }) output.change({ files: sourceEvent.currentTarget.files, name: name, sourceEvent: sourceEvent }) if (selectedName) output.select({ files: sourceEvent.currentTarget.files, name: name, sourceEvent: sourceEvent }) else output.clear({ name: name, sourceEvent: sourceEvent }) } client function emitField(nameEvent, sourceEvent) { sourceEvent.stopPropagation(); output[nameEvent]({ name: name, sourceEvent: sourceEvent }) } client function preventReadonly(sourceEvent) { if (readonly) sourceEvent.preventDefault() } } view {
{#if cornerHint}{cornerHint}{/if}
{#if icon}{/if}{selectedName || value || placeholder}
{#if helperText}{helperText}{/if}{error}
} style { .wire-next__file-control { position: relative; min-height: 2.75rem; padding: 0.65rem 0.85rem; border: 1px dashed var(--wire-color-border); border-radius: var(--wire-radius-sm); background: var(--wire-color-surface); } .wire-next__file-control input { position: absolute; cursor: pointer; opacity: 0; inset: 0; } } }