@knpkv/herdr-work 0.5.3 → 0.7.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 +103 -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 +31 -0
  23. package/dist/internal/terminal-reconcile.d.ts.map +1 -0
  24. package/dist/internal/terminal-reconcile.js +89 -0
  25. package/dist/internal/terminal-reconcile.js.map +1 -0
  26. package/dist/model.d.ts +939 -29
  27. package/dist/model.d.ts.map +1 -1
  28. package/dist/model.js +256 -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 +768 -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
  }