Repository navigation
Feat/grd 191 Move Studio's sidebar into Equality as the Nav parts - #205
Merged
Merged
Conversation
Need: the nav rows leaving Studio need sizes and fills that Equality owns, so both consumers read the same values. Problem: Equality had no row sizes or current and hover fills; Studio kept its own copies. Solution: theme/decisions.css declares the list, control and touch sizes as runtime variables, and the two fills become tokens with bg-list-item-current and bg-list-item-hover utilities. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: Studio's nav hands IconButton to Radix triggers and focus code that need the element. Problem: IconButton dropped refs under React 18, and dropped them on the link under React 19 too. Solution: the ref reaches whichever element renders, the button or the link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: Studio's sidebar rows and the docs sidebar should be one component other screens can reuse, not a copy per app. Problem: the rows lived in Studio as NavItem and NavSection, with a decorative-only suffix and links as the only row type. Solution: Menu, MenuGroup, MenuList, MenuItem and MenuSeparator render links or buttons sized from the list decisions; a suffix is read out, and a drill row adds › and asks its MenuDrill to open a level. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: a sidebar, popover or drawer should drill into a level and back with the same motion and focus rules Studio has. Problem: Studio's panel cloned the old rows in the DOM, and each caller had to pass the motion and request focus by hand. Solution: MenuDrill keeps the leaving level mounted, inert, while two animations slide it away, and only after a change it asked for; focus moves to ‹ after a drill and back to the row you came from after ‹. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: Studio should import its sidebar frame from Equality so the copy in apps/studio can go. Problem: the rail, panel and switcher lived in Studio, with their own colour variables and the drill-in built into the panel. Solution: NavRail, NavRailItem, NavPanel, NavSwitcher and blockClosedTypeahead read Equality's tokens and size decisions; NavPanel is only the frame, and a panel that drills holds a MenuDrill. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: the docs sidebar is the second consumer, and it has to test the Menu names before 4.15.0 freezes them. Problem: nothing outside Studio had built a real tree on the parts, and the docs tests could not load TSX. Solution: DocsNavMenu renders the docs tree on Menu at sm density, unwired, with a Vitest render test beside the node:test files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: teams building on Equality should find Menu and Nav, and agents in other repos should stop hand-rolling sidebars. Problem: the new parts had no pages, no live demos and no entry in the skill's name table. Solution: Menu and Nav pages with live demos, including a popover and a drawer that drill in, a Sizes table, and three rows in the name table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: Studio's swap (GRD-192) and the docs sidebar (GRD-193) need the parts published. Problem: the Menu, MenuDrill and Nav parts and their size and colour tokens existed only on this branch. Solution: 4.15.0 publishes them, with a changelog entry naming the suffix rule that changes GRD-81. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed for Need: page links must leave focus alone, and a drill-in must not slide or move focus on an unrelated later change. Problem: a pending ‹ or drill request lived until the view changed, which Studio's page links often leave unchanged, so focus could be pulled into the nav; the drawer demo's levels were see-through mid-slide; React 18 warned on server renders. Solution: anything the user does outside the drill drops the pending request, the layout effects go through useIsomorphicLayoutEffect, and the drawer demo puts Menu directly on the drawer's surface, as the docs now say to. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…allers write Need: Teams pick these parts from autocomplete, and the names freeze when 4.15.0 publishes. Problem: MenuItem sat beside DropdownMenuItem with a different keyboard model, and callers placed a bare list and the ‹ row by hand. Solution: The rows are NavList* and the drill-in NavDrill, controlled with value like Tabs. Groups draw their own list, levels their own ‹ row, and the leaving level no longer flashes after ‹. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: Developers adopting the sidebar need one place that shows every part as Studio uses it. Problem: The rows and the sidebar were split across two pages, with generic demos and drill-in examples filed as variants. Solution: One Nav page with usage, variants, a drill-in section (on its own and following the URL) and examples, all on Studio's labels. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: The names and markup freeze when 4.15.0 publishes, and a fix after that is a breaking change.
Problem: Nesting a group gave invalid list HTML, ‹ didn't say "back" by default, a loading switcher was silent, and two row sizes waited on a density decision.
Solution: One 36px row size; nested groups and separators wrap themselves in list items; ‹ defaults to "{label}, back"; the loading switcher announces itself.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: The next person to edit the nav parts needs to know what not to change, not a narration of the code. Problem: Several comments described layout and motion instead of the constraint behind them. Solution: Those comments now name what breaks, descriptive ones are gone, and NavDrill's prop docs match the docs page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… action plainly Need: Every prop in 4.15.0 is frozen, so each one should have a user. Problem: NavPanel's title had none, and action's description read like a one-off. Solution: title is gone (a heading goes in header), and action reads as a general command at the bottom of the list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: Someone reading the nav styles or inspecting the page should find the same naming as in every other component. Problem: The nav modules used bare class names such as .item and .panel, and one variant written with a single dash. Solution: Classes carry the component's name with -- for variants (.nav-list-item, .nav-list-item--back). The page renders identically. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
matthewmr-eqty
marked this pull request as draft
October 27, 2026 13:55
Need: Everyone who installs 4.15.0 receives decisions.css, so it should hold rules, not a discussion. Problem: The file opened with a commented-out draft of the scale debate's proposals. Solution: The proposals move to GRD-173; one line stays, warning that a live @theme --spacing changes every component's compiled CSS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Need: Moving between nav levels should feel quick and quiet, the way Equality's other nav motion does. Problem: The half-width push travelled far for a narrow panel, and a plain cross-fade showed both levels' rows at once as doubled text. Solution: Both levels move 12px over 300ms with a quick start and long settle, and the leaving level fades out within the first third. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
matthewmr-eqty
marked this pull request as ready for review
October 27, 2026 14:23
tmccoy14
reviewed
Oct 27, 2026
tmccoy14
left a comment
Contributor
There was a problem hiding this comment.
Six things I think should be sorted before this merges, inline below. Smaller, non-blocking items are in a separate comment.
Generated by Claude Code
Contributor
|
Smaller, non-blocking items:
Generated by Claude Code |
Need: apps that install 4.15.0 get parts that reach every user, stay inside the Equality box and keep their names after release. Problem: review found a rail item keyboards can't reach, a link IconButton that drops tooltip props, sizes leaking onto the host page and an unreleased docs draft riding along. Solution: fix each point, prefix the sizes with --eq-, generate the scoped decisions file, and move the docs draft and blockClosedTypeahead to where they belong. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
|
@tmccoy14 all addressed in 617c859: Inline
Non-blocking
I also removed the CSS tests that only repeated the stylesheet's values. The leak and stale-file checks stay. |
tmccoy14
approved these changes
Oct 27, 2026
Shrinks99
added a commit
that referenced
this pull request
Oct 28, 2026
Co-authored-by: matthewmr-eqty <matthew.rhodes@eqtylab.io>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Need
Studio's sidebar and the docs sidebar should come from Equality, so they look and behave the same and Studio can delete its own copy (GRD-192). Part names and props freeze with this release.
Problem
The rows, the drill-in and the sidebar frame lived only in Studio, with their own colour variables. The motion and focus rules were spread across two Studio files.
Change
Eight parts, in two layers:
NavRail,NavRailItemNavPanel<nav>landmark with a header and a scrolling bodyNavSwitcherNavList,NavListGroup,NavListItem,NavListSeparatorNavDrill,NavDrillLevelNavList, notMenu: menus are for actions, which isDropdownMenu's job; nav lists are for going places.NavDrillcan follow the URL (valueandonValueChange, as Tabs does), and slides only when the user asked for the change.suffixis only for the › caret: the › now comes fromdrilland is hidden from screen readers, andsuffixholds badges and marks (a count, "New", ↗) that screen readers read with the label.API choices
Every prop is used by Studio or the docs sidebar. Adding a prop later doesn't break anyone; removing one does.
titleonNavPanel: no Studio panel used one. A heading goes inheader.actiononNavSwitcher, as in Studio today: "Create Project" is an item in the list, because a separate button in the dropdown can't be reached by keyboard. A footer slot can be added later.touch,back,viewandmotionare gone: touch sizing is automatic, levels draw their own ‹, andNavDrillowns the motionReview focus
packages/ui/src/components/nav-list/nav-drill.tsxcarries the risk: the slide between levels and where keyboard focus lands. The rest is mostly additive. Skippnpm-lock.yaml.Not covered
React 18, real browsers and screen readers. Density for all of Equality is GRD-173.
Closes GRD-191 · Part of GRD-81