flexdesk 0.6.0 → 0.6.2

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.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DataTable,
3
3
  createRafResizeObserver
4
- } from "./chunk-KH2GJTKR.js";
4
+ } from "./chunk-CPYBQN3Q.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-CNXP3SIN.js.map
2373
+ //# sourceMappingURL=chunk-XYUZF5CD.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. */
@@ -1713,6 +1746,49 @@ body.twm-window-maximized .twm-resize-handle {
1713
1746
  opacity: 0.3;
1714
1747
  cursor: not-allowed;
1715
1748
  }
1749
+ /* `paging` — the strip UNDER a paged or scrolling DataTable's body: which rows
1750
+ * are held, the page buttons or Load all, why a large source is paged, and the
1751
+ * Pages / Scroll switch. */
1752
+ .twm-dt-paging {
1753
+ display: flex;
1754
+ align-items: center;
1755
+ gap: var(--space-md);
1756
+ flex: 0 0 auto;
1757
+ min-width: 0;
1758
+ padding: var(--space-xs) var(--space-md);
1759
+ border-top: 1px solid var(--border-subtle);
1760
+ font-size: var(--font-size-sm);
1761
+ color: var(--text-muted);
1762
+ white-space: nowrap;
1763
+ overflow: hidden;
1764
+ }
1765
+ .twm-dt-paging__info { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
1766
+ .twm-dt-paging__spacer { flex: 1 1 auto; }
1767
+ .twm-dt-paging__nav { display: inline-flex; align-items: center; gap: var(--space-xs); }
1768
+ .twm-dt-paging__page { min-width: 72px; text-align: center; }
1769
+ .twm-dt-paging .twm-pagination-btn { height: 20px; min-width: 22px; }
1770
+ .twm-dt-paging__note { color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; }
1771
+ .twm-dt-paging__all,
1772
+ .twm-dt-paging__mode {
1773
+ height: 20px;
1774
+ padding: 0 var(--space-md);
1775
+ background: transparent;
1776
+ border: 1px solid var(--border-default);
1777
+ border-radius: var(--radius-sm);
1778
+ color: var(--text-body);
1779
+ font: inherit;
1780
+ cursor: pointer;
1781
+ }
1782
+ .twm-dt-paging__all:hover:not(:disabled),
1783
+ .twm-dt-paging__mode:hover:not(:disabled) { border-color: var(--accent); color: var(--text-bright); }
1784
+ .twm-dt-paging__modes { display: inline-flex; }
1785
+ .twm-dt-paging__mode { border-radius: 0; }
1786
+ .twm-dt-paging__mode:first-child { border-radius: var(--radius-sm) 0 0 var(--radius-sm); }
1787
+ .twm-dt-paging__mode:last-child { border-radius: 0 var(--radius-sm) var(--radius-sm) 0; margin-left: -1px; }
1788
+ .twm-dt-paging__mode[aria-pressed="true"] { background: var(--accent); border-color: var(--accent); color: var(--text-bright); }
1789
+ .twm-dt-paging__all:disabled,
1790
+ .twm-dt-paging__mode:disabled { opacity: 0.45; cursor: not-allowed; }
1791
+ .twm-dt-paging__mode[aria-pressed="true"]:disabled { opacity: 1; cursor: default; }
1716
1792
  /* Preview Table Styles - Essential for data view */
1717
1793
  .twm-preview-table-wrap {
1718
1794
  overflow: auto;
package/dist/flow.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-6NG7YVBG.js";
4
4
  import {
5
5
  DataTable
6
- } from "./chunk-KH2GJTKR.js";
6
+ } from "./chunk-CPYBQN3Q.js";
7
7
  import "./chunk-6JSOVNID.js";
8
8
  import "./chunk-FL5KFNQH.js";
9
9
  import {
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-CNXP3SIN.js";
20
- import "./chunk-KH2GJTKR.js";
19
+ } from "./chunk-XYUZF5CD.js";
20
+ import "./chunk-CPYBQN3Q.js";
21
21
  import "./chunk-6JSOVNID.js";
22
22
  import "./chunk-FL5KFNQH.js";
23
23
  import {
package/dist/widgets.js CHANGED
@@ -24,6 +24,8 @@ import {
24
24
  DataTable,
25
25
  ISO_DATE,
26
26
  ISO_DATETIME,
27
+ PAGING_HARD_LIMIT,
28
+ PAGING_SOFT_LIMIT,
27
29
  createRafResizeObserver,
28
30
  formatDate,
29
31
  formatDuration,
@@ -31,8 +33,9 @@ import {
31
33
  matchDurationFilter,
32
34
  parseDatePeriod,
33
35
  parseDateValue,
34
- parseDuration
35
- } from "./chunk-KH2GJTKR.js";
36
+ parseDuration,
37
+ resolvePaging
38
+ } from "./chunk-CPYBQN3Q.js";
36
39
  import {
37
40
  ManagedWindow,
38
41
  ROW_CONTROL_SELECTOR,
@@ -5488,6 +5491,85 @@ function installTabsScrollbars(selectors = [".tabs"]) {
5488
5491
  return () => observer.disconnect();
5489
5492
  }
5490
5493
 
5494
+ // src/ui/utils/scroll_lock.js
5495
+ function createScrollLock({ axis = "y", enabled = true } = {}) {
5496
+ const doY = axis === "y" || axis === "both";
5497
+ const doX = axis === "x" || axis === "both";
5498
+ const members = /* @__PURE__ */ new Map();
5499
+ let last = { top: 0, left: 0 };
5500
+ let on = !!enabled;
5501
+ function copyFrom(source) {
5502
+ last = { top: source.scrollTop, left: source.scrollLeft };
5503
+ if (!on) return;
5504
+ for (const [el, state] of members) {
5505
+ if (el === source) continue;
5506
+ const top = doY ? last.top : el.scrollTop;
5507
+ const left = doX ? last.left : el.scrollLeft;
5508
+ if (el.scrollTop === top && el.scrollLeft === left) continue;
5509
+ state.wrote = { top, left };
5510
+ if (doY) el.scrollTop = top;
5511
+ if (doX) el.scrollLeft = left;
5512
+ }
5513
+ }
5514
+ function onScroll(event) {
5515
+ const el = event.currentTarget;
5516
+ const state = members.get(el);
5517
+ if (!state) return;
5518
+ const wrote = state.wrote;
5519
+ state.wrote = null;
5520
+ if (wrote && Math.abs(el.scrollTop - wrote.top) < 1 && Math.abs(el.scrollLeft - wrote.left) < 1) return;
5521
+ copyFrom(el);
5522
+ }
5523
+ const lock = {
5524
+ /** Join the group. Returns the function that leaves it. */
5525
+ attach(el) {
5526
+ if (!el || typeof el.addEventListener !== "function") return () => {
5527
+ };
5528
+ if (members.has(el)) return () => lock.detach(el);
5529
+ const state = { wrote: null };
5530
+ members.set(el, state);
5531
+ el.addEventListener("scroll", onScroll, { passive: true });
5532
+ if (on && (last.top || last.left)) {
5533
+ state.wrote = {
5534
+ top: doY ? last.top : el.scrollTop,
5535
+ left: doX ? last.left : el.scrollLeft
5536
+ };
5537
+ if (doY) el.scrollTop = last.top;
5538
+ if (doX) el.scrollLeft = last.left;
5539
+ }
5540
+ return () => lock.detach(el);
5541
+ },
5542
+ detach(el) {
5543
+ if (!members.has(el)) return;
5544
+ members.delete(el);
5545
+ el.removeEventListener("scroll", onScroll);
5546
+ },
5547
+ /** Lock (true) or let the members scroll freely (false). Locking again
5548
+ * brings every member level with the one scrolled last. */
5549
+ setEnabled(value) {
5550
+ const was = on;
5551
+ on = !!value;
5552
+ if (on && !was) {
5553
+ const source = [...members.keys()].find(
5554
+ (el) => el.scrollTop === last.top && el.scrollLeft === last.left
5555
+ ) || members.keys().next().value;
5556
+ if (source) copyFrom(source);
5557
+ }
5558
+ },
5559
+ get enabled() {
5560
+ return on;
5561
+ },
5562
+ /** How many boxes are in the group (for a consumer's own checks). */
5563
+ get size() {
5564
+ return members.size;
5565
+ },
5566
+ dispose() {
5567
+ for (const el of [...members.keys()]) lock.detach(el);
5568
+ }
5569
+ };
5570
+ return lock;
5571
+ }
5572
+
5491
5573
  // src/ui/utils/tooltip_service.js
5492
5574
  var tooltipElement = null;
5493
5575
  var currentTarget = null;
@@ -5751,6 +5833,8 @@ export {
5751
5833
  ManagedWindow,
5752
5834
  NotificationCenter,
5753
5835
  NotificationHistory,
5836
+ PAGING_HARD_LIMIT,
5837
+ PAGING_SOFT_LIMIT,
5754
5838
  PANEL_STATES,
5755
5839
  PANEL_TRANSITIONS,
5756
5840
  PageBase,
@@ -5767,6 +5851,7 @@ export {
5767
5851
  attachInlineRenamer,
5768
5852
  createDetailHeader,
5769
5853
  createRafResizeObserver,
5854
+ createScrollLock,
5770
5855
  createTableStateStore,
5771
5856
  createTreeCategory,
5772
5857
  createTreeItem,
@@ -5800,6 +5885,7 @@ export {
5800
5885
  parseDuration,
5801
5886
  refTypesFor,
5802
5887
  reportBridgeError,
5888
+ resolvePaging,
5803
5889
  selectItem,
5804
5890
  setHelpProvider,
5805
5891
  setModalHost,