diff --git a/src/s2-homeworks/hw05/pages/Junior.tsx b/src/s2-homeworks/hw05/pages/Junior.tsx index 3b84e34..0e5ef16 100644 --- a/src/s2-homeworks/hw05/pages/Junior.tsx +++ b/src/s2-homeworks/hw05/pages/Junior.tsx @@ -1,12 +1,13 @@ import React from 'react' import HW6 from '../../hw06/HW6' +import HW7 from '../../hw07/HW7' function Junior() { return (
junior page - {/**/} + {/**/} {/**/}
diff --git a/src/s2-homeworks/hw07/HW7.tsx b/src/s2-homeworks/hw07/HW7.tsx new file mode 100644 index 0000000..7098e95 --- /dev/null +++ b/src/s2-homeworks/hw07/HW7.tsx @@ -0,0 +1,46 @@ +import React, {useState} from 'react' +import SuperSelect from './common/c5-SuperSelect/SuperSelect' +import SuperRadio from './common/c6-SuperRadio/SuperRadio' +import s2 from '../../s1-main/App.module.css' + +const arr = [{id: 1, value: 'x'}, {id: 2, value: 'y'}, {id: 3, value: 'z'}] // value может быть изменено + +const HW7 = () => { + const [value, onChangeOption] = useState(1) // селект и радио должны работать синхронно + console.log(value) + + return ( +
+
+ {/*можно убрать этот тег*/} + +
homeworks 7
+ + {/*should work (должно работать)*/} +
+ +
+
+ +
+ +
+ {/*можно убрать этот тег*/} +
+ {/*можно убрать этот тег*/} +
+ ) +} + +export default HW7 diff --git a/src/s2-homeworks/hw07/common/c5-SuperSelect/SuperSelect.module.css b/src/s2-homeworks/hw07/common/c5-SuperSelect/SuperSelect.module.css new file mode 100644 index 0000000..0ab2ad1 --- /dev/null +++ b/src/s2-homeworks/hw07/common/c5-SuperSelect/SuperSelect.module.css @@ -0,0 +1,38 @@ +.select { + width: 100px; + padding: 5px; + padding-right: 30px; + + cursor: pointer; + appearance: none; + background-color: #003300; /*---------------------------------------------------------------------------------------------------------------------------------------------------fill---------99ff99*/ + background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%2399FF99%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'); + background-repeat: no-repeat, repeat; + background-position: right .7em top 50%, 0 0; + background-size: .65em auto, 100%; + + border: 2px inset rgb(118, 118, 118); + color: #99ff99; +} + +.select:focus { + outline: none; + border: #99ff99 solid 2px; +} + +.option { + /*padding: 30px;*/ + color: #003300; + background: #99ff99; +} + +.option:checked { + background: #003300; + color: #99ff99; +} + +.option:hover{ + box-shadow: 0 0 10px 100px #FED20F inset; + transition: all .2s ease-in-out; + background: red; +} \ No newline at end of file diff --git a/src/s2-homeworks/hw07/common/c5-SuperSelect/SuperSelect.tsx b/src/s2-homeworks/hw07/common/c5-SuperSelect/SuperSelect.tsx new file mode 100644 index 0000000..d0d3c74 --- /dev/null +++ b/src/s2-homeworks/hw07/common/c5-SuperSelect/SuperSelect.tsx @@ -0,0 +1,40 @@ +import React, {SelectHTMLAttributes, DetailedHTMLProps, ChangeEvent} from 'react' +import s from './SuperSelect.module.css' + +type DefaultSelectPropsType = DetailedHTMLProps, HTMLSelectElement> + +type SuperSelectPropsType = DefaultSelectPropsType & { + options?: any[] + onChangeOption?: (option: any) => void +} + +const SuperSelect: React.FC = ( + { + options, className, + onChange, onChangeOption, + ...restProps + } +) => { + const mappedOptions: any[] = options ? options.map(o => ( + + )) : [] // map options with key + + const onChangeCallback = (e: ChangeEvent) => { // делают студенты + onChange?.(e) + onChangeOption?.(e.currentTarget.value) + } + + const finalSelectClassName = s.select + ( + className + ? ' ' + className + : '' + ) + + return ( + + ) +} + +export default SuperSelect diff --git a/src/s2-homeworks/hw07/common/c6-SuperRadio/SuperRadio.module.css b/src/s2-homeworks/hw07/common/c6-SuperRadio/SuperRadio.module.css new file mode 100644 index 0000000..ea55428 --- /dev/null +++ b/src/s2-homeworks/hw07/common/c6-SuperRadio/SuperRadio.module.css @@ -0,0 +1,26 @@ +.radio { + appearance: none; + height: 10px; + width: 10px; + + cursor: pointer; + border-radius: 50%; + outline: none; + background: #335533; +} + +.radio:hover { + border: 2px solid #cc99ff; +} + +.radio:checked { + background: #55ffff; +} + +.radio:focus { + border: 2px solid #cc99ff; +} + +.label { + cursor: pointer; +} \ No newline at end of file diff --git a/src/s2-homeworks/hw07/common/c6-SuperRadio/SuperRadio.tsx b/src/s2-homeworks/hw07/common/c6-SuperRadio/SuperRadio.tsx new file mode 100644 index 0000000..3d1c3b8 --- /dev/null +++ b/src/s2-homeworks/hw07/common/c6-SuperRadio/SuperRadio.tsx @@ -0,0 +1,65 @@ +import React, {ChangeEvent, InputHTMLAttributes, DetailedHTMLProps, HTMLAttributes} from 'react' +import s from './SuperRadio.module.css' + +type DefaultRadioPropsType = DetailedHTMLProps, HTMLInputElement> +// тип пропсов обычного спана +type DefaultSpanPropsType = DetailedHTMLProps, HTMLSpanElement> + +type SuperRadioPropsType = Omit & { + options?: any[] + onChangeOption?: (option: any) => void + + spanProps?: DefaultSpanPropsType // пропсы для спана +} + +const SuperRadio: React.FC = ( + { + id, + name, className, + options, value, + onChange, onChangeOption, + spanProps, + ...restProps + } +) => { + const onChangeCallback = (e: ChangeEvent) => { + onChange?.(e) + onChangeOption?.(+e.currentTarget.value) + } + + const finalRadioClassName = `${s.radio} ${className ? className : ''}` + const spanClassName = `${s.span} ${spanProps?.className ? spanProps.className : ''}` + + const mappedOptions: any[] = options ? options.map(o => ( + + )) : [] + + return ( + <> + {mappedOptions} + + ) +} + +export default SuperRadio