Migration complete

This commit is contained in:
2026-06-23 19:24:37 +02:00
parent b5154cb9f0
commit 57d7b613cd
5 changed files with 1956 additions and 113 deletions

View File

@@ -133,76 +133,19 @@
</div>
</nav>
<div class="offCanvasMenu offCanvasMenu--nav js-headerOffCanvasMenu" data-menu="menu" aria-hidden="true" data-ocm-builder="navigation">
<div class="offCanvasMenu-backdrop" data-menu-close="true"></div>
<div class="offCanvasMenu-content">
<div class="offCanvasMenu-header">
{{ phrase('menu') }}
<a class="offCanvasMenu-closer" data-menu-close="true" role="button" tabindex="0" aria-label="{{ phrase('close')|for_attr }}"></a>
</div>
<xf:if is="$xf.visitor.user_id">
<div class="p-offCanvasAccountLink">
<div class="offCanvasMenu-linkHolder">
<a href="{{ link('account') }}" class="offCanvasMenu-link">
<xf:avatar user="$xf.visitor" size="xxs" href="" />
{$xf.visitor.username}
</a>
</div>
<hr class="offCanvasMenu-separator" />
</div>
<xf:else />
<div class="p-offCanvasRegisterLink">
<div class="offCanvasMenu-linkHolder">
<a href="{{ link('login') }}" class="offCanvasMenu-link" data-xf-click="overlay" data-menu-close="true">
{{ phrase('log_in') }}
</a>
</div>
<hr class="offCanvasMenu-separator" />
<xf:if is="$xf.options.registrationSetup.enabled">
<div class="offCanvasMenu-linkHolder">
<a href="{{ link('register') }}" class="offCanvasMenu-link" data-xf-click="overlay" data-menu-close="true">
{{ phrase('register') }}
</a>
</div>
<hr class="offCanvasMenu-separator" />
</xf:if>
</div>
</xf:if>
<div class="js-offCanvasNavTarget"></div>
<div class="offCanvasMenu-installBanner js-installPromptContainer" style="display: none;" data-xf-init="install-prompt">
<div class="offCanvasMenu-installBanner-header">{{ phrase('install_app') }}</div>
<xf:button class="js-installPromptButton">{{ phrase('install') }}</xf:button>
<template class="js-installTemplateIOS">
<div class="js-installTemplateContent">
<div class="overlay-title">{{ phrase('how_to_install_app_on_ios') }}</div>
<div class="block-body">
<div class="block-row">
<p>
{{ phrase('follow_along_with_video_below_to_see_how_to_install_our_site_as_web_app') }}
</p>
<p style="text-align: center">
<video src="{{ base_url(property('publicPwaInstallVideoUrl')) }}"
width="280" height="480" autoplay loop muted playsinline></video>
</p>
<p>
<small><strong>{{ phrase('note:') }}</strong> {{ phrase('this_feature_currently_may_not_be_available_in_some_browsers') }}</small>
</p>
</div>
</div>
</div>
</template>
</div>
</div>
</div>
<main id="main-wrapper">
<header id="topbar">
<button class="$mobile-toggle">
<i data-lucide="menu"></i>
</button>
<form class="$search-bar" action="{$xf.options.homePageUrl}/database">
<input type="text" name="s" placeholder="Search..." />
<form id="rhpzSearchForm" class="$search-bar" action="{{ link('search/2147483647') }}" method="get">
<select class="$search-scope-select" id="rhpzSearchScope" name="rhpz_scope">
<option value="forum" selected>Forum</option>
<option value="entries">Entries</option>
<option value="news">News</option>
</select>
<input type="text" id="rhpzSearchInput" name="s" placeholder="Search..." />
<button type="submit" class="$search-button">
<i data-lucide="search" size="18" color="var(--text2)"></i>
</button>

File diff suppressed because it is too large Load Diff

View File

@@ -9,4 +9,75 @@
if (pending.length === 0) return;
lucide.createIcons();
};
</script>
(function () {
var APP_URL = "{{ $xf.options.homePageUrl }}";
var form = document.getElementById('rhpzSearchForm');
var select = document.getElementById('rhpzSearchScope');
var input = document.getElementById('rhpzSearchInput');
var scopes = {
forum: { action: "{{ link('search/2147483647/') }}", param: 'q', extra: { o: 'relevance' } },
entries: { action: APP_URL + '/database', param: 's' },
news: { action: APP_URL + '/news', param: 's' }
};
form.addEventListener('submit', function (e) {
e.preventDefault();
var term = input.value.trim();
if (!term) return;
var cfg = scopes[select.value];
var params = new URLSearchParams(Object.assign({}, { [cfg.param]: term }, cfg.extra || {}));
window.location = cfg.action + '?' + params.toString();
});
})();
(function () {
const menuToggle = document.querySelector('.\\$mobile-toggle');
const menu = document.getElementById('menu');
const app = document.getElementById('app');
const content = document.getElementById('content');
if (!menuToggle || !menu) return;
menuToggle.addEventListener('click', (e) => {
e.stopPropagation();
menu.classList.toggle('mobile-open');
app.classList.toggle('menu-open');
});
const menuItems = menu.querySelectorAll('.\\$menu-item');
menuItems.forEach(item => {
item.addEventListener('click', () => {
menu.classList.remove('mobile-open');
app.classList.remove('menu-open');
});
});
document.addEventListener('click', (e) => {
const isClickInsideMenu = menu.contains(e.target);
const isClickOnToggle = menuToggle.contains(e.target);
if (!isClickInsideMenu && !isClickOnToggle && menu.classList.contains('mobile-open')) {
menu.classList.remove('mobile-open');
app.classList.remove('menu-open');
}
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && menu.classList.contains('mobile-open')) {
menu.classList.remove('mobile-open');
app.classList.remove('menu-open');
}
});
window.addEventListener('resize', () => {
if (window.innerWidth > 768) {
menu.classList.remove('mobile-open');
app.classList.remove('menu-open');
}
});
})()
</script>

View File

@@ -4,10 +4,10 @@
<div class="$topbar-actions">
<xf:if is="$xf.visitor.is_admin">
<xf:set var="$topbarAdminSeparator" value="true" />
<a href="{{ base_url('admin.php') }}" class="$btn">
<a href="{{ base_url('admin.php') }}" class="$btn topbar-admin-btn">
<i data-lucide="landmark" size="18"></i>
</a>
<a href="{{ $xf.options.homePageUrl }}/manage" class="$btn">
<a href="{{ $xf.options.homePageUrl }}/manage" class="$btn topbar-admin-btn">
<i data-lucide="shield-cog" size="18"></i>
</a>
</xf:if>
@@ -16,19 +16,73 @@
</xf:if>
<xf:if is="$xf.visitor.is_moderator">
<xf:set var="$topbarModSeparator" value="true" />
<a href="{{ $xf.options.homePageUrl }}/modcp" class="$btn">
<a href="{{ $xf.options.homePageUrl }}/modcp" class="$btn $topbar-mod-btn">
<i data-lucide="siren" size="18"></i>
</a>
<a href="{{ link('approval-queue') }}" class="$btn">
<a href="{{ link('approval-queue') }}" class="$btn $topbar-mod-btn">
<i data-lucide="message-circle-check" size="18"></i>
</a>
<a href="{{ link('reports') }}" class="$btn badgeContainer badgeContainer--visible {{ ($xf.session.reportCounts.total && ($xf.session.reportCounts.lastBuilt > $xf.session.reportLastRead) OR $xf.session.reportCounts.assigned) ? ' badgeContainer--highlighted' : '' }}" data-badge="{{ $xf.session.reportCounts.assigned ? $xf.session.reportCounts.assigned|number . ' / ' . $xf.session.reportCounts.total|number : $xf.session.reportCounts.total|number }}">
<a href="{{ link('reports') }}" class="$btn $topbar-mod-btn badgeContainer badgeContainer--visible {{ ($xf.session.reportCounts.total && ($xf.session.reportCounts.lastBuilt > $xf.session.reportLastRead) OR $xf.session.reportCounts.assigned) ? ' badgeContainer--highlighted' : '' }}" data-badge="{{ $xf.session.reportCounts.assigned ? $xf.session.reportCounts.assigned|number . ' / ' . $xf.session.reportCounts.total|number : $xf.session.reportCounts.total|number }}">
<i data-lucide="triangle-alert" size="18"></i>
</a>
</xf:if>
<xf:if is="$topbarModSeparator == true">
<div class="$vertical-separator"></div>
</xf:if>
<div class="$topbar-more-container" style="position: relative;">
<xf:if is="$xf.visitor.is_moderator || $xf.visitor.is_admin">
<button id="rhpzMoreBtn" class="$btn topbar-btn-more" title="More actions">
<i data-lucide="more-vertical" size="18"></i>
</button>
<div id="rhpzMoreMenu" class="$topbar-more-menu" style="display: none;">
<xf:if is="$xf.visitor.is_admin">
<a href="{{ base_url('admin.php') }}" class="$topbar-more-item" title="Admin">
<i data-lucide="landmark" size="16"></i>
<span>Admin</span>
</a>
<a href="{{ $xf.options.homePageUrl }}/manage" class="$topbar-more-item" title="Manage">
<i data-lucide="shield-cog" size="16"></i>
<span>Manage</span>
</a>
</xf:if>
<xf:if is="$xf.visitor.is_moderator">
<a href="{{ $xf.options.homePageUrl }}/modcp" class="$topbar-more-item" title="Moderation">
<i data-lucide="siren" size="16"></i>
<span>Mod CP</span>
</a>
<a href="{{ link('approval-queue') }}" class="$topbar-more-item" title="Approvals">
<i data-lucide="message-circle-check" size="16"></i>
<span>Approval Queue</span>
</a>
<a href="{{ link('reports') }}" class="$topbar-more-item" title="Reports">
<i data-lucide="triangle-alert" size="16"></i>
<span>Reports</span>
</a>
</xf:if>
</div>
</xf:if>
</div>
<script>
(function () {
var btn = document.getElementById('rhpzMoreBtn');
var menu = document.getElementById('rhpzMoreMenu');
if (!btn || !menu) return;
btn.addEventListener('click', function (e) {
e.stopPropagation();
menu.style.display = (menu.style.display === 'none') ? 'block' : 'none';
});
document.addEventListener('click', function (e) {
if (menu.style.display === 'block' && !menu.contains(e.target) && e.target !== btn) {
menu.style.display = 'none';
}
});
})();
</script>
<xf:if is="$xf.visitor.canCreateEntry()">
<a href="{{ $xf.options.homePageUrl }}/submit" class="$btn">
<i data-lucide="hard-drive-upload" size="18"></i>