@knpkv/herdr-work 0.5.3 → 0.6.0

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.
Files changed (55) hide show
  1. package/README.md +86 -0
  2. package/dist/display-state.d.ts +10 -0
  3. package/dist/display-state.d.ts.map +1 -0
  4. package/dist/display-state.js +5 -0
  5. package/dist/display-state.js.map +1 -0
  6. package/dist/errors.d.ts +21 -0
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js +12 -0
  9. package/dist/errors.js.map +1 -1
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/internal/legacy-lane-claim.d.ts +74 -0
  15. package/dist/internal/legacy-lane-claim.d.ts.map +1 -0
  16. package/dist/internal/legacy-lane-claim.js +81 -0
  17. package/dist/internal/legacy-lane-claim.js.map +1 -0
  18. package/dist/internal/session-index.d.ts +18 -0
  19. package/dist/internal/session-index.d.ts.map +1 -0
  20. package/dist/internal/session-index.js +23 -0
  21. package/dist/internal/session-index.js.map +1 -0
  22. package/dist/internal/terminal-reconcile.d.ts +29 -0
  23. package/dist/internal/terminal-reconcile.d.ts.map +1 -0
  24. package/dist/internal/terminal-reconcile.js +79 -0
  25. package/dist/internal/terminal-reconcile.js.map +1 -0
  26. package/dist/model.d.ts +909 -29
  27. package/dist/model.d.ts.map +1 -1
  28. package/dist/model.js +236 -7
  29. package/dist/model.js.map +1 -1
  30. package/dist/observed.d.ts +77 -0
  31. package/dist/observed.d.ts.map +1 -0
  32. package/dist/observed.js +240 -0
  33. package/dist/observed.js.map +1 -0
  34. package/dist/projection.d.ts +192 -12
  35. package/dist/projection.d.ts.map +1 -1
  36. package/dist/service.d.ts +121 -992
  37. package/dist/service.d.ts.map +1 -1
  38. package/dist/service.js +13 -3
  39. package/dist/service.js.map +1 -1
  40. package/dist/sql.d.ts.map +1 -1
  41. package/dist/sql.js +76 -3
  42. package/dist/sql.js.map +1 -1
  43. package/dist/store.d.ts +193 -11
  44. package/dist/store.d.ts.map +1 -1
  45. package/dist/store.js +687 -37
  46. package/dist/store.js.map +1 -1
  47. package/dist/view.d.ts.map +1 -1
  48. package/dist/view.js +169 -103
  49. package/dist/view.js.map +1 -1
  50. package/dist/work-triage.d.ts +72 -0
  51. package/dist/work-triage.d.ts.map +1 -0
  52. package/dist/work-triage.js +114 -0
  53. package/dist/work-triage.js.map +1 -0
  54. package/package.json +3 -3
  55. package/src/styles.css +229 -237
package/src/styles.css CHANGED
@@ -1,314 +1,306 @@
1
1
  @layer herdr-work {
2
+ /* The Work tab: hero, snapshot choice, then goals beside the open goal. */
2
3
  .work-page {
4
+ container: work-page / inline-size;
3
5
  display: grid;
4
6
  gap: var(--rly-space-24);
5
7
  }
8
+
6
9
  .work-page-intro {
7
- align-items: end;
10
+ align-items: baseline;
11
+ border-block-end: 1px solid var(--rly-color-border-1);
8
12
  display: flex;
9
- gap: var(--rly-space-32);
13
+ flex-wrap: wrap;
14
+ gap: var(--rly-space-8) var(--rly-space-24);
10
15
  justify-content: space-between;
11
- padding-block: var(--rly-space-24) var(--rly-space-8);
16
+ padding-block-end: var(--rly-space-12);
12
17
  }
13
- .work-page-intro > div:first-child {
14
- display: grid;
15
- gap: var(--rly-space-12);
16
- max-inline-size: 60rem;
18
+
19
+ .work-page-intro h1 {
20
+ margin: var(--rly-space-0);
17
21
  }
18
- .work-snapshot-stamp {
19
- align-items: end;
22
+
23
+ /* Snapshot windows and status filters: plain links or toggle buttons, current one underlined. */
24
+ .work-time-controls,
25
+ .work-status-filters {
20
26
  display: flex;
21
- flex-direction: column;
27
+ flex-wrap: wrap;
22
28
  gap: var(--rly-space-4);
23
- white-space: nowrap;
24
29
  }
25
- .work-time-travel {
26
- display: grid;
27
- gap: var(--rly-space-12);
28
- }
29
- .work-time-heading,
30
- .work-time-controls {
30
+
31
+ .work-time-option,
32
+ .work-status-filter {
31
33
  align-items: center;
32
- display: flex;
33
- gap: var(--rly-space-8);
34
- }
35
- .work-time-heading {
36
- justify-content: space-between;
37
- }
38
- .work-time-heading > div {
39
- display: grid;
40
- gap: var(--rly-space-4);
41
- }
42
- .work-time-controls {
43
- flex-wrap: wrap;
44
- }
45
- .work-time-link {
34
+ background: none;
35
+ border: 0;
36
+ border-radius: var(--rly-radius-field);
37
+ color: var(--rly-color-text-2);
38
+ cursor: pointer;
39
+ display: inline-flex;
40
+ font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)
41
+ var(--rly-type-label-font);
42
+ min-block-size: calc(var(--rly-space-32) + var(--rly-space-8));
43
+ padding-inline: var(--rly-space-12);
46
44
  text-decoration: none;
47
- text-underline-offset: 0.2em;
48
45
  }
49
- .work-summary-grid {
50
- display: grid;
51
- gap: var(--rly-space-8);
52
- grid-template-columns: repeat(6, minmax(0, 1fr));
46
+
47
+ .work-time-option:is([aria-pressed="true"], [aria-current="page"]),
48
+ .work-status-filter:is([aria-pressed="true"], [aria-current="page"]) {
49
+ color: var(--rly-color-text-1);
50
+ text-decoration: underline;
51
+ text-decoration-thickness: var(--rly-space-2);
52
+ text-underline-offset: var(--rly-space-6);
53
53
  }
54
- .work-summary-cell {
55
- display: flex;
56
- flex-direction: column;
57
- gap: var(--rly-space-8);
54
+
55
+ .work-time-option:focus-visible,
56
+ .work-status-filter:focus-visible,
57
+ .work-board-row:focus-visible,
58
+ .work-exact-link:focus-visible,
59
+ .work-connect-link:focus-visible,
60
+ .work-load-more-link:focus-visible {
61
+ outline: 2px solid var(--rly-color-focus);
62
+ outline-offset: 2px;
58
63
  }
64
+
65
+ /* Goals beside the open goal from a wide container; one column below that. */
59
66
  .work-board-layout {
60
67
  align-items: start;
61
68
  display: grid;
62
- gap: var(--rly-space-16);
63
- grid-template-columns: minmax(0, 1fr) minmax(20rem, 0.32fr);
64
- }
65
- .work-board-list {
66
- display: grid;
67
- gap: var(--rly-space-12);
68
- min-inline-size: 0;
69
- }
70
- .work-board-toolbar {
71
- align-items: center;
72
- display: flex;
73
- gap: var(--rly-space-12);
74
- justify-content: space-between;
75
- min-inline-size: 0;
69
+ gap: var(--rly-space-24);
70
+ grid-template-columns: minmax(0, 1fr);
76
71
  }
77
- .work-board-toolbar > span {
78
- flex: none;
72
+
73
+ @container work-page (width >= 60rem) {
74
+ .work-board-layout[data-has-detail="true"] {
75
+ grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
76
+ }
79
77
  }
80
- .work-status-filters {
81
- display: flex;
78
+
79
+ .work-group {
80
+ display: grid;
82
81
  gap: var(--rly-space-6);
83
- max-inline-size: 100%;
84
- overflow-x: auto;
85
- padding-block-end: var(--rly-space-4);
86
82
  }
87
- .work-status-filter {
88
- appearance: none;
89
- background: var(--rly-color-surface-1);
90
- border: 1px solid var(--rly-color-border-1);
91
- border-radius: var(--rly-radius-field);
92
- color: var(--rly-color-text-2);
93
- cursor: pointer;
94
- flex: none;
83
+
84
+ .work-group + .work-group {
85
+ margin-block-start: var(--rly-space-16);
86
+ }
87
+
88
+ .work-group-title {
95
89
  font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)
96
90
  var(--rly-type-label-font);
97
- padding: var(--rly-space-8) var(--rly-space-12);
98
- text-decoration: none;
91
+ margin: var(--rly-space-0);
99
92
  }
100
- .work-status-filter[aria-current="page"],
101
- .work-status-filter[aria-pressed="true"] {
102
- background: var(--rly-color-action-background);
103
- border-color: var(--rly-color-action-background);
104
- color: var(--rly-color-action-foreground);
105
- }
106
- .work-departure-board {
107
- overflow-x: auto;
108
- overflow-y: hidden;
93
+
94
+ .work-group-count {
95
+ color: var(--rly-color-text-2);
96
+ font-weight: 400;
109
97
  }
110
- .work-empty-filter {
98
+
99
+ .work-rows {
111
100
  border-block-start: 1px solid var(--rly-color-border-1);
112
- padding: var(--rly-space-20);
113
- }
114
- .work-load-more-link {
115
- border: 1px solid var(--rly-color-border-1);
116
- border-radius: var(--rly-radius-field);
117
- color: var(--rly-color-text-1);
118
- font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)
119
- var(--rly-type-label-font);
120
- padding: var(--rly-space-12) var(--rly-space-16);
121
- text-align: center;
122
- text-decoration: none;
123
- }
124
- .work-board-head,
125
- .work-board-row {
126
- align-items: center;
127
101
  display: grid;
128
- gap: var(--rly-space-16);
129
- grid-template-columns:
130
- 7.5rem minmax(15rem, 1.4fr) minmax(8.75rem, 0.6fr) minmax(13rem, 0.9fr) minmax(10.5rem, 0.7fr)
131
- 6rem 7rem;
132
- padding: var(--rly-space-12) var(--rly-space-16);
133
- }
134
- .work-board-head {
135
- color: var(--rly-color-text-3);
136
- font: var(--rly-type-meta-weight) var(--rly-type-meta-size)/var(--rly-type-meta-line-height)
137
- var(--rly-type-meta-font);
102
+ list-style: none;
103
+ margin: var(--rly-space-0);
104
+ padding: var(--rly-space-0);
138
105
  }
106
+
139
107
  .work-board-row {
140
- appearance: none;
141
- background: var(--rly-color-surface-1);
108
+ background: none;
142
109
  border: 0;
143
- border-block-start: 1px solid var(--rly-color-border-1);
144
- color: var(--rly-color-text-1);
110
+ border-block-end: 1px solid var(--rly-color-border-1);
111
+ color: inherit;
145
112
  cursor: pointer;
113
+ display: grid;
114
+ font: inherit;
115
+ gap: var(--rly-space-4) var(--rly-space-12);
116
+ grid-template-areas: "title state" "caption caption";
117
+ grid-template-columns: minmax(0, 1fr) auto;
146
118
  inline-size: 100%;
147
- min-block-size: 5.5rem;
119
+ padding: var(--rly-space-12) var(--rly-space-8);
148
120
  text-align: start;
149
121
  text-decoration: none;
150
122
  }
151
- .work-board-row[aria-pressed="true"] {
152
- background: var(--rly-color-surface-3);
123
+
124
+ .work-board-row:is([aria-pressed="true"], [aria-current="true"]) {
125
+ background: var(--rly-color-surface-2);
126
+ outline: 1px solid var(--rly-color-border-2);
127
+ outline-offset: -1px;
128
+ }
129
+
130
+ /* Long unbroken values (branch names, titles) wrap inside their column. The grids below bound
131
+ their single track to the container (minmax(0, 1fr)) so an unbroken word cannot size it. */
132
+ .work-page,
133
+ .work-group,
134
+ .work-rows,
135
+ .work-row-title,
136
+ .work-facts,
137
+ .work-detail,
138
+ .work-detail-section,
139
+ .work-detail-list > li {
140
+ grid-template-columns: minmax(0, 1fr);
141
+ }
142
+
143
+ .work-row-title,
144
+ .work-row-meta,
145
+ .work-row-caption,
146
+ .work-facts dd,
147
+ .work-detail-list > li {
148
+ overflow-wrap: break-word;
149
+ }
150
+
151
+ .work-row-title {
152
+ display: grid;
153
+ gap: var(--rly-space-2);
154
+ grid-area: title;
155
+ min-inline-size: var(--rly-space-0);
153
156
  }
154
- .work-board-copy {
155
- display: flex;
156
- flex-direction: column;
157
- gap: var(--rly-space-4);
158
- min-inline-size: 0;
159
- overflow-wrap: anywhere;
157
+
158
+ .work-row-meta,
159
+ .work-row-caption {
160
+ color: var(--rly-color-text-2);
161
+ font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)
162
+ var(--rly-type-meta-font);
160
163
  }
161
- .work-inspector {
162
- display: grid;
163
- gap: var(--rly-space-16);
164
- inset-block-start: var(--rly-space-16);
165
- position: sticky;
164
+
165
+ .work-row-caption {
166
+ grid-area: caption;
166
167
  }
167
- .work-inspector-heading {
168
- align-items: center;
169
- display: flex;
170
- gap: var(--rly-space-12);
171
- justify-content: space-between;
168
+
169
+ /* Only the blocking fact carries ink. */
170
+ .work-row-caption[data-blocking="true"] {
171
+ color: var(--rly-color-blocked-ink);
172
172
  }
173
- .work-connect-link {
174
- background: var(--rly-color-action-background);
175
- border-radius: var(--rly-radius-field);
176
- color: var(--rly-color-action-foreground);
173
+
174
+ /* State as a word, quiet in rows. */
175
+ .work-row-state {
176
+ color: var(--rly-color-text-2);
177
177
  font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)
178
178
  var(--rly-type-label-font);
179
- padding: var(--rly-space-12) var(--rly-space-16);
180
- text-align: center;
181
- text-decoration: none;
179
+ grid-area: state;
182
180
  }
183
- .work-exact-link {
184
- color: var(--rly-color-action-foreground);
185
- font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)
186
- var(--rly-type-label-font);
187
- text-decoration: underline;
188
- text-decoration-color: color-mix(in srgb, var(--rly-color-action-foreground) 45%, transparent);
189
- text-underline-offset: 0.2em;
181
+
182
+ /* In the detail the state word takes its ink; in a row the group title and caption already say it. */
183
+ .work-detail .work-row-state[data-tone="critical"] {
184
+ color: var(--rly-color-blocked-ink);
190
185
  }
191
- .work-exact-link:focus-visible,
192
- .work-exact-link:hover {
193
- text-decoration-color: currentColor;
186
+
187
+ .work-detail .work-row-state[data-tone="caution"] {
188
+ color: var(--rly-color-held-ink);
194
189
  }
195
- .work-inspector-section {
190
+
191
+ /* The open goal. */
192
+ .work-detail {
196
193
  display: grid;
197
- gap: var(--rly-space-8);
194
+ gap: var(--rly-space-16);
198
195
  }
199
- .work-inspector-section h3 {
200
- margin: 0;
196
+
197
+ .work-facts {
198
+ background: var(--rly-color-surface-2);
199
+ border-radius: var(--rly-radius-control);
200
+ display: grid;
201
+ margin: var(--rly-space-0);
202
+ padding: var(--rly-space-8) var(--rly-space-16);
201
203
  }
202
- .work-family-history {
203
- border: 1px solid var(--rly-color-border-1);
204
+
205
+ .work-facts > div {
206
+ border-block-end: 1px solid var(--rly-color-border-1);
207
+ display: grid;
208
+ gap: var(--rly-space-12);
209
+ grid-template-columns: 7rem minmax(0, 1fr);
210
+ padding-block: var(--rly-space-8);
211
+ }
212
+
213
+ .work-facts > div:last-child {
214
+ border-block-end: 0;
215
+ }
216
+
217
+ .work-facts dt {
218
+ color: var(--rly-color-text-2);
219
+ font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)
220
+ var(--rly-type-meta-font);
221
+ }
222
+
223
+ .work-facts dd {
224
+ margin: var(--rly-space-0);
225
+ min-inline-size: var(--rly-space-0);
226
+ }
227
+
228
+ /* A note is a flat box with an even border; the first word carries the state. */
229
+ .work-note {
230
+ border: 1px solid var(--rly-color-border-2);
204
231
  border-radius: var(--rly-radius-field);
232
+ margin: var(--rly-space-0);
205
233
  padding: var(--rly-space-8) var(--rly-space-12);
206
234
  }
207
- .work-family-history > summary {
208
- cursor: pointer;
209
- font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)
210
- var(--rly-type-label-font);
235
+
236
+ .work-note[data-tone="blocked"] > b:first-child {
237
+ color: var(--rly-color-blocked-ink);
211
238
  }
212
- .work-family-history[open] > summary {
213
- margin-block-end: var(--rly-space-8);
239
+
240
+ .work-detail-section {
241
+ display: grid;
242
+ gap: var(--rly-space-8);
214
243
  }
244
+
215
245
  .work-detail-list {
216
246
  display: grid;
217
- gap: var(--rly-space-8);
247
+ gap: var(--rly-space-0);
218
248
  list-style: none;
219
- margin: 0;
220
- padding: 0;
249
+ margin: var(--rly-space-0);
250
+ padding: var(--rly-space-0);
221
251
  }
222
- .work-detail-list li {
223
- border-block-start: 1px solid var(--rly-color-border-1);
252
+
253
+ .work-detail-list > li {
254
+ border-block-end: 1px solid var(--rly-color-border-1);
224
255
  display: grid;
225
- gap: var(--rly-space-6);
226
- padding-block-start: var(--rly-space-8);
256
+ gap: var(--rly-space-4);
257
+ padding-block: var(--rly-space-8);
227
258
  }
228
- .work-request-heading,
229
- .work-review-heading {
230
- align-items: center;
259
+
260
+ .work-request-heading {
261
+ align-items: baseline;
231
262
  display: flex;
232
- flex-wrap: wrap;
233
- gap: var(--rly-space-8);
263
+ gap: var(--rly-space-12);
234
264
  justify-content: space-between;
235
265
  }
236
- .work-facts {
266
+
267
+ .work-activity {
237
268
  display: grid;
238
- gap: var(--rly-space-8);
239
- margin: 0;
269
+ list-style: none;
270
+ margin: var(--rly-space-0);
271
+ padding: var(--rly-space-0);
240
272
  }
241
- .work-facts > div {
242
- border-block-start: 1px solid var(--rly-color-border-1);
243
- display: grid;
244
- gap: var(--rly-space-6);
245
- padding-block-start: var(--rly-space-12);
273
+
274
+ .work-family-history summary {
275
+ cursor: pointer;
246
276
  }
247
- .work-facts dt {
248
- color: var(--rly-color-text-3);
249
- font: var(--rly-type-meta-weight) var(--rly-type-meta-size)/var(--rly-type-meta-line-height)
250
- var(--rly-type-meta-font);
277
+
278
+ .work-links {
279
+ display: flex;
280
+ flex-wrap: wrap;
281
+ gap: var(--rly-space-16);
251
282
  }
252
- .work-facts dd {
253
- font: var(--rly-type-code-weight) var(--rly-type-code-size)/var(--rly-type-code-line-height)
254
- var(--rly-type-code-font);
255
- margin: 0;
256
- overflow-wrap: anywhere;
283
+
284
+ .work-exact-link,
285
+ .work-connect-link,
286
+ .work-load-more-link {
287
+ border-radius: var(--rly-radius-tag);
288
+ color: var(--rly-color-text-1);
289
+ text-decoration-color: var(--rly-color-border-2);
290
+ text-underline-offset: var(--rly-space-4);
257
291
  }
292
+
258
293
  @media (hover: hover) {
259
- .work-time-link:hover {
260
- text-decoration: underline;
261
- }
262
294
  .work-board-row:hover {
263
295
  background: var(--rly-color-surface-2);
264
296
  }
265
- }
266
- @media (max-width: 74rem) {
267
- .work-board-layout {
268
- grid-template-columns: minmax(0, 1fr);
269
- }
270
- .work-inspector {
271
- position: static;
272
- }
273
- .work-departure-board {
274
- overflow-x: auto;
275
- }
276
- .work-board-head,
277
- .work-board-row {
278
- min-inline-size: 61rem;
279
- }
280
- }
281
- @media (max-width: 47.5rem) {
282
- .work-page-intro {
283
- align-items: start;
284
- flex-direction: column;
285
- }
286
- .work-snapshot-stamp {
287
- align-items: start;
288
- }
289
- .work-summary-grid {
290
- grid-template-columns: 1fr 1fr;
291
- }
292
- .work-board-toolbar {
293
- align-items: stretch;
294
- flex-direction: column;
295
- }
296
- .work-departure-board {
297
- overflow: hidden;
298
- }
299
- .work-board-head {
300
- display: none;
301
- }
302
- .work-board-row {
303
- align-items: center;
304
- gap: var(--rly-space-12);
305
- grid-template-columns: auto minmax(0, 1fr);
306
- min-block-size: 0;
307
- min-inline-size: 0;
308
- padding: var(--rly-space-12);
309
- }
310
- .work-board-row > [data-label] {
311
- display: none;
297
+
298
+ .work-time-option:hover,
299
+ .work-status-filter:hover {
300
+ color: var(--rly-color-text-1);
301
+ text-decoration: underline;
302
+ text-decoration-thickness: 1px;
303
+ text-underline-offset: var(--rly-space-6);
312
304
  }
313
305
  }
314
306
  }