From 79252fe54a25717f731e57c51f16af152d6d8e66 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:46:27 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20Phase=201=20Aether=20Drift=20=E2=80=94?= =?UTF-8?q?=20mobile-first=20grid=20layout=20and=20token=20migration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace Discord flex layout with CSS Grid on desktop (312px sidebar + 1fr main) and overlay drawer on mobile. Migrate all discord-* class references to Aether Drift design tokens across 15 files (~200 refs). Layout: ServerSidebar becomes a fixed glass strip (md:glass-strip), ChannelSidebar gets pl-[72px] offset, bottom bar is a glass-bubble (z-105), MessageInput floats as absolute glass pill on desktop (z-110). MemberSidebar/ActivityPanel hidden on mobile via hidden md:block. Z-index stack: MobileNav backdrop z-35, sidebar z-40, glass strip z-100, bottom bar z-105, input bubble z-110, hamburger z-120, profile popout z-145, device panels z-150, modals z-200. --- packages/web/index.html | 6 +- .../web/src/components/chat/MessageInput.tsx | 30 ++-- .../web/src/components/chat/MessageList.tsx | 24 +-- .../src/components/layout/ActivityPanel.tsx | 18 +- .../web/src/components/layout/AppLayout.tsx | 14 +- .../src/components/layout/ChannelSidebar.tsx | 158 +++++++++--------- .../web/src/components/layout/MainContent.tsx | 112 ++++++------- .../layout/MemberListToggleButton.tsx | 4 +- .../src/components/layout/MemberSidebar.tsx | 16 +- .../web/src/components/layout/MobileNav.tsx | 4 +- .../src/components/layout/ServerSidebar.tsx | 16 +- packages/web/src/components/ui/Modal.tsx | 10 +- .../src/components/voice/VoiceControls.tsx | 32 ++-- packages/web/src/styles/globals.css | 139 ++++++++++++++- packages/web/tailwind.config.js | 59 ++++++- 15 files changed, 412 insertions(+), 230 deletions(-) diff --git a/packages/web/index.html b/packages/web/index.html index 9cbd5738..8c0b42a0 100644 --- a/packages/web/index.html +++ b/packages/web/index.html @@ -1,9 +1,13 @@ - + + + + + Backspace diff --git a/packages/web/src/components/chat/MessageInput.tsx b/packages/web/src/components/chat/MessageInput.tsx index 68823423..77fcf459 100644 --- a/packages/web/src/components/chat/MessageInput.tsx +++ b/packages/web/src/components/chat/MessageInput.tsx @@ -216,16 +216,16 @@ export function MessageInput({ channelId, channelName }: MessageInputProps) { }; return ( -
+
{replyTo && ( -
-
+
+
Replying to {replyTo.user.displayName ?? replyTo.user.username}
)}
@@ -249,9 +249,9 @@ export function MessageInput({ channelId, channelName }: MessageInputProps) { {/* File previews */} {files.length > 0 && ( -
+
{files.map((file, i) => ( -
+
{file.type.startsWith('image/') ? ( ) : ( -
+
@@ -268,7 +268,7 @@ export function MessageInput({ channelId, channelName }: MessageInputProps) { )}
)} -
+
); } return (
-
+
-

Welcome to the channel!

-

This is the start of the conversation.

-
+

Welcome to the channel!

+

This is the start of the conversation.

+
); } diff --git a/packages/web/src/components/layout/ActivityPanel.tsx b/packages/web/src/components/layout/ActivityPanel.tsx index 560df5f8..0349745f 100644 --- a/packages/web/src/components/layout/ActivityPanel.tsx +++ b/packages/web/src/components/layout/ActivityPanel.tsx @@ -46,7 +46,7 @@ export function ActivityPanel() {
handleFriendClick(e, friend)} - className="flex items-center gap-3 px-2 py-1.5 rounded-[4px] hover:bg-discord-modifier-hover cursor-pointer group transition-colors" + className="flex items-center gap-3 px-2 py-1.5 rounded-[4px] hover:bg-interactive-hover cursor-pointer group transition-colors" >
-
+
{friend.displayName ?? friend.username}
{!isOffline && friend.customStatus && ( -
{friend.customStatus}
+
{friend.customStatus}
)}
); return ( -
+
-

Active Now

+

Active Now

{onlineFriends.length === 0 && offlineFriends.length === 0 ? (
-
It's quiet for now...
-
+
It's quiet for now...
+
When a friend starts an activity—like playing a game or hanging out on voice—we'll show it here!
@@ -82,7 +82,7 @@ export function ActivityPanel() { <> {onlineFriends.length > 0 && (
-

+

ONLINE — {onlineFriends.length}

{onlineFriends.map(f => renderFriend(f))} @@ -90,7 +90,7 @@ export function ActivityPanel() { )} {offlineFriends.length > 0 && (
-

+

OFFLINE — {offlineFriends.length}

{offlineFriends.map(f => renderFriend(f, true))} diff --git a/packages/web/src/components/layout/AppLayout.tsx b/packages/web/src/components/layout/AppLayout.tsx index 7b5d4711..a88de2c7 100644 --- a/packages/web/src/components/layout/AppLayout.tsx +++ b/packages/web/src/components/layout/AppLayout.tsx @@ -204,28 +204,28 @@ export function AppLayout() { if (isLoading || !user) { return ( -
+
- + -

Loading Backspace...

+

Loading Backspace...

); } return ( -
+
{/* Server sidebar - always visible on desktop, toggled on mobile */} -
+
{/* Main content area */} -
+
@@ -250,7 +250,7 @@ export function AppLayout() { {userProfilePopout.user && userProfilePopout.position && ( <>
-
+
+
{/* Voice controls (expands when connected) */} {(currentVoiceChannelId || activeDmCall) && } {/* Separator between voice and user area */} @@ -119,9 +119,9 @@ export function ChannelSidebar() { if (!server) { return ( <> -
+
-
@@ -130,8 +130,8 @@ export function ChannelSidebar() { onClick={handleHomeClick} className={`flex items-center gap-3 px-2 h-[42px] rounded-[4px] cursor-pointer mb-[2px] transition-colors group ${ !currentChannelId - ? 'bg-discord-modifier-selected text-white' - : 'text-discord-text-muted hover:bg-discord-modifier-hover hover:text-discord-text-secondary' + ? 'bg-interactive-selected text-white' + : 'text-txt-tertiary hover:bg-interactive-hover hover:text-txt-secondary' }`} > @@ -144,7 +144,7 @@ export function ChannelSidebar() { {/* Nitro */}
@@ -155,7 +155,7 @@ export function ChannelSidebar() { {/* Shop */}
@@ -164,10 +164,10 @@ export function ChannelSidebar() {
- Direct Messages + Direct Messages {showInputDeviceList && ( -
+
{inputDevices.map(d => (
-
+
{/* Input Volume */}
-
Input Volume
+
Input Volume
{/* Mic level meter */} @@ -624,22 +624,22 @@ function UserAreaPanel({
))}
-
+
{/* Voice Settings link */} @@ -648,33 +648,33 @@ function UserAreaPanel({ {/* Output settings panel */} {openPanel === 'output' && ( -
+
{/* Output Device */}
{showOutputDeviceList && ( -
+
{outputDevices.map(d => (
-
+
{/* Output Volume */}
-
Output Volume
+
Output Volume
-
+
{/* Voice Settings link */} @@ -723,11 +723,11 @@ function UserAreaPanel({ {/* User area bar */}
{/* Avatar + name */} -
+
-
{user.displayName ?? user.username}
-
@{user.username}
+
{user.displayName ?? user.username}
+
@{user.username}
@@ -736,8 +736,8 @@ function UserAreaPanel({ {/* Mic */}
)} -
+
- + - {dmName} + {dmName} {isGroupDm && ( - ({dmChannel?.members.length} Members) + ({dmChannel?.members.length} Members) )}
- - @@ -272,23 +272,23 @@ export function MainContent() { return (
-
+
- + - {channel.name} + {channel.name} {connectionError ? ( - Connection Failed + Connection Failed ) : isLiveKitConnected ? ( <> - Connected - {participants.length} connected + Connected + {participants.length} connected ) : ( - Connecting... + Connecting... )}
@@ -309,49 +309,49 @@ export function MainContent() { } return ( -
-
+
+
- + - {channel.name} + {channel.name} {channel.topic && ( <> -
- {channel.topic} +
+ {channel.topic} )}
- - - -
- - -