diff --git a/build/bin/build-entry.js b/build/bin/build-entry.js
index 6294590f1..34d111e49 100644
--- a/build/bin/build-entry.js
+++ b/build/bin/build-entry.js
@@ -34,8 +34,7 @@ export {
};
export default {
install,
- version,
-{{list}}
+ version
};
`;
diff --git a/components.json b/components.json
index dd4b25daa..705772a32 100644
--- a/components.json
+++ b/components.json
@@ -36,5 +36,6 @@
"uploader": "./packages/uploader/index.js",
"swipe": "./packages/swipe/index.js",
"swipe-item": "./packages/swipe-item/index.js",
- "datetime-picker": "./packages/datetime-picker/index.js"
+ "datetime-picker": "./packages/datetime-picker/index.js",
+ "notice-bar": "./packages/notice-bar/index.js"
}
diff --git a/docs/examples-docs/notice-bar.md b/docs/examples-docs/notice-bar.md
new file mode 100644
index 000000000..eaccdde97
--- /dev/null
+++ b/docs/examples-docs/notice-bar.md
@@ -0,0 +1,69 @@
+
+
+## NoticeBar 通告栏
+
+### 使用指南
+``` javascript
+import { NoticeBar } from 'vant';
+
+Vue.component(NoticeBar.name, NoticeBar);
+```
+
+### 代码演示
+
+#### 基础用法
+
+:::demo 基础用法
+```html
+
+```
+:::
+
+#### 禁用滚动
+文字内容多于一行时,可通过`scrollable`参数控制是否开启滚动
+
+:::demo 禁用滚动
+```html
+
+ 足协杯战线连续第2年上演广州德比战,上赛季半决赛上恒大以两回合5-3的总比分淘汰富力。
+
+```
+:::
+
+#### 通告栏模式
+默认模式为空,支持`closeable`和`link`。
+
+:::demo 通告栏模式
+```html
+
+
+ 足协杯战线连续第2年上演广州德比战,上赛季半决赛上恒大以两回合5-3的总比分淘汰富力。
+
+
+
+
+ 足协杯战线连续第2年上演广州德比战,上赛季半决赛上恒大以两回合5-3的总比分淘汰富力。
+
+```
+:::
+
+### API
+
+| 参数 | 说明 | 类型 | 默认值 | 可选值 |
+|-----------|-----------|-----------|-------------|-------------|
+| mode | 通告栏模式 | String | `''` | `closeable` `link` |
+| delay | 动画延迟时间,单位秒 | Number | `1` | |
+| scrollable | 是否滚动 | Boolean | `true` | |
+| speed | 滚动速率,单位px | Number | `40` | |
+
+### Event
+
+| 事件名 | 说明 | 参数 |
+|-----------|-----------|-----------|
+| click | 点击事件回调 | - |
diff --git a/docs/src/ExamplesDocsApp.vue b/docs/src/ExamplesDocsApp.vue
index c8753bf7f..85337be4a 100644
--- a/docs/src/ExamplesDocsApp.vue
+++ b/docs/src/ExamplesDocsApp.vue
@@ -7,7 +7,6 @@
diff --git a/packages/vant-css/src/index.css b/packages/vant-css/src/index.css
index d18b5a74d..6a7bfa8df 100644
--- a/packages/vant-css/src/index.css
+++ b/packages/vant-css/src/index.css
@@ -30,3 +30,4 @@
@import './toast.css';
@import './uploader.css';
@import './swipe.css';
+@import './notice-bar.css';
diff --git a/packages/vant-css/src/notice-bar.css b/packages/vant-css/src/notice-bar.css
new file mode 100644
index 000000000..67f912a1a
--- /dev/null
+++ b/packages/vant-css/src/notice-bar.css
@@ -0,0 +1,36 @@
+@import './common/var.css';
+
+.van-notice-bar {
+ color: #f60;
+ padding: 9px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ background-color: #fff7cc;
+
+ &--withicon {
+ position: relative;
+ padding-right: 30px;
+ }
+
+ &__icon {
+ top: 10px;
+ right: 10px;
+ position: absolute;
+ font-size: 15px;
+ line-height: 1;
+ cursor: pointer;
+ }
+
+ &__content-wrap {
+ height: 18px;
+ overflow: hidden;
+ position: relative;
+ }
+
+ &__content {
+ position: absolute;
+ white-space: nowrap;
+ transition-property: left;
+ transition-timing-function: linear;
+ }
+}
diff --git a/test/unit/components/notice-bar.vue b/test/unit/components/notice-bar.vue
new file mode 100644
index 000000000..7eed57545
--- /dev/null
+++ b/test/unit/components/notice-bar.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
diff --git a/test/unit/get-webpack-conf.js b/test/unit/get-webpack-conf.js
index 6d0818692..3861fd399 100644
--- a/test/unit/get-webpack-conf.js
+++ b/test/unit/get-webpack-conf.js
@@ -75,7 +75,21 @@ function getWebpackConfig(testFileName) {
]
},
{
- test: /\.vue$/,
+ test: /test\/unit\/components\/.*\.vue$|packages\/swipe\/.*\.vue$/,
+ use: [
+ {
+ loader: 'vue-loader',
+ options: {
+ loaders: {
+ css: ['style-loader', 'css-loader', 'postcss-loader']
+ }
+ }
+ }
+ ]
+ },
+ {
+ test: /packages\/.*\.vue$/,
+ exclude: /packages\/swipe\/.*\.vue$/,
use: [
{
loader: 'vue-loader',
diff --git a/test/unit/index.js b/test/unit/index.js
index 9f20bac30..cac038bbe 100644
--- a/test/unit/index.js
+++ b/test/unit/index.js
@@ -13,4 +13,4 @@ if (process.env.TEST_FILE) {
});
} else {
testsReq.keys().forEach(testsReq);
-}
\ No newline at end of file
+}
diff --git a/test/unit/karma.conf.js b/test/unit/karma.conf.js
index 7c8a89d96..0056f945a 100644
--- a/test/unit/karma.conf.js
+++ b/test/unit/karma.conf.js
@@ -14,7 +14,8 @@ module.exports = function(config) {
reporters: ['spec', 'coverage'],
files: ['./index.js'],
preprocessors: {
- './index.js': ['webpack', 'sourcemap']
+ './index.js': ['webpack', 'sourcemap'],
+ 'test/unit/!(components)/**/*.vue': ['coverage']
},
webpack: getWebpackConfig(getTestFileName()),
webpackMiddleware: {
diff --git a/test/unit/specs/cell-swipe.spec.js b/test/unit/specs/cell-swipe.spec.js
index 89e5ca833..ed142b25f 100644
--- a/test/unit/specs/cell-swipe.spec.js
+++ b/test/unit/specs/cell-swipe.spec.js
@@ -7,14 +7,14 @@ const defaultProps = {
leftWidth: 100,
rightWidth: 100
}
-}
+};
describe('CellSwipe', () => {
let wrapper;
afterEach(() => {
wrapper && wrapper.destroy();
});
-
+
it('render left or right part when has width', () => {
wrapper = mount(CellSwipe, defaultProps);
expect(wrapper.find('.van-cell-swipe__left').length).to.equal(1);
@@ -97,7 +97,7 @@ describe('CellSwipe', () => {
triggerTouch(wrapper, 'touchstart', 0, 0);
triggerTouch(wrapper, 'touchmove', 1, 0);
-
+
wrapper.vm.$nextTick(() => {
expect(wrapper.vm.offset).to.equal(0);
expect(wrapper.vm.opened).to.be.false;
diff --git a/test/unit/specs/notice-bar.spec.js b/test/unit/specs/notice-bar.spec.js
new file mode 100644
index 000000000..87c796e44
--- /dev/null
+++ b/test/unit/specs/notice-bar.spec.js
@@ -0,0 +1,61 @@
+import NoticeBar from '../components/notice-bar';
+import { mount } from 'avoriaz';
+
+describe('NoticeBar', () => {
+ let wrapper;
+ afterEach(() => {
+ wrapper && wrapper.destroy();
+ });
+
+ it('create a notice-bar', () => {
+ wrapper = mount(NoticeBar, {
+ propsData: {},
+ attachToDocument: true
+ });
+
+ expect(wrapper.find('.van-notice-bar').length).to.equal(1);
+ });
+
+ it('mode closeable', () => {
+ wrapper = mount(NoticeBar, {
+ propsData: {
+ mode: 'closeable'
+ },
+ attachToDocument: true
+ });
+
+ const icon = wrapper.find('.van-icon-close');
+ expect(icon.length).to.equal(1);
+
+ icon[0].trigger('click');
+ expect(wrapper.hasStyle('display', 'none'));
+ });
+
+ it('mode link', () => {
+ wrapper = mount(NoticeBar, {
+ propsData: {
+ mode: 'link'
+ },
+ attachToDocument: true
+ });
+
+ expect(wrapper.find('.van-icon-arrow').length).to.equal(1);
+ });
+
+ it('notice-bar transitionend', (done) => {
+ wrapper = mount(NoticeBar, {
+ propsData: {
+ text: '足协杯战线连续第2年上演广州德比战',
+ speed: 1000,
+ delay: 0
+ },
+ attachToDocument: true
+ });
+
+ const content = wrapper.find('.van-notice-bar__content')[0];
+ setTimeout(() => {
+ expect(content.hasStyle('transition-delay', '0s')).to.be.true;
+ done();
+ }, 500);
+ });
+});
diff --git a/yarn.lock b/yarn.lock
index 28f96953e..65dac4f42 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4819,6 +4819,16 @@ markdown-it@^8.3.2:
mdurl "^1.0.1"
uc.micro "^1.0.3"
+markdown-it@^8.4.0:
+ version "8.4.0"
+ resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d"
+ dependencies:
+ argparse "^1.0.7"
+ entities "~1.1.1"
+ linkify-it "^2.0.0"
+ mdurl "^1.0.1"
+ uc.micro "^1.0.3"
+
math-expression-evaluator@^1.2.14:
version "1.2.17"
resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
@@ -6036,7 +6046,7 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0
source-map "^0.5.6"
supports-color "^3.2.3"
-postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.2, postcss@^6.0.3, postcss@^6.0.6, postcss@^6.0.8, postcss@^6.0.9:
+postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.2, postcss@^6.0.3, postcss@^6.0.6, postcss@^6.0.9:
version "6.0.9"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.9.tgz#54819766784a51c65b1ec4d54c2f93765438c35a"
dependencies:
@@ -6044,6 +6054,14 @@ postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.2, postcss@^6.0.3, postcss@^6.0.6,
source-map "^0.5.6"
supports-color "^4.2.1"
+postcss@^6.0.10:
+ version "6.0.10"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-6.0.10.tgz#c311b89734483d87a91a56dc9e53f15f4e6e84e4"
+ dependencies:
+ chalk "^2.1.0"
+ source-map "^0.5.7"
+ supports-color "^4.2.1"
+
precss@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/precss/-/precss-2.0.0.tgz#7f567e3318e06d44c8fdbf9e58452e8358bf4b71"
@@ -6848,6 +6866,10 @@ source-map@^0.1.41:
dependencies:
amdefine ">=0.0.4"
+source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
source-map@~0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
@@ -7937,9 +7959,9 @@ yeast@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
-zan-doc@^0.2.2:
- version "0.2.2"
- resolved "https://registry.npmjs.org/zan-doc/-/zan-doc-0.2.2.tgz#ebf8ffda5bd3cf9277cc3e59c48476a3fbf84d9f"
+zan-doc@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.npmjs.org/zan-doc/-/zan-doc-0.2.5.tgz#4f82e1b75db1a348b57436cd1d4ffb607bc18562"
dependencies:
cheerio "0.22.0"
decamelize "^1.2.0"