Skip to content

catalog: collapsible rail, bucket glyphs, collaborator readout (Simon's batch, staged for adoption)#5135

Draft
nl0 wants to merge 12 commits into
dx-shell-rehomefrom
dx-shell-rehome-simon
Draft

catalog: collapsible rail, bucket glyphs, collaborator readout (Simon's batch, staged for adoption)#5135
nl0 wants to merge 12 commits into
dx-shell-rehomefrom
dx-shell-rehome-simon

Conversation

@nl0

@nl0 nl0 commented Jul 23, 2026

Copy link
Copy Markdown
Member

Preserves the 2026-07-22 batch (originally pushed to `dx-shell-rehome`, rewound off it on 2026-07-23) as its own reviewable unit, staged for piecewise adoption after deliberation.

Contents

  • Collapsible sidebar rail (`17ebd55f`): manual collapse toggle, localStorage persistence, 72px icon column, wordmark/icon logo variants (new PNG assets).
  • Seeded bucket glyph library (`17ebd55f`): 79 hand-authored SVG glyphs + hashed tint, page-level collision-free assignment on the landing volume list.
  • Collaborator readout (`f06de151`): replaces the clipping corner Badge with a labelled footer/inline readout (this piece reviewed well — likely first adoption candidate).
  • Master merge (pillow bumps, lambdas only).

Why it was rewound

Assessed as prototype-stage divergence needing polish before it lands on the design branch (full review on the workbench ledger, qhq-n7bz.23, 2026-07-23). Headlines:

  • Collapse choreography: only the rail width animates (200ms); all content unmounts/reflows instantly at t=0 (measured: at 30ms the rail has moved 15px of 184 while labels/logo/workspace box are already swapped). Wants the MUI mini-drawer pattern (keep-mounted, fixed icon gutter, opacity-clipped labels, `noWrap`).
  • Logo assets: `quilt-icon.png` is a pixel-exact (0,0) crop of `quilt-wordmark.png` (RMSE 0.0) — one asset can serve both via `background-size/position`, which also fixes the first-collapse blank flash (24KB icon exceeds the inline threshold and lazy-loads). Sign-in (BareHeader) still renders the retired low-res mark — branding splits across the auth boundary.
  • Glyph library: assignment runs over the paginated slice, so a bucket's glyph changes under filtering (contradicting the stability comments); tints hardcode six hex values including the indicator amber as a surface and an unratified teal (the palette deleted in `a4ffb050`); amber/coral glyphs measure ~2.1:1 on their own discs; complex paths don't read at 16px.
  • Regression: bookmarks Badge reverted to `color="primary"` — midnight-on-midnight, invisible dot (the amber `badgeDot` class it orphaned is the fix).
  • Smaller items: no `prefers-reduced-motion` guard, 26px toggle hit target without `aria-expanded`/focus ring, storage key bypasses the `mkStorage` registry, Freeze scaffolding adapted rather than removed.

Adoption path

Cherry-pick / rework per piece against the assessment, starting with the collaborator readout. The collapse UX and per-workspace identity marks (initials avatars) have follow-up design ideas on the ledger.

🤖 Generated with Claude Code

Update — 2026-07-24 (Simon's work for today; not complete)

This PR now also carries today's work on top of the staged batch above. It is a checkpoint, not a finished unit — opened for review to represent where today landed. Several of the 07-23 assessment items above are now addressed by the new commits; others remain open (below).

New commits:

  • a1f8f5e9 — bucket glyph as a persisted attribute + color + categories. The seeded icon becomes a real bucket attribute (persisted in iconUrl as quilt-glyph:<name>?c=RRGGBB — no backend/schema change), identical across grid/list/admin. Fixes the centrifuge glyph (read as a cloud at the 24px gate). Category model as metadata over the existing GLYPHS order (order stays a website-register contract). Grid/list render stored iconUrl first; collision-free assignment now runs only over legacy null-icon buckets.
  • 31b74113 — admin icon picker rebuild. Click-to-open (the live preview is the trigger), search + 12 sticky category groups, on-palette named swatches + an in-app Roboto-Mono hex field (replaces the native OS color dialog), non-color selection checkmarks, selected glyph named in text. New buckets persist a default; legacy buckets materialize on next save.
  • a011113b — sidebar collapse + Athena polish. Compositor-only collapse motion (logo crossfade, label fade/slide; only rail width reflows) with a prefers-reduced-motion guard; Athena selector alignment + empty states.

Quality: Impeccable critique → shape → clarify → polish (score 29 → 32/40); tsc clean; BucketGrid spec passing; detector clean. Worktree husky hook is broken, so oxfmt/oxlint were run manually (clean) and commits used --no-verify.

Still open (not done today): free-hex can escape the ≤10% palette doctrine (no contrast warning); picker mutates form on browse + URL paste silently discards glyph+color; no category map / roving-tabindex keyboard nav; logo-asset dedup + sign-in mark untouched; doctrine Qs (unique-identity vs. free-pick; whether free-hex belongs).

dependabot Bot and others added 7 commits July 21, 2026 06:08
…5125)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…eview (#5127)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…5128)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Website register (landing bucket grid):
- Expand seeded BucketIcon glyphs to a 79-entry scientifically-oriented
  library (labware, molecular bio, microbiology, chemistry, data-viz,
  clinical) in components/BucketIcon/seedGlyphs.ts.
- Add page-level collision-free glyph assignment (assignGlyphs: hashed
  preferred slot + linear probe) so no two visible buckets share a glyph;
  wire glyphIndex through BucketGrid (cards) and BucketList (rows).
- Tint still hashes from name for color variety independent of glyph.

Shell: collapsible sidebar rail (animated width with content reflow),
logo/wordmark assets, NavBar + Landing Buckets adjustments.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The collaborator count was a floating MUI Badge in the card's top-right
corner; its translate(50%,-50%) overhang collided with the rounded corner
and clipped. Replace it with a quiet lab-instrument readout in one visual
language, two densities:

- Cards (footer variant): "Shared with N" on a divider baseline that lines
  up across every card, with an "Only you" private state. Card body reorders
  to description -> tags -> flex spacer -> footer so rows stay uniform.
- Rows/list (inline variant): the label collapses to a visually-hidden span
  (kept for screen readers; tooltip carries it), leaving a compact glyph +
  tabular count that right-aligns down the list. A conditional right gutter
  keeps tags and the title/address from sliding under the readout.

Collaborators gains a variant prop ('footer' default, 'inline' for rows);
count uses tabular-nums and mutes until hover. Unmanaged roles still surface
as "N+".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Removes the localhost:8400 dev-only <script> injection that leaked into
the committed HTML and was failing oxfmt --check (test-catalog).

Co-authored-by: Cursor <cursoragent@cursor.com>
@nl0

nl0 commented Jul 23, 2026

Copy link
Copy Markdown
Member Author

@QuiltSimon your work is preserved here

smkohnstamm and others added 4 commits July 23, 2026 10:08
- tagStyles.ts: one tag vocabulary (square, soft-tertiary at rest, solid
  when active) shared by the card, list row, and shortcuts so the three
  call sites can't drift apart again.
- fix chip active-state false positive: match on tokenized filter terms
  instead of substring (`filter.includes('rna')` was lighting up while
  filtering "rna-seq").
- gate the card entrance animation behind prefers-reduced-motion: no-preference.
- title reads text.primary at rest, tertiary on hover (matches the list row).
- add-tile border uses the tertiary token, not the retired off-palette indigo.
- empty-search state: calmer h6 headline + a "Clear filter" recovery button.

Co-authored-by: Cursor <cursoragent@cursor.com>
Make the seeded bucket icon a real bucket attribute rather than a
per-view render artifact.

- BucketIcon: extend the quilt-glyph: scheme to carry an optional disc
  color (quilt-glyph:<name>?c=RRGGBB) via parseGlyphSrc/buildGlyphSrc, so
  an admin-chosen color rides inside the single iconUrl string with no
  backend schema change. Thread the color through seedToArt (it overrides
  the hashed tint; wash/ring still derive from the one tint so the chip
  stays coherent). Add defaultGlyphSrcForBucket for a deterministic
  per-bucket default.
- seedGlyphs: fix the centrifuge glyph (was reading as a cloud at the 24px
  blind-read gate). Add a category model over the existing GLYPHS order
  (GLYPH_CATEGORIES boundaries + GLYPH_GROUPS) — metadata only, order is
  preserved because the website register hashes names into indices.
- BucketGrid/BucketList: render stored iconUrl first; only fall back to the
  collision-free assignGlyphs pass for legacy buckets with no stored icon.

The icon now looks identical in the grid, list, and admin, and persists on
create / on the next admin save for legacy buckets.

Co-Authored-By: Claude <noreply@anthropic.com>
…to-open

Rebuild the admin glyph picker around the persisted glyph+color model.

- Click-to-open: the live BucketIcon preview is itself the trigger (a
  keyboard-accessible button, amber two-layer focus ring that holds on both
  the white card and the canvas, reduced-motion-gated hover) — no separate
  "Choose a glyph" button.
- Findability: a pinned autoFocus search field; at rest the ~200 glyphs
  render grouped under 12 sticky category headings (from GLYPH_GROUPS);
  typing collapses to a flat prefix-then-substring ranked list; empty →
  "No glyphs match".
- Color: an Auto chip (name-hashed tint) + the six on-palette SEED_TINTS
  swatches (human-named) + an in-app Roboto Mono hex field (replaces the
  native OS colour dialog, which broke the light-theme surface). Selected
  swatch/Auto carry a checkmark — a non-colour selection cue.
- The selected glyph's human label renders under the preview.
- On create, a bucket with no chosen icon persists a deterministic default;
  the edit form pre-fills that default for legacy null-iconUrl buckets so a
  save materialises it.
- Add a file-scoped detector ignore for broken-image on BucketIcon.tsx (the
  rule naive-matches the literal <img> token in code comments); gitignore
  the impeccable critique snapshots as per-session artifacts.

Co-Authored-By: Claude <noreply@anthropic.com>
Design/UX polish thread that was in flight alongside the glyph work.

- Sidebar: collapsible rail — logo crossfade (icon <-> wordmark) and label
  fade/slide on collapse, kept compositor-only (opacity/transform) except the
  rail's own width, which must reflow the content column.
- Queries/Athena: align the query selector row with the workgroup Select
  (label + input rows match), layout containers, and empty/disabled-state
  handling so the columns line up instead of showing bare text.

Co-Authored-By: Claude <noreply@anthropic.com>
@QuiltSimon

Copy link
Copy Markdown
Contributor

@nl0 — pushed my work for today onto dx-shell-rehome-simon (3 new commits on top of your staged batch): a1f8f5e9 glyph-as-persisted-attribute + color + categories, 31b74113 admin icon-picker rebuild (search / sticky category groups / on-palette swatches + mono hex / click-to-open), a011113b sidebar-collapse + Athena polish.

This is a checkpoint, not complete — it's where I landed today, opened for your review. Some of your 07-23 assessment items are addressed (glyph stability under filtering for configured buckets; reduced-motion guard on collapse; compositor-only motion); others are still open and listed in the updated PR description (free-hex doctrine, in-popover commit/cancel, keyboard grid nav, logo-asset dedup, sign-in mark). Also flagged a couple of doctrine questions worth your call — unique-identity vs. free-pick, and whether free-hex belongs at all.

Note: the worktree's husky hook is broken (.husky/_/husky.sh missing), so I ran oxfmt/oxlint manually (clean) and committed with --no-verify.

The left-rail assistant entry reads just "Qurator" (the chat-input
placeholder in the assistant panel keeps "Ask Qurator").

Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants