fix(site): subscription copy, restore GitHub icon, move contacts to header menu #25
Labels
No labels
bug
performance
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
slaid098/slaid098-dev#25
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Контекст
Сайт slaid098-dev (Next.js 15 App Router, React 19, TS, Tailwind v4). Контент двуязычный — весь коп лежит в
src/lib/i18n.ts(типизированный словарьruDict/enDict), компоненты тянут строки черезt(locale).Пять мелких правок из одной пачки (замена issue #19, закрытого как superseded):
Pro.9ab8d5c(PR #15, сообщение называло её «forgejo svg», но path — это radio-button/target, не логотип Forgejo). Вернуть узнаваемую иконку GitHub./contacts, который уже доступен через сердечко в футере. Убрать эту пару с главной и добавить пункт «Контакты» в бургер-меню хедера — контакты станут заметнее (хедер виднее футера), главная упростится, убирается мёртвый код (полеlinkтипаQAPair+ блок рендера ссылки вqa-chat.tsx).Задача
1. Опечатка Ollama (RU)
src/lib/i18n.ts:179(RU, карточка Ollama, индекс 2):"Прозрачный расчёт за серверное время: экономишь токены — получаешь больше запросов. Тестировал, как Pro так и Max."как Pro так и→как Pro, так и(добавить запятую послеPro).: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 «точка в круге» (viewBox0 0 24 24, pathM12 2C6.48 2...zm0 18c-4.41...zm-3-9c0-1.66...) на оригинальный GitHub octocat:Окружающий
<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).ruDict.header(~строка 96, послеsubscriptions: "Подписки"): добавитьcontacts: "Контакты",.enDict.header(~строка 211, послеsubscriptions: "Subscriptions"): добавитьcontacts: "Contacts",.src/components/site-header.tsx(~строка 117, после блока<Link>для Subscriptions): добавить третий пункт по тому же паттерну: Скопировать структуру/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, тест контактной ссылки): удалить весь тест-кейс.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).aria-label"Поддержать"/"Forgejo".Инварианты
src/lib/i18n.ts(типизированный словарь), никаких хардкод-строк в компонентах.<svg>(никаких icon-библиотек: lucide-react/react-icons/heroicons НЕ установлены).QAPair.linkполе удаляется из типа ТОЛЬКО потому что после удаления 5-й пары ни одна пара его не использует — не оставлять мёртвых полей.qa-chat.tsxблок рендераactiveQA.linkудаляется вместе с полем — не оставлять мёртвый код.Граничные случаи
linkполя TypeScript найдёт другие ссылки наQAPair.link— убрать все (grep поactiveQA.linkи.linkв qa-chat.tsx). По разведке других ссылок нет.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(добавление), остальные — без изменений.Вне scope
/contacts(контент, layout, мета) — без изменений.SUBSCRIPTIONSвsrc/lib/subscriptions.ts(имена/URL) — без изменений.Критерии приемки
/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.» в конце; второй абзац без изменений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/contactsQAPairНЕ содержит полеlinkqa-chat.tsxНЕ содержит рендерactiveQA.linknpm test— все тесты зелёные (vitest)npm run lint— чисто (biome check)npm run typecheck— чисто (tsc --noEmit)