parent
748d5c2568
commit
902f569bac
11 changed files with 386 additions and 22 deletions
@ -0,0 +1,60 @@ |
||||
$color1: #f4f4f4; |
||||
$color2: #3197EE; |
||||
|
||||
.radio { |
||||
margin: 0.5rem; |
||||
input[type="radio"] { |
||||
position: absolute; |
||||
opacity: 0; |
||||
+ .radio-label { |
||||
&:before { |
||||
content: ''; |
||||
background: $color1; |
||||
border-radius: 100%; |
||||
border: 1px solid darken($color1, 25%); |
||||
display: inline-block; |
||||
width: 1.4em; |
||||
height: 1.4em; |
||||
position: relative; |
||||
top: -0.2em; |
||||
margin-right: 1em; |
||||
vertical-align: top; |
||||
cursor: pointer; |
||||
text-align: center; |
||||
transition: all 250ms ease; |
||||
} |
||||
} |
||||
&:checked { |
||||
+ .radio-label { |
||||
&:before { |
||||
background-color: $color2; |
||||
box-shadow: inset 0 0 0 4px $color1; |
||||
} |
||||
} |
||||
} |
||||
&:focus { |
||||
+ .radio-label { |
||||
&:before { |
||||
outline: none; |
||||
border-color: $color2; |
||||
} |
||||
} |
||||
} |
||||
&:disabled { |
||||
+ .radio-label { |
||||
&:before { |
||||
box-shadow: inset 0 0 0 4px $color1; |
||||
border-color: darken($color1, 25%); |
||||
background: darken($color1, 25%); |
||||
} |
||||
} |
||||
} |
||||
+ .radio-label { |
||||
&:empty { |
||||
&:before { |
||||
margin-right: 0; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,12 @@ |
||||
import React from "react"; |
||||
|
||||
export default function Radio(props: any) { |
||||
return ( |
||||
<div className="container"> |
||||
<div className="radio"> |
||||
<input id="radio-1" name="radio" type="radio" /> |
||||
<label htmlFor="radio-1" className="radio-label">{props.label}</label> |
||||
</div> |
||||
</div> |
||||
); |
||||
} |
After Width: | Height: | Size: 258 B |
After Width: | Height: | Size: 857 B |
@ -0,0 +1,118 @@ |
||||
$primary: #06bace; |
||||
$gray: #dbdbdb; |
||||
$danger: #e00a0a; |
||||
$success: #23c933; |
||||
|
||||
.select-search { |
||||
display: flex; |
||||
flex-direction: column; |
||||
position: relative; |
||||
.search { |
||||
display: flex; |
||||
flex-direction: column; |
||||
position: relative; |
||||
img{ |
||||
cursor: pointer; |
||||
} |
||||
&__icon { |
||||
width: 27px; |
||||
position: absolute; |
||||
top: 50%; |
||||
transform: translateY(-50%); |
||||
&Fa { |
||||
left: 10px; |
||||
} |
||||
&En { |
||||
right: 10px; |
||||
} |
||||
} |
||||
|
||||
&__x { |
||||
width: 12px; |
||||
position: absolute; |
||||
top: 50%; |
||||
transform: translateY(-50%); |
||||
opacity: 0; |
||||
&Fa { |
||||
right: 10px; |
||||
} |
||||
&En { |
||||
left: 10px; |
||||
} |
||||
&Active{ |
||||
opacity: 1; |
||||
} |
||||
} |
||||
|
||||
input { |
||||
padding: 15px 30px 15px 30px; |
||||
font-size: 14px; |
||||
border: 1.7px solid $gray; |
||||
border-radius: 5px; |
||||
background-color: inherit; |
||||
&::placeholder { |
||||
color: $gray; |
||||
} |
||||
&:focus { |
||||
border-color: $primary; |
||||
outline: 0px; |
||||
color: #246e8a; |
||||
&::placeholder { |
||||
color: #246e8a; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
&__list{ |
||||
position: relative; |
||||
bottom: -8px; |
||||
left: 0px; |
||||
display: flex; |
||||
flex-direction: column; |
||||
padding: 0px 20px; |
||||
border: 1.7px solid $gray; |
||||
border-radius: 5px; |
||||
ul{ |
||||
list-style: none; |
||||
padding: 0px; |
||||
width : 100%; |
||||
hr{ |
||||
border: 1px solid $gray; |
||||
opacity: 0.3 !important; |
||||
} |
||||
li{ |
||||
width: 100%; |
||||
padding: 5px 0px; |
||||
color: $gray; |
||||
display: flex; |
||||
align-items: flex-start; |
||||
flex-direction: column; |
||||
justify-content: center; |
||||
div{ |
||||
display: flex; |
||||
} |
||||
ul{ |
||||
margin: 0px auto; |
||||
li{ |
||||
display: flex; |
||||
flex-direction: row; |
||||
flex: 1; |
||||
padding: 5px 20px 0px; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
} |
||||
|
||||
.en { |
||||
direction: ltr; |
||||
text-align: left; |
||||
} |
||||
|
||||
.fa { |
||||
direction: rtl; |
||||
text-align: right; |
||||
} |
@ -0,0 +1,146 @@ |
||||
import React, { useState } from "react"; |
||||
import _ from "lodash"; |
||||
import Radio from "../Radio"; |
||||
|
||||
import xIcon from "./x.png"; |
||||
import arrowIcon from "./arrow.png"; |
||||
|
||||
interface Types { |
||||
lang?: string; |
||||
theme?: string; |
||||
list?: Array<object>; |
||||
label?: string; |
||||
} |
||||
|
||||
interface Value { |
||||
icon: any; |
||||
name: string; |
||||
} |
||||
|
||||
// const inputStatusHandler = (
|
||||
// value: string,
|
||||
// focus: boolean,
|
||||
// status: boolean,
|
||||
// primary: string,
|
||||
// success: string,
|
||||
// danger: string
|
||||
// ) => {
|
||||
// if (!focus) {
|
||||
// return "";
|
||||
// } else {
|
||||
// if (!value) {
|
||||
// return primary;
|
||||
// } else {
|
||||
// if (status) {
|
||||
// return success;
|
||||
// } else {
|
||||
// return danger;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// };
|
||||
|
||||
const langDetector = (lang: string, option1: any, option2: any) => { |
||||
return lang === "fa" ? option1 : option2; |
||||
}; |
||||
|
||||
export default function SelectRadio(props: Types) { |
||||
const [selectedItem, setSelectedItem] = useState(""); |
||||
const [value, setValue] = useState<string>(""); |
||||
|
||||
const [toggle, setToggle] = useState(false); |
||||
const { lang, theme, list, label } = props; |
||||
|
||||
const onChangeItem = (val: string) => { |
||||
setSelectedItem(val); |
||||
}; |
||||
|
||||
const onChangeText = (val: string) => { |
||||
setValue(val); |
||||
}; |
||||
|
||||
return ( |
||||
<div |
||||
className={_.join( |
||||
["select-search", langDetector(lang as string, "fa", "en")], |
||||
" " |
||||
)} |
||||
> |
||||
<div |
||||
className={_.join( |
||||
["search", langDetector(lang as string, "fa", "en")], |
||||
" " |
||||
)} |
||||
onClick={() => setToggle(() => !toggle)} |
||||
> |
||||
<input |
||||
type="search" |
||||
className="transition" |
||||
onChange={(e: any) => onChangeText(e.target.value)} |
||||
placeholder={langDetector(lang as string, "تنظیمات", "setting")} |
||||
disabled |
||||
/> |
||||
<img |
||||
src={arrowIcon} |
||||
alt={langDetector(lang as string, "جستجو", "search")} |
||||
className={_.join( |
||||
[ |
||||
"search__icon", |
||||
langDetector(lang as string, "search__iconFa", "search__iconEn"), |
||||
], |
||||
" " |
||||
)} |
||||
/> |
||||
<img |
||||
src={xIcon} |
||||
alt={langDetector(lang as string, "پاک کردن", "clear")} |
||||
className={_.join( |
||||
[ |
||||
"search__x", |
||||
"transition", |
||||
langDetector(lang as string, "search__xFa", "search__xEn"), |
||||
value ? "search__xActive" : "", |
||||
], |
||||
" " |
||||
)} |
||||
onClick={() => setValue("")} |
||||
/> |
||||
</div> |
||||
{toggle && ( |
||||
<div |
||||
className={_.join( |
||||
[ |
||||
"select-search__list", |
||||
toggle ? "select-search__listActive" : "", |
||||
"transition", |
||||
], |
||||
" " |
||||
)} |
||||
> |
||||
<ul> |
||||
{list?.map((item: any, i: any) => ( |
||||
<> |
||||
<li key={i} className="transition"> |
||||
<Radio checked={false} label={item?.name} /> |
||||
</li> |
||||
{i !== list?.length - 1 && <hr />} |
||||
</> |
||||
))} |
||||
</ul> |
||||
</div> |
||||
)} |
||||
</div> |
||||
); |
||||
} |
||||
|
||||
SelectRadio.defaultProps = { |
||||
lang: "fa", |
||||
theme: "light", |
||||
label: "کشور خود را انتخاب کنید", |
||||
list: [ |
||||
{ name: "وسایل آشپزخانه", sublist: [{ name: "اتو" }] }, |
||||
{ name: "غریق نجات از تمام جهات" }, |
||||
{ name: "قاشق و چنگال" }, |
||||
{ name: "وسایل آشپزخانه" }, |
||||
], |
||||
}; |
After Width: | Height: | Size: 346 B |
Loading…
Reference in new issue