# Uton Frontend developer
## Требования к решению
Решите следующие задачи и предоставьте решение в виде 3 ссылок:
* https://stackblitz.com/ для 1 и 2 задания (Share - Editor Url)
* https://jsfiddle.net/ для 3 задания
Предоставление решения в правильном виде — один из критериев оценки.
Для решения 1 и 2 задачи используйте Angular 6, для 3 задачи — TypeScript. Внешний вид не учитывается при оценке задания, на это можно не тратить время.
## Задание 1
Реализовать модуль с необходимыми компонентами для реализации табов с указанной ниже разметкой использования. И содержимое, и заголовок должны поддерживать отображение других компонентов/произвольного html. По умолчанию активен первый таб. Должна поддерживаться возможность динамически добавить/убрать таб (ngFor или ngIf как в разметке ниже). При удалении таба, если тот был активным, активным становится первый таб (если остался хотя бы один). В решении вывести разметку ниже для проверки выполнения задания. Верстка: список заголовков табов в одну строку и активный контент под ними, заголовок активного таба должен быть выделен произвольным способом.
**Bonus**: Сделать так, чтобы содержимое табов инициализировалось только при активации таба. Допускается изменение разметки.
```html
<button (click)="visible = !visible">
Toggle 3 tab
</button>
<tabs>
<tab>
<tab-title>
Title 1
</tab-title>
<tab-content>
<i>Content</i> 1
</tab-content>
</tab>
<tab>
<tab-title>
<i>Title</i> 2
</tab-title>
<tab-content>
Content 2
</tab-content>
</tab>
<tab *ngIf="visible">
<tab-title>
Title 3
</tab-title>
<tab-content>
Content 3
</tab-content>
</tab>
</tabs>
```
## Задание 2
Реализовать:
* модуль, содержащий структурную директиву `ifViewportSize`, которая рендерит хост, если ширина окна браузера соответствует переданному значению
* сервис, который занимается определением текущей ширины окна браузера и должен получать на этапе инициализации конфиг с пороговыми значениями для разных типов ширины (нижнее значение, с которого начинается соответствующий тип).
**Обратить внимание на производительность** (на странице могут быть сотни произвольных компонентов)
```html
<test-component *ifViewportSize="'small'">1</test-component>
<test-component *ifViewportSize="'medium'">2</test-component>
<test-component *ifViewportSize="'large'">3</test-component>
```
```ts
interface IConfig {
medium: number;
large: number;
}
```
`test-component` — произвольный компонент, который просто выводит переданные данные. Конфиг для сервиса передавать в AppModule. В решении вывести разметку выше для проверки выполнения задания.
**Bonus**: Организовать все в виде модуля.
## Задание 3
На странице присутствуют упражнения, которые выполняет ученик. Упражнение — это некий интерактивный элемент с правильными/неправильными ответами, например:
* `<select>`, в котором ученик должен выбрать правильный ответ.
* `<input>`, где ученик вписывает правильный ответ.
Задачи стоят следующие:
* Нужно сохранять состояние упражнений в хранилище (например, на сервер через API, localStorage и т.д.). Для простоты состоянием будем считать только последний ответ пользователя (по желанию можно реализовать сохранение истории ответов пользователя). Способов сохранения упражнений может быть несколько и они могут со временем меняться. Для простоты представим что существует 3 основных способа сохранения, но если мы захотим написать еще один и протестировать его на некоторых упражнениях, то это должно произойти максимально легко.
* Нужно рассчитывать и выводить суммарный балл на странице за правильные и неправильные ответы. Способ расчета у большинства упражнений один и тот же и зависит от количества вариантов ответа у упражнения. Должна быть возможность легко заменить способ подсчета баллов у любого из упражнений или добавить новое упражнение с другим способом подсчета.
Нужно реализовать архитектуру классов для данной системы.
Ради экономии времени очень важно писать как можно меньше кода: не делать реализацию сохранения, расчета баллов и так далее. Достаточно показать общую структуру классов, их методы, зависимости, так, чтобы было понятно, что происходит.