@@ -1,6 +1,6 @@ | |||
<svg xmlns="http://www.w3.org/2000/svg" width="23" height="17.062" viewBox="0 0 23 17.062"> | |||
<g id="text" transform="translate(-0.701 -5.168)"> | |||
<path id="Path_39" data-name="Path 39" d="M13.912,20.794,8.3,5.836a1.028,1.028,0,0,0-1.926,0L.767,20.794a1.028,1.028,0,1,0,1.926.722l1.69-4.507a.094.094,0,0,1,.087-.06h5.737a.094.094,0,0,1,.087.06l1.69,4.507a1.028,1.028,0,1,0,1.926-.722Zm-8.687-6.03L7.252,9.358a.094.094,0,0,1,.175,0l2.027,5.407a.094.094,0,0,1-.087.126H5.312a.094.094,0,0,1-.087-.126Z" fill="#fff"/> | |||
<path id="Path_40" data-name="Path 40" d="M25.757,11.918a4.757,4.757,0,0,0-4.441,2.87,1.028,1.028,0,1,0,1.893.8A2.7,2.7,0,0,1,25.7,13.974a2.737,2.737,0,0,1,2.73,2.751.07.07,0,0,1-.068.07c-1.024.029-2.24.1-3.325.224-2.56.3-4.087,1.7-4.087,3.732a3.669,3.669,0,0,0,1.153,2.743,3.924,3.924,0,0,0,2.68,1,5.975,5.975,0,0,0,3.643-1.086h0a1.028,1.028,0,1,0,2.057.009V16.73a4.8,4.8,0,0,0-4.732-4.813Zm-.971,10.517a1.631,1.631,0,0,1-1.776-1.683,1.272,1.272,0,0,1,.581-1.133,3.772,3.772,0,0,1,1.689-.557c.987-.116,2.095-.18,3.045-.209a.094.094,0,0,1,.094.1C28.292,21.295,27.1,22.435,24.786,22.435Z" transform="translate(-6.788 -2.262)" fill="#fff"/> | |||
<path id="Path_39" data-name="Path 39" d="M13.912,20.794,8.3,5.836a1.028,1.028,0,0,0-1.926,0L.767,20.794a1.028,1.028,0,1,0,1.926.722l1.69-4.507a.094.094,0,0,1,.087-.06h5.737a.094.094,0,0,1,.087.06l1.69,4.507a1.028,1.028,0,1,0,1.926-.722Zm-8.687-6.03L7.252,9.358a.094.094,0,0,1,.175,0l2.027,5.407a.094.094,0,0,1-.087.126H5.312a.094.094,0,0,1-.087-.126Z"/> | |||
<path id="Path_40" data-name="Path 40" d="M25.757,11.918a4.757,4.757,0,0,0-4.441,2.87,1.028,1.028,0,1,0,1.893.8A2.7,2.7,0,0,1,25.7,13.974a2.737,2.737,0,0,1,2.73,2.751.07.07,0,0,1-.068.07c-1.024.029-2.24.1-3.325.224-2.56.3-4.087,1.7-4.087,3.732a3.669,3.669,0,0,0,1.153,2.743,3.924,3.924,0,0,0,2.68,1,5.975,5.975,0,0,0,3.643-1.086h0a1.028,1.028,0,1,0,2.057.009V16.73a4.8,4.8,0,0,0-4.732-4.813Zm-.971,10.517a1.631,1.631,0,0,1-1.776-1.683,1.272,1.272,0,0,1,.581-1.133,3.772,3.772,0,0,1,1.689-.557c.987-.116,2.095-.18,3.045-.209a.094.094,0,0,1,.094.1C28.292,21.295,27.1,22.435,24.786,22.435Z" transform="translate(-6.788 -2.262)"/> | |||
</g> | |||
</svg> |
@@ -0,0 +1,134 @@ | |||
.popupHolder { | |||
position: fixed; | |||
z-index: 2; | |||
left: 0; | |||
top: 0; | |||
background-color: transparent; | |||
width: 100vw; | |||
height: 100vh; | |||
box-shadow: 0px -10rem 20rem 10rem inset var(--creamy-white); | |||
.background { | |||
height: 100%; | |||
width: 100%; | |||
} | |||
} | |||
.popup { | |||
position: absolute; | |||
left: 0; | |||
bottom: 0; | |||
width: 100%; | |||
border-top-right-radius: 3rem; | |||
border-top-left-radius: 3rem; | |||
overflow: hidden; | |||
box-shadow: 0px 0px 20px -3px var(--grey); | |||
header { | |||
background-color: var(--orange); | |||
display: flex; | |||
align-items: center; | |||
justify-content: flex-start; | |||
padding: 2rem 2rem 6rem; | |||
svg { | |||
fill: white; | |||
width: 1rem; | |||
margin-right: 0.5rem; | |||
} | |||
h5 { | |||
font-size: 1.5rem; | |||
font-weight: 500; | |||
color: white; | |||
} | |||
} | |||
.form { | |||
background-color: var(--creamy-white); | |||
border-top-right-radius: 3rem; | |||
border-top-left-radius: 3rem; | |||
overflow: hidden; | |||
margin-top: -4rem; | |||
} | |||
.inputHolder { | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
margin: 2rem; | |||
.icon { | |||
width: 4rem; | |||
height: 4rem; | |||
margin-right: 1rem; | |||
background-color: var(--red); | |||
border: 2px solid var(--red); | |||
border-radius: 50%; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
&.active { | |||
background-color: transparent; | |||
svg { | |||
fill: var(--red); | |||
} | |||
} | |||
svg { | |||
fill: white; | |||
height: 1.8rem; | |||
width: 1.8rem; | |||
} | |||
} | |||
input { | |||
border: none; | |||
height: 4rem; | |||
flex-grow: 1; | |||
display: block; | |||
border-radius: 3rem; | |||
box-shadow: 0px 2px 10px -5px inset var(--light-grey); | |||
padding: 0 1.5rem; | |||
font-size: 1.2rem; | |||
background-color: var(--form-input-bg); | |||
} | |||
} | |||
.iconHolder { | |||
margin: 0 1.5rem; | |||
border: 2px solid var(--red); | |||
border-radius: 1rem; | |||
display: flex; | |||
align-items: center; | |||
justify-content: flex-start; | |||
flex-wrap: wrap; | |||
list-style: none; | |||
padding: 0.1rem; | |||
svg { | |||
fill: var(--grey); | |||
width: 2.5rem; | |||
height: 2.5rem; | |||
margin: 1rem; | |||
cursor: pointer; | |||
} | |||
} | |||
.addButton { | |||
background-color: var(--teal); | |||
color: white; | |||
border-radius: 2rem; | |||
height: 3.5rem; | |||
width: 15rem; | |||
font-size: 1.4rem; | |||
font-weight: 600; | |||
border: none; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
margin: 2rem auto; | |||
} | |||
} |
@@ -0,0 +1,65 @@ | |||
import React, { useState } from "react"; | |||
import styles from './AddCategory.module.scss'; | |||
import { ReactComponent as PlusIcon } from '../../assets/icons/plus.svg'; | |||
import { ReactComponent as BrainIcon } from '../../assets/icons/bx-brain.svg'; | |||
import { ReactComponent as TimeIcon } from '../../assets/icons/time.svg'; | |||
import { ReactComponent as TimerIcon } from '../../assets/icons/timer.svg'; | |||
import { ReactComponent as TextIcon } from '../../assets/icons/text.svg'; | |||
import { ICategory } from "../../structure/category"; | |||
import { userProfileData } from "../home/Home"; | |||
type ownProps = { | |||
hidePopup: () => void | |||
} | |||
const IconSet = [<BrainIcon />, <TimeIcon />, <TimerIcon />, <TextIcon />] | |||
export const AddCategory: React.FC<ownProps> = (props: ownProps) => { | |||
const [newCategory, setnewCategory] = useState<ICategory>({ | |||
name: '', | |||
icon: <BrainIcon />, | |||
shelves: [] | |||
}); | |||
const [showIconSet, setShowIconSet] = useState<Boolean>(false); | |||
return <div className={styles.popupHolder}> | |||
<div className={styles.background} onClick={props.hidePopup}></div> | |||
<section className={styles.popup}> | |||
<header> | |||
<PlusIcon /> | |||
<h5> Add Category </h5> | |||
</header> | |||
<section className={styles.form}> | |||
<div className={styles.inputHolder}> | |||
<div className={styles.icon + ' ' + (showIconSet ? styles.active : '')} onClick={() => setShowIconSet(!showIconSet)}> | |||
{ newCategory.icon } | |||
</div> | |||
<input type="text" placeholder={'Category Name'} onInput={(event) => { | |||
setnewCategory({ | |||
...newCategory, | |||
name: event.currentTarget.value | |||
}); | |||
}} /> | |||
</div> | |||
{ showIconSet && <ul className={styles.iconHolder}> | |||
{ IconSet.map(iconSample => <li onClick={() => { | |||
setnewCategory({ | |||
...newCategory, | |||
icon: iconSample | |||
}); | |||
setShowIconSet(false); | |||
}}> {iconSample} </li>) } | |||
</ul> } | |||
<button className={styles.addButton} onClick={() => { | |||
userProfileData.categories.push(newCategory); | |||
props.hidePopup(); | |||
}}> | |||
Add | |||
</button> | |||
</section> | |||
</section> | |||
</div> | |||
} |
@@ -50,11 +50,11 @@ | |||
padding: 0 1.5rem; | |||
font-size: 1.2rem; | |||
margin-bottom: 1.5rem; | |||
background-color: #efe6d6; | |||
background-color: var(--form-input-bg); | |||
} | |||
textarea { | |||
background-color: #efe6d6; | |||
background-color: var(--form-input-bg); | |||
font-size: 1.2rem; | |||
padding: 1rem 1.5rem; | |||
box-shadow: 0px 2px 10px -5px inset var(--light-grey); | |||
@@ -215,7 +215,7 @@ | |||
} | |||
.toggle { | |||
background-color: #efe6d6; | |||
background-color: var(--form-input-bg); | |||
width: 4rem; | |||
height: 2rem; | |||
border-radius: 3rem; | |||
@@ -145,19 +145,19 @@ $block-padding: 2.5rem 2rem; | |||
justify-content: space-between; | |||
align-items: center; | |||
&:nth-child(1) .icon { | |||
&:nth-child(5n - 4) .icon { | |||
background-color: var(--orange); | |||
} | |||
&:nth-child(2) .icon { | |||
&:nth-child(5n - 3) .icon { | |||
background-color: var(--blue); | |||
} | |||
&:nth-child(3) .icon { | |||
&:nth-child(5n - 2) .icon { | |||
background-color: var(--red); | |||
} | |||
&:nth-child(4) .icon { | |||
&:nth-child(5n - 1) .icon { | |||
background-color: var(--teal); | |||
} | |||
} | |||
@@ -1,4 +1,4 @@ | |||
import React from "react"; | |||
import React, { useState } from "react"; | |||
import styles from './Categories.module.scss'; | |||
import { ReactComponent as LogoIcon } from '../../assets/icons/anamnesis.svg'; | |||
import { ReactComponent as SearchIcon } from '../../assets/icons/bx-search-alt.svg'; | |||
@@ -6,8 +6,24 @@ import { ReactComponent as PlusCircledIcon } from '../../assets/icons/plus-circl | |||
import { userProfileData } from "../home/Home"; | |||
import { NavLink } from "react-router-dom"; | |||
import { ICategory } from "../../structure/category"; | |||
import { AddCategory } from "../add-category/AddCategory"; | |||
export const Categories: React.FC = () => { | |||
const [categoryResult, setCategories] = useState<Array<ICategory>>(userProfileData.categories); | |||
const [isAddCategoryPopupOpen, setAddCategoryPopupState] = useState<Boolean>(false); | |||
const filterCategories = (text: string) => { | |||
if (text.length > 0) { | |||
let result = categoryResult.filter(category => { | |||
return category.name.toLowerCase().includes(text.toLowerCase()); | |||
}); | |||
setCategories(result); | |||
} else { | |||
setCategories(userProfileData.categories); | |||
} | |||
} | |||
return <section className="page"> | |||
<header className={styles.pageHeader}> | |||
<LogoIcon /> | |||
@@ -25,19 +41,18 @@ export const Categories: React.FC = () => { | |||
<section className={styles.searchHolder}> | |||
<div className={styles.searchBar}> | |||
<input type="text" placeholder={'Search Category'} /> | |||
<input type="text" placeholder={'Search Category'} onInput={(event) => filterCategories(event.currentTarget.value)} /> | |||
<SearchIcon /> | |||
</div> | |||
</section> | |||
<button className={styles.addButton}> | |||
<button className={styles.addButton} onClick={() => setAddCategoryPopupState(true)}> | |||
<PlusCircledIcon /> Add Category | |||
</button> | |||
<section className={styles.Grid}> | |||
<ul> | |||
{ userProfileData.categories.map((category, index) => { | |||
{ categoryResult.map((category, index) => { | |||
return <li key={category.name}> | |||
<div className={styles.icon}> | |||
{ category.icon } | |||
@@ -50,5 +65,7 @@ export const Categories: React.FC = () => { | |||
})} | |||
</ul> | |||
</section> | |||
{ isAddCategoryPopupOpen && <AddCategory hidePopup={() => setAddCategoryPopupState(false)} /> } | |||
</section> | |||
} |
@@ -9,6 +9,7 @@ import { ReactComponent as PlusCircledIcon } from '../../assets/icons/plus-circl | |||
import { userProfileData } from "../home/Home"; | |||
import { CircularProgressbar } from "react-circular-progressbar"; | |||
import { NavLink } from "react-router-dom"; | |||
export const CategoryDetails: React.FC = () => { | |||
const location = useLocation(); | |||
@@ -49,9 +50,9 @@ export const CategoryDetails: React.FC = () => { | |||
</div> | |||
</section> | |||
<button className={styles.addButton}> | |||
<PlusCircledIcon /> Add Category | |||
</button> | |||
<NavLink to={'/add-shelf'} className={styles.addButton}> | |||
<PlusCircledIcon /> Add Shelf | |||
</NavLink> | |||
<section className={styles.Shelf}> | |||
<ul> | |||
@@ -1,4 +1,4 @@ | |||
import React from "react"; | |||
import React, { useState } from "react"; | |||
import styles from './Home.module.scss'; | |||
import { ReactComponent as LogoIcon } from '../../assets/icons/anamnesis.svg'; | |||
import { ReactComponent as SearchIcon } from '../../assets/icons/bx-search-alt.svg'; | |||
@@ -18,6 +18,7 @@ import { ReactComponent as InternBadge } from '../../assets/icons/intern-badge.s | |||
import { CircularProgressbar } from 'react-circular-progressbar'; | |||
import { IProfile } from "../../structure/profile"; | |||
import { NavLink } from "react-router-dom"; | |||
import { AddCategory } from "../add-category/AddCategory"; | |||
export var userProfileData : IProfile = { | |||
@@ -61,6 +62,8 @@ export var userProfileData : IProfile = { | |||
}; | |||
export const Home: React.FC = () => { | |||
const [isAddCategoryPopupOpen, setAddCategoryPopupState] = useState<Boolean>(false); | |||
return <section className="page"> | |||
<header className={styles.pageHeader}> | |||
@@ -193,7 +196,7 @@ export const Home: React.FC = () => { | |||
<NavLink to={'/categories'} className={styles.expandButton}> | |||
<ExpandIcon /> | |||
</NavLink> | |||
<button> | |||
<button onClick={() => setAddCategoryPopupState(true)}> | |||
<PlusIcon /> | |||
</button> | |||
</header> | |||
@@ -211,5 +214,7 @@ export const Home: React.FC = () => { | |||
})} | |||
</ul> | |||
</section> | |||
{ isAddCategoryPopupOpen && <AddCategory hidePopup={() => setAddCategoryPopupState(false)} /> } | |||
</section> | |||
} |
@@ -25,6 +25,7 @@ h1, h2, h3, h4, h5, h6 { | |||
--light-grey: #84919e; | |||
--lighter-grey: #d5e0ec; | |||
--creamy-white: #fef8ec; | |||
--form-input-bg: #efe6d6; | |||
font-size: 62.5%; | |||
} | |||