SwInput
SwInput 是文字輸入框:原生 <input> 的薄封裝,價值在「統一基線盒子」而非功能增強——與 SwSelect 觸發器同款盒模型(--control-height / --control-font-size / --input 邊框 / --radius),讓 SwInput / SwSelect / SwSegmented 同行混排預設等高等字號,applier 不必再手寫 input 盒子樣式。
未聲明的原生屬性(placeholder / maxlength / autocomplete / name / readonly …)與原生事件監聽自動落到內層 <input> 上(inheritAttrs: false + v-bind="$attrs"),無需逐一聲明——根是 .sw-input wrapper(承載盒樣式與尾部圖示鈕),對呼叫方的透傳行為與單根版一致。
iOS 聚焦縮放對策:iOS Safari 對 font-size < 16px 的文字輸入框聚焦時會自動放大頁面。SwInput 在觸摸設備(
hover: none+pointer: coarse)下預設字號抬回1rem,高度不變仍 32px;顯式覆蓋--sw-input-font-size時兩端同值生效。
基礎用法
v-model + 原生屬性透傳
<script setup lang="ts">
const keyword = ref('')
</script>
<template>
<SwInput v-model="keyword" placeholder="搜尋關鍵詞" maxlength="50" />
</template>
配 SwFormField(錯誤態)
錯誤文案不歸 SwInput——配 SwFormField 就近顯示;SwInput 的 error 只管 destructive 描邊 + aria-invalid:
SwFormField 簡單模式 + error 描邊 / 禁用
<SwFormField label="郵箱" required :error="emailError">
<SwInput v-model="email" type="email" :error="!!emailError" />
</SwFormField>
vee-validate 模式用 v-bind="field" 注入:
<SwFormField name="email" label="郵箱" v-slot="{ field, error }">
<SwInput v-bind="field" type="email" :error="!!error" />
</SwFormField>
一鍵清除與密碼可見性
clearable 在值非空時於尾部顯示清除鈕(清空 + 聚焦回 input + emit clear);revealable 僅對 type="password" 生效,切換明/密文(其他 type 傳了靜默忽略)。兩鈕開啟即右側常駐留位(值出現 / 清空不擠動文字),自帶觸摸熱區(sw-hit-area)與三語 aria-label:
clearable 清除 + revealable 密碼切換
<SwInput v-model="keyword" clearable placeholder="搜尋" @clear="onCleared" />
<SwInput v-model="password" type="password" clearable revealable />
表單控件族等高混排
SwInput + SwSelect + SwSegmented 預設等高
Props
| 名稱 | 類型 | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
modelValue(v-model) | string | number | '' | 受控值;輸入時 emit string(type="number" 亦 emit string,業務自轉) | |
type | 'text' | 'password' | 'search' | 'email' | 'tel' | 'url' | 'number' | 'text' | 原生 type | |
disabled | boolean | false | 禁用態 | |
error | boolean | false | 錯誤態(destructive 描邊 + aria-invalid),布林(對齊 Vuetify);錯誤文案配 SwFormField 顯示——SwFormField 的 error 是字串文案,聯動寫 :error="!!field.error" | |
clearable | boolean | false | 一鍵清除鈕:值非空且未禁用時顯示;點擊=清空 + emit update:modelValue('') + emit clear + 聚焦回 input | |
revealable | boolean | false | 密碼明/密文切換鈕,僅 type="password" 生效(其他 type 靜默忽略 + dev warn);切換只改內部顯示,不改 type prop |
其餘原生屬性一律 fallthrough 透傳,無需組件聲明。
Events
| 名稱 | 攜帶 | 說明 |
|---|---|---|
update:modelValue | value: string | 輸入時觸發 |
clear | — | 點清除鈕時觸發(在 update:modelValue('') 之後) |
原生事件(focus / blur / change …)經 fallthrough 直接監聽即可。
樣式定制 Token
| Token | 預設值 | 作用點 |
|---|---|---|
--sw-input-min-height | var(--control-height) | 最小高 |
--sw-input-padding | 0.25rem 0.75rem | 內邊距 |
--sw-input-border | var(--input) | 描邊色 |
--sw-input-radius | var(--radius) | 圓角 |
--sw-input-bg | var(--background) | 底色 |
--sw-input-color | var(--foreground) | 文字色 |
--sw-input-font-size | var(--control-font-size)(觸摸設備 1rem) | 字號 |
--sw-input-error-border | var(--destructive) | 錯誤態描邊色 |
--sw-input-placeholder-color | var(--muted-foreground) | placeholder 文字色 |
高度 / 字號預設吃表單控件族語義 token
--control-height(32px)/--control-font-size(14px)——覆蓋這兩個 token 全站控件同步縮放,元件級 token 優先級更高。
注意事項
- 拿原生 DOM / 命令式聚焦:根是 wrapper(
$el不再是<input>),走defineExpose的focus()/blur()/select():inputRef.value?.focus()。 - 錯誤文案不歸本組件:
error只管視覺描邊,文案用 SwFormField 的errorprop / vee-validate 就近顯示。 - 多行文字不適用:本組件只封裝單行
<input>;<textarea>場景暫用原生元素(SwTextarea形態預留、等真實需求)。 - 表單裡的提交按鈕對齊:SwButton 維持零樣式(不吃
--control-height),表單內按鈕由業務寫height: var(--control-height)與控件對齊。