From 6d88ba030f9b0be281f9e2f01f95486ab1c23d01 Mon Sep 17 00:00:00 2001 From: IK Date: Mon, 7 Sep 2026 17:08:11 +0700 Subject: [PATCH] feat: add subtle fish silhouettes --- README.md | 2 +- apps/web/src/components/ActivityCard.astro | 2 ++ apps/web/src/components/FishSilhouette.astro | 9 +++++++++ apps/web/src/layouts/Layout.astro | 1 + apps/web/src/pages/fish/index.astro | 3 ++- apps/web/src/styles/fish-silhouette.css | 1 + docs/ROADMAP.md | 2 +- 7 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 apps/web/src/components/FishSilhouette.astro create mode 100644 apps/web/src/styles/fish-silhouette.css diff --git a/README.md b/README.md index e87e62a..fc5385a 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ RF4DB/RF4-STAT/RF4MAP/RF4 Posts сначала принимаются в изо Базовый SEO-контур готов для `rf4spotter.ru`: страницы имеют уникальные метаданные, canonical, Open Graph/Twitter Card, фирменное изображение 1200×630 и JSON-LD; доступны динамические `/robots.txt` и `/sitemap.xml`, административные и ошибочные страницы закрыты от индексации, добавлена собственная страница 404. Индексируемые каталоги рыб и водоёмов, detail-страницы и сочетания водоём + рыба строятся из актуального разрешённого справочника и включаются в sitemap. Подключены фирменные favicon/app icons, web manifest и production-кэширование статических ресурсов. Карточки активности показывают единый паспорт данных: источники, свежесть, полноту и уровень доверия. На `/status` опубликована легенда цветов всех источников и статусов качества. -Публичные точки используют постоянные читаемые адреса вида `/spots/kuori-85x92`; старые UUID-адреса остаются совместимыми и перенаправляются на канонический URL. На странице точки координаты дополнительно показаны фирменным радаром, который не имитирует отсутствующую географию водоёма, а уловы за 72 часа — шкалой-леской с 12-часовым шагом. +Публичные точки используют постоянные читаемые адреса вида `/spots/kuori-85x92`; старые UUID-адреса остаются совместимыми и перенаправляются на канонический URL. На странице точки координаты дополнительно показаны фирменным радаром, который не имитирует отсутствующую географию водоёма, а уловы за 72 часа — шкалой-леской с 12-часовым шагом. Карточки активности и каталог дополнены лёгкими SVG-силуэтами рыб без внешних графических зависимостей. Все пять community-парсеров подключены к отдельному scheduler-процессу. Состояние запусков и ошибок хранится в PostgreSQL, параллельный запуск одного источника блокируется, минимальный интервал жёстко ограничен 1800 секундами. Локально процесс включается профилем `docker compose --profile scheduler up -d`; detail-URL RF4MAP/RF4 Posts задаются переменными окружения. diff --git a/apps/web/src/components/ActivityCard.astro b/apps/web/src/components/ActivityCard.astro index 4e1ba95..300177f 100644 --- a/apps/web/src/components/ActivityCard.astro +++ b/apps/web/src/components/ActivityCard.astro @@ -3,6 +3,7 @@ import type { Activity } from "../lib/api"; import { activityLevel, ago, kg, plural, spotPath } from "../lib/api"; import FishingIcon from "./FishingIcon.astro"; import DataPassport from "./DataPassport.astro"; +import FishSilhouette from "./FishSilhouette.astro"; const { item } = Astro.props as { item: Activity }; const level = activityLevel(item.activity_score); const limited = item.catches < 3; @@ -12,6 +13,7 @@ const limited = item.catches < 3;
{item.waterbody}{level.short}{limited && Данных мало}

{item.fish}

+
{item.x}:{item.y} {ago(item.last_confirmed_at)}

{item.explanation}

diff --git a/apps/web/src/components/FishSilhouette.astro b/apps/web/src/components/FishSilhouette.astro new file mode 100644 index 0000000..db4b9de --- /dev/null +++ b/apps/web/src/components/FishSilhouette.astro @@ -0,0 +1,9 @@ +--- +const { name, size = 92 } = Astro.props as { name: string; size?: number }; +const variant = [...name].reduce((sum, char) => sum + (char.codePointAt(0) ?? 0), 0) % 3; +--- + diff --git a/apps/web/src/layouts/Layout.astro b/apps/web/src/layouts/Layout.astro index eff75b0..c184979 100644 --- a/apps/web/src/layouts/Layout.astro +++ b/apps/web/src/layouts/Layout.astro @@ -6,6 +6,7 @@ import "../styles/data-passport.css"; import "../styles/data-legend.css"; import "../styles/coordinate-radar.css"; import "../styles/activity-timeline.css"; +import "../styles/fish-silhouette.css"; import FishingIcon from "../components/FishingIcon.astro"; const { title = "RF4 Spotter — свежие точки клёва Russian Fishing 4", diff --git a/apps/web/src/pages/fish/index.astro b/apps/web/src/pages/fish/index.astro index 215fb6e..08fd27c 100644 --- a/apps/web/src/pages/fish/index.astro +++ b/apps/web/src/pages/fish/index.astro @@ -1,10 +1,11 @@ --- import Layout from "../../layouts/Layout.astro"; +import FishSilhouette from "../../components/FishSilhouette.astro"; import { api, type DictionaryItem } from "../../lib/api"; let fishes: DictionaryItem[] = [], unavailable = false; try { fishes = await api("/api/v1/fishes?limit=500"); } catch { unavailable = true; } ---
Справочник RF4

Рыбы

Выберите вид, чтобы увидеть свежие подтверждённые точки и полевые сигналы.

- {unavailable ?

Каталог временно недоступен

: } + {unavailable ?

Каталог временно недоступен

: }
diff --git a/apps/web/src/styles/fish-silhouette.css b/apps/web/src/styles/fish-silhouette.css new file mode 100644 index 0000000..528030d --- /dev/null +++ b/apps/web/src/styles/fish-silhouette.css @@ -0,0 +1 @@ +.fish-silhouette{fill:currentColor;color:#315f63;pointer-events:none}.fish-silhouette .fish-eye{fill:var(--paper)}.spot-main{position:relative}.spot-main>.fish-silhouette{position:absolute;right:2px;top:38px;opacity:.075}.catalog-grid>a{position:relative;overflow:hidden}.catalog-grid>a>.fish-silhouette{position:absolute;right:34px;bottom:-3px;opacity:.07;transform:rotate(-4deg)}@media(max-width:720px){.spot-main>.fish-silhouette{width:68px;right:0;opacity:.055}} diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index f53ecea..bfb444c 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -126,7 +126,7 @@ - [x] Подготовить фирменный знак «крючок + поплавок + координатная сетка» и согласованный набор favicon/app icons (7 сентября 2026). - [x] Добавить честный координатный радар без имитации отсутствующей карты на страницу точки (7 сентября 2026). - [x] Добавить временную шкалу активности 72 часа с 12-часовым шагом в виде лески с поплавками (7 сентября 2026). -- [ ] Добавить лёгкие силуэты видов рыб, не перегружая карточки результатов. +- [x] Добавить лёгкие детерминированные SVG-силуэты видов рыб в карточки результатов и каталог (7 сентября 2026). - [x] Собрать единый визуальный «паспорт данных»: источник, свежесть, полнота и доверие; применить к карточкам активности (7 сентября 2026). - [x] Добавить публичную легенду цветов источников и статусов качества на странице `/status` (7 сентября 2026). - [ ] Добавить skeleton-состояния для динамических публичных блоков.