Various design implementation fixes (#5284)

Co-authored-by: Alexander Zinchuk <alx.zinchuk@gmail.com>
This commit is contained in:
Alexander Zinchuk 2024-12-20 11:37:35 +01:00
parent b960e1080b
commit bfe72ddbdc
68 changed files with 393 additions and 393 deletions

View File

@ -158,3 +158,4 @@
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
} }

View File

@ -28,7 +28,7 @@
z-index: 1; z-index: 1;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background-image: linear-gradient(var(--color-white) -125%, var(--color-user)); background-image: linear-gradient(var(--color-white) -300%, var(--color-user));
} }
&__media { &__media {

View File

@ -21,7 +21,7 @@
padding: 0; padding: 0;
} }
.multiline-menu-item { .multiline-item {
flex-grow: 1; flex-grow: 1;
} }

View File

@ -20,4 +20,5 @@
.title { .title {
font-weight: 500; font-weight: 500;
color: var(--color-text-secondary); color: var(--color-text-secondary);
padding-left: 1rem;
} }

View File

@ -1,20 +1,3 @@
.self {
margin: 0 -0.5rem 0.75rem;
overflow: hidden;
&:global(.ghost) {
margin: 0;
}
.info {
padding-bottom: 0.75rem;
}
.status {
line-height: 1rem;
}
}
.fallbackPhoto { .fallbackPhoto {
position: absolute; position: absolute;
z-index: 1; z-index: 1;

View File

@ -291,7 +291,7 @@ const ProfileInfo: FC<OwnProps & StateProps> = ({
return ( return (
<div <div
className={buildClassName('ProfileInfo', forceShowSelf && styles.self)} className={buildClassName('ProfileInfo')}
dir={lang.isRtl ? 'rtl' : undefined} dir={lang.isRtl ? 'rtl' : undefined}
> >
<div className={styles.photoWrapper}> <div className={styles.photoWrapper}>

View File

@ -17,7 +17,7 @@
max-height: 100%; max-height: 100%;
} }
.multiline-menu-item { .multiline-item {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;

View File

@ -85,7 +85,7 @@ const StickerSetCard: FC<OwnProps> = ({
onClick={handleCardClick} onClick={handleCardClick}
> >
{renderPreview()} {renderPreview()}
<div className="multiline-menu-item"> <div className="multiline-item">
<div className="title">{stickerSet.title}</div> <div className="title">{stickerSet.title}</div>
<div className="subtitle">{lang('StickerPack.StickerCount', stickerSet.count, 'i')}</div> <div className="subtitle">{lang('StickerPack.StickerCount', stickerSet.count, 'i')}</div>
</div> </div>

View File

@ -56,7 +56,7 @@
.site-title { .site-title {
font-size: 1rem; font-size: 1rem;
font-weight: 400; font-weight: var(--font-weight-medium);
margin-bottom: 0.0625rem; margin-bottom: 0.0625rem;
line-height: 1.3125rem; line-height: 1.3125rem;
} }

View File

@ -12,7 +12,8 @@
left: 50%; left: 50%;
transform: translate(-50%, -50%) translate(6px, -6px) rotate(45deg); transform: translate(-50%, -50%) translate(6px, -6px) rotate(45deg);
font-size: 0.625rem; font-size: 0.6875rem;
font-weight: var(--font-weight-semibold);
color: var(--color-white); color: var(--color-white);
white-space: nowrap; white-space: nowrap;
} }

View File

@ -7,7 +7,7 @@ import type { ObserveFn } from '../../../hooks/useIntersectionObserver';
import type { OldLangFn } from '../../../hooks/useOldLang'; import type { OldLangFn } from '../../../hooks/useOldLang';
import type { TextPart } from '../../../types'; import type { TextPart } from '../../../types';
import { SERVICE_NOTIFICATIONS_USER_ID } from '../../../config'; import { SERVICE_NOTIFICATIONS_USER_ID, STARS_CURRENCY_CODE } from '../../../config';
import { import {
getChatTitle, getChatTitle,
getExpiredMessageDescription, getExpiredMessageDescription,
@ -168,12 +168,19 @@ export function renderActionMessageText(
} }
if (unprocessed.includes('%gift_payment_amount%')) { if (unprocessed.includes('%gift_payment_amount%')) {
const price = formatCurrencyAsString(amount!, currency!, oldLang.code); let priceText;
let priceText = price;
if (giftCryptoInfo) { if (currency && currency === STARS_CURRENCY_CODE) {
const cryptoPrice = formatCurrencyAsString(giftCryptoInfo.amount, giftCryptoInfo.currency, oldLang.code); priceText = oldLang('ActionGiftStarsTitle', amount!);
priceText = `${cryptoPrice} (${price})`; } else {
const price = formatCurrencyAsString(amount!, currency!, oldLang.code);
if (giftCryptoInfo) {
const cryptoPrice = formatCurrencyAsString(giftCryptoInfo.amount, giftCryptoInfo.currency, oldLang.code);
priceText = `${cryptoPrice} (${price})`;
} else {
priceText = price;
}
} }
processed = processPlaceholder( processed = processPlaceholder(

View File

@ -29,6 +29,17 @@ const StarIcon: FC<OwnProps> = ({
const randomId = useUniqueId(); const randomId = useUniqueId();
const validSvgRandomId = `svg-${randomId}`; // ID must start with a letter const validSvgRandomId = `svg-${randomId}`; // ID must start with a letter
const renderIcon = () => {
switch (type) {
case 'gold':
return <GoldStarIcon randomId={validSvgRandomId} />;
case 'premium':
return <PremiumStarIcon randomId={validSvgRandomId} />;
default:
return <RegularStarIcon />;
}
};
return ( return (
<i <i
onClick={onClick} onClick={onClick}
@ -41,11 +52,7 @@ const StarIcon: FC<OwnProps> = ({
)} )}
style={style} style={style}
> >
{type === 'gold' {renderIcon()}
? <GoldStarIcon randomId={validSvgRandomId} />
: type === 'premium'
? <PremiumStarIcon randomId={validSvgRandomId} />
: <RegularStarIcon />}
</i> </i>
); );
}; };

View File

@ -57,6 +57,7 @@
} }
.subtitle { .subtitle {
padding-bottom: 0.3125rem;
font-size: 0.875rem; font-size: 0.875rem;
color: var(--color-text-secondary); color: var(--color-text-secondary);
grid-row: 2; grid-row: 2;
@ -87,7 +88,7 @@
.startInput { .startInput {
grid-row: 1 / 3; grid-row: 1 / 3;
grid-column: 1; grid-column: 1;
margin-inline-end: 1.25rem; margin-inline-end: 1.1875rem;
} }
.endInput { .endInput {

View File

@ -23,7 +23,7 @@
} }
.SearchInput { .SearchInput {
margin-left: 0.8125rem; margin-left: 0.625rem;
max-width: calc(100% - 3.25rem); max-width: calc(100% - 3.25rem);
@media (max-width: 600px) { @media (max-width: 600px) {

View File

@ -1,5 +1,9 @@
.root { .root {
--background-color: var(--color-background); --background-color: var(--color-background);
:global(.ListItem-button) {
min-height: auto;
}
} }
.minimized { .minimized {

View File

@ -41,11 +41,11 @@
.section-heading { .section-heading {
position: relative; position: relative;
padding-top: 0.625rem; padding-top: 0.625rem;
padding-left: 1.75rem; padding-left: 0.5rem;
margin: 0 0 1rem -1.25rem !important; margin-bottom: 1rem;
font-weight: 500; font-weight: 500;
font-size: 0.9375rem; font-size: 1rem;
color: var(--color-text-secondary); color: var(--color-text-secondary);
&-first { &-first {
@ -73,10 +73,6 @@
.LeftSearch .search-section .section-heading, .LeftSearch .search-section .section-heading,
.RecentContacts .search-section .section-heading { .RecentContacts .search-section .section-heading {
margin-left: -0.5rem !important;
padding-left: 1.125rem;
width: calc(100% + 0.625rem);
&::before { &::before {
display: none; display: none;
} }
@ -86,10 +82,6 @@
} }
} }
.RecentContacts .search-section {
padding-inline: 0.5rem;
}
.WebLink { .WebLink {
display: flex; display: flex;
} }
@ -194,21 +186,18 @@
} }
.search-section { .search-section {
padding-inline: 0.5rem; padding: 0.5rem;
@include mixins.adapt-padding-to-scrollbar(0.5rem); @include mixins.adapt-padding-to-scrollbar(0.5rem);
.section-heading { .section-heading {
color: var(--color-text-secondary);
font-size: 0.9375rem;
font-weight: 500;
margin-bottom: 0.625rem !important; margin-bottom: 0.625rem !important;
.Link { .Link {
float: right; float: right;
color: var(--color-links); color: var(--color-links);
font-weight: 500; font-weight: 500;
margin-right: 1.5rem; margin-right: 0.5rem;
transition: opacity 0.15s ease-in; transition: opacity 0.15s ease-in;
&:active, &:active,

View File

@ -12,6 +12,10 @@
.left-header { .left-header {
padding-right: 0.8125rem; padding-right: 0.8125rem;
} }
.self-profile .ProfileInfo {
margin: -0.5rem 0 0.75rem -0.5rem;
}
} }
.settings-main-header { .settings-main-header {
@ -105,24 +109,14 @@
.settings-main-menu { .settings-main-menu {
padding: 0.5rem; padding: 0.5rem;
@include mixins.adapt-padding-to-scrollbar(0.5rem);
@include mixins.side-panel-section; @include mixins.side-panel-section;
> .ChatExtra {
padding: 0 0.5rem 0.3125rem;
margin: 0 -0.5rem 0.625rem;
@include mixins.side-panel-section;
.ListItem.narrow {
margin-bottom: 0.25rem;
}
}
.ListItem.narrow:not(.multiline) { .ListItem.narrow:not(.multiline) {
margin-bottom: 0; margin-bottom: 0;
.ListItem-button { .ListItem-button {
padding: 1rem; min-height: 3.5rem;
} }
} }
} }
@ -145,8 +139,8 @@
&-header { &-header {
font-size: 1rem; font-size: 1rem;
font-weight: var(--font-weight-semibold);
color: var(--color-text-secondary); color: var(--color-text-secondary);
margin-bottom: 1.25rem;
padding-inline-start: 1rem; padding-inline-start: 1rem;
position: relative; position: relative;
} }
@ -201,13 +195,9 @@
margin-bottom: 0; margin-bottom: 0;
} }
.multiline-menu-item { .multiline-item {
white-space: initial; .subtitle.tight {
flex-grow: 1; line-height: 1rem;
&.full-size {
width: 100%;
overflow: hidden;
} }
.date { .date {
@ -216,35 +206,6 @@
margin-left: 1rem; margin-left: 1rem;
color: var(--color-text-secondary); color: var(--color-text-secondary);
} }
.title,
.subtitle {
display: block;
text-align: left;
}
.title {
line-height: 1.25rem;
}
.subtitle {
font-size: 0.875rem;
line-height: 1.5rem;
color: var(--color-text-secondary);
& + .subtitle {
margin-top: -0.25rem;
}
&.black {
color: var(--color-text);
}
&.tight {
line-height: 1.3125rem;
margin-bottom: 0.1875rem;
}
}
} }
&.destructive { &.destructive {
@ -291,17 +252,10 @@
} }
&[dir="rtl"] { &[dir="rtl"] {
.multiline-menu-item { .multiline-item .date {
.title, float: left;
.subtitle { margin-left: 0;
text-align: right; margin-right: 1rem;
}
.date {
float: left;
margin-left: 0;
margin-right: 1rem;
}
} }
} }
} }
@ -321,13 +275,8 @@
} }
} }
.Radio + .Radio,
.Checkbox + .Checkbox {
margin-top: 2rem;
}
> .Checkbox, > .Radio { > .Checkbox, > .Radio {
padding-inline-start: 4.25rem; padding-inline-start: 4.1875rem;
} }
&__current-value { &__current-value {
@ -342,8 +291,8 @@
padding-block: 0; padding-block: 0;
} }
.settings-picker-title { .settings-input {
margin-inline-start: var(--picker-title-shift); padding: 0.5rem 1rem 0 1rem;
} }
.settings-fab-wrapper { .settings-fab-wrapper {
@ -366,7 +315,7 @@
} }
.settings-edit-profile { .settings-edit-profile {
padding: 0 1.5rem; padding: 0 1.5rem !important;
} }
.settings-quick-reaction { .settings-quick-reaction {
@ -384,6 +333,7 @@
.settings-dropdown-section { .settings-dropdown-section {
.DropdownList { .DropdownList {
position: relative; position: relative;
padding: 0 0 0 3rem;
&--open { &--open {
transform: translate(0, 0); transform: translate(0, 0);
@ -412,3 +362,7 @@
.block-user-button { .block-user-button {
z-index: var(--z-chat-float-button); z-index: var(--z-chat-float-button);
} }
.settings-button {
font-weight: var(--font-weight-semibold);
}

View File

@ -150,7 +150,7 @@ const SettingsActiveSessions: FC<OwnProps & StateProps> = ({
</h4> </h4>
<ListItem narrow inactive icon={`device-${getSessionIcon(session)}`} iconClassName="icon-device"> <ListItem narrow inactive icon={`device-${getSessionIcon(session)}`} iconClassName="icon-device">
<div className="multiline-menu-item full-size" dir="auto"> <div className="multiline-item full-size" dir="auto">
<span className="title" dir="auto">{session.deviceModel}</span> <span className="title" dir="auto">{session.deviceModel}</span>
<span className="subtitle black tight"> <span className="subtitle black tight">
{session.appName} {session.appVersion}, {session.platform} {session.systemVersion} {session.appName} {session.appVersion}, {session.platform} {session.systemVersion}
@ -224,7 +224,7 @@ const SettingsActiveSessions: FC<OwnProps & StateProps> = ({
iconClassName="icon-device" iconClassName="icon-device"
onClick={() => { handleOpenSessionModal(session.hash); }} onClick={() => { handleOpenSessionModal(session.hash); }}
> >
<div className="multiline-menu-item full-size" dir="auto"> <div className="multiline-item full-size" dir="auto">
<span className="date">{formatPastTimeShort(lang, session.dateActive * 1000)}</span> <span className="date">{formatPastTimeShort(lang, session.dateActive * 1000)}</span>
<span className="title">{session.deviceModel}</span> <span className="title">{session.deviceModel}</span>
<span className="subtitle black tight"> <span className="subtitle black tight">

View File

@ -111,7 +111,7 @@ const SettingsActiveWebsites: FC<OwnProps & StateProps> = ({
onClick={() => handleOpenSessionModal(session.hash)} onClick={() => handleOpenSessionModal(session.hash)}
> >
<Avatar className={styles.avatar} peer={bot} size="tiny" /> <Avatar className={styles.avatar} peer={bot} size="tiny" />
<div className="multiline-menu-item full-size" dir="auto"> <div className="multiline-item full-size" dir="auto">
<span className="date">{formatPastTimeShort(lang, session.dateActive * 1000)}</span> <span className="date">{formatPastTimeShort(lang, session.dateActive * 1000)}</span>
{bot && <FullNameTitle className={styles.title} peer={bot} />} {bot && <FullNameTitle className={styles.title} peer={bot} />}
<span className={buildClassName('subtitle', 'black', 'tight', styles.platform)}> <span className={buildClassName('subtitle', 'black', 'tight', styles.platform)}>

View File

@ -247,13 +247,15 @@ const SettingsEditProfile: FC<OwnProps & StateProps> = ({
<div className="settings-item"> <div className="settings-item">
<h4 className="settings-item-header" dir={lang.isRtl ? 'rtl' : undefined}>{lang('Username')}</h4> <h4 className="settings-item-header" dir={lang.isRtl ? 'rtl' : undefined}>{lang('Username')}</h4>
<UsernameInput <div className="settings-input">
currentUsername={currentUsername} <UsernameInput
isLoading={isLoading} currentUsername={currentUsername}
isUsernameAvailable={isUsernameAvailable} isLoading={isLoading}
checkedUsername={checkedUsername} isUsernameAvailable={isUsernameAvailable}
onChange={handleUsernameChange} checkedUsername={checkedUsername}
/> onChange={handleUsernameChange}
/>
</div>
{editUsernameError === USERNAME_PURCHASE_ERROR && renderPurchaseLink()} {editUsernameError === USERNAME_PURCHASE_ERROR && renderPurchaseLink()}
<p className="settings-item-description" dir={lang.isRtl ? 'rtl' : undefined}> <p className="settings-item-description" dir={lang.isRtl ? 'rtl' : undefined}>

View File

@ -159,7 +159,7 @@ const SettingsLanguage: FC<OwnProps & StateProps> = ({
</div> </div>
)} )}
<div className="settings-item settings-item-picker"> <div className="settings-item settings-item-picker">
<h4 className="settings-item-header settings-picker-title"> <h4 className="settings-item-header">
{lang('Localization.InterfaceLanguage')} {lang('Localization.InterfaceLanguage')}
</h4> </h4>
{options ? ( {options ? (

View File

@ -82,7 +82,7 @@ const SettingsMain: FC<OwnProps & StateProps> = ({
return ( return (
<div className="settings-content custom-scroll"> <div className="settings-content custom-scroll">
<div className="settings-main-menu"> <div className="settings-main-menu self-profile">
{currentUserId && ( {currentUserId && (
<ProfileInfo <ProfileInfo
peerId={currentUserId} peerId={currentUserId}
@ -96,6 +96,8 @@ const SettingsMain: FC<OwnProps & StateProps> = ({
isInSettings isInSettings
/> />
)} )}
</div>
<div className="settings-main-menu">
<ListItem <ListItem
icon="settings" icon="settings"
narrow narrow

View File

@ -164,7 +164,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
hasPasscode ? SettingsScreens.PasscodeEnabled : SettingsScreens.PasscodeDisabled, hasPasscode ? SettingsScreens.PasscodeEnabled : SettingsScreens.PasscodeDisabled,
)} )}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('Passcode')}</span> <span className="title">{oldLang('Passcode')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{oldLang(hasPasscode ? 'PasswordOn' : 'PasswordOff')} {oldLang(hasPasscode ? 'PasswordOn' : 'PasswordOff')}
@ -180,7 +180,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled, hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled,
)} )}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('TwoStepVerification')}</span> <span className="title">{oldLang('TwoStepVerification')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{oldLang(hasPassword ? 'PasswordOn' : 'PasswordOff')} {oldLang(hasPassword ? 'PasswordOn' : 'PasswordOff')}
@ -209,7 +209,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
// eslint-disable-next-line react/jsx-no-bind // eslint-disable-next-line react/jsx-no-bind
onClick={() => onScreenSelect(SettingsScreens.PrivacyPhoneNumber)} onClick={() => onScreenSelect(SettingsScreens.PrivacyPhoneNumber)}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('PrivacyPhoneTitle')}</span> <span className="title">{oldLang('PrivacyPhoneTitle')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{getVisibilityValue(privacy.phoneNumber)} {getVisibilityValue(privacy.phoneNumber)}
@ -222,7 +222,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
// eslint-disable-next-line react/jsx-no-bind // eslint-disable-next-line react/jsx-no-bind
onClick={() => onScreenSelect(SettingsScreens.PrivacyLastSeen)} onClick={() => onScreenSelect(SettingsScreens.PrivacyLastSeen)}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('LastSeenTitle')}</span> <span className="title">{oldLang('LastSeenTitle')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{getVisibilityValue(privacy.lastSeen)} {getVisibilityValue(privacy.lastSeen)}
@ -235,7 +235,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
// eslint-disable-next-line react/jsx-no-bind // eslint-disable-next-line react/jsx-no-bind
onClick={() => onScreenSelect(SettingsScreens.PrivacyProfilePhoto)} onClick={() => onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('PrivacyProfilePhotoTitle')}</span> <span className="title">{oldLang('PrivacyProfilePhotoTitle')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{getVisibilityValue(privacy.profilePhoto)} {getVisibilityValue(privacy.profilePhoto)}
@ -248,7 +248,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
// eslint-disable-next-line react/jsx-no-bind // eslint-disable-next-line react/jsx-no-bind
onClick={() => onScreenSelect(SettingsScreens.PrivacyBio)} onClick={() => onScreenSelect(SettingsScreens.PrivacyBio)}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('PrivacyBio')}</span> <span className="title">{oldLang('PrivacyBio')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{getVisibilityValue(privacy.bio)} {getVisibilityValue(privacy.bio)}
@ -261,7 +261,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
// eslint-disable-next-line react/jsx-no-bind // eslint-disable-next-line react/jsx-no-bind
onClick={() => onScreenSelect(SettingsScreens.PrivacyBirthday)} onClick={() => onScreenSelect(SettingsScreens.PrivacyBirthday)}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('PrivacyBirthday')}</span> <span className="title">{oldLang('PrivacyBirthday')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{getVisibilityValue(privacy.birthday)} {getVisibilityValue(privacy.birthday)}
@ -274,7 +274,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
// eslint-disable-next-line react/jsx-no-bind // eslint-disable-next-line react/jsx-no-bind
onClick={() => onScreenSelect(SettingsScreens.PrivacyGifts)} onClick={() => onScreenSelect(SettingsScreens.PrivacyGifts)}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{lang('PrivacyGifts')}</span> <span className="title">{lang('PrivacyGifts')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{getVisibilityValue(privacy.gifts)} {getVisibilityValue(privacy.gifts)}
@ -287,7 +287,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
// eslint-disable-next-line react/jsx-no-bind // eslint-disable-next-line react/jsx-no-bind
onClick={() => onScreenSelect(SettingsScreens.PrivacyForwarding)} onClick={() => onScreenSelect(SettingsScreens.PrivacyForwarding)}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('PrivacyForwardsTitle')}</span> <span className="title">{oldLang('PrivacyForwardsTitle')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{getVisibilityValue(privacy.forwards)} {getVisibilityValue(privacy.forwards)}
@ -300,7 +300,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
// eslint-disable-next-line react/jsx-no-bind // eslint-disable-next-line react/jsx-no-bind
onClick={() => onScreenSelect(SettingsScreens.PrivacyPhoneCall)} onClick={() => onScreenSelect(SettingsScreens.PrivacyPhoneCall)}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('WhoCanCallMe')}</span> <span className="title">{oldLang('WhoCanCallMe')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{getVisibilityValue(privacy.phoneCall)} {getVisibilityValue(privacy.phoneCall)}
@ -315,7 +315,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
// eslint-disable-next-line react/jsx-no-bind // eslint-disable-next-line react/jsx-no-bind
onClick={() => onScreenSelect(SettingsScreens.PrivacyVoiceMessages)} onClick={() => onScreenSelect(SettingsScreens.PrivacyVoiceMessages)}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('PrivacyVoiceMessagesTitle')}</span> <span className="title">{oldLang('PrivacyVoiceMessagesTitle')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{getVisibilityValue(privacy.voiceMessages)} {getVisibilityValue(privacy.voiceMessages)}
@ -329,7 +329,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
// eslint-disable-next-line react/jsx-no-bind // eslint-disable-next-line react/jsx-no-bind
onClick={() => onScreenSelect(SettingsScreens.PrivacyMessages)} onClick={() => onScreenSelect(SettingsScreens.PrivacyMessages)}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('PrivacyMessagesTitle')}</span> <span className="title">{oldLang('PrivacyMessagesTitle')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{shouldNewNonContactPeersRequirePremium {shouldNewNonContactPeersRequirePremium
@ -344,7 +344,7 @@ const SettingsPrivacy: FC<OwnProps & StateProps> = ({
// eslint-disable-next-line react/jsx-no-bind // eslint-disable-next-line react/jsx-no-bind
onClick={() => onScreenSelect(SettingsScreens.PrivacyGroupChats)} onClick={() => onScreenSelect(SettingsScreens.PrivacyGroupChats)}
> >
<div className="multiline-menu-item"> <div className="multiline-item">
<span className="title">{oldLang('WhoCanAddMe')}</span> <span className="title">{oldLang('WhoCanAddMe')}</span>
<span className="subtitle" dir="auto"> <span className="subtitle" dir="auto">
{getVisibilityValue(privacy.chatInvite)} {getVisibilityValue(privacy.chatInvite)}

View File

@ -327,7 +327,7 @@ function PrivacySubsection({
onScreenSelect(allowedContactsScreen); onScreenSelect(allowedContactsScreen);
}} }}
> >
<div className="multiline-menu-item full-size"> <div className="multiline-item full-size">
<span className="title">{oldLang('AlwaysAllow')}</span> <span className="title">{oldLang('AlwaysAllow')}</span>
<span className="subtitle">{allowedString}</span> <span className="subtitle">{allowedString}</span>
</div> </div>
@ -342,7 +342,7 @@ function PrivacySubsection({
onScreenSelect(deniedContactsScreen); onScreenSelect(deniedContactsScreen);
}} }}
> >
<div className="multiline-menu-item full-size"> <div className="multiline-item full-size">
<span className="title">{oldLang('NeverAllow')}</span> <span className="title">{oldLang('NeverAllow')}</span>
<span className="subtitle">{blockString}</span> <span className="subtitle">{blockString}</span>
</div> </div>

View File

@ -99,6 +99,14 @@
padding-inline-end: 3rem; padding-inline-end: 3rem;
} }
.settings-sortable-item .Button {
margin-right: -1rem;
&:hover,
&:active {
background-color: transparent !important;
}
}
.picker-category-title { .picker-category-title {
padding-top: 0.75rem; padding-top: 0.75rem;
} }

View File

@ -22,6 +22,7 @@ import useOldLang from '../../../../hooks/useOldLang';
import usePreviousDeprecated from '../../../../hooks/usePreviousDeprecated'; import usePreviousDeprecated from '../../../../hooks/usePreviousDeprecated';
import AnimatedIcon from '../../../common/AnimatedIcon'; import AnimatedIcon from '../../../common/AnimatedIcon';
import Icon from '../../../common/icons/Icon';
import Button from '../../../ui/Button'; import Button from '../../../ui/Button';
import Draggable from '../../../ui/Draggable'; import Draggable from '../../../ui/Draggable';
import ListItem from '../../../ui/ListItem'; import ListItem from '../../../ui/ListItem';
@ -206,7 +207,7 @@ const SettingsFoldersMain: FC<OwnProps & StateProps> = ({
{canCreateNewFolder && ( {canCreateNewFolder && (
<Button <Button
// TODO: Refactor button component to handle icon placemenet with props // TODO: Refactor button component to handle icon placemenet with props
className="with-icon mb-2" className="settings-button with-icon mb-2"
color="primary" color="primary"
size="smaller" size="smaller"
pill pill
@ -214,7 +215,7 @@ const SettingsFoldersMain: FC<OwnProps & StateProps> = ({
onClick={handleCreateFolder} onClick={handleCreateFolder}
isRtl={lang.isRtl} isRtl={lang.isRtl}
> >
<i className="icon icon-add" /> <Icon name="add" />
{lang('CreateNewFilter')} {lang('CreateNewFilter')}
</Button> </Button>
)} )}

View File

@ -44,7 +44,7 @@
} }
.dropdownList { .dropdownList {
padding-left: 3.1875rem; padding-left: 2.6875rem;
margin-block: -0.375rem; margin-block: -0.375rem;
} }

View File

@ -240,9 +240,9 @@
background: var(--pattern-color); background: var(--pattern-color);
color: white; color: white;
font-size: calc(var(--message-text-size, 1rem) - 0.0625rem); font-size: calc(var(--message-text-size, 1rem) - 0.0625rem);
font-weight: 500; font-weight: var(--font-weight-medium);
line-height: 1.75; line-height: 1rem;
padding: 0 0.5rem; padding: 0.1875rem 0.5rem;
border-radius: var(--border-radius-messages); border-radius: var(--border-radius-messages);
word-break: break-word; word-break: break-word;
position: relative; position: relative;
@ -250,8 +250,8 @@
body.is-ios &, body.is-ios &,
body.is-macos & { body.is-macos & {
font-size: calc(var(--message-text-size, 1rem) - 0.125rem); font-size: calc(var(--message-text-size, 1rem) - 0.0625rem);
line-height: calc(var(--message-text-size, 1rem) + 0.2rem); line-height: calc(var(--message-text-size, 1rem) + 0.09375rem);
} }
.emoji-small { .emoji-small {
@ -283,6 +283,7 @@
margin-top: 0.5rem; margin-top: 0.5rem;
cursor: var(--custom-cursor, pointer); cursor: var(--custom-cursor, pointer);
outline: none; outline: none;
font-weight: var(--font-weight-semibold);
} }
.action-message-gift-code { .action-message-gift-code {
@ -300,8 +301,8 @@
.action-message-user-caption { .action-message-user-caption {
align-items: center; align-items: center;
font-size: 0.875rem; font-size: 0.9375rem;
font-weight: 500; font-weight: var(--font-weight-semibold);
} }
.action-message-user-avatar { .action-message-user-avatar {
@ -317,7 +318,7 @@
.action-message-gift-subtitle { .action-message-gift-subtitle {
font-weight: normal; font-weight: normal;
text-wrap: balance; text-wrap: balance;
font-size: 0.75rem; font-size: 0.8125rem;
} }
.action-message-suggested-avatar { .action-message-suggested-avatar {
@ -341,10 +342,11 @@
.action-message-button { .action-message-button {
position: relative; position: relative;
display: inline-block; display: inline-block;
border-radius: var(--border-radius-default); border-radius: var(--border-radius-modal);
padding: 0.5rem 0.75rem; padding: 0.5rem 1.5rem;
margin-top: 0.5rem; margin-top: 0.6875rem;
background-color: var(--pattern-color); background-color: var(--pattern-color);
font-weight: var(--font-weight-semibold);
} }
.sticky-date { .sticky-date {

View File

@ -39,7 +39,6 @@
.Checkbox, .Checkbox,
.Radio { .Radio {
padding-left: 2.25rem; padding-left: 2.25rem;
margin-bottom: 1.5rem;
&:last-child { &:last-child {
margin-bottom: 0.75rem; margin-bottom: 0.75rem;
@ -54,6 +53,10 @@
cursor: var(--custom-cursor, not-allowed); cursor: var(--custom-cursor, not-allowed);
} }
&:hover {
background: none;
}
.Checkbox-main, .Checkbox-main,
.Radio-main { .Radio-main {
&::before { &::before {

View File

@ -3,7 +3,7 @@
margin-top: 0.25rem; margin-top: 0.25rem;
margin-bottom: 0.125rem; margin-bottom: 0.125rem;
padding-block: 0.1875rem; padding-block: 0.1875rem;
font-size: calc(var(--message-text-size, 1rem) - 0.125rem); font-size: calc(var(--message-text-size, 1rem) - 0.0625rem);
line-height: 1.125rem; line-height: 1.125rem;
max-width: 29rem; max-width: 29rem;
background-color: var(--accent-background-color); background-color: var(--accent-background-color);
@ -168,12 +168,12 @@
.site-name { .site-name {
color: var(--accent-color); color: var(--accent-color);
font-weight: 500; font-weight: var(--font-weight-semibold);
margin-bottom: 0.125rem; margin-bottom: 0.125rem;
} }
.site-title { .site-title {
font-weight: 500; font-weight: var(--font-weight-semibold);
margin-bottom: 0.125rem; margin-bottom: 0.125rem;
} }

View File

@ -302,7 +302,7 @@
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
font-size: calc(var(--message-text-size, 1rem) - 0.125rem); font-size: calc(var(--message-text-size, 1rem) - 0.125rem);
font-weight: 500; font-weight: var(--font-weight-medium);
line-height: 1.25rem; line-height: 1.25rem;
color: var(--accent-color); color: var(--accent-color);
unicode-bidi: plaintext; unicode-bidi: plaintext;

View File

@ -122,6 +122,7 @@
.counter { .counter {
margin-inline-end: 0.125rem; margin-inline-end: 0.125rem;
font-weight: var(--font-weight-semibold);
} }
.disabled { .disabled {

View File

@ -4,7 +4,8 @@
width: 100%; width: 100%;
flex-wrap: wrap; flex-wrap: wrap;
gap: 0.375rem; gap: 0.375rem;
margin-top: 0.375rem; margin-top: 0.25rem;
margin-bottom: 0.1875rem;
overflow: visible; overflow: visible;
max-width: calc(var(--max-width) + 2.25rem); max-width: calc(var(--max-width) + 2.25rem);

View File

@ -128,7 +128,7 @@
.main-button { .main-button {
display: flex; display: flex;
font-weight: 500; font-weight: var(--font-weight-semibold);
font-size: 1rem; font-size: 1rem;
height: 3rem; height: 3rem;
} }

View File

@ -12,6 +12,7 @@ import { getUserFullName } from '../../../global/helpers';
import { selectTabState, selectTheme, selectUser } from '../../../global/selectors'; import { selectTabState, selectTheme, selectUser } from '../../../global/selectors';
import buildClassName from '../../../util/buildClassName'; import buildClassName from '../../../util/buildClassName';
import { formatCurrency } from '../../../util/formatCurrency'; import { formatCurrency } from '../../../util/formatCurrency';
import { formatStarsAsIcon } from '../../../util/localization/format';
import useLang from '../../../hooks/useLang'; import useLang from '../../../hooks/useLang';
import useLastCallback from '../../../hooks/useLastCallback'; import useLastCallback from '../../../hooks/useLastCallback';
@ -174,7 +175,7 @@ function GiftComposer({
const userFullName = getUserFullName(user)!; const userFullName = getUserFullName(user)!;
const amount = isStarGift const amount = isStarGift
? formatCurrency(gift.stars, STARS_CURRENCY_CODE, lang.code, { iconClassName: 'star-amount-icon' }) ? formatStarsAsIcon(lang, gift.stars, true)
: formatCurrency(gift.amount, gift.currency); : formatCurrency(gift.amount, gift.currency);
return ( return (

View File

@ -52,7 +52,7 @@
font-size: 0.6875rem !important; font-size: 0.6875rem !important;
margin-top: 0.625rem; margin-top: 0.625rem;
line-height: 1; line-height: 1;
font-weight: 400 !important; font-weight: var(--font-weight-semibold) !important;
} }
.star { .star {

View File

@ -94,8 +94,8 @@
.commonHeaderText { .commonHeaderText {
font-size: 1.25rem; font-size: 1.25rem;
font-weight: 500; font-weight: var(--font-weight-medium);
margin: 0 0 0 3rem; margin: 0 0 0 4.5rem;
unicode-bidi: plaintext; unicode-bidi: plaintext;
} }

View File

@ -30,7 +30,7 @@
white-space: nowrap; white-space: nowrap;
width: auto; width: auto;
padding: 0.375rem 0.75rem; padding: 0.375rem 0.75rem;
font-weight: 500; font-weight: var(--font-weight-semibold);
color: var(--color-text-secondary); color: var(--color-text-secondary);
border-radius: 1rem; border-radius: 1rem;

View File

@ -8,6 +8,10 @@
} }
} }
.content {
padding: 0.5rem !important;
}
.modalTitle { .modalTitle {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -22,8 +26,8 @@
.optionText { .optionText {
width: 100%; width: 100%;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; white-space: normal;
white-space: nowrap; word-wrap: break-word;
} }
.option { .option {

View File

@ -173,6 +173,7 @@ const ReportModal = ({
isOpen={isOpen} isOpen={isOpen}
header={header} header={header}
onClose={closeReportMessageModalHandler} onClose={closeReportMessageModalHandler}
contentClassName={styles.content}
className={buildClassName(styles.root, modal?.subject === 'story' && 'component-theme-dark')} className={buildClassName(styles.root, modal?.subject === 'story' && 'component-theme-dark')}
> >
<Transition <Transition
@ -188,6 +189,7 @@ const ReportModal = ({
{renderingSection?.options?.map((option) => ( {renderingSection?.options?.map((option) => (
<ListItem <ListItem
narrow narrow
nonInteractive
secondaryIcon="next" secondaryIcon="next"
className={styles.option} className={styles.option}
buttonClassName={styles.optionButton} buttonClassName={styles.optionButton}

View File

@ -19,6 +19,7 @@
> .profile-info > .ChatExtra { > .profile-info > .ChatExtra {
padding: 0.875rem 0.5rem 0.5rem; padding: 0.875rem 0.5rem 0.5rem;
@include mixins.adapt-padding-to-scrollbar(0.5rem);
@include mixins.side-panel-section; @include mixins.side-panel-section;
.narrow { .narrow {
@ -126,6 +127,8 @@
&.gifts-list { &.gifts-list {
padding: 0.5rem; padding: 0.5rem;
@include mixins.adapt-padding-to-scrollbar(0.5rem);
@media (max-width: 600px) { @media (max-width: 600px) {
padding: 0.5rem 0; padding: 0.5rem 0;
} }

View File

@ -218,25 +218,26 @@ const ManageChannel: FC<OwnProps & StateProps> = ({
onChange={handleSetPhoto} onChange={handleSetPhoto}
disabled={!canChangeInfo} disabled={!canChangeInfo}
/> />
<InputText <div className="settings-edit">
id="channel-title" <InputText
label={lang('EnterChannelName')} id="channel-title"
onChange={handleTitleChange} label={lang('EnterChannelName')}
value={title} onChange={handleTitleChange}
error={error === CHANNEL_TITLE_EMPTY ? error : undefined} value={title}
disabled={!canChangeInfo} error={error === CHANNEL_TITLE_EMPTY ? error : undefined}
/> disabled={!canChangeInfo}
<TextArea />
id="channel-about" <TextArea
className="mb-2" id="channel-about"
label={lang('DescriptionPlaceholder')} label={lang('DescriptionPlaceholder')}
onChange={handleAboutChange} onChange={handleAboutChange}
value={about} value={about}
maxLength={CHANNEL_MAX_DESCRIPTION} maxLength={CHANNEL_MAX_DESCRIPTION}
maxLengthIndicator={(CHANNEL_MAX_DESCRIPTION - about.length).toString()} maxLengthIndicator={(CHANNEL_MAX_DESCRIPTION - about.length).toString()}
disabled={!canChangeInfo} disabled={!canChangeInfo}
noReplaceNewlines noReplaceNewlines
/> />
</div>
{chat.isCreator && ( {chat.isCreator && (
<ListItem icon="lock" multiline onClick={handleClickEditType}> <ListItem icon="lock" multiline onClick={handleClickEditType}>
<span className="title">{lang('ChannelType')}</span> <span className="title">{lang('ChannelType')}</span>

View File

@ -123,7 +123,7 @@ const ManageChatAdministrators: FC<OwnProps & StateProps> = ({
</div> </div>
<div className="section" dir={lang.isRtl ? 'rtl' : undefined}> <div className="section" dir={lang.isRtl ? 'rtl' : undefined}>
<p className="text-muted" dir="auto"> <p className="section-help" dir="auto">
{lang(isChannel {lang(isChannel
? 'Channel.Management.AddModeratorHelp' ? 'Channel.Management.AddModeratorHelp'
: 'Group.Management.AddModeratorHelp')} : 'Group.Management.AddModeratorHelp')}
@ -171,7 +171,7 @@ const ManageChatAdministrators: FC<OwnProps & StateProps> = ({
onChange={handleToggleProfiles} onChange={handleToggleProfiles}
/> />
</div> </div>
<p className="section-info"> <p className="section-info section-info_push">
{lang('ChannelSignProfilesInfo')} {lang('ChannelSignProfilesInfo')}
</p> </p>
</> </>

View File

@ -265,7 +265,7 @@ const ManageChatPrivacyType: FC<OwnProps & StateProps> = ({
options={forwardingOptions} options={forwardingOptions}
onChange={handleForwardingOptionChange} onChange={handleForwardingOptionChange}
/> />
<p className="section-info"> <p className="section-info section-info_push">
{isChannel {isChannel
? lang('ChannelVisibility.Forwarding.ChannelInfo') ? lang('ChannelVisibility.Forwarding.ChannelInfo')
: lang('ChannelVisibility.Forwarding.GroupInfo')} : lang('ChannelVisibility.Forwarding.GroupInfo')}

View File

@ -84,7 +84,7 @@ const ManageChatRemovedUsers: FC<OwnProps & StateProps> = ({
<div className="Management"> <div className="Management">
<div className="custom-scroll"> <div className="custom-scroll">
<div className="section" dir={lang.isRtl ? 'rtl' : undefined}> <div className="section" dir={lang.isRtl ? 'rtl' : undefined}>
<p className="text-muted">{lang(isChannel ? 'NoBlockedChannel2' : 'NoBlockedGroup2')}</p> <p className="section-help">{lang(isChannel ? 'NoBlockedChannel2' : 'NoBlockedGroup2')}</p>
{removedMembers.map((member) => ( {removedMembers.map((member) => (
<ListItem <ListItem

View File

@ -275,7 +275,7 @@ const ManageDiscussion: FC<OwnProps & StateProps> = ({
/> />
</div> </div>
)} )}
<p className="text-muted"> <p className="section-info section-info_push">
{isJoinToSend ? lang('ChannelSettingsJoinRequestInfo') : lang('ChannelSettingsJoinToSendInfo')} {isJoinToSend ? lang('ChannelSettingsJoinRequestInfo') : lang('ChannelSettingsJoinToSendInfo')}
</p> </p>
</div> </div>

View File

@ -328,25 +328,26 @@ const ManageGroup: FC<OwnProps & StateProps> = ({
onChange={handleSetPhoto} onChange={handleSetPhoto}
disabled={!canChangeInfo} disabled={!canChangeInfo}
/> />
<InputText <div className="settings-edit">
id="group-title" <InputText
label={lang('GroupName')} id="group-title"
onChange={handleTitleChange} label={lang('GroupName')}
value={title} onChange={handleTitleChange}
error={error === GROUP_TITLE_EMPTY ? error : undefined} value={title}
disabled={!canChangeInfo} error={error === GROUP_TITLE_EMPTY ? error : undefined}
/> disabled={!canChangeInfo}
<TextArea />
id="group-about" <TextArea
className="mb-2" id="group-about"
label={lang('DescriptionPlaceholder')} label={lang('DescriptionPlaceholder')}
maxLength={GROUP_MAX_DESCRIPTION} maxLength={GROUP_MAX_DESCRIPTION}
maxLengthIndicator={(GROUP_MAX_DESCRIPTION - about.length).toString()} maxLengthIndicator={(GROUP_MAX_DESCRIPTION - about.length).toString()}
onChange={handleAboutChange} onChange={handleAboutChange}
value={about} value={about}
disabled={!canChangeInfo} disabled={!canChangeInfo}
noReplaceNewlines noReplaceNewlines
/> />
</div>
{chat.isCreator && ( {chat.isCreator && (
<ListItem icon="lock" multiline onClick={handleClickEditType}> <ListItem icon="lock" multiline onClick={handleClickEditType}>
<span className="title">{lang('GroupType')}</span> <span className="title">{lang('GroupType')}</span>

View File

@ -35,7 +35,7 @@ type StateProps = {
members?: ApiChatMember[]; members?: ApiChatMember[];
}; };
const ITEM_HEIGHT = 24 + 12; const ITEM_HEIGHT = 24 + 20;
const BEFORE_ITEMS_COUNT = 2; const BEFORE_ITEMS_COUNT = 2;
const ITEMS_COUNT = 9; const ITEMS_COUNT = 9;

View File

@ -173,7 +173,7 @@ const ManageInvite: FC<OwnProps & StateProps> = ({
value={title} value={title}
onChange={handleTitleChange} onChange={handleTitleChange}
/> />
<p className="text-muted hint">{lang('LinkNameHelp')}</p> <p className="section-help hint">{lang('LinkNameHelp')}</p>
</div> </div>
<div className="section"> <div className="section">
<div className="section-header">{lang('LimitByPeriod')}</div> <div className="section-header">{lang('LimitByPeriod')}</div>
@ -209,7 +209,7 @@ const ManageInvite: FC<OwnProps & StateProps> = ({
{formatFullDate(lang, customExpireDate)} {formatTime(lang, customExpireDate)} {formatFullDate(lang, customExpireDate)} {formatTime(lang, customExpireDate)}
</Button> </Button>
)} )}
<p className="text-muted hint">{lang('TimeLimitHelp')}</p> <p className="section-help hint">{lang('TimeLimitHelp')}</p>
</div> </div>
{!isRequestNeeded && ( {!isRequestNeeded && (
<div className="section"> <div className="section">
@ -240,7 +240,7 @@ const ManageInvite: FC<OwnProps & StateProps> = ({
onChange={handleCustomUsageLimitChange} onChange={handleCustomUsageLimitChange}
/> />
)} )}
<p className="text-muted hint">{lang('UsesLimitHelp')}</p> <p className="section-help hint">{lang('UsesLimitHelp')}</p>
</div> </div>
)} )}
<FloatingActionButton <FloatingActionButton

View File

@ -82,7 +82,7 @@ const ManageInviteInfo: FC<OwnProps & StateProps> = ({
return ( return (
<div className="section"> <div className="section">
<p>{importers.length ? lang('PeopleJoined', usage) : lang('NoOneJoined')}</p> <p>{importers.length ? lang('PeopleJoined', usage) : lang('NoOneJoined')}</p>
<p className="text-muted"> <p className="section-help">
{!importers.length && ( {!importers.length && (
usageLimit ? lang('PeopleCanJoinViaLinkCount', usageLimit - usage) : lang('NoOneJoinedYet') usageLimit ? lang('PeopleCanJoinViaLinkCount', usageLimit - usage) : lang('NoOneJoinedYet')
)} )}
@ -115,7 +115,7 @@ const ManageInviteInfo: FC<OwnProps & StateProps> = ({
return ( return (
<div className="section"> <div className="section">
<p>{isChannel ? lang('SubscribeRequests') : lang('MemberRequests')}</p> <p>{isChannel ? lang('SubscribeRequests') : lang('MemberRequests')}</p>
<p className="text-muted"> <p className="section-help">
{requesters.map((requester) => ( {requesters.map((requester) => (
<ListItem <ListItem
className="chat-item-clickable scroll-item small-icon" className="chat-item-clickable scroll-item small-icon"
@ -138,7 +138,7 @@ const ManageInviteInfo: FC<OwnProps & StateProps> = ({
<div className="Management ManageInviteInfo"> <div className="Management ManageInviteInfo">
<div className="custom-scroll"> <div className="custom-scroll">
{!invite && ( {!invite && (
<p className="text-muted">{lang('Loading')}</p> <p className="section-help">{lang('Loading')}</p>
)} )}
{invite && ( {invite && (
<> <>
@ -152,7 +152,7 @@ const ManageInviteInfo: FC<OwnProps & StateProps> = ({
/> />
<Button className="copy-link" onClick={handleCopyClicked}>{lang('CopyLink')}</Button> <Button className="copy-link" onClick={handleCopyClicked}>{lang('CopyLink')}</Button>
{Boolean(expireDate) && ( {Boolean(expireDate) && (
<p className="text-muted"> <p className="section-help">
{isExpired {isExpired
? lang('ExpiredLink') ? lang('ExpiredLink')
: lang('LinkExpiresIn', `${formatFullDate(lang, expireDate)} ${formatTime(lang, expireDate)}`)} : lang('LinkExpiresIn', `${formatFullDate(lang, expireDate)} ${formatTime(lang, expireDate)}`)}

View File

@ -278,16 +278,18 @@ const ManageInvites: FC<OwnProps & StateProps> = ({
size={STICKER_SIZE_INVITES} size={STICKER_SIZE_INVITES}
className="section-icon" className="section-icon"
/> />
<p className="text-muted">{isChannel ? lang('PrimaryLinkHelpChannel') : lang('PrimaryLinkHelp')}</p> <p className="section-help">{isChannel ? lang('PrimaryLinkHelpChannel') : lang('PrimaryLinkHelp')}</p>
</div> </div>
{primaryInviteLink && ( {primaryInviteLink && (
<LinkField <div className="section">
className="section" <LinkField
link={primaryInviteLink} className="settings-input"
withShare link={primaryInviteLink}
onRevoke={!chat?.usernames ? handlePrimaryRevoke : undefined} withShare
title={chat?.usernames ? lang('PublicLink') : lang('lng_create_permanent_link_title')} onRevoke={!chat?.usernames ? handlePrimaryRevoke : undefined}
/> title={chat?.usernames ? lang('PublicLink') : lang('lng_create_permanent_link_title')}
/>
</div>
)} )}
<div className="section" teactFastList> <div className="section" teactFastList>
<Button isText key="create" className="create-link" onClick={handleCreateNewClick}> <Button isText key="create" className="create-link" onClick={handleCreateNewClick}>
@ -310,11 +312,11 @@ const ManageInvites: FC<OwnProps & StateProps> = ({
</span> </span>
</ListItem> </ListItem>
))} ))}
<p className="text-muted hint" key="links-hint">{lang('ManageLinksInfoHelp')}</p> <p className="section-help hint" key="links-hint">{lang('ManageLinksInfoHelp')}</p>
</div> </div>
{revokedExportedInvites && Boolean(revokedExportedInvites.length) && ( {revokedExportedInvites && Boolean(revokedExportedInvites.length) && (
<div className="section" teactFastList> <div className="section" teactFastList>
<p className="text-muted" key="title">{lang('RevokedLinks')}</p> <p className="section-help" key="title">{lang('RevokedLinks')}</p>
<ListItem <ListItem
icon="delete" icon="delete"
destructive destructive

View File

@ -89,7 +89,7 @@ const ManageJoinRequests: FC<OwnProps & StateProps> = ({
<Spinner key="loading" /> <Spinner key="loading" />
)} )}
{chat?.joinRequests?.length === 0 && ( {chat?.joinRequests?.length === 0 && (
<p className="text-muted" key="empty"> <p className="section-help" key="empty">
{isChannel ? lang('NoSubscribeRequestsDescription') : lang('NoMemberRequestsDescription')} {isChannel ? lang('NoSubscribeRequestsDescription') : lang('NoMemberRequestsDescription')}
</p> </p>
)} )}

View File

@ -204,7 +204,7 @@ const ManageReactions: FC<OwnProps & StateProps> = ({
renderValue={renderReactionsMaxCountValue} renderValue={renderReactionsMaxCountValue}
isCenteredLayout isCenteredLayout
/> />
<p className="section-info mt-4"> <p className="section-info section-info_push">
{lang('ChannelReactions.MaxCount.Info')} {lang('ChannelReactions.MaxCount.Info')}
</p> </p>
</div> </div>
@ -219,7 +219,7 @@ const ManageReactions: FC<OwnProps & StateProps> = ({
options={reactionsOptions} options={reactionsOptions}
onChange={handleReactionsOptionChange} onChange={handleReactionsOptionChange}
/> />
<p className="section-info mt-4"> <p className="section-info section-info_push">
{localEnabledReactions?.type === 'all' && lang('EnableAllReactionsInfo')} {localEnabledReactions?.type === 'all' && lang('EnableAllReactionsInfo')}
{localEnabledReactions?.type === 'some' && lang('EnableSomeReactionsInfo')} {localEnabledReactions?.type === 'some' && lang('EnableSomeReactionsInfo')}
{!localEnabledReactions && lang('DisableReactionsInfo')} {!localEnabledReactions && lang('DisableReactionsInfo')}

View File

@ -193,19 +193,21 @@ const ManageUser: FC<OwnProps & StateProps> = ({
noEmojiStatus noEmojiStatus
withFullInfo withFullInfo
/> />
<InputText <div className="settings-edit">
id="user-first-name" <InputText
label={lang('UserInfo.FirstNamePlaceholder')} id="user-first-name"
onChange={handleFirstNameChange} label={lang('UserInfo.FirstNamePlaceholder')}
value={firstName} onChange={handleFirstNameChange}
error={error === ERROR_FIRST_NAME_MISSING ? error : undefined} value={firstName}
/> error={error === ERROR_FIRST_NAME_MISSING ? error : undefined}
<InputText />
id="user-last-name" <InputText
label={lang('UserInfo.LastNamePlaceholder')} id="user-last-name"
onChange={handleLastNameChange} label={lang('UserInfo.LastNamePlaceholder')}
value={lastName} onChange={handleLastNameChange}
/> value={lastName}
/>
</div>
<div className="ListItem narrow"> <div className="ListItem narrow">
<Checkbox <Checkbox
checked={isNotificationsEnabled} checked={isNotificationsEnabled}
@ -242,7 +244,7 @@ const ManageUser: FC<OwnProps & StateProps> = ({
{lang('UserInfo.ResetCustomPhoto')} {lang('UserInfo.ResetCustomPhoto')}
</ListItem> </ListItem>
)} )}
<p className="text-muted" dir="auto">{lang('UserInfo.CustomPhotoInfo', user.firstName)}</p> <p className="section-help" dir="auto">{lang('UserInfo.CustomPhotoInfo', user.firstName)}</p>
</div> </div>
)} )}
<div className="section"> <div className="section">

View File

@ -18,6 +18,7 @@
.section { .section {
padding: 1rem 0.5rem; padding: 1rem 0.5rem;
@include mixins.adapt-padding-to-scrollbar(0.5rem);
@include mixins.side-panel-section; @include mixins.side-panel-section;
&.wide { &.wide {
@ -59,13 +60,6 @@
margin-right: 1.6875rem; margin-right: 1.6875rem;
} }
.multiline-item .subtitle {
line-height: 1.25rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
&.with-checkbox { &.with-checkbox {
body.is-ios &::after, body.is-ios &::after,
body.is-android &::after { body.is-android &::after {
@ -73,13 +67,6 @@
} }
} }
&.narrow {
.Checkbox {
margin-top: 1rem;
margin-bottom: 1rem;
}
}
&.exceptions-member { &.exceptions-member {
.ChatInfo .status { .ChatInfo .status {
white-space: pre-wrap; white-space: pre-wrap;
@ -88,9 +75,11 @@
} }
.section-heading { .section-heading {
font-weight: 500; font-size: 1rem;
font-size: 0.9375rem; font-weight: var(--font-weight-semibold);
color: var(--color-text-secondary); color: var(--color-text-secondary);
padding-inline-start: 1rem;
position: relative;
&[dir="auto"] { &[dir="auto"] {
text-align: initial; text-align: initial;
@ -98,6 +87,8 @@
} }
.section-help { .section-help {
padding: 0 1rem;
color: var(--color-text-secondary); color: var(--color-text-secondary);
line-height: 1.375rem; line-height: 1.375rem;
@ -109,10 +100,11 @@
.section-info { .section-info {
color: var(--color-text-secondary); color: var(--color-text-secondary);
font-size: 0.875rem; font-size: 0.875rem;
padding: 0 1rem;
} }
.section-info_push { .section-info_push {
margin-top: 0.5rem; margin-top: 0.25rem;
} }
&[dir="rtl"] { &[dir="rtl"] {
@ -126,6 +118,7 @@
.group-link { .group-link {
color: var(--color-text); color: var(--color-text);
padding-left: 1rem;
} }
.RangeSlider { .RangeSlider {
@ -133,34 +126,6 @@
margin-inline-start: 1rem; margin-inline-start: 1rem;
} }
.radio-group {
margin-block: 2rem;
margin-inline-start: 1rem;
.Radio {
padding-left: 3.5rem;
margin-bottom: 2rem;
&:last-child {
margin-bottom: 0.625rem;
}
}
.Radio-main {
&::before {
left: 0.125rem;
top: 0.25rem;
transform: none;
}
&::after {
left: 0.4375rem;
top: 0.5625rem;
transform: none;
}
}
}
.button-position { .button-position {
justify-content: initial; justify-content: initial;
} }
@ -303,12 +268,12 @@
transform: translateY(calc(-100%)); transform: translateY(calc(-100%));
position: absolute; position: absolute;
width: 100%; width: 100%;
left: 0; left: 0.125rem;
padding: 0 1.5rem 0 2.5rem; padding: 0 0.5rem 0 3.375rem;
background: var(--color-background); background: var(--color-background);
&--open { &--open {
transform: translateY(-0.75rem); transform: translateY(0.25rem);
} }
} }
@ -355,3 +320,7 @@
} }
} }
} }
.settings-edit {
padding: 0 1rem !important;
}

View File

@ -1,15 +1,29 @@
.Checkbox { .Checkbox {
display: block;
position: relative; position: relative;
padding-inline-start: 3.5rem; width: 100%;
min-height: 3rem;
display: flex;
align-items: center;
padding-inline-start: 4.25rem;
text-align: left; text-align: left;
margin-block: 0.75rem;
line-height: 1.375rem;
cursor: var(--custom-cursor, pointer); cursor: var(--custom-cursor, pointer);
margin-bottom: 0;
&:hover,
&:focus-visible {
background-color: var(--color-chat-hover);
border-radius: var(--border-radius-default);
}
&.disabled { &.disabled {
cursor: var(--custom-cursor, default); cursor: var(--custom-cursor, default);
opacity: 0.5; opacity: 0.5;
&:hover {
background: none !important;
}
} }
&.round { &.round {
@ -22,6 +36,7 @@
&.withIcon { &.withIcon {
padding-inline-start: 1rem; padding-inline-start: 1rem;
.Checkbox-main { .Checkbox-main {
&::before, &::before,
&::after { &::after {
@ -71,16 +86,19 @@
} }
.Checkbox-main { .Checkbox-main {
flex: 1;
&::before, &::before,
&::after { &::after {
pointer-events: none;
content: ""; content: "";
display: block; display: block;
position: absolute; position: absolute;
left: 1.125rem;
top: 0.125rem;
width: 1.25rem; width: 1.25rem;
height: 1.25rem; height: 1.25rem;
left: 1.125rem; // 1 + ((1.5 - 1.25) / 2)
top: 50%;
transform: translateY(-50%);
pointer-events: none;
} }
&::before { &::before {
@ -92,9 +110,7 @@
&::after { &::after {
/* stylelint-disable-next-line scss/operator-no-unspaced */ /* stylelint-disable-next-line scss/operator-no-unspaced */
background: background: center no-repeat url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEzLjkuOEw1LjggOC45IDIuMSA1LjJjLS40LS40LTEuMS0uNC0xLjYgMC0uNC40LS40IDEuMSAwIDEuNkw1IDExLjJjLjQuNCAxLjEuNCAxLjYgMGw4LjktOC45Yy40LS40LjQtMS4xIDAtMS42LS41LS40LTEuMi0uNC0xLjYuMXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIvPjwvc3ZnPg==);
center no-repeat
url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEzLjkuOEw1LjggOC45IDIuMSA1LjJjLS40LS40LTEuMS0uNC0xLjYgMC0uNC40LS40IDEuMSAwIDEuNkw1IDExLjJjLjQuNCAxLjEuNCAxLjYgMGw4LjktOC45Yy40LS40LjQtMS4xIDAtMS42LS41LS40LTEuMi0uNC0xLjYuMXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIvPjwvc3ZnPg==);
background-size: 0.875rem; background-size: 0.875rem;
opacity: 0; opacity: 0;
transition: opacity 0.1s ease; transition: opacity 0.1s ease;
@ -103,13 +119,15 @@
.label { .label {
display: flex; display: flex;
align-items: center; align-items: center;
text-align: initial; word-break: break-word;
flex-wrap: wrap; unicode-bidi: plaintext;
column-gap: 0.25rem; text-align: left;
line-height: 1.25rem;
} }
.right-icon { .right-icon {
margin-left: auto; margin-left: auto;
margin-right: 0.5rem;
color: var(--color-text-secondary); color: var(--color-text-secondary);
font-size: 1.25rem; font-size: 1.25rem;
} }
@ -119,17 +137,20 @@
font-size: 0.875rem; font-size: 0.875rem;
line-height: 1rem; line-height: 1rem;
color: var(--color-text-secondary); color: var(--color-text-secondary);
unicode-bidi: plaintext;
margin-top: 0.25rem; margin-top: 0.25rem;
} }
} }
&.withSubLabel { &.withSubLabel {
&:hover,
&:focus-visible {
background-color: var(--color-chat-hover);
border-radius: var(--border-radius-default);
}
.Checkbox-main { .Checkbox-main {
&::before, padding: 0.4375rem 0 0.5625rem 0;
&::after {
top: 0.875rem;
left: 1rem;
}
} }
} }
@ -140,8 +161,7 @@
content: ""; content: "";
display: block; display: block;
position: absolute; position: absolute;
left: 4.3125rem; left: 3.5rem;
top: 0.625rem;
width: 1.125rem; width: 1.125rem;
height: 1.125rem; height: 1.125rem;
} }
@ -189,19 +209,30 @@
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
gap: 0.3125rem; gap: 0.3125rem;
margin-bottom: 0.5625rem; margin-block: 0;
padding-inline-start: 4.1875rem; padding: 0 0 0 3.5rem;
.Checkbox-main {
&::before, &:hover,
&::after { &:focus-visible {
top: 0.875rem; background-color: var(--color-chat-hover);
left: 1.375rem; border-radius: var(--border-radius-default);
} }
}
&.withNestedList {
background-color: var(--color-background);
margin: 0;
&:hover,
&:focus-visible {
background-color: var(--color-chat-hover);
border-radius: var(--border-radius-default);
} }
} }
&.permission-group { &.permission-group {
padding-inline-start: 3.625rem; padding-inline-start: 3.625rem;
.Checkbox-main { .Checkbox-main {
&::before, &::before,
&::after { &::after {
@ -210,9 +241,12 @@
} }
} }
&.permission-group.withNestedList {
margin-bottom: 1rem;
}
&.avatar { &.avatar {
padding-inline-start: 6.625rem; padding-inline-start: 5.5rem;
margin-bottom: 1.125rem;
} }
.button { .button {
@ -232,8 +266,9 @@
} }
&.onlyInput { &.onlyInput {
padding-inline-start: 1.125rem; min-height: auto;
margin-block: 0 1.25rem; position: relative;
padding-inline-start: 0.8125rem;
.Checkbox-main { .Checkbox-main {
&::before, &::before,

View File

@ -122,6 +122,7 @@ const Checkbox: FC<OwnProps> = ({
Boolean(leftElement) && 'avatar', Boolean(leftElement) && 'avatar',
onlyInput && 'onlyInput', onlyInput && 'onlyInput',
isRound && 'round', isRound && 'round',
Boolean(rightIcon) && 'withNestedList',
className, className,
); );
@ -145,7 +146,11 @@ const Checkbox: FC<OwnProps> = ({
onChange={handleChange} onChange={handleChange}
onClick={onClickLabel ? handleInputClick : undefined} onClick={onClickLabel ? handleInputClick : undefined}
/> />
<div className={buildClassName('Checkbox-main', Boolean(leftElement) && 'Nested-avatar-list')}> <div className={buildClassName(
'Checkbox-main',
Boolean(leftElement) && 'Nested-avatar-list',
)}
>
<span className="label" dir="auto"> <span className="label" dir="auto">
{leftElement} {leftElement}
{typeof label === 'string' ? renderText(label) : label} {typeof label === 'string' ? renderText(label) : label}

View File

@ -54,15 +54,14 @@
} }
.ListItem-button { .ListItem-button {
width: 100%; min-height: 3rem;
height: 100%;
background-color: var(--background-color); background-color: var(--background-color);
border: none !important; border: none !important;
box-shadow: none !important; box-shadow: none !important;
outline: none !important; outline: none !important;
display: flex; display: flex;
align-items: center; align-items: center;
padding: 1rem 0.8125rem; padding: 0 1rem;
position: relative; position: relative;
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
@ -82,8 +81,8 @@
> .ListItem-main-icon { > .ListItem-main-icon {
font-size: 1.5rem; font-size: 1.5rem;
margin-inline-end: 1.8125rem;
color: var(--color-text-secondary); color: var(--color-text-secondary);
margin-right: 1.75rem;
} }
> .Switcher { > .Switcher {
@ -97,10 +96,6 @@
} }
} }
.title, .subtitle {
line-height: 1.5rem;
}
.user-status, .user-status,
.group-status, .group-status,
.title, .title,
@ -173,19 +168,6 @@
--background-color: var(--color-chat-hover); --background-color: var(--color-chat-hover);
} }
&.narrow {
margin-bottom: 0.75rem;
.ListItem-button {
padding: 0.5rem 1rem;
min-height: 3rem;
}
.ListItem-main-icon {
margin-inline-end: 1.75rem;
}
}
&.inactive { &.inactive {
pointer-events: none; pointer-events: none;
} }
@ -285,7 +267,7 @@
.title { .title {
h3 { h3 {
font-weight: 500; font-weight: var(--font-weight-semibold);
} }
} }
@ -383,10 +365,6 @@
} }
} }
.Checkbox {
padding-inline-start: 4rem;
}
&.picker-list-item { &.picker-list-item {
margin: 0; margin: 0;
@ -435,6 +413,8 @@
white-space: initial; white-space: initial;
overflow: hidden; overflow: hidden;
padding: 0.4375rem 0 0.5625rem 0;
.word-break { .word-break {
overflow-wrap: break-word; overflow-wrap: break-word;
} }
@ -457,12 +437,9 @@
.subtitle { .subtitle {
font-size: 0.875rem; font-size: 0.875rem;
line-height: 1.25rem; line-height: 1rem;
color: var(--color-text-secondary); color: var(--color-text-secondary);
margin-top: 0.25rem;
& + .subtitle {
margin-top: -0.25rem;
}
&.black { &.black {
color: var(--color-text); color: var(--color-text);

View File

@ -74,6 +74,7 @@ interface OwnProps {
clickArg?: any; clickArg?: any;
onSecondaryIconClick?: (e: React.MouseEvent<HTMLButtonElement>) => void; onSecondaryIconClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
onDragEnter?: (e: React.DragEvent<HTMLDivElement>) => void; onDragEnter?: (e: React.DragEvent<HTMLDivElement>) => void;
nonInteractive?: boolean;
} }
const ListItem: FC<OwnProps> = ({ const ListItem: FC<OwnProps> = ({
@ -110,6 +111,7 @@ const ListItem: FC<OwnProps> = ({
clickArg, clickArg,
onSecondaryIconClick, onSecondaryIconClick,
onDragEnter, onDragEnter,
nonInteractive,
}) => { }) => {
// eslint-disable-next-line no-null/no-null // eslint-disable-next-line no-null/no-null
let containerRef = useRef<HTMLDivElement>(null); let containerRef = useRef<HTMLDivElement>(null);
@ -244,6 +246,7 @@ const ListItem: FC<OwnProps> = ({
{!multiline && children} {!multiline && children}
{secondaryIcon && ( {secondaryIcon && (
<Button <Button
nonInteractive={nonInteractive}
className={buildClassName('secondary-icon', secondaryIconClassName)} className={buildClassName('secondary-icon', secondaryIconClassName)}
round round
color="translucent" color="translucent"

View File

@ -17,7 +17,7 @@
&.pin, &.pin,
&.unpin-all { &.unpin-all {
.modal-dialog { .modal-dialog {
max-width: 23rem; max-width: 24rem;
} }
} }
@ -103,7 +103,7 @@
.modal-header, .modal-header,
%modal-header { %modal-header {
padding: 1rem 1rem 0; padding: 1.3125rem 1.3125rem 0;
display: flex; display: flex;
align-items: center; align-items: center;
flex-shrink: 0; flex-shrink: 0;
@ -151,7 +151,7 @@
.modal-content { .modal-content {
width: 100%; width: 100%;
flex-grow: 1; flex-grow: 1;
padding: 1rem; padding: 1rem 1.5rem 1.1875rem;
overflow-y: auto; overflow-y: auto;
max-height: 92vh; max-height: 92vh;
@ -207,7 +207,7 @@
width: auto; width: auto;
height: auto; height: auto;
text-align: right; text-align: right;
font-weight: 500; font-weight: var(--font-weight-semibold);
white-space: pre-wrap; white-space: pre-wrap;
} }

View File

@ -1,11 +1,20 @@
.Radio { .Radio {
display: block;
position: relative; position: relative;
padding-inline-start: 3.5rem; width: 100%;
min-height: 3rem;
display: flex;
align-items: center;
padding-inline-start: 4.25rem;
text-align: left; text-align: left;
margin-block: 0.75rem;
line-height: 1.5rem;
cursor: var(--custom-cursor, pointer); cursor: var(--custom-cursor, pointer);
margin: 0;
&:hover {
background-color: var(--color-chat-hover);
border-radius: var(--border-radius-default);
}
&.disabled { &.disabled {
pointer-events: none; pointer-events: none;
@ -27,6 +36,10 @@
} }
} }
&.withSubLabel .Radio-main {
padding: 0.4375rem 0 0.5625rem 0;
}
&.hidden-widget { &.hidden-widget {
cursor: var(--custom-cursor, default); cursor: var(--custom-cursor, default);
.Radio-main { .Radio-main {
@ -49,14 +62,14 @@
content: ""; content: "";
display: block; display: block;
position: absolute; position: absolute;
left: 1rem;
top: 50%; top: 50%;
width: 1.25rem;
height: 1.25rem;
transform: translateY(-50%); transform: translateY(-50%);
} }
&::before { &::before {
width: 1.25rem;
height: 1.25rem;
left: 1.125rem; // 1 + ((1.5 - 1.25) / 2)
border: 2px solid var(--color-borders-input); border: 2px solid var(--color-borders-input);
border-radius: 50%; border-radius: 50%;
background-color: var(--color-background); background-color: var(--color-background);
@ -65,9 +78,9 @@
} }
&::after { &::after {
left: 1.3125rem;
width: 0.625rem; width: 0.625rem;
height: 0.625rem; height: 0.625rem;
left: 1.4375rem; // 1 + ((1.5 - 0.625) / 2)
border-radius: 50%; border-radius: 50%;
background: var(--color-primary); background: var(--color-primary);
opacity: 0; opacity: 0;
@ -79,6 +92,7 @@
word-break: break-word; word-break: break-word;
unicode-bidi: plaintext; unicode-bidi: plaintext;
text-align: left; text-align: left;
line-height: 1.25rem;
} }
.subLabel { .subLabel {
@ -87,6 +101,7 @@
line-height: 1rem; line-height: 1rem;
color: var(--color-text-secondary); color: var(--color-text-secondary);
unicode-bidi: plaintext; unicode-bidi: plaintext;
margin-top: 0.25rem;
} }
.subLabelLink { .subLabelLink {
@ -153,6 +168,8 @@
} }
&.onlyInput { &.onlyInput {
min-height: auto;
position: relative;
margin-block: 0 1.25rem; margin-block: 0 1.25rem;
line-height: 1.25rem; line-height: 1.25rem;
padding-inline-start: 1.25rem; padding-inline-start: 1.25rem;

View File

@ -56,6 +56,7 @@ const Radio: FC<OwnProps> = ({
withIcon && 'with-icon', withIcon && 'with-icon',
isLoading && 'loading', isLoading && 'loading',
onlyInput && 'onlyInput', onlyInput && 'onlyInput',
Boolean(subLabel) && 'withSubLabel',
); );
return ( return (

View File

@ -8,7 +8,7 @@
margin: 0; margin: 0;
border: none; border: none;
padding: 0.625rem 1.125rem; padding: 0.625rem 1.125rem;
font-weight: 500; font-weight: var(--font-weight-semibold);
color: var(--color-text-secondary); color: var(--color-text-secondary);
border-top-left-radius: var(--border-radius-messages-small); border-top-left-radius: var(--border-radius-messages-small);
border-top-right-radius: var(--border-radius-messages-small); border-top-right-radius: var(--border-radius-messages-small);

View File

@ -11,7 +11,7 @@
overflow-x: auto; overflow-x: auto;
overflow-y: hidden; overflow-y: hidden;
font-size: 0.875rem; font-size: 1rem;
padding-inline: 0.5rem; padding-inline: 0.5rem;

View File

@ -15,10 +15,10 @@
label { label {
display: block; display: block;
padding: 0 0.25rem;
position: absolute; position: absolute;
left: 0.75rem; left: 1rem;
top: 0.6875rem; top: 0.6875rem;
padding: 0 0.3125rem;
background-color: var(--color-background); background-color: var(--color-background);
font-size: 1rem; font-size: 1rem;
font-weight: 400; font-weight: 400;
@ -49,7 +49,7 @@
&.success label, &.success label,
.form-control:focus + label, .form-control:focus + label,
.form-control.focus + label { .form-control.focus + label {
transform: scale(0.75) translate(-0.5rem, -2.25rem); transform: scale(0.75) translate(0, -2rem);
} }
input::placeholder, input::placeholder,
@ -108,7 +108,7 @@
display: block; display: block;
width: 100%; width: 100%;
height: 3rem; height: 3rem;
padding: calc(0.75rem - var(--border-width)) calc(0.9rem - var(--border-width)); padding: calc(0.75rem - var(--border-width)) calc(1.1875rem - var(--border-width)) 0.6875rem;
border: var(--border-width) solid var(--color-borders-input); border: var(--border-width) solid var(--color-borders-input);
border-radius: var(--border-radius-default); border-radius: var(--border-radius-default);
color: var(--color-text); color: var(--color-text);
@ -196,7 +196,7 @@ textarea.form-control {
resize: none; resize: none;
overflow: hidden; overflow: hidden;
line-height: 1.3125rem; line-height: 1.3125rem;
padding-top: calc(1rem - var(--border-width)); padding-top: calc(0.8125rem - var(--border-width));
padding-bottom: calc(1rem - var(--border-width)); padding-bottom: calc(1rem - var(--border-width));
} }

View File

@ -308,6 +308,10 @@ $color-message-story-mention-to: #74bcff;
--picker-title-shift: 1rem; --picker-title-shift: 1rem;
--font-weight-normal: 400;
--font-weight-medium: 500;
--font-weight-semibold: 600;
--middle-header-panes-height: 0px; --middle-header-panes-height: 0px;
body.is-ios { body.is-ios {

View File

@ -82,6 +82,10 @@ body.is-ios {
--border-radius-messages-small: 0.5rem; --border-radius-messages-small: 0.5rem;
} }
body.is-windows {
--font-weight-semibold: 500;
}
body.is-electron { body.is-electron {
--custom-cursor: default; --custom-cursor: default;
} }
@ -296,6 +300,7 @@ body:not(.is-ios) {
.star-amount-icon.star-amount-icon { .star-amount-icon.star-amount-icon {
line-height: inherit; // Vertical centring line-height: inherit; // Vertical centring
margin-inline-start: 0.375em; // Prevent sticking to the text without using `white-space: pre` margin-inline-start: 0.375em; // Prevent sticking to the text without using `white-space: pre`
margin-inline-end: 0.2em; // Prevent sticking to the text without using `white-space: pre`
} }
.shared-canvas-container { .shared-canvas-container {

View File

@ -60,13 +60,13 @@ function buildVariables(map: Map<string, string>) {
export function updatePeerColors( export function updatePeerColors(
peerColors: ApiPeerColors['general'], peerColors: ApiPeerColors['general'],
) { ) {
setPeerColor('0', ['#e17076']); setPeerColor('0', ['#D45246']);
setPeerColor('1', ['#faa774']); setPeerColor('1', ['#F68136']);
setPeerColor('2', ['#a695e7']); setPeerColor('2', ['#6C61DF']);
setPeerColor('3', ['#7bc862']); setPeerColor('3', ['#46BA43']);
setPeerColor('4', ['#6ec9cb']); setPeerColor('4', ['#5CAFFA']);
setPeerColor('5', ['#65aadd']); setPeerColor('5', ['#408ACF']);
setPeerColor('6', ['#ee7aae']); setPeerColor('6', ['#D95574']);
Object.entries(peerColors).forEach(([key, value]) => { Object.entries(peerColors).forEach(([key, value]) => {
if (!value.colors) return; if (!value.colors) return;