152 lines
8.6 KiB
JavaScript
152 lines
8.6 KiB
JavaScript
// Картинки из макета Figma, привязанные к данным API по slug/path.
|
||
// Где в макете картинки нет, страницы берут фото из базы (перенесено со старого сайта).
|
||
|
||
import svcKids from '../assets/figma/svc-detskaya-klinika.webp';
|
||
import svcGyn from '../assets/figma/svc-ginekologiya.webp';
|
||
import svcOft from '../assets/figma/svc-oftalmologiya.webp';
|
||
import svcPlastic from '../assets/figma/svc-plasticheskaya-khirurgiya.webp';
|
||
import svcPain from '../assets/figma/svc-bol.webp';
|
||
import svcMammo from '../assets/figma/svc-mammologiya.webp';
|
||
import svcOnko from '../assets/figma/svc-onkologiya.webp';
|
||
import svcProkto from '../assets/figma/svc-proktologiya.webp';
|
||
import svcUro from '../assets/figma/svc-urologiya.webp';
|
||
import svcSurgery from '../assets/figma/svc-khirurgiya.webp';
|
||
import svcEndo from '../assets/figma/svc-endokrinologiya.webp';
|
||
|
||
import ckGirl from '../assets/figma/ck-zdorovaya-devochka.webp';
|
||
import ckWoman from '../assets/figma/ck-zhenskoe-zdorove.webp';
|
||
import ckPregnancy from '../assets/figma/ck-beremennost.webp';
|
||
import ckCervix from '../assets/figma/ck-rak-sheyki.webp';
|
||
import ckPressure from '../assets/figma/ck-davlenie.webp';
|
||
import ckParents from '../assets/figma/ck-roditeli.webp';
|
||
import ckYear from '../assets/figma/ck-mne-god.webp';
|
||
import ckKindergarten from '../assets/figma/ck-v-sad.webp';
|
||
import ckSchool from '../assets/figma/ck-pervoklashka.webp';
|
||
import ckTeen from '../assets/figma/ck-podrostok.webp';
|
||
import ckMini from '../assets/figma/ck-mini.webp';
|
||
import ckGut from '../assets/figma/ck-zhkt.webp';
|
||
|
||
import icoFemale from '../assets/figma/ico-female.png';
|
||
import icoCheckup from '../assets/figma/ico-health-checkup.png';
|
||
import icoPregnant from '../assets/figma/ico-pregnant.png';
|
||
import icoRibbon from '../assets/figma/ico-cancer-ribbon.png';
|
||
import icoTonometer from '../assets/figma/ico-tonometer.png';
|
||
import icoFamily from '../assets/figma/ico-family.png';
|
||
import icoBaby from '../assets/figma/ico-baby.png';
|
||
import icoPlayground from '../assets/figma/ico-playground.png';
|
||
import icoSchool from '../assets/figma/ico-school.png';
|
||
import icoTeen from '../assets/figma/ico-teenager.png';
|
||
import icoStethoscope from '../assets/figma/ico-stethoscope.png';
|
||
import icoStomach from '../assets/figma/ico-stomach.png';
|
||
|
||
import promoSport from '../assets/figma/promo-sportsmen.webp';
|
||
import promoGut from '../assets/figma/promo-zhkt.webp';
|
||
import promoTeen from '../assets/figma/promo-podrostok.webp';
|
||
import promoKindergarten from '../assets/figma/promo-sad.webp';
|
||
import promoBaby from '../assets/figma/promo-rodilsya.webp';
|
||
|
||
import checkupHeroGirl from '../assets/figma/checkup-hero-girl.webp';
|
||
// Вырезанные фигуры для шапки чек-апа (прозрачный фон, 540 px по высоте шапки), 14.10.2026
|
||
import cutCervix from '../assets/checkups/hero-profilaktika-raka-sheyki-matki.webp';
|
||
import cutPostpartum from '../assets/checkups/hero-poslerodovoy-chek-ap-cherez-mesyats.webp';
|
||
import cutPlanning from '../assets/checkups/hero-planirovannie-beremennosti.webp';
|
||
import cutWoman40 from '../assets/checkups/hero-zdorovaya-zhenshchina-40.webp';
|
||
import cutWomanHealth from '../assets/checkups/hero-proverit-svoe-zhenskoe-zdorove.webp';
|
||
import cutTrimester1 from '../assets/checkups/hero-vedenie-beremennosti-1-trimestr.webp';
|
||
import cutTrimester2 from '../assets/checkups/hero-vedenie-beremennosti-2-trim.webp';
|
||
import cutTrimester3 from '../assets/checkups/hero-vedenie-beremennosti-3-trim.webp';
|
||
import cutParents from '../assets/checkups/hero-zdorovye-roditeli.webp';
|
||
import cutPressure from '../assets/checkups/hero-davlenie-v-poryadke.webp';
|
||
|
||
// Направления: фото для плитки и специальность, врачей которой показываем на странице услуги
|
||
// (связей врач ↔ услуга в базе почти нет, поэтому подбираем по специальности).
|
||
export const DIRECTION_MEDIA = {
|
||
'detskaya-klinika': { image: svcKids, specialty: 'detskie-vrachi' },
|
||
ginekologiya: { image: svcGyn, specialty: 'ginekologi' },
|
||
oko: { image: svcOft, specialty: 'oftalmologi' },
|
||
estetic: { image: svcPlastic, specialty: 'plasticheskie-khirurgi' },
|
||
osteo: { image: svcPain, specialty: 'nevrologi' },
|
||
mammologiya: { image: svcMammo, specialty: 'mammologi' },
|
||
onkologiya: { image: svcOnko, specialty: 'onkologi' },
|
||
proktologiya: { image: svcProkto, specialty: 'proktologi' },
|
||
urologiya: { image: svcUro, specialty: 'urologi' },
|
||
khirurgiya: { image: svcSurgery, specialty: 'khirurgi' },
|
||
endokrinologiya: { image: svcEndo, specialty: 'endokrinologi' },
|
||
};
|
||
|
||
// Отдельные услуги, для которых в макете нарисован свой герой.
|
||
export const SERVICE_IMAGES = {
|
||
'detskaya-klinika/priem-pediatra': svcKids,
|
||
};
|
||
|
||
export function directionOf(path) {
|
||
return String(path || '').split('/')[0];
|
||
}
|
||
|
||
// Фото, загруженное через админку (/media/uploads/…), главнее картинки макета — как у чек-апов.
|
||
// Старые картинки, перенесённые из Битрикса (/media/iblock/…), макет не перебивают.
|
||
const isUploaded = (src) => typeof src === 'string' && src.includes('/media/uploads/');
|
||
|
||
export function directionImage(service) {
|
||
if (isUploaded(service.image)) return service.image;
|
||
return (
|
||
DIRECTION_MEDIA[service.path]?.image ||
|
||
service.image ||
|
||
service.children?.find((c) => c.image)?.image ||
|
||
''
|
||
);
|
||
}
|
||
|
||
const CHECKUP_MEDIA = {
|
||
'zdorovaya-devoch-a': { photo: ckGirl, icon: icoFemale, hero: checkupHeroGirl },
|
||
'proverit-svoe-zhenskoe-zdorove-': { photo: ckWoman, icon: icoCheckup, cutout: cutWomanHealth },
|
||
'planirovannie-beremennosti': { photo: ckPregnancy, icon: icoPregnant, cutout: cutPlanning },
|
||
'profilaktika-raka-sheyki-matki': { photo: ckCervix, icon: icoRibbon, cutout: cutCervix, cutoutCenter: true },
|
||
// серо-синий фон шапки (#7886a9) — давление и родители
|
||
'davlenie-v-poryadke': { photo: ckPressure, icon: icoTonometer, cutout: cutPressure, heroBg: '#7886a9' },
|
||
'zdorovye-roditeli': { photo: ckParents, icon: icoFamily, cutout: cutParents, heroBg: '#7886a9' },
|
||
'mne-god': { photo: ckYear, icon: icoBaby },
|
||
'chek-ap-ya-v-sad': { photo: ckKindergarten, icon: icoPlayground },
|
||
pervoklashka: { photo: ckSchool, icon: icoSchool },
|
||
'chek-ap-ya-podrostok': { photo: ckTeen, icon: icoTeen },
|
||
detskiy: { photo: ckMini, icon: icoStethoscope },
|
||
'zdorovyy-zhkt': { photo: ckGut, icon: icoStomach },
|
||
// программ ниже в макете нет — берём близкие по смыслу фото макета
|
||
'vedenie-beremennosti-1-trimestr': { photo: ckPregnancy, icon: icoPregnant, cutout: cutTrimester1 },
|
||
'vedenie-beremennosti-2-trim': { photo: ckPregnancy, icon: icoPregnant, cutout: cutTrimester2 },
|
||
'vedenie-beremennosti-3-trim': { photo: ckPregnancy, icon: icoPregnant, cutout: cutTrimester3 },
|
||
'poslerodovoy-chek-ap-cherez-mesyats': { photo: ckWoman, icon: icoFemale, cutout: cutPostpartum },
|
||
'zdorovaya-zhenshchina-40': { photo: ckWoman, icon: icoFemale, cutout: cutWoman40 },
|
||
'chek-ap-ya-rodilsya': { photo: ckYear, icon: icoBaby },
|
||
};
|
||
|
||
export function checkupMedia(checkup) {
|
||
const m = CHECKUP_MEDIA[checkup.slug] || {};
|
||
return {
|
||
// фото из админки главнее: заменили картинку программы — она сразу видна на сайте
|
||
photo: checkup.image || m.photo || '',
|
||
icon: m.icon || (checkup.audience === 'kids' ? icoBaby : icoCheckup),
|
||
// крупный кадр наверху страницы — только отдельный большой снимок: фото карточки
|
||
// (360×270) в блоке 364×485 было бы размытым
|
||
hero: m.hero || '',
|
||
// вырезанная фигура на фоне шапки, как в макете: справа на всю высоту, без рамки
|
||
cutout: m.cutout || '',
|
||
// свой цвет фона шапки, если в макете он не коралловый
|
||
heroBg: m.heroBg || '',
|
||
// главное в кадре по центру — при нехватке места фигура обрезается с двух сторон, а не только слева
|
||
cutoutCenter: Boolean(m.cutoutCenter),
|
||
};
|
||
}
|
||
|
||
const PROMO_MEDIA = {
|
||
'ya-sportsmen-sale': promoSport,
|
||
'zdorovyy-zhkt-sale': promoGut,
|
||
'ya-podrostok-sale': promoTeen,
|
||
'ya-v-sad-sale': promoKindergarten,
|
||
'ya-rodilsya-sale': promoBaby,
|
||
};
|
||
|
||
export function promoImage(promo) {
|
||
return PROMO_MEDIA[promo.slug] || promo.image || '';
|
||
}
|