@nanocollective/roster 0.1.0-alpha.36 → 0.1.0-alpha.38

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nanocollective/roster",
3
- "version": "0.1.0-alpha.36",
3
+ "version": "0.1.0-alpha.38",
4
4
  "description": "An agent-run org, powered by GitHub. Scaffold AI staff members whose brain is a repo.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -192,5 +192,8 @@ textarea.dropping{border-color:var(--accent);background:color-mix(in srgb,var(--
192
192
  .tevquiet .tev{padding:5px 0;font-size:12px}
193
193
 
194
194
  /* Unread, from GitHub's notifications: a bar on the left and a heavier title. Cleared on open. */
195
- .irow.unread{box-shadow:inset 3px 0 0 var(--accent)}
195
+ .irow.unread{box-shadow:inset 3px 0 0 var(--blue);background:color-mix(in srgb,var(--blue) 6%,transparent)}
196
196
  .irow.unread .ititle{font-weight:700;color:var(--ink)}
197
+
198
+ /* A little room between rows, so unread cards and the selected row do not run together. */
199
+ .irow{margin:3px 0}
@@ -78,13 +78,15 @@
78
78
  .sidefoot .nav:hover{color:var(--ink-dim)}
79
79
 
80
80
  /* ---------- main ---------- */
81
- main{padding:36px 44px 96px;max-width:1220px;overflow-x:hidden}
81
+ /* clip, not hidden: hidden makes main a scroll container, and nothing inside it can be sticky. */
82
+ main{padding:36px 44px 96px;max-width:1220px;overflow-x:clip}
82
83
 
83
84
  /* ---------- tree beside viewer ---------- */
84
85
  .split{display:grid;grid-template-columns:314px 1fr;gap:16px;align-items:start}
85
86
  @media (max-width:900px){.split{grid-template-columns:1fr}}
87
+ /* The list beside a viewer stays in view while a long file or thread scrolls. */
86
88
  .tree{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);padding:6px;
87
- max-height:74vh;overflow:auto;box-shadow:var(--shadow-sm)}
89
+ max-height:calc(100vh - 40px);overflow:auto;box-shadow:var(--shadow-sm);position:sticky;top:20px}
88
90
  .tdir{font:600 11px var(--mono);color:var(--ink-faint);padding:9px 8px 4px;letter-spacing:.02em}
89
91
  .tdir.first{padding-top:3px}
90
92
  .tfile{display:flex;align-items:baseline;gap:10px;width:100%;text-align:left;background:none;
@@ -169,3 +171,5 @@ main{padding:36px 44px 96px;max-width:1220px;overflow-x:hidden}
169
171
  .nav.inboxlink{display:flex;align-items:center;gap:8px}
170
172
  .nav.inboxlink .ic,.staffrow .ic{--ic:14px;color:var(--ink-faint);flex:none}
171
173
  .nav.inboxlink[aria-current="true"] .ic{color:var(--accent)}
174
+ /* The unread count matches the unread rows. Empty, it stays grey like every other badge. */
175
+ #unreadcount:not(:empty):not(.wait){background:var(--blue);color:#fff}
@@ -326,7 +326,6 @@ function paintInboxLinks() {
326
326
  // Inbox itself is everything. Under it: each staff member, then the product repos' issues.
327
327
  const links = [
328
328
  ["", "All", "inbox"],
329
- ["@unread", "Unread", "dot"],
330
329
  ...S.data.staff.map((s) => [s.handle, s.name, staffIcon(s)]),
331
330
  ["@issues", "Issues", "issue-open"],
332
331
  ];
@@ -294,9 +294,15 @@ function inboxScreen(m, opts) {
294
294
  list.append(el("div", { className: "tdir err", textContent: e }));
295
295
  }
296
296
 
297
- // Newest first, flat. Grouping by repo buried a fresh comment under whichever project
298
- // happened to sort first; the project moves onto the row instead.
299
- items = items.slice().sort((a, b) => String(b.updatedAt).localeCompare(String(a.updatedAt)));
297
+ // Unread first, then newest first, flat. Grouping by repo buried a fresh comment under
298
+ // whichever project happened to sort first; the project moves onto the row instead.
299
+ items = items
300
+ .slice()
301
+ .sort(
302
+ (a, b) =>
303
+ Number(Boolean(b.unread)) - Number(Boolean(a.unread)) ||
304
+ String(b.updatedAt).localeCompare(String(a.updatedAt)),
305
+ );
300
306
  if (!items.length) {
301
307
  list.append(el("p", { className: "empty", textContent: "Nothing matches." }));
302
308
  return;