fix(site): subscription copy, restore GitHub icon, move contacts to header menu #25

Closed
opened 2026-08-07 18:37:30 +03:00 by slaid098 · 0 comments
Owner

Контекст

Сайт slaid098-dev (Next.js 15 App Router, React 19, TS, Tailwind v4). Контент двуязычный — весь коп лежит в src/lib/i18n.ts (типизированный словарь ruDict/enDict), компоненты тянут строки через t(locale).

Пять мелких правок из одной пачки (замена issue #19, закрытого как superseded):

  1. Опечатка в карточке Ollama (пунктуация) — не хватает запятой после Pro.
  2. Карточка Synthetic.new упоминает «Внутри — Kimi K3» — модель может поменяться в любой момент, упоминание неактуально и немaintainable.
  3. Карточка Umans содержит хвостовой повтор: «без недельных лимитов» в середине и «Без 5-часовых и недельных лимитов.» в конце — одно и то же дважды.
  4. В футере иконка GitHub (octocat) была заменена на генерический SVG «точка в круге» в коммите 9ab8d5c (PR #15, сообщение называло её «forgejo svg», но path — это radio-button/target, не логотип Forgejo). Вернуть узнаваемую иконку GitHub.
  5. На главной 5-я QA-пара «Как с тобой связаться?» → «Мои контакты — тут» дублирует роут /contacts, который уже доступен через сердечко в футере. Убрать эту пару с главной и добавить пункт «Контакты» в бургер-меню хедера — контакты станут заметнее (хедер виднее футера), главная упростится, убирается мёртвый код (поле link типа QAPair + блок рендера ссылки в qa-chat.tsx).

Задача

1. Опечатка Ollama (RU)

src/lib/i18n.ts:179 (RU, карточка Ollama, индекс 2):

  • текущий текст: "Прозрачный расчёт за серверное время: экономишь токены — получаешь больше запросов. Тестировал, как Pro так и Max."
  • заменить как Pro так икак Pro, так и (добавить запятую после Pro).
  • EN (:294) — без изменений ("Tested both Pro and Max.", грамматика другая, опечатки нет).

2. Убрать «Внутри — Kimi K3» (RU + EN)

  • src/lib/i18n.ts:174 (RU, карточка Synthetic.new, индекс 1): текущий текст "Скользящие лимиты: 5-часовой и недельный, оба постоянно восстанавливаются. Лимиты масштабируются пакетами. Внутри — Kimi K3." → убрать хвост Внутри — Kimi K3., конец на ...пакетами..
  • src/lib/i18n.ts:289 (EN, та же карточка): "Sliding limits: 5-hour and weekly, both continuously refill. Limits scale in packages. Inside — Kimi K3." → убрать Inside — Kimi K3., конец на ...packages..

3. Убрать хвост-повтор в карточке Umans (RU + EN)

  • src/lib/i18n.ts:184 (RU, карточка Umans, индекс 3, первый description): текущий "Успел попробовать подписку за 20 USD. Было 400 запросов на 5 часов без недельных лимитов. Code Max попробовать не успел. Единственным ограничением было количество одновременных потоков. Без 5-часовых и недельных лимитов." → убрать хвост Без 5-часовых и недельных лимитов.. Итог: "Успел попробовать подписку за 20 USD. Было 400 запросов на 5 часов без недельных лимитов. Code Max попробовать не успел. Единственным ограничением было количество одновременных потоков.".
  • src/lib/i18n.ts:299 (EN, первый description): "Tried the $20 subscription. Had 400 requests per 5 hours with no weekly limits. Didn't get to try Code Max. The only constraint was the number of concurrent threads. No 5-hour or weekly limits." → убрать No 5-hour or weekly limits.. Итог: "Tried the $20 subscription. Had 400 requests per 5 hours with no weekly limits. Didn't get to try Code Max. The only constraint was the number of concurrent threads.".
  • :185 / :300 (второй description, RU/EN) — БЕЗ изменений.

4. Вернуть иконку GitHub в футер

src/components/site-footer.tsx:28-30 — заменить текущий SVG «точка в круге» (viewBox 0 0 24 24, path M12 2C6.48 2...zm0 18c-4.41...zm-3-9c0-1.66...) на оригинальный GitHub octocat:

<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true">
  <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z" />
</svg>

Окружающий <a> (строки 21–27) БЕЗ изменений: href="https://git.slaid098.dev/slaid098", aria-label={d.footer.repo} (= "Forgejo"), rel="noreferrer", target="_blank". <span className="sr-only">{d.footer.repo}</span> (строка 31) — без изменений. Меняется только блок <svg> (строки 28–30).

5. Убрать QA-пару «Как с тобой связаться?» + добавить «Контакты» в бургер

5a. Удалить 5-ю QA-пару

  • src/lib/i18n.ts:124-128 (RU, qa.pairs[4]): удалить объект { question: "Как с тобой связаться?", answer: "Мои контакты —", link: { to: "/contacts", label: "тут" } }.
  • src/lib/i18n.ts:239-243 (EN, qa.pairs[4]): удалить объект { question: "How can I contact you?", answer: "My contacts are", link: { to: "/contacts", label: "here" } }.
  • Тип QAPair в src/lib/i18n.ts (~строка 10): убрать поле link? — после удаления 5-й пары ни одна пара его не использует, поле становится мёртвым.
  • src/components/qa-chat.tsx:165-176: убрать блок рендера activeQA.link (условие {activeQA.link && !isTyping && (...)} + хвостовой .) — мёртвый код после удаления поля. Остаётся только {renderTextWithLinks(displayedText, locale)} внутри bubble.
  • src/app/[locale]/page.tsx — БЕЗ изменений (<QAChat> остаётся, теперь 4 вопроса вместо 5).

5b. Добавить пункт «Контакты» в бургер-меню

  • src/lib/i18n.ts, тип header (~строки 16–22): добавить поле contacts: string (после subscriptions).
  • RU ruDict.header (~строка 96, после subscriptions: "Подписки"): добавить contacts: "Контакты",.
  • EN enDict.header (~строка 211, после subscriptions: "Subscriptions"): добавить contacts: "Contacts",.
  • src/components/site-header.tsx (~строка 117, после блока <Link> для Subscriptions): добавить третий пункт по тому же паттерну:
    <Link
      href={`${localePrefix}/contacts`}
      className="..."
      ...
    >
      {d.header.contacts}
    </Link>
    
    Скопировать структуру/className у соседней ссылки Subscriptions (строки 110–117) — сохранить консистентность стилей, hover, focus, ref-callback для автофокуса.
  • src/components/site-footer.tsx — БЕЗ изменений (сердечко со ссылкой на /contacts остаётся как второй путь к контактам).
  • Страница /contacts (src/app/[locale]/contacts/page.tsx) — БЕЗ изменений.

Тесты

  • src/__tests__/qa-chat.test.tsx:
    • строки :38 и :156: 54 (количество кнопок-вопросов).
    • :43 (RU): убрать "Как с тобой связаться?" из assert по именам кнопок.
    • :161 (EN): убрать "How can I contact you?" из assert по именам.
    • :118-128 (RU, тест контактной ссылки): удалить весь тест-кейс.
    • :179-188 (EN, тест контактной ссылки): удалить весь тест-кейс.
    • Остальные тесты (typing animation, project links в «Что основное?», reduced-motion, dim-on-click) — без изменений, проходят.
  • src/__tests__/site-header.test.tsx: добавить assert наличия ссылки «Контакты»/«Contacts» → /ru/contacts и /en/contacts (по образцу тестов для /apps на строках 56–61 и /subscriptions на 63–68).
  • src/__tests__/subscriptions.test.ts: БЕЗ изменений (проверяет 4 карточки с непустыми descriptions — правки 1–3 совместимы).
  • src/__tests__/contacts.test.tsx (SiteFooter блок, строки 109–159): БЕЗ изменений (проверяет Forgejo link + 16×16 иконки — восстановленный octocat SVG использует width="16" height="16", тест проходит).

Контракты

  • /[locale]/subscriptions — без изменений в структуре (4 карточки, рендер по индексу против SUBSCRIPTIONS в src/lib/subscriptions.ts). Меняется только текст 3 карточек.
  • /[locale] (главная) — <QAChat> остаётся, 4 вопроса вместо 5.
  • /[locale]/contacts — без изменений (Telegram, SupportDonate crypto, Boosty, JSON-LD).
  • Бургер-меню хедера: 3 пункта (Утилиты → Подписки → Контакты), порядок alphabetical-by-locale-agnostic не важен — Контакты последним.
  • Футер: 2 иконки (сердечко → /contacts, octocat → git.slaid098.dev/slaid098), обе 16×16, aria-label "Поддержать"/"Forgejo".
  • Все тексты двуязычные (RU + EN синхронизированы).

Инварианты

  • Весь коп — только в src/lib/i18n.ts (типизированный словарь), никаких хардкод-строк в компонентах.
  • Иконки — только inline custom <svg> (никаких icon-библиотек: lucide-react/react-icons/heroicons НЕ установлены).
  • QAPair.link поле удаляется из типа ТОЛЬКО потому что после удаления 5-й пары ни одна пара его не использует — не оставлять мёртвых полей.
  • qa-chat.tsx блок рендера activeQA.link удаляется вместе с полем — не оставлять мёртвый код.
  • Новая ссылка в хедере использует тот же className/структуру что соседние (консистентность стилей).
  • Двуязычная синхронизация: каждая правка применяется к RU и EN одновременно.

Граничные случаи

  • Если после удаления link поля TypeScript найдёт другие ссылки на QAPair.link — убрать все (grep по activeQA.link и .link в qa-chat.tsx). По разведке других ссылок нет.
  • Бургер-меню закрывается на Escape/outside-click/pathname-change — добавление 3-го пункта не ломает эту логику (пункты рендерятся внутри dropdown, который уже управляет open/close).
  • Автофокус на первый пункт меню при открытии (site-header.tsx строки 21–25) — не должен сломаться (первый ref остаётся Утилитами; Контакты — третий).
  • Тест site-header.test.tsx:70-73 проверяет что backToUtilities НЕ рендерится в хедере — добавление Контактов не влияет (другая строка).

Влияние на связанные компоненты

  • src/lib/i18n.ts — центральный словарь; правки затрагивают subscriptions.cards, qa.pairs, тип QAPair, тип/контент header. Все остальные ключи без изменений.
  • src/components/qa-chat.tsx — убирается блок activeQA.link (строки 165–176); остальная логика (typing animation, renderTextWithLinks, PROJECT_LINKS) без изменений.
  • src/components/site-header.tsx — добавляется 3-й <Link> в dropdown; логика open/close/ autofocus без изменений.
  • src/components/site-footer.tsx — замена SVG (строки 28–30); ссылка/aria-label без изменений.
  • src/app/[locale]/page.tsx — БЕЗ изменений (рендерит <QAChat>, который теперь отдаёт 4 пары).
  • src/app/[locale]/subscriptions/page.tsx — БЕЗ изменений (рендерит d.subscriptions.cards[i] по индексу).
  • src/app/[locale]/contacts/page.tsx — БЕЗ изменений.
  • Тесты: qa-chat.test.tsx (правки), site-header.test.tsx (добавление), остальные — без изменений.
  • Supersedes issue #19 (закрыт).

Вне scope

  • Реструктуризация бургер-меню (порядок, группировка) — только добавление одного пункта.
  • Изменение страницы /contacts (контент, layout, мета) — без изменений.
  • Убирание сердечка из футера — остаётся как второй путь к контактам.
  • Изменение SUBSCRIPTIONS в src/lib/subscriptions.ts (имена/URL) — без изменений.
  • Добавление icon-библиотеки — иконки остаются inline SVG.
  • Перевод EN-карточки Ollama (опечатка только в RU, EN грамматически корректен).

Критерии приемки

  • /ru/subscriptions карточка Ollama: текст содержит «Тестировал, как Pro, так и Max.» (с запятой после Pro)
  • /ru/subscriptions карточка Synthetic.new: НЕ содержит «Kimi K3»; заканчивается на «...пакетами.»
  • /en/subscriptions карточка Synthetic.new: НЕ содержит «Kimi K3»; заканчивается на «...packages.»
  • /ru/subscriptions карточка Umans абзац 1: НЕ содержит «Без 5-часовых и недельных лимитов.» в конце; второй абзац без изменений
  • /en/subscriptions карточка Umans абзац 1: НЕ содержит «No 5-hour or weekly limits.» в конце; второй абзац без изменений
  • Футер: иконка репо — GitHub octocat (viewBox 0 0 16 16), ссылка https://git.slaid098.dev/slaid098, aria-label="Forgejo" — обе иконки 16×16
  • /ru (главная): QA-чат показывает 4 вопроса, «Как с тобой связаться?» отсутствует
  • /en (главная): QA-чат показывает 4 вопроса, «How can I contact you?» отсутствует
  • Бургер-меню /ru: 3 пункта — «Утилиты», «Подписки», «Контакты» → /ru/contacts
  • Бургер-меню /en: 3 пункта — «Utilities», «Subscriptions», «Contacts» → /en/contacts
  • Сердечко в футере остаётся → /ru/contacts и /en/contacts
  • Тип QAPair НЕ содержит поле link
  • qa-chat.tsx НЕ содержит рендер activeQA.link
  • npm test — все тесты зелёные (vitest)
  • npm run lint — чисто (biome check)
  • npm run typecheck — чисто (tsc --noEmit)
## Контекст Сайт slaid098-dev (Next.js 15 App Router, React 19, TS, Tailwind v4). Контент двуязычный — весь коп лежит в `src/lib/i18n.ts` (типизированный словарь `ruDict`/`enDict`), компоненты тянут строки через `t(locale)`. Пять мелких правок из одной пачки (замена issue #19, закрытого как superseded): 1. Опечатка в карточке Ollama (пунктуация) — не хватает запятой после `Pro`. 2. Карточка Synthetic.new упоминает «Внутри — Kimi K3» — модель может поменяться в любой момент, упоминание неактуально и немaintainable. 3. Карточка Umans содержит хвостовой повтор: «без недельных лимитов» в середине и «Без 5-часовых и недельных лимитов.» в конце — одно и то же дважды. 4. В футере иконка GitHub (octocat) была заменена на генерический SVG «точка в круге» в коммите `9ab8d5c` (PR #15, сообщение называло её «forgejo svg», но path — это radio-button/target, не логотип Forgejo). Вернуть узнаваемую иконку GitHub. 5. На главной 5-я QA-пара «Как с тобой связаться?» → «Мои контакты — тут» дублирует роут `/contacts`, который уже доступен через сердечко в футере. Убрать эту пару с главной и добавить пункт «Контакты» в бургер-меню хедера — контакты станут заметнее (хедер виднее футера), главная упростится, убирается мёртвый код (поле `link` типа `QAPair` + блок рендера ссылки в `qa-chat.tsx`). ## Задача ### 1. Опечатка Ollama (RU) `src/lib/i18n.ts:179` (RU, карточка Ollama, индекс 2): - текущий текст: `"Прозрачный расчёт за серверное время: экономишь токены — получаешь больше запросов. Тестировал, как Pro так и Max."` - заменить `как Pro так и` → `как Pro, так и` (добавить запятую после `Pro`). - EN (`:294`) — без изменений (`"Tested both Pro and Max."`, грамматика другая, опечатки нет). ### 2. Убрать «Внутри — Kimi K3» (RU + EN) - `src/lib/i18n.ts:174` (RU, карточка Synthetic.new, индекс 1): текущий текст `"Скользящие лимиты: 5-часовой и недельный, оба постоянно восстанавливаются. Лимиты масштабируются пакетами. Внутри — Kimi K3."` → убрать хвост ` Внутри — Kimi K3.`, конец на `...пакетами.`. - `src/lib/i18n.ts:289` (EN, та же карточка): `"Sliding limits: 5-hour and weekly, both continuously refill. Limits scale in packages. Inside — Kimi K3."` → убрать ` Inside — Kimi K3.`, конец на `...packages.`. ### 3. Убрать хвост-повтор в карточке Umans (RU + EN) - `src/lib/i18n.ts:184` (RU, карточка Umans, индекс 3, первый description): текущий `"Успел попробовать подписку за 20 USD. Было 400 запросов на 5 часов без недельных лимитов. Code Max попробовать не успел. Единственным ограничением было количество одновременных потоков. Без 5-часовых и недельных лимитов."` → убрать хвост ` Без 5-часовых и недельных лимитов.`. Итог: `"Успел попробовать подписку за 20 USD. Было 400 запросов на 5 часов без недельных лимитов. Code Max попробовать не успел. Единственным ограничением было количество одновременных потоков."`. - `src/lib/i18n.ts:299` (EN, первый description): `"Tried the $20 subscription. Had 400 requests per 5 hours with no weekly limits. Didn't get to try Code Max. The only constraint was the number of concurrent threads. No 5-hour or weekly limits."` → убрать ` No 5-hour or weekly limits.`. Итог: `"Tried the $20 subscription. Had 400 requests per 5 hours with no weekly limits. Didn't get to try Code Max. The only constraint was the number of concurrent threads."`. - `:185` / `:300` (второй description, RU/EN) — БЕЗ изменений. ### 4. Вернуть иконку GitHub в футер `src/components/site-footer.tsx:28-30` — заменить текущий SVG «точка в круге» (viewBox `0 0 24 24`, path `M12 2C6.48 2...zm0 18c-4.41...zm-3-9c0-1.66...`) на оригинальный GitHub octocat: ```jsx <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"> <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z" /> </svg> ``` Окружающий `<a>` (строки 21–27) БЕЗ изменений: `href="https://git.slaid098.dev/slaid098"`, `aria-label={d.footer.repo}` (= "Forgejo"), `rel="noreferrer"`, `target="_blank"`. `<span className="sr-only">{d.footer.repo}</span>` (строка 31) — без изменений. Меняется только блок `<svg>` (строки 28–30). ### 5. Убрать QA-пару «Как с тобой связаться?» + добавить «Контакты» в бургер #### 5a. Удалить 5-ю QA-пару - `src/lib/i18n.ts:124-128` (RU, `qa.pairs[4]`): удалить объект `{ question: "Как с тобой связаться?", answer: "Мои контакты —", link: { to: "/contacts", label: "тут" } }`. - `src/lib/i18n.ts:239-243` (EN, `qa.pairs[4]`): удалить объект `{ question: "How can I contact you?", answer: "My contacts are", link: { to: "/contacts", label: "here" } }`. - Тип `QAPair` в `src/lib/i18n.ts` (~строка 10): убрать поле `link?` — после удаления 5-й пары ни одна пара его не использует, поле становится мёртвым. - `src/components/qa-chat.tsx:165-176`: убрать блок рендера `activeQA.link` (условие `{activeQA.link && !isTyping && (...)}` + хвостовой `.`) — мёртвый код после удаления поля. Остаётся только `{renderTextWithLinks(displayedText, locale)}` внутри bubble. - `src/app/[locale]/page.tsx` — БЕЗ изменений (`<QAChat>` остаётся, теперь 4 вопроса вместо 5). #### 5b. Добавить пункт «Контакты» в бургер-меню - `src/lib/i18n.ts`, тип `header` (~строки 16–22): добавить поле `contacts: string` (после `subscriptions`). - RU `ruDict.header` (~строка 96, после `subscriptions: "Подписки"`): добавить `contacts: "Контакты",`. - EN `enDict.header` (~строка 211, после `subscriptions: "Subscriptions"`): добавить `contacts: "Contacts",`. - `src/components/site-header.tsx` (~строка 117, после блока `<Link>` для Subscriptions): добавить третий пункт по тому же паттерну: ```tsx <Link href={`${localePrefix}/contacts`} className="..." ... > {d.header.contacts} </Link> ``` Скопировать структуру/className у соседней ссылки Subscriptions (строки 110–117) — сохранить консистентность стилей, hover, focus, ref-callback для автофокуса. - `src/components/site-footer.tsx` — БЕЗ изменений (сердечко со ссылкой на `/contacts` остаётся как второй путь к контактам). - Страница `/contacts` (`src/app/[locale]/contacts/page.tsx`) — БЕЗ изменений. ### Тесты - `src/__tests__/qa-chat.test.tsx`: - строки `:38` и `:156`: `5` → `4` (количество кнопок-вопросов). - `:43` (RU): убрать `"Как с тобой связаться?"` из assert по именам кнопок. - `:161` (EN): убрать `"How can I contact you?"` из assert по именам. - `:118-128` (RU, тест контактной ссылки): удалить весь тест-кейс. - `:179-188` (EN, тест контактной ссылки): удалить весь тест-кейс. - Остальные тесты (typing animation, project links в «Что основное?», reduced-motion, dim-on-click) — без изменений, проходят. - `src/__tests__/site-header.test.tsx`: добавить assert наличия ссылки «Контакты»/«Contacts» → `/ru/contacts` и `/en/contacts` (по образцу тестов для `/apps` на строках 56–61 и `/subscriptions` на 63–68). - `src/__tests__/subscriptions.test.ts`: БЕЗ изменений (проверяет 4 карточки с непустыми descriptions — правки 1–3 совместимы). - `src/__tests__/contacts.test.tsx` (`SiteFooter` блок, строки 109–159): БЕЗ изменений (проверяет Forgejo link + 16×16 иконки — восстановленный octocat SVG использует `width="16" height="16"`, тест проходит). ## Контракты - `/[locale]/subscriptions` — без изменений в структуре (4 карточки, рендер по индексу против `SUBSCRIPTIONS` в `src/lib/subscriptions.ts`). Меняется только текст 3 карточек. - `/[locale]` (главная) — `<QAChat>` остаётся, 4 вопроса вместо 5. - `/[locale]/contacts` — без изменений (Telegram, SupportDonate crypto, Boosty, JSON-LD). - Бургер-меню хедера: 3 пункта (Утилиты → Подписки → Контакты), порядок alphabetical-by-locale-agnostic не важен — Контакты последним. - Футер: 2 иконки (сердечко → /contacts, octocat → git.slaid098.dev/slaid098), обе 16×16, `aria-label` "Поддержать"/"Forgejo". - Все тексты двуязычные (RU + EN синхронизированы). ## Инварианты - Весь коп — только в `src/lib/i18n.ts` (типизированный словарь), никаких хардкод-строк в компонентах. - Иконки — только inline custom `<svg>` (никаких icon-библиотек: lucide-react/react-icons/heroicons НЕ установлены). - `QAPair.link` поле удаляется из типа ТОЛЬКО потому что после удаления 5-й пары ни одна пара его не использует — не оставлять мёртвых полей. - `qa-chat.tsx` блок рендера `activeQA.link` удаляется вместе с полем — не оставлять мёртвый код. - Новая ссылка в хедере использует тот же className/структуру что соседние (консистентность стилей). - Двуязычная синхронизация: каждая правка применяется к RU и EN одновременно. ## Граничные случаи - Если после удаления `link` поля TypeScript найдёт другие ссылки на `QAPair.link` — убрать все (grep по `activeQA.link` и `.link` в qa-chat.tsx). По разведке других ссылок нет. - Бургер-меню закрывается на Escape/outside-click/pathname-change — добавление 3-го пункта не ломает эту логику (пункты рендерятся внутри dropdown, который уже управляет open/close). - Автофокус на первый пункт меню при открытии (site-header.tsx строки 21–25) — не должен сломаться (первый ref остаётся Утилитами; Контакты — третий). - Тест `site-header.test.tsx:70-73` проверяет что `backToUtilities` НЕ рендерится в хедере — добавление Контактов не влияет (другая строка). ## Влияние на связанные компоненты - `src/lib/i18n.ts` — центральный словарь; правки затрагивают `subscriptions.cards`, `qa.pairs`, тип `QAPair`, тип/контент `header`. Все остальные ключи без изменений. - `src/components/qa-chat.tsx` — убирается блок `activeQA.link` (строки 165–176); остальная логика (typing animation, `renderTextWithLinks`, `PROJECT_LINKS`) без изменений. - `src/components/site-header.tsx` — добавляется 3-й `<Link>` в dropdown; логика open/close/ autofocus без изменений. - `src/components/site-footer.tsx` — замена SVG (строки 28–30); ссылка/aria-label без изменений. - `src/app/[locale]/page.tsx` — БЕЗ изменений (рендерит `<QAChat>`, который теперь отдаёт 4 пары). - `src/app/[locale]/subscriptions/page.tsx` — БЕЗ изменений (рендерит `d.subscriptions.cards[i]` по индексу). - `src/app/[locale]/contacts/page.tsx` — БЕЗ изменений. - Тесты: `qa-chat.test.tsx` (правки), `site-header.test.tsx` (добавление), остальные — без изменений. - Supersedes issue #19 (закрыт). ## Вне scope - ❌ Реструктуризация бургер-меню (порядок, группировка) — только добавление одного пункта. - ❌ Изменение страницы `/contacts` (контент, layout, мета) — без изменений. - ❌ Убирание сердечка из футера — остаётся как второй путь к контактам. - ❌ Изменение `SUBSCRIPTIONS` в `src/lib/subscriptions.ts` (имена/URL) — без изменений. - ❌ Добавление icon-библиотеки — иконки остаются inline SVG. - ❌ Перевод EN-карточки Ollama (опечатка только в RU, EN грамматически корректен). ## Критерии приемки - [ ] `/ru/subscriptions` карточка Ollama: текст содержит «Тестировал, как Pro, так и Max.» (с запятой после Pro) - [ ] `/ru/subscriptions` карточка Synthetic.new: НЕ содержит «Kimi K3»; заканчивается на «...пакетами.» - [ ] `/en/subscriptions` карточка Synthetic.new: НЕ содержит «Kimi K3»; заканчивается на «...packages.» - [ ] `/ru/subscriptions` карточка Umans абзац 1: НЕ содержит «Без 5-часовых и недельных лимитов.» в конце; второй абзац без изменений - [ ] `/en/subscriptions` карточка Umans абзац 1: НЕ содержит «No 5-hour or weekly limits.» в конце; второй абзац без изменений - [ ] Футер: иконка репо — GitHub octocat (viewBox `0 0 16 16`), ссылка `https://git.slaid098.dev/slaid098`, `aria-label="Forgejo"` — обе иконки 16×16 - [ ] `/ru` (главная): QA-чат показывает 4 вопроса, «Как с тобой связаться?» отсутствует - [ ] `/en` (главная): QA-чат показывает 4 вопроса, «How can I contact you?» отсутствует - [ ] Бургер-меню `/ru`: 3 пункта — «Утилиты», «Подписки», «Контакты» → `/ru/contacts` - [ ] Бургер-меню `/en`: 3 пункта — «Utilities», «Subscriptions», «Contacts» → `/en/contacts` - [ ] Сердечко в футере остаётся → `/ru/contacts` и `/en/contacts` - [ ] Тип `QAPair` НЕ содержит поле `link` - [ ] `qa-chat.tsx` НЕ содержит рендер `activeQA.link` - [ ] `npm test` — все тесты зелёные (vitest) - [ ] `npm run lint` — чисто (biome check) - [ ] `npm run typecheck` — чисто (tsc --noEmit)
Sign in to join this conversation.
No labels
bug
performance
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/slaid098-dev#25
No description provided.