This commit is contained in:
2026-09-14 22:30:09 +02:00
parent 22ffc3b51a
commit 912deeb28e
42 changed files with 2998 additions and 618 deletions
+9 -4
View File
@@ -181,9 +181,6 @@
if (data.success) {
addChip(data.added);
showStatus(addStatus, '"' + escapeHtml(data.added.tag) + '" (#' + data.added.id + ') added.', true);
document.getElementById('nsfp-search').value = '';
document.getElementById('search-dropdown').style.display = 'none';
lastResults = [];
} else {
showStatus(addStatus, 'Error: ' + (data.msg || 'Add failed'), false);
}
@@ -230,7 +227,8 @@
}
var searchTimer = null;
document.getElementById('nsfp-search').addEventListener('input', function () {
var searchInput = document.getElementById('nsfp-search');
searchInput.addEventListener('input', function () {
clearTimeout(searchTimer);
var q = this.value.trim();
if (!q) { lastResults = []; document.getElementById('search-dropdown').style.display = 'none'; return; }
@@ -245,6 +243,13 @@
}, 250);
});
searchInput.addEventListener('focus', function () {
var q = this.value.trim();
if (q && lastResults.length) {
rebuildDropdown(q);
}
});
document.addEventListener('click', function (e) {
if (!e.target.closest('.nsfp-search-wrap')) {
document.getElementById('search-dropdown').style.display = 'none';
+8 -3
View File
@@ -11,10 +11,15 @@
<span>{{ t('error.label') }}</span>
<code>{{ message }}</code>
</div>
@if(session && error_filter_hint)
@if(error_filter_hint)
<div class="_error_filter_hint">
{{ error_filter_hint }} <br>
<a href="#" data-action="open-filter-modal">{{ error_filter_hint_link }}</a>
<div class="_error_filter_hint_text">{{ error_filter_hint }}</div>
<a href="#" data-action="open-filter-modal" class="_error_filter_hint_link">{{ error_filter_hint_link }}</a>
<div class="_error_filter_actions">
<button type="button" class="btn _error_see_anyways_btn" data-action="see-anyways" data-item-id="{{ item_id || '' }}" data-item-slug="{{ item_slug || '' }}">
<i class="fa fa-eye"></i> {{ error_see_anyways }}
</button>
</div>
</div>
@endif
</div>
+8 -3
View File
@@ -14,10 +14,15 @@
<span>{{ t('error.label') }}</span>
<code>{{ message }}</code>
</div>
@if(session && error_filter_hint)
@if(error_filter_hint)
<div class="_error_filter_hint">
{{ error_filter_hint }} <br>
<a href="#" data-action="open-filter-modal">{{ error_filter_hint_link }}</a>
<div class="_error_filter_hint_text">{{ error_filter_hint }}</div>
<a href="#" data-action="open-filter-modal" class="_error_filter_hint_link">{{ error_filter_hint_link }}</a>
<div class="_error_filter_actions">
<button type="button" class="btn _error_see_anyways_btn" data-action="see-anyways" data-item-id="{{ item_id || '' }}" data-item-slug="{{ item_slug || '' }}">
<i class="fa fa-eye"></i> {{ error_see_anyways }}
</button>
</div>
</div>
@endif
</div>
+1 -1
View File
@@ -20,7 +20,7 @@
<span class="thumb-xd-indicator xd-tier-{{ item.xd_tier }}" title="xD Score: {{ item.xd_score }}">xD</span>
@endif
@if(item.is_album && item.album_count > 1)
<span class="album-indicator anim" title="Album: {{ item.album_count }} images"><i class="fa-solid fa-images"></i> {{ item.album_count }}</span>
<span class="album-indicator" title="Album: {{ item.album_count }} images"><i class="fa-solid fa-images"></i> {{ item.album_count }}</span>
@endif
</div>
<div class="thumb-select-check"><i class="fa-solid fa-check"></i></div>
+1 -1
View File
@@ -227,7 +227,7 @@
@each(item.favorites as fav)
@if(fav.hide_fav_badge && (!session || session.user !== fav.user))
<a class="ghost-fav" tooltip="?" flow="up" style="cursor: default;"><img src="/s/img/ghost_fav.svg" style="height: 32px; width: 32px;" loading="lazy" /></a>
@elseif(is_anonymized)
@elseif(is_anonymized || fav.is_anon)
<a class="ghost-fav" tooltip="anonymous" flow="up" style="cursor: default;"><img src="/a/default.png" style="height: 32px; width: 32px;" loading="lazy" /></a>
@else
<a href="/user/{{ fav.user.toLowerCase() }}" tooltip="{!! fav.display_name || fav.user !!}" flow="up"><img src="@if(fav.avatar_file)/a/{{ fav.avatar_file }}@elseif(fav.avatar)/t/{{ fav.avatar }}.webp@else/a/default.png@endif" style="height: 32px; width: 32px@if(fav.username_color); border-color: {{ fav.username_color }}@endif" loading="lazy" /></a>
+14 -13
View File
@@ -139,19 +139,20 @@
</div>
</div>
<div class="blahlol">
<span class="badge badge-dark">
<a href="/{{ (enable_item_slugs && item.slug) ? item.slug : item.id }}" class="id-link" data-item-id="{{ item.id }}">{{ (enable_item_slugs && item.slug) ? item.slug : item.id }}</a> — [@if(!is_anonymized)<a id="a_username" data-username="{{ item.username || '' }}" @if(session && !session.is_anon) data-author-id="{{ item.author_id || '' }}" @endif href="/user/{{ item_username_lower }}" @if(session && !session.is_anon && item.author_id) tooltip="ID: {{ item.author_id }}" @endif @if(item.author_color) style="color: {{ item.author_color }}" @endif>{!! item.author_display_name || item.username || 'unknown' !!}</a>@else<span>anonymous</span>@endif] <span id="oc-badge-container">@if(item.is_oc) — <span class="oc-badge" tooltip="Original Content">OC</span>@endif</span>
</span>
<span id="hall-badge-container">@if(halls_enabled && item.primaryHall)<span class="badge hall-badge-wrap">
<a href="/h/{{ item.primaryHall.slug }}" class="hall-badge-primary"><i class="fa-solid fa-layer-group"></i> {{ item.primaryHall.name }}</a>@if(item.otherHalls && item.otherHalls.length)<span class="hall-overflow-pill">+{{ item.otherHalls.length }}<span class="hall-overflow-tooltip">@each(item.otherHalls as oh)<a href="/h/{{ oh.slug }}">{{ oh.name }}</a>@endeach</span></span>@endif
</span>@endif</span>
<span class="badge badge-dark"><a href="/{{ (enable_item_slugs && item.slug) ? item.slug : item.id }}" class="timestamp-link"><time class="timeago" tooltip="{{ item.timestamp.timefull }}">{{item.timestamp.timeago }}</time></a></span>
@if(item.expires_at)
<span class="badge badge-warning" style="background: rgba(255, 170, 0, 0.2); color: #ffaa00; border: 1px solid rgba(255, 170, 0, 0.4);" tooltip="Self-destructs {{ item.expires_in }}" flow="up"><i class="fa-solid fa-clock"></i> Expiring ({{ item.expires_in }})</span>
@endif
<div class="blahlol-meta">
<span class="badge badge-dark">
<a href="/{{ (enable_item_slugs && item.slug) ? item.slug : item.id }}" class="id-link" data-item-id="{{ item.id }}">{{ (enable_item_slugs && item.slug) ? item.slug : item.id }}</a> — [@if(!is_anonymized)<a id="a_username" data-username="{{ item.username || '' }}" @if(session && !session.is_anon) data-author-id="{{ item.author_id || '' }}" @endif href="/user/{{ item_username_lower }}" @if(session && !session.is_anon && item.author_id) tooltip="ID: {{ item.author_id }}" @endif @if(item.author_color) style="color: {{ item.author_color }}" @endif>{!! item.author_display_name || item.username || 'unknown' !!}</a>@else<span>anonymous</span>@endif] <span id="oc-badge-container">@if(item.is_oc) — <span class="oc-badge" tooltip="Original Content">OC</span>@endif</span>
</span>
<span id="hall-badge-container">@if(halls_enabled && item.primaryHall)<span class="badge hall-badge-wrap">
<a href="/h/{{ item.primaryHall.slug }}" class="hall-badge-primary"><i class="fa-solid fa-layer-group"></i> {{ item.primaryHall.name }}</a>@if(item.otherHalls && item.otherHalls.length)<span class="hall-overflow-pill">+{{ item.otherHalls.length }}<span class="hall-overflow-tooltip">@each(item.otherHalls as oh)<a href="/h/{{ oh.slug }}">{{ oh.name }}</a>@endeach</span></span>@endif
</span>@endif</span>
<span class="badge badge-dark"><a href="/{{ (enable_item_slugs && item.slug) ? item.slug : item.id }}" class="timestamp-link"><time class="timeago" tooltip="{{ item.timestamp.timefull }}">{{item.timestamp.timeago }}</time></a></span>
@if(item.expires_at)
<span class="badge badge-warning" style="background: rgba(255, 170, 0, 0.2); color: #ffaa00; border: 1px solid rgba(255, 170, 0, 0.4);" tooltip="Self-destructs {{ item.expires_in }}" flow="up"><i class="fa-solid fa-clock"></i> Expiring ({{ item.expires_in }})</span>
@endif
</div>
<div class="gapRight">
<div class="gapRight">
@if(session)
@if(user_has_favorited)
<i class="iconset fa-solid fa-heart" id="a_favo" data-item-id="{{ item.id }}" title="Favorite"></i>
@@ -187,7 +188,7 @@
@each(item.favorites as fav)
@if(fav.hide_fav_badge && (!session || session.user !== fav.user))
<a class="ghost-fav" tooltip="?" flow="up" style="cursor: default;"><img src="/s/img/ghost_fav.svg" style="height: 32px; width: 32px;" loading="lazy" /></a>
@elseif(is_anonymized)
@elseif(is_anonymized || fav.is_anon)
<a class="ghost-fav" tooltip="anonymous" flow="up" style="cursor: default;"><img src="/a/default.png" style="height: 32px; width: 32px;" loading="lazy" /></a>
@else
<a href="/user/{{ fav.user.toLowerCase() }}" tooltip="{!! fav.display_name || fav.user !!}" flow="up"><img src="@if(fav.avatar_file)/a/{{ fav.avatar_file }}@elseif(fav.avatar)/t/{{ fav.avatar }}.webp@else/a/default.png@endif" style="height: 32px; width: 32px@if(fav.username_color); border-color: {{ fav.username_color }}@endif" loading="lazy" /></a>
+3
View File
@@ -187,6 +187,9 @@ window.resolveReport = async function(id, action) {
const data = await res.json();
if (data.success) {
window.loadReports(window.currentPage);
if (window.NotificationSystemInstance && typeof window.NotificationSystemInstance.pollDebounced === 'function') {
window.NotificationSystemInstance.pollDebounced();
}
} else {
alert('Error: ' + data.msg);
}
+54
View File
@@ -252,6 +252,60 @@
<small class="text-muted" style="margin-left: 25px;">{{ t('settings.enable_bg_blur_hint') }}</small>
</div>
<div class="setting-item" style="margin-top: 15px; padding-left: 25px;">
<div style="display: flex; align-items: center; justify-content: space-between; max-width: 380px;">
<label for="onara_bg_opacity_slider" style="font-size: 0.9em; margin-bottom: 0; font-weight: bold;">Onara Backdrop Darkness</label>
<span id="onara_bg_opacity_val" style="font-size: 0.85em; opacity: 0.8;">84%</span>
</div>
<input type="range" id="onara_bg_opacity_slider" min="0" max="1" step="0.01" value="0.84" style="max-width: 380px; width: 100%; margin-top: 4px;">
<small class="text-muted" style="display: block;">Overlay darkness in Onara mode (lower values allow background canvas to shine through).</small>
</div>
<div class="setting-item" style="margin-top: 15px; padding-left: 25px;">
<div style="display: flex; align-items: center; justify-content: space-between; max-width: 380px;">
<label for="onara_backdrop_blur_slider" style="font-size: 0.9em; margin-bottom: 0; font-weight: bold;">Onara Backdrop Blur</label>
<span id="onara_backdrop_blur_val" style="font-size: 0.85em; opacity: 0.8;">5px</span>
</div>
<input type="range" id="onara_backdrop_blur_slider" min="0" max="50" step="1" value="5" style="max-width: 380px; width: 100%; margin-top: 4px;">
<small class="text-muted" style="display: block;">Backdrop blur applied behind the Onara media modal.</small>
</div>
<div class="setting-item" style="margin-top: 15px; padding-left: 25px;">
<div style="display: flex; align-items: center; justify-content: space-between; max-width: 380px;">
<label for="onara_grid_dim_slider" style="font-size: 0.9em; margin-bottom: 0; font-weight: bold;">Onara Background Grid Opacity</label>
<span id="onara_grid_dim_val" style="font-size: 0.85em; opacity: 0.8;">15%</span>
</div>
<input type="range" id="onara_grid_dim_slider" min="0" max="1" step="0.01" value="0.15" style="max-width: 380px; width: 100%; margin-top: 4px;">
<small class="text-muted" style="display: block;">Control how clearly the background thumbnail grid shines through over the ambient canvas in Onara mode.</small>
</div>
<div class="setting-item" style="margin-top: 15px; padding-left: 25px;">
<div style="display: flex; align-items: center; justify-content: space-between; max-width: 380px;">
<label for="bg_canvas_opacity_slider" style="font-size: 0.9em; margin-bottom: 0; font-weight: bold;">Background Canvas Opacity</label>
<span id="bg_canvas_opacity_val" style="font-size: 0.85em; opacity: 0.8;">100%</span>
</div>
<input type="range" id="bg_canvas_opacity_slider" min="0" max="1" step="0.01" value="1.00" style="max-width: 380px; width: 100%; margin-top: 4px;">
<small class="text-muted" style="display: block;">Control the visibility and brightness of the ambient background canvas & audio visualizer.</small>
</div>
<div class="setting-item" style="margin-top: 15px; padding-left: 25px;">
<div style="display: flex; align-items: center; justify-content: space-between; max-width: 380px;">
<label for="bg_canvas_blur_slider" style="font-size: 0.9em; margin-bottom: 0; font-weight: bold;">Background Canvas Blur</label>
<span id="bg_canvas_blur_val" style="font-size: 0.85em; opacity: 0.8;">300px</span>
</div>
<input type="range" id="bg_canvas_blur_slider" min="0" max="300" step="1" value="300" style="max-width: 380px; width: 100%; margin-top: 4px;">
<small class="text-muted" style="display: block;">Adjust the ambient blur of the background canvas (higher values create a soft, dreamy ambient glow).</small>
</div>
<div class="setting-item" style="margin-top: 15px; padding-left: 25px;">
<div style="display: flex; align-items: center; justify-content: space-between; max-width: 380px;">
<label for="bg_canvas_brightness_slider" style="font-size: 0.9em; margin-bottom: 0; font-weight: bold;">Background Brightness Boost</label>
<span id="bg_canvas_brightness_val" style="font-size: 0.85em; opacity: 0.8;">100%</span>
</div>
<input type="range" id="bg_canvas_brightness_slider" min="0.5" max="2.5" step="0.05" value="1.00" style="max-width: 380px; width: 100%; margin-top: 4px;">
<small class="text-muted" style="display: block;">Boost background canvas brightness so visuals pop through clearly.</small>
</div>
<div class="setting-item" style="margin-top: 15px;">
<label for="show_motd_toggle" style="cursor: pointer; display: flex; align-items: center; gap: 10px;">
<input type="checkbox" id="show_motd_toggle" @if(session.show_motd !==false) checked @endif>
+1 -1
View File
@@ -131,7 +131,7 @@
<button type="button" class="sidebar-tab" id="sidebar-tab-tag" data-tab="tag" title="Tag Feed" aria-label="Tag Feed" style="display: none;">
<i class="fa-solid fa-hashtag"></i>
</button>
<button type="button" class="sidebar-tab" id="sidebar-tab-tuner" data-tab="tuner" title="Audio Reactivity Tuner" aria-label="Audio Reactivity Tuner">
<button type="button" class="sidebar-tab" id="sidebar-tab-tuner" data-tab="tuner" title="Tuner & Debug (Audio & Danmaku)" aria-label="Tuner & Debug (Audio & Danmaku)">
<i class="fa-solid fa-sliders"></i>
</button>
</div>
+1 -1
View File
@@ -79,7 +79,7 @@
<i class="fa-solid fa-music"></i>
</div>
</div>
<audio id="my-video" class="embed-responsive-item" preload="auto" loop src="{{ item.dest }}" data-setup="{}" data-size="{{ item.size }}" @if(item.coverart)poster="{{ item.coverart }}"@endif type="{{ item.mime }}"></audio>
<audio id="my-video" class="embed-responsive-item" preload="auto" loop crossorigin="anonymous" src="{{ item.dest }}" data-setup="{}" data-size="{{ item.size }}" @if(item.coverart)poster="{{ item.coverart }}"@endif type="{{ item.mime }}"></audio>
<img id="f0ck-audio-cover" @if(item.coverart)src="{{ item.coverart }}"@endif style="display: none;">
</div>
@elseif(item.mime.startsWith("image"))
+1 -1
View File
@@ -16,7 +16,7 @@
<span class="thumb-xd-indicator xd-tier-{{ item.xd_tier }}" title="xD Score: {{ item.xd_score }}">xD</span>
@endif
@if(item.is_album && item.album_count > 1)
<span class="album-indicator anim" title="Album: {{ item.album_count }} images"><i class="fa-solid fa-images"></i> {{ item.album_count }}</span>
<span class="album-indicator" title="Album: {{ item.album_count }} images"><i class="fa-solid fa-images"></i> {{ item.album_count }}</span>
@endif
</div>
<div class="thumb-select-check"><i class="fa-solid fa-check"></i></div>
+7
View File
@@ -173,6 +173,13 @@
</div>
</div>
<div class="form-section global-redirect-section">
<label class="checkbox-container upload-checkbox-label" style="display: inline-flex; align-items: center; gap: 8px; cursor: pointer; font-size: 0.9em; user-select: none; margin: 0;">
<input type="checkbox" id="upload-redirect-checkbox" name="redirect_to_item" class="upload-redirect-checkbox" checked>
<span><i class="fa-solid fa-arrow-up-right-from-square" style="opacity: 0.8; margin-right: 2px;"></i> {{ t('upload.redirect_to_item') }}</span>
</label>
</div>
<div class="form-actions">
<button type="submit" class="btn-upload" disabled>
<span class="btn-text">{{ t('upload.select_file') }}</span>