Иконка ресурса

Изменяем вид профиля

IlyaPep

Проверенные
Сообщения
2,161
Решения
263
Реакции
4,482
Баллы
2,250
XELLADOLL добавил(а) новый ресурс:

Изменяем вид профиля - Вид профиля как у Вк и ещё кое-где

Часто видел вопросы как сделать такой вид профиля.
Посмотреть вложение 98785
И вот наконец решил написать

Создаём модификацию шаблона member_view

Найти:
HTML:
<div class="block">
    <div class="block-container">
        <div class="block-body">
            <div class="memberHeader">

                <div class="memberHeader-main">
                    <span class="memberHeader-avatar">
                        <span class="avatarWrapper">...

Узнать больше об этом ресурсе...
 
В екстру закидываем такой код

Less:
.mast {
  float: left;
}
.mastContainer {
    padding: 10px;
    }
.mainBlock {
  margin-left: 224px;
}

@media (max-width: @xf-responsiveMedium) {
.mast {
    float: unset;
    width: 192px;
    margin: 10px auto;
}
.mainBlock {
    margin-left: 0;
}
}
В конце кода две "}" :)
 
ubrohack, код верный. Стоит только посмотреть внимательно на него, и увидеть, что выше ещё есть медиа-запрос и в конце закрывается именно его тело.
 
Последнее редактирование:
Решил допилить эту модификацию и хочу сказать, что вместо костыля с добавлением css в модификацию , можно в экстру добавить такую конструкцию:
Код:
.template-member_view {
    .memberHeader-content {
        padding-left: 10px;
    }
}
 
HAIM, там вообще можно одним Less обойтись. Ну а при неимоверном желании, добавить два div`а и их подкрасить.
 
В общем, я хотел перенести кнопки подписки, начала переписки и прочие под аватар, но столкнулся с проблемой: правая сторона растягивается по высоте и я не могу понять почему.

98998

Less:
.mast {
  float: left; 
}
.mastContainer {
    padding: 10px;
    }
.mainBlock {
  margin-left: 224px;
} 

@media (max-width: @xf-responsiveMedium) {
.mast {
    float: unset;
    width: 192px;
    margin: 10px auto;
}
.mainBlock {
    margin-left: 0;
}
}

.template-member_view {
    .memberHeader-content {
        padding-left: 10px;
    }
    
    .memberHeader-buttons .buttonGroup {
        &:first-child {
            margin-bottom: 5px;
        }
        display: block;
    }
}

Для модификации я взял в поле "Найти" весь шаблон member_view, содержимое "Заменить" в спойлере
Код:
<xf:title page="{$page}">{$user.username}</xf:title>
<xf:h1 hidden="true" />

<xf:macro template="metadata_macros" name="metadata"
    arg-shareUrl="{{ link('canonical:members', $user) }}"
    arg-canonicalUrl="{{ link('canonical:members', $user, {'page': $page}) }}"
    arg-imageUrl="{$user.getAvatarUrl('o', null, true)}" />

<xf:page option="ldJsonHtml">
    <script type="application/ld+json">
    {
        "@context": "https://schema.org",
        "@type": "Person",
        "name": "{$user.username|escape('json')}",
        "image": "{$user.getAvatarUrl('o', null, true)|escape('json')}"
    }
    </script>
</xf:page>

<xf:css src="member.less" />

<div class="block mast">
<div class="block-container mastContainer">
<xf:avatar user="{$user}" size="l" href="" update="{{ link('account/avatar', $user) }}" />
                        <xf:if contentcheck="true">
                            <div class="memberHeader-banners">
                                <xf:contentcheck><xf:userbanners style="width: 100%;" user="$user" /></xf:contentcheck>
                            </div>
                        </xf:if>

                        <xf:if contentcheck="true">
                        <hr class="memberHeader-separator" />

                        <div class="memberHeader-buttons">
                            <xf:contentcheck>
                                <xf:macro template="member_macros" name="member_action_buttons"
                                    arg-user="{$user}"
                                    arg-context="profile" />
                            </xf:contentcheck>
                        </div>
                    </xf:if>
</div>
   </div>
<div class="block mainBlock">
    <div class="block-container">
        <div class="block-body">
            <div class="memberHeader">

                <div class="memberHeader-main">
                    <div class="memberHeader-content memberHeader-content--info">
                        <xf:if contentcheck="true">
                            <div class="memberHeader-actionTop">
                                <div class="buttonGroup">
                                <xf:contentcheck>
                                    <xf:if is="$user.canBeReported()">
                                        <xf:button href="{{ link('members/report', $user) }}"
                                            class="button--link" overlay="true">
                                            {{ phrase('report_verb') }}
                                        </xf:button>
                                    </xf:if>
                                    <xf:if contentcheck="true">
                                        <div class="buttonGroup-buttonWrapper">
                                            <xf:button class="button--link menuTrigger" data-xf-click="menu" aria-expanded="false" aria-haspopup="true">{{ phrase('moderator_tools') }}</xf:button>
                                            <div class="menu" data-menu="menu" aria-hidden="true">
                                                <div class="menu-content">
                                                    <h3 class="menu-header">{{ phrase('moderator_tools') }}</h3>
                                                    <xf:contentcheck>
                                                        <xf:macro template="member_macros" name="moderator_menu_actions"
                                                            arg-user="{$user}"
                                                            arg-context="profile" />
                                                    </xf:contentcheck>
                                                </div>
                                            </div>
                                        </div>
                                    </xf:if>
                                </xf:contentcheck>
                                </div>
                            </div>
                        </xf:if>

                        <h1 class="memberHeader-name"><xf:username user="{$user}" rich="true" href="" /></h1>

                        <xf:if contentcheck="true">
                            <div class="memberHeader-banners">
                                <xf:contentcheck><xf:userbanners user="$user" /></xf:contentcheck>
                            </div>
                        </xf:if>

                        <xf:userblurb user="$user" tag="div" class="memberHeader-blurb" />

                        <xf:if contentcheck="true">
                            <dl class="pairs pairs--inline memberHeader-blurb">
                                <dt>{{ phrase('last_seen') }}</dt>
                                <dd dir="auto">
                                    <xf:contentcheck><xf:useractivity user="$user" class="pairs--plainLabel" /></xf:contentcheck>
                                </dd>
                            </dl>
                        </xf:if>
                    </div>
                </div>

                <div class="memberHeader-content">
                    <div class="memberHeader-stats">
                        <div class="pairJustifier">
                            <xf:macro template="member_macros" name="member_stat_pairs"
                                arg-user="{$user}"
                                arg-context="profile" />
                        </div>
                    </div>
                </div>

            </div>
        </div>
        <h2 class="block-tabHeader block-tabHeader--memberTabs tabs hScroller"
            data-xf-init="tabs h-scroller"
            data-panes=".js-memberTabPanes"
            data-state="replace"
            role="tablist">
            <span class="hScroller-scroll">
                <!--[XF:tabs:start]-->
                <xf:if is="$user.canViewPostsOnProfile()">
                    <a href="{{ link('members', $user) }}"
                        class="tabs-tab is-active"
                        role="tab"
                        aria-controls="profile-posts">{{ phrase('profile_posts') }}</a>
                </xf:if>

                <xf:if is="$user.canViewLatestActivity()">
                    <a href="{{ link('members/latest-activity', $user) }}"
                        rel="nofollow"
                        class="tabs-tab"
                        id="latest-activity"
                        role="tab">{{ phrase('latest_activity') }}</a>
                </xf:if>

                <a href="{{ link('members/recent-content', $user) }}"
                    rel="nofollow"
                    class="tabs-tab"
                    id="recent-content"
                    role="tab">{{ phrase('postings') }}</a>

                <!--[XF:tabs:after_recent_content]-->

                <a href="{{ link('members/about', $user) }}"
                    class="tabs-tab"
                    id="about"
                    role="tab">{{ phrase('about') }}</a>

                <xf:if is="$xf.visitor.canViewWarnings() && $user.warning_count">
                    <a href="{{ link('members/warnings', $user) }}"
                        class="tabs-tab"
                        id="warnings"
                        role="tab">{{ phrase('warnings') }}</a>
                </xf:if>
                <!--[XF:tabs:end]-->
            </span>
        </h2>
    </div>
</div>

<xf:ad position="member_view_below_tabs" arg-user="{$user}" />

<ul class="tabPanes js-memberTabPanes">
    <!--[XF:tab_panes:start]-->
    <xf:if is="$user.canViewPostsOnProfile()">
        <li class="is-active" role="tabpanel" id="profile-posts">
            <xf:js src="xf/inline_mod.js" min="1" />
            <div class="block block--messages" data-xf-init="inline-mod" data-type="profile_post" data-href="{{ link('inline-mod') }}">
                <div class="block-container">
                    <div class="block-body js-replyNewMessageContainer">
                        <xf:if is="$user.canPostOnProfile()">
                            <xf:set var="$firstProfilePost" value="{$profilePosts|first}" />
                            <xf:macro template="profile_post_macros" name="submit"
                                arg-user="{$user}"
                                arg-lastDate="{{ $firstProfilePost.post_date ?: 0 }}"
                                arg-containerSelector="< .js-replyNewMessageContainer" />
                        </xf:if>

                        <xf:if is="$profilePosts is not empty">
                            <xf:foreach loop="$profilePosts" value="$profilePost">
                                <xf:macro template="profile_post_macros"
                                    name="{{ $profilePost.message_state == 'deleted' ? 'profile_post_deleted' : 'profile_post' }}"
                                    arg-profilePost="{$profilePost}" />
                            </xf:foreach>
                        <xf:else />
                            <div class="block-row js-replyNoMessages">{{ phrase('there_no_messages_on_xs_profile_yet', {'name': $user.username}) }}</div>
                        </xf:if>
                    </div>
                </div>

                <div class="block-outer block-outer--after">
                    <xf:pagenav
                        page="{$page}" perpage="{$perPage}" total="{$total}"
                        link="members" data="{$user}"
                        wrapperclass="block-outer-main" />
                    <div class="block-outer-opposite">
                        <xf:showignored />
                        <xf:if is="$canInlineMod">
                            <xf:macro template="inline_mod_macros" name="button" />
                        </xf:if>
                    </div>
                </div>
            </div>
        </li>
    </xf:if>

    <xf:if is="$user.canViewLatestActivity()">
        <li data-href="{{ link('members/latest-activity', $user) }}" role="tabpanel" aria-labelledby="latest-activity">
            <div class="blockMessage">{{ phrase('loading...') }}</div>
        </li>
    </xf:if>

    <li data-href="{{ link('members/recent-content', $user) }}" role="tabpanel" aria-labelledby="recent-content">
        <div class="blockMessage">{{ phrase('loading...') }}</div>
    </li>

    <!--[XF:tab_panes:after_recent_content]-->

    <li data-href="{{ link('members/about', $user) }}" role="tabpanel" aria-labelledby="about">
        <div class="blockMessage">{{ phrase('loading...') }}</div>
    </li>

    <xf:if is="$xf.visitor.canViewWarnings() && $user.warning_count">
        <li data-href="{{ link('members/warnings', $user) }}" role="tabpanel" aria-labelledby="warnings">
            <div class="blockMessage">{{ phrase('loading...') }}</div>
        </li>
    </xf:if>
    <!--[XF:tab_panes:end]-->
</ul>

<xf:widgetpos id="member_view_sidebar" context-user="{$user}" position="sidebar" />
 
В общем, я хотел перенести кнопки подписки, начала переписки и прочие под аватар, но столкнулся с проблемой: правая сторона растягивается по высоте и я не могу понять почему.

Посмотреть вложение 98998

Less:
.mast {
  float: left;
}
.mastContainer {
    padding: 10px;
    }
.mainBlock {
  margin-left: 224px;
}

@media (max-width: @xf-responsiveMedium) {
.mast {
    float: unset;
    width: 192px;
    margin: 10px auto;
}
.mainBlock {
    margin-left: 0;
}
}

.template-member_view {
    .memberHeader-content {
        padding-left: 10px;
    }
  
    .memberHeader-buttons .buttonGroup {
        &:first-child {
            margin-bottom: 5px;
        }
        display: block;
    }
}

Для модификации я взял в поле "Найти" весь шаблон member_view, содержимое "Заменить" в спойлере
Код:
<xf:title page="{$page}">{$user.username}</xf:title>
<xf:h1 hidden="true" />

<xf:macro template="metadata_macros" name="metadata"
    arg-shareUrl="{{ link('canonical:members', $user) }}"
    arg-canonicalUrl="{{ link('canonical:members', $user, {'page': $page}) }}"
    arg-imageUrl="{$user.getAvatarUrl('o', null, true)}" />

<xf:page option="ldJsonHtml">
    <script type="application/ld+json">
    {
        "@context": "https://schema.org",
        "@type": "Person",
        "name": "{$user.username|escape('json')}",
        "image": "{$user.getAvatarUrl('o', null, true)|escape('json')}"
    }
    </script>
</xf:page>

<xf:css src="member.less" />

<div class="block mast">
<div class="block-container mastContainer">
<xf:avatar user="{$user}" size="l" href="" update="{{ link('account/avatar', $user) }}" />
                        <xf:if contentcheck="true">
                            <div class="memberHeader-banners">
                                <xf:contentcheck><xf:userbanners style="width: 100%;" user="$user" /></xf:contentcheck>
                            </div>
                        </xf:if>

                        <xf:if contentcheck="true">
                        <hr class="memberHeader-separator" />

                        <div class="memberHeader-buttons">
                            <xf:contentcheck>
                                <xf:macro template="member_macros" name="member_action_buttons"
                                    arg-user="{$user}"
                                    arg-context="profile" />
                            </xf:contentcheck>
                        </div>
                    </xf:if>
</div>
   </div>
<div class="block mainBlock">
    <div class="block-container">
        <div class="block-body">
            <div class="memberHeader">

                <div class="memberHeader-main">
                    <div class="memberHeader-content memberHeader-content--info">
                        <xf:if contentcheck="true">
                            <div class="memberHeader-actionTop">
                                <div class="buttonGroup">
                                <xf:contentcheck>
                                    <xf:if is="$user.canBeReported()">
                                        <xf:button href="{{ link('members/report', $user) }}"
                                            class="button--link" overlay="true">
                                            {{ phrase('report_verb') }}
                                        </xf:button>
                                    </xf:if>
                                    <xf:if contentcheck="true">
                                        <div class="buttonGroup-buttonWrapper">
                                            <xf:button class="button--link menuTrigger" data-xf-click="menu" aria-expanded="false" aria-haspopup="true">{{ phrase('moderator_tools') }}</xf:button>
                                            <div class="menu" data-menu="menu" aria-hidden="true">
                                                <div class="menu-content">
                                                    <h3 class="menu-header">{{ phrase('moderator_tools') }}</h3>
                                                    <xf:contentcheck>
                                                        <xf:macro template="member_macros" name="moderator_menu_actions"
                                                            arg-user="{$user}"
                                                            arg-context="profile" />
                                                    </xf:contentcheck>
                                                </div>
                                            </div>
                                        </div>
                                    </xf:if>
                                </xf:contentcheck>
                                </div>
                            </div>
                        </xf:if>

                        <h1 class="memberHeader-name"><xf:username user="{$user}" rich="true" href="" /></h1>

                        <xf:if contentcheck="true">
                            <div class="memberHeader-banners">
                                <xf:contentcheck><xf:userbanners user="$user" /></xf:contentcheck>
                            </div>
                        </xf:if>

                        <xf:userblurb user="$user" tag="div" class="memberHeader-blurb" />

                        <xf:if contentcheck="true">
                            <dl class="pairs pairs--inline memberHeader-blurb">
                                <dt>{{ phrase('last_seen') }}</dt>
                                <dd dir="auto">
                                    <xf:contentcheck><xf:useractivity user="$user" class="pairs--plainLabel" /></xf:contentcheck>
                                </dd>
                            </dl>
                        </xf:if>
                    </div>
                </div>

                <div class="memberHeader-content">
                    <div class="memberHeader-stats">
                        <div class="pairJustifier">
                            <xf:macro template="member_macros" name="member_stat_pairs"
                                arg-user="{$user}"
                                arg-context="profile" />
                        </div>
                    </div>
                </div>

            </div>
        </div>
        <h2 class="block-tabHeader block-tabHeader--memberTabs tabs hScroller"
            data-xf-init="tabs h-scroller"
            data-panes=".js-memberTabPanes"
            data-state="replace"
            role="tablist">
            <span class="hScroller-scroll">
                <!--[XF:tabs:start]-->
                <xf:if is="$user.canViewPostsOnProfile()">
                    <a href="{{ link('members', $user) }}"
                        class="tabs-tab is-active"
                        role="tab"
                        aria-controls="profile-posts">{{ phrase('profile_posts') }}</a>
                </xf:if>

                <xf:if is="$user.canViewLatestActivity()">
                    <a href="{{ link('members/latest-activity', $user) }}"
                        rel="nofollow"
                        class="tabs-tab"
                        id="latest-activity"
                        role="tab">{{ phrase('latest_activity') }}</a>
                </xf:if>

                <a href="{{ link('members/recent-content', $user) }}"
                    rel="nofollow"
                    class="tabs-tab"
                    id="recent-content"
                    role="tab">{{ phrase('postings') }}</a>

                <!--[XF:tabs:after_recent_content]-->

                <a href="{{ link('members/about', $user) }}"
                    class="tabs-tab"
                    id="about"
                    role="tab">{{ phrase('about') }}</a>

                <xf:if is="$xf.visitor.canViewWarnings() && $user.warning_count">
                    <a href="{{ link('members/warnings', $user) }}"
                        class="tabs-tab"
                        id="warnings"
                        role="tab">{{ phrase('warnings') }}</a>
                </xf:if>
                <!--[XF:tabs:end]-->
            </span>
        </h2>
    </div>
</div>

<xf:ad position="member_view_below_tabs" arg-user="{$user}" />

<ul class="tabPanes js-memberTabPanes">
    <!--[XF:tab_panes:start]-->
    <xf:if is="$user.canViewPostsOnProfile()">
        <li class="is-active" role="tabpanel" id="profile-posts">
            <xf:js src="xf/inline_mod.js" min="1" />
            <div class="block block--messages" data-xf-init="inline-mod" data-type="profile_post" data-href="{{ link('inline-mod') }}">
                <div class="block-container">
                    <div class="block-body js-replyNewMessageContainer">
                        <xf:if is="$user.canPostOnProfile()">
                            <xf:set var="$firstProfilePost" value="{$profilePosts|first}" />
                            <xf:macro template="profile_post_macros" name="submit"
                                arg-user="{$user}"
                                arg-lastDate="{{ $firstProfilePost.post_date ?: 0 }}"
                                arg-containerSelector="< .js-replyNewMessageContainer" />
                        </xf:if>

                        <xf:if is="$profilePosts is not empty">
                            <xf:foreach loop="$profilePosts" value="$profilePost">
                                <xf:macro template="profile_post_macros"
                                    name="{{ $profilePost.message_state == 'deleted' ? 'profile_post_deleted' : 'profile_post' }}"
                                    arg-profilePost="{$profilePost}" />
                            </xf:foreach>
                        <xf:else />
                            <div class="block-row js-replyNoMessages">{{ phrase('there_no_messages_on_xs_profile_yet', {'name': $user.username}) }}</div>
                        </xf:if>
                    </div>
                </div>

                <div class="block-outer block-outer--after">
                    <xf:pagenav
                        page="{$page}" perpage="{$perPage}" total="{$total}"
                        link="members" data="{$user}"
                        wrapperclass="block-outer-main" />
                    <div class="block-outer-opposite">
                        <xf:showignored />
                        <xf:if is="$canInlineMod">
                            <xf:macro template="inline_mod_macros" name="button" />
                        </xf:if>
                    </div>
                </div>
            </div>
        </li>
    </xf:if>

    <xf:if is="$user.canViewLatestActivity()">
        <li data-href="{{ link('members/latest-activity', $user) }}" role="tabpanel" aria-labelledby="latest-activity">
            <div class="blockMessage">{{ phrase('loading...') }}</div>
        </li>
    </xf:if>

    <li data-href="{{ link('members/recent-content', $user) }}" role="tabpanel" aria-labelledby="recent-content">
        <div class="blockMessage">{{ phrase('loading...') }}</div>
    </li>

    <!--[XF:tab_panes:after_recent_content]-->

    <li data-href="{{ link('members/about', $user) }}" role="tabpanel" aria-labelledby="about">
        <div class="blockMessage">{{ phrase('loading...') }}</div>
    </li>

    <xf:if is="$xf.visitor.canViewWarnings() && $user.warning_count">
        <li data-href="{{ link('members/warnings', $user) }}" role="tabpanel" aria-labelledby="warnings">
            <div class="blockMessage">{{ phrase('loading...') }}</div>
        </li>
    </xf:if>
    <!--[XF:tab_panes:end]-->
</ul>

<xf:widgetpos id="member_view_sidebar" context-user="{$user}" position="sidebar" />
Я как раз думал написать про это, но увы сегодня времени не нашлось. Как найду время, выложу и свой вариант
Пока скрины
99007 когда я смотрю на свой профиль
99008 когда на чужой
 
Последнее редактирование:
Как и обещал, вот мой вариант
990449904599046
1- Мой профиль 2- Профиль пользователя 3- Профиль заблокированного пользователя

И скриншот меню
99047
Приступим к коду
Для начала идём к нашей модификации и ищём этот кусок кода
HTML:
<xf:if contentcheck="true">
                            <div class="memberHeader-banners">
                                <xf:contentcheck><xf:userbanners style="width: 100%;" user="$user" /></xf:contentcheck>
                            </div>
                        </xf:if>
И добавляем ниже это
HTML:
<div>
    <xf:if is="$xf.visitor.canStartConversationWith($user)">
    <a href="{{ link('conversations/add', '', {'to': $user.username}) }}" class="button button--icon mastButton"><span class="button-text">Написать</span></a>
        <xf:elseif is="{$xf.visitor} != {$user}" />
    <a  class="button button--icon mastButton"><span class="button-text">Недоступен</span></a>
    </xf:if>
    <xf:if is="{$xf.visitor} == {$user}">
    <a  href="/account/account-details" class="button button--icon mastButton"><span class="button-text">{{ phrase('edit') }}</span></a>
    </xf:if>
    <xf:button class="button button--icon mastSmallButton" data-xf-click="menu" aria-expanded="false" aria-haspopup="true"><i class="fa fa-ellipsis-h" aria-hidden="true"></i></xf:button>
                    <div class="menu" data-menu="menu" aria-hidden="true">
                        <div class="menu-content">
                            <h4 class="menu-header">Действия</h4>
                            <xf:if is="$xf.visitor.canFollowUser($user)">
                <a href="{{ link('members/follow', $user) }}"
                    class="menu-linkRow"
                    data-xf-click="switch"
                    data-sk-follow="{{ phrase('follow') }}"
                    data-sk-unfollow="{{ phrase('unfollow') }}">
                    {{ $xf.visitor.isFollowing($user) ? phrase('unfollow') : phrase('follow') }}
                </a>
            </xf:if>
                            <xf:if is="$xf.visitor.canIgnoreUser($user)">
                <a href="{{ link('members/ignore', $user) }}"
                    class="menu-linkRow"
                    data-xf-click="switch"
                    data-sk-ignore="{{ phrase('ignore') }}"
                    data-sk-unignore="{{ phrase('unignore') }}">
                    {{ $xf.visitor.isIgnoring($user) ? phrase('unignore') : phrase('ignore') }}
                </a>
            </xf:if>
                            <a href="{{ link('search/member', null, {'user_id': $user.user_id}) }}" rel="nofollow" class="menu-linkRow">{{ phrase('find_all_content_by_x', {'name': $user.username}) }}</a>
                            <a href="{{ link('search/member', null, {'user_id': $user.user_id, 'content': 'thread'}) }}" rel="nofollow" class="menu-linkRow">{{ phrase('find_all_threads_by_x', {'name': $user.username}) }}</a>
                        </div>
                    </div>
    </div>

В екстру добавляем
Less:
.mastButton {
    width: ~"calc(100% - 40px)"
    margin-top: 10px;
}
.mastSmallButton {
    float: right;
    margin-top: 10px;
}

Теперь вам останется всего удалить кнопки с прошлого места
Если вам лень просто добавьте в екстру этот код
Less:
.memberHeader-buttons {
    display: none;
}
 
Последнее редактирование:
Общие рекомендации, избавиться от этого в коде.
HTML:
<a  style="width: calc(100% - 40px);"
Всё это в css можно сделать.
 
Общие рекомендации, избавиться от этого в коде.
HTML:
<a  style="width: calc(100% - 40px);"
Всё это в css можно сделать.
Я делал его в екстре, но в итоге оно тупо от 100 отнимало 40 ?
 
XELLADOLL, а можете скинуть скриншот полного профиля? Сейчас у меня нет возможности чекнуть самому как это выглядит
 
1569522181895.png Закруглилась аватарка, как исправить?
 
Настройки стиля
 
Loxsan, в стиле настройте
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу