Skip to content

fix(web): rebuild the API keys Agent Setup panel - #278

Closed
Menci wants to merge 12 commits into
fluent-dashboardfrom
fluent-dashboard-fixups
Closed

fix(web): rebuild the API keys Agent Setup panel#278
Menci wants to merge 12 commits into
fluent-dashboardfrom
fluent-dashboard-fixups

Conversation

@Menci

@Menci Menci commented Jul 28, 2026

Copy link
Copy Markdown
Owner

Stacked on #277. Scope: the API Keys page only — the font work is #280 and the login-page copy is #281.

Summary

  • give the Agent Setup panel a sidebar: connection method as a horizontal tab list on top, agent navigation below, replacing the tab row plus Connection method dropdown
  • move the platform switch onto the code block header where the language caption sat, and drop the standalone Platform field
  • render the "select a key" and "preparing" states as a shell comment inside the command block, with Copy disabled, instead of a message bar above the form
  • lay every configuration field on one column track; the tracks floor at zero and the wrapped controls zero their native min-width, because a combobox otherwise reports its input width as min-content and pushes the column past the panel
  • hang field explanations off Fluent's InfoLabel info button through a shared infoLabelSlot helper
  • move the panel title and the key-in-use note into the card: the heading reads "Setup Your Agents" and the key is named in the note under the command
  • drop the Codex mark's full-bleed app-icon plate, which rendered its glyph a quarter smaller than every other provider mark at the same box size

Verification

  • pnpm run lint
  • pnpm --filter @floway-dev/web run typecheck
  • pnpm --filter @floway-dev/web run test — 33 files, 188 tests passed
  • manual: Node gateway + Vite, screenshotted Claude Code / Codex × Setup script / Config snippet × both platforms, and measured the panel's layout tracks in a headless Chrome to confirm nothing overflows

@Menci
Menci force-pushed the fluent-dashboard-fixups branch from 056d9ac to ee60eea Compare July 28, 2026 14:00
The panel stacked an agent tab row, a Connection method dropdown, and a
Platform dropdown above the command, which read as three unrelated
switches, and it laid the model pickers out in two grids of different
widths.

Give the panel a sidebar: the connection method sits on top as a
horizontal tab list, agent navigation below it, so the two axes read apart
by shape. The platform switch moves onto the code block header where the
language caption sat, and the command block itself carries the "select a
key" and "preparing" states as a shell comment, keeping Copy disabled
rather than floating a message bar above the form.

Every configuration field now shares one column track. The tracks floor at
zero and the wrapped controls zero their native `min-width`, because a
combobox otherwise reports its input width as min-content and pushes the
whole column past the panel. Field explanations move from trailing hint
text onto Fluent's InfoLabel info button through a shared `infoLabelSlot`.

The panel title and the key it uses move into the card itself: the heading
reads "Setup Your Agents" and the key is named in the note under the
command, where it applies.

The Codex mark carried a full-bleed app-icon plate, which rendered its
glyph a quarter smaller than every other provider mark at the same box
size; the plate is gone and the viewBox is tightened to the glyph.
@Menci
Menci force-pushed the fluent-dashboard-fixups branch from ee60eea to 17341d0 Compare July 28, 2026 14:33
@Menci Menci changed the title fix(web): rebuild Agent Setup around a navigation sidebar fix(web): rebuild the API keys Agent Setup panel Jul 28, 2026
Menci added 11 commits July 28, 2026 22:43
The list expressed its selection with a hand-drawn dot and a brand-tinted
row, and kept four icon buttons resident in an Actions column. Both are
shapes Fluent already owns.

Selection moves to DataGrid's single-selection radio column, which carries
the row's selected state and keyboard model for us. The row actions move
into TableCellActions on the last cell, where copy stays a direct button
and edit, rotate, and delete collapse into an overflow menu; the Actions
column goes away, since it only reserved width for controls that are
hidden until the row is hovered or focused.
TableCellActions sits at opacity 0 until its row is hovered or holds
focus, and an open menu portals its popover out of that row. Travelling
from the trigger to a menu item therefore faded the trigger out from
under its own menu. Track the menu's open state and pin the actions
visible while it is open.
Hover-revealed actions hid four of the row's five affordances behind a
pointer the operator has to guess at, and touch input never reveals them
at all. Put the actions back in a column of their own, all four resident,
and let the selection radio render unconditionally rather than fading in
with the row.

Drop the fixed column widths with them: the tracks summed to less than
the panel, leaving an unallocated strip on the right, and letting the
grid distribute its own row width fills it.
Fluent gives every cell `flex: 1 1 0`, so the column holding four icon
buttons claimed an equal share of the row and left its buttons stranded
mid-column with the rest of that share empty behind them. Pin the column
to its content width and align it to the row's trailing edge; the space
it gives up goes to the columns that carry text.
The header and the body are separate flex rows, so content-sizing the
actions column through CSS sized the header to its label and the body to
its four buttons, and every column inherited the difference — the whole
row read as misaligned.

Column widths move to the grid's own sizing state, which the header and
the body both read, with per-column minimums that keep the dates on one
line and let the name and upstream columns give up space first. The
container's leftover width lands on the last column, so the actions
column absorbs it and parks its buttons at the trailing edge.
The grid's column sizing writes width, min-width and max-width inline on
every cell, and fits those widths to a container measurement that leaves
out the selection cell — so the columns stopped 96px short of the row's
trailing edge and no amount of flex could stretch them over the gap.

Drop the sizing options and let the cells share the row equally, which
covers it exactly and keeps the header and the body on identical widths.
The actions column right-aligns its buttons and its label, so they land
on the row's trailing edge rather than mid-column.
Delete sat in the same neutral grey as copy, edit, and rotate, so the one
irreversible action in the row read as another routine one. Give it the
red foreground the users page already uses for the same action.
A red icon resident in every row shouts before anyone reaches for it and
breaks the row's rhythm. Keep delete neutral at rest and turn it red on
hover, on press, and on keyboard focus — the moments where the warning
is about to matter.
Delete was resident red in the users table, neutral everywhere else, and
built from a bare Button in the proxy and model-alias tables, so the one
irreversible row action looked different on every page.

TooltipIconButton grows a `danger` flag that reddens the icon on hover,
press, and keyboard focus, and every table's delete adopts it. The proxy
and model-alias rows move onto the shared button as well, which also
gives them the tooltip their neighbours already had. The colour is
guarded by `:enabled`, so a delete the operator may not press stays grey
under the pointer.
@Menci

Menci commented Jul 28, 2026

Copy link
Copy Markdown
Owner Author

Codex agent: Consolidating this follow-up into #277 as requested; the branch remains available while its changes are merged and verified there.

@Menci Menci closed this Jul 28, 2026
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.

1 participant