From b2f75536a5b4963b45f40d77f68099220b79eb6b Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Fri, 12 Jun 2026 14:58:47 +0200 Subject: [PATCH 01/10] fix: skip back button when parent href matches current page --- src/routes/Header.svelte | 116 ++++++++++++++++++++++++++------------- 1 file changed, 79 insertions(+), 37 deletions(-) diff --git a/src/routes/Header.svelte b/src/routes/Header.svelte index 28b57c79..38d8866a 100644 --- a/src/routes/Header.svelte +++ b/src/routes/Header.svelte @@ -2,6 +2,7 @@ /* eslint-disable svelte/no-navigation-without-resolve -- uses prefixBase for dynamic navigation and external URLs */ import PanelLeft from '@lucide/svelte/icons/panel-left'; + import ChevronLeft from '@lucide/svelte/icons/chevron-left'; import { goto } from '$app/navigation'; import type { Pathname } from '$app/types'; import { PUBLIC_DISCORD_INVITE_URL, PUBLIC_GITHUB_PROJECT_URL } from '$env/static/public'; @@ -19,8 +20,20 @@ import { resolve } from '$app/paths'; import { LogIn, UserPlus } from '@lucide/svelte'; import { Spinner } from '$lib/components/ui/spinner'; + import { breadcrumbs } from '$lib/state/breadcrumbs-state.svelte'; + import { page } from '$app/state'; let sidebar = useSidebar(); + + let crumbs = $derived(breadcrumbs.state); + let currentLabel = $derived(crumbs[crumbs.length - 1]?.label ?? ''); + let parentCandidate = $derived(crumbs.length >= 2 ? crumbs[crumbs.length - 2] : null); + // Only show back button when parent href differs from current URL (otherwise it's a no-op) + let parent = $derived( + parentCandidate?.href && prefixBase(parentCandidate.href) !== page.url.pathname + ? parentCandidate + : null + ); {#snippet dropdownItem(name: string, url: Pathname)} @@ -30,8 +43,72 @@ {/snippet} +{#snippet userMenu()} + {#if userState.loading} + + {:else if userState.self} + + + {userState.self.name}'s avatar + + + + + {@render dropdownItem('Profile', '/profile')} + {@render dropdownItem('Settings', '/settings/account')} + {@render dropdownItem('Logout', '/logout')} + + + + {:else} + + + + {/if} +{/snippet} +
-
+ +
+ {#if parent?.href} + + + + {:else} + + {/if} + + {currentLabel} + + {@render userMenu()} +
+ + +
From 2db13153c03499d15a9e919d2fba46f6eeaa8717 Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Fri, 12 Jun 2026 15:00:00 +0200 Subject: [PATCH 02/10] fix: shell overflow, mobile page header, table horizontal scroll --- src/lib/components/PageHeader.svelte | 6 +++--- src/lib/components/Table/DataTableTemplate.svelte | 2 +- src/routes/+layout.svelte | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lib/components/PageHeader.svelte b/src/lib/components/PageHeader.svelte index f1819e47..ac4e05d6 100644 --- a/src/lib/components/PageHeader.svelte +++ b/src/lib/components/PageHeader.svelte @@ -16,12 +16,12 @@
-
-

+
+

{title}

{#if children} -
+
{@render children()}
{/if} diff --git a/src/lib/components/Table/DataTableTemplate.svelte b/src/lib/components/Table/DataTableTemplate.svelte index d37bf0f8..2f8c9a13 100644 --- a/src/lib/components/Table/DataTableTemplate.svelte +++ b/src/lib/components/Table/DataTableTemplate.svelte @@ -81,7 +81,7 @@ }); -
+
{#each table.getHeaderGroups() as headerGroup (headerGroup.id)} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 5958c940..74b6f5ed 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -56,7 +56,7 @@ (sidebarOpen = v)}> -
+
{#if PUBLIC_DEVELOPMENT_BANNER === 'true'}

@@ -66,7 +66,7 @@

{/if}
-
+
{@render children?.()}
From 514e21ac05ce1aa1d7b9237eaf66df7f7653b7bf Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Fri, 12 Jun 2026 15:00:34 +0200 Subject: [PATCH 03/10] fix: responsive grids on home page --- src/routes/(app)/home/+page.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/(app)/home/+page.svelte b/src/routes/(app)/home/+page.svelte index 43485917..8ba1b4d0 100644 --- a/src/routes/(app)/home/+page.svelte +++ b/src/routes/(app)/home/+page.svelte @@ -33,7 +33,7 @@
-
+
Shockers @@ -83,7 +83,7 @@

Quick Links

-
+
diff --git a/src/routes/(app)/settings/api-tokens/+page.svelte b/src/routes/(app)/settings/api-tokens/+page.svelte index 6088b6b7..56d7c10a 100644 --- a/src/routes/(app)/settings/api-tokens/+page.svelte +++ b/src/routes/(app)/settings/api-tokens/+page.svelte @@ -17,7 +17,7 @@ } from '$lib/components/Table/ColumnUtils'; import DataTable from '$lib/components/Table/DataTableTemplate.svelte'; import Button from '$lib/components/ui/button/button.svelte'; - import * as Card from '$lib/components/ui/card'; + import PageHeader from '$lib/components/PageHeader.svelte'; import { handleApiError } from '$lib/errorhandling/apiErrorHandling'; import { onMount } from 'svelte'; import { toast } from 'svelte-sonner'; @@ -74,23 +74,18 @@ - - - API Tokens -
- - -
-
- API Tokens are used to authenticate with the OpenShock API -
- - - + + + + +
diff --git a/src/routes/(app)/settings/connections/+page.svelte b/src/routes/(app)/settings/connections/+page.svelte index b182939d..ee6ec4b7 100644 --- a/src/routes/(app)/settings/connections/+page.svelte +++ b/src/routes/(app)/settings/connections/+page.svelte @@ -8,8 +8,8 @@ import type { OAuthConnectionResponse } from '$lib/api'; import { GetOAuthAuthorizeUrl } from '$lib/api/next/oauth'; import Container from '$lib/components/Container.svelte'; + import PageHeader from '$lib/components/PageHeader.svelte'; import { Button } from '$lib/components/ui/button'; - import * as Card from '$lib/components/ui/card'; import * as Dropdown from '$lib/components/ui/dropdown-menu'; import * as Separator from '$lib/components/ui/separator'; import { handleApiError } from '$lib/errorhandling/apiErrorHandling'; @@ -96,22 +96,17 @@ - - - OAuth Connections -
- -
-
- - Link or unlink third-party accounts to sign in faster and keep your profile in sync. - -
- - + + + + +
@@ -194,7 +189,7 @@ {/each}
{/if} - +
diff --git a/src/routes/(app)/settings/sessions/+page.svelte b/src/routes/(app)/settings/sessions/+page.svelte index 7f49d3e9..3026089c 100644 --- a/src/routes/(app)/settings/sessions/+page.svelte +++ b/src/routes/(app)/settings/sessions/+page.svelte @@ -15,7 +15,7 @@ } from '$lib/components/Table/ColumnUtils'; import DataTable from '$lib/components/Table/DataTableTemplate.svelte'; import Button from '$lib/components/ui/button/button.svelte'; - import * as Card from '$lib/components/ui/card'; + import PageHeader from '$lib/components/PageHeader.svelte'; import { handleApiError } from '$lib/errorhandling/apiErrorHandling'; import { onMount } from 'svelte'; import { toast } from 'svelte-sonner'; @@ -74,20 +74,14 @@ - - - Sessions - - - - This is a list of all active sessions of your account. Revoke any sessions you do not - recognize. - - - - - + + + + From 19e9d1464db2bf3abef4103d2642c6d2487f56f4 Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Fri, 12 Jun 2026 15:01:19 +0200 Subject: [PATCH 05/10] fix: use w-full on new token card so it fits mobile --- src/routes/(app)/settings/api-tokens/new/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(app)/settings/api-tokens/new/+page.svelte b/src/routes/(app)/settings/api-tokens/new/+page.svelte index 7143ce57..aa4d2c22 100644 --- a/src/routes/(app)/settings/api-tokens/new/+page.svelte +++ b/src/routes/(app)/settings/api-tokens/new/+page.svelte @@ -183,7 +183,7 @@ - + {#if parseError} API Token Request From 2b8d22bc576d9f30bfe823a31c52911f90d0d399 Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Fri, 12 Jun 2026 15:01:49 +0200 Subject: [PATCH 06/10] fix: responsive layout on public share edit page --- src/routes/(app)/shares/public/+page.svelte | 5 +- .../public/[shareId=guid]/edit/+page.svelte | 57 +++++++++---------- 2 files changed, 29 insertions(+), 33 deletions(-) diff --git a/src/routes/(app)/shares/public/+page.svelte b/src/routes/(app)/shares/public/+page.svelte index 53df71ae..039af1c6 100644 --- a/src/routes/(app)/shares/public/+page.svelte +++ b/src/routes/(app)/shares/public/+page.svelte @@ -78,8 +78,9 @@ -
{:else if sortedShares.length === 0}
diff --git a/src/routes/(app)/shares/public/[shareId=guid]/edit/+page.svelte b/src/routes/(app)/shares/public/[shareId=guid]/edit/+page.svelte index de7147fe..2373a92f 100644 --- a/src/routes/(app)/shares/public/[shareId=guid]/edit/+page.svelte +++ b/src/routes/(app)/shares/public/[shareId=guid]/edit/+page.svelte @@ -109,19 +109,35 @@
-
-
-

- Public Share: {publicShareData?.name ?? 'Loading...'} -

-

Editing — changes apply when you save.

+
+
+
+

+ Public Share: {publicShareData?.name ?? 'Loading...'} +

+

Editing — changes apply when you save.

+
+ {#if publicShareData} + + + + + + {publicShareData.author.name.charAt(0)} + + + + +

Shared by {publicShareData.author.name}

+
+ {/if}
-
- -
+ -
+
- - {#if publicShareData} - - - - - - - {publicShareData.author.name.charAt(0)} - - -

{publicShareData.author.name}

-
-
- -

Shared by

-
-
- {/if}
From cf39ad754425975b2940a523ae4edcd3273f8436 Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Fri, 12 Jun 2026 15:02:11 +0200 Subject: [PATCH 07/10] fix: table overflow on user shares pages --- src/routes/(app)/shares/user/incoming/+page.svelte | 2 +- src/routes/(app)/shares/user/invites/+page.svelte | 4 ++-- src/routes/(app)/shares/user/outgoing/+page.svelte | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/(app)/shares/user/incoming/+page.svelte b/src/routes/(app)/shares/user/incoming/+page.svelte index a7d77a10..027beba4 100644 --- a/src/routes/(app)/shares/user/incoming/+page.svelte +++ b/src/routes/(app)/shares/user/incoming/+page.svelte @@ -32,7 +32,7 @@
{:then} -
+
{#each userSharesState.shares.incoming as incomingShare, i (incomingShare.id)} diff --git a/src/routes/(app)/shares/user/invites/+page.svelte b/src/routes/(app)/shares/user/invites/+page.svelte index 53aaeb6e..4b471bd4 100644 --- a/src/routes/(app)/shares/user/invites/+page.svelte +++ b/src/routes/(app)/shares/user/invites/+page.svelte @@ -23,7 +23,7 @@
{:then} -
+
{#each userSharesState.outgoingInvites as invite (invite.id)} @@ -43,7 +43,7 @@
{:then} -
+
{#each userSharesState.incomingInvites as invite (invite.id)} diff --git a/src/routes/(app)/shares/user/outgoing/+page.svelte b/src/routes/(app)/shares/user/outgoing/+page.svelte index b98eaf0c..03c9b2d0 100644 --- a/src/routes/(app)/shares/user/outgoing/+page.svelte +++ b/src/routes/(app)/shares/user/outgoing/+page.svelte @@ -31,7 +31,7 @@
{:then} -
+
{#each userSharesState.shares.outgoing as userShare, i (userShare.id)} From cc53812b24737bccdb24b45b63dadee909580b5e Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Fri, 12 Jun 2026 15:02:33 +0200 Subject: [PATCH 08/10] fix: wrap OTA history table in overflow-x-auto --- .../hubs/[hubId=guid]/update/+page.svelte | 62 ++++++++++--------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/src/routes/(app)/hubs/[hubId=guid]/update/+page.svelte b/src/routes/(app)/hubs/[hubId=guid]/update/+page.svelte index 8cd5dfb6..118309da 100644 --- a/src/routes/(app)/hubs/[hubId=guid]/update/+page.svelte +++ b/src/routes/(app)/hubs/[hubId=guid]/update/+page.svelte @@ -356,38 +356,40 @@ No update history found for this hub.

{:else} - - - - ID - Started - Status - Version - Message - - - - {#each otaLogs as otaLog (otaLog.id)} +
+ + - - {NumberToHexPadded(otaLog.id, 8)} - - - {formatRelativeTime(otaLog.startedAt)} - - - - {otaLog.status} - - - {otaLog.version} - - {otaLog.message ?? '-'} - + ID + Started + Status + Version + Message - {/each} - - + + + {#each otaLogs as otaLog (otaLog.id)} + + + {NumberToHexPadded(otaLog.id, 8)} + + + {formatRelativeTime(otaLog.startedAt)} + + + + {otaLog.status} + + + {otaLog.version} + + {otaLog.message ?? '-'} + + + {/each} + + +
{/if} From d06ffc496cd8382335c042c956a340b76e70c0f0 Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Fri, 12 Jun 2026 15:03:01 +0200 Subject: [PATCH 09/10] fix: hide duplicate h1 on mobile for profile and shockers --- src/routes/(app)/profile/+page.svelte | 8 ++++++-- src/routes/(app)/shockers/own/+page.svelte | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/routes/(app)/profile/+page.svelte b/src/routes/(app)/profile/+page.svelte index fe76d8d3..d0da0e72 100644 --- a/src/routes/(app)/profile/+page.svelte +++ b/src/routes/(app)/profile/+page.svelte @@ -6,6 +6,10 @@ -

Profile

-

Your profile page is coming soon.

+

Profile

+
+

Your profile page is coming soon.

+
diff --git a/src/routes/(app)/shockers/own/+page.svelte b/src/routes/(app)/shockers/own/+page.svelte index 116d6a22..cc52c61a 100644 --- a/src/routes/(app)/shockers/own/+page.svelte +++ b/src/routes/(app)/shockers/own/+page.svelte @@ -188,7 +188,7 @@
{:else}
-

Shockers

+

Shockers

+ {/if} +
+ + +
+ {#if !isCurrent} + Last seen {lastSeenText} + {/if} + + Created {createdText} + {#if !isCurrent} + · Expires {expiresText}{/if} + +
+