Skip to content

moooon

Motir

Vibe your whole project. Bring an idea — Motir's three AI layers plan it, track it, and ship it, end to end. You're looking at Motir, built in Motir.

  • Vibe Project
  • Open Source
  • AI Agent
  • AI Loop
1
requests
0
upvotes
145
planned
1,361
shipped

Motir · Work items

MOTIR-229Done

4.3.4 Inline-editable estimate badge (display + scale-deck picker) wired across backlog row, board/scrum card, issue detail rail + list — fills the Story-4.2 estimate seam

Estimate: 32m · Depends on: 4.3.1, 4.3.3, 4.2.3

The reusable estimate badge — a display chip + a click-to-edit picker — wired into every surface that shows an issue, filling the Story-4.2 backlog estimate seam and generalising the board .pts chip. Drawn per design/estimation/estimation.mock.html; binds to 4.3.3 setEstimate + getEstimationConfig. ONE component, reused — not four copies.

The EstimateBadge component. Renders the configured statistic (the issue's storyPoints when statistic = Story Points; the formatted estimateMinutes when Time; nothing per-issue when Issue count). Unestimated → the muted / empty slot the design draws. Click (or keyboard-activate) opens the picker popover: the project's scale deck as quick-pick chips (Fibonacci default / linear / the customScaleValues, read from getEstimationConfig), a free numeric input (decimals allowed), and a Clear action. Selecting/entering a value calls 4.3.3 setEstimate optimistically with snap-back on error (the same write contract the board/backlog use). Reuse the shipped menu/popover primitive (no nested buttons, no hand-rolled popover).

Wire it into the surfaces (reuse, do not redraw the rows):

  • Backlog row (Story 4.2.3) — drop the badge into the RESERVED estimate slot the 4.2.1 design left (fixed slot order → no relayout). This is the headline seam-fill.
  • Board / Scrum card (BoardCard) — generalise the existing .pts chip: it currently renders card.estimateMinutes (TIME); make it render the configured statistic (story points by default), editable via the same picker. The card stays drag-friendly (the picker is a click, distinguished from a drag, per the existing BoardCard pointer handling).
  • Issue detail rail (Story 2.4) — add the story-points field DISTINCT from the existing TIME Estimate field, with the inline picker.
  • List view (Story 2.5) — show the configured statistic in the estimate column (reuse the existing Est. column slot / add a points column per the design), editable inline where the list already supports inline edit.

Tokens + a11y. The badge value + label read as TEXT (finding #35 — not colour/shape alone); colour via --el-*, shape via element shape tokens (no Tier-0 --color-*, no raw rounded-*/p-* for control shape — CLAUDE.md); the picker is keyboard-operable; new copy (picker labels, clear, the empty ) gets estimation.* i18n keys in every shipped locale (the existing next-intl threading pattern).

Out of scope here: the sprint committed-points + epic roll-up DISPLAYS (4.3.5); the project Estimation settings panel (4.3.6); the statistic-switch ADMIN UI (4.3.6 — this subtask READS the config to decide what to show/sum).

Acceptance criteria

  • A single reusable EstimateBadge renders the configured statistic (story points by default; the muted when unestimated) and a click/keyboard-activated picker showing the scale deck as quick chips + a free numeric input + clear; it reads getEstimationConfig for the statistic + deck.
  • The badge is wired into the backlog row (filling the Story-4.2 estimate seam in the reserved slot, no relayout), the board/scrum BoardCard .pts chip (now the configured statistic, not raw estimateMinutes), the issue-detail rail (a story-points field distinct from the time Estimate), and the list — the SAME component in all four, not copies.
  • Setting/clearing an estimate calls 4.3.3 setEstimate optimistically and SNAPS BACK with a surfaced error on failure; on the board the picker is distinguished from a drag.
  • Colour via --el-*, shape via element tokens, AA-safe; the value reads as text (finding #35); the picker is keyboard-operable; new copy has estimation.* i18n keys in every shipped locale.
  • Component tests assert the badge display (estimated / unestimated), the picker (deck chips + free numeric + clear), the optimistic write + snap-back, and that the board chip now reflects the configured statistic.

Context refs

  • design/estimation/estimation.mock.html + design-notes.md (4.3.1) — the badge + picker spec + the reserved-slot placement
  • app/(authed)/boards/_components/BoardCard.tsx (the .pts chip rendering estimateMinutes today — generalise it) + the backlog row (4.2.3) + the issue-detail rail (Story 2.4) + the list (Story 2.5 Est. column) — the surfaces to wire into
  • Story 4.3.3 (setEstimate / getEstimationConfig) — the write + config read this binds to; components/ui/* menu/popover primitive (no nested buttons) + Pill/chip
  • The prodect-i18n-threading-pattern (the estimation.* keys across locales); finding #35 (read as text), #54 (palette); motir-core/CLAUDE.md (--el-* + element-shape, primitive reuse)