Connection manager design refresh; fix stack-row button crowding
Import moves to the window header; sidebar widens with a muted tint; the stack row's count and action buttons swap on hover instead of sharing the row, so long names can't collide with them. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -12,11 +12,24 @@
|
|||||||
<ng-icon name="mynaServers" size="0.95rem" class="shrink-0 text-muted-foreground" />
|
<ng-icon name="mynaServers" size="0.95rem" class="shrink-0 text-muted-foreground" />
|
||||||
<h1 class="text-sm font-semibold">Connections</h1>
|
<h1 class="text-sm font-semibold">Connections</h1>
|
||||||
<div class="flex-1"></div>
|
<div class="flex-1"></div>
|
||||||
|
<button
|
||||||
|
(click)="importWinScp()"
|
||||||
|
[disabled]="importing()"
|
||||||
|
title="Import sessions from a WinSCP.ini export"
|
||||||
|
class="flex items-center gap-1.5 rounded-md px-2 py-1 text-[11px] text-muted-foreground electrobun-webkit-app-region-no-drag hover:bg-accent hover:text-foreground disabled:opacity-50"
|
||||||
|
>
|
||||||
|
@if (importing()) {
|
||||||
|
<ng-icon name="mynaSpinner" size="0.85rem" class="animate-spin" />
|
||||||
|
} @else {
|
||||||
|
<ng-icon name="mynaArchive" size="0.85rem" />
|
||||||
|
}
|
||||||
|
Import WinSCP
|
||||||
|
</button>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="flex min-h-0 flex-1">
|
<div class="flex min-h-0 flex-1">
|
||||||
<!-- stacks + connections list -->
|
<!-- stacks + connections list -->
|
||||||
<div class="flex w-60 shrink-0 flex-col border-r border-border">
|
<div class="flex w-72 shrink-0 flex-col border-r border-border bg-muted/30">
|
||||||
<div class="flex items-center gap-1 border-b border-border px-2 py-1.5">
|
<div class="flex items-center gap-1 border-b border-border px-2 py-1.5">
|
||||||
<button
|
<button
|
||||||
(click)="newConnection()"
|
(click)="newConnection()"
|
||||||
@@ -32,20 +45,6 @@
|
|||||||
>
|
>
|
||||||
<ng-icon name="mynaFolderPlus" size="0.85rem" /> Stack
|
<ng-icon name="mynaFolderPlus" size="0.85rem" /> Stack
|
||||||
</button>
|
</button>
|
||||||
<div class="flex-1"></div>
|
|
||||||
<button
|
|
||||||
(click)="importWinScp()"
|
|
||||||
[disabled]="importing()"
|
|
||||||
title="Import sessions from a WinSCP.ini export"
|
|
||||||
class="flex items-center gap-1 rounded-md px-2 py-1 text-xs text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-50"
|
|
||||||
>
|
|
||||||
@if (importing()) {
|
|
||||||
<ng-icon name="mynaSpinner" size="0.85rem" class="animate-spin" />
|
|
||||||
} @else {
|
|
||||||
<ng-icon name="mynaArchive" size="0.85rem" />
|
|
||||||
}
|
|
||||||
Import
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex-1 overflow-y-auto py-1">
|
<div class="flex-1 overflow-y-auto py-1">
|
||||||
@@ -75,33 +74,39 @@
|
|||||||
<span class="truncate text-[11px] font-medium text-muted-foreground uppercase">
|
<span class="truncate text-[11px] font-medium text-muted-foreground uppercase">
|
||||||
{{ group.stack.name }}
|
{{ group.stack.name }}
|
||||||
</span>
|
</span>
|
||||||
<span class="shrink-0 text-[10px] text-muted-foreground/70 tabular-nums">
|
<div class="min-w-0 flex-1"></div>
|
||||||
|
<!-- count and actions swap on hover: they never share the space,
|
||||||
|
so a long stack name can't collide with the buttons -->
|
||||||
|
<span
|
||||||
|
class="shrink-0 text-[10px] text-muted-foreground/70 tabular-nums group-hover:hidden"
|
||||||
|
>
|
||||||
{{ group.connections.length }}
|
{{ group.connections.length }}
|
||||||
</span>
|
</span>
|
||||||
<div class="min-w-0 flex-1"></div>
|
<div class="hidden shrink-0 items-center gap-0.5 group-hover:flex">
|
||||||
<button
|
|
||||||
(click)="renameStack(group.stack)"
|
|
||||||
title="Rename stack"
|
|
||||||
class="grid size-4 shrink-0 place-items-center rounded text-muted-foreground opacity-0 group-hover:opacity-100 hover:text-foreground"
|
|
||||||
>
|
|
||||||
<ng-icon name="mynaEdit" size="0.75rem" />
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
(click)="deleteStack(group.stack)"
|
|
||||||
title="Delete stack"
|
|
||||||
class="grid size-4 shrink-0 place-items-center rounded text-muted-foreground opacity-0 group-hover:opacity-100 hover:text-destructive"
|
|
||||||
>
|
|
||||||
<ng-icon name="mynaTrash" size="0.75rem" />
|
|
||||||
</button>
|
|
||||||
@if (group.connections.length) {
|
|
||||||
<button
|
<button
|
||||||
(click)="openStack(group.stack.id)"
|
(click)="renameStack(group.stack)"
|
||||||
title="Open stack in tabs"
|
title="Rename stack"
|
||||||
class="grid size-4 shrink-0 place-items-center rounded text-muted-foreground hover:text-primary"
|
class="grid size-4 place-items-center rounded text-muted-foreground hover:text-foreground"
|
||||||
>
|
>
|
||||||
<ng-icon name="mynaArrowRight" size="0.8rem" />
|
<ng-icon name="mynaEdit" size="0.75rem" />
|
||||||
</button>
|
</button>
|
||||||
}
|
<button
|
||||||
|
(click)="deleteStack(group.stack)"
|
||||||
|
title="Delete stack"
|
||||||
|
class="grid size-4 place-items-center rounded text-muted-foreground hover:text-destructive"
|
||||||
|
>
|
||||||
|
<ng-icon name="mynaTrash" size="0.75rem" />
|
||||||
|
</button>
|
||||||
|
@if (group.connections.length) {
|
||||||
|
<button
|
||||||
|
(click)="openStack(group.stack.id)"
|
||||||
|
title="Open stack in tabs"
|
||||||
|
class="grid size-4 place-items-center rounded text-muted-foreground hover:text-primary"
|
||||||
|
>
|
||||||
|
<ng-icon name="mynaArrowRight" size="0.8rem" />
|
||||||
|
</button>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@if (!group.stack.collapsed) {
|
@if (!group.stack.collapsed) {
|
||||||
@for (connection of group.connections; track connection.id) {
|
@for (connection of group.connections; track connection.id) {
|
||||||
@@ -167,7 +172,7 @@
|
|||||||
<!-- edit form -->
|
<!-- edit form -->
|
||||||
<div class="flex min-w-0 flex-1 flex-col">
|
<div class="flex min-w-0 flex-1 flex-col">
|
||||||
@if (draft(); as d) {
|
@if (draft(); as d) {
|
||||||
<div class="grid flex-1 auto-rows-min grid-cols-2 gap-x-3 gap-y-2.5 overflow-y-auto p-4">
|
<div class="grid flex-1 auto-rows-min grid-cols-2 gap-x-4 gap-y-3 overflow-y-auto p-5">
|
||||||
<label class="col-span-2 flex flex-col gap-1 text-xs">
|
<label class="col-span-2 flex flex-col gap-1 text-xs">
|
||||||
<span class="text-muted-foreground">Name</span>
|
<span class="text-muted-foreground">Name</span>
|
||||||
<input
|
<input
|
||||||
|
|||||||
Reference in New Issue
Block a user