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