Show clinic hours and phone with icons in the header.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
### Сайт
|
### Сайт
|
||||||
|
|||||||
@@ -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,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,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",
|
||||||
|
|||||||
@@ -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>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -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": "Налады даступнасці",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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": "Жеткиликтүүлүк жөндөөлөрү",
|
||||||
|
|||||||
@@ -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": "Настройки доступности",
|
||||||
|
|||||||
@@ -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": "Танзимоти дастрасӣ",
|
||||||
|
|||||||
@@ -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
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user