diff --git a/src/workspaces/officerdev/src/apps/Plugins/TagNav.tsx b/src/workspaces/officerdev/src/apps/Plugins/TagNav.tsx index 10551806..ef8d1bbd 100644 --- a/src/workspaces/officerdev/src/apps/Plugins/TagNav.tsx +++ b/src/workspaces/officerdev/src/apps/Plugins/TagNav.tsx @@ -32,14 +32,31 @@ const TAG_ICONS: Record = { Fun: 'Gamepad2', }; -const ROW = 'flex items-center gap-2.5 rounded-lg px-3 py-2 text-sm transition-colors w-full text-left'; +/* + The house section-nav row, taken from `fofos-admin/web/NavPanel.tsx`. + + Three things carry the look, and each is doing a job: + + `border-b border-border` — the SEPARATION. Gapped pills read as a floating list where the boundary + between one item and the next is guesswork; a ruled edge says where a row ends. + + The label is NOT muted. It was `text-duck-dark/70`, so every row whispered and the eye had nothing to + land on. The muting moves to the line BELOW it, where a count is genuinely secondary. + + Active is `bg-muted` — a filled row rather than a tinted label. Colour on the text was carrying both + "this is a link" and "this one is selected", which is why nothing looked selected. +*/ +const rowClass = (active: boolean) => + `flex w-full items-start gap-2.5 border-b border-border px-3 py-2.5 text-left transition-colors ${ + active ? 'bg-muted' : 'hover:bg-muted/50' + }`; export const TagNav = () => { const { plugins, available, broken, orphans, isLoading, updateAll, updatingAll } = usePlugins(); const [params] = useSearchParams(); const active = params.get('tag'); - if (isLoading) return
Loading…
; + if (isLoading) return
Loading…
; // Counted over everything the grid can show — installed and available together — so a number here // always matches what clicking it produces. @@ -65,61 +82,58 @@ export const TagNav = () => { return { search: `?${next}` }; }; + /** One row: icon, a label that is actually legible, and what it holds underneath. */ + const row = ( + key: string, + to: ReturnType, + Icon: typeof Package, + label: string, + n: number, + on: boolean, + ) => ( + + + + {label} + {/* The count moves here from the right-hand column. It was a number floating at the edge at 60% + opacity, which is where the eye goes last; as the row's second line it is read WITH the label + rather than hunted for. */} + + {n} plugin{n === 1 ? '' : 's'} + + + + ); + return (