1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-17 07:10:48 +03:00

Шаблон Synio (в процессе)

This commit is contained in:
Denis Shakhov 2016-08-30 11:33:43 +07:00
parent 766e81d93a
commit 769dc34e81
213 changed files with 7759 additions and 0 deletions

View file

@ -0,0 +1,21 @@
{**
* Админка
*
* @param boolean $availableAdminPlugin
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{lang 'admin.title'}
{/block}
{block 'layout_content'}
{component 'nav'
hook = 'admin_nav'
mods = 'stacked pills'
items = [
[ 'name' => 'user', 'url' => "{router page='admin/plugins'}?plugin=admin&action=activate&security_ls_key={$LIVESTREET_SECURITY_KEY}", 'text' => {lang 'admin.install_plugin_admin'}, is_enabled => $availableAdminPlugin ],
[ 'name' => 'plugins', 'url' => "{router page='admin'}plugins/", 'text' => {lang 'admin.items.plugins'} ]
]}
{/block}

View file

@ -0,0 +1,15 @@
{**
* Плагины
*
* @param array $plugins Список плагинов
*}
{extends 'layouts/layout.admin.tpl'}
{block 'layout_admin_page_title'}
{lang 'admin.items.plugins'}
{/block}
{block 'layout_content'}
{component 'admin' template='plugins' plugins=$plugins}
{/block}

View file

@ -0,0 +1,13 @@
{**
* Уведомление об успешной регистрации
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{$aLang.auth.registration.notices.success_activate}
{/block}
{block 'layout_content'}
<a href="{router page='/'}">{$aLang.common.site_go_main}</a>
{/block}

View file

@ -0,0 +1,15 @@
{**
* Просьба перейти по ссылке отправленной на емэйл для активации аккаунта
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{$aLang.auth.registration.confirm.title}
{/block}
{block 'layout_content'}
{$aLang.auth.registration.confirm.text}<br /><br />
<a href="{router page='/'}">{$aLang.common.site_go_main}</a>
{/block}

View file

@ -0,0 +1,13 @@
{**
* Регистрация через инвайт
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{$aLang.auth.invite.title}
{/block}
{block 'layout_content'}
{component 'auth' template='invite'}
{/block}

View file

@ -0,0 +1,13 @@
{**
* Страница входа
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{$aLang.auth.login.title}
{/block}
{block 'layout_content'}
{component 'auth' template='login' showExtra=true}
{/block}

View file

@ -0,0 +1,13 @@
{**
* Форма запроса повторной активации аккаунта
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{$aLang.auth.reactivation.title}
{/block}
{block 'layout_content'}
{component 'auth' template='reactivation'}
{/block}

View file

@ -0,0 +1,13 @@
{**
* Регистрация
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{$aLang.auth.registration.title}
{/block}
{block 'layout_content'}
{component 'auth' template='registration'}
{/block}

View file

@ -0,0 +1,13 @@
{**
* Форма восстановления пароля
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{$aLang.auth.reset.title}
{/block}
{block 'layout_content'}
{component 'auth' template='reset'}
{/block}

View file

@ -0,0 +1,14 @@
{**
* Восстановление пароля.
* Пароль отправлен на емэйл пользователя.
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{$aLang.auth.reset.title}
{/block}
{block 'layout_content'}
{$aLang.auth.reset.notices.success_send_password}
{/block}

View file

@ -0,0 +1,20 @@
{**
* Создание блога
*
* @param array $blogCategories Список категорий блогов
* @param object $blogEdit Блог, передается в случае если блог редактируется
*}
{extends 'layouts/layout.blog.edit.tpl'}
{block 'layout_page_title'}
{if $sEvent == 'add'}
{$aLang.blog.add.title}
{else}
{$aLang.blog.admin.title}: <a href="{$blogEdit->getUrlFull()}">{$blogEdit->getTitle()|escape}</a>
{/if}
{/block}
{block 'layout_content'}
{component 'blog' template='add' blog=$blogEdit}
{/block}

View file

@ -0,0 +1,17 @@
{**
* Управление пользователями блога
*
* @param object $blogEdit Блог
* @param array $blogUsers Список пользователей блога
* @param array $blogUsersInvited Список приглашенных пользователей, передается в случае если блог закрытый
*}
{extends 'layouts/layout.blog.edit.tpl'}
{block 'layout_page_title'}
{$aLang.blog.admin.title}: <a href="{$blogEdit->getUrlFull()}">{$blogEdit->getTitle()|escape}</a>
{/block}
{block 'layout_content'}
{component 'blog' template='admin' users=$blogUsers pagination=$paging}
{/block}

View file

@ -0,0 +1,34 @@
{**
* Блог
*
* @param object $blog Блог
* @param boolean $isPrivateBlog Закрытый блог или нет
* @param array $topics Список топиков
* @param array $paging Пагинация
* @param string $periodSelectCurrent
* @param string $periodSelectRoot
* @param array $blogUsers Читатели блога
* @param array $blogModerators Модераторы блога
* @param array $blogAdministrators Администраторы блога
* @param integer $countBlogUsers Кол-во читателей
* @param integer $countBlogModerators Кол-во модераторов
* @param integer $countBlogAdministrators Кол-во администраторов
*}
{extends 'layouts/layout.topics.tpl'}
{block 'layout_content_header'}
{component 'blog' blog=$blog blogs=$blogs}
{$smarty.block.parent}
{* Сообщение для забаненного пользователя *}
{if $blogUserCurrent and $blogUserCurrent->getIsBanned()}
{component 'alert' text=$aLang.blog.alerts.banned mods='error'}
{/if}
{* Список топиков *}
{if $isPrivateBlog}
{component 'alert' text=$aLang.blog.alerts.private mods='error'}
{/if}
{/block}

View file

@ -0,0 +1,10 @@
{**
* Список топиков
*
* @param array $topics
* @param array $paging
* @param string $periodSelectCurrent
* @param string $periodSelectRoot
*}
{extends 'layouts/layout.topics.tpl'}

View file

@ -0,0 +1,42 @@
{**
* Топик
*
* @param object $topic
* @param array $comments
* @param integer $lastCommentId
* @param array $pagingComments
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_content'}
{* Топик *}
{component 'topic' template='topic-type' topic=$topic}
{* Комментарии *}
{component 'comment' template='comments'
comments = $comments
count = $topic->getCountComment()
classes = 'js-topic-comments'
attributes = [ 'id' => 'comments' ]
targetId = $topic->getId()
targetType = 'topic'
authorId = $topic->getUserId()
authorText = $aLang.topic.author
dateReadLast = $topic->getDateRead()
forbidAdd = $topic->getForbidComment()
forbidText = $aLang.topic.comments.notices.not_allowed
useSubscribe = true
isSubscribed = $topic->getSubscribeNewComment() && $topic->getSubscribeNewComment()->getStatus()
lastCommentId = $lastCommentId
pagination = [
total => +$pagingComments.iCountPage,
current => +$pagingComments.iCurrentPage,
url => "{$pagingComments.sGetParams}{($pagingComments.sGetParams) ? '&' : '?'}cmtpage=__page__"
]
commentParams = [
useVote => true,
useEdit => true,
useFavourite => true
]}
{/block}

View file

@ -0,0 +1,19 @@
{**
* Список пользователей которые подключены к блогу
*
* @param object $blog
* @param array $blogUsers
* @param integer $countBlogUsers
* @param array $paging
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{$aLang.blog.users.readers_all} ({$countBlogUsers}):
<a href="{$blog->getUrlFull()}">{$blog->getTitle()|escape}</a>
{/block}
{block 'layout_content'}
{component 'user' template='list' users=$blogUsers pagination=$paging}
{/block}

View file

@ -0,0 +1,38 @@
{**
* Список блогов
*
* @param array $blogs
* @param integer $searchCount
* @param array $paging
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_options' append}
{$sMenuHeadItemSelect = 'blogs'}
{/block}
{block 'layout_page_title'}
{$aLang.blog.blogs}
{/block}
{block 'layout_content'}
{component 'blog' template='search-form'}
{* Сортировка *}
{component 'sort' template='ajax'
classes = 'js-search-sort js-search-sort-menu'
text = $aLang.blog.sort.by_users
items = [
[ name => 'blog_count_user', text => $aLang.blog.sort.by_users ],
[ name => 'blog_count_topic', text => $aLang.blog.sort.by_topics ],
[ name => 'blog_title', text => $aLang.sort.by_title ]
]}
{* Список блогов *}
<div class="js-search-ajax-blog">
<h3 class="h3 js-blog-list-search-title" style="display: none"></h3>
{component 'blog' template='list' blogs=$blogs useMore=true}
</div>
{/block}

View file

@ -0,0 +1,14 @@
{**
* Создание/редактирование топика
*
* @parama object $topicEdit
* @parama string $topicType
* @parama array $blogsAllow
* @parama integer $blogId
*}
{extends 'layouts/layout.content.form.tpl'}
{block 'layout_content'}
{component 'topic.add-type' classes='syn-form-panel' topic=$topicEdit type=$topicType blogs=$blogsAllow blogId=$blogId skipBlogs=$skipBlogs}
{/block}

View file

@ -0,0 +1,16 @@
{**
* Черновики
*
* @parama array $topics
* @parama array $paging
*}
{extends 'layouts/layout.content.form.tpl'}
{block 'layout_page_title'}
{$aLang.topic.add.title.add}
{/block}
{block 'layout_content'}
{component 'topic.list' topics=$topics paging=$paging}
{/block}

View file

@ -0,0 +1,23 @@
{**
* Страница вывода ошибок
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_options' append}
{$layoutShowSystemMessages = false}
{/block}
{block 'layout_page_title'}
{if $aMsgError[0].title}
{$aLang.common.error.error}: <span>{$aMsgError[0].title}</span>
{/if}
{/block}
{block 'layout_content'}
<p>{$aMsgError[0].msg}</p>
<p>
<a href="javascript:history.go(-1);">{$aLang.common.site_history_back}</a>,
<a href="{router page='/'}">{$aLang.common.site_go_main}</a>
</p>
{/block}

View file

@ -0,0 +1,8 @@
{**
* Главная
*
* @parama array $topics
* @parama array $paging
*}
{extends 'layouts/layout.index.tpl'}

View file

@ -0,0 +1,36 @@
{**
* Список всех пользователей
*
* @param array $users
* @param integer $searchCount
* @param array $countriesUsed
* @param array $paging
* @param array $usersStat
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{$aLang.user.users}
{/block}
{block 'layout_content'}
{component 'user' template='search-form'}
{* Сортировка *}
{component 'sort' template='ajax'
classes = 'js-search-sort js-search-sort-menu'
text = $aLang.sort.by_rating
items = [
[ name => 'user_rating', text => $aLang.sort.by_rating, order => 'asc' ],
[ name => 'user_login', text => $aLang.sort.by_login ],
[ name => 'user_date_register', text => $aLang.sort.by_date_registration ]
]}
{* Список пользователей *}
<div class="js-search-ajax-users">
<h3 class="h3 js-user-list-search-title" style="display: none"></h3>
{component 'user' template='list' users=$users useMore=true}
</div>
{/block}

View file

@ -0,0 +1,20 @@
{**
* Активность пользователя
*
* @param array $activityEvents
* @param integer $activityEventsAllCount
*}
{extends 'layouts/layout.user.tpl'}
{block 'layout_user_page_title'}
{lang name='activity.title'}
{/block}
{block 'layout_content' append}
{component 'activity'
events = $activityEvents
count = $activityEventsAllCount
targetId = $oUserProfile->getId()
classes = 'js-activity--user'}
{/block}

View file

@ -0,0 +1,16 @@
{**
* Список комментариев созданных пользователем
*
* @param array $comments
* @param array $paging
*}
{extends 'layouts/layout.user.created.tpl'}
{block 'layout_user_page_title'}
{lang 'user.publications.title'}
{/block}
{block 'layout_content' append}
{component 'comment.list' comments=$comments paging=$paging classes='js-topic-comments-list'}
{/block}

View file

@ -0,0 +1,16 @@
{**
* Список заметок созданных пользователем
*
* @param array $notesUsers
* @param array $paging
*}
{extends 'layouts/layout.user.created.tpl'}
{block 'layout_user_page_title'}
{lang 'user.publications.title'}
{/block}
{block 'layout_content' append}
{component 'user.list' users=$notesUsers pagination=$paging}
{/block}

View file

@ -0,0 +1,16 @@
{**
* Список топиков созданных пользователем
*
* @param array $topics
* @param array $paging
*}
{extends 'layouts/layout.user.created.tpl'}
{block 'layout_user_page_title'}
{lang 'user.publications.title'}
{/block}
{block 'layout_content' append}
{component 'topic.list' topics=$topics paging=$paging}
{/block}

View file

@ -0,0 +1,16 @@
{**
* Избранные комментарии пользователя
*
* @param array $comments
* @param array $paging
*}
{extends 'layouts/layout.user.favourite.tpl'}
{block 'layout_user_page_title'}
{lang 'user.favourites.title'}
{/block}
{block 'layout_content' append}
{component 'comment.list' comments=$comments paging=$paging classes='js-topic-comments-list'}
{/block}

View file

@ -0,0 +1,25 @@
{**
* Избранные топики пользователя
*
* @param array $topics
* @param array $paging
* @param array $activeFavouriteTag
*}
{extends 'layouts/layout.user.favourite.tpl'}
{block 'layout_user_page_title'}
{lang 'user.favourites.title'}
{/block}
{block 'layout_content' append}
{* Блок с тегами избранного *}
{if $oUserCurrent && $oUserCurrent->getId() == $oUserProfile->getId()}
{insert name='block' block='tagsPersonalTopic' params=[
'user' => $oUserProfile,
'activeTag' => $activeFavouriteTag
]}
{/if}
{component 'topic.list' topics=$topics paging=$paging}
{/block}

View file

@ -0,0 +1,16 @@
{**
* Список друзей
*
* @param array $friends
* @param array $paging
*}
{extends 'layouts/layout.user.tpl'}
{block 'layout_user_page_title'}
{lang name='user.friends.title'}
{/block}
{block 'layout_content' append}
{component 'user' template='list' users=$friends pagination=$paging}
{/block}

View file

@ -0,0 +1,29 @@
{**
* Профиль пользователя с информацией о нем
*
* @param array usersInvited
* @param object invitedByUser
* @param array blogsJoined
* @param array blogsModerate
* @param array blogsAdminister
* @param array blogsCreated
* @param array usersFriend
*}
{extends 'layouts/layout.user.tpl'}
{block 'layout_content_header' prepend}
{component 'user.header' user=$oUserProfile}
{/block}
{block 'layout_content' append}
{component 'user' template='info'
user = $oUserProfile
friends = $userFriends
usersInvited = $usersInvited
invitedByUser = $invitedByUser
blogsJoined = $blogsJoined
blogsAdminister = $blogsAdminister
blogsModerate = $blogsModerate
blogsCreated = $blogsCreated}
{/block}

View file

@ -0,0 +1,16 @@
{**
* Стена
*}
{extends 'layouts/layout.user.tpl'}
{block 'layout_user_page_title'}
{lang name='wall.title'}
{/block}
{block 'layout_content' append}
{insert name='block' block='wall' params=[
'classes' => 'js-wall-default',
'user_id' => $oUserProfile->getId()
]}
{/block}

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>{$aChannel.title}</title>
<link>{$aChannel.link}</link>
<atom:link href="{$PATH_WEB_CURRENT}/" rel="self" type="application/rss+xml" />
<description><![CDATA[{$aChannel.description}]]></description>
<language>{$aChannel.language}</language>
<managingEditor>{$aChannel.managingEditor} ({Router::GetPath('/')})</managingEditor>
<webMaster>{$aChannel.managingEditor} ({Router::GetPath('/')})</webMaster>
<copyright>{Router::GetPath('/')}</copyright>
<generator>{$aChannel.generator}</generator>
{foreach $aItems as $item}
<item>
<title>{$item.title|escape:'html'}</title>
<guid isPermaLink="true">{$item.guid}</guid>
<link>{$item.link}</link>
<dc:creator>{$item.author}</dc:creator>
<description><![CDATA[{$item.description}]]></description>
<pubDate>{date_format date=$item.pubDate format="r"}</pubDate>
<category>{$item.category|replace:',':'</category>
<category>'}</category>
</item>
{/foreach}
</channel>
</rss>

View file

@ -0,0 +1,44 @@
{**
* Страница с формой поиска
*
* @param array resultItems
* @param array paging
* @param array searchType
* @param array query
* @param array typeCounts
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{$aLang.search.search}
{/block}
{block 'layout_content_header' prepend}
{component 'search.main' searchType=$searchType}
{/block}
{block 'layout_options' append}
{$layoutNav = [
name => 'search',
activeItem => $searchType,
items => [
[ 'name' => 'topics', 'url' => "{router page='search/topics'}?q={$_aRequest.q}", 'text' => $aLang.search.result.topics, 'count' => $typeCounts.topics ],
[ 'name' => 'comments', 'url' => "{router page='search/comments'}?q={$_aRequest.q}", 'text' => $aLang.search.result.comments, 'count' => $typeCounts.comments ]
]
]}
{/block}
{block 'layout_content'}
{if $resultItems}
{if $searchType == 'topics'}
{component 'topic' template='list' topics=$resultItems paging=$paging}
{elseif $searchType == 'comments'}
{component 'comment' template='list' comments=$resultItems paging=$paging}
{else}
{hook run='search_result' type=$searchType}
{/if}
{elseif $_aRequest.q}
{component 'blankslate' text=$aLang.search.alerts.empty}
{/if}
{/block}

View file

@ -0,0 +1,18 @@
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>{Config::Get('view.name')}</ShortName>
<Description>{$sHtmlTitle}</Description>
<Contact>{Config::Get('sys.mail.from_email')}</Contact>
<Url type="text/html" template="{router page='search/topics'}?q={literal}{searchTerms}{/literal}" />
<LongName>{$sHtmlDescription}</LongName>
<Image height="64" width="64" type="image/png">{Config::Get('path.skin.assets.web')}/images/favicons/opensearch.png</Image>
<Image height="16" width="16" type="image/vnd.microsoft.icon">{Config::Get('path.skin.assets.web')}/images/favicons/favicon.ico</Image>
<Developer>{Config::Get('view.name')} ({Router::GetPath('/')})</Developer>
<Attribution>
© «{Config::Get('view.name')}»
</Attribution>
<SyndicationRight>open</SyndicationRight>
<AdultContent>false</AdultContent>
<Language>ru-ru</Language>
<OutputEncoding>UTF-8</OutputEncoding>
<InputEncoding>UTF-8</InputEncoding>
</OpenSearchDescription>

View file

@ -0,0 +1,14 @@
{**
* Уведомления о смене емэйла
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_options' append}
{$layoutShowSystemMessages = false}
{$layoutShowSidebar = false}
{/block}
{block 'layout_content'}
{$sText}
{/block}

View file

@ -0,0 +1,9 @@
{**
* Настройки аккаунта (емэйл, пароль)
*}
{extends 'layouts/layout.user.settings.tpl'}
{block 'layout_content' append}
{component 'user' template='settings/account' user=$oUserCurrent}
{/block}

View file

@ -0,0 +1,9 @@
{**
* Управление инвайтами
*}
{extends 'layouts/layout.user.settings.tpl'}
{block 'layout_content' append}
{component 'user' template='settings/invite' user=$oUserCurrent}
{/block}

View file

@ -0,0 +1,9 @@
{**
* Основные настройки профиля
*}
{extends 'layouts/layout.user.settings.tpl'}
{block 'layout_content' append}
{component 'user' template='settings/profile' user=$oUserCurrent}
{/block}

View file

@ -0,0 +1,9 @@
{**
* Настройка уведомлений
*}
{extends 'layouts/layout.user.settings.tpl'}
{block 'layout_content' append}
{component 'user' template='settings/tuning' user=$oUserCurrent}
{/block}

View file

@ -0,0 +1,12 @@
{**
* Вся активность
*
* @param array $activityEvents
* @param integer $activityEventsAllCount
*}
{extends 'layouts/layout.activity.tpl'}
{block 'layout_content'}
{component 'activity' events=$activityEvents count=$activityEventsAllCount classes='js-activity--all'}
{/block}

View file

@ -0,0 +1,12 @@
{**
* Настраиваемая, персональная страница активности
*
* @param array $activityEvents
* @param integer $activityEventsAllCount
*}
{extends 'layouts/layout.activity.tpl'}
{block 'layout_content'}
{component 'activity' events=$activityEvents count=$activityEventsAllCount classes='js-activity--personal'}
{/block}

View file

@ -0,0 +1,18 @@
{**
* Поиск по тегам
*
* @param array $topics
* @param array $paging
* @param string $tag
*}
{extends 'layouts/layout.base.tpl'}
{block 'layout_page_title'}
{lang 'tags.search.title'}
{/block}
{block 'layout_content'}
{component 'tags' template='search-form'}
{component 'topic' template='list' topics=$topics paging=$paging}
{/block}

View file

@ -0,0 +1,9 @@
{**
* Создание личного сообщения
*}
{extends 'layouts/layout.user.messages.tpl'}
{block 'layout_content'}
{component 'talk' template='add'}
{/block}

View file

@ -0,0 +1,11 @@
{**
* Черный список
*
* @param array $talkBlacklistUsers
*}
{extends 'layouts/layout.user.messages.tpl'}
{block 'layout_content'}
{component 'talk' template='blacklist' users=$talkBlacklistUsers}
{/block}

View file

@ -0,0 +1,12 @@
{**
* Список избранных сообщений
*
* @param array $talks
* @param array $paging
*}
{extends 'layouts/layout.user.messages.tpl'}
{block 'layout_content'}
{component 'talk.list' talks=$talks paging=$paging}
{/block}

View file

@ -0,0 +1,13 @@
{**
* Список сообщений
*
* @param array $talks
* @param array $paging
*}
{extends 'layouts/layout.user.messages.tpl'}
{block 'layout_content'}
{component 'talk' template='search-form'}
{component 'talk' template='list' talks=$talks paging=$paging selectable=true}
{/block}

View file

@ -0,0 +1,17 @@
{**
* Диалог
*
* @param object $talk
* @param array $comments
* @param integer $lastCommentId
*}
{extends 'layouts/layout.user.messages.tpl'}
{block 'layout_content'}
{component 'talk'
talk = $talk
comments = $comments
lastCommentId = $lastCommentId
activeParticipantsCount = $activeParticipantsCount}
{/block}

View file

@ -0,0 +1,8 @@
{**
* Лента пользователя
*
* @param array $topics
* @param array $paging
*}
{extends 'layouts/layout.index.tpl'}

View file

@ -0,0 +1,134 @@
/**
* Сетка
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
/* Основной блок */
.layout-container {
margin: 0 auto;
padding: 0 50px;
}
/* Навигация */
.layout-nav {
min-height: 26px;
margin: 0 auto 32px;
overflow: hidden;
padding: 15px 17px 15px;
box-sizing: border-box;
box-shadow: 0 0 10px rgba(0,0,0,.15);
border-radius: 0 0 10px 10px;
position: relative;
background: #fdfdfd;
background: -moz-linear-gradient(top, #fdfdfd 0%, #f6f8f9 100%);
background: -webkit-linear-gradient(top, #fdfdfd 0%,#f6f8f9 100%);
background: linear-gradient(top, #fdfdfd 0%,#f6f8f9 100%);
}
.layout-nav-main .ls-nav-item {
margin-right: 10px;
}
/* Враппер для контента и сайдбара */
.layout-wrapper {
margin-bottom: 60px;
position: relative;
border-bottom: 1px solid #eee;
box-shadow: 0 0 5px rgba(0, 0, 0, .05);
border-radius: 10px;
background: #fff;
}
/* Вертикальная линия разделяющая контент и сайдбар */
.layout-wrapper:before {
content: "";
width: 1px;
position: absolute;
top: 0;
bottom: 0;
right: 30%;
background: #f1f3f5;
}
/* Контент */
.layout-content {
float: left;
width: 70%;
padding: 20px;
box-sizing: border-box;
}
/* Отображение контента без сайдбара */
.layout-container.layout-no-sidebar .layout-content {
width: 100%;
margin-right: 0;
}
.layout-container.layout-no-sidebar .layout-wrapper:before {
display: none;
}
/* Сайдбар */
.layout-sidebar {
float: left;
width: 30%;
padding: 20px;
box-sizing: border-box;
}
/* Подвал */
.layout-footer {
padding: 0 0 50px 30px;
color: #000;
font-size: 11px;
}
.layout-footer a {
color: #000;
text-decoration: underline;
}
.layout-footer a:hover {
color: #777;
}
.layout-footer-copyright {
float: right;
width: 255px;
}
.layout-footer-design-by {
overflow: hidden;
line-height: 15px;
margin-top: 30px;
}
.layout-footer-design-by img {
float: left;
margin-right: 10px;
margin-top: 3px;
}
.layout-footer-design-by div {
font-size: 10px;
color: #8b9191;
margin-top: 1px;
}
.layout-footer-links {
float: left;
width: 138px;
padding-right: 20px;
}
.layout-footer-links-title {
margin-bottom: 11px;
color: #000;
font-family: Verdana;
font-size: 12px;
font-weight: bold;
}
.layout-footer-links-nav .ls-nav-item {
margin-bottom: 3px;
}
.layout-footer-links-nav a {
color: #4c4c4c;
}

View file

@ -0,0 +1,37 @@
/**
* Стили для печати
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
@media print {
@page { margin: 0.5cm; }
* { background: transparent !important; color: black !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; }
body, .text { font-size: 14pt; }
a, a:visited { text-decoration: underline; }
pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
thead { display: table-header-group; }
tr, img { page-break-inside: avoid; }
img { max-width: 100% !important; }
h1 { font-size: 30pt !important; }
h4 { font-size: 26pt !important; }
h5 { font-size: 23pt !important; }
h6 { font-size: 20pt !important; }
p, h3, h4, h5 { orphans: 3; widows: 3; }
h3, h4, h5 { page-break-after: avoid; }
#header, #userbar, #nav, #sidebar, #footer, #comments, .toolbar, .nav-filter-wrapper,
.topic-footer, .stat-performance, .actions, .reply-header { display: none !important; }
#wrapper { -webkit-box-shadow: none; box-shadow: none; border: 0; padding: 0; }
#content { width: 100%; margin: 0; }
.topic { margin-bottom: 100px; }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,653 @@
/**
* Инициализации модулей
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
jQuery(document).ready(function($){
// Хук начала инициализации javascript-составляющих шаблона
ls.hook.run('ls_template_init_start',[],window);
$('html').removeClass('no-js');
/**
* Иниц-ия модулей ядра
*/
ls.init({
production: false
});
ls.dev.init();
/**
* Form validate
* Валидатор нужно иниц-ть до иниц-ии аякс форм, чтобы избежать валидации аякс-полей после сабмита формы
*/
$('.js-form-validate').parsley();
/**
* Userbar
*/
$('.js-userbar').lsUserbar();
$('.js-search-hideable').lsSearchHideable();
/**
* Навигация по контенту
*/
$('.ls-nav--root.ls-nav--pills > .ls-nav-item--has-children').lsDropdown({
selectors: {
toggle: '> .ls-nav-item-link',
text: '> .ls-nav-item-link > .ls-nav-item-text',
menu: '> .ls-nav--sub'
},
selectable: true
});
/**
* Подтверждение удаления
*/
$('.js-confirm-remove-default').livequery(function () {
$(this).lsConfirm({
message: ls.lang.get('common.remove_confirm')
});
});
/**
* Notification
*/
ls.notification.init();
/**
* Actionbar
*/
$('.js-user-list-modal-actionbar').livequery(function () {
$( this ).lsActionbarItemSelect({
selectors: {
target_item: '.js-user-list-select .js-user-list-small-item'
}
});
});
/**
* Modals
*/
$('.js-modal-default').lsModal();
$('.js-modal-toggle-default').lsModalToggle();
/**
* Details
*/
$('.js-details-default').lsDetails();
/**
* Dropdowns
*/
$('.js-dropdown-default').livequery(function () {
$(this).lsDropdown();
});
/**
* Fields
*/
$('.js-field-geo-default').lsFieldGeo({
urls: {
regions: aRouter.ajax + 'geo/get/regions/',
cities: aRouter.ajax + 'geo/get/cities/'
}
});
$('.js-field-date-default').livequery(function () {
$(this).lsDate({
language: LANGUAGE
});
});
$('.js-field-time-default').livequery(function () {
$(this).lsTime();
});
$('[data-type=captcha]').livequery(function () {
$(this).lsCaptcha();
});
$('[data-type=recaptcha]').livequery(function () {
$(this).lsReCaptcha({
key: ls.registry.get('recaptcha.site_key')
});
});
/**
* Alerts
*/
$('.js-alert').lsAlert();
/**
* Tooltips
*/
$('.js-tooltip').lsTooltip();
$('.js-popover-default').lsTooltip({
useAttrTitle: false,
trigger: 'click',
classes: 'tooltip-light'
});
if (ls.registry.get('block_stream_show_tip')) {
$('.js-title-comment, .js-title-topic').livequery(function () {
$(this).lsTooltip({
position: {
my: "right center",
at: "left left"
},
show: {
delay: 1500
}
});
});
}
/**
* Autocomplete
*/
$( '.autocomplete-tags' ).lsAutocomplete({
multiple: false,
urls: {
load: aRouter.ajax + 'autocompleter/tag/'
}
});
$( '.autocomplete-tags-sep' ).lsAutocomplete({
multiple: true,
urls: {
load: aRouter.ajax + 'autocompleter/tag/'
}
});
$( '.autocomplete-users' ).lsAutocomplete({
multiple: false,
urls: {
load: aRouter.ajax + 'autocompleter/user/'
}
});
$( '.autocomplete-users-sep' ).lsAutocomplete({
multiple: true,
urls: {
load: aRouter.ajax + 'autocompleter/user/'
}
});
$('.autocomplete-property-tags').each(function(k,v){
$(v).lsAutocomplete({
multiple: false,
urls: {
load: aRouter.ajax + 'property/tags/autocompleter/'
},
params: {
property_id: $(v).data('propertyId')
}
});
});
$('.autocomplete-property-tags-sep').each(function(k,v){
$(v).lsAutocomplete({
multiple: true,
urls: {
load: aRouter.ajax + 'property/tags/autocompleter/'
},
params: {
property_id: $(v).data('propertyId')
}
});
});
/**
* Code highlight
*/
$( 'pre code' ).lsHighlighter();
/**
* Blocks
*/
$( '.js-block-default' ).lsBlock();
/**
* Активность
*/
$('.js-activity--all').lsActivity({ urls: { more: aRouter.stream + 'get_more_all' } });
$('.js-activity--user').lsActivity({ urls: { more: aRouter.stream + 'get_more_user' } });
$('.js-activity--personal').lsActivity({
urls: {
more: aRouter.stream + 'get_more_personal'
},
create: function() {
// Настройки активности
$('.js-activity-settings').lsActivitySettings({
urls: {
toggle_type: aRouter.stream + 'switchEventType'
}
});
// Добавление пользователей в персональную активность
$('.js-activity-users').lsUserListAdd({
urls: {
add: aRouter.stream + 'ajaxadduser',
remove: aRouter.stream + 'ajaxremoveuser',
list: aRouter.ajax + 'modal-friend-list'
}
});
}
});
/**
* Лента
*/
// Блоги
$('.js-feed-blogs').lsFeedBlogs({
urls: {
subscribe: aRouter.feed + 'subscribe',
unsubscribe: aRouter.feed + 'unsubscribe'
}
});
// Добавление пользователей в свою ленту
$('.js-feed-users').lsUserListAdd({
urls: {
add: aRouter.feed + 'ajaxadduser',
remove: aRouter.feed + 'unsubscribe',
list: aRouter.ajax + 'modal-friend-list'
}
});
/**
* Auth
*/
ls.auth.init();
// Поиск
$( '.js-search-ajax-users' ).lsSearchAjax({
urls: {
search: aRouter.people + 'ajax-search/'
},
i18n: {
title: ls.lang.get( 'user.search.result_title' )
},
selectors: {
list: '.js-more-users-container',
more: '.js-more-search',
title: '@.js-user-list-search-title'
},
filters : [
{
type: 'text',
name: 'sText',
selector: '.js-search-text-main'
},
{
type: 'radio',
name: 'sex',
selector: '.js-search-ajax-user-sex'
},
{
type: 'checkbox',
name: 'is_online',
selector: '.js-search-ajax-user-online'
},
{
type: 'sort',
name: 'sort_by',
selector: '.js-search-sort-menu li'
},
{
type: 'select',
name: 'country',
selector: '.js-field-geo-country'
},
{
type: 'select',
name: 'region',
selector: '.js-field-geo-region'
},
{
type: 'select',
name: 'city',
selector: '.js-field-geo-city'
}
],
afterupdate: function ( event, data ) {
data.context.getElement( 'more' ).lsMore( 'option', 'params.next_page', 2 );
}
});
// Добавление пользователя в свою активность
$('.js-user-follow').lsUserFollow({
urls: {
follow: aRouter['stream'] + 'ajaxadduser/',
unfollow: aRouter['stream'] + 'ajaxremoveuser/'
}
});
// Добавление пользователя в друзья
$('.js-user-friend').lsUserFriend({
urls: {
add: aRouter.profile + 'ajaxfriendadd/',
remove: aRouter.profile + 'ajaxfrienddelete/',
accept: aRouter.profile + 'ajaxfriendaccept/',
modal: aRouter.profile + 'ajax-modal-add-friend'
}
});
// Жалоба
$('.js-user-report').lsReport({
urls: {
modal: aRouter.profile + 'ajax-modal-complaint',
add: aRouter.profile + 'ajax-complaint-add'
}
});
// Управление кастомными полями
$( '.js-user-fields' ).lsUserFields();
// Фото пользователя
$( '.js-user-photo' ).lsPhoto({
urls: {
upload: aRouter.settings + 'ajax-upload-photo',
remove: aRouter.settings + 'ajax-remove-photo',
crop_photo: aRouter.settings + 'ajax-modal-crop-photo',
crop_avatar: aRouter.settings + 'ajax-modal-crop-avatar',
save_photo: aRouter.settings + 'ajax-crop-photo',
save_avatar: aRouter.settings + 'ajax-change-avatar',
cancel_photo: aRouter.settings + 'ajax-crop-cancel-photo'
},
changeavatar: function ( event, _this, avatars ) {
$( '.js-user-profile-avatar, .js-wall-entry[data-user-id=' + _this.option( 'params.user_id' ) + '] .comment-avatar img' ).attr( 'src', avatars[ '64crop' ] + '?' + Math.random() );
$( '.nav-item--userbar-username img' ).attr( 'src', avatars[ '24crop' ] + '?' + Math.random() );
}
});
/**
* Talk
*/
$('.js-talk-list').lsTalkList();
// Выбор получателей в форме добавления
$('.js-talk-add-user-choose').lsUserFieldChoose({
urls: {
modal: aRouter.ajax + 'modal-friend-list'
}
});
// Форма поиска
$('.js-talk-search-form').lsDetails();
// Добавление диалога в избранное
$('.js-favourite-talk').lsFavourite({
urls: {
toggle: aRouter['ajax'] + 'favourite/talk/'
}
});
// Добавление в избранное на странице диалога
$('.js-talk-message-root-favourite').on('click', function (event) {
if (event.target == event.currentTarget) {
$(this).find('.js-favourite-talk').lsFavourite('toggle');
}
});
// Комментарии
$('.js-comments-talk').lsComments({
urls: {
add: aRouter['talk'] + 'ajaxaddcomment/',
load: aRouter['talk'] + 'ajaxresponsecomment/'
}
});
// Управление участниками личного сообщения
$('.js-message-users').lsTalkUsers();
// Черный список
$('.js-user-list-add-blacklist').lsUserListAdd({
urls: {
add: aRouter['talk'] + 'ajaxaddtoblacklist/',
remove: aRouter['talk'] + 'ajaxdeletefromblacklist/',
list: aRouter.ajax + 'modal-friend-list'
}
});
/**
* Poll
*/
$('.js-poll').lsPoll();
$('.js-poll-manage').lsPollManage({
max: ls.registry.get('poll_max_answers')
});
/**
* User Note
*/
$('.js-user-note').livequery(function () {
$(this).lsNote({
urls: {
save: aRouter['profile'] + 'ajax-note-save/',
remove: aRouter['profile'] + 'ajax-note-remove/'
}
});
});
/**
* Editor
*/
$( '.js-editor-default' ).lsEditor();
/**
* Blog
*/
// Форма добавления блога
$('.js-blog-add').lsBlogAdd();
// Приглашение пользователей в блог
$('.js-user-list-add-blog-invite').lsBlogInvites();
// Вступить/покинуть блог (список блогов)
$( '.js-blog-join' ).livequery(function() {
$( this ).lsBlogJoin({
urls: {
toggle: aRouter.blog + 'ajaxblogjoin'
},
classes: {
loading: ls.options.classes.states.loading
}
});
});
// Вступить/покинуть блог (страница блога)
$( '.js-blog-profile-join' ).lsBlogJoin({
urls: {
toggle: aRouter.blog + 'ajaxblogjoin'
},
selectors: {
text: 'a'
},
classes: {
active: 'active'
}
});
// Поиск
$( '.js-search-ajax-blog' ).lsSearchAjax({
urls: {
search: aRouter.blogs + 'ajax-search/'
},
i18n: {
title: ls.lang.get( 'blog.search.result_title' )
},
selectors: {
list: '.js-more-blogs-container',
more: '.js-more-search',
title: '@.js-blog-list-search-title'
},
filters : [
{
type: 'text',
name: 'sText',
selector: '.js-search-text-main'
},
{
type: 'radio',
name: 'type',
selector: '.js-search-ajax-blog-type'
},
{
type: 'radio',
name: 'relation',
selector: '.js-search-ajax-blog-relation'
},
{
type: 'list',
name: 'category',
selector: '#js-search-ajax-blog-category li'
},
{
type: 'sort',
name: 'sort_by',
selector: '.js-search-sort-menu li'
}
],
afterupdate: function ( event, data ) {
data.context.getElement( 'more' ).lsMore( 'option', 'params.next_page', 2 );
}
});
// Аватар блога
$( '.js-blog-avatar' ).lsPhoto({
urls: {
upload: aRouter.blog + 'ajax/upload-avatar',
remove: aRouter.blog + 'ajax/remove-avatar',
crop_photo: aRouter.blog + 'ajax/modal-crop-avatar',
save_photo: aRouter.blog + 'ajax/crop-avatar',
cancel_photo: aRouter.blog + 'ajax/crop-cancel-avatar'
},
use_avatar: false,
crop_photo: {
minSize: [ 100, 100 ],
usePreview: true
}
});
/**
* Topic
*/
$( '.js-topic' ).lsTopic();
// Форма добавления
$( '#topic-add-form' ).lsTopicAdd({
max_blog_count: ls.registry.get('topic_max_blog_count')
});
// Пагинация
$('.js-pagination-topics').lsPagination({
hash: {
next: 'goTopic=first',
prev: 'goTopic=last'
}
});
// Комментарии
$('.js-topic-comments, .js-topic-comments-list').lsComments({
urls: {
add: aRouter['blog'] + 'ajaxaddcomment/',
load: aRouter['blog'] + 'ajaxresponsecomment/'
},
show_form: ls.registry.get('comment_show_form')
});
// Кнопка обновления комментариев
// TODO: Fix init
$('.js-comments-toolbar').lsCommentsToolbar({
comments: $('.js-topic-comments, .js-comments-talk')
});
/**
* Теги
*/
// Облако тегов избранного
$('.js-tags-favourite-cloud').lsDetails();
// Поиск по тегам
$('.js-tag-search-form').submit(function() {
var val = $(this).find('.js-tag-search').val();
if ( val ) {
window.location = aRouter['tag'] + encodeURIComponent( val ) + '/';
}
return false;
});
/**
* Стена
*/
$('.js-wall-default').lsWall({
urls: {
add: aRouter.ajax + 'wall/add/',
remove: aRouter.ajax + 'wall/remove/',
load: aRouter.ajax + 'wall/load/',
load_comments: aRouter.ajax + 'wall/load-comments/'
}
});
/**
* Лайтбокс
*/
$('a.js-lbx').lsLightbox({ width:"100%", height:"100%" });
/**
* Toolbar
*/
$('.js-toolbar-default').lsToolbar({
target: '.layout-wrapper',
offsetX: 10
});
$('.js-toolbar-scrollup').lsToolbarScrollUp();
$('.js-toolbar-topics').lsToolbarTopics();
/**
* Fotorama
*/
$( '.fotorama' ).livequery(function() {
$( this ).lsSlider();
});
// Хук конца инициализации javascript-составляющих шаблона
ls.hook.run('ls_template_init_end',[],window);
});

View file

@ -0,0 +1,25 @@
{**
* Последняя активность
*}
{component_define_params params=[ 'content' ]}
{* Подвал *}
{capture 'block_footer'}
<a href="{router 'stream'}">{lang 'activity.block_recent.all'}</a> ·
<a href="{router 'rss'}allcomments/">{lang 'activity.block_recent.feed'}</a>
{/capture}
{component 'block'
mods = 'primary activity-recent'
classes = 'js-block-default'
title = {lang 'activity.block_recent.title'}
titleUrl = {router 'stream'}
footer = $smarty.capture.block_footer
tabs = [
'classes' => 'js-tabs-block js-activity-block-recent-tabs',
'tabs' => [
[ 'text' => {lang 'activity.block_recent.comments'}, 'url' => "{router page='ajax'}stream/comment", 'list' => $content ],
[ 'text' => {lang 'activity.block_recent.topics'}, 'url' => "{router page='ajax'}stream/topic" ]
]
]}

View file

@ -0,0 +1,8 @@
{**
* Блок настройки ленты активности
*}
{component 'block'
mods = 'activity-settings'
title = {lang 'activity.settings.title'}
content = {component 'activity' template='settings' typesActive=$typesActive types=$types}}

View file

@ -0,0 +1,8 @@
{**
* Выбор пользователей для чтения в ленте активности
*}
{component 'block'
mods = 'activity-users'
title = {lang 'activity.users.title'}
content = {component 'activity' template='users' users=$users}}

View file

@ -0,0 +1,21 @@
{**
* Последняя активность
* Топики отсортированные по времени последнего комментария
*}
{component_define_params params=[ 'comments' ]}
{capture 'items'}
{foreach $comments as $comment}
{$topic = $comment->getTarget()}
{component 'activity' template='recent-item'
user = $comment->getUser()
topic = $topic
date = $comment->getDate()}
{foreachelse}
{component 'blankslate' text={lang 'common.empty'} mods='no-background'}
{/foreach}
{/capture}
{component 'item' template='group' items=$smarty.capture.items}

View file

@ -0,0 +1,26 @@
{component_define_params params=[ 'user', 'topic', 'date' ]}
{capture 'item_content'}
<a href="{$user->getUserWebPath()}" class="ls-activity-block-recent-user">{$user->getDisplayName()}</a> &rarr;
<a href="{$topic->getUrl()}">{$topic->getTitle()|escape}</a>
<p class="ls-activity-block-recent-info">
<time datetime="{date_format date=$date format='c'}" class="ls-activity-block-recent-time">
{date_format date=$date hours_back="12" minutes_back="60" now="60" day="day H:i" format="j F Y"}
</time>
<a href="{$topic->getUrl()}#comments" class="ls-activity-block-recent-comments">
{component 'icon' icon='comments'}
{lang 'comments.comments_declension' count=$topic->getCountComment() plural=true}
</a>
</p>
{/capture}
{component 'item'
element = 'li'
mods = 'image-rounded'
desc = $smarty.capture.item_content
image=[
'path' => $user->getProfileAvatarPath(48),
'url' => $user->getUserWebPath()
]}

View file

@ -0,0 +1,19 @@
{**
* Последняя активность
* Последние топики
*}
{component_define_params params=[ 'topics' ]}
{capture 'items'}
{foreach $topics as $topic}
{component 'activity' template='recent-item'
user = $topic->getUser()
topic = $topic
date = $topic->getDatePublish()}
{foreachelse}
{component 'blankslate' text={lang 'common.empty'} mods='no-background'}
{/foreach}
{/capture}
{component 'item' template='group' items=$smarty.capture.items}

View file

@ -0,0 +1,47 @@
/**
* Активность
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
/**
* Список событий
*/
.activity-event-list {
margin: 0 0 20px;
}
/* Дата-заголовок */
.activity-date {
font: 400 18px/1.3em 'Open Sans', sans-serif;
padding: 10px 0;
border-bottom: 1px solid #E7E7E7;
}
.activity-event + .activity-date {
margin-top: 30px;
}
/**
* Событие
*/
.activity-event {
padding: 15px;
}
.activity-event + .activity-event {
border-top: 1px solid #f2f2f2;
}
.activity-event-date {
display: block;
color: #999;
margin-bottom: 4px;
}
.activity-event-text {
padding: 10px 15px;
margin-top: 10px;
color: #777;
background: #fafafa;
font-size: 13px;
}

View file

@ -0,0 +1,26 @@
/**
* Последняя активность
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.ls-activity-block-recent-user {
font-weight: bold;
color: #333;
}
.ls-activity-block-recent-info {
margin-top: 5px;
color: #999;
font-size: 12px;
}
.ls-activity-block-recent-comments {
margin-left: 10px;
color: #666;
}
.ls-activity-block-recent-comments:hover {
color: #444;
}

View file

@ -0,0 +1,91 @@
/**
* Уведомления
*
* @module ls/alert
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.ls-alert {
position: relative;
background-color: #d9edf7;
color: #3a87ad;
padding: 10px 15px;
margin-bottom: 15px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.ls-alert:last-child {
margin-bottom: 0;
}
/* Заголовок */
.ls-alert-title {
padding-top: 3px;
margin-bottom: 10px;
font-size: 16px;
font-weight: normal;
}
.ls-alert-title:last-child {
margin-bottom: 0;
}
/* Кнопка закрывающая уведомление */
.ls-alert-close {
border: none;
background-color: transparent;
padding: 0;
margin: 0;
width: 14px;
height: 14px;
position: absolute;
top: 10px;
right: 12px;
cursor: pointer;
opacity: .6;
}
.ls-alert-close:hover {
opacity: 1;
}
/**
* @modifier dismissible
*/
.ls-alert.ls-alert--dismissible {
padding-right: 35px;
}
/**
* @modifier error Ошибка
*/
.ls-alert.ls-alert--error {
background-color: #f0c8c8;
color: #b22626;
}
/**
* @modifier success Успешно завершено
*/
.ls-alert.ls-alert--success {
background-color: #dafad8;
color: #4bb23b;
}
/**
* @modifier info Информация
*/
.ls-alert.ls-alert--info {
background-color: #d9edf7;
color: #3a87ad;
}
/**
* @modifier empty Пусто
*/
.ls-alert.ls-alert--empty {
background-color: #fafafa;
color: #777;
}

View file

@ -0,0 +1,37 @@
/**
* Blankslate
*
* @module ls/blankslate
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.ls-blankslate {
margin-bottom: 15px;
padding: 30px;
text-align: center;
color: #aaa;
}
.ls-blankslate:last-child {
margin-bottom: 0;
}
/* Заголовок */
.ls-blankslate-title {
margin-bottom: 15px;
font-size: 18px;
font-weight: bold;
}
.ls-blankslate-title:last-child {
margin-bottom: 0;
}
/**
* @modifier no-background
*/
.ls-blankslate--no-background {
border: none;
background: transparent;
}

View file

@ -0,0 +1,76 @@
{**
* Блок
*
* @param string $title Заголовок
* @param string $content
* @param boolean $show
* @param array|string $list
* @param array|string $tabs
* @param string $mods Список модификторов основного блока (через пробел)
* @param string $classes Список классов основного блока (через пробел)
* @param array $attributes Список атрибутов основного блока
*}
{$component = 'ls-block'}
{component_define_params params=[ 'title', 'content', 'show', 'footer', 'list', 'tabs', 'mods', 'classes', 'attributes' ]}
{block 'block_options'}{/block}
{$show = $show|default:true}
{if $show}
<div class="{$component} {cmods name=$component mods=$mods} {$classes}" {cattr list=$attributes}>
{* Шапка *}
{if $title}
<header class="{$component}-header">
{block 'block_header_inner'}
<h3 class="{$component}-title">
{$title}
</h3>
{/block}
</header>
{/if}
{block 'block_header_after'}{/block}
{* Содержимое *}
{if $content}
{block 'block_content'}
<div class="{$component}-content">
{block 'block_content_inner'}
{$content}
{/block}
</div>
{/block}
{/if}
{block 'block_content_after'}{/block}
{* List group *}
{if is_array( $list )}
{component 'item' template='group' params=$list}
{elseif $list}
{$list}
{/if}
{* Tabs *}
{if is_array( $tabs )}
{component 'tabs' classes='js-tabs-block' params=$tabs}
{elseif $tabs}
{$tabs}
{/if}
{* Подвал *}
{if $footer}
{block 'block_footer'}
<div class="{$component}-footer">
{block 'block_footer_inner'}
{$footer}
{/block}
</div>
{/block}
{/if}
{block 'block_footer_after'}{/block}
</div>
{/if}

View file

@ -0,0 +1,95 @@
/**
* Блок
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.ls-block {
overflow: hidden;
}
.ls-block + .ls-block {
margin-top: 50px;
}
.ls-block:last-child {
margin-bottom: 0;
}
.ls-block .text-help {
font-size: 11px;
line-height: 14px;
}
.ls-block .ls-text {
font-size: 13px;
line-height: 18px;
}
.ls-block .max-height-200 {
overflow: auto;
max-height: 200px;
position: relative;
}
/* Шапка */
.ls-block-header {
padding: 0 0 15px;
position: relative;
}
.ls-block-header .ls-block-title {
margin-bottom: 0;
font-size: 22px;
line-height: 1em;
font-weight: normal;
color: #333;
}
/* Навигация */
.ls-block .ls-tab-list {
padding: 15px 0;
margin-bottom: 0;
border-bottom: 1px solid #eee;
}
/* Контент */
.ls-block-content {
}
/* Подвал */
.ls-block-footer {
border-top: 1px solid #eee;
padding: 15px 0;
font-size: 11px;
color: #b9c2c2;
}
.ls-block-footer a {
color: #727a90;
text-decoration: underline;
}
.ls-block-footer .ls-search-form {
padding: 0;
margin: 5px 0;
}
/**
* Поддержка списков
*/
.ls-block .ls-item-group {
border: none;
}
.ls-block .ls-block-content + .ls-item-group {
border-top: 1px solid #eee;
}
/**
* @modifier nopadding Блок без отступов у контента
*/
.ls-block--nopadding .ls-block-content {
padding: 0;
}
/**
* @modifier transparent Блок без фона
*/
.ls-block--transparent {
background-color: transparent;
border-color: transparent;
}

View file

@ -0,0 +1,232 @@
/**
* Buttons
* Стили частично позаимствованы у бутстрапа
*
* @module ls/button
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.ls-button {
display: inline-block;
margin: 0;
border: 1px solid transparent;
text-align: center;
vertical-align: middle;
text-decoration: none;
touch-action: manipulation;
white-space: nowrap;
line-height: normal;
color: #444;
cursor: pointer;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: color .1s, border-color .1s;
-moz-transition: color .1s, border-color .1s;
transition: color .1s, border-color .1s;
border-radius: 5px;
border: 1px solid transparent;
font-family: Verdana, sans-serif;
}
.ls-button:active,
.ls-button.active {
outline: none;
-webkit-box-shadow: inset 0 0px 7px rgba(0,0,0,.2);
box-shadow: inset 0 0 7px rgba(0,0,0,.2);
}
/* Icon */
.ls-button [class^="icon-"],
.ls-button [class*=" icon-"] {
float: left;
position: relative;
margin: 0px 5px 1px 0;
}
/**
* Colors
*/
.ls-button {
color: #434343;
border-color: #dfe3e8;
background: #fbfcfc;
background: -moz-linear-gradient(top, #fbfcfc 0%, #f0f2f5 100%);
background: -webkit-linear-gradient(top, #fbfcfc 0%,#f0f2f5 100%);
background: linear-gradient(top, #fbfcfc 0%,#f0f2f5 100%);
}
.ls-button:active,
.ls-button.active,
.ls-button:hover {
border-color: #adadad;
}
.ls-button--primary {
color: #fff;
border-color: #27ace8;
background: #66cfff;
background: -moz-linear-gradient(top, #66cfff 0%, #2abcfe 100%);
background: -webkit-linear-gradient(top, #66cfff 0%,#2abcfe 100%);
background: linear-gradient(top, #66cfff 0%,#2abcfe 100%);
}
.ls-button--primary:active,
.ls-button--primary.active,
.ls-button--primary:hover {
color: #fff;
background: #2abcfe;
border-color: #27ace8;
}
.ls-button--success {
color: #fff;
background: #5cb85c;
border-color: #4cae4c;
}
.ls-button--success:active,
.ls-button--success.active,
.ls-button--success:hover {
color: #fff;
background: #449d44;
border-color: #398439;
}
.ls-button--info {
color: #fff;
background: #5bc0de;
border-color: #46b8da;
}
.ls-button--info:active,
.ls-button--info.active,
.ls-button--info:hover {
color: #fff;
background: #31b0d5;
border-color: #269abc;
}
.ls-button--warning {
color: #fff;
background: #f0ad4e;
border-color: #eea236;
}
.ls-button--warning:active,
.ls-button--warning.active,
.ls-button--warning:hover {
color: #fff;
background: #ec971f;
border-color: #d58512;
}
.ls-button--danger {
color: #fff;
border-color: #d43f3a;
background: #d9534f;
background: -moz-linear-gradient(top, #f1726e 0%, #d9534f 100%);
background: -webkit-linear-gradient(top, #f1726e 0%,#d9534f 100%);
background: linear-gradient(top, #f1726e 0%,#d9534f 100%);
}
.ls-button--danger:active,
.ls-button--danger.active,
.ls-button--danger:hover {
color: #fff;
background: #d9534f;
border-color: #ac2925;
}
/**
* Disabled
*/
.ls-button.disabled,
.ls-button.disabled:hover,
.ls-button[disabled],
.ls-button[disabled]:hover {
border-color: #ccc;
background: #eee;
color: #999;
}
.ls-button.disabled:active,
.ls-button[disabled]:active {
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}
/**
* Icon
*/
.ls-button.ls-button--icon { padding-left: 8px; padding-right: 8px; }
.ls-button.ls-button--icon [class^="icon-"],
.ls-button.ls-button--icon [class*=" icon-"] { margin-right: 0; float: none; }
/**
* Sizes
*/
.ls-button {
padding: 7px 12px;
font-size: 13px;
}
.ls-button--large {
padding: 10px 16px;
font-size: 18px;
}
.ls-button--small {
padding: 4px 10px 6px;
font-size: 11px;
}
.ls-button--xsmall {
padding: 1px 5px;
font-size: 12px;
}
.ls-button--block {
display: block;
width: 100%;
}
.ls-button--block + .ls-button--block {
margin-top: 5px;
}
input[type="submit"].ls-button--block,
input[type="reset"].ls-button--block,
input[type="button"].ls-button--block {
width: 100%;
}
/**
* Loading
*/
.ls-button[disabled].ls-loading,
.ls-button.ls-loading {
color: transparent;
background-repeat: no-repeat;
background-position: 50% 50%;
transition: none;
}
/**
* Счетчик
*/
.ls-button .ls-badge {
vertical-align: middle;
line-height: 18px;
}
.ls-button--primary .ls-badge { background: #fff; color: #286090; }
.ls-button--success .ls-badge { background: #fff; color: #5cb85c; }
.ls-button--info .ls-badge { background: #fff; color: #5bc0de; }
.ls-button--warning .ls-badge { background: #fff; color: #f0ad4e; }
.ls-button--danger .ls-badge { background: #fff; color: #d9534f; }
/**
* Закругленные углы
*/
.ls-button--round {
border-radius: 30px;
}

View file

@ -0,0 +1,16 @@
{**
* Действие
*}
{$component = 'ls-comment-actions-item'}
{component_define_params params=[ 'text', 'link', 'mods', 'classes', 'attributes' ]}
<li class="{$component} {cmods name=$component mods=$mods} {$classes}" {cattr list=$attributes}>
{if $link}
<a href="{$link.url|default:'#'}" class="ls-link-dotted {$link.classes}" {cattr list=$link.attributes}>
{$text}
</a>
{else}
{$text}
{/if}
</li>

View file

@ -0,0 +1,62 @@
{**
* Форма комментирования
*
* @param integer $targetId
* @param string $targetType
* @param string $editorSet (light) Стиль редактора
*
* @param string $classes Дополнительные классы
* @param string $attributes Атрибуты
* @param string $mods Модификаторы
*}
{* Название компонента *}
{$component = 'ls-comment-form'}
{component_define_params params=[ 'editorSet', 'targetId', 'targetType', 'mods', 'classes', 'attributes' ]}
{* Форма *}
<form method = "post"
class = "{$component} {cmods name=$component mods=$mods} {$classes}"
enctype = "multipart/form-data"
data-target-id = "{$targetId}"
data-target-type = "{$targetType}"
{cattr list=$attributes}>
{block 'comment-form'}
{* @hook Начало формы комментирования *}
{hook run='comment_form_begin' params=$params}
{block 'comment-form-fields'}
{* Скрытые поля *}
{component 'field' template='hidden' name='reply' value='0' inputClasses='js-comment-form-id'}
{component 'field' template='hidden' name='comment_target_id' value=$targetId}
{* Текст комментария *}
{component 'editor'
set = $editorSet|default:'light'
name = 'comment_text'
inputClasses = 'js-comment-form-text'
help = false
mediaTargetType = 'comment'}
{/block}
{* @hook Хук расположенный после полей формы и перед кнопками управления формой *}
{hook run='comment_form_fields_after' params=$params}
{**
* Кнопки
*}
{* Кнопка добавления *}
{component 'button' name='submit_comment' text=$aLang.common.add mods='primary' classes='js-comment-form-submit'}
{* Кнопки редактирования *}
{component 'button' name='submit_comment' text=$aLang.common.save mods='primary' classes='js-comment-form-update-submit hide'}
{component 'button' name='submit_comment' type='button' text=$aLang.common.cancel classes='js-comment-form-update-cancel ls-fl-r'}
{* Кнопка превью текста *}
{component 'button' text=$aLang.common.preview_text type='button' classes='js-comment-form-preview'}
{* @hook Конец формы комментирования *}
{hook run='comment_form_end' params=$params}
{/block}
</form>

View file

@ -0,0 +1,16 @@
{**
* Пункт с информацией
*}
{$component = 'ls-comment-info-item'}
{component_define_params params=[ 'text', 'link', 'mods', 'classes', 'attributes' ]}
<li class="{$component} {cmods name=$component mods=$mods} {$classes}" {cattr list=$attributes}>
{if $link}
<a href="{$link.url|default:'#'}" class="{$link.classes}" {cattr list=$link.attributes}>
{$text}
</a>
{else}
{$text}
{/if}
</li>

View file

@ -0,0 +1,227 @@
{**
* Комментарий
*
* @param object $comment Комментарий
* @param boolean $useVote (true) Показывать или нет голосование
* @param boolean $useFavourite
* @param boolean $useScroll
* @param boolean $showReply (true) Показывать или нет кнопку Ответить
* @param integer $authorId
* @param string $authorText
* @param string $dateReadLast
*
* @param string $classes Дополнительные классы
* @param string $attributes Атрибуты
* @param string $mods Модификаторы
*}
{* Название компонента *}
{$component = 'ls-comment'}
{component_define_params params=[ 'dateReadLast', 'showPath', 'showReply', 'authorId', 'comment', 'useFavourite', 'useScroll', 'useVote', 'useEdit', 'mods', 'classes', 'attributes' ]}
{* Переменные *}
{$useEdit = $useEdit|default:true}
{$isDeleted = $comment->getDelete()}
{$user = $comment->getUser()}
{$commentId = $comment->getId()}
{$target = $comment->getTarget()}
{* Получаем ссылку на комментарий *}
{* TODO: Вынести в бэкенд *}
{$permalink = ( Config::Get('module.comment.use_nested') ) ? "{router page='comments'}{$commentId}" : "{if $target}{$target->getUrl()}{/if}#comment{$commentId}"}
{**
* Добавляем модификаторы
*}
{* Комментарий с отрицательным рейтингом *}
{if $useVote && $comment->isBad()}
{$mods = "$mods bad"}
{/if}
{* Автор комментария является автором объекта к которому оставлен комментарий *}
{if $authorId == $user->getId()}
{$mods = "$mods author"}
{/if}
{* Комментарий удален *}
{if $isDeleted}
{$mods = "$mods deleted"}
{* Комментарий текущего залогиненого пользователя *}
{elseif $oUserCurrent && $comment->getUserId() == $oUserCurrent->getId()}
{$mods = "$mods self"}
{* Непрочитанный комментарий *}
{elseif $dateReadLast && strtotime($dateReadLast) <= strtotime($comment->getDate())}
{$mods = "$mods new"}
{/if}
{**
* Комментарий
* Атрибут id используется для ссылки на комментарий через хэш в урл (например #comment123)
*}
<section class = "{$component} {cmods name=$component mods=$mods} {$classes} open js-comment"
id = "comment{$commentId}"
data-id = "{$commentId}"
data-parent-id = "{$comment->getPid()}"
{cattr list=$attributes}>
{* @hook Начало комментария *}
{hook run='comment_comment_begin' params=$params}
{* Сворачивание *}
<div class="{$component}-fold js-comment-fold" data-id="{$commentId}">
{component 'syn-icon' icon='fold' classes="{$component}-fold-icon-fold" attributes=[ title => $aLang.comments.folding.fold ]}
{component 'syn-icon' icon='unfold' classes="{$component}-fold-icon-unfold" attributes=[ title => $aLang.comments.folding.unfold ]}
</div>
{* Путь до комментария *}
{if $showPath}
<div class="{$component}-path">
{$target = $comment->getTarget()}
<a href="{$target->getUrl()}" class="{$component}-path-target">{$target->getTitle()|escape}</a>
<a href="{$target->getUrl()}#comments" class="{$component}-path-comments">({$target->getCountComment()})</a>
</div>
{/if}
{* Показываем удаленные комментарии только администраторам *}
{if ! $isDeleted || ( $oUserCurrent && $oUserCurrent->isAdministrator() )}
{* Аватар пользователя *}
<a href="{$user->getUserWebPath()}" class="{$component}-avatar">
<img src="{$user->getProfileAvatarPath(64)}" alt="{$user->getDisplayName()}" />
</a>
{* Информация *}
<ul class="{$component}-info ls-clearfix">
{* @hook Начало блока с информацией *}
{hook run='comment_info_begin' params=$params}
{* @hook Конец блока с информацией *}
{hook run='comment_info_end' params=$params}
</ul>
{* Текст комментария *}
<div class="{$component}-content">
{* @hook Начало блока с содержимым комментария *}
{hook run='comment_content_begin' params=$params}
<div class="{$component}-text ls-text">
{$comment->getText()}
</div>
{* @hook Конец блока с содержимым комментария *}
{hook run='comment_content_end' params=$params}
</div>
{* Информация о редактировании *}
{if $comment->getDateEdit()}
<div class="{$component}-edit-info">
{$aLang.comments.comment.edit_info}:
<span class="{$component}-edit-info-time js-comment-edit-time">
{date_format date=$comment->getDateEdit() hours_back="12" minutes_back="60" now="60" day="day H:i" format="j F Y, H:i"}
</span>
{if $comment->getCountEdit() > 1}
({$comment->getCountEdit()} {$comment->getCountEdit()|declension:$aLang.common.times_declension})
{/if}
</div>
{/if}
{* Действия *}
<ul class="{$component}-actions ls-clearfix">
{* @hook Начало списка экшенов комментария *}
{hook run='comment_actions_begin' params=$params}
{* Автор комментария *}
{component 'comment.info-item'
classes="{$component}-username"
link=[ url => $user->getUserWebPath() ]
text=$user->getDisplayName()}
{* Дата добавления комментария *}
{* Так же является ссылкой на комментарий *}
<li class="{$component}-date">
<a href="{$permalink}" title="{$aLang.comments.comment.url}">
<time datetime="{date_format date=$comment->getDate() format='c'}" title="{date_format date=$comment->getDate() format="j F Y, H:i"}">
{date_format date=$comment->getDate() hours_back="12" minutes_back="60" now="60" day="day H:i" format="j F Y, H:i"}
</time>
</a>
</li>
{* Избранное *}
{if $oUserCurrent && $useFavourite}
<li>
{component 'favourite' classes="{$component}-favourite js-comment-favourite" target=$comment}
</li>
{/if}
{* Прокрутка к родительскому комментарию *}
{if $useScroll|default:true}
{if $comment->getPid()}
<li class="{$component}-scroll-to {$component}-scroll-to-parent js-comment-scroll-to-parent"
title="{$aLang.comments.comment.scroll_to_parent}">
<i class="{$component}-scroll-to-icon"></i>
</li>
{/if}
{* Прокрутка к дочернему комментарию *}
<li class="{$component}-scroll-to {$component}-scroll-to-child js-comment-scroll-to-child"
title="{$aLang.comments.comment.scroll_to_child}">
<i class="{$component}-scroll-to-icon"></i>
</li>
{/if}
{* Ответить *}
{if $oUserCurrent && ! $isDeleted && $showReply|default:true}
<li>
<a href="#" class="ls-link-dotted js-comment-reply" data-id="{$commentId}">{$aLang.comments.comment.reply}</a>
</li>
{/if}
{* Редактировать *}
{if $useEdit && $oUserCurrent && $comment->IsAllowEdit()}
<li>
<a href="#" class="ls-link-dotted js-comment-update" data-id="{$commentId}">
{$aLang.common.edit}
{* Отображение времени отведенного для редактирования *}
{* Используется плагин jquery.timers *}
{if $comment->getEditTimeRemaining()}
(<span class="js-comment-update-timer" data-seconds="{$comment->getEditTimeRemaining()}">...</span>)
{/if}
</a>
</li>
{/if}
{* Удалить *}
{if $oUserCurrent && $comment->IsAllowDelete()}
{component 'comment.actions-item'
link=[ classes => 'js-comment-remove', attributes => [ 'data-id' => $commentId ] ]
text=(( $isDeleted ) ? $aLang.comments.comment.restore : $aLang.common.remove)}
{/if}
{* @hook Конец списка экшенов комментария *}
{hook run='comment_actions_end' params=$params}
</ul>
{* Голосование *}
{if $useVote}
{* Блокируем голосование для гостей или если залогиненый пользователь является автором комментария*}
{component 'vote'
classes = "{$component}-vote js-comment-vote"
target = $comment
isLocked = ($oUserCurrent && $oUserCurrent->getId() == $user->getId()) || strtotime($comment->getDate()) < $smarty.now - Config::Get('acl.vote.comment.limit_time')}
{/if}
{else}
{$aLang.comments.comment.deleted}
{/if}
{* @hook Конец комментария *}
{hook run='comment_comment_end' params=$params}
</section>

View file

@ -0,0 +1,21 @@
/**
* Форма комментирования
*
* @template comment-form.tpl
*/
.ls-comment-form {
background: #f8fbfe;
padding: 15px;
border-radius: 5px;
}
.ls-comment-form textarea {
height: 150px;
}
/* Предпросмотр текста комментария */
.ls-comment-preview {
padding: 15px;
margin: 10px 0 10px 0;
border: 1px solid #eee;
}

View file

@ -0,0 +1,224 @@
/**
* Комментарий
*
* @modifier deleted Удаленный комментарий
* @modifier self Ваш комментарий
* @modifier new Новый, непрочитанный комментарий
* @modifier current Активный комментарий, который выделяется при исползование кнопки обновления в тулбаре
* @modifier list-item Комментарий выводимый в списках
*
* @template comment.tpl
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.ls-comment {
min-height: 48px;
padding: 0 0 0 40px;
margin-bottom: 25px;
position: relative;
}
.ls-comment--self .ls-comment-content { background: #fefef1; border-color: #e6e6bd; }
.ls-comment--self .ls-comment-content:before { border-top-color: #e6e6bd; }
.ls-comment--self .ls-comment-content:after { border-top-color: #fefef1; }
.ls-comment--new .ls-comment-content { background: #fff; border-color: #dddb5c; box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1); }
.ls-comment--new .ls-comment-content:before { border-top-color: #dddb5c; }
.ls-comment--new .ls-comment-content:after { border-top-color: #fff; }
.ls-comment--current .ls-comment-content { background: #cdf5a6; border-color: #bae48e; }
.ls-comment--current .ls-comment-content:before { border-top-color: #bae48e; }
.ls-comment--current .ls-comment-content:after { border-top-color: #cdf5a6; }
.ls-comment--bad .ls-comment-content {
opacity: 0.3;
filter: alpha(opacity=30);
}
.ls-comment--bad:hover {
opacity: 1;
filter: alpha(opacity=100);
}
.ls-comment.ls-comment--deleted { background: #efd5d5; }
.ls-user-role-not-admin .ls-comment.ls-comment--deleted {
padding: 10px 15px;
min-height: 0;
background: #f7f7f7;
color: #888;
}
/* Аватар */
.ls-comment-avatar {
position: absolute;
top: 0;
left: 0;
width: 30px;
height: 30px;
overflow: hidden;
}
.ls-comment-avatar img {
width: 30px;
height: 30px;
}
/* Логин */
.ls-comment-username {
font-weight: bold;
}
.ls-comment-username a {
color: #4b5468;
text-decoration: underline;
}
.ls-comment--author .ls-comment-username {
padding-left: 7px;
background: rgb(254,255,163);
background: -moz-linear-gradient(left, rgba(254,255,163,1) 0%, rgba(255,255,255,1) 100%);
background: -webkit-linear-gradient(left, rgba(254,255,163,1) 0%,rgba(255,255,255,1) 100%);
background: linear-gradient(to right, rgba(254,255,163,1) 0%,rgba(255,255,255,1) 100%);
}
.ls-comment--author .ls-comment-username a {
color: #4b5468;
}
/* Избранное */
.ls-comment-favourite {
position: relative;
top: 1px;
}
/* Content */
.ls-comment-content {
position: relative;
padding: 9px 10px 10px;
background: #fff;
border: 1px solid #e7ebed;
border-radius: 3px;
}
/* Arrow */
.ls-comment-content:after,
.ls-comment-content:before {
top: 100%;
left: 20px;
border: solid transparent;
content: " ";
height: 0;
width: 0;
position: absolute;
pointer-events: none;
}
.ls-comment-content:after {
border-color: rgba(255, 255, 255, 0);
border-top-color: #fff;
border-width: 6px;
margin-left: -6px;
}
.ls-comment-content:before {
border-color: rgba(231, 235, 237, 0);
border-top-color: #e7ebed;
border-width: 7px;
margin-left: -7px;
}
/* Дата */
.ls-comment-date a { color: #818189; }
.ls-comment-date a:hover { color: #666; }
/* Голосование */
.ls-comment-vote {
position: absolute;
bottom: 0;
right: 0;
margin: 0;
}
.ls-comment-vote.vote--not-voted.vote--count-zero { display: none; }
.ls-comment:hover .ls-comment-vote { display: block; }
/* Прокрутка к дочернему комментарию */
.ls-comment-scroll-to {
cursor: pointer;
}
.ls-comment-scroll-to-child {
display: none;
}
.ls-comment-scroll-to-icon {
background-repeat: no-repeat;
position: relative;
top: 3px;
width: 11px;
height: 11px;
display: block;
}
.ls-comment-scroll-to-parent .ls-comment-scroll-to-icon {
background-image: url(../images/arrow-up.png);
}
.ls-comment-scroll-to-child .ls-comment-scroll-to-icon {
background-image: url(../images/arrow-down.png);
}
/* Текст комментария */
.ls-comment-text.ls-text {
font-size: 13px;
line-height: 1.7em;
}
.ls-comment-text.ls-text blockquote {
background: #fff;
border-color: #ccc;
padding: 5px 10px;
margin-bottom: 5px;
}
/* Действия */
.ls-comment-actions {
font-size: 11px;
}
.ls-comment-actions li {
float: left;
margin: 10px 10px 0 0;
}
.ls-comment-actions li a {
color: #727a90;
}
.ls-comment-actions li a:hover {
color: #f00;
}
/* Сворачивание */
.ls-comment-fold {
display: none;
position: absolute;
top: 8px;
left: -20px;
width: 13px;
height: 13px;
cursor: pointer;
}
.ls-comment:not(.ls-comment--folded) .ls-comment-fold-icon-unfold,
.ls-comment--folded .ls-comment-fold-icon-fold {
display: none;
}
.ls-comment:not(.ls-comment--folded) .ls-comment-fold-icon-fold,
.ls-comment--folded .ls-comment-fold-icon-unfold {
display: block;
}
/* Информация о редактировании */
.ls-comment-edit-info {
margin-top: 10px;
font-size: 11px;
opacity: .5;
}
/* Путь до комментария */
.ls-comment-path {
background: #fff;
color: #aaa;
border-radius: 3px;
padding: 3px 5px 2px;
margin-bottom: 10px;
}

View file

@ -0,0 +1,25 @@
/**
* Кнопка обновления комментариев
*
* @template toolbar.comment.tpl
*/
.ls-toolbar-item--comments .ls-toolbar-comments-count {
border-top: 1px solid #eee;
padding: 10px 0;
color: #333;
text-align: center;
font-size: 11px;
cursor: pointer;
}
.ls-toolbar-comments-update i {
-webkit-transition: -webkit-transform 1s;
transition: transform 1s;
}
.ls-toolbar-comments-update.active i {
-ms-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}

View file

@ -0,0 +1,69 @@
/**
* Блок со списком комментариев
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
/**
* @modifier forbid Комментирование запрещено
*/
.ls-comments--forbid .ls-comment-form {
display: none;
}
/**
* Блок с комментариями
*/
.ls-comment-list {
margin-bottom: 30px;
}
/**
* Хидер
*/
.ls-comments-header {
margin-bottom: 20px;
}
/* Заголовок */
.ls-comments-title {
font-size: 24px;
margin-bottom: 5px;
}
/* Действия */
.ls-comments-actions {
padding: 0;
background-color: transparent;
}
/**
* Кнопка "Комментировать"
*/
.ls-comment-reply-root {
font-size: 20px;
margin-bottom: 0;
}
.ls-comment-reply-root + .ls-comment-form {
margin-top: 15px;
}
/**
* Пагинация
*/
.ls-comments-pagination {
margin-bottom: 30px;
}
/**
* Вспомогательный блок-обертка
*/
.ls-comment-wrapper .ls-comment-wrapper { padding-left: 40px; }
.ls-comment-wrapper .ls-comment-form,
.ls-comment-wrapper .ls-comment-preview { margin-left: 40px; }
.ls-comment-wrapper .ls-comment-form {
margin-bottom: 20px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 983 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 979 B

View file

@ -0,0 +1,22 @@
{**
* Тулбар
* Кнопка обновления комментариев
*}
{component_define_params params=[ 'mods', 'classes', 'attributes' ]}
{component 'toolbar' template='item'
classes = "{$classes} js-comments-toolbar"
mods = 'comments'
buttons = [
[
classes => 'ls-toolbar-comments-update js-toolbar-comments-update',
attributes => [ 'title' => {lang 'comments.update'} ],
icon => 'refresh'
],
[
classes => 'js-toolbar-comments-count',
attributes => [ 'title' => {lang 'comments.count_new'} ],
text => '0'
]
]}

View file

@ -0,0 +1,52 @@
/**
* Справка по разметке редактора
*/
.editor-help header {
margin-bottom: 15px;
}
.editor-help header a {
font-size: 11px;
color: #000;
border-bottom: 1px dotted #000;
}
.editor-help-body {
display: none;
position: relative;
padding: 20px;
margin-bottom: 20px;
background: #fefef1;
color: #363636;
margin-top: 13px;
font-size: 11px;
border-radius: 5px;
-webkit-box-shadow: 0 0 5px #e8e8c0 inset;
box-shadow: 0 0 5px #e8e8c0 inset;
}
.editor-help-body:before {
display: block;
content: "";
position: absolute;
top: -12px;
left: 15px;
width: 0;
height: 0;
border-width: 6px;
border-color: transparent transparent #F2F2DD transparent;
border-style: solid;
}
.editor-help-body h3 { font-size: 18px; font-weight: bold; margin-bottom: 10px; }
.editor-help-body a {
color: #727a90;
border-bottom: 1px dotted #727a90;
font-weight: bold;
}
.editor-help-col { float: left; width: 47%; margin-left: 6%; }
.editor-help-col:first-child { margin-left: 0; }
.editor-help-item { margin-bottom: 20px; }
.editor-help-item dd { margin-left: 0; }
.editor-help-item:last-child { margin-bottom: 0; }
.editor-help-item h4 { font-family: monospace; font-weight: bold; margin-bottom: 3px; }

View file

@ -0,0 +1,87 @@
{**
* Справка по разметке редактора
*}
{$component = 'editor-help'}
{component_define_params params=[ 'targetId' ]}
{function editor_help_item}
{strip}
{foreach $items as $item}
<dl class="{$component}-item">
{foreach $item['tags'] as $tag}
<dt>
<a href="#" class="ls-link-dotted js-tags-help-link" {if $tag['insert']}data-insert="{$tag['insert']}"{/if}>
{$tag['text']}
</a>
</dt>
{/foreach}
<dd>{$item['def']}</dd>
</dl>
{/foreach}
{/strip}
{/function}
<div class="{$component} js-editor-help" data-form-id="{$targetId}">
<header class="{$component}-header ls-clearfix">
<a href="#" class="ls-link-dotted help-link js-editor-help-toggle">{$aLang.editor.markup.help.link_show}</a>
</header>
<div class="{$component}-body js-editor-help-body">
<h3 class="h3">{$aLang.editor.markup.help.special}</h3>
<div class="ls-mb-30">
{editor_help_item items=[
[ 'tags' => [ [ 'text' => '&lt;cut&gt;' ] ], 'def' => $aLang.editor.markup.help.special_cut ],
[ 'tags' => [ [ 'text' => "&lt;cut name=\"{$aLang.editor.markup.help.special_cut_name_example_name}\"&gt;" ] ], 'def' => $aLang.editor.markup.help.special_cut_name ],
[ 'tags' => [ [ 'text' => "&lt;video&gt;http://...&lt;/video&gt;", 'insert' => '&lt;video&gt;&lt;/video&gt;' ] ], 'def' => $aLang.editor.markup.help.special_video ],
[ 'tags' => [ [ 'text' => "&lt;ls user=\"{$aLang.editor.markup.help.special_ls_user_example_user}\" /&gt;", 'insert' => '&lt;ls user=&quot;&quot; /&gt;' ] ], 'def' => $aLang.editor.markup.help.special_ls_user ]
]}
</div>
<h3 class="h3">{$aLang.editor.markup.help.standart}</h3>
<div class="ls-clearfix">
<ul class="{$component}-col">
{editor_help_item items=[
[ 'tags' => [
[ 'text' => '&lt;h4&gt;&lt;/h4&gt;' ],
[ 'text' => '&lt;h5&gt;&lt;/h5&gt;' ],
[ 'text' => '&lt;h6&gt;&lt;/h6&gt;' ]
], 'def' => $aLang.editor.markup.help.standart_h ],
[ 'tags' => [ [ 'text' => "&lt;img src=\"\" /&gt;" ] ], 'def' => $aLang.editor.markup.help.standart_img ],
[ 'tags' => [
[ 'text' => "&lt;a href=\"http://...\"&gt;{$aLang.editor.markup.help.standart_a_example_href}&lt;/a&gt;", 'insert' => '&lt;a href=&quot;&quot;&gt;&lt;/a&gt;"' ]
], 'def' => $aLang.editor.markup.help.standart_a ],
[ 'tags' => [ [ 'text' => "&lt;b&gt;&lt;/b&gt;" ] ], 'def' => $aLang.editor.markup.help.standart_b ],
[ 'tags' => [ [ 'text' => "&lt;i&gt;&lt;/i&gt;" ] ], 'def' => $aLang.editor.markup.help.standart_i ],
[ 'tags' => [ [ 'text' => "&lt;s&gt;&lt;/s&gt;" ] ], 'def' => $aLang.editor.markup.help.standart_s ],
[ 'tags' => [ [ 'text' => "&lt;u&gt;&lt;/u&gt;" ] ], 'def' => $aLang.editor.markup.help.standart_u ]
]}
</ul>
<ul class="{$component}-col">
{editor_help_item items=[
[ 'tags' => [ [ 'text' => "&lt;hr /&gt;" ] ], 'def' => $aLang.editor.markup.help.standart_hr ],
[ 'tags' => [ [ 'text' => "&lt;blockquote&gt;&lt;/blockquote&gt;" ] ], 'def' => $aLang.editor.markup.help.standart_blockquote ],
[ 'tags' => [
[ 'text' => '&lt;table>&lt;/table&gt;' ],
[ 'text' => '&lt;th>&lt;/th&gt;' ],
[ 'text' => '&lt;td>&lt;/td&gt;' ],
[ 'text' => '&lt;tr>&lt;/tr&gt;' ]
], 'def' => $aLang.editor.markup.help.standart_table ],
[ 'tags' => [
[ 'text' => '&lt;ul&gt;&lt;/ul&gt;' ],
[ 'text' => '&lt;li&gt;&lt;/li&gt;' ]
], 'def' => $aLang.editor.markup.help.standart_ul ],
[ 'tags' => [
[ 'text' => '&lt;ol&gt;&lt;/ol&gt;' ],
[ 'text' => '&lt;li&gt;&lt;/li&gt;' ]
], 'def' => $aLang.editor.markup.help.standart_ol ]
]}
</ul>
</div>
</div>
</div>

View file

@ -0,0 +1,32 @@
/**
* Избранное
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.ls-favourite {
cursor: pointer;
display: inline-block;
}
.ls-favourite-toggle {
display: inline-block;
width: 11px;
height: 11px;
background: url(../images/favourite.png) no-repeat;
}
.ls-favourite--added .ls-favourite-toggle {
background-image: url(../images/favourite-active.png);
}
.ls-favourite-count {
display: none;
margin-left: 0;
font-size: 10px;
color: #a2b6cd;
position: relative;
top: -1px;
}
.ls-favourite--has-counter .ls-favourite-count {
display: inline-block;
}

View file

@ -0,0 +1,42 @@
{**
* Добавление в избранное
*
* @param object $target Объект который добавляется в избранное
* @param boolean $hideZeroCounter
*}
{* Название компонента *}
{$component = 'ls-favourite'}
{component_define_params params=[ 'target', 'hideZeroCounter', 'mods', 'classes', 'attributes' ]}
{* True если объект находится в избранном *}
{$isActive = $target && $target->getIsFavourite()}
{* Кол-во объектов в избранном *}
{$count = $target->getCountFavourite()}
{* Добавляем модификаторы *}
{if $count}
{$mods = "$mods has-counter"}
{/if}
{if $isActive}
{$mods = "$mods added"}
{/if}
<div class="{$component} {cmods name=$component mods=$mods} {if $isActive}active{/if} {$classes}"
data-param-i-target-id="{$target->getId()}"
title="{$aLang.favourite[ ($isActive) ? 'remove' : 'add' ]}"
{cattr list=$attributes}>
{* Кнопка добавления/удаления из избранного *}
<div class="{$component}-toggle js-favourite-toggle"></div>
{* Кол-во объектов в избранном *}
{if isset( $count )}
<span class="{$component}-count js-favourite-count" {if ! $count && $hideZeroCounter|default:true}style="display: none;"{/if}>
{$count}
</span>
{/if}
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Some files were not shown because too many files have changed in this diff Show more