chore: establish V1.1 recovery baseline

This commit is contained in:
2026-09-09 22:05:00 +08:00
commit b46b48eb33
947 changed files with 155471 additions and 0 deletions
+43
View File
@@ -0,0 +1,43 @@
/**
* Input 输入框(规范 §18-19 表单)
*
* 支持 label、错误提示、字数计数(maxLength 触发)、清除按钮。
* 用法:
* <ui-input label="昵称" placeholder="请输入昵称" value="{{name}}"
* maxlength="20" error="{{errors.name}}" bind:input="onInputName" />
*/
Component({
options: { addGlobalClass: true },
properties: {
label: { type: String, value: '' },
placeholder: { type: String, value: '' },
value: { type: String, value: '' },
type: { type: String, value: 'text' }, // text|number|idcard|digit|nickname
maxlength: { type: Number, value: 140 }, // -1 表示不限
showCount: { type: Boolean, value: false }, // 是否显示字数
clearable: { type: Boolean, value: true }, // 是否显示清除按钮
error: { type: String, value: '' }, // 错误文案,非空时显示错误态
disabled: { type: Boolean, value: false },
password: { type: Boolean, value: false },
confirmType: { type: String, value: 'done' }, // send|search|next|go|done
inputAlign: { type: String, value: 'left' }, // left|right
},
methods: {
onInput(e) {
this.triggerEvent('input', { value: e.detail.value });
},
onFocus(e) {
this.triggerEvent('focus', e.detail);
},
onBlur(e) {
this.triggerEvent('blur', { value: e.detail.value });
},
onConfirm(e) {
this.triggerEvent('confirm', { value: e.detail.value });
},
onClear() {
this.triggerEvent('input', { value: '' });
this.triggerEvent('clear', {});
},
},
});
+4
View File
@@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}
+32
View File
@@ -0,0 +1,32 @@
<view class="ui-input {{error ? 'ui-input--error' : ''}} {{disabled ? 'ui-input--disabled' : ''}}">
<view wx:if="{{label}}" class="ui-input__label">{{label}}</view>
<view class="ui-input__field-wrap">
<input
class="ui-input__field"
style="text-align: {{inputAlign}};"
type="{{type}}"
password="{{password}}"
value="{{value}}"
placeholder="{{placeholder}}"
placeholder-class="ui-input__placeholder"
maxlength="{{maxlength}}"
disabled="{{disabled}}"
confirm-type="{{confirmType}}"
bindinput="onInput"
bindfocus="onFocus"
bindblur="onBlur"
bindconfirm="onConfirm"
/>
<view
wx:if="{{clearable && value && !disabled}}"
class="ui-input__clear"
catchtap="onClear"
>×</view>
</view>
<view wx:if="{{showCount || error}}" class="ui-input__footer">
<view wx:if="{{error}}" class="ui-input__error">{{error}}</view>
<view wx:if="{{showCount}}" class="ui-input__count">
{{value.length}}{{maxlength > 0 ? '/' + maxlength : ''}}
</view>
</view>
</view>
+69
View File
@@ -0,0 +1,69 @@
.ui-input {
padding: var(--spacing-3) 0;
border-bottom: 1rpx solid var(--color-border);
position: relative;
}
.ui-input__label {
font-size: var(--font-size-sm);
color: var(--color-text-tertiary);
margin-bottom: var(--spacing-2);
}
.ui-input__field-wrap {
display: flex;
align-items: center;
}
.ui-input__field {
flex: 1;
min-width: 0;
font-size: var(--font-size-base);
color: var(--color-text-primary);
padding: var(--spacing-2) 0;
line-height: var(--line-height-normal);
}
.ui-input__placeholder {
color: var(--color-text-placeholder);
}
.ui-input__clear {
flex-shrink: 0;
margin-left: var(--spacing-2);
width: 36rpx;
height: 36rpx;
border-radius: 50%;
background: var(--color-text-disabled);
color: #FFFFFF;
font-size: 28rpx;
display: flex;
align-items: center;
justify-content: center;
line-height: 1;
}
.ui-input__footer {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-top: var(--spacing-1);
min-height: 28rpx;
}
.ui-input__error {
color: var(--color-danger);
font-size: var(--font-size-xs);
flex: 1;
}
.ui-input__count {
color: var(--color-text-tertiary);
font-size: var(--font-size-xs);
margin-left: var(--spacing-2);
}
.ui-input--error .ui-input__field {
color: var(--color-danger);
}
.ui-input--error {
border-bottom-color: var(--color-border-error);
}
.ui-input--disabled .ui-input__field {
color: var(--color-text-disabled);
background: var(--color-bg-disabled);
border-radius: var(--radius-sm);
padding-left: var(--spacing-2);
padding-right: var(--spacing-2);
}