diff --git a/components/avatar/demo/index.vue b/components/avatar/demo/index.vue index c26e55fd5..c65d403a3 100644 --- a/components/avatar/demo/index.vue +++ b/components/avatar/demo/index.vue @@ -5,11 +5,13 @@ +
+
U @@ -18,15 +20,22 @@ U
+
{{avatarValue}} 改变
+
+
+ +
+ +
diff --git a/components/badge/Badge.vue b/components/badge/Badge.vue new file mode 100644 index 000000000..fa0988594 --- /dev/null +++ b/components/badge/Badge.vue @@ -0,0 +1,125 @@ + + diff --git a/components/badge/ScrollNumber.vue b/components/badge/ScrollNumber.vue new file mode 100644 index 000000000..3666d25ee --- /dev/null +++ b/components/badge/ScrollNumber.vue @@ -0,0 +1,34 @@ + + diff --git a/components/badge/demo/index.vue b/components/badge/demo/index.vue new file mode 100644 index 000000000..e073eacb0 --- /dev/null +++ b/components/badge/demo/index.vue @@ -0,0 +1,73 @@ + + + diff --git a/components/badge/index.js b/components/badge/index.js new file mode 100644 index 000000000..3396d8bd6 --- /dev/null +++ b/components/badge/index.js @@ -0,0 +1,3 @@ +import Badge from './Badge' + +export default Badge diff --git a/components/badge/style/index.js b/components/badge/style/index.js new file mode 100644 index 000000000..cf31ed80f --- /dev/null +++ b/components/badge/style/index.js @@ -0,0 +1,2 @@ +import '../../style/index.less' +import './index.less' diff --git a/components/badge/style/index.less b/components/badge/style/index.less new file mode 100644 index 000000000..2542a2c50 --- /dev/null +++ b/components/badge/style/index.less @@ -0,0 +1,160 @@ +@import "../../style/themes/default"; + +@badge-prefix-cls: ~"@{ant-prefix}-badge"; +@number-prefix-cls: ~"@{ant-prefix}-scroll-number"; + +.@{badge-prefix-cls} { + position: relative; + display: inline-block; + line-height: 1; + vertical-align: middle; + + &-count { + position: absolute; + transform: translateX(50%); + top: -@badge-height / 2; + right: 0; + height: @badge-height; + border-radius: @badge-height / 2; + min-width: @badge-height; + background: @highlight-color; + color: #fff; + line-height: @badge-height; + text-align: center; + padding: 0 6px; + font-size: @badge-font-size; + white-space: nowrap; + transform-origin: -10% center; + font-family: tahoma; + a, + a:hover { + color: #fff; + } + } + + &-dot { + position: absolute; + transform: translateX(50%); + transform-origin: 0 center; + top: -@badge-dot-size / 2; + right: 0; + height: @badge-dot-size; + width: @badge-dot-size; + border-radius: 100%; + background: @highlight-color; + z-index: 10; + box-shadow: 0 0 0 1px #fff; + } + + &-status { + line-height: inherit; + vertical-align: baseline; + + &-dot { + width: 8px; + height: 8px; + display: inline-block; + border-radius: 50%; + } + &-success { + background-color: @success-color; + } + &-processing { + background-color: @primary-color; + position: relative; + &:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 50%; + border: 1px solid @primary-color; + content: ''; + animation: antStatusProcessing 1.2s infinite ease-in-out; + } + } + &-default { + background-color: @normal-color; + } + &-error { + background-color: @error-color; + } + &-warning { + background-color: @warning-color; + } + &-text { + color: @text-color; + font-size: @font-size-base; + margin-left: 8px; + } + } + + &-zoom-appear, + &-zoom-enter { + animation: antZoomBadgeIn .3s @ease-out-back; + animation-fill-mode: both; + } + + &-zoom-leave { + animation: antZoomBadgeOut .3s @ease-in-back; + animation-fill-mode: both; + } + + &-not-a-wrapper &-count { + top: auto; + display: block; + position: relative; + transform: none !important; + } +} + +@keyframes antStatusProcessing { + 0% { + transform: scale(0.8); + opacity: 0.5; + } + 100% { + transform: scale(2.4); + opacity: 0; + } +} + +.@{number-prefix-cls} { + overflow: hidden; + &-only { + display: inline-block; + transition: all .3s @ease-in-out; + height: @badge-height; + > p { + height: @badge-height; + } + } +} + +@keyframes antZoomBadgeIn { + 0% { + opacity: 0; + transform: scale(0) translateX(-50%); + } + 100% { + transform: scale(1) translateX(-50%); + } +} + +@keyframes antZoomBadgeOut { + 0% { + transform: scale(1) translateX(-50%); + } + 100% { + opacity: 0; + transform: scale(0) translateX(-50%); + } +} + +.fade-enter-active, .fade-leave-active { + transition: opacity 3s; +} +.fade-enter, .fade-leave-to { + opacity: 0; +} diff --git a/components/index.js b/components/index.js index ce5dbc5d3..59fe61528 100644 --- a/components/index.js +++ b/components/index.js @@ -21,3 +21,5 @@ export { default as Col } from './grid/Col' export { default as Tag } from './tag' export { default as Avatar } from './avatar' + +export { default as Badge } from './badge' diff --git a/components/style.js b/components/style.js index 5dc17fc10..3a3d9aeec 100644 --- a/components/style.js +++ b/components/style.js @@ -7,3 +7,4 @@ import './tag/style' import './rate/style' import './pagination/style' import './avatar/style' +import './badge/style'