1 Commits
Author SHA1 Message Date
Alexey NovikovandCursor f068628e7e Show clinic hours and phone with icons in the header.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 02:01:26 +03:00
13 changed files with 130 additions and 7 deletions
+6
View File
@@ -2,6 +2,12 @@
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/), версии — [SemVer](https://semver.org/lang/ru/). Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/), версии — [SemVer](https://semver.org/lang/ru/).
## [1.0.11] — 2026-09-17
### Сайт
- В шапке рядом с логотипом — режим работы и телефоны `+7 (499) 674-07-09` / `122` с иконками в цветах сайта
## [1.0.10] — 2026-09-17 ## [1.0.10] — 2026-09-17
### Сайт ### Сайт
+1 -1
View File
@@ -4,7 +4,7 @@
Репозиторий: [Moniki_uslugi](https://git.myunion.pro/Alex/Moniki_uslugi) на [git.myunion.pro](https://git.myunion.pro/). Репозиторий: [Moniki_uslugi](https://git.myunion.pro/Alex/Moniki_uslugi) на [git.myunion.pro](https://git.myunion.pro/).
Текущая версия: **v1.0.10** (см. [CHANGELOG.md](CHANGELOG.md)). Текущая версия: **v1.0.11** (см. [CHANGELOG.md](CHANGELOG.md)).
## Что внутри ## Что внутри
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@moniki/cms", "name": "@moniki/cms",
"version": "1.0.10", "version": "1.0.11",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@moniki/web", "name": "@moniki/web",
"version": "1.0.10", "version": "1.0.11",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev -p 3000", "dev": "next dev -p 3000",
+7 -3
View File
@@ -1,5 +1,6 @@
"use client"; "use client";
import { HeaderContacts } from "@/components/layout/HeaderContacts";
import { HeaderTools } from "@/components/layout/HeaderTools"; import { HeaderTools } from "@/components/layout/HeaderTools";
import { LocaleSwitcher } from "@/components/layout/LocaleSwitcher"; import { LocaleSwitcher } from "@/components/layout/LocaleSwitcher";
import { Logo } from "@/components/layout/Logo"; import { Logo } from "@/components/layout/Logo";
@@ -37,18 +38,20 @@ export function Header() {
return ( return (
<header className="sticky top-0 z-50 border-b border-[var(--border)] bg-[var(--surface)]"> <header className="sticky top-0 z-50 border-b border-[var(--border)] bg-[var(--surface)]">
<div className="mx-auto flex h-[var(--header-h)] max-w-7xl items-center gap-3 px-4 sm:px-6"> <div className="mx-auto flex h-[var(--header-h)] w-full max-w-[1600px] items-center gap-3 px-4 sm:px-6">
<Logo tagline={meta("tagline")} className="min-w-0 shrink-0" /> <Logo tagline={meta("tagline")} className="min-w-0 shrink-0" />
<span className="hidden h-10 w-px shrink-0 bg-[var(--border)] xl:block" aria-hidden />
<HeaderContacts className="hidden xl:flex" />
<nav <nav
className="hidden min-w-0 flex-1 items-center justify-end gap-0 lg:flex" className="hidden min-w-0 flex-1 items-center justify-end overflow-hidden lg:flex"
aria-label={a11y("mainNav")} aria-label={a11y("mainNav")}
> >
{links.map((l) => ( {links.map((l) => (
<Link <Link
key={l.href} key={l.href}
href={l.href} href={l.href}
className="whitespace-nowrap rounded-lg px-2.5 py-2 text-base font-medium text-[var(--neutral-700)] transition hover:bg-[var(--brand-50)] hover:text-[var(--brand-700)]" className="whitespace-nowrap rounded-lg px-2 py-2 text-[15px] font-medium text-[var(--neutral-700)] transition hover:bg-[var(--brand-50)] hover:text-[var(--brand-700)]"
> >
{t(l.key)} {t(l.key)}
</Link> </Link>
@@ -109,6 +112,7 @@ export function Header() {
<Button size="sm">{t("cabinet")}</Button> <Button size="sm">{t("cabinet")}</Button>
</Link> </Link>
</div> </div>
<HeaderContacts stacked className="mt-4 border-t border-[var(--border)] pt-4 lg:hidden" />
</nav> </nav>
</div> </div>
) : null} ) : null}
@@ -0,0 +1,77 @@
"use client";
import { cn } from "@/lib/utils";
import { Clock, Phone01 } from "@untitledui/icons";
import { useTranslations } from "next-intl";
import type { ReactNode } from "react";
function IconWell({ children }: { children: ReactNode }) {
return (
<span className="flex h-8 w-8 shrink-0 items-center justify-center rounded-[10px] bg-[var(--brand-50)] text-[var(--brand-700)]">
{children}
</span>
);
}
export function HeaderContacts({
className,
stacked = false,
}: {
className?: string;
stacked?: boolean;
}) {
const t = useTranslations("header");
const hero = useTranslations("hero");
return (
<div
className={cn(
stacked ? "flex flex-col items-stretch gap-3" : "flex min-w-0 items-center gap-3",
className,
)}
>
<div
className={cn(
"min-w-0 items-center gap-2.5",
stacked ? "flex" : "hidden min-[1480px]:flex",
)}
>
<IconWell>
<Clock size={16} aria-hidden />
</IconWell>
<p className="min-w-0 leading-snug">
<span className="sr-only">{t("hoursLabel")}. </span>
<span className="block text-[13px] font-semibold tracking-tight text-[var(--brand-700)]">
{t("hoursWeekdays")}
</span>
<span className="block text-[12px] text-[var(--neutral-500)]">{t("hoursWeekend")}</span>
</p>
</div>
{!stacked ? (
<span className="hidden h-8 w-px shrink-0 bg-[var(--border)] min-[1480px]:block" aria-hidden />
) : null}
<div className={cn("min-w-0 items-center gap-2.5", stacked ? "flex" : "hidden xl:flex")}>
<IconWell>
<Phone01 size={16} aria-hidden />
</IconWell>
<p className="min-w-0 leading-snug">
<span className="sr-only">{t("phoneLabel")}. </span>
<a
href="tel:+74996740709"
className="block text-[13px] font-semibold tracking-tight text-[var(--brand-700)] transition hover:text-[var(--brand-800)]"
>
{hero("phone")}
</a>
<a
href="tel:122"
className="block text-[12px] font-medium text-[var(--neutral-500)] transition hover:text-[var(--brand-700)]"
>
{hero("phoneAlt")}
</a>
</p>
</div>
</div>
);
}
+6
View File
@@ -20,6 +20,12 @@
"menu": "Меню", "menu": "Меню",
"close": "Закрыць" "close": "Закрыць"
}, },
"header": {
"hoursLabel": "Рэжым працы",
"hoursWeekdays": "Пн–Сб 08:00–20:00",
"hoursWeekend": "Нд 09:00–16:00",
"phoneLabel": "Тэлефон"
},
"a11y": { "a11y": {
"open": "Спецыяльныя магчымасці", "open": "Спецыяльныя магчымасці",
"title": "Налады даступнасці", "title": "Налады даступнасці",
+6
View File
@@ -20,6 +20,12 @@
"menu": "Menu", "menu": "Menu",
"close": "Close" "close": "Close"
}, },
"header": {
"hoursLabel": "Opening hours",
"hoursWeekdays": "Mon–Sat 08:00–20:00",
"hoursWeekend": "Sun 09:00–16:00",
"phoneLabel": "Phone"
},
"a11y": { "a11y": {
"open": "Accessibility", "open": "Accessibility",
"title": "Accessibility settings", "title": "Accessibility settings",
+6
View File
@@ -20,6 +20,12 @@
"menu": "Меню", "menu": "Меню",
"close": "Жабуу" "close": "Жабуу"
}, },
"header": {
"hoursLabel": "Иш убактысы",
"hoursWeekdays": "Дш–Иш 08:00–20:00",
"hoursWeekend": "Жк 09:00–16:00",
"phoneLabel": "Телефон"
},
"a11y": { "a11y": {
"open": "Атайын мүмкүнчүлүктөр", "open": "Атайын мүмкүнчүлүктөр",
"title": "Жеткиликтүүлүк жөндөөлөрү", "title": "Жеткиликтүүлүк жөндөөлөрү",
+6
View File
@@ -20,6 +20,12 @@
"menu": "Меню", "menu": "Меню",
"close": "Закрыть" "close": "Закрыть"
}, },
"header": {
"hoursLabel": "Режим работы",
"hoursWeekdays": "Пн–Сб 08:00–20:00",
"hoursWeekend": "Вс 09:00–16:00",
"phoneLabel": "Телефон"
},
"a11y": { "a11y": {
"open": "Специальные возможности", "open": "Специальные возможности",
"title": "Настройки доступности", "title": "Настройки доступности",
+6
View File
@@ -20,6 +20,12 @@
"menu": "Меню", "menu": "Меню",
"close": "Пӯшидан" "close": "Пӯшидан"
}, },
"header": {
"hoursLabel": "Соатҳои кор",
"hoursWeekdays": "Дш–Шб 08:00–20:00",
"hoursWeekend": "Як 09:00–16:00",
"phoneLabel": "Телефон"
},
"a11y": { "a11y": {
"open": "Имкониятҳои махсус", "open": "Имкониятҳои махсус",
"title": "Танзимоти дастрасӣ", "title": "Танзимоти дастрасӣ",
+6
View File
@@ -20,6 +20,12 @@
"menu": "菜单", "menu": "菜单",
"close": "关闭" "close": "关闭"
}, },
"header": {
"hoursLabel": "工作时间",
"hoursWeekdays": "周一至周六 08:00–20:00",
"hoursWeekend": "周日 09:00–16:00",
"phoneLabel": "电话"
},
"a11y": { "a11y": {
"open": "无障碍", "open": "无障碍",
"title": "无障碍设置", "title": "无障碍设置",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "moniki-platnye-uslugi", "name": "moniki-platnye-uslugi",
"version": "1.0.10", "version": "1.0.11",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "pnpm -r --parallel dev", "dev": "pnpm -r --parallel dev",