[READ-ONLY] a fast, modern browser for the npm registry
at main 49 lines 1.4 kB view raw
1<script setup lang="ts"> 2import { noCorrect } from '~/utils/input' 3 4const model = defineModel<string>({ default: '' }) 5 6const props = withDefaults( 7 defineProps<{ 8 disabled?: boolean 9 size?: 'small' | 'medium' | 'large' 10 noCorrect?: boolean 11 }>(), 12 { 13 size: 'medium', 14 noCorrect: true, 15 }, 16) 17 18const emit = defineEmits<{ 19 focus: [event: FocusEvent] 20 blur: [event: FocusEvent] 21}>() 22 23const el = useTemplateRef('el') 24 25defineExpose({ 26 focus: () => el.value?.focus(), 27 blur: () => el.value?.blur(), 28}) 29</script> 30 31<template> 32 <input 33 ref="el" 34 v-model="model" 35 v-bind="props.noCorrect ? noCorrect : undefined" 36 @focus="emit('focus', $event)" 37 @blur="emit('blur', $event)" 38 class="appearance-none bg-bg-subtle border border-border font-mono text-fg placeholder:text-fg-subtle transition-[border-color,outline-color] duration-300 hover:border-fg-subtle outline-2 outline-transparent outline-offset-2 focus:border-accent focus-visible:outline-accent/70 disabled:(opacity-50 cursor-not-allowed)" 39 :class="{ 40 'text-xs leading-[1.2] px-2 py-2 rounded-md': size === 'small', 41 'text-sm leading-none px-3 py-2.5 rounded-lg': size === 'medium', 42 'text-base leading-[1.4] px-6 py-4 rounded-xl': size === 'large', 43 }" 44 :disabled=" 45 /** Catching Vue render-bug of invalid `disabled=false` attribute in the final HTML */ 46 disabled ? true : undefined 47 " 48 /> 49</template>