fish-dock-plugin-filemgr 0.0.0-stage → 1.0.4
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/LICENSE +32 -0
- package/README.md +117 -3
- package/bin/fish-dock-filemgr.mjs +151 -0
- package/dist/filemgr/README.md +62 -0
- package/dist/filemgr/bridge.js +53 -0
- package/dist/filemgr/plugin.json +46 -0
- package/dist/filemgr/plugins/filemgr/FolderPicker.ps1 +260 -0
- package/dist/filemgr/plugins/filemgr/backend.mjs +448 -0
- package/dist/filemgr/plugins/filemgr/clip.ps1 +40 -0
- package/dist/filemgr/plugins/filemgr/dock.css +4 -0
- package/dist/filemgr/plugins/filemgr/filemgr.css +271 -0
- package/dist/filemgr/plugins/filemgr/page.css +218 -0
- package/dist/filemgr/plugins/filemgr/page.html +168 -0
- package/dist/filemgr/plugins/filemgr/page.js +2042 -0
- package/dist/filemgr/plugins/filemgr/pick-files.ps1 +33 -0
- package/dist/filemgr/plugins/filemgr/pick-folder.ps1 +34 -0
- package/dist/filemgr/plugins/filemgr/preview.mjs +456 -0
- package/dist/filemgr/plugins/filemgr/sdk.mjs +123 -0
- package/dist/filemgr/plugins/filemgr/stash.css +67 -0
- package/dist/filemgr/plugins/filemgr/stash.mjs +409 -0
- package/dist/jassdingk.filemgr.fish-plugin +0 -0
- package/package.json +44 -4
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/* 文件管理页:外层三栏(暂存 | 分隔条 | 预览),内层复用 page.css 的文件夹/预览双栏。
|
|
2
|
+
两条硬规矩沿用 page.css:高度用固定 px 不写 vh;main 总高钉死,避免上报高度抖动。 */
|
|
3
|
+
body[data-layout=double]{height:820px}
|
|
4
|
+
body.fm-layout, main.fm{height:820px;display:flex;flex-direction:column;padding:0}
|
|
5
|
+
|
|
6
|
+
.fm-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 8px 8px;flex:none;flex-wrap:wrap}
|
|
7
|
+
.fm-head .identity{display:flex;align-items:baseline;gap:10px;min-width:0}
|
|
8
|
+
.fm-head #state{color:var(--dock-muted);font-size:12px}
|
|
9
|
+
.fm-head #state:empty{display:none}
|
|
10
|
+
/* 标题右侧的文件元信息:名 · 类型 · 大小 · 修改时间 */
|
|
11
|
+
.fm-head .fm-meta{color:var(--dock-muted);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;max-width:52vw}
|
|
12
|
+
.fm-head .fm-meta:empty{display:none}
|
|
13
|
+
|
|
14
|
+
/* 错误条跨全宽 */
|
|
15
|
+
main.fm > #error{margin:0 8px 8px;flex:none}
|
|
16
|
+
|
|
17
|
+
/* 外层三列:暂存栏 | 分隔条 | 预览区。暂存栏宽度由 --stash-w 控制。 */
|
|
18
|
+
.fm-body{
|
|
19
|
+
flex:1 1 auto;min-height:0;
|
|
20
|
+
display:grid;
|
|
21
|
+
grid-template-columns:min(var(--stash-w,300px),50%) 8px minmax(0,1fr);
|
|
22
|
+
gap:5px;align-items:stretch;
|
|
23
|
+
padding:0 8px 8px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* 外层分隔条:整条 8px 命中,中间画 2px 竖线 */
|
|
27
|
+
#fmsplit{position:relative;cursor:col-resize;touch-action:none;align-self:stretch;border-radius:6px}
|
|
28
|
+
#fmsplit::before{content:'';position:absolute;top:8px;bottom:8px;left:50%;width:2px;margin-left:-1px;border-radius:2px;background:var(--dock-line);transition:background .12s}
|
|
29
|
+
#fmsplit:hover::before,#fmsplit:focus-visible::before,#fmsplit[data-dragging=true]::before{background:var(--dock-accent)}
|
|
30
|
+
#fmsplit:focus-visible{outline:none}
|
|
31
|
+
#fmsplit[data-dragging=true]{background:var(--dock-control)}
|
|
32
|
+
body[data-resizing=true]{user-select:none;cursor:col-resize}
|
|
33
|
+
|
|
34
|
+
/* ---- 左:暂存栏 ---- */
|
|
35
|
+
#stash-col{
|
|
36
|
+
margin:0;padding:12px;min-width:0;min-height:0;overflow:hidden;
|
|
37
|
+
display:grid;grid-template-rows:auto auto minmax(0,1fr) auto;gap:8px;
|
|
38
|
+
border:1px solid var(--dock-line);border-radius:18px;background:var(--dock-card);
|
|
39
|
+
}
|
|
40
|
+
.fm-col-title{margin:0;font-size:13.5px;font-weight:600}
|
|
41
|
+
#stash-col .stash-toolbar{gap:6px;margin:0}
|
|
42
|
+
#stash-col .stash-toolbar button{min-height:26px;padding:2px 10px;font-size:12px}
|
|
43
|
+
/* 分组操作条:现在是暂存区内部的一行,不再单独占 grid 行 */
|
|
44
|
+
#stash-col #groupbar{padding:0;margin:0;background:transparent;border:0;min-height:0}
|
|
45
|
+
#stash-col #groupbar .group-ops{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:0}
|
|
46
|
+
#stash-col #groupbar button{min-height:24px;padding:1px 9px;font-size:11.5px}
|
|
47
|
+
/* 内联新建分组输入框(不依赖 window.prompt,WebView2 里 prompt 可能被禁用) */
|
|
48
|
+
#stash-col #groupbar .group-new-input{min-height:24px;padding:1px 8px;font-size:11.5px;min-width:110px;
|
|
49
|
+
background:var(--dock-input,#12161d);color:inherit;border:1px solid var(--dock-accent,#3b82f6);border-radius:6px;outline:none}
|
|
50
|
+
|
|
51
|
+
/* 可折叠分组:每个分组是一个 <details>,组头是标签样式(参考 cost-meter 的「今日」折叠) */
|
|
52
|
+
#list{padding:2px 6px}
|
|
53
|
+
.stash-group{margin:4px 0;border-radius:10px}
|
|
54
|
+
.stash-group>.stash-tag{
|
|
55
|
+
display:flex;align-items:center;gap:6px;list-style:none;cursor:pointer;
|
|
56
|
+
padding:5px 10px;border-radius:999px;border:1px solid var(--dock-line);
|
|
57
|
+
background:var(--dock-bg);color:var(--dock-muted);font-size:12px;font-weight:600;
|
|
58
|
+
user-select:none;
|
|
59
|
+
}
|
|
60
|
+
.stash-group>.stash-tag::-webkit-details-marker{display:none}
|
|
61
|
+
.stash-group>.stash-tag::before{content:'›';flex:none;width:1em;text-align:center;opacity:.75;transition:transform .12s}
|
|
62
|
+
.stash-group[open]>.stash-tag::before{content:'⌄'}
|
|
63
|
+
.stash-group>.stash-tag:hover{filter:brightness(1.15)}
|
|
64
|
+
.stash-tag-dot{width:7px;height:7px;border-radius:50%;flex:none;background:var(--dock-accent)}
|
|
65
|
+
.stash-tag-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
66
|
+
.stash-tag-count{opacity:.65;font-weight:400}
|
|
67
|
+
.stash-tag-del{margin-left:auto;flex:none;opacity:.55;padding:0 4px;font-size:13px;line-height:1;cursor:pointer}
|
|
68
|
+
/* 当前正在筛选的标签(state.view 指向的组)高亮 */
|
|
69
|
+
.stash-group>.stash-tag.active{color:#1a1035;background:var(--dock-accent);border-color:var(--dock-accent)}
|
|
70
|
+
.stash-group>.stash-tag.active>.stash-tag-dot{background:#1a1035}
|
|
71
|
+
.stash-group>.stash-tag.active>.stash-tag-count{opacity:.8}
|
|
72
|
+
.stash-group>.stash-tag.active>.stash-tag-del{color:#1a1035;opacity:.75}
|
|
73
|
+
.stash-group>.stash-tag.active>.stash-tag-del:hover{color:#7a1010}
|
|
74
|
+
/* 右侧文件列表:已在暂存/分组里的文件 */
|
|
75
|
+
.filelist .row.stashed .nm{color:var(--dock-accent)}
|
|
76
|
+
.stash-badge{flex:none;font-size:10px;line-height:1;padding:2px 6px;border-radius:999px;
|
|
77
|
+
background:color-mix(in srgb,var(--dock-accent) 22%,transparent);color:var(--dock-accent);
|
|
78
|
+
border:1px solid color-mix(in srgb,var(--dock-accent) 45%,transparent);white-space:nowrap;max-width:9em;overflow:hidden;text-overflow:ellipsis}
|
|
79
|
+
.stash-tag-del:hover{opacity:1;color:#ff5f57}
|
|
80
|
+
/* 标签内「只看本组 / 看全部」按钮:文字标签,带边框,保证一眼能读懂 */
|
|
81
|
+
.stash-tag-filter{flex:none;padding:1px 8px;font-size:11px;line-height:1.5;cursor:pointer;border-radius:999px;
|
|
82
|
+
border:1px solid color-mix(in srgb,var(--dock-line) 90%,transparent);color:var(--dock-muted);background:transparent}
|
|
83
|
+
.stash-tag-filter:hover{color:var(--dock-text);border-color:var(--dock-accent)}
|
|
84
|
+
.stash-tag-filter.on{color:#1a1035;background:var(--dock-accent);border-color:var(--dock-accent);font-weight:700}
|
|
85
|
+
/* 标签内「全选 / 取消」按钮:与「只看」同款胶囊,全选态高亮,多组各自独立 */
|
|
86
|
+
.stash-tag-select{flex:none;padding:1px 8px;font-size:11px;line-height:1.5;cursor:pointer;border-radius:999px;
|
|
87
|
+
border:1px solid color-mix(in srgb,var(--dock-line) 90%,transparent);color:var(--dock-muted);background:transparent}
|
|
88
|
+
.stash-tag-select:hover{color:var(--dock-text);border-color:var(--dock-accent)}
|
|
89
|
+
.stash-tag-select.all{color:#1a1035;background:var(--dock-accent);border-color:var(--dock-accent);font-weight:700}
|
|
90
|
+
.stash-group>.stash-tag.active>.stash-tag-select{color:#1a1035;border-color:color-mix(in srgb,#1a1035 45%,transparent);background:transparent}
|
|
91
|
+
.stash-group>.stash-tag.active>.stash-tag-select.all{background:#1a1035;color:var(--dock-accent);border-color:#1a1035}
|
|
92
|
+
.stash-group-empty{margin:6px 8px 10px;color:var(--dock-muted);font-size:11.5px}
|
|
93
|
+
#stash-col #stash{padding:8px;margin:0;overflow:hidden;min-height:0;border:1px solid var(--dock-line);border-radius:12px;background:var(--dock-bg);display:flex;flex-direction:column;gap:6px;position:relative}
|
|
94
|
+
#stash-col #stash>#list{flex:1 1 auto;min-height:0;overflow:auto;padding:0}
|
|
95
|
+
#stash-col #list{min-height:120px}
|
|
96
|
+
#stash-col #foot{margin:0;font-size:11.5px}
|
|
97
|
+
#stash-col #foot:empty{display:none}
|
|
98
|
+
|
|
99
|
+
/* ---- 右:预览区(内含 page.css 的 .workspace 双栏) ---- */
|
|
100
|
+
#preview-col{
|
|
101
|
+
min-width:0;min-height:0;display:flex;flex-direction:column;gap:8px;
|
|
102
|
+
padding:12px;border:1px solid var(--dock-line);border-radius:18px;background:var(--dock-card);
|
|
103
|
+
overflow:hidden;
|
|
104
|
+
}
|
|
105
|
+
#preview-col .preview-toolbar{gap:8px;margin:0;flex:none;position:relative}
|
|
106
|
+
#preview-col #jump{margin:0;flex:none}
|
|
107
|
+
/* 内层 workspace 填满余下高度;page.css 已定义三列(side|split|stage)。 */
|
|
108
|
+
#preview-col .workspace{flex:1 1 auto;min-height:0;align-items:stretch}
|
|
109
|
+
|
|
110
|
+
/* 内层 stage / side 在合并页里要撑满,不再固定 820 */
|
|
111
|
+
#preview-col #stage{padding:10px 12px 14px}
|
|
112
|
+
#preview-col #view{overflow:auto}
|
|
113
|
+
|
|
114
|
+
/* 窄屏:暂存栏收窄 */
|
|
115
|
+
@media(max-width:900px){
|
|
116
|
+
.fm-body{grid-template-columns:min(var(--stash-w,300px),46%) 8px minmax(0,1fr);gap:4px}
|
|
117
|
+
#stash-col{padding:8px}
|
|
118
|
+
#preview-col{padding:8px}
|
|
119
|
+
}
|
|
120
|
+
@media(max-width:640px){
|
|
121
|
+
.fm-body{grid-template-columns:min(var(--stash-w,300px),40%) 8px minmax(0,1fr);gap:3px}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* ---- 互关联①:文件列表项(左栏目录树/单栏目录)的「+暂存」按钮 ---- */
|
|
125
|
+
/* 行内既有 sz/dt,再加一列放按钮;按钮默认隐藏,悬停行时浮现,避免视觉噪音。 */
|
|
126
|
+
/* 列顺序:add(20) ni(26图标) nm(主) st(类型) sz(大小) dt(时间)。
|
|
127
|
+
六列全部固定宽度(nm 除外),保证每一行对齐;badge 不再作为 grid item,
|
|
128
|
+
而是塞进 .nm 内部,否则"已暂存"行会多占一列把 size/time 顶偏。 */
|
|
129
|
+
.filelist .row{grid-template-columns:20px 26px minmax(0,1fr) 58px 62px 96px}
|
|
130
|
+
|
|
131
|
+
/* ---- 文件夹列表:工具条 + 表头(列宽与 .row 的 6 列严格对齐)---- */
|
|
132
|
+
/* #browse 原来是 3 行 grid(crumbs|list|foot),这里多插了 tools 与 head 两个子元素,
|
|
133
|
+
必须把行模板同步扩到 5 行,否则 list/foot 会被挤进自动行导致整个左栏塌陷。 */
|
|
134
|
+
#browse{grid-template-rows:auto auto auto minmax(0,1fr) auto}
|
|
135
|
+
.browse-tools{display:flex;justify-content:flex-end;gap:6px;margin:0;flex:none}
|
|
136
|
+
.browse-tools .tiny{font:600 11px/1 inherit;font-family:inherit;padding:2px 9px;border-radius:999px;
|
|
137
|
+
border:1px solid var(--dock-line);background:transparent;color:var(--dock-muted);cursor:pointer;opacity:.75}
|
|
138
|
+
.browse-tools .tiny:hover{opacity:1;color:var(--dock-fg)}
|
|
139
|
+
.browse-tools .tiny.on{background:color-mix(in srgb,var(--dock-accent) 16%,transparent);
|
|
140
|
+
border-color:var(--dock-accent);color:var(--dock-fg);opacity:1}
|
|
141
|
+
.browse-head{display:grid;grid-template-columns:20px 26px minmax(0,1fr) 58px 62px 96px;gap:0 6px;
|
|
142
|
+
align-items:center;padding:3px 8px 2px;margin:0 0 1px;flex:none;font-size:11px;color:var(--dock-muted);
|
|
143
|
+
border-bottom:1px solid var(--dock-line)}
|
|
144
|
+
.browse-head[hidden]{display:none}
|
|
145
|
+
.browse-head button{background:none;border:0;padding:0;font:inherit;color:inherit;text-align:left;
|
|
146
|
+
cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
147
|
+
.browse-head button:hover{color:var(--dock-fg)}
|
|
148
|
+
.browse-head button.on{color:var(--dock-fg);font-weight:600}
|
|
149
|
+
.browse-head button.on[data-dir=asc]::after{content:' ▲';font-size:9px;opacity:.8}
|
|
150
|
+
.browse-head button.on[data-dir=desc]::after{content:' ▼';font-size:9px;opacity:.8}
|
|
151
|
+
.browse-head button:nth-child(3){text-align:left}
|
|
152
|
+
.browse-head button:nth-child(6){text-align:right}
|
|
153
|
+
|
|
154
|
+
.filelist .row .nm{display:flex;align-items:center;gap:6px;min-width:0;overflow:hidden}
|
|
155
|
+
.filelist .row .nm .nmt{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
156
|
+
.filelist .row .nm .stash-badge{flex:none}
|
|
157
|
+
.filelist .row .st{color:var(--dock-muted);font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
158
|
+
.filelist .row .sz{text-align:right}
|
|
159
|
+
.filelist .row .dt{max-width:9.5em;overflow:hidden;text-overflow:ellipsis}
|
|
160
|
+
.row .add{
|
|
161
|
+
display:flex;align-items:center;justify-content:center;
|
|
162
|
+
width:20px;height:20px;padding:0;border:0;border-radius:4px;
|
|
163
|
+
font-size:14px;line-height:1;color:var(--dock-muted);cursor:pointer;
|
|
164
|
+
background:transparent;transition:color .12s,background .12s;
|
|
165
|
+
opacity:.55;
|
|
166
|
+
}
|
|
167
|
+
/* 图标列:目录 📁 / 文件 📄。空着会让 "+" 和文件名之间出现一大块空白。 */
|
|
168
|
+
.filelist .row .ni{display:flex;align-items:center;justify-content:center;width:26px;height:26px;font-size:12px;line-height:1}
|
|
169
|
+
.filelist .row .ni::before{content:'📄'}
|
|
170
|
+
.filelist .row.dir .ni::before{content:'📁'}
|
|
171
|
+
.filelist .row:hover .add,.filelist .row:focus-within .add{opacity:1}
|
|
172
|
+
.row .add:hover,.row .add:focus-visible{color:var(--dock-accent);outline:none}
|
|
173
|
+
|
|
174
|
+
/* ---- 互关联②:暂存列表项的「预览」按钮 ---- */
|
|
175
|
+
.stash-preview-btn{
|
|
176
|
+
flex:none;font:600 11px/1 inherit;font-family:inherit;padding:3px 9px;border:1px solid var(--dock-line);
|
|
177
|
+
border-radius:999px;color:var(--dock-muted);cursor:pointer;white-space:nowrap;
|
|
178
|
+
opacity:0;transition:opacity .12s,background .12s,color .12s;
|
|
179
|
+
}
|
|
180
|
+
#list .row:hover .stash-preview-btn,#list .row:focus-within .stash-preview-btn{opacity:1}
|
|
181
|
+
#list .row.selected .stash-preview-btn{color:var(--dock-accent);border-color:color-mix(in srgb,var(--dock-accent) 55%,transparent);opacity:1}
|
|
182
|
+
.stash-preview-btn:hover,.stash-preview-btn:focus-visible{background:var(--dock-accent);border-color:var(--dock-accent);color:#1a1035;outline:none}
|
|
183
|
+
|
|
184
|
+
/* ---- 常用文件夹 ---- */
|
|
185
|
+
#fav-open{font-size:14px;min-width:26px;padding:0}
|
|
186
|
+
.fav-pop{
|
|
187
|
+
position:absolute;top:100%;right:0;z-index:100;
|
|
188
|
+
min-width:260px;max-width:360px;max-height:360px;overflow-y:auto;
|
|
189
|
+
background:var(--dock-card);border:1px solid var(--dock-line);
|
|
190
|
+
border-radius:14px;box-shadow:0 8px 24px rgba(0,0,0,.35);
|
|
191
|
+
padding:6px;margin-top:4px;
|
|
192
|
+
}
|
|
193
|
+
.fav-section:not(:last-child){border-bottom:1px solid var(--dock-line);margin-bottom:4px;padding-bottom:4px}
|
|
194
|
+
.fav-label{font-size:10.5px;color:var(--dock-muted);text-transform:uppercase;letter-spacing:.5px;padding:4px 8px 2px}
|
|
195
|
+
.fav-item{
|
|
196
|
+
display:flex;align-items:center;gap:6px;
|
|
197
|
+
width:100%;min-height:30px;padding:4px 8px;
|
|
198
|
+
border:0;border-radius:8px;background:transparent;
|
|
199
|
+
font-size:12px;text-align:left;cursor:pointer;
|
|
200
|
+
color:var(--dock-text);overflow:hidden;
|
|
201
|
+
}
|
|
202
|
+
.fav-item:hover{background:var(--dock-control)}
|
|
203
|
+
.fav-item .fav-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
204
|
+
.fav-item .fav-pin{flex:none;font-size:11px;color:var(--dock-accent);opacity:.7}
|
|
205
|
+
.fav-item .fav-del{flex:none;font-size:14px;color:var(--dock-muted);opacity:0;padding:0 2px;line-height:1}
|
|
206
|
+
.fav-item:hover .fav-del{opacity:.7}
|
|
207
|
+
.fav-item .fav-del:hover{opacity:1;color:var(--dock-accent)}
|
|
208
|
+
|
|
209
|
+
/* ---- 文件夹列表:框选(rubber band)+ 多选 + 拖到暂存区 ---- */
|
|
210
|
+
/* 行是 button,但拖动时仍可能触发文本选择,直接禁用更省事。 */
|
|
211
|
+
.filelist .row{user-select:none;-webkit-user-select:none}
|
|
212
|
+
/* 列表容器必须是定位祖先,选框才能以它左上角为原点算坐标。 */
|
|
213
|
+
#browse-list{position:relative}
|
|
214
|
+
|
|
215
|
+
/* 框选矩形:用 fixed 定位,跟着指针在视口里的坐标走,不受滚动影响。 */
|
|
216
|
+
#rubber{
|
|
217
|
+
position:fixed;z-index:60;pointer-events:none;display:none;
|
|
218
|
+
border:1px solid var(--dock-accent);border-radius:3px;
|
|
219
|
+
background:color-mix(in srgb,var(--dock-accent) 18%,transparent);
|
|
220
|
+
}
|
|
221
|
+
#rubber.on{display:block}
|
|
222
|
+
|
|
223
|
+
/* 多选行:左侧加一道强调色竖条,底色轻微提亮,和「当前预览」的 .active 区分开。 */
|
|
224
|
+
.filelist .row.sel{
|
|
225
|
+
background:color-mix(in srgb,var(--dock-accent) 16%,transparent);
|
|
226
|
+
box-shadow:inset 3px 0 0 var(--dock-accent);
|
|
227
|
+
}
|
|
228
|
+
.filelist .row.sel .nm{color:var(--dock-text)}
|
|
229
|
+
|
|
230
|
+
/* 拖动中:禁止选中文本,光标改成抓取手势 */
|
|
231
|
+
body[data-boxing=true]{user-select:none;cursor:crosshair}
|
|
232
|
+
body[data-dragging=true]{user-select:none;cursor:grabbing}
|
|
233
|
+
/* 正在被拖去暂存区的行淡一点,给出"正在搬走"的反馈 */
|
|
234
|
+
.filelist .row.drag-src{opacity:.45}
|
|
235
|
+
|
|
236
|
+
/* 暂存区在拖动悬停时高亮,明确告诉用户"松手就进来" */
|
|
237
|
+
#stash-col.drop-target #stash{
|
|
238
|
+
border-color:var(--dock-accent);
|
|
239
|
+
box-shadow:0 0 0 2px color-mix(in srgb,var(--dock-accent) 35%,transparent);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* 拖动时跟随指针的小胶囊标签 */
|
|
243
|
+
.drag-ghost{
|
|
244
|
+
position:fixed;z-index:70;pointer-events:none;
|
|
245
|
+
padding:3px 9px;border-radius:999px;font-size:12px;line-height:1.5;
|
|
246
|
+
background:var(--dock-accent);color:#1a1035;font-weight:600;
|
|
247
|
+
box-shadow:0 6px 18px rgba(0,0,0,.45);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/* ---- 文件管理页(double 布局):让文件夹区更紧凑、能一屏看到更多条目 ----
|
|
251
|
+
之前行高 28px + 上栏只占 55%,44 个目录一屏只看得到 7 项,看起来像"显示不全"。
|
|
252
|
+
这里把行压到 25px、上栏提到 62%,并把符号列略缩,保证一屏能看到约 15 项。 */
|
|
253
|
+
body[data-layout=double] #preview-col .filelist .row{padding:3px 8px;min-height:25px;font-size:12.5px}
|
|
254
|
+
body[data-layout=double] #preview-col .filelist .row .ni{width:22px;height:22px}
|
|
255
|
+
body[data-layout=double] #preview-col .filelist .row .nm{gap:5px}
|
|
256
|
+
body[data-layout=double] #preview-col .browse-head{grid-template-columns:20px 22px minmax(0,1fr) 58px 62px 96px}
|
|
257
|
+
body[data-layout=double] #preview-col .filelist .row{grid-template-columns:20px 22px minmax(0,1fr) 58px 62px 96px}
|
|
258
|
+
|
|
259
|
+
/* 点中一行时给一个清晰的按键反馈,避免"点了不知道有没有生效"的错觉 */
|
|
260
|
+
.filelist .row:active{background:color-mix(in srgb,var(--dock-accent) 22%,transparent)}
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
/* ---- 窄屏(≤700px)覆盖带 #preview-col 的 6 列定义 ----
|
|
264
|
+
page.css 里的窄屏断点写的是 ody[data-layout=double] .browse-head(specificity 0,2,1),
|
|
265
|
+
而上面 256/257 行的 ody[data-layout=double] #preview-col .browse-head 含 id(1,2,1),
|
|
266
|
+
specificity 更高且本文件后加载 → 窗口变窄时列宽仍然是 6 列,「名称」列头被挤成 0 宽。
|
|
267
|
+
所以必须在同一文件、同形选择器里再覆盖一次。 */
|
|
268
|
+
@media(max-width:700px){
|
|
269
|
+
body[data-layout=double] #preview-col .browse-head{grid-template-columns:20px 26px minmax(0,1fr);gap:0}
|
|
270
|
+
body[data-layout=double] #preview-col .filelist .row{grid-template-columns:20px 26px minmax(0,1fr);gap:0;padding:4px 7px}
|
|
271
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/* 文件预览页:沿用 dock.css 的灰阶与胶囊控件,只补布局与预览区样式。 */
|
|
2
|
+
#app-main, main{min-width:0}
|
|
3
|
+
header{flex-wrap:wrap}
|
|
4
|
+
header nav{display:flex;align-items:center;flex-wrap:wrap;gap:8px}
|
|
5
|
+
.layouts{border-radius:999px;background:var(--dock-card);padding:3px;gap:2px}
|
|
6
|
+
.layouts button{border:0;background:transparent;min-height:24px;padding:2px 12px}
|
|
7
|
+
.layouts button[aria-pressed=true]{background:var(--dock-line);color:var(--dock-text)}
|
|
8
|
+
|
|
9
|
+
.workspace{display:grid;gap:12px;align-items:start;grid-template-columns:minmax(0,1fr)}
|
|
10
|
+
/* 双栏:左文件夹 / 右预览。
|
|
11
|
+
两条硬规矩,都是为了不打自己的脸:
|
|
12
|
+
1) 高度用固定 px,绝不写 vh。宿主是拿我们上报的 main 高度去设 iframe 高度的,
|
|
13
|
+
再用 vh 就是「高度依赖视口、视口依赖上报高度」的死循环,面板会一直抖。
|
|
14
|
+
2) main 的总高也钉死(见下方 body[data-layout=double] main),窄屏 header 换行时
|
|
15
|
+
由 workspace 让位,总高恒定 —— 上报值稳定,宿主只量一次。 */
|
|
16
|
+
body[data-layout=double] main{display:flex;flex-direction:column;height:820px}
|
|
17
|
+
/* 三行:上栏(文件夹) | 分隔条 | 下栏(预览)。上栏高度由 --side-h 控制,拖动分隔条就是改这个变量。 */
|
|
18
|
+
body[data-layout=double] .workspace{
|
|
19
|
+
flex:1 1 auto;
|
|
20
|
+
min-height:0;
|
|
21
|
+
grid-template-rows:min(var(--side-h,420px),62%) 8px minmax(0,1fr);
|
|
22
|
+
grid-template-columns:minmax(0,1fr);
|
|
23
|
+
gap:5px;
|
|
24
|
+
align-items:stretch;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* 分栏分隔条:整条 8px 都是拖动命中区,中间画 2px 横线。单栏时整条隐藏。 */
|
|
28
|
+
#split{display:none;position:relative;cursor:row-resize;touch-action:none;align-self:stretch;border-radius:6px}
|
|
29
|
+
body[data-layout=double] #split{display:block}
|
|
30
|
+
#split::before{content:'';position:absolute;left:8px;right:8px;top:50%;height:2px;margin-top:-1px;border-radius:2px;background:var(--dock-line);transition:background .12s}
|
|
31
|
+
#split:hover::before,#split:focus-visible::before,#split[data-dragging=true]::before{background:var(--dock-accent)}
|
|
32
|
+
#split:focus-visible{outline:none}
|
|
33
|
+
#split[data-dragging=true]{background:var(--dock-control)}
|
|
34
|
+
/* 拖动期间锁住文字选中,否则会拖出一片蓝色选区。 */
|
|
35
|
+
body[data-resizing=true]{user-select:none;cursor:row-resize}
|
|
36
|
+
body[data-layout=single] #side{display:none}
|
|
37
|
+
body[data-layout=single] #browse{display:none}
|
|
38
|
+
|
|
39
|
+
#side{margin:0;padding:12px;display:grid;gap:10px;grid-template-rows:minmax(0,1fr) auto;min-height:0;overflow:hidden;border:1px solid var(--dock-line);border-radius:18px;background:var(--dock-card)}
|
|
40
|
+
/* 上下并列后 #side 只有上栏那点高度(默认 360px),「位置/最近」面板在里面会
|
|
41
|
+
把文件夹列表挤成几十像素(实测 filelist 只剩 4 行)。用户也明确要求过移除
|
|
42
|
+
显示位置功能,所以双栏时整块 #loc 不出现,把高度全留给列表。 */
|
|
43
|
+
body[data-layout=double] #side{grid-template-rows:minmax(0,1fr);gap:0}
|
|
44
|
+
|
|
45
|
+
/* 左栏:文件夹浏览器,独立滚动,撑满可用高度 */
|
|
46
|
+
#browse{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:8px;min-height:0;min-width:0;margin:0}
|
|
47
|
+
#browse-crumbs{margin:0}
|
|
48
|
+
#browse-list{overflow:auto;min-height:0;align-content:start;padding-right:2px}
|
|
49
|
+
#browse .filelist{margin:0}
|
|
50
|
+
.browse-foot{display:flex;gap:6px;flex-wrap:wrap;border-top:1px solid var(--dock-line);padding-top:6px}
|
|
51
|
+
|
|
52
|
+
/* 位置/最近:双栏时折叠到左栏底部,单栏时不出现在左栏 */
|
|
53
|
+
#loc{display:grid;gap:4px;min-width:0;max-height:340px;overflow:auto;border-top:1px solid var(--dock-line);padding-top:8px}
|
|
54
|
+
body[data-layout=double] #loc{display:none}
|
|
55
|
+
|
|
56
|
+
#side h2{font-size:11.5px;color:var(--dock-muted);text-transform:none;letter-spacing:0;margin:2px 0 4px}
|
|
57
|
+
#roots,#recent{display:grid;gap:2px}
|
|
58
|
+
#roots button,#recent button{text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-color:transparent;background:transparent;font-weight:500;min-height:26px;padding:3px 10px}
|
|
59
|
+
#roots button:hover,#recent button:hover{background:var(--dock-control)}
|
|
60
|
+
#roots button[aria-current=true],#recent button[aria-current=true]{background:var(--dock-line);border-color:var(--dock-line)}
|
|
61
|
+
button.ghost{background:transparent;border-color:transparent;color:var(--dock-muted);font-weight:500;min-height:24px;padding:2px 10px}
|
|
62
|
+
#path-line{font-size:11.5px;overflow-wrap:anywhere;margin:10px 0 0;max-height:88px;overflow:auto}
|
|
63
|
+
|
|
64
|
+
#stage{margin:0;padding:12px 14px 18px;min-width:0;min-height:0;overflow:auto}
|
|
65
|
+
body[data-layout=double] #stage{border:1px solid var(--dock-line);border-radius:18px;background:var(--dock-card)}
|
|
66
|
+
body[data-layout=double] #view{height:100%;min-height:0}
|
|
67
|
+
.crumbs{display:flex;flex-wrap:wrap;align-items:center;gap:4px;margin:0 0 10px;font-size:12px}
|
|
68
|
+
.crumbs button{background:transparent;border-color:transparent;min-height:22px;padding:1px 8px;font-weight:500;color:var(--dock-muted)}
|
|
69
|
+
.crumbs button:hover{color:var(--dock-text);background:var(--dock-control)}
|
|
70
|
+
.crumbs button:last-of-type{color:var(--dock-text)}
|
|
71
|
+
.crumbs span{color:var(--dock-muted)}
|
|
72
|
+
|
|
73
|
+
#view{min-width:0}
|
|
74
|
+
#view>header{display:none}
|
|
75
|
+
|
|
76
|
+
.filelist{display:grid;gap:2px;margin:0}
|
|
77
|
+
.filelist .row{display:grid;grid-template-columns:1fr auto auto;gap:10px;align-items:center;width:100%;text-align:left;border:0;background:transparent;border-radius:9px;padding:5px 9px;font-weight:500;min-height:28px}
|
|
78
|
+
.filelist .row:hover{background:var(--dock-control)}
|
|
79
|
+
.filelist .row .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
|
|
80
|
+
.filelist .row .nm::before{content:'';display:inline-block;width:14px;text-align:center;margin-right:6px;color:var(--dock-muted)}
|
|
81
|
+
.filelist .row.dir .nm::before{content:'▸';color:var(--dock-accent)}
|
|
82
|
+
.filelist .row .sz,.filelist .row .dt{color:var(--dock-muted);font-size:11.5px;font-variant-numeric:tabular-nums;white-space:nowrap}
|
|
83
|
+
.filelist .empty{color:var(--dock-muted);padding:10px 4px}
|
|
84
|
+
|
|
85
|
+
.preview-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 10px}
|
|
86
|
+
.preview-head h2{font-size:13.5px;margin:0;overflow-wrap:anywhere}
|
|
87
|
+
.preview-head .badge{font-size:11px;color:var(--dock-muted);border:1px solid var(--dock-line);border-radius:999px;padding:1px 9px}
|
|
88
|
+
|
|
89
|
+
pre.body{white-space:pre;overflow:auto;max-height:720px;margin:0;padding:10px 12px;border-radius:12px;background:#0b0b0c;border:1px solid var(--dock-line);font:12px/1.62 'Cascadia Mono',Consolas,'Courier New',monospace;tab-size:2}
|
|
90
|
+
:root[data-dock-theme=light] pre.body{background:#f6f6f7}
|
|
91
|
+
pre.body .ln{display:inline-block;width:3.2em;margin-right:10px;text-align:right;color:var(--dock-muted);user-select:none;opacity:.65}
|
|
92
|
+
|
|
93
|
+
.md{overflow-wrap:anywhere;font-size:13px;line-height:1.68;max-height:720px;overflow:auto;padding:2px 2px}
|
|
94
|
+
.md h1,.md h2,.md h3,.md h4,.md h5,.md h6{margin:16px 0 8px;line-height:1.3}
|
|
95
|
+
.md h1{font-size:19px}.md h2{font-size:16.5px}.md h3{font-size:14.5px}.md h4,.md h5,.md h6{font-size:13.5px}
|
|
96
|
+
.md h1:first-child,.md h2:first-child{margin-top:2px}
|
|
97
|
+
.md p{margin:8px 0;color:var(--dock-text)}
|
|
98
|
+
.md code{font-family:'Cascadia Mono',Consolas,monospace;font-size:12px;background:var(--dock-control);border-radius:5px;padding:1px 5px}
|
|
99
|
+
.md pre{background:#0b0b0c;border:1px solid var(--dock-line);border-radius:12px;padding:10px 12px;overflow:auto;margin:10px 0}
|
|
100
|
+
:root[data-dock-theme=light] .md pre{background:#f6f6f7}
|
|
101
|
+
.md pre code{background:transparent;padding:0;font-size:12px;line-height:1.6}
|
|
102
|
+
.md blockquote{margin:10px 0;padding:2px 0 2px 12px;border-left:3px solid var(--dock-line);color:var(--dock-muted)}
|
|
103
|
+
.md ul,.md ol{margin:8px 0;padding-left:22px;color:var(--dock-text)}
|
|
104
|
+
.md li{margin:3px 0}
|
|
105
|
+
.md hr{border:0;border-top:1px solid var(--dock-line);margin:14px 0}
|
|
106
|
+
.md a{color:var(--dock-accent);text-decoration:none}
|
|
107
|
+
.md a:hover{text-decoration:underline}
|
|
108
|
+
.md table{border-collapse:collapse;margin:10px 0;font-size:12.5px;display:block;overflow:auto}
|
|
109
|
+
.md th,.md td{border:1px solid var(--dock-line);padding:5px 10px;text-align:left}
|
|
110
|
+
.md th{background:var(--dock-card);font-weight:600}
|
|
111
|
+
.md img{max-width:100%;border-radius:10px}
|
|
112
|
+
.md .task{color:var(--dock-muted)}
|
|
113
|
+
|
|
114
|
+
.figure{display:grid;gap:8px;justify-items:start}
|
|
115
|
+
.figure img{max-width:100%;max-height:720px;border-radius:12px;background:var(--dock-card);border:1px solid var(--dock-line)}
|
|
116
|
+
.figure img.zoomable{cursor:zoom-in;transition:filter .12s}
|
|
117
|
+
.figure img.zoomable:hover{filter:brightness(1.06)}
|
|
118
|
+
.figure .meta{font-size:11.5px;color:var(--dock-muted);font-variant-numeric:tabular-nums}
|
|
119
|
+
|
|
120
|
+
/* 图片放大查看灯箱 */
|
|
121
|
+
.lb-overlay{position:fixed;inset:0;z-index:2147483600;display:flex;flex-direction:column;align-items:center;justify-content:center;background:rgba(8,10,14,.92);backdrop-filter:blur(2px);user-select:none}
|
|
122
|
+
.lb-overlay[hidden]{display:none}
|
|
123
|
+
.lb-stage{flex:1 1 auto;display:flex;align-items:center;justify-content:center;width:100%;overflow:hidden;cursor:default}
|
|
124
|
+
.lb-img{max-width:96vw;max-height:86vh;border-radius:8px;box-shadow:0 12px 60px rgba(0,0,0,.6);will-change:transform;transform-origin:center center}
|
|
125
|
+
.lb-bar{display:flex;gap:8px;padding:10px 14px;align-items:center}
|
|
126
|
+
.lb-btn{appearance:none;border:1px solid rgba(255,255,255,.22);background:rgba(255,255,255,.10);color:#f2f4f8;font-size:13px;line-height:1;padding:6px 11px;border-radius:9px;cursor:pointer;min-width:34px}
|
|
127
|
+
.lb-btn:hover{background:rgba(255,255,255,.20)}
|
|
128
|
+
.lb-btn.wide{padding:6px 14px}
|
|
129
|
+
.lb-btn.close{border-color:rgba(255,120,120,.5);background:rgba(220,80,80,.22)}
|
|
130
|
+
.lb-tip{font-size:11px;color:rgba(255,255,255,.5);padding:0 14px 12px}
|
|
131
|
+
|
|
132
|
+
.sheet{display:grid;gap:8px;margin:0 0 16px}
|
|
133
|
+
.sheet h3{margin:0;font-size:12.5px;color:var(--dock-muted)}
|
|
134
|
+
.sheet .grid{overflow:auto;max-height:440px;border:1px solid var(--dock-line);border-radius:12px}
|
|
135
|
+
.sheet table{border-collapse:collapse;font-size:12px}
|
|
136
|
+
.sheet td,.sheet th{border-right:1px solid var(--dock-line);border-bottom:1px solid var(--dock-line);padding:4px 9px;white-space:pre;max-width:400px;overflow:hidden;text-overflow:ellipsis;vertical-align:top}
|
|
137
|
+
.sheet th{position:sticky;top:0;background:var(--dock-card);font-weight:600;z-index:1}
|
|
138
|
+
.sheet tr:last-child td{border-bottom:0}
|
|
139
|
+
.sheet td:last-child,.sheet th:last-child{border-right:0}
|
|
140
|
+
|
|
141
|
+
.doc{max-height:720px;overflow:auto;padding-right:4px}
|
|
142
|
+
.doc .para{margin:6px 0;overflow-wrap:anywhere}
|
|
143
|
+
.doc .gap{height:8px}
|
|
144
|
+
.doc .dh{margin:14px 0 6px;overflow-wrap:anywhere}
|
|
145
|
+
.doc .dh.h1{font-size:17px}.doc .dh.h2{font-size:15px}.doc .dh.h3{font-size:14px}.doc .dh.h4,.doc .dh.h5,.doc .dh.h6{font-size:13.5px}
|
|
146
|
+
.slides{display:grid;gap:12px;max-height:720px;overflow:auto}
|
|
147
|
+
.slide{border:1px solid var(--dock-line);border-radius:14px;padding:10px 14px;background:var(--dock-card)}
|
|
148
|
+
.slide h3{font-size:12px;color:var(--dock-muted);margin:0 0 8px;font-weight:600}
|
|
149
|
+
.slide p{margin:3px 0;color:var(--dock-text);overflow-wrap:anywhere}
|
|
150
|
+
|
|
151
|
+
.hint{border:1px dashed var(--dock-line);border-radius:14px;padding:16px;background:var(--dock-card)}
|
|
152
|
+
.hint h3{margin:0 0 6px;font-size:13.5px}
|
|
153
|
+
.hint p{margin:6px 0;color:var(--dock-muted);font-size:12.5px;overflow-wrap:anywhere}
|
|
154
|
+
.hint .actions{margin-top:10px}
|
|
155
|
+
|
|
156
|
+
/* 打开文件夹:路径输入 + 目录选择器 */
|
|
157
|
+
#jump{margin:0 0 12px}
|
|
158
|
+
#jump h2{font-size:12.5px;color:var(--dock-muted);margin:0 0 8px}
|
|
159
|
+
#jump label{display:grid;gap:5px;font-size:12px;color:var(--dock-muted)}
|
|
160
|
+
#jump input{width:100%;box-sizing:border-box;min-height:28px;padding:3px 10px;border-radius:10px;border:1px solid var(--dock-line);background:var(--dock-control);color:var(--dock-text);font:12px/1.5 'Cascadia Mono',Consolas,monospace}
|
|
161
|
+
#jump .actions{display:flex;gap:8px;margin:8px 0 0}
|
|
162
|
+
.picker{margin:12px 0 0;border:1px solid var(--dock-line);border-radius:14px;background:var(--dock-card);overflow:hidden}
|
|
163
|
+
.picker-bar{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--dock-line);flex-wrap:wrap}
|
|
164
|
+
.picker-bar code{flex:1;min-width:0;font:11.5px/1.5 'Cascadia Mono',Consolas,monospace;color:var(--dock-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
165
|
+
.picker-list{max-height:320px;overflow:auto;padding:6px;display:grid;gap:2px}
|
|
166
|
+
.picker-list .row{display:flex;align-items:center;gap:8px;width:100%;text-align:left;border:0;background:transparent;border-radius:9px;padding:5px 9px;font-weight:500;min-height:26px}
|
|
167
|
+
.picker-list .row:hover{background:var(--dock-control)}
|
|
168
|
+
.picker-list .row .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
|
|
169
|
+
.picker-list .row .nm::before{content:'▸';display:inline-block;width:14px;margin-right:6px;color:var(--dock-accent)}
|
|
170
|
+
.picker-list .note{padding:6px 9px;margin:0}
|
|
171
|
+
|
|
172
|
+
.foot{margin:12px 0 0;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
|
|
173
|
+
/* 窄面板(宿主设置面板就是 520px):双栏必须保住,只把左栏再压窄一点,
|
|
174
|
+
绝不 display:none —— 那样用户就永远看不到文件夹那一栏。 */
|
|
175
|
+
@media(max-width:700px){
|
|
176
|
+
body[data-layout=double] .workspace{grid-template-rows:min(var(--side-h,280px),42%) 8px minmax(0,1fr);gap:4px}
|
|
177
|
+
header nav{width:100%}
|
|
178
|
+
/* 左栏只有一百多像素:大小/日期两列会把文件名挤成 "▶ ..",
|
|
179
|
+
窄栏下让位给文件名,只保留图标 + 名字。 */
|
|
180
|
+
body[data-layout=double] .filelist .row{grid-template-columns:20px 26px minmax(0,1fr);gap:0;padding:4px 7px}
|
|
181
|
+
body[data-layout=double] .filelist .row .st,
|
|
182
|
+
body[data-layout=double] .filelist .row .sz,
|
|
183
|
+
body[data-layout=double] .filelist .row .dt{display:none}
|
|
184
|
+
body[data-layout=double] .filelist .row .nm::before{width:12px;margin-right:4px}
|
|
185
|
+
/* 表头必须跟着行一起塌成 3 列,否则 6 列的表头会把「名称」列头挤成 0 宽
|
|
186
|
+
(行已隐藏 st/sz/dt,表头对应的 span/button 要同步隐藏)。 */
|
|
187
|
+
body[data-layout=double] .browse-head{grid-template-columns:20px 26px minmax(0,1fr);gap:0}
|
|
188
|
+
body[data-layout=double] .browse-head > *:nth-child(n+4){display:none}
|
|
189
|
+
/* 徽标可收缩,别把文件名压成单字符 */
|
|
190
|
+
body[data-layout=double] .filelist .row .nm .stash-badge{flex:0 1 auto;min-width:0;max-width:5em}
|
|
191
|
+
body[data-layout=double] #browse-crumbs{font-size:11px;gap:2px}
|
|
192
|
+
body[data-layout=double] #browse-crumbs button{padding:1px 5px;min-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
193
|
+
body[data-layout=double] .browse-foot{gap:4px;padding-top:4px}
|
|
194
|
+
body[data-layout=double] .browse-foot button{padding:2px 6px;min-height:22px;font-size:11.5px}
|
|
195
|
+
}
|
|
196
|
+
@media(max-width:430px){
|
|
197
|
+
body[data-layout=double] .workspace{grid-template-rows:min(var(--side-h,280px),40%) 8px minmax(0,1fr);gap:3px}
|
|
198
|
+
#side{padding:8px}
|
|
199
|
+
#stage{padding:10px}
|
|
200
|
+
/* 超窄栏里徽标即使收缩也只剩一两个字,会把文件名挤没。
|
|
201
|
+
直接隐藏徽标,靠 .row.stashed / aria-stashed 的 accent 变色识别「已暂存」。 */
|
|
202
|
+
body[data-layout=double] .filelist .row .nm .stash-badge,
|
|
203
|
+
body[data-layout=double] #preview-col .filelist .row .nm .stash-badge{display:none}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
/* 插件内目录选择器:宿主没有 fish:hold 时的兜底,不弹原生对话框,面板不会失焦 */
|
|
208
|
+
.dirpick{position:fixed;inset:0;z-index:80;display:grid;place-items:center;background:#0009;backdrop-filter:blur(2px)}
|
|
209
|
+
.dirpick[hidden]{display:none}
|
|
210
|
+
.dirpick-card{width:min(560px,86vw);max-height:min(560px,84vh);display:grid;grid-template-rows:auto auto minmax(120px,1fr) auto auto;gap:10px;background:var(--dock-card);border:1px solid var(--dock-line);border-radius:14px;padding:14px;box-shadow:0 18px 48px #000a}
|
|
211
|
+
.dirpick-head{display:flex;align-items:center;justify-content:space-between;font-weight:600;font-size:13px}
|
|
212
|
+
.dirpick-list{overflow:auto;min-height:120px;border:1px solid var(--dock-line);border-radius:10px;padding:4px}
|
|
213
|
+
.dirpick-list .row{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:7px;cursor:pointer}
|
|
214
|
+
.dirpick-list .row:hover{background:var(--dock-control)}
|
|
215
|
+
.dirpick-list .row.sel{background:color-mix(in oklab,var(--dock-accent) 22%,transparent)}
|
|
216
|
+
.dirpick-list .row .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
217
|
+
.dirpick-foot{display:flex;align-items:center;gap:8px}
|
|
218
|
+
.dirpick-path{flex:1;min-width:0;background:var(--dock-control);border:1px solid var(--dock-line);border-radius:8px;color:var(--dock-text);padding:6px 9px;font-size:12.5px}
|