hyperhive/frontend/packages/shared/src/icons.tsx
iris 4175ae86e3 icons: restore inline-SVG link/gear icons, share them across all three pages
Fixes a regression + a longer-standing inconsistency (mara: "agent
page link icons is different from swarm ui, settings icon looks weird
since component extract").

- The `SettingsMenu` shared-component extraction swapped swarm-ui's
  original inline-SVG gear trigger for a plain `⚙` text glyph (matching
  agent's `MetaNav`, which was itself still on the `🔗` emoji at the
  time). An emoji/text glyph is rendered by the OS/browser's own font
  at that font's fixed metrics — it can never match a neighbouring
  icon in size or weight, and some codepoints (the gear included)
  aren't even reliably covered by every font.
- New `@hive/shared/icons.js` (`GearIcon`, `LinkIcon`) — the exact SVG
  markup that used to live only in swarm-ui's `SettingsMenu`/
  `LinksMenu` as two separate inline copies, now the one shared source.
- `SettingsMenu` (shared) uses `GearIcon`; agent's `MetaNav` and
  swarm-ui's `LinksMenu` both use `LinkIcon` — three consumers, one
  rendering path, matching stroke/viewBox/size everywhere.

Verified with real screenshots on both agent and swarm-ui — both
trigger icons render as the same crisp line-icon style now.
2026-08-29 11:54:21 +02:00

58 lines
2.8 KiB
TypeScript

// Small inline-SVG icons shared across pages — deliberately NOT emoji
// glyphs for a trigger button's own icon. mara, live, on swarm-ui's
// original links/settings buttons: "links and settings icon styles
// different / all different sizes" — an emoji glyph renders via the
// OS/browser's colour-emoji font at that font's own fixed metrics,
// ignoring `font-size`/`color`, so it can never match a neighbouring
// icon in size or weight on any platform (and some codepoints, like the
// gear `⚙`, aren't even reliably covered by every font — showing as a
// missing-glyph box or an oddly-weighted fallback depending on what's
// installed). Same `stroke`/`viewBox`/size shape for every icon here so
// they read as one rendering path wherever they're mounted — Feather/
// lucide-style line icons, `currentColor` stroke so they pick up
// whatever text colour the surrounding `Badge`/button already has.
//
// Originated in swarm-ui's `shell/SettingsMenu.tsx` (gear) and
// `shell/LinksMenu.tsx` (link chain) as separate inline copies; moved
// here once the agent page's `MetaNav`/`SettingsMenu` needed the exact
// same icons too (mara: the settings trigger went back to a text glyph
// when `SettingsMenu` was extracted into `@hive/shared`, undoing this
// fix — restoring the SVG here, in the shared component this time,
// fixes it for both pages at once instead of just one).
export function GearIcon() {
return (
<svg
width="1.3em"
height="1.3em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
aria-hidden="true"
>
<circle cx="12" cy="12" r="3" />
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z" />
</svg>
);
}
export function LinkIcon() {
return (
<svg
width="1.3em"
height="1.3em"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
aria-hidden="true"
>
<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" />
<path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" />
</svg>
);
}