diff --git a/components.json b/components.json
index 9375aa786..0e25f11b5 100644
--- a/components.json
+++ b/components.json
@@ -151,5 +151,8 @@
],
"card": [
"./packages/card/index.js"
+ ],
+ "rate": [
+ "./packages/rate/index.js"
]
}
diff --git a/examples/app.vue b/examples/app.vue
index 6ba1d6c38..7d328be04 100644
--- a/examples/app.vue
+++ b/examples/app.vue
@@ -4,6 +4,7 @@
@import '../node_modules/purecss/build/menus.css';
@import '../node_modules/highlight.js/styles/color-brewer.css';
@import 'assets/styles/common.css';
+ @import 'assets/styles/fonts/style.css';
html, body {
margin: 0;
diff --git a/examples/assets/styles/fonts/icomoon.eot b/examples/assets/styles/fonts/icomoon.eot
new file mode 100755
index 000000000..9aed42ade
Binary files /dev/null and b/examples/assets/styles/fonts/icomoon.eot differ
diff --git a/examples/assets/styles/fonts/icomoon.svg b/examples/assets/styles/fonts/icomoon.svg
new file mode 100755
index 000000000..ccf388c02
--- /dev/null
+++ b/examples/assets/styles/fonts/icomoon.svg
@@ -0,0 +1,14 @@
+
+
+
\ No newline at end of file
diff --git a/examples/assets/styles/fonts/icomoon.ttf b/examples/assets/styles/fonts/icomoon.ttf
new file mode 100755
index 000000000..e17987da8
Binary files /dev/null and b/examples/assets/styles/fonts/icomoon.ttf differ
diff --git a/examples/assets/styles/fonts/icomoon.woff b/examples/assets/styles/fonts/icomoon.woff
new file mode 100755
index 000000000..16695e138
Binary files /dev/null and b/examples/assets/styles/fonts/icomoon.woff differ
diff --git a/examples/assets/styles/fonts/style.css b/examples/assets/styles/fonts/style.css
new file mode 100755
index 000000000..598c8e372
--- /dev/null
+++ b/examples/assets/styles/fonts/style.css
@@ -0,0 +1,39 @@
+@font-face {
+ font-family: 'icomoon';
+ src: url('assets/styles/fonts/icomoon.eot?h6xgdm');
+ src: url('assets/styles/fonts/icomoon.eot?h6xgdm#iefix') format('embedded-opentype'),
+ url('assets/styles/fonts/icomoon.ttf?h6xgdm') format('truetype'),
+ url('assets/styles/fonts/icomoon.woff?h6xgdm') format('woff'),
+ url('assets/styles/fonts/icomoon.svg?h6xgdm#icomoon') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+ /* use !important to prevent issues with browser extensions that change fonts */
+ font-family: 'icomoon' !important;
+ speak: none;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+
+ /* Better Font Rendering =========== */
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-rate-face-off:before {
+ content: "\e900";
+}
+.icon-rate-face-1:before {
+ content: "\e901";
+}
+.icon-rate-face-2:before {
+ content: "\e902";
+}
+.icon-rate-face-3:before {
+ content: "\e903";
+}
+
diff --git a/examples/docs/rate.md b/examples/docs/rate.md
new file mode 100644
index 000000000..438b60739
--- /dev/null
+++ b/examples/docs/rate.md
@@ -0,0 +1,102 @@
+
+
+## 基础用法
+
+
+
+
+
+``` html
+
+```
+
+## 区分颜色
+
+利用颜色对分数及情感倾向进行分级。分数可以被分为三个等级,对应的两个阈值可分别通过 `low-threshold` 和 `high-threshold` 设定。
+
+
+
+
+
+``` html
+
+```
+
+## 辅助文字
+
+为组件设置 `show-text` 属性会在右侧显示辅助文字。通过设置 `texts` 可以为每一个分值指定对应的辅助文字。`texts` 为一个数组,长度应等于最大值 `max`。
+
+
+
+
+
+``` html
+
+```
+
+## 其他 icon
+
+
+
+
+
+``` html
+
+
+```
+
+## 只读
+为组件设置 `disabled` 属性表示组件为只读,支持小数分值。此时若设置 `show-text`,则会在右侧显示目前的分值。可以提供 `text-template` 作为显示模板,模板为一个包含了 `{value}` 的字符串,`{value}` 会被解析为分值。
+
+
+
+
+
+``` html
+
+```
+## Attributes
+| 参数 | 说明 | 类型 | 可选值 | 默认值 |
+|---------- |-------- |---------- |------------- |-------- |
+| v-model | 绑定值 | Number | | 0 |
+| max | 最大分值 | Number | | 5 |
+| disabled | 是否为只读 | Boolean | | false |
+| allow-half | 是否允许半选 | Boolean | | false |
+| low-threshold | 低分和中等分数的界限值,值本身被划分在低分中 | Number | | 2 |
+| high-threshold | 高分和中等分数的界限值,值本身被划分在高分中 | Number | | 4 |
+| colors | icon 的颜色数组,共有 3 个元素,为 3 个分段所对应的颜色 | Array | | ['#F7BA2A', '#F7BA2A', '#F7BA2A'] |
+| void-color | 未选中 icon 的颜色 | String | | '#C6D1DE' |
+| disabled-void-color | 只读时未选中 icon 的颜色 | String | | '#EFF2F7' |
+| icon-classes | icon 的类名数组,共有 3 个元素,为 3 个分段所对应的类名 | Array | | ['el-icon-star-on', 'el-icon-star-on', 'el-icon-star-on'] |
+| void-icon-class | 未选中 icon 的类名 | String | | 'el-icon-star-off' |
+| disabled-void-icon-class | 只读时未选中 icon 的类名 | String | | 'el-icon-star-on' |
+| show-text | 是否显示辅助文字 | Boolean | | false |
+| text-color | 辅助文字的颜色 | String | | '1F2D3D' |
+| texts | 辅助文字数组 | Array | | ['极差', '失望', '一般', '满意', '惊喜'] |
+| text-template | 只读时的辅助文字模板 | String | | '{value}' |
+
+## Events
+| 事件名称 | 说明 | 回调参数 |
+|---------- |-------- |---------- |
+| change | 分值改变时触发 | 改变后的分值 |
+
diff --git a/examples/icon.json b/examples/icon.json
index a186b92d7..e9aaaa391 100644
--- a/examples/icon.json
+++ b/examples/icon.json
@@ -1 +1 @@
-["search","share","setting","circle-cross","warning","information","circle-check","delete","d-arrow-left","d-arrow-right","picture","upload","menu","time","circle-close","arrow-down","arrow-up","arrow-right","arrow-left","close","document","d-caret","date","message","loading","ellipsis","plus","caret-left","caret-right","caret-bottom","edit","caret-top","check","minus","angle-left","angle-right","truck"]
\ No newline at end of file
+["search","share","setting","circle-cross","warning","information","circle-check","delete","d-arrow-left","d-arrow-right","picture","upload","menu","time","circle-close","arrow-down","arrow-up","arrow-right","arrow-left","close","document","d-caret","date","message","loading","ellipsis","plus","caret-left","caret-right","caret-bottom","edit","caret-top","check","minus","star-on","star-off"]
\ No newline at end of file
diff --git a/examples/nav.config.json b/examples/nav.config.json
index 1474698f4..1478a721d 100644
--- a/examples/nav.config.json
+++ b/examples/nav.config.json
@@ -178,6 +178,11 @@
"name": "滑块 (slider)",
"title": "slider 滑块",
"description": "通过拖动滑块在一个固定区间内进行选择"
+ },
+ {
+ "path": "/rate",
+ "name": "评分 (rate)",
+ "title": "评分组件"
}
]
},
diff --git a/packages/rate/cooking.conf.js b/packages/rate/cooking.conf.js
new file mode 100644
index 000000000..6de801ab0
--- /dev/null
+++ b/packages/rate/cooking.conf.js
@@ -0,0 +1,31 @@
+var cooking = require('cooking');
+var path = require('path');
+
+cooking.set({
+ entry: {
+ index: path.join(__dirname, 'index.js')
+ },
+ dist: path.join(__dirname, 'lib'),
+ template: false,
+ format: 'umd',
+ moduleName: 'ElRate',
+ extractCSS: 'style.css',
+
+ extends: ['vue', 'saladcss']
+});
+
+cooking.add('resolve.alias', {
+ 'main': path.join(__dirname, '../../src'),
+ 'packages': path.join(__dirname, '../../packages')
+});
+
+cooking.add('externals', {
+ vue: {
+ root: 'Vue',
+ commonjs: 'vue',
+ commonjs2: 'vue',
+ amd: 'vue'
+ }
+});
+
+module.exports = cooking.resolve();
diff --git a/packages/rate/index.js b/packages/rate/index.js
new file mode 100644
index 000000000..ca7d3d916
--- /dev/null
+++ b/packages/rate/index.js
@@ -0,0 +1,7 @@
+const Rate = require('./src/main');
+
+Rate.install = function(Vue) {
+ Vue.component(Rate.name, Rate);
+};
+
+module.exports = Rate;
diff --git a/packages/rate/package.json b/packages/rate/package.json
new file mode 100644
index 000000000..111d54f7d
--- /dev/null
+++ b/packages/rate/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "el-rate",
+ "version": "0.0.0",
+ "description": "A rate component for Vue.js.",
+ "keywords": [
+ "element",
+ "vue",
+ "component"
+ ],
+ "main": "./lib/index.js",
+ "repository": "https://github.com/element-component/element/tree/master/packages/rate",
+ "author": "elemefe",
+ "license": "MIT",
+ "dependencies": {}
+}
diff --git a/packages/rate/src/main.vue b/packages/rate/src/main.vue
new file mode 100644
index 000000000..fd54bc009
--- /dev/null
+++ b/packages/rate/src/main.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
+ {{ text }}
+
+
+
+
diff --git a/packages/select/src/select.vue b/packages/select/src/select.vue
index bff1ef3e0..f903a8434 100644
--- a/packages/select/src/select.vue
+++ b/packages/select/src/select.vue
@@ -190,8 +190,6 @@
},
value(val) {
- this.$emit('input', val);
- this.$emit('change', val);
if (this.valueChangeBySelected) {
this.valueChangeBySelected = false;
return;
@@ -486,6 +484,7 @@
this.selected = {};
this.selectedLabel = '';
this.$emit('input', '');
+ this.$emit('change', '');
this.visible = false;
},
diff --git a/packages/theme-default/src/fonts/element-icons.svg b/packages/theme-default/src/fonts/element-icons.svg
index 5a3ec43c2..6472ce196 100755
--- a/packages/theme-default/src/fonts/element-icons.svg
+++ b/packages/theme-default/src/fonts/element-icons.svg
@@ -39,9 +39,8 @@
-
+
-
-
-
+
+
\ No newline at end of file
diff --git a/packages/theme-default/src/fonts/element-icons.ttf b/packages/theme-default/src/fonts/element-icons.ttf
index 87d83d546..1ca9f4ea5 100755
Binary files a/packages/theme-default/src/fonts/element-icons.ttf and b/packages/theme-default/src/fonts/element-icons.ttf differ
diff --git a/packages/theme-default/src/fonts/element-icons.woff b/packages/theme-default/src/fonts/element-icons.woff
index ae127ac0c..08268fafa 100755
Binary files a/packages/theme-default/src/fonts/element-icons.woff and b/packages/theme-default/src/fonts/element-icons.woff differ
diff --git a/packages/theme-default/src/icon.css b/packages/theme-default/src/icon.css
index 7256b7eca..31e10b98c 100644
--- a/packages/theme-default/src/icon.css
+++ b/packages/theme-default/src/icon.css
@@ -1,9 +1,9 @@
@font-face {
font-family: 'element-icons';
src:
- url('fonts/element-icons.ttf?deq2r7') format('truetype'),
- url('fonts/element-icons.woff?deq2r7') format('woff'),
- url('fonts/element-icons.svg?deq2r7#element-icons') format('svg');
+ url('fonts/element-icons.ttf?ld8k1a') format('truetype'),
+ url('fonts/element-icons.woff?ld8k1a') format('woff'),
+ url('fonts/element-icons.svg?ld8k1a#element-icons') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -127,15 +127,12 @@
.el-icon-minus:before {
content: "\e921";
}
-.el-icon-angle-left:before {
- content: "\f104";
-}
-.el-icon-angle-right:before {
- content: "\f105";
-}
-.el-icon-truck:before {
+.el-icon-star-off:before {
content: "\e922";
}
+.el-icon-star-on:before {
+ content: "\e923";
+}
.el-icon-loading {
animation: rotating 1s linear infinite;
diff --git a/packages/theme-default/src/index.css b/packages/theme-default/src/index.css
index 4eefc067a..da952da9e 100644
--- a/packages/theme-default/src/index.css
+++ b/packages/theme-default/src/index.css
@@ -34,3 +34,4 @@
@import "./spinner.css";
@import "./badge.css";
@import "./card.css";
+@import "./rate.css";
diff --git a/packages/theme-default/src/input.css b/packages/theme-default/src/input.css
index b2ab99ccf..9c4a41b32 100644
--- a/packages/theme-default/src/input.css
+++ b/packages/theme-default/src/input.css
@@ -19,6 +19,7 @@
border-radius: 4px;
transition: var(--border-transition-base);
outline: none;
+ font-size: inherit;
&::placeholder {
color: var(--input-placeholder-color);
diff --git a/packages/theme-default/src/rate.css b/packages/theme-default/src/rate.css
new file mode 100644
index 000000000..fde86c6bc
--- /dev/null
+++ b/packages/theme-default/src/rate.css
@@ -0,0 +1,46 @@
+@charset "UTF-8";
+@import "./common/var.css";
+
+@component-namespace el {
+
+ @b rate {
+ height: 20px;
+ @e item {
+ display: inline-block;
+ position: relative;
+ font-size: 0;
+ vertical-align: middle;
+ }
+
+ @e icon {
+ position: relative;
+ display: inline-block;
+ font-size: 18px;
+ margin-right: 6px;
+ color: #C6D1DE;
+ transition: .3s;
+ &.hover {
+ transform: scale(1.15);
+ }
+
+ .path2 {
+ position: absolute;
+ left: 0;
+ top: 0;
+ }
+ }
+
+ @e decimal {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: inline-block;
+ overflow: hidden;
+ }
+
+ @e text {
+ font-size: 14px;
+ vertical-align: middle;
+ }
+ }
+}
diff --git a/src/index.js b/src/index.js
index 3c95aa92c..0fcf681a1 100644
--- a/src/index.js
+++ b/src/index.js
@@ -47,8 +47,9 @@ import Upload from '../packages/upload/index.js';
import Progress from '../packages/progress/index.js';
import Spinner from '../packages/spinner/index.js';
import Message from '../packages/message/index.js';
-import Badge from '../packages/badge/index.js';
import Card from '../packages/card/index.js';
+import Rate from '../packages/rate/index.js';
+import Badge from '../packages/badge/index.js';
const install = function(Vue) {
if (install.installed) return;
@@ -99,8 +100,9 @@ const install = function(Vue) {
Vue.component(Progress.name, Progress);
Vue.component(Spinner.name, Spinner);
Vue.component(Message.name, Message);
- Vue.component(Badge.name, Badge);
Vue.component(Card.name, Card);
+ Vue.component(Rate.name, Rate);
+ Vue.component(Badge.name, Badge);
Vue.use(Loading);
@@ -167,7 +169,8 @@ module.exports = {
Upload,
Progress,
Spinner,
+ Card,
+ Rate,
Message,
- Badge,
- Card
+ Badge
};