vitepress-plugin-filelist 0.7.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,315 +1,42 @@
1
- # vitepress-plugin-filelist
1
+ <h1 align="center">
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/nrjycyd/vitepress-plugin-filelist/main/demo/docs/public/wordmark-dark.svg?sanitize=true">
4
+ <img src="https://raw.githubusercontent.com/nrjycyd/vitepress-plugin-filelist/main/demo/docs/public/wordmark.svg?sanitize=true" alt="vitepress-plugin-filelist" width="420">
5
+ </picture>
6
+ </h1>
2
7
 
3
- 面向 VitePress 的 OpenList 文件浏览组件:树形展开、勾选批量打包、目录密码、token,直接调用 OpenList 接口。
8
+ <p align="center">
9
+ <a href="https://www.npmjs.com/package/vitepress-plugin-filelist"><img src="https://img.shields.io/npm/v/vitepress-plugin-filelist" alt="npm"></a>
10
+ <a href="https://github.com/nrjycyd/vitepress-plugin-filelist/actions/workflows/ci.yml"><img src="https://github.com/nrjycyd/vitepress-plugin-filelist/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
11
+ <a href="https://github.com/nrjycyd/vitepress-plugin-filelist/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/vitepress-plugin-filelist" alt="license"></a>
12
+ </p>
4
13
 
5
- ## 功能
6
-
7
- - 📁 树形目录,文件夹按需加载
8
- - ✅ 勾选文件;选中文件夹会自动加载并选中其下所有层级的文件
9
- - 📦 批量打包 ZIP(基于 `client-zip`),带进度、可取消;Chrome / Edge 边下载边写入磁盘,不受大小限制;保留目录结构,不同目录的同名文件不会互相覆盖
10
- - 📄 大目录每个文件夹先显示 200 条,可“显示更多 / 全部显示”
11
- - ⬇️ 单文件下载(`fs/get` 的 `raw_url`,回退 `/d/`):交给浏览器下载;OpenList 自己的 `/p/`、`/d/` 链接在当前页直接下载、不打开新标签页,存储直链在新标签页打开
12
- - 👁️ 弹窗预览(不跳转):图片、音视频、文本、PDF;Markdown / HTML 可在源码与渲染之间切换;Office 等其它类型显示文件信息与下载
13
- - 🔐 目录密码输入,可选只读 token
14
- - 🔎 筛选并高亮关键词;“深度搜索”读取未展开的子目录,结果直接出现在原位置
15
- - ↕️ 按名称 / 大小 / 日期排序;名称排序跟随界面语言(中文按拼音、英文按字母),数字按自然顺序
16
- - 🎨 紧凑表格:按文件类型着色的扩展名标签、层级引导线,跟随 VitePress 亮 / 暗主题
17
- - 📱 窄容器(< 560px)自动切换为双行列表与 44px 触控区,勾选后工具栏变为吸顶操作条
18
- - 🌐 使用 `/api/fs/list`、`/api/fs/get`、`/api/public/settings`
19
- - 🧪 `base` 为空时使用内置演示数据
20
- - SSR 安全(网络请求只在客户端执行)
21
-
22
- ## 安装
23
-
24
- ```bash
25
- pnpm add -D vitepress-plugin-filelist
26
- # 或:npm i -D vitepress-plugin-filelist
27
- ```
28
-
29
- ## 在 vitepress-tuck 中使用
30
-
31
- ```ts
32
- // .vitepress/config.ts
33
- import { defineConfig } from 'vitepress-tuck'
34
- import fileList from 'vitepress-plugin-filelist'
35
-
36
- export default defineConfig({
37
- plugins: [fileList()],
38
- })
39
- ```
40
-
41
- ```ts
42
- // .vitepress/theme/index.ts
43
- import type { Theme } from 'vitepress'
44
- import enhanceApp from 'virtual:enhance-app'
45
- import DefaultTheme from 'vitepress/theme'
46
-
47
- export default {
48
- extends: DefaultTheme,
49
- enhanceApp(ctx) {
50
- enhanceApp(ctx)
51
- },
52
- } satisfies Theme
53
- ```
54
-
55
- ```md
56
- <FileList base="https://pan.example.com" path="/课程资料" />
57
- ```
58
-
59
- ## 在普通 VitePress 中使用
60
-
61
- ```ts
62
- // .vitepress/theme/index.ts
63
- import DefaultTheme from 'vitepress/theme'
64
- import { enhanceAppWithFileList } from 'vitepress-plugin-filelist/client'
65
- import 'vitepress-plugin-filelist/style.css'
66
-
67
- export default {
68
- extends: DefaultTheme,
69
- enhanceApp(ctx) {
70
- enhanceAppWithFileList(ctx)
71
- },
72
- }
73
- ```
74
-
75
- ## 组件属性
76
-
77
- | 属性 | 类型 | 默认值 | 说明 |
78
- | --- | --- | --- | --- |
79
- | `base` | `string` | `''` | OpenList 站点地址;为空时进入演示模式 |
80
- | `path` | `string` | `'/'` | 初始目录 |
81
- | `sources` | `FileListSource[]` | `[]` | 多根挂载;设置后忽略 `path` |
82
- | `expanded` | `boolean` | `false` | 目录根是否默认展开 |
83
- | `token` | `string` | `''` | 可选只读 token;不传则以游客身份请求 |
84
- | `password` | `string` | `''` | 目录密码,也可以在运行时输入 |
85
- | `rememberPassword` | `boolean` | `true` | 输入密码时是否提供“在此标签页中记住”开关;`false` 时不写入 sessionStorage |
86
- | `pageSize` | `number` | `200` | 每个文件夹先显示的条数,之后显示“显示更多 / 全部显示”;`0` 全部显示 |
87
- | `deepSearchLimit` | `number` | `500` | 深度搜索每次最多读取的文件夹数,之后可“继续” |
88
- | `deepSearch` | `'manual' \| 'auto'` | `'manual'` | `auto`:输入关键词即自动深度搜索(适合挂载目录不大的站点) |
89
- | `zipWarnSize` | `number` | `500`(触屏 `200`) | 需在内存中打包的浏览器(Firefox、Safari)超过该大小(MB)先确认;`0` 不提示 |
90
- | `zipMaxSize` | `number` | `2048`(触屏 `1024`) | 同上,超过该大小(MB)不打包;`0` 不限制 |
91
- | `title` | `string` | `''` | 工具栏标题;为空时回退到 OpenList 的 `site_title` |
92
- | `locale` | `'zh-CN' \| 'en-US'` | `'zh-CN'` | 内置文案预设 |
93
- | `labels` | `Partial<FileListLabels>` | `undefined` | 按 key 覆盖单条文案 |
94
-
95
- 同时注册了 `<FileList>` 和 `<VPFileList>` 两个组件名。
96
-
97
- ## 多根挂载
98
-
99
- ```md
100
- <FileList
101
- base="https://pan.example.com"
102
- title="课程资料"
103
- :sources="[
104
- { path: '/课程资料/语文' },
105
- { path: '/课程资料/数学', expanded: true },
106
- { path: '/课程资料/说明.pdf' }
107
- ]"
108
- />
109
- ```
110
-
111
- - 目录路径挂载为根文件夹,默认折叠;`expanded` 可为全局或单个 source 打开
112
- - 文件路径挂载为一条文件记录,直接预览/下载
113
- - 勾选根目录会加载并选中其下所有文件;ZIP 内以根节点名称(`title` 或路径末段)作为顶层文件夹,文件根保留原文件名
114
- - 每个 source 可单独设置 `title`、`password`;未设置 `password` 的 source 使用组件的 `password` 或运行时输入的密码,遇到需要密码的目录会在该行原地显示密码输入框(见下文)
115
- - 根节点顺序按 `sources` 顺序,子项仍按名称/大小/日期排序
116
-
117
- ```ts
118
- interface FileListSource {
119
- path: string
120
- title?: string
121
- password?: string
122
- expanded?: boolean
123
- }
124
- ```
125
-
126
- ## 界面与布局
127
-
128
- - 宽容器:表格布局(勾选 / 名称 / 大小 / 修改日期 / 操作),行高 40px;勾选文件后,工具栏原地变为操作条(已选数量、总大小、清除、下载 ZIP)
129
- - 窄容器(组件宽度 < 560px,基于容器查询而非视口宽度,侧边栏挤压时同样生效):
130
- - 隐藏“修改日期”列,大小与日期显示在文件名下方
131
- - 行高 56px,复选框、展开、预览、下载的触控区不小于 44px
132
- - 表头排序改为下拉选择
133
- - 勾选后操作条吸附在组件顶部,位于 VitePress 导航栏 / “On this page” 栏下方,只在本组件范围内吸附
134
- - 颜色全部取自 VitePress 主题变量,暗色模式自动适配
135
-
136
- ## 批量下载
137
-
138
- - Chrome / Edge(含较新的 Android Chrome):点“下载 ZIP”先弹出系统“另存为”窗口,之后边下载边写入,内存占用很小,不受大小限制
139
- - Firefox、Safari、iPhone:浏览器只能先把文件放进内存再打包。按已选总大小判断:超过 `zipWarnSize` 先确认,超过 `zipMaxSize` 不打包并建议分批
140
- - 打包期间操作条显示进度(大小与文件数),可随时取消;勾选暂时锁定。任一文件失败会整体取消,并弹窗说明是哪个文件、什么原因
141
- - 同时取 4 个文件(顺序不变),减少每个文件的网络等待;进度每 100 ms 更新一次
142
- - ZIP 只存储不压缩(网盘文件多为已压缩格式),支持超过 4 GB(Zip64)
143
-
144
- ## 大目录
145
-
146
- - 每个文件夹(以及单路径模式的顶层列表)先显示 `pageSize` 条,末尾一行“还有 X 项 · 显示更多 · 全部显示”;剩余不足一页时只显示“显示剩余 X 项”
147
- - 数据一次全部取回,只减少渲染:排序后再截取,勾选文件夹 / 全选包含未显示的文件,输入筛选词时显示全部匹配
148
- - 刷新后保留已展开的条数
149
-
150
- ## 筛选与深度搜索
151
-
152
- - 输入关键词后立即筛选已加载的内容,显示匹配项及其所在目录,关键词高亮;搜索框右侧的 ×(或 Esc)清除筛选,回到原来的展开状态
153
- - 挂载目录下还有未加载的子文件夹时,列表末尾居中显示“只筛选了已加载的内容,**尝试深度搜索**”
154
- - 深度搜索不使用 OpenList 的搜索接口(无需搜索索引):组件逐个读取未加载的子文件夹(同时 4 个,每次最多 `deepSearchLimit` 个),匹配项出现在原位置,可勾选、打包、预览、下载
155
- - 点过一次即进入**深度搜索状态**,直到清空关键词:更换关键词、刷新、解锁文件夹后都会自动继续,不再出现按钮;刷新时结果保留,读完一次性替换
156
- - 搜索中可“停止”,达到上限或停止后显示“继续”
157
- - 深度搜索无法进入的加密文件夹会显示在结果中(带锁,提示“未搜索(需要密码)”),可原地输入密码,解锁后自动搜索其中内容
158
- - `deep-search="auto"` 时输入关键词即自动进入深度搜索状态
159
-
160
- ## 刷新与目录密码
161
-
162
- - **刷新**:保留当前列表并调暗,表头下方显示进度条;完成后整体替换,已展开的目录和仍存在的勾选会保留。刷新失败时保留旧数据并提示。刷新只重新读取 OpenList 的目录缓存(游客没有写权限,无法强制刷新存储)
163
- - **目录密码**:点击加锁目录(或勾选包含它的目录)时,密码输入框直接出现在该行的大小 / 日期位置,行高不变,下方文件不会移动;勾选在遇到加锁子目录时停下并请求密码
164
- - Enter 提交,Esc 取消;密码错误时在原位提示“密码不正确或无权访问”(OpenList 无法区分密码错误和无权限)
165
- - 钥匙按钮可开启“在此标签页中记住(关闭标签页后失效)”,密码存在 sessionStorage,按 OpenList 地址和目录区分,也覆盖子目录;已记住的目录显示“已记住 · 忘记”
166
- - 保存的密码失效时自动删除,并提示重新输入
167
- - 本次页面中输入过的密码(即使没有记住)在刷新后仍然有效
168
- - 单一 `path` 本身需要密码时,在列表位置显示密码输入框
14
+ <p align="center">面向 VitePress 的 OpenList 文件浏览组件:在文档页里浏览、预览、批量下载 OpenList 上的文件。</p>
169
15
 
170
- 吸顶偏移默认根据 `.VPNav`、`.VPLocalNav` 的实际高度自动计算;自定义主题可手动指定:
16
+ <p align="center">
17
+ <img src="https://raw.githubusercontent.com/nrjycyd/vitepress-plugin-filelist/main/demo/docs/public/screenshot.png" alt="文件列表截图" width="640">
18
+ </p>
171
19
 
172
- ```css
173
- .fl-root {
174
- --fl-sticky-top: 56px;
175
- }
176
- ```
177
-
178
- ## 预览
179
-
180
- 点击预览按钮在当前页面的弹窗(原生 `<dialog>`)中显示,不跳转、不打开新标签页。只有能在页面内显示的类型才有预览按钮;点击文件名仍是下载。
181
-
182
- | 类型 | 扩展名(节选) | 方式 |
183
- | --- | --- | --- |
184
- | 图片 | png、jpg、gif、webp、svg、avif | `<img>`,可旋转、切换原始大小 |
185
- | 视频 / 音频 | mp4、webm、mov / mp3、m4a、flac、wav | 原生播放器(格式以浏览器支持为准) |
186
- | 文本 | txt、md、json、csv、yaml、日志与常见代码 | 只读取前 1 MB(Range 请求),纯文本显示 |
187
- | Markdown / HTML | md、markdown / html、htm | 默认显示源码;可切换为“渲染”(见下) |
188
- | PDF | pdf | 优先使用 OpenList `iframe_previews` 中配置的 PDF 查看器;未配置时用浏览器自带阅读器(下载后以 Blob 显示,上限 50 MB) |
189
- | 其它(含 Office、压缩包) | — | 弹窗内显示文件信息和下载按钮 |
190
-
191
- - Markdown 渲染:使用 VitePress 正文样式;内容经 DOMPurify 过滤(去掉脚本、事件属性等);只有 http(s) / mailto 链接可点击并在新标签页打开,相对链接显示为文字;相对路径的图片显示为“[图片:替代文字]”。渲染库按需加载
192
- - HTML 渲染:放在空 `sandbox` 的 iframe 中,禁止脚本、表单和弹窗,无法访问当前页面;网页引用的相对路径资源不会加载
193
- - 源码 / 渲染的选择在当前页面内记住
194
- - 弹窗内 ← / → 切换当前列表中的可预览文件,Esc 或点击遮罩关闭
195
- - 读取文本和浏览器 PDF 需要文件地址允许跨域:经 OpenList 代理(`/p/`)时由 OpenList 的 CORS 设置决定;网盘直链由网盘决定。失败时显示“无法在页面内预览”和下载按钮
196
- - `iframe_previews` 来自 `/api/public/settings`,与 OpenList 网页端使用同一配置,占位符 `$url`、`$e_url`、`$b_url`、`$durl`、`$name` 的含义一致
197
-
198
- ## 国际化
199
-
200
- ```md
201
- <FileList locale="en-US" base="https://pan.example.com" />
202
- ```
203
-
204
- 在预设基础上覆盖单条文案:
205
-
206
- ```md
207
- <FileList
208
- :labels="{ batch: '下载全部', loaded: '共 {count} 个文件' }"
209
- base="https://pan.example.com"
210
- />
211
- ```
212
-
213
- 内置预设:`zh-CN`、`en-US`。占位符支持 `{count}`、`{percent}`、`{message}`、`{name}`,由 `formatLabel()` 替换。完整 key 列表通过 `FileListLabels` 导出:
214
-
215
- ```ts
216
- import type { FileListLabels } from 'vitepress-plugin-filelist/client'
217
- import { fileListLocales, formatLabel, resolveLabels } from 'vitepress-plugin-filelist/client'
218
- ```
219
-
220
- ## OpenList 要求
221
-
222
- 1. **游客只读权限**:开启游客用户,或传入只读 `token`
223
- 2. **CORS**:OpenList 的 `cors.allow_origins` 必须包含站点来源(默认 `*`);使用 OpenList-Worker 时设置 `ALLOW_URLS`(逗号分隔,完整来源,如 `https://docs.example.com,http://localhost:5173`,不支持通配符)。出现“Failed to fetch”时组件会提示检查这两项。GET 请求不带 `Content-Type`,避免多余的预检
224
- 3. **同协议**:HTTPS 页面不能请求 HTTP 的 OpenList(混合内容)
225
- 4. **token 是公开的**:只放可撤销的只读 token,不要放管理 token
226
-
227
- 组件会调用:
228
-
229
- | 接口 | 用途 |
230
- | --- | --- |
231
- | `POST /api/fs/list` | 目录列表(`per_page: 0`) |
232
- | `POST /api/fs/get` | 获取下载 / 预览 / 打包用的 `raw_url`;失败时回退到 `/d/...?sign=` |
233
- | `GET /api/public/settings` | 获取 `site_title`、`iframe_previews` |
234
- | `GET /d/...`、`GET /p/...` | 下载与预览读取的文件地址 |
235
-
236
- ## 导出
237
-
238
- | 入口 | 内容 |
239
- | --- | --- |
240
- | `vitepress-plugin-filelist` | `fileList` 插件(默认导出) |
241
- | `vitepress-plugin-filelist/client` | `FileList`、`VPFileList`、`enhanceAppWithFileList`、文案工具(`fileListLocales`、`formatLabel`、`resolveLabels`)、格式与文件类型工具(`formatSize`、`formatDate`、`fileKind`、`previewKind` 等)、类型 |
242
- | `vitepress-plugin-filelist/style.css` | 组件样式 |
243
-
244
- ## 兼容性
245
-
246
- peerDependencies 同时支持 VitePress 1.x 与 2.0 alpha:`^1.0.0 || ^2.0.0-alpha.0`。
247
-
248
- 在 Node 22 下针对 VitePress `2.0.0-alpha.21` 本地实测:
249
-
250
- | 包管理器 | 安装 | 构建 |
251
- | --- | --- | --- |
252
- | npm 10 | ✅ | ✅ |
253
- | pnpm 11.25 | ✅ | ✅ |
254
- | yarn 1.22(classic) | ✅ | ✅ |
255
- | bun 1.4 | ✅ | ✅ |
256
- | deno 2.9 | ✅ `deno install` | ❌ Vite/rolldown 加载配置时失败 |
257
-
258
- Deno 可以安装 npm 依赖,但目前用 Deno 构建 VitePress 会在 rolldown 里报 `stream did not contain valid UTF-8`;构建请使用 Node。
259
-
260
- ## 发布
261
-
262
- 通过 GitHub Actions 的 Trusted Publishing(OIDC)发布到 npm,带 provenance。
20
+ ## 功能
263
21
 
264
- ## 说明
22
+ - 树形目录、按需加载;勾选文件或文件夹批量打包 ZIP
23
+ - 弹窗预览:图片、音视频、文本、PDF、Markdown / HTML
24
+ - 目录密码、筛选与深度搜索、大目录分页
25
+ - 跟随 VitePress 亮 / 暗主题,手机自动切换布局
265
26
 
266
- - 批量 ZIP 通过 `raw_url`(OpenList `/p/` 代理)下载,CORS 保持在 OpenList 源上
267
- - 表头全选只统计已加载的文件;勾选单个文件夹则会递归加载其全部子目录(目录很深或很多时会逐个请求,可能较慢)
268
- - 目录以 `per_page: 0` 请求全部条目;超大目录可能较慢,暂未实现分页
27
+ ## 文档与在线演示
269
28
 
270
- ## 开发
29
+ 👉 **[nrjycyd.github.io/vitepress-plugin-filelist](https://nrjycyd.github.io/vitepress-plugin-filelist/)**:安装、配置、全部属性,每个功能都有可操作的示例。
271
30
 
272
31
  ```bash
273
- pnpm install
274
- pnpm run build # 生成 dist/node、dist/client/ssr、dist/client/browser、style.css
275
- pnpm run typecheck # vue-tsc,包含 .vue 模板与测试
276
- pnpm test # Vitest:工具函数、密码、下载、FileList 组件
277
- pnpm run pack:check
278
- ```
279
-
280
- 浏览器测试(Playwright,Chromium 桌面 / 手机、WebKit):`demo/e2e` 下的测试站点连接本地模拟 OpenList(`e2e/mock-openlist.mjs`),检查行高与位移、密码、刷新、显示更多、单文件下载、ZIP(内存 / 流式 / 取消 / 失败)等。
281
-
282
- ```bash
283
- pnpm run e2e:site # 构建插件和测试站点
284
- pnpm run test:e2e # 自动启动模拟 OpenList 与站点预览
32
+ pnpm add -D vitepress-plugin-filelist
285
33
  ```
286
34
 
287
- CI 每次推送和 PR 都会运行,三种环境均为必过项。
288
-
289
- 源码结构(`src/client`):
290
-
291
- | 文件 | 职责 |
292
- | --- | --- |
293
- | `FileList.vue` | 组件:把下列模块接到界面 |
294
- | `api.ts` | OpenList 接口、文件地址缓存、错误判断 |
295
- | `demo.ts` | 演示数据(与 `api.ts` 同一接口) |
296
- | `tree.ts` | 树节点、排序、目录统计 |
297
- | `usePasswords.ts` / `passwords.ts` | 目录密码的选择顺序 / 标签页内记住 |
298
- | `download.ts` | 单文件下载、批量 ZIP |
299
- | `PreviewDialog.vue` | 预览弹窗 |
300
- | `Icon.vue` / `icons.ts` | 图标 |
301
- | `utils.ts` | 路径、格式化、文件类型表 |
35
+ ## 后端
302
36
 
303
- 仓库统一使用 pnpm(`pnpm-lock.yaml`),CI 与发布流程执行 `pnpm install --frozen-lockfile`。
304
-
305
- `demo/` 下的演示站通过 `file:..` 安装本地包:
306
-
307
- ```bash
308
- cd demo
309
- pnpm install
310
- pnpm run build
311
- ```
37
+ - 接口:[OpenList](https://github.com/OpenListTeam/OpenList)
38
+ - 实测部署:[OpenList-Worker](https://github.com/OpenListTeam/OpenList-Worker)
312
39
 
313
- ## License
40
+ ## 更多
314
41
 
315
- MIT
42
+ [更新日志](./CHANGELOG.md) · [参与开发](./CONTRIBUTING.md) · [MIT License](./LICENSE)
@@ -6,8 +6,6 @@ interface FileListLabels {
6
6
  filter: string;
7
7
  refresh: string;
8
8
  batch: string;
9
- /** @deprecated No longer shown; the selection count lives in the toolbar. */
10
- batchCount: string;
11
9
  batching: string;
12
10
  passwordPrompt: string;
13
11
  passwordPlaceholder: string;
@@ -27,15 +25,11 @@ interface FileListLabels {
27
25
  download: string;
28
26
  loaded: string;
29
27
  selected: string;
30
- /** @deprecated No longer shown; the footer only shows loaded files and size. */
31
- unloaded: string;
32
28
  folderFailed: string;
33
29
  demoDownload: string;
34
30
  demoPreview: string;
35
31
  demoBatch: string;
36
32
  downloadFailed: string;
37
- /** @deprecated Preview errors are shown in the dialog (`previewUnavailable`). */
38
- previewFailed: string;
39
33
  batchFailed: string;
40
34
  defaultZip: string;
41
35
  /** Text button that clears the selection (wide layout). */
@@ -90,8 +84,6 @@ interface FileListLabels {
90
84
  forgetPassword: string;
91
85
  /** Lock button on a folder that needs a password. `{name}` */
92
86
  unlockFolder: string;
93
- /** @deprecated Network failures now append `corsHint`. */
94
- networkHint: string;
95
87
  /** Deep search: the row at the end of a filtered list. `{count}` where noted */
96
88
  deepHint: string;
97
89
  deepSearch: string;
@@ -136,12 +128,23 @@ interface FileListLabels {
136
128
  /** `{limit}` */
137
129
  zipBlockText: string;
138
130
  gotIt: string;
139
- /** Last row of a long folder. `{count}` */
131
+ /** Last row of a long folder: how many are not shown yet. `{count}` */
140
132
  moreRemaining: string;
141
- showMore: string;
133
+ /** Pinned folder row: `{shown}` of `{total}`. */
134
+ moreShown: string;
135
+ /** “Show all”, short form for narrow lists. */
136
+ showAllShort: string;
137
+ /** Show the next page. `{count}` */
138
+ showNext: string;
139
+ /** Show the next page, short form for narrow lists. `{count}` */
140
+ showNextShort: string;
142
141
  showAll: string;
143
142
  /** Fewer than a page left. `{count}` */
144
143
  showRest: string;
144
+ /** Pinned folder row: back to the first page. */
145
+ showLess: string;
146
+ /** Pinned folder row once everything is shown. `{count}` */
147
+ allShown: string;
145
148
  }
146
149
  interface FileListSource {
147
150
  /** OpenList path, directory or single file. */
@@ -174,7 +177,7 @@ interface FileListProps {
174
177
  */
175
178
  rememberPassword?: boolean;
176
179
  /**
177
- * Rows shown per folder before “Show more”. Defaults to `200`; `0` shows
180
+ * Rows shown per folder before “Show more”. Defaults to `15`; `0` shows
178
181
  * everything. Data is still loaded in full; only rendering is limited.
179
182
  */
180
183
  pageSize?: number;
@@ -203,17 +206,6 @@ interface FileListProps {
203
206
  /** Per-key label overrides on top of the locale preset. */
204
207
  labels?: Partial<FileListLabels>;
205
208
  }
206
- /** Shape of one entry returned by `POST /api/fs/list`. */
207
- interface OpenListEntry {
208
- name: string;
209
- size: number;
210
- is_dir: boolean;
211
- modified: string;
212
- created?: string;
213
- sign?: string;
214
- thumb?: string;
215
- type?: number;
216
- }
217
209
  declare const _default: import("vue").DefineComponent<FileListProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FileListProps> & Readonly<{}>, {
218
210
  base: string;
219
211
  path: string;
@@ -305,66 +297,6 @@ declare global {
305
297
  export declare const fileListLocales: Record<FileListLocale, FileListLabels>;
306
298
  export declare function formatLabel(template: string, values?: Record<string, string | number>): string;
307
299
  export declare function resolveLabels(locale?: FileListLocale, overrides?: Partial<FileListLabels>): FileListLabels;
308
- interface SortableNode {
309
- name: string;
310
- size: number;
311
- is_dir: boolean;
312
- modified: string;
313
- }
314
- type SortKey = 'name' | 'size' | 'modified';
315
- export declare function joinPath(parent: string, name: string): string;
316
- export declare function encodePath(path: string): string;
317
- /**
318
- * Make one path segment safe as a ZIP entry segment: no separators,
319
- * no `.` / `..` traversal, no empty names.
320
- */
321
- export declare function zipSegment(name: string): string;
322
- /** Join path segments into a ZIP entry name, sanitising each segment. */
323
- export declare function zipEntryName(segments: string[]): string;
324
- /**
325
- * Return `name`, or `name (2)`, `name (3)`... when it is already in `used`.
326
- * The suffix goes before the extension of the last segment. Adds the result to `used`.
327
- */
328
- export declare function uniqueEntryName(name: string, used: Set<string>): string;
329
- /** Human-readable size. `0` reads `0 B`; missing, negative or invalid sizes read `-`. */
330
- export declare function formatSize(size: number): string;
331
- export declare function formatDate(iso: string): string;
332
- /** Upper-case extension for the type badge, e.g. `PDF`. */
333
- export declare function extOf(name: string): string;
334
- type FileKind = 'doc' | 'sheet' | 'slide' | 'pdf' | 'image' | 'media' | 'archive' | 'code' | 'other';
335
- type PreviewKind = 'image' | 'video' | 'audio' | 'text' | 'pdf' | 'none';
336
- /** Rough file family, used to colour the type badge. */
337
- export declare function fileKind(name: string): FileKind;
338
- /**
339
- * How a file is shown in the preview dialog. Office documents and anything
340
- * else the browser cannot render are `none` (info + download).
341
- */
342
- export declare function previewKind(name: string): PreviewKind;
343
- /** Sum of the `size` of the given entries, ignoring missing or invalid sizes. */
344
- export declare function totalSize(items: Array<{
345
- size?: number;
346
- }>): number;
347
- export declare function compareNodes(a: SortableNode, b: SortableNode, key: SortKey, ascending?: boolean, locale?: string): number;
348
- interface IframePreview {
349
- label: string;
350
- scheme: string;
351
- }
352
- /**
353
- * Viewers from OpenList's public `iframe_previews` setting that match a file,
354
- * in the order OpenList lists them. Keys are comma-separated extensions or a
355
- * `/regex/flags` tested against the extension, as in OpenList's frontend.
356
- */
357
- export declare function iframePreviewsFor(name: string, setting: string | undefined): IframePreview[];
358
- /**
359
- * Fill an OpenList preview scheme: `$name`, `$url` (raw URL) and `$durl`
360
- * (signed download URL), each optionally prefixed with `e` (URI-encode) or
361
- * `b` (base64), e.g. `$e_url`, `$b_url`, `$e_durl`.
362
- */
363
- export declare function fillPreviewUrl(scheme: string, args: {
364
- name: string;
365
- rawUrl: string;
366
- downloadUrl: string;
367
- }): string;
368
300
  /**
369
301
  * Register `<FileList>` and `<VPFileList>` globally.
370
302
  *
@@ -382,4 +314,4 @@ export declare function fillPreviewUrl(scheme: string, args: {
382
314
  * ```
383
315
  */
384
316
  export declare function enhanceAppWithFileList({ app }: EnhanceAppContext): void;
385
- export { type FileKind, _default as FileList, _default as VPFileList, type FileListLabels, type FileListLocale, type FileListProps, type FileListSource, type IframePreview, type OpenListEntry, type PreviewKind, type SortKey, type SortableNode };
317
+ export { _default as FileList, _default as VPFileList, type FileListLabels, type FileListLocale, type FileListProps, type FileListSource };