<xf:title>{{ prefix('resource', $resource, 'escaped') }}{$resource.title}</xf:title>
<xf:set var="$descSnippet" value="{{ snippet($description.message, 250, {'stripBbCode': true}) }}" />
<xf:macro id="metadata_macros::metadata"
arg-description="{$descSnippet}"
arg-shareUrl="{{ link('canonical:resources', $resource) }}"
arg-canonicalUrl="{{ link('canonical:resources', $resource) }}" />
<xf:page option="ldJsonHtml">
<script type="application/ld+json">
{{ $resource.getLdStructuredData()|json(true)|raw }}
</script>
</xf:page>
<xf:if is="$iconError">
<div class="blockMessage blockMessage--error">{{ phrase('xfrm_new_icon_could_not_be_applied_try_later') }}</div>
</xf:if>
<xf:wrap template="xfrm_resource_wrapper">
<xf:set var="$pageSelected" value="overview" />
</xf:wrap>
<xf:macro id="lightbox_macros::setup" arg-canViewAttachments="{{ $resource.canViewUpdateImages() }}" />
<div class="block">
<xf:if contentcheck="true">
<div class="block-outer">
<div class="block-outer-opposite">
<xf:contentcheck>
<xf:macro id="xfrm_resource_wrapper_macros::action_buttons" arg-resource="{$resource}" />
</xf:contentcheck>
</div>
</div>
</xf:if>
<div class="block-container">
<div class="block-body lbContainer js-resourceBody"
data-xf-init="lightbox"
data-lb-id="resource-{$resource.resource_id}"
data-lb-caption-desc="{{ $resource.User ? $resource.User.username : $resource.username }} · {{ date_time($resource.resource_date) }}">
<div class="resourceBody">
<article class="resourceBody-main js-lbContainer">
<xf:macro id="custom_fields_macros::custom_fields_view"
arg-type="resources"
arg-group="above_info"
arg-onlyInclude="{$category.field_cache}"
arg-set="{$resource.custom_fields}"
arg-additionalFilters="{{ ['resource'] }}"
arg-wrapperClass="resourceBody-fields resourceBody-fields--before" />
<xf:if is="$trimmedDescription">
{{ bb_code($trimmedDescription, 'resource_update', $description) }}
<div class="block-rowMessage block-rowMessage--important">
{{ phrase('xfrm_do_not_have_permission_to_view_full_content_of_this_resource') }}
<xf:if is="!$xf.visitor.user_id">
<a href="{{ link('login') }}" data-xf-click="overlay">{{ phrase('log_in_or_register_now') }}</a>
</xf:if>
</div>
<xf:else />
{{ bb_code($description.message, 'resource_update', $description) }}
</xf:if>
<xf:macro id="custom_fields_macros::custom_fields_view"
arg-type="resources"
arg-group="below_info"
arg-onlyInclude="{$category.field_cache}"
arg-set="{$resource.custom_fields}"
arg-additionalFilters="{{ ['resource'] }}"
arg-wrapperClass="resourceBody-fields resourceBody-fields--after" />
<xf:if is="$description.attach_count">
<xf:if contentcheck="true">
<xf:css src="attachments.less" />
<ul class="attachmentList resourceBody-attachments">
<xf:contentcheck>
<xf:foreach loop="$description.Attachments" value="$attachment" if="!$description.isAttachmentEmbedded($attachment)">
<xf:macro id="attachment_macros::attachment_list_item"
arg-attachment="{$attachment}"
arg-canView="{{ $resource.canViewUpdateImages() }}" />
</xf:foreach>
</xf:contentcheck>
</ul>
</xf:if>
</xf:if>
<xf:if contentcheck="true">
<div class="actionBar">
<xf:contentcheck>
<xf:if contentcheck="true">
<div class="actionBar-set actionBar-set--external">
<xf:contentcheck>
<xf:react content="{$description}" link="resources/update/react" list="< .js-resourceBody | .js-reactionsList" />
</xf:contentcheck>
</div>
</xf:if>
<xf:if contentcheck="true">
<div class="actionBar-set actionBar-set--internal">
<xf:contentcheck>
<xf:if is="$description.canReport()">
<a href="{{ link('resources/update/report', $description) }}"
class="actionBar-action actionBar-action--report" data-xf-click="overlay">{{ phrase('report_verb') }}</a>
</xf:if>
<xf:set var="$hasActionBarMenu" value="{{ false }}" />
<xf:if is="$resource.canEdit()">
<a href="{{ link('resources/edit', $resource) }}"
class="actionBar-action actionBar-action--edit actionBar-action--menuItem">{{ phrase('edit') }}</a>
<xf:set var="$hasActionBarMenu" value="{{ true }}" />
</xf:if>
<xf:if is="$description.edit_count && $description.canViewHistory()">
<a href="{{ link('resources/update/history', $description) }}"
class="actionBar-action actionBar-action--history actionBar-action--menuItem"
data-xf-click="toggle"
data-target="< .js-resourceBody | .js-historyTarget"
data-menu-closer="true">{{ phrase('history') }}</a>
<xf:set var="$hasActionBarMenu" value="{{ true }}" />
</xf:if>
<xf:if is="$description.canDelete('soft')">
<a href="{{ link('resources/delete', $description) }}"
class="actionBar-action actionBar-action--delete actionBar-action--menuItem"
data-xf-click="overlay">{{ phrase('delete') }}</a>
<xf:set var="$hasActionBarMenu" value="{{ true }}" />
</xf:if>
<xf:if is="$xf.visitor.canViewIps() && $description.ip_id">
<a href="{{ link('resources/update/ip', $description) }}"
class="actionBar-action actionBar-action--ip actionBar-action--menuItem"
data-xf-click="overlay">{{ phrase('ip') }}</a>
<xf:set var="$hasActionBarMenu" value="{{ true }}" />
</xf:if>
<xf:if is="$description.canWarn()">
<a href="{{ link('resources/update/warn', $description) }}"
class="actionBar-action actionBar-action--warn actionBar-action--menuItem">{{ phrase('warn') }}</a>
<xf:set var="$hasActionBarMenu" value="{{ true }}" />
<xf:elseif is="$description.warning_id && $xf.visitor.canViewWarnings()" />
<a href="{{ link('warnings', {'warning_id': $description.warning_id}) }}"
class="actionBar-action actionBar-action--warn actionBar-action--menuItem"
data-xf-click="overlay">{{ phrase('view_warning') }}</a>
<xf:set var="$hasActionBarMenu" value="{{ true }}" />
</xf:if>
<xf:if is="$hasActionBarMenu">
<a class="actionBar-action actionBar-action--menuTrigger"
data-xf-click="menu"
title="{{ phrase('more_options')|for_attr }}"
role="button"
tabindex="0"
aria-expanded="false"
aria-haspopup="true">•••</a>
<div class="menu" data-menu="menu" aria-hidden="true" data-menu-builder="actionBar">
<div class="menu-content">
<h4 class="menu-header">{{ phrase('more_options') }}</h4>
<div class="js-menuBuilderTarget"></div>
</div>
</div>
</xf:if>
</xf:contentcheck>
</div>
</xf:if>
</xf:contentcheck>
</div>
</xf:if>
<div class="reactionsBar js-reactionsList {{ $description.reactions ? 'is-active' : '' }}">
<xf:reactions content="{$description}" link="resources/update/reactions" />
</div>
<xf:if is="$description.edit_count && $description.canViewHistory()">
<div class="js-historyTarget toggleTarget" data-href="trigger-href"></div>
</xf:if>
</article>
<div class="resourceBody-sidebar">
<div class="resourceSidebarGroup">
<div class="resourceSidebarGroupPerso">
<div class="xfrmAuthor">
<xf:avatar user="{$xf.visitor}" size="s" href="" notooltip="true" />
<span>{{ phrase('author') }}
<xf:username user="{$resource.User}" defaultname="{$resource.username}" /></span>
</div>
<xf:if is="$resource.isDownloadable()">
<dl class="pairs pairs--justified">
<dt>{{ phrase('xfrm_downloads') }}</dt>
<dd>{$resource.download_count|number}</dd>
</dl>
</xf:if>
<dl class="pairs pairs--justified">
<dt>{{ phrase('views') }}</dt>
<dd>{{ max($resource.view_count, $resource.download_count, 1)|number }}</dd>
</dl>
<dl class="pairs pairs--justified">
<dt>{{ phrase('xfrm_first_release') }}</dt>
<dd><xf:date time="{$resource.resource_date}" /></dd>
</dl>
<dl class="pairs pairs--justified">
<dt>{{ phrase('xfrm_last_update') }}</dt>
<dd><xf:date time="{$resource.last_update}" /></dd>
</dl>
</div>
<div class="resourceSidebarGroup resourceSidebarGroup--rating">
<h4 class="resourceSidebarGroup-title">{{ phrase('xfrm_ratings') }}</h4>
<xf:macro id="custom_fields_macros::custom_fields_view"
arg-type="resources"
arg-group="above_rating"
arg-onlyInclude="{$category.field_cache}"
arg-set="{$resource.custom_fields}"
arg-additionalFilters="{{ ['resource'] }}"
arg-valueClass="pairs pairs--justified" />
<xf:macro id="rating_macros::stars_text"
arg-rating="{$resource.rating_avg}"
arg-count="{$resource.rating_count}"
arg-rowClass="ratingStarsRow--justified" />
<xf:macro id="xfrm_resource_review_macros::rating_split" arg-resource="{$resource}" />
<xf:macro id="custom_fields_macros::custom_fields_view"
arg-type="resources"
arg-group="below_rating"
arg-onlyInclude="{$category.field_cache}"
arg-set="{$resource.custom_fields}"
arg-additionalFilters="{{ ['resource'] }}"
arg-valueClass="pairs pairs--justified" />
</div>
</div>
<xf:if contentcheck="true">
<div class="resourceSidebarGroup resourceSidebarGroup--buttons">
<xf:contentcheck>
<xf:if is="$resource.hasViewableDiscussion()">
<xf:button href="{{ link('threads', $resource.Discussion) }}" class="button--fullWidth">{{ phrase('xfrm_join_discussion') }}</xf:button>
</xf:if>
<xf:if is="$resource.external_url">
<xf:button href="{$resource.external_url}" class="button--link button--fullWidth">{{ phrase('xfrm_more_information') }}</xf:button>
</xf:if>
<xf:if is="$resource.alt_support_url AND $resource.Category.enable_support_url">
<xf:button href="{$resource.alt_support_url}" class="button--link button--fullWidth">{{ phrase('xfrm_get_support') }}</xf:button>
</xf:if>
<xf:macro id="custom_fields_macros::custom_fields_view"
arg-type="resources"
arg-group="below_sidebar_buttons"
arg-onlyInclude="{$category.field_cache}"
arg-set="{$resource.custom_fields}"
arg-additionalFilters="{{ ['resource'] }}"
arg-valueClass="pairs pairs--justified" />
</xf:contentcheck>
</div>
</xf:if>
<xf:if is="$resource.canViewTeamMembers() && $teamMembers is not empty">
<div class="resourceSidebarGroup">
<h4 class="resourceSidebarGroup-title">
<xf:if is="$resource.canManageTeamMembers()">
<a href="{{ link('resources/manage-team', $resource) }}" data-xf-click="overlay">
{{ phrase('xfrm_resource_team') }}
</a>
<xf:else />
{{ phrase('xfrm_resource_team') }}
</xf:if>
</h4>
<ul class="resourceSidebarList">
<xf:foreach loop="$teamMembers" value="$teamMember">
<li>
<div class="contentRow">
<div class="contentRow-figure">
<xf:avatar user="$teamMember.User" size="xxs" />
</div>
<div class="contentRow-main contentRow-main--close">
<xf:username user="$teamMember.User" rich="true" />
<div class="contentRow-minor">
<xf:usertitle user="$teamMember.User" />
</div>
</div>
</div>
</li>
</xf:foreach>
</ul>
</div>
</xf:if>
<xf:if is="$authorOthers is not empty">
<div class="resourceSidebarGroup">
<h4 class="resourceSidebarGroup-title">
<a href="{{ link('resources/authors', $resource.User) }}">{{ phrase('xfrm_more_resources_from_x', {'name': $resource.User.username}) }}</a>
</h4>
<ul class="resourceSidebarList">
<xf:foreach loop="$authorOthers" value="$authorOther">
<li>
<xf:macro id="xfrm_resource_list_macros::resource_simple"
arg-resource="{$authorOther}"
arg-withMeta="{{ false }}" />
</li>
</xf:foreach>
</ul>
</div>
</xf:if>
<xf:if contentcheck="true">
<div class="resourceSidebarGroup">
<h4 class="resourceSidebarGroup-title">{{ phrase('xfrm_share_this_resource') }}</h4>
<xf:contentcheck>
<xf:macro id="share_page_macros::buttons" arg-iconic="{{ true }}" />
</xf:contentcheck>
</div>
</xf:if>
</div>
</div>
</div>
</div>
</div>
<xf:if is="$latestUpdates is not empty">
<div class="block">
<div class="block-container">
<h3 class="block-header">{{ phrase('xfrm_latest_updates') }}</h3>
<ol class="block-body">
<xf:foreach loop="$latestUpdates" value="$update">
<li class="block-row block-row--separated">
<h3 class="block-textHeader">
<a href="{{ link('resources/update', $update) }}">{$update.title}</a>
</h3>
<div>{{ snippet($update.message, 100, {'stripBbCode': true}) }}</div>
</xf:foreach>
</ol>
<div class="block-footer">
<span class="block-footer-controls"><xf:button class="button--link" href="{{ link('resources/updates', $resource) }}">{{ phrase('xfrm_read_more...') }}</xf:button></span>
</div>
</div>
</div>
</xf:if>
<xf:if is="$latestReviews is not empty">
<div class="block">
<div class="block-container">
<h3 class="block-header">{{ phrase('xfrm_latest_reviews') }}</h3>
<div class="block-body">
<xf:foreach loop="$latestReviews" value="$review">
<xf:macro id="xfrm_resource_review_macros::review"
arg-review="{$review}"
arg-resource="{$resource}" />
</xf:foreach>
</div>
<div class="block-footer">
<span class="block-footer-controls"><xf:button class="button--link" href="{{ link('resources/reviews', $resource) }}">{{ phrase('xfrm_read_more...') }}</xf:button></span>
</div>
</div>
</div>
</xf:if>