diff --git a/frontend/src/components/AnalysisLayout/AnalysisLayout.css b/frontend/src/components/AnalysisLayout/AnalysisLayout.css deleted file mode 100644 index fa2040c..0000000 --- a/frontend/src/components/AnalysisLayout/AnalysisLayout.css +++ /dev/null @@ -1,112 +0,0 @@ -.analysis-layout { - min-height: 100vh; - background: #0a0c0f; - padding: 24px; -} - -/* Двухколоночный layout */ -.layout-container { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 24px; - max-width: 1800px; - margin: 0 auto; -} - -/* Левая колонка - Форма */ -.layout-left { - background: #0a0c0f; -} - -/* Правая колонка - Карта */ -.layout-right { - position: relative; -} - -.map-container-sticky { - position: sticky; - top: 24px; - height: fit-content; -} - -/* Placeholder для карты */ -.map-placeholder { - height: 600px; - background: #161b22; - border: 2px dashed #30363d; - border-radius: 12px; - display: flex; - align-items: center; - justify-content: center; -} - -.placeholder-content { - text-align: center; - padding: 40px; -} - -.placeholder-icon { - font-size: 64px; - margin-bottom: 16px; - opacity: 0.5; -} - -.placeholder-content h3 { - margin: 0 0 12px 0; - font-size: 20px; - color: #e6edf3; - font-weight: 600; -} - -.placeholder-content p { - margin: 0; - font-size: 14px; - color: #8b949e; - line-height: 1.5; - max-width: 300px; -} - -/* Результаты снизу на всю ширину */ -.layout-bottom { - max-width: 1800px; - margin: 0 auto; - width: 100%; -} - -/* Адаптивность */ -@media (max-width: 1400px) { - .layout-container { - grid-template-columns: 1fr; - } - - .map-container-sticky { - position: relative; - top: 0; - } - - .map-placeholder { - height: 400px; - } -} - -@media (max-width: 768px) { - .analysis-layout { - padding: 16px; - } - - .layout-container { - gap: 16px; - } - - .placeholder-icon { - font-size: 48px; - } - - .placeholder-content h3 { - font-size: 18px; - } - - .placeholder-content p { - font-size: 13px; - } -} diff --git a/frontend/src/components/AnalysisLayout/AnalysisLayout.jsx b/frontend/src/components/AnalysisLayout/AnalysisLayout.jsx deleted file mode 100644 index 66405fd..0000000 --- a/frontend/src/components/AnalysisLayout/AnalysisLayout.jsx +++ /dev/null @@ -1,67 +0,0 @@ -import React, { useState } from "react"; -import CaseForm from "../CaseForm/CaseForm"; -import MapView from "../MapView/MapView"; -import ResultPanel from "../ResultPanel/ResultPanel"; -import "./AnalysisLayout.css"; - -const AnalysisLayout = () => { - const [analysisResult, setAnalysisResult] = useState(null); - const [heatmapData, setHeatmapData] = useState([]); - const [showMap, setShowMap] = useState(false); - - const handleAnalysisComplete = (result) => { - setAnalysisResult(result); - setShowMap(true); - }; - - const handleHeatmapLoad = (data) => { - setHeatmapData(data); - }; - - return ( -
-
- {/* Левая колонка - Форма */} -
- -
- - {/* Правая колонка - Карта */} -
- {showMap && analysisResult ? ( -
- -
- ) : ( -
-
-
🗺️
-

Карта поиска

-

Заполните форму и запустите анализ для отображения зон поиска

-
-
- )} -
-
- - {/* Результаты снизу на всю ширину */} - {analysisResult && ( -
- -
- )} -
- ); -}; - -export default AnalysisLayout; diff --git a/frontend/src/components/AnalysisLayout/index.jsx b/frontend/src/components/AnalysisLayout/index.jsx deleted file mode 100644 index 1a9dff6..0000000 --- a/frontend/src/components/AnalysisLayout/index.jsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from "./AnalysisLayout"; diff --git a/frontend/src/components/BehavioralProfile.css b/frontend/src/components/BehavioralProfile.css deleted file mode 100644 index 487286a..0000000 --- a/frontend/src/components/BehavioralProfile.css +++ /dev/null @@ -1,186 +0,0 @@ -.behavioral-profiles { - margin: 20px 0; - padding: 20px; - background: #f9f9f9; - border-radius: 8px; -} - -.profiles-title { - margin: 0 0 15px 0; - font-size: 1.3rem; - color: #333; - font-weight: 600; -} - -.profiles-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: 15px; -} - -.profile-card { - background: white; - border-radius: 8px; - padding: 15px; - border-left: 4px solid; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); -} - -.profile-card-red { - border-left-color: #dc3545; -} - -.profile-card-orange { - border-left-color: #fd7e14; -} - -.profile-card-yellow { - border-left-color: #ffc107; -} - -.profile-card-blue { - border-left-color: #0d6efd; -} - -.profile-card-purple { - border-left-color: #6f42c1; -} - -.profile-card-gray { - border-left-color: #6c757d; -} - -.profile-card-green { - border-left-color: #198754; -} - -.profile-header { - margin-bottom: 12px; - padding-bottom: 10px; - border-bottom: 1px solid #e9ecef; -} - -.profile-title { - margin: 0; - font-size: 1.1rem; - color: #333; - font-weight: 600; -} - -.profile-recommendations { - margin-bottom: 12px; -} - -.profile-recommendations h5, -.profile-modifiers h5 { - margin: 0 0 8px 0; - font-size: 0.9rem; - color: #666; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.recommendations-list { - margin: 0; - padding-left: 20px; - list-style-type: disc; -} - -.recommendations-list li { - margin-bottom: 6px; - font-size: 0.95rem; - color: #555; - line-height: 1.4; -} - -.profile-modifiers { - padding-top: 10px; - border-top: 1px solid #e9ecef; -} - -.modifiers-list { - display: flex; - flex-wrap: wrap; - gap: 10px; -} - -.modifier-item { - display: flex; - align-items: center; - gap: 5px; - padding: 4px 10px; - background: #f8f9fa; - border-radius: 4px; - font-size: 0.9rem; -} - -.modifier-zone { - color: #666; - font-weight: 500; -} - -.modifier-value { - color: #0d6efd; - font-weight: 700; -} - -/* Mobile styles */ -@media (max-width: 768px) { - .profiles-grid { - grid-template-columns: 1fr; - gap: 12px; - } - - .profile-card { - padding: 12px; - } - - .profiles-title { - font-size: 1.1rem; - } - - .profile-title { - font-size: 1rem; - } - - .recommendations-list li.mobile-hidden { - display: none; - } - - .profile-recommendations h5, - .profile-modifiers h5 { - font-size: 0.85rem; - } - - .recommendations-list li { - font-size: 0.9rem; - margin-bottom: 5px; - } - - .modifier-item { - font-size: 0.85rem; - padding: 3px 8px; - } -} - -/* Desktop - full cards */ -@media (min-width: 769px) { - .mobile-hidden { - display: list-item !important; - } -} - -/* Tablet */ -@media (min-width: 769px) and (max-width: 1024px) { - .profiles-grid { - grid-template-columns: repeat(2, 1fr); - } -} - -/* Large desktop */ -@media (min-width: 1400px) { - .profiles-grid { - grid-template-columns: repeat(3, 1fr); - } -} diff --git a/frontend/src/components/BehavioralProfile.tsx b/frontend/src/components/BehavioralProfile.tsx deleted file mode 100644 index eec819b..0000000 --- a/frontend/src/components/BehavioralProfile.tsx +++ /dev/null @@ -1,268 +0,0 @@ -import React from 'react'; -import './BehavioralProfile.css'; - -interface BehavioralProfileProps { - diagnosis_type?: string[]; - has_transport?: string; - age_years?: number; - reason?: string; -} - -interface ProfileCardData { - id: string; - title: string; - color: string; - recommendations: string[]; - zoneModifiers: { zone: string; multiplier: number }[]; -} - -const BehavioralProfile: React.FC = ({ - diagnosis_type = [], - has_transport, - age_years, - reason -}) => { - const getActiveProfiles = (): ProfileCardData[] => { - const profiles: ProfileCardData[] = []; - - // РАС (Расстройство аутистического спектра) - if (diagnosis_type.includes('РАС') || diagnosis_type.includes('аутизм')) { - profiles.push({ - id: 'ras', - title: 'РАС (Расстройство аутистического спектра)', - color: 'red', - recommendations: [ - 'Не кричать имя — может спрятаться от громких звуков', - 'Приоритет: водоёмы, тихие места, укрытия', - 'Перекрыть доступ к воде (пруды, реки, колодцы)', - 'Проверить железнодорожные пути и технические помещения', - 'Искать в радиусе до 5 км, часто движется по прямой' - ], - zoneModifiers: [ - { zone: 'Водоём', multiplier: 3.0 }, - { zone: 'Укрытие', multiplier: 2.0 }, - { zone: 'Населённый пункт', multiplier: 0.4 } - ] - }); - } - - // Эпилепсия - if (diagnosis_type.includes('эпилепсия')) { - profiles.push({ - id: 'epilepsy', - title: 'Эпилепсия', - color: 'orange', - recommendations: [ - 'Искать близко к точке потери — радиус до 1 км', - 'Проверить канавы, овраги, низины (риск падения)', - 'Приоритет: водоёмы и опасные участки', - 'Срочная медицинская помощь при обнаружении', - 'Проверить укрытия (мог укрыться после приступа)' - ], - zoneModifiers: [ - { zone: 'Водоём', multiplier: 3.5 }, - { zone: 'Укрытие', multiplier: 2.5 }, - { zone: 'Радиус поиска', multiplier: 0.6 } - ] - }); - } - - // СДВГ (Синдром дефицита внимания и гиперактивности) - if (diagnosis_type.includes('СДВГ') || diagnosis_type.includes('гиперактивность')) { - profiles.push({ - id: 'adhd', - title: 'СДВГ (Гиперактивность)', - color: 'yellow', - recommendations: [ - 'Расширенный радиус поиска — может уйти далеко', - 'Приоритет: дороги, тропы, интересные объекты', - 'Проверить игровые площадки, стройки, заброшенные здания', - 'Может отвлечься и изменить направление', - 'Искать вдоль дорог и троп' - ], - zoneModifiers: [ - { zone: 'Дороги', multiplier: 1.6 }, - { zone: 'Радиус поиска', multiplier: 1.4 } - ] - }); - } - - // Деменция - if (diagnosis_type.includes('деменция') || diagnosis_type.includes('Альцгеймер')) { - profiles.push({ - id: 'dementia', - title: 'Деменция / Альцгеймер', - color: 'purple', - recommendations: [ - 'Искать в радиусе до 2 км от дома', - 'Проверить знакомые места (бывший дом, работа)', - 'Приоритет: дороги, тропы (идёт по привычному маршруту)', - 'Может не откликаться на имя', - 'Проверить водоёмы и опасные участки' - ], - zoneModifiers: [ - { zone: 'Дороги', multiplier: 1.8 }, - { zone: 'Исторические места', multiplier: 2.0 }, - { zone: 'Водоём', multiplier: 1.5 } - ] - }); - } - - // Велосипед - if (has_transport === 'велосипед') { - profiles.push({ - id: 'bicycle', - title: 'Транспорт: Велосипед', - color: 'blue', - recommendations: [ - 'Радиус поиска ×5 — может уехать на 10-25 км', - 'Приоритет: дороги, велодорожки, тропы', - 'Запросить записи с камер на дорогах', - 'Проверить популярные велосипедные маршруты', - 'Лес и бездорожье менее вероятны' - ], - zoneModifiers: [ - { zone: 'Радиус поиска', multiplier: 5.0 }, - { zone: 'Дороги', multiplier: 1.8 }, - { zone: 'Лес', multiplier: 0.8 } - ] - }); - } - - // Автомобиль - if (has_transport === 'автомобиль' || has_transport === 'машина') { - profiles.push({ - id: 'car', - title: 'Транспорт: Автомобиль', - color: 'blue', - recommendations: [ - 'Радиус поиска ×10 — может уехать на 50+ км', - 'Запросить записи с камер ГИБДД и дорожных камер', - 'Проверить заправки, парковки, придорожные кафе', - 'Ориентация на дороги и трассы', - 'Розыск по номеру автомобиля' - ], - zoneModifiers: [ - { zone: 'Радиус поиска', multiplier: 10.0 }, - { zone: 'Дороги', multiplier: 2.5 }, - { zone: 'Лес', multiplier: 0.3 } - ] - }); - } - - // Подросток, ушедший из дома - if (age_years && age_years >= 13 && age_years <= 17 && - (reason?.includes('ушёл из дома') || reason?.includes('конфликт'))) { - profiles.push({ - id: 'runaway', - title: 'Подросток: Уход из дома', - color: 'gray', - recommendations: [ - 'Розыск через соцсети и друзей', - 'Проверить дома друзей, торговые центры, вокзалы', - 'Лес и удалённые места менее вероятны', - 'Может иметь телефон — запросить геолокацию', - 'Проверить популярные места встреч подростков' - ], - zoneModifiers: [ - { zone: 'Населённый пункт', multiplier: 2.0 }, - { zone: 'Лес', multiplier: 0.3 }, - { zone: 'Дороги', multiplier: 1.5 } - ] - }); - } - - // Грибник - if (reason?.includes('грибы') || reason?.includes('грибник')) { - profiles.push({ - id: 'mushroom', - title: 'Активность: Сбор грибов', - color: 'green', - recommendations: [ - 'Приоритет: лесные массивы, особенно смешанные леса', - 'Радиус до 3 км от точки входа в лес', - 'Проверить популярные грибные места', - 'Может углубиться в лес, потеряв ориентацию', - 'Искать вдоль просек и лесных дорог' - ], - zoneModifiers: [ - { zone: 'Лес', multiplier: 3.0 }, - { zone: 'Дороги', multiplier: 0.6 }, - { zone: 'Радиус поиска', multiplier: 1.2 } - ] - }); - } - - // Охотник - if (reason?.includes('охота') || reason?.includes('охотник')) { - profiles.push({ - id: 'hunter', - title: 'Активность: Охота', - color: 'green', - recommendations: [ - 'Радиус до 5-10 км — охотники перемещаются активно', - 'Приоритет: лесные массивы, поля, болота', - 'Проверить охотничьи вышки, избушки, кормушки', - 'Может иметь оружие — соблюдать осторожность', - 'Искать вдоль звериных троп и просек' - ], - zoneModifiers: [ - { zone: 'Лес', multiplier: 2.5 }, - { zone: 'Радиус поиска', multiplier: 2.0 }, - { zone: 'Укрытие', multiplier: 1.5 } - ] - }); - } - - return profiles; - }; - - const activeProfiles = getActiveProfiles(); - - if (activeProfiles.length === 0) { - return null; - } - - return ( -
-

Поведенческие профили

-
- {activeProfiles.map((profile) => ( -
-
-

{profile.title}

-
- -
-
Рекомендации:
-
    - {profile.recommendations.map((rec, idx) => ( -
  • = 2 ? 'mobile-hidden' : ''}> - {rec} -
  • - ))} -
-
- -
-
Модификаторы зон:
-
- {profile.zoneModifiers.map((mod, idx) => ( -
- {mod.zone}: - ×{mod.multiplier.toFixed(1)} -
- ))} -
-
-
- ))} -
-
- ); -}; - -export default BehavioralProfile; diff --git a/frontend/src/components/CaseForm/Step5Resources.jsx b/frontend/src/components/CaseForm/Step5Resources.jsx deleted file mode 100644 index 8280588..0000000 --- a/frontend/src/components/CaseForm/Step5Resources.jsx +++ /dev/null @@ -1,159 +0,0 @@ -import React from "react"; - -const Step5Resources = ({ data, updateData }) => { - const toggleEquipment = (equipment) => { - const current = data.equipment || []; - const updated = current.includes(equipment) - ? current.filter((e) => e !== equipment) - : [...current, equipment]; - updateData({ equipment: updated }); - }; - - return ( -
-

Шаг 5: Ресурсы для поиска

- -
- - updateData({ search_groups: parseInt(e.target.value) })} - min="0" - max="100" - placeholder="Например: 3" - /> -
- -
- - updateData({ search_people: parseInt(e.target.value) })} - min="0" - max="1000" - placeholder="Например: 25" - /> -
- -
- -
- - -
-
- -
- -
- - - - - - - - - - -
-
- -
- -