← Design · c140

qdash-todos.md

Web bugs the QGUIkit port fixed (c140 D12)

2026-11-12. For: whoever next works the qdash UI (../qcontrol/crates/qdash/ui, feat/new-pages) or the layer's DataTable. Why: replicate-first ran one way. The native port measured each qdash page before drawing it, found these, fixed them on the QGUIkit surface and filed nothing back. Mark ruled (D12) that they go back as qdash todos. qdash keeps its todos in Mark's Logseq blocks, which this session does not write, so they wait here, ready to file.

1. Open rows close on sort (the layer's DataTable)

  • Web:
    • Each expand row keeps its own open ref.
    • A sort, or a refresh that re-keys the rows, closes every open row.
  • QGUIkit's fix:
    • The page holds the open keys on the rows' stable ids, so a sort or a refresh no longer closes a row.
    • Recorded in ../qnative/crates/layer/src/scorecard.rs:84 and qnative c2's CYCLE.md (the table stretch, 5a9915e).
  • Where to fix it: q-nuxt-layer/components/data/Table.vue (#details). Key the open state on rowKey, not on the row's position. It is a layer release.

2. The initial sort matches no column label

  • Web:
    • The listing's initialSort names a key that no column carries.
    • The table opens unsorted, and no header shows the sort.
  • Pages:
    • Providers' and Models' ledgers (QGUIkit sorts by tokens);
    • the Skills page's Installs ledger (QGUIkit sorts by sessions).
  • QGUIkit's fix:
    • qnative c2 CYCLE.md:167 ("Models sorts by tokens; qdash's initial sort matches no label");
    • crates/app/src/pages/provider.rs:9;
    • crates/app/src/pages/skill.rs:10.
  • Where to fix it: each page's initialSort in the qdash UI. Then check whether Table.vue should warn when initialSort matches no column.

3. The Models subtitle claims all-time for a windowed feed

  • Web: the Models listing's subtitle says all-time, while the feed under it is windowed by the period.
  • QGUIkit's fix: qnative c2 CYCLE.md:190 ("The listing subtitle no longer claims all-time for a windowed feed").
  • Where to fix it: the Models listing page in the qdash UI. Say the window the feed is read in.

4. The empty table box stays light in dark mode (the layer's DataTable)

  • Web: Table.vue's empty state draws bg-grey-200, a fixed #E8E8E8, so in dark mode it is a light box on a dark page.
  • QGUIkit's fix: qnative c8 (be4545f) draws it with the surface-sunken-deeper role, the same #E8E8E8 in light and #2B2A2A in dark.
  • Where to fix it: q-nuxt-layer/components/data/Table.vue's #empty template. Replace bg-grey-200 with the role's class. It is a layer release.

5. The Tools band shows zeros while it loads, and when qdash is down

  • Found by: spec-measure's states pass (--states loading,failed), not by the port. See specs/tools.spec.md § States, read 2026-11-12.
  • Web:
    • While every /api/ request is held: the band's machines read "0", "0 builtin · 0 mcp · 0 skill" and "none denied" beside the skeleton bars.
    • When every request is refused: the banner says "Can't reach qdash — showing nothing rather than a guess", and the band below it still shows "0".
    • A zero that was never read breaks R31 (honest states): it is a number the page did not serve.
  • Where to fix it: the Tools listing's band in the qdash UI. Its machines should take null (DataMachine's loading value) until the feed answers, and the failed state when it doesn't, as the ledger below already does. Check the other Inventory listings' bands for the same pattern.

Qpoint Brand Style Guide