Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
0d31187
clean repo for overhaul
rajnandan1 Jan 22, 2026
0149b3e
first commit for version 4, very unstable
rajnandan1 Jan 22, 2026
6b88cf1
changes
Jan 22, 2026
0709111
Refactor monitoring data retrieval and caching mechanisms; enhance mo…
rajnandan1 Jan 22, 2026
d6b68e3
Refactor monitoring components and enhance latency handling; update U…
rajnandan1 Jan 23, 2026
9f2ab70
changes
Jan 23, 2026
2dce981
changes
rajnandan1 Jan 24, 2026
b51fc19
changes
rajnandan1 Jan 24, 2026
4608b03
alerting new set up done
rajnandan1 Jan 26, 2026
b4aeb51
Update seed function to insert all alert templates when no templates …
rajnandan1 Jan 26, 2026
c4f0945
subs v1
rajnandan1 Jan 26, 2026
d0d8e60
changes
rajnandan1 Jan 27, 2026
af829fa
changes
rajnandan1 Jan 28, 2026
28bfd8c
refactor: simplify SubscribeMenu props and integrate subscription set…
rajnandan1 Jan 28, 2026
b7023b7
changes
rajnandan1 Jan 29, 2026
e714fe8
changes
rajnandan1 Jan 29, 2026
2abb266
changes
Jan 29, 2026
463d1c8
changes
rajnandan1 Jan 30, 2026
8a0e1e7
changes
rajnandan1 Jan 30, 2026
93f91ab
changes
Jan 30, 2026
c77985f
i18n
rajnandan1 Jan 30, 2026
8f187aa
Implement sub-menu options configuration and localization updates
rajnandan1 Jan 31, 2026
accdd76
changes
rajnandan1 Jan 31, 2026
3165567
added few apis
rajnandan1 Feb 2, 2026
8bd26cc
delete trigger
rajnandan1 Feb 2, 2026
6c15d48
new api spec
rajnandan1 Feb 2, 2026
d851610
Implement theme configuration and user preferences for status page
rajnandan1 Feb 2, 2026
00511da
changes
Feb 2, 2026
24872d2
changes
Feb 2, 2026
98c723c
changes
Feb 2, 2026
045ce12
Implement monitor management components including DangerZoneCard, Gen…
rajnandan1 Feb 2, 2026
34605fe
Remove email customization feature and related API endpoints from the…
rajnandan1 Feb 3, 2026
3295b7b
docs
rajnandan1 Feb 3, 2026
601186d
good docs
Feb 3, 2026
331cd5b
Refactor documentation structure and enhance monitor features with ne…
rajnandan1 Feb 4, 2026
e92c8a0
added docs might get modified for api monitors
Feb 4, 2026
4d0e135
changes
Feb 4, 2026
52c76fc
clean up
rajnandan1 Feb 5, 2026
08f72e5
Enhance monitoring functionality with new uptime calculations and ale…
rajnandan1 Feb 5, 2026
2d7d6a3
fixes
rajnandan1 Feb 5, 2026
9a0ca6c
Create alert configuration and logs pages with functionality for mana…
rajnandan1 Feb 5, 2026
96fd8d0
Create maintenance documentation for impact on monitoring, overview, …
rajnandan1 Feb 5, 2026
ba41c6f
Implement password reset functionality with email template and API en…
rajnandan1 Feb 5, 2026
6ed95ed
Implement user invitation system with password setup and validation
rajnandan1 Feb 6, 2026
6aa43fa
Implement URL resolver functions for client and server, update naviga…
rajnandan1 Feb 6, 2026
038c52a
base path adding
Feb 6, 2026
845132f
base path adding
Feb 6, 2026
a20125a
changes
rajnandan1 Feb 6, 2026
1c05e2d
style: Update LanguageSelector and ThemePlus components for improved …
rajnandan1 Feb 7, 2026
baa9449
refactor: Update components for improved styling and theme handling
rajnandan1 Feb 7, 2026
47c00c2
refactor: Replace IsLoggedInSession with GetLoggedInSession and updat…
rajnandan1 Feb 7, 2026
cdc0de9
refactor: Update SMTP configuration handling and improve email setup …
rajnandan1 Feb 7, 2026
be0745f
Initial plan
Claude Feb 7, 2026
4ff1604
feat: Add documentation-writer Claude skill
Claude Feb 7, 2026
7f32802
Merge pull request #575 from rajnandan1/claude/create-documentation-s…
rajnandan1 Feb 7, 2026
7392b96
cvcc
rajnandan1 Feb 8, 2026
c759ade
file clean up
rajnandan1 Feb 8, 2026
72a28ca
changes
rajnandan1 Feb 8, 2026
9e8b096
changes
rajnandan1 Feb 9, 2026
ee1adf8
vv
rajnandan1 Feb 9, 2026
228808a
stable
Feb 9, 2026
eed71d3
added group
Feb 9, 2026
8a498e9
refactor: update tooltip styles and improve component structure acros…
rajnandan1 Feb 9, 2026
9b99bec
Create Dockerfile and Docker Compose configurations for Kener v4 appl…
rajnandan1 Feb 10, 2026
c58530c
cleanup 1
rajnandan1 Feb 10, 2026
5f86ca2
analystic 101
rajnandan1 Feb 10, 2026
3208105
track: implement event tracking for user interactions across multiple…
rajnandan1 Feb 10, 2026
2377a4f
changes
Feb 10, 2026
17ed56c
changes
rajnandan1 Feb 10, 2026
1f370b3
changes
rajnandan1 Feb 11, 2026
290113d
refactor: update layout and styling for MinuteGrid and MonitorDayDeta…
rajnandan1 Feb 11, 2026
d99da14
sas
Feb 11, 2026
21f06a4
hb
rajnandan1 Feb 11, 2026
366c2c0
refactor: update heartbeat handling and monitoring logic, enhance UI …
rajnandan1 Feb 12, 2026
8fd8aa4
refactor: implement CloneMonitor functionality and enhance monitor lo…
rajnandan1 Feb 12, 2026
6ea045d
refactor: implement site announcement feature with management UI and …
rajnandan1 Feb 12, 2026
09afbbd
refactor: optimize npm installation step by removing cache mount
rajnandan1 Feb 12, 2026
552bdc0
refactor: enhance ping and tcp monitoring logic, improve error handli…
rajnandan1 Feb 13, 2026
275c9d7
changes
Feb 13, 2026
d1eb926
changes
Feb 13, 2026
444fe58
ui revamp
rajnandan1 Feb 13, 2026
d04ee0a
changes
rajnandan1 Feb 14, 2026
d170ba6
refactor: enhance documentation and improve page titles with site name
rajnandan1 Feb 14, 2026
5a95c81
refactor: restrict role updates in user data modification
rajnandan1 Feb 14, 2026
e6424b1
refactor: integrate @humanspeak/svelte-purify for enhanced HTML sanit…
rajnandan1 Feb 15, 2026
d758de0
refactor: enhance image upload ID generation with file extension
rajnandan1 Feb 15, 2026
7b3afa4
so many
rajnandan1 Feb 16, 2026
5989e5b
refactor: improve error handling and logging in GamedigCall, SqlCall,…
rajnandan1 Feb 16, 2026
14d46cb
Merge main into next/4-pre-alpha (keep overhaul changes)
rajnandan1 Feb 16, 2026
b088a79
refactor: update logging in analyticsEvent function and improve laten…
rajnandan1 Feb 16, 2026
9129e96
changes
Feb 16, 2026
88072b7
changes
rajnandan1 Feb 16, 2026
58f0e9f
refactor: remove copy current page link option and implement sharing …
rajnandan1 Feb 17, 2026
3aedb9b
refactor: restructure authentication flow and remove obsolete API end…
rajnandan1 Feb 17, 2026
9a8bf84
changes
Feb 17, 2026
1c485ac
go live
rajnandan1 Feb 20, 2026
c9c675d
changes
Feb 20, 2026
4b23e72
changes
rajnandan1 Feb 20, 2026
e5e244e
refactor: enhance MonitorBar component with layout options and improv…
rajnandan1 Feb 21, 2026
bf126e7
refactor: implement event display settings for incidents and maintena…
rajnandan1 Feb 21, 2026
1c6bed1
changes
rajnandan1 Feb 21, 2026
cbc48d2
docs updates
rajnandan1 Feb 22, 2026
585db91
refactor: enhance layout and site data handling with social preview i…
rajnandan1 Feb 22, 2026
339d653
delete static files
rajnandan1 Feb 22, 2026
50482aa
changes
rajnandan1 Feb 22, 2026
78bad84
refactor: update workflow to publish nightly Docker images with impro…
rajnandan1 Feb 22, 2026
3363e90
chore(locales): Update translations for multiple languages and add ne…
rajnandan1 Feb 23, 2026
9199b80
chore: Update environment variables and documentation for ORIGIN requ…
rajnandan1 Feb 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
changes
  • Loading branch information
rajnandan1 committed Feb 11, 2026
commit 1f370b3eea609aa41d18647ddfe174ea2106537d
37 changes: 22 additions & 15 deletions check-output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,43 @@
> kener@4.0.0 check
> svelte-kit sync && svelte-check --tsconfig ./tsconfig.json

[dotenv@17.2.3] injecting env (18) from .env -- tip: enable debug logging with { debug: true }
[dotenv@17.2.4] injecting env (6) from .env -- tip: 🛠run anywhere with `dotenvx run -- yourcommand`
Loading svelte-check in workspace: /Users/rajnandan1/Code/kener
Getting Svelte diagnostics...

[dotenv@17.2.3] injecting env (18) from .env -- tip: 🔐 prevent committing .env to code: https://dotenvx.com/precommit
[dotenv@17.2.3] injecting env (0) from .env -- tip: 🔐 prevent building .env in docker: https://dotenvx.com/prebuild
[dotenv@17.2.3] injecting env (0) from .env -- tip: 🔑 add access controls to secrets: https://dotenvx.com/ops
[dotenv@17.2.4] injecting env (6) from .env -- tip: 🔄 add secrets lifecycle management: https://dotenvx.com/ops
[dotenv@17.2.4] injecting env (0) from .env -- tip: 🔐 prevent committing .env to code: https://dotenvx.com/precommit
[dotenv@17.2.4] injecting env (0) from .env -- tip: ⚙️ write to custom object with { processEnv: myObject }
/Users/rajnandan1/Code/kener/src/lib/server/controllers/dashboardController.ts:285:9
Error: Type '{ ts: number; countOfUp: number; countOfDown: number; countOfDegraded: number; countOfMaintenance: number; avgLatency: number; }' is missing the following properties from type 'TimestampStatusCount': maxLatency, minLatency
latestData.reduce((sum, data) => sum + (data.latency || 0), 0) / (latestData.length || 1);
const item: TimestampStatusCount = {
ts: nowTs,

/Users/rajnandan1/Code/kener/src/lib/components/ui/chart/chart-container.svelte:20:28
Warn: This reference only captures the initial value of `id`. Did you mean to reference it inside a closure instead?
https://svelte.dev/e/state_referenced_locally (svelte)

const chartId = `chart-${id || uid.replace(/:/g, "")}`;

/Users/rajnandan1/Code/kener/src/routes/(manage)/+layout.server.ts:1:18
Error: Cannot find module '$lib/i18n/server' or its corresponding type declarations.
import i18n from "$lib/i18n/server";
import { redirect } from "@sveltejs/kit";
/Users/rajnandan1/Code/kener/src/routes/(kener)/monitors/[monitor_tag]/+page.server.ts:50:7
Error: Type '{ ts: number; countOfUp: number; countOfDown: number; countOfDegraded: number; countOfMaintenance: number; avgLatency: number; }' is missing the following properties from type 'TimestampStatusCount': maxLatency, minLatency
//use uptime calculator tool to parse
let item: TimestampStatusCount = {
ts: lastStatus ? lastStatus.timestamp : GetNowTimestampUTC(),

/Users/rajnandan1/Code/kener/src/routes/(docs)/docs/DocsNavbar.svelte:126:3
/Users/rajnandan1/Code/kener/src/routes/(docs)/docs/DocsNavbar.svelte:131:3
Warn: Unused CSS selector ".active"
https://svelte.dev/e/css_unused_selector (svelte)
<style>
.active {
color: var(--foreground);

/Users/rajnandan1/Code/kener/src/routes/(docs)/docs/DocsSidebar.svelte:45:25
Warn: This reference only captures the initial value of `currentSlug`. Did you mean to reference it inside a closure instead?
https://svelte.dev/e/state_referenced_locally (svelte)
let expandedPages = $state<string[]>([]);
let prevSlug = $state(currentSlug);
/Users/rajnandan1/Code/kener/src/routes/(kener)/[page_path]/+page.svelte:58:5
Error: Object literal may only specify known properties, and '"pageSettings"' does not exist in type 'Props'. (ts)
<EventsCard
pageSettings={data.pageDetails.page_settings}
ongoingMaintenancesCount={data.ongoingMaintenances.length}

/Users/rajnandan1/Code/kener/src/routes/(kener)/events/[MMMM]-[YYYY]/+page.svelte:34:28
Warn: This reference only captures the initial value of `data`. Did you mean to reference it inside a closure instead?
Expand All @@ -41,4 +48,4 @@ https://svelte.dev/e/state_referenced_locally (svelte)
const currentMonth = format(parsedDate, "MMMM yyyy");

====================================
svelte-check found 1 error and 4 warnings in 5 files
svelte-check found 3 errors and 3 warnings in 6 files
75 changes: 74 additions & 1 deletion src/lib/components/BadgesMenu.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import TrendingUp from "@lucide/svelte/icons/trending-up";
import Percent from "@lucide/svelte/icons/percent";
import Timer from "@lucide/svelte/icons/timer";
import Copy from "@lucide/svelte/icons/copy";

interface Props {
Expand All @@ -20,7 +21,9 @@

let { open = $bindable(false), monitorTag, protocol, domain }: Props = $props();

function handleBadgeCopy(type: "status" | "uptime" | "dot" | "dot_ping") {
function handleBadgeCopy(
type: "status" | "uptime" | "latency_avg" | "latency_max" | "latency_min" | "dot" | "dot_ping"
) {
trackEvent("badge_copied", { type, monitorTag });
}

Expand All @@ -31,6 +34,19 @@
const badgeUptimeUrl = $derived(
protocol && domain ? `${protocol}//${domain}` + clientResolver(resolve, `/badge/${monitorTag}/uptime`) : ""
);
const badgeLatencyAvgUrl = $derived(
protocol && domain ? `${protocol}//${domain}` + clientResolver(resolve, `/badge/${monitorTag}/latency`) : ""
);
const badgeLatencyMaxUrl = $derived(
protocol && domain
? `${protocol}//${domain}` + clientResolver(resolve, `/badge/${monitorTag}/latency?metric=maximum`)
: ""
);
const badgeLatencyMinUrl = $derived(
protocol && domain
? `${protocol}//${domain}` + clientResolver(resolve, `/badge/${monitorTag}/latency?metric=minimum`)
: ""
);
const badgeDotUrl = $derived(
protocol && domain ? `${protocol}//${domain}` + clientResolver(resolve, `/badge/${monitorTag}/dot`) : ""
);
Expand Down Expand Up @@ -94,6 +110,63 @@
</CopyButton>
</div>
{/if}

{#if badgeLatencyAvgUrl}
<div class="flex items-center justify-between gap-2 rounded-3xl border px-2 py-1">
<div class="flex items-center gap-2">
<Timer class="h-3 w-3" />
<span class="text-xs font-medium">{$t("Avg Latency")}</span>
</div>
<img src={badgeLatencyAvgUrl} alt="Avg Latency Badge" class="h-5" />
<CopyButton
variant="ghost"
size="icon-sm"
text={badgeLatencyAvgUrl}
class="rounded-btn"
onclick={() => handleBadgeCopy("latency_avg")}
>
<Copy />
</CopyButton>
</div>
{/if}

{#if badgeLatencyMaxUrl}
<div class="flex items-center justify-between gap-2 rounded-3xl border px-2 py-1">
<div class="flex items-center gap-2">
<Timer class="h-3 w-3" />
<span class="text-xs font-medium">{$t("Max Latency")}</span>
</div>
<img src={badgeLatencyMaxUrl} alt="Max Latency Badge" class="h-5" />
<CopyButton
variant="ghost"
size="icon-sm"
text={badgeLatencyMaxUrl}
class="rounded-btn"
onclick={() => handleBadgeCopy("latency_max")}
>
<Copy />
</CopyButton>
</div>
{/if}

{#if badgeLatencyMinUrl}
<div class="flex items-center justify-between gap-2 rounded-3xl border px-2 py-1">
<div class="flex items-center gap-2">
<Timer class="h-3 w-3" />
<span class="text-xs font-medium">{$t("Min Latency")}</span>
</div>
<img src={badgeLatencyMinUrl} alt="Min Latency Badge" class="h-5" />
<CopyButton
variant="ghost"
size="icon-sm"
text={badgeLatencyMinUrl}
class="rounded-btn"
onclick={() => handleBadgeCopy("latency_min")}
>
<Copy />
</CopyButton>
</div>
{/if}
</div>
</div>

Expand Down
40 changes: 18 additions & 22 deletions src/lib/components/LatencyTrendChart.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -3,38 +3,34 @@
import { curveCatmullRom } from "d3-shape";
import { scaleTime } from "d3-scale";
import * as Chart from "$lib/components/ui/chart/index.js";
import type { TimestampStatusCount } from "$lib/server/types/db";
import { t } from "$lib/stores/i18n";
import { ta } from "date-fns/locale";
import { ParseLatency } from "$lib/clientTools";
import { formatDate } from "$lib/stores/datetime";

interface ChartPoint {
date: Date;
value: number;
}

interface Props {
data: TimestampStatusCount[];
data: ChartPoint[];
label?: string;
height?: number;
class?: string;
}

let { data, height = 128, class: className = "" }: Props = $props();
let { data, label = $t("Avg Latency"), height = 128, class: className = "" }: Props = $props();

// Chart config
const chartConfig = {
avgLatency: {
label: $t("Avg Latency"),
let chartConfig = $derived({
value: {
label: label,
color: "var(--chart-1)"
}
} satisfies Chart.ChartConfig;
} satisfies Chart.ChartConfig);

// Transform data for chart
let chartData = $derived.by(() => {
if (!data) return [];
return data
.filter((d) => d.avgLatency > 0)
.map((d) => ({
date: new Date(d.ts * 1000),
avgLatency: d.avgLatency
}));
});
// Filter out zero values
let chartData = $derived(data.filter((d) => d.value > 0));
</script>

<div class="{className} ">
Expand All @@ -44,16 +40,16 @@
data={chartData}
x="date"
xScale={scaleTime()}
y="avgLatency"
y="value"
yDomain={[0, null]}
yNice
axis="x"
grid={false}
series={[
{
key: "avgLatency",
label: $t("Avg Latency"),
color: "var(--color-avgLatency)"
key: "value",
label: label,
color: "var(--color-value)"
}
]}
props={{
Expand Down
78 changes: 69 additions & 9 deletions src/lib/components/MonitorOverview.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
import { formatDate } from "$lib/stores/datetime";
import clientResolver from "$lib/client/resolver.js";
import { ArrowDown } from "@lucide/svelte";
import MonitorBar from "./MonitorBar.svelte";
import * as Popover from "$lib/components/ui/popover/index.js";
import * as ToggleGroup from "$lib/components/ui/toggle-group/index.js";

interface Props {
monitorTag: string;
class?: string;
Expand Down Expand Up @@ -50,14 +52,37 @@
// Default to maxDays (first item since sorted descending)
let selectedDayIndex = $state(0);

// Latency metric toggle: "average" | "maximum" | "minimum"
let latencyMetric = $state("average");

// Display values from API response (already formatted as strings)
let displayUptime = $derived(overviewData?.uptime ?? "--");

let displayAvgLatency = $derived(overviewData?.avgLatency ?? "--");
let displayMaxLatency = $derived(overviewData?.maxLatency ?? "--");
let displayMinLatency = $derived(overviewData?.minLatency ?? "--");

// Data for calendar/chart comes directly from API
let displayData = $derived(overviewData?.uptimeData ?? []);

// Latency metric label map
const metricLabels: Record<string, string> = {
average: $t("Avg Latency"),
maximum: $t("Max Latency"),
minimum: $t("Min Latency")
};

// Transform uptimeData into chart-ready points based on selected metric
let latencyChartData = $derived.by(() => {
if (!displayData) return [];
return displayData.map((d) => ({
date: new Date(d.ts * 1000),
value: latencyMetric === "maximum" ? d.maxLatency : latencyMetric === "minimum" ? d.minLatency : d.avgLatency
}));
});

let latencyChartLabel = $derived(metricLabels[latencyMetric] ?? metricLabels.average);

// Fetch data with days parameter
async function fetchData(days: number) {
loading = true;
Expand Down Expand Up @@ -132,7 +157,7 @@
<DropdownMenu.Content align="end">
<DropdownMenu.Label>{$t("Select Range")}</DropdownMenu.Label>
<DropdownMenu.Group>
{#each dayOptions as option, i}
{#each dayOptions as option, i (option.days)}
<DropdownMenu.Item
class="cursor-pointer text-xs {selectedDayIndex === i ? 'bg-secondary' : ''}"
onclick={() => handleDayChange(i)}
Expand Down Expand Up @@ -171,11 +196,7 @@
<div class="flex gap-4">
<div class="flex flex-1 flex-col items-start gap-1">
<p class="text-2xl font-semibold">{displayUptime}%</p>
<p class="text-muted-foreground text-sm">{$t("Uptime")}</p>
</div>
<div class="flex flex-1 flex-col items-end gap-1">
<p class="text-2xl font-semibold">{displayAvgLatency}</p>
<p class="text-muted-foreground text-sm">{$t("Avg Latency")}</p>
<p class="text-muted-foreground text-sm font-medium">{$t("Uptime")}</p>
</div>
</div>

Expand All @@ -198,10 +219,49 @@

<!-- Latency Chart -->
<div class="pt-2">
<p class="text-muted-foreground mb-2 text-xs font-medium">
<p class="text-muted-foreground mb-2 text-sm font-medium">
{$t("Latency Trend")}
<Popover.Root>
<Popover.Trigger class="text-foreground cursor-pointer underline">{latencyChartLabel}</Popover.Trigger>
<Popover.Content class="flex w-fit flex-col gap-2">
<p class="text-muted-foreground text-xs font-medium">
{$t("Select latency metric to display")}
</p>
<ToggleGroup.Root
type="single"
spacing={2}
size="sm"
value={latencyMetric}
onValueChange={(v) => {
if (v) latencyMetric = v;
}}
class="flex justify-between"
>
<ToggleGroup.Item value="average" aria-label="Average latency">{$t("Avg Latency")}</ToggleGroup.Item>
<ToggleGroup.Item value="maximum" aria-label="Maximum latency">{$t("Max Latency")}</ToggleGroup.Item>
<ToggleGroup.Item value="minimum" aria-label="Minimum latency">{$t("Min Latency")}</ToggleGroup.Item>
</ToggleGroup.Root>
</Popover.Content>
</Popover.Root>
</p>
<LatencyTrendChart data={displayData} height={128} />

<!-- Latency Stats -->
<div class="mb-3 flex justify-between gap-4">
<div class="flex flex-col items-start gap-1">
<p class="text-lg font-semibold">{displayAvgLatency}</p>
<p class="text-muted-foreground text-xs">{$t("Avg Latency")}</p>
</div>
<div class="flex flex-col items-center gap-1">
<p class="text-lg font-semibold">{displayMinLatency}</p>
<p class="text-muted-foreground text-xs">{$t("Min Latency")}</p>
</div>
<div class="flex flex-col items-end gap-1">
<p class="text-lg font-semibold">{displayMaxLatency}</p>
<p class="text-muted-foreground text-xs">{$t("Max Latency")}</p>
</div>
</div>

<LatencyTrendChart data={latencyChartData} label={latencyChartLabel} height={128} />
</div>
{/if}
</Card.Content>
Expand Down
4 changes: 2 additions & 2 deletions src/lib/components/ThemePlus.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@
<Button
href={clientResolver(resolve, "/")}
variant="outline"
size="sm"
class="bg-background/80 dark:bg-background/70 border-foreground/10 rounded-full border text-xs shadow-none backdrop-blur-md"
size={page.data.isMobile ? "icon-sm" : "sm"}
class="bg-background/80 dark:bg-background/70 border-foreground/10 rounded-full border p-0 text-xs shadow-none backdrop-blur-md"
>
<ChevronLeft class="h-4 w-4" />
<span class="hidden sm:inline">{$t("Home")}</span>
Expand Down
Loading