add: added some ui improvements

This commit is contained in:
Lukian 2025-05-12 20:48:55 +02:00
parent 8d6e1f8618
commit b707e2cead
21 changed files with 236 additions and 121 deletions

View file

@ -84,6 +84,10 @@ router.get('/:name', async (req, res) => {
return res.status(404).send({ error: 'Emoji not found' }); return res.status(404).send({ error: 'Emoji not found' });
} }
if (!fs.existsSync(`data/emojis/${emoji[0].file}`)) {
return res.sendFile(path.join(__dirname, `../images/default.png`), { headers: { 'Content-Type': 'image' } });
}
res.sendFile(path.join(__dirname, `../data/emojis/${emoji[0].file}`), { headers: { 'Content-Type': 'image' } }); res.sendFile(path.join(__dirname, `../data/emojis/${emoji[0].file}`), { headers: { 'Content-Type': 'image' } });
}); });

View file

@ -81,7 +81,7 @@ router.get('/:username/pfp', async (req, res) => {
const pfp = user[0].pfp; const pfp = user[0].pfp;
if (!pfp || !fs.existsSync(path.join(__dirname, `../data/pfps/${pfp}`))) { if (!pfp || !fs.existsSync(path.join(__dirname, `../data/pfps/${pfp}`))) {
return res.sendFile(path.join(__dirname, `../images/default-pfp.png`), { headers: { 'Content-Type': 'image' } }); return res.sendFile(path.join(__dirname, `../images/default.png`), { headers: { 'Content-Type': 'image' } });
} }
res.sendFile(path.join(__dirname, `../data/pfps/${pfp}`), { headers: { 'Content-Type': 'image' } }); res.sendFile(path.join(__dirname, `../data/pfps/${pfp}`), { headers: { 'Content-Type': 'image' } });

View file

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Before After
Before After

Binary file not shown.

View file

@ -148,31 +148,30 @@ export default function MessageComponent({ message, user, channel }: {
<img src="/le_poisson_steve.png" alt="Le poisson steve" className="fish" /> <img src="/le_poisson_steve.png" alt="Le poisson steve" className="fish" />
)} )}
</div> </div>
{channel?.owner_id == user?.id || user?.admin == 1 || user?.username == message.username ? ( {(channel?.owner_id == user?.id || user?.admin == 1 || user?.id == message.user_id) && (
user?.id === message.user_id || user?.id === channel?.owner_id || user?.admin === 1) && ( <button onClick={handleDelete} className="forum-button">Delete</button>
<button onClick={handleDelete}>Delete</button>
) : (
<p>In <Link to={`/c/${message.channel_name}`}>{message.channel_name}</Link></p>
)} )}
{channel && user && !reply && ( {channel && user && !reply && (
<button onClick={() => setReply(true)}>Reply</button> <button onClick={() => setReply(true)} className="forum-button">Reply</button>
)} )}
{reply && ( {reply && (
<form onSubmit={(e) => handleReply(e, message.id)} className="message-form"> <form onSubmit={(e) => handleReply(e, message.id)} className="form-horizontal">
<input <input
className="forum-input"
type="text" type="text"
placeholder="Message" placeholder="Message"
value={replyContent} value={replyContent}
onChange={(e) => setReplyContent(e.target.value)} onChange={(e) => setReplyContent(e.target.value)}
ref={ref} ref={ref}
/> />
<button type="submit">Send</button> <button type="submit" className="forum-button">Send</button>
{searchedUsers.length > 0 && ( {searchedUsers.length > 0 && (
<div className="mentions"> <div className="input-menu">
{searchedUsers.map((user) => ( {searchedUsers.map((user) => (
<div key={user.id} className="mention"> <div key={user.id} className="input-menu-item">
<Link to={`/u/${user.username}`}>{user.username}</Link> <Link to={`/u/${user.username}`}>{user.username}</Link>
<button <button
className="forum-button"
type="button" type="button"
onClick={() => { onClick={() => {
setReplyContent( setReplyContent(
@ -189,12 +188,13 @@ export default function MessageComponent({ message, user, channel }: {
</div> </div>
)} )}
{searchedEmojis.length > 0 && ( {searchedEmojis.length > 0 && (
<div className="emojis"> <div className="input-menu">
{searchedEmojis.map((emoji) => ( {searchedEmojis.map((emoji) => (
<div key={emoji.id} className="search-emoji"> <div key={emoji.id} className="input-menu-item">
<img src={`/api/emojis/${emoji.name}`} alt={emoji.name} className="emojis-emoji" /> <img src={`/api/emojis/${emoji.name}`} alt={emoji.name} className="emoji" />
<span>:{emoji.name}:</span> <span>:{emoji.name}:</span>
<button <button
className="forum-button"
type="button" type="button"
onClick={() => { onClick={() => {
setReplyContent( setReplyContent(
@ -210,7 +210,7 @@ export default function MessageComponent({ message, user, channel }: {
))} ))}
</div> </div>
)} )}
<button onClick={() => setReply(false)}>Cancel</button> <button onClick={() => setReply(false)} className="forum-button">Cancel</button>
</form> </form>
)} )}
{message.has_replies == true && ( {message.has_replies == true && (

View file

@ -25,7 +25,7 @@ export default function TopBar({ user }: { user: User | undefined }) {
{user ? ( {user ? (
<div className="topbar-right"> <div className="topbar-right">
<Link to={`/u/${user.username}`}>{user.username}</Link> <Link to={`/u/${user.username}`}>{user.username}</Link>
<button onClick={() => { <button className="forum-button" onClick={() => {
localStorage.removeItem("token") localStorage.removeItem("token")
window.location.reload() window.location.reload()
}}> }}>
@ -49,7 +49,7 @@ export default function TopBar({ user }: { user: User | undefined }) {
{user ? ( {user ? (
<div className="burger-menu-user"> <div className="burger-menu-user">
<Link to={`/u/${user.username}`}>{user.username}</Link> <Link to={`/u/${user.username}`}>{user.username}</Link>
<button onClick={() => { <button className="forum-button" onClick={() => {
localStorage.removeItem("token") localStorage.removeItem("token")
window.location.reload() window.location.reload()
}}> }}>
@ -64,7 +64,7 @@ export default function TopBar({ user }: { user: User | undefined }) {
)} )}
</div> </div>
)} )}
<button onClick={() => setBurgerMenuOpen(!burgerMenuOpen)}> <button onClick={() => setBurgerMenuOpen(!burgerMenuOpen)} className="forum-button">
{burgerMenuOpen ? "Close" : "Menu"} {burgerMenuOpen ? "Close" : "Menu"}
</button> </button>
</div> </div>

View file

@ -1,8 +1,27 @@
@font-face {
font-family: DepartureMono;
src: url("/DepartureMonoNerdFontMono-Regular.otf") format("opentype");
}
* {
font-family: DepartureMono;
}
html { html {
background: linear-gradient(#FFE0E3, #f59ebb); background: linear-gradient(#FFE0E3, #f59ebb);
min-height: 100vh; min-height: 100vh;
} }
input[type=file] {
display: none;
}
label {
display: flex;
justify-content: center;
align-items: center;
}
.forum-page { .forum-page {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -23,6 +42,82 @@ html {
background-color: #fff6fd; background-color: #fff6fd;
} }
.center {
justify-content: center;
align-items: center;
}
.forum-button {
padding: 5px;
border-radius: 0px;
background-color: #ebb8e6;
border: 1px solid #270722;
box-shadow: none;
font-size: 13px;
}
.forum-button span {
font-size: 13px;
}
.forum-button:hover {
background-color: #d4b4f0;
}
.forum-input {
padding: 5px;
border-radius: 0px;
background-color: #fff6fd;
border: 1px solid #270722;
box-shadow: none;
}
.form-horizontal {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
gap: 5px;
position: relative;
}
.form-vertical {
display: flex;
flex-direction: column;
justify-content: start;
align-items: left;
gap: 5px;
position: relative;
}
.input-menu {
z-index: 1;
position: absolute;
top: 100%;
border: 1px solid #270722;
background-color: #fff6fd;
padding: 5px;
display: flex;
flex-direction: column;
justify-content: start;
align-items: left;
gap: 5px;
min-width: 20%;
}
.input-menu-item {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: top;
gap: 5px;
}
.emoji {
max-width: 1em;
max-height: 1em;
}
.cat { .cat {
width: 100px; width: 100px;
} }
@ -50,6 +145,32 @@ html {
color: #e4d9ec; color: #e4d9ec;
} }
.forum-button {
border: 1px solid #a678af;
background-color: #847996;
color: black;
}
.forum-button:hover {
background-color: #584f68;
}
.forum-input {
border: 1px solid #a678af;
background-color: #1b1b23;
color: #e4d9ec;
}
.forum-input::placeholder {
color: #e4d9ec;
}
.input-menu {
border: 1px solid #a678af;
background-color: #1b1b23;
color: #e4d9ec;
}
a { a {
color: #b88edc; color: #b88edc;
text-decoration: underline; text-decoration: underline;

View file

@ -198,32 +198,37 @@ export default function ChannelPage({socket}: {socket: WebSocket}) {
<img src="/cat.jpg" alt="cat" className="cat" /> <img src="/cat.jpg" alt="cat" className="cat" />
)} )}
{user?.admin == 1 && ( {user?.admin == 1 && (
<button onClick={purgeChannel}> <button onClick={purgeChannel} className="forum-button">
Purge Channel Purge Channel
</button> </button>
)} )}
{user?.admin == 1 && ( {user?.admin == 1 && (
<button onClick={deleteChannel}> <button onClick={deleteChannel} className="forum-button">
Delete Channel Delete Channel
</button> </button>
)} )}
{token ? ( {token ? (
<form onSubmit={handleSubmit} className="message-form"> <form onSubmit={handleSubmit} className="form-horizontal">
<input <input
className="forum-input"
type="text" type="text"
placeholder="Message" placeholder="Message"
value={message} value={message}
onChange={(e) => setMessage(e.target.value)} onChange={(e) => setMessage(e.target.value)}
ref={ref} ref={ref}
/> />
<input type="file" name="attachment" id="attachment" /> <label htmlFor="attachment">
<button type="submit">Send</button> <span className="forum-button">Upload Attachment</span>
<input type="file" name="attachment" id="attachment" className="forum-input" />
</label>
<button type="submit" className="forum-button">Send</button>
{searchedUsers.length > 0 && ( {searchedUsers.length > 0 && (
<div className="mentions"> <div className="input-menu">
{searchedUsers.map((user) => ( {searchedUsers.map((user) => (
<div key={user.id} className="mention"> <div key={user.id} className="input-menu-item">
<Link to={`/u/${user.username}`}>{user.username}</Link> <Link to={`/u/${user.username}`}>{user.username}</Link>
<button <button
className="forum-button"
type="button" type="button"
onClick={() => { onClick={() => {
setMessage( setMessage(
@ -240,12 +245,13 @@ export default function ChannelPage({socket}: {socket: WebSocket}) {
</div> </div>
)} )}
{searchedEmojis.length > 0 && ( {searchedEmojis.length > 0 && (
<div className="emojis"> <div className="input-menu">
{searchedEmojis.map((emoji) => ( {searchedEmojis.map((emoji) => (
<div key={emoji.id} className="search-emoji"> <div key={emoji.id} className="input-menu-item">
<img src={`/api/emojis/${emoji.name}`} alt={emoji.name} className="emojis-emoji" /> <img src={`/api/emojis/${emoji.name}`} alt={emoji.name} className="emoji" />
<span>:{emoji.name}:</span> <span>:{emoji.name}:</span>
<button <button
className="forum-button"
type="button" type="button"
onClick={() => { onClick={() => {
setMessage( setMessage(
@ -280,7 +286,7 @@ export default function ChannelPage({socket}: {socket: WebSocket}) {
/> />
))} ))}
{messages.length == maxMessageToShown && ( {messages.length == maxMessageToShown && (
<button onClick={() => setMaxMessageToShown(maxMessageToShown + 10)}>Show more</button> <button onClick={() => setMaxMessageToShown(maxMessageToShown + 10)} className="forum-button">Show more</button>
)} )}
</div> </div>
) : ( ) : (

View file

@ -79,6 +79,7 @@ export default function ChannelsPage({socket}: {socket: WebSocket}) {
<h2>Channels</h2> <h2>Channels</h2>
<Link to="/create-channel">Create channel</Link> <Link to="/create-channel">Create channel</Link>
<input <input
className="forum-input"
type="text" type="text"
placeholder="Search channels" placeholder="Search channels"
value={search} value={search}
@ -89,7 +90,7 @@ export default function ChannelsPage({socket}: {socket: WebSocket}) {
<li key={channel.id}> <li key={channel.id}>
<Link to={`/c/${channel.name}`}>{channel.name}</Link> <Link to={`/c/${channel.name}`}>{channel.name}</Link>
{user?.admin == 1 && ( {user?.admin == 1 && (
<button onClick={() => deleteChannel(channel.name)}> <button onClick={() => deleteChannel(channel.name)} className="forum-button">
Delete Delete
</button> </button>
)} )}

View file

@ -41,25 +41,27 @@ export default function CreateChannel() {
<TopBar user={user}/> <TopBar user={user}/>
<div className="forum-section"> <div className="forum-section">
<h1>Create Channel</h1> <h1>Create Channel</h1>
<form onSubmit={handleSubmit}> <form onSubmit={handleSubmit} className="form-horizontal">
<p> <p>
{!/^[a-zA-Z0-9-_]+$/.test(name) && name.length != 0 && ( {!/^[a-zA-Z0-9-_]+$/.test(name) && name.length != 0 && (
<span>Channel name can only contain letters, numbers, - and _</span> <span>Channel name can only contain letters, numbers, - and _</span>
)} )}
</p> </p>
<input <input
className="forum-input"
type="text" type="text"
placeholder="Name" placeholder="Name"
value={name} value={name}
onChange={(e) => setName(e.target.value)} onChange={(e) => setName(e.target.value)}
/> />
<input <input
className="forum-input"
type="text" type="text"
placeholder="Description" placeholder="Description"
value={description} value={description}
onChange={(e) => setDescription(e.target.value)} onChange={(e) => setDescription(e.target.value)}
/> />
<button type="submit" disabled={!/^[a-zA-Z0-9-_]+$/.test(name)}> <button type="submit" disabled={!/^[a-zA-Z0-9-_]+$/.test(name)} className="forum-button">
Create Create
</button> </button>
</form> </form>

View file

@ -52,20 +52,24 @@ export default function CreateEmoji() {
<TopBar user={user}/> <TopBar user={user}/>
<div className="forum-section"> <div className="forum-section">
<h1>Create Emoji</h1> <h1>Create Emoji</h1>
<form onSubmit={handleSubmit}> <form onSubmit={handleSubmit} className="form-horizontal">
<p> <p>
{!/^[a-zA-Z0-9-_]+$/.test(name) && name.length != 0 && ( {!/^[a-zA-Z0-9-_]+$/.test(name) && name.length != 0 && (
<span>Emoji name can only contain letters, numbers, - and _</span> <span>Emoji name can only contain letters, numbers, - and _</span>
)} )}
</p> </p>
<input <input
className="forum-input"
type="text" type="text"
placeholder="Name" placeholder="Name"
value={name} value={name}
onChange={(e) => setName(e.target.value)} onChange={(e) => setName(e.target.value)}
/> />
<input type="file" name="emoji" id="emoji" accept="image/*"/> <label htmlFor="emoji" className="forum-button">
<button type="submit" disabled={!/^[a-zA-Z0-9-_]+$/.test(name)}> <span>Upload Emoji</span>
<input type="file" name="emoji" id="emoji" accept="image/*"/>
</label>
<button type="submit" disabled={!/^[a-zA-Z0-9-_]+$/.test(name)} className="forum-button">
Create Create
</button> </button>
</form> </form>

View file

@ -105,26 +105,29 @@ export default function EditProfile() {
<TopBar user={user}/> <TopBar user={user}/>
<div className="forum-section"> <div className="forum-section">
<h2>Edit Profile Picture</h2> <h2>Edit Profile Picture</h2>
<form> <form className="form-horizontal">
<input type="file" name="pfp" id="pfp" accept="image/*" /> <label htmlFor="pfp">
<button onClick={uploadPfp}>Save</button> <span className="forum-button">Upload new profile picture</span>
<button onClick={deletePfp}>Delete</button> <input type="file" name="pfp" id="pfp" accept="image/*" />
</label>
<button onClick={uploadPfp} className="forum-button">Save</button>
<button onClick={deletePfp} className="forum-button">Delete</button>
</form> </form>
</div> </div>
<div className="forum-section"> <div className="forum-section">
<h2>Edit Username</h2> <h2>Edit Username</h2>
<form> <form className="form-horizontal">
<input type="text" name="username" id="username" placeholder={user?.username} /> <input type="text" name="username" id="username" placeholder={user?.username} className="forum-input" />
<button onClick={editUsername}>Save</button> <button onClick={editUsername} className="forum-button">Save</button>
</form> </form>
</div> </div>
<div className="forum-section"> <div className="forum-section">
<h2>Edit Password</h2> <h2>Edit Password</h2>
<form> <form className="form-horizontal">
<input type="password" name="old-password" id="old-password" placeholder="Old password" /> <input type="password" name="old-password" id="old-password" placeholder="Old password" className="forum-input" />
<input type="password" name="password" id="password" placeholder="New password" /> <input type="password" name="password" id="password" placeholder="New password" className="forum-input" />
<input type="password" name="confirm-password" id="confirm-password" placeholder="Confirm new password" /> <input type="password" name="confirm-password" id="confirm-password" placeholder="Confirm new password" className="forum-input" />
<button onClick={editPassword}>Save</button> <button onClick={editPassword} className="forum-button">Save</button>
</form> </form>
</div> </div>
</div> </div>

View file

@ -84,6 +84,7 @@ export default function EmojisPage({socket}: {socket: WebSocket}) {
<h2>Emojis</h2> <h2>Emojis</h2>
<Link to="/create-emoji">Create emoji</Link> <Link to="/create-emoji">Create emoji</Link>
<input <input
className="forum-input"
type="text" type="text"
placeholder="Search emojis" placeholder="Search emojis"
value={search} value={search}
@ -92,10 +93,10 @@ export default function EmojisPage({socket}: {socket: WebSocket}) {
<ul> <ul>
{emojis?.sort().filter((emoji) => emoji.name.toLowerCase().includes(search.toLowerCase())).map((emoji) => ( {emojis?.sort().filter((emoji) => emoji.name.toLowerCase().includes(search.toLowerCase())).map((emoji) => (
<li key={emoji.id}> <li key={emoji.id}>
<img src={`/api/emojis/${emoji.name}`} alt={emoji.name} className="emoji" /> <img src={`/api/emojis/${emoji.name}`} alt={emoji.name} className="emoji-fat" />
<span>:{emoji.name}:</span> <span>:{emoji.name}:</span>
{user?.admin == 1 && ( {user?.admin == 1 && (
<button onClick={() => deleteEmoji(emoji.name)}> <button onClick={() => deleteEmoji(emoji.name)} className="forum-button">
Delete Delete
</button> </button>
)} )}

View file

@ -199,6 +199,7 @@ export default function Home({socket}: {socket: WebSocket}) {
<div className="channels-search"> <div className="channels-search">
<h3>Search channels</h3> <h3>Search channels</h3>
<input <input
className="forum-input"
type="text" type="text"
placeholder="Search channels" placeholder="Search channels"
value={search} value={search}

View file

@ -24,22 +24,24 @@ export default function Login() {
return ( return (
<div className="forum-page"> <div className="forum-page">
<TopBar user={undefined}/> <TopBar user={undefined}/>
<div className="forum-section"> <div className="forum-section center">
<h2>Login</h2> <h2>Login</h2>
<form onSubmit={handleSubmit}> <form onSubmit={handleSubmit} className="form-vertical">
<input <input
className="forum-input"
type="text" type="text"
placeholder="Username" placeholder="Username"
value={username} value={username}
onChange={(e) => setUsername(e.target.value)} onChange={(e) => setUsername(e.target.value)}
/> />
<input <input
className="forum-input"
type="password" type="password"
placeholder="Password" placeholder="Password"
value={password} value={password}
onChange={(e) => setPassword(e.target.value)} onChange={(e) => setPassword(e.target.value)}
/> />
<button type="submit">Login</button> <button type="submit" className="forum-button">Login</button>
</form> </form>
<Link to="/register">Register</Link> <Link to="/register">Register</Link>
</div> </div>

View file

@ -31,27 +31,27 @@ export default function Register () {
return ( return (
<div className="forum-page"> <div className="forum-page">
<TopBar user={undefined}/> <TopBar user={undefined}/>
<div className="forum-section"> <div className="forum-section center">
<h2>Register</h2> <h2>Register</h2>
<form onSubmit={handleSubmit}> <form onSubmit={handleSubmit} className="form-vertical">
<p> {!/^[a-zA-Z0-9-_]+$/.test(username) && username.length != 0 && (
{!/^[a-zA-Z0-9-_]+$/.test(username) && username.length != 0 && ( <p>Username can only contain letters, numbers, - and _</p>
<span>Username can only contain letters, numbers, - and _</span> )}
)}
</p>
<input <input
className="forum-input"
type="text" type="text"
placeholder="Username" placeholder="Username"
value={username} value={username}
onChange={(e) => setUsername(e.target.value)} onChange={(e) => setUsername(e.target.value)}
/> />
<input <input
className="forum-input"
type="password" type="password"
placeholder="Password" placeholder="Password"
value={password} value={password}
onChange={(e) => setPassword(e.target.value)} onChange={(e) => setPassword(e.target.value)}
/> />
<button type="submit" disabled={!/^[a-zA-Z0-9-_]+$/.test(username)}> <button type="submit" disabled={!/^[a-zA-Z0-9-_]+$/.test(username)} className="forum-button">
Register Register
</button> </button>
</form> </form>

View file

@ -132,14 +132,14 @@ export default function UserPage({socket}: {socket: WebSocket}) {
<Link to="/edit-profile">Edit profile</Link> <Link to="/edit-profile">Edit profile</Link>
)} )}
{user?.admin == 1 && ( {user?.admin == 1 && (
<div> <button onClick={deleteUser} className="forum-button">
<button onClick={deleteUser}> Delete user
Delete user </button>
</button> )}
<button onClick={deleteUserPfp}> {user?.admin == 1 && (
Delete profile picture <button onClick={deleteUserPfp} className="forum-button">
</button> Delete profile picture
</div> </button>
)} )}
</div> </div>
<div className="forum-section"> <div className="forum-section">

View file

@ -78,6 +78,7 @@ export default function UsersPage({socket}: {socket: WebSocket}) {
<div className="forum-section"> <div className="forum-section">
<h2>Users</h2> <h2>Users</h2>
<input <input
className="forum-input"
type="text" type="text"
placeholder="Search users" placeholder="Search users"
value={search} value={search}
@ -88,7 +89,7 @@ export default function UsersPage({socket}: {socket: WebSocket}) {
<li key={user.id}> <li key={user.id}>
<Link to={`/u/${user.username}`}>{user.username}</Link> <Link to={`/u/${user.username}`}>{user.username}</Link>
{thisUser?.admin == 1 && ( {thisUser?.admin == 1 && (
<button onClick={() => deleteUser(user.username)}> <button onClick={() => deleteUser(user.username)} className="forum-button">
Delete Delete
</button> </button>
)} )}

View file

@ -3,55 +3,6 @@
position: relative; position: relative;
} }
.mentions {
position: absolute;
top: 100%;
border: 1px solid #270722;
padding: 5px;
display: flex;
flex-direction: column;
justify-content: start;
align-items: left;
gap: 5px;
min-width: 20%;
background-color: white;
}
.mention {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: top;
gap: 5px;
}
.emojis {
position: absolute;
top: 100%;
border: 1px solid #270722;
padding: 5px;
display: flex;
flex-direction: column;
justify-content: start;
align-items: left;
gap: 5px;
min-width: 20%;
background-color: white;
}
.search-emoji {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: top;
gap: 5px;
}
.emojis-emoji {
max-width: 1em;
max-height: 1em;
}
.login-prompt { .login-prompt {
margin: 16px 0; margin: 16px 0;
display: flex; display: flex;

View file

@ -1,4 +1,4 @@
.emoji { .emoji-fat {
max-width: 5em; max-width: 2em;
max-height: 5em; max-height: 2em;
} }

View file

@ -2,6 +2,7 @@
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
flex-direction: row; flex-direction: row;
height: 45px;
} }
.topbar-left { .topbar-left {
@ -9,6 +10,17 @@
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
z-index: 2;
}
.topbar-center {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
position: absolute;
left: 0;
z-index: 1;
} }
.topbar-right { .topbar-right {
@ -16,6 +28,7 @@
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
z-index: 2;
} }
.topbar-user-pfp { .topbar-user-pfp {
@ -46,12 +59,17 @@
.topbar { .topbar {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
height: auto;
} }
.topbar-left { .topbar-left {
display: none; display: none;
} }
.topbar-center {
position: relative;
}
.topbar-right { .topbar-right {
display: none; display: none;
} }