Handle info with menu dropdown for profile page

This commit is contained in:
Lim Chee Aun 2024-03-28 00:25:10 +08:00
parent 3b975e899b
commit fd9d8059bc
3 changed files with 135 additions and 7 deletions

View file

@ -831,3 +831,58 @@
} }
} }
} }
.handle-info {
.handle-handle {
display: inline-block;
margin-block: 5px;
b {
font-weight: 600;
padding: 2px 4px;
border-radius: 4px;
display: inline-block;
box-shadow: 0 0 0 5px var(--bg-blur-color);
&.handle-username {
color: var(--orange-fg-color);
background-color: var(--orange-bg-color);
}
&.handle-server {
color: var(--purple-fg-color);
background-color: var(--purple-bg-color);
}
}
}
.handle-at {
display: inline-block;
margin-inline: -3px;
position: relative;
z-index: 1;
}
.handle-legend {
margin-top: 0.25em;
}
.handle-legend-icon {
overflow: hidden;
display: inline-block;
width: 14px;
height: 14px;
border: 4px solid transparent;
border-radius: 8px;
background-clip: padding-box;
&.username {
background-color: var(--orange-fg-color);
border-color: var(--orange-bg-color);
}
&.server {
background-color: var(--purple-fg-color);
border-color: var(--purple-bg-color);
}
}
}

View file

@ -541,13 +541,51 @@ function AccountInfo({
/> />
)} )}
<header> <header>
{standalone ? (
<Menu2
shift={64}
menuButton={
<div>
<AccountBlock <AccountBlock
account={info} account={info}
instance={instance} instance={instance}
avatarSize="xxxl" avatarSize="xxxl"
external={standalone} onClick={() => {}}
internal={!standalone}
/> />
</div>
}
>
<div class="szh-menu__header">
<AccountHandleInfo acct={acct} instance={instance} />
</div>
<MenuItem
onClick={() => {
const handle = `@${acct}`;
try {
navigator.clipboard.writeText(handle);
showToast('Handle copied');
} catch (e) {
console.error(e);
showToast('Unable to copy handle');
}
}}
>
<Icon icon="link" />
<span>Copy handle</span>
</MenuItem>
<MenuItem href={url} target="_blank">
<Icon icon="external" />
<span>Go to original profile page</span>
</MenuItem>
</Menu2>
) : (
<AccountBlock
account={info}
instance={instance}
avatarSize="xxxl"
internal
/>
)}
</header> </header>
<div class="faux-header-bg" aria-hidden="true" /> <div class="faux-header-bg" aria-hidden="true" />
<main> <main>
@ -2000,4 +2038,27 @@ function FieldsAttributesRow({ name, value, disabled, index: i }) {
); );
} }
function AccountHandleInfo({ acct, instance }) {
// acct = username or username@server
let [username, server] = acct.split('@');
if (!server) server = instance;
return (
<div class="handle-info">
<span class="handle-handle">
<b class="handle-username">{username}</b>
<span class="handle-at">@</span>
<b class="handle-server">{server}</b>
</span>
<div class="handle-legend">
<span class="ib">
<span class="handle-legend-icon username" /> username
</span>{' '}
<span class="ib">
<span class="handle-legend-icon server" /> server domain name
</span>
</div>
</div>
);
}
export default AccountInfo; export default AccountInfo;

View file

@ -16,6 +16,12 @@
--blue-color: royalblue; --blue-color: royalblue;
--purple-color: blueviolet; --purple-color: blueviolet;
--purple-fg-color: color-mix(
in srgb-linear,
var(--purple-color) 60%,
var(--text-color) 40%
);
--purple-bg-color: color-mix(in lch, var(--purple-color) 15%, transparent);
--green-color: darkgreen; --green-color: darkgreen;
--orange-color: darkorange; --orange-color: darkorange;
--orange-light-bg-color: color-mix( --orange-light-bg-color: color-mix(
@ -23,6 +29,12 @@
var(--orange-color) 20%, var(--orange-color) 20%,
transparent transparent
); );
--orange-fg-color: color-mix(
in srgb-linear,
var(--orange-color) 60%,
var(--text-color) 40%
);
--orange-bg-color: color-mix(in lch, var(--orange-color) 15%, transparent);
--red-color: orangered; --red-color: orangered;
--red-text-color: color-mix( --red-text-color: color-mix(
in srgb-linear, in srgb-linear,