refactor(frontend): extract SectionLabel + EmptyState + adminStyles shared #132

Merged
lekss361 merged 3 commits from refactor/frontend-ui-shared-129 into main 2026-05-14 20:55:38 +00:00
lekss361 commented 2026-05-14 20:39:12 +00:00 (Migrated from github.com)

Summary

Per audit batch #127 P2 hygiene: DRY-violations в frontend — 3 patterns копипастились multiple places.

Changes

3 new shared modules

  • components/ui/SectionLabel.tsx — 5-line uppercase header div
  • components/ui/EmptyState.tsx — "no data" center text
  • lib/adminStyles.ts — cardStyle/labelStyle/inputStyle/th/td

Replacements

Pattern Count Files
SectionLabel 12 OverviewTab + LandTab + MarketTab + EnvironmentTab
EmptyState 3 LandTab + MarketTab + EnvironmentTab
adminStyles 5 imports 4 admin scrape pages + BulkGeoPanel

Edge cases preserved

  • leads/page.tsx th/td/inputStyle — divergent values, оставлены local
  • BulkGeoPanel.tsx labelStyle — на <span>, без display:block, оставлен local

Visual regression risk: ZERO

Все px/colors/CSS values copied verbatim. Files с divergent values НЕ tronутy.

Checks

  • tsc: 0 errors
  • lint: 0 warnings

Vault

code/patterns/Pattern_Frontend_UI_Shared_May14.md

Closes #129
Refs: #127

## Summary Per audit batch #127 P2 hygiene: DRY-violations в frontend — 3 patterns копипастились multiple places. ## Changes ### 3 new shared modules - `components/ui/SectionLabel.tsx` — 5-line uppercase header div - `components/ui/EmptyState.tsx` — "no data" center text - `lib/adminStyles.ts` — cardStyle/labelStyle/inputStyle/th/td ### Replacements | Pattern | Count | Files | |---|---:|---| | SectionLabel | 12 | OverviewTab + LandTab + MarketTab + EnvironmentTab | | EmptyState | 3 | LandTab + MarketTab + EnvironmentTab | | adminStyles | 5 imports | 4 admin scrape pages + BulkGeoPanel | ### Edge cases preserved - `leads/page.tsx` th/td/inputStyle — divergent values, оставлены local - `BulkGeoPanel.tsx` labelStyle — на `<span>`, без display:block, оставлен local ### Visual regression risk: ZERO Все px/colors/CSS values copied verbatim. Files с divergent values НЕ tronутy. ## Checks - tsc: 0 errors - lint: 0 warnings ## Vault `code/patterns/Pattern_Frontend_UI_Shared_May14.md` Closes #129 Refs: #127
lekss361 commented 2026-05-14 20:45:17 +00:00 (Migrated from github.com)

Bot review — НЕ мержу, нужно действие автора

Проблема: diff не соответствует описанию

PR body описывает 3 shared компонента (SectionLabel.tsx, EmptyState.tsx, adminStyles.ts) и замены в 5+ файлах.

Фактический diff (gh api repos/.../pulls/132/files):

frontend/src/app/docs/b2b-channels/renderMarkdown.ts — +31/-2, modified

Это содержимое уже смерджённого PR #131 (XSS guard, commit 8647114). Никаких новых компонент или замен не видно.

Корень проблемы

headRefOid этого PR (6186804eb84f1580d7cb8279b2382bc6f929b2ff) совпадает с pre-merge HEAD PR #131. Похоже что PR #132 был открыт стаком поверх ветки #131, но коммиты с реальным refactor'ом (SectionLabel/EmptyState/adminStyles) не запушены — branch содержит только содержимое #131.

mergeable: UNKNOWN тоже намекает что GitHub ещё пересчитывает state после squash-merge #131.

Что нужно сделать

  1. Запушить актуальные коммиты с реальным refactor'ом в ветку этого PR, ИЛИ
  2. Закрыть PR #132 если refactor уже не нужен / был свёрнут с XSS-fix'ом.

После push'а нового SHA — на следующем cron-тике я перепроверю.

Не блокирующий минор (если будете push'ить refactor)

В PR body упомянуто что leads/page.tsx и BulkGeoPanel.tsx имеют divergent values и оставлены local. Хорошая практика — упомянуть это явно в adminStyles.ts (JSDoc или TODO-комментарий) чтобы будущий читатель не «унифицировал» эти места обратно по ошибке.

## Bot review — НЕ мержу, нужно действие автора ### Проблема: diff не соответствует описанию PR body описывает 3 shared компонента (`SectionLabel.tsx`, `EmptyState.tsx`, `adminStyles.ts`) и замены в 5+ файлах. **Фактический diff** (`gh api repos/.../pulls/132/files`): ``` frontend/src/app/docs/b2b-channels/renderMarkdown.ts — +31/-2, modified ``` Это содержимое **уже смерджённого PR #131** (XSS guard, commit `8647114`). Никаких новых компонент или замен не видно. ### Корень проблемы `headRefOid` этого PR (`6186804eb84f1580d7cb8279b2382bc6f929b2ff`) совпадает с pre-merge HEAD PR #131. Похоже что PR #132 был открыт стаком поверх ветки #131, но коммиты с реальным refactor'ом (`SectionLabel`/`EmptyState`/`adminStyles`) не запушены — branch содержит только содержимое #131. `mergeable: UNKNOWN` тоже намекает что GitHub ещё пересчитывает state после squash-merge #131. ### Что нужно сделать 1. **Запушить актуальные коммиты** с реальным refactor'ом в ветку этого PR, ИЛИ 2. **Закрыть PR #132** если refactor уже не нужен / был свёрнут с XSS-fix'ом. После push'а нового SHA — на следующем cron-тике я перепроверю. ### Не блокирующий минор (если будете push'ить refactor) В PR body упомянуто что `leads/page.tsx` и `BulkGeoPanel.tsx` имеют divergent values и оставлены local. Хорошая практика — упомянуть это явно в `adminStyles.ts` (JSDoc или TODO-комментарий) чтобы будущий читатель не «унифицировал» эти места обратно по ошибке.
lekss361 commented 2026-05-14 20:54:59 +00:00 (Migrated from github.com)

Bot re-review (SHA d33023d, CI )

Refactor-коммиты запушены. File-list соответствует описанию: 3 новых (EmptyState.tsx +22, SectionLabel.tsx +23, adminStyles.ts +35) + 11 modified (4 admin/scrape + leads + BulkGeoPanel + 4 site-finder tabs + renderMarkdown carry-over). Net +148/-302 — здоровый DRY-cleanup.

Замеченный quirk renderMarkdown.ts (не блокер)

pulls/132/files всё ещё показывает PR #131's patch (+31/-2). Это merge-base artifact: ветка PR #132 ответвилась от ветки PR #131 ДО squash-merge'а #131. GitHub считает diff от общего ancestor → показывает все изменения с тех пор.

Проверил содержимое — patch на этой ветке идентичен тому что уже в main (commit 8647114 от squash #131). После squash-merge PR #132 содержимое renderMarkdown.ts на main останется тем же, регресса не будет. mergeable: MERGEABLE это подтверждает.

Сам refactor

Edge cases сохранены: PR body упоминает что leads/page.tsx th/td/inputStyle (divergent values) и BulkGeoPanel.tsx labelStyle (на <span>, без display:block) оставлены local — это правильно
Zero visual regression risk: px/colors/CSS values copied verbatim
tsc: 0 errors, lint: 0 warnings (per body) + CI green
Pattern doc в vault — code/patterns/Pattern_Frontend_UI_Shared_May14.md

Минор для следующего раза

Если будут ещё stacked refactor PR'ы — лучше открывать их с base: main (не с base feature-branch), это избавит от merge-base artifact'а и упростит ревью.

approve merge

## Bot re-review (SHA `d33023d`, CI ✅) Refactor-коммиты запушены. File-list соответствует описанию: 3 новых (`EmptyState.tsx +22`, `SectionLabel.tsx +23`, `adminStyles.ts +35`) + 11 modified (4 admin/scrape + leads + BulkGeoPanel + 4 site-finder tabs + renderMarkdown carry-over). Net +148/-302 — здоровый DRY-cleanup. ### Замеченный quirk renderMarkdown.ts (не блокер) `pulls/132/files` всё ещё показывает PR #131's patch (+31/-2). Это **merge-base artifact**: ветка PR #132 ответвилась от ветки PR #131 ДО squash-merge'а #131. GitHub считает diff от общего ancestor → показывает все изменения с тех пор. Проверил содержимое — patch на этой ветке *идентичен* тому что уже в main (commit `8647114` от squash #131). После squash-merge PR #132 содержимое renderMarkdown.ts на main останется тем же, **регресса не будет**. `mergeable: MERGEABLE` это подтверждает. ### Сам refactor ✅ **Edge cases сохранены**: PR body упоминает что `leads/page.tsx` th/td/inputStyle (divergent values) и `BulkGeoPanel.tsx` labelStyle (на `<span>`, без `display:block`) оставлены local — это правильно ✅ **Zero visual regression risk**: px/colors/CSS values copied verbatim ✅ **tsc: 0 errors, lint: 0 warnings** (per body) + CI green ✅ **Pattern doc** в vault — `code/patterns/Pattern_Frontend_UI_Shared_May14.md` ### Минор для следующего раза Если будут ещё stacked refactor PR'ы — лучше открывать их с `base: main` (не с base feature-branch), это избавит от merge-base artifact'а и упростит ревью. approve merge
Sign in to join this conversation.
No reviewers
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: lekss361/gendesign#132
No description provided.