dana-medical-site/web/src/lib/media.js

152 lines
8.6 KiB
JavaScript
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.

// Картинки из макета 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 || '';
}