urfu-ui-kit-react 2.1.4 → 2.1.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.
Files changed (195) hide show
  1. package/dist/components/Accordion/Accordion.d.ts +1 -1
  2. package/dist/components/Accordion/Accordion.d.ts.map +1 -1
  3. package/dist/components/Accordion/Accordion.js +9 -8
  4. package/dist/components/Accordion/Accordion.types.d.ts +2 -0
  5. package/dist/components/Accordion/Accordion.types.d.ts.map +1 -1
  6. package/dist/components/BreadCrumbs/BreadCrumbs.d.ts.map +1 -1
  7. package/dist/components/BreadCrumbs/BreadCrumbs.js +20 -19
  8. package/dist/components/Calendar/Calendar.d.ts.map +1 -1
  9. package/dist/components/Calendar/Calendar.js +145 -144
  10. package/dist/components/Calendar/Calendar.types.d.ts +9 -4
  11. package/dist/components/Calendar/Calendar.types.d.ts.map +1 -1
  12. package/dist/components/Card/Card.d.ts.map +1 -1
  13. package/dist/components/Card/Card.js +37 -31
  14. package/dist/components/ColumnSettings/ColumnSettings.d.ts.map +1 -1
  15. package/dist/components/ColumnSettings/ColumnSettings.js +72 -72
  16. package/dist/components/Drawer/Drawer.d.ts +11 -0
  17. package/dist/components/Drawer/Drawer.d.ts.map +1 -0
  18. package/dist/components/Drawer/Drawer.js +87 -0
  19. package/dist/components/Drawer/Drawer.types.d.ts +44 -0
  20. package/dist/components/Drawer/Drawer.types.d.ts.map +1 -0
  21. package/dist/components/ErrorScreen/ErrorScreen.d.ts.map +1 -1
  22. package/dist/components/ErrorScreen/ErrorScreen.js +172 -138
  23. package/dist/components/FormField/FormField.d.ts +1 -1
  24. package/dist/components/FormField/FormField.d.ts.map +1 -1
  25. package/dist/components/FormField/FormField.js +42 -29
  26. package/dist/components/FormField/FormField.types.d.ts +6 -0
  27. package/dist/components/FormField/FormField.types.d.ts.map +1 -1
  28. package/dist/components/InfiniteScroll/InfiniteScroll.d.ts +22 -0
  29. package/dist/components/InfiniteScroll/InfiniteScroll.d.ts.map +1 -0
  30. package/dist/components/InfiniteScroll/InfiniteScroll.js +27 -0
  31. package/dist/components/InputText/InputText.d.ts +39 -2
  32. package/dist/components/InputText/InputText.d.ts.map +1 -1
  33. package/dist/components/InputText/InputText.js +103 -94
  34. package/dist/components/InputText/InputText.types.d.ts +11 -0
  35. package/dist/components/InputText/InputText.types.d.ts.map +1 -1
  36. package/dist/components/InputTime/inputTimeKeyDown.d.ts +17 -2
  37. package/dist/components/InputTime/inputTimeKeyDown.d.ts.map +1 -1
  38. package/dist/components/InputTime/useInputTimeWheel.d.ts +13 -1
  39. package/dist/components/InputTime/useInputTimeWheel.d.ts.map +1 -1
  40. package/dist/components/Menu/Menu.d.ts.map +1 -1
  41. package/dist/components/Menu/Menu.js +54 -49
  42. package/dist/components/Modal/Modal.d.ts.map +1 -1
  43. package/dist/components/Modal/Modal.js +52 -49
  44. package/dist/components/Modal/Modal.types.d.ts +4 -2
  45. package/dist/components/Modal/Modal.types.d.ts.map +1 -1
  46. package/dist/components/Notification/Notification.d.ts.map +1 -1
  47. package/dist/components/Notification/Notification.js +97 -86
  48. package/dist/components/OfflineBanner/OfflineBanner.d.ts.map +1 -1
  49. package/dist/components/OfflineBanner/OfflineBanner.js +40 -32
  50. package/dist/components/Pagination/Pagination.d.ts.map +1 -1
  51. package/dist/components/Pagination/Pagination.js +61 -66
  52. package/dist/components/SearchSelect/SearchSelect.d.ts.map +1 -1
  53. package/dist/components/SearchSelect/SearchSelect.js +137 -134
  54. package/dist/components/TabPanels/TabPanels.d.ts +13 -0
  55. package/dist/components/TabPanels/TabPanels.d.ts.map +1 -0
  56. package/dist/components/TabPanels/TabPanels.js +8 -0
  57. package/dist/components/Table/Filter/Filter.d.ts.map +1 -1
  58. package/dist/components/Table/Filter/Filter.js +47 -47
  59. package/dist/components/Table/Filter/Filter.types.d.ts +2 -1
  60. package/dist/components/Table/Filter/Filter.types.d.ts.map +1 -1
  61. package/dist/components/Table/Filter/SelectFilter.d.ts.map +1 -1
  62. package/dist/components/Table/Filter/SelectFilter.js +9 -9
  63. package/dist/components/Table/Table.d.ts +1 -1
  64. package/dist/components/Table/Table.d.ts.map +1 -1
  65. package/dist/components/Table/Table.dataPipeline.d.ts +4 -3
  66. package/dist/components/Table/Table.dataPipeline.d.ts.map +1 -1
  67. package/dist/components/Table/Table.dataPipeline.js +64 -63
  68. package/dist/components/Table/Table.js +299 -299
  69. package/dist/components/Table/Table.rowTypes.d.ts +6 -0
  70. package/dist/components/Table/Table.rowTypes.d.ts.map +1 -0
  71. package/dist/components/Table/Table.types.d.ts +10 -3
  72. package/dist/components/Table/Table.types.d.ts.map +1 -1
  73. package/dist/components/Table/TableHead.d.ts +27 -19
  74. package/dist/components/Table/TableHead.d.ts.map +1 -1
  75. package/dist/components/Table/TableHead.js +1 -1
  76. package/dist/components/Table/TableMobileCard.d.ts +11 -11
  77. package/dist/components/Table/TableMobileCard.d.ts.map +1 -1
  78. package/dist/components/Table/TableMobileCard.js +81 -84
  79. package/dist/components/Table/TableMobileView.d.ts +7 -5
  80. package/dist/components/Table/TableMobileView.d.ts.map +1 -1
  81. package/dist/components/Table/TableRow.d.ts +10 -8
  82. package/dist/components/Table/TableRow.d.ts.map +1 -1
  83. package/dist/components/Table/TableRow.js +116 -112
  84. package/dist/components/Table/useTableColumnPinning.d.ts.map +1 -1
  85. package/dist/components/Table/useTableVirtualization.d.ts +5 -5
  86. package/dist/components/Table/useTableVirtualization.d.ts.map +1 -1
  87. package/dist/components/Tabs/Tabs.d.ts +1 -1
  88. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  89. package/dist/components/Tabs/Tabs.js +110 -99
  90. package/dist/components/Tabs/Tabs.types.d.ts +29 -1
  91. package/dist/components/Tabs/Tabs.types.d.ts.map +1 -1
  92. package/dist/components/Tabs/distributeTabs.d.ts +6 -0
  93. package/dist/components/Tabs/distributeTabs.d.ts.map +1 -1
  94. package/dist/components/Tabs/tabsIndicator.d.ts +18 -0
  95. package/dist/components/Tabs/tabsIndicator.d.ts.map +1 -0
  96. package/dist/components/Tabs/tabsScroll.d.ts +20 -0
  97. package/dist/components/Tabs/tabsScroll.d.ts.map +1 -0
  98. package/dist/components/Tabs/useTabsIndicator.d.ts +6 -0
  99. package/dist/components/Tabs/useTabsIndicator.d.ts.map +1 -0
  100. package/dist/components/Tabs/useTabsIndicator.js +14 -0
  101. package/dist/components/Tabs/useTabsOverflow.d.ts +3 -1
  102. package/dist/components/Tabs/useTabsOverflow.d.ts.map +1 -1
  103. package/dist/components/Tabs/useTabsOverflow.js +33 -33
  104. package/dist/components/Tabs/useTabsScroll.d.ts +4 -0
  105. package/dist/components/Tabs/useTabsScroll.d.ts.map +1 -0
  106. package/dist/components/Tabs/useTabsScroll.js +17 -0
  107. package/dist/components/Textarea/Textarea.d.ts +22 -2
  108. package/dist/components/Textarea/Textarea.d.ts.map +1 -1
  109. package/dist/components/Textarea/Textarea.js +48 -43
  110. package/dist/components/Textarea/Textarea.types.d.ts +1 -0
  111. package/dist/components/Textarea/Textarea.types.d.ts.map +1 -1
  112. package/dist/components/Tooltip/Tooltip.d.ts +1 -1
  113. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  114. package/dist/components/Tooltip/Tooltip.js +150 -131
  115. package/dist/components/Tooltip/Tooltip.types.d.ts +7 -2
  116. package/dist/components/Tooltip/Tooltip.types.d.ts.map +1 -1
  117. package/dist/components/TreeView/TreeView.js +95 -95
  118. package/dist/components/TreeView/TreeView.types.d.ts +1 -1
  119. package/dist/components/TreeView/TreeView.types.d.ts.map +1 -1
  120. package/dist/components/VirtualList/VirtualList.d.ts +45 -0
  121. package/dist/components/VirtualList/VirtualList.d.ts.map +1 -0
  122. package/dist/components/VirtualList/VirtualList.js +62 -0
  123. package/dist/dev/index.js +1306 -584
  124. package/dist/dev/types/react/src/dev/index.d.ts +1 -1
  125. package/dist/dev/types/vanilla/src/core/motion.d.ts +41 -0
  126. package/dist/dev/types/vanilla/src/core/requestLog.d.ts +29 -0
  127. package/dist/dev/types/vanilla/src/dev/highlight.d.ts +32 -0
  128. package/dist/dev/types/vanilla/src/dev/intercept.d.ts +4 -1
  129. package/dist/dev/types/vanilla/src/dev/motionModes.d.ts +30 -0
  130. package/dist/dev/types/vanilla/src/dev/panelKit.d.ts +49 -0
  131. package/dist/dev/types/vanilla/src/dev/panelStyles.d.ts +7 -0
  132. package/dist/dev/types/vanilla/src/dev/rules.d.ts +31 -0
  133. package/dist/dev/types/vanilla/src/dev/store.d.ts +7 -4
  134. package/dist/dev/types/vanilla/src/dev/types.d.ts +14 -3
  135. package/dist/dev/types/vanilla/src/dev/viewModes.d.ts +22 -0
  136. package/dist/fonts/icons/urfu-ui-icon-font.eot +0 -0
  137. package/dist/fonts/icons/urfu-ui-icon-font.svg +2 -2
  138. package/dist/fonts/icons/urfu-ui-icon-font.ttf +0 -0
  139. package/dist/fonts/icons/urfu-ui-icon-font.woff +0 -0
  140. package/dist/fonts/icons/urfu-ui-icon-font.woff2 +0 -0
  141. package/dist/hooks/useCollapseMotion.d.ts +18 -0
  142. package/dist/hooks/useCollapseMotion.d.ts.map +1 -0
  143. package/dist/hooks/useCollapseMotion.js +9 -0
  144. package/dist/hooks/useDismiss.d.ts +7 -1
  145. package/dist/hooks/useDismiss.d.ts.map +1 -1
  146. package/dist/hooks/useDismiss.js +19 -17
  147. package/dist/hooks/useEnterMotion.d.ts +9 -0
  148. package/dist/hooks/useEnterMotion.d.ts.map +1 -0
  149. package/dist/hooks/useEnterMotion.js +10 -0
  150. package/dist/hooks/useForwardedRef.d.ts +8 -0
  151. package/dist/hooks/useForwardedRef.d.ts.map +1 -0
  152. package/dist/hooks/useForwardedRef.js +8 -0
  153. package/dist/hooks/useInfiniteScroll.d.ts +27 -0
  154. package/dist/hooks/useInfiniteScroll.d.ts.map +1 -0
  155. package/dist/hooks/useInfiniteScroll.js +13 -0
  156. package/dist/hooks/useMountTransition.d.ts +1 -1
  157. package/dist/hooks/useMountTransition.d.ts.map +1 -1
  158. package/dist/hooks/useMountTransition.js +14 -13
  159. package/dist/hooks/useVirtualList.d.ts +34 -0
  160. package/dist/hooks/useVirtualList.d.ts.map +1 -0
  161. package/dist/hooks/useVirtualList.js +21 -0
  162. package/dist/index.d.ts +15 -1
  163. package/dist/index.d.ts.map +1 -1
  164. package/dist/shared/collapseMotion.d.ts +32 -0
  165. package/dist/shared/collapseMotion.d.ts.map +1 -0
  166. package/dist/shared/infiniteScroll.d.ts +42 -0
  167. package/dist/shared/infiniteScroll.d.ts.map +1 -0
  168. package/dist/shared/kitCopy.js +1 -1
  169. package/dist/shared/linkClick.d.ts +7 -0
  170. package/dist/shared/linkClick.d.ts.map +1 -0
  171. package/dist/shared/motion.d.ts +42 -0
  172. package/dist/shared/motion.d.ts.map +1 -0
  173. package/dist/shared/popupTransition.d.ts +10 -2
  174. package/dist/shared/popupTransition.d.ts.map +1 -1
  175. package/dist/shared/popupTransition.js +6 -5
  176. package/dist/shared/virtualList.d.ts +103 -0
  177. package/dist/shared/virtualList.d.ts.map +1 -0
  178. package/dist/style-no-fonts.css +1 -1
  179. package/dist/style.css +1 -1
  180. package/dist/style.layer.css +2 -2
  181. package/dist/style.shell.css +5 -5
  182. package/dist/urfu-ui-kit-react.js +53 -45
  183. package/dist/utils/describeError.d.ts +12 -1
  184. package/dist/utils/describeError.d.ts.map +1 -1
  185. package/dist/vanilla/core/collapseMotion.js +58 -0
  186. package/dist/vanilla/core/describeError.js +172 -115
  187. package/dist/vanilla/core/distributeTabs.js +23 -20
  188. package/dist/vanilla/core/infiniteScroll.js +79 -0
  189. package/dist/vanilla/core/linkClick.js +2 -0
  190. package/dist/vanilla/core/motion.js +29 -0
  191. package/dist/vanilla/core/requestLog.js +40 -0
  192. package/dist/vanilla/core/tabsIndicator.js +41 -0
  193. package/dist/vanilla/core/tabsScroll.js +29 -0
  194. package/dist/vanilla/core/virtualList.js +213 -0
  195. package/package.json +1 -1
@@ -0,0 +1,41 @@
1
+ import { prefersReducedMotion$u as g, motionMs$u as b, MOTION_MS$u as w, MOTION_EASE$u as M } from "./motion.js";
2
+ const $ = w.base, v = (t) => ["transform", "width", "height"].map((r) => `${r} ${t}ms ${M.move}`).join(", "), y = () => {
3
+ let t = null, r, a, h = 0;
4
+ const p = () => performance.now() < h, d = (n, i, f) => {
5
+ if (!n || !i) return;
6
+ const o = n.querySelector('[aria-current="page"]');
7
+ if (!o) {
8
+ i.style.visibility = "hidden", t = null;
9
+ return;
10
+ }
11
+ let l = 0, c = 0;
12
+ for (let s = o; s && s !== n; s = s.offsetParent)
13
+ l += s.offsetLeft, c += s.offsetTop;
14
+ const e = { left: l, top: c, width: o.offsetWidth, height: o.offsetHeight };
15
+ if (t && t.left === e.left && t.top === e.top && t.width === e.width && t.height === e.height) return;
16
+ const m = !!(f && t && !g()), u = b($);
17
+ m && (h = performance.now() + u), Object.assign(i.style, {
18
+ transition: m ? v(u) : "none",
19
+ visibility: "",
20
+ width: `${e.width}px`,
21
+ height: `${e.height}px`,
22
+ transform: `translate(${e.left}px, ${e.top}px)`,
23
+ borderRadius: getComputedStyle(o).borderRadius
24
+ }), t = e;
25
+ };
26
+ return {
27
+ /** После каждой отрисовки. layout — состав и вид вкладок: при его смене подсветка не едет. */
28
+ update(n, i, f, o) {
29
+ const l = o === a && (f !== r || p());
30
+ r = f, a = o, d(n, i, l);
31
+ },
32
+ /**
33
+ * Ряд сменил размер (окно, шрифты, полоса прокрутки страницы) — встать на место без переезда.
34
+ * Посреди переезда — доехать до нового места: `transition: none` оборвал бы его прыжком.
35
+ */
36
+ refresh(n, i) {
37
+ d(n, i, p());
38
+ }
39
+ };
40
+ };
41
+ export { $ as TABS_INDICATOR_MS$u, y as createTabsIndicator$u };
@@ -0,0 +1,29 @@
1
+ import { prefersReducedMotion$u as c } from "./motion.js";
2
+ const g = (e) => {
3
+ const o = () => {
4
+ const s = e.scrollWidth - e.clientWidth;
5
+ e.toggleAttribute("data-fade-start", s > 1 && e.scrollLeft > 1), e.toggleAttribute("data-fade-end", s > 1 && e.scrollLeft < s - 1);
6
+ }, t = typeof ResizeObserver > "u" ? null : new ResizeObserver(o);
7
+ return t == null || t.observe(e), e.addEventListener("scroll", o, { passive: !0 }), o(), {
8
+ /** После каждой отрисовки: состав и отступы вкладок меняют ширину содержимого, а не трека. */
9
+ fade: o,
10
+ /**
11
+ * Прокрутить ряд к активной вкладке (`aria-current="page"`), если она за краем или под затуханием.
12
+ * Вкладка шире ряда без затуханий — по центру: иначе у последней вкладки ряд вставал в паре
13
+ * пикселей от конца и правый край оставался под затуханием.
14
+ * Только `scrollLeft` трека: `scrollIntoView` прокрутил бы и страницу к вкладкам.
15
+ */
16
+ reveal(s) {
17
+ const n = e.querySelector('[aria-current="page"]'), d = e.scrollWidth - e.clientWidth;
18
+ if (!n || d <= 0) return;
19
+ let i = 0;
20
+ for (let l = n; l && l !== e; l = l.offsetParent) i += l.offsetLeft;
21
+ const r = getComputedStyle(e), f = i - (parseFloat(r.scrollPaddingLeft) || 0), a = i + n.offsetWidth + (parseFloat(r.scrollPaddingRight) || 0) - e.clientWidth, u = a > f ? i + (n.offsetWidth - e.clientWidth) / 2 : Math.min(Math.max(e.scrollLeft, a), f), h = Math.min(Math.max(u, 0), d);
22
+ Math.abs(h - e.scrollLeft) < 1 || e.scrollTo({ left: h, behavior: s && !c() ? "smooth" : "auto" });
23
+ },
24
+ destroy() {
25
+ t == null || t.disconnect(), e.removeEventListener("scroll", o), e.removeAttribute("data-fade-start"), e.removeAttribute("data-fade-end");
26
+ }
27
+ };
28
+ };
29
+ export { g as createTabsScroll$u };
@@ -0,0 +1,213 @@
1
+ var g = Object.defineProperty;
2
+ var y = (c, e, t) => e in c ? g(c, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : c[e] = t;
3
+ var n = (c, e, t) => y(c, typeof e != "symbol" ? e + "" : e, t);
4
+ import { prefersReducedMotion$u as m } from "./motion.js";
5
+ const w = (c, e) => {
6
+ const t = new Array(c + 1);
7
+ t[0] = 0;
8
+ for (let s = 0; s < c; s++) t[s + 1] = t[s] + e(s);
9
+ return t;
10
+ }, d = (c, e, t) => {
11
+ let s = 0, i = e;
12
+ for (; s < i; ) {
13
+ const o = Math.floor((s + i) / 2);
14
+ c[o + 1] <= t ? s = o + 1 : i = o;
15
+ }
16
+ return Math.min(s, Math.max(0, e - 1));
17
+ }, b = (c, e) => c.length === e.length && c.every((t, s) => t === e[s]), z = /(auto|scroll|overlay)/, v = (c) => {
18
+ if (typeof window > "u") return null;
19
+ for (let e = c; e && e !== document.body && e !== document.documentElement; e = e.parentElement)
20
+ if (e instanceof HTMLElement && z.test(getComputedStyle(e).overflowY)) return e;
21
+ return null;
22
+ }, p = 0.5;
23
+ class E {
24
+ constructor() {
25
+ n(this, "keys", []);
26
+ n(this, "keyIndex", /* @__PURE__ */ new Map());
27
+ n(this, "sizes", /* @__PURE__ */ new Map());
28
+ n(this, "offsets", [0]);
29
+ n(this, "offsetsDirty", !0);
30
+ n(this, "estimateSize", 40);
31
+ n(this, "overscan", 5);
32
+ n(this, "explicitScrollElement");
33
+ n(this, "viewport", { top: 0, height: 0 });
34
+ n(this, "list", null);
35
+ n(this, "scroller", null);
36
+ n(this, "focusedKey", null);
37
+ n(this, "elementKeys", /* @__PURE__ */ new WeakMap());
38
+ n(this, "observed", /* @__PURE__ */ new Set());
39
+ n(this, "resizeObserver", null);
40
+ n(this, "viewportObserver", null);
41
+ n(this, "detach", null);
42
+ n(this, "signature", "");
43
+ n(this, "snapshot", null);
44
+ n(this, "listeners", /* @__PURE__ */ new Set());
45
+ n(this, "flushPending", !1);
46
+ /** Подписка на изменения окна строк; возвращает отписку. */
47
+ n(this, "subscribe", (e) => (this.listeners.add(e), () => {
48
+ this.listeners.delete(e);
49
+ }));
50
+ /**
51
+ * Регистрирует отрисованную строку (у неё должен быть `data-index`): замер сразу
52
+ * и наблюдение за изменением высоты. `null`/другой элемент — снять наблюдение.
53
+ */
54
+ n(this, "measureElement", (e) => {
55
+ var i, o;
56
+ if (!e) return;
57
+ const t = Number((i = e.dataset) == null ? void 0 : i.index), s = this.keys[t];
58
+ s !== void 0 && (this.elementKeys.set(e, s), this.observed.has(e) || (this.observed.add(e), (o = this.resizeObserver) == null || o.observe(e)), this.setSize(s, e.getBoundingClientRect().height) && this.scheduleFlush());
59
+ });
60
+ }
61
+ setOptions({ keys: e, estimateSize: t, overscan: s, scrollElement: i }) {
62
+ let o = !1;
63
+ if (e !== this.keys && !b(e, this.keys)) {
64
+ this.keys = e, this.keyIndex = new Map(e.map((r, h) => [r, h]));
65
+ for (const r of this.sizes.keys()) this.keyIndex.has(r) || this.sizes.delete(r);
66
+ this.focusedKey !== null && !this.keyIndex.has(this.focusedKey) && (this.focusedKey = null), o = !0;
67
+ }
68
+ (t !== this.estimateSize || s !== this.overscan) && (this.estimateSize = t, this.overscan = Math.max(0, Math.floor(s)), o = !0), o && (this.offsetsDirty = !0, this.snapshot = null), i !== this.explicitScrollElement && (this.explicitScrollElement = i, this.list && this.attach(this.list));
69
+ }
70
+ /**
71
+ * Подключает контейнер строк (элемент высотой со весь список, внутри которого строки
72
+ * стоят абсолютно). `null` — отключить.
73
+ */
74
+ attach(e) {
75
+ var r;
76
+ if ((r = this.detach) == null || r.call(this), this.detach = null, this.list = e, !e || typeof window > "u") return;
77
+ this.scroller = this.explicitScrollElement ?? v(e.parentElement ?? e);
78
+ const t = (h) => {
79
+ const l = h.target;
80
+ l === window || l === document || l === this.scroller ? this.update() : l instanceof Node && l.contains(e) && (this.resolveScroller(), this.update());
81
+ }, s = () => this.update();
82
+ window.addEventListener("scroll", t, { capture: !0, passive: !0 }), window.addEventListener("resize", s);
83
+ const i = (h) => {
84
+ var u, a;
85
+ const l = (a = (u = h.target) == null ? void 0 : u.closest) == null ? void 0 : a.call(u, "[data-index]"), f = l && e.contains(l) ? this.elementKeys.get(l) : void 0;
86
+ this.focusedKey = f ?? null;
87
+ }, o = () => {
88
+ queueMicrotask(() => {
89
+ this.list === e && !e.contains(document.activeElement) && (this.focusedKey = null, this.update());
90
+ });
91
+ };
92
+ if (e.addEventListener("focusin", i), e.addEventListener("focusout", o), typeof ResizeObserver < "u") {
93
+ this.resizeObserver = new ResizeObserver((h) => this.onResize(h));
94
+ for (const h of this.observed) this.resizeObserver.observe(h);
95
+ this.viewportObserver = new ResizeObserver(() => {
96
+ this.resolveScroller(), this.update();
97
+ }), this.viewportObserver.observe(e), this.scroller && this.viewportObserver.observe(this.scroller);
98
+ }
99
+ this.detach = () => {
100
+ var h, l;
101
+ window.removeEventListener("scroll", t, { capture: !0 }), window.removeEventListener("resize", s), e.removeEventListener("focusin", i), e.removeEventListener("focusout", o), (h = this.viewportObserver) == null || h.disconnect(), this.viewportObserver = null, (l = this.resizeObserver) == null || l.disconnect(), this.resizeObserver = null, this.scroller = null;
102
+ }, this.update();
103
+ }
104
+ /** Заново найти прокручиваемого предка, если область не задана явно. */
105
+ resolveScroller() {
106
+ var s, i;
107
+ const e = this.list;
108
+ if (!e || this.explicitScrollElement) return;
109
+ const t = v(e.parentElement ?? e);
110
+ t !== this.scroller && (this.scroller && ((s = this.viewportObserver) == null || s.unobserve(this.scroller)), this.scroller = t, t && ((i = this.viewportObserver) == null || i.observe(t)));
111
+ }
112
+ /** Снимает наблюдение с удалённой строки. */
113
+ unmeasureElement(e) {
114
+ var t;
115
+ this.observed.delete(e), (t = this.resizeObserver) == null || t.unobserve(e);
116
+ }
117
+ /** Строки для отрисовки: окно с запасом плюс сфокусированная, по возрастанию индекса. */
118
+ getItems() {
119
+ if (this.snapshot) return this.snapshot;
120
+ const e = this.getOffsets(), [t, s] = this.range(), i = [], o = this.focusedKey === null ? void 0 : this.keyIndex.get(this.focusedKey);
121
+ o !== void 0 && o < t && i.push(o);
122
+ for (let r = t; r < s; r++) i.push(r);
123
+ return o !== void 0 && o >= s && i.push(o), this.snapshot = i.map((r) => ({
124
+ key: this.keys[r],
125
+ index: r,
126
+ start: e[r],
127
+ size: e[r + 1] - e[r]
128
+ })), this.snapshot;
129
+ }
130
+ /** Высота всего списка с учётом замеров, px. */
131
+ getTotalSize() {
132
+ return this.getOffsets()[this.keys.length];
133
+ }
134
+ /** Докрутить область прокрутки до строки `index`. */
135
+ scrollToIndex(e, { align: t = "auto", behavior: s = "auto" } = {}) {
136
+ if (!this.list || e < 0 || e >= this.keys.length) return;
137
+ this.resolveScroller(), this.readViewport();
138
+ const i = this.getOffsets(), o = i[e], r = i[e + 1], { top: h, height: l } = this.viewport;
139
+ let f;
140
+ if (t === "start") f = o;
141
+ else if (t === "end") f = r - l;
142
+ else if (t === "center") f = o - (l - (r - o)) / 2;
143
+ else if (o < h) f = o;
144
+ else if (r > h + l) f = r - l;
145
+ else return;
146
+ this.scrollBy(f - h, s);
147
+ }
148
+ destroy() {
149
+ this.attach(null), this.observed.clear(), this.listeners.clear();
150
+ }
151
+ getOffsets() {
152
+ return this.offsetsDirty && (this.offsets = w(this.keys.length, (e) => this.sizes.get(this.keys[e]) ?? this.estimateSize), this.offsetsDirty = !1), this.offsets;
153
+ }
154
+ range() {
155
+ const e = this.keys.length;
156
+ if (!e) return [0, 0];
157
+ const t = this.getOffsets(), s = this.viewport.height > 0 ? this.viewport.height : this.estimateSize * 10, i = Math.max(0, this.viewport.top), o = Math.max(i, this.viewport.top + s), r = d(t, e, i), h = d(t, e, o);
158
+ return [Math.max(0, r - this.overscan), Math.min(e, h + 1 + this.overscan)];
159
+ }
160
+ readViewport() {
161
+ const e = this.list;
162
+ if (!e) return;
163
+ const t = e.getBoundingClientRect().top, s = this.scroller;
164
+ if (s) {
165
+ const i = s.getBoundingClientRect();
166
+ this.viewport = { top: i.top + s.clientTop - t, height: s.clientHeight };
167
+ } else
168
+ this.viewport = { top: -t, height: window.innerHeight };
169
+ }
170
+ scrollBy(e, t = "auto") {
171
+ if (Math.abs(e) < p) return;
172
+ const s = t === "smooth" && !m() ? "smooth" : "auto", i = this.scroller;
173
+ i ? s === "smooth" && typeof i.scrollTo == "function" ? i.scrollTo({ top: i.scrollTop + e, behavior: "smooth" }) : i.scrollTop += e : typeof window.scrollBy == "function" && window.scrollBy({ top: e, behavior: s });
174
+ }
175
+ setSize(e, t) {
176
+ if (!(t > 0)) return !1;
177
+ const s = this.sizes.get(e) ?? this.estimateSize;
178
+ if (this.sizes.has(e) && Math.abs(s - t) <= p) return !1;
179
+ const i = this.keyIndex.get(e), o = i !== void 0 && this.list && this.getOffsets()[i + 1] <= this.viewport.top;
180
+ return this.sizes.set(e, t), this.offsetsDirty = !0, this.snapshot = null, o && this.scrollBy(t - s), !0;
181
+ }
182
+ /** Замеры при монтировании строк копятся и сообщаются одним уведомлением. */
183
+ scheduleFlush() {
184
+ this.flushPending || (this.flushPending = !0, queueMicrotask(() => {
185
+ this.flushPending = !1, this.update(!0);
186
+ }));
187
+ }
188
+ onResize(e) {
189
+ let t = !1;
190
+ for (const s of e) {
191
+ const i = this.elementKeys.get(s.target);
192
+ if (!(i === void 0 || !this.keyIndex.has(i))) {
193
+ if (!s.target.isConnected) {
194
+ this.unmeasureElement(s.target);
195
+ continue;
196
+ }
197
+ this.setSize(i, s.target.getBoundingClientRect().height) && (t = !0);
198
+ }
199
+ }
200
+ t && this.update(!0);
201
+ }
202
+ /** Перечитывает видимую часть и сообщает подписчикам, если состав или места строк сменились. */
203
+ update(e = !1) {
204
+ for (const r of this.observed) r.isConnected || this.unmeasureElement(r);
205
+ this.readViewport();
206
+ const [t, s] = this.range(), i = this.focusedKey === null ? -1 : this.keyIndex.get(this.focusedKey) ?? -1, o = `${t}:${s}:${i}:${this.keys.length}`;
207
+ if (!(!e && o === this.signature)) {
208
+ this.signature = o, this.snapshot = null;
209
+ for (const r of this.listeners) r();
210
+ }
211
+ }
212
+ }
213
+ export { E as VirtualListCore$u, w as buildOffsets$u, d as findIndexAt$u, v as findScrollParent$u };
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  ],
13
13
  "license": "UNLICENSED",
14
14
  "private": false,
15
- "version": "2.1.4",
15
+ "version": "2.1.6",
16
16
  "type": "module",
17
17
  "main": "dist/urfu-ui-kit-react",
18
18
  "types": "dist/index.d.ts",