@khanglvm/relay 0.12.2 → 0.13.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.
- package/README.md +1 -0
- package/docs/AGENT.md +75 -6
- package/package.json +1 -1
- package/skills/relay/SKILL.md +180 -4
- package/src/cli.js +98 -17
- package/src/mcp-ui/board.js +213 -10
- package/src/server.js +8 -3
- package/src/spec.js +272 -47
- package/src/ui/annotate.css +75 -10
- package/src/ui/annotate.js +90 -12
- package/src/ui/app.js +232 -8
- package/src/ui/blocks.css +164 -4
- package/src/ui/blocks.js +430 -33
- package/src/ui/style.css +90 -0
package/src/ui/style.css
CHANGED
|
@@ -198,6 +198,73 @@ h1 {
|
|
|
198
198
|
.scale button { width: 44px; height: 44px; padding: 0; }
|
|
199
199
|
.scale .slabel { color: var(--muted); font-size: 0.8rem; }
|
|
200
200
|
|
|
201
|
+
/* ranking — reorderable priority list (drag, or the ↑/↓ buttons for
|
|
202
|
+
keyboard/touch). Top = highest priority; the rank badge reflects position. */
|
|
203
|
+
.rank { display: flex; flex-direction: column; gap: 8px; }
|
|
204
|
+
.rank-item {
|
|
205
|
+
display: flex; align-items: center; gap: 12px;
|
|
206
|
+
padding: 10px 12px;
|
|
207
|
+
border: 1px solid var(--border-strong); border-radius: 10px;
|
|
208
|
+
background: var(--card); cursor: grab;
|
|
209
|
+
transition: border-color 150ms var(--ease), box-shadow 150ms var(--ease), opacity 150ms var(--ease);
|
|
210
|
+
}
|
|
211
|
+
.rank-item:active { cursor: grabbing; }
|
|
212
|
+
.rank-item.dragging { opacity: 0.5; }
|
|
213
|
+
.rank-item.drop-into { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; }
|
|
214
|
+
.rank-badge {
|
|
215
|
+
flex: none; width: 26px; height: 26px; border-radius: 50%;
|
|
216
|
+
display: grid; place-items: center;
|
|
217
|
+
background: var(--accent); color: var(--accent-fg);
|
|
218
|
+
font-weight: 600; font-size: 0.85rem;
|
|
219
|
+
}
|
|
220
|
+
.rank-body { flex: 1; min-width: 0; }
|
|
221
|
+
.rank-ctrls { flex: none; display: flex; gap: 4px; }
|
|
222
|
+
.rank-btn {
|
|
223
|
+
width: 30px; height: 30px; padding: 0;
|
|
224
|
+
border: 1px solid var(--border-strong); border-radius: 8px;
|
|
225
|
+
background: var(--bg-sunken); color: var(--fg);
|
|
226
|
+
cursor: pointer; font-size: 14px; line-height: 1;
|
|
227
|
+
transition: border-color 150ms var(--ease);
|
|
228
|
+
}
|
|
229
|
+
.rank-btn:hover:not(:disabled) { border-color: var(--accent); }
|
|
230
|
+
.rank-btn:disabled { opacity: 0.35; cursor: default; }
|
|
231
|
+
|
|
232
|
+
/* checklist — one row per item with a Pass/Fail/N·A segmented status control */
|
|
233
|
+
.checklist { display: flex; flex-direction: column; gap: 8px; }
|
|
234
|
+
.chk-row {
|
|
235
|
+
display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
|
|
236
|
+
padding: 8px 12px; border: 1px solid var(--border); border-radius: 10px; background: var(--card);
|
|
237
|
+
}
|
|
238
|
+
.chk-body { flex: 1; min-width: 140px; }
|
|
239
|
+
.chk-seg { display: flex; gap: 6px; flex: none; }
|
|
240
|
+
.chk-status {
|
|
241
|
+
padding: 6px 14px; font: inherit; font-size: 0.85rem; cursor: pointer;
|
|
242
|
+
background: var(--bg-sunken); color: var(--fg-2);
|
|
243
|
+
border: 1px solid var(--border-strong); border-radius: 8px;
|
|
244
|
+
transition: border-color 150ms var(--ease), background 150ms var(--ease), color 150ms var(--ease);
|
|
245
|
+
}
|
|
246
|
+
.chk-status:hover { border-color: var(--accent); }
|
|
247
|
+
.chk-status.sel { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }
|
|
248
|
+
.chk-status.tone-ok.sel { background: var(--ok); border-color: var(--ok); color: #fff; }
|
|
249
|
+
.chk-status.tone-bad.sel { background: var(--danger); border-color: var(--danger); color: var(--danger-fg); }
|
|
250
|
+
.chk-status.tone-warn.sel { background: var(--accent); border-color: var(--accent); color: var(--accent-fg); }
|
|
251
|
+
.chk-status.tone-muted.sel { background: var(--muted); border-color: var(--muted); color: #fff; }
|
|
252
|
+
|
|
253
|
+
/* allocate — distribute a budget across options with sliders + a live total */
|
|
254
|
+
.allocate { display: flex; flex-direction: column; gap: 14px; }
|
|
255
|
+
.alloc-row { display: flex; flex-direction: column; gap: 6px; }
|
|
256
|
+
.alloc-rowhead { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
|
|
257
|
+
.alloc-num { font-variant-numeric: tabular-nums; font-weight: 600; color: var(--fg); }
|
|
258
|
+
.alloc-range { width: 100%; accent-color: var(--accent); }
|
|
259
|
+
.alloc-total { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding-top: 4px; border-top: 1px solid var(--border); }
|
|
260
|
+
.alloc-bar { flex: 1; min-width: 120px; height: 8px; background: var(--bg-sunken); border-radius: 999px; overflow: hidden; }
|
|
261
|
+
.alloc-bar-fill { height: 100%; width: 0; background: var(--accent); transition: width 120ms var(--ease); }
|
|
262
|
+
.alloc-bar-fill.over { background: var(--danger); }
|
|
263
|
+
.alloc-sumwrap { color: var(--muted); font-size: 0.85rem; flex: none; }
|
|
264
|
+
.alloc-sum { font-weight: 600; color: var(--fg-2); font-variant-numeric: tabular-nums; }
|
|
265
|
+
.alloc-sum.exact { color: var(--ok); }
|
|
266
|
+
.alloc-sum.over { color: var(--danger); }
|
|
267
|
+
|
|
201
268
|
input[type="text"], textarea {
|
|
202
269
|
width: 100%;
|
|
203
270
|
background: var(--bg-sunken); color: var(--fg);
|
|
@@ -328,3 +395,26 @@ textarea { min-height: 90px; resize: vertical; }
|
|
|
328
395
|
.colorpresets { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
329
396
|
.colorpreset { width: 26px; height: 26px; border-radius: 7px; border: 1px solid rgba(0,0,0,.14); cursor: pointer; padding: 0; transition: transform .12s var(--ease); }
|
|
330
397
|
.colorpreset:hover { transform: scale(1.12); }
|
|
398
|
+
|
|
399
|
+
/* "pick from a palette" — labeled swatch cards, click to select, each commentable */
|
|
400
|
+
.colorpalette { display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: 10px; }
|
|
401
|
+
.colorpal-sw {
|
|
402
|
+
position: relative; height: 64px; padding: 0; cursor: pointer;
|
|
403
|
+
border: 1px solid rgba(0,0,0,.14); border-radius: 10px;
|
|
404
|
+
display: flex; align-items: flex-end;
|
|
405
|
+
transition: transform .12s var(--ease), box-shadow .15s var(--ease);
|
|
406
|
+
}
|
|
407
|
+
.colorpal-sw:hover { transform: translateY(-1px); }
|
|
408
|
+
.colorpal-sw.sel { box-shadow: 0 0 0 2px var(--bg), 0 0 0 4px var(--accent); }
|
|
409
|
+
.colorpal-sw.sel::after {
|
|
410
|
+
content: '✓'; position: absolute; top: 4px; right: 6px;
|
|
411
|
+
font-size: 0.8rem; font-weight: 700; color: #fff;
|
|
412
|
+
text-shadow: 0 1px 2px rgba(0,0,0,.5);
|
|
413
|
+
}
|
|
414
|
+
.colorpal-label {
|
|
415
|
+
width: 100%; padding: 3px 7px;
|
|
416
|
+
font-size: 0.72rem; color: #fff;
|
|
417
|
+
background: linear-gradient(transparent, rgba(0,0,0,.42));
|
|
418
|
+
border-radius: 0 0 9px 9px;
|
|
419
|
+
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
420
|
+
}
|