Skip to content

Refactor/shadcn standardization#4

Merged
emreycolakoglu merged 6 commits into
mainfrom
refactor/shadcn-standardization
Jul 18, 2026
Merged

Refactor/shadcn standardization#4
emreycolakoglu merged 6 commits into
mainfrom
refactor/shadcn-standardization

Conversation

@emreycolakoglu

Copy link
Copy Markdown
Owner

No description provided.

emreycolakoglu and others added 6 commits July 18, 2026 21:05
…ives

- Rename create-task-modal.tsx → quick-add-input.tsx (it is an inline
  quick-add Input, never a modal); update both call sites.
- detail-title-block: raw <input> → Input primitive.
- board-column footer + task-card add-subtask: raw <button> → Button.
- task-card: replace hardcoded text-[#eb5757] with text-destructive token.

Parent-ref link in detail-title-block deliberately left native: Button
variant="link" renders Acid Lime, violating design.md accent rationing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New token-driven primitives ui/skeleton.tsx and ui/alert.tsx (hand-written
to match the existing radix-nova theme rather than pulled raw).

- Replace ad-hoc `animate-pulse rounded bg-muted` divs with <Skeleton> in
  settings-page and board-settings-page.
- Replace full-page "Loading…" text with skeleton layouts in task-detail-page
  and public-task-page.
- Replace hand-styled destructive Card / text with <Alert variant="destructive">
  in settings-page (load error) and board-settings-page (not found).

In-table "Loading users/invites…" placeholders left as-is (skeleton rows there
would need colspan plumbing; deferred). Unit tests added for both primitives.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… pickers

Add cmdk + @radix-ui/react-checkbox and two token-driven primitives:
- ui/command.tsx: searchable list over cmdk (cmdk owns filtering).
- ui/checkbox.tsx: radix checkbox with a LIME-FREE checked state (foreground
  fill), because design.md rations Acid Lime to one CTA per screen and label
  checkboxes must not be decorative Lime.

Collapse four hand-rolled pickers into two shared components:
- task-picker-popover.tsx replaces the duplicated search+list bodies of
  detail-add-parent-popover and detail-add-relation-popover (now thin wrappers
  that only compute their exclusion predicate).
- label-option-list.tsx replaces the copy-pasted fake-checkbox (✓ glyph) label
  rows in filter-chips-bar and label-manager with real Checkboxes.

Test infra: polyfill pointer-capture, scrollIntoView and ResizeObserver in
src/test/setup.ts (Radix + cmdk need them under jsdom). Unit tests added for
Checkbox, LabelOptionList and TaskPickerPopover.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The detail sidebar built status/priority/assignee on DropdownMenu while
create-task-dialog built the same three fields on the real Select — two
implementations of one concept. Converge on Select everywhere:

- detail-status-select, detail-priority-select, detail-assignee-select now use
  the shared radix Select with a ghost-styled trigger (border/bg stripped) so
  they keep the compact inline-property look. SelectValue auto-mirrors the
  selected option's icon/avatar + label into the trigger.
- Assignee uses a sentinel item value ("__unassigned__") mapped back to null at
  the boundary, since radix Select forbids empty-string item values.

DropdownMenu primitive is untouched and still used elsewhere (sidebar user menu
etc.). Unit test added for the assignee null<->sentinel mapping.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
detail-breadcrumb-bar hand-built its trail as bare <span>s with manual "›"
separators. Replace with a shadcn Breadcrumb (nav > ol > li, aria-current on
the current crumb) — an accessibility win at no visual cost (kept the "›"
separator and text-xs sizing). Crumbs here are non-navigable, so they use
BreadcrumbItem / BreadcrumbPage, not links.

Existing detail-breadcrumb-bar tests still pass unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the 410-line hand-rolled collapsible sidebar with the canonical shadcn
Sidebar stack, adapted to TaskForge's sidebar-* tokens (index.css uses
--sidebar-background etc., so the primitive uses bg-sidebar-background, not
bg-sidebar). Adds ui/sidebar.tsx, ui/sheet.tsx and hooks/use-mobile.ts.

Behavioural changes:
- Collapse is now CSS-driven (data-[collapsible=icon]) with cookie persistence
  and a ⌘/Ctrl-B shortcut, instead of a bespoke `collapsed` useState that
  conditionally rendered two different trees. Labels stay mounted and hide via
  data attributes; per-item tooltips come from SidebarMenuButton's `tooltip`.
- On mobile the sidebar becomes an off-canvas Sheet (new primitive).

Preserved: workspace header (non-interactive), Inbox/My Issues nav with unread
badge, collapsible BOARDS group with create action, board links (href +
aria-current), Settings, user menu, collapse toggle.

Tests: the two collapse-mechanism tests asserted unmount-on-collapse (the old
model); rewritten to assert the new data-state/data-collapsible semantics. All
other assertions unchanged. Added matchMedia to the jsdom test polyfills.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@emreycolakoglu
emreycolakoglu merged commit 7700835 into main Jul 18, 2026
1 check passed
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