|
| 1 | +# Трекер привычек (Habbit tracker) |
| 2 | + |
| 3 | +### Описание проекта |
| 4 | + |
| 5 | +Данный проект представляет собой интерактивное одностраничное приложение (SPA) "Трекер привычек". Он создан как финальный проект для курса по основам JavaScript. Приложение позволяет пользователям создавать, отслеживать и удалять свои привычки, отмечая ежедневный прогресс. |
| 6 | + |
| 7 | +Проект полностью построен на "чистом" **JavaScript (Vanilla JS)**, который управляет всем состоянием, рендерингом и взаимодействием с пользователем. Данные хранятся локально в **LocalStorage**, что обеспечивает их сохранность между сессиями. |
| 8 | + |
| 9 | +[🔗 Демо-версия на GitHub Pages](https://matowdev.github.io/purple-school/full-stack-dev/3-js-basic/18-proj-habit-tracker/18-17-refactoring-dry-readme) |
| 10 | + |
| 11 | +--- |
| 12 | + |
| 13 | +### Функциональность |
| 14 | + |
| 15 | +- **Создание и удаление привычек**: Пользователи могут добавлять новые привычки через модальное окно (pop-up), указывая название, цель (в днях) и выбирая иконку. |
| 16 | +- **Отслеживание прогресса**: Для каждой привычки можно ежедневно добавлять комментарий, который фиксирует "выполненный день". |
| 17 | +- **Удаление дней**: Реализована возможность удалять отдельные дни из прогресса привычки. |
| 18 | +- **Динамический интерфейс (UI)**: Приложение полностью динамическое. Выбор привычки в боковой панели, добавление/удаление дней или целых привычек немедленно обновляет основной контент (заголовок, прогресс-бар, список дней) без перезагрузки страницы. |
| 19 | +- **Хранение данных (Persistence)**: Все данные о привычках и их прогрессе сохраняются в `localStorage` браузера. |
| 20 | +- **Навигация по URL**: Активная привычка запоминается в URL с помощью хеша (`#`), что позволяет делиться ссылкой на конкретную привычку и восстанавливать состояние при перезагрузке страницы. |
| 21 | +- **Валидация форм**: Формы добавления привычки и добавления дня имеют базовую валидацию на заполненность полей. |
| 22 | + |
| 23 | +--- |
| 24 | + |
| 25 | +### Внешний вид страницы |
| 26 | + |
| 27 | + |
| 28 | + |
| 29 | +--- |
| 30 | + |
| 31 | +### Используемые технологии |
| 32 | + |
| 33 | +- **HTML5**: Для создания семантической структуры SPA ( `<aside>`, `<main>`, `<header>` и т.д.). |
| 34 | +- **CSS3**: Для стилизации всех элементов. Ключевые особенности использования: |
| 35 | + - **CSS Custom Properties (переменные)** для централизованного управления палитрой, шрифтами и размерами (`variables.css`). |
| 36 | + - **Flexbox** для построения адаптивной сетки и выравнивания. |
| 37 | + - **Модульная структура**: Стили разделены на файлы по компонентам (`sidebar.css`, `content.css`, `pop-up.css` и т.д.). |
| 38 | +- **JavaScript (ES6+ / Vanilla JS)**: Ядро всего приложения. JavaScript отвечает за: |
| 39 | + - **Управление состоянием (State Management)**: Хранение и изменение основного массива данных `habbits`. |
| 40 | + - **DOM Manipulation**: Полный рендеринг и обновление DOM-дерева (`createElement`, `innerHTML`, `append`). |
| 41 | + - **Обработка событий (Event Handling)**: Использование `onclick`, `onsubmit` и `addEventListener` для всей интерактивности. |
| 42 | + - **Работа с LocalStorage**: Сохранение (`saveData`) и загрузка (`loadData`) состояния приложения. |
| 43 | + |
| 44 | +--- |
| 45 | + |
| 46 | +### Структура кода |
| 47 | + |
| 48 | +#### Основные принципы кода: |
| 49 | + |
| 50 | +- **State-Driven UI**: Весь интерфейс перерисовывается функцией `rerender()` (и её хелперами `rerenderMenu`, `rerenderHeaderContentEl` и т.д.), которая опирается на текущее состояние глобального массива `habbits`. |
| 51 | +- **Модульность JS**: Код в `index.js` логически разделен на блоки: |
| 52 | + - `// ** utility **` (вспомогательные функции, н-р, `loadData`, `saveData`). |
| 53 | + - `// ** render **` (функции, отвечающие за отрисовку UI). |
| 54 | + - `// ** business **` (основная логика приложения: `addCommentDay`, `deleteHabbit` и т.д.). |
| 55 | + - `// init` (инициализация приложения при загрузке). |
| 56 | +- **Кэширование DOM-элементов**: Ключевые узлы DOM, которые часто используются, один раз находятся и сохраняются в объекте `app` для быстрого доступа. |
| 57 | +- **Именование по БЭМ**: Для CSS-классов используется строгая БЭМ-методология (Блок, Элемент, Модификатор). Это делает компоненты независимыми, легко переиспользуемыми и значительно повышает читаемость кода. |
| 58 | +- **Модульность CSS**: Стили импортируются в один главный файл `style.css` через директиву `@import`. |
| 59 | + |
| 60 | +#### Основные файлы и папки: |
| 61 | + |
| 62 | +``` |
| 63 | +habbit-tracker/ |
| 64 | +│── css/ # Стили: |
| 65 | +│ ├── variables.css # CSS переменные (цвета, шрифты) |
| 66 | +│ ├── page.css # Глобальные стили страницы |
| 67 | +│ ├── app.css # Стили основного layout |
| 68 | +│ ├── sidebar.css # Стили боковой панели |
| 69 | +│ ├── content.css # Стили контентной части |
| 70 | +│ ├── progress-bar.css # Стили прогресс-бара |
| 71 | +│ ├── habbit-days.css # Стили списка дней |
| 72 | +│ ├── pop-up.css # Стили модального окна |
| 73 | +│ └── style.css # Главный импортирующий файл |
| 74 | +│ |
| 75 | +│── images/ # Иконки, логотипы и favicon |
| 76 | +│ |
| 77 | +│── js/ |
| 78 | +│ └── index.js # Весь JavaScript код приложения |
| 79 | +│ |
| 80 | +│── index.html # HTML-структура приложения |
| 81 | +└── README.md # Это описание проекта |
| 82 | +``` |
| 83 | + |
| 84 | +--- |
| 85 | + |
| 86 | +### На что обратить внимание? |
| 87 | + |
| 88 | +1. **Чистый JavaScript**: Проект демонстрирует, как создать полноценное SPA (Single Page Application) без использования каких-либо фреймворков (React, Vue и т.д.). |
| 89 | +2. **Управление состоянием**: Вся логика построена вокруг манипуляций с массивом `habbits`. Функции `map` и `filter` активно используются для не-мутирующего обновления состояния (хотя в `deleteCommentDay` используется `splice` для мутации). |
| 90 | +3. **Динамический рендеринг**: Вместо того чтобы скрывать/показывать элементы, приложение _перерисовывает_ контентные блоки (`rerenderMenu`, `rerenderHabbitDaysContentEl`) на основе актуальных данных. |
| 91 | +4. **Работа с LocalStorage**: Проект показывает простой, но надежный способ сохранения данных пользователя между сеансами. |
| 92 | +5. **Инициализация (IIFE)**: При загрузке страницы немедленно-вызываемая функция (`IIFE`) в `index.js` (`(() => { ... })();`) определяет, что нужно показать пользователю: "пустое состояние", привычку из `localStorage` или привычку из URL-хеша. |
| 93 | + |
| 94 | +--- |
| 95 | + |
| 96 | +### Запуск проекта |
| 97 | + |
| 98 | +Поскольку это статический сайт, для его запуска не требуется сервер. |
| 99 | + |
| 100 | +```sh |
| 101 | +# Просто откройте файл index.html в вашем браузере |
| 102 | +open index.html |
| 103 | +``` |
| 104 | + |
| 105 | +--- |
| 106 | + |
| 107 | +### Заключение |
| 108 | + |
| 109 | +Этот проект является отличным примером "клиентского" приложения, написанного на чистом JavaScript. Он охватывает фундаментальные концепции front-end разработки: управление состоянием, манипуляция DOM, обработка событий и сохранение данных в браузере. |
0 commit comments