Skip to content

Commit

Permalink
feat(badge): complete badge component
Browse files Browse the repository at this point in the history
  • Loading branch information
yehuozhili committed May 31, 2020
1 parent 547a77c commit cd5a84e
Show file tree
Hide file tree
Showing 13 changed files with 282 additions and 9 deletions.
1 change: 1 addition & 0 deletions .storybook/preview.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ const loaderFn = () => {
require('../src/stories/Welcome.stories.mdx'),
require('../src/components/Alert/alert.stories.mdx'),
require('../src/components/Avatar/avatar.stories.mdx'),
require('../src/components/Badge/badge.stories.mdx'),
require('../src/components/Button/button.stories.mdx'),
require('../src/components/Input/input.stories.mdx'),
require('../src/components/AutoComplete/autocomplete.stories.mdx'),
Expand Down
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
## 0.1.6 (2020-05-30)
## 0.1.7 (2020-05-31)


### Bug Fixes

* **message:** fix message componenet dom remove bug ([547a77c](https://github.com/yehuozhili/bigbear-ui/commit/547a77cc5c0bc9df9fae5ebc354847472ac45f34))
* ghpage decorator bug ([8e36b73](https://github.com/yehuozhili/bigbear-ui/commit/8e36b7308635b7a4bf9278b7996b9cab8279b1fe))


Expand All @@ -15,6 +16,7 @@
* **menu:** initial implement menu component ([33a29c7](https://github.com/yehuozhili/bigbear-ui/commit/33a29c77471183a3fcb14ddf742e351576c8d3b0))
* **menu:** menu component inital complete ([2094eba](https://github.com/yehuozhili/bigbear-ui/commit/2094eba806ead1cb7ea03b8f9aaef9163fe9c0a4))
* **src:** change style and add alert message component ([21590e7](https://github.com/yehuozhili/bigbear-ui/commit/21590e7ea989c9c2f685a791dcfc26b3cd0239f2))
* **virtuallist:** complete virtuallist ([8e6b44a](https://github.com/yehuozhili/bigbear-ui/commit/8e6b44a0b9d2ed3d6478d8da6a93f843dc1439c5))



2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "bigbear-ui",
"version": "0.1.6",
"version": "0.1.7",
"description": "Neumorphism component library for React",
"keywords": [
"component",
Expand Down
38 changes: 38 additions & 0 deletions src/components/Badge/_style.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
.bigbear-badge{
display: inline-block;
position: relative;
vertical-align: bottom;
}

.bigbear-badge-count{
position: absolute;
z-index: 1000;
top: 0;
right: 0;
transform: translate3d(50%,-50%,0);
border-radius:$badge-border-radius;
padding: $badge-padding;
font-size: $badge-font-size;
height: 24px;
}


.bigbear-badge-count.nochildren{
position: static;
transform: translate3d(0,0,0);
}

@each $key,$val in $theme-colors{
.bigbear-count-#{$key}{
color:#{nth($val,2)};
@include neufactory-noactive(nth($val, 1),nth($val,3),nth($val,4))
}
}
.badge-hide{
display: none;
}
.badge-dot{
@include square(5px);
border-radius:50%;
padding: 0;
}
56 changes: 56 additions & 0 deletions src/components/Badge/badge.example.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import React, { useState } from 'react';
import Button from '../Button';
import Icon from '../Icon';
import Badge from './badge';

export function BadgeExample(){
const [numberObj,setNumber]=useState({
trueNumber:0,
displayNumber:'0'
})
const [visible,setVisible]=useState(false)
const addValidate=(number:number)=>{
if(!visible)setVisible(true)
if(number+1>99){
setNumber({
trueNumber:numberObj.trueNumber+1,
displayNumber:'99+'
})
}else{
setNumber({
trueNumber:numberObj.trueNumber+1,
displayNumber:numberObj.trueNumber+1+''
})
}
}
const minusValidate=(number:number)=>{
if(number-1<=0){
setVisible(false)
setNumber({trueNumber:0,displayNumber:'0'})
}else if(number>0&&number-1<=99){
setNumber({
trueNumber:numberObj.trueNumber-1,
displayNumber:numberObj.trueNumber-1+''
})
}else{
setNumber({
trueNumber:numberObj.trueNumber-1,
displayNumber:'99+'
})
}
}
return(
<div>
<Badge count={numberObj.displayNumber} visible={visible} type='danger'>
<Button size='lg'><Icon icon='user' theme='dark' /></Button>
</Badge>
<hr></hr>
<div>点击按钮控制角标数字增减,99以上会变成99+:</div>
<Button onClick={()=>addValidate(numberObj.trueNumber)}>数字加一</Button>
&nbsp;
<Button onClick={()=>minusValidate(numberObj.trueNumber)}>数字减一</Button>
</div>
)
}


99 changes: 99 additions & 0 deletions src/components/Badge/badge.stories.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import { Meta, Story, Props ,Preview } from '@storybook/addon-docs/blocks';
import Badge from './badge'
import Button from '../Button'
import Icon from '../Icon';
import {BadgeExample} from './badge.example'


<Meta title='DISPLAY|Badge 徽章' component={Badge} />

<br/>

# Badge 徽章
<br/>

badge可以单独使用,也可以包裹元素使用,包裹元素会移动到元素右上角。

<Preview>
<Story name='badge'>
<div>
<Badge count={100} ><Button>count100</Button></Badge>
<Badge count={99}></Badge>
<Badge count={1} type={'primary'}></Badge>
<Badge count={1000} type={'info'}></Badge>
<Badge count={<Icon theme='danger' icon ={'coffee'}></Icon>} type={'dark'}></Badge>
<Badge count={'99+'} type={'danger'}></Badge>
<Badge dot={true}><Button >只显示圆点</Button></Badge>
<Badge count={<Icon theme='light' icon ={'spinner'} pulse></Icon>} type={'danger'}><div className='bigbear-list-item' style={{height:'100px',width:'200px'}}></div></Badge>
</div>
</Story>
</Preview>


控制上下限等行为需要自行封装,封装示例:👇


<Story name='change number'>
<BadgeExample></BadgeExample>
</Story>





```jsx
export function BadgeExample(){
const [numberObj,setNumber]=useState({
trueNumber:0,
displayNumber:'0'
})
const [visible,setVisible]=useState(false)
const addValidate=(number:number)=>{
if(!visible)setVisible(true)
if(number+1>99){
setNumber({
trueNumber:numberObj.trueNumber+1,
displayNumber:'99+'
})
}else{
setNumber({
trueNumber:numberObj.trueNumber+1,
displayNumber:numberObj.trueNumber+1+''
})
}
}
const minusValidate=(number:number)=>{
if(number-1<=0){
setVisible(false)
setNumber({trueNumber:0,displayNumber:'0'})
}else if(number>0&&number-1<=99){
setNumber({
trueNumber:numberObj.trueNumber-1,
displayNumber:numberObj.trueNumber-1+''
})
}else{
setNumber({
trueNumber:numberObj.trueNumber-1,
displayNumber:'99+'
})
}
}
return(
<div>
<Badge count={numberObj.displayNumber} visible={visible} type='danger'>
<Button size='lg'><Icon icon='user' theme='dark' /></Button>
</Badge>
<hr></hr>
<div>点击按钮控制角标数字增减,99以上会变成99+</div>
<Button onClick={()=>addValidate(numberObj.trueNumber)}>数字加一</Button>
&nbsp;
<Button onClick={()=>minusValidate(numberObj.trueNumber)}>数字减一</Button>
</div>
)
}
```


## 属性详情

<Props of= {Badge}></Props>
49 changes: 49 additions & 0 deletions src/components/Badge/badge.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import React, { FC,ReactNode, useRef, useEffect } from 'react';
import classNames from 'classnames'



export interface BadgeProps{
/** 颜色*/
type?:"primary" | "default" | "danger" | "secondary" | "success" | "info" | "light" | "warning" | "dark" ;
/**最外层元素的额外类名*/
className?:string;
/**ref回调*/
refCallback?:(e:HTMLDivElement | null)=>void;
/** 数字,文本,图标都可以传*/
count?:ReactNode;
/** 控制是否显示*/
visible?:boolean
/** 是否只显示小点 */
dot?:boolean
}




export const Badge:FC<BadgeProps> = (props)=>{
const {refCallback,className,type,count,visible,dot}=props
const classes =classNames('bigbear-badge',`bigbear-type-${type}`,className)
const divref=useRef<HTMLDivElement>(null)
useEffect(()=>{
if(refCallback&&divref.current){
refCallback(divref.current)
}
},[refCallback])
return(
<div className={classes} ref={divref} >
{count||dot?<div className={`bigbear-badge-count bigbear-count-${type}
${props.children?'':'nochildren'} ${visible?'':'badge-hide'} ${dot?'badge-dot':''}`}>
<span>{count}</span></div>:null}
{props.children?props.children:null}
</div>
)
}
Badge.defaultProps={
type:'danger',
visible:true,
dot:false,
count:''
}

export default Badge;
3 changes: 3 additions & 0 deletions src/components/Badge/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import Badge from "./badge";

export default Badge;
6 changes: 5 additions & 1 deletion src/components/Icon/icon.stories.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,11 @@ https://fontawesome.com/icons?d=gallery&s=solid&m=free

<Preview>
<Story name='base' >
<Icon icon='search' ></Icon>
<div>
<Icon icon='search' ></Icon>
<Icon icon='spinner' spin ></Icon>
<Icon icon='cog' pulse ></Icon>
</div>
</Story>
</Preview>

Expand Down
19 changes: 15 additions & 4 deletions src/components/Message/message.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,25 @@ function directionSelect(directions:DirectionType){
}
}

function createContainer(){
let container=document.createElement('div')
container.className='bigbear-message-factory'
container=document.body.appendChild(container)
let closeCallback=()=>container.parentElement!.removeChild(container)
return {
container,
closeCallback
}
}



export const Message:FC<MessageProps>=function(props:MessageProps){
let {title,container,directions,autoclosedelay,icon,type,className,closeCallback,...restProps}=props;
if(!container){
container=document.createElement('div')
container.className='bigbear-message-factory'
container=document.body.appendChild(container)
let createObj=createContainer()
container=createObj.container
closeCallback=createObj.closeCallback
}
let select:AlertProps['directions'] = directionSelect(directions as DirectionType)
const animateclass=directions==='top'?'zoom-in-topmesssage':undefined;
Expand All @@ -68,7 +80,6 @@ export const Message:FC<MessageProps>=function(props:MessageProps){

Message.defaultProps={
title:'',
container:document.querySelector('.bigbear-message-factory'),
type:'default',
directions:'top',
autoclosedelay:3000
Expand Down
1 change: 1 addition & 0 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export {default as AutoComplete} from './components/AutoComplete';
export {default as List} from './components/List';
export {default as Avatar} from './components/Avatar';
export {default as VirtualList} from './components/VirtualList';
export {default as Badge} from './components/Badge';



Expand Down
8 changes: 7 additions & 1 deletion src/styles/_variables.scss
Original file line number Diff line number Diff line change
Expand Up @@ -295,4 +295,10 @@ $avatar-padding-default:5px !default;
$avatar-padding-lg:10px !default;
$avatar-padding-sm:2px !default;
$avatar-fontsize-lg:$font-size-base*2 !default;
$avatar-fontsize-sm:$font-size-base*0.5 !default;
$avatar-fontsize-sm:$font-size-base*0.5 !default;


//badge
$badge-padding:2px 6px 2px 6px !default;
$badge-font-size: $font-size-sm !default;
$badge-border-radius:5px !default;
5 changes: 4 additions & 1 deletion src/styles/index.scss
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,7 @@
@import "../components/Avatar/style";

//virtuallist
@import "../components/VirtualList/style";
@import "../components/VirtualList/style";

//badge
@import "../components/Badge/style"

0 comments on commit cd5a84e

Please sign in to comment.