diff --git a/apps/web/app/components/buttons/page.tsx b/apps/web/app/components/buttons/page.tsx index 35b5d67..8490870 100644 --- a/apps/web/app/components/buttons/page.tsx +++ b/apps/web/app/components/buttons/page.tsx @@ -35,114 +35,184 @@ function Section({ ); } -const VARIANT_INFO = [ +const VARIANTS = [ { variant: "primary" as const, - label: "Primary", + name: "Primary", + label: "Запишитесь к нам", cssClass: ".bb-btn-primary", - bg: "#5b7b87", - text: "#fff", - description: "Основная кнопка призыва к действию. Тёмный бирюзово-серый фон, белый текст.", - useCase: "Записаться · Подтвердить", + bg: "#FFA39C", + border: "#FF847B", + textColor: "#fff", + radius: "7px", + shadow: "да", + where: "Кнопка отправки форм записи", + example: "«Запишите меня!»", + note: "Коралловый — самый заметный акцент на странице. Всегда один в форме.", }, { - variant: "secondary" as const, - label: "Secondary", - cssClass: ".bb-btn-secondary", - bg: "прозрачный", - text: "#5b7b87", - description: "Второстепенное действие. Контурная кнопка с фирменным цветом.", - useCase: "Узнать подробнее · Редактировать", + variant: "outline" as const, + name: "Outline", + label: "Записаться на приём", + cssClass: ".bb-btn-outline", + bg: "#fff", + border: "#BF9975", + textColor: "#BF9975", + radius: "7px", + shadow: "нет", + where: "Хедер, навигация, ссылки-кнопки", + example: "«Записаться на прием», «Все новости»", + note: "Бежевая рамка — ненавязчивый вторичный CTA. Не конкурирует с основной формой.", }, { - variant: "ghost" as const, - label: "Ghost", - cssClass: ".bb-btn-ghost", - bg: "прозрачный", - text: "#5b7b87", - description: "Третичное действие. Без фона и видимой рамки, текстовый акцент.", - useCase: "Отмена · Назад · Ещё...", + variant: "teal" as const, + name: "Teal", + label: "Позвонить", + cssClass: ".bb-btn-teal", + bg: "#60959c", + border: "прозрачный", + textColor: "#fff", + radius: "7px", + shadow: "нет", + where: "Контактные действия — звонок", + example: "«Позвонить»", + note: "Серо-бирюзовый — цвет из реального CSS сайта. Близок к Oracal 066M.", }, { - variant: "danger" as const, - label: "Danger", - cssClass: ".bb-btn-danger", - bg: "#dc2626", - text: "#fff", - description: "Деструктивные и необратимые действия. Красный фон.", - useCase: "Удалить · Отменить запись", + variant: "pill" as const, + name: "Pill", + label: "Заказать звонок", + cssClass: ".bb-btn-pill", + bg: "#e9e4d4", + border: "#d5cfbd", + textColor: "#333", + radius: "25px", + shadow: "нет", + where: "Модальные триггеры, мягкий CTA", + example: "«Заказать звонок»", + note: "Кремовый фон + pill-форма — мягкий стиль. Используется для открытия модальных окон.", }, ]; -const LLM_BUTTONS_TEXT = `КНОПКИ — LLM-спецификация -Версия: v1.0 · /components/buttons - -ВАРИАНТЫ -Вариант | CSS класс | Фон | Текст | Граница | Применение -primary | .bb-btn-primary | #5b7b87 | #fff | #5b7b87 | Главный CTA: «Записаться», «Подтвердить» -secondary | .bb-btn-secondary | прозрачный | #5b7b87 | #5b7b87 | Второстепенное: «Подробнее», «Редактировать» -ghost | .bb-btn-ghost | прозрачный | #5b7b87 | нет | Третичное: «Отмена», «Назад» -danger | .bb-btn-danger | #dc2626 | #fff | #dc2626 | Деструктивное: «Удалить», «Отменить запись» - -РАЗМЕРЫ -Размер | CSS класс | padding | font-size | border-radius | Применение -sm | .bb-btn-sm | 5px 12px | 13px | 6px | Компактные интерфейсы, таблицы -md | .bb-btn-md | 8px 18px | 14px | 8px | Стандарт (по умолчанию) -lg | .bb-btn-lg | 12px 26px | 16px | 10px | Главные CTA на Hero-блоках - -СОСТОЯНИЯ -default — без изменений -hover — filter: brightness(0.9) -active — filter: brightness(0.82) -loading — spinner (animation: bb-spin 0.65s linear infinite) + opacity: 0.5 + disabled -disabled — opacity: 0.5, cursor: not-allowed - -CSS BASE (globals.css) -.bb-btn { font-family: Fira Sans; font-weight: 500; display: inline-flex; align-items: center; gap: 7px; transition: filter 0.15s; } -.bb-btn:hover:not(:disabled) { filter: brightness(0.9); } -.bb-btn:active:not(:disabled) { filter: brightness(0.82); } -.bb-btn:disabled { cursor: not-allowed; opacity: 0.5; } -.bb-btn:focus-visible { outline: 2px solid #7ecfca; outline-offset: 2px; } +const LLM_BUTTONS_TEXT = `КНОПКИ — LLM-спецификация (с реального сайта oclinica.ru) +Версия: v2.0 · /components/buttons +Источник CSS: perm.oclinica.ru/.../style.css + +ВАРИАНТЫ (реальный сайт) +Вариант | CSS класс | Фон | Текст | Граница | Radius | Shadow | Применение +primary | .bb-btn-primary | #FFA39C | #fff | #FF847B | 7px | да | Форм-сабмит «Запишите меня!» +outline | .bb-btn-outline | #fff | #BF9975 | #BF9975 | 7px | нет | Хедер «Записаться на прием», ссылки-кнопки +teal | .bb-btn-teal | #60959c | #fff | нет | 7px | нет | Звонок «Позвонить» +pill | .bb-btn-pill | #e9e4d4 | #333 | #d5cfbd | 25px | нет | Callback «Заказать звонок» + +CSS С САЙТА (точные значения) +/* форм-кнопка «Запишите меня!» */ +button { background:#FFA39C; color:white; font-weight:bold; border:solid 1px #FF847B; + height:42px; font-size:18px; box-shadow:0px 0px 5px rgba(0,0,0,0.5),0px 4px 5px rgba(0,0,0,0.3); } + +/* appointment — «Записаться на прием» */ +.appointment { background:#FFF; border:#BF9975 solid 1px; color:#BF9975; + font-size:14px; line-height:38px; padding:3px 12px; border-radius:7px; } + +/* show-phone — «Позвонить» */ +.show-phone { background:rgb(96,149,156); color:#fff; border-radius:7px; + font-size:14px; line-height:38px; padding:3px 12px; } + +/* callback — «Заказать звонок» */ +a.callback_url { background:#e9e4d4; border:#d5cfbd solid 1px; color:#000; + border-radius:25px; font-size:16px; padding:6px 18px; } + +РАЗМЕРЫ (брендбук-компонент) +Размер | CSS класс | padding | font-size | Применение +sm | .bb-btn-sm | 4px 11px | 13px | Компактные контексты +md | .bb-btn-md | 8px 16px | 14px | Стандарт (appointment, teal, pill) +lg | .bb-btn-lg | 10px 24px | 18px + bold | Форм-сабмит (соответствует реальному сайту) ПРАВИЛА ПРИМЕНЕНИЯ -✓ Не более одной primary-кнопки на видимый экран в контексте одной задачи -✓ Текст кнопки — глагол или чёткий призыв: «Записаться», «Узнать цену» -✓ Primary → главное действие (форма записи, подтверждение) -✓ Secondary → второстепенное (подробнее, редактировать) -✓ Ghost → отмена, навигационная ссылка без акцента -✓ Danger → только деструктивные действия (удалить, отменить запись) -✕ Не менять цвета произвольно — только варианты из фирменной палитры -✕ Не добавлять тени к кнопкам -✕ Не использовать Danger для нейтральных действий`.trim(); +✓ primary (коралловый) — только для главного CTA в форме записи +✓ outline (бежевый) — хедер, навигация, ссылки-кнопки на странице +✓ teal (бирюзовый) — контактные действия (звонок, направление) +✓ pill (кремовый) — открытие модальных окон, мягкий callback +✓ Не более одного primary на форму +✕ Не менять цвета вне фирменной палитры сайта +✕ Primary — не для навигационных ссылок +✕ Не накладывать тень на outline/teal/pill`.trim(); export default function ButtonsPage() { - const codeHtml = ` - - - - + const codeHtml = ` + - - - -`; + +Записаться на прием + + +Позвонить + + +Заказать звонок`; const codeReact = `import { Button } from "@/components/ui/Button"; -// Варианты - - - - +// Форм-кнопка (главный CTA) + + +// Запись из хедера / навигации + + +// Звонок + + +// Заказать звонок (открывает модал) + -// Размеры - - {/* по умолчанию */} - +// С loading-состоянием +`; -// Состояния - -`; + const codeSiteExact = `/* Точный CSS с сайта oclinica.ru (style.css) */ + +/* Форм-кнопка — кнопка отправки форм записи */ +#block-entityform-block-feedback button, +#block-entityform-block-lor-form button { + background: #FFA39C; + color: white; + font-weight: bold; + border: solid 1px #FF847B; + width: 300px; + height: 42px; + font-size: 18px; + box-shadow: 0px 0px 5px rgba(0,0,0,0.5), 0px 4px 5px rgba(0,0,0,0.3); +} + +/* Кнопка «Записаться на прием» в хедере */ +#block-block-15 .appointment { + background: #FFF; + border: #BF9975 solid 1px; + color: #BF9975; + font-size: 14px; + line-height: 38px; + padding: 3px 12px; + border-radius: 7px; +} + +/* Кнопка «Позвонить» */ +.show-phone { + background: rgb(96, 149, 156); /* #60959c */ + color: #fff; + border-radius: 7px; + font-size: 14px; + line-height: 38px; + padding: 3px 12px; +} + +/* Кнопка «Заказать звонок» */ +a.callback_url { + background: #e9e4d4; + border: #d5cfbd solid 1px; + color: #000; + border-radius: 25px; + font-size: 16px; + padding: 6px 18px; +}`; return (
- Все варианты кнопок, применяемых на сайте клиники. - Кнопки — основной элемент призыва к действию в интерфейсе. + Кнопки скопированы с реального сайта{" "} + + oclinica.ru + + . Цвета, размеры и тени взяты напрямую из CSS темы{" "} + + clinic_bootstrap_mobile/css/style.css + + .
+- {label} +
+ {name}
-- {description} +
+ {note}
- + {[ + { k: "bg", v: bg }, + { k: "text", v: textColor }, + { k: "border", v: border }, + { k: "radius", v: radius }, + ...(shadow === "да" ? [{ k: "shadow", v: "да" }] : []), + ].map(({ k, v }) => ( + + {k}: {v} + + ))} +- {hint} + padding: {hint.split("·")[0].trim()} · font-size: {hint.split("·")[1].trim()}
{use}
@@ -269,49 +382,53 @@ export default function ButtonsPage() {