dsh-plugin-table-zoom 0.3.0 → 0.3.1
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/CHANGELOG.md +14 -0
- package/README.md +5 -3
- package/lib/client.js +30 -82
- package/package.json +1 -1
- package/scripts/smoke-client.mjs +40 -28
- package//350/256/276/350/256/241/350/257/264/346/230/216.md +7 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.1] - 2026-08-22
|
|
4
|
+
|
|
5
|
+
- **每次打开自适应,不再继承任何布局**:移除尺寸/位置/缩放的跨次记忆
|
|
6
|
+
(不再读写 localStorage),浮窗每次打开都按表格自然宽度定宽
|
|
7
|
+
(下限 320;窄表收缩不撑满、**超级大表铺满视口可用宽度**)、居中、
|
|
8
|
+
缩放 100%;手动拖拽(改大小/移动/缩放)只影响当次打开,关掉再开即回到自适应。
|
|
9
|
+
- **修复:自适应此前从未生效**——旧实现返回值错误(无记忆时返回估算宽 960
|
|
10
|
+
而非 0)导致自适应分支不执行,小表仍撑满大窗口。
|
|
11
|
+
- **缩放不再跨次继承**:Ctrl+滚轮缩放比例不写入 localStorage,
|
|
12
|
+
每次打开浮窗都从 100% 开始(标题栏百分比同步复位)。
|
|
13
|
+
- 测试:冒烟调整/新增 3 项(自适应宽度:窄表收缩/宽表封顶/空表兜底;
|
|
14
|
+
每次打开不继承上次尺寸;openPopup 走自适应下限),
|
|
15
|
+
共 selfcheck 12 项 + 冒烟 12 项。
|
|
16
|
+
|
|
3
17
|
## [0.3.0] - 2026-08-22
|
|
4
18
|
|
|
5
19
|
- **浮窗可拖动**:不再强制居中——按住标题栏(按钮除外)拖动浮窗位置,
|
package/README.md
CHANGED
|
@@ -22,11 +22,13 @@ DeepSeek Harness (dsh) Web GUI 聊天表格浮窗插件。
|
|
|
22
22
|
- 浮窗头部「复制为 Markdown」按钮一键复制整表(单元格内联换行折叠、管道符转义);
|
|
23
23
|
- 浮窗里展示的是**原表格的克隆**,聊天里的表格保持不变,也不会被重复增强;
|
|
24
24
|
- **拖拽改尺寸**:浮窗右下角手柄可自由调整大小(最小 320×200,最大到视口留白),
|
|
25
|
-
|
|
25
|
+
只影响当次打开;
|
|
26
|
+
- **每次打开自适应**:浮窗不记忆任何布局——宽度按表格内容自适应(窄表不撑满、
|
|
27
|
+
超级大表直接铺满视口可用宽度,下限 320)、位置居中、缩放 100%;关掉再开即回到自适应;
|
|
26
28
|
- **拖拽移动**:按住标题栏可把浮窗拖到任意位置(自动限制在页面内,不会拖出屏幕),
|
|
27
|
-
|
|
29
|
+
位置只影响当次打开;
|
|
28
30
|
- **Ctrl+滚轮缩放**:浮窗内按住 Ctrl 滚动滚轮,表格字体 60%–250% 缩放
|
|
29
|
-
(步进 10
|
|
31
|
+
(步进 10%),标题栏实时显示百分比;**缩放不记忆,每次打开回到 100%**;
|
|
30
32
|
- **拖拽平移**:表格超宽/超高时,按住正文任意位置即可左右/上下拖动滚动
|
|
31
33
|
(grab 光标提示;越过 4px 阈值才视为拖动,不干扰文本选择;触屏走原生滚动);
|
|
32
34
|
- **滚动条清晰**:正文滚动条加深加粗,浅色主题下也能看清;
|
package/lib/client.js
CHANGED
|
@@ -203,11 +203,10 @@ window.__ModuleLoader__.load({
|
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
// ------------------------------------------------------------------
|
|
206
|
-
// 浮窗布局:拖拽改大小 + 拖标题栏移动 + Ctrl+滚轮缩放
|
|
206
|
+
// 浮窗布局:拖拽改大小 + 拖标题栏移动 + Ctrl+滚轮缩放
|
|
207
|
+
// 不记忆任何布局:每次打开都按表格内容自适应宽度并居中,手动拖拽只影响当次。
|
|
207
208
|
// ------------------------------------------------------------------
|
|
208
209
|
|
|
209
|
-
/** localStorage 键:记住用户最后一次手动调整的浮窗布局(尺寸/位置/缩放)。 */
|
|
210
|
-
var SIZE_KEY = 'dsh-plugin-table-zoom:popup-size';
|
|
211
210
|
var MIN_POPUP_W = 320;
|
|
212
211
|
var MIN_POPUP_H = 200;
|
|
213
212
|
/** 浮窗距视口边缘的最小留白。 */
|
|
@@ -236,52 +235,25 @@ window.__ModuleLoader__.load({
|
|
|
236
235
|
return 800;
|
|
237
236
|
}
|
|
238
237
|
|
|
239
|
-
/** 读取上次记忆的浮窗布局;无记录/损坏/隐私模式返回 null。 */
|
|
240
|
-
function readSavedSize() {
|
|
241
|
-
try {
|
|
242
|
-
if (typeof localStorage === 'undefined') return null;
|
|
243
|
-
var raw = localStorage.getItem(SIZE_KEY);
|
|
244
|
-
if (raw === null || raw === '') return null;
|
|
245
|
-
var v = JSON.parse(raw);
|
|
246
|
-
if (v === null || typeof v !== 'object') return null;
|
|
247
|
-
return {
|
|
248
|
-
w: Number(v.w) || 0,
|
|
249
|
-
h: Number(v.h) || 0,
|
|
250
|
-
x: typeof v.x === 'number' ? v.x : null,
|
|
251
|
-
y: typeof v.y === 'number' ? v.y : null,
|
|
252
|
-
zoom: typeof v.zoom === 'number' && v.zoom > 0 ? v.zoom : 1
|
|
253
|
-
};
|
|
254
|
-
} catch (e) {
|
|
255
|
-
return null;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
238
|
/**
|
|
260
|
-
*
|
|
261
|
-
*
|
|
239
|
+
* 每次打开都按表格自然宽度自适应面板宽度
|
|
240
|
+
* (正文左右 padding 36 + 面板边框 2;下限 320,上限为视口减去留白——
|
|
241
|
+
* 超级大表直接铺满最大可用宽度)。
|
|
262
242
|
*/
|
|
263
|
-
function
|
|
264
|
-
var
|
|
265
|
-
var
|
|
266
|
-
var
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
var pw = w > 0 ? w : Math.min(960, maxW);
|
|
278
|
-
var ph = h > 0 ? h : Math.min(720, maxH);
|
|
279
|
-
var x = v !== null && v.x !== null ? clamp(v.x, 0, Math.max(0, vw - pw)) : Math.round((vw - pw) / 2);
|
|
280
|
-
var y = v !== null && v.y !== null ? clamp(v.y, 0, Math.max(0, vh - ph)) : Math.round((vh - ph) / 2);
|
|
281
|
-
panel.style.left = x + 'px';
|
|
282
|
-
panel.style.top = y + 'px';
|
|
283
|
-
var zoom = v !== null ? clamp(v.zoom, ZOOM_MIN, ZOOM_MAX) : 1;
|
|
284
|
-
return { w: pw, h: ph, x: x, y: y, zoom: zoom };
|
|
243
|
+
function applyAdaptiveWidth(panel, clone) {
|
|
244
|
+
var tableW = typeof clone.offsetWidth === 'number' && clone.offsetWidth > 0 ? clone.offsetWidth : 0;
|
|
245
|
+
var maxW = viewportW() - POPUP_MARGIN;
|
|
246
|
+
var w = clamp(tableW + 38, MIN_POPUP_W, Math.max(MIN_POPUP_W, maxW));
|
|
247
|
+
panel.style.width = w + 'px';
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** 把面板按实际尺寸重新居中(自适应改宽后调用;测不到尺寸时跳过)。 */
|
|
251
|
+
function centerPanel(panel) {
|
|
252
|
+
var w = panel.offsetWidth;
|
|
253
|
+
var h = panel.offsetHeight;
|
|
254
|
+
if (typeof w !== 'number' || w <= 0 || typeof h !== 'number' || h <= 0) return;
|
|
255
|
+
panel.style.left = Math.round((viewportW() - w) / 2) + 'px';
|
|
256
|
+
panel.style.top = Math.round((viewportH() - h) / 2) + 'px';
|
|
285
257
|
}
|
|
286
258
|
|
|
287
259
|
/** 把面板位置限制在视口内(完全可见,不越出页面)。 */
|
|
@@ -307,26 +279,6 @@ window.__ModuleLoader__.load({
|
|
|
307
279
|
panel.style.top = y + 'px';
|
|
308
280
|
}
|
|
309
281
|
|
|
310
|
-
/** 拖拽结束后记忆当前布局(尺寸/位置/缩放;localStorage 不可用时静默跳过)。 */
|
|
311
|
-
function saveLayout(panel, zoom) {
|
|
312
|
-
try {
|
|
313
|
-
if (typeof localStorage === 'undefined') return;
|
|
314
|
-
var rect = panel.getBoundingClientRect();
|
|
315
|
-
if (rect === null || typeof rect !== 'object') return;
|
|
316
|
-
var prev = readSavedSize();
|
|
317
|
-
var record = {
|
|
318
|
-
w: Math.round(rect.width),
|
|
319
|
-
h: Math.round(rect.height),
|
|
320
|
-
x: typeof rect.left === 'number' ? Math.round(rect.left) : 0,
|
|
321
|
-
y: typeof rect.top === 'number' ? Math.round(rect.top) : 0,
|
|
322
|
-
zoom: typeof zoom === 'number' && zoom > 0 ? Math.round(zoom * 100) / 100 : (prev !== null && prev.zoom > 0 ? prev.zoom : 1)
|
|
323
|
-
};
|
|
324
|
-
localStorage.setItem(SIZE_KEY, JSON.stringify(record));
|
|
325
|
-
} catch (e) {
|
|
326
|
-
/* 隐私模式等场景忽略 */
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
|
|
330
282
|
/** 内容溢出时给正文加 grab 光标提示(可拖拽平移)。 */
|
|
331
283
|
function refreshGrabbable(body) {
|
|
332
284
|
var overX = body.scrollWidth > body.clientWidth + 1;
|
|
@@ -343,7 +295,7 @@ window.__ModuleLoader__.load({
|
|
|
343
295
|
|
|
344
296
|
/**
|
|
345
297
|
* 给面板挂载「拖右下角改尺寸」:指针捕获 + _suppressClick 防止拖完
|
|
346
|
-
*
|
|
298
|
+
* 松手落在遮罩上误触发关闭。尺寸只影响当次打开,不持久化。
|
|
347
299
|
* @param {object} panel - .dstz-panel 元素。
|
|
348
300
|
* @param {object} overlay - .dstz-popup 元素(承载 _suppressClick)。
|
|
349
301
|
*/
|
|
@@ -382,7 +334,6 @@ window.__ModuleLoader__.load({
|
|
|
382
334
|
state = null;
|
|
383
335
|
panel.classList.remove('dstz-resizing');
|
|
384
336
|
clampPanelPosition(panel);
|
|
385
|
-
saveLayout(panel);
|
|
386
337
|
window.setTimeout(function () { overlay._suppressClick = false; }, 0);
|
|
387
338
|
};
|
|
388
339
|
handle.addEventListener('pointerdown', begin);
|
|
@@ -394,7 +345,7 @@ window.__ModuleLoader__.load({
|
|
|
394
345
|
|
|
395
346
|
/**
|
|
396
347
|
* 给标题栏挂载「拖拽移动」:按住标题栏(按钮除外)拖动面板位置,
|
|
397
|
-
*
|
|
348
|
+
* 位置限制在视口内(不越出页面);位置不记忆,下次打开重新居中。
|
|
398
349
|
* @param {object} panel - .dstz-panel 元素(children[0] 为标题栏)。
|
|
399
350
|
* @param {object} overlay - .dstz-popup 元素(承载 _suppressClick)。
|
|
400
351
|
*/
|
|
@@ -431,10 +382,7 @@ window.__ModuleLoader__.load({
|
|
|
431
382
|
var wasMoved = state.moved;
|
|
432
383
|
state = null;
|
|
433
384
|
header.classList.remove('dstz-dragging');
|
|
434
|
-
if (wasMoved) {
|
|
435
|
-
saveLayout(panel);
|
|
436
|
-
window.setTimeout(function () { overlay._suppressClick = false; }, 0);
|
|
437
|
-
}
|
|
385
|
+
if (wasMoved) window.setTimeout(function () { overlay._suppressClick = false; }, 0);
|
|
438
386
|
};
|
|
439
387
|
header.addEventListener('pointerup', end);
|
|
440
388
|
header.addEventListener('pointercancel', end);
|
|
@@ -559,7 +507,7 @@ window.__ModuleLoader__.load({
|
|
|
559
507
|
panel.appendChild(body);
|
|
560
508
|
overlay.appendChild(panel);
|
|
561
509
|
|
|
562
|
-
// 拖拽改尺寸 + 拖标题栏移动 + 内容溢出拖拽平移 +
|
|
510
|
+
// 拖拽改尺寸 + 拖标题栏移动 + 内容溢出拖拽平移 + Ctrl+滚轮缩放
|
|
563
511
|
attachResize(panel, overlay);
|
|
564
512
|
attachMove(panel, overlay);
|
|
565
513
|
attachPan(body, overlay);
|
|
@@ -571,16 +519,14 @@ window.__ModuleLoader__.load({
|
|
|
571
519
|
small.textContent = rowCount + ' ' + LABELS.rowsCols + ' ' + colCount
|
|
572
520
|
+ (Math.abs(zoom - 1) > 0.001 ? ' \u00b7 ' + Math.round(zoom * 100) + '%' : '');
|
|
573
521
|
};
|
|
574
|
-
|
|
575
|
-
applyZoom(layout.zoom);
|
|
522
|
+
applyZoom(1); // 不继承上次的缩放,每次都从 100% 开始
|
|
576
523
|
refreshGrabbable(body);
|
|
577
524
|
|
|
578
|
-
// Ctrl
|
|
525
|
+
// Ctrl+滚轮:缩放表格字体(阻止浏览器整页缩放;缩放不写入 localStorage)
|
|
579
526
|
var onWheel = function (e) {
|
|
580
527
|
if (!e.ctrlKey) return;
|
|
581
528
|
if (typeof e.preventDefault === 'function') e.preventDefault();
|
|
582
529
|
applyZoom(e.deltaY < 0 ? zoom + ZOOM_STEP : zoom - ZOOM_STEP);
|
|
583
|
-
saveLayout(panel, zoom);
|
|
584
530
|
};
|
|
585
531
|
panel.addEventListener('wheel', onWheel, { passive: false });
|
|
586
532
|
|
|
@@ -623,6 +569,10 @@ window.__ModuleLoader__.load({
|
|
|
623
569
|
|
|
624
570
|
activePopup = overlay;
|
|
625
571
|
document.body.appendChild(overlay);
|
|
572
|
+
// 每次打开都按表格自然宽度自适应,并按实际尺寸重新居中(不继承上次的尺寸/位置)
|
|
573
|
+
applyAdaptiveWidth(panel, clone);
|
|
574
|
+
centerPanel(panel);
|
|
575
|
+
refreshGrabbable(body);
|
|
626
576
|
closeBtn.focus();
|
|
627
577
|
}
|
|
628
578
|
|
|
@@ -734,9 +684,7 @@ window.__ModuleLoader__.load({
|
|
|
734
684
|
exports.attachResize = attachResize;
|
|
735
685
|
exports.attachMove = attachMove;
|
|
736
686
|
exports.attachPan = attachPan;
|
|
737
|
-
exports.
|
|
738
|
-
exports.saveLayout = saveLayout;
|
|
739
|
-
exports.readSavedSize = readSavedSize;
|
|
687
|
+
exports.applyAdaptiveWidth = applyAdaptiveWidth;
|
|
740
688
|
exports.clampPanelPosition = clampPanelPosition;
|
|
741
689
|
exports.refreshGrabbable = refreshGrabbable;
|
|
742
690
|
return module.exports;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-plugin-table-zoom",
|
|
3
3
|
"description": "DSH 聊天表格浮窗插件:聊天里 markdown 表格太长(行多/超宽)看不完时,表格上方自动出现「浮窗查看」按钮,点击弹出可滚动的小浮窗完整显示表格,并支持一键复制为 Markdown。纯前端 DOM 增强,不改核心包、不注册工具、无服务端逻辑。",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"exports": {
|
package/scripts/smoke-client.mjs
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
* 3. openPopup 创建浮窗(标题含行列数、表格克隆、关闭按钮),
|
|
8
8
|
* closePopup 关闭并还原 body 滚动;
|
|
9
9
|
* 4. 表格克隆在浮窗内不会被再次增强(跳过 .dstz-popup);
|
|
10
|
-
* 5.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* 5. 右下角改尺寸手柄可拖拽改面板大小;内容溢出时正文可拖拽平移;
|
|
11
|
+
* 标题栏可拖拽移动浮窗(不越出视口);Ctrl+滚轮缩放表格字体;
|
|
12
|
+
* 每次打开都按内容自适应宽度并居中(不继承上次的尺寸/位置/缩放)。
|
|
13
13
|
*
|
|
14
14
|
* 运行:node scripts/smoke-client.mjs
|
|
15
15
|
*/
|
|
@@ -254,17 +254,7 @@ ok('copyText 写入剪贴板', async () => {
|
|
|
254
254
|
assert.equal(globalThis.__copied, '| a |\n| --- |')
|
|
255
255
|
})
|
|
256
256
|
|
|
257
|
-
// 5) 浮窗改尺寸 +
|
|
258
|
-
// 假 localStorage:验证尺寸记忆读写(真实环境缺失时各函数均已兜底)
|
|
259
|
-
const sizeStore = new Map()
|
|
260
|
-
Object.defineProperty(globalThis, 'localStorage', {
|
|
261
|
-
value: {
|
|
262
|
-
getItem: (k) => (sizeStore.has(k) ? sizeStore.get(k) : null),
|
|
263
|
-
setItem: (k, v) => { sizeStore.set(k, String(v)) },
|
|
264
|
-
removeItem: (k) => { sizeStore.delete(k) },
|
|
265
|
-
},
|
|
266
|
-
configurable: true,
|
|
267
|
-
})
|
|
257
|
+
// 5) 浮窗改尺寸 + 自适应 + 拖拽平移(无布局记忆:每次打开都自适应并居中)
|
|
268
258
|
|
|
269
259
|
ok('openPopup 挂载右下角改尺寸手柄并可拖拽', () => {
|
|
270
260
|
mod.closePopup()
|
|
@@ -275,6 +265,9 @@ ok('openPopup 挂载右下角改尺寸手柄并可拖拽', () => {
|
|
|
275
265
|
const panel = popup.children[0]
|
|
276
266
|
const handle = panel.children.find((c) => c.className === 'dstz-resizeSE')
|
|
277
267
|
assert.ok(handle !== undefined, 'resize handle not mounted')
|
|
268
|
+
// 假 DOM 无真实布局:显式给一个起始尺寸,验证拖拽按 delta 改大小
|
|
269
|
+
panel.style.width = '800px'
|
|
270
|
+
panel.style.height = '400px'
|
|
278
271
|
panel.getBoundingClientRect = () => ({
|
|
279
272
|
width: parseInt(panel.style.width, 10) || 800,
|
|
280
273
|
height: parseInt(panel.style.height, 10) || 400,
|
|
@@ -286,27 +279,28 @@ ok('openPopup 挂载右下角改尺寸手柄并可拖拽', () => {
|
|
|
286
279
|
assert.equal(panel.style.maxHeight, 'none')
|
|
287
280
|
assert.ok(popup._suppressClick === true, 'drag should suppress overlay close')
|
|
288
281
|
handle.dispatch('pointerup', {})
|
|
289
|
-
const saved = JSON.parse(sizeStore.get('dsh-plugin-table-zoom:popup-size'))
|
|
290
|
-
assert.equal(saved.w, 960)
|
|
291
|
-
assert.equal(saved.h, 460)
|
|
292
282
|
assert.ok(popup._suppressClick === false, 'suppress flag reset after drag')
|
|
293
283
|
mod.closePopup()
|
|
294
284
|
})
|
|
295
285
|
|
|
296
|
-
ok('
|
|
286
|
+
ok('每次打开不继承上次尺寸,始终按内容自适应', () => {
|
|
297
287
|
mod.closePopup()
|
|
298
288
|
const table = makeEl('table')
|
|
299
289
|
table.rows = []
|
|
300
290
|
mod.openPopup(table)
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
291
|
+
let popup = documentEl.body.children.find((c) => c.className === 'dstz-popup')
|
|
292
|
+
let panel = popup.children[0]
|
|
293
|
+
assert.equal(panel.style.width, '320px', '首次打开走自适应(假 DOM 无布局 → 下限 320)')
|
|
294
|
+
// 模拟当次手动改大
|
|
295
|
+
panel.style.width = '800px'
|
|
296
|
+
panel.style.height = '500px'
|
|
297
|
+
mod.closePopup()
|
|
298
|
+
// 重新打开:应回到自适应宽度,而不是继承 800px
|
|
299
|
+
mod.openPopup(table)
|
|
300
|
+
popup = documentEl.body.children.find((c) => c.className === 'dstz-popup')
|
|
301
|
+
panel = popup.children[0]
|
|
302
|
+
assert.equal(panel.style.width, '320px', '再次打开仍自适应,不继承上次尺寸')
|
|
303
|
+
assert.notEqual(panel.style.height, '500px')
|
|
310
304
|
mod.closePopup()
|
|
311
305
|
})
|
|
312
306
|
|
|
@@ -339,13 +333,16 @@ ok('溢出时正文可拖拽平移', () => {
|
|
|
339
333
|
|
|
340
334
|
ok('标题栏可拖拽移动浮窗(不越出视口)', () => {
|
|
341
335
|
mod.closePopup()
|
|
342
|
-
sizeStore.delete('dsh-plugin-table-zoom:popup-size') // 清掉记忆,用默认尺寸测移动
|
|
343
336
|
const table = makeEl('table')
|
|
344
337
|
table.rows = []
|
|
345
338
|
mod.openPopup(table)
|
|
346
339
|
const popup = documentEl.body.children.find((c) => c.className === 'dstz-popup')
|
|
347
340
|
const panel = popup.children[0]
|
|
348
341
|
const header = panel.children[0]
|
|
342
|
+
assert.equal(panel.style.width, '320px', '打开即自适应(假 DOM 无布局 → 下限 320)')
|
|
343
|
+
// 假 DOM 无真实布局:显式给起始位置,验证拖拽按 delta 移动
|
|
344
|
+
panel.style.left = '160px'
|
|
345
|
+
panel.style.top = '40px'
|
|
349
346
|
panel.getBoundingClientRect = () => ({
|
|
350
347
|
width: parseInt(panel.style.width, 10) || 800,
|
|
351
348
|
height: parseInt(panel.style.height, 10) || 400,
|
|
@@ -386,4 +383,19 @@ ok('Ctrl+滚轮缩放表格字体', () => {
|
|
|
386
383
|
mod.closePopup()
|
|
387
384
|
})
|
|
388
385
|
|
|
386
|
+
ok('applyAdaptiveWidth 按表格自然宽度自适应(窄表收缩、宽表铺满视口)', () => {
|
|
387
|
+
const panel = makeEl('div')
|
|
388
|
+
const clone = makeEl('table')
|
|
389
|
+
clone.offsetWidth = 500
|
|
390
|
+
mod.applyAdaptiveWidth(panel, clone)
|
|
391
|
+
assert.equal(panel.style.width, '538px')
|
|
392
|
+
// 超级大表:铺满视口可用宽度(假 DOM 视口 1280 - 留白 48 = 1232)
|
|
393
|
+
clone.offsetWidth = 3000
|
|
394
|
+
mod.applyAdaptiveWidth(panel, clone)
|
|
395
|
+
assert.equal(panel.style.width, '1232px')
|
|
396
|
+
clone.offsetWidth = 0
|
|
397
|
+
mod.applyAdaptiveWidth(panel, clone)
|
|
398
|
+
assert.equal(panel.style.width, '320px')
|
|
399
|
+
})
|
|
400
|
+
|
|
389
401
|
console.log(`[dsh-plugin-table-zoom] smoke-client: ${passed} passed`)
|
|
@@ -47,10 +47,14 @@ cordis.patch.yml 挂载一行,交 profile 的 dsh.profile.bundles 自
|
|
|
47
47
|
- 正文:独立滚动(横竖),表格克隆带 `dstz-table` 类,样式全部走主题 CSS 变量;
|
|
48
48
|
- **改尺寸**:右下角有拖拽手柄,按住可自由调整浮窗大小(最小 320×200,
|
|
49
49
|
上限为视口减去遮罩留白);
|
|
50
|
+
- **每次打开自适应**:浮窗**不记忆任何布局**——尺寸按表格自然宽度自适应
|
|
51
|
+
(下限 320,窄表不撑满、超级大表铺满视口可用宽度)、位置居中、缩放 100%;
|
|
52
|
+
手动拖拽(改大小/移动/缩放)只影响当次打开,关掉再开即回到自适应;
|
|
50
53
|
- **拖拽移动**:按住标题栏(按钮除外)可拖动浮窗位置,位置限制在视口内、
|
|
51
|
-
|
|
54
|
+
不越出页面;
|
|
52
55
|
- **Ctrl+滚轮缩放**:浮窗内按住 Ctrl 滚动滚轮可放大/缩小表格字体
|
|
53
|
-
(60%–250%,步进 10
|
|
56
|
+
(60%–250%,步进 10%),标题栏实时显示百分比;缩放不记忆,
|
|
57
|
+
每次打开都从 100% 开始;
|
|
54
58
|
- **滚动条**:正文滚动条加深加粗(WebKit 伪元素 + Firefox `scrollbar-color`),
|
|
55
59
|
浅色主题下也清晰可见;
|
|
56
60
|
- **拖拽平移**:表格内容溢出正文时,鼠标/触控笔按住表格即可左右/上下拖动
|
|
@@ -64,4 +68,4 @@ cordis.patch.yml 挂载一行,交 profile 的 dsh.profile.bundles 自
|
|
|
64
68
|
- 只认 `tableScroll` 容器内的表格;浮窗内克隆表与 image-tools lightbox 内的表格跳过;
|
|
65
69
|
- 不提供服务端工具/路由/配置;无 React 依赖(零运行时依赖);
|
|
66
70
|
- 复制为 Markdown 优先 clipboard API,失败时 execCommand 兜底;
|
|
67
|
-
-
|
|
71
|
+
- 不写 localStorage:浮窗布局(尺寸/位置/缩放)不跨次记忆,每次打开都自适应。
|