import React from 'react' ;
import styles from './index.module.less' ; type OptionsType = { labels? : any[ ] ; label? : string | React. ReactNode; value : any;
} ;
interface IProps { value? : any; onChange? : Function; options : OptionsType[ ] ; layout? : 'horizontal' | 'vertical' ; disabled? : boolean;
} export default function Index ( props : IProps) { const { value, onChange = ( ) => { } , options, layout = 'horizontal' , disabled = false } = props; const clickHandler = ( row ) => { if ( disabled) return ; if ( value === row. value) { onChange ( undefined ) ; } else { onChange ( row. value) ; } } ; return ( < div className= { ` ${ styles. container} ${ styles[ layout] } ` } > { options?. map ( ( item, index ) => { const activeStyles = item. value === value ? styles[ 'select-card-checked' ] : styles[ 'select-card' ] ; const disabledStyles = disabled ? styles[ 'select-card-disabled' ] : '' ; return ( < div key= { index} className= { ` ${ activeStyles} ${ disabledStyles} ` . trim ( ) } onClick= { ( ) => clickHandler ( item) } > < div className= { styles. corner} > < / div> < div className= { styles. content} > { item?. label? item?. label: item?. labels?. map ( ( v, idx ) => { return ( < React. Fragment key= { idx} > { idx === 0 && v ? ( < div className= { styles. title} > { v} < / div> ) : ( < div className= { styles. text} > { v} < / div> ) } < / React. Fragment> ) ; } ) } < / div> < / div> ) ; } ) } < / div> ) ;
}
@primaric-color : #5050e6;
@primary-color-opacity : #5050e680; .container { .select-card { position : relative; width : 300px; padding : 14px; border-radius : 5px; box-shadow : 0 2px 5px rgba ( 0, 0, 0, 0.1) ; border : 1px solid #f9f9f9; background-color : #fff; cursor : pointer; margin : 0 14px 14px 0; .corner { position : absolute; top : 2px; right : 2px; width : 0; height : 0; border-top : 12px solid #5050e6; border-left : 12px solid transparent; border-radius : 0 3px 0 0; opacity : 0; } .content { .title { margin : 0; font-size : 15px; font-weight : bold; color : #333; margin-bottom : 10px; } .title:nth-last-of-type(1) { margin-bottom : 0; } .text { margin-bottom : 10px; font-size : 14px; color : #666; } .text:nth-last-of-type(1) { margin-bottom : 0; } } } .select-card:hover { border-color : @primary-color-opacity ; box-shadow : 0 0 3px 0 @primaric-color ; } .select-card:nth-last-of-type(1) { margin : 0; } .select-card-checked { position : relative; width : 300px; padding : 14px; border-radius : 5px; box-shadow : 0 2px 5px rgba ( 0, 0, 0, 0.1) ; border : 1px solid @primary-color-opacity ; background-color : #f0f2ff; cursor : pointer; margin : 0 14px 14px 0; box-shadow : 0 0 3px 0 @primaric-color ; .corner { position : absolute; top : 2px; right : 2px; width : 0; height : 0; border-top : 12px solid @primaric-color ; border-left : 12px solid transparent; border-radius : 0 3px 0 0; opacity : 1; } .content { .title { margin : 0; font-size : 15px; font-weight : bold; margin-bottom : 10px; } .title:nth-last-of-type(1) { margin-bottom : 0; } .text { margin-bottom : 10px; font-size : 14px; color : #666; } .text:nth-last-of-type(1) { margin-bottom : 0; } } } .select-card-checked:nth-last-of-type(1) { margin : 0; } .select-card-disabled { background-color : #e0e0e0; border-color : #a0a0a0; color : #666; box-shadow : none; cursor : not-allowed; .corner { border-top-color : #a0a0a0; } }
} .horizontal {
} .vertical { display : flex; flex-wrap : wrap;
}