diff --git a/CLAUDE.md b/CLAUDE.md index 26c1167..a7cb60a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -99,6 +99,30 @@ npm run dev > ⚠️ **ВАЖНО**: Всегда выполнять эти команды перед завершением задачи! +## 🔄 КОМАНДЫ ОТКАТА + +### Откат через комментарии: + +**Основная команда:** + +``` +"откати [описание] через комментарии" +``` + +**Примеры:** + +- `"откати центрирование поиска через комментарии"` +- `"откати изменения кнопки через комментарии"` +- `"откати новую логику через комментарии"` + +**Дополнительные команды:** + +- `"очисти комментарии"` - удалить закомментированные варианты +- `"переключи на вариант 2"` - активировать закомментированный код +- `"покажи варианты"` - показать доступные варианты + +> 📖 **Подробнее**: см. раздел 6.4 в `interaction-integrity-rules.md` + ## 💾 РАБОТА С КОНТЕКСТОМ ### Файлы для сохранения контекста: diff --git a/back-button-variants.html b/back-button-variants.html new file mode 100644 index 0000000..f1a188f --- /dev/null +++ b/back-button-variants.html @@ -0,0 +1,263 @@ + + + + + + Варианты кнопки "Назад" + + + + +

Варианты размещения кнопки "Назад"

+ + +
+

🌟 Вариант 1: Плавающая кнопка слева

+
+ + + + +
+ +
+ + +
+
+
+ + + +

Поставщики

+
+
+ Поиск поставщиков... +
+
+
+
+
+ + +
+

📍 Вариант 2: Полоса навигации сверху

+
+ + + + +
+ +
+ +
+ + +
+
+
+ + + +

Поставщики

+
+
+ Поиск поставщиков... +
+
+
+
+
+
+ + +
+

🎯 Вариант 3: Кнопка в разрыве

+
+ + + + +
+ +
+ + +
+
+
+ + + +

Поставщики

+
+
+ Поиск поставщиков... +
+
+
+
+
+ + +
+

🍞 Вариант 4: Breadcrumb стиль

+
+ + + + +
+ +
+ + + Поставщики +
+ + +
+
+
+ + + +

Поставщики

+
+
+ Поиск поставщиков... +
+
+
+
+
+
+ + +
+

🔥 Вариант 5: Вертикальная панель

+
+ + + + +
+ +
+ + +
+
+
+ + + +

Поставщики

+
+
+ Поиск поставщиков... +
+
+
+
+
+ +
+

Наведите курсор на кнопки для просмотра hover эффектов

+
+ + \ No newline at end of file diff --git a/interaction-integrity-rules.md b/interaction-integrity-rules.md index 82919e4..57669ac 100644 --- a/interaction-integrity-rules.md +++ b/interaction-integrity-rules.md @@ -470,6 +470,83 @@ ignores: ['diagnostic-script.js', 'legacy-config.js'] // конкретные ф **ПРИ НЕОПРЕДЕЛЕННОСТИ:** СТОП → Вопрос пользователю → Ждать ответа **ПРИ ОШИБКЕ В ПЛАНЕ:** СТОП → Сообщить проблему → Не выполнять до исправления +### 6.4 🔄 КОМАНДЫ ОТКАТА ЧЕРЕЗ КОММЕНТАРИИ + +#### **ОСНОВНАЯ КОМАНДА:** + +``` +"откати [описание] через комментарии" +``` + +**Примеры использования:** + +- `"откати центрирование поиска через комментарии"` +- `"откати изменения кнопки через комментарии"` +- `"откати новую логику через комментарии"` + +#### **АЛГОРИТМ ВЫПОЛНЕНИЯ:** + +**ЭТАП 1: ВОССТАНОВЛЕНИЕ ИСХОДНОГО КОДА** + +1. Найти измененный код в текущих файлах +2. Извлечь исходный код из git истории (`git show HEAD:путь/к/файлу`) +3. Восстановить исходную функциональность + +**ЭТАП 2: СОЗДАНИЕ СИСТЕМЫ ПЕРЕКЛЮЧЕНИЯ** 4. Оставить **Вариант 1** (исходный) - активным 5. Добавить **Вариант 2** (измененный) в комментариях 6. Добавить четкие описания для каждого варианта + +**ПРИМЕР СТРУКТУРЫ КОДА:** + +```jsx +// Вариант 1: Исходный (активный) +
+ {/* исходный код */} +
+ +// Вариант 2: Измененный (для быстрого переключения) +/* +
+ {/* измененный код */} +
+*/ +``` + +#### **ДОПОЛНИТЕЛЬНЫЕ КОМАНДЫ:** + +**ОЧИСТКА КОММЕНТАРИЕВ:** + +- `"очисти комментарии"` - удалить все закомментированные варианты +- `"удали вариант 2"` - удалить конкретный закомментированный вариант + +**ПЕРЕКЛЮЧЕНИЕ ВАРИАНТОВ:** + +- `"переключи на вариант 2"` - активировать закомментированный код +- `"активируй измененный вариант"` - то же самое + +**ИНФОРМАЦИОННЫЕ КОМАНДЫ:** + +- `"покажи варианты"` - показать все доступные варианты в комментариях +- `"какие есть варианты кода?"` - перечислить доступные варианты + +#### **ПРЕИМУЩЕСТВА МЕТОДА:** + +✅ **Мгновенный откат** - просто переставить комментарии +✅ **Видимость всех вариантов** - код содержит историю изменений +✅ **Быстрые эксперименты** - легко переключаться между решениями +✅ **Не усложняет архитектуру** - не требует feature flags или конфигов + +#### **ОГРАНИЧЕНИЯ:** + +⚠️ **Временное решение** - не для production кода +⚠️ **Увеличивает объем кода** - нужно очищать перед финальным коммитом +⚠️ **Только для небольших изменений** - не подходит для кардинальных переработок + +#### **ПРАВИЛА ПРИМЕНЕНИЯ:** + +- ✅ Использовать для UI экспериментов и небольших логических изменений +- ✅ Всегда добавлять четкие комментарии с описанием вариантов +- ✅ Очищать комментарии перед финальным коммитом +- ❌ Не использовать для изменений архитектуры или критической логики + --- ## 🚀 ЗАКЛЮЧЕНИЕ diff --git a/rules-complete.md b/rules-complete.md index f82eb05..e70a373 100644 --- a/rules-complete.md +++ b/rules-complete.md @@ -1,7 +1,3 @@ - - - -> > ❌ **ЗАПРЕЩЕНО РЕДАКТИРОВАТЬ БЕЗ ЯВНОГО РАЗРЕШЕНИЯ ПОЛЬЗОВАТЕЛЯ!** > > 📅 **Дата создания резерва**: 2025-08-08 @@ -852,6 +848,8 @@ const handleSuppliesClick = () => { #### **📄 Структура страницы создания поставки:** +**ВАЖНО**: Страница НЕ имеет основного заголовка и описания. Сразу начинается с блоков контента. + **ОБНОВЛЕННАЯ СТРУКТУРА СИСТЕМЫ (4 БЛОКА):** **БЛОК 1: ПОСТАВЩИКИ** _(адаптивная сетка)_ @@ -1981,13 +1979,15 @@ height: calc(100vh - headerHeight - tabsHeight - statsHeight - margins); ### 11.4 Правила фулфилмента **ОБЯЗАТЕЛЬНО**: + - Установка цен на расходники перед доступностью селлерам -- Контроль качества товаров при приемке +- Контроль качества товаров при приемке - Своевременная обработка возвратов - Ведение учета движения товаров - Управление персоналом и рабочим временем **ЗАПРЕЩЕНО**: + - Отгружать товары без подтверждения наличия - Создавать расходники минуя систему поставок - Изменять цены закупки после поступления товара @@ -2246,11 +2246,13 @@ const wholesalePartners = await prisma.counterparty.findMany({ **НАЗНАЧЕНИЕ**: Бизнес-партнерство с автоматическим добавлением в контрагенты **ФОРМАТ URL**: `?partner=REFERRAL_CODE` + ``` http://localhost:3000/register?partner=SF2X9K4M7P ``` **ЧТО ПРОИСХОДИТ**: + 1. ✅ Начисляется 100 сфер (⚡) реферальная награда 2. ✅ **Автоматически создается партнерство**: взаимное добавление в контрагенты 3. ✅ Устанавливается реферальная связь (`referredById`) @@ -2264,11 +2266,13 @@ http://localhost:3000/register?partner=SF2X9K4M7P **НАЗНАЧЕНИЕ**: Маркетинговое привлечение с наградой, БЕЗ автоматического партнерства **ФОРМАТ URL**: `?ref=REFERRAL_CODE` + ``` http://localhost:3000/register?ref=SF2X9K4M7P ``` **ЧТО ПРОИСХОДИТ**: + 1. ✅ Начисляется 100 сфер (⚡) реферальная награда 2. ✅ Устанавливается реферальная связь (`referredById`) 3. ❌ **НЕ создается партнерство**: организации НЕ добавляются в контрагенты @@ -2303,11 +2307,13 @@ if (referralCode) { **В разделе "Партнеры"**: **Вкладка "Мои партнеры"**: + - Партнерская ссылка: `?partner=CODE` (автоматическое партнерство) - Заголовок: "Пригласить партнера" - Описание: "Для прямого делового сотрудничества" **Вкладка "Рефералы"**: + - Реферальная ссылка: `?ref=CODE` (только маркетинг) - Заголовок: "Реферальная ссылка" - Описание: "Для маркетинговых кампаний" @@ -2315,14 +2321,17 @@ if (referralCode) { #### **13.6.5 Правила именования** **В коде ВСЕГДА использовать**: + - `partnerCode` / `partner=` → бизнес-партнерство - `referralCode` / `ref=` → маркетинговое привлечение **В комментариях и документации**: + - "Партнерская ссылка" → автоматическое партнерство - "Реферальная ссылка" → только маркетинг **ЗАПРЕЩЕНО**: + - ❌ Называть партнерские ссылки "реферальными" - ❌ Называть реферальные ссылки "партнерскими" - ❌ Использовать термины взаимозаменяемо @@ -2331,6 +2340,7 @@ if (referralCode) { #### **13.6.6 Примеры использования** **Сценарий 1 - Деловое партнерство**: + ``` Фулфилмент-центр хочет пригласить логистическую компанию → Использует партнерскую ссылку ?partner=CODE @@ -2339,6 +2349,7 @@ if (referralCode) { ``` **Сценарий 2 - Маркетинговая кампания**: + ``` Организация запускает рекламу в соцсетях → Использует реферальную ссылку ?ref=CODE @@ -3412,7 +3423,7 @@ _Статус: ЕДИНЫЙ ИСТОЧНИК ИСТИНЫ - ГОТОВ К РАЗ ### 🔗 ПАРТНЕРСКАЯ И РЕФЕРАЛЬНАЯ СИСТЕМА v10.2: - ✅ **ДОБАВЛЕН РАЗДЕЛ 13.6**: Критическое различие партнерских и реферальных ссылок -- ✅ **ЧЕТКИЕ ОПРЕДЕЛЕНИЯ**: Партнерские (?partner=) vs Реферальные (?ref=) ссылки +- ✅ **ЧЕТКИЕ ОПРЕДЕЛЕНИЯ**: Партнерские (?partner=) vs Реферальные (?ref=) ссылки - ✅ **ТЕХНИЧЕСКИЕ ПРАВИЛА**: Различия в обработке кодов в резолверах - ✅ **UI СПЕЦИФИКАЦИИ**: Разные интерфейсы для партнерства и маркетинга - ✅ **ЗАПРЕТЫ ПУТАНИЦЫ**: Строгие правила именования и терминологии diff --git a/src/components/admin/admin-dashboard.tsx b/src/components/admin/admin-dashboard.tsx index f9573b8..b340e4e 100644 --- a/src/components/admin/admin-dashboard.tsx +++ b/src/components/admin/admin-dashboard.tsx @@ -43,9 +43,9 @@ const AdminDashboard = React.memo(() => { }, [activeSection]) return ( -
+
-
{renderContent}
+
{renderContent}
) }) diff --git a/src/components/admin/ui-kit-section.tsx b/src/components/admin/ui-kit-section.tsx index 38e3195..40cc6d7 100644 --- a/src/components/admin/ui-kit-section.tsx +++ b/src/components/admin/ui-kit-section.tsx @@ -5,6 +5,7 @@ import React from 'react' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { AnimationsDemo } from './ui-kit/animations-demo' +import { BackButtonVariantsDemo } from './ui-kit/back-button-variants-demo' import { BusinessDemo } from './ui-kit/business-demo' import { BusinessProcessesDemo } from './ui-kit/business-processes-demo' import { ButtonsDemo } from './ui-kit/buttons-demo' @@ -84,6 +85,12 @@ const UIKitSection = React.memo(() => { > Навигация + + Кнопки Назад + { + + + diff --git a/src/components/admin/ui-kit/back-button-variants-demo.tsx b/src/components/admin/ui-kit/back-button-variants-demo.tsx new file mode 100644 index 0000000..ef8c573 --- /dev/null +++ b/src/components/admin/ui-kit/back-button-variants-demo.tsx @@ -0,0 +1,234 @@ +'use client' + +import { ArrowLeft, Building2 } from 'lucide-react' +import React from 'react' + +export function BackButtonVariantsDemo() { + return ( +
+
+

Варианты кнопки "Назад"

+

+ Интерактивные варианты размещения кнопки навигации между сайдбаром и контентом +

+
+ + {/* ВАРИАНТ 1: ПЛАВАЮЩАЯ КНОПКА СЛЕВА */} +
+

🌟 Вариант 1: Плавающая кнопка слева

+
+
+ {/* Sidebar Mock */} +
+
+
+ Rennel +
+
+
Главная
+
Маркет
+
Мессенджер
+
+
+ + {/* Floating Back Button */} +
+ +
+ + {/* Block 1 Mock */} +
+
+
+ +

Поставщики

+
+
+ Поиск поставщиков... +
+
+
+
+
+
+ + {/* ВАРИАНТ 2: ПОЛОСА НАВИГАЦИИ СВЕРХУ */} +
+

📍 Вариант 2: Полоса навигации сверху

+
+
+ {/* Sidebar Mock */} +
+
+
+ Rennel +
+
+
Главная
+
Маркет
+
Мессенджер
+
+
+ + {/* Content Area */} +
+ {/* Navigation Bar */} +
+ +
+ + {/* Block 1 Mock */} +
+
+
+ +

Поставщики

+
+
+ Поиск поставщиков... +
+
+
+
+
+
+
+ + {/* ВАРИАНТ 3: КНОПКА В РАЗРЫВЕ */} +
+

🎯 Вариант 3: Кнопка в разрыве

+
+
+ {/* Sidebar Mock */} +
+
+
+ Rennel +
+
+
Главная
+
Маркет
+
Мессенджер
+
+
+ + {/* Button in Gap */} +
+ +
+ + {/* Block 1 Mock */} +
+
+
+ +

Поставщики

+
+
+ Поиск поставщиков... +
+
+
+
+
+
+ + {/* ВАРИАНТ 4: BREADCRUMB СТИЛЬ */} +
+

🍞 Вариант 4: Breadcrumb стиль

+
+
+ {/* Sidebar Mock */} +
+
+
+ Rennel +
+
+
Главная
+
Маркет
+
Мессенджер
+
+
+ + {/* Content Area */} +
+ {/* Breadcrumb */} +
+ + + Поставщики +
+ + {/* Block 1 Mock */} +
+
+
+ +

Поставщики

+
+
+ Поиск поставщиков... +
+
+
+
+
+
+
+ + {/* ВАРИАНТ 5: ВЕРТИКАЛЬНАЯ ПАНЕЛЬ */} +
+

🔥 Вариант 5: Вертикальная панель

+
+
+ {/* Sidebar Mock */} +
+
+
+ Rennel +
+
+
Главная
+
Маркет
+
Мессенджер
+
+
+ + {/* Vertical Panel */} +
+ +
+ + {/* Block 1 Mock */} +
+
+
+ +

Поставщики

+
+
+ Поиск поставщиков... +
+
+
+
+
+
+ +
+

Наведите курсор на кнопки для просмотра hover эффектов

+
+
+ ) +} diff --git a/src/components/supplies/create-consumables-supply-page.tsx b/src/components/supplies/create-consumables-supply-page.tsx index e4d9e27..337ebf9 100644 --- a/src/components/supplies/create-consumables-supply-page.tsx +++ b/src/components/supplies/create-consumables-supply-page.tsx @@ -1,16 +1,7 @@ 'use client' import { useQuery, useMutation } from '@apollo/client' -import { - ArrowLeft, - Building2, - Search, - Package, - Plus, - Minus, - ShoppingCart, - Wrench, -} from 'lucide-react' +import { ArrowLeft, Building2, Search, Package, Plus, Minus, ShoppingCart, Wrench } from 'lucide-react' import Image from 'next/image' import { useRouter } from 'next/navigation' import React, { useState } from 'react' @@ -131,7 +122,6 @@ export function CreateConsumablesSupplyPage() { }).format(amount) } - const updateConsumableQuantity = (productId: string, quantity: number) => { const product = supplierProducts.find((p: ConsumableProduct) => p.id === productId) if (!product || !selectedSupplier) return @@ -358,12 +348,8 @@ export function CreateConsumablesSupplyPage() {
- {/* Заголовок */} -
-
-

Создание поставки расходников

-

Выберите поставщика и добавьте расходники в заказ

-
+ {/* Кнопка назад без заголовка */} +
@@ -684,10 +684,7 @@ text-white/50 /* Приглушенный текст */ ```tsx
- + {error &&

{error}

}
``` @@ -697,8 +694,8 @@ text-white/50 /* Приглушенный текст */ ```tsx // ✅ ПРАВИЛЬНАЯ структура страницы с сайдбаром function PageWithSidebar() { - const { getSidebarMargin } = useSidebar(); - + const { getSidebarMargin } = useSidebar() + return (
@@ -725,7 +722,7 @@ function PageWithSidebar() {
- ); + ) } ``` @@ -743,37 +740,37 @@ function PageWithSidebar() { ```css /* 1. ПРОДУКТЫ - готовые к отправке */ -.module-products { +.module-products { @apply bg-green-500/20 border-green-400 text-green-100; --icon-color: #10b981; /* emerald-500 */ } /* 2. ТОВАРЫ - базовые товары */ -.module-goods { +.module-goods { @apply bg-blue-500/20 border-blue-400 text-blue-100; --icon-color: #3b82f6; /* blue-500 */ } /* 3. БРАК - дефектные товары */ -.module-defect { +.module-defect { @apply bg-red-500/20 border-red-400 text-red-100; --icon-color: #ef4444; /* red-500 */ } /* 4. ВОЗВРАТЫ С ПВЗ - возвращенные товары */ -.module-returns { +.module-returns { @apply bg-yellow-500/20 border-yellow-400 text-yellow-100; --icon-color: #eab308; /* yellow-500 */ } /* 5. РАСХОДНИКИ СЕЛЛЕРОВ - материалы клиентов */ -.module-seller-supplies { +.module-seller-supplies { @apply bg-purple-500/20 border-purple-400 text-purple-100; --icon-color: #a855f7; /* purple-500 */ } /* 6. РАСХОДНИКИ ФУЛФИЛМЕНТА - операционные материалы (КЛИКАБЕЛЬНЫЙ) */ -.module-ff-supplies { +.module-ff-supplies { @apply bg-orange-500/20 border-orange-400 text-orange-100 cursor-pointer hover:bg-orange-400/30; --icon-color: #f97316; /* orange-500 */ transition: all 0.2s ease-in-out; @@ -791,14 +788,14 @@ function PageWithSidebar() {
ТехноМир - + {/* УРОВЕНЬ 2: ТОВАРЫ (зеленый - средние блоки) */}
Смартфон iPhone 15
- + {/* УРОВЕНЬ 3: ВАРИАНТЫ (оранжевый - мелкие блоки) */}
@@ -816,49 +813,49 @@ function PageWithSidebar() { ```css /* 1. PENDING - ожидает подтверждения */ -.status-pending { +.status-pending { @apply bg-gray-500/20 border-gray-400 text-gray-100; --dot-color: #6b7280; } /* 2. SUPPLIER_APPROVED - подтверждено поставщиком */ -.status-supplier-approved { +.status-supplier-approved { @apply bg-blue-500/20 border-blue-400 text-blue-100; --dot-color: #3b82f6; } /* 3. CONFIRMED - подтверждено системой */ -.status-confirmed { +.status-confirmed { @apply bg-cyan-500/20 border-cyan-400 text-cyan-100; --dot-color: #06b6d4; } /* 4. LOGISTICS_CONFIRMED - подтверждено логистикой */ -.status-logistics-confirmed { +.status-logistics-confirmed { @apply bg-indigo-500/20 border-indigo-400 text-indigo-100; --dot-color: #6366f1; } /* 5. SHIPPED - отправлено */ -.status-shipped { +.status-shipped { @apply bg-purple-500/20 border-purple-400 text-purple-100; --dot-color: #a855f7; } /* 6. IN_TRANSIT - в пути */ -.status-in-transit { +.status-in-transit { @apply bg-yellow-500/20 border-yellow-400 text-yellow-100; --dot-color: #eab308; } /* 7. DELIVERED - доставлено */ -.status-delivered { +.status-delivered { @apply bg-green-500/20 border-green-400 text-green-100; --dot-color: #22c55e; } /* 8. COMPLETED - завершено (только для фулфилмента) */ -.status-completed { +.status-completed { @apply bg-emerald-600/20 border-emerald-500 text-emerald-100; --dot-color: #059669; } @@ -875,25 +872,25 @@ const productCreationSteps = [ { id: 'planning', label: 'Планирование работы', status: 'active' }, { id: 'processing', label: 'Обработка товара', status: 'pending' }, { id: 'quality', label: 'Контроль качества', status: 'pending' }, - { id: 'completion', label: 'Завершение', status: 'pending' } -]; + { id: 'completion', label: 'Завершение', status: 'pending' }, +] // Визуальный компонент -
+;
{productCreationSteps.map((step, index) => (
-
+ `} + > {step.status === 'completed' ? '✓' : index + 1}
{step.label} - {index < productCreationSteps.length - 1 && ( -
- )} + {index < productCreationSteps.length - 1 &&
}
))}
@@ -907,25 +904,25 @@ const productCreationSteps = [ /* WHOLESALE - поставщики */ .partner-wholesale { @apply bg-emerald-500/20 border-emerald-400; - --icon: "🏭"; /* factory */ + --icon: '🏭'; /* factory */ } /* SELLER - селлеры */ .partner-seller { @apply bg-blue-500/20 border-blue-400; - --icon: "🛍️"; /* shopping */ + --icon: '🛍️'; /* shopping */ } /* FULFILLMENT - фулфилмент центры */ .partner-fulfillment { @apply bg-purple-500/20 border-purple-400; - --icon: "📦"; /* package */ + --icon: '📦'; /* package */ } /* LOGIST - логистические компании */ .partner-logist { @apply bg-orange-500/20 border-orange-400; - --icon: "🚚"; /* truck */ + --icon: '🚚'; /* truck */ } ``` @@ -941,7 +938,7 @@ const productCreationSteps = [ // ✅ ПРАВИЛЬНАЯ архитектура (согласно rules-complete.md) export function SuppliesPage() { const { getSidebarMargin } = useSidebar(); - + return (
@@ -951,12 +948,12 @@ export function SuppliesPage() {
- + {/* БЛОК 2: СТАТИСТИКА - контекстные метрики */}
- + {/* БЛОК 3: ОСНОВНОЙ КОНТЕНТ - до низа sidebar */}
@@ -974,38 +971,42 @@ export function SuppliesPage() { #### 14.5.2 Контекстная статистика по табам **Для пути "Фулфилмент → Товар → Карточки/Поставщики":** + ```tsx const suppliesStats = [ - { label: "Всего поставок", value: "24", color: "text-blue-400" }, - { label: "Активных поставок", value: "8", color: "text-green-400" }, - { label: "Сумма активных поставок", value: "₽142,350", color: "text-yellow-400" }, - { label: "В пути", value: "3", color: "text-purple-400" } -]; + { label: 'Всего поставок', value: '24', color: 'text-blue-400' }, + { label: 'Активных поставок', value: '8', color: 'text-green-400' }, + { label: 'Сумма активных поставок', value: '₽142,350', color: 'text-yellow-400' }, + { label: 'В пути', value: '3', color: 'text-purple-400' }, +] ``` **Для пути "Фулфилмент → Расходники селлера":** + ```tsx const consumablesStats = [ - { label: "Всего поставок", value: "12", color: "text-blue-400" }, - { label: "Активных поставок", value: "4", color: "text-green-400" }, - { label: "Видов расходников", value: "18", color: "text-orange-400" }, - { label: "Критические остатки", value: "2", color: "text-red-400" } -]; + { label: 'Всего поставок', value: '12', color: 'text-blue-400' }, + { label: 'Активных поставок', value: '4', color: 'text-green-400' }, + { label: 'Видов расходников', value: '18', color: 'text-orange-400' }, + { label: 'Критические остатки', value: '2', color: 'text-red-400' }, +] ``` **Для путей "Маркетплейсы → Wildberries/Ozon":** + ```tsx const marketplaceStats = [ - { label: "Поставок на маркетплейс", value: "15", color: "text-blue-400" }, - { label: "Товаров отправлено", value: "347", color: "text-green-400" }, - { label: "Возвраты за неделю", value: "12", color: "text-yellow-400" }, - { label: "Эффективность поставок", value: "94%", color: "text-emerald-400" } -]; + { label: 'Поставок на маркетплейс', value: '15', color: 'text-blue-400' }, + { label: 'Товаров отправлено', value: '347', color: 'text-green-400' }, + { label: 'Возвраты за неделю', value: '12', color: 'text-yellow-400' }, + { label: 'Эффективность поставок', value: '94%', color: 'text-emerald-400' }, +] ``` #### 14.5.3 Система создания поставок **Выбор типа поставки:** + ```tsx const supplyTypes = [ { @@ -1013,23 +1014,25 @@ const supplyTypes = [ title: 'Карточки товаров', description: 'Импорт через WB API с автосозданием поставки', icon: '📱', - color: 'bg-blue-500/20 border-blue-400' + color: 'bg-blue-500/20 border-blue-400', }, { - id: 'goods-suppliers', + id: 'goods-suppliers', title: 'Поставщики товаров', description: 'Прямой заказ с указанием рецептуры', icon: '🏭', - color: 'bg-emerald-500/20 border-emerald-400' + color: 'bg-emerald-500/20 border-emerald-400', }, { id: 'consumables', - title: 'Расходники селлера', + title: 'Расходники селлера', description: 'Материалы для производства', icon: '🔧', - color: 'bg-purple-500/20 border-purple-400' - } -]; + color: 'bg-purple-500/20 border-purple-400', + // ВАЖНО: На странице /supplies/create-consumables НЕ отображается заголовок и описание + pageHeader: false, + }, +] ``` #### 14.5.4 Интерфейс рецептуры продукта @@ -1040,16 +1043,16 @@ const supplyTypes = [ // БЛОК 1: БАЗОВЫЙ ТОВАР (слева)

1. Базовый товар

-
// БЛОК 2: УСЛУГИ ФУЛФИЛМЕНТА (центр)

2. Услуги ФФ

- @@ -1058,7 +1061,7 @@ const supplyTypes = [ // БЛОК 3: РАСХОДНИКИ (справа)

3. Расходники

- @@ -1068,30 +1071,31 @@ const supplyTypes = [ #### 14.5.5 WB интеграция - визуальные индикаторы **Статусы синхронизации с WB API:** + ```css /* Успешная синхронизация */ .wb-sync-success { @apply bg-green-500/20 border-green-400 text-green-100; - --status-icon: "✅"; + --status-icon: '✅'; } /* Ошибка синхронизации */ .wb-sync-error { @apply bg-red-500/20 border-red-400 text-red-100; - --status-icon: "❌"; + --status-icon: '❌'; } /* В процессе синхронизации */ .wb-sync-loading { @apply bg-yellow-500/20 border-yellow-400 text-yellow-100; - --status-icon: "⏳"; + --status-icon: '⏳'; animation: pulse 2s infinite; } /* Не настроена */ .wb-sync-none { @apply bg-gray-500/20 border-gray-400 text-gray-100; - --status-icon: "⚠️"; + --status-icon: '⚠️'; } ``` @@ -1102,8 +1106,9 @@ const supplyTypes = [ **📅 ДАТА**: 2025, полная синхронизация с техническими требованиями ### 🆕 ДОБАВЛЕНИЯ v1.2: + - ✅ Детальные правила для кабинета селлера (раздел 14.5) -- ✅ Трёхблочная архитектура страницы "Мои поставки" +- ✅ Трёхблочная архитектура страницы "Мои поставки" - ✅ Контекстная статистика по типам поставок - ✅ Визуальные компоненты создания рецептуры - ✅ WB интеграция и статусы синхронизации