Тестовое задание для web-разработчика Demlabs.
Приложение "Список задач" на SvelteKit с сохранением данных в IndexedDB. Можно создавать, редактировать и удалять задачи, отмечать их выполненными, искать и сортировать. Данные не пропадают между перезагрузками страницы.
В приложении не используются тяжелые UI-библиотеки и иконпаки, стилизация сделана на Tailwind CSS.
Создание задач с полями:
Отображение списка задач
Поиск по названию
Сортировка задач:
Изменение статуса задачи (активная / завершенная)
Редактирование задачи инлайн в списке
Удаление задач
Сохранение данных в IndexedDB, задачи не пропадают при перезагрузке страницы
Простая анимация появления и удаления элементов списка (Svelte transition fade)
Уведомления об успешных и неуспешных операциях:
src/
lib/
db/
index.ts настройка Dexie и схемы IndexedDB
types/
todo.ts типы Todo и TodoStatus
stores/
todoStore.ts функции для работы с IndexedDB (CRUD)
components/
TodoForm.svelte форма добавления задачи
TodoList.svelte список задач
TodoItem.svelte отдельный элемент списка, режим просмотра и редактирования
SearchBar.svelte строка поиска
routes/
+layout.svelte базовый лейаут и оболочка приложения
+page.svelte главная страница, сборка всех компонентов и бизнес-логика
Основные принципы:
Логика работы с данными изолирована в lib/db и lib/stores.
Компоненты максимально "тупые" и общаются через события createEventDispatcher.
Страница +page.svelte отвечает за:
Для локального хранения задач используется IndexedDB через библиотеку Dexie.
demlabs_todo_dbtodosСтруктура записи:
id - автоинкрементtitle - название задачиdescription - описание (опционально)status - статус задачи (active или completed)createdAt - дата создания в формате ISO-строкиupdatedAt - дата последнего обновления в формате ISO-строкиВся логика работы с БД сосредоточена в src/lib/stores/todoStore.ts:
getAllTodos - получение всех задачcreateTodo - создание задачиupdateTodo - обновление задачиtoggleTodoStatus - смена статуса задачиdeleteTodo - удаление задачиСтраница +page.svelte не знает деталей реализации IndexedDB и взаимодействует с задачами только через эти функции.
npm install
npm run dev
По умолчанию приложение будет доступно на http://localhost:5173 или другом порту, который выведет Vite.
Интерфейс спроектирован под мобильные и десктопные устройства.
На мобильных ширинах:
На десктопах:
max-w-3xlВерстка реализована на Tailwind CSS, без использования сторонних UI-библиотек.
При выполнении задания использовались ассистенты в Cursor для:
разбиения задачи на этапы и планирования реализации
подбора структуры проекта и модулей:
lib/dblib/storeslib/componentsгенерации шаблонов компонентов на Svelte с TypeScript:
createEventDispatcherобсуждения вариантов обработки ошибок и отображения уведомлений
помощи в подготовке документации (README.md, PROMPTS.md) и описания этапов работы
Код и финальные решения по архитектуре, структуре данных и UX принимались вручную с учетом требований тестового задания. Примеры промптов, использованных при разработке, приведены в файле PROMPTS.md.
Оценка времени ориентировочная и может немного отличаться от фактической.
Этап 1. Инициализация проекта
Этап 2. Реализация основной функциональности в памяти
Описание типов Todo и TodoStatus
Реализация компонентов:
TodoFormTodoListTodoItemSearchBarЛокальное состояние на странице, поиск по названию Примерное время: 30 минут
Этап 3. Подключение IndexedDB
todoStoreЭтап 4. Улучшение UX и полировка
fade)Общее примерное время выполнения: 3 часа.