Skip to content

feat(tasks): Linear-grade tasks UI & UX (0198) - #167

Merged
crs48 merged 7 commits into
mainfrom
claude/linear-grade-tasks
Jun 17, 2026
Merged

feat(tasks): Linear-grade tasks UI & UX (0198)#167
crs48 merged 7 commits into
mainfrom
claude/linear-grade-tasks

Conversation

@crs48

@crs48 crs48 commented Jun 17, 2026

Copy link
Copy Markdown
Owner

Implements exploration 0198 — make the Tasks surface look and behave a lot more like Linear (navigate / view / render), without breaking xNet's two load-bearing opinions: tasks stay one canonical node projected across surfaces (0161), and chrome stays monochrome by default (0166).

Changelog

The Tasks surface (/tasks) gets a Linear-grade overhaul:

  • Navigation — a left in-surface sub-nav (Views: All Issues / My Issues / Triage, plus the Projects list) on desktop; the top-bar tabs remain on compact widths.
  • Render & density — sticky group headers with count badges and a hover "+ add", a compact/comfortable density toggle, and an opt-in "Linear" violet accent theme variant (Settings → Appearance → Accent).
  • Interaction — Linear-style multi-select (x selects, Shift-click range, ⌘A, Esc clears) with a floating bulk-action bar (status / priority / assign-me / delete in one optimistic batch), Space-to-peek, and verbs a assign · i assign-me · l label · r rename · ⌘. copy id.
  • Views — a detail slide-over (the list stays visible behind it), a filter bar (F) with Property: Value chips, and a Display Options popover (V) for grouping (status / priority / assignee / none), ordering, density, and show-completed — persisted locally.

What's verified

  • typecheck (ui / views / web / plugins) ✓ · eslint ✓ · prettier --check
  • 115 unit/integration tests green (new pure logic: buildTaskGroups/orderTasks, task-filter, commandsForScopes; new components: TaskBulkBar, TaskPeek, TaskDisplayOptions, TaskFilterBar, grouped-list rendering).
  • Browser-verified end to end: sub-nav, sticky grouped headers, Display Options (grouping→priority / compact / hide-completed, all reactive), filter field-picker, multi-select + bulk bar, detail slide-over, and the violet theme variant.
  • No editor-ux Playwright spec references the tasks surface, so no e2e selectors broke.

Deferred (explicit follow-ups, per the doc)

  • Phase 4: estimate, issue relations (blocks/blocked-by/related/duplicate), Cycles, roadmap.
  • Node-backed SavedView (today: localStorage), @xnetjs/views extraction of the issue-grid primitives (ship-tasks-first), deep mobile parity, and the [0172] UTC due-date fix.

🤖 Generated with Claude Code

xNet Test and others added 6 commits June 17, 2026 15:28
Changelog: Add exploration 0198 mapping the current tasks surface against
Linear's navigation/view/render patterns and proposing a 4-phase plan
(render+density, interaction parity, IA+detail slide-over, model extensions).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Changelog: Tasks list gains sticky group headers with count badges and a
hover "+ add", a compact/comfortable density toggle, multi-select plumbing
on TaskRow, and an opt-in "Linear" violet accent theme variant (Settings →
Appearance → Accent). Implements Phase 1 of exploration 0198.

- TaskRow: density (comfortable/compact) + left-edge selection checkbox
- TaskListGrouped: sticky headers, count badge, group "+ add", density,
  selection passthrough
- tokens.css/ThemeProvider: opt-in `data-variant='linear'` violet accent
- settings: Appearance → Accent (Monochrome / Linear)
- TasksView: density toggle, create-in-group

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Changelog: The Tasks surface gains Linear-style multi-select with a floating
bulk-action bar, Space-to-peek, and a fuller keyboard model. `x` now selects
(Shift-click range, ⌘A all, Esc clear); bulk status/priority/assign/delete
apply in one optimistic batch. New verbs: a assign, i assign-me, l label,
r rename, ⌘. copy id. Implements Phase 2 of exploration 0198.

- CommandRegistry.commandsForScopes() helper (+ test)
- TaskBulkBar + TaskPeek components (+ tests)
- TaskMiniPalette generalized to per-option icons (assignee/label pickers)
- TasksView: selection state, bulk handlers (mutate batch / remove),
  keyboard verbs, peek

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Changelog: Tasks gains a Linear-style detail slide-over (the list stays
visible behind it), a filter bar (F) with Property: Value chips, and a
Display Options popover (V) for grouping (status/priority/assignee/none),
ordering, density, and show-completed — persisted locally. Implements the
view-level half of Phase 3 of exploration 0198.

- grouping.ts: generic buildTaskGroups + orderTasks (+ tests)
- TaskListGrouped: renders any groupBy with the right header glyph
- TaskFilterBar + task-filter (pure, tested) and TaskDisplayOptions (+ tests)
- TasksView: detail slide-over (Sheet), filter/display bar, f/v shortcuts,
  show-completed, localStorage-persisted display settings

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Changelog: The Tasks surface gains a Linear-style left sub-nav (Views: All
Issues / My Issues / Triage, plus the Projects list) on desktop; the top-bar
tabs remain on compact widths. Completes the IA half of Phase 3 of
exploration 0198.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Changelog: Mark exploration 0198 implemented (Phases 1–3) and record the
browser-verified validation results. Phase 4 (estimate/relations/cycles) and a
few Phase 3 sub-items (node-backed SavedView, @xnetjs/views extraction, deep
mobile) remain explicit follow-ups.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@crs48
crs48 temporarily deployed to pr-167 June 17, 2026 23:24 — with GitHub Actions Inactive
@github-actions

github-actions Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

🖼️ UI changes in this PR

Screens

✏️ Settings _(SSIM 0.982)_
before after diff
before after diff

Auto-captured by CI · run. Informational — not a blocking check.

github-actions Bot added a commit that referenced this pull request Jun 17, 2026
@github-actions

github-actions Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Preview removed for PR #167.

github-actions Bot added a commit that referenced this pull request Jun 17, 2026
…caffold test

Changelog: none (CI/test hygiene).

- apps/web task-filter.test.ts: apply Prettier formatting (CI format-check).
- packages/cli connector.test.ts: the scaffolder emits a LICENSE (marketplace
  requirement, #157) but this expected-file list was stale and red on main
  already — align it with plugin.test.ts, which already expects LICENSE.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@crs48
crs48 temporarily deployed to pr-167 June 17, 2026 23:33 — with GitHub Actions Inactive
github-actions Bot added a commit that referenced this pull request Jun 17, 2026
@crs48
crs48 merged commit 926f00c into main Jun 17, 2026
11 of 12 checks passed
@crs48
crs48 deleted the claude/linear-grade-tasks branch June 17, 2026 23:41
github-actions Bot added a commit that referenced this pull request Jun 17, 2026
crs48 added a commit that referenced this pull request Jun 18, 2026
## What

Backfills the changelog so it reflects what's live on `main`. The per-PR
fragment system (exploration 0197) was current through PR #163 (PR #178
backfilled #151/#153/#156/#157/#160/#163), but the recent **0198/0199
batch** and a couple of stragglers shipped without entries. This adds 7
fragments, with prose lifted from each PR's own `## Changelog` block
where present.

| PR | Entry | Tags |
|---|---|---|
| #143 | AI chat that knows your workspace | `ai` |
| #167 | Linear-grade Tasks | `tasks` `app` |
| #169 | Cleaner page editor typography | `editor` |
| #170 | Bring your Slack data into xNet | `plugins` `platform` |
| #171 | Smoother, more consistent motion | `app` |
| #173 | Airtable-grade database grids | `app` |
| #174 | A redesigned chat & channels experience | `app` |

## Deliberately excluded

- **In-editor AI (#154 / #158)** — shipped the transform engine +
diff/approval logic, but both PRs state the `/ai` UI wiring into the
running app is **deferred**, so it isn't user-visible yet. An entry
would overclaim.
- **Slack (#170)** — entry scoped to the migration connector +
compatibility layer (genuinely live); avoids claiming the
webhook/slash-command hub endpoints work, since they're
generic-over-an-injected-sink and not mounted in a running server yet.
- Pure infra/ops/docs PRs (cloud M1/M2, CI, runbooks) — not user-facing.

## Verification

- `validate-changelog.ts` → **26 fragments valid** (19 existing + 7 new)
- `prettier --check` on all new files → clean
- Newest-first ordering confirmed — the 7 entries slot in at the top

## Changelog

<!-- This PR only adds changelog fragments for already-merged work; it
ships no user-facing change of its own. -->

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant