flexdesk 0.4.4 → 0.4.6

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/dist/widgets.js CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  import {
22
22
  DataTable,
23
23
  createRafResizeObserver
24
- } from "./chunk-P4AALM3A.js";
24
+ } from "./chunk-CYTWMP2Y.js";
25
25
  import {
26
26
  ManagedWindow
27
27
  } from "./chunk-LH5TSOZW.js";
@@ -4847,6 +4847,233 @@ var NotificationCenter = class _NotificationCenter extends ComponentBase {
4847
4847
  };
4848
4848
  NotificationCenter.SEVERITIES = SEVERITIES;
4849
4849
 
4850
+ // src/ui/utils/auto_scrollbars.js
4851
+ var LAYER_ID = "twm-autoscroll-layer";
4852
+ var ROOT_CLASS = "twm-autoscroll";
4853
+ var HIDE_AFTER_MS = 900;
4854
+ var MIN_THUMB = 30;
4855
+ var BAR = 6;
4856
+ function thumbGeometry(scrollSize, clientSize, scrollPos, trackLen) {
4857
+ const max = scrollSize - clientSize;
4858
+ if (!(max > 1) || !(trackLen > 0)) return null;
4859
+ const size = Math.min(trackLen, Math.max(MIN_THUMB, trackLen * clientSize / scrollSize));
4860
+ const pos = (trackLen - size) * Math.min(1, Math.max(0, scrollPos / max));
4861
+ return { size, pos };
4862
+ }
4863
+ function scrollsOn(el, axis) {
4864
+ if (!(el instanceof Element)) return false;
4865
+ const cs = getComputedStyle(el);
4866
+ const overflow = axis === "y" ? cs.overflowY : cs.overflowX;
4867
+ if (overflow !== "auto" && overflow !== "scroll" && !(el.tagName === "TEXTAREA" && overflow !== "hidden")) return false;
4868
+ return axis === "y" ? el.scrollHeight - el.clientHeight > 1 : el.scrollWidth - el.clientWidth > 1;
4869
+ }
4870
+ function installAutoScrollbars(root = document.body, { exclude = null } = {}) {
4871
+ const doc = root.ownerDocument || document;
4872
+ const win = doc.defaultView || window;
4873
+ root.classList.add(ROOT_CLASS);
4874
+ let layer = doc.getElementById(LAYER_ID);
4875
+ if (!layer) {
4876
+ layer = doc.createElement("div");
4877
+ layer.id = LAYER_ID;
4878
+ layer.className = "twm-autoscroll-layer";
4879
+ doc.body.appendChild(layer);
4880
+ }
4881
+ const managed = /* @__PURE__ */ new Map();
4882
+ let hoverChain = /* @__PURE__ */ new Set();
4883
+ const eligible = (el) => el instanceof Element && root.contains(el) && !el.__overlayScrollbarInstalled && !el.closest?.(".twm-autoscroll-layer") && !(exclude && exclude(el));
4884
+ const makeBar = (el, axis) => {
4885
+ const bar = doc.createElement("div");
4886
+ bar.className = `twm-autoscroll-bar twm-autoscroll-bar--${axis}`;
4887
+ const thumb = doc.createElement("div");
4888
+ thumb.className = "twm-autoscroll-thumb";
4889
+ bar.appendChild(thumb);
4890
+ layer.appendChild(bar);
4891
+ bar.addEventListener("mousedown", (e) => {
4892
+ if (e.target !== bar) return;
4893
+ e.preventDefault();
4894
+ const r = thumb.getBoundingClientRect();
4895
+ const before = axis === "y" ? e.clientY < r.top : e.clientX < r.left;
4896
+ const page = (axis === "y" ? el.clientHeight : el.clientWidth) * 0.9;
4897
+ if (axis === "y") el.scrollTop += before ? -page : page;
4898
+ else el.scrollLeft += before ? -page : page;
4899
+ });
4900
+ thumb.addEventListener("mousedown", (e) => {
4901
+ e.preventDefault();
4902
+ e.stopPropagation();
4903
+ const rec = managed.get(el);
4904
+ if (rec) rec.dragging = true;
4905
+ const start = axis === "y" ? e.clientY : e.clientX;
4906
+ const startScroll = axis === "y" ? el.scrollTop : el.scrollLeft;
4907
+ const trackLen = axis === "y" ? bar.getBoundingClientRect().height : bar.getBoundingClientRect().width;
4908
+ const thumbLen = axis === "y" ? thumb.getBoundingClientRect().height : thumb.getBoundingClientRect().width;
4909
+ const max = axis === "y" ? el.scrollHeight - el.clientHeight : el.scrollWidth - el.clientWidth;
4910
+ const perPx = trackLen > thumbLen ? max / (trackLen - thumbLen) : 0;
4911
+ bar.classList.add("twm-autoscroll-bar--active");
4912
+ const move = (mv) => {
4913
+ const d = (axis === "y" ? mv.clientY : mv.clientX) - start;
4914
+ if (axis === "y") el.scrollTop = startScroll + d * perPx;
4915
+ else el.scrollLeft = startScroll + d * perPx;
4916
+ };
4917
+ const up = () => {
4918
+ doc.removeEventListener("mousemove", move);
4919
+ doc.removeEventListener("mouseup", up);
4920
+ bar.classList.remove("twm-autoscroll-bar--active");
4921
+ if (rec) rec.dragging = false;
4922
+ hideLater(el);
4923
+ };
4924
+ doc.addEventListener("mousemove", move);
4925
+ doc.addEventListener("mouseup", up);
4926
+ });
4927
+ bar.addEventListener("mouseenter", () => {
4928
+ const rec = managed.get(el);
4929
+ if (rec) {
4930
+ rec.onBar = true;
4931
+ show(el);
4932
+ }
4933
+ });
4934
+ bar.addEventListener("mouseleave", () => {
4935
+ const rec = managed.get(el);
4936
+ if (rec) {
4937
+ rec.onBar = false;
4938
+ hideLater(el);
4939
+ }
4940
+ });
4941
+ return { bar, thumb };
4942
+ };
4943
+ const record = (el) => {
4944
+ let rec = managed.get(el);
4945
+ if (!rec) {
4946
+ rec = { v: null, h: null, timer: 0, dragging: false, onBar: false };
4947
+ managed.set(el, rec);
4948
+ }
4949
+ return rec;
4950
+ };
4951
+ const place = (el) => {
4952
+ const rec = managed.get(el);
4953
+ if (!rec) return;
4954
+ if (!el.isConnected) {
4955
+ drop(el);
4956
+ return;
4957
+ }
4958
+ const r = el.getBoundingClientRect();
4959
+ const vw = win.innerWidth;
4960
+ const vh = win.innerHeight;
4961
+ const top = Math.max(0, r.top);
4962
+ const left = Math.max(0, r.left);
4963
+ const bottom = Math.min(vh, r.bottom);
4964
+ const right = Math.min(vw, r.right);
4965
+ const z = el.offsetHeight ? r.height / el.offsetHeight : 1;
4966
+ for (const axis of ["y", "x"]) {
4967
+ const key = axis === "y" ? "v" : "h";
4968
+ const overflows = scrollsOn(el, axis);
4969
+ if (!overflows) {
4970
+ if (rec[key]) rec[key].bar.style.display = "none";
4971
+ continue;
4972
+ }
4973
+ if (!rec[key]) rec[key] = makeBar(el, axis);
4974
+ const { bar, thumb } = rec[key];
4975
+ bar.style.display = "";
4976
+ if (axis === "y") {
4977
+ const len = bottom - top;
4978
+ Object.assign(bar.style, { top: `${top}px`, left: `${right - BAR - 1}px`, height: `${len}px`, width: `${BAR}px` });
4979
+ const g = thumbGeometry(el.scrollHeight * z, el.clientHeight * z, el.scrollTop * z, len);
4980
+ if (!g) {
4981
+ bar.style.display = "none";
4982
+ continue;
4983
+ }
4984
+ Object.assign(thumb.style, { top: `${g.pos}px`, height: `${g.size}px`, left: "0", width: "100%" });
4985
+ } else {
4986
+ const len = right - left;
4987
+ Object.assign(bar.style, { left: `${left}px`, top: `${bottom - BAR - 1}px`, width: `${len}px`, height: `${BAR}px` });
4988
+ const g = thumbGeometry(el.scrollWidth * z, el.clientWidth * z, el.scrollLeft * z, len);
4989
+ if (!g) {
4990
+ bar.style.display = "none";
4991
+ continue;
4992
+ }
4993
+ Object.assign(thumb.style, { left: `${g.pos}px`, width: `${g.size}px`, top: "0", height: "100%" });
4994
+ }
4995
+ }
4996
+ };
4997
+ const setVisible = (el, on) => {
4998
+ const rec = managed.get(el);
4999
+ if (!rec) return;
5000
+ for (const b of [rec.v, rec.h]) if (b) b.bar.classList.toggle("twm-autoscroll-bar--on", on);
5001
+ };
5002
+ const show = (el) => {
5003
+ const rec = record(el);
5004
+ clearTimeout(rec.timer);
5005
+ place(el);
5006
+ setVisible(el, true);
5007
+ };
5008
+ const hideLater = (el) => {
5009
+ const rec = managed.get(el);
5010
+ if (!rec) return;
5011
+ clearTimeout(rec.timer);
5012
+ rec.timer = setTimeout(() => {
5013
+ if (rec.dragging || rec.onBar || hoverChain.has(el)) return;
5014
+ setVisible(el, false);
5015
+ }, HIDE_AFTER_MS);
5016
+ };
5017
+ const drop = (el) => {
5018
+ const rec = managed.get(el);
5019
+ if (!rec) return;
5020
+ clearTimeout(rec.timer);
5021
+ rec.v?.bar.remove();
5022
+ rec.h?.bar.remove();
5023
+ managed.delete(el);
5024
+ };
5025
+ const scrollChain = (target) => {
5026
+ const out = /* @__PURE__ */ new Set();
5027
+ for (let el = target instanceof Element ? target : target?.parentElement; el && el !== doc.documentElement; el = el.parentElement) {
5028
+ if (el.closest?.(".twm-autoscroll-layer")) return out;
5029
+ if (eligible(el) && (scrollsOn(el, "y") || scrollsOn(el, "x"))) out.add(el);
5030
+ if (el === root) break;
5031
+ }
5032
+ return out;
5033
+ };
5034
+ const onOver = (e) => {
5035
+ if (e.target?.closest?.(".twm-autoscroll-layer")) return;
5036
+ const next = scrollChain(e.target);
5037
+ for (const el of hoverChain) if (!next.has(el)) hideLater(el);
5038
+ for (const el of next) show(el);
5039
+ hoverChain = next;
5040
+ };
5041
+ const onLeaveWindow = (e) => {
5042
+ if (e.relatedTarget) return;
5043
+ for (const el of hoverChain) hideLater(el);
5044
+ hoverChain = /* @__PURE__ */ new Set();
5045
+ };
5046
+ const onScroll = (e) => {
5047
+ const el = e.target === doc ? null : e.target;
5048
+ if (el && eligible(el)) {
5049
+ show(el);
5050
+ hideLater(el);
5051
+ }
5052
+ for (const other of managed.keys()) if (other !== el) place(other);
5053
+ };
5054
+ let raf = 0;
5055
+ const onResize = () => {
5056
+ cancelAnimationFrame(raf);
5057
+ raf = requestAnimationFrame(() => {
5058
+ for (const el of managed.keys()) place(el);
5059
+ });
5060
+ };
5061
+ doc.addEventListener("mouseover", onOver, true);
5062
+ doc.addEventListener("mouseout", onLeaveWindow, true);
5063
+ doc.addEventListener("scroll", onScroll, true);
5064
+ win.addEventListener("resize", onResize);
5065
+ return {
5066
+ dispose() {
5067
+ doc.removeEventListener("mouseover", onOver, true);
5068
+ doc.removeEventListener("mouseout", onLeaveWindow, true);
5069
+ doc.removeEventListener("scroll", onScroll, true);
5070
+ win.removeEventListener("resize", onResize);
5071
+ for (const el of [...managed.keys()]) drop(el);
5072
+ root.classList.remove(ROOT_CLASS);
5073
+ }
5074
+ };
5075
+ }
5076
+
4850
5077
  // src/ui/utils/overlay_scrollbar.js
4851
5078
  function normalizeOrientation(value) {
4852
5079
  return String(value || "horizontal").toLowerCase() === "vertical" ? "vertical" : "horizontal";
@@ -5532,6 +5759,7 @@ export {
5532
5759
  helpCopy,
5533
5760
  helpProvider,
5534
5761
  hideContextMenu,
5762
+ installAutoScrollbars,
5535
5763
  installCollapsibleScrollbars,
5536
5764
  installOverlayScrollbar,
5537
5765
  installTabsScrollbars,
@@ -5556,6 +5784,7 @@ export {
5556
5784
  showDeleteConfirmDialog,
5557
5785
  showRunProgressDialog,
5558
5786
  showSelectDialog,
5787
+ thumbGeometry,
5559
5788
  toastError,
5560
5789
  toastInfo,
5561
5790
  toastSuccess,