Commit e93f1e9a766b86dd2d4c12ab27c40cd1e0a3996a
1 parent
4a260ed5
update some styles
update some styles
Showing
8 changed files
with
115 additions
and
4 deletions
Show diff stats
src/components/form/form-item.vue
| @@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
| 3 | <label :class="[prefixCls + '-label']" :style="labelStyles" v-if="label">{{ label }}</label> | 3 | <label :class="[prefixCls + '-label']" :style="labelStyles" v-if="label">{{ label }}</label> |
| 4 | <div :class="[prefixCls + '-content']" :style="contentStyles"> | 4 | <div :class="[prefixCls + '-content']" :style="contentStyles"> |
| 5 | <slot></slot> | 5 | <slot></slot> |
| 6 | - <div transition="fade" :class="[prefixCls + '-error']" v-if="validateState === 'error'">{{ validateMessage }}</div> | 6 | + <div transition="fade" :class="[prefixCls + '-error-tip']" v-if="validateState === 'error'">{{ validateMessage }}</div> |
| 7 | </div> | 7 | </div> |
| 8 | </div> | 8 | </div> |
| 9 | </template> | 9 | </template> |
src/styles/components/cascader.less
src/styles/components/form.less
| @@ -39,6 +39,15 @@ | @@ -39,6 +39,15 @@ | ||
| 39 | font-size: @font-size-small; | 39 | font-size: @font-size-small; |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | + &-error-tip{ | ||
| 43 | + position: absolute; | ||
| 44 | + top: 100%; | ||
| 45 | + left: 0; | ||
| 46 | + line-height: 1; | ||
| 47 | + padding-top: 6px; | ||
| 48 | + color: @error-color; | ||
| 49 | + } | ||
| 50 | + | ||
| 42 | &-required { | 51 | &-required { |
| 43 | .@{form-item-prefix-cls}-label:before { | 52 | .@{form-item-prefix-cls}-label:before { |
| 44 | content: '*'; | 53 | content: '*'; |
src/styles/components/input-number.less
| @@ -184,3 +184,12 @@ | @@ -184,3 +184,12 @@ | ||
| 184 | } | 184 | } |
| 185 | } | 185 | } |
| 186 | } | 186 | } |
| 187 | + | ||
| 188 | +.@{form-item-prefix-cls}-error { | ||
| 189 | + .@{input-number-prefix-cls}{ | ||
| 190 | + .input-error; | ||
| 191 | + &-focused { | ||
| 192 | + .active-error; | ||
| 193 | + } | ||
| 194 | + } | ||
| 195 | +} | ||
| 187 | \ No newline at end of file | 196 | \ No newline at end of file |
src/styles/components/input.less
| @@ -42,4 +42,16 @@ | @@ -42,4 +42,16 @@ | ||
| 42 | 42 | ||
| 43 | .@{input-prefix-cls}-group{ | 43 | .@{input-prefix-cls}-group{ |
| 44 | .input-group(~"@{input-prefix-cls}"); | 44 | .input-group(~"@{input-prefix-cls}"); |
| 45 | +} | ||
| 46 | + | ||
| 47 | +.@{form-item-prefix-cls}-error{ | ||
| 48 | + .@{input-prefix-cls}{ | ||
| 49 | + .input-error; | ||
| 50 | + &-icon{ | ||
| 51 | + color: @error-color; | ||
| 52 | + } | ||
| 53 | + } | ||
| 54 | + .@{input-prefix-cls}-group{ | ||
| 55 | + .input-group-error; | ||
| 56 | + } | ||
| 45 | } | 57 | } |
| 46 | \ No newline at end of file | 58 | \ No newline at end of file |
src/styles/components/select.less
| @@ -217,3 +217,17 @@ | @@ -217,3 +217,17 @@ | ||
| 217 | line-height: 30px; | 217 | line-height: 30px; |
| 218 | } | 218 | } |
| 219 | } | 219 | } |
| 220 | + | ||
| 221 | +.@{form-item-prefix-cls}-error{ | ||
| 222 | + .@{select-prefix-cls}{ | ||
| 223 | + &-selection{ | ||
| 224 | + border: 1px solid @error-color; | ||
| 225 | + } | ||
| 226 | + &-arrow{ | ||
| 227 | + color: @error-color; | ||
| 228 | + } | ||
| 229 | + &-visible .@{select-prefix-cls}-selection{ | ||
| 230 | + .active-error; | ||
| 231 | + } | ||
| 232 | + } | ||
| 233 | +} | ||
| 220 | \ No newline at end of file | 234 | \ No newline at end of file |
src/styles/mixins/input.less
| 1 | .hover(@color: @input-hover-border-color) { | 1 | .hover(@color: @input-hover-border-color) { |
| 2 | border-color: tint(@color, 20%); | 2 | border-color: tint(@color, 20%); |
| 3 | } | 3 | } |
| 4 | +.hover-error() { | ||
| 5 | + border-color: @error-color; | ||
| 6 | +} | ||
| 4 | 7 | ||
| 5 | .active(@color: @input-hover-border-color) { | 8 | .active(@color: @input-hover-border-color) { |
| 6 | border-color: tint(@color, 20%); | 9 | border-color: tint(@color, 20%); |
| 7 | outline: 0; | 10 | outline: 0; |
| 8 | box-shadow: 0 0 0 2px fade(@color, 20%); | 11 | box-shadow: 0 0 0 2px fade(@color, 20%); |
| 9 | } | 12 | } |
| 13 | +.active-error() { | ||
| 14 | + border-color: @error-color; | ||
| 15 | + outline: 0; | ||
| 16 | + box-shadow: 0 0 0 2px fade(@error-color, 20%); | ||
| 17 | +} | ||
| 10 | 18 | ||
| 11 | .disabled() { | 19 | .disabled() { |
| 12 | background-color: @input-disabled-bg; | 20 | background-color: @input-disabled-bg; |
| @@ -78,6 +86,16 @@ | @@ -78,6 +86,16 @@ | ||
| 78 | } | 86 | } |
| 79 | } | 87 | } |
| 80 | 88 | ||
| 89 | +.input-error() { | ||
| 90 | + border: 1px solid @error-color; | ||
| 91 | + &:hover { | ||
| 92 | + .hover-error; | ||
| 93 | + } | ||
| 94 | + &:focus { | ||
| 95 | + .active-error; | ||
| 96 | + } | ||
| 97 | +} | ||
| 98 | + | ||
| 81 | .input-group(@inputClass) { | 99 | .input-group(@inputClass) { |
| 82 | display: table; | 100 | display: table; |
| 83 | width: 100%; | 101 | width: 100%; |
| @@ -214,3 +232,24 @@ | @@ -214,3 +232,24 @@ | ||
| 214 | .input-small(); | 232 | .input-small(); |
| 215 | } | 233 | } |
| 216 | } | 234 | } |
| 235 | + | ||
| 236 | +.input-group-error{ | ||
| 237 | + &-prepend, | ||
| 238 | + &-append | ||
| 239 | + { | ||
| 240 | + background-color: #fff; | ||
| 241 | + border: 1px solid @error-color; | ||
| 242 | + .@{css-prefix}select { | ||
| 243 | + &-selection { | ||
| 244 | + background-color: inherit; | ||
| 245 | + border: 1px solid transparent; | ||
| 246 | + } | ||
| 247 | + } | ||
| 248 | + } | ||
| 249 | + &-prepend { | ||
| 250 | + border-right: 0; | ||
| 251 | + } | ||
| 252 | + &-append { | ||
| 253 | + border-left: 0; | ||
| 254 | + } | ||
| 255 | +} | ||
| 217 | \ No newline at end of file | 256 | \ No newline at end of file |
test/routers/form.vue
| @@ -7,10 +7,21 @@ | @@ -7,10 +7,21 @@ | ||
| 7 | </i-input> | 7 | </i-input> |
| 8 | </form-item> | 8 | </form-item> |
| 9 | <form-item label="密码" prop="passwd"> | 9 | <form-item label="密码" prop="passwd"> |
| 10 | - <i-input type="password" :value.sync="form.passwd" placeholder="请输入密码"> | ||
| 11 | - <Icon type="ios-locked-outline" slot="prepend"></Icon> | 10 | + <i-input :value.sync="form.passwd"> |
| 11 | + <i-select slot="prepend" style="width: 80px"> | ||
| 12 | + <i-option value="http">http://</i-option> | ||
| 13 | + <i-option value="https">https://</i-option> | ||
| 14 | + </i-select> | ||
| 15 | + <i-select slot="append" style="width: 70px"> | ||
| 16 | + <i-option value="com">.com</i-option> | ||
| 17 | + <i-option value="org">.org</i-option> | ||
| 18 | + <i-option value="io">.io</i-option> | ||
| 19 | + </i-select> | ||
| 12 | </i-input> | 20 | </i-input> |
| 13 | </form-item> | 21 | </form-item> |
| 22 | + <form-item label="textarea" prop="textarea"> | ||
| 23 | + <i-input :value.sync="form.textarea" type="textarea" :autosize="{minRows: 2,maxRows: 5}" placeholder="请输入..."></i-input> | ||
| 24 | + </form-item> | ||
| 14 | <form-item label="radio" prop="single"> | 25 | <form-item label="radio" prop="single"> |
| 15 | <radio :checked.sync="form.single">Single</radio> | 26 | <radio :checked.sync="form.single">Single</radio> |
| 16 | </form-item> | 27 | </form-item> |
| @@ -266,7 +277,8 @@ | @@ -266,7 +277,8 @@ | ||
| 266 | cascader: [], | 277 | cascader: [], |
| 267 | transfer: this.getMockData(), | 278 | transfer: this.getMockData(), |
| 268 | targetKeys1: this.getTargetKeys(), | 279 | targetKeys1: this.getTargetKeys(), |
| 269 | - input: 1 | 280 | + input: 1, |
| 281 | + textarea: '' | ||
| 270 | }, | 282 | }, |
| 271 | rules: { | 283 | rules: { |
| 272 | mail: [ | 284 | mail: [ |
| @@ -351,6 +363,14 @@ | @@ -351,6 +363,14 @@ | ||
| 351 | { | 363 | { |
| 352 | type: 'number', min: 1, max: 4 | 364 | type: 'number', min: 1, max: 4 |
| 353 | } | 365 | } |
| 366 | + ], | ||
| 367 | + textarea: [ | ||
| 368 | + { | ||
| 369 | + required: true, trigger: 'blur' | ||
| 370 | + }, | ||
| 371 | + { | ||
| 372 | + type: 'string', min: 10 | ||
| 373 | + } | ||
| 354 | ] | 374 | ] |
| 355 | } | 375 | } |
| 356 | } | 376 | } |