W Clinic · дизайн-язык v0.1

UI Kit

Место, где утверждается дизайн-язык приложения. Витрина и экраны импортируют один и тот же компонент из одного места — отдельного кода «для витрины» не существует. Значения приходят из globals.css через design-tokens.ts: витрина не хранит их у себя, иначе разойдётся с системой молча.

Клиника

Палитра

У каждого токена подписана роль и замеренный контраст. Свотч без подписи не защищает решение: спорить будут о цвете, а обсуждать надо роль. Клиника переключается классом на контейнере — сплошной бренд и градиенты меняются, поверхности и семантика цикла остаются.

Поверхности

Background--backgroundСтраница. Тонированная, а не белая: карточка отделяется от неё заливкой
Card--card1.17:1 к страницеПоверхности в потоке: карточка цикла, карточка врача, таб-бар
Muted / Wash--muted1.03:1 к странице · 1.13:1 к карточкеВложенная плашка: предложение УЗИ, контейнер дня, плитка прививки
Popover--popoverВсплывающее: шторка, меню, поповер. Отделяется тенью, а не заливкой

Чернила

Foreground--foreground15.50:1 к странице · 18.10:1 к карточкеОсновной текст, заголовки, число «сегодня»
Muted foreground--muted-foreground3.00:1 к карточке · 2.66:1 к плашкеПодписи, специальность врача, дни недели, неактивный таб✕ AA для обычного текста требует 4.5:1 — не проходит нигде

Бренд клиники

Brand--brandбелым по нему 5.94:1 (взрослая, болотный #536c20) · 4.58:1 (детская)Сплошной бренд: кнопки, аватар врача, активные состояния, точки
Brand from--brand-fromСветлый конец градиента карточки приёма, стоп 20.5 %
Brand to--brand-toбелым 5.94:1 (взрослая)Тёмный конец того же градиента, стоп 74.8 %
Brand on--brand-onпо шапке 2.10…2.95:1 (взрослая)Значки фактов на карточке приёма; у детской ещё и дата✕ Значки — графика, им нужно 3:1: у светлого ядра не берут

Шапка главной — три радиальных слоя

Hero 1--hero-1белым 4.23:1 (взрослая) · 2.23:1 (детская)Светлое ядро градиента у правого низа шапки✕ У детской белый текст на ядре не берёт даже 3:1 — он и не стоит там
Hero 2--hero-2белым 5.00:1 (взрослая) · 3.22:1 (детская)Середина, стоп 50 %
Hero 3--hero-3белым 5.94:1 (взрослая) · 4.58:1 (детская)Тёмный край. Он же заливка под системной полосой
Hero promo 1--hero-promo-1белым 5.08:1Терракотовое ядро — акцент клиники #b2522c: рекомендация красит шапку иначе, чем приём
Hero promo 2--hero-promo-2белым 6.24:1Середина: посчитана как середина крайних стопов, стоп 50 %
Hero promo 3--hero-promo-3белым 7.68:1Тёмный край рекомендации и заливка полосы под ней
Hero tint--hero-tintбелым 2.71:1 (взрослая) · 1.47:1 (детская)Тёплый разлив у нижней кромки: ядро на 0.12 L светлее и на 24° к жёлтому✕ Наносится в 62 %, и только у нижнего края — текста там нет
Hero cool--hero-coolбелым 8.23:1 (взрослая) · 6.80:1 (детская)Холодная глубина дальнего угла. У взрослой — цвет фрейма, у детской — край на 0.12 L темнее и на 42° к синему
Hero promo tint--hero-promo-tintбелым 3.07:1Разлив под шапкой рекомендации — к жёлтому от терракоты✕ Самый светлый цвет шапки. Белым по нему не набирают ничего
Hero promo cool--hero-promo-coolбелым 9.87:1Глубина рекомендации: тот же тон терракоты, светлота 0.39

Цикл — семантика, не бренд

Cycle mens--cycle-mensМенструация: заливка кружков дней и цвет фазы. Одинаков во всех клиниках
Cycle fert--cycle-fertФертильное окно и день овуляции. Прогноз против факта — светлотой, не цветом
Cycle mens soft--cycle-mens-softПрогноз менструации: базовый цвет на 44 % по белому, считается из него
Cycle fert soft--cycle-fert-softПрогноз фертильного окна: то же правило 44 % по белому
Cycle mens deep--cycle-mens-deepТёмный конец менструации: обводка выбранного дня и цифра на осветлении. По осветлению 6.91:1, по белому 11.97:1
Cycle fert deep--cycle-fert-deepТёмный конец фертильного окна: та же роль. По осветлению 5.10:1, по белому 7.98:1

Помощь сегодня — свой градиент

Help to--help-toбелым 4.59:1Светлый конец, стоп 0 % — под текстом
Help mid--help-midбелым 5.70:1Середина, стоп 45 % — там нет ни текста, ни знака
Help from--help-fromбелым 10.19:1Тёмный конец, стоп 100 % — под знаком, его силуэт держит корпус

Тревога — граница скорой

Alert from--alert-fromбелым 4.79:1Исходник осветления --alert-soft. Плоскостью больше не рисуется
Alert soft--alert-softтёмным 7.19:1Остров «Скорая помощь — 103» в шторке «Помощь сегодня»
Alert deep--alert-deepпо осветлению 7.19:1Текст на этом острове: заголовок, номер и список признаков

Беременность — цепочка стопов

Preg 1--preg-1Начало первого кольца
Preg 2--preg-2Конец первого кольца и начало второго — один стоп на два
Preg 3--preg-3Конец второго кольца и начало третьего
Preg 4--preg-4Конец третьего кольца

Линии и служебное

Border / Line--border1.24:1 к карточкеДекоративная линия и рамка «сегодня» в полосе дней. Под контрол не годится
Input / Line strong--input3.62:1 к карточке · 3.20:1 к плашкеГраница контрола: WCAG 1.4.11 требует 3:1, если рамка — единственный признак поля
Destructive--destructiveбелым 4.79:1Ошибка и отмена. Взят тёмный конец градиента «Нужна помощь сегодня?»
Home indicator--home-indicatorСистемная полоса смахивания. Не бренд и не тема — чужой интерфейс
Keyboard--keyboardПодложка системной цифровой клавиатуры на экранах входа. Чужой интерфейс
Keyboard key--keyboard-keyКлавиша системной клавиатуры
Keyboard key edge--keyboard-key-edgeНижняя кромка клавиши системной клавиатуры

Контраст — что не проходит

Считано по WCAG 2.1 скриптом, а не оценено на глаз.

Палитра снята с макета, и три её роли не берут WCAG AA. Значения не подменены: выбор цвета принадлежит дизайнеру. Ниже — замер, требуемый порог и кандидаты, чтобы решение принималось на числах. Решение принимается на гейте 2.

ГдеЗамерНужноКандидаты
Подписи #849999 по белой карточке3.00:1 (по плашке #eaf3f3 — 2.66:1)4.5:1 — это обычный текст 14/16 и 12/16#748b8b даёт 3.62 / 3.20 — тоже мало. Проходят: #667b7b (4.48 / 3.97), #617575 (4.87 / 4.32), #5c7070 (5.24 / 4.65). Первый, который берёт AA на обеих поверхностях, — #5c7070
Дата белым на болотной шапке4.23:1 у светлого ядра, 5.94:1 у края4.5:1 — набрана 16/16Не берёт только у самого ядра, а дата стоит у верхнего края. С 29.09.2026 бренд болотный: белым по нему 5.94, у кнопки #49601c→#617f28 — 7.06…4.59, прежняя проблема «белым по #25ae6a 2.86:1» снята
Заголовок «Нужна помощь сегодня?» белым по градиенту тревоги4.79:1 у тёмного конца, 3.38:1 у светлого3:1 как крупный текст он берёт; 4.5:1 как обычный — нет. 18/24 semibold стоит на границе определения «крупный»Либо кегль до 20/24 и хватает 3:1 наверняка, либо светлый конец градиента темнеет: #e83c00 даёт 3.62, #d93800 — 4.13
Подпись блока тревоги, белый при 80 % прозрачности3.41:1 у тёмного конца, 2.62:1 у светлого4.5:1 — обычный текст 14/16Полная непрозрачность поднимает до 3.38…4.79 — это дешевле всего и ближе всего к порогу. Прозрачность здесь ничего не значит смыслово: она только приглушает
Белый текст на акцентах цикла#cb6440 — 3.86:1, #00a6ff — 2.66:13:1, если по ним пойдёт хоть какой-то текстСейчас текста по ним нет — только заливка кружков, и тогда порог не применяется. Ограничение вступит в силу, если появится плашка с подписью

Типографика

Manrope — заголовки и имена, Roboto Condensed — тексты, подписи и числа. В макете на месте Manrope стоит Involve (Zetafonts, коммерческий); замена принята 31.08.2026. Табличные цифры включены глобально: в интерфейсе сравнивают цены и даты.

Пять ступеней шкалы плюс два исключения по интерлиньяжу. Интерлиньяжи взяты из макета и теснее ступеней Tailwind по умолчанию: макет плотный, воздух держат отступы, а не строки. Колонка «Flutter» — имя будущего стиля в AppTypography.

Вход

text-display-lg · Manrope SemiBold32 / 36displayL
Заголовок экранов входа: «Вход», «Введите код» — по центру под знаком W

Запись на приём

text-display · Manrope SemiBold28 / 32display
Крупный заголовок корневого экрана раздела — уезжает в шапку при прокрутке

Приём у гинеколога

text-xl · Manrope Bold20 / 24titleL
Заголовок карточки приёма, заголовок блока «Повторная запись»

Ваш цикл

text-lg · Manrope SemiBold18 / 24titleM
Заголовок карточки цикла, «Нужна помощь сегодня?»

Фертильное окно

text-lg · Manrope Regular18 / 24titleMLight
Фаза цикла и срок беременности — вторая строка того же заголовка

Анна Ковалёва

text-base · Manrope Bold16 / 20titleS
Имя пользователя в шапке

Смирнова Екатерина Павловна

text-base · Roboto Condensed16 / 20bodyL
Имя врача в карточке повторной записи

УЗИ молочных желёз

text-base · Roboto Condensed Medium16 / 20bodyLStrong
Заголовок вложенного предложения

Исследование лучше делать с 5 по 12 день цикла — так снимок точнее.

text-sm · Roboto Condensed14 / 20bodyM
Описание в предложении и в блоке «Нужна помощь сегодня?»

Акушер-гинеколог · 5 200 ₽

text-caption · Roboto Condensed14 / 16caption
Подписи: номер карты, специальность, дата приёма, дни недели

Возьмите с собой результаты прошлых анализов

text-xs · Roboto Condensed12 / 16note
Число дня в полосе цикла, текст пузыря на карточке приёма

Запись

text-label · Roboto Condensed12 / 14label
Метка таб-бара — единственная роль этой ступени

Отступы

Шкала закрыта. Логический пиксель Flutter равен CSS-пикселю при базе 16 — значит шкала переносится буквально, если её не разбавлять значениями по месту.

4gap-1
Иконка и метка в табе, имя и номер карты
8gap-2 / island-stack
Между островами экрана (`island-stack`), строки врача, точки карусели
12gap-3
Резерв шкалы: в макете не встретился
16gap-4 / p-4
Основной отступ: внутри карточки, поля экрана
20p-5
Внутренний отступ карточки приёма
24gap-6
Резерв шкалы
32gap-8
Полоса смахивания, крупные разрывы

Числа макета, которые в шкалу не попали

Раздел нужен, чтобы «подогнали к шкале» было решением, а не потерей: произвольные числа не переносятся во Flutter, они там размываются по месту.

  • гэп 7 между днями недели → 8. Один пиксель на семи промежутках даёт 7px разницы по всей полосе — незаметно. Держать в шкале ступень 7 ради одного места дороже
  • padding 16/15 карточки цикла → 16 по всем сторонам. Асимметрия в 1px не читается, а во Flutter требует отдельного EdgeInsets вместо симметричного
  • пузырь снизу 35 → оставлен 35. Не отступ, а позиция элемента с хвостом-вектором: сдвиг меняет то, куда смотрит хвост

Радиусы

Пять ступеней и «таблетка».

6rounded-tail
Угол пузыря переписки со стороны автора: хвост и стык группы
16rounded-plate
Вложенное предложение, контейнер иконки, пузырь с другой стороны
20rounded-cta
Кнопка с градиентом
24rounded-card
Карточка цикла, карточка врача, блок «Плохо»
32rounded-hero
Карточка приёма, контейнер дня, плитка прививки
pillrounded-pill
Аватары, колокольчик, кружки дней, точки карусели

Тени

В потоке теней нет вовсе: карточка отделяется заливкой. Тень существует ровно для того, что всплывает над экраном, и это её единственная роль.

shadow-sheet
Sheet--shadow-sheetШторка снизу. Единственное, что отделяется тенью, а не заливкой
shadow-float
Float--shadow-floatПлавающий элемент над содержимым: тост, подсказка

Motion

РольТокенЗначениеДвойник во Flutter
Кривая
Одна на весь интерфейс. Быстрый старт, мягкая остановка
--easecubic-bezier(0.2, 0.8, 0.2, 1)Cubic(0.2, 0.8, 0.2, 1)
Нажатие
Отклик на касание: масштаб 0.97 через press-tap
--duration-tap120msDuration(milliseconds: 120)
Переход
Экран уезжает вглубь, шторка раскрывается
--duration-move220msDuration(milliseconds: 220)
Акцент
Кольцо цикла, подтверждение записи
--duration-slow320msDuration(milliseconds: 320)

Владельцы поведения

Инвариант 2: у каждого повторяющегося поведения один владелец. Описанный словами стиль руками переизобретут чуть иначе; названную функцию — нет. При порте во Flutter у владельца есть ровно один адрес в Dart.

ПоведениеВладелецГде
Главное действие экрана: три тона одного размера, неактивное состояниеAppButtoncomponents/kit/app-button.tsx
Полоса действия, прибитая к низу экранаActionBarcomponents/kit/action-bar.tsx
Кружок выбора слева в строкеSelectMarkcomponents/kit/select-mark.tsx
Остров записи: кто идёт, к кому, где и когдаBookingSummarycomponents/blocks/booking-summary.tsx
Текст клиники про услугу отдельным блокомServiceNotecomponents/blocks/service-note.tsx
Способы оплаты задаткаPaymentMethodscomponents/blocks/payment-methods.tsx
Сделанные записи: создать, перенести, отменитьuseAppointmentsStorelib/stores/appointments.ts
Отклик на нажатиеpress-tapglobals.css, @utility
Мишень во всю карточку поверх своих мишенейCardTargetcomponents/kit/card-target.tsx
Отклик карточки со слоем-мишенью внутриpress-cardglobals.css, @utility
Градиент шапки главной: клиника и рекомендацияbrand-hero, promo-heroglobals.css, @utility
Перетекание цвета шапки по жесту--hero-blendglobals.css, @property
Градиент кнопкиbrand-ctaglobals.css, @utility
Рамка телефона и системный хромDeviceFramecomponents/shell/device-frame.tsx
Навигация стеком: push / pop / popAllScreenStack, useScreenStackcomponents/shell/screen-stack.tsx
Оболочка: рамка, стек и панель вкладок вместеDeviceShellcomponents/shell/device-shell.tsx
Панель вкладок: пять разделов, активный только цветомAppTabBarcomponents/blocks/app-tab-bar.tsx
Отрисовка иконки из файла с цветом из токенаAppIconcomponents/kit/app-icon.tsx
Иконочная кнопка: 48 белая, 32 на градиенте, 24 знаком без плашкиAppIconButtoncomponents/kit/icon-button.tsx
Стопка аватаров профилейAvatarStackcomponents/kit/avatar-stack.tsx
Кружок с лицом или инициалами: врач и администраторDoctorAvatarcomponents/kit/doctor-avatar.tsx
Карточка прошлого приёма: услуга, врач, цена визитаVisitCardcomponents/kit/visit-card.tsx
Строка «иконка 16 + факт о приёме»IconRowcomponents/kit/icon-row.tsx
Пузырь с хвостом-векторомSpeechBubblecomponents/kit/speech-bubble.tsx
Точки каруселиCarouselDotscomponents/kit/carousel-dots.tsx
Стекло большой карточки: градиент, 254, обрезка скруглениемHeroSurfacecomponents/kit/hero-surface.tsx
Непрозрачная плашка стрелки на брендовом градиентеplate-on-brandglobals.css, @utility
Блик по самому тексту: 15 % строки, проход за 2.6 сsheen-textglobals.css, @utility
Содержимое большой карточки: заголовок, стрелка, слоиHeroCardcomponents/kit/hero-card.tsx
Прокрутка со снапом по карточке, индикатор и неподвижный слой поверхCardCarouselcomponents/kit/card-carousel.tsx
Шторка снизу внутри рамки телефонаAppSheetcomponents/kit/app-sheet.tsx
День в полоске цикла: шесть видов и «выбран»CycleDaycomponents/kit/cycle-day.tsx
Полоска дней: прокрутка, снап по центру, выбор дняCycleStripcomponents/kit/cycle-strip.tsx
Перетаскивание мышью (леса для показа с ноутбука)useDragScrollhooks/use-drag-scroll.ts
Вложенное предложение услуги с градиентной кнопкойServiceOffercomponents/kit/service-offer.tsx
Фазы цикла, виды дня и окно УЗИ — считаются, а не пишутсяdemo-cycle.tslib/demo-cycle.ts
Кольцо триместра: дуга, градиент цепочки, заполнениеTrimesterRingcomponents/kit/trimester-ring.tsx
Кольцо срока: сорок недель, три дуги триместровPregnancyRingcomponents/kit/pregnancy-ring.tsx
План наблюдения: шесть исследований со срокамиPregnancyPlancomponents/blocks/pregnancy-plan.tsx
Плашка действия у нижней кромки большой карточкиHeroCtaPlatecomponents/kit/hero-cta-plate.tsx
Приглашение записаться первым кадром лентыFirstVisitCardcomponents/blocks/first-visit-card.tsx
«Как это работает»: три шага для карты без приёмовHowItWorkscomponents/blocks/how-it-works.tsx
Часы клиники: один факт, а не три формулировкиCLINIC_HOURSlib/demo-medcards.ts
Стеклянный знак направления, пунктир вместо негоCatalogIconcomponents/kit/catalog-icon.tsx
Карточка направления для лентыDirectionCardcomponents/kit/direction-card.tsx
«Или выберите направление»: каталог лентойDirectionRailcomponents/blocks/direction-rail.tsx
Появление содержимого: прозрачность и подъёмrise-inglobals.css, @utility
Число, которое перелистывается как счётчикRollingNumbercomponents/kit/rolling-number.tsx
Системная «назад»: жест от кромки и кнопка AndroidSystemBackProvidercomponents/shell/system-back.tsx
Сообщение в переписке: пузырь, цитата, вложение, статусChatBubblecomponents/kit/chat-bubble.tsx
Три точки «печатает»ChatTypingcomponents/kit/chat-bubble.tsx
Поле ввода сообщения и кнопка отправкиChatComposercomponents/kit/chat-composer.tsx
Лента переписки: группы, дни, переход к найденномуChatThreadcomponents/blocks/chat-thread.tsx
Пустой чат: приглашение и темыChatInvitecomponents/blocks/chat-invite.tsx
Поиск по переписке: найденное вместо ленты, новые сверхуChatSearchcomponents/blocks/chat-search.tsx
Найденное сообщение: кто, когда, подсвеченный запросChatSearchRowcomponents/kit/chat-search-row.tsx
Цикл до первой отметки: приглашение кадром лентыCycleInvitecomponents/blocks/cycle-invite.tsx
Заполнение кольца анимациейring-fillglobals.css, @utility + @keyframes
Срок, триместр и заполненность — считаются из датыdemo-pregnancy.tslib/demo-pregnancy.ts
Русское склонение по числу и дата словамиplural, formatDaylib/format.ts
Врач тремя строками: имя, специальность со стажем, местоDoctorPlatecomponents/kit/doctor-plate.tsx
Поверхность поля поиска: белое стеклоglass-fieldglobals.css, @utility
Ввод поискового запросаSearchInputcomponents/kit/search-input.tsx
Поиск по каталогу: услуги, врачи, направленияsearchCataloglib/search.ts
Мишень не меньше 44 × 44tap-44globals.css, @utility
Мишень 44 по высоте у элемента в рядуtap-row-44globals.css, @utility
Белый остров экранаAppCardcomponents/kit/app-card.tsx
Блок «Задаток внесён»DepositRowcomponents/blocks/deposit-row.tsx
Подсветка изменившегося значенияuseChangeFlashhooks/use-change-flash.ts
Короткое сообщение поверх экранаuseToastcomponents/shell/app-toast.tsx
Состояния загрузки: три формыSkeletonRows, SkeletonCard, SkeletonHerocomponents/kit/skeletons.tsx
Экран поверх устройства (оплата)push(node, { modal: true })components/shell/screen-stack.tsx
Строка направления каталогаDirectionRowcomponents/kit/direction-row.tsx
Строка услугиServiceRowcomponents/kit/service-row.tsx
Строка папки документовFolderRowcomponents/kit/folder-row.tsx
Строка документаDocumentRowcomponents/kit/document-row.tsx
Группа строк под липкой подписью месяцаListGroupcomponents/kit/list-group.tsx
Плитка: знак на подложке, название, счёт — «Ещё», папкиFolderTilecomponents/kit/folder-tile.tsx
Поиск на месте: поле наверх, справа «Отмена», подсказкаSearchBarcomponents/kit/search-bar.tsx
Плавное сворачивание блока по высотеCollapsiblecomponents/kit/collapsible.tsx
Группа строк-переходов в одной карточке с линиямиNavGroupcomponents/kit/nav-group.tsx
Строка операции по счёту: сумма справаLedgerRowcomponents/kit/ledger-row.tsx
Окно под файл документаFilePlaceholdercomponents/kit/file-placeholder.tsx
Страница документа схемой, одна или из несколькихDocumentSheetcomponents/kit/document-sheet.tsx
Превью файла: лист вполовину, нажатие — во весь экранDocumentPreviewcomponents/kit/document-preview.tsx
Документ плиткой в ленте «Новые»: превью, название, путьDocumentTilecomponents/kit/document-tile.tsx
Размер плитки «Новых» по числу документовdocumentTileSizecomponents/kit/document-tile.tsx
Лента плиток документов во всю ширину экранаDocumentRailcomponents/blocks/document-rail.tsx
Плашка аккаунта: фото, имя заголовком, телефонAccountPlatecomponents/blocks/account-plate.tsx
Строка уведомления: знак, событие, чья · когдаNotificationRowcomponents/kit/notification-row.tsx
Строка приёма: услуга, врач, статус, суммаVisitRowcomponents/kit/visit-row.tsx
Остаток на счёте медкартыBalanceCardcomponents/blocks/balance-card.tsx
Клиника сети: адрес, метро, звонок, маршрутClinicCardcomponents/blocks/clinic-card.tsx
Карта схемой с меткой клиникиMapPreviewcomponents/kit/map-preview.tsx
Факт со знаком: часы, календарь, глобусIconFactcomponents/kit/icon-fact.tsx
Цена значением: «от» приглушённым, число черниламиPriceTagcomponents/kit/price-tag.tsx
Обводка выбранной строки — кольцом внутрьselect-ringglobals.css, @utility
Ведущий знак строки на подложке 40IconPlatecomponents/kit/icon-plate.tsx
Заголовок внутри карточки 16/20CardTitlecomponents/kit/card-title.tsx
Строка с плашкой знакаPlateRowcomponents/kit/plate-row.tsx
Пустое состояние и заглушка «ещё не собрано»EmptyStatecomponents/kit/empty-state.tsx
Оговорка под содержимым: линия и подписьFootnotecomponents/kit/footnote.tsx
Сообщение, которое надо заметить: красный островAttentionNotecomponents/kit/attention-note.tsx
Раскрывающийся список: подпись с шеврономDisclosurecomponents/kit/disclosure.tsx
Скорая помощь: граница ответственности и признакиEmergencyHelpcomponents/blocks/emergency-help.tsx
Вероятность забеременеть: плашка со ступеньюChancePlatecomponents/kit/chance-plate.tsx
Строка выбора карточкой: кружок, название, пояснениеChoiceRowcomponents/kit/choice-row.tsx
Строка с переключателемSwitchRowcomponents/kit/switch-row.tsx
Группа экрана с заголовком 20FormSectioncomponents/kit/form-section.tsx
Строка сводки записиSummaryRowcomponents/kit/summary-row.tsx
Доп. услуги к приёмуExtrasListcomponents/blocks/extras-list.tsx
Итог приёма: сумма, время, задатокBookingTotalcomponents/blocks/booking-total.tsx
Арифметика приёмаbookingTotalslib/booking-total.ts
Несовместимость услуг и её причинаconflictReasonlib/service-conflicts.ts
Правило клиники про день циклаcycleFitForlib/service-cycle-rules.ts
День цикла у выбранной датыCycleFitNotecomponents/blocks/cycle-fit-note.tsx
Окна времени кнопкамиSlotChipscomponents/kit/slot-chips.tsx
Дни врача, в которых есть окнаdaysWithSlotslib/demo-slots.ts
Текст к приёму «чтобы врач подготовился»VisitNotecomponents/blocks/visit-note.tsx
Длительность словамиdurationLabellib/booking-total.ts
Черновик записиuseBookingStorelib/stores/booking.ts
Плашка выбранной услугиServiceSummarycomponents/kit/service-summary.tsx
Карточка врача со свободным временемDoctorSlotCardcomponents/kit/doctor-slot-card.tsx
Календарь выбора дня записиMonthCalendarcomponents/kit/month-calendar.tsx
Липкая панель под шапкой экранаsticky-panelglobals.css, @utility
Острова экрана через 8island-stackglobals.css, @utility
Свободные окна врача на деньslotsForlib/demo-slots.ts
Ближайшее окно и почему его нетavailabilityForlib/demo-slots.ts
Строка про ближайшее времяavailabilityLabellib/demo-slots.ts
Врач ко времени: первый свободный в порядке клиникиfreeDoctorsAtlib/demo-slots.ts
Цена услуги: «от» до врача, его ступень приpriceLabelForlib/demo-services.ts
Длительность услуги: вилка до врачаminutesLabellib/demo-services.ts
Цена «от» у направления каталогаentryPriceForlib/demo-services.ts
День относительно сегодняшнегоdayRelativelib/format.ts
Дата с годом: «15 окт 2025»formatDayYearlib/format.ts
Поле поиска (кнопка, похожая на поле)SearchFieldcomponents/kit/search-field.tsx
Помощь сегодня: три варианта шторкойUrgentHelpSheetcomponents/blocks/urgent-help-sheet.tsx
Телефон клиники и его tel:clinicPhonelib/demo-medcards.ts
Аватар медкарты: снимок или инициалыMedcardAvatarcomponents/kit/medcard-avatar.tsx
Инициалы из имениinitialslib/format.ts
Шапка: назад или действие слева, название, действиеScreenHeadercomponents/kit/screen-header.tsx
Корневой экран раздела с крупным заголовкомRootScreencomponents/kit/root-screen.tsx
Цена в рубляхformatPricelib/format.ts
Тип и размер файла строкойfileMetalib/format.ts
Градиент блока «Нужна помощь сегодня?»help-heroglobals.css, @utility
Скрытая полоса прокруткиscrollbar-noneglobals.css, @utility
Открытый раздел и просьба открыть другойuseAppTabscomponents/shell/app-tabs.tsx
Кольцо цикла: один цикл кругом, день 1 сверхуCycleRingcomponents/kit/cycle-ring.tsx
Месяц цикла сеткой 7 × NCycleMonthcomponents/blocks/cycle-month.tsx
Возврат выбора на сегодняшний деньTodayButtoncomponents/kit/today-button.tsx
Строка-переход: заголовок, подпись-значение, шевронNavRowcomponents/kit/nav-row.tsx
Выбор из коротких вариантов чипами, одиночный и множественныйChoiceChipscomponents/kit/choice-chips.tsx
Отметки одного дня цикла: выделения, боль, симптомыCycleDaySheetcomponents/blocks/cycle-day-sheet.tsx
Ступенчатый ввод числаSteppercomponents/kit/stepper.tsx
Легенда цикла: вид дня и его происхождениеCycleLegendSheetcomponents/blocks/cycle-legend-sheet.tsx
Справка про базальную температуруBasalTemperatureSheetcomponents/blocks/basal-temperature-sheet.tsx
Модель цикла: отметка месячных и настройкиuseCycleStorelib/stores/cycle.ts
Лицо врача у своей записи — заглушка показаdoctorWithDemoFacelib/demo-doctors.ts
Шапка главной: цветное поле от верха экранаHeroBackdropcomponents/blocks/hero-backdrop.tsx
Вид системной полосы: тон глифов и скримuseChromeClaimcomponents/shell/app-chrome.tsx
Верх экрана входа: знак W, заголовок, пояснение по центруSignInHeadercomponents/kit/sign-in-header.tsx
Поле телефона: маска +7, подпись сворачивается в фокусеPhoneFieldcomponents/kit/phone-field.tsx
Код входа по ячейкамCodeCellscomponents/kit/code-cells.tsx
Согласие мелким текстом со ссылками на документыConsentNotecomponents/kit/consent-note.tsx
Системная цифровая клавиатура: заявка экрана, нажатияSystemKeyboard, useSystemKeyboardcomponents/shell/system-keyboard.tsx
Вход или приложение: оболочка до входаSessionGatecomponents/shell/session-gate.tsx
Оболочка до входа: стек без вкладок, корень — телефонSignInShellcomponents/shell/sign-in-shell.tsx
Маска номера телефонаformatPhonelib/format.ts
Как добраться: шторка с картой со строки «Где и когда»ClinicRouteSheetcomponents/blocks/clinic-route-sheet.tsx
Клиника, где принимает медкартаclinicOflib/demo-clinics.ts
Канал кода входа: Telegram или SMS — заглушка сервераsignInChannellib/demo-account.ts
Свободные деньги на счёте: хватает — задаток без оплатыfreeBalanceOflib/demo-account.ts
Причины записи в стоматологию по медкартеdentReasonsForlib/demo-dent.ts
Ветка записи в стоматологию: колл-центр, врач, времяdentNextSteplib/demo-dent.ts
Следующий экран записи в стоматологиюuseDentRoutehooks/use-dent-route.tsx
Клиника приёма по услуге: адрес и маршрутclinicOfServicelib/demo-clinics.ts
Клиника приёма одной строкой для «Где и когда»clinicNameForlib/demo-clinics.ts
Выбор врача услуги с ближайшим окномServiceDoctorsScreencomponents/screens/service-doctors-screen.tsx

Оболочка телефона

То, чего в вебе не бывает: системный хром и навигация стеком. Без них дизайн врёт про доступное место.

Корневой экран

Глубина стека: 0. Откройте экран, чтобы увидеть переход и то, как ведёт себя слой под ним.

Владельцы поведения

Сегодня в 14:30brand-hero
  • 393 × 852 — логический размер из макета. Высота ограничена вьюпортом, чтобы низ экрана не приходилось искать прокруткой страницы.
  • Строка статуса 54 и полоса смахивания 32эмулируются. Часы стоят неподвижно: живое время меняется между скриншотами, и два кадра одного экрана начинают отличаться в углу.
  • Навигация — стек, не страницы: push, pop, popAll. Двойник во Flutter — Navigator с теми же именами.
  • Нижний слой уезжает вглубь масштабом и прозрачностью. Оба приёма переносятся во Flutter один в один: Transform.scale плюс Opacity.
  • Неактивный слой не ловит нажатия и убран из дерева доступности: иначе скринридер читает два экрана подряд.

Блоки экрана

Собранные секции главной. Показываются внутри рамки 393: навбар в ширину ноутбука — это другой навбар, и он ничего не проверяет.

Навбар главного экрана — узел 56:5402 макета. 393 × 64, поля 16, содержимое отбито сверху на 8. Три элемента лежат стопкой, а не рядом: имя центрировано по экрану, а не между соседями, — иначе оно уехало бы влево на 10px, потому что аватары шире колокольчика. Центруется само имя, без шеврона: слева от него противовес шеврону с отступом, и шеврон висит справа.

Как в макетеОстров 377 × 64 в 8 от краёв, чернильная плашка в 24 % на градиенте шапки (правка 05.09.2026, узел 156:3746). Активный профиль 48 стоит слева и лежит поверх дальнего 40, перекрытие −20, белая обводка 2 — до правки активный был справа. Имя белое, под ним родство и возраст белым в 56 % (у владельца аккаунта строки нет; номер карты убран 29.09.2026). Шеврон у имени — тем же белым в 56 %, с 07.10.2026: белый перевешивал имя. Радиус в макете 40, но при высоте 64 он обрезается до половины высоты, то есть это таблетка. Метка непрочитанного — кружок 8 в точке (32, 8) от угла кнопки.
Длинное имяНастоящее имя с отчеством. Блок центрирован абсолютно, поэтому при росте лезет под аватары и колокольчик сразу с двух сторон. Ограничение 209px и обрезка многоточием: перенос в две строки выдавил бы номер карты, высота 64 задана макетом.
Без снимка и без непрочитанныхУ части пациентов фото не будет: инициалы на приглушённой подложке — намеренное состояние, а не поломанная картинка. Кружка на колокольчике нет вовсе, а не он серый.
Детская клиникаПереключатель клиники наверху витрины меняет бренд. Сам остров брендовых плоскостей не имеет — это чернила в 24 %, — а меняется поле под ним: с 05.09.2026 навбар лежит на градиенте шапки, и клиника приходит оттуда. Проверка в том, что остров и текст остаются те же.
Выбор медкарты

Фрейма в Figma нет — собрано по решениям из журнала прототипа. Переключается медкарта, а не «профиль»: слово изъято из глоссария, потому что означало сразу и аккаунт, и медкарту. Аккаунт живёт в «Ещё» и от выбора не зависит.

  • Две точки входа в шапке — стопка аватаров и имя. Это один и тот же вопрос «чья карта открыта». Нажатие по имени безопасно: блок ограничен 209px и занимает 92…301, до аватаров остаётся 8, до колокольчика 28.
  • Открытая помечена галочкой, а не цветом: цвет уже занят брендом клиники. В разметке — `aria-current`, а не `aria-selected`: это состояние приложения, а не выбранный пункт списка.
  • Вторая строка — родство и возраст, а не клиника и не номер. Клиника стояла на пяти строках из шести и не различала ничего (правка дизайнера 04.09.2026). Номер карты убран по итогам встречи 29.09.2026: клиенту он не нужен. Детская клиника видна сразу после выбора — в шапке и в теме экрана.
  • Шторка стоит в разметке всегда, а `open` меняется. Смонтированная уже открытой шторка не выезжает снизу — перехода из закрытого состояния в открытое просто не происходит. Шторка медкарт этим не страдала, а расписание врача страдало, пока его открывали через `{doctor ? … : null}`; починено 04.09.2026. Если содержимое пропадает вместе с закрытием, владелец держит снимок последнего значения — иначе оно исчезнет раньше уезжающей шторки.
  • Шторка живёт внутри рамки. Готовая обёртка портирует её в `body` и позиционирует `fixed`, то есть накрыла бы окно браузера. Здесь портал направлен в элемент рамки, а рамка несёт `transform-gpu` — без трансформации `fixed` снова отсчитывался бы от окна.
  • Подтверждающее действие — в закреплённом низу, а не липким элементом. Слот `footer` заведён 11.09.2026 у шторки дня. Разница не косметическая: липкий блок остаётся в потоке и накрывает последний ряд содержимого — ровно это и случилось, когда кнопка «Сохранить» закрыла собой ряд чипов, — а закреплённый лежит вне прокручиваемой области и занимает свою высоту. Заливка своя, `bg-popover`: `sticky-panel` красит панель в цвет страницы, а шторка белая. Волосяная линия над низом видна, только пока под кнопками есть содержимое (08.10.2026): в короткой шторке отделять нечего. Тем же проходом шапка шторки лишилась правого слота и второй строки: уточнения к имени и тем более действия живут в содержимом — «зачем ты объединил шапку даты и месячные, это отдельные сущности».
Шторка открытаПять медкарт: вы, муж, двое детей и мама. Смахивается вниз, закрывается по Escape и по нажатию вне. Выбор меняет шапку и тему всего экрана — проверяется на /app.
Карусель больших карточек

Пять фреймов макета — 56:5479, 56:5733, 58:6095, 75:6663, 75:6794 — это одна лента, а не пять блоков. Прокрути её пальцем или трекпадом, или встань фокусом и нажми стрелки влево-вправо.

  • Точки уехали из карточек в карусель. В макете они внутри каждого фрейма со своей активной — так и должно быть, фреймы это снимки состояний. В живой карусели точки показывают состояние ленты: оставь их в карточках, и при прокрутке поедут две пары точек сразу.
  • Промо стоит в той же ленте. У фрейма 58:6095 те же координаты и та же оболочка, а точки у него третьи. Значит это не баннер поверх экрана, а элемент очереди «что у меня дальше».
  • Детский приём приходит фиолетовым в той же ленте. Ровно тот случай, ради которого клиника сделана scope-классом на токенах, а не темой: на одном экране их две.
  • Кадр портрета у каждой карточки свой — 215×288, 221×296 и 231×310 со своими сдвигами, и только у первой зеркало. Соотношение у всех одно (0.747), значит обрезки нигде нет; это данные карточки, а не константа компонента.

Перед приёмом достаточно освежить верхнюю часть тела и область подмышечных впадин

Лента из трёх карточек — медкарта МарииПриём, промо и ещё один приём в одной очереди. Зелёное поле одно и стоит неподвижно, листается содержимое под маской — потяните ленту мышью, шва между карточками больше нет. Точки и стрелка тоже стоят на стекле: стрелка не уезжает, а открывает то, что сейчас в кадре, и её подпись меняется вместе с карточкой. Полоска точек с 04.09.2026 едет вместе с жестом: потяните ленту мышью и остановитесь на полпути — обе точки станут полутаблетками. До правки они рисовались по индексу активной страницы, а он приходит по доводке, и состояние менялось рывком уже после того, как карточка встала. Плашка стрелки непрозрачная — иначе сквозь неё читался бы заголовок проезжающей карточки. С 07.09.2026 у карусели второй носитель — предложения дня на экране цикла, и он попросил два новых свойства. Точки стоят не поверх кадра, а строкой под лентой (dots below): плашка предложения невысокая, и точки поверх неё легли бы на текст. И тон у них тёмный (dotsTone dark): белые точки на светлой панели не видны вовсе. На главной обе настройки остались прежними — кадр 254 в высоту, место внизу есть, и стекло под точками зелёное. С 07.09.2026 точку можно нажать, и лента переезжает на этот кадр той же плавной прокруткой, что и от стрелок клавиатуры. Рисунок точки не тронут: 3 пикселя нажать нельзя, поэтому мишень растит невидимый псевдоэлемент (tap-row-44) — 44 по высоте, а по ширине точка плюс половина отбивки. Квадрат 44 × 44 от tap-44 здесь не годится: вся группа 54 в ширину, мишени соседей легли бы друг на друга, и нажатие доставалось бы не той точке.

Осмотр перед вакцинацией проводится в день постановки вакцины

Лента из одной карточки — точек нет вовсеНе одна серая точка, а отсутствие индикатора: одна карточка — это не карусель. Состояние досталось от медкарты Ани, у которой приёмов ещё не было; после замены её на Ольгу оно живёт здесь, потому что у беременной лента из одной карточки была бы неправдой.
Медкарта без приёмов — первым кадром приглашениеЛента Нины: карту только что привязали, приёмов нет. Промо есть у каждой медкарты, поэтому пустой лента не бывает, — но первым кадром оказывалась рекомендация услуги, и для Нины это «Чекап для женщин 65 лет и старше · 49 495 ₽»: первое, что видит человек с только что поставленным приложением, было бы самой дорогой позицией прайса. Теперь первым стоит приглашение, рекомендация уезжает второй страницей. Оболочка та же, что у рекомендации: надстрочная строка в слоте даты («Пока записей нет» — состояние вместо «Завтра, 09:00»), заголовок, описание и белая плашка на 179. Плашка стала владельцем (HeroCtaPlate) — это её второе появление. Вторым проходом справа встал предмет: кадр был единственным в карусели без него — у приёма портрет врача, у рекомендации цена, у приглашения три текстовых блока на пустом градиенте. Это тот же glass-calendar, что у пустого состояния прошлых приёмов: состояние одно, и два предмета на одну мысль читались бы как две мысли; на одном экране они не встречаются. Колонка текста 240 вместо 280 — у стекла нет пустой трети, под которую заезжает текст у портрета; предмет на (268, 56), его центр совпадает с центром текстового блока. Заодно ушла пустота: описание при 240 кончается на 156 при плашке на 179, зазор 23 вместо 39 — ровно как у рекомендации. Крупнее 88 нельзя без нового ассета: файл 352 это 4× от окна 88, окно 120 просит сведения в 480.
Карта ведёт цикл, а отметок нет — второй кадр приглашает отметитьЛента Киры: приёмов нет, промо нет, цикл не отмечен. Кадр приехал сюда 05.09.2026 из колонки под лентой — правка дизайнера «может, правильнее про подбор даты от цикла отображать в верхней карусели на зелёном фоне? сделать для этого отдельный слайд?». Правка попала в живое место: белой карточкой под лентой приглашение собирало на первом входе два первых шага подряд, оба с белой кнопкой, и это нарушало правило HomeScreen «два пустых состояния подряд не показываем, призыв остаётся один — в карусели». В очереди кадр стоит после приёмов и до промо, и порядок содержательный: приёмы это факты, цикл про мои даты, промо про услуги клиники. От соседнего приглашения его отличают настоящее число в первой строке и надстрочная строка «Отметок ещё нет» вместо «Пока записей нет». Предмета справа нет намеренно: тот же стеклянный календарь на двух кадрах одной ленты читался бы как одна карточка, показанная дважды, — а в наборе четыре предмета и ни один не про цикл. Нажатие ведёт в календарь в режиме выбора первого дня, а не отмечает сегодня.

Перед приёмом достаточно освежить верхнюю часть тела и область подмышечных впадин

Шапка главной целиком — как у МарииУтверждено на встрече с клиентом 29.09.2026. Поле — тёмный болотный вместо «банковского» зелёного #25ae6a: тона фрейма «swamp color» (узел 222:4718) на 0.06 L темнее, край #536c20 — он же сплошной бренд, белым 5.94:1. Дата белая, значки фактов #b0bb99. Шеврон у имени у всех медкарт; под именем — родство и возраст, у владельца аккаунта пусто, номер карты убран. В кружке: у владельца фото, у ребёнка маскот, у остальных инициалы. На карточке приёма вместо стрелки — плашка «Детали о приёме». Сервисное сообщение — белая плашка без хвоста, до портрета врача не доходит; медицинская подсказка — пузырём от врача.
Подсказка в пузыре: почему две строки

Решение 31.08.2026: пузырь несёт авторскую фразу с бюджетом ~87 знаков, а полное правило подготовки живёт на экране приёма. Обрезка многоточием есть, но она страховка от ошибки, а не обычный путь.

Основание: из 13 настоящих правил подготовки в выгрузке клиники в две строки влезает одно. Шесть занимают три строки, пять — пять, одно — шесть. Ниже одно и то же правило к УЗИ брюшной полости в трёх видах.

Накануне УЗИ стоит отказаться от продуктов, вызывающих газообразование

Как в продукте: авторская фраза, 70 знаковДве строки, многоточия нет. Так и должно выглядеть: текст написан под бюджет. До линии фактов остаётся 23px.

Обязательно не кушать и не пить за 6-8 часов до обследования. Накануне избегать приема продуктов, которые вызывают газообразование: мучное, бобовые, овощи и фрукты, молочные продукты

Страховка: сырое правило клиники182 знака вместо 87 — в пузыре это пять строк. Показаны две, дальше многоточие. Здесь же видна цена: про голодание 6–8 часов и про список продуктов человек из карточки не узнаёт — он прочитает их на экране приёма.

Рост до трёх строк был собран и отклонён 31.08.2026: пузырь поднимался с 171 до 155, а факты кончаются на 148 — зазор падал с 23px до 7, то есть до касания. И правило всё равно обрезалось: из пяти строк было видно три. Чтобы зазор остался прежним, карточка должна была вырасти с 254 до 270. Параметра высоты у пузыря больше нет — 48 и только 48.

Портреты врачей на градиенте

Ассеты под карточку приёма, показанные на её же градиенте и в её высоте (254). Здесь решаются две вещи, которые на белом фоне не видны: нет ли светлой каймы от вырезки и одинаково ли посажены кадры. Переключатель клиники наверху меняет градиент — на фиолетовом кайма заметнее, чем на зелёном.

Барковская Анна
Алабушева Анастасия
Медведко Сергей
Ахмедов Махир
Клименко Лада
Хаматуллин Вильдан
Орлова Ксения
Николаева Анна

Портреты подставные: на них не изображены врачи, чьими именами названы файлы. Имена стоят для того, чтобы настоящие снимки легли на те же пути без правки кода. Специальности, стаж, адреса, цены и слоты в демо-данных — настоящие, из выгрузок клиники. Клиент своих врачей узнаёт, поэтому в показе это надо называть вслух.

Аватары врачей

Владелец — DoctorAvatar. Понадобятся в повторной записи и каталоге услуг: там врач упомянут, а не показан по пояс. Круг рисует вёрстка, а не файл. Первая выгрузка пришла с зелёным фоном внутри PNG, и он не подчинялся scope-классу клиники: на детском экране бренд фиолетовый, а аватар остался бы зелёным. Снимки заменены на прозрачные, цвет круга — bg-brand.

БАААМСАМКЛБД
Взрослая клиникаКруг #25AE6A приходит из области видимости, а не из пропа. Размер 48 — то же число, что у активного аватара в навбаре.
БАААМСАМКЛБД
Детская клиника — тот же компонентОтличие ровно в одном классе .clinic-kids на контейнере. У самого аватара пропа «клиника» нет: клиника в этой системе — scope-класс, а не свойство компонента.
БАБАЖАЖА
Размеры и заглушка40 и 48 — числа, которые уже есть в системе. Шкала дополнится, когда придут фреймы повторной записи со своими. Без снимка встают инициалы на серой подложке, а не на брендовой: белым по #25AE6A вышло бы 2.86:1.
Вся выгрузка: двенадцать лиц
AAAAAAAAAAAA

Восемь из двенадцати — те же люди, что на портретах по пояс: у файлов общий корень, и общий корень значит одно лицо. Шесть уже разобраны по приёмам, шесть в запасе. Аватары подставные, как и портреты.

  • Обрезка по кругу обязательна. Снимок квадратный, и плечи выходят за вписанную окружность: замер по всем двенадцати файлам — от 3.5 % до 14.8 % плотных пикселей лежат вне круга. Обрезку даёт сам примитив аватара.
  • Каймы от вырезки нет. Проверено композитом на #25AE6A с увеличением 4× по тёмным волосам и тёмному пиджаку — там кайма была бы заметнее всего. Отдельные волоски полупрозрачные и ложатся на фон без светлого контура.
  • Подложка аватара медкарты и круг аватара врача — разные вещи. У медкарт подложка в макете взята цветом самой фотографии (#c5c5c5, #e0ab38) и в систему не переносится. Брендовый круг — только у врачей.
Повторная запись

Узел 126:8445. Заголовок 20/24, гэп 16, карточки 288 с гэпом 8, в конце «Новая запись» 133. Лента прокручивается пальцем, мышью и трекпадом; снапа нет намеренно. С 10.09.2026 в ленте визиты, а не врачи: карточка называет услугу, по которой к врачу обращались, и ведёт на сборку приёма с заполненными услугой, врачом и доп. услугами того приёма. Цена в карточке — за названную услугу у этого врача, доп. услуги в неё не входят: их состав объясняет сборка, где они стоят отмеченными строками. Разбор — у VisitCard.

Повторная запись

Медкарта Марии — три прошлых приёмаТри приёма к трём врачам. Визитов было пять, и два из них к Барковской — первичная и повторная консультации гинеколога; дизайнер снял оба 10.09.2026, потому что в строчной раскладке обе обрезались в «…консультация гин…» и читались двумя одинаковыми кадрами подряд. Вместе с ними из данных ушли случай «один врач, два разных приёма» и единственный визит с доп. услугой — оба названы в demo-visits.ts, чтобы не обнаруживать их отсутствие заново. Содержимое ряда шире экрана, поэтому лента уходит под край экрана — с двух сторон одинаково. В покое первая карточка стоит на 16 слева, докрутив до конца последняя стоит на 16 справа, а по дороге обе проходят под краем. Обрыв по контейнеру, за 16 до края, читался бы как ошибка. Заголовок остаётся в поле.

Повторная запись

Медкарта Лёвы — детская клиника, один приёмКруги аватаров пришли фиолетовыми без единой правки в компоненте: цвет берётся из области видимости. Единственный приём занимает всю колонку, и с 10.09.2026 это одинаково на главной и на экране записи. Раньше на главной он оставался узким, потому что рядом стояла хвостовая карточка и ряд из двух был полон; хвостовая ушла — ушла и вторая половина условия. Дорожки здесь нет вовсе: листать нечего, а лента из одной карточки обещала бы продолжение.

Вы уже были

Тот же блок на экране записи — другой заголовок«Вы уже были» вместо «Повторной записи»: над лентой там уже стоит «Запись на приём», и второй заголовок про запись читался бы эхом первого. Вёрстка при этом ровно та же, что на главной, — с 10.09.2026 разницы между экранами у блока почти не осталось. Единственная: showBookingEntries. На главной он true, и при пустой истории блок превращается в приглашение записаться; на экране записи false, и блока просто нет — приглашение записаться внутри экрана записи это круг (замечание дизайнера 02.09.2026). Хвостовая карточка раньше пряталась тем же флагом, но 10.09.2026 её сняли на обоих экранах.

Прошлых приёмов пока нет

Выберите направление или напишите нам

Медкарта Игоря — прошлых приёмов ещё не былоБлок не исчезает, а превращается в пустое состояние с действием (узел 146:13133): иллюстрация 88, заголовок, подпись и кнопка во всю ширину. Третья раскладка за день — до неё была строка со знаком слева и шевроном справа, потом баннер по образцу «Нужна помощь сегодня?». Причина не в красоте: у первых двух версий не было названного действия, нажималась вся карточка молча. Теперь нажимается только кнопка — вложенные кнопки это спор о том, куда попал палец. Кнопка вернула в продукт градиент brand-cta, который остался без носителей, когда предложение услуги стало строкой. Блик по кнопке был и снят 05.09.2026: арт-директор сказал, что проход по зелёным кнопкам выглядит дёшево и не современно, — утилита sheen удалена целиком. Подпись изменена против макета: «или напишите нам» вместо «или врача» — макетная строка дважды про то, что человек уже знает, чего хочет, а частый вопрос обратный. Полная прототипная формулировка не влезает: 320 из 329, запас 9 пикселей.

Пока тихо

Напомним о приёме и сообщим о документах

Уведомления приходят по всем вашим пациентам

Уведомления — пустое состояние без островаЭкран за колокольчиком, собран 04.09.2026. Тот же владелец EmptyState, вид empty, но island={false}: остров есть у блока и не нужен экрану — довод из AppCard, карточка это группа, а не элемент группы. Пустая лента прошлых приёмов слева стоит среди других блоков главной, и остров отделяет её от соседей; здесь пустое состояние — всё содержимое, и белая карточка отделяла бы пустоту от пустоты. Предмет крупнее: 144 против 88 — на экране целиком 88 читается как иконка, потерянная в поле. Файл следует окну: glass-bell сведён в 576, то есть 4× от 144, а не 352 как календарь под окно 88. Текст прошёл три захода: четыре строки из концепта, потом одна («слишком много текста»), потом две («уж слишком сократил»). Длина выбрана замером рваности при колонке 329: первая фраза в 57 знаков оставляла на второй строке одно слово — 20 % ширины; вариант «о готовых документах» помещался в строку, но с запасом 11 пикселей и на другой гарнитуре сломался бы обратно. Взяты 81 % и 90 % — обе строки в одну, обе с запасом. Кнопки нет намеренно: выхода из пустоты не существует, уведомление не создаётся человеком, а настройки уведомлений стоят в шапке экрана. С 06.10.2026 лента собрана, и пустое состояние — для аккаунта без событий; в демо лента общая на все медкарты, поэтому его видно только здесь. С 07.09.2026 у этого вида второй носитель — пустые «Документы»: то же содержимое без острова, тот же предмет 144, тот же второй файл под окно 144 (glass-folder). Отличие одно и оно от шапки: документы — корень вкладки, поэтому стоят на RootScreen с крупным именем раздела, и содержимое центрируется под заголовком, а не на всём экране (fill). Текст там выбран тем же замером: первый вариант первой строки занимал колонку 312 ровно, с запасом 0 пикселей, — снят по тому же доводу, по которому здесь сняли вариант с запасом 11.

Как это работает

  1. Выбираете врача и времяПокажем, кто чем занимается, сколько стоит приём и когда есть свободное время.
  2. Приходите в клиникуW Clinic, ул. Савушкина, д. 24. Работаем каждый день с 9:00 до 21:00.
  3. Документы приходят самиРезультаты анализов, заключения и договоры появятся в «Документах» после приёма — присылать ничего не нужно.
Медкарта Нины — в карте нет вообще ничегоНи будущих приёмов, ни прошлых врачей. Здесь блок повторной записи не показывается вовсе, а его место занимает «Как это работает»: правило из журнала прототипа — два пустых состояния подряд не показываем. Иначе на экране два приглашения с одной кнопкой: кадр «Записаться на приём» в ленте и карточка «Прошлых приёмов пока нет» под ним. Призыв к записи остаётся один, в карусели, поэтому кнопки в блоке нет. Это же и весь наш онбординг: концепт v0.7 предлагает отказаться от слайдера, тура и тултипов — объясняет пустое состояние, потому что оно стоит на пути, а не поперёк, не пропадает после первого запуска и исчезает само, когда объяснять стало нечего. Нумерация настоящая: три шага — последовательность, поэтому блок собран тегом ol, а номер стоит на подложке знака (IconPlate со ступенью номера) и соединён с соседним пунктирным рельсом. Пунктир здесь значит то же, что везде в системе, — «этого ещё нет»; в прототипе тем же приёмом показывали промежуток между приёмами, «который нужно закрыть». Без рельса блок читался стеной приглушённого текста: 112 пикселей muted против 60 чернил и ни одного графического элемента на весь остров. Рельс идёт с 56 до 88 при плашках на 52 и 92 — первый заход держал его внутри строки и давал 20 пикселей из 40, то есть два штриха вместо пути. Номер набран чернилами полужирным, как CardTitle: приглушённый на подложке muted давал 2.66:1, чернила — 16.04:1, брендовый тон проверен и хуже обоих (2.54:1). Шаги появляются лестницей (rise-in): задержка друг за другом в --duration-tap, как у колец триместра. Уместно потому, что экран разовый — он живёт, пока в карте нет ни одной записи. Флага «один раз за сеанс» нет намеренно: неактивная вкладка остаётся в разметке (invisible плюс inert), блок не размонтируется, и лестница на возврате не играет — только при смене медкарты, то есть когда блок и правда появился заново. Отличие от Игоря — у него приёмы есть, и там пустое состояние блока единственное на экране.
Границы карточки приёма

Всё настоящее, из выгрузки прайса. Слева норма: название целиком. В середине и справа — обрезка, и это обычное состояние, а не страховка: строка держит около двадцати пяти знаков (288 минус поля 32, минус портрет 40 и гэп 12), а в прайсе есть имена до восьмидесяти. Опознаётся услуга по началу названия плюс по имени врача под ним.
Имя врача в обрезку не попадает ни у одного: самая длинная фамилия 11 знаков («Гогичашвили», «Чебоксарова», «Поликарпова») плюс имя, а вторая строка набрана 12 и держит около сорока.

  • Нет истории — нет блока. Проверяется на Ольге: она в наборе новая. Заголовок «Повторная запись» обещает, что записаться можно повторно, а выбор с нуля — дело каталога.
  • Высота 96 задана, не считается. 96 = 16 + (40 + 8 + 16) + 16, то есть ровно под двухстрочное имя. Имя из одного слова дало бы 44, и карточки в ленте встали бы разной высоты.
  • Ширина «Другого врача» — 133, хотя содержимому хватает 104 (16 + подпись 72 + 16). Подозрительно равна остатку кадра после первой карточки, то есть может быть следом того, как фрейм тянули до края. Оставлено как нарисовано.
  • Специальность Волковой в макете — «Эндокринолог», а в каталоге клиники она «Акушер-гинеколог, врач ультразвуковой диагностики». Взята настоящая: правило «данные настоящие» выше совпадения с макетом. Эндокринолог в наборе есть — Бурмистрова Дарья.
  • Знак «Другой врач» — иконка edit из того же набора Iconsax, что колокольчик и глобус; обводка в файле переведена на currentColor. В макете её штрих #292D32, у нас `text-foreground` #161616 — разница неразличима, но названа.
Нужна помощь сегодня?

Узел 79:7078. Карточка 361 × 96, радиус 24, градиент тревоги под 75.1°, заголовок 18/24, подпись 14/16 в две строки, стеклянная иллюстрация 64. Единственная красная плоскость в системе — и она разрешена ситуацией, а не назначена для яркости: правило характера запрещает «красные плашки там, где ничего не случилось», а здесь случилось.

Как в макетеБлок не зависит ни от медкарты, ни от клиники: плохо может стать кому угодно. Поэтому цвет тревоги scope-класс не переопределяет — в отличие от карточки приёма.
В детской клинике — тот же красныйПроверка того, что цвет действительно не клиничен: класс .clinic-kids на контейнере, и ничего не изменилось. Если когда-нибудь изменится — значит блок пролез в бренд.
За карточкой — шторка с вариантами помощиКарточка обещает «три варианта — от ближайшего окна до врача на дом», и до 04.09.2026 не открывала ничего. Заголовок шторки не повторяет вопрос карточки: нажатие по ней и есть ответ «да», поэтому «Нужна помощь сегодня» утверждением было эхом — стало «Помощь сегодня». Подзаголовок «Выберите по состоянию — подписи подскажут» убран по той же причине: он объясняет интерфейс вместо того, чтобы работать, и обещает то, что вторые строки и так делают. Строки этой шторки — общий владелец SheetActionRow с 03.09.2026: такая строка стояла в трёх шторках, две из них были побайтово одинаковой разметкой, а третья (правка месячных) уже разошлась — значение справа набиралось приглушённой подписью вместо чернил. Свели в пользу чернил: справа стоит то, что человек получает, нажав, — цена, ближайшее время, номер, дата отметки, — а не пояснение к названию; приглушённой осталась вторая строка, она условие. Цену в этом слоте намеренно не отдали PriceTag: в одной шторке рядом стоят цена, время и телефон, и слот у них один — ступень 16/20 semibold сделала бы цену крупнее соседей по той же роли. Решение 7 концепта и состояние прототипа «Помощь сегодня»: три строки, и подпись у каждой отвечает не «что это», а «когда это выбирать» — человек, которому плохо, выбирает между состояниями «доеду / не доеду / не понимаю», а не между позициями прайса. Ближайшее окно считается по расписанию врачей той услуги, на которую строка и ведёт, а не написано текстом: строка, обещающая время, обязана говорить время, которое есть. Слово «ближайшее» из готовой подписи убрано — оно уже стоит в заголовке строки. Вызов на дом ведёт на шаг сборки, а не в особый экран заявки: услуга adminOnly, и шаг сборки сам показывает выход в чат. Звонок — ссылка tel:, потому что это действие устройства; номер показан через восьмёрку, как пишет клиника, а набирается через +7. Знаки вернулись правкой дизайнера: три текстовых абзаца подряд нечем сканировать, и шторка выбора читалась как страница текста. Часы и телефон взяты из замороженного прототипа и переведены в идиом набора — 24 × 24, currentColor, обводка 1.5, круглые стыки; той же дорогой в набор попала лупа. У вызова на дом стоит profile-circle из настоящего набора: дома в нём нет, а приедет человек. Кружок 40 на приглушённой подложке — тот же, что у карточки «Другой врач», и он же левый рельс списка. Цена замерена: брендовый знак на --muted даёт 2.54:1, ниже порога 3:1 для графики; та же пара уже стоит в пустом чате, у детской клиники она берёт 4.06:1. Значение стоит в строке заголовка, а не справа от всей строки: так подпись получает всю ширину колонки и перестаёт переноситься — приём из шапки карточки врача. Правка 12.09.2026 — «выглядит как технический экран, хочется больше промовости»: три строки весили одинаково, хотя варианты неравные, и цена 7 500 ₽ весила ровно столько же, сколько «завтра, 10:00». Ближайшее время стало карточкой с лицом врача — лицо тут не украшение: окно и так считается по расписанию конкретного врача, фамилия у приложения была и выбрасывалась, а обещание «завтра, 10:00» без имени ничьё. Поэтому nearestSlot теперь возвращает и врача. Цена берётся по ступени этого врача, а не по самой дешёвой в услуге: в одной карточке стоят лицо и число, и они обязаны говорить об одном человеке. Специальность отделена точкой, а не запятой: в каталоге она с прописной («Терапевт», «Врач УЗД»), а понижать регистр нельзя — «УЗД» и «Аллерголог-иммунолог» ведут себя по-разному. Цена названа: ни у одного из шести врачей этих двух услуг нет аватара в наборе, свободных файлов два, а правило «одно лицо на одного врача» переиспользовать их запрещает — встают инициалы, и шесть лиц надо догенерировать. У шторки появились подзаголовок и знак, два новых слота AppSheet. Подзаголовок отсюда один раз уже убирали — «Выберите по состоянию» объясняло интерфейс; сюда идёт то, чего человек не знает: «сегодня свободно 6 окон», а когда окон нет — «сегодня в клинике всё занято», и тогда строка объясняет, почему в карточке стоит «завтра». Знак — тот же стеклянный крест, что на карточке, которая шторку открывает. Лицо в карточке берёт demoFaceFor — функция заведена ровно под этот случай: у своей записи врач один, пустой кадр читается как недоделка, а в списках она не вызывается никогда. Решение дизайнера 12.09.2026 — «для демо можно любое из имеющихся». Ревью 14.09.2026, пять правок: красная заливка осталась только у острова — при раскрытом списке под ним вставал второй красный блок вдвое больше, то есть «красная стена» возвращалась; в списке красными остались заголовок и маркеры. «103» говорилось трижды, в плашке число убрано — «Звоните сразу». Острову дан знак телефона: он ссылка tel:, но без знака читался справкой, тогда как у строки «Позвонить в клинику» кружок с трубкой есть. Граница ответственности сказана через то, что есть: «экстренную помощь оказывает скорая» вместо «клиника её не оказывает» — отказ в шторке «Помощь сегодня» звучал не тем. Подпись карточки следует состоянию: когда сегодня всё занято, вместо условия «если можете доехать» встаёт «Ближайшее окно в клинике». Вертикали сведены: поля острова и раскрывашки с 12 на 16, текст встал на одну линию с карточкой. Проверка сняла одно подозрение: зона нажатия строк идёт от 40 против 52 у блоков, но кружок иконки стоит ровно на 52 — наружу выходит только область без заливки, и это правильно. Второй заход того же дня свёл шторку к одной грамматике: скорая стала такой же строкой PlateRow, как «на дом» и «позвонить» — ради этого у IconPlate и PlateRow появился тон alert, единственный тон знака со своей заливкой. Список признаков собрался в один лист без знаков в заголовках: две плашки со своими заливками давали лесенку из абзацев. Портрет в карточке стал вести колонку, как кружок ведёт строку, — до этого время и врач стояли за портретом, а цена начиналась от края карточки, и карточка выглядела съехавшей. Раскрывашка стала островом вместе с подписью: свёрнутой она стояла на белом сразу под строкой скорой и читалась продолжением списка строк, а не блоком; знак «инфо» у подписи пробовали и убрали — он читался предупреждением. Пары «зависит от того, как идёт» развёрнуты: условие слева, куда обращаться — значением справа, иначе пара читалась ответом раньше вопроса, и правый край шторки наконец говорит везде одно — что вы получаете. Карточка ужата до двух строк и кнопки: время с 24 на 20 (оно было крупнее заголовка самой шторки), строка «Ближайшее окно в клинике · 5 635 ₽» снята — она повторяла шапку, а цена ушла в подпись кнопки.
Детская медкарта — другие услуги и другой телефонНе тема, а содержимое: «Вызов педиатра на дом» 6 600 ₽ вместо «Вызова терапевта» 7 500 ₽, телефон 660-71-75 вместо 332-54-05, и первичная консультация педиатра с признаками острых заболеваний вместо терапевта. В прототипе эта шторка была захардкожена, и ребёнку предлагали вызов терапевта со взрослым номером — ошибка названа в его же журнале. Здесь всё берётся по клинике открытой медкарты — с 11.09.2026 и список признаков для скорой тоже.
Остров «Скорая помощь» и список признаковПравка клиента 11.09.2026: показать в шторке признаки, при которых надо звонить в скорую, а не ждать записи. До этого дня 103 стояли последней строкой в Footnote — то есть в слоте мелкого шрифта по построению: у владельца прямо написано, что оговорка снимает с себя внимание. Поэтому строка сменила не оформление, а роль: из примечания стала вариантом со своей причиной и своим действием. Часы клиники уехали туда же — «работаем с 9 до 21 и экстренную помощь не оказываем» одна мысль, и делить её между оговоркой и островом незачем; своей Footnote у шторки больше нет. Остров, а не четвёртая строка: три строки выше — выбор между состояниями, а человеку, которому нужна 103, выбирать не из чего, и своя поверхность говорит «это отмена выбора». Знака 40 слева у него поэтому нет — знак был бы рельсом того самого ряда. Цвет свой, --alert-soft / --alert-deep, замер 7.19:1: градиент help-hero сюда не годится, им нарисована карточка, которая эту шторку открывает. Список раскрывается, а не листается каруселью: карусель прячет длину, а человек ищет в списке себя, и «пролистал не всё» здесь стоит ровно того, ради чего список заведён. Раскрывашка одна на весь список, а не на каждый признак: пункт тут — одна строка текста. Закрыта по умолчанию: одиннадцать строк про скорую, открытых без спроса, и есть анти-референс «интерфейс, который пугает». Список при этом лежит на белом — первый заход уводил его внутрь острова, и на отрисовке вышла пунцовая стена в полторы высоты шторки; красным осталось то, что называет канал: заголовок, точки и слово «Скорая». Вторым проходом 12.09.2026 список разошёлся на два блока с именами — «Сразу звоните 103» и «Зависит от того, как идёт». Одиннадцать строк подряд читались документом именно потому, что в них смешаны два разных сообщения: первое требует действия и не требует раздумий, второе наоборот. Блоки — плашки на приглушённой подложке, а не белые карточки: шторка белая, и белая карточка на белом не поверхность, а невидимая рамка. Третьим проходом блоки разошлись и цветом: «Сразу звоните 103» переехал на --alert-soft и сомкнулся с островом над ним — остров называет канал, блок перечисляет поводы, — а второй остался приглушённым, потому что требует не действия, а разбирательства. Это второй заход на красный список: первый отменили в тот же день, когда красными были все одиннадцать строк и выходила стена в полторы высоты шторки. Знаков к симптомам нет намеренно: «потеря сознания», «судороги», «спутанная речь» — состояния, а не предметы, набор проекта состоит из интерфейсных вещей (часы, телефон, календарь, капля), и нарисованное состояние станет либо пугающим, либо милым — оба варианта бьют в анти-референс «интерфейс, который ставит диагноз или пугает»; плюс семь пиктограмм человечка подряд глаз перестаёт различать. Знак встал у блока: phone — это буквально «звоните», info — справка. С 14.09.2026 баннер над шторкой больше не красный: красный в системе значит границу скорой, а баннер ведёт в выбор способа записи — общий с 103 цвет размывал смысл самого 103. Новая тройка --help-to / --help-mid / --help-from даёт белым 4.70, 5.62 и 10.00:1 против 4.79 и 3.38 у красной, то есть подпись впервые берёт порог по всей длине. Градиент идёт светлым слева под текстом и тёмным справа под знаком, и это не вкус: знак двухцветный, при осветлении его зелень проходит через ноль контраста около 30 %, а на тёмном силуэт держит светлый корпус — 9.4:1. Сам знак с 14.09.2026 крупнее блока и обрезан его краем: круг перестаёт быть значком в углу и становится вещью, лежащей в блоке. Смещения считаны по файлу, а не подобраны: у знака 240 × 240 предмет занимает 160 × 158, то есть по 40 прозрачных пикселей с каждой стороны, и первый заход с отступами 12–16 резал поля, а не круг.
У ребёнка признаки своиИсточник детского списка — своя же страница сети «Врач на дом», где развилка опубликована таблицей «симптом / вызов педиатра / вызов скорой». Левая колонка в шторке уже отвечена тремя строками выше, поэтому показывается правая, и таблица сворачивается в список. Но не вся: у четырёх признаков колонки различаются условием, а не галочкой — рвота стоит в обеих, и разводит их не симптом, а то, как он идёт. Выкинуть левую половину значило бы отправлять в скорую каждого с кишечной инфекцией, поэтому такие признаки показывают обе стороны и стоят после однозначных. Взрослый и мужской списки написаны нами и клиникой не вычитаны: своей таблицы для взрослых у сети нет. Числовых порогов в них намеренно нет — «38,5» в детском стоит потому, что его напечатала клиника, а придумывать такой же порог для взрослых нельзя. Вычитка — за Дарьей Бурмакиной, тем же пунктом плана, что подготовка к исследованиям.
  • Контраст заголовка — 4.79:1 у тёмного конца градиента и 3.38:1 у светлого. 18/24 semibold стоит ровно на границе определения «крупный текст»: порог 3:1 он берёт, 4.5 для обычного — нет. Кандидаты в разделе «Контраст».
  • Подпись при 80 % прозрачности даёт 3.41…2.62:1 — не берёт ни один порог. Полная непрозрачность поднимает до 3.38…4.79, и прозрачность здесь ничего не значит смыслово: она только приглушает. Оставлено как в макете, решение за дизайнером.
  • Перенос подписи задан вручную, как в макете: «от ближайшего окна» / «до врача на дом». Естественный перенос при ширине 245 рвёт пару «от — до», которая и объясняет смысл: три варианта лежат между ближайшим окном и врачом на дом.
  • Иллюстрация вставляется в окно один в один. Файл 256 × 256 — ровно 4× от окна 64, кадр сведён при выгрузке. В макете снимок 112 сдвинут на (−44, −24) внутри контейнера 64; эти числа остались в public/illustrations/README.md, а не в компоненте — подгонка числами живёт до первой замены ассета.
  • Крупных цветных плоскостей на экране стало две — карточка приёма 254 и эта 96. Правило площади бренда не нарушено: вторая не брендовая. Но появится третья — правило надо пересматривать, а не добавлять молча.
Панель вкладок

Узлы 56:5525 и 56:5526. Ряд 393 × 53, пять вкладок по 78 через justify-between — отсюда и шаг 78.75 из макета. Внутри: знак 24, гэп 2, метка 12/14, отбивка сверху 8.

Как в макете — активна «Главная»Белая плашка 85, то есть 53 панели плюс 32 системной полосы: полоса смахивания лежит поверх поверхности панели, а не рядом. Панель поэтому передаётся рамке слотом, и залезть под полосу она не может — в HTML-прототипе именно это и случилось.
Другая вкладка — тот же механизмАктивность несёт только цвет: #161616 против #849999 у знака и метки. Плашка выделения в макете заготовлена у каждой вкладки (78 × 49), но полностью прозрачная, а знак у выбранной тот же — все пять иконок из набора nrm.
  • Откуда знаки. Три выгрузились сервером ассетов Figma: logo-w, message-text, more-2. Два — «Запись» и «Документы» — собраны в макете из отдельных векторных слоёв, и такие слои сервер не отдаёт вовсе: пять попыток, каждый раз «Error getting image». Их прислал дизайнер плоским SVG. Обводка у всех пяти переведена на currentColor, остальные атрибуты как в выгрузке: у папки у первого пути нет linecap/linejoin, и дописывать их нельзя — углы там держит miter.
  • Экрану осталось 713. Было 766: панель отняла 53 по-настоящему, а не легла поверх содержимого. Рамка обязана говорить эту правду — иначе дизайн врёт про доступное место.
  • Вкладки переключают экраны. С 02.10.2026 настоящий экран есть у всех пяти разделов, заглушек больше нет. Стек при смене вкладки сбрасывается: глубина есть только у главной, и четыре пустых стека держать незачем.
  • Знак «Ещё» повёрнут на 180° в файле, а не в вёрстке: в макете иконка повёрнута (узел 122:8340), и файл обязан быть тем, что видно. Иначе тот же поворот придётся не забыть во Flutter.
Беременность

Узлы 126:8466, 126:8491, 126:8516. Карточка 361 × 194 — те же числа, что у карточки цикла: блок встаёт на её место. Кольца 98 с шагом 94, обводка 4, дорожка --muted. Срок акушерский, от первого дня последних месячных, как считает врач в карте.

Ваш срок 5 недель

Первый триместр · роды 3 декабря

III
II
I
5 недельСостояние «1» макета. Дуга первого триместра 38.5 % — это 5/13, единственная дуга в макете, посчитанная по неделям. Остальные кольца пустые, и дуги у них нет вовсе: скруглённый конец при нулевой длине оставил бы точку — «немного началось» там, где не началось.

Ваш срок 20 недель

Второй триместр · роды 3 декабря

III
II
I
20 недельСостояние «2» макета и то, что стоит на демо-экране у Ольги. Первое кольцо залито целиком, второе на 50 % — 7 недель из 14. В макете эта дуга нарисована на 59.8 %, и ровно тот же путь стоит в третьем состоянии: два состояния из трёх рисовались на глаз.

Ваш срок 20 недель 3 дня

Второй триместр · роды 3 декабря

III
II
I
20 недель 3 дняТот же второй триместр, но срок не ровный: 20 недель 3 дня. Дни приписываются только когда они есть — на ровной неделе «0 дней» было бы шумом, и поэтому три состояния макета выглядят точно как в нём. Формат из обменной карты, как и сам акушерский срок.

Ваш срок 36 недель

Третий триместр · роды 3 декабря

III
II
I
36 недельСостояние «3» макета. Третий триместр на 69 % — 9 недель из 13. Цифра III потемнела и стала Medium, у прошедших триместров она приглушённая: активность несёт вес и цвет, а не размер.

Ваш срок 40 недель

Третий триместр · роды 3 декабря

III
II
I
40 недельПДР — 280 дней от точки отсчёта. Все три кольца полные, срок 40 недель. В макете этого состояния нет, но оно наступает у каждой беременности, и проверять его надо здесь, а не в проде.
Словарь кольца
I
I
I
II
II
II
III
III
III

Три триместра, у каждого пустое кольцо, дуга 35 % и полное. Цепочка видна на полных: конец первого равен началу второго, конец второго — началу третьего, поэтому три круга читаются как один путь от первых недель к родам. Дуга у всех начинается на девяти часах и идёт по часовой — так в макете, а не на двенадцати, как обычно.

  • Дуга, а не conic-gradient. Правило переносимости запрещает конический градиент: во Flutter его нет. Кольцо — обычный круг с stroke-dasharray, и на той стороне рисуется тем же путём. За это уже платили: кольцо цикла в HTML-прототипе пришлось переделывать ровно по этой причине.
  • Заполнение идёт лестницей при появлении экрана. Каждое кольцо 320ms, задержка по 120ms — та же длительность, что у нажатия: заводить четвёртую ради лестницы незачем. prefers-reduced-motion гасит анимацию глобальным правилом, и кольца сразу оказываются заполненными.
  • Дуги второго и третьего состояний в макете одинаковые — один и тот же путь на 215.4°, то есть 59.8 %. Ни 20 неделе (50 % второго триместра), ни 36 неделе (69 % третьего) он не соответствует. Здесь дуги считаются из недель; формула проверена по единственному посчитанному состоянию макета — 5 недель дают ровно 5/13.
  • Один цвет нормализован. В макете второе кольцо начинается с #0a97ff, а первое кончается на #0099ff — разница (10, −2, 0) по каналам, неразличима. Заведена цепочка из четырёх стопов, и стык стал точным: держать два почти одинаковых значения значило бы разорвать цепочку в коде, оставив её склеенной на глаз.
  • Стрелка в углу вернулась (правка дизайнера 01.09.2026), хотя в макете слой у всех трёх состояний hidden — из-за этого её сначала и не было. Решение общее с карточкой цикла: два блока делят место на экране, и угол у них выглядит одинаково. Знак 24 приглушённым цветом, высота заголовка та же 48.
    С 05.09.2026 это знак, а не кнопка: по правке «тап по всей области виджета» экран открывает вся карточка (CardTarget). До 03.09.2026 обработчик не передавался и мишени не было вовсе — вести было некуда; теперь карточка открывает экран «Моя беременность».
  • Дни срока и ПДР добавлены к макету (решение дизайнера 31.08.2026). Заголовок теперь срок, а триместр и дата стоят второй строкой одним кеглем 14/16 через точку. Три захода: в макете обе строки 18/24, и дата рядом с триместром дала два приглушённых текста разного кегля вплотную — размер оказывался единственным различием, и это читалось как сбой вёрстки. Порядок «число сверху» ещё и не спорит с кольцами: триместр они уже называют активной цифрой, а срок больше нигде не написан. Высота заголовка макетная: 24 + гэп 8 + 16 = 48.
  • Дата, а не обратный отсчёт. Роды в срок наступают между 37-й и 42-й неделей, поэтому «осталось 140 дней» обещало бы точность, которой нет, и спорило бы с правилом характера «никаких счётчиков». Если подпись должна нести оговорку сама — «роды около 3 декабря» или «ПДР 3 декабря», это одно слово.
  • Срок — завершённые недели, а не начатые. Первый заход считал начатые, и на демо-дате выходило 21 вместо 20. Врач пишет «20 недель 3 дня», то есть двадцать недель прошли.
Что осталось расхождением
  • Контраст. Номер карты — #849999 при 14/16, на фоне страницы это 2.57:1 вместо 4.5. На белой карточке было 3.00, здесь хуже: фон страницы темнее белого. Это первое место, где нерешённый вопрос по палитре виден на настоящем блоке.
  • Подложка аватара под снимком в макете задана цветом самого снимка (#c5c5c5 и #e0ab38). Хардкодить их в компонент нельзя — это цвет конкретной фотографии, а не системы; пока там приглушённая подложка, и она видна только пока снимок грузится.
  • Нажатие по стопке аватаров ведёт на смену профиля, по колокольчику — на уведомления. Экранов ещё нет, поэтому обработчики пустые.
Прививки

Блок состояния детской карты — на том же месте, что карточка цикла у взрослой. Решение концепта v0.6: «позиция под ближайшим приёмом — это место причины вернуться, и у родителя она тоже есть». Референс свой: фрейм 75:6728 и собранный блок в замороженном прототипе; среди 71 скриншота конкурентов прививок нет ни у кого. Пройденных прививок в блоке нет — правка дизайнера сразу после первой отрисовки, «может, пройденные прививки не имеет смысла отображать в виджете?». Блок состояния отвечает на «что сейчас», а сделанные прививки — на «что было», и это вопрос экрана, где под них лежит раздел из девяти строк; историю в блоке называет подпись со счётом. Правило вышло одно: есть план — показываем план, нет — показываем историю. Освободившееся место отдано второму пункту плана, а не воздуху: 224 против 288 до правки. Форму дизайнер выбрал из трёх — строки плана, а не полоска плиток из макета: те шесть плиток не были данными (в прототипе шапка говорила «три прививки в карте», а сертификат в той же карте — «девять с рождения»), а анонимные кружки нельзя прочитать без легенды. Креста из макета нет: красный крест против непоставленной прививки читается как выговор родителю, а правило 8 свода интонации запрещает приложению медицинские оценки — и пропуска приложение всё равно не знает, отвод и прививка из поликлиники выглядят в данных одинаково. Приложение не считает, когда пора: окно («в 6 лет») и его последний день приходят с планом от клиники, потому что правила календаря — медицинское решение врача, а не арифметика по дате рождения.

Прививки

9 записей в карте клиники

Корь, паротит, краснухав 6 летЗаписаны на 17 июля, 14:00Гриппсезон с сентября
Запись уже есть — кнопки нетСостояние Лёвы на демо-дате: осмотр перед вакцинацией записан на 17 июля, 14:00, и блок про действие молчит. Строка плана говорит «Записаны на 17 июля, 14:00», кнопки нет вовсе — приём уже лежит кадром в ленте со своей мишенью, и вторая кнопка на тот же визит была бы вторым обещанием. Правило из прототипа: главная показывает состояние, лента — события. Запись приписана только первому пункту: визит один, и приписать его двум значило бы обещать две прививки за один осмотр — что ставить, решает врач. Пунктов показывается до двух, дальше — экран: блок не должен становиться его копией.

Прививки

9 записей в карте клиники

Корь, паротит, краснухав 6 летГриппсезон с сентября

Осмотр педиатра и прививка — за один приём · 30 минут

План есть, записи нетПоявляется кнопка и строка условия. Кнопка ведёт на осмотр педиатра, а не на вакцину: у всех детских вакцин в выгрузке стоят adminOnly и needConsult, а правило клиники сказано дословно — «осмотр перед вакцинацией проводится в день постановки вакцины». Какую вакцину ставить, решает врач на осмотре. Тон soft: над блоком стоит белая «Записаться на приём», и вторая главная кнопка спорила бы с ней за нажатие. Длительность из прайса, а не числом в разметке.

Прививки

9 записей в карте клиники

Медотводдо 1 сентябряпосле болезни
МедотводОтвод занимает место плана, а не стоит рядом: пока он действует, следующего пункта у ребёнка нет, и два «дальше» в одном блоке — это два разных ответа на один вопрос. Дата и причина словами клиники, без диагноза. Кнопки нет: записаться в отвод нельзя, а спросить — разговор, и он живёт на экране за блоком. Карточка вышла в одну строку, и это не недоделка: «отвод до 1 сентября» и есть всё состояние, а добирать высоту историей значило бы показывать прошлое там, где спрашивают про сейчас.

Прививки

9 записей в карте клиники

Грипп15 окт 2025Ветряная оспа12 фев 2021Корь, паротит, краснуха25 янв 2021
Плана нет — только историяГибрид, который выбрал дизайнер: пришёл план — блок показывает план, не пришёл — историю. Так блок работает и до того, как приедут правила календаря от врача, — и это единственное состояние, где история в блоке вообще появляется. Три строки, а не две: показывать нечего дальше, и три последние записи хотя бы отвечают на «когда были в последний раз». Данных нет вовсе — блока нет: пригласить родителя «отметить прививки» самому нельзя, это медицинская запись, а не отметка месячных.
ЗаписьБлоки экрана записи. Каталог направлений показывается целиком: кнопки «Все направления» и второго экрана за ней больше нет — правка дизайнера 02.09.2026.

Запись на приём

Корневой экран раздела: заголовок слева, потом в шапкеПравка дизайнера 03.09.2026 по референсам Superpower: крупный заголовок в левой части, а при прокрутке — компактный по центру, как было. Вместе с этим заведена верхняя ступень шкалы, которой не было: text-display 28/32. Не 34, как в iOS, и не 24 — замер по глифам референса даёт отношение заголовка к подзаголовку 1.54, а наши подзаголовки набраны 20 против их ≈16, поэтому копировать абсолютное число нельзя: 28 даёт отношение 1.4 и остаётся спокойным. Порог переключения 16 — компактный проявляется, когда крупный начал уезжать, а не когда уехал совсем. Копия в шапке скрыта от скринридера: имя экрана незачем читать дважды. Полоса шапки лежит поверх содержимого и проявляется целиком, вместе с подложкой: первый заход держал её в потоке, и заголовок начинался на 118 вместо 78 — дизайнер отменил это сразу, «зачем сверху пустое пространство такое?». При развёрнутом заголовке в полосе действительно нечего показывать: на корневом экране нет ни «назад», ни действия. Слева — как экран выглядит сверху, справа — после прокрутки.

Гинекология

20
Шапка с «назад» и действиемТак шапка выглядит на вложенном экране — например на направлении со списком врачей. Знак «назад» — тот же шеврон, повёрнутый на 180°: своего знака в наборе нет, а выдумывать за Iconsax нельзя.

Чат с клиникой

Обычно отвечаем за 15 минут
Шапка корня вкладки: действие слеваЧат, 07.10.2026. Корень вкладки «назад» не имеет — в чат приходят переключением вкладки из восьми мест, и стек прежней вкладки сохраняется, — поэтому левый слот свободен, и в нём стоит поиск (leading). Звонок справа: два действия разведены по краям, а не стоят парой. Вместе с onBack слот не ставится — побеждает «назад».

Мой цикл

Июль 2026
Шапка со второй строкой и парой знаковЭкран цикла, 11.09.2026. Вторая строка называет факт, который нужен на экране постоянно, а не пересказывает заголовок: «Июль 2026» — подпись к экрану, а не раздел внутри него. Пара знаков в слоте действия допустима, третьего там уже не будет: название ограничено полями 80. Название при этом не едет — оно стоит по центру полосы, а не между мишенями. Два числа этой шапки записаны правилом, а не раскладкой. Первое: содержимое слота кончается на 16 от края, зеркально «назад», у которого знак начинается на 16. Раньше это держалось центрированием в коробке 40 и ломалось на всём, что шире сорока, — текстовое действие и пара знаков прижимались к полю 8. Второе: зазор между знаками 16, и это мишени, а не воздух. У знака в шапке место в раскладке 24, а область нажатия 40 — она растёт отбивкой наружу, — поэтому при зазоре меньше 16 мишени перекрываются и нажатие у края одного срабатывает на соседнем. 16 — ровно та граница, где они встают встык.
МККто идётМария Ковалёва

Не знаете, к кому?

Опишите, что беспокоит, — администратор подскажет специалиста и подберёт время

Пациент, поиск и выход в чатТри поверхности: белая — содержимое, стеклянная — контрол, страница — ни на чём не «висит». Собралось за четыре правки дизайнера в один день. Поле поиска было белым (сливалось с островами), потом обведённым серой рамкой 3.20:1 (тяжело), теперь стеклянное: заливка white/50 и обводка white/70. Приём принесён с тёмного интерфейса, и цена замерена съёмкой пикселей: на светлой странице заливка сводится к #f3f6f7 — 1.07:1 к странице и 1.09:1 к белой карточке, обводка к #fbfdfd. Поле встаёт ровно посередине между страницей и островами; работает, но держится на сотых долях контраста, и границы 3:1 у него больше нет — признаком поля работают лупа и подпись. Врезка «Не знаете, к кому?» прошла тот же путь и вернулась к белому, а 05.09.2026 её свёрстали заново — «не нравится, как свёрстана карточка». До правки шеврон висел один в `justify-between` (подпись 110 пикселей растянули в полосу во всю ширину, чтобы прижать к её концу знак), а левых краёв было два: знак чата 24 сдвигал заголовок на 32, подпись и строка действия начинались от 16. Теперь форма та же, что у приглашения цикла — заголовок, строка объяснения, мягкая кнопка, — и мишень переехала с карточки на кнопку по границе из `AppCard`: есть `onPress` — мишень, нет — факт. От карточки услуги врезку отличает набор (18 полужирным против 16 обычного) и названное кнопкой действие; знак чата ушёл вместе со шевроном, и это цена, а не улучшение. Замер роста: 124 → 152, вся разница — кнопка 48 против строки 20. #eaf3f3 поверхностью не взяли по замеру — от страницы 1.02:1, тот же «сливается». Аватар 40: экран записи — место, где ошибка «записал не того» стоит дороже всего.
Поиск: кнопка на записи и поле на своём экранеПоверхность одна, разметка разная. На записи стоит кнопка, которая выглядит полем: по тапу открывается экран поиска, и ввод живёт там — клавиатура забрала бы половину экрана записи, а результатам нужна вся высота. На экране поиска — настоящий input с фокусом при открытии. Человек нажал на поле и должен оказаться в поле, поэтому у обоих одна поверхность, и с 04.09.2026 у неё есть владелец glass-field: 50 % белого заливкой, 70 % обводкой. Замеры к нему и привязаны — на странице #e7efef заливка сводится к #f3f7f7 (1.08:1), то есть поле держится на сотых долях контраста, и признаком поля работают лупа и подпись. Крестик появляется вместе с текстом и только очищает: закрывает экран «назад» в шапке. В прототипе он делал и то, и другое, и это ловушка для того, кто хотел набрать другой запрос.
МД
Михеева ДианаАкушер-гинекологW Clinic, ул.Савушкина, д.24
МН
Мишарова НадеждаАкушер-гинеколог, врач УЗД · стаж 12 летW Clinic, ул.Савушкина, д.24
Врач тремя строкамиИмя, специальность со стажем, место приёма. Владельцем стала 04.09.2026, когда та же тройка понадобилась третий раз: шапка шторки расписания, экран врача, строка результата поиска. Стаж приписан к специальности, а не отдельной строкой: в каталоге он указан не у всех, и пустая третья строка выглядела бы пропущенным полем. Лица есть у десяти врачей из 82 — у остальных инициалы на приглушённой подложке, и это не заглушка, а состояние: снимки подставные, второе лицо на одного врача заводить нельзя. Аватар 48 — та же ступень, что в шторке; своей ступени 64 в наборе нет. Карточка врача со временем (DoctorSlotCard) этим владельцем не пользуется намеренно: там у имени цена справа, а вся шапка — мишень к расписанию. Общая у них тройка текстов, а не поведение.
Строка направления — четыре состоянияСтрока 72: знак 48, отбивка 12 — сжата с 88 по правке дизайнера. Название 16/20, приглушённая строка «счёт · цена от». Счёт бывает двух видов: у специальности — врачей, у группы услуг — услуг. У анализов «158 услуг» единственный осмысленный счёт: фамилии в прайсе указаны у двух позиций из 158, и «2 врача» было бы правдой про данные и ложью про направление. У причин записи в стоматологию вместо чисел — подпись клиники к причине, а где её нет, второй строки нет вовсе (13.10.2026): свою подпись не придумываем. Третья строка — состояние «знака нет»: пунктирное окно вместо тихой пустоты. С 03.09.2026 у него больше нет носителя в данных — знак есть у всех тридцати двух направлений, — поэтому знак здесь снят руками. Состояние живое: оно встретится любому новому направлению, пока под него не сгенерирован предмет, и проверять его больше негде, кроме витрины. Четвёртая — срочная (urgent, 13.10.2026): «Острая боль» в стоматологии стоит в красной рамке тревоги — тот же красный, что у «Скорой помощи 103». Мягкую красную заливку пробовали на медкарте Лёвы: рамка заметна и не кричит, оставили её.
Поиск на местеSearchBar по образцу «Файлов» iOS (01.10.2026). В покое — стеклянное поле в содержимом. По нажатию поле становится белым, экран сворачивает крупный заголовок (RootScreen titleHidden) и строку медкарты (Collapsible), поле встаёт наверх и прилипает, справа выезжает «Отмена» — текстом брендового цвета, 16 px, ширина по слову. Внутри поля — своё «очистить», пока есть текст. «Отмена» выходит из поиска и сбрасывает запрос. Второе поле — чат (07.10.2026): в содержимом поля нет, его открывает лупа слева в шапке, поле встаёт на место шапки, курсор сразу в нём (autoFocus). Подсказка с hints — «Искать по …», последнее слово сменяется подъёмом (rise-in) раз в 2,2 с: словам, дате, автору. Пока в поле текст, подсказки нет.

Вход

Введите номер, указанный при регистрации в клинике. Пришлём код в Telegram или по SMS

Телефон

Продолжая, вы принимаете и даёте

Вход: телефон и кодЭкраны входа (08.10.2026), по референсу Givingli: всё по центру, одно действие, согласие прижато к клавиатуре. SignInHeader — «назад» от ScreenHeader, под полосой шапки знак W 44, заголовок text-display-lg 32/36 и пояснение 16/20; блок стоит на одном месте с клавиатурой и без. PhoneField — белое поле 56 с рамкой line-strong, в фокусе обводка брендом; в покое подпись «Телефон» и «+7», в фокусе или с цифрами подпись сворачивается (Collapsible), номер крупнеет до 20; маска formatPhone. Кнопка неактивна до десятой цифры. ConsentNote — подпись 14, названия документов ссылками. Клавиатура — SystemKeyboard из оболочки: экран заявляет её, пока поле в фокусе (useSystemKeyboard), рисует рамка; во Flutter это клавиатура ОС. CodeCells — четыре ячейки 56 × 64, следующая с курсором и обводкой брендом, при ошибке все красные; проверка сразу после четвёртой цифры, повтор отправки через 59 секунд. Канал кода выбирает сервер (встреча 09.10.2026): номер есть в базе Telegram-бота — «Отправили код в Telegram — в чат с ботом клиники», нет или бот заблокирован — «Отправили SMS на …»; повтор уходит тем же каналом. В демо заглушка сервера signInChannel: в базе бота только номер Марии. В демо подходит любой код, кроме 0000.
Плитка: «Ещё» у Марии и папки в витринеС 07.10.2026 папки у всех списком: плитки в «Документах» выключены, признака documentsGrid нет ни у одной медкарты, варианты остаются здесь. Тот же FolderTile с плоским знаком — «Счёт» и «Приёмы» в две колонки из пробы «Ещё» (07.10.2026, с 12.10.2026 выключена), первый ряд. Дальше — папки, как были у Ольги (06.10.2026): плоский знак Lucide по смыслу папки на подложке 40, той же, что у строк документов. Приёмы — календарь, Анализы — пробирка, Заключения — планшет с галочкой, Исследования — рамка сканирования, Договоры — лист с ручкой, Справки — печать. Штрих 1.5 вместо 2 — под вес Iconsax. Точки «есть новые» на папках нет: новые документы отмечены в «Новых». Сетка по числу папок: 3, 5 и 6 — в три колонки, 1, 2 и 4 — в две (large). Ниже — пробы 01.10.2026, сейчас ни у кого: нарисованная папка из трёх слоёв тона бренда (задняя стенка по маске folder-back.svg, лист, передняя стенка) и объёмный знак sign-folder, у «Приёмов» — sign-calendar. У них точка, если её передать, стоит перед названием, а название центруется само по себе.

Июль

Декабрь 2025

Документы: папка, документ, группа месяца«Диск клиники» (01.10.2026): папки системные, их раскладывает клиника по данным МИС. FolderRow: знак в плашке бренда — у Марии и Лёвы свой знак Lucide по смыслу папки, у остальных общий folder; название до двух строк, «сколько · когда последний». Точка «есть новые» — на краю подложки, как у DocumentRow; экран её на папки не передаёт, новые документы отмечены в «Новых». DocumentRow: знак листа; у неготового он приглушён, а в подписи назван срок — «Будет готов до 17 июля», а не «в работе». В поиске и в папке «Новые» вторая строка говорит, где документ лежит: «Приём 2 июля · Акушер-гинеколог» или «Анализы · 15 июля»; у договора без подписи — «Ждёт подписи». Сам блок «Новые» на экране с 07.10.2026 — лента плиток, пример ниже. ListGroup: подпись месяца капителью прилипает к верху, пока листается группа.
Документ: превью и листФайла в прототипе нет, и вместо окна «Здесь откроется сам документ» с 06.10.2026 стоит первая страница схемой. DocumentSheet — лист A4: шапка клиники со знаком W и адресом, название, «Пациент», «Дата», «Врач», дальше текст полосами — таблицей у анализа, абзацами у остального; внизу место подписи. Многостраничный (pages в демо-данных, 08.10.2026: заключение гинеколога, протокол кольпоскопии и договор Марии — по две): первая страница continues — текст до низа, без подписи, строка, что не влезла, не режется; следующие continued — без шапки, подпись на последней. В превью только первая, в подписи «PDF · 2 страницы»; листают в просмотре, страницы одна под другой. Настоящие только данные, цифр анализов нет. DocumentPreview рисует лист в ширину 360 и уменьшает вдвое, поэтому превью и полный просмотр переносят строки одинаково; нажатие открывает DocumentViewerScreen — страницы во всю ширину, «Скачать» и «Поделиться»; у правовых документов «Поделиться» нет (share=false, встреча 09.10.2026), «Скачать» тогда главная. Тем же превью показана лицензия в «Документах клиники» правовой информации, но страницами-сканами с сайта клиники. У Ольги проба без превью — пример в соседнем блоке. Во Flutter на этом месте просмотрщик PDF.
Документы без превью и без папок — проба у ОльгиВстреча 09.10.2026: клиент считает превью лишними — они занимают экран, а для них документы пришлось бы хранить у каждого пользователя; папок из Реновации может не быть, документы придут одним списком. Оба варианта у Ольги, у остальных прежний экран. documentsNoPreview: «Новые» строками DocumentRow — три и «Все N», а на экране документа вместо листа NavRow «Открыть документ» с форматом и числом страниц, нажатие — тот же просмотр. documentsNoFolders: вместо «Папок» секции по месяцам — заголовок месяца тем же стилем, что «Новые», под ним строки; в поиске нет чипсов типа (DocumentSearch chips=false). Ниже — документы Ольги из демо-данных.
«Новые» — лента плиток, размер по числу07.10.2026, по референсу витрины с каруселью. Готовые за 14 дней, до шести в ленте; «Все N» в заголовке — только когда в ленту попали не все. Плитка DocumentTile: сверху превью листа на приглушённой подложке (тот же DocumentSheet, что на экране документа, уменьшенный в пять раз), под ним название до двух строк и где документ лежит; точка «новое» — в углу подложки. Размер выбирает documentTileSize, правило «влезает — стоит ровно, не влезает — листается с подсказкой»: один документ — карточкой набок во всю ширину (превью 96 × 112 слева, текст 16 и 14), два — пополам без прокрутки, от трёх — по 160: две целиком и третья выглядывает на ~40, видно, что лента листается. DocumentRail — горизонтальная прокрутка во всю ширину экрана, мышью тоже. В демо: один у Игоря, восемь у Марии; у Ольги с 09.10.2026 «Новые» строками — проба без превью.

Сегодня

Вчера

Уведомления: строка и деньЛента собрана 06.10.2026: один список по дням без вкладок, общий на аккаунт — у строки подписано, чья медкарта. Три вида из договора: напоминание о приёме (знак календаря), готовые документы (лист), ответ в чате (сообщение). NotificationRow — та же форма, что DocumentRow: подложка 40, точка непрочитанного на её краю, гаснет по нажатию на строку. Заголовок без названий анализов и диагнозов — пуш виден на заблокированном экране; подробность ниже до двух строк: услуга и врач, где лежит документ, начало ответа. Нажатие переключает медкарту и ведёт к событию. Точка на колокольчике горит, пока экран не открывали.

Июль

Апрель

Приёмы: предстоящий, прошедший, отменённый«Ещё» → «Приёмы» (06.10.2026): история визитов и предстоящие из ТЗ, «все приёмы, суммы, статусы» из КП. VisitRow — та же форма, что DocumentRow: подложка 40, услуга, врач, нижняя строка «когда · статус». Сумма справа стоит на базовой линии названия, а не столбцом сверху: кегль и интерлиньяж у них разные, и верхние края совпадали, а базовые линии нет. Размер суммы — как у LedgerRow. У предстоящего суммы нет, статус — из записи: «Не подтверждена», «Подтверждена», «Внесите задаток», «Отмена запрошена». Отменённый — знак приглушён, сумма зачёркнута.
Взрослая клиникаW Clinicул. Савушкина, д. 24м. Чёрная речкаРаботает каждый день с 9:00 до 21:00
Позвонить8 (812) 332-54-05
Клиника: карта и карточка«Ещё» → «Клиники и контакты» → клиника (06.10.2026). Сверху MapPreview — карта схемой: улицы полосами и метка цветом бренда с адресом; нажатие — маршрут. В продукте на этом месте статичная карта с той же меткой. Ниже ClinicCard: тип, название, адрес, метро, часы, заметки (как найти вход, ОМС и ДМС), строки «Позвонить», «Маршрут» и «Как дойти от метро» — видео есть на сайте у Савушкиной и Приморского. У Приморского два номера: взрослым и детской психологии. Фото клиник нет — их нет ни в требованиях, ни на сайтах.
МККто идётМария Ковалёва
МН
ВрачМишарова НадеждаАкушер-гинеколог, врач УЗД
«Как добраться» — со строки «Где и когда»Встреча 09.10.2026: на своей записи и на проверке деталей строка «Где и когда» в BookingSummary нажимается (onPlacePress) — шеврон справа, как у NavRow, — и открывает ClinicRouteSheet: карта MapPreview и ClinicCard клиники медкарты (clinicOf), с метро, часами, звонком, маршрутом и видео от метро. Содержимое то же, что у экрана клиники; в шторке группа на приглушённой подложке, белая на белом не читалась бы. У онлайн-приёма адреса нет — строка не нажимается.
«Ещё» плашкой и плитками — пробаПроба 07.10.2026 у Марии (moreLayout), с 12.10.2026 выключена: «Ещё» у всех медкарт строками, вариант остаётся здесь. Сверху AccountPlate — белая карточка, как ячейки ниже: фото 48, имя заголовком 20/24, телефон; вся плашка ведёт в аккаунт. Под ней «Счёт» и «Приёмы» — FolderTile с плоским знаком в две колонки, те же размеры, что у папок: остаток и число предстоящих одной подписью. «Счёт» — остаток открытой медкарты, у Марии 2 000 ₽: общего счёта у семьи нет, у каждого свой (встреча 09.10.2026); в строке «Счёт» подписано, чей он. Дальше строками «Медкарты», «Клиники и контакты» с «Правовой информацией» и «Настройки». Пробовали и сняли в тот же день: тонированную плашку со счётом внутри, плашку на бренде, крупное имя на градиенте главной и более плотные разделители. Раздел — уровень аккаунта: на любой открытой медкарте здесь Мария.

Выберите направление

Каталог взрослой клиники — все девятнадцатьКаталог повторяет форму записи клиники, а не список специальностей: правка 03.09.2026 добавила семь пунктов, которых у нас не было вовсе — анализы (158 услуг), вакцинацию, чекапы, выезд врача на дом, планирование и ведение беременности, скрининги. Записаться на них было нельзя. Строка «Диетология» убрана: в прайсе нет ни одной позиции со словом «диетолог», и в форме записи клиники такого пункта нет — за строкой не стояло ни одной услуги. Порядок: специальности по числу врачей, затем группы услуг по числу услуг — два разных счёта не смешиваются в одной сортировке.

Выберите направление

Каталог детской клиники — тринадцатьСвой каталог, а не отфильтрованный взрослый: гинекологии у Лёвы нет не потому, что мы её спрятали, а потому что её нет в детской клинике. Семь строк добавились из формы записи wdeti.pro: детская аллергология (21 услуга), психология и психиатрия, УЗИ, гастроэнтерология, дерматология, вакцинация и сон ребёнка. Числа и цены считаются из каталога услуг по тому же правилу «самая дешёвая первичная консультация».

Основные направления

Основные направления — лента на главной у медкарты без приёмовПоявилась 03.09.2026 по правке «ui не должен быть таким скучным», и довод не декоративный: на пустой главной не было ни одного настоящего числа. У Марии работу делают кольцо цикла, портрет в кадре и лица в повторной записи; у карты, в которой ничего нет, данных по определению нет. Лента приносит то, чем клиника и отличается: девятнадцать направлений, число врачей и цену входа из прайса. Блок из прототипа — там на главной стояло «Или выберите направление». Первый заход выводил весь каталог, и правка того же дня это отменила: «очень длинная получается» — замер подтвердил, девятнадцать карточек это 3216 пикселей ленты, восемь с половиной кадров под одним заголовком. Теперь пять и хвостовая «Все направления», прокрутка 992. С решением 02.09.2026 (когда такую конструкцию убрали с экрана записи, потому что «Все 12» рядом с четырьмя строками сообщает «мы показали не всё») это сходится: там список и был экраном каталога, а кнопка вела на его копию, здесь лента стоит на главной и хвостовая карточка ведёт во вкладку «Запись», где каталог целиком. И подмена не молчаливая: заголовок «Основные направления» рядом с «Все направления» — это пара, а не умолчание. Слово «Рекомендуем» не взято: рекомендации у нас нет — у новой карты ни истории, ни жалоб, порядок берётся из модели по числу врачей, а обещать выбор, которого никто не делал, значит подойти к границе правила 8. Карточка 160 × 164: 160 + 8 + 160 = 328 при колонке 361, то есть в кадре две карточки и 33 пикселя третьей — видно, что лента листается; 176 дали бы 360 из 361 и ни намёка на продолжение. Знак 56, а не 48: здесь он стоит один над названием и несёт всю картинку, а на 48 стеклянная форма уже теряется. Счёт и цена стоят друг под другом, и это замер: склеенная строка «25 врачей · УЗИ от 2 580 ₽» просит 153 при доступных 136, и многоточие съедало ровно цену, а перенос по словам приходится между «УЗИ» и «от». Карточка ведёт в экран направления поверх главной — как карточка врача в повторной записи, а не в раздел записи: переключение вкладки оставлено входам, за которыми корневой экран каталога.

Основные направления

Лента детской клиники — свои тринадцатьТот же компонент, тот же порядок и та же пятёрка с хвостом. Сиреневая партия пришла 03.09.2026 — тринадцать знаков, все детские направления, — и лента, которая до этого держалась на одних названиях, стала такой же плотной, как взрослая. Семь знаков из тринадцати это зеркало взрослых: тот же предмет, другая палитра, потому что знак опознаёт специальность, а клинику говорит вся тема экрана. Взрослый и детский знаки одного направления на одном экране не встречаются: каталог берётся по клинике открытой медкарты.
Строка услуги — четыре состояния записиПеревёрстано 05.09.2026 по правке дизайнера: «иконку часов перед временем, иконку календаря перед датой, убери шевроны». Знак отвечает на «что это за число» быстрее подписи, и слова освобождаются: приставка «ближайшее:» ушла — её роль взял календарь. Шеврон убран — строка целиком и так кнопка, с откликом и белой поверхностью на тонированной странице. Вторым заходом того же дня раскладка переделана ещё раз, по правке дизайнера «дату/время первой, потом продолжительность; цену — отдельной последней строкой по левому краю и крупнее, а то фокус внимания расходится». Оба довода верные: решение здесь принимают по доступности, а не по длительности; а прижатая вправо цена сравнивалась бы столбцом только в таблице с равными строками — у карточек высота разная, и правый край получался рваным, зато глаз ходил слева направо и обратно. Теперь три строки начинаются с одного x, и цена — последняя и самая крупная (16/20 semibold). Цена решения замерена: карточка выросла на 28 (строка 20 плюс гэп 8), в кадр помещается пять услуг вместо шести. Четыре состояния записи различаются и сейчас: ближайшее окно бирюзой (единственное действие), «время подбирает администратор» у 166 услуг взрослой клиники, «врачей в прайсе не указано» у 23 и «свободного времени пока нет», когда врачи есть, а окон на три недели нет. Название не обрезается: у анализов половина названий длиннее строки, и обрезанную услугу не опознать. Пятая строка — та же услуга на экране врача: строка знает, чья она, и все три числа становятся его — окно из его расписания, его ступень цены, его длительность. «От» там означало бы, что мы не знаем врача, а мы знаем.

Консультации

Исследования и манипуляции

Анализы и вакцинация

Экран направления — услуги, а не врачиПравка 03.09.2026: направление открывало список врачей, а услуг человек не видел вовсе — при том что записываются на услугу, у неё цена, длительность и подготовка. Группы («Консультации», «Исследования и манипуляции», «Анализы и вакцинация», «Программы») — деление самой клиники, а не наше. Услуги показаны все: первый заход прятал их под строку «ещё 66 услуг», и дизайнер отменил это доводом «это ведь не web» — в приложении прокрутка дешёвая, а лишний тап нет. Взамен заголовок группы липнет под шапку (владелец `sticky-panel`): в списке из 158 анализов в любой точке видно, где ты. Порядок внутри группы — как в прайсе: любой другой был бы мнением приложения о том, что человеку нужнее.

УЗИ малого таза

30 минут5 200 ₽

ПолиовакСин - вакцина от полиомиелита

15 минут5 175 ₽

Перед записью нужна консультация специалиста

Первичная консультация гинеколога

45–60 минутот 4 370 ₽

Первичная консультация гинеколога

1 час9 900 ₽
Плашка услуги — что именно записываютНазвание стоит здесь, а не в шапке экрана: у услуг оно до восьмидесяти знаков, а шапка обрезает в одну строку. В шапке поэтому направление. Описание — настоящий текст клиники: подготовка, состав услуги, правило по дню цикла («на 5–7 день цикла») — мы его не сокращаем и не переписываем, это медицинская инструкция. Условие «перед записью нужна консультация специалиста» стоит у 138 услуг, и экран услуги — последнее место, где его ещё можно прочитать до выбора времени. Знаки и цена справа — те же, что в строке списка (владельцы IconFact и PriceTag), правка дизайнера 05.09.2026: человек приходит сюда из списка, и одни и те же факты не должны выглядеть по-разному через один тап. Цена умеет гаснуть (price={false}, 10.09.2026): на сделанной записи выбирать нечего, человек пришёл с главной, а не из каталога, и денежный вопрос у него один — сколько с меня. На него отвечает «Итого». До записи цена в плашке остаётся, даже когда итог рядом: там это два разных вопроса. Календаря здесь нет — ближайшее окно это вопрос списка, где из двадцати услуг выбирают одну. Две нижние плашки — одна услуга без врача и с ним: «от 4 370 ₽» против его ступени. Правка 04.09.2026, и она про вранье, а не про удобство: придя с экрана врача, человек видел плашку с «от» и итог под ней, посчитанный по врачу, — две цены одной услуги в сорока пикселях друг от друга.

Июль 2026

7 врачей со свободным временем
МНМишарова НадеждаАкушер-гинеколог, врач УЗД · стаж 12 лет4 370 ₽
W Clinic, ул.Савушкина, д.24 · приём 45 минут
16 июля всё занято
ЛОЛевковская ОльгаАкушер-гинеколог, врач УЗД · стаж 7 лет4 370 ₽
W Clinic, ул.Савушкина, д.24 · приём 45 минут
16 июля всё занято
РАРоманчикова АлёнаАкушер-гинеколог, врач УЗД · стаж 9 лет4 370 ₽
W Clinic, ул.Савушкина, д.24 · приём 45 минут
16 июля всё занято
МВМаркина ВалентинаАкушер-гинеколог, врач УЗД4 370 ₽
W Clinic, ул.Савушкина, д.24 · приём 45 минут
Экран услуги — врачи и времяЭкран стоит после выбора услуги, и поэтому у каждого врача его собственная цена: «Первичная консультация гинеколога» стоит 4 370, 5 635, 7 360, 8 900 или 9 900 ₽ — это ступени по врачу из прайса. Длительность стоит в строке адреса: под ценой она отнимала ширину у специальности, и «стаж 12 лет» вставало вплотную к «45 мин». Слоты стоят в карточке врача, без перехода (решение Р-2): запись занимает два тапа с одного экрана. Правка 03.09.2026: свободные врачи идут первыми, занятые в конец — у консультации гинеколога врачей двадцать, свободны в среднем шесть, и раньше до времени приходилось прокручивать четырнадцать погасших карточек. День выбирают календарём (`MonthCalendar`, с 23.09.2026 — правка клиента «лучше сделать как у нас на сайте в виде календаря»): месяц назван словом, день без окон ни у одного врача погашен и не нажимается. Липкости у него нет — сетка месяца слишком высокая, чтобы висеть под шапкой, и это осознанная цена замены полоски. Расписание вымышленное и детерминированное; врач ведёт приём четыре дня в неделю по одним и тем же дням недели.
МНМишарова НадеждаАкушер-гинеколог, врач УЗД · стаж 12 лет4 370 ₽
W Clinic, ул.Савушкина, д.24 · приём 45 минут
16 июля всё занято
ЛОЛевковская ОльгаАкушер-гинеколог, врач УЗД · стаж 7 лет4 370 ₽
W Clinic, ул.Савушкина, д.24 · приём 45 минут
Врач без окон остаётся — и не гаснетПервая половина Р-2 держится: «врачи без окон на выбранный день не исчезают — иначе пациентка решит, что нужного врача больше нет в клинике». Вместо чипов стоит строка «16 июля всё занято». Вторая половина — приглушение до 60 % — отменена дизайнером 03.09.2026 с точным доводом: у карточки живая кнопка «другое время», а блёклый вид говорит «здесь ничего нельзя». Из двух сигналов убран тот, который неправда: занятость сегодня называет строка, а не блёклость всей карточки. Лица есть у десяти врачей из 82 — остальные показываются инициалами, и это честнее, чем показать одно подставное лицо дважды.
МККто идётМария КовалёваW Clinic, ул. Савушкина, д. 24
РА
ВрачРавдоник АлександраАкушер-гинеколог, врач УЗД
Где и когдасегодня, 11:00W Clinic, ул. Савушкина, д. 24
Сводка записи: пациент, врач, где и когдаЭкран из концепта, который 03.09.2026 пропустили и вернули в тот же день: без него запись не знала ни про доп. услуги, ни про длительность, ни про задаток — то есть про всё, что ТЗ называет содержанием формы записи. Решение Р-2: четыре параметра, любой можно снять; экран один и тот же для всех входов, меняется только заполненное. Строки одной формы: надстрочная подпись прописными, значение 16/20, вторая строка приглушённой. С 03.09.2026 они лежат одним островом с волосяными линиями, а не тремя карточками (правка дизайнера «приведи в порядок и эти блоки»): пять равных белых плашек подряд читались как пять разных тем, хотя первые три отвечают на один вопрос — кто, к кому и когда. Тот же приём, что в чеке итога, и правило у AppCard переписано: карточка — это группа, а не элемент группы. Ведущий знак теперь есть у каждой строки: у «где и когда» слева не было ничего, и её текст начинался на 52 пикселя левее соседей — теперь там знак календаря на подложке 40 (IconPlate, владелец появился из этой же правки и заодно забрал плашку у шторки правки месячных). Ведущий элемент прибит к верху, а не к середине: у врача специальность может лечь в две строки, и по центру портрет поехал бы вниз только у него. Единственное брендовое пятно в списке — подпись «КТО ИДЁТ»: ошибка «записал не того» дороже всех остальных (Р-3). Действие «Выбрать» только у времени: врач и время выбираются одним нажатием чипа, и две одинаковые кнопки подряд были бы выбором без различия. Пустой врач читается словами — «Любой свободный».

Добавить к приёму

Можно добавить сейчас или уже на приёме у врача

Добавить к приёму

Можно добавить сейчас или уже на приёме у врача

Добавить к приёмуСвязки настоящие, из выгрузки формы записи: доп. услуги есть у 51 услуги из 621, у УЗИ малого таза их восемь. Главная цифра строки — не цена, а прибавка ко времени: «+ 15 минут к приёму» объясняет, почему после добавления мазка часть окон в расписании пропадёт (Р-2). У доп. услуги со ступенями цены прибавка тоже вилка, и тогда в строке стоит она сама — «+ 45–60 минут к приёму». Кружок и цена прибиты к верху ячейки, а не к её середине (правка дизайнера 03.09.2026): названия из прайса — от двух слов до восьмидесяти знаков, и при выравнивании по центру фланги стояли на разной высоте у каждой строки списка — у трёхстрочной на 44 от верха, у однострочной на 28. Теперь у любой ячейки оба на 16, а цена набрана той же ступенью, что первая строка названия, — они стоят на одной базовой линии. Цена везде одна и та же PriceTag, «от» приглушено, число чернилами. Выбранная строка получает брендовый кружок с галочкой и брендовое кольцо внутрь (select-ring, той же правкой — «обводку делать inline»): border уменьшал содержимое на два пикселя и садился на край плашки, а вставленное кольцо раскладку не трогает и во Flutter ближе — тамошний Border рисуется внутри бокса. Заливкой бренда строку красить нельзя — правило площади держит счёт крупных цветных поверхностей. Несовместимые услуги гаснут и говорят причину словами клиники — справа выбрана онкоцитология, и кольпоскопия погасла: «в один день с онкоцитологией кольпоскопия не делается» (прайс, дословно). Серая строка без объяснения читалась бы как поломка приложения, а не как правило клиники. Правило пока одно, и это честная граница: две гипотезы (общий врач и предел длительности) проверены по выгрузке и отброшены — разбор с числами в service-conflicts.ts. Список тоже умеет знать врача (свойство doctorId): если он выбран, у доп. услуги, которую он ведёт, пропадает «от» и вилка минут — иначе строки над итогом писали бы «от», а итог считал бы точно. Строка списка с 11.09.2026 — общий владелец ChoiceRow: та же раскладка (карточка, кружок слева, название, пояснение, обводка у выбранной) была написана трижды — здесь, в способах оплаты и, когда понадобилась цель цикла, чуть не появилась в четвёртый раз. Цена осталась слотом хвоста, недоступность — флагом, а причину недоступности говорит та же подпись, что обычно несёт прибавку ко времени. В стоматологии блок стоит над календарём врача и подписан вопросом из макета клиники — «Что можно добавить к приёму?», без подписи (свойство heading, 15.10.2026).
Остров, который собрал экранСкругление 24, поля 16, поверхность из токена

Задаток внесён

1 000 ₽

Часть стоимости приёма, остальное доплатите в клинике

Задаток внесён

1 000 ₽
Белый остров и блок задаткаAppCard — поверхность, из которой собраны все экраны, и владелец у неё появился только на третьем обходе: DESIGN.md приводил «AppCard ↔ app_card.dart» как пример правила «имена следуют порту», а компонента не существовало — разметка стояла копией тридцать раз, семь из них прямо в экранах. Граница была «если у блока есть имя, он сам себе карточка», и 03.09.2026 она сломалась о правку дизайнера по экрану деталей: SummaryRow и PatientRow имена имели, каждая была себе островом, и три факта одной записи лежали тремя карточками — пять белых плашек подряд читались как пять разных тем. Имя оказалось не тем признаком. Теперь граница по роли: карточка — это группа, а не элемент группы. Список фактов, список позиций, список строк сводки — один AppCard, внутри строки с волосяными линиями; строка своей поверхности не имеет, даже если стоит в группе одна. Правило при этом про факты, а не про мишени, и это уточнено на следующий день: результаты поиска, каталог направлений и уведомления остаются отдельными карточками, потому что там у каждой строки своё нажатие, и зазор 8 показывает, где заканчивается область нажатия. Проверка простая: есть onPress — мишень, своя карточка законна; нет — факт, место в общем острове. Тег меняется свойством: section для раздела, ul для списка, — потому что список пунктов внутри карточки не должен врать семантикой ради общей поверхности. DepositRow — тот же случай, только конкретнее: блок «Задаток внесён» набирался дважды, на подтверждении и на своей записи, и копии успели разойтись — строка про возврат была только на первом. Теперь правило стоит на обоих, и это исправление, а не копия: на экране записи вопрос «а вернут ли» задают чаще, туда приходят отменять. Формулировка клиникой не подтверждена и живёт в одном месте — ответят, править одну строку.
Состояния загрузки — три формы на всё приложениеБэкенд на стороне клиники, приложение живёт поверх Renovatio, AmoCRM и FDOC: каждый собранный экран в продукте ждёт сеть. Пока состояний загрузки нет в дизайне, их придумает разработчик — по-разному на каждом экране. Форм ровно три, и они закрывают весь продукт: строки (услуги, документы, поиск, врачи), карточка (плашка услуги, сводка, итог) и кадр ленты главной. С 03.09.2026 скелет строки и карточки повторяют геометрию по-настоящему, и это замерено: строка была 80 против 96 у настоящей строки услуги (четыре строки — 64 пикселя прыжка при загрузке), карточка 100 против 132 у плашки услуги. Причина была в том, что скелет остался от вёрстки до правок: он рисовал текст слева и знак справа, а шевроны дизайнер снял 05.09.2026 и строка стала тремя ярусами по левому краю. Теперь у полоски два размера: бокс строки задаёт геометрию (20 у названия и цены, 16 у фактов, 24 у крупного заголовка), а сама полоса всегда 12 и стоит по центру бокса — сумма совпадает с текстом, а выглядит это текстом, а не стопкой плашек. Скелет повторяет форму того, что грузится, а не конкретный экран, и держит геометрию настоящего блока: кадр ленты — те же 254, чтобы главная не прыгнула, когда содержимое приедет. Ширины строк разные: ровные прямоугольники читаются таблицей, а не текстом. До 300 мс не показываем ничего — мелькнувший скелет читается как сбой; порог проверяется на настоящих ответах Renovatio, и это вопрос к клинике. Четвёртая форма означала бы новый тип содержимого — это повод для разговора, а не для нового скелета.

Нет сети

Похоже, пропал интернет. Проверьте связь и попробуйте ещё раз

Не получилось загрузить

Извините, у нас не получилось. Попробуйте ещё раз — а если не выйдет, напишите нам, и администратор всё сделает руками

Не получилось загрузить — два поводаБэкенд на стороне клиники, половина экранов ходит в чужие системы: отказ не край, а обычное состояние. Поводов два, и человек их различает. Нет сети — виновата не клиника, и чинит человек сам: текст свода дословно, вероятная причина вместо кода ошибки. Сервис не ответил — виновата клиника, и разбираться, кто именно, пациенту не нужно (правило 3 свода: извиняемся, не разбираясь, чья вина). Срок назвать нечем, и по правилу 5 мы его не выдумываем — взамен даётся выход к человеку: администратор запишет руками, пока чинится машина. Стоп-лист соблюдён: ни «произошла ошибка», ни «сервис временно недоступен», ни кода состояния. Одна кнопка, а не две: выбор из двух равных в момент раздражения — лишняя работа. Где стоит, решает вызывающий: отказ каталога — это пустой экран записи, а отказ ленты — только верх главной, остальное на ней живёт.
Главное действие, пока идёт работа«Занято» ставится там, где ждём сеть: оплата, подпись документа, отправка сообщения. У кнопки, которая просто открывает следующий экран, этого состояния быть не должно — ожидание, которого нет, такая же ложь, как мишень, которая ничего не делает. Подпись меняется на глагол в настоящем времени («Списываем задаток»), рядом крутится кольцо, повторные нажатия не принимаются. aria-busy, а не disabled: кнопка не выключена, она занята, и скринридер не должен объявить её недоступной насовсем. Кольцо собрано из бордюра, а не из знака: спиннера в наборе нет, а рисовать его «в стиле» значит выдумывать за автора — чистый CSS переносится во Flutter как CircularProgressIndicator.
Тост — единственное место, где приложение говорит вслухТост нужен ровно там, где экран с действием закрывается и подтвердить результат на нём уже негде. Такой случай в приложении был один — отмена записи, — и с 23.09.2026 его нет: отмена ушла к колл-центру, а подтверждение визита остаётся на том же экране и показывается подсветкой. Владелец оставлен без живого случая намеренно: следующий закрывающий экран действие получит его, а не заведёт своё. Везде, где результат остаётся на экране, работает подсветка (useChangeFlash), а не слова. Свой владелец, а не sonner из набора: sonner вешает контейнер на body и позиционируется от окна, то есть сообщение вылезло бы за рамку телефона — та же ошибка, что уже была со шторкой. Одно сообщение за раз, без очереди: следующее заменяет текущее, потому что два подряд означают два действия подряд, и второе важнее. Над панелью вкладок, а не поверх неё: панель — часть устройства, и накрывать её значит отнимать выход. Держится 4 секунды и уходит сам; мишени у него нет — иначе это уже шторка.
УЗИ малого таза5 200 ₽
Жидкостная онкоцитология4 830 ₽
Фемофлор 16. Исследование микрофлоры мочеполового тракта4 543 ₽
Длительность приёма1 час
Итого14 573 ₽
Задаток при записи1 000 ₽
Доплатить в клинике13 573 ₽
Итогоот 4 370 ₽
Задаток при записи1 000 ₽
Доплатить в клиникеот 3 370 ₽
Итогопо плану лечения
Задаток при записи1 000 ₽
Доплатить в клиникепо плану лечения
Итог: сумма, длительность, задатокПересчёт виден: добавили доп. услугу — итог и длительность коротко подсвечиваются брендовым 12 %, 320 мс, и гаснут. Владелец — useChangeFlash, утилита flash-change. Решение Р-2 про доп. услуги говорит дословно «меняют длительность на глазах», а мгновенная подмена меняет за глазами. Тост на эту работу не годится: он повторяет словами то, что уже написано, и уводит взгляд к панели вкладок, — подсветка показывает пальцем на изменившуюся строку. «Вы называли неясную итоговую стоимость одной из причин отказов; здесь сумма и время пересчитываются до выбора слота, а не после» — концепт дословно. Числа не сложены руками: 5 200 + 4 830 + 4 543 = 14 573 ₽ и 30 + 15 + 15 = 1 час считает один владелец, bookingTotals. Второй пример показывает сразу два правила. Услуга со ступенями цены: пока врач не выбран, точной суммы не существует, и «от 4 370 ₽» — единственная правда, а не осторожность. И позиция у неё одна — значит списка и длительности нет вовсе (10.09.2026): при единственной услуге блок печатал её название с ценой, линию и «Итого» с тем же числом, плюс длительность, которую двумя карточками выше уже сказала плашка, — то есть не добавлял к плашке ничего, кроме строки задатка, и платил за это тремя одинаковыми числами на экране. Список появляется там, где сумма перестала быть очевидной, и само его появление сообщает, что счёт начал складываться. Держится правило на том, что услугу называет плашка ServiceSummary: поэтому она обязана стоять на каждом экране с итогом, и той же правкой пришла на «Проверьте детали», где услуга называлась только строкой позиции. Позиции разделены волосяной линией и набраны 14/20 (правка дизайнера 03.09.2026 — «все пункты сливаются как-то»): названия из прайса переносятся на две-три строки, а отступ между позициями был 8 — примерно тот же зазор, что между строками внутри одного названия, и семь позиций читались одним абзацем с числами справа. Линия работает надёжнее отступа: ей всё равно, во сколько строк лёг соседний пункт. Пунктир до цены дизайнер тоже предлагал, и он отклонён замером, а не вкусом: чековый пунктир ведёт от конца названия к цене, то есть требует свободного места в строке названия, — здесь названия занимают всю ширину, а у перенесённого пункта цена стоит на первой строке, а свободное место на последней. Цена позиции приглушена целиком, включая «от», в отличие от PriceTag: там цену сравнивают, здесь она слагаемое. Итог — единственное число в блоке в полную силу, 20/24 semibold. Задаток объяснён до кнопки, а не в платёжной форме: неожиданное списание на последнем шаге — классическая причина брошенной записи. Формулировка про возврат за сутки взята из концепта и требует подтверждения клиники: на сайте сказано только про 1 000 ₽ и отмену через 30 минут. С 13.10.2026 у услуги с ценой по плану лечения (planPriced — этапы ортодонтии в стоматологии) суммы нет: позиция, итог и «доплатить в клинике» говорят «по плану лечения», задаток остаётся — третий итог.

Это 5 день вашего цикла — как рекомендуют для этой услуги

Иной день согласовывается с врачом. При боли день цикла не важен

Это 12 день вашего цикла, а рекомендуют 5–7 день цикла

Иной день согласовывается с врачом. При боли день цикла не важен

День цикла на экране подтвержденияВторая половина связки Р-5: на главной блок цикла предлагает УЗИ и считает окно, а здесь приложение говорит, какой день цикла выбран и совпадает ли он с рекомендацией клиники. Правила настоящие и лежат таблицей — шесть услуг из 621 помечены в выгрузке как чувствительные к циклу, и у каждой правило взято из описания дословно: «На 5-7 день цикла», «с 5 по 12 день цикла», «Вне менструации». Разбирать эти тексты кодом нельзя — формулировки разные, регулярное выражение однажды соврёт. Совпало и не совпало — одна форма, разный текст: красным ничего не красится, красный в системе занят одним блоком «Нужна помощь сегодня?». Приложение не оценивает состояние (правило 8 свода): оно называет факт, рекомендацию и оговорку клиники, а решение остаётся за человеком и врачом. Отсюда и порядок слов — сначала факт про день, потом рекомендация: обратный порядок читается как выговор.
«Что важно знать врачу»Решение 14 концепта дословно: «В ДМС-концепте это „Причина обращения“ и „Комментарий врачу“. Мы переформулировали от пользы, а не от делопроизводства: пациентка заполняет не форму, а помогает врачу. Подпись „не обязательно“ снимает ощущение анкеты». Поле одно, а не два, и это решение: у свободного текста пока нет подтверждённого адреса — концепт сам помечает, что до разработки нужно понять, куда он попадает в Renovatio и кто отвечает за то, что врач его увидит. Пока адрес один и непроверенный, второе поле удваивает открытый вопрос. Стоит сам инпут, а не строка с шевроном: экрана ввода в прототипе нет, а строка-обещание его не заменяет. Поверхность поля — заливка #eaf3f3 плюс декоративная линия: одна заливка к белому даёт 1.13:1, то есть тот же «сливается», из-за которого переделывали поиск. Контрольная рамка 3:1 здесь не нужна — признаков поля три (заливка, заглушка, рамка), а не один. Линии при этом в коде не было: разбор стоял с самого начала, а класс поля держал одну заливку — нашлось 03.09.2026 по правке дизайнера «особенно не нравится, как сверстался блок „Чтобы врач подготовился“ — какая-то каша». Половина каши была в том, что поле не читалось как поле, вторая — в подписях: было четыре текста до первого написанного слова (заголовок, приглушённое «не обязательно» отдельной колонкой справа, надстрочная «ЧТО БЕСПОКОИТ» прописными и заглушка с примером), причём заголовок и надстрочная говорили одно и то же. Осталось два, оба по левому краю; заглушка делает работу снятой подписи и делает её конкретнее. Карточка теперь сама себе label: нажатие в любом месте блока ставит курсор в поле, а доступное имя берётся из заголовка. Сам заголовок сменился той же датой на предметный (правка «может, заголовок сделать более предметным? например „Опишите ваше состояние“»): «Чтобы врач подготовился» объясняло, зачем писать, и ничего не говорило о том, что писать. Предложенный вариант не взят по двум причинам: «состояния» нет в словаре продукта, а правило 9 свода требует одно понятие — одно слово; и «что беспокоит» не подходит половине записей — на чекап, плановое УЗИ и ведение беременности идут, когда ничего не болит, и заголовок про беспокойство заставляет либо придумать жалобу, либо пройти поле мимо. Взят заголовок второго поля концепта — «Что важно знать врачу»: он покрывает и жалобу, и контекст. Польза переехала в подпись целиком: «Не обязательно — так врач подготовится к приёму».
МН
Мишарова НадеждаАкушер-гинеколог, врач УЗД · стаж 12 летW Clinic, ул.Савушкина, д.24

Июль 2026

Четверг, 16 июля
Запись к врачу: врач, дата, времяОтдельный экран для сценария «к этому врачу» (DoctorBookingScreen, 23.09.2026). Порядок как на сайте клиники: врач отдельной плашкой, под ним календарь его дней, под календарём окна выбранного дня. Раньше этот сценарий жил на экране выбора времени — шторкой со вторым календарём, потом строкой «Врач» над сеткой, — и оба раза получались дубли: карточку «врач + окна» нельзя поставить ни над календарём, ни под ним. Плашка врача — без действий и без цены: цена этого врача стоит один раз, в плашке услуги выше. Над окнами дата словами — она же заголовок блока, вместо «Выберите время». Смена врача — внизу, тихой кнопкой «Другие врачи»; когда у других окно раньше, над ней подпись с этим окном, а когда у врача нет окон на четыре недели — кнопка становится основной «Записаться к другому врачу».
Окна времениSlotChips — один владелец на два места: карточку врача в списке (сеткой в три колонки, columns={3}, чтобы кнопка «другие дни» стояла на месте) и экран записи к врачу (переносом по ширине). До 23.09.2026 разметка чипа жила в карточке и копией в шторке расписания. Пилюля 32 из макета, мишень 44 растит невидимый псевдоэлемент (tap-44): это самые частые мишени записи. Чипы переносятся, а не прокручиваются вбок: у дня бывает до семи окон, и вечерние не должны прятаться за краем. Нажатие на окно — уже запись: второй тап подтверждает на экране деталей (Р-2).
W Clinic, ул.Савушкина, д.24
W Clinic, ул.Савушкина, д.24
W Clinic, ул.Савушкина, д.24
16 июля всё занято
«Другие дни» — справа, окна сеткойС 24.09.2026 карточка показывает все окна дня, а не первые три: человек должен видеть свободное время здесь, а не переходить за ним (решение дизайнера). Окна стоят сеткой в три колонки равной ширины — время читается столбцами, — и четвёртое окно уходит во второй ряд, седьмое в третий. Сетка не заходит под кнопку: «другие дни» прижата к правому краю на уровне первого ряда и стоит в одной точке во всех карточках списка, сколько бы окон ни было и даже у занятого врача. Меняется только высота карточки. Название — третье: «другое время» обещало остаток окон, «все дни врача» звучало не по-русски, «другие дни» называет ровно то, что за кнопкой — экран записи к этому врачу, открытый на том же дне. Кнопка есть у любого врача, включая занятого (правка дизайнера 03.09.2026): вопрос «а когда ещё» есть у каждого. Мишень чипа и кнопки — 44 при пилюле 32 (tap-44). Шеврона у кнопки нет — снят 04.09.2026, когда за ней была шторка; вернуть его — решение дизайнера.
Три тона главного действияВладелец один — AppButton, и это следствие 04.09.2026: разметка брендовой кнопки стояла копией на двух экранах, а с появлением оплаты, подтверждения и переноса стала бы пятой. brand — то, ради чего экран существует, один на экран: градиент brand-cta. Блик по нему был и снят 05.09.2026 — арт-директор сказал, что проход по зелёным кнопкам выглядит дёшево и не современно. quiet — второе действие рядом с главным, поверхность стеклянная, как у поля поиска: по правилу трёх поверхностей стекло это контрол, а белая заливка — содержимое, и белая кнопка в полосе действия читалась бы карточкой. danger — отмена: красным набран текст, а не плоскость, потому что единственная красная плоскость в системе это блок «Нужна помощь сегодня?». С 23.09.2026 живого случая у этого тона нет: отмена записи ушла к колл-центру (правка клиента «отменить или перенести можно только через КЦ»), и в приложении не осталось ни одного разрушительного действия. Тон оставлен — он понадобится, когда появится первое. Высота 48 у всех трёх, ширина во всю колонку: два действия в ряд на 361 не встают. Повторное нажатие внутри 400 мс владелец гасит: до этого двойной тап по «Оплатить» создавал две записи — book() успевал отработать дважды прежде, чем экран уезжал. Защита стоит у владельца, а не у экрана, иначе её пришлось бы вспоминать на каждом следующем действии. Неактивное состояние (disabled, 08.10.2026) — пока не всё заполнено, как «Получить код» до десятой цифры номера: приглушённая заливка muted-foreground 15 %, подпись приглушённая, нажатия нет. Тон при этом не важен.

Внесите задаток 1 000 ₽ в течение 30 минут, иначе запись отменится

Задаток 1 000 ₽ возьмём из денег на счёте, остальное доплатите в клинике

Полоса действия с подписьюActionBar — владелец липкой полосы у низа экрана: правка дизайнера 03.09.2026 «кнопка должна быть прибита к низу до того момента, как не доскролим до конца». Приём — ровно sticky bottom-0, а не закреплённый футер: футер висел бы над пустотой на коротком экране. Тени у полосы нет — дизайнер отменил её в тот же день, и по делу: подложка цвета страницы отделяет полосу сама, а тень на светлом фоне читалась серой линией поперёк экрана. Подпись — часть полосы: она объясняет последствие нажатия и обязана оставаться в кадре вместе с кнопкой. С 04.09.2026 подпись — единственное место, где сказано про задаток: абзац в блоке итога говорил то же самое в сорока пикселях выше. Липкость выключается (sticky={false}, 10.09.2026): она обещает шаг, а на сделанной записи шага нет. Своей записи это стоило дважды — непрозрачная подложка накрыла пришедший туда итог ровно по строке «Итого», а красная «Отменить запись» в постоянном кадре читалась предложением отменить на экране, куда заходят посмотреть, когда приём. Без липкости остаётся mt-auto: на коротком экране полоса всё так же садится у низа. С 23.09.2026 на своей записи в этой полосе стоит «Подтвердить запись», а подпись под ней говорит, что перенос и отмена — по телефону клиники: экран не должен становиться тупиком для того, у кого планы изменились. С 13.10.2026 на проверке деталей кнопка одна — «Записаться», как в схеме клиники: запись создаётся сразу. Подпись зависит от счёта: свободных денег хватает на задаток — возьмём из них; не хватает — время бронируется на 30 минут, задаток вносится после. В демо первый вариант у Марии.

Чем платить

Задаток: чем платитьДанные карты приложение не спрашивает — это главное решение экрана. Задаток 1 000 ₽ настоящий (форма записи сайта), и взять его можно только через платёжный шлюз: номер карты вводится на его странице, приложение получает обратно токен и последние четыре цифры. Макет с полем «номер карты» тем самым обещал бы, что приложение его увидит. Какой шлюз — открытый вопрос к клинике: от ответа зависит, что человек увидит после нажатия — страницу банка, шторку СБП или системный лист. Сохранённая карта стоит первой и выбрана заранее: у повторной записи это один тап вместо трёх. Знаков «Мир» и СБП в наборе нет: это чужие логотипы, и похожий знак хуже, чем никакого. Строки способов с 11.09.2026 — общий владелец ChoiceRow, тот же, что у доп. услуг: кружок слева, название, пояснение, обводка у выбранной. С 12.10.2026 экран не открывается, если свободных денег на счёте хватает на задаток (freeBalanceOf). С 13.10.2026 он платит задаток уже созданной записи — открывается с «Время забронировано», с главной и со своей записи; режима «новая запись» у него нет.
Вы записались, до встречи в клинике!

УЗИ малого таза

1 час5 200 ₽
МККто идётМария Ковалёва
МН
ВрачМишарова НадеждаАкушер-гинеколог, врач УЗД
Где и когдазавтра, 10:30W Clinic, ул. Савушкина, д. 24
МККто идётМария Ковалёва
АА
ВрачАфанасьева АннаСтоматолог-терапевт
Причина обращенияБеспокоит зуб
Где и когдазавтра, 10:30W Dent, пр. Медиков, д. 10, к. 1
«Вы записаны» — конец цепочкиЕдинственный экран без «назад»: платёж прошёл, запись создана, возвращаться некуда. Порядок блоков — это порядок вопросов: «что за приём?» отвечает плашка услуги, «кто, к кому и когда?» — остров сводки, «что сделать до приёма?» — текст клиники, и только потом деньги. Плашка и остров — те же два блока и в том же порядке, что на сборке приёма, на выборе времени и на своей записи: правка 10.09.2026 свела всю цепочку к одной паре. До неё сводка сама называла услугу строкой-параметром, «кто идёт» на своей записи не был назван нигде, а денег там не было вовсе — при том что приходят туда отменять. Условие «нужна консультация специалиста» на плашке после записи гаснет (booked): это совет из прошлого. Подпись под «Готово» говорит, где искать запись: без неё человек ищет её в «Документах» — так уже было с прототипом. «Добавить в календарь» нет намеренно: во Flutter это плагин и разрешение, а кнопка-обещание хуже её отсутствия. С 13.10.2026 у записи в стоматологию в острове строка «Причина обращения» — причина, с которой пришли («Беспокоит зуб»), как в макетах клиники; цель обращения пациенту не показывается, она уходит врачу пометкой к визиту.

Что нужно знать

На 5-7 день цикла (от начала менструации), иной день согласовывается с врачом в индивидуальном порядке. При боли день цикла не важен.

Как подготовиться

С собой необходимо иметь документ, подтверждающий личность. Стоимость забора крови оплачивается отдельно. Выявляет риск трисомии 21 хромосомы (синдром Дауна), трисомии 18 хромосомы (синдром Эдвардса),трисомии 13 хромосомы (синдром Патау), половых анеуплоидий (в зависимости от пола плода в заключение указывается риск моносомии Х (синдром Тернера) и трисомии Х (синдром ХХХ)- для женского пола плода; дисомии Х (синдром Клайнфельтера) и дисомии Y (синдром Якобс)- для мужского пола плода) частых микроделеционных синдромов: микроделеция 22q11.2 (синдром ДиДжорджи), микроделеция 1р36 (синдром 1р36), микроделеция 15q11-13 (синдром Ангельмана/ Прадера-Вилли), микроделеция 4р16.3 (синдром Вольфа-Хиршхорна), микроделеция 5р15 (синдром кошачьего крика). При проведении НИПТ “расширенная панель” устанавливается статус носительства частых аутосомно-рецессивных мутаций у матери в генах CFTR, PAH, GALT, GJB2, SLC26A4, TPP1, ATP7B, DARS2, DHCR7, HEXA, IDUA, PIGN, PKHD1, PMM2, SLC26A2, USH2A, SMARCAL1, ALDOB.

Текст клиники про услугу — своим блокомОписания из прайса есть у 272 услуг из 621, и это самое полезное, что клиника про услугу написала: подготовка, состав, условие, правило по дню цикла. До 04.09.2026 текст стоял приглушённой подписью внутри плашки услуги — тем же кеглем, что «45 минут · от 4 370 ₽», — а на экране подтверждения его не было вовсе: инструкция исчезала как раз там, где её надо запомнить. Заголовок меняется по месту: до записи «Что нужно знать», после — «Как подготовиться»; сам текст не переписывается, это медицинская инструкция, а не маркетинг. Текст не обрезается: справа самое длинное описание каталога, 1005 знаков — там перечислены хромосомы, по которым считается риск, и они нужны целиком. Из 272 описаний длиннее 200 знаков только 33, средняя длина 99.
Что стоит знать про данные каталога
  • Каталог услуг настоящий и собран целиком: 703 позиции прайса обеих клиник сложились в 621 услугу. Две выгрузки — форма записи и прайс — соединяются по паре «название + цена» без остатка, поэтому у каждой услуги есть и флаги записи, и длительность с фамилиями врачей.
  • Одна услуга — до пяти цен, и у каждого врача своя. «Первичная консультация гинеколога» стоит 4 370, 5 635, 7 360, 8 900 или 9 900 ₽; вместе с ценой меняется длительность — 45 минут на первой ступени, час на остальных. Врач стоит ровно на одной ступени, пересечений нет ни в одной услуге. Ступени есть у 44 услуг из 621.
  • Концепт в этом месте ошибался: там у всех трёх врачей стояла одна цена с подписью «это стоимость услуги, а не гонорар врача». Для УЗИ малого таза так и есть — одна ступень; для консультаций нет.
  • Треть каталога нельзя записать самому: 166 услуг взрослой клиники и 55 детской идут только через администратора. Целые направления такие — вся вакцинация, все чекапы, все выезды на дом. Ещё 138 услуг требуют консультации специалиста до записи.
  • Цена «от» и число врачей теперь считаются, а не стоят руками. Правило («самая дешёвая первичная консультация, без онлайна, повторных и позиций короче 20 минут») воспроизвело 15 из 17 цен, проставленных раньше вручную. Разошлись две: у реабилитации осталась ручная (единственная «первичная» — приём ведущего реабилитолога на 1.5 часа, как «от» она врёт), у детской неврологии посчитанная оказалась верной — 5 175 ₽ вместо 6 555 ₽.
  • Числа врачей изменились там, где прайс знает больше каталога врачей: гинекология 26 вместо 20, УЗИ 25 вместо 23, психотерапия 20 вместо 21. Считать по прайсу правильнее: в списке врачей услуги окажутся ровно те, чьи фамилии у неё стоят.
  • Строка «Диетология» убрана. В прайсе нет ни одной позиции со словом «диетолог», и в форме записи клиники такого пункта тоже нет: за строкой не стояло ни одной услуги, и открывать её было некуда. Врачи-диетологи при этом есть — они ведут приём как эндокринологи.
  • Названные дырки в данных: у 23 услуг в прайсе не указано ни одного врача («УЗИ сердца», «УЗИ почек»); «Порохина Ксения» есть в прайсе и нет в выгрузке врачей; 7 ссылок на доп. услуги ведут на позиции, которых в выгрузке нет.
  • Из названий детских услуг снят «грейд»: «Консультация детского аллерголога 1 грейд» — это внутренняя ступень тарификации, а не название услуги, и у взрослой клиники её в названии нет. 32 таких строки собрались в 10 услуг со ступенями. Плюс исправлена одна опечатка прайса: «Первчиная».
  • Каталог врачей — все 82 врача обеих клиник из выгрузок: 72 взрослых и 25 детских, пересечение по имени слито. 74 фамилии из 75, встречающихся в прайсе, сошлись с этим каталогом.
  • Лица есть у десяти врачей из 82. Остальные показываются инициалами: второе лицо на одного врача заводить нельзя, а подставных снимков у нас десять. В списке из двадцати это видно.
  • Знак есть у всех тридцати двух направлений — три партии, последняя 03.09.2026. Пунктирное окно у строки без знака никуда не делось, но носителя в данных у него больше нет: состояние проверяется в витрине, знак снят руками. Знак dietetics.png остался без строки — направление убрано из каталога.
  • «Врач ультразвуковой диагностики» приведён к «врач УЗД»: в выгрузке одна и та же специальность написана двумя способами, а полная тянула строку на три строки и растила карточку до 200. Сокращение придумано не нами — оно уже есть в самой выгрузке.
  • Самый слабый знак партии — гинекология: папка с календарём на 56 читается хуже остальных. Это предсказала сама библиотека промптов, там у этого пункта стоит пометка «календарь читается как цикл, а не как направление».
ЧатСобран 04.09.2026 по правке «а то сейчас там заглушка» и трижды поправлен тем же днём. Последний проход — разбор экрана по замерам: время переехало внутрь пузыря (лента стала короче на 156 пикселей, 12.9 %), пределы ширины у своих и чужих сравнялись (288 против 288 вместо 288 и 248), разделитель дня перестал быть второй кнопкой, «Показать более ранние» держит якорь прокрутки, в шапке появились подзаголовок и звонок, а лента начала объявляться скринридером. По решению Р-6 тело переписки в v1 отдаёт SDK омни-платформы, поэтому это не макет чата, а список требований к платформе: цитирование, вложение с именем и размером, статусы, индикатор набора, разделители дат. Наши по Р-6 — рамка, дисклеймер, пустое состояние, сбой и офлайн; последние два настоящие и проверяются выключением сети.
Вчера
Добрый день! Записала мужа на УЗИ мочевого пузыря. Литр воды — это обязательно или можно меньше?11:40
П
Администратор Полина
Здравствуйте, Мария! Игорю лучше ориентироваться на ощущение полного мочевого пузыря — обычно это около литра за час до исследования. Станет тяжело терпеть — пусть скажет на ресепшене, позовём врача раньше.11:52
И вопрос за сестру: у Ольги скрининг 20 июля — приходить натощак?12:04
П
Ольге к УЗИ второго триместра подготовка не нужна — ни натощак, ни с полным мочевым пузырём. Пусть возьмёт обменную карту и заключение первого скрининга.12:11
Записалась на УЗИ молочных желез 6 августа, задаток уже списали. Он войдёт в стоимость приёма?
И ещё: готовиться к УЗИ как-то нужно?18:43
МарияЗаписалась на УЗИ молочных желез 6 августа, задаток уже списали. Он войдёт в стоимость приёма?Да, задаток 1 000 ₽ войдёт в стоимость приёма, остальное оплатите в клинике.
П
Перед приёмом достаточно освежить верхнюю часть тела и область подмышечных впадин. Мазок и онкоцитологию можно сделать в тот же день: жидкостная онкоцитология — 4 830 ₽, добавит к приёму 15 минут.19:07
В пятницу у Лёвы осмотр перед прививкой. Сертификат нужно приносить?19:12
В
Администратор Вероника
Здравствуйте! Не обязательно — все прививки Лёвы есть в его карте, врач впишет новую туда же. Если бумажный сертификат у вас на руках, возьмите, продублируем.19:20
Поняла, спасибо! На всякий случай фото сертификатаСертификат_прививок.jpgJPG · 2,4 МБ19:21
Сегодня
Отправляю прошлые анализы — сегодня консультация онлайн, пусть врач посмотрит заранееАнализы_март.pdfPDF · 1,2 МБ10:14
Администратор Полина
Получили, спасибо. Передадим Барковской Анне — она посмотрит до консультации.
П
Ссылку пришлём за час до начала, в 11:00. Консультация идёт в формате онлайн-информирования: врач поможет сориентироваться и предложит план действий, но диагноз и препараты в таком формате не назначает.10:23
Переписка аккаунта — конец лентыВремя стоит **внутри** пузыря, в углу последней строки, и это отмена моего же вчерашнего отказа: отказывался по контрасту (приглушённый на белом пузыре 3.00:1), а замера соседа не сделал — снаружи, на странице, тот же цвет даёт 2.57:1, то есть внутри лучше. Приём известный: время лежит абсолютно, а в конец текста встаёт распорка, иначе последняя строка проедет под ним; ширина по худшему случаю («сейчас» плюс две галочки) — 72 у своих, 44 у чужих. Где обтекать нечем — вложение занимает всю ширину — время встаёт отдельной строкой под ним; сбой остаётся снаружи, у него мишень и красный цвет, который на брендовой заливке не читается. Замер: высота той же переписки 1212 → 1056, минус 156 пикселей. Пределы ширины у своих и чужих сравнялись: предел переехал со строки на колонку пузыря, было 288 против 248, потому что колонка кружка съедала 40. Кружок автора — правка дизайнера «можно для администраторов использовать аватарки», и стоит он у **низа** очереди сообщений: второй заход по референсу поддержки Т-Банка. Очередь «подписана» снизу, как подписывают письмо, и глаз находит лицо там, где реплика заканчивается. Колонка 32 держится и у продолжений группы, поэтому пузыри одного человека выровнены по одной линии; у своих сообщений кружка нет — своё лицо человеку не нужно. Имя показывается не над каждой группой, а когда сменился автор или начался новый день: с лицом в кружке четыре подписи «Администратор Полина» подряд — это четыре раза одно и то же. Администраторов двое, и они разведены по клиникам: у детской свой телефон, значит свой ресепшен, — а два лица делают правило смены автора проверяемым. Владелец тот же DoctorAvatar: поведение до последнего класса то же, а второго владельца одному поведению инвариант 2 не разрешает. Тонов подложки у него стало два — на странице стоит белый (1.17:1), потому что приглушённый даёт 1.02:1 и кружка не видно вовсе. Инициалы набраны чернилами: заглушка примитива приходила с приглушённым по приглушённому (2.66:1), и это был дефект не чата — снимки есть у десяти врачей из 82, то есть 72 врача показывались нечитаемо. Углы пузыря со стороны автора 6, с другой 16: у одиночного сообщения это хвост, у очереди — стык, из-за которого группа читается одним блоком. Шкала радиусов была «закрыта» на пяти ступенях, шестую открыл дизайнер правкой «сами баблы сделать более интересно»; число не выдумано — ровно 6 у пузыря в HTML-прототипе. Лента открывается снизу и короткая переписка стоит у поля: min-h-full плюс justify-end, во Flutter то же даёт ListView(reverse: true). Пузырь человека залит --brand-to (#008550), а не --brand: белым по #25ae6a — 2.86:1, и абзац 14/20 таким контрастом набирать нельзя; тёмный конец даёт 4.70:1 у взрослой клиники и 4.58:1 у детской. Вложение — карточка с именем и размером на плашке в 12 % чёрного (#007546, белым 5.78:1): приём из разбора клиники Фомина, где вложение выглядело безымянной ссылкой. Нажать её нечем и это названный долг — просмотрщика нет. Хвоста у пузыря нет: в прототипе один угол скруглён на 6, а в шкале радиусов такой ступени не существует, и заводить шестую ради одного угла дороже, чем оставить авторство на трёх признаках — сторона, заливка, имя над первым сообщением группы. Время и статус стоят у последнего сообщения группы, имя — над первым: 72 пикселя разговора против четырёх повторов подписи.
Вчера
Записалась на УЗИ молочных желез 6 августа, задаток уже списали. Он войдёт в стоимость приёма?
И ещё: готовиться к УЗИ как-то нужно?18:43
Администратор Полина
МарияЗаписалась на УЗИ молочных желез 6 августа, задаток уже списали. Он войдёт в стоимость приёма?Да, задаток 1 000 ₽ войдёт в стоимость приёма, остальное оплатите в клинике.
П
Перед приёмом достаточно освежить верхнюю часть тела и область подмышечных впадин. Мазок и онкоцитологию можно сделать в тот же день: жидкостная онкоцитология — 4 830 ₽, добавит к приёму 15 минут.19:07
Начало ленты: цитата и «более ранние»Цитата стоит там, где без неё не понять: человек задал два вопроса подряд, и администратор отвечает на первый. Первый заход цитировал соседнее сообщение — цитата повторяла то, что и так на экране, за три строки в пузыре. Разделитель дня здесь простой текст, а не таблетка: замер до правки — подпись и кнопка «Показать более ранние» стояли в 24 друг от друга, обе с радиусом таблетки, различались заливкой 1.02:1 против 1.17:1 и шестью пикселями высоты, то есть подпись читалась второй кнопкой. Кнопка держит якорь прокрутки: до правки высота содержимого росла 1212 → 1594 при неизменном scrollTop, и читаемое сообщение уезжало на 382 пикселя вниз. Цитирование — требование ТЗ, и оно здесь без вертикальной черты: border-l-2 при скруглении 16 рисуется не полосой, а серпом по левому краю, потому что граница идёт по контуру. Выпрямлять левые углы нельзя — плашка стоит с отбивкой внутри пузыря, и квадратный край посреди скруглённого читается как сбой вёрстки. Отделяет цитату сама плашка, то есть одна вложенная поверхность на два содержимого: цитату и вложение. Кнопка «Показать более ранние» открывает февраль и июнь: справку для вычета и вопрос про анализы без направления. Автоподгрузка по прокрутке отклонена: она уводит содержимое из-под пальца.
Вчера
В пятницу у Лёвы осмотр перед прививкой. Сертификат нужно приносить?19:12
В
Администратор Вероника
Здравствуйте! Не обязательно — все прививки Лёвы есть в его карте, врач впишет новую туда же. Если бумажный сертификат у вас на руках, возьмите, продублируем.19:20
Поняла, спасибо! На всякий случай фото сертификатаСертификат_прививок.jpgJPG · 2,4 МБ19:21
Детская клиника — тот же компонент, другая область видимостиС 07.10.2026 в приложении чат один на аккаунт и в цветах взрослой клиники — решение клиента 10.09.2026: «Администратор — это один чат». На вопрос о Лёве в той же ленте отвечает Вероника, администратор детской клиники. Здесь те же сообщения под clinic-kids: пузыри и галочки сиреневые без единой правки в компоненте, цвет приходит из scope-класса. Белым по #9843ff — 4.58:1, порог AA пройден и здесь.

Нашли 3 сообщения

Поиск по переписке: запрос «сертификат»07.10.2026, требование ТЗ «поиск по истории». Лупа слева в шапке открывает поле на месте шапки, поле ввода сообщения на время поиска скрыто. С двух букв лента сменяется найденным, новые сверху: ChatSearchRow — кто, день и время, текст с подсвеченным запросом (bg-brand/15), имя вложения со скрепкой. Ищет по тексту и цитате, по автору («Вероника», «Вы»), по дате («июня», «вчера», а вчерашнее и по «15 июля») и по имени вложения: свои файлы пациента есть только в чате, в «Документах» их нет. Совпадение по основе слова находит, но не подсвечивает. Длинный текст обрезается слева, чтобы совпадение попало в две строки. Нажатие возвращает в ленту: ChatThread встаёт на сообщение по центру и подсвечивает его (flash-change), ранняя история раскрывается сама.
Сегодня
Задаток войдёт в стоимость приёма?18:42
П
Администратор Полина
Да, 1 000 ₽ войдут в стоимость. Отмените больше чем за сутки — вернём на карту.18:51
Ещё хочу добавить онкоцитологию18:53
П
Добавим: жидкостная онкоцитология — 4 830 ₽ и 15 минут к приёму.18:56
Уточню в конце днясейчас
Можно перенести приём на другой день?
Не отправилось
Администратор печатает
Отправка: уходит, «печатает», сбойКейс — таблица состояний, а не момент переписки: одновременно они не встречаются, и ответ клиники между сообщениями стоит здесь по делу — время и галочки показываются у последнего сообщения группы, значит без чужой реплики «прочитано» и «доставлено» рядом не увидеть. Три состояния одного пути, и два из них по Р-6 наши, а не платформы. Пока сообщение уходит, галочки нет вовсе — её появление и есть сигнал «дошло»; часы на это место не встали, потому что знак clock заполняет свой квадрат целиком и рядом с 12-м кеглем он вдвое крупнее галочки, а уменьшать его до 16 нельзя (усохнет обводка, разбор у close-small). Дальше одна галочка — доставлено, две — прочитано, перекрытие 16 при глифе 7.2. «Печатает» приходит через 450 мс и снимается вместе с ответом — числа из прототипа; габарит у него ровно как у пузыря с одной строкой (44), иначе индикатор читается не как сообщение, а как отдельный элемент интерфейса. Сбой проверяется настоящим navigator.onLine: выключите сеть — сообщение останется с подписью и кнопкой. Названная цена: --destructive #e41202 на странице даёт 4.10:1, то есть 12-й кегль им набран ниже порога AA — токен выбирался под белый текст по красному (4.79:1). Смысл поэтому несёт не цвет: «Повторить» набрано чернилами (15.50:1). Спиннера в кнопке отправки нет, и это правка DESIGN.md: ожидание принадлежит сообщению, а занятая кнопка запретила бы писать следующее.

Обычно отвечаем за 15 минут

Клиника работает каждый день с 9:00 до 21:00. Напишите — администратор ответит и подскажет, что делать дальше

С чем помогаем чаще всего

Здесь отвечают администраторы: помогут с записью, документами и оплатой. Про симптомы и лечение спрашивайте врача на приёме — в чате мы не консультируем.

Медкарта Нины — переписки ещё не былоДисклеймер живёт здесь, и только здесь — правка дизайнера: «зачем фиксировать это сообщение под шапкой чата? этот текст скорее надо для эмптистейта, когда диалога ещё не было вообще». Первый заход держал его закреплённым над лентой на всех медкартах, и мой довод (в прототипе он первым элементом ленты, а лента открывается снизу, значит его никто не прочитает) решал не ту задачу: вопрос «о чём тут можно спрашивать» человек задаёт до первого сообщения, а не на сто первом. В открытой переписке четыре строки приглушённого текста отнимали 80 пикселей из 745 постоянно. Оформлен Footnote — владельцем сноски с волосяной линией: это оговорка ко всему блоку, а не ещё один его пункт. Порядок из свода интонации: сколько ждать, с чем помогают, и только потом чего в чате не делают. Само пустое состояние с настоящим носителем: карту Нины только что привязали, в ней нет ни приёмов, ни документов, ни переписки. Владелец EmptyState здесь не годится ни одним из двух видов: stub значит «этого ещё нет в макете», а чат собран; empty даёт одно действие, а здесь их четыре, и каждое кладёт свой текст в поле. Темы — таблетки, а не строки со шевроном: шеврон обещает переход, а тема попадает в поле, не сходя с места. Это отмена решения 03.09.2026, когда те же четыре фразы превратили в перечисление с маркером: тогда нажать их было нечем — поля ввода на экране не существовало, — и четыре мёртвые мишени были бы хуже списка. Появилось поле — довод исчез. Приглашение стоит по центру свободного места, как у пустых уведомлений.
Анализы_март.pdfPDF · 1,2 МБ
Поле ввода: пустое, готовое и с файломПолоса белая, поле в ней приглушённое — и это перевёрнутый первый заход по правке «не нравится, как выглядит нижняя часть». Дефект был в порядке ступеней: полоса шла цветом страницы, поле белым, а сразу под ней начиналась белая панель вкладок — две почти одинаковые по светлоте полосы подряд, и низ экрана читался не как панель ввода, а как обрезок фона над вкладками. Референс устроен наоборот: полоса ввода — часть нижней обвязки, заливается тем же белым, что вкладки, а поле внутри неё приглушённое и видно ступенью 1.13:1 (--muted по белому — ровно та ступень, для которой токен заведён). Поле — таблетка, пока в одну строку: радиус 20, при высоте 44 это визуально таблетка, а на четырёх строках остаётся спокойным прямоугольником; настоящая rounded-pill дала бы на 104 пикселях радиус 52 и капсулу. Мишени стали 44 вместо 48 — одна высота с полем, и полоса перестала распирать низ экрана. Скрепка прикрепляет по-настоящему — правка дизайнера: «в примере чата ты показал, что пользователь отправил файл pdf, но кроме отправки сообщений не сделал функционал прикрепления файлов». Первый заход отказал по двум доводам, и оба были неверны: «знака нет ни в макете, ни в спрайте» правило системы читает наоборот — знак не берётся у чужого набора, но рисуется в идиоме своего, так пришёл arrow-right; а «выбор файла отдаёт SDK» верно только про сам пикер, тогда как мишень стоит в нашей строке ввода. Нажмите скрепку прямо здесь: откроется настоящий системный пикер, имя и размер в черновике будут от выбранного файла, а строку «PDF · 1,2 МБ» собирает fileMeta — тип из расширения, а не из MIME (у скана из «Госуслуг» MIME бывает application/octet-stream), мегабайты с одним знаком, делитель 1024 как у телефонов. Черновик стоит над полем, а не внутри: внутри он отнимал бы место у текста и уезжал бы вместе с ним при прокрутке в четыре строки. Отправить можно и молча, с одним файлом. На кнопке стрелка вверх, а не самолётик: правка дизайнера «не нравится иконка на кнопке отправки сообщения». Довод замеряется — видимая часть самолётика это три тонкие линии под острым углом, и при 24 с обводкой 1.5 они сливаются в мутный треугольник; у стрелки два штриха и прямой угол. Тот же знак в референсе поддержки Т-Банка. Залитый самолётик собирался и отклонён: читался бы отлично, но стал бы единственным залитым знаком набора. Кнопка отправки на тёмном конце бренда по тому же замеру, что пузырь: у знака порог 3:1, белым по #25ae6a — 2.86:1, по #008550 — 4.70:1. Скрепка залитой не бывает: два брендовых круга по краям поля спорили бы за главное действие. Пустое поле — кнопка приглушена и disabled, единственный случай, где неактивная кнопка не требует объяснения под собой. Появился текст или файл — кнопка подрастает на 6 % (приём из прототипа), и рост едет на переходе press-tap. Поле растёт до четырёх строк (104 = 4 × 20 + 24); высота ставится императивно из scrollHeight. Обводки 3:1 у поля нет, и это уже решено у поиска: признаком поля работают белая заливка на тонированной странице, подпись и две мишени рядом.

Карточка цикла

Все состояния одной моделью: карточка получает цикл и дату, а фазу и вид каждого кружка считает сама. Захардкоженные кружки выглядят правдоподобно ровно до первого вопроса «почему тут так».

Узлы 56:5688, 58:6050 и 56:5414. Белая карточка 361, радиус 24, отбивка 15 по горизонтали и 16 по вертикали — 15 стоит во всех трёх фреймах, это не описка. Высота считается из содержимого: 194 без предложения, 338 с ним.

Виды кружка дня

Шесть видов и модификатор «выбран». Слева обычная ячейка, справа выбранная — у неё белая подложка, и на ней видно, зачем у белого диска белая обводка. Кружки — не текст и не единственный носитель факта: под каждым стоит число, а фаза названа словами в заголовке. Поэтому порог контраста 3:1 к ним не применяется; замеры для протокола — #cb6440 к ячейке 3.42, #00a6ff — 2.36.

чт
12
чт
12
Обычный день, прошёлЗалит цветом ячейки, обведён белым — видна только обводка. «День прошёл, ничего не отмечено».
чт
12
чт
12
Обычный день, не наступилЗалит белым, обводка — цветом фона ячейки. Была белой, и на белой плашке выбранного дня диск исчезал совсем: у дня оставалось одно число.
чт
12
чт
12
Менструация, фактСплошной #cb6440 — терракота. День уже отмечен.
чт
12
чт
12
Менструация, прогнозТот же цвет в 44 % по белому плюс обводка в полный. Прогноз отличается светлотой, а не цветом.
чт
12
чт
12
Фертильное окно, прошлоОсветление #8fd8ff с обводкой #00a6ff. Осветление, а не сплошной цвет: окно не наблюдается никогда, и пройденное остаётся расчётом — просто расчётом про прошлое.
чт
12
чт
12
Фертильное окно, прогнозВ полоске выглядит так же, как пройденное окно, и это намеренно: пустой кружок здесь занят обычным будущим днём. Вид завёлся 10.09.2026 ради календаря по месяцам — там прогноз рисуется одной обводкой, а пройденное окно заливкой.
чт
12
чт
12
День овуляцииСплошной #00a6ff. Названное отступление от правила «прогноз светлее».
До первой отметки: приглашение кадром ленты
Медкарта Киры — первый входПравка дизайнера 04.09.2026: «а откуда мы будем знать цикл, если это первый вход?» Он поймал настоящую ошибку — у только что привязанной карты на этом месте стояла обычная карточка цикла с «днём 12» и «фертильным окном», то есть данные, которых у человека, установившего приложение на ресепшене, нет и быть не может. Чинилось не косметикой: цикл лежал в сторе одной моделью на сеанс, и «карта ведёт цикл, но данных нет» выразить было нечем. Теперь цикл принадлежит медкарте тем же приёмом, что приёмы: демо-данные в demoCycles, сеансовые изменения кладёт стор поверх, нет ключа — нет данных. Блок обещает словами и не показывает ни одной даты: клиент писал, что человек должен быть «ознакомлен с преимуществом записи основываясь на своих особенностях», — ознакомлен, а не показан выдуманными числами. Пятый заход, и четыре предыдущих дизайнер отклонил — все они записаны в докблоке блока, потому что каждое отклонение сняло приём, а не оформление. Коротко: шаблонный баннер со знаком 40 («скучный по вёрстке и содержанию»); правило рисунком из семи кружков дней цикла («непонятно, что за числа» — рисунок, который надо подписать, не рисунок); пунктирное кольцо (дизайнер сам выбрал его из четырёх вариантов и сам отменил после отрисовки — «кольцо вообще непонятно для чего», и причина моя: у заполненной карточки на главной кольца нет вовсе, там полоска дней); белая карточка «поменьше» — заголовок, строка с числом, мягкая кнопка, — принятая 04.09.2026 и отменённая на следующий день. Отменена по правке «может, правильнее про подбор даты от цикла отображать в верхней карусели на зелёном фоне? сделать для этого отдельный слайд?», и правка попала в живое место: на первом входе экран собирался из двух приглашений подряд — зелёный кадр «Здесь появятся ваши приёмы» с белой кнопкой и белая карточка «Подберём дату под ваш цикл» с белой кнопкой на 152 пикселя ниже. Это нарушало правило, которое в HomeScreen записано давно: два пустых состояния подряд не показываем, призыв остаётся один — в карусели. В ленте кадры листаются, и человек видит один первый шаг за раз; колонка вернула себе 152 пикселя. Место в очереди содержательное: после приёмов и до рекомендаций — приёмы это факты, цикл про мои даты, рекомендации про услуги клиники. От соседнего приглашения кадр отличают настоящее число в первой строке (у приглашения записаться чисел нет и быть не может — оно про пустоту) и надстрочная строка в слоте даты: «Отметок ещё нет» против «Пока записей нет». Предмета справа нет, и это названная цена: тот же стеклянный календарь на двух кадрах одной ленты читался бы как одна карточка, показанная дважды, а в наборе всего четыре предмета и ни один не про цикл. Честный ответ — новый стеклянный предмет под окно 88, и это генерация по библиотеке промптов, то есть решение дизайнера. Одна услуга при этом не называется, и это тоже правка: «гораздо больше услуг можно рекомендовать в зависимости от цикла». По выгрузке признак cycleDependent стоит у шести услуг, посчитанное правило окна есть у пяти — в строке пять, потому что это то, что приложение умеет. Число берётся из таблицы правил, склонение — из владельца plural. Нажатие открывает календарь в режиме выбора первого дня, а не отмечает сегодня: возражения дизайнера — «а если месячные были неделю назад? а если нажал случайно и сразу применился сегодняшний день?» — оба верные. В этом режиме календарь показывает два месяца назад и ни одного вперёд, фазы не красит (красить нечем), будущие дни гасит, а касание только выбирает: отметка ставится кнопкой «Отметить 9 июля» внизу над панелью вкладок. Случайную отметку можно убрать: у первой отметки «Убрать отметку» удаляет цикл целиком, и блок снова становится приглашением. Проверено на четырёх картах: отметка Кирой не тронула цикл Марии — 12-й день остался 12-м, — а предложение УЗИ у Киры пересчиталось из её отметки, 20–22 июля против 7–9 августа у Марии.
Фазы: одна модель, разные даты

Месячные начались 5 июля

Следующие ≈ 3 августа

Месячные · день 3День 3. В неделе есть и факт менструации (сплошной цвет), и её прогноз (осветление с обводкой) — единственное место, где эти два состояния стоят рядом.

Месячные начались 5 июля

Следующие ≈ 3 августа

После месячных · день 10День 10. Фаза названа, но своего цвета у неё нет: подпись серая. Кружки фертильного окна уже видны справа — окно начинается раньше, чем фаза сменится.

Месячные начались 5 июля

Следующие ≈ 3 августа

Шанс забеременеть выше · день 12День 12 — состояние из макета (узел 142:12747). Всё окно осветлением с обводкой: оно всегда прогноз, наблюдать его нечем.

Месячные начались 5 июля

Следующие ≈ 3 августа

Овуляция · день 16День 16. Единственный сплошной синий кружок. Отступление от правила «прогноз светлее» сделано сознательно: к этому дню привязана запись, и он должен читаться сильнее соседей.

Месячные начались 5 июля

Следующие ≈ 3 августа

После овуляции · день 20День 20. Вся неделя пустая, кроме овуляции в начале. Подпись серая, как у фолликулярной: цвет несут только менструация и фертильное окно.

Месячные начались 3 августа

Следующие ≈ 1 сентября

После овуляции · день 29День 29, последний. Окно разрезано границей циклов: 1 сентября начинается следующий, и его первые дни идут осветлением прогноза. До прокрутки они были белыми дисками — см. отклонение ниже.
Полоска дней: прокрутка и выбор

Полоска листается пальцем, мышью и стрелками. Прокрутка ничего не выбирает — это осмотр: выбор ставит нажатие, и уже оно доводит день до центра. Первый заход считал выбранным день по центру, и тогда пролистать полоску, ничего не выбрав, было нельзя: заголовок менялся сам, стоило сдвинуть полосу на день. Уехав прокруткой, выбранный день может оказаться сбоку или за кадром — за этим и нужна кнопка «сегодня».

Месячные начались 5 июля

Следующие ≈ 3 августа

Выбран сегодняшний день — исходное состояниеСовпадает с макетом, и это не подгонка: 16 июля 2026 — четверг, середина недели, поэтому окно вокруг центра — ровно пн–вс. В правом верхнем углу пусто: кнопка «сегодня» встаёт туда, только когда выбран другой день.

Месячные начались 5 июля

Следующие ≈ 3 августа

Выбран прошедший день, сегодня ещё в кадре«Ваш» из заголовка ушло: про 14 июля нельзя сказать «ваш день цикла» в настоящем времени. Появилась дата подписью — в полоске видно число, но не месяц, а уехать можно на два цикла. И кнопка «сегодня» встала на место стрелки — в углу всегда одна мишень.

Месячные начались 5 июля

Следующие ≈ 3 августа

Выбран день овуляции, сегодня ушло влевоЧетыре дня вперёд — сегодня уже вне кадра, и обратно ведёт только кнопка. К фазе прибавилось «прогноз»: единственный сплошной синий кружок — тоже прогноз, как и осветлённые вокруг.

Месячные начались 5 июля

Следующие ≈ 3 августа

Выбран день следующего цикла — прогноз19 дней вперёд, второй день следующего цикла. Именно здесь видно отменённое правило макета: раньше вся эта неделя была белой. Слово «прогноз» рядом с фазой не декоративное — без него «менструация» через три недели читается как утверждение.
  • Неделя стала окном. Центрированный выбор с календарной неделей несовместим: чтобы день стоял по центру, слева и справа от него нужно по три дня, а не «сколько осталось до воскресенья». Поэтому в полоске бывает «пт сб вс пн вт».
  • Ширина клетки не меняется при выборе. Плашка 48 нарисована оверлеем поверх клетки 40. Будь она размером контейнера, выбор смещал бы соседей на 8 пикселей и снап пересчитывал бы точку доводки — полоска дёргалась бы под пальцем на каждом дне.
  • Цена неподвижной сетки: от плашки до соседнего кружка 11 вместо 15 в макете. Ритм самих кружков — 23 между краями — совпадает точно, а читается именно он.
  • Отклонение от макета: прогноз дотянут до следующих циклов. В макете дни следующего цикла белые (узлы 56:5725 и 58:6087) — правило писалось для одной статичной недели. С прокруткой оно превращается в дыру: две недели вперёд — и полоска пустая, хотя модель периодическая. Отменяется одной строкой в dayKind.
  • Прошлые циклы в полоску не попадают. Модель знает одно начало — последнюю отмеченную менструацию. Слева полоска кончается на нём, и пустое место у края читается правильно: запись начинается здесь. Красить более ранние дни в факты значило бы придумать историю.
  • Экран цикла открывает вся карточка. Правка дизайнера 05.09.2026 — «тап по всей области виджета, а не только по стрелке». Мишень это прозрачный слой во всю карточку (владелец CardTarget), а не оболочка: внутри живут свои мишени — дни в полоске, «сегодня», плашка предложения и её крестик, — и кнопка внутри кнопки невалидна. Ценой ушёл отклик на нажатие: масштабировать прозрачный слой нечего, а сжимать карточку целиком нельзя — тогда она сжималась бы и от нажатия на день.
  • Стрелка стала знаком, а в углу осталась одна своя мишень. Пока выбран сегодняшний день, в углу серая стрелка — она больше ничего не ловит, а говорит, что карточка куда-то ведёт. Выбрали другой день — на том же месте кнопка возврата: у неё своё действие, и она остаётся кнопкой. «Две мишени подряд в одном углу» так и не появились — это отвергнутый вариант, в нём верхняя вела не туда, куда смотрит рука. Второе отвергнутое место — оверлей над полоской: он накрывает клетку целиком, и один день исчезает под кнопкой, предлагающей уехать к другому. Автовозврат по таймеру отклонён: интерфейс, который сам уезжает из места, куда его привели, читается как сбой. С клавиатуры возврат — Home.
  • Перетаскивание мышью — строительные леса для показа с ноутбука, владелец useDragScroll, общий с каруселью карточек. При порте не переносится: на телефоне свайп.
С вложенным предложением

Блик переехал с подложки на строку действия (правка дизайнера 05.09.2026), и вместе с ним ушёл шеврон: у строки теперь один признак нажимаемости, а не два. Плашка большая и светлая, проход по ней читался как погода — что-то шевелится, а нажать нечего конкретного; строка действия единственное, что на плашке нужно нажать. Владелец — sheen-text: градиент кладётся фоном и обрезается по буквам, полоса светлее текста на 25 % и занимает 15 % строки. Цена обратная прежней: блик по подложке текст осветлял и контраст на проходе поднимал, а блик по самим буквам их светлит — 2.54:1 в покое против 1.95:1 на проходе, и строка единственный носитель цены. Тёмный проход вместо светлого поднял бы контраст до 4.16:1 (#018551) — решение за дизайнером.

Месячные начались 5 июля

Следующие ≈ 3 августа

Узел 142:12058 — карточка 310Окно 5–7 дня цикла считается, а не пишется руками: в прототипе его сначала всегда брали из следующего цикла, и на третий день приложение предлагало дату через месяц вместо послезавтра.
Предложение отдельноПлашка сама по себе, без отрицательных полей карточки: так видно её собственную геометрию — радиус 20, отбивка 15 и 16, гэп 12, высота 104. Подложка нейтральная #eaf3f3, а не брендовая, как в макете: брендовая была бы второй по площади цветной поверхностью главной — 38 124 px² против 34 656 у блока тревоги, — а крупная брендовая плоскость на экране допускается одна. Брендовым остался только текст действия. Нажимается вся плашка целиком, а не строка: 337 × 104 против прежних 339 × 36. Заголовок — Roboto Condensed Medium 16/20, то есть у него с заголовком карточки разные кегль, вес и гарнитура: 18/24 Manrope SemiBold спорил с ним на равных. С 07.09.2026 у плашки второй носитель — предложение под кольцом на экране беременности: «Скрининговое исследование II триместра», правило клиники о сроке и цена. Там она стояла строкой со знаком (PlateRow), и дизайнер снял расхождение доводом «единообразие у одинаковых элементов» — содержание у них и правда одно. Крестика там нет: скрывать пункт плана некуда. Подпись действия при этом переменная — «Записаться на приём», когда срок идёт, и «Записаться заранее», когда пункт ещё впереди: эту разницу до правки нёс знак строки, часы против календаря. В тот же день появился и третий носитель — предложения дня на экране цикла, лентой под кольцом. Там плашек бывает от одной до пяти, и подпись действия тоже переменная: «Записаться на этот день», когда день подходит по правилу клиники.
С крестиком — так плашка стоит на главнойПравка дизайнера 05.09.2026: предложение можно скрыть, если оно не интересно. Крестик — сосед плашки в разметке, а не её ребёнок: плашка это button, и кнопка внутри кнопки невалидна — браузер разбирает такую разметку как попало, а нажатие достаётся то одному, то другому. Крестик взят из макета напрямую — узел 156:3665, третий заход. Первые два были угадыванием: сначала знак без плашки (тон plain), потом, на «сделай как в фигме», 32 с белой подложкой и тёмным знаком — по числам соседних контролов. Дизайнер выделил плашку в Figma, и в макете оказалось третье: круг 24 белым в 56 %, крестик приглушённым цветом в 40 %, вписанный в поле 24 как 9→15 (6 при обводке 1.5), и позиция 8 от края, а не 12. То есть контрол тише всего, что мы пробовали: сведённая подложка #f6fafa — 1.07:1 к плашке, знак #c8d3d3 — 1.46:1 к своей подложке, против 18.1:1 второго захода и 2.66:1 первого. Порог 3:1 для графического контрола не берётся втрое, но значение из макета не подменено: выбор цвета принадлежит дизайнеру. Подложку рисует разметка, а не файл знака — то же правило, из-за которого у аватаров врачей меняли выгрузку с запечённым зелёным. Мишень до 44 растит tap-44. Заголовок получает отбивку справа только когда крестик есть: в макете её нет, потому что там заголовок короткий, а у нас название приходит из прайса. Без обработчика крестика нет вовсе — на экране цикла предложение живёт шторкой дня, и скрывать там нечего. Скрытие помнится до следующих месячных: ключ хранения — дата начала цикла, отметили новые — окно посчиталось заново, и предложение вернулось.
Описание в две строкиОкно, попавшее на границу месяцев, длиннее любого внутри одного месяца — описание переносится, и плашка вырастает со 104 до 120, а карточка с ней. Это правильное поведение, а не запас: в одну строку описание занимает 294 из 307, то есть предел близко и его надо видеть.
Кольцо цикла

Главная фигура экрана «Мой цикл». Холст 288: снаружи дуга прогресса 4, просвет 6, полоса фаз 28, внутри чаша 212. Перерисовано 05.09.2026 по референсу дизайнера: подряд идущие дни одного вида — один отрезок с круглыми торцами, а не двадцать девять отдельных дуг. Словарь видов дня у кольца, полоски и календаря один (dayKind): кольцо — не второй график со своими правилами, а тот же ряд дней, свёрнутый в круг.

03.09.2026 кольцо перестало быть картой дней — правка дизайнера «выглядит довольно просто и стандартно». Точки дней внутри полосы сняты: тот же атлас дней рисовала полоска сверху, и две одинаковые карты в одной панели читались как виджет из набора, а работу «где граница дня» полоска делает лучше — там у дня есть подпись, число и мишень. Кольцу осталось то, чего полоска не умеет: показать длину цикла целиком и место в ней.

Тем же проходом: полоса выросла с 20 до 28, метка 40 с числом месяца стала ползунком 24 без числа (в центре стоял день цикла, а на метке — число месяца, два числа с разным смыслом в ста пикселях друг от друга), внутренний круг подтонирован цветом фазы (cycle-bowl, 16 % к краю: до правки там было 248 пикселей белой пустоты; третьим проходом чаша отодвинута от полосы на 10 и обводки не имеет), а прогресс вынесен наружу отдельной дугой. Дорожки под отрезками больше нет — в просветах между фазами видна сама панель, а не тёмное кольцо. Прогресс сначала попробовали красить внутри полосы — пройденные нейтральные дни брендовым, — и отрисовка показала, что зелёная дуга между красной и синей читается четвёртой фазой. Снаружи спутать её с фазой нечем: другой радиус, другая толщина, другой цвет.

Сегодня отмечено зелёной меткой внутри полосы фаз — 11.09.2026, и она заменила собой пилюлю «Сегодня» над полоской дней: та появлялась при уходе с сегодняшнего дня и роняла кольцо вниз на 40 ровно тогда, когда на кольцо смотрят. Метка ничего не двигает, она лежит внутри холста. Первый заход поставил её на конец дуги прогресса — угол тот же, — и дизайнер поправил: снаружи она становилась утолщением дуги, то есть читалась её частью, а не отдельным днём. Дни живут в полосе фаз, там же, где метка выбранного дня. Кружок 14 в белом кольце до 20 — те же 20 против 28, что у плотной отметки месячных; белое кольцо обязательно, цвет фазы под меткой свой в каждом месте круга. Показывается только на не-сегодняшнем дне: на сегодняшнем её место занимает метка выбранного дня, и две метки на одном угле были бы одной мыслью дважды. Метка ещё и мишень — возврат на сегодня, 44 при знаке 20.

В центре стоит вероятность забеременеть, а не даты овуляции и следующих месячных (11.09.2026). Довод дизайнера тот же, что снял легенду фаз: обе даты уже нарисованы этим же кольцом — фаза названа словом, дуги показывают её границы, числа лежат в календаре. А вероятность из кольца не читается никак. Три ступени словами, без процентов: число выглядит как знание, которого у модели по одному отмеченному циклу быть не может. Цена названа — дата следующих месячных ушла из слов.

День цикла3Месячные
День 3 — менструация, фактКрасная дуга начинается на двенадцати: первый день цикла и есть первый день месячных. Дни 1–5 сплошные — они отмечены.
Ваш день цикла12Шанс забеременеть выше
День 12 — фертильное окноСостояние по умолчанию. Полоса фазы идёт одной дугой, а то, что внутри неё, помечено плотной отметкой толщиной 20: день овуляции внутри фертильного окна и отмеченные дни внутри полосы месячных. Оба приёма — правки дизайнера: сначала «сделать конечным кругом на полосе фертильности, и не отделять его в отдельный круг», потом «плотным красным закрашивать внутри полосы предположительных дней, логика как у дня овуляции». Разница толщин 28 и 20 даёт по 4 светлого поля с каждой стороны, поэтому контур фазы непрерывен, а отметка лежит на полосе, а не рядом с ней. Здесь месячные прошли целиком, поэтому плотным залита вся полоса; если отмечен только первый день, внутри стоит круг 20, как у овуляции. Просветы стоят между фазами, а не внутри одной. Метка выбранного дня — тот же торец дуги, что у одиночного дня, обведённый тёмным тоном своей фазы, а не чернилами (правка 04.09.2026): ставится теми же числами, что отрезки фаз, поэтому садится на день, а не рядом с ним. Внутри обводки цвет самого дня — то же обозначение, что в легенде. Сколько цикла прошло, говорит зелёная дуга снаружи, а не оттенок полосы.
День цикла · прогноз16Овуляция
День 16 — овуляцияПодпись переключается на вторую форму: до овуляции считать больше нечего, поэтому в центре дата следующих месячных. Здесь же виден смысл обводки: метка садится ровно на круг овуляции в торце полосы, и оба обозначения читаются — обводка говорит «выбрано», сплошной цвет внутри «это день овуляции». Ползунок с заливкой, стоявший тут первым заходом, накрывал бусину целиком — 24 против 28, от неё оставалось 2 пикселя каймы; кружок-линза 36 второго захода не ложился по границам дня — один день на этой дуге всего 26.
День цикла · прогноз20После овуляции
День 20 — лютеиновая фазаУ фазы своего цвета нет, и в центре она приглушена — как в карточке. Ровно здесь и работает тёмная подпись под ней: две приглушённые строки разного кегля вплотную читались бы как сбой вёрстки.
День цикла · прогноз2Месячные
День 2 следующего цикла — прогнозКольцо показывает цикл выбранного дня, а не сегодняшнего: уехали вперёд — и это уже следующий круг, весь целиком прогнозный. «Прогноз» стоит в надстрочной подписи, а не рядом с фазой: у центра кольца 160 пикселей против 331 в карточке, и рядом с фазой слово переносилось бы всегда. Дуги месячных светлее фактических. Зелёной дуги прогресса здесь нет вовсе, и это правка 05.09.2026 — дизайнер поймал её на чужом цикле: «зелёная линия, если выбрать другой месяц, остаётся отображаться, хотя месяц уже не текущий». Дуга отвечает на «где я сейчас», а в цикле, который ещё не начался, у этого вопроса нет ответа. Условие — по циклу, а не по месяцу: цикл 29 дней и месяц не совпадают, и тот, что начался 20 июля, законно доживает в августе — там дуга остаётся.
Переключение дня: что двигается в центре

Правка дизайнера 04.09.2026 в два шага: «можешь добавить микроанимацию для дня цикла внутри круга? чтобы число как счётчик менялось», а затем «а можешь сделать более интересную? например первое число в десятке приезжает чуть раньше второго». Двигаются четыре вещи, и каждая — про переключение дня, а не про украшение. Число перелистывается по разрядам: старший идёт без задержки, следующий на 60 мс позже — половина --duration-tap на разряд (владелец RollingNumber, 220 мс на разряд). Метка едет по кольцу и везёт с собой цвет дня — переход стоит и на смещении, и на обводке, 320 мс. Чаша перетекает цветом фазы: переменная --bowl зарегистрирована как <color>, иначе цвет в градиенте менялся бы щелчком. Название фазы меняет цвет переходом, а слово подменяется мгновенно: текст на месте, движется только цвет.

Ваш день цикла12Шанс забеременеть выше
  • Лестница по разрядам, замер на настоящем нажатии (14 → 15). Через 30 мс старший разряд уже в пути — уходящая цифра на −10 при прозрачности 0.70, приходящая на +22 при 0.30, — а младший ещё стоит на месте: 0 и +32 при задержке 0.06s. Через 60 мс старший почти приехал (−31 / +1), младший в середине (−27 / +5).
  • Направление несёт смысл: шаг вперёд — цифры входят снизу, назад — сверху. Двигаются оба числа в паре: одно, исчезающее мгновенно, дало бы «новое влетело», а не «счётчик перелистнулся». Двойник во Flutter (AnimatedSwitcher со SlideTransition) держит обоих детей по той же причине.
  • Двигаются все разряды, даже неизменившиеся, и это выбор: иначе на шаге ±1 катился бы только младший, и лестницы не увидеть никогда. Цена — колесо с той же цифрой всё равно поворачивается; это табло, а не одометр.
  • Разное число разрядов (9 → 10) катится одним колесом: пары не выстраиваются, и уводить лишний разряд некуда — слота под него в новом числе нет.
  • Разряды не растащили число: замер ширины — 34.8 против 34.7 у той же строки одним куском, разница нулевая. Цифры Manrope одной ширины, плюс tabular-nums страховкой от смены гарнитуры.
  • Приходящие разряды монтируются заново по ключу. Без этого замер показал стоящее на месте число: узел переиспользуется, класс анимации на нём уже отыгран, и кадры не начинаются с начала. Первое появление не анимируется — счёта ещё не было. prefers-reduced-motion гасит всё глобальным правилом.
Ваш день цикла12Шанс забеременеть выше
Овуляция посчитанаНет базальной температуры — день овуляции считается по длине цикла: 16-й день из 29. Так выглядит цикл у всех, кто температуру не ведёт, и у тех, кто ведёт, но подъёма ещё не было. Оговорка внизу экрана в этом состоянии говорит прямо: «овуляцию пока считаем по длине цикла».
Ваш день цикла12Овуляция
Овуляция подтверждена температуройПодъём случился, и наблюдение вытеснило расчёт: овуляция на 12-м дне, а не на 16-м. Вместе с ней уехало фертильное окно, перекрасились дни и пересчиталась вероятность забеременеть — всё это считается от одной функции, поэтому меняется разом. Сегодняшний день из «фертильного окна» стал самой овуляцией.

Температура не предсказывает овуляцию, а подтверждает её — и от этого зависит вся раскладка. Подъём происходит после овуляции и виден, только когда держится несколько дней, поэтому приложение никогда не скажет «овуляция завтра» по температуре: оно скажет «овуляция была позавчера». Отсюда два состояния цикла, которые экран обязан различать словами. Правило обнаружения — «три над шестью»: три подряд измерения выше максимума предыдущих шести, третье выше него не меньше чем на 0,2 °C; овуляция приходится на день перед первым из трёх. Разовый скачок даёт болезнь, поздний отход ко сну и бокал вина — это названо в справке ТЗ, — поэтому значит не цифра, а ряд. Пропущенное утро окно не домысливает: нет хотя бы одного из шести — окно не считается вовсе. Алгоритм клиникой не подтверждён: в ТЗ его нет, сказано лишь «рассчитываем по ней».

Кольцо срока беременности

Прибор экрана «Моя беременность», собранный 03.09.2026 по задаче дизайнера «по стилю придерживаться экрана цикла». Геометрия та же — холст 288, полоса 28, просвет 6, чаша с отбивкой 48, метка тремя кругами: два состояния женского здоровья читаются одним прибором, и человек, освоивший экран цикла, не учит второй интерфейс.

Отличий от кольца цикла два, и оба по смыслу. Дуги показывают заполнение, а не только фазу: у цикла «сколько прошло» говорит отдельная дуга снаружи, а у беременности триместр и есть отрезок срока — поэтому здесь у каждого триместра дорожка и заливка по ней до сегодняшнего дня, а внешней дуги нет. Цвет — цепочка градиентов (--preg-1…4): конец одного триместра равен началу следующего, и весь срок читается одной растяжкой от сиреневого к зелёному. Стопы и приём — из TrimesterRing, кольца на виджете.

Поворот растяжки пришлось поправить на 90°, и это поймал замер: у дуг стоит rotate(-90), чтобы первая неделя пришлась на двенадцать часов, а градиент с userSpaceOnUse живёт в той же системе координат элемента и поворачивается вместе с ним. Без поправки первый триместр рисовался ровным синим: по пикселям 41 → 12 → 32 в красном канале там, где сиреневый стоп даёт 142.

Срок сегодня5недель 3 дняпервый триместрроды 3 декабря
Пятая неделя: первый триместр заполнен на треть, два других пусты. Чаша сиреневая — цвет первого триместра.
Срок сегодня20недель 3 днявторой триместрроды 3 декабря
Двадцатая неделя, состояние макета: первый триместр полон, второй наполовину. Метка стоит на дне, а не на неделе, — срок растёт каждый день. Ореол метки с 07.09.2026 не чернильный, а в тёмном тоне триместра — здесь #00513e, контраст к соседней дуге 3.52:1; логика взята у кольца цикла, светлота посчитана заново.
Срок сегодня33недели 3 днятретий триместрроды 3 декабря
Тридцать третья: третий триместр начался, чаша зелёная. Дальше сороковой кольцо не растёт — точные дни говорит центр.
Вероятность забеременетьНизкая
Низкая — вне фертильного окна. Фон нейтральный, и это ответ «сегодня ничего особенного» до того, как правая колонка прочитана.
Вероятность забеременетьСредняя
Средняя — фертильное окно, но не его пик. Заливка фазы вполсилы.
Вероятность забеременетьВысокая
Высокая — два дня до овуляции и сама овуляция. Заливка та же, что у дней фертильного окна в полоске: плашка не вводит новый словарь, а называет словами то, что нарисовано над ней.

ChancePlate — вероятность забеременеть на главной, под полоской дней и над предложением услуги: сначала «что со мной сегодня», потом «что с этим можно сделать». Шкала идёт внутри светлого, а не от серого к синему: полный цвет фазы во всю ширину карточки был бы крупной насыщенной поверхностью, а в системе бренд и фазы живут в мелких акцентах. С 14.09.2026 это строка свойства: слева предмет, справа ступень словом. Три точки, которыми ступень дублировалась, убраны — довод, на котором они держались («цвет различим, но не считается»), слово снимает целиком. При климаксе плашки нет вовсе — там прогноз овуляции не считается, и строка говорила бы неправду.

  • День 1 сверху, дальше по часовой. У кольца триместра дуга начинается на девяти часах — так в макете; здесь макета нет, и старт выбран смыслом: цикл читается как циферблат, а первый день цикла — первый день месячных, поэтому красная дуга начинается ровно на двенадцати.
  • Прогноза следующих месячных на кольце нет. Решение прототипа, и оно арифметическое: следующие месячные — это день 1 следующего цикла, а в круге на 29 дней места для него нет. Круг замыкается, и красная дуга в начале круга и есть будущая менструация. В прототипе кольцо и сетка месяца были нарисованы двумя независимыми наборами чисел и разошлись — разбор показал именно это.
  • Выбранный день — метка с числом, а не обводка. Кружок 40 на средней линии полосы: белая заливка, обводка 2 цветом фазы, внутри — календарное число. Число именно календарное, а не день цикла: день цикла крупно стоит в центре, и повторять его значило бы занять метку тем, что уже сказано. До 05.09.2026 здесь стояла пустая обводка 26 — на полосе 20 она читалась как дырка, а не как «вы здесь».
  • Точки дней — на средней линии. По одной на день, внутри самой полосы. Прототип на этом месте завёл отдельный токен --tick: белая точка терялась на сером секторе, тёмная — на красном. Здесь та же задача решена словарём, а не новым цветом: на насыщенной дуге точка белая вполсилы, на осветлённой — белая целиком, на светлой дорожке — приглушённая.
  • В центре две ступени кегля, а не четыре. Правка дизайнера: «не нравится типографика по центру круга — разнообразие кеглей». Было 14 / 28 / 18 / 14 на четыре строки: когда ступеней столько же, сколько строк, важность перестаёт читаться. Стало 28 у числа и 14 у всего остального; три подписи различаются цветом и плотностью, а не размером. С 07.09.2026 нижних подписей бывает две: до овуляции центр называет и её дату, и дату следующих месячных. Это возврат долга, а не украшение — вместе с блоком «Что дальше» с экрана ушла единственная строка, где дата следующих месячных была написана словами в первой половине цикла. После овуляции строка снова одна: прошедшую овуляцию называть незачем.
  • Цена сведения словаря: у дуги нет обводки — дуга сама обводка, — поэтому «прошло / не наступило» несут две ступени нейтрального: --line (1.24:1 к белому) против --muted (1.13:1), между собой около 1.1:1. Это очень мало, и носителем факта эта разница не является: где стоит сегодняшний день, сказано словом «сегодня» в полоске и заголовком «Ваш день цикла» в центре. На кольце она работает как граница между пройденной и предстоящей частью, а границу глаз ловит там, где двух отдельных пятен не различил бы.
  • Метка едет по дуге, а не по хорде. Правка дизайнера 05.09.2026 — «микроанимации при переключении дней как в прототипе», и приём взят оттуда дословно: метка это отрезок от центра с transform-origin: 50% 100% и переходом по повороту (у нас 320 мс — ступень «акцентная анимация», заведённая как раз под это кольцо). Число внутри контр-вращается на тот же угол с той же длительностью и остаётся вертикальным. Угол считается непрерывным — к позиции внутри цикла прибавляется полный оборот за каждый пройденный цикл, — иначе переход с двадцать девятого дня на первый ехал бы назад через весь круг, пока полоска едет вперёд.
  • Появление не анимируется. У кольца триместра есть заполнение лестницей (ring-fill) — там дуга это прогресс. Здесь отрезков пять-шесть, и последовательное появление читалось бы как загрузка: кольцо показывает позицию, а не выполненную долю.
  • Подпись в центре тёмная. Не вкус, а правило типографики: две приглушённые строки разного кегля вплотную читаются как сбой вёрстки, а у фазы в фолликулярной и лютеиновой своего цвета нет — она тоже приглушённая. Заодно честнее: «овуляция через 2 дня» человеку нужнее названия фазы.
Календарь по месяцам и отметка месячных

Обе вещи появились 05.09.2026 по правкам дизайнера: «на экране должен быть переход к календарю по месяцам» и «непонятно, как изменить день месячных после первой отметки». Календарь — третья проекция одного и того же ряда дней: те же dayKind, сплошное это факт, обводка той же краской — прогноз. Шторка отметки закрывает четыре случая: сдвиг на день назад, сдвиг вперёд (пропадает, если завтра ещё не наступило), выбор дня в календаре и откат последней отметки.

Июль 2026

Июль 2026: прогноз следующих месячных и фертильное окно — обводкой, отмеченные месячные и овуляция — заливкой. До 10.09.2026 прогноз рисовался осветлением 44 %, и дизайнер снял его двумя доводами: «не отличимо от пройденных дней почти» (осветление даёт светлоту около 0.85 — практически ту же, что у серых прошедших дней, и сетка читалась одним полем) и «ломается логика с легендой» (легенда называет три вида, а кружков на экране было пять). Обводка снимает оба: залитый кружок ровно один на фазу, пустой с той же обводкой — та же фаза, но ещё не наступила. Полоска осветление оставила: там кружок 24 на серой плашке, и пустой диск спорил бы с будущим обычным днём, который в полоске тоже белый. Сегодня в тонкой обводке, выбранный день в толстой; обе отбиты от кружка белым на 2, потому что у дня прогноза обводка фазы идёт внутри кружка и встык с кольцом читалась одной грязной линией.
Шторка дня, 11.09.2026 — ядро дневника из ТЗ клиента, и единственное место отметок: месячные стоят здесь первой строкой, отдельно от наблюдений и до них. Это не наблюдение — отметка двигает начало цикла и вместе с ним весь прогноз, окно овуляции и правила дня цикла у услуг. Повторное нажатие снимает, и это же заменило «Убрать отметку» из удалённой шторки месячных: та поглощена целиком, вместе со сдвигами «раньше/позже». Дизайнер выбрал шторку против отдельного экрана чек-ина: дневник заполняют задним числом, и вход нужен «в конкретный день», а не «в сегодня». Это не возврат шторки, удалённой 07.09: та отвечала на «что можно записать в этот день», и её ответ переехал на экран лентой предложений; здесь вопрос другой — «что было в этот день». Показаны все поля сразу, в продукте набор зависит от тумблеров: выделения и боль спрашиваются всегда, температура и слизь — если включены, близость — только при цели «планирую беременность». Про боль сказано словом, а не оценкой: ТЗ пишет «больше 6 не ок», а приложение оценок не ставит — вместо вердикта стоит предложение сказать врачу. Близость — строка с кружком выбора, а не чип: тринадцатым чипом подряд она читалась тринадцатым симптомом, хотя симптом описывает самочувствие, а близость это событие. Всё, что не наблюдение, здесь отбито линией и набрано иначе — тем же приёмом, что месячные сверху. Уровень боли стоит в заголовке поля («Сильная боль»), а не подписью под ним: «6 из 10» само по себе не говорит, много это или мало, а отдельная строка повторяла число в каждом состоянии. За порогом появляется красный остров (AttentionNote) — не оговорка: оговорка отделена линией и приглушена, то есть снимает с себя внимание, а тут нужно ровно обратное. Симптомы свёрнуты до пяти с «Ещё 7» — это два ряда чипов: четыре ряда читаются списком, в котором надо разбираться, два — полем, в котором надо выбрать. Отмеченное показывается всегда, даже из-за порога, иначе свёрнутая группа прятала бы собственный ответ. Заголовок шторки стоит один: чип «Начались месячные» побывал рядом с датой и уехал — дата это имя шторки, а отметка действие над её содержимым, и в одной строке они читались одним заголовком. Теперь первой строкой содержимого идёт «что за день»: слева день цикла и фаза, справа напротив них чип, а подсказка о переносе начала появляется только после нажатия. Каждая пара полей разделена волосяной линией: у чипов и у степпера разная форма и высота, и без линии подпись следующего поля садилась прямо под ряд чипов. «Сохранить» закреплена внизу на белом, вне прокручиваемой области: липкая кнопка остаётся в потоке и накрывает последний ряд содержимого.
Выделения
Симптомы
Чипы — новый примитив, и появился он из плотности, а не из красоты. Строка со SelectMark отдаёт варианту целую строку, и три слова превратили бы шторку дня в четыре экрана; Stepper для чисел на шкале, а у обильности шкалы нет — «умеренные» это не «половина обильных». Повторное нажатие по выбранному снимает выбор: поля дневника необязательные, и вернуться к «ничего не отмечено» надо уметь без кнопки «очистить» у каждого поля. Белым по бренду — 2.86:1, тот же названный случай, что у главной кнопки. Подпись группы — чернила 16 и отбивка 12, ряды чипов на 8. Правка «пилюли прилипают к заголовкам» чинилась семь раз, и шесть из них мимо: группа была fieldset, а подпись legend, который браузер вынимает из потока — gap до него не доходил вовсе. Теперь это div с role="group". У чипа есть слот под знак (icon у группы, не у варианта): им пользуется «Начались месячные» с каплей — группа из одного чипа, который на деле переключатель важного действия. Перечисление, где у каждого чипа свой значок, — это уже список, а не поле выбора.
Строки и контролы экрана цикла

Пять владельцев. NavRow — переход со подписью, которая несёт данные, а не пересказ заголовка: «Цикл 29 дней · месячные 5 дней», а не «настроить цикл». Смысл строки в том, что за большинством значений проваливаться не нужно. TodayButton — возврат выбора на сегодня; остался только в карточке цикла на главной, где делит угол со стрелкой. С экрана цикла он ушёл 11.09.2026: там он появлялся при уходе с сегодняшнего дня и ронял кольцо вниз на 40 ровно тогда, когда на кольцо смотрят, — возврат переехал зелёной меткой внутрь полосы фаз, на своё число. Stepper — ступенчатый ввод числа; границы приходят пропсами, потому что степпер не знает, что такое цикл. ChoiceRow и SwitchRow собраны 11.09.2026 вместе с настройками цикла. Первый выделен на третьем носителе: одна и та же раскладка была написана трижды — доп. услуги, способы оплаты, цель цикла, — и восстанавливалась копированием из чужого файла. Второй — первый переключатель в приложении вообще: примитив Switch лежал в витрине без единого носителя. Разница между ними не оформительская: кружок отвечает на «что из списка», тумблер — на «включено или нет», и кружки у независимых наблюдений сказали бы, что отмечать можно что-то одно.

Строка выбора: обычная и выбраннаяВыбранная обведена, а не залита: строка 88 высотой в брендовой заливке была бы крупной цветной поверхностью, а правило системы держит их светлыми. Кружок слева — глаз идёт по левому краю списка и сразу видит, что выбрано. У недоступной строки он гаснет, но причину обязана сказать подпись: серая строка без объяснения читается как поломка приложения.
Строка с переключателем: включённая и зависимаяНажимается вся строка, а не только тумблер: его собственная мишень 56 × 34 — по высоте ниже сорока четырёх, поэтому название обёрнуто в label, а строке задана высота 44. Слизь без температуры не бывает — правило из ТЗ клиента, и держит его стор, а не экран: иначе второй способ включить наблюдения обошёл бы правило.
Что можно в этот деньУЗИ малого таза — 7–9 августаНастройки циклаЦикл 29 дней · месячные 5 дней
Строка-переход: со знаком и безКружок 40 — левый рельс списка, по которому глаз идёт вниз; он нужен там, где строк несколько. У «Настроек цикла» знака нет, и это не про симметрию: правило системы — знак без источника не рисуется, а ползунки из прототипа взяты из чужого спрайта. Шеврон — arrow-right, а не стрелка в угол: arrow-up-right означает «открыть отсюда целый экран».
Длина цикла
29 дней
Месячные идут
5 дней
Степпер, живойКружок 32, мишень дотянута до 44 невидимым псевдоэлементом (tap-44). Значение стоит в колонке 72: без неё «5 дней» и «10 дней» двигали бы кнопки под пальцем на каждом шаге. На границе кнопка выключена, а не спрятана — исчезающая кнопка сдвигает значение, и следующее нажатие попадает не туда. Минус набран U+2212, а не дефисом: дефис на кегле 16 вдвое короче плюса.
Кнопка «сегодня»Высота 24 держит строку заголовка неизменной: в карточке цикла кнопка встаёт на место знака 24, и от подмены одного другим высота не меняется ни на пиксель. Подпись строчными — то же слово и тем же кеглем, каким подписан сегодняшний день в полоске.
Шторки экрана цикла

Открыты и стоят в настоящей рамке: шторка садится в её элемент через контекст, без рамки useDeviceFrame падает — намеренно. Шторки дня здесь больше нет — 07.09.2026 её содержимое переехало на экран: предложения дня стоят под кольцом лентой, а «консультация гинеколога» и «написать в клинику» — строками. Правка дизайнера: «мб логично и на экране цикла перенести такой блок под кольцо вместо шторки?».

«Как читать» — легенда, нарисованная модельюВиды дня не перечислены руками: для каждого ищется настоящий день в полоске текущего цикла, и строка показывает его — тот же CycleDay, с тем же числом. Захардкоженная легенда разъехалась бы с полоской молча. Происхождение здесь важнее цвета: «дни, которые вы отметили сами» против «посчитаны по длине цикла, а не отмечены» — это единственное, чего словами на экране не сказано нигде.
Справка про базальную температуруТекст из ТЗ клиента дословно: придумывать свои числа значило бы разойтись с клиникой на том, чего мы не проверяем. Вход — кнопка «Как мерить?» внутри строки самой температуры в настройках: инструкция нужна один раз, когда человек решает, будет ли он этим заниматься, а отдельной строкой под карточкой она читалась четвёртым наблюдением. Блоки разделены линиями, а фазы стоят двумя колонками — столбец чисел справа читается как шкала, видно, что температура растёт, не читая подписей. Первый заход шёл сплошным потоком и получил «сейчас всё смешалось визуально». Числа здесь описывают поведение температуры по фазам, а не задают норму: ни одного «должно быть» в тексте нет — страница справки самое лёгкое место перейти границу правила 8. Последняя строка называет то, что сбивает цифры, и делает это оговоркой, а не предупреждением.
Что расходится с макетом
  • «Прогноз» стоит вплотную к фазе, одним кеглем. 18/24 через висячую точку, приглушённым цветом. Прижатое к правому краю, слово читалось как ярлык всей карточки, хотя прогнозируется фаза. Самая длинная пара — «фолликулярная фаза · прогноз», 262 из 331 доступных: обрезки нет ни в одной фазе. У прошедших дней слова нет вовсе.
  • Подпись искала место четыре раза. Сначала дата стояла за заголовком; потом пилюля «сегодня» переехала на место стрелки, первая строка потеряла 80 пикселей, и строка перестала влезать — нужно 271, есть 256, обрезка была настоящей. Подпись ушла во вторую строку вправо, и только тогда стало видно, что дублируется само число: оно уже стоит в пилюле дня вместе с днём недели. Число осталось в пилюле, месяц переехал в саму полоску — «1 авг» у своей границы, — а слово «прогноз» на четвёртом заходе встало рядом с фазой. Оно нужно: разницу светлот на кружке 24 ещё надо разглядеть, словом это сказано надёжнее.
  • Цена УЗИ. В макете 2 800 ₽, в прайсе «УЗИ малого таза» — 5 200 ₽; позиции за 2 800 ₽ там нет. Третье расхождение по цене после чекапа и первого УЗИ.
  • Числа дней в узле 56:5688 перемешаны: 9, 10, 12, 11, 13, 14, 8 вместо 8…14. Это набор тех же чисел в другом порядке, то есть описка макета. Здесь дни считаются от даты и идут по порядку.
  • Окно УЗИ в макете противоречит заголовку: при «дне цикла 12» подпись обещает 16–18 июля, то есть 5–7 день **этого** цикла, который прошёл неделю назад. Посчитанное окно — 7–9 августа, следующий цикл.
  • Заголовок в узле 56:5414 — «День цикла 12», в двух других — «Ваш день цикла». Взят второй вариант, он в большинстве.
  • Стрелка `#C0D0D0` в правом верхнем углу убрана — её место заняла кнопка «сегодня». Замер остаётся в силе для других карточек: к белому фону 1.59:1, то есть единственным признаком нажимаемости этот цвет быть не может.

Знаки

Вся линия одним листом. Расхождения между знаками — спорящие мотивы, разный вес, пропавшее брендовое пятно — видны только когда они лежат рядом, а живут они по экранам.

Матовый пластик, три цвета: светлый корпус, брендовый акцент примерно на пятую часть предмета, тёмный якорь на ручках и подставках. Камера одна на весь набор, тени нет — знаки идут вырезкой в прозрачный PNG. Разбор стиля и промпты — docs/design/uikit/clay-prompts.md.

Гинекология
УЗИ-диагностика
Психотерапия и психиатрия
Планирование беременности
Ведение беременности
Неврология
Реабилитация
Аллергология и иммунология
Дерматология
Терапия
Эндокринология
Гастроэнтерология
Кардиология
Скрининги
Урология
Анализы
Вакцинация
Чекапы
Вызов врача на дом
Взрослая клиника — 19 направленийРазмер строки каталога, 48. Смотреть надо здесь: на большом размере проходит всё. Проверка на 48 и отбраковала прежнюю стеклянную линию.
Педиатрия
Детская психология и психиатрия
Детская гинекология
Детская неврология
Детская дерматология
Детская аллергология
Детское УЗИ
Детская гастроэнтерология
Детская вакцинация
Вызов педиатра на дом
Сон ребёнка
Патронаж новорождённых
Грудное вскармливание
Детская клиника — 13 направленийВосемь из них зеркала взрослых: тот же предмет, другой акцент. Цвет запечён в картинку, поэтому это отдельные файлы, а не тот же файл под scope-классом. С 13.10.2026 тёмные части детских знаков тёмно-фиолетовые, а не тёмно-бирюзовые: в детской лесенка «белый — фиолетовый — тёмно-фиолетовый», как во взрослой «белый — болотный — тёмно-бирюзовый».
Беспокоит зуб
Хочу виниры
Острая боль
Нет зуба
Скололся / сломался зуб
Проблемы с дёснами
Щёлкает челюсть
Профилактический осмотр
Хочу ровные зубы
Удалить зуб
All-on-4/6
Профессиональное отбеливание
Профессиональная чистка
Детский / подростковый ортодонт
Детский терапевт
Беспокоит зуб
Хочу виниры
Острая боль
Нет зуба
Скололся / сломался зуб
Проблемы с дёснами
Щёлкает челюсть
Профилактический осмотр
Хочу ровные зубы
Удалить зуб
All-on-4/6
Профессиональное отбеливание
Профессиональная чистка
Детский / подростковый ортодонт
Детский терапевт
Стоматология — 15 причин записи13.10.2026, по таблице причин клиники. Сгенерированы зелёными тем же блоком стиля, перекрашены маской: зелёный → болотный (тон −64°, светлота −0,05, у светлых насыщенность ниже — так же, как перекрашен весь набор 30.09) и в детскую — зелёный → фиолетовый, тёмно-бирюзовый → тёмно-фиолетовый. Зелёные мастера — docs/design/uikit/catalog-src/dent. Зуб — общий мотив, причину несёт одна деталь; где можно — свой предмет: сирена, щётка, имплант, сустав. Сирена красная и десна розовая — цвета смысла, маска их не трогает.
Врезка «Нужна помощь сегодня?»
64
Пустые уведомления
144
Пустые документы
144
Прошлых приёмов пока нет
88
Вы записаны
88
Цикл без отметок
88
Крупные знаки разделов и заглушекПоказаны в своих окнах. Названа цена перехода: файлы пришли в 240, и под окно 144 это запас 1.67× вместо принятых 4× — колокольчик и папку надо догенерировать мастерами 576. Материал матовый, поэтому на глаз это мягкость, а не пикселизация.
  1. Знак без брендового пятна растворяется на белой карточке — психотерапия вышла двумя белыми креслами.
  2. Тонкое исчезает первым: шнур датчика УЗИ и ножки кресел на 48 растворялись.
  3. Тёмный якорь — второй контраст, он держит силуэт.
  4. Один предмет, максимум два: три повторённых мелких дают гребёнку (штатив с флаконами).
  5. Знаки не должны спорить мотивом: штатив спорил сразу с пробиркой и флаконом вакцинации.
  6. Предмет из мира пациента, а не из инструментария врача: камертон человек не опознаёт, молоточек видел.
Шесть правил приёмкиВыведены из провалов, а не придуманы заранее: у каждого есть знак, на котором он сломался.

Примитивы

Стоковые компоненты shadcn: наши токены они уже слушают, масштаб у них пока свой. Приводить к макету — обёрткой или scoped-правилом по data-slot, никогда правкой файлов в components/ui.

Кнопка

Варианты, размеры и состояния. Приложение использует default и outline; secondary и ghost — для вложенных действий. У destructive заливка приглушённая, а не сплошная: сплошной красный на экране записи читается как ошибка, а не как отмена.

Поля

Граница поля — токен --input (3.62:1 к карточке), а не декоративный --border: WCAG требует 3:1 там, где рамка единственный признак поля. Ошибка выражается через aria-invalid, а не через класс: тогда её видит и скринридер.

В номере полиса 16 цифр

Выбор

Флажок, переключатель и радиогруппа. В приложении переключатель отвечает за напоминания и за показ цикла, радиогруппа — за выбор клиники и способа приёма.

Поверхности и метки

Карточка, бейдж, аватар, разделитель. У аватара два состояния одного примитива: снимок и инициалы — у пациента фото есть, у врача из выгрузки нет. Карточка примитива и карточка макета — разные вещи: у макета радиус 24 и белая заливка на тонированной странице, у примитива стоковый радиус. Свести их — работа фазы 3.

Смирнова Екатерина
Акушер-гинеколог
Ближайший приём — 3 сентября, 14:30. Приём длится 40 минут.
ПодтвержденоОнлайнЖдёт оплатыОтменено
АКСИКЕС

Сообщения

Alert — для состояния экрана, не для медицинской оценки: правило 8 свода tone of voice запрещает приложению оценивать здоровье.

Раскрытие и переключение

Табы и аккордеон. Аккордеон в приложении несёт правила подготовки к исследованию; табы — основа SegmentedTabs, в приложении это выбор клиники на записи.

Каталог взрослой клиники.

Шторка

Единственная поверхность, которая отделяется тенью, а не заливкой (--shadow-sheet). В приложении шторка снизу несёт управление записью — перенос, отмену, напоминание.