7 Commits

Author SHA1 Message Date
Zoë Bijl 4414bdc369 [bugfix] set type for nameLayout 2025-10-21 01:32:28 +02:00
Zoë Bijl 276bd114eb [feature] toggle sections based on setting 2025-10-21 00:43:29 +02:00
Zoë Bijl 4cb3e9c107 [chore] undo change to Immutable 2025-10-21 00:42:36 +02:00
Zoë Bijl 3cffe98969 [chore] refactor css 2025-10-21 00:42:35 +02:00
Zoë Bijl 9f4f83f383 [chore] lint 2025-10-21 00:42:35 +02:00
Zoë Bijl 2f1851e8f9 change to ImmutablePureComponent 2025-10-21 00:42:35 +02:00
Zoë Bijl 7631089507 [feature] add “Name Layout” setting 2025-10-21 00:42:35 +02:00
7 changed files with 68 additions and 20 deletions
@@ -1,7 +1,10 @@
import PropTypes from "prop-types";
import React from "react";
import classNames from "classnames";
import ImmutablePropTypes from "react-immutable-proptypes";
import { type List } from "immutable";
import { type Account } from "flavours/glitch/types/resources";
@@ -15,9 +18,15 @@ interface Props {
others?: List<Account>,
localDomain?: string,
inline?: boolean,
nameLayout?: string,
}
export class DisplayName extends React.PureComponent<Props> {
static propTypes = {
onChange: PropTypes.func.isRequired,
nameLayout: ImmutablePropTypes.map.isRequired,
};
handleMouseEnter: React.ReactEventHandler<HTMLSpanElement> = ({
currentTarget,
}) => {
@@ -55,7 +64,7 @@ export class DisplayName extends React.PureComponent<Props> {
};
render() {
const { others, localDomain, inline } = this.props;
const { others, localDomain, inline, nameLayout } = this.props;
let displayName: React.ReactNode,
suffix: React.ReactNode,
@@ -73,7 +82,7 @@ export class DisplayName extends React.PureComponent<Props> {
.map((a) => (
<bdi key={a.get("id")}>
<strong
className='display-name__html'
className="display-name__html"
dangerouslySetInnerHTML={{ __html: a.get("display_name_html") }}
/>
</bdi>
@@ -93,39 +102,39 @@ export class DisplayName extends React.PureComponent<Props> {
displayName = (
<bdi>
<strong
className='display-name__html'
className="display-name__html"
dangerouslySetInnerHTML={{
__html: account.get("display_name_html"),
}}
/>
</bdi>
);
suffix = <span className='display-name__account'>@{acct}</span>;
suffix = <span className="display-name__account">@{acct}</span>;
} else {
displayName = (
<bdi>
<strong className='display-name__html'>
<Skeleton width='10ch' />
<strong className="display-name__html">
<Skeleton width="10ch" />
</strong>
</bdi>
);
suffix = (
<span className='display-name__account'>
<Skeleton width='7ch' />
<span className="display-name__account">
<Skeleton width="7ch" />
</span>
);
}
return (
<span
className={classNames("display-name", { inline })}
<div
className={classNames("display-name", { inline }, nameLayout)}
onMouseEnter={this.handleMouseEnter}
onMouseLeave={this.handleMouseLeave}
>
{displayName}
{inline ? " " : null}
{suffix}
</span>
</div>
);
}
}
@@ -826,6 +826,7 @@ class Status extends ImmutablePureComponent {
friend={account}
collapsed={isCollapsed}
parseClick={parseClick}
settings={settings}
/>
) : null}
<StatusIcons
@@ -15,6 +15,7 @@ export default class StatusHeader extends PureComponent {
status: ImmutablePropTypes.map.isRequired,
friend: ImmutablePropTypes.map,
parseClick: PropTypes.func.isRequired,
settings: ImmutablePropTypes.map.isRequired,
};
// Handles clicks on account name/image
@@ -33,6 +34,7 @@ export default class StatusHeader extends PureComponent {
const {
status,
friend,
settings,
} = this.props;
const account = status.get("account");
@@ -62,7 +64,7 @@ export default class StatusHeader extends PureComponent {
onClick={this.handleAccountClick}
rel='noopener noreferrer'
>
<DisplayName account={account} />
<DisplayName account={account} nameLayout={settings.get("name_layout")} />
</a>
</div>
);
@@ -33,6 +33,10 @@ const messages = defineMessages({
unlisted: { id: "privacy.unlisted.short", defaultMessage: "Unlisted" },
private: { id: "privacy.private.short", defaultMessage: "Followers only" },
direct: { id: "privacy.direct.short", defaultMessage: "Mentioned people only" },
namelayout_display: { id: "namelayout.display", defaultMessage: "Display name" },
namelayout_handle: { id: "namelayout.handle", defaultMessage: "Handle" },
namelayout_both_y: { id: "namelayout.both.vertical", defaultMessage: "Both (Vertical)" },
namelayout_both_x: { id: "namelayout.both.horizontal", defaultMessage: "Both (Horizontal)" },
});
class LocalSettingsPage extends PureComponent {
@@ -198,6 +202,22 @@ class LocalSettingsPage extends PureComponent {
<span className='hint'><FormattedMessage id='settings.wide_view_hint' defaultMessage='Stretches columns to better fill the available space.' /></span>
</LocalSettingsPageItem>
</section>
<section>
<h2><FormattedMessage id='settings.name_layout' defaultMessage='Name layout' /></h2>
<LocalSettingsPageItem
settings={settings}
item={["name_layout"]}
id='mastodon-settings--status-username-inline'
onChange={onChange}
options={[
{ value: "display", message: intl.formatMessage(messages.namelayout_display) },
{ value: "handle", message: intl.formatMessage(messages.namelayout_handle) },
{ value: "both_y", message: intl.formatMessage(messages.namelayout_both_y) },
{ value: "both_x", message: intl.formatMessage(messages.namelayout_both_x) },
]}
>
</LocalSettingsPageItem>
</section>
</div>
),
({ intl, onChange, settings }) => (
@@ -53,6 +53,7 @@ const initialState = ImmutableMap({
pop_in_player : true,
pop_in_position : "right",
}),
name_layout : "both_y",
notifications : ImmutableMap({
favicon_badge : false,
tab_badge : true,
@@ -31,12 +31,10 @@
color: var(--color-secondary-fg);
}
.status .mention {
&,
&:hover {
.status .mention,
.status .mention:hover {
text-decoration: none;
}
}
.status .mention:is(:focus, :hover) span {
text-decoration-color: currentcolor;
@@ -18,6 +18,16 @@
line-height: max(21px, 1.4em);
}
.display-name.both_x {
display: flex;
gap: var(--size-ui-gap);
}
.display-name.handle bdi,
.display-name.display .display-name__account {
display: none;
}
.display-name__html {
font-weight: 700;
}
@@ -27,7 +37,14 @@
font-weight: 400;
}
&:hover .display-name__html {
.display-name.handle .display-name__account {
color: currentcolor;
font-size: inherit;
font-weight: 700;
}
&:hover .display-name__html,
&:hover .display-name.handle .display-name__account {
text-decoration-line: underline;
text-decoration-color: currentColor;
text-decoration-thickness: 2px;