Search / static /index.html
vomebook's picture
perf(ui): keep sidebar toggle responsive with long result lists
faea044
Raw History Blame Contribute Delete
11.6 kB
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>VOMEBOOK Search</title>
<link rel="manifest" href="/manifest.json">
<meta name="theme-color" content="#1a1c1e">
<link rel="apple-touch-icon" href="/icons/icon-192.png">
<link rel="icon" type="image/png" sizes="192x192" href="/icons/icon-192.png">
<link rel="icon" type="image/png" sizes="512x512" href="/icons/icon-512.png">
<script>fetch("/api/ping", { cache: "no-store" }).catch(() => {});</script>
<link rel="stylesheet" href="/static/style.css?v=phrases-4">
</head>
<body class="dark">
<header id="header">
<div class="header-left">
<button id="hamburger-btn" class="icon-btn" aria-label="打开数据包导航" aria-controls="left-sidebar" aria-expanded="true"><span class="ui-icon ui-icon-menu" aria-hidden="true"></span></button>
<a id="header-logo" class="header-logo" href="https://huggingface.co/VOMEBOOK" title="VOMEBOOK">
<span id="header-title">VOMEBOOK</span>
</a>
</div>
<div class="header-center">
<div class="search-box">
<span class="search-icon"><span class="ui-icon ui-icon-search" aria-hidden="true"></span></span>
<input type="search" id="search-input" class="search-input" aria-label="搜索 TXT 文件和正文" aria-controls="search-history-dropdown" aria-expanded="false" placeholder="全文搜索 TXT 正文..." autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false">
<kbd class="search-kbd">/</kbd>
<div id="search-history-dropdown" class="search-history-dropdown" role="region" aria-label="搜索历史" style="display:none"></div>
</div>
</div>
<div class="header-right">
<button id="settings-btn" class="icon-btn" aria-label="打开搜索过滤" aria-controls="right-sidebar" aria-expanded="false"><span class="ui-icon ui-icon-sliders" aria-hidden="true"></span></button>
<button id="mobile-toggle-btn" class="icon-btn" aria-label="切换手机或电脑模式" aria-pressed="false" title="手机/电脑模式切换"><span id="mobile-toggle-icon" class="ui-icon ui-icon-devices" aria-hidden="true"></span></button>
<button id="theme-btn" class="icon-btn" aria-label="切换到白天模式" title="白天模式"><svg class="theme-icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M20 15.5A8 8 0 1 1 8.5 4 6.5 6.5 0 0 0 20 15.5Z"/></svg></button>
</div>
</header>
<div id="app-body" class="app-body">
<aside id="left-sidebar" class="sidebar left-sidebar" aria-labelledby="sidebar-title">
<div class="sidebar-header"><span id="sidebar-title">数据包</span><button id="sidebar-expand-btn" class="icon-btn-sm" aria-label="展开数据包导航" aria-expanded="false" title="展开/收起侧边栏" style="display:none">↔</button></div>
<div id="sidebar-content" class="sidebar-content"><div class="sidebar-loading">加载中...</div></div>
</aside>
<main id="main-content" class="main-content">
<div id="status-bar" class="status-bar">
<div class="status-left">
<span id="result-count" class="result-count" role="status"></span>
<label class="multi-toggle" id="multi-toggle-label" style="display:none"><input type="checkbox" id="multi-select-toggle"><span>多选</span></label>
</div>
<div class="status-right">
<button id="clear-filters-btn" class="text-btn" style="display:none">清空筛选</button>
<div class="sort-group">
<span class="sort-label">排序:</span>
<select id="sort-select" class="sort-select" aria-label="排序方式">
<option value="relevance">相关度</option>
<option value="name">文件名</option>
<option value="size">文件大小</option>
</select>
</div>
</div>
</div>
<div id="multi-action-bar" class="multi-action-bar" style="display:none">
<button id="multi-select-all" class="multi-action-btn">全选</button>
<button id="multi-deselect" class="multi-action-btn">取消选择</button>
<button id="multi-batch-download" class="multi-action-btn primary">批量下载</button>
<button id="multi-zip-download" class="multi-action-btn primary">合并下载</button>
<span id="multi-selected-count" class="multi-selected-count" role="status" aria-live="polite" aria-atomic="true"></span>
</div>
<div id="results-container" class="results-container" aria-busy="false" role="region" aria-label="搜索结果">
<div id="results-list" class="results-list" role="list"></div>
<div id="results-loading" class="loading-spinner" style="display:none"><div class="spinner"></div></div>
<div id="empty-state" class="empty-state" style="display:none">
<div class="empty-title">没有找到结果</div>
<div id="empty-desc" class="empty-desc">试试其他关键词</div>
<button id="empty-random-btn" class="random-big-btn">随机来一篇</button>
</div>
</div>
<div id="load-info" class="load-info" role="status" aria-live="polite" aria-atomic="true" style="display:none">已加载 <span id="loaded-count">0</span> / <span id="total-count">0</span> 条</div>
<div id="preview-panel" class="preview-panel" role="dialog" aria-modal="true" aria-label="文件预览" tabindex="-1" hidden style="display:none"></div>
</main>
<aside id="right-sidebar" class="sidebar right-sidebar" aria-label="搜索过滤">
<div class="sidebar-header"><span>搜索过滤</span><button id="close-filters-btn" class="icon-btn-sm" aria-label="关闭搜索过滤">×</button></div>
<div class="sidebar-content">
<div class="filter-section" id="fulltext-toggle-section">
<label class="toggle-row">
<span class="toggle-label">全文搜索</span>
<input type="checkbox" id="fulltext-toggle" checked>
<span class="toggle-switch"></span>
</label>
</div>
<div class="filter-section" id="search-paths-toggle-section">
<label class="toggle-row">
<span class="toggle-label">搜索文件夹名</span>
<input type="checkbox" id="search-paths-toggle" checked>
<span class="toggle-switch"></span>
</label>
</div>
<div class="filter-section" id="history-toggle-section">
<label class="toggle-row">
<span class="toggle-label">记录搜索历史</span>
<input type="checkbox" id="history-toggle" checked>
<span class="toggle-switch"></span>
</label>
</div>
<div class="filter-section" id="exact-search-section">
<label class="toggle-row">
<span class="toggle-label">精准搜索</span>
<input type="checkbox" id="exact-search-toggle" checked>
<span class="toggle-switch"></span>
</label>
</div>
<div id="filter-source-section" class="filter-section">
<div class="filter-section-title"><span class="filter-title-leading"><span>数据包过滤</span><button id="source-filter-cancel" class="text-btn-sm" hidden>取消</button></span></div>
<div id="filter-source-list" class="filter-checkbox-list"></div>
</div>
<div id="filter-folder-section" class="filter-section">
<div class="filter-section-title"><span class="filter-title-leading"><span>路径过滤</span><button id="folder-filter-cancel" class="text-btn-sm" hidden>取消</button></span><span class="filter-actions"><button type="button" id="folder-toggle-all" class="text-btn-sm" aria-label="展开所有子目录" title="展开所有子目录" aria-controls="filter-folder-tree" aria-expanded="false" disabled>展开</button><button id="folder-select-all" class="text-btn-sm">全选</button><button id="folder-deselect-all" class="text-btn-sm">反选</button></span></div>
<div id="filter-folder-tree" class="filter-folder-tree"></div>
</div>
<div class="filter-section">
<div class="filter-section-title">文件大小</div>
<div class="filter-size-row">
<input type="number" id="filter-min-size" class="size-input" aria-label="最小文件大小" placeholder="最小" min="0" step="0.1">
<select id="filter-min-unit" class="size-unit" aria-label="最小文件大小单位"><option value="B">B</option><option value="KB">KB</option><option value="MB" selected>MB</option><option value="GB">GB</option></select>
<span class="size-sep">—</span>
<input type="number" id="filter-max-size" class="size-input" aria-label="最大文件大小" placeholder="最大" min="0" step="0.1">
<select id="filter-max-unit" class="size-unit" aria-label="最大文件大小单位"><option value="B">B</option><option value="KB">KB</option><option value="MB" selected>MB</option><option value="GB">GB</option></select>
</div>
</div>
</div>
</aside>
</div>
<footer id="footer" class="footer">
<div class="hitokoto"></div>
<button id="random-book-btn" class="random-book-btn" title="随机来一篇">
<span class="ui-icon ui-icon-book" aria-hidden="true"></span>
<span>随机来一篇</span>
</button>
</footer>
<div id="overlay" class="overlay" style="display:none"></div>
<div id="toast" class="toast" role="status" aria-live="polite" style="display:none"></div>
<section id="speech-panel" class="speech-panel" aria-label="朗读设置" hidden>
<div class="speech-heading"><span id="speech-title">朗读</span><button type="button" id="speech-collapse" class="icon-btn-sm" aria-label="收起设置,继续播放" title="收起,继续播放"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.7" aria-hidden="true"><path d="M5 12h14"/></svg></button><button type="button" id="speech-stop" class="icon-btn-sm" aria-label="停止朗读" title="停止朗读">×</button></div>
<p id="speech-status" class="speech-note" role="status">从当前阅读位置开始</p>
<label class="speech-setting" for="speech-pitch"><span>音高</span><input id="speech-pitch" type="range" min="-3" max="3" step="1" value="0"><output id="speech-pitch-value">0</output></label>
<label class="speech-setting" for="speech-speed"><span>语速</span><input id="speech-speed" type="range" min="0.5" max="2" step="0.05" value="1"><output id="speech-speed-value">1.0×</output></label>
<label class="speech-setting" for="speech-timer"><span>睡眠定时</span><select id="speech-timer"><option value="off">关闭</option><option value="clip">读完当前句</option><option value="5">5 分钟</option><option value="15">15 分钟</option><option value="30">30 分钟</option><option value="60">60 分钟</option></select></label>
<div class="speech-transport"><button type="button" id="speech-previous" class="text-btn" aria-label="上一句">上一句</button><button type="button" id="speech-play" class="speech-play">暂停</button><button type="button" id="speech-next" class="text-btn" aria-label="下一句">下一句</button></div>
<div class="speech-links"><button type="button" id="speech-visible" class="text-btn">从当前阅读位置开始</button><button type="button" id="speech-locate" class="text-btn">回到播放位置</button></div>
</section>
<script>if ("serviceWorker" in navigator) { navigator.serviceWorker.register("/sw.js", { scope: "/" }); }</script>
<script src="/static/tts-client.js?v=clips-11"></script>
<script src="/static/app.js?v=phrases-4"></script>
</body>
</html>