diff --git a/src/1/index.tsx b/src/1/index.tsx new file mode 100644 index 0000000..03680a2 --- /dev/null +++ b/src/1/index.tsx @@ -0,0 +1,42 @@ +import { FunctionComponent, useState } from "react"; + +function ListItemComponent(props: any) { + return
  • {props.itemNumber}
  • ; +} + +function ListComponent(props: any) { + return
    + +
    +} + +const Task1: FunctionComponent = () => { + const [items, setItems] = useState([ + "Item 1", + "Item 2", + "Item 3", + "Item 4", + "Item 5", + ]); + + return
    + #List goes here# + + #Iterating over list + + + #Iterating over list but using a unique component for the items + + + #Containing the entire list inside a component + +
    ; +}; + +export default Task1; diff --git a/src/2/index.tsx b/src/2/index.tsx new file mode 100644 index 0000000..4c9a540 --- /dev/null +++ b/src/2/index.tsx @@ -0,0 +1,25 @@ +import { FunctionComponent, useState } from "react"; + +function LiveInputComponent(props: any) { + return props.setValue(e.target.value)} /> +} + +function ValueDisplayer(props: any) { + return

    {props.value}

    +} + +const Task2: FunctionComponent = () => { + const [value, setValue] = useState(""); + return ( +
    + + +
    +
    +

    #Show Input value here#

    + +
    + ); +}; + +export default Task2; diff --git a/src/3/index.tsx b/src/3/index.tsx new file mode 100644 index 0000000..e312bc1 --- /dev/null +++ b/src/3/index.tsx @@ -0,0 +1,48 @@ +import { FunctionComponent, useState } from "react"; + +function LiveInputComponent(props: any) { + return props.setValue(e.target.value)} /> +} + +function ListItemComponent(props: any) { + return
  • {props.itemNumber}
  • ; +} + +function ListComponent(props: any) { + return +} + +const filterDown = (filter: string) => (word: string) => String(word).includes(filter); +const filterItems = (items: any, filter: any) => items.filter(filterDown(filter)); +const mapItems = (filteredItems: any) => filteredItems.map((item: string) => ); + + +const Task3: FunctionComponent = () => { + const [inputValue, setInputValue] = useState(""); + const [items, setItems] = useState([ + "atem", + "btem", + "bbtem", + "dbtem", + "etem", + "ftm", + "gtem", + "hm", + "tm", + "item", + ]); + + return ( +
    + + +
    +
    + +
    + ); +}; + +export default Task3; diff --git a/src/4/index.scss b/src/4/index.scss new file mode 100644 index 0000000..9a4742c --- /dev/null +++ b/src/4/index.scss @@ -0,0 +1,181 @@ +/* DO NOT CHANGE THIS ROOT CLASS NAME*/ +#task-5 { + /* Styles goes here */ + padding: 10px 10px; + background: #efefef; +} + +#form { + display: flex; + flex-direction: column; + align-items: center; +} + +#section { + width: 300px; + display: flex; + flex-direction: column; +} + +#button-section { + display: flex; + flex-direction: column; + align-items: end; +} + +#section { + +} + +#input { + + border: none; + outline:none; + background: none; + font-size: 18px; + color: #555; + padding:5px 10px 5px 5px; + border-radius: .5rem; + transition: .2s ease-in-out; + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + &:hover { + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + } + + &:hover { + background: #ffe5a5; + box-shadow: inset 2px 2px 2px #755f3799, + inset -2px -2px 2px #ffefd3b8; + } + &:active { + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + } + &:focus { + background: #e5f9c4; + border: solid 2px black; + box-shadow: inset 2px 2px 2px #60753fb3, inset -2px -2px 2px #eaf6d7ba; + } + margin-bottom: 20px; +} + +#email-label { + color: #444; + font-size: 1rem; + font-weight: 700; + padding-bottom: 5px; +} + +#password-label { + color: #444; + font-size: 1rem; + font-weight: 700; + padding-bottom: 5px; +} + +#button { + padding: 10px 20px; + background: #efefef; + border: none; + border-radius: .5rem; + color: #444; + font-size: 1rem; + font-weight: 700; + letter-spacing: .2rem; + text-align: center; + outline: none; + cursor: pointer; + transition: .2s ease-in-out; + box-shadow: 2px 2px 2px #cbced1, + -2px -2px 2px #ffffff; + &:hover { + background: #ffe5a5; + box-shadow: 2px 2px 2px #755f3799, -2px -2px 2px #ffefd3b8; + } + &:active { + background: #efefef; + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + } + &:focus { + background: #e5f9c4; + border: solid 2px black; + box-shadow: 2px 2px 2px #60753fb3, -2px -2px 2px rgb(253 255 250); + } +} + + +#input { + + border: none; + outline:none; + background: none; + font-size: 18px; + color: #555; + padding:5px 10px 5px 5px; + border-radius: .5rem; + transition: .2s ease-in-out; + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + &:hover { + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + } + + &:hover { + background: #ffe5a5; + box-shadow: inset 2px 2px 2px #755f3799, + inset -2px -2px 2px #ffefd3b8; + } + &:active { + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + } + &:focus { + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + } + margin-bottom: 20px; +} + +#email-label { + color: #444; + font-size: 1rem; + font-weight: 700; + padding-bottom: 5px; +} + +#password-label { + color: #444; + font-size: 1rem; + font-weight: 700; + padding-bottom: 5px; +} + +#button { + padding: 10px 20px; + background: #efefef; + border: none; + border-radius: .5rem; + color: #444; + font-size: 1rem; + font-weight: 700; + letter-spacing: .2rem; + text-align: center; + outline: none; + cursor: pointer; + transition: .2s ease-in-out; + box-shadow: 2px 2px 2px #cbced1, + -2px -2px 2px #ffffff; + &:hover { + background: #ffe5a5; + box-shadow: 2px 2px 2px #755f3799, -2px -2px 2px #ffefd3b8; + } + &:active { + background: #efefef; + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + } +} diff --git a/src/4/index.tsx b/src/4/index.tsx new file mode 100644 index 0000000..fa72647 --- /dev/null +++ b/src/4/index.tsx @@ -0,0 +1,46 @@ +// Style +import { FunctionComponent, useState } from "react"; +import "./index.scss"; + +const Task4: FunctionComponent = () => { + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + + const onSubmit = () => { + // If you want to do something with form submit + + alert(`Email: ${email} \nPassword: ${password}`); + }; + + return ( +
    +
    +
    + + setEmail(event.currentTarget.value)} + placeholder="my@email.com" + value={email} + /> +
    +
    + + setPassword(event.currentTarget.value)} + placeholder="myPassword123" + value={password} + /> +
    + +
    +
    +
    +
    + ); +}; + +export default Task4; diff --git a/src/4/simple_css.scss b/src/4/simple_css.scss new file mode 100644 index 0000000..45532f1 --- /dev/null +++ b/src/4/simple_css.scss @@ -0,0 +1,7 @@ +/* DO NOT CHANGE THIS ROOT CLASS NAME*/ +#task-5 { + /* Styles goes here */ + padding: 10px 10px; + background: #efefef; +} + diff --git a/src/5/components/Input.tsx b/src/5/components/Input.tsx new file mode 100644 index 0000000..03c40be --- /dev/null +++ b/src/5/components/Input.tsx @@ -0,0 +1,11 @@ +import { FunctionComponent } from "react"; + +interface InputProps { + setValue(item: string): any; +} + +const Input: FunctionComponent = (props) => { + return props.setValue(e.target.value)} /> +}; + +export default Input; diff --git a/src/5/components/Item.tsx b/src/5/components/Item.tsx new file mode 100644 index 0000000..2920014 --- /dev/null +++ b/src/5/components/Item.tsx @@ -0,0 +1,11 @@ +import { FunctionComponent } from "react"; + +interface ItemProps { + itemName: string; +} + +const Item: FunctionComponent = (props) => { + return
  • {props.itemName}
  • ; +}; + +export default Item; diff --git a/src/5/components/List.tsx b/src/5/components/List.tsx new file mode 100644 index 0000000..c784a24 --- /dev/null +++ b/src/5/components/List.tsx @@ -0,0 +1,22 @@ +import { FunctionComponent } from "react"; + +// Components +import Item from "./Item"; + +interface ListProps { + items: string[]; + filter: string; +} + +const filterDown = (filter: string) => (word: string) => String(word).includes(filter); +const filterItems = (items: any, filter: any) => items.filter(filterDown(filter)); +const mapItems = (filteredItems: any) => filteredItems.map((item: string) => ); + + +const List: FunctionComponent = (props) => { + return
      + {mapItems(filterItems(props.items, props.filter))} +
    +}; + +export default List; diff --git a/src/5/index.tsx b/src/5/index.tsx new file mode 100644 index 0000000..bbf08b1 --- /dev/null +++ b/src/5/index.tsx @@ -0,0 +1,31 @@ +import { FunctionComponent, useState } from "react"; + +// Components +import Input from "./components/Input"; +import List from "./components/List"; + +const Task5: FunctionComponent = () => { + const [inputValue, setInputValue] = useState(""); + const [items, setItems] = useState([ + "atem", + "btem", + "bbtem", + "dbtem", + "etem", + "ftm", + "gtem", + "hm", + "tm", + "item", + ]); + + return ( +
    + +
    + +
    + ); +}; + +export default Task5; diff --git a/src/6/components/AddItemButton.tsx b/src/6/components/AddItemButton.tsx new file mode 100644 index 0000000..9913db2 --- /dev/null +++ b/src/6/components/AddItemButton.tsx @@ -0,0 +1,23 @@ +import { FunctionComponent } from "react"; + +interface AddButtonProps { + items: any[]; + nextKey: number; + setNextKey: any; + setItems(items: any[]): any; + newValue: string; +} + +function addItem(items: any, nextKey: number, setNextKey: any, setItems: any, newValue: string){ + const newList = items.concat({key: nextKey, done: false, value: newValue}); + setNextKey(nextKey + 1); + setItems(newList); + } + +const AddItemButton: FunctionComponent = (props) => { + return
    + +
    +}; + +export default AddItemButton; diff --git a/src/6/components/AddItemInput.tsx b/src/6/components/AddItemInput.tsx new file mode 100644 index 0000000..dddf135 --- /dev/null +++ b/src/6/components/AddItemInput.tsx @@ -0,0 +1,13 @@ +import { FunctionComponent } from "react"; + +interface InputProps { + setValue(item: string): any; +} + +const Input: FunctionComponent = (props) => { + return
    + props.setValue(e.target.value)} /> +
    +}; + +export default Input; diff --git a/src/6/components/Input.tsx b/src/6/components/Input.tsx new file mode 100644 index 0000000..da59674 --- /dev/null +++ b/src/6/components/Input.tsx @@ -0,0 +1,11 @@ +import { FunctionComponent } from "react"; + +interface InputProps { + setValue(item: string): any; +} + +const Input: FunctionComponent = (props) => { + return props.setValue(e.target.value)} /> +}; + +export default Input; diff --git a/src/6/components/Item.tsx b/src/6/components/Item.tsx new file mode 100644 index 0000000..d98f877 --- /dev/null +++ b/src/6/components/Item.tsx @@ -0,0 +1,28 @@ +import { FunctionComponent } from "react"; + +interface ItemProps { + item: any; + items: any[]; + setItems: any; +} + +function toggleDone (items: any, setItems: any, key: number) { + setItems((items: any) => items.map( (item: any, i: number) => { + const doneStatus = item.key === key ? !item.done : item.done + return {key: item.key ,done: doneStatus, value: item.value} + })); +} + +const Item: FunctionComponent = (props) => { + return
    +
    + {props.item.done ? "" : props.item.value} +
    + +
    + {props.item.done ? props.item.value : ""} +
    +
    +}; + +export default Item; diff --git a/src/6/components/List.tsx b/src/6/components/List.tsx new file mode 100644 index 0000000..f772fde --- /dev/null +++ b/src/6/components/List.tsx @@ -0,0 +1,33 @@ +import { FunctionComponent } from "react"; + +// Components +import Item from "./Item"; + +interface ListProps { + items: any[]; + filter: string; + setItems: any; +} + +function removeById(oldItems: any, setItems: any, key: number) { + setItems ((oldItems: any) => { return oldItems.filter((item: any) => item.key !== key) }) +} + +const filterDown = (filter: string) => (word: any) => String(word.value).includes(filter); +const filterItems = (items: any, filter: any) => items.filter(filterDown(filter)); +const mapItems = (filteredItems: any, setItems: any) => filteredItems.map((item: any, index: number) => { +let listId = index % 2 == 0 ? "list-element" : "list-element-uneven"; +return
  • + + +
  • +}); + + +const List: FunctionComponent = (props) => { + return
      + {mapItems(filterItems(props.items, props.filter), props.setItems)} +
    +}; + +export default List; diff --git a/src/6/index.scss b/src/6/index.scss new file mode 100644 index 0000000..9bf9100 --- /dev/null +++ b/src/6/index.scss @@ -0,0 +1,143 @@ +/* DO NOT CHANGE THIS ROOT CLASS NAME*/ +#task-6 { + background: #efefef; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; +} + +#empty { + width: 90px; +} + +#input-section { + display: flex; + flex-direction: column; +} + +#warning { + margin-left: 20px; + margin-right: 20px; + background: yellow; + text-align: center; + margin-bottom: -10px; +} + +#list { + display:flex; + flex-direction: column; + padding: 0px; +} + +#top-section { + display:flex; + flex-direction: row; +} + +h3 { + text-align: center; + width: 300px; +} + +#app { + display: flex; + flex-direction: column; +} + +#list-element { + height: 40px; + display:flex; + flex-direction: row; + align-content: center; +} + +#list-element-uneven { + height: 40px; + background: #e1e1e1; + display:flex; + flex-direction: row; + align-content: center; +} + +#item-text { + width: 300px; + text-align: center; +} + +#list-content { + display:flex; + flex-direction: row; + align-items:center; + justify-content: center; +} + +#button { + width: 80px; + padding: 5px 10px; + margin: 5px; + background: #efefef; + border: none; + color: #444; + font-size: 0.7rem; + font-weight: 700; + letter-spacing: .2rem; + text-align: center; + outline: none; + cursor: pointer; + transition: .2s ease-in-out; + box-shadow: 2px 2px 2px #cbced1, + -2px -2px 2px #ffffff; + &:hover { + background: #ffe5a5; + box-shadow: 2px 2px 2px #755f3799, -2px -2px 2px #ffefd3b8; + } + &:active { + background: #efefef; + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + } +} + + +#input { + margin: 20px; + + border: none; + outline:none; + background: none; + font-size: 18px; + color: #555; + padding:5px 10px 5px 5px; + border-radius: .5rem; + transition: .2s ease-in-out; + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + &:hover { + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + } + + &:hover { + background: #ffe5a5; + box-shadow: inset 2px 2px 2px #755f3799, + inset -2px -2px 2px #ffefd3b8; + } + &:active { + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + } + &:focus { + box-shadow: inset 2px 2px 2px #cbced1, + inset -2px -2px 2px #ffffff; + } + margin-bottom: 20px; +} + + +#add-button { + display: flex; + flex-direction: column; + align-items: end; + margin-right:15px; +} diff --git a/src/6/index.tsx b/src/6/index.tsx new file mode 100644 index 0000000..15b3f66 --- /dev/null +++ b/src/6/index.tsx @@ -0,0 +1,77 @@ +import { FunctionComponent, useState } from "react"; + +import Input from "./components/Input"; +import AddItemInput from "./components/AddItemInput"; +import List from "./components/List"; +import AddItemButton from "./components/AddItemButton"; + +import "./index.scss"; + +const Empty: FunctionComponent = (props) => { + return
    +}; + +const initialItems = [{ + key: 0, + done: false, + value: "Get kids", +}, +{ + key: 1, + done: false, + value: "Do Uniwise assignments", +}, +{ + key: 2, + done: false, + value: "Get rich", +}, +{ + key: 3, + done: false, + value: "Die trying", +}, +{ + key: 4, + done: false, + value: "Vacuum", +}, +{ + key: 5, + done: false, + value: "Clean dishes", +},] + +const NameBar: FunctionComponent = (props) => { + return
    + +

    + Pending +

    + +

    + Done +

    +
    +}; + +const Task6: React.FunctionComponent = () => { + const [filterValue, setFilterValue] = useState(""); + const [newValue, setNewValue] = useState(""); + const [items, setItems] = useState(initialItems); + const [nextKey, setNextKey] = useState(6); + + return
    +
    + + + + +
    + +
    +
    +
    ; +}; + +export default Task6; diff --git a/src/6/simple_css.scss b/src/6/simple_css.scss new file mode 100644 index 0000000..2ba8ab6 --- /dev/null +++ b/src/6/simple_css.scss @@ -0,0 +1,117 @@ +/* DO NOT CHANGE THIS ROOT CLASS NAME*/ +#task-6 { + background: #efefef; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; +} + +#empty { + width: 90px; +} + +#input-section { + display: flex; + flex-direction: column; +} + +#warning { + margin-left: 20px; + margin-right: 20px; + background: yellow; + text-align: center; + margin-bottom: -10px; +} + +#list { + display:flex; + flex-direction: column; + padding: 0px; +} + +#top-section { + display:flex; + flex-direction: row; +} + +h3 { + text-align: center; + width: 300px; +} + +#app { + display: flex; + flex-direction: column; +} + +#list-element { + height: 40px; + display:flex; + flex-direction: row; + align-content: center; +} + +#list-element-uneven { + height: 40px; + background: #e1e1e1; + display:flex; + flex-direction: row; + align-content: center; +} + +#item-text { + width: 300px; + text-align: center; +} + +#list-content { + display:flex; + flex-direction: row; + align-items:center; + justify-content: center; +} + +#button { + width: 80px; + padding: 5px 10px; + margin: 5px; + background: #efefef; + color: #444; + text-align: center; + transition: .2s ease-in-out; + &:hover { + background: #ffe5a5; + } + &:active { + background: #efefef; + } + &:focus { + background: #e5f9c4; + border: solid 2px black; + } +} + + +#input { + margin: 20px; + color: #555; + padding:5px 10px 5px 5px; + transition: .2s ease-in-out; + + &:hover { + background: #ffe5a5; + } + &:focus { + background: #e5f9c4; + } + margin-bottom: 20px; +} + + +#add-button { + display: flex; + flex-direction: column; + align-items: end; + margin-right:15px; +} diff --git a/src/Intro/index.tsx b/src/Intro/index.tsx new file mode 100644 index 0000000..c882f3f --- /dev/null +++ b/src/Intro/index.tsx @@ -0,0 +1,61 @@ +/* + You don't need to change anything in here. +*/ + +import { FunctionComponent } from "react"; + +const Intro: FunctionComponent = () => { + return ( +
    +

    Welcome

    +

    + If you are reading this, you are most likely starting an application + process at Uniwise. In this assignment you will have the opportunity to + show your skills as well as challenge your competencies. +

    +

    Intro

    +

    + Before you get started with the task read the following information. +

    +

    Course of action

    +

    + The task consists of small simple tasks that increase in complexity and + difficulty as you solve them. It is allowed to use code from third party + libraries and npm packages. If you find that a given task is too + difficult or too easy, feel free to skip to the next task. Also feel + free to leave comments with relevant info and to elaborate as much as + you like on a given task. The goal is for you to both show your current + skills and to show your capabilities in solving problems that are new to + you. +

    +

    Technologies

    +

    + This test is based on ReactJS with Typescript. It would be advantageous + if you have or gain knowledge of those before the test. Also SCSS is + used for styling. +

    + +

    Get started

    +

    + When you are ready to start you can select a task in the top of the + screen. The associated code wil be found in the corresponding folder + inside the src folder. +

    +
    + ); +}; + +export default Intro; diff --git a/src/index.scss b/src/index.scss new file mode 100644 index 0000000..db368b9 --- /dev/null +++ b/src/index.scss @@ -0,0 +1,70 @@ +/* + You don't need to change anything in here. +*/ + +html, +body { + margin: 0; + padding: 0; + font-family: "Open Sans", sans-serif; + color: #333; +} + +h1, +h2, +h3, +h4, +h5 { + font-weight: 600; + margin-top: 0; +} + +p { + margin-top: 0; + padding-top: 0; +} + +.task-description { + font-weight: 400; + line-height: 1.5; + font-size: 18px; +} + +.task-container { + border-radius: 8px; + border: 3px dashed #ddd; + padding: 16px; +} + +main { + max-width: 960px; + margin: auto; + padding: 32px; +} + +nav.menu { + background-color: #404040; + color: #fff; + padding: 16px; + text-align: center; + + a { + display: inline-block; + cursor: pointer; + border-radius: 4px; + background-color: #777; + color: #fff; + padding: 8px 16px; + margin-right: 16px; + transition: background-color 150ms ease; + text-decoration: none; + + &:hover { + background-color: #999; + } + + &.active { + background-color: #86b111; + } + } +} diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 0000000..609a017 --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,212 @@ +/* + You don't need to change anything in here. +*/ + +import { FunctionComponent } from "react"; +import ReactDOM from "react-dom/client"; +import "./index.scss"; +import { + BrowserRouter, + Routes, + Route, + useParams, + Navigate, +} from "react-router-dom"; +import Intro from "./Intro"; +import { NavLink } from "react-router-dom"; +import Task1 from "./1"; +import Task2 from "./2"; +import Task3 from "./3"; +import Task4 from "./4"; +import Task5 from "./5"; +import Task6 from "./6"; + +const Menu: FunctionComponent = () => { + return ( + + ); +}; + +interface ContainerProps { + children: React.ReactNode; +} + +const Container: FunctionComponent = (props) => { + return ( + <> + +
    {props.children}
    + + ); +}; + +interface TaskContainerProps { + children: React.ReactNode; +} + +const TaskContainer: FunctionComponent = (props) => { + return
    {props.children}
    ; +}; + +const Task: FunctionComponent = () => { + let { id } = useParams<{ id: string }>(); + + switch (id) { + case "1": + return ( + <> +

    Task 1 - Create a list

    +

    + This first task is purely about using JSX. Make an ordinary + unordered list using 'ul' and li'. The list must{" "} + not be static. You have to use the array in state and{" "} + iterate over it. +

    + + + + + + ); + case "2": + return ( + <> +

    Task 2 - Create a controlled input

    +

    + This task is purely about using React's synthetic event{" "} + system. Use the existing input and paragraph to display the{" "} + the input value in the paragraph. The paragraph must be kept + in sync. +

    + + + + + + ); + case "3": + return ( + <> +

    Task 3 - Create a searchable list

    +

    + Use the knowledge you used in the previous 2 tasks to + make at searchable list. You must have a input and a{" "} + list. The list should be filtered using the value in + the input as the user types. +

    + + + + + + ); + case "4": + return ( + <> +

    Task 4 - Use styles

    +

    + This task is mainly about styling in ReactJS in order to + create a beautiful UI. Use Less to style the form with + interaction feedback such as hover, focus and so on. The goal is to + make the form as aesthetically pleasing as possible. +

    + + + + + + ); + case "5": + return ( + <> +

    Task 5 - Use component composition

    +

    + Use the knowledge you used in the previous tasks to + make a searchable list. The requirement is the same as with Task 3. +
    +
    + Except, this time you must encapsulate the UI parts + into small components. This means the Input and List goes + into different small components. In order to communicate between the + input and the list, the parent component must be used by + passing props and managing state. +

    + + + + + + ); + case "6": + return ( + <> +

    Task 6 - Create a Todo List and/or Freestyle

    +

    + This task is mainly about combining different concepts from + ReactJS in order to create a small and simple application. +
    +
    + You can either choose to create a tiny application your self or + follow the description below to create a todo app: +

    +
      + Create todos Mark them as done See a list of done todos and a list + of pending todos. Search for todos Delete todos +
    +

    + Feel free to use Less to style the applications and to install + third-party packages if needed. +

    + + + + + + ); + default: + return ; + } +}; + +const root = ReactDOM.createRoot( + document.getElementById("root") as HTMLElement +); + +root.render( + + + + + + } + /> + + + + } + /> + + } /> + + +); diff --git a/src/react-app-env.d.ts b/src/react-app-env.d.ts new file mode 100644 index 0000000..6431bc5 --- /dev/null +++ b/src/react-app-env.d.ts @@ -0,0 +1 @@ +///