@smwb/ui-react 2.8.0 → 2.9.0

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 (239) hide show
  1. package/AI_LESS_OVERRIDES.md +84 -21
  2. package/AI_THEMING.md +72 -28
  3. package/README.md +654 -0
  4. package/dist/assets/styles/less/components/appBar/appBar.entry.css +1 -1
  5. package/dist/assets/styles/less/components/button/button.entry.css +1 -1
  6. package/dist/assets/styles/less/components/checkbox/checkbox.entry.css +1 -1
  7. package/dist/assets/styles/less/components/chip/chip.entry.css +1 -1
  8. package/dist/assets/styles/less/components/commandPalette/commandPalette.entry.css +1 -0
  9. package/dist/assets/styles/less/components/composer/composer.entry.css +1 -0
  10. package/dist/assets/styles/less/components/dagView/dagView.entry.css +1 -0
  11. package/dist/assets/styles/less/components/diffStat/diffStat.entry.css +1 -0
  12. package/dist/assets/styles/less/components/kbd/kbd.entry.css +1 -0
  13. package/dist/assets/styles/less/components/list/list.entry.css +1 -1
  14. package/dist/assets/styles/less/components/qrCode/qrCode.entry.css +1 -0
  15. package/dist/assets/styles/less/components/radioButton/radioButton.entry.css +1 -1
  16. package/dist/assets/styles/less/components/selectField/selectField.entry.css +1 -1
  17. package/dist/assets/styles/less/components/sidebar/sidebar.entry.css +1 -1
  18. package/dist/assets/styles/less/components/statusDot/statusDot.entry.css +1 -0
  19. package/dist/assets/styles/less/components/swimlanes/swimlanes.entry.css +1 -0
  20. package/dist/assets/styles/less/components/tabGroups/tabGroups.entry.css +1 -0
  21. package/dist/assets/styles/less/components/tabs/tab/tab.entry.css +1 -1
  22. package/dist/assets/styles/less/components/tabs/tabPanel/tabPanel.entry.css +1 -0
  23. package/dist/assets/styles/less/components/tabs/tabs.entry.css +1 -1
  24. package/dist/assets/styles/less/components/textField/textField.entry.css +1 -1
  25. package/dist/assets/styles/less/components/toggle/toggle.entry.css +1 -1
  26. package/dist/assets/styles/less/components/treeView/treeView.entry.css +1 -1
  27. package/dist/assets/styles/less/tokens.entry.css +1 -1
  28. package/dist/components/dataDisplay/chat/chat.d.ts +43 -1
  29. package/dist/components/dataDisplay/chat/chat.js +179 -150
  30. package/dist/components/dataDisplay/chat/chat.js.map +1 -1
  31. package/dist/components/dataDisplay/chat/chatComposer.d.ts +17 -0
  32. package/dist/components/dataDisplay/chat/chatComposer.js +31 -29
  33. package/dist/components/dataDisplay/chat/chatComposer.js.map +1 -1
  34. package/dist/components/dataDisplay/chat/index.d.ts +1 -1
  35. package/dist/components/dataDisplay/chat/utils.d.ts +14 -0
  36. package/dist/components/dataDisplay/chat/utils.js.map +1 -1
  37. package/dist/components/dataDisplay/dagView/dagLayout.d.ts +74 -0
  38. package/dist/components/dataDisplay/dagView/dagLayout.js +289 -0
  39. package/dist/components/dataDisplay/dagView/dagLayout.js.map +1 -0
  40. package/dist/components/dataDisplay/dagView/dagView.d.ts +157 -0
  41. package/dist/components/dataDisplay/dagView/dagView.js +543 -0
  42. package/dist/components/dataDisplay/dagView/dagView.js.map +1 -0
  43. package/dist/components/dataDisplay/dagView/index.d.ts +4 -0
  44. package/dist/components/dataDisplay/dagView/panZoom.d.ts +75 -0
  45. package/dist/components/dataDisplay/dagView/panZoom.js +171 -0
  46. package/dist/components/dataDisplay/dagView/panZoom.js.map +1 -0
  47. package/dist/components/dataDisplay/diffStat/diffStat.d.ts +54 -0
  48. package/dist/components/dataDisplay/diffStat/diffStat.js +63 -0
  49. package/dist/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  50. package/dist/components/dataDisplay/diffStat/index.d.ts +2 -0
  51. package/dist/components/dataDisplay/kbd/index.d.ts +4 -0
  52. package/dist/components/dataDisplay/kbd/kbd.d.ts +40 -0
  53. package/dist/components/dataDisplay/kbd/kbd.js +27 -0
  54. package/dist/components/dataDisplay/kbd/kbd.js.map +1 -0
  55. package/dist/components/dataDisplay/kbd/kbdKeys.d.ts +18 -0
  56. package/dist/components/dataDisplay/kbd/kbdKeys.js +72 -0
  57. package/dist/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  58. package/dist/components/dataDisplay/list/listItem.d.ts +34 -0
  59. package/dist/components/dataDisplay/list/listItem.js +47 -24
  60. package/dist/components/dataDisplay/list/listItem.js.map +1 -1
  61. package/dist/components/dataDisplay/qrCode/index.d.ts +2 -0
  62. package/dist/components/dataDisplay/qrCode/qrCode.d.ts +28 -0
  63. package/dist/components/dataDisplay/qrCode/qrCode.js +78 -0
  64. package/dist/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  65. package/dist/components/dataDisplay/qrCode/qrCodePath.d.ts +7 -0
  66. package/dist/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  67. package/dist/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  68. package/dist/components/dataDisplay/statusDot/index.d.ts +2 -0
  69. package/dist/components/dataDisplay/statusDot/statusDot.d.ts +35 -0
  70. package/dist/components/dataDisplay/statusDot/statusDot.js +30 -0
  71. package/dist/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  72. package/dist/components/dataDisplay/swimlanes/index.d.ts +2 -0
  73. package/dist/components/dataDisplay/swimlanes/swimlanes.d.ts +53 -0
  74. package/dist/components/dataDisplay/swimlanes/swimlanes.js +357 -0
  75. package/dist/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  76. package/dist/components/dataDisplay/treeView/treeView.d.ts +17 -1
  77. package/dist/components/dataDisplay/treeView/treeView.js +113 -92
  78. package/dist/components/dataDisplay/treeView/treeView.js.map +1 -1
  79. package/dist/components/feedBack/modal/modal.js +84 -63
  80. package/dist/components/feedBack/modal/modal.js.map +1 -1
  81. package/dist/components/inputs/button/button.d.ts +13 -1
  82. package/dist/components/inputs/button/button.js +57 -51
  83. package/dist/components/inputs/button/button.js.map +1 -1
  84. package/dist/components/inputs/composer/composer.d.ts +149 -0
  85. package/dist/components/inputs/composer/composer.js +219 -0
  86. package/dist/components/inputs/composer/composer.js.map +1 -0
  87. package/dist/components/inputs/composer/composerFiles.d.ts +26 -0
  88. package/dist/components/inputs/composer/composerFiles.js +19 -0
  89. package/dist/components/inputs/composer/composerFiles.js.map +1 -0
  90. package/dist/components/inputs/composer/composerKeys.d.ts +29 -0
  91. package/dist/components/inputs/composer/composerKeys.js +7 -0
  92. package/dist/components/inputs/composer/composerKeys.js.map +1 -0
  93. package/dist/components/inputs/composer/index.d.ts +3 -0
  94. package/dist/components/layout/sheet/sheet.d.ts +12 -0
  95. package/dist/components/layout/sheet/sheet.js +152 -137
  96. package/dist/components/layout/sheet/sheet.js.map +1 -1
  97. package/dist/components/layout/tabGroups/index.d.ts +4 -0
  98. package/dist/components/layout/tabGroups/tabGroups.d.ts +94 -0
  99. package/dist/components/layout/tabGroups/tabGroups.js +783 -0
  100. package/dist/components/layout/tabGroups/tabGroups.js.map +1 -0
  101. package/dist/components/layout/tabGroups/tabGroupsFocus.d.ts +55 -0
  102. package/dist/components/layout/tabGroups/tabGroupsFocus.js +199 -0
  103. package/dist/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  104. package/dist/components/layout/tabGroups/tabGroupsLayout.d.ts +250 -0
  105. package/dist/components/layout/tabGroups/tabGroupsLayout.js +497 -0
  106. package/dist/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  107. package/dist/components/navigation/appBar/appBar.d.ts +22 -0
  108. package/dist/components/navigation/appBar/appBar.js +31 -26
  109. package/dist/components/navigation/appBar/appBar.js.map +1 -1
  110. package/dist/components/navigation/commandPalette/commandPalette.d.ts +111 -0
  111. package/dist/components/navigation/commandPalette/commandPalette.js +337 -0
  112. package/dist/components/navigation/commandPalette/commandPalette.js.map +1 -0
  113. package/dist/components/navigation/commandPalette/commandPaletteFilter.d.ts +11 -0
  114. package/dist/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  115. package/dist/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  116. package/dist/components/navigation/commandPalette/commandPaletteNavigation.d.ts +13 -0
  117. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  118. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  119. package/dist/components/navigation/commandPalette/commandPaletteTypes.d.ts +39 -0
  120. package/dist/components/navigation/commandPalette/index.d.ts +4 -0
  121. package/dist/components/navigation/sidebar/sidebar.d.ts +10 -0
  122. package/dist/components/navigation/sidebar/sidebar.js +61 -59
  123. package/dist/components/navigation/sidebar/sidebar.js.map +1 -1
  124. package/dist/components/navigation/tabs/index.d.ts +3 -1
  125. package/dist/components/navigation/tabs/tab/tab.d.ts +88 -1
  126. package/dist/components/navigation/tabs/tab/tab.js +121 -42
  127. package/dist/components/navigation/tabs/tab/tab.js.map +1 -1
  128. package/dist/components/navigation/tabs/tabPanel/tabPanel.d.ts +19 -0
  129. package/dist/components/navigation/tabs/tabPanel/tabPanel.js +27 -0
  130. package/dist/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  131. package/dist/components/navigation/tabs/tabs.d.ts +75 -5
  132. package/dist/components/navigation/tabs/tabs.js +369 -145
  133. package/dist/components/navigation/tabs/tabs.js.map +1 -1
  134. package/dist/components/navigation/tabs/tabs.utils.d.ts +20 -0
  135. package/dist/components/navigation/tabs/tabs.utils.js +11 -0
  136. package/dist/components/navigation/tabs/tabs.utils.js.map +1 -0
  137. package/dist/components/navigation/tabs/tabsContext.d.ts +11 -0
  138. package/dist/components/navigation/tabs/tabsContext.js +6 -0
  139. package/dist/components/navigation/tabs/tabsContext.js.map +1 -0
  140. package/dist/headless/components/dataDisplay/chat/chat.js +179 -150
  141. package/dist/headless/components/dataDisplay/chat/chat.js.map +1 -1
  142. package/dist/headless/components/dataDisplay/chat/chatComposer.js +31 -29
  143. package/dist/headless/components/dataDisplay/chat/chatComposer.js.map +1 -1
  144. package/dist/headless/components/dataDisplay/chat/utils.js.map +1 -1
  145. package/dist/headless/components/dataDisplay/dagView/dagLayout.js +289 -0
  146. package/dist/headless/components/dataDisplay/dagView/dagLayout.js.map +1 -0
  147. package/dist/headless/components/dataDisplay/dagView/dagView.js +541 -0
  148. package/dist/headless/components/dataDisplay/dagView/dagView.js.map +1 -0
  149. package/dist/headless/components/dataDisplay/dagView/panZoom.js +171 -0
  150. package/dist/headless/components/dataDisplay/dagView/panZoom.js.map +1 -0
  151. package/dist/headless/components/dataDisplay/diffStat/diffStat.js +61 -0
  152. package/dist/headless/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  153. package/dist/headless/components/dataDisplay/kbd/kbd.js +25 -0
  154. package/dist/headless/components/dataDisplay/kbd/kbd.js.map +1 -0
  155. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js +72 -0
  156. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  157. package/dist/headless/components/dataDisplay/list/listItem.js +47 -24
  158. package/dist/headless/components/dataDisplay/list/listItem.js.map +1 -1
  159. package/dist/headless/components/dataDisplay/qrCode/qrCode.js +76 -0
  160. package/dist/headless/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  161. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  162. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  163. package/dist/headless/components/dataDisplay/statusDot/statusDot.js +28 -0
  164. package/dist/headless/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  165. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js +355 -0
  166. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  167. package/dist/headless/components/dataDisplay/treeView/treeView.js +113 -92
  168. package/dist/headless/components/dataDisplay/treeView/treeView.js.map +1 -1
  169. package/dist/headless/components/feedBack/modal/modal.js +85 -64
  170. package/dist/headless/components/feedBack/modal/modal.js.map +1 -1
  171. package/dist/headless/components/inputs/button/button.js +56 -50
  172. package/dist/headless/components/inputs/button/button.js.map +1 -1
  173. package/dist/headless/components/inputs/composer/composer.js +217 -0
  174. package/dist/headless/components/inputs/composer/composer.js.map +1 -0
  175. package/dist/headless/components/inputs/composer/composerFiles.js +19 -0
  176. package/dist/headless/components/inputs/composer/composerFiles.js.map +1 -0
  177. package/dist/headless/components/inputs/composer/composerKeys.js +7 -0
  178. package/dist/headless/components/inputs/composer/composerKeys.js.map +1 -0
  179. package/dist/headless/components/layout/sheet/sheet.js +160 -145
  180. package/dist/headless/components/layout/sheet/sheet.js.map +1 -1
  181. package/dist/headless/components/layout/tabGroups/tabGroups.js +781 -0
  182. package/dist/headless/components/layout/tabGroups/tabGroups.js.map +1 -0
  183. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js +199 -0
  184. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  185. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js +497 -0
  186. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  187. package/dist/headless/components/navigation/appBar/appBar.js +35 -30
  188. package/dist/headless/components/navigation/appBar/appBar.js.map +1 -1
  189. package/dist/headless/components/navigation/commandPalette/commandPalette.js +335 -0
  190. package/dist/headless/components/navigation/commandPalette/commandPalette.js.map +1 -0
  191. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  192. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  193. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  194. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  195. package/dist/headless/components/navigation/sidebar/sidebar.js +56 -54
  196. package/dist/headless/components/navigation/sidebar/sidebar.js.map +1 -1
  197. package/dist/headless/components/navigation/tabs/tab/tab.js +121 -42
  198. package/dist/headless/components/navigation/tabs/tab/tab.js.map +1 -1
  199. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js +25 -0
  200. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  201. package/dist/headless/components/navigation/tabs/tabs.js +369 -145
  202. package/dist/headless/components/navigation/tabs/tabs.js.map +1 -1
  203. package/dist/headless/components/navigation/tabs/tabs.utils.js +11 -0
  204. package/dist/headless/components/navigation/tabs/tabs.utils.js.map +1 -0
  205. package/dist/headless/components/navigation/tabs/tabsContext.js +6 -0
  206. package/dist/headless/components/navigation/tabs/tabsContext.js.map +1 -0
  207. package/dist/headless/hooks/useFocusTrap.js +24 -21
  208. package/dist/headless/hooks/useFocusTrap.js.map +1 -1
  209. package/dist/headless/hooks/useKeyboardShortcut.js +19 -0
  210. package/dist/headless/hooks/useKeyboardShortcut.js.map +1 -0
  211. package/dist/headless/index.js +360 -316
  212. package/dist/headless/index.js.map +1 -1
  213. package/dist/headless/utils/keyboardShortcut.js +49 -0
  214. package/dist/headless/utils/keyboardShortcut.js.map +1 -0
  215. package/dist/headless/utils/linkAttrs.js +13 -0
  216. package/dist/headless/utils/linkAttrs.js.map +1 -0
  217. package/dist/headless/utils/restoreFocus.js +10 -0
  218. package/dist/headless/utils/restoreFocus.js.map +1 -0
  219. package/dist/hooks/useFocusTrap.d.ts +6 -1
  220. package/dist/hooks/useFocusTrap.js +24 -21
  221. package/dist/hooks/useFocusTrap.js.map +1 -1
  222. package/dist/hooks/useKeyboardShortcut.d.ts +30 -0
  223. package/dist/hooks/useKeyboardShortcut.js +19 -0
  224. package/dist/hooks/useKeyboardShortcut.js.map +1 -0
  225. package/dist/index.cjs +3 -2
  226. package/dist/index.cjs.map +1 -1
  227. package/dist/index.d.ts +24 -3
  228. package/dist/index.js +360 -316
  229. package/dist/index.js.map +1 -1
  230. package/dist/utils/keyboardShortcut.d.ts +12 -0
  231. package/dist/utils/keyboardShortcut.js +49 -0
  232. package/dist/utils/keyboardShortcut.js.map +1 -0
  233. package/dist/utils/linkAttrs.d.ts +13 -0
  234. package/dist/utils/linkAttrs.js +13 -0
  235. package/dist/utils/linkAttrs.js.map +1 -0
  236. package/dist/utils/restoreFocus.d.ts +8 -0
  237. package/dist/utils/restoreFocus.js +10 -0
  238. package/dist/utils/restoreFocus.js.map +1 -0
  239. package/package.json +5 -3
@@ -0,0 +1,497 @@
1
+ const bt = 1, et = {
2
+ top: "above",
3
+ right: "on the right",
4
+ bottom: "below",
5
+ left: "on the left"
6
+ }, it = {
7
+ group: (t, n) => n === 1 ? "Tabs" : `Group ${t} of ${n}`,
8
+ groupActions: "Group actions",
9
+ splitRight: "Split right",
10
+ splitDown: "Split down",
11
+ moveToPreviousGroup: "Move to previous group",
12
+ moveToNextGroup: "Move to next group",
13
+ moveLeft: "Move tab left",
14
+ moveRight: "Move tab right",
15
+ resize: "Resize groups",
16
+ movedToGroup: (t, n, r) => `${t} moved to group ${n} of ${r}`,
17
+ movedToNewGroup: (t, n) => `${t} moved to a new group ${et[n]}`,
18
+ movedInGroup: (t, n, r) => `${t} moved to position ${n} of ${r}`
19
+ }, b = 0.05, L = 1e-6, F = b * 2, st = 32, ot = 1e-6;
20
+ function d(t, n) {
21
+ const r = t[n];
22
+ if (r === void 0) throw new RangeError(`tabGroupsLayout: no item at ${n}`);
23
+ return r;
24
+ }
25
+ function z(t, n, r) {
26
+ return Math.min(r, Math.max(n, t));
27
+ }
28
+ function ct(t) {
29
+ return Math.round(t * 1e4) / 1e4;
30
+ }
31
+ function T(t) {
32
+ return t.reduce((n, r) => n + r, 0);
33
+ }
34
+ function N(t, n) {
35
+ return t.type === "group" ? n.push(t) : t.children.forEach((r) => N(r, n)), n;
36
+ }
37
+ function S(t) {
38
+ return t.type === "group" ? t : S(d(t.children, 0));
39
+ }
40
+ function H(t) {
41
+ return t.type === "group" ? t : H(d(t.children, t.children.length - 1));
42
+ }
43
+ function w(t, n) {
44
+ n(t), t.type === "split" && t.children.forEach((r) => w(r, n));
45
+ }
46
+ function A(t, n, r = []) {
47
+ if (t.id === n) return r;
48
+ if (t.type !== "group")
49
+ for (let e = 0; e < t.children.length; e++) {
50
+ const i = A(d(t.children, e), n, [...r, e]);
51
+ if (i) return i;
52
+ }
53
+ }
54
+ function G(t, n) {
55
+ let r = t;
56
+ for (const e of n) r = d(r.children, e);
57
+ return r;
58
+ }
59
+ function g(t, n, r) {
60
+ if (n.length === 0) return r;
61
+ const e = t, [i, ...s] = n, o = e.children.slice();
62
+ return o[i] = g(d(o, i), s, r), { ...e, children: o };
63
+ }
64
+ function _(t, n) {
65
+ return y(t).find((r) => r.id === n);
66
+ }
67
+ function I(t, n) {
68
+ const r = A(t, n.id);
69
+ return r ? g(t, r, n) : t;
70
+ }
71
+ function E(t, n, r = t.activeGroup) {
72
+ return n === t.root && r === t.activeGroup ? t : { version: 1, root: n, activeGroup: r };
73
+ }
74
+ function X(t, n, r) {
75
+ const e = (s) => s !== void 0 && N(n, []).some((o) => o.id === s);
76
+ if (e(r)) return r;
77
+ const i = xt(t, r);
78
+ return i !== void 0 && e(i) ? i : S(n).id;
79
+ }
80
+ function V(t, n) {
81
+ let r = 0;
82
+ return w(t, (e) => {
83
+ const i = /^(\D+)(\d+)$/.exec(e.id);
84
+ i && i[1] === n && (r = Math.max(r, Number(i[2])));
85
+ }), `${n}${r + 1}`;
86
+ }
87
+ function U(t) {
88
+ if (t.type === "group") return t;
89
+ let n = !1;
90
+ const r = [];
91
+ let e = [];
92
+ if (t.children.forEach((s, o) => {
93
+ var f;
94
+ const c = (f = t.sizes[o]) != null ? f : 0, u = U(s);
95
+ u !== s && (n = !0), u.type === "split" && u.direction === t.direction ? (n = !0, u.children.forEach((p, l) => {
96
+ var a;
97
+ r.push(p), e.push(c * ((a = u.sizes[l]) != null ? a : 0) / 100);
98
+ })) : (r.push(u), e.push(c));
99
+ }), r.length === 1) return d(r, 0);
100
+ const i = T(e);
101
+ return i > 0 && Math.abs(i - 100) > L && (n = !0, e = e.map((s) => s * 100 / i)), n ? { ...t, children: r, sizes: e } : t;
102
+ }
103
+ function ut(t, n) {
104
+ var u, f;
105
+ const r = n.slice(0, -1), e = d(n, n.length - 1), i = G(t, r), s = e > 0 ? e - 1 : e + 1, o = i.sizes.slice();
106
+ o[s] = ((u = o[s]) != null ? u : 0) + ((f = o[e]) != null ? f : 0), o.splice(e, 1);
107
+ const c = i.children.filter((p, l) => l !== e);
108
+ return U(g(t, r, { ...i, children: c, sizes: o }));
109
+ }
110
+ function B(t, n, r) {
111
+ var c, u;
112
+ const e = A(t, n.id), i = n.tabs.indexOf(r), s = n.tabs.filter((f) => f !== r);
113
+ if (s.length === 0 && e.length > 0) return { root: ut(t, e), closed: !0 };
114
+ const o = n.active === r ? (u = (c = s[i]) != null ? c : s[i - 1]) != null ? u : null : n.active;
115
+ return { root: g(t, e, { ...n, tabs: s, active: o }), closed: !1 };
116
+ }
117
+ function ft(t, n, r, e, i) {
118
+ const s = A(t, n), o = G(t, s), c = o.tabs.slice();
119
+ c.splice(z(e != null ? e : c.length, 0, c.length), 0, r);
120
+ const u = i || o.active === null ? r : o.active;
121
+ return g(t, s, { ...o, tabs: c, active: u });
122
+ }
123
+ function pt(t, n, r, e, i) {
124
+ var p;
125
+ const s = A(t, n), o = e === "left" || e === "right" ? "row" : "column", c = e === "left" || e === "top";
126
+ if (s.length > 0) {
127
+ const l = s.slice(0, -1), a = d(s, s.length - 1), h = G(t, l);
128
+ if (h.direction === o) {
129
+ const m = ((p = h.sizes[a]) != null ? p : 0) / 2, v = h.children.slice(), x = h.sizes.slice();
130
+ x[a] = m;
131
+ const M = c ? a : a + 1;
132
+ return v.splice(M, 0, r), x.splice(M, 0, m), g(t, l, { ...h, children: v, sizes: x });
133
+ }
134
+ }
135
+ const u = G(t, s);
136
+ return g(t, s, {
137
+ type: "split",
138
+ id: i,
139
+ direction: o,
140
+ children: c ? [r, u] : [u, r],
141
+ sizes: [50, 50]
142
+ });
143
+ }
144
+ function Tt(t = [], n = {}) {
145
+ var i;
146
+ const r = Array.from(new Set(t)), e = n.active !== void 0 && r.includes(n.active) ? n.active : (i = r[0]) != null ? i : null;
147
+ return {
148
+ version: 1,
149
+ root: { type: "group", id: "g1", tabs: r, active: e },
150
+ activeGroup: "g1"
151
+ };
152
+ }
153
+ function Z(t) {
154
+ return typeof t == "object" && t !== null && !Array.isArray(t);
155
+ }
156
+ function q(t, n, r = 0) {
157
+ var l;
158
+ if (!Z(t) || r > st) return null;
159
+ const e = typeof t.id == "string" ? t.id : "";
160
+ if (t.type === "group") {
161
+ const a = [];
162
+ if (Array.isArray(t.tabs))
163
+ for (const m of t.tabs)
164
+ typeof m != "string" || n.has(m) || (n.add(m), a.push(m));
165
+ const h = typeof t.active == "string" && a.includes(t.active) ? t.active : (l = a[0]) != null ? l : null;
166
+ return { type: "group", id: e, tabs: a, active: h };
167
+ }
168
+ const i = t.direction;
169
+ if (t.type !== "split" || i !== "row" && i !== "column" || !Array.isArray(t.children))
170
+ return null;
171
+ const s = t.children, o = t.sizes, c = Array.isArray(o) && o.length === s.length && o.every((a) => typeof a == "number" && Number.isFinite(a) && a > 0), u = c && !Number.isFinite(T(o) * 100) ? Math.max(...o) : 1, f = [], p = [];
172
+ return s.forEach((a, h) => {
173
+ var v;
174
+ const m = q(a, n, r + 1);
175
+ m && (f.push(m), p.push(c ? ((v = o[h]) != null ? v : u) / u : 1));
176
+ }), f.length === 0 ? null : { type: "split", id: e, direction: i, children: f, sizes: p };
177
+ }
178
+ function K(t) {
179
+ if (t.type === "group") return t.tabs.length > 0 ? t : null;
180
+ const n = [], r = [];
181
+ return t.children.forEach((e, i) => {
182
+ var o;
183
+ const s = K(e);
184
+ s && (n.push(s), r.push((o = t.sizes[i]) != null ? o : 0));
185
+ }), n.length > 0 ? { ...t, children: n, sizes: r } : null;
186
+ }
187
+ function W(t, n = 100, r = 100) {
188
+ if (t.type === "group") return t;
189
+ const e = t.direction === "row", i = e ? n : r, s = i > 0 ? F / i * 100 : 100;
190
+ let o = t.sizes;
191
+ if (s * o.length >= 100)
192
+ o.some((f) => Math.abs(f - 100 / t.sizes.length) > L) && (o = o.map(() => 100 / t.sizes.length));
193
+ else if (o.some((f) => f < s)) {
194
+ const f = T(o.map((l) => Math.max(0, s - l))), p = T(o.map((l) => Math.max(0, l - s)));
195
+ o = o.map((l) => l < s ? s : l - (l - s) * f / p);
196
+ }
197
+ let c = o !== t.sizes;
198
+ const u = t.children.map((f, p) => {
199
+ var h;
200
+ const l = ((h = o[p]) != null ? h : 0) / 100, a = W(f, e ? n * l : n, e ? r : r * l);
201
+ return a !== f && (c = !0), a;
202
+ });
203
+ return c ? { ...t, children: u, sizes: o } : t;
204
+ }
205
+ function lt(t) {
206
+ const n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set();
207
+ if (w(t, (s) => {
208
+ s.id !== "" && !n.has(s.id) ? n.add(s.id) : r.add(s);
209
+ }), r.size === 0) return t;
210
+ const e = { g: 0, s: 0 };
211
+ n.forEach((s) => {
212
+ const o = /^(\D+)(\d+)$/.exec(s);
213
+ o && (o[1] === "g" || o[1] === "s") && (e[o[1]] = Math.max(e[o[1]], Number(o[2])));
214
+ });
215
+ const i = (s) => {
216
+ const o = s.type === "group" ? "g" : "s", c = r.has(s) ? `${o}${++e[o]}` : s.id;
217
+ return s.type === "group" ? { ...s, id: c } : { ...s, id: c, children: s.children.map(i) };
218
+ };
219
+ return i(t);
220
+ }
221
+ function Gt(t, n = {}) {
222
+ if (!Z(t) || t.version !== 1) return null;
223
+ const r = q(t.root, /* @__PURE__ */ new Set());
224
+ if (!r) return null;
225
+ const e = K(r), i = lt(
226
+ e ? W(U(e)) : { type: "group", id: S(r).id, tabs: [], active: null }
227
+ ), s = N(i, []), o = s.some((u) => u.id === t.activeGroup) ? t.activeGroup : d(s, 0).id, c = { version: 1, root: i, activeGroup: o };
228
+ return n.tabs ? at(c, n.tabs) : c;
229
+ }
230
+ function at(t, n) {
231
+ const r = new Set(n);
232
+ let e = t;
233
+ return y(t).forEach(
234
+ (i) => i.tabs.forEach((s) => {
235
+ r.has(s) || (e = ht(e, s));
236
+ })
237
+ ), n.forEach((i) => {
238
+ $(e, i) || (e = J(e, i, { select: !1 }));
239
+ }), e;
240
+ }
241
+ function y(t) {
242
+ return N(t.root, []);
243
+ }
244
+ function $(t, n) {
245
+ return y(t).find((r) => r.tabs.includes(n));
246
+ }
247
+ function J(t, n, r = {}) {
248
+ var f, p;
249
+ const e = _(t, (f = r.group) != null ? f : t.activeGroup);
250
+ if (!e) return t;
251
+ const i = (p = r.select) != null ? p : !0, s = $(t, n);
252
+ if (s && s.id === e.id) {
253
+ const l = Q(t, s, n, r.index);
254
+ return i ? mt(l, n) : l;
255
+ }
256
+ let o = t.root, c = !1;
257
+ s && ({ root: o, closed: c } = B(o, s, n)), o = ft(o, e.id, n, r.index, i);
258
+ const u = i ? e.id : c ? X(t, o, t.activeGroup) : t.activeGroup;
259
+ return E(t, o, u);
260
+ }
261
+ function ht(t, n) {
262
+ const r = $(t, n);
263
+ if (!r) return t;
264
+ const { root: e } = B(t.root, r, n);
265
+ return E(t, e, X(t, e, t.activeGroup));
266
+ }
267
+ function mt(t, n) {
268
+ const r = $(t, n);
269
+ if (!r) return t;
270
+ const e = r.active === n ? t.root : I(t.root, { ...r, active: n });
271
+ return E(t, e, r.id);
272
+ }
273
+ function At(t, n) {
274
+ return _(t, n) ? E(t, t.root, n) : t;
275
+ }
276
+ function Q(t, n, r, e) {
277
+ const i = n.tabs.indexOf(r), s = n.tabs.length - 1, o = z(e != null ? e : s, 0, s);
278
+ if (o === i) return t;
279
+ const c = n.tabs.slice();
280
+ return c.splice(i, 1), c.splice(o, 0, r), E(t, I(t.root, { ...n, tabs: c }));
281
+ }
282
+ function Y(t, n, r) {
283
+ const e = $(t, n), i = _(t, r.group);
284
+ if (!e || !i) return t;
285
+ if (r.edge === void 0)
286
+ return i.id === e.id ? Q(t, e, n, r.index) : J(t, n, {
287
+ group: i.id,
288
+ ...r.index === void 0 ? {} : { index: r.index }
289
+ });
290
+ if (i.id === e.id && e.tabs.length < 2) return t;
291
+ const s = V(t.root, "g"), o = V(t.root, "s"), { root: c } = B(t.root, e, n), u = { type: "group", id: s, tabs: [n], active: n };
292
+ return E(t, pt(c, i.id, u, r.edge, o), s);
293
+ }
294
+ function Et(t, n, r) {
295
+ const e = $(t, n);
296
+ if (!e) return t;
297
+ const i = gt(t, e.id, r);
298
+ return i !== void 0 ? Y(t, n, { group: i }) : Y(t, n, { group: e.id, edge: r });
299
+ }
300
+ function dt(t, n, r) {
301
+ var s;
302
+ let e = 100, i = t;
303
+ for (const o of n) {
304
+ if (i.type !== "split") break;
305
+ i.direction === r && (e *= ((s = i.sizes[o]) != null ? s : 0) / (T(i.sizes) || 1)), i = d(i.children, o);
306
+ }
307
+ return e;
308
+ }
309
+ function tt(t, n, r) {
310
+ if (t.type === "group") return r;
311
+ const e = t.children.map((s) => tt(s, n, r));
312
+ if (t.direction !== n) return Math.max(...e);
313
+ const i = T(t.sizes) || 1;
314
+ return Math.max(
315
+ ...e.map((s, o) => {
316
+ var u;
317
+ const c = ((u = t.sizes[o]) != null ? u : 0) / i;
318
+ return c > 0 ? s / c : Number.POSITIVE_INFINITY;
319
+ })
320
+ );
321
+ }
322
+ function zt(t, n, r, e, i = 0) {
323
+ var M, D;
324
+ const s = A(t.root, n);
325
+ if (!s) return t;
326
+ const o = G(t.root, s);
327
+ if (o.type !== "split" || !Number.isInteger(r) || r < 0 || r >= o.children.length - 1 || Number.isNaN(e) || e === 0) return t;
328
+ const c = (M = o.sizes[r]) != null ? M : 0, u = (D = o.sizes[r + 1]) != null ? D : 0, f = c + u, p = dt(t.root, s, o.direction), l = p > 0 ? F / p * 100 : 0, a = (O) => Math.min(f, Math.max(l, tt(O, o.direction, i > 0 ? i : 0)));
329
+ let h = a(d(o.children, r)), m = a(d(o.children, r + 1));
330
+ if (h + m > f) {
331
+ const O = f / (h + m);
332
+ h *= O, m *= O;
333
+ }
334
+ const v = z(c + e, h, f - m);
335
+ if (v === c) return t;
336
+ const x = o.sizes.slice();
337
+ return x[r] = v, x[r + 1] = f - v, E(t, g(t.root, s, { ...o, sizes: x }));
338
+ }
339
+ function C(t, n, r, e) {
340
+ if (t.type === "group") {
341
+ r(t, n);
342
+ return;
343
+ }
344
+ const i = T(t.sizes) || 1, s = t.direction === "row", o = s ? n.x0 : n.y0, c = s ? n.x1 - n.x0 : n.y1 - n.y0;
345
+ let u = 0;
346
+ t.children.forEach((f, p) => {
347
+ var m;
348
+ const l = o + c * u / i;
349
+ u += (m = t.sizes[p]) != null ? m : 0;
350
+ const a = p === t.children.length - 1 ? s ? n.x1 : n.y1 : o + c * u / i, h = s ? { ...n, x0: l, x1: a } : { ...n, y0: l, y1: a };
351
+ C(f, h, r, e), e && p < t.children.length - 1 && e(t, p, a, n);
352
+ });
353
+ }
354
+ const nt = { x0: 0, y0: 0, x1: 100, y1: 100 };
355
+ function vt(t) {
356
+ const n = [];
357
+ return C(t.root, nt, (r, e) => n.push({ group: r, rect: e })), n;
358
+ }
359
+ function gt(t, n, r) {
360
+ var u;
361
+ const e = vt(t), i = (u = e.find((f) => f.group.id === n)) == null ? void 0 : u.rect;
362
+ if (!i) return;
363
+ const s = r === "left" || r === "right";
364
+ let o, c = b;
365
+ return e.forEach(({ group: f, rect: p }) => {
366
+ if (f.id === n || !(r === "right" ? Math.abs(p.x0 - i.x1) < b : r === "left" ? Math.abs(p.x1 - i.x0) < b : r === "bottom" ? Math.abs(p.y0 - i.y1) < b : Math.abs(p.y1 - i.y0) < b)) return;
367
+ const a = s ? Math.min(p.y1, i.y1) - Math.max(p.y0, i.y0) : Math.min(p.x1, i.x1) - Math.max(p.x0, i.x0);
368
+ a > c + L && (o = f.id, c = a);
369
+ }), o;
370
+ }
371
+ function xt(t, n) {
372
+ const r = A(t.root, n);
373
+ if (!r || r.length === 0 || G(t.root, r).type !== "group") return;
374
+ const e = G(t.root, r.slice(0, -1)), i = d(r, r.length - 1), s = e.children[i - 1];
375
+ if (s) return H(s).id;
376
+ const o = e.children[i + 1];
377
+ return o ? S(o).id : void 0;
378
+ }
379
+ function $t(t, n, r, e, i = 0.25) {
380
+ if (!(r > 0) || !(e > 0)) return "center";
381
+ const s = z(t, 0, r) / r, o = z(n, 0, e) / e, c = [
382
+ ["top", o],
383
+ ["right", 1 - s],
384
+ ["bottom", 1 - o],
385
+ ["left", s]
386
+ ];
387
+ let u = "center", f = 1 / 0;
388
+ return c.forEach(([p, l]) => {
389
+ l < i && l < f - ot && (u = p, f = l);
390
+ }), u;
391
+ }
392
+ function k(t) {
393
+ const n = [];
394
+ return t.slice().sort((r, e) => r - e).forEach((r) => {
395
+ const e = n[n.length - 1];
396
+ (e === void 0 || r - e >= b) && n.push(r);
397
+ }), n;
398
+ }
399
+ function P(t, n) {
400
+ let r = 0;
401
+ return t.forEach((e, i) => {
402
+ e <= n + 1e-9 && (r = i);
403
+ }), r;
404
+ }
405
+ function R(t, n, r) {
406
+ const e = P(t, n);
407
+ return [e, Math.max(e + 1, P(t, r))];
408
+ }
409
+ function j(t) {
410
+ return t.slice(1).map((n, r) => ct(n - d(t, r)));
411
+ }
412
+ function Mt(t) {
413
+ const n = [], r = [];
414
+ C(
415
+ t.root,
416
+ nt,
417
+ (c, u) => n.push({ group: c, rect: u }),
418
+ (c, u, f, p) => r.push({ split: c, index: u, position: f, rect: p })
419
+ );
420
+ const e = k(n.flatMap(({ rect: c }) => [c.x0, c.x1])), i = k(n.flatMap(({ rect: c }) => [c.y0, c.y1])), s = j(e), o = j(i);
421
+ return {
422
+ columns: s,
423
+ rows: o,
424
+ groups: n.map(({ group: c, rect: u }) => ({
425
+ id: c.id,
426
+ column: R(e, u.x0, u.x1),
427
+ row: R(i, u.y0, u.y1)
428
+ })),
429
+ separators: r.map(({ split: c, index: u, position: f, rect: p }) => {
430
+ const l = c.direction === "row", a = l ? s.length : o.length;
431
+ return {
432
+ split: c.id,
433
+ index: u,
434
+ orientation: l ? "vertical" : "horizontal",
435
+ line: z(P(l ? e : i, f), 1, Math.max(1, a - 1)),
436
+ span: l ? R(i, p.y0, p.y1) : R(e, p.x0, p.x1)
437
+ };
438
+ })
439
+ };
440
+ }
441
+ const rt = " var(--smwb-tab-groups-separator-size) ";
442
+ function Ot(t) {
443
+ return t.columns.map((n) => `minmax(0, ${n}fr)`).join(rt);
444
+ }
445
+ function Rt(t) {
446
+ return t.rows.map((n) => `auto minmax(0, ${n}fr)`).join(rt);
447
+ }
448
+ function Nt(t) {
449
+ const [n, r] = t.column, [e] = t.row;
450
+ return `${3 * e + 1} / ${2 * n + 1} / ${3 * e + 2} / ${2 * r}`;
451
+ }
452
+ function St(t) {
453
+ const [n, r] = t.column, [e, i] = t.row;
454
+ return `${3 * e + 2} / ${2 * n + 1} / ${3 * i} / ${2 * r}`;
455
+ }
456
+ function _t(t) {
457
+ const n = t.line, [r, e] = t.span;
458
+ return t.orientation === "vertical" ? `${3 * r + 1} / ${2 * n} / ${3 * e} / ${2 * n + 1}` : `${3 * n} / ${2 * r + 1} / ${3 * n + 1} / ${2 * e}`;
459
+ }
460
+ function yt(t, n, r, e = it) {
461
+ var o;
462
+ if (t.type === "split") return e.movedToNewGroup(r(t.tab), t.edge);
463
+ if (t.type !== "move") return "";
464
+ if (t.from === t.to) {
465
+ const c = _(n, t.to), u = c ? c.tabs.indexOf(t.tab) + 1 : 0;
466
+ return e.movedInGroup(r(t.tab), u || t.index + 1, (o = c == null ? void 0 : c.tabs.length) != null ? o : 0);
467
+ }
468
+ const i = y(n), s = i.findIndex((c) => c.id === t.to);
469
+ return e.movedToGroup(r(t.tab), s + 1, i.length);
470
+ }
471
+ export {
472
+ it as TAB_GROUPS_LABELS,
473
+ bt as TAB_GROUPS_LAYOUT_VERSION,
474
+ J as addTab,
475
+ xt as adjacentGroup,
476
+ Mt as computeTabGroupsGrid,
477
+ Tt as createTabGroupsLayout,
478
+ yt as describeTabGroupsChange,
479
+ $t as dropZoneAt,
480
+ $ as findGroupOfTab,
481
+ y as getGroups,
482
+ Ot as gridTemplateColumns,
483
+ Rt as gridTemplateRows,
484
+ St as groupBodyArea,
485
+ Nt as groupHeaderArea,
486
+ Y as moveTab,
487
+ Et as moveTabInDirection,
488
+ gt as neighbourGroup,
489
+ Gt as parseTabGroupsLayout,
490
+ ht as removeTab,
491
+ zt as resizeSplit,
492
+ mt as selectTab,
493
+ _t as separatorArea,
494
+ At as setActiveGroup,
495
+ at as syncTabs
496
+ };
497
+ //# sourceMappingURL=tabGroupsLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabGroupsLayout.js","sources":["../../../../src/components/layout/tabGroups/tabGroupsLayout.ts"],"sourcesContent":["/**\n * The pure layout model of `TabGroups`: the split tree, every operation on it and the grid\n * geometry drawn from it. There is no framework and no DOM here, so jsdom tests feed layouts\n * and numbers straight in, and the server and the client compute the same markup. The file is\n * a byte-identical copy in ui-react and ui-solid.\n *\n * Every operation is pure: it never mutates its input and returns the input object itself when\n * nothing changes. Unknown ids are no-ops, never errors.\n */\n\n/** The version of the layout JSON this model reads and writes. */\nexport const TAB_GROUPS_LAYOUT_VERSION = 1;\n\n/** An edge of a group: a tab dropped or moved there gets a new group on that side. */\nexport type TabGroupsEdge = \"top\" | \"right\" | \"bottom\" | \"left\";\n\n/** Where a drop over a group's body lands: into the group (`center`) or a new group at an edge. */\nexport type TabGroupsDropZone = \"center\" | TabGroupsEdge;\n\n/** A group: one tab row and its panels. */\nexport interface TabGroupsGroup {\n type: \"group\";\n /** Unique among all nodes. Generated ids are \"g1\", \"g2\", …; an app may use any string. */\n id: string;\n /** Tab ids in row order. A tab id appears in exactly one group. Empty only for the root group (nothing open). */\n tabs: string[];\n /** The selected tab: one of `tabs`; null only when `tabs` is empty. */\n active: string | null;\n}\n\n/** A split of an area into side-by-side or stacked children. */\nexport interface TabGroupsSplit {\n type: \"split\";\n /** Unique among all nodes. Generated ids are \"s1\", \"s2\", …. */\n id: string;\n /** \"row\": children side by side, left to right; \"column\": stacked, top to bottom. */\n direction: \"row\" | \"column\";\n /** At least two. Never a split of the same direction (it is flattened into this one). */\n children: TabGroupsNode[];\n /** Each child's share of this split in percent, same length as `children`, positive, summing to 100. */\n sizes: number[];\n}\n\n/** A node of the split tree. */\nexport type TabGroupsNode = TabGroupsGroup | TabGroupsSplit;\n\n/** The whole arrangement: what an app stores. Only ids and sizes, no labels or content. */\nexport interface TabGroupsLayout {\n version: 1;\n root: TabGroupsNode;\n /** The group the user last worked in: new tabs go there by default. Always an existing group id. */\n activeGroup: string;\n}\n\n/** What a layout change did: the second argument of `onLayoutChange`. */\nexport type TabGroupsChange =\n | { type: \"select\"; tab: string; group: string }\n /** Focus moved into another group. */\n | { type: \"activate\"; group: string }\n /** Into an existing group, including a reorder within the same group. */\n | { type: \"move\"; tab: string; from: string; to: string; index: number; sourceClosed: boolean }\n /** Into a new group at an edge; `to` is the new group. */\n | { type: \"split\"; tab: string; from: string; to: string; edge: TabGroupsEdge; sourceClosed: boolean }\n | { type: \"close\"; tab: string; group: string; groupClosed: boolean }\n | { type: \"resize\"; split: string; sizes: number[] };\n\n/** Where `moveTab` puts a tab. */\nexport type TabGroupsMoveTarget =\n /** Into an existing group; `index` = the tab's final index (default: the end). */\n | { group: string; index?: number; edge?: undefined }\n /** A new group at that edge of `group`. */\n | { group: string; edge: TabGroupsEdge };\n\n/** The CSS grid a layout is drawn on (see `computeTabGroupsGrid`). */\nexport interface TabGroupsGrid {\n /** Content column widths, percent, left to right. */\n columns: number[];\n /** Content row heights, percent, top to bottom. */\n rows: number[];\n /** Every group's content columns and rows, end-exclusive, in reading order. */\n groups: { id: string; column: [number, number]; row: [number, number] }[];\n /**\n * Every separator, in reading order (after the subtree of child `index` of its split). `line` is the\n * content boundary it sits on (1..n-1); `span` its extent across the other axis, end-exclusive.\n */\n separators: {\n split: string;\n index: number;\n orientation: \"vertical\" | \"horizontal\";\n line: number;\n span: [number, number];\n }[];\n}\n\n/** The texts of `TabGroups`. Numbers passed in are 1-based, as they are read out. */\nexport interface TabGroupsLabels {\n /** The tab row's name: \"Group 1 of 4\"; \"Tabs\" when count is 1. */\n group: (index: number, count: number) => string;\n /** The group actions button: \"Group actions\". */\n groupActions: string;\n /** \"Split right\". */\n splitRight: string;\n /** \"Split down\". */\n splitDown: string;\n /** \"Move to previous group\". */\n moveToPreviousGroup: string;\n /** \"Move to next group\". */\n moveToNextGroup: string;\n /** \"Move tab left\". */\n moveLeft: string;\n /** \"Move tab right\". */\n moveRight: string;\n /** The separators: \"Resize groups\". */\n resize: string;\n /** \"Terminal moved to group 2 of 3\". */\n movedToGroup: (tab: string, index: number, count: number) => string;\n /** \"Terminal moved to a new group on the right\" (below, on the left, above). */\n movedToNewGroup: (tab: string, edge: TabGroupsEdge) => string;\n /** \"Terminal moved to position 2 of 4\". */\n movedInGroup: (tab: string, position: number, count: number) => string;\n}\n\nconst NEW_GROUP_PLACES: Record<TabGroupsEdge, string> = {\n top: \"above\",\n right: \"on the right\",\n bottom: \"below\",\n left: \"on the left\",\n};\n\n/** The default (English) texts. */\nexport const TAB_GROUPS_LABELS: TabGroupsLabels = {\n group: (index, count) => (count === 1 ? \"Tabs\" : `Group ${index} of ${count}`),\n groupActions: \"Group actions\",\n splitRight: \"Split right\",\n splitDown: \"Split down\",\n moveToPreviousGroup: \"Move to previous group\",\n moveToNextGroup: \"Move to next group\",\n moveLeft: \"Move tab left\",\n moveRight: \"Move tab right\",\n resize: \"Resize groups\",\n movedToGroup: (tab, index, count) => `${tab} moved to group ${index} of ${count}`,\n movedToNewGroup: (tab, edge) => `${tab} moved to a new group ${NEW_GROUP_PLACES[edge]}`,\n movedInGroup: (tab, position, count) => `${tab} moved to position ${position} of ${count}`,\n};\n\n/** Grid boundaries closer than this (percent of the root) are one line. */\nconst SNAP = 0.05;\n/** Sizes summing to 100 within this are left as they are (float noise from halving and scaling). */\nconst SUM_TOLERANCE = 1e-6;\n/**\n * The least a group or split covers of the root along its split's axis, in percent: twice the\n * snap, so that its two edges never snap into one line and it keeps a grid track of its own.\n */\nconst MIN_EXTENT = SNAP * 2;\n/** How deep stored JSON may nest; a deeper node (or a cycle in an object) is not read. */\nconst MAX_DEPTH = 32;\n/**\n * Two edges of a drop area this close to the pointer (a fraction of it) are one tie, and the earlier\n * of the two wins. Without it the noise of `1 - 0.9` against `0.1` decides, and a corner that is\n * exactly as far from the top as from the right reads as the right edge.\n */\nconst ZONE_TOLERANCE = 1e-6;\n\n/** Child indexes from the root down to a node; `[]` is the root. */\ntype Path = number[];\n\n/** A rectangle in percent of the root: left/top inclusive, right/bottom the far edges. */\ninterface Rect {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n}\n\n/**\n * `items[index]` for an index the caller knows exists: one spelling for both packages (ui-solid\n * checks indexed access, ui-react does not). Only an internal bug can make it throw.\n */\nfunction itemAt<T>(items: readonly T[], index: number): T {\n const item = items[index];\n if (item === undefined) throw new RangeError(`tabGroupsLayout: no item at ${index}`);\n return item;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction round4(value: number): number {\n return Math.round(value * 10000) / 10000;\n}\n\nfunction sum(values: readonly number[]): number {\n return values.reduce((total, value) => total + value, 0);\n}\n\nfunction collectGroups(node: TabGroupsNode, out: TabGroupsGroup[]): TabGroupsGroup[] {\n if (node.type === \"group\") out.push(node);\n else node.children.forEach((child) => collectGroups(child, out));\n return out;\n}\n\nfunction firstGroup(node: TabGroupsNode): TabGroupsGroup {\n return node.type === \"group\" ? node : firstGroup(itemAt(node.children, 0));\n}\n\nfunction lastGroup(node: TabGroupsNode): TabGroupsGroup {\n return node.type === \"group\" ? node : lastGroup(itemAt(node.children, node.children.length - 1));\n}\n\nfunction forEachNode(node: TabGroupsNode, visit: (node: TabGroupsNode) => void): void {\n visit(node);\n if (node.type === \"split\") node.children.forEach((child) => forEachNode(child, visit));\n}\n\nfunction findPath(node: TabGroupsNode, id: string, path: Path = []): Path | undefined {\n if (node.id === id) return path;\n if (node.type === \"group\") return undefined;\n for (let index = 0; index < node.children.length; index++) {\n const found = findPath(itemAt(node.children, index), id, [...path, index]);\n if (found) return found;\n }\n return undefined;\n}\n\nfunction nodeAt(root: TabGroupsNode, path: Path): TabGroupsNode {\n let node = root;\n for (const index of path) node = itemAt((node as TabGroupsSplit).children, index);\n return node;\n}\n\n/** A copy of `root` with the node at `path` replaced; nodes off the path are shared. */\nfunction replaceAt(root: TabGroupsNode, path: Path, replacement: TabGroupsNode): TabGroupsNode {\n if (path.length === 0) return replacement;\n const split = root as TabGroupsSplit;\n const [index, ...rest] = path as [number, ...number[]];\n const children = split.children.slice();\n children[index] = replaceAt(itemAt(children, index), rest, replacement);\n return { ...split, children };\n}\n\nfunction getGroup(layout: TabGroupsLayout, groupId: string): TabGroupsGroup | undefined {\n return getGroups(layout).find((group) => group.id === groupId);\n}\n\nfunction replaceGroup(root: TabGroupsNode, group: TabGroupsGroup): TabGroupsNode {\n const path = findPath(root, group.id);\n return path ? replaceAt(root, path, group) : root;\n}\n\nfunction withRoot(layout: TabGroupsLayout, root: TabGroupsNode, activeGroup = layout.activeGroup): TabGroupsLayout {\n if (root === layout.root && activeGroup === layout.activeGroup) return layout;\n return { version: TAB_GROUPS_LAYOUT_VERSION, root, activeGroup };\n}\n\n/** `activeGroup` after a change: `wanted` if it still exists, else the group that took its space, else the first. */\nfunction resolveActiveGroup(before: TabGroupsLayout, root: TabGroupsNode, wanted: string): string {\n const exists = (id: string | undefined) =>\n id !== undefined && collectGroups(root, []).some((group) => group.id === id);\n if (exists(wanted)) return wanted;\n const heir = adjacentGroup(before, wanted);\n return heir !== undefined && exists(heir) ? heir : firstGroup(root).id;\n}\n\n/** \"g8\" when the largest number used with prefix \"g\" by any node is 7; \"g1\" when none is. */\nfunction nextId(root: TabGroupsNode, prefix: \"g\" | \"s\"): string {\n let max = 0;\n forEachNode(root, (node) => {\n const match = /^(\\D+)(\\d+)$/.exec(node.id);\n if (match && match[1] === prefix) max = Math.max(max, Number(match[2]));\n });\n return `${prefix}${max + 1}`;\n}\n\n/**\n * Collapses splits left with one child, flattens a child split of its parent's direction into\n * the parent (sizes scaled) and rescales sizes that do not sum to 100. Unchanged subtrees keep\n * their identity, so a normalized tree comes back as the same object.\n */\nfunction normalize(node: TabGroupsNode): TabGroupsNode {\n if (node.type === \"group\") return node;\n let changed = false;\n const children: TabGroupsNode[] = [];\n let sizes: number[] = [];\n node.children.forEach((child, index) => {\n const size = node.sizes[index] ?? 0;\n const next = normalize(child);\n if (next !== child) changed = true;\n if (next.type === \"split\" && next.direction === node.direction) {\n changed = true;\n next.children.forEach((grandchild, inner) => {\n children.push(grandchild);\n sizes.push((size * (next.sizes[inner] ?? 0)) / 100);\n });\n } else {\n children.push(next);\n sizes.push(size);\n }\n });\n if (children.length === 1) return itemAt(children, 0);\n const total = sum(sizes);\n if (total > 0 && Math.abs(total - 100) > SUM_TOLERANCE) {\n changed = true;\n sizes = sizes.map((size) => (size * 100) / total);\n }\n return changed ? { ...node, children, sizes } : node;\n}\n\n/** Removes the node at `path` (not the root); its share goes to the previous sibling, else the next. */\nfunction removeAt(root: TabGroupsNode, path: Path): TabGroupsNode {\n const parentPath = path.slice(0, -1);\n const index = itemAt(path, path.length - 1);\n const parent = nodeAt(root, parentPath) as TabGroupsSplit;\n const heir = index > 0 ? index - 1 : index + 1;\n const sizes = parent.sizes.slice();\n sizes[heir] = (sizes[heir] ?? 0) + (sizes[index] ?? 0);\n sizes.splice(index, 1);\n const children = parent.children.filter((_, i) => i !== index);\n return normalize(replaceAt(root, parentPath, { ...parent, children, sizes }));\n}\n\n/**\n * Takes a tab out of its group. When the closed tab was selected, the tab that takes its place\n * (the previous one if it was last) is selected. An emptied group other than the root is removed.\n */\nfunction detachTab(\n root: TabGroupsNode,\n group: TabGroupsGroup,\n tabId: string\n): { root: TabGroupsNode; closed: boolean } {\n const path = findPath(root, group.id)!;\n const index = group.tabs.indexOf(tabId);\n const tabs = group.tabs.filter((tab) => tab !== tabId);\n if (tabs.length === 0 && path.length > 0) return { root: removeAt(root, path), closed: true };\n const active = group.active === tabId ? (tabs[index] ?? tabs[index - 1] ?? null) : group.active;\n return { root: replaceAt(root, path, { ...group, tabs, active }), closed: false };\n}\n\n/** Puts a tab into a group at `index` (clamped; default the end). */\nfunction insertTab(\n root: TabGroupsNode,\n groupId: string,\n tabId: string,\n index: number | undefined,\n select: boolean\n): TabGroupsNode {\n const path = findPath(root, groupId)!;\n const group = nodeAt(root, path) as TabGroupsGroup;\n const tabs = group.tabs.slice();\n tabs.splice(clamp(index ?? tabs.length, 0, tabs.length), 0, tabId);\n const active = select || group.active === null ? tabId : group.active;\n return replaceAt(root, path, { ...group, tabs, active });\n}\n\n/** Puts `node` at `edge` of the node `targetId`: beside it in a split along that axis, else in a new 50/50 split. */\nfunction insertBeside(\n root: TabGroupsNode,\n targetId: string,\n node: TabGroupsNode,\n edge: TabGroupsEdge,\n splitId: string\n): TabGroupsNode {\n const path = findPath(root, targetId)!;\n const direction = edge === \"left\" || edge === \"right\" ? \"row\" : \"column\";\n const before = edge === \"left\" || edge === \"top\";\n if (path.length > 0) {\n const parentPath = path.slice(0, -1);\n const index = itemAt(path, path.length - 1);\n const parent = nodeAt(root, parentPath) as TabGroupsSplit;\n if (parent.direction === direction) {\n const half = (parent.sizes[index] ?? 0) / 2;\n const children = parent.children.slice();\n const sizes = parent.sizes.slice();\n sizes[index] = half;\n const at = before ? index : index + 1;\n children.splice(at, 0, node);\n sizes.splice(at, 0, half);\n return replaceAt(root, parentPath, { ...parent, children, sizes });\n }\n }\n const target = nodeAt(root, path);\n const split: TabGroupsSplit = {\n type: \"split\",\n id: splitId,\n direction,\n children: before ? [node, target] : [target, node],\n sizes: [50, 50],\n };\n return replaceAt(root, path, split);\n}\n\n/** A layout of one group \"g1\" holding `tabs`; `active` (when one of them) or the first is selected. */\nexport function createTabGroupsLayout(\n tabs: readonly string[] = [],\n options: { active?: string } = {}\n): TabGroupsLayout {\n const unique = Array.from(new Set(tabs));\n const active = options.active !== undefined && unique.includes(options.active) ? options.active : (unique[0] ?? null);\n return {\n version: TAB_GROUPS_LAYOUT_VERSION,\n root: { type: \"group\", id: \"g1\", tabs: unique, active },\n activeGroup: \"g1\",\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Reads one node of untrusted JSON; tab ids already taken (`seen`) are dropped. Ids are fixed later.\n * A node deeper than `MAX_DEPTH` is not read, which also ends a cycle.\n */\nfunction readNode(raw: unknown, seen: Set<string>, depth = 0): TabGroupsNode | null {\n if (!isRecord(raw) || depth > MAX_DEPTH) return null;\n const id = typeof raw.id === \"string\" ? raw.id : \"\";\n if (raw.type === \"group\") {\n const tabs: string[] = [];\n if (Array.isArray(raw.tabs)) {\n for (const tab of raw.tabs as unknown[]) {\n if (typeof tab !== \"string\" || seen.has(tab)) continue;\n seen.add(tab);\n tabs.push(tab);\n }\n }\n const active = typeof raw.active === \"string\" && tabs.includes(raw.active) ? raw.active : (tabs[0] ?? null);\n return { type: \"group\", id, tabs, active };\n }\n const direction = raw.direction;\n if (raw.type !== \"split\" || (direction !== \"row\" && direction !== \"column\") || !Array.isArray(raw.children)) {\n return null;\n }\n const rawChildren = raw.children as unknown[];\n const rawSizes = raw.sizes;\n const validSizes =\n Array.isArray(rawSizes) &&\n rawSizes.length === rawChildren.length &&\n (rawSizes as unknown[]).every((size) => typeof size === \"number\" && Number.isFinite(size) && size > 0);\n // Sizes near the float limit are read relative to the largest, so that they still add up (and\n // rescale) to numbers; any others as they are, so that a stored layout reads back unchanged.\n const scale =\n validSizes && !Number.isFinite(sum(rawSizes as number[]) * 100) ? Math.max(...(rawSizes as number[])) : 1;\n const children: TabGroupsNode[] = [];\n const sizes: number[] = [];\n rawChildren.forEach((rawChild, index) => {\n const child = readNode(rawChild, seen, depth + 1);\n if (!child) return;\n children.push(child);\n // Equal shares when the sizes are unusable; `normalize` rescales to 100.\n sizes.push(validSizes ? ((rawSizes as number[])[index] ?? scale) / scale : 1);\n });\n if (children.length === 0) return null;\n return { type: \"split\", id, direction, children, sizes };\n}\n\n/** Drops empty groups and the splits left without children; null when nothing is left. */\nfunction pruneEmpty(node: TabGroupsNode): TabGroupsNode | null {\n if (node.type === \"group\") return node.tabs.length > 0 ? node : null;\n const children: TabGroupsNode[] = [];\n const sizes: number[] = [];\n node.children.forEach((child, index) => {\n const next = pruneEmpty(child);\n if (!next) return;\n children.push(next);\n sizes.push(node.sizes[index] ?? 0);\n });\n return children.length > 0 ? { ...node, children, sizes } : null;\n}\n\n/**\n * Raises every share that the grid could not draw — a child covering less than `MIN_EXTENT` of the\n * root along its split's axis would snap into its neighbour's track — to that minimum, taking the\n * difference from its siblings above it; equal shares when the split is too small for that.\n * `width` and `height` are the node's extent in percent of the root. Sizes must sum to 100.\n */\nfunction keepDrawable(node: TabGroupsNode, width = 100, height = 100): TabGroupsNode {\n if (node.type === \"group\") return node;\n const row = node.direction === \"row\";\n const extent = row ? width : height;\n const floor = extent > 0 ? (MIN_EXTENT / extent) * 100 : 100;\n let sizes = node.sizes;\n if (floor * sizes.length >= 100) {\n if (sizes.some((size) => Math.abs(size - 100 / node.sizes.length) > SUM_TOLERANCE)) {\n sizes = sizes.map(() => 100 / node.sizes.length);\n }\n } else if (sizes.some((size) => size < floor)) {\n const short = sum(sizes.map((size) => Math.max(0, floor - size)));\n const spare = sum(sizes.map((size) => Math.max(0, size - floor)));\n sizes = sizes.map((size) => (size < floor ? floor : size - ((size - floor) * short) / spare));\n }\n let changed = sizes !== node.sizes;\n const children = node.children.map((child, index) => {\n const share = (sizes[index] ?? 0) / 100;\n const next = keepDrawable(child, row ? width * share : width, row ? height : height * share);\n if (next !== child) changed = true;\n return next;\n });\n return changed ? { ...node, children, sizes } : node;\n}\n\n/** Regenerates missing and duplicate node ids (the first in reading order keeps its id). */\nfunction assignIds(root: TabGroupsNode): TabGroupsNode {\n const used = new Set<string>();\n const missing = new Set<TabGroupsNode>();\n forEachNode(root, (node) => {\n if (node.id !== \"\" && !used.has(node.id)) used.add(node.id);\n else missing.add(node);\n });\n if (missing.size === 0) return root;\n const counters = { g: 0, s: 0 };\n used.forEach((id) => {\n const match = /^(\\D+)(\\d+)$/.exec(id);\n if (match && (match[1] === \"g\" || match[1] === \"s\")) {\n counters[match[1]] = Math.max(counters[match[1]], Number(match[2]));\n }\n });\n const rebuild = (node: TabGroupsNode): TabGroupsNode => {\n const prefix = node.type === \"group\" ? \"g\" : \"s\";\n const id = missing.has(node) ? `${prefix}${++counters[prefix]}` : node.id;\n return node.type === \"group\" ? { ...node, id } : { ...node, id, children: node.children.map(rebuild) };\n };\n return rebuild(root);\n}\n\n/**\n * Reads a layout from untrusted JSON (storage, a URL, a file). `null` for a non-object, a version\n * other than 1 or no valid root; anything else is repaired: non-string and duplicate tab ids\n * dropped (the first in reading order wins), empty non-root groups removed and splits collapsed\n * or flattened, an invalid `active` replaced by the first tab, unusable sizes replaced by equal\n * shares and all sizes rescaled to 100, missing or duplicate node ids regenerated, an invalid\n * `activeGroup` replaced by the first group. With `options.tabs` the layout is synced to that\n * list (`syncTabs`). A layout produced by this model round-trips through JSON unchanged.\n */\nexport function parseTabGroupsLayout(raw: unknown, options: { tabs?: readonly string[] } = {}): TabGroupsLayout | null {\n if (!isRecord(raw) || raw.version !== TAB_GROUPS_LAYOUT_VERSION) return null;\n const parsed = readNode(raw.root, new Set());\n if (!parsed) return null;\n const pruned = pruneEmpty(parsed);\n const root = assignIds(\n pruned ? keepDrawable(normalize(pruned)) : { type: \"group\", id: firstGroup(parsed).id, tabs: [], active: null }\n );\n const groups = collectGroups(root, []);\n const activeGroup = groups.some((group) => group.id === raw.activeGroup)\n ? (raw.activeGroup as string)\n : itemAt(groups, 0).id;\n const layout: TabGroupsLayout = { version: TAB_GROUPS_LAYOUT_VERSION, root, activeGroup };\n return options.tabs ? syncTabs(layout, options.tabs) : layout;\n}\n\n/** Makes the layout hold exactly `tabs`: unknown ids are closed, missing ones appended to `activeGroup`. */\nexport function syncTabs(layout: TabGroupsLayout, tabs: readonly string[]): TabGroupsLayout {\n const wanted = new Set(tabs);\n let next = layout;\n getGroups(layout).forEach((group) =>\n group.tabs.forEach((tab) => {\n if (!wanted.has(tab)) next = removeTab(next, tab);\n })\n );\n tabs.forEach((tab) => {\n if (!findGroupOfTab(next, tab)) next = addTab(next, tab, { select: false });\n });\n return next;\n}\n\n/** Every group in reading order (depth first): the order \"Group n of N\" counts in. */\nexport function getGroups(layout: TabGroupsLayout): TabGroupsGroup[] {\n return collectGroups(layout.root, []);\n}\n\n/** The group holding `tabId`. */\nexport function findGroupOfTab(layout: TabGroupsLayout, tabId: string): TabGroupsGroup | undefined {\n return getGroups(layout).find((group) => group.tabs.includes(tabId));\n}\n\n/**\n * Adds a tab to `options.group` (default `activeGroup`) at `options.index` (default the end),\n * selected unless `options.select` is false. An id already in the layout moves there instead.\n */\nexport function addTab(\n layout: TabGroupsLayout,\n tabId: string,\n options: { group?: string; index?: number; select?: boolean } = {}\n): TabGroupsLayout {\n const target = getGroup(layout, options.group ?? layout.activeGroup);\n if (!target) return layout;\n const select = options.select ?? true;\n const source = findGroupOfTab(layout, tabId);\n if (source && source.id === target.id) {\n const moved = reorderTab(layout, source, tabId, options.index);\n return select ? selectTab(moved, tabId) : moved;\n }\n let root = layout.root;\n let closed = false;\n if (source) ({ root, closed } = detachTab(root, source, tabId));\n root = insertTab(root, target.id, tabId, options.index, select);\n const activeGroup = select\n ? target.id\n : closed\n ? resolveActiveGroup(layout, root, layout.activeGroup)\n : layout.activeGroup;\n return withRoot(layout, root, activeGroup);\n}\n\n/**\n * Closes a tab. When it was its group's last tab the group goes too: its share passes to the\n * previous sibling (else the next), a split left with one child is replaced by that child and\n * `activeGroup` moves to the group that took the space. The last tab of the last group leaves\n * an empty root group.\n */\nexport function removeTab(layout: TabGroupsLayout, tabId: string): TabGroupsLayout {\n const group = findGroupOfTab(layout, tabId);\n if (!group) return layout;\n const { root } = detachTab(layout.root, group, tabId);\n return withRoot(layout, root, resolveActiveGroup(layout, root, layout.activeGroup));\n}\n\n/** Selects a tab in its group and makes that group `activeGroup`. */\nexport function selectTab(layout: TabGroupsLayout, tabId: string): TabGroupsLayout {\n const group = findGroupOfTab(layout, tabId);\n if (!group) return layout;\n const root = group.active === tabId ? layout.root : replaceGroup(layout.root, { ...group, active: tabId });\n return withRoot(layout, root, group.id);\n}\n\n/** Makes an existing group `activeGroup`. */\nexport function setActiveGroup(layout: TabGroupsLayout, groupId: string): TabGroupsLayout {\n return getGroup(layout, groupId) ? withRoot(layout, layout.root, groupId) : layout;\n}\n\nfunction reorderTab(\n layout: TabGroupsLayout,\n group: TabGroupsGroup,\n tabId: string,\n index: number | undefined\n): TabGroupsLayout {\n const from = group.tabs.indexOf(tabId);\n const last = group.tabs.length - 1;\n const to = clamp(index ?? last, 0, last);\n if (to === from) return layout;\n const tabs = group.tabs.slice();\n tabs.splice(from, 1);\n tabs.splice(to, 0, tabId);\n return withRoot(layout, replaceGroup(layout.root, { ...group, tabs }));\n}\n\n/**\n * Moves a tab. Into another group: inserted at `target.index` (its final index; default the end),\n * selected there, and that group becomes `activeGroup`. Within its own group: a reorder, the\n * selection stays. To an edge: a new group there holding the tab (see `TabGroupsEdge`); the own\n * edge of a group with one tab is a no-op. A source group left empty closes as in `removeTab`.\n */\nexport function moveTab(layout: TabGroupsLayout, tabId: string, target: TabGroupsMoveTarget): TabGroupsLayout {\n const source = findGroupOfTab(layout, tabId);\n const destination = getGroup(layout, target.group);\n if (!source || !destination) return layout;\n if (target.edge === undefined) {\n if (destination.id === source.id) return reorderTab(layout, source, tabId, target.index);\n return addTab(layout, tabId, {\n group: destination.id,\n ...(target.index === undefined ? {} : { index: target.index }),\n });\n }\n if (destination.id === source.id && source.tabs.length < 2) return layout;\n const groupId = nextId(layout.root, \"g\");\n const splitId = nextId(layout.root, \"s\");\n const { root } = detachTab(layout.root, source, tabId);\n const group: TabGroupsGroup = { type: \"group\", id: groupId, tabs: [tabId], active: tabId };\n return withRoot(layout, insertBeside(root, destination.id, group, target.edge, splitId), groupId);\n}\n\n/**\n * The keyboard move (Alt+Shift+Arrow): into the neighbouring group at that edge (appended,\n * selected); with no neighbour and at least two tabs in the group, a new group at that edge;\n * otherwise nothing.\n */\nexport function moveTabInDirection(layout: TabGroupsLayout, tabId: string, edge: TabGroupsEdge): TabGroupsLayout {\n const group = findGroupOfTab(layout, tabId);\n if (!group) return layout;\n const neighbour = neighbourGroup(layout, group.id, edge);\n if (neighbour !== undefined) return moveTab(layout, tabId, { group: neighbour });\n return moveTab(layout, tabId, { group: group.id, edge });\n}\n\n/** How much of the root a node covers along `direction`'s axis, in percent: its share of each split of that direction above it. */\nfunction extentAlong(root: TabGroupsNode, path: Path, direction: TabGroupsSplit[\"direction\"]): number {\n let extent = 100;\n let node = root;\n for (const index of path) {\n if (node.type !== \"split\") break;\n if (node.direction === direction) extent *= (node.sizes[index] ?? 0) / (sum(node.sizes) || 1);\n node = itemAt(node.children, index);\n }\n return extent;\n}\n\n/**\n * The least share of a split one of its children needs so that every group inside it keeps `min`\n * (both in percent of that split): `min` for a group, the most any child needs across the axis,\n * and along it the tightest child — a nested split keeps its proportions as it shrinks.\n */\nfunction leastShare(node: TabGroupsNode, direction: TabGroupsSplit[\"direction\"], min: number): number {\n if (node.type === \"group\") return min;\n const parts = node.children.map((child) => leastShare(child, direction, min));\n if (node.direction !== direction) return Math.max(...parts);\n const total = sum(node.sizes) || 1;\n return Math.max(\n ...parts.map((part, index) => {\n const fraction = (node.sizes[index] ?? 0) / total;\n return fraction > 0 ? part / fraction : Number.POSITIVE_INFINITY;\n })\n );\n}\n\n/**\n * Moves separator `index` of a split (between children `index` and `index + 1`) by `delta`\n * percent of the split (±Infinity: to the limit). Only that pair changes and the sizes still sum\n * to 100. Every group on both sides keeps at least `min` percent of the split (default 0) — a\n * nested split as a whole is held to what its groups need — and never so little that the grid\n * could not draw it (a few hundredths of a percent of the root).\n */\nexport function resizeSplit(\n layout: TabGroupsLayout,\n splitId: string,\n index: number,\n delta: number,\n min = 0\n): TabGroupsLayout {\n const path = findPath(layout.root, splitId);\n if (!path) return layout;\n const split = nodeAt(layout.root, path);\n if (split.type !== \"split\" || !Number.isInteger(index) || index < 0 || index >= split.children.length - 1) {\n return layout;\n }\n if (Number.isNaN(delta) || delta === 0) return layout;\n const first = split.sizes[index] ?? 0;\n const second = split.sizes[index + 1] ?? 0;\n const pair = first + second;\n const extent = extentAlong(layout.root, path, split.direction);\n const floor = extent > 0 ? (MIN_EXTENT / extent) * 100 : 0;\n const least = (child: TabGroupsNode): number =>\n Math.min(pair, Math.max(floor, leastShare(child, split.direction, min > 0 ? min : 0)));\n let lowFirst = least(itemAt(split.children, index));\n let lowSecond = least(itemAt(split.children, index + 1));\n // Both cannot have what they need: the pair is shared in proportion to it.\n if (lowFirst + lowSecond > pair) {\n const scale = pair / (lowFirst + lowSecond);\n lowFirst *= scale;\n lowSecond *= scale;\n }\n const next = clamp(first + delta, lowFirst, pair - lowSecond);\n if (next === first) return layout;\n const sizes = split.sizes.slice();\n sizes[index] = next;\n sizes[index + 1] = pair - next;\n return withRoot(layout, replaceAt(layout.root, path, { ...split, sizes }));\n}\n\n/** Walks the tree with each node's rectangle; `onSeparator` runs after the subtree of each child but the last. */\nfunction walkRects(\n node: TabGroupsNode,\n rect: Rect,\n onGroup: (group: TabGroupsGroup, rect: Rect) => void,\n onSeparator?: (split: TabGroupsSplit, index: number, position: number, rect: Rect) => void\n): void {\n if (node.type === \"group\") {\n onGroup(node, rect);\n return;\n }\n const total = sum(node.sizes) || 1;\n const row = node.direction === \"row\";\n const start = row ? rect.x0 : rect.y0;\n const extent = row ? rect.x1 - rect.x0 : rect.y1 - rect.y0;\n let offset = 0;\n node.children.forEach((child, index) => {\n const from = start + (extent * offset) / total;\n offset += node.sizes[index] ?? 0;\n // The last child ends exactly on the parent's edge, so shared boundaries compare equal.\n const to = index === node.children.length - 1 ? (row ? rect.x1 : rect.y1) : start + (extent * offset) / total;\n const childRect = row ? { ...rect, x0: from, x1: to } : { ...rect, y0: from, y1: to };\n walkRects(child, childRect, onGroup, onSeparator);\n if (onSeparator && index < node.children.length - 1) onSeparator(node, index, to, rect);\n });\n}\n\nconst ROOT_RECT: Rect = { x0: 0, y0: 0, x1: 100, y1: 100 };\n\nfunction groupRects(layout: TabGroupsLayout): { group: TabGroupsGroup; rect: Rect }[] {\n const out: { group: TabGroupsGroup; rect: Rect }[] = [];\n walkRects(layout.root, ROOT_RECT, (group, rect) => out.push({ group, rect }));\n return out;\n}\n\n/**\n * The group touching `edge` of the group `groupId` with the largest overlap along that edge\n * (ties: the first in reading order); undefined at the area's outer edge.\n */\nexport function neighbourGroup(layout: TabGroupsLayout, groupId: string, edge: TabGroupsEdge): string | undefined {\n const rects = groupRects(layout);\n const own = rects.find((entry) => entry.group.id === groupId)?.rect;\n if (!own) return undefined;\n const horizontal = edge === \"left\" || edge === \"right\";\n let best: string | undefined;\n let bestOverlap = SNAP;\n rects.forEach(({ group, rect }) => {\n if (group.id === groupId) return;\n const touches =\n edge === \"right\"\n ? Math.abs(rect.x0 - own.x1) < SNAP\n : edge === \"left\"\n ? Math.abs(rect.x1 - own.x0) < SNAP\n : edge === \"bottom\"\n ? Math.abs(rect.y0 - own.y1) < SNAP\n : Math.abs(rect.y1 - own.y0) < SNAP;\n if (!touches) return;\n const overlap = horizontal\n ? Math.min(rect.y1, own.y1) - Math.max(rect.y0, own.y0)\n : Math.min(rect.x1, own.x1) - Math.max(rect.x0, own.x0);\n if (overlap > bestOverlap + SUM_TOLERANCE) {\n best = group.id;\n bestOverlap = overlap;\n }\n });\n return best;\n}\n\n/**\n * The group that takes the space of `groupId` when it closes: the previous sibling's last group\n * in reading order, else the next sibling's first group; undefined for the root group.\n */\nexport function adjacentGroup(layout: TabGroupsLayout, groupId: string): string | undefined {\n const path = findPath(layout.root, groupId);\n if (!path || path.length === 0 || nodeAt(layout.root, path).type !== \"group\") return undefined;\n const parent = nodeAt(layout.root, path.slice(0, -1)) as TabGroupsSplit;\n const index = itemAt(path, path.length - 1);\n const previous = parent.children[index - 1];\n if (previous) return lastGroup(previous).id;\n const next = parent.children[index + 1];\n return next ? firstGroup(next).id : undefined;\n}\n\n/**\n * The drop zone under a point of a group's body (`x`, `y` relative to it, clamped into it): within\n * `edgeSize` (a fraction, default 0.25) of an edge, that edge; the nearest edge wins where bands\n * overlap (ties: top, right, bottom, left); else `center`.\n */\nexport function dropZoneAt(x: number, y: number, width: number, height: number, edgeSize = 0.25): TabGroupsDropZone {\n if (!(width > 0) || !(height > 0)) return \"center\";\n const px = clamp(x, 0, width) / width;\n const py = clamp(y, 0, height) / height;\n const distances: [TabGroupsEdge, number][] = [\n [\"top\", py],\n [\"right\", 1 - px],\n [\"bottom\", 1 - py],\n [\"left\", px],\n ];\n let zone: TabGroupsDropZone = \"center\";\n let nearest = Infinity;\n distances.forEach(([edge, distance]) => {\n // Only a distance smaller by more than the tolerance takes over, so a tie stays with the\n // earlier edge: top, then right, then bottom, then left.\n if (distance < edgeSize && distance < nearest - ZONE_TOLERANCE) {\n zone = edge;\n nearest = distance;\n }\n });\n return zone;\n}\n\n/** Sorted distinct boundaries; one closer than `SNAP` to the line before it joins that line. */\nfunction snapLines(values: number[]): number[] {\n const lines: number[] = [];\n values\n .slice()\n .sort((a, b) => a - b)\n .forEach((value) => {\n const last = lines[lines.length - 1];\n if (last === undefined || value - last >= SNAP) lines.push(value);\n });\n return lines;\n}\n\n/** The index of the line a boundary snapped to: the last line not after it. */\nfunction lineIndex(lines: number[], value: number): number {\n let found = 0;\n lines.forEach((line, index) => {\n if (line <= value + 1e-9) found = index;\n });\n return found;\n}\n\nfunction spans(lines: number[], from: number, to: number): [number, number] {\n const start = lineIndex(lines, from);\n return [start, Math.max(start + 1, lineIndex(lines, to))];\n}\n\nfunction tracks(lines: number[]): number[] {\n return lines.slice(1).map((line, index) => round4(line - itemAt(lines, index)));\n}\n\n/**\n * The grid a layout is drawn on: every group's rectangle in percent of the root, cut into\n * content columns and rows at the distinct boundaries (closer than 0.05 percent snap together).\n * Pure numbers, so the server and the client draw the same tracks.\n */\nexport function computeTabGroupsGrid(layout: TabGroupsLayout): TabGroupsGrid {\n const placed: { group: TabGroupsGroup; rect: Rect }[] = [];\n const cuts: { split: TabGroupsSplit; index: number; position: number; rect: Rect }[] = [];\n walkRects(\n layout.root,\n ROOT_RECT,\n (group, rect) => placed.push({ group, rect }),\n (split, index, position, rect) => cuts.push({ split, index, position, rect })\n );\n const xs = snapLines(placed.flatMap(({ rect }) => [rect.x0, rect.x1]));\n const ys = snapLines(placed.flatMap(({ rect }) => [rect.y0, rect.y1]));\n const columns = tracks(xs);\n const rows = tracks(ys);\n return {\n columns,\n rows,\n groups: placed.map(({ group, rect }) => ({\n id: group.id,\n column: spans(xs, rect.x0, rect.x1),\n row: spans(ys, rect.y0, rect.y1),\n })),\n separators: cuts.map(({ split, index, position, rect }) => {\n const vertical = split.direction === \"row\";\n const count = vertical ? columns.length : rows.length;\n return {\n split: split.id,\n index,\n orientation: vertical ? \"vertical\" : \"horizontal\",\n line: clamp(lineIndex(vertical ? xs : ys, position), 1, Math.max(1, count - 1)),\n span: vertical ? spans(ys, rect.y0, rect.y1) : spans(xs, rect.x0, rect.x1),\n };\n }),\n };\n}\n\nconst SEPARATOR_TRACK = \" var(--smwb-tab-groups-separator-size) \";\n\n/** `grid-template-columns`: a `minmax(0, <w>fr)` per content column, separator tracks between. */\nexport function gridTemplateColumns(grid: TabGroupsGrid): string {\n return grid.columns.map((width) => `minmax(0, ${width}fr)`).join(SEPARATOR_TRACK);\n}\n\n/** `grid-template-rows`: per content row an `auto` header track and a `minmax(0, <h>fr)` body track, separators between. */\nexport function gridTemplateRows(grid: TabGroupsGrid): string {\n return grid.rows.map((height) => `auto minmax(0, ${height}fr)`).join(SEPARATOR_TRACK);\n}\n\n/** The `grid-area` of a group's header (its tab row). */\nexport function groupHeaderArea(group: TabGroupsGrid[\"groups\"][number]): string {\n const [a, b] = group.column;\n const [c] = group.row;\n return `${3 * c + 1} / ${2 * a + 1} / ${3 * c + 2} / ${2 * b}`;\n}\n\n/** The `grid-area` of a group's panels. */\nexport function groupBodyArea(group: TabGroupsGrid[\"groups\"][number]): string {\n const [a, b] = group.column;\n const [c, d] = group.row;\n return `${3 * c + 2} / ${2 * a + 1} / ${3 * d} / ${2 * b}`;\n}\n\n/** The `grid-area` of a separator. */\nexport function separatorArea(separator: TabGroupsGrid[\"separators\"][number]): string {\n const k = separator.line;\n const [from, to] = separator.span;\n return separator.orientation === \"vertical\"\n ? `${3 * from + 1} / ${2 * k} / ${3 * to} / ${2 * k + 1}`\n : `${3 * k} / ${2 * from + 1} / ${3 * k + 1} / ${2 * to}`;\n}\n\n/**\n * The announcement of a change, read from the layout after it: \"Terminal moved to group 2 of 3\",\n * \"… to a new group on the right\", \"… to position 2 of 4\"; \"\" for select, activate, close and resize.\n */\nexport function describeTabGroupsChange(\n change: TabGroupsChange,\n layout: TabGroupsLayout,\n title: (tabId: string) => string,\n labels: TabGroupsLabels = TAB_GROUPS_LABELS\n): string {\n if (change.type === \"split\") return labels.movedToNewGroup(title(change.tab), change.edge);\n if (change.type !== \"move\") return \"\";\n if (change.from === change.to) {\n const group = getGroup(layout, change.to);\n const position = group ? group.tabs.indexOf(change.tab) + 1 : 0;\n return labels.movedInGroup(title(change.tab), position || change.index + 1, group?.tabs.length ?? 0);\n }\n const groups = getGroups(layout);\n const index = groups.findIndex((group) => group.id === change.to);\n return labels.movedToGroup(title(change.tab), index + 1, groups.length);\n}\n"],"names":["TAB_GROUPS_LAYOUT_VERSION","NEW_GROUP_PLACES","TAB_GROUPS_LABELS","index","count","tab","edge","position","SNAP","SUM_TOLERANCE","MIN_EXTENT","MAX_DEPTH","ZONE_TOLERANCE","itemAt","items","item","clamp","value","min","max","round4","sum","values","total","collectGroups","node","out","child","firstGroup","lastGroup","forEachNode","visit","findPath","id","path","found","nodeAt","root","replaceAt","replacement","split","rest","children","getGroup","layout","groupId","getGroups","group","replaceGroup","withRoot","activeGroup","resolveActiveGroup","before","wanted","exists","heir","adjacentGroup","nextId","prefix","match","normalize","changed","sizes","_a","size","next","grandchild","inner","removeAt","_b","parentPath","parent","_","i","detachTab","tabId","tabs","active","insertTab","select","insertBeside","targetId","splitId","direction","half","at","target","createTabGroupsLayout","options","unique","isRecord","readNode","raw","seen","depth","rawChildren","rawSizes","validSizes","scale","rawChild","pruneEmpty","keepDrawable","width","height","row","extent","floor","short","spare","share","assignIds","used","missing","counters","rebuild","parseTabGroupsLayout","parsed","pruned","groups","syncTabs","removeTab","findGroupOfTab","addTab","source","moved","reorderTab","selectTab","closed","setActiveGroup","from","last","to","moveTab","destination","moveTabInDirection","neighbour","neighbourGroup","extentAlong","leastShare","parts","part","fraction","resizeSplit","delta","first","second","pair","least","lowFirst","lowSecond","walkRects","rect","onGroup","onSeparator","start","offset","childRect","ROOT_RECT","groupRects","rects","own","entry","horizontal","best","bestOverlap","overlap","previous","dropZoneAt","x","y","edgeSize","px","py","distances","zone","nearest","distance","snapLines","lines","a","b","lineIndex","line","spans","tracks","computeTabGroupsGrid","placed","cuts","xs","ys","columns","rows","vertical","SEPARATOR_TRACK","gridTemplateColumns","grid","gridTemplateRows","groupHeaderArea","c","groupBodyArea","d","separatorArea","separator","k","describeTabGroupsChange","change","title","labels"],"mappings":"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"}