Guest User

Untitled

a guest
Dec 1st, 2020
17
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2. <html id="XF" lang="{$xf.language.language_code}" dir="{$xf.language.text_direction}"
  3. data-app="public"
  4. data-template="{$template}"
  5. data-container-key="{$containerKey}"
  6. data-content-key="{$contentKey}"
  7. data-logged-in="{{ $xf.visitor.user_id ? 'true' : 'false' }}"
  8. data-cookie-prefix="{$xf.cookie.prefix}"
  9. data-csrf="{{ csrf_token()|escape('js') }}"
  10. class="has-no-js {{ $template ? 'template-' . $template : '' }}"
  11. {{ $xf.runJobs ? ' data-run-jobs=""' : '' }}>
  12. <head>
  13. <meta charset="utf-8" />
  14. <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
  15. <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
  16.  
  17. <xf:set var="$siteName" value="{$xf.options.boardTitle}" />
  18. <xf:set var="$h1"><xf:h1 fallback="{$siteName}" /></xf:set>
  19. <xf:set var="$description"><xf:description /></xf:set>
  20.  
  21. <title><xf:title formatter="%s | %s" fallback="{$xf.options.boardTitle}" page="{$pageNumber}" /></title>
  22.  
  23. <link rel="manifest" href="{{ base_url('webmanifest.php') }}">
  24. <xf:if is="property('metaThemeColor')">
  25. <meta name="theme-color" content="{{ parse_less_color(property('metaThemeColor')) }}" />
  26. </xf:if>
  27.  
  28. <meta name="apple-mobile-web-app-title" content="{{ $xf.options.boardShortTitle ?: $xf.options.boardTitle }}">
  29. <xf:if is="property('publicIconUrl')">
  30. <link rel="apple-touch-icon" href="{{ base_url(property('publicIconUrl', true)) }}">
  31. <xf:elseif is="property('publicMetadataLogoUrl')" />
  32. <link rel="apple-touch-icon" href="{{ base_url(property('publicMetadataLogoUrl')) }}" />
  33. </xf:if>
  34.  
  35. <xf:foreach loop="$head" value="$headTag">
  36. {$headTag}
  37. </xf:foreach>
  38.  
  39. <xf:if is="!$head.meta_site_name && $siteName is not empty">
  40. <xf:macro template="metadata_macros" name="site_name" arg-siteName="{$siteName}" arg-output="{{ true }}" />
  41. </xf:if>
  42. <xf:if is="!$head.meta_type">
  43. <xf:macro template="metadata_macros" name="type" arg-type="website" arg-output="{{ true }}" />
  44. </xf:if>
  45. <xf:if is="!$head.meta_title">
  46. <xf:macro template="metadata_macros" name="title" arg-title="{{ page_title() ?: $siteName }}" arg-output="{{ true }}" />
  47. </xf:if>
  48. <xf:if is="!$head.meta_description && $description is not empty && $pageDescriptionMeta">
  49. <xf:macro template="metadata_macros" name="description" arg-description="{$description}" arg-output="{{ true }}" />
  50. </xf:if>
  51. <xf:if is="!$head.meta_share_url">
  52. <xf:macro template="metadata_macros" name="share_url" arg-shareUrl="{$xf.fullUri}" arg-output="{{ true }}" />
  53. </xf:if>
  54. <xf:if is="!$head.meta_image_url && property('publicMetadataLogoUrl')">
  55. <xf:macro template="metadata_macros" name="image_url"
  56. arg-imageUrl="{{ base_url(property('publicMetadataLogoUrl'), true) }}"
  57. arg-output="{{ true }}" />
  58. </xf:if>
  59.  
  60. <xf:macro template="helper_js_global" name="head" arg-app="public" />
  61.  
  62. <xf:if is="property('publicFaviconUrl')">
  63. <link rel="icon" type="image/png" href="{{ base_url(property('publicFaviconUrl'), true) }}" sizes="32x32" />
  64. </xf:if>
  65. <xf:include template="google_analytics" />
  66.  
  67. <!-- Rotating Banner //-->
  68. <script type="text/javascript">
  69. window.onload = function () {
  70. var header = document.getElementById('header_silhouette');
  71. var pictures = new Array('https://fortreeforums.xyz/images/silhouettes/header_ash.png',
  72. 'https://fortreeforums.xyz/images/silhouettes/header_misty.png',
  73. 'https://fortreeforums.xyz/images/silhouettes/header_pika.png',
  74. 'https://fortreeforums.xyz/images/silhouettes/header_grill.png',
  75. 'https://fortreeforums.xyz/images/silhouettes/header_bulbasaur.png',
  76. 'https://fortreeforums.xyz/images/silhouettes/header_charmander.png',
  77. 'https://fortreeforums.xyz/images/silhouettes/header_squirtle.png');
  78. var numPics = pictures.length;
  79. if (document.images) {
  80. var chosenPic = Math.floor((Math.random() * numPics));
  81. header.style.background = 'url(' + pictures[chosenPic] + ')';
  82. }
  83. }
  84. </script>
  85.  
  86. <!-- Snow //-->
  87. <xf:if is="{{!$xf.visitor.Profile.custom_fields.snow_disable}}">
  88. <script src="/scripts/snowstorm-min.js"></script>
  89. </xf:if>
  90. </head>
  91. <body data-template="{$template}">
  92.  
  93. <div class="p-pageWrapper" id="top">
  94.  
  95. <xf:if contentcheck="true">
  96. <div class="p-staffBar">
  97. <div class="p-staffBar-inner hScroller" data-xf-init="h-scroller">
  98. <div class="hScroller-scroll">
  99. <xf:contentcheck>
  100. <xf:if is="$xf.visitor.is_moderator && $xf.session.unapprovedCounts.total">
  101. <a href="{{ link('approval-queue') }}" class="p-staffBar-link badgeContainer badgeContainer--highlighted" data-badge="{$xf.session.unapprovedCounts.total|number}">
  102. {{ phrase('approval_queue') }}
  103. </a>
  104. </xf:if>
  105.  
  106. <xf:if is="$xf.visitor.is_moderator && !$xf.options.reportIntoForumId && $xf.session.reportCounts.total">
  107. <a href="{{ link('reports') }}"
  108. class="p-staffBar-link badgeContainer badgeContainer--visible {{ ($xf.session.reportCounts.total && ($xf.session.reportCounts.lastBuilt > $xf.session.reportLastRead) OR $xf.session.reportCounts.assigned) ? ' badgeContainer--highlighted' : '' }}"
  109. data-badge="{{ $xf.session.reportCounts.assigned ? $xf.session.reportCounts.assigned|number . ' / ' . $xf.session.reportCounts.total|number : $xf.session.reportCounts.total|number }}"
  110. title="{{ $xf.session.reportCounts.lastBuilt ? phrase('last_report_update:')|for_attr . ' ' . date_time($xf.session.reportCounts.lastBuilt) : '' }}">
  111. {{ phrase('reports') }}
  112. </a>
  113. </xf:if>
  114.  
  115. <xf:if contentcheck="true">
  116. <a class="p-staffBar-link menuTrigger" data-xf-click="menu" data-xf-key="alt+m" role="button" tabindex="0" aria-expanded="false" aria-haspopup="true">{{ phrase('moderator') }}</a>
  117. <div class="menu" data-menu="menu" aria-hidden="true">
  118. <div class="menu-content">
  119. <h4 class="menu-header">{{ phrase('moderator_tools') }}</h4>
  120. <xf:contentcheck>
  121. <!--[XF:mod_tools_menu:top]-->
  122. <xf:if is="$xf.visitor.is_moderator">
  123. <a href="{{ link('approval-queue') }}" class="menu-linkRow">{{ phrase('approval_queue') }}</a>
  124. </xf:if>
  125. <xf:if is="$xf.visitor.is_moderator && !$xf.options.reportIntoForumId">
  126. <a href="{{ link('reports') }}" class="menu-linkRow" title="{{ $xf.session.reportCounts.lastBuilt ? phrase('last_report_update:')|for_attr . ' ' . date_time($xf.session.reportCounts.lastBuilt) : '' }}">{{ phrase('reports') }}</a>
  127. </xf:if>
  128. <!--[XF:mod_tools_menu:bottom]-->
  129. </xf:contentcheck>
  130. </div>
  131. </div>
  132. </xf:if>
  133.  
  134. <xf:if is="$xf.visitor.is_admin">
  135. <a href="{{ base_url('admin.php') }}" class="p-staffBar-link" target="_blank">{{ phrase('admin') }}</a>
  136. </xf:if>
  137. </xf:contentcheck>
  138. </div>
  139. </div>
  140. </div>
  141. </xf:if>
  142.  
  143. <xf:set var="$srcset">{{ property('publicLogoUrl2x') ? base_url(property('publicLogoUrl2x')) . ' 2x' : '' }}</xf:set>
  144.  
  145. <header class="p-header" id="header">
  146. <div id="header_silhouette">
  147. <div class="p-header-inner">
  148. <div class="p-header-content">
  149.  
  150. <div class="p-header-logo p-header-logo--image">
  151. <!-- <a href="{{ ($xf.options.logoLink && $xf.homePageUrl) ? $xf.homePageUrl : link('index') }}">
  152. <img src="{{ base_url(property('publicLogoUrl')) }}" srcset="{$srcset}" alt="{$xf.options.boardTitle}"
  153. width="{{ property('publicLogoWidth') ?: '' }}" height="{{ property('publicLogoHeight') ?: '' }}" />
  154. </a> //-->
  155. </div>
  156.  
  157. <xf:ad position="container_header" />
  158. </div>
  159. </div>
  160. </div>
  161. </header>
  162.  
  163. <xf:set var="$navHtml">
  164. <nav class="p-nav">
  165. <div class="p-nav-inner">
  166. <a class="p-nav-menuTrigger" data-xf-click="off-canvas" data-menu=".js-headerOffCanvasMenu" role="button" tabindex="0">
  167. <i aria-hidden="true"></i>
  168. <span class="p-nav-menuText">{{ phrase('menu') }}</span>
  169. </a>
  170.  
  171. <div class="p-nav-smallLogo">
  172. <a href="{{ ($xf.options.logoLink && $xf.homePageUrl) ? $xf.homePageUrl : link('index') }}">
  173. <img src="{{ base_url(property('publicLogoUrl')) }}" srcset="{$srcset}" alt="{$xf.options.boardTitle}"
  174. width="{{ property('publicLogoWidth') ?: '' }}" height="{{ property('publicLogoHeight') ?: '' }}" />
  175. </a>
  176. </div>
  177.  
  178. <div class="p-nav-scroller hScroller" data-xf-init="h-scroller" data-auto-scroll=".p-navEl.is-selected">
  179. <div class="hScroller-scroll">
  180. <ul class="p-nav-list js-offCanvasNavSource">
  181. <xf:foreach loop="$navTree" key="$navSection" value="$navEntry" i="$i" if="{{ $navSection != $xf.app.defaultNavigationId }}">
  182. <li>
  183. <xf:macro name="nav_entry"
  184. arg-navId="{$navSection}"
  185. arg-nav="{$navEntry}"
  186. arg-selected="{{ $navSection == $pageSection }}"
  187. arg-shortcut="{$i}" />
  188. </li>
  189. </xf:foreach>
  190. </ul>
  191. </div>
  192. </div>
  193.  
  194. <div class="p-nav-opposite">
  195. <div class="p-navgroup p-account {{ $xf.visitor.user_id ? 'p-navgroup--member' : 'p-navgroup--guest' }}">
  196. <xf:if is="$xf.visitor.user_id">
  197. <xf:if is="$xf.visitor.user_state == 'rejected' OR $xf.visitor.user_state == 'disabled'">
  198. <a href="{{ link('account') }}"
  199. class="p-navgroup-link p-navgroup-link--iconic p-navgroup-link--user">
  200. <xf:avatar user="$xf.visitor" size="xxs" href="" />
  201. <span class="p-navgroup-linkText">{$xf.visitor.username}</span>
  202. </a>
  203.  
  204. <a href="{{ link('logout', null, {'t': csrf_token()}) }}" class="p-navgroup-link">
  205. <span class="p-navgroup-linkText">{{ phrase('log_out') }}</span>
  206. </a>
  207. <xf:else />
  208. <a href="{{ link('account') }}"
  209. class="p-navgroup-link p-navgroup-link--iconic p-navgroup-link--user"
  210. data-xf-click="menu"
  211. data-xf-key="{{ phrase('shortcut.visitor_menu')|for_attr }}"
  212. data-menu-pos-ref="< .p-navgroup"
  213. aria-expanded="false"
  214. aria-haspopup="true">
  215. <xf:avatar user="$xf.visitor" size="xxs" href="" />
  216. <span class="p-navgroup-linkText">{$xf.visitor.username}</span>
  217. </a>
  218. <div class="menu menu--structural menu--wide menu--account" data-menu="menu" aria-hidden="true"
  219. data-href="{{ link('account/visitor-menu') }}"
  220. data-load-target=".js-visitorMenuBody">
  221. <div class="menu-content js-visitorMenuBody">
  222. <div class="menu-row">
  223. {{ phrase('loading...') }}
  224. </div>
  225. </div>
  226. </div>
  227.  
  228. <a href="{{ link('conversations') }}"
  229. class="p-navgroup-link p-navgroup-link--iconic p-navgroup-link--conversations js-badge--conversations badgeContainer{{ $xf.visitor.conversations_unread ? ' badgeContainer--highlighted' : '' }}"
  230. data-badge="{$xf.visitor.conversations_unread|number}"
  231. data-xf-click="menu"
  232. data-xf-key="{{ phrase('shortcut.conversations_menu')|for_attr }}"
  233. data-menu-pos-ref="< .p-navgroup"
  234. aria-label="{{ phrase('inbox')|for_attr }}"
  235. aria-expanded="false"
  236. aria-haspopup="true">
  237. <i aria-hidden="true"></i>
  238. <span class="p-navgroup-linkText">{{ phrase('nav_inbox') }}</span>
  239. </a>
  240. <div class="menu menu--structural menu--medium" data-menu="menu" aria-hidden="true"
  241. data-href="{{ link('conversations/popup') }}"
  242. data-nocache="true"
  243. data-load-target=".js-convMenuBody">
  244. <div class="menu-content">
  245. <h3 class="menu-header">{{ phrase('conversations') }}</h3>
  246. <div class="js-convMenuBody">
  247. <div class="menu-row">{{ phrase('loading...') }}</div>
  248. </div>
  249. <div class="menu-footer menu-footer--split">
  250. <div class="menu-footer-main">
  251. <ul class="listInline listInline--bullet">
  252. <li><a href="{{ link('conversations') }}">{{ phrase('show_all') }}</a></li>
  253. <xf:if is="$xf.visitor.canStartConversation()">
  254. <li><a href="{{ link('conversations/add') }}">{{ phrase('start_new_conversation') }}</a></li>
  255. </xf:if>
  256. </ul>
  257. </div>
  258. </div>
  259. </div>
  260. </div>
  261.  
  262. <a href="{{ link('account/alerts') }}"
  263. class="p-navgroup-link p-navgroup-link--iconic p-navgroup-link--alerts js-badge--alerts badgeContainer{{ $xf.visitor.alerts_unviewed ? ' badgeContainer--highlighted' : '' }}"
  264. data-badge="{$xf.visitor.alerts_unviewed|number}"
  265. data-xf-click="menu"
  266. data-xf-key="{{ phrase('shortcut.alerts_menu')|for_attr }}"
  267. data-menu-pos-ref="< .p-navgroup"
  268. aria-label="{{ phrase('alerts')|for_attr }}"
  269. aria-expanded="false"
  270. aria-haspopup="true">
  271. <i aria-hidden="true"></i>
  272. <span class="p-navgroup-linkText">{{ phrase('nav_alerts') }}</span>
  273. </a>
  274. <div class="menu menu--structural menu--medium" data-menu="menu" aria-hidden="true"
  275. data-href="{{ link('account/alerts-popup') }}"
  276. data-nocache="true"
  277. data-load-target=".js-alertsMenuBody">
  278. <div class="menu-content">
  279. <h3 class="menu-header">{{ phrase('alerts') }}</h3>
  280. <div class="js-alertsMenuBody">
  281. <div class="menu-row">{{ phrase('loading...') }}</div>
  282. </div>
  283. <div class="menu-footer menu-footer--split">
  284. <div class="menu-footer-main">
  285. <ul class="listInline listInline--bullet">
  286. <li><a href="{{ link('account/alerts') }}">{{ phrase('show_all') }}</a></li>
  287. <li><a href="{{ link('account/alerts/mark-read') }}" class="js-alertsMarkRead">{{ phrase('mark_read') }}</a></li>
  288. <li><a href="{{ link('account/preferences') }}">{{ phrase('preferences') }}</a></li>
  289. </ul>
  290. </div>
  291. </div>
  292. </div>
  293. </div>
  294. </xf:if>
  295. <xf:else />
  296. <a href="{{ link('login') }}" class="p-navgroup-link p-navgroup-link--textual p-navgroup-link--logIn"
  297. data-xf-click="overlay" data-follow-redirects="on">
  298. <span class="p-navgroup-linkText">{{ phrase('log_in') }}</span>
  299. </a>
  300. <xf:if is="$xf.options.registrationSetup.enabled">
  301. <a href="{{ link('register') }}" class="p-navgroup-link p-navgroup-link--textual p-navgroup-link--register"
  302. data-xf-click="overlay" data-follow-redirects="on">
  303. <span class="p-navgroup-linkText">{{ phrase('register') }}</span>
  304. </a>
  305. </xf:if>
  306. </xf:if>
  307. </div>
  308.  
  309. <div class="p-navgroup p-discovery{{ !$xf.visitor.canSearch() ? ' p-discovery--noSearch' : '' }}">
  310. <a href="{{ link('whats-new') }}"
  311. class="p-navgroup-link p-navgroup-link--iconic p-navgroup-link--whatsnew"
  312. aria-label="{{ phrase('whats_new')|for_attr }}"
  313. title="{{ phrase('whats_new')|for_attr }}">
  314. <i aria-hidden="true"></i>
  315. <span class="p-navgroup-linkText">{{ phrase('whats_new') }}</span>
  316. </a>
  317.  
  318. <xf:if is="$xf.visitor.canSearch()">
  319. <a href="{{ link('search') }}"
  320. class="p-navgroup-link p-navgroup-link--iconic p-navgroup-link--search"
  321. data-xf-click="menu"
  322. data-xf-key="{{ phrase('shortcut.search_menu')|for_attr }}"
  323. aria-label="{{ phrase('search')|for_attr }}"
  324. aria-expanded="false"
  325. aria-haspopup="true"
  326. title="{{ phrase('search')|for_attr }}">
  327. <i aria-hidden="true"></i>
  328. <span class="p-navgroup-linkText">{{ phrase('search') }}</span>
  329. </a>
  330. <div class="menu menu--structural menu--wide" data-menu="menu" aria-hidden="true">
  331. <form action="{{ link('search/search') }}" method="post"
  332. class="menu-content"
  333. data-xf-init="quick-search">
  334.  
  335. <h3 class="menu-header">{{ phrase('search') }}</h3>
  336. <!--[XF:search_menu:above_input]-->
  337. <div class="menu-row">
  338. <xf:if is="$searchConstraints">
  339. <div class="inputGroup inputGroup--joined">
  340. <xf:textbox name="keywords"
  341. placeholder="{{ phrase('search...') }}"
  342. aria-label="{{ phrase('search') }}"
  343. data-menu-autofocus="true" />
  344. <xf:select name="constraints"
  345. class="js-quickSearch-constraint"
  346. aria-label="{{ phrase('search_within') }}">
  347.  
  348. <xf:option value="">{{ phrase('everywhere') }}</xf:option>
  349. <xf:foreach loop="$searchConstraints" key="$constraintName" value="$constraint">
  350. <xf:option value="{$constraint|json}">{$constraintName}</xf:option>
  351. </xf:foreach>
  352. </xf:select>
  353. </div>
  354. <xf:else />
  355. <xf:textbox name="keywords"
  356. placeholder="{{ phrase('search...') }}"
  357. aria-label="{{ phrase('search') }}"
  358. data-menu-autofocus="true" />
  359. </xf:if>
  360. </div>
  361.  
  362. <!--[XF:search_menu:above_title_only]-->
  363. <div class="menu-row">
  364. <xf:checkbox standalone="true">
  365. <xf:option name="c[title_only]">
  366. <xf:label>
  367. {{ phrase('search_titles_only') }}
  368.  
  369. <xf:if is="$xf.options.enableTagging">
  370. <span tabindex="0" role="button"
  371. data-xf-init="tooltip" data-trigger="hover focus click" title="{{ phrase('tags_will_also_be_searched') }}">
  372.  
  373. <xf:fa icon="far fa-question-circle" class="u-muted u-smaller" />
  374. </span>
  375. </xf:if>
  376. </xf:label>
  377. </xf:option>
  378. </xf:checkbox>
  379. </div>
  380. <!--[XF:search_menu:above_member]-->
  381. <div class="menu-row">
  382. <div class="inputGroup">
  383. <span class="inputGroup-text" id="ctrl_search_menu_by_member">{{ phrase('by:') }}</span>
  384. <input type="text" class="input" name="c[users]" data-xf-init="auto-complete" placeholder="{{ phrase('member')|for_attr }}" aria-labelledby="ctrl_search_menu_by_member" />
  385. </div>
  386. </div>
  387. <div class="menu-footer">
  388. <span class="menu-footer-controls">
  389. <xf:button type="submit" class="button--primary" icon="search" />
  390. <xf:button href="{{ link('search') }}">{{ phrase('advanced_search...') }}</xf:button>
  391. </span>
  392. </div>
  393.  
  394. <xf:csrf />
  395. </form>
  396. </div>
  397. </xf:if>
  398. </div>
  399. </div>
  400. </div>
  401. </nav>
  402. </xf:set>
  403. <xf:set var="$subNavHtml">
  404. <xf:if is="$selectedNavChildren is not empty">
  405. <div class="p-sectionLinks">
  406. <div class="p-sectionLinks-inner hScroller" data-xf-init="h-scroller">
  407. <div class="hScroller-scroll">
  408. <ul class="p-sectionLinks-list">
  409. <xf:foreach loop="$selectedNavChildren" key="$navId" value="$navEntry" i="$i">
  410. <li>
  411. <xf:macro name="nav_entry" arg-navId="{$navId}" arg-nav="{$navEntry}" arg-shortcut="alt+{$i}" />
  412. </li>
  413. </xf:foreach>
  414. </ul>
  415. </div>
  416. </div>
  417. </div>
  418. <xf:elseif is="{$selectedNavEntry}" />
  419. <div class="p-sectionLinks p-sectionLinks--empty"></div>
  420. </xf:if>
  421. </xf:set>
  422.  
  423. <xf:if is="property('publicNavSticky') == 'primary'">
  424. <div class="p-navSticky p-navSticky--primary" data-xf-init="sticky-header">
  425. {$navHtml|raw}
  426. </div>
  427. {$subNavHtml|raw}
  428. <xf:elseif is="property('publicNavSticky') == 'all'" />
  429. <div class="p-navSticky p-navSticky--all" data-xf-init="sticky-header">
  430. {$navHtml|raw}
  431. {$subNavHtml|raw}
  432. </div>
  433. <xf:else />
  434. {$navHtml|raw}
  435. {$subNavHtml|raw}
  436. </xf:if>
  437.  
  438. <div class="offCanvasMenu offCanvasMenu--nav js-headerOffCanvasMenu" data-menu="menu" aria-hidden="true" data-ocm-builder="navigation">
  439. <div class="offCanvasMenu-backdrop" data-menu-close="true"></div>
  440. <div class="offCanvasMenu-content">
  441. <div class="offCanvasMenu-header">
  442. {{ phrase('menu') }}
  443. <a class="offCanvasMenu-closer" data-menu-close="true" role="button" tabindex="0" aria-label="{{ phrase('close')|for_attr }}"></a>
  444. </div>
  445. <xf:if is="$xf.visitor.user_id">
  446. <div class="p-offCanvasAccountLink">
  447. <div class="offCanvasMenu-linkHolder">
  448. <a href="{{ link('account') }}" class="offCanvasMenu-link">
  449. <xf:avatar user="$xf.visitor" size="xxs" href="" />
  450. {$xf.visitor.username}
  451. </a>
  452. </div>
  453. <hr class="offCanvasMenu-separator" />
  454. </div>
  455. <xf:else />
  456. <div class="p-offCanvasRegisterLink">
  457. <div class="offCanvasMenu-linkHolder">
  458. <a href="{{ link('login') }}" class="offCanvasMenu-link" data-xf-click="overlay" data-menu-close="true">
  459. {{ phrase('log_in') }}
  460. </a>
  461. </div>
  462. <hr class="offCanvasMenu-separator" />
  463. <xf:if is="$xf.options.registrationSetup.enabled">
  464. <div class="offCanvasMenu-linkHolder">
  465. <a href="{{ link('register') }}" class="offCanvasMenu-link" data-xf-click="overlay" data-menu-close="true">
  466. {{ phrase('register') }}
  467. </a>
  468. </div>
  469. <hr class="offCanvasMenu-separator" />
  470. </xf:if>
  471. </div>
  472. </xf:if>
  473. <div class="js-offCanvasNavTarget"></div>
  474. <div class="offCanvasMenu-installBanner js-installPromptContainer" style="display: none;" data-xf-init="install-prompt">
  475. <div class="offCanvasMenu-installBanner-header">{{ phrase('install_app') }}</div>
  476. <xf:button class="js-installPromptButton">{{ phrase('install') }}</xf:button>
  477. </div>
  478. </div>
  479. </div>
  480.  
  481. <div class="p-body">
  482. <div class="p-body-inner">
  483. <!--XF:EXTRA_OUTPUT-->
  484.  
  485. <xf:if is="$notices.block">
  486. <xf:macro template="notice_macros" name="notice_list" arg-type="block" arg-notices="{$notices.block}" />
  487. </xf:if>
  488.  
  489. <xf:if is="$notices.scrolling">
  490. <xf:macro template="notice_macros" name="notice_list" arg-type="scrolling" arg-notices="{$notices.scrolling}" />
  491. </xf:if>
  492.  
  493. <xf:ad position="container_breadcrumb_top_above" />
  494. <xf:macro name="breadcrumbs"
  495. arg-breadcrumbs="{$breadcrumbs}"
  496. arg-navTree="{$navTree}"
  497. arg-selectedNavEntry="{$selectedNavEntry}" />
  498. <xf:ad position="container_breadcrumb_top_below" />
  499.  
  500. <xf:macro template="browser_warning_macros" name="javascript" />
  501. <xf:macro template="browser_warning_macros" name="browser" />
  502.  
  503. <xf:if is="$headerHtml is not empty">
  504. <div class="p-body-header">
  505. {$headerHtml|raw}
  506. </div>
  507. <xf:elseif contentcheck="true" />
  508. <div class="p-body-header">
  509. <xf:contentcheck>
  510.  
  511. <xf:if contentcheck="true">
  512. <div class="p-title {{ $noH1 ? 'p-title--noH1' : '' }}">
  513. <xf:contentcheck>
  514. <xf:if is="!$noH1">
  515. <h1 class="p-title-value">{$h1}</h1>
  516. </xf:if>
  517. <!-- New Reply/Topic Buttons //-->
  518. <xf:if contentcheck="true">
  519. <div class="p-title-pageAction"><xf:contentcheck><xf:pageaction /></xf:contentcheck></div>
  520. </xf:if>
  521. </xf:contentcheck>
  522. </div>
  523. </xf:if>
  524.  
  525. <!-- <xf:if is="$description is not empty">
  526. <div class="p-description">{$description}</div>
  527. </xf:if> //-->
  528. </xf:contentcheck>
  529. </div>
  530. </xf:if>
  531.  
  532. <div class="p-body-main {{ $sidebar ? 'p-body-main--withSidebar' : '' }} {{ $sideNav ? 'p-body-main--withSideNav' : '' }}">
  533. <xf:if is="$sideNav">
  534. <div class="p-body-sideNavCol"></div>
  535. </xf:if>
  536. <div class="p-body-contentCol"></div>
  537. <xf:if is="$sidebar">
  538. <div class="p-body-sidebarCol"></div>
  539. </xf:if>
  540.  
  541. <xf:if is="$sideNav">
  542. <div class="p-body-sideNav">
  543. <div class="p-body-sideNavTrigger">
  544. <xf:button class="button--link" data-xf-click="off-canvas" data-menu="#js-SideNavOcm">
  545. {{ $sideNavTitle ?: phrase('navigation') }}
  546. </xf:button>
  547. </div>
  548. <div class="p-body-sideNavInner" data-ocm-class="offCanvasMenu offCanvasMenu--blocks" id="js-SideNavOcm" data-ocm-builder="sideNav">
  549. <div data-ocm-class="offCanvasMenu-backdrop" data-menu-close="true"></div>
  550. <div data-ocm-class="offCanvasMenu-content">
  551. <div class="p-body-sideNavContent">
  552. <xf:ad position="container_sidenav_above" />
  553. <xf:foreach loop="$sideNav" value="$sideNavHtml">
  554. {$sideNavHtml}
  555. </xf:foreach>
  556. <xf:ad position="container_sidenav_below" />
  557. </div>
  558. </div>
  559. </div>
  560. </div>
  561. </xf:if>
  562.  
  563. <div class="p-body-content">
  564. <xf:ad position="container_content_above" />
  565. <div class="p-body-pageContent">{$content|raw}</div>
  566. <xf:ad position="container_content_below" />
  567. </div>
  568.  
  569. <xf:if is="$sidebar">
  570. <div class="p-body-sidebar">
  571. <xf:ad position="container_sidebar_above" />
  572. <xf:foreach loop="$sidebar" value="$sidebarHtml">
  573. {$sidebarHtml}
  574. </xf:foreach>
  575. <xf:ad position="container_sidebar_below" />
  576. </div>
  577. </xf:if>
  578. </div>
  579.  
  580. <xf:ad position="container_breadcrumb_bottom_above" />
  581. <xf:macro name="breadcrumbs"
  582. arg-breadcrumbs="{$breadcrumbs}"
  583. arg-navTree="{$navTree}"
  584. arg-selectedNavEntry="{$selectedNavEntry}"
  585. arg-variant="bottom" />
  586. <xf:ad position="container_breadcrumb_bottom_below" />
  587. </div>
  588. </div>
  589.  
  590. <footer class="p-footer" id="footer">
  591. <div class="p-footer-inner">
  592.  
  593. <div class="p-footer-row">
  594. <xf:if contentcheck="true">
  595. <div class="p-footer-row-main">
  596. <ul class="p-footer-linkList">
  597. <xf:contentcheck>
  598. <xf:if is="$xf.visitor.canChangeStyle()">
  599. <li><a href="{{ link('misc/style') }}" data-xf-click="overlay"
  600. data-xf-init="tooltip" title="{{ phrase('style_chooser')|for_attr }}" rel="nofollow">
  601. <xf:fa icon="fa-paint-brush" /> {$xf.style.title}
  602. </a></li>
  603. </xf:if>
  604. <xf:if is="$xf.visitor.canChangeLanguage()">
  605. <li><a href="{{ link('misc/language') }}" data-xf-click="overlay"
  606. data-xf-init="tooltip" title="{{ phrase('language_chooser')|for_attr }}" rel="nofollow">
  607. <xf:fa icon="fa-globe" /> {$xf.language.title}</a></li>
  608. </xf:if>
  609. </xf:contentcheck>
  610. </ul>
  611. </div>
  612. </xf:if>
  613. <div class="p-footer-row-opposite">
  614. <ul class="p-footer-linkList">
  615. <xf:if is="$xf.visitor.canUseContactForm()">
  616. <xf:if is="$xf.contactUrl">
  617. <li><a href="{$xf.contactUrl}" data-xf-click="{{ ($xf.options.contactUrl.overlay OR $xf.options.contactUrl.type == 'default') ? 'overlay' : '' }}">{{ phrase('contact_us') }}</a></li>
  618. </xf:if>
  619. </xf:if>
  620.  
  621. <xf:if is="$xf.tosUrl">
  622. <li><a href="{$xf.tosUrl}">{{ phrase('terms_and_rules') }}</a></li>
  623. </xf:if>
  624.  
  625. <xf:if is="$xf.privacyPolicyUrl">
  626. <li><a href="{$xf.privacyPolicyUrl}">{{ phrase('privacy_policy') }}</a></li>
  627. </xf:if>
  628.  
  629. <xf:if is="$xf.helpPageCount">
  630. <li><a href="{{ link('help') }}">{{ phrase('help') }}</a></li>
  631. </xf:if>
  632.  
  633. <xf:if is="$xf.homePageUrl">
  634. <li><a href="{$xf.homePageUrl}">{{ phrase('home') }}</a></li>
  635. </xf:if>
  636.  
  637. <li><a href="{{ link('forums/index.rss', '-') }}" target="_blank" class="p-footer-rssLink" title="{{ phrase('rss')|for_attr }}"><span aria-hidden="true"><xf:fa icon="fa-rss" /><span class="u-srOnly">{{ phrase('rss') }}</span></span></a></li>
  638. </ul>
  639. </div>
  640. </div>
  641.  
  642. <xf:if contentcheck="true">
  643. <div class="p-footer-copyright">
  644. <xf:contentcheck>
  645. <xf:copyright />
  646. {{ phrase('extra_copyright') }}
  647. </xf:contentcheck>
  648. </div>
  649. </xf:if>
  650.  
  651. <xf:if contentcheck="true">
  652. <div class="p-footer-debug">
  653. <xf:contentcheck>
  654. <xf:macro template="debug_macros" name="debug"
  655. arg-controller="{$controller}"
  656. arg-action="{$actionMethod}"
  657. arg-template="{$template}" />
  658. </xf:contentcheck>
  659. </div>
  660. </xf:if>
  661. </div>
  662. </footer>
  663.  
  664. </div> <!-- closing p-pageWrapper -->
  665.  
  666. <div class="u-bottomFixer js-bottomFixTarget">
  667. <xf:if is="$notices.floating">
  668. <xf:macro template="notice_macros" name="notice_list" arg-type="floating" arg-notices="{$notices.floating}" />
  669. </xf:if>
  670. <xf:if is="$notices.bottom_fixer">
  671. <xf:macro template="notice_macros" name="notice_list" arg-type="bottom_fixer" arg-notices="{$notices.bottom_fixer}" />
  672. </xf:if>
  673. </div>
  674.  
  675. <xf:if is="property('scrollJumpButtons')">
  676. <div class="u-scrollButtons js-scrollButtons" data-trigger-type="{{ property('scrollJumpButtons') }}">
  677. <xf:button href="#top" class="button--scroll" data-xf-click="scroll-to"><xf:fa icon="fa-arrow-up" /><span class="u-srOnly">{{ phrase('top') }}</span></xf:button>
  678. <xf:if is="property('scrollJumpButtons') != 'up'">
  679. <xf:button href="#footer" class="button--scroll" data-xf-click="scroll-to"><xf:fa icon="fa-arrow-down" /><span class="u-srOnly">{{ phrase('bottom') }}</span></xf:button>
  680. </xf:if>
  681. </div>
  682. </xf:if>
  683.  
  684. <xf:macro template="helper_js_global" name="body" arg-app="public" arg-jsState="{$jsState}" />
  685.  
  686. <xf:if is="count($xf.reactionsActive) > 1 AND $xf.visitor.user_id">
  687. <script type="text/template" id="xfReactTooltipTemplate">
  688. <div class="tooltip-content-inner">
  689. <div class="reactTooltip">
  690. <xf:foreach loop="$xf.reactionsActive" key="$reactionId" value="$reaction">
  691. <xf:reaction id="{$reactionId}" tooltip="true" />
  692. </xf:foreach>
  693. </div>
  694. </div>
  695. </script>
  696. </xf:if>
  697.  
  698. {$ldJsonHtml|raw}
  699.  
  700. </body>
  701. </html>
  702.  
  703. <xf:macro name="nav_entry" arg-navId="!" arg-nav="!" arg-selected="{{ false }}" arg-shortcut="">
  704. <div class="p-navEl {{ $selected ? 'is-selected' : '' }}" {{ $nav.children ? 'data-has-children="true"' : '' }}>
  705. <xf:if is="$nav.href">
  706.  
  707. <xf:macro name="nav_link"
  708. arg-navId="{$navId}"
  709. arg-nav="{$nav}"
  710. arg-class="p-navEl-link {{ $nav.children ? 'p-navEl-link--splitMenu' : '' }}"
  711. arg-shortcut="{{ $nav.children ? false : $shortcut }}" />
  712.  
  713. <xf:if is="$nav.children"><a data-xf-key="{$shortcut}"
  714. data-xf-click="menu"
  715. data-menu-pos-ref="< .p-navEl"
  716. class="p-navEl-splitTrigger"
  717. role="button"
  718. tabindex="0"
  719. aria-label="{{ phrase('toggle_expanded')|for_attr }}"
  720. aria-expanded="false"
  721. aria-haspopup="true"></a></xf:if>
  722.  
  723. <xf:elseif is="$nav.children" /><a data-xf-key="{$shortcut}"
  724. data-xf-click="menu"
  725. data-menu-pos-ref="< .p-navEl"
  726. class="p-navEl-linkHolder"
  727. role="button"
  728. tabindex="0"
  729. aria-expanded="false"
  730. aria-haspopup="true">
  731. <xf:macro name="nav_link"
  732. arg-navId="{$navId}"
  733. arg-nav="{$nav}"
  734. arg-class="p-navEl-link p-navEl-link--menuTrigger" />
  735. </a>
  736.  
  737. <xf:else />
  738.  
  739. <xf:macro name="nav_link"
  740. arg-navId="{$navId}"
  741. arg-nav="{$nav}"
  742. arg-class="p-navEl-link"
  743. arg-shortcut="{$shortcut}" />
  744.  
  745. </xf:if>
  746. <xf:if is="$nav.children">
  747. <div class="menu menu--structural" data-menu="menu" aria-hidden="true">
  748. <div class="menu-content">
  749. <xf:foreach loop="$nav.children" key="$childNavId" value="$child">
  750. <xf:macro name="nav_menu_entry"
  751. arg-navId="{$childNavId}"
  752. arg-nav="{$child}" />
  753. </xf:foreach>
  754. </div>
  755. </div>
  756. </xf:if>
  757. </div>
  758. </xf:macro>
  759.  
  760. <xf:macro name="nav_link" arg-navId="!" arg-nav="!" arg-class="" arg-titleHtml="" arg-shortcut="{{ false }}">
  761. <xf:set var="$tag" value="{{ $nav.href ? 'a' : 'span' }}" />
  762. <{$tag} {{ $nav.href ? 'href="' . $nav.href . '"' : '' }}
  763. class="{{ trim($class) }} {$nav.attributes.class}"
  764. {{ attributes($nav.attributes, ['class']) }}
  765. {{ $shortcut !== false ? 'data-xf-key="' . $shortcut . '"' : '' }}
  766. data-nav-id="{$navId}"><xf:if is="$nav.icon"><xf:fa icon="{$nav.icon}" /> </xf:if>{{ $titleHtml ? $titleHtml|raw : $nav.title }}<xf:if is="$nav.counter"> <span class="badge badge--highlighted">{$nav.counter|number}</span></xf:if></{$tag}>
  767. </xf:macro>
  768.  
  769. <xf:macro name="nav_menu_entry" arg-navId="!" arg-nav="!" arg-depth="0">
  770. <xf:macro name="nav_link"
  771. arg-navId="{$navId}"
  772. arg-nav="{$nav}"
  773. arg-class="menu-linkRow u-indentDepth{$depth} js-offCanvasCopy" />
  774. <xf:if is="$nav.children">
  775. <xf:foreach loop="$nav.children" key="$childNavId" value="$child">
  776. <xf:macro name="nav_menu_entry"
  777. arg-navId="{$childNavId}"
  778. arg-nav="{$child}"
  779. arg-depth="{{ $depth + 1 }}" />
  780. </xf:foreach>
  781. <xf:if is="$depth == 0">
  782. <hr class="menu-separator" />
  783. </xf:if>
  784. </xf:if>
  785. </xf:macro>
  786.  
  787. <xf:macro name="breadcrumbs" arg-breadcrumbs="!" arg-navTree="!" arg-selectedNavEntry="{{ null }}" arg-variant="">
  788. <xf:if contentcheck="true">
  789. <ul class="p-breadcrumbs {{ $variant ? 'p-breadcrumbs--' . $variant : '' }}"
  790. itemscope itemtype="https://schema.org/BreadcrumbList">
  791. <xf:contentcheck>
  792. <xf:set var="$position" value="{{ 0 }}" />
  793.  
  794. <xf:set var="$rootBreadcrumb" value="{$navTree.{$xf.options.rootBreadcrumb}}" />
  795. <xf:if is="$rootBreadcrumb AND $rootBreadcrumb.href != $xf.uri AND $rootBreadcrumb.href != $xf.fullUri">
  796. <xf:set var="$position" value="{{ $position + 1 }}" />
  797. <xf:macro name="crumb"
  798. arg-position="{$position}"
  799. arg-href="{$rootBreadcrumb.href}"
  800. arg-value="{$rootBreadcrumb.title}" />
  801. </xf:if>
  802.  
  803. <xf:if is="$selectedNavEntry AND $selectedNavEntry.href AND $selectedNavEntry.href != $xf.uri AND $selectedNavEntry.href != $xf.fullUri AND $selectedNavEntry.href != $rootBreadcrumb.href">
  804. <xf:set var="$position" value="{{ $position + 1 }}" />
  805. <xf:macro name="crumb"
  806. arg-position="{$position}"
  807. arg-href="{$selectedNavEntry.href}"
  808. arg-value="{$selectedNavEntry.title}" />
  809. </xf:if>
  810. <xf:foreach loop="$breadcrumbs" value="$breadcrumb" if="$breadcrumb.href != $xf.uri AND $breadcrumb.href != $xf.fullUri">
  811. <xf:set var="$position" value="{{ $position + 1 }}" />
  812. <xf:macro name="crumb"
  813. arg-position="{$position}"
  814. arg-href="{$breadcrumb.href}"
  815. arg-value="{$breadcrumb.value}" />
  816. </xf:foreach>
  817.  
  818. </xf:contentcheck>
  819. </ul>
  820. </xf:if>
  821. </xf:macro>
  822.  
  823. <xf:macro name="crumb" arg-href="!" arg-value="!" arg-position="{{ 0 }}">
  824. <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
  825. <a href="{$href}" itemprop="item">
  826. <span itemprop="name">{$value}</span>
  827. </a>
  828. <xf:if is="$position"><meta itemprop="position" content="{$position}" /></xf:if>
  829. </li>
  830. </xf:macro>
RAW Paste Data