Files
wow-design-wiki/layout/feature-list.md
T

417 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: layout/feature-list
title: Feature List with Animated Checkmarks
description: Clean feature lists with animated checkmarks, icons, and hover states.
tags: [layout, feature-list, checkmark, hover, clean, conversion]
source: resend.com, linear.app, raycast.com, stripe.com
---
# Feature List with Animated Checkmarks
## Что это
Чистый, структурированный список фич с анимированными чекмарками иконками. Один из самых конверсионных паттернов — используется на Resend, Linear, Raycast.
## Где используется
- Pricing-страницы
- Сравнение планов
- Feature comparison
- Onboarding-экраны
- "Why choose us" секции
## Pattern 1: Standard Feature List
```html
<section class="feature-list-section">
<div class="feature-list-container">
<div class="feature-list">
<div class="feature-item">
<span class="feature-icon check">✓</span>
<div class="feature-content">
<h3>Анализ 99+ звонков</h3>
<p>Загрузите аудио — получите детальный отчёт по 10 пунктам скрипта.</p>
</div>
</div>
<div class="feature-item">
<span class="feature-icon check">✓</span>
<div class="feature-content">
<h3>Рейтинг операторов</h3>
<p>ИИ автоматически оценивает каждого оператора и формирует рейтинг.</p>
</div>
</div>
<div class="feature-item">
<span class="feature-icon check">✓</span>
<div class="feature-content">
<h3>Конкретные рекомендации</h3>
<p>Не просто "плохо", а "замените фразу X на Y для роста конверсии на 15%".</p>
</div>
</div>
<div class="feature-item">
<span class="feature-icon check">✓</span>
<div class="feature-content">
<h3>Еженедельные отчёты</h3>
<p>Автоматический мониторинг качества звонков с динамикой улучшений.</p>
</div>
</div>
</div>
</div>
</section>
```
```css
.feature-list-section {
padding: 128px 0;
}
.feature-list-container {
max-width: 800px;
margin: 0 auto;
padding: 0 var(--space-6);
}
.feature-list {
display: flex;
flex-direction: column;
gap: 0;
}
.feature-item {
display: flex;
gap: var(--space-5);
padding: 32px 0;
border-bottom: 1px solid var(--color-border);
transition: all 0.3s ease;
align-items: flex-start;
}
.feature-item:first-child {
padding-top: 0;
}
.feature-item:last-child {
border-bottom: none;
}
.feature-item:hover {
transform: translateX(8px);
}
.feature-icon {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border-radius: 50%;
flex-shrink: 0;
font-size: 16px;
font-weight: 700;
margin-top: 2px;
}
.feature-icon.check {
background: rgba(16, 185, 129, 0.1);
color: #10b981;
border: 1px solid rgba(16, 185, 129, 0.3);
}
.feature-icon.cross {
background: rgba(239, 68, 68, 0.1);
color: #ef4444;
border: 1px solid rgba(239, 68, 68, 0.3);
}
.feature-content h3 {
font-size: 1.125rem;
font-weight: 600;
margin-bottom: 8px;
}
.feature-content p {
font-size: 0.95rem;
color: var(--color-text-secondary);
line-height: 1.6;
}
```
## Pattern 2: Two-Column Comparison
```html
<section class="comparison">
<div class="comparison-grid">
<div class="comparison-col">
<h3>calls24</h3>
<div class="feature-check">
<span class="check-icon">✓</span>
<span>AI-анализ по 10 пунктам</span>
</div>
<div class="feature-check">
<span class="check-icon">✓</span>
<span>Рейтинг операторов</span>
</div>
<div class="feature-check">
<span class="check-icon">✓</span>
<span>Рекомендации по скрипту</span>
</div>
</div>
<div class="comparison-col">
<h3>Другие</h3>
<div class="feature-cross">
<span class="cross-icon">×</span>
<span>Только базовые метрики</span>
</div>
<div class="feature-cross">
<span class="cross-icon">×</span>
<span>Нет рейтинга операторов</span>
</div>
<div class="feature-cross">
<span class="cross-icon">×</span>
<span>Общие рекомендации</span>
</div>
</div>
</div>
</section>
```
```css
.comparison-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24px;
max-width: 800px;
margin: 0 auto;
}
.comparison-col {
padding: 48px;
border-radius: 20px;
border: 1px solid var(--color-border);
background: var(--color-surface);
}
.comparison-col h3 {
font-size: 1.5rem;
font-weight: 700;
margin-bottom: 32px;
padding-bottom: 16px;
border-bottom: 1px solid var(--color-border);
}
.feature-check, .feature-cross {
display: flex;
gap: 12px;
align-items: center;
padding: 12px 0;
}
.check-icon {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: 50%;
background: rgba(16, 185, 129, 0.1);
color: #10b981;
font-size: 14px;
font-weight: 700;
flex-shrink: 0;
}
.cross-icon {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: 50%;
background: rgba(239, 68, 68, 0.1);
color: #ef4444;
font-size: 14px;
font-weight: 700;
flex-shrink: 0;
}
.feature-check span:last-child,
.feature-cross span:last-child {
color: var(--color-text-secondary);
font-size: 0.95rem;
}
@media (max-width: 768px) {
.comparison-grid {
grid-template-columns: 1fr;
}
}
```
## Pattern 3: Animated Checkmark
```html
<div class="feature-item-animated">
<div class="check-circle">
<svg class="check-path" viewBox="0 0 24 24" width="24" height="24">
<path d="M5 13l4 4L19 7" fill="none" stroke="#10b981" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<div class="feature-content">
<h3>Фича с анимацией</h3>
<p>Описание фичи</p>
</div>
</div>
```
```css
.feature-item-animated {
display: flex;
gap: 16px;
padding: 24px 0;
align-items: flex-start;
}
.check-circle {
position: relative;
width: 32px;
height: 32px;
border-radius: 50%;
background: rgba(16, 185, 129, 0.1);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.check-path {
stroke-dasharray: 30;
stroke-dashoffset: 30;
animation: draw-check 0.5s ease forwards;
animation-delay: 0.3s;
}
@keyframes draw-check {
to {
stroke-dashoffset: 0;
}
}
.feature-item-animated:hover .check-circle {
transform: scale(1.1);
transition: transform 0.2s ease;
}
```
## Pattern 4: Pricing Table with Checkmarks
```html
<div class="pricing-table">
<div class="pricing-card">
<h3>Бесплатно</h3>
<p class="price">0 ₽</p>
<ul class="pricing-features">
<li><span class="check-icon">✓</span> 3 звонка</li>
<li><span class="check-icon">✓</span> Базовый отчёт</li>
<li class="disabled"><span class="cross-icon">×</span> Рейтинг операторов</li>
</ul>
<button class="btn btn-secondary">Попробовать</button>
</div>
<div class="pricing-card featured">
<h3>Стандарт</h3>
<p class="price">5 000 ₽</p>
<ul class="pricing-features">
<li><span class="check-icon">✓</span> 10 звонков</li>
<li><span class="check-icon">✓</span> Детальный отчёт</li>
<li><span class="check-icon">✓</span> Рейтинг операторов</li>
<li><span class="check-icon">✓</span> Рекомендации</li>
</ul>
<button class="btn btn-primary">Заказать</button>
</div>
</div>
```
```css
.pricing-card {
background: var(--color-surface);
border: 1px solid var(--color-border);
border-radius: 20px;
padding: 48px;
text-align: center;
}
.pricing-card.featured {
border-color: var(--color-accent);
}
.pricing-features {
list-style: none;
margin: 32px 0;
text-align: left;
}
.pricing-features li {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 0;
color: var(--color-text-secondary);
}
.pricing-features li.disabled {
opacity: 0.4;
}
.btn-primary {
display: block;
width: 100%;
padding: 14px;
background: var(--gradient-accent);
color: white;
border: none;
border-radius: 12px;
font-weight: 600;
cursor: pointer;
}
.btn-secondary {
display: block;
width: 100%;
padding: 14px;
background: transparent;
color: var(--color-text-primary);
border: 1px solid var(--color-border);
border-radius: 12px;
font-weight: 600;
cursor: pointer;
}
```
## Anti-patterns
| ❌ Плохо | ✅ Хорошо |
|----------|-----------|
| Без визуального разделения строк | `border-bottom: 1px solid` |
| Маленькие чекмарки | `32x32px` круги |
| Без hover | `translateX(8px)` на hover |
| Без контраста | `✓` зелёный, `×` красный |
| Без `flex-shrink: 0` | Иконка не сжимается |
## CV Service Validation
```bash
# Проверить visual hierarchy feature list
curl -s -X POST http://localhost:8001/design/analyze-dom \
-H "Content-Type: application/json" \
-d '{"html": "..."}' | python3 -c "
import sys, json
d = json.load(sys.stdin)
ux = d['analyzers'].get('ux_heuristics', {})
print(f\"UX Heuristics: {ux.get('score', 'N/A')}/10\")
print(f\" Clarity: {ux.get('clarity', 'N/A')}\")
"
```
Ожидается: `ux_heuristics` > 7 (feature list — один из самых понятных паттернов).