gfsdgsd
This commit is contained in:
@@ -19,6 +19,9 @@
|
||||
@if(enable_xd_score && item.xd_tier > 0)
|
||||
<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>
|
||||
@endif
|
||||
</div>
|
||||
<div class="thumb-select-check"><i class="fa-solid fa-check"></i></div>
|
||||
<p></p>
|
||||
|
||||
+1
-1
@@ -1065,7 +1065,7 @@
|
||||
<button id="chan-open-btn" class="topbar-icon-btn" title="{{ t('scroller.chan_threads') }}" style="display:none"><i class="fa-solid fa-clover"></i></button>
|
||||
<button id="chan-gallery-btn" class="topbar-icon-btn" title="{{ t('scroller.thread_gallery') }} (G)" style="display:none"><i class="fa-solid fa-grip"></i></button>
|
||||
<button id="settings-open-btn" class="topbar-icon-btn" title="{{ t('scroller.settings') }}"><i class="fa-solid fa-gear"></i></button>
|
||||
@if(typeof session !== 'undefined' && session && (!session.is_anon || (enable_anonymous_access && anon_permissions.filter)))
|
||||
@if(typeof session !== 'undefined' && session && !session.is_anon || typeof session !== 'undefined' && session && enable_anonymous_access && anon_permissions.filter)
|
||||
<button id="filter-open-btn" class="topbar-icon-btn" title="{{ t('scroller.filters') }} (F)"><i class="fa-solid fa-sliders"></i></button>
|
||||
@endif
|
||||
@if(typeof session !== 'undefined' && session)
|
||||
|
||||
@@ -675,6 +675,17 @@
|
||||
url_tracker_complete: "{{ t('upload.url_tracker_complete') || 'Complete!' }}",
|
||||
url_tracker_failed: "{{ t('upload.url_tracker_failed') || 'Upload failed' }}",
|
||||
url_tracker_view: "{{ t('upload.url_tracker_view') || 'View →' }}",
|
||||
// albums
|
||||
upload_album: "{{ t('album.mode_album') || 'Upload Album (%s)' }}",
|
||||
uploading_album: "{{ t('album.uploading_album') || 'Uploading album...' }}",
|
||||
album_counter: "{{ t('album.counter') || '%s of %s' }}",
|
||||
album_cover: "{{ t('album.cover') || 'Cover' }}",
|
||||
album_remove: "{{ t('album.remove_picture') || 'Remove picture' }}",
|
||||
album_move_left: "{{ t('album.move_left') || 'Move left' }}",
|
||||
album_move_right: "{{ t('album.move_right') || 'Move right' }}",
|
||||
album_add_more: "{{ t('album.add_more') || 'Add more pictures' }}",
|
||||
album_select_pictures: "{{ t('album.select_pictures') || 'Select pictures for album' }}",
|
||||
album_min_pictures: "{{ t('album.min_pictures') || 'Add at least 2 pictures for an album' }}",
|
||||
// favorites
|
||||
no_favs: "{{ t('profile.no_favs') || 'no favorites' }}",
|
||||
favs_label: "{{ t('profile.favs_label') || 'Favorites' }}",
|
||||
|
||||
@@ -4,8 +4,10 @@
|
||||
<div class="infobox-modal-header">
|
||||
<div class="infobox-header-title">
|
||||
<div class="infobox-header-text">
|
||||
<h3>{{ t('info_modal.title') || 'Post & File Details' }}</h3>
|
||||
<span class="infobox-sub-heading">ID: <code>{{ item.id }}</code></span>
|
||||
<h3 id="info-modal-title">{{ t('info_modal.title') || 'Post & File Details' }}</h3>
|
||||
<span class="infobox-sub-heading" id="info-modal-subheading" data-item-id="{{ item.id }}" data-item-slug="{{ item.slug || '' }}">
|
||||
ID: <code>{{ item.id }}</code>@if(item.slug) • Slug: <code>{{ item.slug }}</code>@endif
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" class="infobox-close-icon-btn" id="info-modal-close-icon" title="{{ t('common.close') || 'Close' }}">
|
||||
@@ -17,7 +19,7 @@
|
||||
<div class="infobox-modal-body">
|
||||
|
||||
<!-- Section 1: Post Details -->
|
||||
<div class="infobox-section">
|
||||
<div class="infobox-section" id="info-section-post">
|
||||
<div class="infobox-section-header">
|
||||
<i class="fa-solid fa-sliders"></i>
|
||||
<span>Post Configuration</span>
|
||||
@@ -80,68 +82,63 @@
|
||||
</div>
|
||||
|
||||
<!-- Section 2: Technical File Specifications -->
|
||||
<div class="infobox-section">
|
||||
<div class="infobox-section" id="info-section-specs">
|
||||
<div class="infobox-section-header">
|
||||
<i class="fa-solid fa-file-code"></i>
|
||||
<span>Technical Specifications</span>
|
||||
<span id="info-specs-header-title">Technical Specifications</span>
|
||||
</div>
|
||||
|
||||
<div class="infobox-cards-grid">
|
||||
<div class="infobox-card">
|
||||
<div class="infobox-card" id="info-card-filesize">
|
||||
<label class="infobox-card-label"><i class="fa-solid fa-hard-drive"></i> File Size</label>
|
||||
<div class="infobox-card-value font-mono">{{ item.size }}</div>
|
||||
<div class="infobox-card-value font-mono" id="info-file-size">{{ item.size }}</div>
|
||||
</div>
|
||||
|
||||
@if(item_has_dimensions)
|
||||
<div class="infobox-card">
|
||||
<div class="infobox-card" id="info-card-dimensions" @if(!item_has_dimensions)style="display: none;"@endif>
|
||||
<label class="infobox-card-label"><i class="fa-solid fa-ruler-combined"></i> Dimensions</label>
|
||||
<div class="infobox-card-value font-mono">{{ item.width }} × {{ item.height }} px</div>
|
||||
<div class="infobox-card-value font-mono" id="info-file-dimensions">@if(item_has_dimensions){{ item.width }} × {{ item.height }} px@endif</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="infobox-card">
|
||||
<div class="infobox-card" id="info-card-mime">
|
||||
<label class="infobox-card-label"><i class="fa-solid fa-file-lines"></i> MIME Type</label>
|
||||
<div class="infobox-card-value"><code class="mime-pill">{{ item.mime }}</code></div>
|
||||
<div class="infobox-card-value"><code class="mime-pill" id="info-file-mime">{{ item.mime }}</code></div>
|
||||
</div>
|
||||
|
||||
<div class="infobox-card">
|
||||
<div class="infobox-card" id="info-card-directlink">
|
||||
<label class="infobox-card-label"><i class="fa-solid fa-arrow-up-right-from-square"></i> Direct Link</label>
|
||||
<div class="infobox-card-value">
|
||||
<a href="{{ item.mime === 'video/youtube' ? 'https://www.youtube.com/watch?v=' + item.dest.replace('yt:', '') : item.dest }}" target="_blank" class="infobox-link-pill">
|
||||
<a href="{{ item.mime === 'video/youtube' ? 'https://www.youtube.com/watch?v=' + item.dest.replace('yt:', '') : item.dest }}" target="_blank" class="infobox-link-pill" id="info-file-direct-link">
|
||||
<i class="fa-solid fa-up-right-from-square"></i> {{ t('info_modal.view_file') || 'Open File' }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(item.src && item.src.short)
|
||||
<div class="infobox-card full-width">
|
||||
<div class="infobox-card full-width" id="info-card-source">
|
||||
<label class="infobox-card-label"><i class="fa-solid fa-link"></i> Source URL</label>
|
||||
<div class="infobox-card-value">
|
||||
<a href="{{ item.src.long }}" target="_blank" class="infobox-source-link">
|
||||
<a href="{{ item.src.long }}" target="_blank" class="infobox-source-link" id="info-file-source">
|
||||
<i class="fa-solid fa-globe"></i> {{ item.src.short }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if(item.checksum)
|
||||
<div class="infobox-card full-width">
|
||||
<div class="infobox-card full-width" id="info-card-hash" @if(!item.checksum)style="display: none;"@endif>
|
||||
<div class="infobox-card-label-row">
|
||||
<label class="infobox-card-label"><i class="fa-solid fa-fingerprint"></i> SHA-256 Hash</label>
|
||||
<button type="button" class="copy-hash-btn" id="info-copy-hash-btn" data-hash="{{ item.checksum.split('_bypass_')[0] }}" title="Copy SHA-256 Hash">
|
||||
<button type="button" class="copy-hash-btn" id="info-copy-hash-btn" data-hash="@if(item.checksum){{ item.checksum.split('_bypass_')[0] }}@endif" title="Copy SHA-256 Hash">
|
||||
<i class="fa-solid fa-copy"></i> Copy
|
||||
</button>
|
||||
</div>
|
||||
<div class="info-hash-codeblock font-mono"><code>{{ item.checksum.split('_bypass_')[0] }}</code></div>
|
||||
|
||||
<div class="info-hash-codeblock font-mono"><code id="info-file-hash">@if(item.checksum){{ item.checksum.split('_bypass_')[0] }}@endif</code></div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 3: Reposts & Duplicates (if present) -->
|
||||
@if(item.show_repost_row)
|
||||
<div class="infobox-section">
|
||||
<div class="infobox-section" id="info-section-reposts">
|
||||
<div class="infobox-section-header">
|
||||
<i class="fa-solid fa-copy"></i>
|
||||
<span>Similar & Duplicate Uploads</span>
|
||||
|
||||
@@ -1,4 +1,46 @@
|
||||
@if(item.mime === 'video/youtube')
|
||||
@if(item.is_album && item.album && item.album.length > 1)
|
||||
<div class="embed-responsive embed-responsive-16by9 album-gallery-container" data-album-id="{{ item.id }}" data-requested-subf0ck="{{ item.requested_subf0ck_slug || '' }}">
|
||||
<script type="application/json" class="album-data-json">{{ item.album_json }}</script>
|
||||
<div class="embed-responsive-image album-media-stage" id="image-scroll">
|
||||
<a href="{{ item.dest }}" id="elfe" target="_blank" class="album-stage-link">
|
||||
<img id="f0ck-image" class="img-fluid album-active-image" src="{{ item.dest }}" loading="lazy" decoding="async" />
|
||||
</a>
|
||||
<div id="f0ck-album-video-wrapper" class="album-video-wrapper embed-responsive embed-responsive-16by9" style="display: none; position: absolute; inset: 0; width: 100%; height: 100%;">
|
||||
<video id="f0ck-album-video" class="embed-responsive-item" preload="auto" loop playsinline></video>
|
||||
</div>
|
||||
<div id="f0ck-album-audio-wrapper" class="album-audio-wrapper embed-responsive embed-responsive-16by9" style="display: none; position: absolute; inset: 0; width: 100%; height: 100%; background: url('/s/img/audio.webp') no-repeat center / contain black;">
|
||||
<audio id="f0ck-album-audio" class="embed-responsive-item" preload="auto" loop poster="/s/img/audio.webp"></audio>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Album Gallery Controls Inside View -->
|
||||
<div class="album-controls-overlay">
|
||||
<button type="button" class="album-btn album-btn-prev" title="{{ t('album.prev') || 'Previous' }}" aria-label="Previous">
|
||||
<i class="fa-solid fa-chevron-left"></i>
|
||||
</button>
|
||||
<div class="album-counter-pill" title="Subf0cks">
|
||||
<i class="fa-solid fa-layer-group"></i>
|
||||
<span class="album-current-idx">1</span> / <span class="album-total-count">{{ item.album.length }}</span>
|
||||
</div>
|
||||
<button type="button" class="album-btn album-btn-next" title="{{ t('album.next') || 'Next' }}" aria-label="Next">
|
||||
<i class="fa-solid fa-chevron-right"></i>
|
||||
</button>
|
||||
</div>
|
||||
<!-- Album Thumbnail Strip (reveals on hover) -->
|
||||
<div class="album-thumbnails-strip">
|
||||
@each(item.album as img)
|
||||
<button type="button" class="album-thumb-item {{ img.is_first ? 'active' : '' }}" data-index="{{ img.order_index }}" data-subf0ck-id="{{ img.slug || img.id }}" data-subf0ck-slug="{{ img.slug || img.id }}" data-src="{{ img.src }}" data-mime="{{ img.mime }}" title="Subf0ck {{ img.slug || img.id }} ({{ img.display_index }}/{{ item.album.length }})">
|
||||
<img src="{{ img.thumb || img.src }}" loading="lazy" alt="Subf0ck {{ img.slug || img.id }}" />
|
||||
@if(img.is_video)
|
||||
<span class="album-thumb-mime-badge"><i class="fa-solid fa-play"></i></span>
|
||||
@elseif(img.is_audio)
|
||||
<span class="album-thumb-mime-badge"><i class="fa-solid fa-music"></i></span>
|
||||
@endif
|
||||
</button>
|
||||
@endeach
|
||||
</div>
|
||||
<button class="image-modal-btn" title="Open in modal"><i class="fa-solid fa-plus"></i></button>
|
||||
</div>
|
||||
@elseif(item.mime === 'video/youtube')
|
||||
<div class="embed-responsive embed-responsive-16by9">
|
||||
<iframe id="yt-embed" class="embed-responsive-item" width="640" height="360" src="https://www.youtube.com/embed/{!! item.dest.replace('yt:', '') !!}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
</div>
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
@if(enable_xd_score && item.xd_tier > 0)
|
||||
<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>
|
||||
@endif
|
||||
</div>
|
||||
<div class="thumb-select-check"><i class="fa-solid fa-check"></i></div>
|
||||
<p></p>
|
||||
|
||||
@@ -1,34 +1,57 @@
|
||||
<form id="upload-form" class="upload-form {{ shitpost_mode ? 'shitpost-mode-active' : '' }}" enctype="multipart/form-data" data-mimes='{!! mimes_json !!}' data-max-bytes="{{ max_file_size_bytes }}" data-min-tags="{{ min_tags }}" data-comment-max-length="{{ comment_max_length }}" data-enable-swf="{{ enable_swf ? '1' : '0' }}" data-enable-archive="{{ enable_archive ? '1' : '0' }}">
|
||||
<div class="form-section">
|
||||
@if(web_url_upload)
|
||||
<div class="upload-mode-tabs">
|
||||
<button type="button" class="upload-mode-tab active" data-mode="file">
|
||||
<i class="fa-solid fa-upload"></i>
|
||||
{{ t('upload.file_tab') }}
|
||||
</button>
|
||||
<button type="button" class="upload-mode-tab" data-mode="album">
|
||||
<i class="fa-solid fa-images"></i>
|
||||
{{ t('album.title') || 'Album' }}
|
||||
</button>
|
||||
@if(web_url_upload)
|
||||
<button type="button" class="upload-mode-tab" data-mode="url">
|
||||
<i class="fa-solid fa-link"></i>
|
||||
@if(enable_youtube_upload){{ t('upload.url_tab_yt') }}@else {{ t('upload.url_tab') }} @endif
|
||||
</button>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<!-- File input area -->
|
||||
<div class="upload-mode-content" id="mode-file">
|
||||
<div class="drop-zone" id="upload-form-drop-zone">
|
||||
<input type="file" class="file-input" name="file" accept="{{ allowed_mimes }}" {{ shitpost_mode ? 'multiple' : '' }}>
|
||||
<input type="file" class="file-input" name="file" accept="{{ allowed_mimes }}" multiple>
|
||||
<div class="drop-zone-prompt">
|
||||
<p style="font-size: 1.1rem; font-weight: 500;">{{ t('upload.drop_here') }}</p>
|
||||
<p class="drop-zone-title" style="font-size: 1.1rem; font-weight: 500;">{{ t('upload.drop_here') }}</p>
|
||||
<p style="font-size: 0.9rem; opacity: 0.6;">(max {{ max_file_size }})@if(session.admin) <span style="color: var(--accent);">{{ t('upload.admin_boost') }}</span>@endif</p>
|
||||
<p class="drop-album-hint" style="margin-top: 6px; font-size: 0.85rem; color: var(--accent); opacity: 0.95;">
|
||||
<i class="fa-solid fa-layer-group"></i> {{ t('album.drop_hint') || 'Select or drop multiple files (subf0cks) to create an Album' }}
|
||||
</p>
|
||||
</div>
|
||||
<!-- Preview Container -->
|
||||
<div class="file-preview" style="display: none;">
|
||||
<!-- Video will be injected here via JS -->
|
||||
|
||||
<!-- Video/images will be injected here via JS -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Album / Batch Mode Switcher (displayed when multiple files are chosen) -->
|
||||
<div class="album-choice-container" id="album-choice-container" style="display: none;">
|
||||
<div class="album-choice-title">
|
||||
<i class="fa-solid fa-layer-group"></i> {{ t('album.multiple_selected') || 'Multiple files selected' }}
|
||||
</div>
|
||||
<div class="album-choice-options">
|
||||
<button type="button" class="album-choice-btn active" data-choice="album">
|
||||
<i class="fa-solid fa-layer-group"></i> <span>{{ t('album.mode_album') || 'Album (1 post)' }}</span>
|
||||
</button>
|
||||
@if(shitpost_mode)
|
||||
<button type="button" class="album-choice-btn" data-choice="batch">
|
||||
<i class="fa-solid fa-cubes-stacked"></i> <span>{{ t('album.mode_batch') || 'Separate posts' }}</span>
|
||||
</button>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(web_url_upload)
|
||||
<!-- URL input area -->
|
||||
<div class="upload-mode-content" id="mode-url" style="display: none;">
|
||||
@@ -52,8 +75,8 @@
|
||||
<input type="file" name="thumbnail" id="upload-thumbnail-input" accept="image/jpeg,image/png,image/webp" style="display:none;">
|
||||
</div>
|
||||
|
||||
@if(!shitpost_mode && enable_item_title)
|
||||
<div class="form-section global-title-section">
|
||||
@if(enable_item_title)
|
||||
<div class="form-section global-title-section" @if(shitpost_mode) style="display:none;" @endif>
|
||||
<label>Title <span style="opacity: 0.5; font-weight: normal;">{{ t('upload.comment_optional') }}</span></label>
|
||||
<input type="text" name="title" class="upload-title-input" placeholder="Add a title for this item…" maxlength="500" autocomplete="off">
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user