@stevecastaneda/paseo-progress 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/client/panel.tsx CHANGED
@@ -3,7 +3,7 @@ import { Icon } from "@getpaseo/plugin/client/react-native";
3
3
  import { DeliverablesList } from "./deliverables";
4
4
  import { LauncherBanner, SkillBanner } from "./launcher";
5
5
  import { AnsweredQuestionsList, QuestionsSection } from "./questions";
6
- import { Spinner, StalledPulse } from "./spinner";
6
+ import { Spinner, StalledPulse, WaitingDot } from "./spinner";
7
7
  import { IconSwap, Presence, StaggerRoot, nativeDriver } from "./motion";
8
8
  import { SectionTitle } from "./section-title";
9
9
  import { raised } from "./surfaces";
@@ -15,7 +15,7 @@ import { PROGRESS_FILE, type TicketStatus } from "../shared/events";
15
15
  import { formatMinutes, formatWorkDone, minutesSince } from "../shared/format";
16
16
  import { markPanelOpened } from "../shared/rpc";
17
17
  import { useDashboard } from "./dashboard-query";
18
- import { StatusBadge } from "./status-badge";
18
+ import { STATUS_LABEL } from "./status-badge";
19
19
  import { TicketDialogs } from "./ticket-dialog";
20
20
  import { PressableRow } from "./row";
21
21
  import { ShowMoreRow, usePaged } from "./show-more";
@@ -423,21 +423,14 @@ function TicketRow({ colors, ticket, live, now, onOpen, deliverables }: { colors
423
423
  <PressableRow colors={colors} onSurface1={working} transparentAtRest={!working}
424
424
  accessibilityRole="button" accessibilityLabel={`${ticket.id} details`} onPress={onOpen}
425
425
  style={{ flexDirection: "row", alignItems: "flex-start", gap: 10, paddingHorizontal: 10, paddingVertical: 8, borderTopWidth: 1, borderTopColor: colors.border }}>
426
- <View style={{ width: 16, paddingTop: 2, alignItems: "center" }}>
426
+ {/* The icon is the only status mark on the row; the ticket dialog spells it out in a badge. */}
427
+ <View accessible accessibilityLabel={ticket.waitingFor ? "Waiting" : STATUS_LABEL[ticket.status]} style={{ width: 16, paddingTop: 2, alignItems: "center" }}>
427
428
  <IconSwap swapKey={ticket.waitingFor ? "waiting" : ticket.status === "working" ? `working-${live}` : ticket.status} size={14}><StatusIcon colors={colors} status={ticket.status} live={live} waiting={Boolean(ticket.waitingFor)} /></IconSwap>
428
429
  </View>
429
430
  <View style={{ flex: 1, minWidth: 0, gap: 2 }}>
430
- {/* A paperclip before the title when the ticket has deliverables; they're listed in its dialog. */}
431
- <View style={{ flexDirection: "row", gap: 6 }}>
432
- {deliverables ? (
433
- <View accessibilityLabel={deliverables === 1 ? "Has a deliverable" : `Has ${deliverables} deliverables`} style={{ height: 18, justifyContent: "center" }}>
434
- <Icon name="Paperclip" size={12} color={colors.foregroundMuted} />
435
- </View>
436
- ) : null}
437
- <Text style={{ flex: 1, color: muted ? colors.foregroundMuted : colors.foreground, fontSize: 13, lineHeight: 18, textDecorationLine: muted ? "line-through" : "none" }}>
438
- {ticket.title}
439
- </Text>
440
- </View>
431
+ <Text style={{ color: muted ? colors.foregroundMuted : colors.foreground, fontSize: 13, lineHeight: 18, textDecorationLine: muted ? "line-through" : "none" }}>
432
+ {ticket.title}
433
+ </Text>
441
434
  {ticket.status === "working" && ticket.stage && ticket.stageSince ? (
442
435
  <Text style={{ color: colors.foregroundMuted, fontSize: 12, lineHeight: 17 }}>
443
436
  {ticket.stage} stage started <When colors={colors} iso={ticket.stageSince} now={now} />
@@ -453,17 +446,18 @@ function TicketRow({ colors, ticket, live, now, onOpen, deliverables }: { colors
453
446
  ) : null}
454
447
  {ticket.note ? <Text style={{ color: colors.foregroundMuted, fontSize: 12, lineHeight: 17 }}>{ticket.note}</Text> : null}
455
448
  </View>
456
- <Text style={{ color: colors.foregroundMuted, fontSize: 12, lineHeight: 18 }}>{ticket.estimateMin} min</Text>
457
- {/* The check mark already says done. */}
458
- {/* Optical: the 20px badge centers on the 18px line. */}
459
- {ticket.status === "done" ? null : <View style={{ marginTop: -1 }}><StatusBadge colors={colors} status={ticket.status} waiting={Boolean(ticket.waitingFor)} /></View>}
449
+ {/* Fixed slots so the Package icon and estimates line up down the list, whether or not a row has deliverables; they're listed in its dialog. */}
450
+ <View accessibilityLabel={deliverables ? (deliverables === 1 ? "Has a deliverable" : `Has ${deliverables} deliverables`) : undefined} style={{ width: 12, height: 18, justifyContent: "center" }}>
451
+ {deliverables ? <Icon name="Package" size={12} color={colors.foregroundMuted} /> : null}
452
+ </View>
453
+ <Text style={{ minWidth: 44, textAlign: "right", color: colors.foregroundMuted, fontSize: 12, lineHeight: 18, fontVariant: ["tabular-nums"] }}>{ticket.estimateMin} min</Text>
460
454
  <View style={{ paddingTop: 2 }}><Icon name="ChevronRight" size={14} color={colors.foregroundMuted} /></View>
461
455
  </PressableRow>
462
456
  );
463
457
  }
464
458
 
465
459
  function StatusIcon({ colors, status, live, waiting }: { colors: Colors; status: TicketStatus; live: boolean; waiting: boolean }) {
466
- if (waiting) return <Icon name="Hourglass" size={14} color={colors.foregroundMuted} />;
460
+ if (waiting) return <WaitingDot color={colors.foregroundMuted} size={14} />;
467
461
  switch (status) {
468
462
  case "done":
469
463
  return <Icon name="Check" size={14} color={colors.statusSuccess} />;
@@ -33,3 +33,14 @@ export function StalledPulse({ color, size = 12 }: { color: string; size?: numbe
33
33
  </Animated.View>
34
34
  );
35
35
  }
36
+
37
+ // A ticket waiting on another one: a still, faded dot, so it reads as parked
38
+ // rather than busy. Centered in the same slot an icon would take.
39
+ export function WaitingDot({ color, size = 12 }: { color: string; size?: number }) {
40
+ const dot = Math.round(size / 2);
41
+ return (
42
+ <View accessibilityLabel="Waiting" style={{ width: size, height: size, alignItems: "center", justifyContent: "center" }}>
43
+ <View style={{ width: dot, height: dot, borderRadius: dot / 2, backgroundColor: color, opacity: 0.5 }} />
44
+ </View>
45
+ );
46
+ }
@@ -9,7 +9,7 @@ import { type Attachment, AttachmentList, deliverableAttachment } from "./attach
9
9
  import { StackedDialog } from "./dialog-stack";
10
10
  import { IconSwap } from "./motion";
11
11
  import { PressableRow } from "./row";
12
- import { Spinner, StalledPulse } from "./spinner";
12
+ import { Spinner, StalledPulse, WaitingDot } from "./spinner";
13
13
  import { StatusBadge } from "./status-badge";
14
14
  import { When } from "./when";
15
15
 
@@ -65,7 +65,7 @@ export function TicketStoryView({ colors, dashboard, ticket, now, live, onOpenAt
65
65
  {ticket.waitingFor ? (
66
66
  <View style={{ flexDirection: "row", gap: 4 }}>
67
67
  {/* Held on the first line when a long title wraps. */}
68
- <View style={{ height: 18, justifyContent: "center" }}><Icon name="Hourglass" size={12} color={colors.foregroundMuted} /></View>
68
+ <View style={{ height: 18, justifyContent: "center" }}><WaitingDot color={colors.foregroundMuted} /></View>
69
69
  <Text style={{ flex: 1, color: colors.foregroundMuted, fontSize: 12, lineHeight: 18 }}>Waits for {ticket.waitingFor.id}: {ticket.waitingFor.title}</Text>
70
70
  </View>
71
71
  ) : null}
@@ -158,8 +158,8 @@ function LinkNote({ colors, link }: { colors: Colors; link: Link }) {
158
158
  // The same icons as the ticket rows, so a step reads like the status it was.
159
159
  // Past stage steps get an accent ringed dot: work that happened, now over.
160
160
  function Marker({ colors, step }: { colors: Colors; step: TimelineStep & { waiting?: boolean } }) {
161
- const icon = step.waiting ? { name: "Hourglass", color: colors.foregroundMuted }
162
- : step.label === "Added" ? { name: "CirclePlus", color: colors.foregroundMuted }
161
+ if (step.waiting) return <WaitingDot color={colors.foregroundMuted} />;
162
+ const icon = step.label === "Added" ? { name: "CirclePlus", color: colors.foregroundMuted }
163
163
  : step.status === "done" ? { name: "CircleCheck", color: colors.statusSuccess }
164
164
  : step.status === "blocked" ? { name: "Ban", color: colors.statusDanger }
165
165
  : step.status === "skipped" ? { name: "CircleSlash", color: colors.foregroundMuted }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@stevecastaneda/paseo-progress",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@stevecastaneda/paseo-progress",
9
- "version": "0.1.0",
9
+ "version": "0.1.2",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@getpaseo/client": "^0.9.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stevecastaneda/paseo-progress",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "A live progress dashboard per worktree for Paseo, drawn from a file agents write with the paseo-progress command.",
5
5
  "license": "MIT",
6
6
  "author": "Steve Castaneda",