Refactor/shadcn standardization#4
Merged
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.