diff --git a/recipes/index.md b/recipes/index.md
index 08870438a1..03592d4ddd 100644
--- a/recipes/index.md
+++ b/recipes/index.md
@@ -17,6 +17,7 @@ groups:
- masonry
- slider
- checkbox-radio-style
+ - star-rating
- name: 'Работа с GitHub'
items:
- github-new-profile
diff --git a/recipes/star-rating/demos/css-1/index.html b/recipes/star-rating/demos/css-1/index.html
new file mode 100644
index 0000000000..487b105741
--- /dev/null
+++ b/recipes/star-rating/demos/css-1/index.html
@@ -0,0 +1,101 @@
+
+
+
+ Базовые стили — Рейтинг «5 звёзд» — Дока
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/recipes/star-rating/demos/css-2/index.html b/recipes/star-rating/demos/css-2/index.html
new file mode 100644
index 0000000000..536abc7f67
--- /dev/null
+++ b/recipes/star-rating/demos/css-2/index.html
@@ -0,0 +1,106 @@
+
+
+
+ Стили при наведении курсора — Рейтинг «5 звёзд» — Дока
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/recipes/star-rating/demos/css-3/index.html b/recipes/star-rating/demos/css-3/index.html
new file mode 100644
index 0000000000..90e5c44361
--- /dev/null
+++ b/recipes/star-rating/demos/css-3/index.html
@@ -0,0 +1,107 @@
+
+
+
+ Перевёрнутый рейтинг — Рейтинг «5 звёзд» — Дока
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/recipes/star-rating/demos/html/index.html b/recipes/star-rating/demos/html/index.html
new file mode 100644
index 0000000000..39db357e45
--- /dev/null
+++ b/recipes/star-rating/demos/html/index.html
@@ -0,0 +1,30 @@
+
+
+
+ HTML-разметка — Рейтинг «5 звёзд» — Дока
+
+
+
+
+
+
+
diff --git a/recipes/star-rating/demos/js-1/index.html b/recipes/star-rating/demos/js-1/index.html
new file mode 100644
index 0000000000..16829343dc
--- /dev/null
+++ b/recipes/star-rating/demos/js-1/index.html
@@ -0,0 +1,121 @@
+
+
+
+ Обработка клика без стилей — Рейтинг «5 звёзд» — Дока
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/recipes/star-rating/demos/js-2/index.html b/recipes/star-rating/demos/js-2/index.html
new file mode 100644
index 0000000000..d06c752e54
--- /dev/null
+++ b/recipes/star-rating/demos/js-2/index.html
@@ -0,0 +1,126 @@
+
+
+
+ Обработка клика со стилями — Рейтинг «5 звёзд» — Дока
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/recipes/star-rating/demos/js-3/index.html b/recipes/star-rating/demos/js-3/index.html
new file mode 100644
index 0000000000..de8e92f18e
--- /dev/null
+++ b/recipes/star-rating/demos/js-3/index.html
@@ -0,0 +1,130 @@
+
+
+
+ Обработка клика в обе стороны — Рейтинг «5 звёзд» — Дока
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/recipes/star-rating/demos/js-4/index.html b/recipes/star-rating/demos/js-4/index.html
new file mode 100644
index 0000000000..a2add3d2c4
--- /dev/null
+++ b/recipes/star-rating/demos/js-4/index.html
@@ -0,0 +1,132 @@
+
+
+
+ Сохранение рейтинга в дата-атрибут — Рейтинг «5 звёзд» — Дока
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/recipes/star-rating/demos/js-css/index.html b/recipes/star-rating/demos/js-css/index.html
new file mode 100644
index 0000000000..a54af9f68e
--- /dev/null
+++ b/recipes/star-rating/demos/js-css/index.html
@@ -0,0 +1,136 @@
+
+
+
+ Ховер при выбраном рейтинге — Рейтинг «5 звёзд» — Дока
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/recipes/star-rating/demos/result/index.html b/recipes/star-rating/demos/result/index.html
new file mode 100644
index 0000000000..464cd6db9f
--- /dev/null
+++ b/recipes/star-rating/demos/result/index.html
@@ -0,0 +1,135 @@
+
+
+
+ Финальное решение — Рейтинг «5 звёзд» — Дока
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/recipes/star-rating/index.md b/recipes/star-rating/index.md
new file mode 100644
index 0000000000..577ec4cedd
--- /dev/null
+++ b/recipes/star-rating/index.md
@@ -0,0 +1,506 @@
+---
+title: "Рейтинг «5 звёзд»"
+description: "Популярный элемент для оценки по пятибальной шкале на чистом HTML, CSS и JavaScript."
+authors:
+ - solarrust
+related:
+ - css/hover
+ - js/query-selector
+ - css/cascade/
+tags:
+ - article
+---
+
+## Задача
+
+Создать компонент, состоящий из 5 звезд. На любую из звёзд можно кликнуть и все звёзды до неё и она сама станут отмеченными, активными. Если кликнуть на эту звезду второй раз, то все звёзды снова станут неактивными. По наведению курсора на любую звезду все элементы до неё и она сама становятся активными. При этом когда курсор убирается кликнутые звёзды остаются активными.
+
+## Готовое решение
+
+
+
+Разметка:
+
+```html
+
+```
+
+Стили:
+
+```css
+legend {
+ font-size: 24px;
+ font-weight: 500;
+}
+
+button {
+ background-color: transparent;
+ border: none;
+ color: inherit;
+ cursor: pointer;
+ font: inherit;
+ padding: 0;
+}
+
+.visually-hidden {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ margin: -1px;
+ padding: 0;
+ border: 0;
+ clip: rect(0 0 0 0);
+ overflow: hidden;
+}
+
+.star-rating {
+ text-align: center;
+ border: none;
+}
+
+.stars {
+ list-style: none;
+ display: flex;
+ flex-direction: row-reverse;
+ gap: 1rem;
+ font-size: 5rem;
+}
+
+.star {
+ opacity: 0.5;
+ cursor: pointer;
+ transition: opacity 0.2s;
+}
+
+.stars:hover .star {
+ opacity: 0.5;
+}
+
+.active,
+.active ~ .star {
+ opacity: 1;
+}
+
+.stars .star:hover,
+.stars .star:hover ~ .star {
+ opacity: 1;
+}
+```
+
+JavaScript:
+
+```javascript
+const rating = document.querySelector('.star-rating')
+const stars = document.querySelectorAll('.star')
+
+stars.forEach((star, index) => {
+ star.addEventListener('click', (event) => {
+ const activeStar = event.currentTarget
+
+ if (activeStar.classList.contains('active')) {
+ activeStar.classList.remove('active')
+ rating.dataset.ratingValue = ''
+ } else {
+ stars.forEach(star => star.classList.remove('active'))
+ activeStar.classList.add('active')
+ rating.dataset.ratingValue = parseInt(activeStar.textContent.trim())
+ }
+ })
+})
+```
+
+## HTML
+
+В первую очередь создадим HTML-разметку для рейтинга. Элементы связаны по смыслу, поэтому нужно использовать подходящий семантический тег. Также для нативной поддержки фокуса используем тег [`