mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-19 15:18:03 +00:00
Switching connection mode (local / cloud agent / remote) no longer full-window-reloads into the cold-boot CONNECTING screen. The primary backend is torn down in place (no renderer reload); the shell + Settings stay up while session lists are wiped so sidebar skeletons retrigger, then the socket re-dials and config/sessions refresh. Cold-boot CONNECTING latches off after the first successful boot; the intentional teardown suppresses the backend-exit toast. Dev affordance: a "Preview soft switch" button under Gateway diagnostics (Electron has no ?query= entry). Gateway settings UI brought in line with the rest of Settings: - Mode cards use the shared selectableCardClass on an equal-height auto-rows-fr grid, stacking 1→3 (never an orphaned 2+1); titles wrap instead of truncating. - Remote gateway's auth detail moves into a ? tooltip in the title; drop the redundant "connects to the one you choose" from the cloud card. - textStrong buttons force px-0 so the underline sits flush with the label. - Tooltip chip uses box-decoration-break: clone so the background hugs each wrapped line (bg only on the text), capped at max-w-64. Fully i18n'd (en + zh; ja/zh-hant inherit via defineLocale).
72 lines
2.7 KiB
TypeScript
72 lines
2.7 KiB
TypeScript
import { Tooltip as TooltipPrimitive } from 'radix-ui'
|
|
import * as React from 'react'
|
|
|
|
import { cn } from '@/lib/utils'
|
|
|
|
function TooltipProvider({ delayDuration = 0, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
|
|
return <TooltipPrimitive.Provider data-slot="tooltip-provider" delayDuration={delayDuration} {...props} />
|
|
}
|
|
|
|
function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
|
|
return <TooltipPrimitive.Root data-slot="tooltip" {...props} />
|
|
}
|
|
|
|
function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
|
|
return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
|
|
}
|
|
|
|
function TooltipContent({
|
|
className,
|
|
sideOffset = 6,
|
|
children,
|
|
...props
|
|
}: React.ComponentProps<typeof TooltipPrimitive.Content>) {
|
|
return (
|
|
<TooltipPrimitive.Portal>
|
|
<TooltipPrimitive.Content
|
|
// Transparent, width-capped wrapper. The visible chip is the inner inline
|
|
// span so `box-decoration-break: clone` gives a marker-style background
|
|
// that hugs EACH wrapped line (bg only on the text, ragged right — no
|
|
// rectangular dead space). Instant, no transition (delayDuration=0).
|
|
className={cn('z-[200] w-fit max-w-64 select-none', className)}
|
|
data-slot="tooltip-content"
|
|
sideOffset={sideOffset}
|
|
{...props}
|
|
>
|
|
{/* bg-foreground/text-background auto-inverts per theme. leading-normal
|
|
keeps lines readable; py-1 makes the cloned line-boxes overlap just
|
|
enough to read as one continuous fill (no gaps between lines). */}
|
|
<span className="box-decoration-clone inline bg-foreground px-1.5 py-1 text-[11px] font-bold leading-normal text-background [font-family:Arial,sans-serif]">
|
|
{children}
|
|
</span>
|
|
</TooltipPrimitive.Content>
|
|
</TooltipPrimitive.Portal>
|
|
)
|
|
}
|
|
|
|
interface TipProps extends Omit<React.ComponentProps<typeof TooltipPrimitive.Content>, 'content'> {
|
|
label: React.ReactNode
|
|
children: React.ReactNode
|
|
delayDuration?: number
|
|
}
|
|
|
|
// Drop-in replacement for native `title=`: wrap any single element. Instant,
|
|
// position-aware, themed. Self-contained (carries its own Provider) so it works
|
|
// anywhere without a provider ancestor. Renders the child untouched when label
|
|
// is falsy.
|
|
function Tip({ label, children, delayDuration = 0, ...props }: TipProps) {
|
|
if (!label) {
|
|
return <>{children}</>
|
|
}
|
|
|
|
return (
|
|
<TooltipProvider delayDuration={delayDuration}>
|
|
<Tooltip>
|
|
<TooltipTrigger asChild>{children}</TooltipTrigger>
|
|
<TooltipContent {...props}>{label}</TooltipContent>
|
|
</Tooltip>
|
|
</TooltipProvider>
|
|
)
|
|
}
|
|
|
|
export { Tip, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }
|