From 6053e332160ac7a576be005a903354bc5496fa72 Mon Sep 17 00:00:00 2001 From: RedRock Date: Sun, 14 Dec 2025 14:38:40 +0300 Subject: [PATCH] feat: add sitemap --- .idea/workspace.xml | 85 +++++++++------ src/app/ekspertiza/ocenochnaja/page.tsx | 32 +++++- src/app/sitemap/page.tsx | 33 ++++++ src/shared/api/api.service.ts | 2 +- .../config/{routes.ts => api-routes.ts} | 1 + src/shared/const/menu.ts | 4 + src/views/expertise/ocenochnaya/index.ts | 1 + .../expertise/ocenochnaya/model/article.ts | 27 +++++ .../expertise/ocenochnaya/model/breadcrums.ts | 14 +++ .../expertise/ocenochnaya/model/expert.ts | 8 ++ .../expertise/ocenochnaya/model/related.ts | 29 +++++ .../expertise/ocenochnaya/model/sidebar.ts | 35 ++++++ .../expertise/ocenochnaya/styles.module.scss | 71 ++++++++++++ src/views/expertise/ocenochnaya/ui.tsx | 46 ++++++++ src/views/index.ts | 3 + src/views/sitemap/index.ts | 1 + src/views/sitemap/model/breadcrums.ts | 14 +++ src/views/sitemap/model/links.ts | 39 +++++++ src/views/sitemap/styles.module.scss | 78 ++++++++++++++ src/views/sitemap/ui.tsx | 102 ++++++++++++++++++ src/widgets/footer/ui.tsx | 2 +- 21 files changed, 588 insertions(+), 39 deletions(-) create mode 100644 src/app/sitemap/page.tsx rename src/shared/config/{routes.ts => api-routes.ts} (78%) create mode 100644 src/views/expertise/ocenochnaya/index.ts create mode 100644 src/views/expertise/ocenochnaya/model/article.ts create mode 100644 src/views/expertise/ocenochnaya/model/breadcrums.ts create mode 100644 src/views/expertise/ocenochnaya/model/expert.ts create mode 100644 src/views/expertise/ocenochnaya/model/related.ts create mode 100644 src/views/expertise/ocenochnaya/model/sidebar.ts create mode 100644 src/views/expertise/ocenochnaya/styles.module.scss create mode 100644 src/views/expertise/ocenochnaya/ui.tsx create mode 100644 src/views/sitemap/index.ts create mode 100644 src/views/sitemap/model/breadcrums.ts create mode 100644 src/views/sitemap/model/links.ts create mode 100644 src/views/sitemap/styles.module.scss create mode 100644 src/views/sitemap/ui.tsx diff --git a/.idea/workspace.xml b/.idea/workspace.xml index cf4c615..abe74a2 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,12 +5,19 @@ - - - + + + + + + - - + + + + + + - @@ -46,36 +53,42 @@ - { - "keyToString": { - "ModuleVcsDetector.initialDetectionPerformed": "true", - "RunOnceActivity.ShowReadmeOnStart": "true", - "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", - "RunOnceActivity.git.unshallow": "true", - "RunOnceActivity.typescript.service.memoryLimit.init": "true", - "SHARE_PROJECT_CONFIGURATION_FILES": "true", - "com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true", - "git-widget-placeholder": "dev", - "ignore.virus.scanning.warn.message": "true", - "javascript.preferred.runtime.type.id": "node", - "js.debugger.nextJs.config.created.client": "true", - "js.debugger.nextJs.config.created.server": "true", - "junie.onboarding.icon.badge.shown": "true", - "list.type.of.created.stylesheet": "SCSS", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "npm.Next.js: server-side.executor": "Run", - "prettierjs.PrettierConfiguration.Package": "C:\\dev-projects\\ocenka-web\\node_modules\\prettier", - "settings.editor.selected.configurable": "terminal", - "to.speed.mode.migration.done": "true", - "ts.external.directory.path": "C:\\dev-projects\\ocenka-web\\node_modules\\typescript\\lib", - "vue.rearranger.settings.migration": "true" + +}]]> + + + + + @@ -127,6 +140,8 @@ + + diff --git a/src/app/ekspertiza/ocenochnaja/page.tsx b/src/app/ekspertiza/ocenochnaja/page.tsx index 0191ae7..e7ed77e 100644 --- a/src/app/ekspertiza/ocenochnaja/page.tsx +++ b/src/app/ekspertiza/ocenochnaja/page.tsx @@ -1,5 +1,33 @@ -// TODO Проверить что это за страница +import { Ocenochnaya } from '@/views'; +import type { Metadata } from 'next'; +import { headers } from 'next/headers'; +import { metaInfo, phoneBeautify } from '@shared/lib'; +import { TMetainfo } from '@shared/types/metainfo'; +import { CONTACTS } from '@shared/const/contacts'; + +const metainfo: TMetainfo = { + title: 'Оценочная экспертиза', + description: `Проведение оценочной экспертизы. Лицензированные эксперты. Экспертиза принимается судом. Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`, + companyName: CONTACTS.COMPANY_FULL, + phone: phoneBeautify(CONTACTS.PHONE), + ogImageUrl: '/images/opengraph/expertise/ocenka.png', +}; + +export async function generateMetadata(): Promise { + const h = await headers(); + const referer = h.get('referer') ?? ''; + const host = h.get('host') ?? ''; + const proto = h.get('x-forwarded-proto') ?? ''; + const path = referer ? new URL(referer).pathname : ''; + + const metainfoExtended = Object.assign({}, metainfo, { + host: `${proto}://${host}`, + path: path, + }); + + return metaInfo(metainfoExtended); +} export default function Page() { - return
Page
; + return ; } diff --git a/src/app/sitemap/page.tsx b/src/app/sitemap/page.tsx new file mode 100644 index 0000000..81e38e5 --- /dev/null +++ b/src/app/sitemap/page.tsx @@ -0,0 +1,33 @@ +import { Sitemap } from '@/views'; +import type { Metadata } from 'next'; +import { headers } from 'next/headers'; +import { metaInfo, phoneBeautify } from '@shared/lib'; +import { TMetainfo } from '@shared/types/metainfo'; +import { CONTACTS } from '@shared/const/contacts'; + +const metainfo: TMetainfo = { + title: 'Карта сайта', + description: `Услуги оценки имущества и проведение судебных экспертиз Тел.: ${phoneBeautify(CONTACTS.PHONE)}. Предварительный анализ - бесплатно!`, + companyName: CONTACTS.COMPANY_FULL, + phone: phoneBeautify(CONTACTS.PHONE), + ogImageUrl: '/images/opengraph/main.png', +}; + +export async function generateMetadata(): Promise { + const h = await headers(); + const referer = h.get('referer') ?? ''; + const host = h.get('host') ?? ''; + const proto = h.get('x-forwarded-proto') ?? ''; + const path = referer ? new URL(referer).pathname : ''; + + const metainfoExtended = Object.assign({}, metainfo, { + host: `${proto}://${host}`, + path: path, + }); + + return metaInfo(metainfoExtended); +} + +export default function Page() { + return ; +} diff --git a/src/shared/api/api.service.ts b/src/shared/api/api.service.ts index 2ee7171..90a6129 100644 --- a/src/shared/api/api.service.ts +++ b/src/shared/api/api.service.ts @@ -1,4 +1,4 @@ -import { API_ROUTES } from '@shared/config/routes'; +import { API_ROUTES } from '@shared/config/api-routes'; import { TBaseForm } from '@shared/api/api.types'; import { CORE } from '@shared/config/core'; diff --git a/src/shared/config/routes.ts b/src/shared/config/api-routes.ts similarity index 78% rename from src/shared/config/routes.ts rename to src/shared/config/api-routes.ts index cebba69..d3dc69a 100644 --- a/src/shared/config/routes.ts +++ b/src/shared/config/api-routes.ts @@ -1,4 +1,5 @@ export const API_ROUTES = { SEND_FORM: '/sendform', HEARTBEAT: '/heartbeat', + OPENGRAPH_IMAGE: '/og', } as const; diff --git a/src/shared/const/menu.ts b/src/shared/const/menu.ts index d591af7..b77dffc 100644 --- a/src/shared/const/menu.ts +++ b/src/shared/const/menu.ts @@ -19,6 +19,10 @@ export const baseMenu: TMenuItem[] = [ title: 'Трасологическая', link: ROUTES.EXPERTIZA_TRASOLOGIA, }, + { + title: 'Оценочная', + link: ROUTES.EXPERTIZA_OCENKI, + }, { title: 'Пожарно-техническая', link: ROUTES.EXPERTIZA_POZHAR, diff --git a/src/views/expertise/ocenochnaya/index.ts b/src/views/expertise/ocenochnaya/index.ts new file mode 100644 index 0000000..5ecdd1f --- /dev/null +++ b/src/views/expertise/ocenochnaya/index.ts @@ -0,0 +1 @@ +export * from './ui'; diff --git a/src/views/expertise/ocenochnaya/model/article.ts b/src/views/expertise/ocenochnaya/model/article.ts new file mode 100644 index 0000000..56a6b57 --- /dev/null +++ b/src/views/expertise/ocenochnaya/model/article.ts @@ -0,0 +1,27 @@ +const documentsData = { + title: 'Цели экспертизы:', + description: + 'Оценка рыночной, восстановительной или ликвидационной стоимости:', + docs: [ + 'движимого имущества: транспорт, оборудование, машины, техника и тд.;', + 'недвижимого имущества, в виде объектов коммерческой и жилой недвижимости, земельных участков различного назначения;', + 'отдельных материальных ценностей, вещей;', + 'бизнеса, пакетов акций, ценных бумаг, финансовых вложений организаций;', + 'интеллектуальной собственности, услуг, видов работ, информации, имеющих материальную ценность;', + 'прав требования, кредиторской и дебиторской задолженности.', + ], +}; + +const howToData = { + title: 'Заказать экспертизу очень просто', + description: + 'Экспертное заключение, полученный от компании «ДИ ТРАСО», будет являться официальным документом, подтверждающим результат работы эксперта. В нем будет содержаться вся полная информация.', +}; + +const connectData = { + title: 'Как провести кадастровую экспертизу', + description: + 'Для того, чтобы заказать выполнение оценочной экспертизы, вы можете воспользоваться любым удобным способом.', +}; + +export { documentsData, howToData, connectData }; diff --git a/src/views/expertise/ocenochnaya/model/breadcrums.ts b/src/views/expertise/ocenochnaya/model/breadcrums.ts new file mode 100644 index 0000000..0d6bd8f --- /dev/null +++ b/src/views/expertise/ocenochnaya/model/breadcrums.ts @@ -0,0 +1,14 @@ +import { ROUTES } from '@shared/const/route'; + +export const PAGE_NAME = 'Оценочная экспертиза'; + +export const breadcrumbData = [ + { + name: 'Экспертиза', + path: ROUTES.EXPERTIZA, + }, + { + name: PAGE_NAME, + path: '', + }, +]; diff --git a/src/views/expertise/ocenochnaya/model/expert.ts b/src/views/expertise/ocenochnaya/model/expert.ts new file mode 100644 index 0000000..be60958 --- /dev/null +++ b/src/views/expertise/ocenochnaya/model/expert.ts @@ -0,0 +1,8 @@ +import { TExpert } from '@shared/types/expert'; +import expertPhoto from '@public/images/photo/polinov-andrey.jpg'; + +export const expertData: TExpert = { + name: 'Полинов Андрей', + position: 'Эксперт, оценщик', + photo: expertPhoto, +}; diff --git a/src/views/expertise/ocenochnaya/model/related.ts b/src/views/expertise/ocenochnaya/model/related.ts new file mode 100644 index 0000000..966f512 --- /dev/null +++ b/src/views/expertise/ocenochnaya/model/related.ts @@ -0,0 +1,29 @@ +import { TRelatedArticles } from '@shared/types/relatedArticles'; +import { ROUTES } from '@shared/const/route'; + +export const relatedArticlesData: TRelatedArticles[] = [ + { + title: 'Автотехническая экспертиза', + description: + 'При возникновении ситуаций, возникающих в результате ДТП (дорожно-транспортных происшествий), для решения наиболее сложных проблем, требуется проведение специальной автоэкспертизы, позволяющей реализовать право водителя на получение страховки …', + link: ROUTES.EXPERTIZA_AUTOTECH, + }, + { + title: 'Документарная экспертиза', + description: + 'Если возникают сомнения в подлинности документа, например, завещания или долговой расписки, если Вы не уверены в достоверности реквизитов или подписи на договоре, то Вы вправе обратиться за технической экспертизой документа…', + link: ROUTES.EXPERTIZA_DOCUMENT, + }, + { + title: 'Товароведческая экспертиза', + description: + 'Судебная экспертиза товаров должна проводиться только специалистом, получившим узкопрофильную квалификацию. Если Вам необходима товароведческая экспертиза и для суда, мы готовы подробно исследовать любой товар. Результат работы…', + link: ROUTES.EXPERTIZA_TOVAR, + }, + { + title: 'Рецензия (Проверка) экспертизы', + description: + 'Необходимость в составлении рецензии на судебную экспертизу появляется в ситуациях, когда выводы заключения являются не обоснованными, а квалификация и опыт эксперта не вызывают доверия. В ходе рецензирования экспертное заключение проверяется…', + link: ROUTES.EXPERTIZA_RECENZII, + }, +]; diff --git a/src/views/expertise/ocenochnaya/model/sidebar.ts b/src/views/expertise/ocenochnaya/model/sidebar.ts new file mode 100644 index 0000000..0630b4c --- /dev/null +++ b/src/views/expertise/ocenochnaya/model/sidebar.ts @@ -0,0 +1,35 @@ +import { TSidebar } from '@/shared/types/sidebar'; +import { ROUTES } from '@shared/const/route'; + +const sidebarData: TSidebar = { + estimate: '3', + offer: + 'Наш эксперт свяжется с вами для уточнения обстоятельств дела и определения точной стоимости.', + relatedTitle: 'Сопутствующие экспертизы', + related: [ + { + title: 'Автотехническая', + link: ROUTES.EXPERTIZA_AUTOTECH, + }, + { + title: 'Документарная', + link: ROUTES.EXPERTIZA_DOCUMENT, + }, + { + title: 'Товароведческая', + link: ROUTES.EXPERTIZA_TOVAR, + }, + { + title: 'Рецензирование (проверка)', + link: ROUTES.EXPERTIZA_RECENZII, + }, + ], + warrantiesTitle: 'Наши гарантии', + warranties: [ + 'Эксперты компании являются членами Саморегулируемой организации судебных экспертов', + 'Деятельность компании застрахована на 60 000 000 рублей', + 'Экспертизы выполняются в соответствии с Федеральными Законодательными Актами', + ], +}; + +export { sidebarData }; diff --git a/src/views/expertise/ocenochnaya/styles.module.scss b/src/views/expertise/ocenochnaya/styles.module.scss new file mode 100644 index 0000000..088f410 --- /dev/null +++ b/src/views/expertise/ocenochnaya/styles.module.scss @@ -0,0 +1,71 @@ +.Container { + margin: 0 auto; + max-width: rem(1540px); + display: grid; + grid-template-columns: auto; + gap: 0; + padding: 0 rem(10px); + + @include iftablet { + grid-template-columns: auto; + padding: 0 rem(20px); + } + + @include iflaptop { + padding: 0 rem(28px); + gap: rem(40px); + grid-template-columns: auto rem(300px); + } + + @include ifdesktop { + grid-template-columns: auto rem(360px); + gap: rem(160px); + padding: 0 rem(40px); + } +} + +.Article { + display: flex; + flex-direction: column; + padding: rem(40px) 0; + + .Section { + display: block; + } + + .Text { + font-family: $font-roboto; + font-weight: 400; + font-size: rem(16px); + line-height: 130%; + color: $color-text; + margin-bottom: rem(16px); + } + + .List { + display: flex; + flex-direction: column; + list-style-type: disc; + margin-left: rem(16px); + margin-bottom: rem(16px); + } + + .ListItem { + font-family: $font-roboto; + font-weight: 300; + font-size: rem(16px); + line-height: 130%; + color: $color-text; + list-style: unset; + } + + .Header { + font-family: $font-roboto; + font-weight: 300; + font-size: rem(32px); + line-height: 130%; + color: $color-text; + margin-bottom: rem(16px); + } +} + diff --git a/src/views/expertise/ocenochnaya/ui.tsx b/src/views/expertise/ocenochnaya/ui.tsx new file mode 100644 index 0000000..7af039f --- /dev/null +++ b/src/views/expertise/ocenochnaya/ui.tsx @@ -0,0 +1,46 @@ +import s from './styles.module.scss'; +import { CallbackForm, Connect, OrderSchema } from '@/entities'; +import { + Consultation, + Documents, + Partners, + RelatedArticles, + Sidebar, +} from '@/feature/article'; +import { Breadcrumbs } from '@/widgets'; +import { sidebarData } from './model/sidebar'; +import { relatedArticlesData } from './model/related'; +import { expertData } from './model/expert'; +import { breadcrumbData, PAGE_NAME } from './model/breadcrums'; +import { connectData, documentsData, howToData } from './model/article'; + +function Ocenochnaya() { + return ( + <> + +
+
+
+

+ Судебная оценочная (стоимостная) экспертиза представляет собой вид + экспертизы, главной задачей которой является определение рыночной + стоимости различных объектов оценки. Объектами оценки принято + считать любые объекты, которые имеют материальную ценность. +

+
+ + + + +
+ +
+ + + + + + ); +} + +export { Ocenochnaya }; diff --git a/src/views/index.ts b/src/views/index.ts index 3797e4d..ed4a19a 100644 --- a/src/views/index.ts +++ b/src/views/index.ts @@ -1,8 +1,10 @@ +// Common export * from './home'; export * from './contacts'; export * from './privacy-policy'; export * from './cookie'; export * from './user-agreement'; +export * from './sitemap'; //Expertise export * from './expertise/category'; @@ -12,6 +14,7 @@ export * from './expertise/computer'; export * from './expertise/document'; export * from './expertise/finans'; export * from './expertise/kadastr'; +export * from './expertise/ocenochnaya'; export * from './expertise/pocherk'; export * from './expertise/pozhar'; export * from './expertise/recenzii'; diff --git a/src/views/sitemap/index.ts b/src/views/sitemap/index.ts new file mode 100644 index 0000000..5ecdd1f --- /dev/null +++ b/src/views/sitemap/index.ts @@ -0,0 +1 @@ +export * from './ui'; diff --git a/src/views/sitemap/model/breadcrums.ts b/src/views/sitemap/model/breadcrums.ts new file mode 100644 index 0000000..05c5114 --- /dev/null +++ b/src/views/sitemap/model/breadcrums.ts @@ -0,0 +1,14 @@ +import { ROUTES } from '@shared/const/route'; + +export const PAGE_NAME = 'Карта сайта'; + +export const breadcrumbData = [ + { + name: 'Карта сайта', + path: ROUTES.SITEMAP, + }, + { + name: 'Карта сайта', + path: '', + }, +]; diff --git a/src/views/sitemap/model/links.ts b/src/views/sitemap/model/links.ts new file mode 100644 index 0000000..ae26205 --- /dev/null +++ b/src/views/sitemap/model/links.ts @@ -0,0 +1,39 @@ +import { ROUTES } from '@shared/const/route'; + +export const commonLinksData = [ + { + title: 'Меню', + block: [ + { name: 'Главная', link: ROUTES.HOME }, + { name: 'Экспертиза', link: ROUTES.EXPERTIZA }, + { name: 'Оценка', link: ROUTES.OCENKA }, + { name: 'Юрист', link: ROUTES.JURIST }, + { name: 'Эксперты', link: ROUTES.EXPERTS }, + { name: 'Контакты', link: ROUTES.CONTACTS }, + ], + }, +]; + +export const expertsLinksData = [ + { + title: 'Эксперты', + block: [ + { name: 'Ельчищев Иван Борисович', link: ROUTES.EXPERTS }, + { name: 'Янцен Яна Николаевна', link: ROUTES.EXPERTS_YANCEN }, + { name: 'Каминский Дмитрий Олегович', link: ROUTES.EXPERTS_KAMINSKIY }, + { name: 'Колодий Александр Сергеевич', link: ROUTES.EXPERTS_KOLODIY }, + { name: 'Микова Инна Георгиевна', link: ROUTES.EXPERTS_MIKOVA }, + { name: 'Полинов Андрей Владимирович', link: ROUTES.EXPERTS_POLINOV }, + { name: 'Митяев Алексей Александрович', link: ROUTES.EXPERTS_MITYAEV }, + { name: 'Бородин Виталий Петрович', link: ROUTES.EXPERTS_BORODIN }, + { + name: 'Волкова-Гончарова Татьяна Анатольевна', + link: ROUTES.EXPERTS_VOLKOVA_GONCHAROVA, + }, + { + name: 'Гюльмамедов Явар Фирмамед-оглы', + link: ROUTES.EXPERTS_GULMAMEDOV, + }, + ], + }, +]; diff --git a/src/views/sitemap/styles.module.scss b/src/views/sitemap/styles.module.scss new file mode 100644 index 0000000..e4c5eac --- /dev/null +++ b/src/views/sitemap/styles.module.scss @@ -0,0 +1,78 @@ +.Container { + margin: 0 auto; + max-width: rem(1540px); + display: flex; + flex-direction: column; + gap: 0; + padding: rem(10px); + + @include iftablet { + padding: rem(20px); + } + + @include iflaptop { + padding: rem(28px); + } + + @include ifdesktop { + padding: rem(40px); + } +} + +.Header { + font-family: $font-roboto; + font-weight: 500; + font-size: rem(32px); + line-height: 130%; + color: $color-text; + margin: rem(20px) 0; +} + +.Grid { + display: grid; + grid-template-columns: auto; + gap: rem(40px) 0; + + @include iftablet { + grid-template-columns: repeat(3, 1fr); + } +} + +.Block { + display: block; + + .Title { + font-family: $font-roboto; + font-weight: 500; + font-size: rem(24px); + line-height: 130%; + color: $color-text; + margin-bottom: rem(20px); + } + + .List { + display: flex; + flex-direction: column; + gap: rem(10px); + list-style-type: disc; + margin-left: rem(16px); + } + + .ListItem { + font-family: $font-roboto; + font-weight: 400; + font-size: rem(16px); + line-height: 130%; + color: $color-text; + list-style: unset; + + a { + color: $color-green; + } + + a:hover { + color: $color-green-hover; + text-decoration: underline; + } + } +} diff --git a/src/views/sitemap/ui.tsx b/src/views/sitemap/ui.tsx new file mode 100644 index 0000000..b31e9d6 --- /dev/null +++ b/src/views/sitemap/ui.tsx @@ -0,0 +1,102 @@ +import s from './styles.module.scss'; +import { linksData as expertiseLinksData } from '@views/expertise/category/model/links'; +import { linksData as ocenkaLinksData } from '@views/ocenka/category/model/links'; +import { linksData as juristLinksData } from '@views/jurist/category/model/links'; +import { expertsLinksData } from '@views/sitemap/model/links'; +import { commonLinksData } from '@views/sitemap/model/links'; +import Link from 'next/link'; +import { Partners } from '@/feature/article'; +import { breadcrumbData } from './model/breadcrums'; +import { Breadcrumbs } from '@/widgets'; + +function Sitemap() { + return ( + <> + +
+

Страницы сайта

+
+ {commonLinksData.map(({ block }, index) => ( +
+
    + {block.map(({ name, link }, idx) => ( +
  • + {link ? {name} : name} +
  • + ))} +
+
+ ))} +
+
+
+

Судебная экспертиза

+
+ {expertiseLinksData.map(({ block }, index) => ( +
+
    + {block.map(({ name, link }, idx) => ( +
  • + {link ? {name} : name} +
  • + ))} +
+
+ ))} +
+
+
+

Услуги оценки имущества и бизнеса

+
+ {ocenkaLinksData.map(({ title, block }, index) => ( +
+

{title}

+
    + {block.map(({ name, link }, idx) => ( +
  • + {link ? {name} : name} +
  • + ))} +
+
+ ))} +
+
+
+

Юридические услуги

+
+ {juristLinksData.map(({ block }, index) => ( +
+
    + {block.map(({ name, link }, idx) => ( +
  • + {link ? {name} : name} +
  • + ))} +
+
+ ))} +
+
+
+

Эксперты и оценщики

+
+ {expertsLinksData.map(({ block }, index) => ( +
+
    + {block.map(({ name, link }, idx) => ( +
  • + {link ? {name} : name} +
  • + ))} +
+
+ ))} +
+
+ + + ); +} + +export { Sitemap }; diff --git a/src/widgets/footer/ui.tsx b/src/widgets/footer/ui.tsx index 72b33cb..8b6054e 100644 --- a/src/widgets/footer/ui.tsx +++ b/src/widgets/footer/ui.tsx @@ -181,7 +181,7 @@ function Footer() {
  • - Карта сайта + Карта сайта