Project · Issues and boards: a board, issue cards, a task's panel, labels

KanbanBoard lays columns of cards side by side. A card drags to a
place in any column: it rides raised at the pointer, a slot opens where
it would land, the other cards glide aside on motion::Flip, and the
drop asks the owner through on_move(card, column, index); a drop in its
own place asks nothing. Option with an arrow moves the focused card,
whose focus the board keys by card so it follows it across columns. A
press, Enter or Space opens it. Sprint Board is this board.

IssueCard shows an issue's status, name, assignee, title, priority,
labels and due day. TaskDetailPanel lays a task out in full: its title
edits in place, its status, priority, assignee and due day change where
they stand, and its notes and steps follow; each edit hands the whole
task on, and a blank title is not taken. LabelManager tends a team's
labels: a hue picked from a popover, a name edited in place, a delete,
and a field that makes a new one; names stay unique in any case, and a
refused name says why.

The fill rule changes: min_w_full, taken up in T30d, resolves against
a block's outer width in taffy 0.9, so a field in a padded card ran
past its padding. A component that fills now takes no width on its
root, which blocks and flex columns stretch; FormField and the new
roots do. The chart's hue names move to theme::HUE_NAMES, which the
event editor and the label manager share.
This commit is contained in:
ZacharyZhang-NY committed 2026-09-27 05:12:20 -04:00
1 parent 1633bc9293
commit 8cbd389d72
24 files changed
+1813 -31

No files matched your search

-1
View File
@@ -275,7 +275,6 @@ impl RenderOnce for FormField {
.flex()
.flex_col()
.gap_1p5()
.min_w_full()
.child(self.label)
.children(self.children)
.children(note)
+28
View File
@@ -167,3 +167,31 @@ fn a_field_fills_a_column_its_block_measures_by_content(cx: &mut TestAppContext)
"the field spans the card inside its padding"
);
}
/// A field in a card of a set width, inside its padding.
struct Padded;
impl Render for Padded {
fn render(&mut self, _: &mut Window, _: &mut Context<Self>) -> impl IntoElement {
let control = div().debug_selector(|| "padded-control".into()).h_2();
div()
.w(px(400.))
.p_5()
.child(FormField::new("padded", "Name").child(control))
}
}
#[gpui::test]
fn a_field_keeps_inside_its_cards_padding(cx: &mut TestAppContext) {
setup(cx);
let (_, cx) = cx.add_window_view(|_, _| Padded);
cx.run_until_parked();
let control = cx
.debug_bounds("padded-control")
.expect("the control draws");
assert_eq!(
control.size.width,
px(360.),
"a percent min would take the card's outer width"
);
}