Found by the new VALUE-level arm of scripts/test/registry-attrs.test.ts (the name-level arm was green on it).
registry/llui/ui/navigation-menu.ts carries two recipes ported from Radix:
export const NavigationMenuIndicatorTrack = classPart(
div,
'… data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in',
)
export const NavigationMenuIndicatorArrow = classPart(div, '… rotate-45 …')
Radix's NavigationMenuIndicator is driven by the viewport with data-state="visible" | "hidden". @llui/components/navigation-menu has no indicator part at all, so nothing in the package ever produces that attribute and both animation rules match nothing. A consumer that uses the pair has to position AND drive it themselves.
Not urgent — the arrow simply does not animate, and nothing in the demo renders it (only NavigationMenuIndicator, the trigger chevron, is used).
Options
- Add an
indicator part to the machine — publishes data-state="visible"|"hidden" plus the active trigger's offset/width so the arrow can track it. Matches Radix, and makes the ported recipes live.
- Delete both exports. They are the only registry recipes with no state source. A consumer wanting a tracking arrow builds it.
- Leave as consumer-driven and document it on the export. This is what ships today, recorded in
VALUE_ALLOWED with a reason pointing here.
Leaning (1) — the offset/width tracking is the part a consumer cannot reasonably derive without reaching into the machine's internals, which is the usual argument for it living in the machine.
Definition of done
Found by the new VALUE-level arm of
scripts/test/registry-attrs.test.ts(the name-level arm was green on it).registry/llui/ui/navigation-menu.tscarries two recipes ported from Radix:Radix's
NavigationMenuIndicatoris driven by the viewport withdata-state="visible" | "hidden".@llui/components/navigation-menuhas no indicator part at all, so nothing in the package ever produces that attribute and both animation rules match nothing. A consumer that uses the pair has to position AND drive it themselves.Not urgent — the arrow simply does not animate, and nothing in the demo renders it (only
NavigationMenuIndicator, the trigger chevron, is used).Options
indicatorpart to the machine — publishesdata-state="visible"|"hidden"plus the active trigger's offset/width so the arrow can track it. Matches Radix, and makes the ported recipes live.VALUE_ALLOWEDwith a reason pointing here.Leaning (1) — the offset/width tracking is the part a consumer cannot reasonably derive without reaching into the machine's internals, which is the usual argument for it living in the machine.
Definition of done
indicatorpart on the machine, rendered inexamples/registry-demo, and theVALUE_ALLOWEDentries removedVALUE_ALLOWEDentries removed