flexdesk 0.6.0 → 0.6.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/README.md +33 -0
- package/css/base.css +33 -0
- package/css/flexdesk.css +33 -0
- package/dist/charts.js +2 -2
- package/dist/{chunk-KH2GJTKR.js → chunk-IYV5JVYB.js} +29 -1
- package/dist/chunk-IYV5JVYB.js.map +7 -0
- package/dist/{chunk-CNXP3SIN.js → chunk-ZMCRDOCF.js} +2 -2
- package/dist/flexdesk.css +33 -0
- package/dist/flow.js +1 -1
- package/dist/tiles.js +2 -2
- package/dist/widgets.js +81 -1
- package/dist/widgets.js.map +3 -3
- package/package.json +1 -1
- package/src/ui/components/data_table.js +40 -0
- package/src/ui/utils/scroll_lock.js +111 -0
- package/dist/chunk-KH2GJTKR.js.map +0 -7
- /package/dist/{chunk-CNXP3SIN.js.map → chunk-ZMCRDOCF.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DataTable,
|
|
3
3
|
createRafResizeObserver
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-IYV5JVYB.js";
|
|
5
5
|
import {
|
|
6
6
|
ManagedWindow
|
|
7
7
|
} from "./chunk-6JSOVNID.js";
|
|
@@ -2370,4 +2370,4 @@ export {
|
|
|
2370
2370
|
openPlotPopoutWindow,
|
|
2371
2371
|
openRawTracesWindow
|
|
2372
2372
|
};
|
|
2373
|
-
//# sourceMappingURL=chunk-
|
|
2373
|
+
//# sourceMappingURL=chunk-ZMCRDOCF.js.map
|
package/dist/flexdesk.css
CHANGED
|
@@ -713,6 +713,39 @@ body.twm-dt-col-resizing {
|
|
|
713
713
|
color: var(--text-dim, #666);
|
|
714
714
|
font-style: italic;
|
|
715
715
|
}
|
|
716
|
+
/* 0.6.1 `diff` — one side of a comparison. A row that is NEW on this side is
|
|
717
|
+
* green, one that is GONE on this side red, a changed row carries an amber
|
|
718
|
+
* left edge and its changed cells an amber fill, and a GAP — the place a row
|
|
719
|
+
* holds on the other side — is hatched, so the eye reads it as "nothing here"
|
|
720
|
+
* rather than as an empty row. (0,3,2) and up, for `twm-dt-cell--null`'s
|
|
721
|
+
* reason above; a selected row keeps its own colour (`:not(.selected)`). */
|
|
722
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--added:not(.selected) > td {
|
|
723
|
+
background: color-mix(in srgb, var(--color-success, #3fb950) 16%, transparent);
|
|
724
|
+
}
|
|
725
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--removed:not(.selected) > td {
|
|
726
|
+
background: color-mix(in srgb, var(--color-danger, #c74e4e) 18%, transparent);
|
|
727
|
+
}
|
|
728
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--removed > td {
|
|
729
|
+
text-decoration: line-through;
|
|
730
|
+
text-decoration-color: color-mix(in srgb, var(--color-danger, #c74e4e) 70%, transparent);
|
|
731
|
+
}
|
|
732
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--added > td:first-child {
|
|
733
|
+
box-shadow: inset 3px 0 0 0 var(--color-success, #3fb950);
|
|
734
|
+
}
|
|
735
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--removed > td:first-child {
|
|
736
|
+
box-shadow: inset 3px 0 0 0 var(--color-danger, #c74e4e);
|
|
737
|
+
}
|
|
738
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--changed > td:first-child {
|
|
739
|
+
box-shadow: inset 3px 0 0 0 var(--color-warning, #ff9800);
|
|
740
|
+
}
|
|
741
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff:not(.selected) > td.twm-dt-diff__cell--changed {
|
|
742
|
+
background: color-mix(in srgb, var(--color-warning, #ff9800) 22%, transparent);
|
|
743
|
+
}
|
|
744
|
+
.twm-data-table-component .twm-preview-table tbody tr.twm-dt-diff--gap > td.twm-dt-diff__gap {
|
|
745
|
+
background: repeating-linear-gradient(135deg,
|
|
746
|
+
transparent 0 6px,
|
|
747
|
+
color-mix(in srgb, var(--text-muted, #888) 14%, transparent) 6px 7px);
|
|
748
|
+
}
|
|
716
749
|
/* `emptyState` and `setError` with no rows: the box's own words, which may
|
|
717
750
|
* wrap — muted for an empty state, red for a failure, in both densities. Quiet
|
|
718
751
|
* while loading — an empty table that is still loading is not empty. */
|
package/dist/flow.js
CHANGED
package/dist/tiles.js
CHANGED
|
@@ -16,8 +16,8 @@ import {
|
|
|
16
16
|
} from "./chunk-O5OHMWBB.js";
|
|
17
17
|
import {
|
|
18
18
|
openRawTracesWindow
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import "./chunk-
|
|
19
|
+
} from "./chunk-ZMCRDOCF.js";
|
|
20
|
+
import "./chunk-IYV5JVYB.js";
|
|
21
21
|
import "./chunk-6JSOVNID.js";
|
|
22
22
|
import "./chunk-FL5KFNQH.js";
|
|
23
23
|
import {
|
package/dist/widgets.js
CHANGED
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
parseDatePeriod,
|
|
33
33
|
parseDateValue,
|
|
34
34
|
parseDuration
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-IYV5JVYB.js";
|
|
36
36
|
import {
|
|
37
37
|
ManagedWindow,
|
|
38
38
|
ROW_CONTROL_SELECTOR,
|
|
@@ -5488,6 +5488,85 @@ function installTabsScrollbars(selectors = [".tabs"]) {
|
|
|
5488
5488
|
return () => observer.disconnect();
|
|
5489
5489
|
}
|
|
5490
5490
|
|
|
5491
|
+
// src/ui/utils/scroll_lock.js
|
|
5492
|
+
function createScrollLock({ axis = "y", enabled = true } = {}) {
|
|
5493
|
+
const doY = axis === "y" || axis === "both";
|
|
5494
|
+
const doX = axis === "x" || axis === "both";
|
|
5495
|
+
const members = /* @__PURE__ */ new Map();
|
|
5496
|
+
let last = { top: 0, left: 0 };
|
|
5497
|
+
let on = !!enabled;
|
|
5498
|
+
function copyFrom(source) {
|
|
5499
|
+
last = { top: source.scrollTop, left: source.scrollLeft };
|
|
5500
|
+
if (!on) return;
|
|
5501
|
+
for (const [el, state] of members) {
|
|
5502
|
+
if (el === source) continue;
|
|
5503
|
+
const top = doY ? last.top : el.scrollTop;
|
|
5504
|
+
const left = doX ? last.left : el.scrollLeft;
|
|
5505
|
+
if (el.scrollTop === top && el.scrollLeft === left) continue;
|
|
5506
|
+
state.wrote = { top, left };
|
|
5507
|
+
if (doY) el.scrollTop = top;
|
|
5508
|
+
if (doX) el.scrollLeft = left;
|
|
5509
|
+
}
|
|
5510
|
+
}
|
|
5511
|
+
function onScroll(event) {
|
|
5512
|
+
const el = event.currentTarget;
|
|
5513
|
+
const state = members.get(el);
|
|
5514
|
+
if (!state) return;
|
|
5515
|
+
const wrote = state.wrote;
|
|
5516
|
+
state.wrote = null;
|
|
5517
|
+
if (wrote && Math.abs(el.scrollTop - wrote.top) < 1 && Math.abs(el.scrollLeft - wrote.left) < 1) return;
|
|
5518
|
+
copyFrom(el);
|
|
5519
|
+
}
|
|
5520
|
+
const lock = {
|
|
5521
|
+
/** Join the group. Returns the function that leaves it. */
|
|
5522
|
+
attach(el) {
|
|
5523
|
+
if (!el || typeof el.addEventListener !== "function") return () => {
|
|
5524
|
+
};
|
|
5525
|
+
if (members.has(el)) return () => lock.detach(el);
|
|
5526
|
+
const state = { wrote: null };
|
|
5527
|
+
members.set(el, state);
|
|
5528
|
+
el.addEventListener("scroll", onScroll, { passive: true });
|
|
5529
|
+
if (on && (last.top || last.left)) {
|
|
5530
|
+
state.wrote = {
|
|
5531
|
+
top: doY ? last.top : el.scrollTop,
|
|
5532
|
+
left: doX ? last.left : el.scrollLeft
|
|
5533
|
+
};
|
|
5534
|
+
if (doY) el.scrollTop = last.top;
|
|
5535
|
+
if (doX) el.scrollLeft = last.left;
|
|
5536
|
+
}
|
|
5537
|
+
return () => lock.detach(el);
|
|
5538
|
+
},
|
|
5539
|
+
detach(el) {
|
|
5540
|
+
if (!members.has(el)) return;
|
|
5541
|
+
members.delete(el);
|
|
5542
|
+
el.removeEventListener("scroll", onScroll);
|
|
5543
|
+
},
|
|
5544
|
+
/** Lock (true) or let the members scroll freely (false). Locking again
|
|
5545
|
+
* brings every member level with the one scrolled last. */
|
|
5546
|
+
setEnabled(value) {
|
|
5547
|
+
const was = on;
|
|
5548
|
+
on = !!value;
|
|
5549
|
+
if (on && !was) {
|
|
5550
|
+
const source = [...members.keys()].find(
|
|
5551
|
+
(el) => el.scrollTop === last.top && el.scrollLeft === last.left
|
|
5552
|
+
) || members.keys().next().value;
|
|
5553
|
+
if (source) copyFrom(source);
|
|
5554
|
+
}
|
|
5555
|
+
},
|
|
5556
|
+
get enabled() {
|
|
5557
|
+
return on;
|
|
5558
|
+
},
|
|
5559
|
+
/** How many boxes are in the group (for a consumer's own checks). */
|
|
5560
|
+
get size() {
|
|
5561
|
+
return members.size;
|
|
5562
|
+
},
|
|
5563
|
+
dispose() {
|
|
5564
|
+
for (const el of [...members.keys()]) lock.detach(el);
|
|
5565
|
+
}
|
|
5566
|
+
};
|
|
5567
|
+
return lock;
|
|
5568
|
+
}
|
|
5569
|
+
|
|
5491
5570
|
// src/ui/utils/tooltip_service.js
|
|
5492
5571
|
var tooltipElement = null;
|
|
5493
5572
|
var currentTarget = null;
|
|
@@ -5767,6 +5846,7 @@ export {
|
|
|
5767
5846
|
attachInlineRenamer,
|
|
5768
5847
|
createDetailHeader,
|
|
5769
5848
|
createRafResizeObserver,
|
|
5849
|
+
createScrollLock,
|
|
5770
5850
|
createTableStateStore,
|
|
5771
5851
|
createTreeCategory,
|
|
5772
5852
|
createTreeItem,
|