Update layout and component structure in Svelte pages
Publish telemt-api gateway Docker image / test (push) Successful in 28s
Publish telemt-api gateway Docker image / build-and-push (push) Successful in 2m34s

- Adjusted the layout of several Svelte components to ensure consistent spacing and alignment, specifically changing `gap-3` to `gap-4` in multiple instances.
- Replaced Card components with DataTableCard in the Mihomo page for improved data presentation.
- Enhanced text formatting for better readability across various pages, ensuring consistent use of class attributes.
This commit is contained in:
Denozordec
2026-04-10 17:04:45 +07:00
parent c51482e04e
commit bfe79ca601
5 changed files with 21 additions and 22 deletions
+1 -1
View File
@@ -516,7 +516,7 @@ $effect(() => {
let isDataEmpty = $derived(!loading && totalIpRows === 0 && !err); let isDataEmpty = $derived(!loading && totalIpRows === 0 && !err);
</script> </script>
<div class="mb-6 flex flex-wrap items-end justify-between gap-4"> <div class="mb-6 flex flex-wrap items-center justify-between gap-4">
<div> <div>
<h1 class="text-2xl font-semibold tracking-tight">Уникальные IP</h1> <h1 class="text-2xl font-semibold tracking-tight">Уникальные IP</h1>
<p class="text-sm text-muted-foreground"> <p class="text-sm text-muted-foreground">
+16 -17
View File
@@ -11,9 +11,11 @@
import { formatBytes } from '$lib/format.js'; import { formatBytes } from '$lib/format.js';
import * as Table from '$lib/components/ui/table/index.js'; import * as Table from '$lib/components/ui/table/index.js';
import * as Card from '$lib/components/ui/card/index.js'; import * as Card from '$lib/components/ui/card/index.js';
import { ScrollArea } from '$lib/components/ui/scroll-area/index.js';
import { Button } from '$lib/components/ui/button/index.js'; import { Button } from '$lib/components/ui/button/index.js';
import { Badge } from '$lib/components/ui/badge/index.js'; import { Badge } from '$lib/components/ui/badge/index.js';
import KpiStatCard from '$lib/components/kpi-stat-card.svelte'; import KpiStatCard from '$lib/components/kpi-stat-card.svelte';
import DataTableCard from '$lib/components/data-table/data-table-card.svelte';
import DataQueryState from '$lib/components/fleet/data-query-state.svelte'; import DataQueryState from '$lib/components/fleet/data-query-state.svelte';
import MihomoProxyGroups from '$lib/components/mihomo/mihomo-proxy-groups.svelte'; import MihomoProxyGroups from '$lib/components/mihomo/mihomo-proxy-groups.svelte';
import { Skeleton } from '$lib/components/ui/skeleton/index.js'; import { Skeleton } from '$lib/components/ui/skeleton/index.js';
@@ -189,10 +191,10 @@
} }
</script> </script>
<div class="mb-6 flex flex-wrap items-center justify-between gap-3"> <div class="mb-6 flex flex-wrap items-center justify-between gap-4">
<div> <div>
<h1 class="text-2xl font-semibold tracking-tight">Mihomo (флот)</h1> <h1 class="text-2xl font-semibold tracking-tight">Mihomo (флот)</h1>
<p class="text-muted-foreground text-sm"> <p class="text-sm text-muted-foreground">
Сводка по нодам и управление прокси. Опрос соединений каждые {POLL_MS / 1000} с. Сводка по нодам и управление прокси. Опрос соединений каждые {POLL_MS / 1000} с.
</p> </p>
</div> </div>
@@ -206,7 +208,7 @@
<DataQueryState {err} showSkeleton={loading} isEmpty={!loading && rows.length === 0 && !err}> <DataQueryState {err} showSkeleton={loading} isEmpty={!loading && rows.length === 0 && !err}>
{#snippet empty()} {#snippet empty()}
<p class="text-muted-foreground text-sm"> <p class="text-sm text-muted-foreground">
В снимке агрегата нет серверов. Проверьте шлюз и конфигурацию <code class="text-xs">servers</code>. В снимке агрегата нет серверов. Проверьте шлюз и конфигурацию <code class="text-xs">servers</code>.
</p> </p>
{/snippet} {/snippet}
@@ -255,15 +257,11 @@
</KpiStatCard> </KpiStatCard>
</div> </div>
<Card.Root class="border-l-4 border-l-violet-500/40 shadow-sm"> <DataTableCard
<Card.Header class="pb-2"> title="Ноды"
<Card.Title class="text-base">Ноды</Card.Title> description="Контроллер и метрики. Ниже — компактные группы прокси (автозагрузка). «Детально» — обзор с графиками."
<Card.Description> >
Контроллер и метрики. Ниже — компактные группы прокси (автозагрузка). «Детально» — обзор с <ScrollArea class="w-full" orientation="both">
графиками.
</Card.Description>
</Card.Header>
<Card.Content class="overflow-x-auto px-2 sm:px-6">
<Table.Root> <Table.Root>
<Table.Header class="sticky top-0 z-10 bg-muted"> <Table.Header class="sticky top-0 z-10 bg-muted">
<Table.Row class="border-b border-border/80 hover:bg-transparent"> <Table.Row class="border-b border-border/80 hover:bg-transparent">
@@ -333,8 +331,8 @@
{/each} {/each}
</Table.Body> </Table.Body>
</Table.Root> </Table.Root>
</Card.Content> </ScrollArea>
</Card.Root> </DataTableCard>
<div class="mt-8 space-y-3"> <div class="mt-8 space-y-3">
<div> <div>
@@ -350,8 +348,9 @@
{#each rows.filter((r) => r.metaStatus === 'ok') as r (r.alias)} {#each rows.filter((r) => r.metaStatus === 'ok') as r (r.alias)}
<Card.Root <Card.Root
id="mihomo-proxies-{encodeURIComponent(r.alias)}" id="mihomo-proxies-{encodeURIComponent(r.alias)}"
data-size="sm" size="sm"
class="bg-card min-h-0 min-w-0 scroll-mt-20 gap-0 overflow-hidden py-0 shadow-sm ring-1 ring-border/60" density="compact"
class="min-h-0 min-w-0 scroll-mt-20 overflow-hidden shadow-sm"
> >
<Card.Header class="border-border/80 border-b px-3 pb-3 pt-3 sm:px-4"> <Card.Header class="border-border/80 border-b px-3 pb-3 pt-3 sm:px-4">
<Card.Title class="font-mono text-sm font-semibold leading-none tracking-tight"> <Card.Title class="font-mono text-sm font-semibold leading-none tracking-tight">
@@ -413,7 +412,7 @@
</Card.Root> </Card.Root>
{/each} {/each}
{#if rows.filter((r) => r.metaStatus === 'ok').length === 0} {#if rows.filter((r) => r.metaStatus === 'ok').length === 0}
<p class="text-muted-foreground text-sm"> <p class="text-sm text-muted-foreground">
Нет нод с настроенным Mihomo — переключать прокси негде. Проверьте конфиг шлюза. Нет нод с настроенным Mihomo — переключать прокси негде. Проверьте конфиг шлюза.
</p> </p>
{/if} {/if}
+1 -1
View File
@@ -75,7 +75,7 @@
let handshakeT = $derived(num(summary?.handshake_timeouts_total)); let handshakeT = $derived(num(summary?.handshake_timeouts_total));
</script> </script>
<div class="mb-6 flex flex-wrap items-center justify-between gap-3"> <div class="mb-6 flex flex-wrap items-center justify-between gap-4">
<div> <div>
<h1 class="text-2xl font-semibold tracking-tight">Сервер: обзор</h1> <h1 class="text-2xl font-semibold tracking-tight">Сервер: обзор</h1>
<p class="text-sm text-muted-foreground"> <p class="text-sm text-muted-foreground">
@@ -496,10 +496,10 @@
}); });
</script> </script>
<div class="mb-6 flex flex-wrap items-center justify-between gap-3"> <div class="mb-6 flex flex-wrap items-center justify-between gap-4">
<div> <div>
<h1 class="text-2xl font-semibold tracking-tight">Mihomo</h1> <h1 class="text-2xl font-semibold tracking-tight">Mihomo</h1>
<p class="text-muted-foreground text-sm">Обзор и прокси (external-controller)</p> <p class="text-sm text-muted-foreground">Обзор и прокси (external-controller)</p>
</div> </div>
<Tabs.Root bind:value={tab} class="w-fit shrink-0"> <Tabs.Root bind:value={tab} class="w-fit shrink-0">
<Tabs.List class="min-w-[220px] gap-0.5 p-1"> <Tabs.List class="min-w-[220px] gap-0.5 p-1">
+1 -1
View File
@@ -343,7 +343,7 @@ let sumActiveIps = $derived.by(() =>
} }
</script> </script>
<div class="mb-6 flex flex-wrap items-end justify-between gap-4"> <div class="mb-6 flex flex-wrap items-center justify-between gap-4">
<div> <div>
<h1 class="text-2xl font-semibold tracking-tight">Пользователи (флот)</h1> <h1 class="text-2xl font-semibold tracking-tight">Пользователи (флот)</h1>
<p class="text-sm text-muted-foreground"> <p class="text-sm text-muted-foreground">