taskchef 8.1.1 → 8.2.1

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.
@@ -34,7 +34,8 @@ body {
34
34
  .taskchef-task-row { container-type: inline-size; background: light-dark(#fff, #202421); box-shadow: 0 1px 0 light-dark(rgb(22 31 25 / 3%), transparent); }
35
35
  .taskchef-task-row:hover { border-color: light-dark(var(--mantine-color-teal-4), var(--mantine-color-teal-8)); }
36
36
  .taskchef-task-main { min-width: 0; flex: 1; }
37
- .taskchef-card-heading { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: var(--mantine-spacing-sm); }
37
+ .taskchef-card-heading,
38
+ .taskchef-turn-heading { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: var(--mantine-spacing-sm); }
38
39
  .taskchef-card-metadata { width: max-content; min-width: 0; max-width: min(25rem, 45cqw); }
39
40
  .taskchef-status-badge { flex: none; font-size: var(--mantine-font-size-xs); }
40
41
  .taskchef-title-button {
@@ -56,15 +57,15 @@ body {
56
57
  .taskchef-github-group { min-width: 0; }
57
58
  .taskchef-github-reference-ambiguous { border-bottom: 2px dotted var(--mantine-color-yellow-7); cursor: help; }
58
59
  .taskchef-github-reference-ambiguous:focus-visible { outline: 2px solid var(--mantine-color-yellow-7); outline-offset: 2px; }
59
- .taskchef-time, .taskchef-card-stat-content { display: inline-flex; align-items: center; gap: 6px; width: fit-content; max-width: 100%; padding: 3px 4px; border-radius: 4px; color: var(--taskchef-muted); font-size: var(--mantine-font-size-xs); font-weight: 400; letter-spacing: normal; line-height: var(--mantine-line-height-xs); text-transform: none; }
60
+ .taskchef-time, .taskchef-stat-content { display: inline-flex; align-items: center; gap: 6px; width: fit-content; max-width: 100%; padding: 3px 4px; border-radius: 4px; color: var(--taskchef-muted); font-size: var(--mantine-font-size-xs); font-weight: 400; letter-spacing: normal; line-height: var(--mantine-line-height-xs); text-transform: none; }
60
61
  .taskchef-time:hover { color: var(--taskchef-text); background: var(--taskchef-surface-muted); }
61
62
  .taskchef-time:focus-visible { outline: 2px solid var(--mantine-color-teal-6); outline-offset: 2px; }
62
- .taskchef-time-label, .taskchef-card-stat-content bdi { min-width: 0; overflow-wrap: anywhere; unicode-bidi: isolate; }
63
- .taskchef-card-stat-content:focus-visible { outline: 2px solid var(--mantine-color-teal-6); outline-offset: 2px; }
64
- .taskchef-card-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin-top: 2px; }
65
- .taskchef-card-stat { display: flex; align-items: center; min-width: 0; padding: 4px 10px; }
66
- .taskchef-card-stat:first-child { padding-inline-start: 0; }
67
- .taskchef-card-stat + .taskchef-card-stat { border-inline-start: 1px solid var(--taskchef-border); }
63
+ .taskchef-time-label, .taskchef-stat-content bdi { min-width: 0; overflow-wrap: anywhere; unicode-bidi: isolate; }
64
+ .taskchef-stat-content:focus-visible { outline: 2px solid var(--mantine-color-teal-6); outline-offset: 2px; }
65
+ .taskchef-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin-top: 2px; }
66
+ .taskchef-stat { display: flex; align-items: center; min-width: 0; padding: 4px 10px; }
67
+ .taskchef-stat:first-child { padding-inline-start: 0; }
68
+ .taskchef-stat + .taskchef-stat { border-inline-start: 1px solid var(--taskchef-border); }
68
69
  .taskchef-empty { border-style: dashed; background: transparent; }
69
70
 
70
71
  .taskchef-notifications {
@@ -84,13 +85,8 @@ body {
84
85
  .taskchef-metric { min-width: 0; background: transparent; }
85
86
  .taskchef-metric-value { overflow-wrap: anywhere; }
86
87
  .taskchef-metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: var(--mantine-spacing-xs); }
87
- .taskchef-turn { background: var(--taskchef-surface-muted); }
88
+ .taskchef-turn { container-type: inline-size; background: var(--taskchef-surface-muted); }
88
89
  .taskchef-turn-highlighted { border-color: var(--mantine-color-teal-6); box-shadow: inset 3px 0 var(--mantine-color-teal-6); outline: 3px solid color-mix(in srgb, var(--mantine-color-teal-6) 22%, transparent); }
89
- .taskchef-turn-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
90
- .taskchef-turn-timing { display: flex; align-items: center; justify-content: flex-end; gap: var(--mantine-spacing-sm); min-width: 0; }
91
- .taskchef-turn-duration { display: inline-flex; align-items: baseline; gap: 4px; white-space: nowrap; }
92
- .taskchef-turn-metrics { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--mantine-spacing-xs); }
93
- .taskchef-turn-metric { min-width: 0; overflow-wrap: anywhere; }
94
90
  .taskchef-mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; overflow-wrap: anywhere; }
95
91
  .taskchef-code-panel { max-height: 280px; margin: 0; padding: 12px; overflow: auto; border-radius: var(--mantine-radius-md); background: var(--taskchef-surface-muted); white-space: pre-wrap; overflow-wrap: anywhere; font: 0.78rem/1.55 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
96
92
  .taskchef-metadata { display: grid; grid-template-columns: minmax(120px, 150px) minmax(0, 1fr); margin: 0; font-size: var(--mantine-font-size-sm); }
@@ -130,9 +126,6 @@ body {
130
126
  .taskchef-notifications { right: 16px; bottom: 16px; width: min(330px, calc(100vw - 32px)); }
131
127
  .taskchef-metadata { grid-template-columns: 1fr; }
132
128
  .taskchef-metrics { grid-template-columns: repeat(3, minmax(0, 1fr)); }
133
- .taskchef-turn-metrics { grid-template-columns: 1fr; }
134
- .taskchef-turn-heading { align-items: flex-start; flex-direction: column; gap: 6px; }
135
- .taskchef-turn-timing { flex-wrap: wrap; justify-content: flex-start; }
136
129
  .taskchef-metadata dt { padding-bottom: 0; border-bottom: 0; }
137
130
  }
138
131
 
@@ -142,10 +135,10 @@ body {
142
135
  }
143
136
 
144
137
  @container (max-width: 27.5rem) {
145
- .taskchef-card-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
146
- .taskchef-card-stat { padding-block: 8px; }
147
- .taskchef-card-stat:nth-child(3) { border-inline-start: 0; padding-inline-start: 0; }
148
- .taskchef-card-stat:nth-child(n + 3) { border-top: 1px solid var(--taskchef-border); }
138
+ .taskchef-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
139
+ .taskchef-stat { padding-block: 8px; }
140
+ .taskchef-stat:nth-child(3) { border-inline-start: 0; padding-inline-start: 0; }
141
+ .taskchef-stat:nth-child(n + 3) { border-top: 1px solid var(--taskchef-border); }
149
142
  }
150
143
 
151
144
  .taskchef-refresh-spinning {
@@ -28,12 +28,10 @@ export function formatExactTime(value, { locale, timeZone } = {}) {
28
28
 
29
29
  function hourPhrase(milliseconds, direction) {
30
30
  const hours = Math.floor(milliseconds / HOUR_MS);
31
- const minutes = Math.floor((milliseconds % HOUR_MS) / MINUTE_MS);
32
31
  const hourText = hours === 1 ? "1 hour" : `${hours} hours`;
33
- const detail = hours < 6 && minutes > 0 ? ` ${minutes} minutes` : "";
34
32
  return direction === "future"
35
- ? `in ${hourText}${detail}`
36
- : `${hourText}${detail} ago`;
33
+ ? `in ${hourText}`
34
+ : `${hourText} ago`;
37
35
  }
38
36
 
39
37
  export function formatRelativeTime(value, {
@@ -63,10 +61,11 @@ export function formatRelativeTime(value, {
63
61
  : Math.floor(elapsed / DAY_MS);
64
62
  return future ? `in ${days} days` : `${days} days ago`;
65
63
  }
66
- return new Intl.DateTimeFormat(locale, {
67
- dateStyle: "medium",
68
- timeZone,
69
- }).format(parsed.date);
64
+ const months = future
65
+ ? Math.ceil(elapsed / (RELATIVE_DATE_LIMIT_DAYS * DAY_MS))
66
+ : Math.floor(elapsed / (RELATIVE_DATE_LIMIT_DAYS * DAY_MS));
67
+ const monthText = months === 1 ? "1 month" : `${months} months`;
68
+ return future ? `in ${monthText}` : `${monthText} ago`;
70
69
  }
71
70
 
72
71
  export function timestampPresentation(value, {