+
{#each clients as client (client.clientId)}
{client.name ?? copy.unnamedClient}
-
+
{client.clientId}
@@ -165,6 +171,6 @@ export let scopeLabel: (scope: string) => string;
{/each}
-
+
{/if}
diff --git a/src/features/admin/components/AdminTableShell.svelte b/src/features/admin/components/AdminTableShell.svelte
new file mode 100644
index 000000000..bcae8d9f7
--- /dev/null
+++ b/src/features/admin/components/AdminTableShell.svelte
@@ -0,0 +1,26 @@
+
+
+
+
[data-slot=table-container]]:overflow-visible",
+ className,
+ )}
+ role={label ? "region" : undefined}
+ data-slot="admin-table-shell"
+ tabindex={label ? 0 : undefined}
+>
+ {@render children()}
+
diff --git a/src/features/admin/components/AdminUsersDesktopTable.svelte b/src/features/admin/components/AdminUsersDesktopTable.svelte
index 1c195dcee..c1585a95c 100644
--- a/src/features/admin/components/AdminUsersDesktopTable.svelte
+++ b/src/features/admin/components/AdminUsersDesktopTable.svelte
@@ -5,6 +5,7 @@ import TableRowActions from "$lib/components/TableRowActions.svelte";
import TruncatedText from "$lib/components/TruncatedText.svelte";
import { Badge } from "$lib/components/ui/badge/index.js";
import * as Table from "$lib/components/ui/table/index.js";
+import AdminTableShell from "./AdminTableShell.svelte";
import type {
AdminUserFormatter,
AdminUserRow,
@@ -20,70 +21,81 @@ export let users: AdminUserRow[];
-
- {copy.title}
-
-
- {copy.name}
- {copy.username}
- {copy.email}
- {copy.role}
- {copy.suspension}
- {copy.createdAt}
-
- {copy.editTitle}
-
-
-
-
- {#each users as user}
-
-
-
-
-
-
- {user.username ?? copy.noUsername}
-
-
-
-
-
-
-
- {user.isAdmin ? copy.adminRole : copy.userRole}
-
-
-
-
- {#if user.activeSuspension}
- {copy.suspendedStatus}
- {:else}
- {copy.clearStatus}
- {/if}
- {#if user.activeSuspension}
-
- {/if}
-
-
-
- {formatDate(user.createdAt)}
-
-
-
- onSelect(user)}
- >
-
-
-
-
+
+
+ {copy.title}
+
+
+ {copy.name}
+ {copy.username}
+ {copy.email}
+ {copy.role}
+ {copy.suspension}
+ {copy.createdAt}
+
+ {copy.editTitle}
+
- {/each}
-
-
+
+
+ {#each users as user}
+
+
+ {@const name = displayName(user)}
+
+
+
+
+
+ {@const username = user.username ?? copy.noUsername}
+
+ {username}
+
+
+
+ {@const email = user.email ?? copy.noVerifiedEmail}
+
+
+
+
+
+
+ {user.isAdmin ? copy.adminRole : copy.userRole}
+
+
+
+
+ {#if user.activeSuspension}
+ {copy.suspendedStatus}
+ {:else}
+ {copy.clearStatus}
+ {/if}
+ {#if user.activeSuspension}
+
+
+
+ {/if}
+
+
+
+ {formatDate(user.createdAt)}
+
+
+
+ onSelect(user)}
+ >
+
+
+
+
+
+ {/each}
+
+
+
diff --git a/src/features/admin/components/AdminUsersMobileList.svelte b/src/features/admin/components/AdminUsersMobileList.svelte
index 8a2107581..59fce5b87 100644
--- a/src/features/admin/components/AdminUsersMobileList.svelte
+++ b/src/features/admin/components/AdminUsersMobileList.svelte
@@ -3,6 +3,7 @@ import ChevronRightIcon from "@lucide/svelte/icons/chevron-right";
import { Badge } from "$lib/components/ui/badge/index.js";
import { Button } from "$lib/components/ui/button/index.js";
import * as Item from "$lib/components/ui/item/index.js";
+import AdminListShell from "./AdminListShell.svelte";
import type {
AdminUserFormatter,
AdminUserRow,
@@ -17,60 +18,63 @@ export let suspensionLabel: AdminUserFormatter;
export let users: AdminUserRow[];
-
- {#each users as user, index (user.id)}
-
-
- {displayName(user)}
-
- @{user.username ?? copy.noUsername}
-
-
- {user.email ?? copy.noVerifiedEmail}
-
-
-
-
-
- {copy.role}
- -
-
- {user.isAdmin ? copy.adminRole : copy.userRole}
-
-
-
-
-
- {copy.createdAt}
- - {formatDate(user.createdAt)}
-
-
-
- {copy.suspension}
- -
- {#if user.activeSuspension}
- {copy.suspendedStatus}
-
- {suspensionLabel(user)}
-
- {:else}
- {copy.clearStatus}
- {/if}
-
-
-
-
-
-
-
-
-
- {#if index < users.length - 1}{/if}
- {/each}
-
+
+
+ {#each users as user, index (user.id)}
+
+
+ {displayName(user)}
+
+ @{user.username ?? copy.noUsername}
+
+ {@const email = user.email ?? copy.noVerifiedEmail}
+
+ {email}
+
+
+
+
+
- {copy.role}
+ -
+
+ {user.isAdmin ? copy.adminRole : copy.userRole}
+
+
+
+
+
- {copy.createdAt}
+ - {formatDate(user.createdAt)}
+
+
+
- {copy.suspension}
+ -
+ {#if user.activeSuspension}
+ {copy.suspendedStatus}
+
+ {suspensionLabel(user)}
+
+ {:else}
+ {copy.clearStatus}
+ {/if}
+
+
+
+
+
+
+
+
+
+ {#if index < users.length - 1}{/if}
+ {/each}
+
+
diff --git a/src/features/admin/components/AdminWorkspace.svelte b/src/features/admin/components/AdminWorkspace.svelte
index edff95cd9..de7e3d304 100644
--- a/src/features/admin/components/AdminWorkspace.svelte
+++ b/src/features/admin/components/AdminWorkspace.svelte
@@ -12,8 +12,11 @@ type Props = {
let { children, controls, feedback, header, summary }: Props = $props();
-