[F8-03] Карточка приказа: читаемость #46

Closed
opened 2026-05-25 21:40:19 +00:00 by owner · 5 comments
Collaborator

Подзадача полировки UI (этап F8), родительский #43.

Цель: Сделать карточку приказа читаемой: перенос текста, статус — цветом карточки, всегда видимый крестик удаления.

Пункты из #43:

18. Order. Давай пробовать сделать карточку читаемой. Сам текст ордера должен переноситься на следующую строку, если не помещается по горизонтали в карточку. Плашку "applied" (и ей аналогичные статусы) вообще можно заложить в цвет самой карточки приказа: лёгкий ненавязчивый зелёный, если уже применилось на сервере, красноватый - если ошибка, желтоватый (как сейчас) если ещё не отсылалось на сервер (это для офлайн-режима), и т.п. Кнопка delete - давай в правом верхнем углу карточки прямо в самом углу сделать аккуратненький маленький крестик в рамочке, нейтрального цвета как сам фон карточки, который будет всегда виден.


Порядок обработки: F8-03 из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач.

Подзадача полировки UI (этап **F8**), родительский #43. **Цель:** Сделать карточку приказа читаемой: перенос текста, статус — цветом карточки, всегда видимый крестик удаления. **Пункты из #43:** > **18.** Order. Давай пробовать сделать карточку читаемой. Сам текст ордера должен переноситься на следующую строку, если не помещается по горизонтали в карточку. Плашку "applied" (и ей аналогичные статусы) вообще можно заложить в цвет самой карточки приказа: лёгкий ненавязчивый зелёный, если уже применилось на сервере, красноватый - если ошибка, желтоватый (как сейчас) если ещё не отсылалось на сервер (это для офлайн-режима), и т.п. Кнопка delete - давай в правом верхнем углу карточки прямо в самом углу сделать аккуратненький маленький крестик в рамочке, нейтрального цвета как сам фон карточки, который будет всегда виден. --- _Порядок обработки: **F8-03** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._
owner added the Kind/Enhancement
Priority
Low
4
ready
labels 2026-05-25 21:40:19 +00:00
developer was assigned by owner 2026-05-25 21:40:19 +00:00
developer added
claude
working
and removed ready labels 2026-05-26 05:15:01 +00:00
Owner
Working log (issue-agent) — click to expand

State: done
Updated: 2026-05-26T06:40:00Z
Branch / PR: feature/issue-46-order-card-readability → PR #58 → merged into development (merge commit 793b709d).
Confirmed (final):

  • Owner's APPROVED review #10 on head 2294d8b3 was fresh, non-stale, non-dismissed; earlier REQUEST_CHANGES review #8 was dismissed and stale (covered the previous head 5ca30df3).
  • CI on head 2294d8b3: ui-test.yaml on pull_request (run #371) → success. The push-trigger run #370 was auto-cancelled by the parallel pull_request run, which is the routine supersede behaviour and not merge-gating. Combined commit /status reads failure due to that stale cancellation — confirmed via per-run conclusions instead, as documented in the reference_gitea-actions-api memory.
  • The owner also workflow_dispatched dev-deploy.yaml on this feature branch (run #372) for a live preview — conclusion=success. The next push into development (this merge) will overwrite that idempotently via the auto-deploy.
  • No inline review threads existed; all owner feedback was top-level (issue comments #356, #365 + review submissions #8, #10), all addressed.
    Decisions:
  • Merged via Merge gate (normal merge commit). Closes #46 auto-closed the issue on merge.
  • Set claude/done; the exclusive claude/ scope cleared claude/in-review automatically.
  • Branch auto-deleted by default_delete_branch_after_merge: true.
    Next: none — F8-03 shipped. Umbrella #43 stays open for the remaining F8 subtasks.
<!-- issue-agent:worklog --> <details> <summary>Working log (issue-agent) — click to expand</summary> **State:** done **Updated:** 2026-05-26T06:40:00Z **Branch / PR:** `feature/issue-46-order-card-readability` → PR #58 → merged into `development` (merge commit `793b709d`). **Confirmed (final):** - Owner's APPROVED review #10 on head `2294d8b3` was fresh, non-stale, non-dismissed; earlier REQUEST_CHANGES review #8 was dismissed and stale (covered the previous head `5ca30df3`). - CI on head `2294d8b3`: `ui-test.yaml` on `pull_request` (run #371) → `success`. The push-trigger run #370 was auto-cancelled by the parallel `pull_request` run, which is the routine supersede behaviour and not merge-gating. Combined commit `/status` reads `failure` due to that stale cancellation — confirmed via per-run conclusions instead, as documented in the [reference_gitea-actions-api](reference_gitea-actions-api.md) memory. - The owner also workflow_dispatched `dev-deploy.yaml` on this feature branch (run #372) for a live preview — `conclusion=success`. The next push into `development` (this merge) will overwrite that idempotently via the auto-deploy. - No inline review threads existed; all owner feedback was top-level (issue comments #356, #365 + review submissions #8, #10), all addressed. **Decisions:** - Merged via Merge gate (normal merge commit). `Closes #46` auto-closed the issue on merge. - Set `claude/done`; the exclusive `claude/` scope cleared `claude/in-review` automatically. - Branch auto-deleted by `default_delete_branch_after_merge: true`. **Next:** none — F8-03 shipped. Umbrella #43 stays open for the remaining F8 subtasks. </details>
developer added
claude
in-review
and removed
claude
working
labels 2026-05-26 05:30:26 +00:00
Owner

@owner — PR #58 готов к ревью.

Что поменялось в order-tab.svelte:

  • длинные подписи приказов теперь переносятся на следующую строку (overflow-wrap: anywhere) вместо обрезки многоточием;
  • статус закодирован в фон карточки через дизайн-токены: applied--color-success-subtle (лёгкий зелёный); invalid / rejected / conflict--color-danger-subtle (красноватый); draft / valid / submitting--color-warning-subtle (желтоватый — «ещё не подтверждено сервером», в том числе оффлайн);
  • старая текстовая «плашка» статуса перестала быть видимой (визуально её заменяет тон карточки), но осталась в DOM как .sr-only — это сохраняет совместимость со скринридерами и со всеми существующими тестами на order-command-status-N;
  • кнопка удаления — это маленький в рамке в правом верхнем углу карточки, спозиционирован абсолютно, виден всегда (не только при ховере); снабжён aria-label через ключ game.sidebar.order.command_delete, без новых i18n-строк.

Палитру и токены не трогала, store/сеть/синхронизация и протокол приказов не затронуты — это чисто визуальная полировка Order-вкладки.

Файлы:

  • ui/frontend/src/lib/sidebar/order-tab.svelte — шаблон карточки и scoped CSS;
  • ui/frontend/tests/order-tab.test.ts — два регрессионных ассерта (status-invalid на li и aria-label на кнопке удаления);
  • ui/docs/order-composer.md — параграф «Visual encoding on the order tab», описывает новую раскраску.

Локальные проверки: vitest run tests/order-tab.test.ts — 8/8 pass; npm run check (svelte-check) — 0 errors / 0 warnings.

CI: ui-test.yaml на PR-триггере (run #368) — зелёный, включая весь e2e/order-composer.spec.ts. Параллельный push-trigger run #367 упал на флейке в неродственном e2e/report-sections.spec.ts:229 («every TOC anchor lands its section in view» — стандартный таймаут на window.__galaxyNav в чужой спеке) — он не блокирует merge-gate PR'а.

Каверзы и нюансы:

  • Цвета — это subtle-варианты палитры с альфой ~10–14 %, так что фон не «кричит»; рамка карточки — --color-border-subtle, чтобы не дублировать сигнал.
  • draft и valid сгруппированы с submitting в одну «жёлтую» группу — все три значат «ещё не accepted сервером».
  • Кнопка использует U+2715 (тот же глиф, что и в кнопке закрытия сайдбара).
  • Выделение фокуса на кнопке добавила (:focus-visible), чтобы клавиатура подсвечивала рамку так же, как ховер.

Если понравилось — оставь approve, и на следующем заходе я сделаю merge через Merge-gate. Если хочется покрутить — какие именно тона/паддинги/глиф поправить?

@owner — PR #58 готов к ревью. Что поменялось в `order-tab.svelte`: - длинные подписи приказов теперь переносятся на следующую строку (`overflow-wrap: anywhere`) вместо обрезки многоточием; - статус закодирован в фон карточки через дизайн-токены: `applied` → `--color-success-subtle` (лёгкий зелёный); `invalid` / `rejected` / `conflict` → `--color-danger-subtle` (красноватый); `draft` / `valid` / `submitting` → `--color-warning-subtle` (желтоватый — «ещё не подтверждено сервером», в том числе оффлайн); - старая текстовая «плашка» статуса перестала быть видимой (визуально её заменяет тон карточки), но осталась в DOM как `.sr-only` — это сохраняет совместимость со скринридерами и со всеми существующими тестами на `order-command-status-N`; - кнопка удаления — это маленький `✕` в рамке в правом верхнем углу карточки, спозиционирован абсолютно, виден всегда (не только при ховере); снабжён `aria-label` через ключ `game.sidebar.order.command_delete`, без новых i18n-строк. Палитру и токены не трогала, store/сеть/синхронизация и протокол приказов не затронуты — это чисто визуальная полировка `Order`-вкладки. Файлы: - `ui/frontend/src/lib/sidebar/order-tab.svelte` — шаблон карточки и scoped CSS; - `ui/frontend/tests/order-tab.test.ts` — два регрессионных ассерта (`status-invalid` на `li` и `aria-label` на кнопке удаления); - `ui/docs/order-composer.md` — параграф «Visual encoding on the order tab», описывает новую раскраску. Локальные проверки: `vitest run tests/order-tab.test.ts` — 8/8 pass; `npm run check` (svelte-check) — 0 errors / 0 warnings. CI: `ui-test.yaml` на PR-триггере (run #368) — зелёный, включая весь `e2e/order-composer.spec.ts`. Параллельный push-trigger run #367 упал на флейке в неродственном `e2e/report-sections.spec.ts:229` («every TOC anchor lands its section in view» — стандартный таймаут на `window.__galaxyNav` в чужой спеке) — он не блокирует merge-gate PR'а. Каверзы и нюансы: - Цвета — это subtle-варианты палитры с альфой ~10–14 %, так что фон не «кричит»; рамка карточки — `--color-border-subtle`, чтобы не дублировать сигнал. - `draft` и `valid` сгруппированы с `submitting` в одну «жёлтую» группу — все три значат «ещё не accepted сервером». - Кнопка `✕` использует U+2715 (тот же глиф, что и в кнопке закрытия сайдбара). - Выделение фокуса на кнопке добавила (`:focus-visible`), чтобы клавиатура подсвечивала рамку так же, как ховер. Если понравилось — оставь approve, и на следующем заходе я сделаю merge через Merge-gate. Если хочется покрутить — какие именно тона/паддинги/глиф поправить?
Author
Collaborator

Давай размер шрифта в карточке сделаем поменьше, как текст в calculator - думаю, будет идеально. А крестик удаления команды сделаем совсем маленьким, так, чтобы он помещался в правый верхний угол без отступа, т.е. был прилипшим к границе карточки, а размер крестика вмещался в padding-space между границей карточки и её текстом. Надеюсь, так получится?

Ну и упавший ui-test попробуй починить, он до этого PR работал же. Может и не твоими изменениями был спровоцирован, но если всплыла техдолг-ошибка, давай сразу править, не откладывать. :)

Давай размер шрифта в карточке сделаем поменьше, как текст в calculator - думаю, будет идеально. А крестик удаления команды сделаем совсем маленьким, так, чтобы он помещался в правый верхний угол без отступа, т.е. был прилипшим к границе карточки, а размер крестика вмещался в padding-space между границей карточки и её текстом. Надеюсь, так получится? Ну и упавший ui-test попробуй починить, он до этого PR работал же. Может и не твоими изменениями был спровоцирован, но если всплыла техдолг-ошибка, давай сразу править, не откладывать. :)
Owner

@owner — поправила обе замечания одним коммитом (2294d8b) поверх PR #58.

Размер текста в карточке. Заглянула в calculator-tab.svelte — там основной размер тела 0.8rem (это .label, .hint, .planet-name, .planet-stats dt и т.п., см. ui/frontend/src/lib/sidebar/calculator-tab.svelte:794882). Поставила font-size: 0.8rem; line-height: 1.3 на .command, чтобы и сам текст команды, и нумерация слева (.index) унаследовали один и тот же размер. Заодно подтянула паддинги карточки до 0.3rem 1.1rem 0.3rem 0.5rem, чтобы плотность совпадала с новым шрифтом — без этого выглядело бы как «маленький текст, плавающий в большом боксе».

Крестик. Сделала маленький — 0.95rem × 0.95rem, сам глиф 0.65rem. Прилипший к правому-верхнему углу буквально: top: 0; right: 0;, без отступа от границы. Рамочка тонкая — 1px solid --color-border-subtle, border-radius: 0 3px 0 3px (округлён только верхний-правый угол + диагональный нижний-левый — чтобы повторял внешний радиус карточки, а внутрь смотрит острыми углами). Зарезервированный под него правый паддинг в самой карточке — 1.1rem, ровно столько, чтобы крестик помещался в padding-space и текст под ним не пробегал. Текст уже не пересекается с крестиком по горизонтали даже при overflow-wrap: anywhere.

Упавший report-sections — это техдолг, давно тлеющий. Покопалась в логах: предыдущий зелёный ran на development (#366, до моего PR) тоже падал на той же спеке report-sections › every TOC anchor lands its section in view дважды и проходил только на retry #2. Мой PR-овский ран #367 просто исчерпал все 5 ретраев и упал суммарно. Корень — scrollIntoView({behavior: "smooth"}) не успевает доехать до конечной позиции за 5 секунд toBeInViewport() под нагрузкой act-раннера, особенно на нижних секциях после ~17 кликов подряд. Прод-код это уже умеет — report-toc.svelte переключается на behavior: "auto", когда prefers-reduced-motion: reduce активен. Я добавила в playwright.config.ts глобально contextOptions: { reducedMotion: "reduce" } — теперь весь e2e-набор гоняется в этом режиме, скролл становится синхронным и детерминированным. Прод не трогала, vitest-покрытие в tests/report-toc.test.ts проверяет обе ветки media-query'я, так что регрессии на «обычного юзера со smooth-скроллом» не появится.

Файлы:

  • ui/frontend/src/lib/sidebar/order-tab.svelte — шрифт + паддинги + размеры крестика;
  • ui/frontend/playwright.config.tscontextOptions.reducedMotion;
  • ui/docs/order-composer.md — параграф «Visual encoding on the order tab» доуточнила про новый шрифт и flush-угол крестика.

Проверки:

  • npm run check — 0 errors / 0 warnings;
  • vitest run tests/order-tab.test.ts — 8/8 pass;
  • локально playwright test report-sections.spec.ts — 6/6 pass (на всех четырёх проектах);
  • локально playwright test order-composer.spec.ts — 12/12 pass;
  • CI: ui-test.yaml ран #371 на head 2294d8b3success. report-sections › every TOC anchor lands its section in view больше не появляется в списке retries (там остались только map-toggles и sciences-map-regress webkit-флейки, не из моего PR).

Перезапросила review на тебя на новый head. Если визуально пропорции крестика/шрифта теперь нравятся — оставь approve, и на следующем заходе сделаю merge через Merge-gate. Если ещё крутить — на сколько именно подвинуть? :)

@owner — поправила обе замечания одним коммитом (2294d8b) поверх PR #58. **Размер текста в карточке.** Заглянула в `calculator-tab.svelte` — там основной размер тела `0.8rem` (это `.label`, `.hint`, `.planet-name`, `.planet-stats dt` и т.п., см. `ui/frontend/src/lib/sidebar/calculator-tab.svelte:794`–`882`). Поставила `font-size: 0.8rem; line-height: 1.3` на `.command`, чтобы и сам текст команды, и нумерация слева (`.index`) унаследовали один и тот же размер. Заодно подтянула паддинги карточки до `0.3rem 1.1rem 0.3rem 0.5rem`, чтобы плотность совпадала с новым шрифтом — без этого выглядело бы как «маленький текст, плавающий в большом боксе». **Крестик.** Сделала маленький — `0.95rem × 0.95rem`, сам глиф `0.65rem`. Прилипший к правому-верхнему углу буквально: `top: 0; right: 0;`, без отступа от границы. Рамочка тонкая — `1px solid --color-border-subtle`, `border-radius: 0 3px 0 3px` (округлён только верхний-правый угол + диагональный нижний-левый — чтобы повторял внешний радиус карточки, а внутрь смотрит острыми углами). Зарезервированный под него правый паддинг в самой карточке — `1.1rem`, ровно столько, чтобы крестик помещался в padding-space и текст под ним не пробегал. Текст уже не пересекается с крестиком по горизонтали даже при `overflow-wrap: anywhere`. **Упавший `report-sections` — это техдолг, давно тлеющий.** Покопалась в логах: предыдущий зелёный ran на `development` (#366, до моего PR) тоже падал на той же спеке `report-sections › every TOC anchor lands its section in view` дважды и проходил только на retry #2. Мой PR-овский ран #367 просто исчерпал все 5 ретраев и упал суммарно. Корень — `scrollIntoView({behavior: "smooth"})` не успевает доехать до конечной позиции за 5 секунд `toBeInViewport()` под нагрузкой act-раннера, особенно на нижних секциях после ~17 кликов подряд. Прод-код это уже умеет — `report-toc.svelte` переключается на `behavior: "auto"`, когда `prefers-reduced-motion: reduce` активен. Я добавила в `playwright.config.ts` глобально `contextOptions: { reducedMotion: "reduce" }` — теперь весь e2e-набор гоняется в этом режиме, скролл становится синхронным и детерминированным. Прод не трогала, vitest-покрытие в `tests/report-toc.test.ts` проверяет обе ветки media-query'я, так что регрессии на «обычного юзера со smooth-скроллом» не появится. Файлы: - `ui/frontend/src/lib/sidebar/order-tab.svelte` — шрифт + паддинги + размеры крестика; - `ui/frontend/playwright.config.ts` — `contextOptions.reducedMotion`; - `ui/docs/order-composer.md` — параграф «Visual encoding on the order tab» доуточнила про новый шрифт и flush-угол крестика. Проверки: - `npm run check` — 0 errors / 0 warnings; - `vitest run tests/order-tab.test.ts` — 8/8 pass; - локально `playwright test report-sections.spec.ts` — 6/6 pass (на всех четырёх проектах); - локально `playwright test order-composer.spec.ts` — 12/12 pass; - CI: `ui-test.yaml` ран #371 на head 2294d8b3 — `success`. `report-sections › every TOC anchor lands its section in view` больше не появляется в списке retries (там остались только `map-toggles` и `sciences-map-regress` webkit-флейки, не из моего PR). Перезапросила review на тебя на новый head. Если визуально пропорции крестика/шрифта теперь нравятся — оставь approve, и на следующем заходе сделаю merge через Merge-gate. Если ещё крутить — на сколько именно подвинуть? :)
Author
Collaborator

Очень красиво получилось, спасибо! :) Апрувнул.

Очень красиво получилось, спасибо! :) Апрувнул.
developer added
claude
done
and removed
claude
in-review
labels 2026-05-26 06:39:26 +00:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: developer/galaxy-game#46