@smwb/ui-solid 0.13.0 → 0.14.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 (411) hide show
  1. package/README.md +564 -0
  2. package/dist/assets/styles/less/components/appBar/appBar.entry.css +1 -1
  3. package/dist/assets/styles/less/components/button/button.entry.css +1 -1
  4. package/dist/assets/styles/less/components/checkbox/checkbox.entry.css +1 -1
  5. package/dist/assets/styles/less/components/chip/chip.entry.css +1 -1
  6. package/dist/assets/styles/less/components/commandPalette/commandPalette.entry.css +1 -0
  7. package/dist/assets/styles/less/components/composer/composer.entry.css +1 -0
  8. package/dist/assets/styles/less/components/diffStat/diffStat.entry.css +1 -0
  9. package/dist/assets/styles/less/components/kbd/kbd.entry.css +1 -0
  10. package/dist/assets/styles/less/components/list/list.entry.css +1 -1
  11. package/dist/assets/styles/less/components/qrCode/qrCode.entry.css +1 -0
  12. package/dist/assets/styles/less/components/radioButton/radioButton.entry.css +1 -1
  13. package/dist/assets/styles/less/components/selectField/selectField.entry.css +1 -1
  14. package/dist/assets/styles/less/components/sidebar/sidebar.entry.css +1 -1
  15. package/dist/assets/styles/less/components/statusDot/statusDot.entry.css +1 -0
  16. package/dist/assets/styles/less/components/swimlanes/swimlanes.entry.css +1 -0
  17. package/dist/assets/styles/less/components/tabGroups/tabGroups.entry.css +1 -0
  18. package/dist/assets/styles/less/components/tabs/tab/tab.entry.css +1 -1
  19. package/dist/assets/styles/less/components/tabs/tabPanel/tabPanel.entry.css +1 -0
  20. package/dist/assets/styles/less/components/tabs/tabs.entry.css +1 -1
  21. package/dist/assets/styles/less/components/textField/textField.entry.css +1 -1
  22. package/dist/assets/styles/less/components/toggle/toggle.entry.css +1 -1
  23. package/dist/assets/styles/less/components/treeView/treeView.entry.css +1 -1
  24. package/dist/assets/styles/less/tokens.entry.css +1 -1
  25. package/dist/components/dataDisplay/chat/chat.d.ts +42 -0
  26. package/dist/components/dataDisplay/chat/chat.js +116 -57
  27. package/dist/components/dataDisplay/chat/chat.js.map +1 -1
  28. package/dist/components/dataDisplay/chat/chatComposer.d.ts +17 -0
  29. package/dist/components/dataDisplay/chat/chatComposer.js +21 -19
  30. package/dist/components/dataDisplay/chat/chatComposer.js.map +1 -1
  31. package/dist/components/dataDisplay/chat/index.d.ts +1 -1
  32. package/dist/components/dataDisplay/chat/utils.d.ts +14 -0
  33. package/dist/components/dataDisplay/chat/utils.js.map +1 -1
  34. package/dist/components/dataDisplay/dagView/dagView.js +238 -223
  35. package/dist/components/dataDisplay/dagView/dagView.js.map +1 -1
  36. package/dist/components/dataDisplay/diffStat/diffStat.d.ts +55 -0
  37. package/dist/components/dataDisplay/diffStat/diffStat.js +70 -0
  38. package/dist/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  39. package/dist/components/dataDisplay/diffStat/index.d.ts +2 -0
  40. package/dist/components/dataDisplay/kbd/index.d.ts +4 -0
  41. package/dist/components/dataDisplay/kbd/kbd.d.ts +41 -0
  42. package/dist/components/dataDisplay/kbd/kbd.js +47 -0
  43. package/dist/components/dataDisplay/kbd/kbd.js.map +1 -0
  44. package/dist/components/dataDisplay/kbd/kbdKeys.d.ts +18 -0
  45. package/dist/components/dataDisplay/kbd/kbdKeys.js +70 -0
  46. package/dist/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  47. package/dist/components/dataDisplay/list/listItem.d.ts +34 -0
  48. package/dist/components/dataDisplay/list/listItem.js +57 -20
  49. package/dist/components/dataDisplay/list/listItem.js.map +1 -1
  50. package/dist/components/dataDisplay/qrCode/index.d.ts +2 -0
  51. package/dist/components/dataDisplay/qrCode/qrCode.d.ts +30 -0
  52. package/dist/components/dataDisplay/qrCode/qrCode.js +88 -0
  53. package/dist/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  54. package/dist/components/dataDisplay/qrCode/qrCodePath.d.ts +7 -0
  55. package/dist/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  56. package/dist/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  57. package/dist/components/dataDisplay/statusDot/index.d.ts +2 -0
  58. package/dist/components/dataDisplay/statusDot/statusDot.d.ts +35 -0
  59. package/dist/components/dataDisplay/statusDot/statusDot.js +31 -0
  60. package/dist/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  61. package/dist/components/dataDisplay/swimlanes/index.d.ts +2 -0
  62. package/dist/components/dataDisplay/swimlanes/swimlanes.d.ts +75 -0
  63. package/dist/components/dataDisplay/swimlanes/swimlanes.js +361 -0
  64. package/dist/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  65. package/dist/components/dataDisplay/treeView/treeView.d.ts +20 -0
  66. package/dist/components/dataDisplay/treeView/treeView.js +161 -95
  67. package/dist/components/dataDisplay/treeView/treeView.js.map +1 -1
  68. package/dist/components/feedBack/modal/modal.d.ts +9 -0
  69. package/dist/components/feedBack/modal/modal.js +68 -54
  70. package/dist/components/feedBack/modal/modal.js.map +1 -1
  71. package/dist/components/inputs/button/button.d.ts +12 -0
  72. package/dist/components/inputs/button/button.js +44 -37
  73. package/dist/components/inputs/button/button.js.map +1 -1
  74. package/dist/components/inputs/composer/composer.d.ts +148 -0
  75. package/dist/components/inputs/composer/composer.js +276 -0
  76. package/dist/components/inputs/composer/composer.js.map +1 -0
  77. package/dist/components/inputs/composer/composerFiles.d.ts +26 -0
  78. package/dist/components/inputs/composer/composerFiles.js +18 -0
  79. package/dist/components/inputs/composer/composerFiles.js.map +1 -0
  80. package/dist/components/inputs/composer/composerKeys.d.ts +29 -0
  81. package/dist/components/inputs/composer/composerKeys.js +7 -0
  82. package/dist/components/inputs/composer/composerKeys.js.map +1 -0
  83. package/dist/components/inputs/composer/index.d.ts +3 -0
  84. package/dist/components/layout/sheet/sheet.d.ts +12 -0
  85. package/dist/components/layout/sheet/sheet.js +100 -86
  86. package/dist/components/layout/sheet/sheet.js.map +1 -1
  87. package/dist/components/layout/tabGroups/index.d.ts +4 -0
  88. package/dist/components/layout/tabGroups/tabGroups.d.ts +102 -0
  89. package/dist/components/layout/tabGroups/tabGroups.js +895 -0
  90. package/dist/components/layout/tabGroups/tabGroups.js.map +1 -0
  91. package/dist/components/layout/tabGroups/tabGroupsFocus.d.ts +55 -0
  92. package/dist/components/layout/tabGroups/tabGroupsFocus.js +192 -0
  93. package/dist/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  94. package/dist/components/layout/tabGroups/tabGroupsLayout.d.ts +250 -0
  95. package/dist/components/layout/tabGroups/tabGroupsLayout.js +480 -0
  96. package/dist/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  97. package/dist/components/navigation/appBar/appBar.d.ts +22 -0
  98. package/dist/components/navigation/appBar/appBar.js +60 -22
  99. package/dist/components/navigation/appBar/appBar.js.map +1 -1
  100. package/dist/components/navigation/commandPalette/commandPalette.d.ts +126 -0
  101. package/dist/components/navigation/commandPalette/commandPalette.js +457 -0
  102. package/dist/components/navigation/commandPalette/commandPalette.js.map +1 -0
  103. package/dist/components/navigation/commandPalette/commandPaletteFilter.d.ts +11 -0
  104. package/dist/components/navigation/commandPalette/commandPaletteFilter.js +15 -0
  105. package/dist/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  106. package/dist/components/navigation/commandPalette/commandPaletteNavigation.d.ts +13 -0
  107. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  108. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  109. package/dist/components/navigation/commandPalette/commandPaletteTypes.d.ts +39 -0
  110. package/dist/components/navigation/commandPalette/index.d.ts +6 -0
  111. package/dist/components/navigation/sidebar/sidebar.d.ts +10 -0
  112. package/dist/components/navigation/sidebar/sidebar.js +12 -10
  113. package/dist/components/navigation/sidebar/sidebar.js.map +1 -1
  114. package/dist/components/navigation/tabs/index.d.ts +3 -1
  115. package/dist/components/navigation/tabs/tab/tab.d.ts +89 -2
  116. package/dist/components/navigation/tabs/tab/tab.js +164 -44
  117. package/dist/components/navigation/tabs/tab/tab.js.map +1 -1
  118. package/dist/components/navigation/tabs/tabPanel/tabPanel.d.ts +20 -0
  119. package/dist/components/navigation/tabs/tabPanel/tabPanel.js +34 -0
  120. package/dist/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  121. package/dist/components/navigation/tabs/tabs.d.ts +73 -3
  122. package/dist/components/navigation/tabs/tabs.js +387 -160
  123. package/dist/components/navigation/tabs/tabs.js.map +1 -1
  124. package/dist/components/navigation/tabs/tabs.utils.d.ts +20 -0
  125. package/dist/components/navigation/tabs/tabs.utils.js +11 -0
  126. package/dist/components/navigation/tabs/tabs.utils.js.map +1 -0
  127. package/dist/components/navigation/tabs/tabsContext.d.ts +31 -1
  128. package/dist/components/navigation/tabs/tabsContext.js.map +1 -1
  129. package/dist/headless/components/dataDisplay/chat/chat.js +116 -57
  130. package/dist/headless/components/dataDisplay/chat/chat.js.map +1 -1
  131. package/dist/headless/components/dataDisplay/chat/chatComposer.js +21 -19
  132. package/dist/headless/components/dataDisplay/chat/chatComposer.js.map +1 -1
  133. package/dist/headless/components/dataDisplay/chat/utils.js.map +1 -1
  134. package/dist/headless/components/dataDisplay/dagView/dagView.js +238 -223
  135. package/dist/headless/components/dataDisplay/dagView/dagView.js.map +1 -1
  136. package/dist/headless/components/dataDisplay/diffStat/diffStat.js +68 -0
  137. package/dist/headless/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  138. package/dist/headless/components/dataDisplay/kbd/kbd.js +45 -0
  139. package/dist/headless/components/dataDisplay/kbd/kbd.js.map +1 -0
  140. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js +70 -0
  141. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  142. package/dist/headless/components/dataDisplay/list/listItem.js +57 -20
  143. package/dist/headless/components/dataDisplay/list/listItem.js.map +1 -1
  144. package/dist/headless/components/dataDisplay/qrCode/qrCode.js +86 -0
  145. package/dist/headless/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  146. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  147. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  148. package/dist/headless/components/dataDisplay/statusDot/statusDot.js +29 -0
  149. package/dist/headless/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  150. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js +359 -0
  151. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  152. package/dist/headless/components/dataDisplay/treeView/treeView.js +161 -95
  153. package/dist/headless/components/dataDisplay/treeView/treeView.js.map +1 -1
  154. package/dist/headless/components/feedBack/modal/modal.js +68 -54
  155. package/dist/headless/components/feedBack/modal/modal.js.map +1 -1
  156. package/dist/headless/components/inputs/button/button.js +42 -35
  157. package/dist/headless/components/inputs/button/button.js.map +1 -1
  158. package/dist/headless/components/inputs/composer/composer.js +274 -0
  159. package/dist/headless/components/inputs/composer/composer.js.map +1 -0
  160. package/dist/headless/components/inputs/composer/composerFiles.js +18 -0
  161. package/dist/headless/components/inputs/composer/composerFiles.js.map +1 -0
  162. package/dist/headless/components/inputs/composer/composerKeys.js +7 -0
  163. package/dist/headless/components/inputs/composer/composerKeys.js.map +1 -0
  164. package/dist/headless/components/layout/sheet/sheet.js +100 -86
  165. package/dist/headless/components/layout/sheet/sheet.js.map +1 -1
  166. package/dist/headless/components/layout/tabGroups/tabGroups.js +893 -0
  167. package/dist/headless/components/layout/tabGroups/tabGroups.js.map +1 -0
  168. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js +192 -0
  169. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  170. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js +480 -0
  171. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  172. package/dist/headless/components/navigation/appBar/appBar.js +64 -26
  173. package/dist/headless/components/navigation/appBar/appBar.js.map +1 -1
  174. package/dist/headless/components/navigation/commandPalette/commandPalette.js +455 -0
  175. package/dist/headless/components/navigation/commandPalette/commandPalette.js.map +1 -0
  176. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js +15 -0
  177. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  178. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  179. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  180. package/dist/headless/components/navigation/sidebar/sidebar.js +28 -26
  181. package/dist/headless/components/navigation/sidebar/sidebar.js.map +1 -1
  182. package/dist/headless/components/navigation/tabs/tab/tab.js +164 -44
  183. package/dist/headless/components/navigation/tabs/tab/tab.js.map +1 -1
  184. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js +32 -0
  185. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  186. package/dist/headless/components/navigation/tabs/tabs.js +387 -160
  187. package/dist/headless/components/navigation/tabs/tabs.js.map +1 -1
  188. package/dist/headless/components/navigation/tabs/tabs.utils.js +11 -0
  189. package/dist/headless/components/navigation/tabs/tabs.utils.js.map +1 -0
  190. package/dist/headless/components/navigation/tabs/tabsContext.js.map +1 -1
  191. package/dist/headless/index.js +405 -367
  192. package/dist/headless/index.js.map +1 -1
  193. package/dist/headless/primitives/createFocusTrap.js +17 -17
  194. package/dist/headless/primitives/createFocusTrap.js.map +1 -1
  195. package/dist/headless/primitives/createKeyboardShortcut.js +16 -0
  196. package/dist/headless/primitives/createKeyboardShortcut.js.map +1 -0
  197. package/dist/headless/primitives/restoreFocus.js +10 -0
  198. package/dist/headless/primitives/restoreFocus.js.map +1 -0
  199. package/dist/headless/source/components/dataDisplay/chat/chat.jsx +38 -4
  200. package/dist/headless/source/components/dataDisplay/chat/chat.jsx.map +1 -1
  201. package/dist/headless/source/components/dataDisplay/chat/chatComposer.jsx +1 -0
  202. package/dist/headless/source/components/dataDisplay/chat/chatComposer.jsx.map +1 -1
  203. package/dist/headless/source/components/dataDisplay/chat/index.js.map +1 -1
  204. package/dist/headless/source/components/dataDisplay/chat/utils.js.map +2 -2
  205. package/dist/headless/source/components/dataDisplay/dagView/dagView.jsx +30 -21
  206. package/dist/headless/source/components/dataDisplay/dagView/dagView.jsx.map +1 -1
  207. package/dist/headless/source/components/dataDisplay/diffStat/diffStat.jsx +76 -0
  208. package/dist/headless/source/components/dataDisplay/diffStat/diffStat.jsx.map +1 -0
  209. package/dist/headless/source/components/dataDisplay/diffStat/index.js +19 -0
  210. package/dist/headless/source/components/dataDisplay/diffStat/index.js.map +7 -0
  211. package/dist/headless/source/components/dataDisplay/kbd/index.js +9 -0
  212. package/dist/headless/source/components/dataDisplay/kbd/index.js.map +7 -0
  213. package/dist/headless/source/components/dataDisplay/kbd/kbd.jsx +48 -0
  214. package/dist/headless/source/components/dataDisplay/kbd/kbd.jsx.map +1 -0
  215. package/dist/headless/source/components/dataDisplay/kbd/kbdKeys.js +79 -0
  216. package/dist/headless/source/components/dataDisplay/kbd/kbdKeys.js.map +7 -0
  217. package/dist/headless/source/components/dataDisplay/list/listItem.jsx +37 -7
  218. package/dist/headless/source/components/dataDisplay/list/listItem.jsx.map +1 -1
  219. package/dist/headless/source/components/dataDisplay/qrCode/index.js +6 -0
  220. package/dist/headless/source/components/dataDisplay/qrCode/index.js.map +7 -0
  221. package/dist/headless/source/components/dataDisplay/qrCode/qrCode.jsx +94 -0
  222. package/dist/headless/source/components/dataDisplay/qrCode/qrCode.jsx.map +1 -0
  223. package/dist/headless/source/components/dataDisplay/qrCode/qrCodePath.js +24 -0
  224. package/dist/headless/source/components/dataDisplay/qrCode/qrCodePath.js.map +7 -0
  225. package/dist/headless/source/components/dataDisplay/statusDot/index.js +6 -0
  226. package/dist/headless/source/components/dataDisplay/statusDot/index.js.map +7 -0
  227. package/dist/headless/source/components/dataDisplay/statusDot/statusDot.jsx +28 -0
  228. package/dist/headless/source/components/dataDisplay/statusDot/statusDot.jsx.map +1 -0
  229. package/dist/headless/source/components/dataDisplay/swimlanes/index.js +15 -0
  230. package/dist/headless/source/components/dataDisplay/swimlanes/index.js.map +7 -0
  231. package/dist/headless/source/components/dataDisplay/swimlanes/swimlanes.jsx +450 -0
  232. package/dist/headless/source/components/dataDisplay/swimlanes/swimlanes.jsx.map +1 -0
  233. package/dist/headless/source/components/dataDisplay/treeView/treeView.jsx +118 -37
  234. package/dist/headless/source/components/dataDisplay/treeView/treeView.jsx.map +1 -1
  235. package/dist/headless/source/components/feedBack/modal/modal.jsx +34 -4
  236. package/dist/headless/source/components/feedBack/modal/modal.jsx.map +1 -1
  237. package/dist/headless/source/components/inputs/button/button.jsx +6 -2
  238. package/dist/headless/source/components/inputs/button/button.jsx.map +1 -1
  239. package/dist/headless/source/components/inputs/composer/composer.jsx +319 -0
  240. package/dist/headless/source/components/inputs/composer/composer.jsx.map +1 -0
  241. package/dist/headless/source/components/inputs/composer/composerFiles.js +27 -0
  242. package/dist/headless/source/components/inputs/composer/composerFiles.js.map +7 -0
  243. package/dist/headless/source/components/inputs/composer/composerKeys.js +11 -0
  244. package/dist/headless/source/components/inputs/composer/composerKeys.js.map +7 -0
  245. package/dist/headless/source/components/inputs/composer/index.js +5 -0
  246. package/dist/headless/source/components/inputs/composer/index.js.map +7 -0
  247. package/dist/headless/source/components/layout/sheet/sheet.jsx +33 -11
  248. package/dist/headless/source/components/layout/sheet/sheet.jsx.map +1 -1
  249. package/dist/headless/source/components/layout/tabGroups/index.js +8 -0
  250. package/dist/headless/source/components/layout/tabGroups/index.js.map +7 -0
  251. package/dist/headless/source/components/layout/tabGroups/tabGroups.jsx +1117 -0
  252. package/dist/headless/source/components/layout/tabGroups/tabGroups.jsx.map +1 -0
  253. package/dist/headless/source/components/layout/tabGroups/tabGroupsFocus.js +222 -0
  254. package/dist/headless/source/components/layout/tabGroups/tabGroupsFocus.js.map +7 -0
  255. package/dist/headless/source/components/layout/tabGroups/tabGroupsLayout.js +629 -0
  256. package/dist/headless/source/components/layout/tabGroups/tabGroupsLayout.js.map +7 -0
  257. package/dist/headless/source/components/navigation/appBar/appBar.jsx +27 -3
  258. package/dist/headless/source/components/navigation/appBar/appBar.jsx.map +1 -1
  259. package/dist/headless/source/components/navigation/commandPalette/commandPalette.jsx +506 -0
  260. package/dist/headless/source/components/navigation/commandPalette/commandPalette.jsx.map +1 -0
  261. package/dist/headless/source/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  262. package/dist/headless/source/components/navigation/commandPalette/commandPaletteFilter.js.map +7 -0
  263. package/dist/headless/source/components/navigation/commandPalette/commandPaletteNavigation.js +54 -0
  264. package/dist/headless/source/components/navigation/commandPalette/commandPaletteNavigation.js.map +7 -0
  265. package/dist/headless/source/components/navigation/commandPalette/commandPaletteTypes.js +1 -0
  266. package/dist/headless/source/components/navigation/commandPalette/commandPaletteTypes.js.map +7 -0
  267. package/dist/headless/source/components/navigation/commandPalette/index.js +11 -0
  268. package/dist/headless/source/components/navigation/commandPalette/index.js.map +7 -0
  269. package/dist/headless/source/components/navigation/sidebar/sidebar.jsx +5 -2
  270. package/dist/headless/source/components/navigation/sidebar/sidebar.jsx.map +1 -1
  271. package/dist/headless/source/components/navigation/tabs/index.js +2 -0
  272. package/dist/headless/source/components/navigation/tabs/index.js.map +2 -2
  273. package/dist/headless/source/components/navigation/tabs/tab/tab.jsx +135 -8
  274. package/dist/headless/source/components/navigation/tabs/tab/tab.jsx.map +1 -1
  275. package/dist/headless/source/components/navigation/tabs/tabPanel/tabPanel.jsx +28 -0
  276. package/dist/headless/source/components/navigation/tabs/tabPanel/tabPanel.jsx.map +1 -0
  277. package/dist/headless/source/components/navigation/tabs/tabs.jsx +361 -13
  278. package/dist/headless/source/components/navigation/tabs/tabs.jsx.map +1 -1
  279. package/dist/headless/source/components/navigation/tabs/tabs.utils.js +18 -0
  280. package/dist/headless/source/components/navigation/tabs/tabs.utils.js.map +7 -0
  281. package/dist/headless/source/components/navigation/tabs/tabsContext.js.map +2 -2
  282. package/dist/headless/source/index.js +41 -1
  283. package/dist/headless/source/index.js.map +2 -2
  284. package/dist/headless/source/primitives/createFocusTrap.js +8 -3
  285. package/dist/headless/source/primitives/createFocusTrap.js.map +2 -2
  286. package/dist/headless/source/primitives/createKeyboardShortcut.js +23 -0
  287. package/dist/headless/source/primitives/createKeyboardShortcut.js.map +7 -0
  288. package/dist/headless/source/primitives/restoreFocus.js +14 -0
  289. package/dist/headless/source/primitives/restoreFocus.js.map +7 -0
  290. package/dist/headless/source/utils/keyboardShortcut.js +74 -0
  291. package/dist/headless/source/utils/keyboardShortcut.js.map +7 -0
  292. package/dist/headless/source/utils/linkAttrs.js +16 -0
  293. package/dist/headless/source/utils/linkAttrs.js.map +7 -0
  294. package/dist/headless/utils/keyboardShortcut.js +48 -0
  295. package/dist/headless/utils/keyboardShortcut.js.map +1 -0
  296. package/dist/headless/utils/linkAttrs.js +13 -0
  297. package/dist/headless/utils/linkAttrs.js.map +1 -0
  298. package/dist/index.d.ts +24 -3
  299. package/dist/index.js +405 -367
  300. package/dist/index.js.map +1 -1
  301. package/dist/primitives/createFocusTrap.d.ts +5 -0
  302. package/dist/primitives/createFocusTrap.js +17 -17
  303. package/dist/primitives/createFocusTrap.js.map +1 -1
  304. package/dist/primitives/createKeyboardShortcut.d.ts +23 -0
  305. package/dist/primitives/createKeyboardShortcut.js +16 -0
  306. package/dist/primitives/createKeyboardShortcut.js.map +1 -0
  307. package/dist/primitives/restoreFocus.d.ts +8 -0
  308. package/dist/primitives/restoreFocus.js +10 -0
  309. package/dist/primitives/restoreFocus.js.map +1 -0
  310. package/dist/source/components/dataDisplay/chat/chat.jsx +38 -4
  311. package/dist/source/components/dataDisplay/chat/chat.jsx.map +1 -1
  312. package/dist/source/components/dataDisplay/chat/chatComposer.jsx +1 -0
  313. package/dist/source/components/dataDisplay/chat/chatComposer.jsx.map +1 -1
  314. package/dist/source/components/dataDisplay/chat/index.js.map +1 -1
  315. package/dist/source/components/dataDisplay/chat/utils.js.map +2 -2
  316. package/dist/source/components/dataDisplay/dagView/dagView.jsx +30 -21
  317. package/dist/source/components/dataDisplay/dagView/dagView.jsx.map +1 -1
  318. package/dist/source/components/dataDisplay/diffStat/diffStat.jsx +78 -0
  319. package/dist/source/components/dataDisplay/diffStat/diffStat.jsx.map +1 -0
  320. package/dist/source/components/dataDisplay/diffStat/index.js +19 -0
  321. package/dist/source/components/dataDisplay/diffStat/index.js.map +7 -0
  322. package/dist/source/components/dataDisplay/kbd/index.js +9 -0
  323. package/dist/source/components/dataDisplay/kbd/index.js.map +7 -0
  324. package/dist/source/components/dataDisplay/kbd/kbd.jsx +50 -0
  325. package/dist/source/components/dataDisplay/kbd/kbd.jsx.map +1 -0
  326. package/dist/source/components/dataDisplay/kbd/kbdKeys.js +79 -0
  327. package/dist/source/components/dataDisplay/kbd/kbdKeys.js.map +7 -0
  328. package/dist/source/components/dataDisplay/list/listItem.jsx +37 -7
  329. package/dist/source/components/dataDisplay/list/listItem.jsx.map +1 -1
  330. package/dist/source/components/dataDisplay/qrCode/index.js +6 -0
  331. package/dist/source/components/dataDisplay/qrCode/index.js.map +7 -0
  332. package/dist/source/components/dataDisplay/qrCode/qrCode.jsx +96 -0
  333. package/dist/source/components/dataDisplay/qrCode/qrCode.jsx.map +1 -0
  334. package/dist/source/components/dataDisplay/qrCode/qrCodePath.js +24 -0
  335. package/dist/source/components/dataDisplay/qrCode/qrCodePath.js.map +7 -0
  336. package/dist/source/components/dataDisplay/statusDot/index.js +6 -0
  337. package/dist/source/components/dataDisplay/statusDot/index.js.map +7 -0
  338. package/dist/source/components/dataDisplay/statusDot/statusDot.jsx +30 -0
  339. package/dist/source/components/dataDisplay/statusDot/statusDot.jsx.map +1 -0
  340. package/dist/source/components/dataDisplay/swimlanes/index.js +15 -0
  341. package/dist/source/components/dataDisplay/swimlanes/index.js.map +7 -0
  342. package/dist/source/components/dataDisplay/swimlanes/swimlanes.jsx +452 -0
  343. package/dist/source/components/dataDisplay/swimlanes/swimlanes.jsx.map +1 -0
  344. package/dist/source/components/dataDisplay/treeView/treeView.jsx +118 -37
  345. package/dist/source/components/dataDisplay/treeView/treeView.jsx.map +1 -1
  346. package/dist/source/components/feedBack/modal/modal.jsx +34 -4
  347. package/dist/source/components/feedBack/modal/modal.jsx.map +1 -1
  348. package/dist/source/components/inputs/button/button.jsx +6 -2
  349. package/dist/source/components/inputs/button/button.jsx.map +1 -1
  350. package/dist/source/components/inputs/composer/composer.jsx +321 -0
  351. package/dist/source/components/inputs/composer/composer.jsx.map +1 -0
  352. package/dist/source/components/inputs/composer/composerFiles.js +27 -0
  353. package/dist/source/components/inputs/composer/composerFiles.js.map +7 -0
  354. package/dist/source/components/inputs/composer/composerKeys.js +11 -0
  355. package/dist/source/components/inputs/composer/composerKeys.js.map +7 -0
  356. package/dist/source/components/inputs/composer/index.js +5 -0
  357. package/dist/source/components/inputs/composer/index.js.map +7 -0
  358. package/dist/source/components/layout/sheet/sheet.jsx +33 -11
  359. package/dist/source/components/layout/sheet/sheet.jsx.map +1 -1
  360. package/dist/source/components/layout/tabGroups/index.js +8 -0
  361. package/dist/source/components/layout/tabGroups/index.js.map +7 -0
  362. package/dist/source/components/layout/tabGroups/tabGroups.jsx +1119 -0
  363. package/dist/source/components/layout/tabGroups/tabGroups.jsx.map +1 -0
  364. package/dist/source/components/layout/tabGroups/tabGroupsFocus.js +222 -0
  365. package/dist/source/components/layout/tabGroups/tabGroupsFocus.js.map +7 -0
  366. package/dist/source/components/layout/tabGroups/tabGroupsLayout.js +629 -0
  367. package/dist/source/components/layout/tabGroups/tabGroupsLayout.js.map +7 -0
  368. package/dist/source/components/navigation/appBar/appBar.jsx +27 -3
  369. package/dist/source/components/navigation/appBar/appBar.jsx.map +1 -1
  370. package/dist/source/components/navigation/commandPalette/commandPalette.jsx +508 -0
  371. package/dist/source/components/navigation/commandPalette/commandPalette.jsx.map +1 -0
  372. package/dist/source/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  373. package/dist/source/components/navigation/commandPalette/commandPaletteFilter.js.map +7 -0
  374. package/dist/source/components/navigation/commandPalette/commandPaletteNavigation.js +54 -0
  375. package/dist/source/components/navigation/commandPalette/commandPaletteNavigation.js.map +7 -0
  376. package/dist/source/components/navigation/commandPalette/commandPaletteTypes.js +1 -0
  377. package/dist/source/components/navigation/commandPalette/commandPaletteTypes.js.map +7 -0
  378. package/dist/source/components/navigation/commandPalette/index.js +11 -0
  379. package/dist/source/components/navigation/commandPalette/index.js.map +7 -0
  380. package/dist/source/components/navigation/sidebar/sidebar.jsx +5 -2
  381. package/dist/source/components/navigation/sidebar/sidebar.jsx.map +1 -1
  382. package/dist/source/components/navigation/tabs/index.js +2 -0
  383. package/dist/source/components/navigation/tabs/index.js.map +2 -2
  384. package/dist/source/components/navigation/tabs/tab/tab.jsx +135 -8
  385. package/dist/source/components/navigation/tabs/tab/tab.jsx.map +1 -1
  386. package/dist/source/components/navigation/tabs/tabPanel/tabPanel.jsx +30 -0
  387. package/dist/source/components/navigation/tabs/tabPanel/tabPanel.jsx.map +1 -0
  388. package/dist/source/components/navigation/tabs/tabs.jsx +361 -13
  389. package/dist/source/components/navigation/tabs/tabs.jsx.map +1 -1
  390. package/dist/source/components/navigation/tabs/tabs.utils.js +18 -0
  391. package/dist/source/components/navigation/tabs/tabs.utils.js.map +7 -0
  392. package/dist/source/components/navigation/tabs/tabsContext.js.map +2 -2
  393. package/dist/source/index.js +41 -1
  394. package/dist/source/index.js.map +2 -2
  395. package/dist/source/primitives/createFocusTrap.js +8 -3
  396. package/dist/source/primitives/createFocusTrap.js.map +2 -2
  397. package/dist/source/primitives/createKeyboardShortcut.js +23 -0
  398. package/dist/source/primitives/createKeyboardShortcut.js.map +7 -0
  399. package/dist/source/primitives/restoreFocus.js +14 -0
  400. package/dist/source/primitives/restoreFocus.js.map +7 -0
  401. package/dist/source/utils/keyboardShortcut.js +74 -0
  402. package/dist/source/utils/keyboardShortcut.js.map +7 -0
  403. package/dist/source/utils/linkAttrs.js +16 -0
  404. package/dist/source/utils/linkAttrs.js.map +7 -0
  405. package/dist/utils/keyboardShortcut.d.ts +12 -0
  406. package/dist/utils/keyboardShortcut.js +48 -0
  407. package/dist/utils/keyboardShortcut.js.map +1 -0
  408. package/dist/utils/linkAttrs.d.ts +13 -0
  409. package/dist/utils/linkAttrs.js +13 -0
  410. package/dist/utils/linkAttrs.js.map +1 -0
  411. package/package.json +66 -3
@@ -0,0 +1,1117 @@
1
+ import {
2
+ For,
3
+ Show,
4
+ children as resolveChildren,
5
+ createComputed,
6
+ createEffect,
7
+ createMemo,
8
+ createRenderEffect,
9
+ createSignal,
10
+ createUniqueId,
11
+ mapArray,
12
+ on,
13
+ onCleanup,
14
+ onMount,
15
+ splitProps
16
+ } from "solid-js";
17
+ import { isServer } from "solid-js/web";
18
+ import cn from "clsx";
19
+ import { Tabs } from "../../navigation/tabs/tabs";
20
+ import { Tab } from "../../navigation/tabs/tab/tab";
21
+ import { Menu } from "../../navigation/menu/menu";
22
+ import { MenuItem } from "../../navigation/menu/menuItem";
23
+ import { Icon } from "../../base/icon";
24
+ import { mergeRefs } from "../../../primitives/mergeRefs";
25
+ import { mergeStyle } from "../../../primitives/mergeStyle";
26
+ import { createControllableState } from "../../../primitives/createControllableState";
27
+ import { callHandler } from "../../../primitives/callHandler";
28
+ import { matchesKeyboardShortcut } from "../../../utils/keyboardShortcut";
29
+ import { throttle } from "../../../utils/throttle";
30
+ import {
31
+ TAB_GROUPS_LABELS,
32
+ adjacentGroup,
33
+ computeTabGroupsGrid,
34
+ createTabGroupsLayout,
35
+ describeTabGroupsChange,
36
+ dropZoneAt,
37
+ findGroupOfTab,
38
+ getGroups,
39
+ gridTemplateColumns,
40
+ gridTemplateRows,
41
+ groupBodyArea,
42
+ groupHeaderArea,
43
+ moveTab,
44
+ moveTabInDirection,
45
+ removeTab,
46
+ resizeSplit,
47
+ selectTab,
48
+ separatorArea,
49
+ setActiveGroup
50
+ } from "./tabGroupsLayout";
51
+ import {
52
+ containsDeep,
53
+ deepActiveElement,
54
+ focusFromEnd,
55
+ frameExitTarget,
56
+ lastStopOf,
57
+ ownGroupIdOf,
58
+ ownerRootOf,
59
+ tabMove
60
+ } from "./tabGroupsFocus";
61
+ const CHORD_SHORTCUTS = [
62
+ "Alt+Shift+ArrowLeft",
63
+ "Alt+Shift+ArrowRight",
64
+ "Alt+Shift+ArrowUp",
65
+ "Alt+Shift+ArrowDown",
66
+ "Control+Shift+ArrowLeft",
67
+ "Meta+Shift+ArrowLeft",
68
+ "Control+Shift+ArrowRight",
69
+ "Meta+Shift+ArrowRight"
70
+ ].join(" ");
71
+ const DIRECTION_CHORDS = [
72
+ ["left", ["Alt", "Shift", "ArrowLeft"]],
73
+ ["right", ["Alt", "Shift", "ArrowRight"]],
74
+ ["top", ["Alt", "Shift", "ArrowUp"]],
75
+ ["bottom", ["Alt", "Shift", "ArrowDown"]]
76
+ ];
77
+ const FIRST_MENU_ITEM = '[role^="menuitem"]:not([aria-disabled="true"])';
78
+ function groupIdOf(node) {
79
+ let current = node ?? null;
80
+ while (current) {
81
+ const id = current.getAttribute("data-group-id");
82
+ if (id !== null) return id;
83
+ current = current.parentElement;
84
+ }
85
+ return null;
86
+ }
87
+ function tabItemOf(tab) {
88
+ return tab.closest(".smwb-tab-item") ?? tab;
89
+ }
90
+ function tabElementOf(target) {
91
+ if (!target) return null;
92
+ const direct = target.closest('[role="tab"]');
93
+ if (direct) return direct;
94
+ const item = target.closest(".smwb-tab-item");
95
+ return item?.querySelector('[role="tab"]') ?? null;
96
+ }
97
+ function findSplitNode(root, id) {
98
+ if (root.type === "group") return void 0;
99
+ if (root.id === id) return root;
100
+ for (const child of root.children) {
101
+ const found = findSplitNode(child, id);
102
+ if (found) return found;
103
+ }
104
+ return void 0;
105
+ }
106
+ function groupIdsOf(node) {
107
+ return node.type === "group" ? [node.id] : node.children.flatMap(groupIdsOf);
108
+ }
109
+ function readingKeys(root) {
110
+ const keys = [];
111
+ const walk = (node) => {
112
+ if (node.type === "group") {
113
+ keys.push(`h:${node.id}`, `p:${node.id}`);
114
+ return;
115
+ }
116
+ node.children.forEach((child, index) => {
117
+ walk(child);
118
+ if (index < node.children.length - 1) keys.push(`s:${node.id}:${index}`);
119
+ });
120
+ };
121
+ walk(root);
122
+ return keys;
123
+ }
124
+ function placeChildren(parent, next, previous) {
125
+ const wanted = new Set(next);
126
+ previous.forEach((node) => {
127
+ if (!wanted.has(node) && node.parentNode === parent) node.remove();
128
+ });
129
+ const children = Array.from(parent.children);
130
+ const position = /* @__PURE__ */ new Map();
131
+ children.forEach((child, at) => position.set(child, at));
132
+ const active = parent.ownerDocument.activeElement;
133
+ const focused = active === null ? -1 : next.findIndex((node) => node.contains(active));
134
+ const focusedAt = focused < 0 ? void 0 : position.get(next[focused]);
135
+ const kept = [];
136
+ next.forEach((node, i) => {
137
+ const at = position.get(node);
138
+ if (at === void 0) return;
139
+ if (focusedAt !== void 0 && i !== focused && i < focused !== at < focusedAt) return;
140
+ kept.push(at);
141
+ });
142
+ const length = kept.map(() => 1);
143
+ const before = kept.map(() => -1);
144
+ let best = -1;
145
+ kept.forEach((at, k) => {
146
+ for (let j = 0; j < k; j++) {
147
+ if (kept[j] < at && length[j] + 1 > length[k]) {
148
+ length[k] = length[j] + 1;
149
+ before[k] = j;
150
+ }
151
+ }
152
+ if (best < 0 || length[k] > length[best]) best = k;
153
+ });
154
+ const stays = /* @__PURE__ */ new Set();
155
+ for (let k = best; k >= 0; k = before[k]) stays.add(kept[k]);
156
+ let anchor = stays.size > 0 ? children[Math.max(...stays)].nextSibling : parent.firstChild;
157
+ for (let i = next.length - 1; i >= 0; i--) {
158
+ const node = next[i];
159
+ const at = position.get(node);
160
+ if (at === void 0 || !stays.has(at)) parent.insertBefore(node, anchor);
161
+ anchor = node;
162
+ }
163
+ }
164
+ function selectedTabsOf(layout) {
165
+ return getGroups(layout).map((group) => group.active).filter((tab) => tab !== null);
166
+ }
167
+ function TabGroups(props) {
168
+ const [local, rest] = splitProps(props, [
169
+ "class",
170
+ "style",
171
+ "id",
172
+ "data-testid",
173
+ "ref",
174
+ "layout",
175
+ "defaultLayout",
176
+ "onLayoutChange",
177
+ "getTab",
178
+ "renderPanel",
179
+ "onTabClose",
180
+ "empty",
181
+ "minGroupSize",
182
+ "keyboardStep",
183
+ "groupActions",
184
+ "dense",
185
+ "labels",
186
+ // Wrapped so that the caller's handler still runs, first.
187
+ "onDragStart",
188
+ "onDragOver",
189
+ "onDrop",
190
+ "onDragEnd",
191
+ "onFocusIn",
192
+ "onKeyDown"
193
+ ]);
194
+ const generatedId = createUniqueId();
195
+ const base = () => local.id ?? generatedId;
196
+ const encode = (id) => encodeURIComponent(id);
197
+ const tabElementId = (tabId) => `${base()}-tab-${encode(tabId)}`;
198
+ const panelElementId = (tabId) => `${base()}-panel-${encode(tabId)}`;
199
+ const menuElementId = (groupId) => `${base()}-menu-${encode(groupId)}`;
200
+ const headerElementId = (groupId) => `${base()}-header-${encode(groupId)}`;
201
+ const separatorElementId = (splitId, index) => `${base()}-separator-${encode(splitId)}-${index}`;
202
+ const statusElementId = () => `${base()}-status`;
203
+ const minGroupSize = () => local.minGroupSize ?? 120;
204
+ const keyboardStep = () => local.keyboardStep ?? 5;
205
+ const withGroupActions = () => local.groupActions !== false;
206
+ const labels = createMemo(
207
+ () => ({
208
+ ...TAB_GROUPS_LABELS,
209
+ ...local.labels
210
+ })
211
+ );
212
+ const [layout, setLayout] = createControllableState({
213
+ value: () => local.layout,
214
+ defaultValue: local.defaultLayout ?? createTabGroupsLayout()
215
+ });
216
+ let latest = layout();
217
+ createComputed(() => {
218
+ latest = layout();
219
+ });
220
+ const grid = createMemo(() => computeTabGroupsGrid(layout()));
221
+ const groups = createMemo(() => getGroups(layout()));
222
+ const groupCount = createMemo(() => groups().length);
223
+ const hasSplit = createMemo(() => groups().length > 1);
224
+ const selectedTabs = createMemo(() => new Set(selectedTabsOf(layout())));
225
+ const groupOfTab = createMemo(() => {
226
+ const map = /* @__PURE__ */ new Map();
227
+ getGroups(layout()).forEach((group) => group.tabs.forEach((tab) => map.set(tab, group.id)));
228
+ return map;
229
+ });
230
+ const groupById = (value, groupId) => getGroups(value).find((group) => group.id === groupId);
231
+ const indexOfGroup = (groupId) => groups().findIndex((group) => group.id === groupId);
232
+ const isEmpty = createMemo(() => {
233
+ const list = groups();
234
+ return list.length === 1 && (list[0]?.tabs.length ?? 0) === 0;
235
+ });
236
+ const groupIds = createMemo(() => groups().map((group) => group.id));
237
+ const separatorKeys = createMemo(() => readingKeys(layout().root).filter((key) => key.startsWith("s:")));
238
+ const panelOrder = createMemo((previous) => {
239
+ const alive = groupOfTab();
240
+ const order = previous.filter((tab) => alive.has(tab));
241
+ const placed = new Set(order);
242
+ groups().forEach(
243
+ (group) => group.tabs.forEach((tab) => {
244
+ if (placed.has(tab)) return;
245
+ placed.add(tab);
246
+ order.push(tab);
247
+ })
248
+ );
249
+ return order.length === previous.length && order.every((tab, index) => tab === previous[index]) ? previous : order;
250
+ }, []);
251
+ const owns = createMemo(() => {
252
+ if (isEmpty()) return void 0;
253
+ const value = layout();
254
+ return [
255
+ ...readingKeys(value.root).flatMap((key) => {
256
+ if (key.startsWith("h:")) return [headerElementId(key.slice(2))];
257
+ if (key.startsWith("p:")) return (groupById(value, key.slice(2))?.tabs ?? []).map(panelElementId);
258
+ const last = key.lastIndexOf(":");
259
+ return [separatorElementId(key.slice(2, last), Number(key.slice(last + 1)))];
260
+ }),
261
+ statusElementId()
262
+ ].join(" ");
263
+ });
264
+ const [mountedTabs, setMountedTabs] = createSignal(new Set(selectedTabsOf(layout())));
265
+ if (!isServer) {
266
+ createEffect(() => {
267
+ const value = layout();
268
+ const alive = /* @__PURE__ */ new Set();
269
+ getGroups(value).forEach((group) => group.tabs.forEach((tab) => alive.add(tab)));
270
+ const selected = selectedTabsOf(value);
271
+ setMountedTabs((prev) => {
272
+ const next = /* @__PURE__ */ new Set();
273
+ let changed = false;
274
+ prev.forEach((tab) => {
275
+ if (alive.has(tab)) next.add(tab);
276
+ else changed = true;
277
+ });
278
+ selected.forEach((tab) => {
279
+ if (!next.has(tab)) {
280
+ next.add(tab);
281
+ changed = true;
282
+ }
283
+ });
284
+ return changed || next.size !== prev.size ? next : prev;
285
+ });
286
+ });
287
+ }
288
+ const [status, setStatus] = createSignal("");
289
+ const [openMenu, setOpenMenu] = createSignal(null);
290
+ const [dragging, setDragging] = createSignal(false);
291
+ const [dropGroup, setDropGroup] = createSignal(null);
292
+ const [dropZone, setDropZone] = createSignal(null);
293
+ const [draggingSeparator, setDraggingSeparator] = createSignal(null);
294
+ let rootEl;
295
+ let guardEl;
296
+ let pendingFocus = null;
297
+ const reported = /* @__PURE__ */ new WeakMap();
298
+ let reportCount = 0;
299
+ let settleQueued = false;
300
+ let leaving = false;
301
+ let lastFocus = null;
302
+ let pointerFocus = false;
303
+ const announce = (next, change) => {
304
+ const text = describeTabGroupsChange(change, next, tabTitle, labels());
305
+ if (text === "") return;
306
+ setStatus((prev) => prev.replace(/\u00a0+$/, "") === text ? `${text}\xA0` : text);
307
+ };
308
+ const armFocus = (tabId, next, gone) => {
309
+ const group = findGroupOfTab(next, tabId);
310
+ if (!group) return;
311
+ pendingFocus = {
312
+ tab: tabId,
313
+ group: group.id,
314
+ index: group.tabs.indexOf(tabId),
315
+ ...gone === void 0 ? {} : { gone },
316
+ after: next,
317
+ base: layout(),
318
+ from: rootEl ? deepActiveElement(rootEl.ownerDocument) : null
319
+ };
320
+ };
321
+ const stillWaiting = (pending, drawn) => {
322
+ if (drawn === pending.base) return true;
323
+ const drawnAt = reported.get(drawn);
324
+ const askedAt = reported.get(pending.after);
325
+ return drawnAt !== void 0 && askedAt !== void 0 && drawnAt < askedAt;
326
+ };
327
+ const focusPending = () => {
328
+ const pending = pendingFocus;
329
+ const drawn = layout();
330
+ if (!pending || stillWaiting(pending, drawn)) return;
331
+ const doc = rootEl?.ownerDocument;
332
+ const group = findGroupOfTab(drawn, pending.tab);
333
+ const shown = group?.id === pending.group && group.tabs.indexOf(pending.tab) === pending.index && (pending.gone === void 0 || !groupById(drawn, pending.gone));
334
+ const element = shown ? doc?.getElementById(tabElementId(pending.tab)) : null;
335
+ if (shown && (!element || groupIdOf(element) !== pending.group)) return;
336
+ pendingFocus = null;
337
+ if (!element || !rootEl || !doc) return;
338
+ const active = deepActiveElement(doc);
339
+ if (active === element) return;
340
+ if (active !== null && active !== doc.body && active !== pending.from && !containsDeep(rootEl, active)) return;
341
+ element.focus();
342
+ };
343
+ const commit = (next, change) => {
344
+ if (next === latest) return;
345
+ latest = next;
346
+ reportCount += 1;
347
+ reported.set(next, reportCount);
348
+ setLayout(() => next);
349
+ local.onLayoutChange?.(next, change);
350
+ announce(next, change);
351
+ focusPending();
352
+ if (local.layout !== void 0 && !settleQueued) {
353
+ settleQueued = true;
354
+ queueMicrotask(settle);
355
+ }
356
+ };
357
+ const settle = () => {
358
+ settleQueued = false;
359
+ if (local.layout === void 0 || latest === layout()) return;
360
+ latest = layout();
361
+ };
362
+ if (!isServer) {
363
+ createEffect(
364
+ on(
365
+ layout,
366
+ () => {
367
+ focusPending();
368
+ },
369
+ { defer: true }
370
+ )
371
+ );
372
+ }
373
+ const tabTitle = (tabId) => {
374
+ const meta = local.getTab(tabId);
375
+ if (!meta) return tabId;
376
+ if (meta.title !== void 0) return meta.title;
377
+ return typeof meta.label === "string" ? meta.label : tabId;
378
+ };
379
+ const commitMove = (next, before, tabId, from, options = {}) => {
380
+ if (next === before) return;
381
+ const to = findGroupOfTab(next, tabId)?.id;
382
+ const target = to !== void 0 ? groupById(next, to) : void 0;
383
+ if (!to || !target) return;
384
+ const sourceClosed = !getGroups(next).some((group) => group.id === from);
385
+ const existed = getGroups(before).some((group) => group.id === to);
386
+ const change = options.edge !== void 0 && !existed ? { type: "split", tab: tabId, from, to, edge: options.edge, sourceClosed } : { type: "move", tab: tabId, from, to, index: target.tabs.indexOf(tabId), sourceClosed };
387
+ if (options.focus) armFocus(tabId, next);
388
+ commit(next, change);
389
+ };
390
+ const onRowChange = (groupId) => (event, index) => {
391
+ if (event.type === "drop") return;
392
+ const current = latest;
393
+ const group = groupById(current, groupId);
394
+ const tabId = group?.tabs[index];
395
+ if (!group || tabId === void 0) return;
396
+ commit(selectTab(current, tabId), { type: "select", tab: tabId, group: groupId });
397
+ };
398
+ const onRowReorder = (groupId) => (from, to) => {
399
+ const current = latest;
400
+ const group = groupById(current, groupId);
401
+ const tabId = group?.tabs[from];
402
+ if (!group || tabId === void 0) return;
403
+ commitMove(moveTab(current, tabId, { group: groupId, index: to }), current, tabId, groupId, {
404
+ focus: dragState?.hadFocus ?? false
405
+ });
406
+ };
407
+ const requestClose = (tabId, event, reason) => {
408
+ const current = latest;
409
+ const group = findGroupOfTab(current, tabId);
410
+ if (!group) return;
411
+ if (local.onTabClose?.(tabId, event, reason) === false) return;
412
+ const next = removeTab(current, tabId);
413
+ if (next === current) return;
414
+ const groupClosed = !getGroups(next).some((candidate) => candidate.id === group.id);
415
+ const root = rootEl;
416
+ const active = root ? deepActiveElement(root.ownerDocument) : null;
417
+ const focusWasHere = reason === "actions" || root !== void 0 && ownGroupIdOf(root, active) === group.id;
418
+ const heir = groupClosed && focusWasHere ? adjacentGroup(current, group.id) : void 0;
419
+ if (heir !== void 0) {
420
+ const heirTab = groupById(next, heir)?.active;
421
+ if (heirTab) armFocus(heirTab, next, group.id);
422
+ }
423
+ commit(next, { type: "close", tab: tabId, group: group.id, groupClosed });
424
+ };
425
+ const onHeaderKeyDown = (groupId) => (event) => {
426
+ if (event.defaultPrevented || event.repeat || event.isComposing) return;
427
+ const target = event.target;
428
+ if (!(target instanceof Element)) return;
429
+ const tabEl = target.closest('[role="tab"]');
430
+ if (!tabEl || groupIdOf(tabEl) !== groupId) return;
431
+ if (tabEl.getAttribute("aria-disabled") === "true") return;
432
+ const tabId = tabEl.getAttribute("data-tab-id");
433
+ if (!tabId) return;
434
+ const current = latest;
435
+ const group = groupById(current, groupId);
436
+ if (!group) return;
437
+ for (const [edge, keys] of DIRECTION_CHORDS) {
438
+ if (!matchesKeyboardShortcut(event, keys)) continue;
439
+ const next = moveTabInDirection(current, tabId, edge);
440
+ if (next === current) return;
441
+ event.preventDefault();
442
+ commitMove(next, current, tabId, groupId, { edge, focus: true });
443
+ return;
444
+ }
445
+ const shift = matchesKeyboardShortcut(event, ["Mod", "Shift", "ArrowLeft"]) ? -1 : matchesKeyboardShortcut(event, ["Mod", "Shift", "ArrowRight"]) ? 1 : 0;
446
+ if (shift === 0) return;
447
+ const from = group.tabs.indexOf(tabId);
448
+ const to = from + shift;
449
+ if (from < 0 || to < 0 || to >= group.tabs.length) return;
450
+ event.preventDefault();
451
+ commitMove(moveTab(current, tabId, { group: groupId, index: to }), current, tabId, groupId, {
452
+ focus: true
453
+ });
454
+ };
455
+ const focusFirstMenuItem = (groupId) => {
456
+ const doc = rootEl?.ownerDocument;
457
+ const item = doc?.getElementById(menuElementId(groupId))?.querySelector(FIRST_MENU_ITEM);
458
+ item?.focus({ preventScroll: true });
459
+ };
460
+ const openGroupMenu = (groupId, byKeyboard) => {
461
+ setOpenMenu(groupId);
462
+ if (byKeyboard) focusFirstMenuItem(groupId);
463
+ };
464
+ const onTriggerClick = (groupId, event) => {
465
+ if (openMenu() === groupId) {
466
+ setOpenMenu(null);
467
+ return;
468
+ }
469
+ openGroupMenu(groupId, event.detail === 0);
470
+ };
471
+ const onTriggerKeyDown = (groupId, event) => {
472
+ if (event.defaultPrevented || event.repeat || event.key !== "ArrowDown") return;
473
+ event.preventDefault();
474
+ openGroupMenu(groupId, true);
475
+ };
476
+ const canSplit = (groupId) => {
477
+ const group = groupById(layout(), groupId);
478
+ return Boolean(group && group.active !== null && group.tabs.length >= 2);
479
+ };
480
+ const siblingGroup = (groupId, delta) => {
481
+ const list = groups();
482
+ return list[indexOfGroup(groupId) + delta]?.id;
483
+ };
484
+ const canMoveToSibling = (groupId, delta) => {
485
+ const group = groupById(layout(), groupId);
486
+ return Boolean(group && group.active !== null && siblingGroup(groupId, delta) !== void 0);
487
+ };
488
+ const canShift = (groupId, delta) => {
489
+ const group = groupById(layout(), groupId);
490
+ if (!group || group.active === null) return false;
491
+ const to = group.tabs.indexOf(group.active) + delta;
492
+ return to >= 0 && to < group.tabs.length;
493
+ };
494
+ const runMenuAction = (groupId, action) => {
495
+ setOpenMenu(null);
496
+ const current = latest;
497
+ const group = groupById(current, groupId);
498
+ const tabId = group?.active;
499
+ if (!group || !tabId) return;
500
+ if (action === "splitRight" || action === "splitDown") {
501
+ const edge = action === "splitRight" ? "right" : "bottom";
502
+ commitMove(moveTab(current, tabId, { group: groupId, edge }), current, tabId, groupId, {
503
+ edge,
504
+ focus: true
505
+ });
506
+ return;
507
+ }
508
+ if (action === "previous" || action === "next") {
509
+ const to2 = siblingGroup(groupId, action === "previous" ? -1 : 1);
510
+ if (!to2) return;
511
+ commitMove(moveTab(current, tabId, { group: to2 }), current, tabId, groupId, { focus: true });
512
+ return;
513
+ }
514
+ const from = group.tabs.indexOf(tabId);
515
+ const to = from + (action === "left" ? -1 : 1);
516
+ if (from < 0 || to < 0 || to >= group.tabs.length) return;
517
+ commitMove(moveTab(current, tabId, { group: groupId, index: to }), current, tabId, groupId, {
518
+ focus: true
519
+ });
520
+ };
521
+ const splitExtentPercent = (splitId) => {
522
+ const value = layout();
523
+ const node = findSplitNode(value.root, splitId);
524
+ if (!node) return 0;
525
+ const held = new Set(groupIdsOf(node));
526
+ const entries = grid().groups.filter((entry) => held.has(entry.id));
527
+ if (entries.length === 0) return 0;
528
+ const tracks = node.direction === "row" ? grid().columns : grid().rows;
529
+ let from = Number.POSITIVE_INFINITY;
530
+ let to = Number.NEGATIVE_INFINITY;
531
+ entries.forEach((entry) => {
532
+ const span = node.direction === "row" ? entry.column : entry.row;
533
+ from = Math.min(from, span[0]);
534
+ to = Math.max(to, span[1]);
535
+ });
536
+ let total = 0;
537
+ for (let index = from; index < to; index += 1) total += tracks[index] ?? 0;
538
+ return total;
539
+ };
540
+ const splitExtentPx = (splitId) => {
541
+ const rect = rootEl?.getBoundingClientRect();
542
+ const node = findSplitNode(layout().root, splitId);
543
+ if (!rect || !node) return 0;
544
+ const axis = node.direction === "row" ? rect.width : rect.height;
545
+ return axis * splitExtentPercent(splitId) / 100;
546
+ };
547
+ const minSizePercent = (extentPx) => extentPx > 0 ? minGroupSize() / extentPx * 100 : 0;
548
+ const resizeChange = (next, splitId) => {
549
+ const node = findSplitNode(next.root, splitId);
550
+ return { type: "resize", split: splitId, sizes: node ? [...node.sizes] : [] };
551
+ };
552
+ const resizeBy = (splitId, index, delta, min) => {
553
+ const current = latest;
554
+ const next = resizeSplit(current, splitId, index, delta, min);
555
+ if (next === current) return;
556
+ commit(next, resizeChange(next, splitId));
557
+ };
558
+ const onSeparatorKeyDown = (splitId, index, orientation) => (event) => {
559
+ if (event.defaultPrevented) return;
560
+ const vertical = orientation === "vertical";
561
+ const backwards = event.key === (vertical ? "ArrowLeft" : "ArrowUp");
562
+ const forwards = event.key === (vertical ? "ArrowRight" : "ArrowDown");
563
+ const limit = event.key === "Home" || event.key === "End";
564
+ if (!backwards && !forwards && !limit) return;
565
+ event.preventDefault();
566
+ const delta = limit ? event.key === "Home" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY : backwards ? -keyboardStep() : keyboardStep();
567
+ resizeBy(splitId, index, delta, minSizePercent(splitExtentPx(splitId)));
568
+ };
569
+ let separatorDrag = null;
570
+ const coordinate = (event, orientation) => orientation === "vertical" ? event.clientX : event.clientY;
571
+ const applySeparatorDrag = (position) => {
572
+ const drag = separatorDrag;
573
+ if (!drag) return;
574
+ const deltaPx = position - drag.start;
575
+ const delta = drag.extentPx > 0 ? deltaPx / drag.extentPx * 100 : 0;
576
+ const next = resizeSplit(drag.layout, drag.split, drag.index, delta, drag.min);
577
+ if (next === latest) return;
578
+ commit(next, resizeChange(next, drag.split));
579
+ };
580
+ const throttledSeparatorDrag = throttle(applySeparatorDrag, 1e3 / 60);
581
+ onCleanup(() => throttledSeparatorDrag.cancel());
582
+ if (!isServer) {
583
+ createEffect(() => {
584
+ const drag = draggingSeparator();
585
+ if (!drag) return;
586
+ const body = document.body;
587
+ const previous = body.style.cursor;
588
+ body.style.cursor = drag.orientation === "vertical" ? "col-resize" : "row-resize";
589
+ onCleanup(() => {
590
+ body.style.cursor = previous;
591
+ });
592
+ });
593
+ }
594
+ const onSeparatorPointerDown = (key, splitId, index, orientation) => (event) => {
595
+ if (isServer || event.pointerType === "mouse" && event.button !== 0) return;
596
+ const extentPx = splitExtentPx(splitId);
597
+ separatorDrag = {
598
+ key,
599
+ split: splitId,
600
+ index,
601
+ orientation,
602
+ pointerId: event.pointerId,
603
+ start: coordinate(event, orientation),
604
+ extentPx,
605
+ min: minSizePercent(extentPx),
606
+ layout: latest
607
+ };
608
+ setDraggingSeparator({ key, orientation });
609
+ const target = event.currentTarget;
610
+ if (typeof target.setPointerCapture === "function") {
611
+ try {
612
+ target.setPointerCapture(event.pointerId);
613
+ } catch {
614
+ }
615
+ }
616
+ };
617
+ const onSeparatorPointerMove = (orientation) => (event) => {
618
+ const drag = separatorDrag;
619
+ if (!drag || drag.pointerId !== event.pointerId) return;
620
+ throttledSeparatorDrag(coordinate(event, orientation));
621
+ };
622
+ const onSeparatorPointerUp = (orientation) => (event) => {
623
+ const drag = separatorDrag;
624
+ if (!drag || drag.pointerId !== event.pointerId) return;
625
+ throttledSeparatorDrag.cancel();
626
+ applySeparatorDrag(coordinate(event, orientation));
627
+ separatorDrag = null;
628
+ setDraggingSeparator(null);
629
+ if (event.currentTarget.hasPointerCapture?.(event.pointerId)) {
630
+ event.currentTarget.releasePointerCapture(event.pointerId);
631
+ }
632
+ };
633
+ let dragState = null;
634
+ let markedItem = null;
635
+ let dropTargetsFrame;
636
+ onCleanup(() => {
637
+ if (dropTargetsFrame !== void 0) cancelAnimationFrame(dropTargetsFrame);
638
+ });
639
+ const markRowItem = (item) => {
640
+ if (markedItem === item) return;
641
+ markedItem?.classList.remove("smwb-tab-item--drop-target");
642
+ markedItem = item;
643
+ item?.classList.add("smwb-tab-item--drop-target");
644
+ };
645
+ const hideSourceRowMark = () => {
646
+ const group = dragState?.group;
647
+ const header = Array.from(rootEl?.querySelectorAll(":scope > .smwb-tab-groups__header") ?? []).find(
648
+ (element) => element.getAttribute("data-group-id") === group
649
+ );
650
+ header?.querySelectorAll(".smwb-tab-item--drop-target").forEach((item) => {
651
+ if (item !== markedItem) item.classList.remove("smwb-tab-item--drop-target");
652
+ });
653
+ };
654
+ const clearDropState = () => {
655
+ dragState = null;
656
+ if (dropTargetsFrame !== void 0) {
657
+ cancelAnimationFrame(dropTargetsFrame);
658
+ dropTargetsFrame = void 0;
659
+ }
660
+ markRowItem(null);
661
+ setDropGroup(null);
662
+ setDropZone(null);
663
+ setDragging(false);
664
+ };
665
+ const hitTest = (target) => {
666
+ if (!rootEl || !target || target.closest(".smwb-tab-groups") !== rootEl) return null;
667
+ const headerEl = target.closest(".smwb-tab-groups__header");
668
+ if (headerEl) {
669
+ const group2 = headerEl.getAttribute("data-group-id");
670
+ if (!group2) return null;
671
+ const tabEl = tabElementOf(target);
672
+ const overId = tabEl?.getAttribute("data-tab-id");
673
+ const tabs = groupById(latest, group2)?.tabs ?? [];
674
+ const at = overId ? tabs.indexOf(overId) : -1;
675
+ return {
676
+ kind: "row",
677
+ group: group2,
678
+ index: at >= 0 ? at : null,
679
+ item: at >= 0 && tabEl ? tabItemOf(tabEl) : null
680
+ };
681
+ }
682
+ const body = target.closest(".smwb-tab-groups__drop-target");
683
+ if (!body) return null;
684
+ const group = body.getAttribute("data-group-id");
685
+ return group ? { kind: "body", group, element: body } : null;
686
+ };
687
+ const zoneOf = (element, event) => {
688
+ const rect = element.getBoundingClientRect();
689
+ return dropZoneAt(event.clientX - rect.left, event.clientY - rect.top, rect.width, rect.height);
690
+ };
691
+ const bodyDropAllowed = (dragGroup, group, zone) => {
692
+ if (dragGroup !== group) return true;
693
+ if (zone === "center") return false;
694
+ return (groupById(latest, group)?.tabs.length ?? 0) >= 2;
695
+ };
696
+ const onRootDragStart = (event) => {
697
+ callHandler(local.onDragStart, event);
698
+ if (isServer) return;
699
+ const target = event.target;
700
+ if (!(target instanceof Element) || !rootEl || target.closest(".smwb-tab-groups") !== rootEl) return;
701
+ const tabEl = tabElementOf(target);
702
+ const tabId = tabEl?.getAttribute("data-tab-id");
703
+ if (!tabEl || !tabId || tabEl.getAttribute("aria-disabled") === "true") return;
704
+ const group = groupIdOf(tabEl);
705
+ if (!group) return;
706
+ const doc = rootEl.ownerDocument;
707
+ const active = doc.activeElement;
708
+ dragState = {
709
+ tab: tabId,
710
+ group,
711
+ hadFocus: Boolean(active && active !== doc.body && tabItemOf(tabEl).contains(active))
712
+ };
713
+ const view = doc.defaultView;
714
+ if (!view) return;
715
+ dropTargetsFrame = view.requestAnimationFrame(() => {
716
+ dropTargetsFrame = void 0;
717
+ setDragging(true);
718
+ });
719
+ };
720
+ const onRootDragOver = (event) => {
721
+ callHandler(local.onDragOver, event);
722
+ const state = dragState;
723
+ if (!state) return;
724
+ const hit = hitTest(event.target);
725
+ if (!hit) {
726
+ markRowItem(null);
727
+ hideSourceRowMark();
728
+ setDropGroup(null);
729
+ setDropZone(null);
730
+ return;
731
+ }
732
+ if (hit.kind === "row") {
733
+ if (hit.group === state.group) {
734
+ markRowItem(null);
735
+ hit.item?.classList.add("smwb-tab-item--drop-target");
736
+ return;
737
+ }
738
+ hideSourceRowMark();
739
+ event.preventDefault();
740
+ if (event.dataTransfer) event.dataTransfer.dropEffect = "move";
741
+ setDropGroup(null);
742
+ setDropZone(null);
743
+ markRowItem(hit.item);
744
+ return;
745
+ }
746
+ markRowItem(null);
747
+ hideSourceRowMark();
748
+ const zone = zoneOf(hit.element, event);
749
+ if (!bodyDropAllowed(state.group, hit.group, zone)) {
750
+ setDropGroup(null);
751
+ setDropZone(null);
752
+ return;
753
+ }
754
+ event.preventDefault();
755
+ if (event.dataTransfer) event.dataTransfer.dropEffect = "move";
756
+ setDropGroup(hit.group);
757
+ setDropZone(zone);
758
+ };
759
+ const onRootDrop = (event) => {
760
+ callHandler(local.onDrop, event);
761
+ const state = dragState;
762
+ if (!state) return;
763
+ const hit = event.defaultPrevented ? null : hitTest(event.target);
764
+ const zone = hit && hit.kind === "body" ? zoneOf(hit.element, event) : null;
765
+ clearDropState();
766
+ if (!hit) return;
767
+ if (hit.kind === "row") {
768
+ if (hit.group === state.group) return;
769
+ const target2 = hit.index === null ? { group: hit.group } : { group: hit.group, index: hit.index };
770
+ commitMove(moveTab(latest, state.tab, target2), latest, state.tab, state.group, {
771
+ focus: state.hadFocus
772
+ });
773
+ return;
774
+ }
775
+ if (!zone || !bodyDropAllowed(state.group, hit.group, zone)) return;
776
+ const target = zone === "center" ? { group: hit.group } : { group: hit.group, edge: zone };
777
+ commitMove(moveTab(latest, state.tab, target), latest, state.tab, state.group, {
778
+ edge: zone === "center" ? void 0 : zone,
779
+ focus: state.hadFocus
780
+ });
781
+ };
782
+ const onRootDragEnd = (event) => {
783
+ callHandler(local.onDragEnd, event);
784
+ clearDropState();
785
+ };
786
+ const onRootFocusIn = (event) => {
787
+ callHandler(local.onFocusIn, event);
788
+ const root = rootEl;
789
+ const target = event.target;
790
+ if (!root || !(target instanceof HTMLElement)) return;
791
+ const previous = lastFocus;
792
+ lastFocus = ownerRootOf(target) === root ? target : null;
793
+ if (previous instanceof HTMLElement && previous.localName === "iframe" && previous !== target && !pointerFocus) {
794
+ const instead = frameExitTarget(root, previous, target);
795
+ if (instead !== null && instead === guardEl) {
796
+ leaving = true;
797
+ if (instead !== target) instead.focus({ preventScroll: true });
798
+ return;
799
+ }
800
+ if (instead !== null) {
801
+ instead.focus();
802
+ return;
803
+ }
804
+ }
805
+ if (target === guardEl) {
806
+ onGuardFocus();
807
+ return;
808
+ }
809
+ const groupId = ownGroupIdOf(root, target);
810
+ if (!groupId || latest.activeGroup === groupId) return;
811
+ commit(setActiveGroup(latest, groupId), { type: "activate", group: groupId });
812
+ };
813
+ const onRootKeyDown = (event) => {
814
+ callHandler(local.onKeyDown, event);
815
+ if (event.defaultPrevented || event.key !== "Tab" || event.altKey || event.ctrlKey || event.metaKey) return;
816
+ if (event.isComposing) return;
817
+ const root = rootEl;
818
+ const from = root ? deepActiveElement(root.ownerDocument) : null;
819
+ if (!root || !from || !containsDeep(root, from)) return;
820
+ const move = tabMove(root, from, event.shiftKey ? -1 : 1);
821
+ if (!move) return;
822
+ if (move.element === guardEl) leaving = true;
823
+ lastFocus = null;
824
+ if (move.prevent) {
825
+ event.preventDefault();
826
+ move.element.focus();
827
+ } else {
828
+ move.element.focus({ preventScroll: true });
829
+ }
830
+ };
831
+ onMount(() => {
832
+ const root = rootEl;
833
+ const view = root?.ownerDocument.defaultView;
834
+ if (!root || !view) return;
835
+ let timer;
836
+ const onPointerDown = () => {
837
+ pointerFocus = true;
838
+ view.clearTimeout(timer);
839
+ timer = view.setTimeout(() => {
840
+ pointerFocus = false;
841
+ }, 0);
842
+ };
843
+ const onFocusOut = (event) => {
844
+ if (event.relatedTarget instanceof Node && !root.contains(event.relatedTarget)) lastFocus = null;
845
+ };
846
+ const onWindowBlur = () => {
847
+ const active = root.ownerDocument.activeElement;
848
+ if (active instanceof view.HTMLIFrameElement && ownerRootOf(active) === root) lastFocus = active;
849
+ };
850
+ root.addEventListener("pointerdown", onPointerDown, true);
851
+ root.addEventListener("focusout", onFocusOut);
852
+ view.addEventListener("blur", onWindowBlur);
853
+ onCleanup(() => {
854
+ view.clearTimeout(timer);
855
+ root.removeEventListener("pointerdown", onPointerDown, true);
856
+ root.removeEventListener("focusout", onFocusOut);
857
+ view.removeEventListener("blur", onWindowBlur);
858
+ });
859
+ });
860
+ const onGuardFocus = () => {
861
+ if (leaving || !rootEl) return;
862
+ const last = lastStopOf(rootEl);
863
+ if (last) focusFromEnd(last);
864
+ };
865
+ const rootStyle = () => mergeStyle(local.style, {
866
+ "grid-template-columns": gridTemplateColumns(grid()),
867
+ "grid-template-rows": gridTemplateRows(grid())
868
+ });
869
+ const headerArea = (groupId) => {
870
+ const placed = grid().groups.find((entry) => entry.id === groupId);
871
+ return placed ? groupHeaderArea(placed) : "auto";
872
+ };
873
+ const bodyArea = (tabId) => {
874
+ const groupId = groupOfTab().get(tabId);
875
+ const placed = groupId === void 0 ? void 0 : grid().groups.find((entry) => entry.id === groupId);
876
+ return placed ? groupBodyArea(placed) : "auto";
877
+ };
878
+ const separatorEntry = (splitId, index) => grid().separators.find((entry) => entry.split === splitId && entry.index === index);
879
+ const separatorValue = (splitId, index) => {
880
+ const node = findSplitNode(layout().root, splitId);
881
+ if (!node) return 0;
882
+ const first = node.sizes[index] ?? 0;
883
+ const pair = first + (node.sizes[index + 1] ?? 0);
884
+ return pair > 0 ? Math.round(first / pair * 100) : 0;
885
+ };
886
+ const dropTargetClass = (groupId) => {
887
+ const zone = dropGroup() === groupId ? dropZone() : null;
888
+ return zone ? `smwb-tab-groups__drop-target--${zone}` : void 0;
889
+ };
890
+ const emptySlot = resolveChildren(() => local.empty);
891
+ const renderTab = (groupId, tabId) => {
892
+ const meta = () => local.getTab(tabId);
893
+ const closable = createMemo(() => meta()?.closable !== false);
894
+ const optional = createMemo(() => {
895
+ const given = meta();
896
+ const extra = {};
897
+ if (given?.disabled) extra.disabled = true;
898
+ if (given?.closeLabel !== void 0) extra.closeLabel = given.closeLabel;
899
+ if (given?.actions !== void 0) extra.actions = given.actions;
900
+ return extra;
901
+ });
902
+ const shortcuts = createMemo(() => meta()?.disabled ? void 0 : CHORD_SHORTCUTS);
903
+ return <Tab
904
+ {...optional()}
905
+ id={tabElementId(tabId)}
906
+ aria-controls={panelElementId(tabId)}
907
+ data-tab-id={tabId}
908
+ aria-keyshortcuts={shortcuts()}
909
+ label={meta()?.label ?? tabId}
910
+ icon={meta()?.icon}
911
+ closable={closable()}
912
+ onClose={(event, reason) => requestClose(tabId, event, reason)}
913
+ />;
914
+ };
915
+ const renderHeader = (groupId) => {
916
+ const [anchor, setAnchor] = createSignal(null);
917
+ const group = () => groupById(layout(), groupId);
918
+ const tabs = () => group()?.tabs ?? [];
919
+ const value = () => {
920
+ const active = group()?.active;
921
+ if (active === null || active === void 0) return 0;
922
+ const index = tabs().indexOf(active);
923
+ return index < 0 ? 0 : index;
924
+ };
925
+ return <div
926
+ class={cn("smwb-tab-groups__header", {
927
+ "smwb-tab-groups__header--active": layout().activeGroup === groupId
928
+ })}
929
+ id={headerElementId(groupId)}
930
+ data-group-id={groupId}
931
+ style={{ "grid-area": headerArea(groupId) }}
932
+ onKeyDown={onHeaderKeyDown(groupId)}
933
+ >
934
+ <Tabs
935
+ class="smwb-tab-groups__tabs"
936
+ value={value()}
937
+ onChange={onRowChange(groupId)}
938
+ onReorder={onRowReorder(groupId)}
939
+ aria-label={labels().group(indexOfGroup(groupId) + 1, groupCount())}
940
+ scrollable
941
+ overflowMenu
942
+ dense={local.dense === true}
943
+ >
944
+ <For each={tabs()}>{(tabId) => renderTab(groupId, tabId)}</For>
945
+ </Tabs>
946
+ <Show when={withGroupActions()}>
947
+ <button
948
+ type="button"
949
+ class="smwb-tab-groups__actions-trigger"
950
+ aria-label={labels().groupActions}
951
+ aria-haspopup="menu"
952
+ aria-expanded={openMenu() === groupId}
953
+ aria-controls={openMenu() === groupId ? menuElementId(groupId) : void 0}
954
+ ref={(el) => setAnchor(() => el)}
955
+ onClick={(event) => onTriggerClick(groupId, event)}
956
+ onKeyDown={(event) => onTriggerKeyDown(groupId, event)}
957
+ >
958
+ <Icon name="more_vert" size={20} />
959
+ </button>
960
+ <Menu
961
+ id={menuElementId(groupId)}
962
+ anchorElement={anchor()}
963
+ isOpen={openMenu() === groupId}
964
+ onClose={() => setOpenMenu(null)}
965
+ placement="bottom-end"
966
+ >
967
+ <MenuItem disabled={!canSplit(groupId)} onClick={() => runMenuAction(groupId, "splitRight")}>
968
+ {labels().splitRight}
969
+ </MenuItem>
970
+ <MenuItem disabled={!canSplit(groupId)} onClick={() => runMenuAction(groupId, "splitDown")}>
971
+ {labels().splitDown}
972
+ </MenuItem>
973
+ <MenuItem disabled={!canMoveToSibling(groupId, -1)} onClick={() => runMenuAction(groupId, "previous")}>
974
+ {labels().moveToPreviousGroup}
975
+ </MenuItem>
976
+ <MenuItem disabled={!canMoveToSibling(groupId, 1)} onClick={() => runMenuAction(groupId, "next")}>
977
+ {labels().moveToNextGroup}
978
+ </MenuItem>
979
+ <MenuItem disabled={!canShift(groupId, -1)} onClick={() => runMenuAction(groupId, "left")}>
980
+ {labels().moveLeft}
981
+ </MenuItem>
982
+ <MenuItem disabled={!canShift(groupId, 1)} onClick={() => runMenuAction(groupId, "right")}>
983
+ {labels().moveRight}
984
+ </MenuItem>
985
+ </Menu>
986
+ </Show>
987
+ </div>;
988
+ };
989
+ const renderPanelItem = (tabId) => {
990
+ const mounted = createMemo(() => mountedTabs().has(tabId));
991
+ const selected = createMemo(() => selectedTabs().has(tabId));
992
+ const groupId = createMemo(() => groupOfTab().get(tabId) ?? "");
993
+ return <div
994
+ class="smwb-tab-panel smwb-tab-groups__panel"
995
+ role="tabpanel"
996
+ id={panelElementId(tabId)}
997
+ aria-labelledby={tabElementId(tabId)}
998
+ tabindex={0}
999
+ hidden={selected() ? void 0 : true}
1000
+ data-tab-id={tabId}
1001
+ data-group-id={groupId()}
1002
+ style={{ "grid-area": bodyArea(tabId) }}
1003
+ >
1004
+ <Show when={mounted()}>
1005
+ {local.renderPanel(tabId)}
1006
+ {
1007
+ /* Where Shift+Tab enters the panel from the next child in reading order: the browser's
1008
+ own move from here lands on the panel's last stop (`tabMove`). */
1009
+ }
1010
+ <span class="smwb-tab-groups__panel-end" tabindex={-1} aria-hidden="true" />
1011
+ </Show>
1012
+ </div>;
1013
+ };
1014
+ const renderSeparatorItem = (key, splitId, index) => {
1015
+ const entry = () => separatorEntry(splitId, index);
1016
+ const orientation = () => entry()?.orientation ?? "vertical";
1017
+ const area = () => {
1018
+ const placed = entry();
1019
+ return placed ? separatorArea(placed) : "auto";
1020
+ };
1021
+ return <div
1022
+ class={cn("smwb-tab-groups__separator", `smwb-tab-groups__separator--${orientation()}`, {
1023
+ "smwb-tab-groups__separator--dragging": draggingSeparator()?.key === key
1024
+ })}
1025
+ id={separatorElementId(splitId, index)}
1026
+ role="separator"
1027
+ tabindex={0}
1028
+ aria-orientation={orientation()}
1029
+ aria-valuenow={separatorValue(splitId, index)}
1030
+ aria-valuemin={0}
1031
+ aria-valuemax={100}
1032
+ aria-label={labels().resize}
1033
+ data-split-id={splitId}
1034
+ data-index={index}
1035
+ style={{ "grid-area": area() }}
1036
+ onKeyDown={onSeparatorKeyDown(splitId, index, orientation())}
1037
+ onPointerDown={onSeparatorPointerDown(key, splitId, index, orientation())}
1038
+ onPointerMove={onSeparatorPointerMove(orientation())}
1039
+ onPointerUp={onSeparatorPointerUp(orientation())}
1040
+ onPointerCancel={onSeparatorPointerUp(orientation())}
1041
+ />;
1042
+ };
1043
+ const renderSeparatorKey = (key) => {
1044
+ const last = key.lastIndexOf(":");
1045
+ return renderSeparatorItem(key, key.slice(2, last), Number(key.slice(last + 1)));
1046
+ };
1047
+ const headerNodes = createMemo(mapArray(() => isEmpty() ? [] : groupIds(), renderHeader));
1048
+ const separatorNodes = createMemo(mapArray(() => isEmpty() ? [] : separatorKeys(), renderSeparatorKey));
1049
+ const panelNodes = createMemo(mapArray(() => isEmpty() ? [] : panelOrder(), renderPanelItem));
1050
+ const childNodes = createMemo(() => [...headerNodes(), ...separatorNodes(), ...panelNodes()]);
1051
+ return <div
1052
+ {...rest}
1053
+ ref={mergeRefs(local.ref, (el) => {
1054
+ rootEl = el;
1055
+ if (isServer) return;
1056
+ createRenderEffect((previous) => {
1057
+ const next = childNodes();
1058
+ placeChildren(el, next, previous);
1059
+ return next;
1060
+ }, []);
1061
+ })}
1062
+ id={base()}
1063
+ class={cn("smwb-tab-groups", { "smwb-tab-groups--split": hasSplit() }, local.class)}
1064
+ style={rootStyle()}
1065
+ data-testid={local["data-testid"] ?? "tab-groups"}
1066
+ aria-owns={owns()}
1067
+ onKeyDown={onRootKeyDown}
1068
+ onDragStart={onRootDragStart}
1069
+ onDragOver={onRootDragOver}
1070
+ onDrop={onRootDrop}
1071
+ onDragEnd={onRootDragEnd}
1072
+ onFocusIn={onRootFocusIn}
1073
+ >
1074
+ {isServer ? childNodes() : void 0}
1075
+ <Show when={isEmpty()}>
1076
+ <div class="smwb-tab-groups__empty">{emptySlot()}</div>
1077
+ </Show>
1078
+ <Show when={dragging()}>
1079
+ <For each={grid().groups}>
1080
+ {(placed) => <div
1081
+ class={cn("smwb-tab-groups__drop-target", dropTargetClass(placed.id))}
1082
+ data-group-id={placed.id}
1083
+ aria-hidden="true"
1084
+ style={{ "grid-area": groupBodyArea(placed) }}
1085
+ />}
1086
+ </For>
1087
+ </Show>
1088
+ <Show when={!isEmpty()}>
1089
+ {
1090
+ /* The root's last Tab stop, which only ever holds the focus on its way in or out. */
1091
+ }
1092
+ <span
1093
+ ref={(el) => guardEl = el}
1094
+ class="smwb-tab-groups__focus-guard"
1095
+ tabindex={0}
1096
+ onBlur={() => {
1097
+ leaving = false;
1098
+ }}
1099
+ />
1100
+ </Show>
1101
+ <div
1102
+ id={statusElementId()}
1103
+ class="smwb-tab-groups__status"
1104
+ role="status"
1105
+ aria-atomic={true}
1106
+ data-testid="tab-groups-status"
1107
+ >
1108
+ {status()}
1109
+ </div>
1110
+ </div>;
1111
+ }
1112
+ var tabGroups_default = TabGroups;
1113
+ export {
1114
+ TabGroups,
1115
+ tabGroups_default as default
1116
+ };
1117
+ //# sourceMappingURL=tabGroups.jsx.map