@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
@@ -1,10 +1,12 @@
1
1
  import {
2
+ For,
2
3
  Show,
3
4
  children,
4
5
  createComputed,
5
6
  createEffect,
6
7
  createMemo,
7
8
  createSignal,
9
+ createUniqueId,
8
10
  mergeProps,
9
11
  on,
10
12
  onCleanup,
@@ -15,10 +17,15 @@ import { isServer } from "solid-js/web";
15
17
  import cn from "clsx";
16
18
  import { debounce } from "../../../utils/debounce";
17
19
  import { animate } from "../../../utils/animate";
20
+ import { matchesKeyboardShortcut } from "../../../utils/keyboardShortcut";
18
21
  import { TabsContext } from "./tabsContext";
19
22
  import { Tab } from "./tab/tab";
23
+ import { getHiddenIndexes } from "./tabs.utils";
24
+ import { Menu } from "../menu";
25
+ import { MenuItem } from "../menu/menuItem";
20
26
  import { Icon } from "../../base/icon";
21
27
  import { mergeRefs } from "../../../primitives/mergeRefs";
28
+ import { createRovingTabIndex } from "../../../primitives/createRovingTabIndex";
22
29
  const VIEW_NEXT_TAB_PX = 40;
23
30
  const SCROLL_PAGE = 0.8;
24
31
  function TabListItems(props) {
@@ -28,15 +35,28 @@ function TabListItems(props) {
28
35
  }
29
36
  return <>{resolved()}</>;
30
37
  }
38
+ function PanelsResolver(props) {
39
+ const resolved = children(() => props.children);
40
+ createComputed(
41
+ () => props.onPanels(
42
+ resolved(),
43
+ resolved.toArray().some((node) => node != null && node !== false && node !== "")
44
+ )
45
+ );
46
+ return null;
47
+ }
31
48
  function Tabs(props) {
32
49
  const merged = mergeProps(
33
50
  {
34
51
  indicatorContent: false,
35
52
  scrollable: false,
36
53
  scrollButtons: false,
54
+ overflowMenu: false,
37
55
  dense: false,
56
+ orientation: "horizontal",
38
57
  scrollBackAriaLabel: "Scroll tabs back",
39
- scrollForwardAriaLabel: "Scroll tabs forward"
58
+ scrollForwardAriaLabel: "Scroll tabs forward",
59
+ overflowMenuAriaLabel: "More tabs"
40
60
  },
41
61
  props
42
62
  );
@@ -48,18 +68,36 @@ function Tabs(props) {
48
68
  "indicatorContent",
49
69
  "scrollable",
50
70
  "scrollButtons",
71
+ "onReorder",
72
+ "overflowMenu",
73
+ "overflowMenuAriaLabel",
51
74
  "dense",
75
+ "orientation",
76
+ "panels",
77
+ "id",
52
78
  "scrollBackAriaLabel",
53
79
  "scrollForwardAriaLabel",
54
80
  "aria-label",
55
81
  "ref"
56
82
  ]);
83
+ const generatedId = createUniqueId();
84
+ const baseId = () => local.id ?? generatedId;
85
+ const [registrations, setRegistrations] = createSignal([]);
86
+ const tabId = (index) => registrations().find((registration) => registration.index() === index)?.id() ?? `${baseId()}-tab-${index}`;
87
+ const panelId = (index) => `${baseId()}-panel-${index}`;
88
+ const [panels, setPanels] = createSignal();
89
+ const [hasPanels, setHasPanels] = createSignal(false);
90
+ const [focusedIndex, setFocusedIndex] = createSignal(null);
57
91
  const [mounted, setMounted] = createSignal(false);
58
92
  const [indicatorStyle, setIndicatorStyle] = createSignal({ root: {} });
59
93
  const [overflowStart, setOverflowStart] = createSignal(false);
60
94
  const [overflowEnd, setOverflowEnd] = createSignal(false);
95
+ const [hiddenIndexes, setHiddenIndexes] = createSignal([]);
96
+ const [overflowOpen, setOverflowOpen] = createSignal(false);
97
+ let overflowTriggerEl;
61
98
  let tabsEl;
62
99
  let tabListEl;
100
+ let closingTab = null;
63
101
  const [items, setItems] = createSignal();
64
102
  let created = 0;
65
103
  const getTabsMeta = () => {
@@ -104,11 +142,23 @@ function Tabs(props) {
104
142
  if (!tabsEl || !local.scrollable) {
105
143
  setOverflowStart(false);
106
144
  setOverflowEnd(false);
145
+ setHiddenIndexes((prev) => prev.length === 0 ? prev : []);
107
146
  return;
108
147
  }
109
148
  const max = tabsEl.scrollWidth - tabsEl.clientWidth;
110
149
  setOverflowStart(tabsEl.scrollLeft > 1);
111
150
  setOverflowEnd(tabsEl.scrollLeft < max - 1);
151
+ const hidden = local.overflowMenu ? getHiddenIndexes(
152
+ tabListEl ? Array.from(tabListEl.children).map((child) => {
153
+ const item = child;
154
+ return { offsetLeft: item.offsetLeft, offsetWidth: item.offsetWidth };
155
+ }) : [],
156
+ tabsEl.scrollLeft,
157
+ tabsEl.clientWidth
158
+ ) : [];
159
+ setHiddenIndexes(
160
+ (prev) => prev.length === hidden.length && prev.every((index, at) => index === hidden[at]) ? prev : hidden
161
+ );
112
162
  };
113
163
  const scroll = (scrollValue) => {
114
164
  if (!tabsEl) return;
@@ -118,17 +168,28 @@ function Tabs(props) {
118
168
  if (!tabsEl) return;
119
169
  scroll(tabsEl.scrollLeft + direction * tabsEl.clientWidth * SCROLL_PAGE);
120
170
  };
121
- const scrollSelectedIntoView = () => {
122
- const { tabsMeta, tabMeta } = getTabsMeta();
123
- if (!tabMeta || !tabsMeta) return;
124
- if (tabMeta.left < tabsMeta.left) {
125
- scroll(tabsMeta.scrollLeft + (tabMeta.left - tabsMeta.left) - VIEW_NEXT_TAB_PX);
126
- } else if (tabMeta.right > tabsMeta.right) {
127
- scroll(tabsMeta.scrollLeft + (tabMeta.right - tabsMeta.right) + VIEW_NEXT_TAB_PX);
171
+ const scrollIndexIntoView = (index) => {
172
+ if (!tabsEl || !tabListEl) return;
173
+ const tab = tabListEl.children[index];
174
+ if (!tab) return;
175
+ const tabsRect = tabsEl.getBoundingClientRect();
176
+ const tabRect = tab.getBoundingClientRect();
177
+ if (tabRect.left < tabsRect.left) {
178
+ scroll(tabsEl.scrollLeft + (tabRect.left - tabsRect.left) - VIEW_NEXT_TAB_PX);
179
+ } else if (tabRect.right > tabsRect.right) {
180
+ scroll(tabsEl.scrollLeft + (tabRect.right - tabsRect.right) + VIEW_NEXT_TAB_PX);
128
181
  }
129
182
  };
183
+ const scrollSelectedIntoView = () => {
184
+ scrollIndexIntoView(local.value);
185
+ };
130
186
  onMount(() => setMounted(true));
131
- createEffect(on([() => local.value, items], () => updateIndicatorState()));
187
+ createEffect(
188
+ on([() => local.value, items], () => {
189
+ updateIndicatorState();
190
+ updateOverflow();
191
+ })
192
+ );
132
193
  onMount(() => {
133
194
  const onResize = debounce(() => {
134
195
  updateIndicatorState();
@@ -155,23 +216,218 @@ function Tabs(props) {
155
216
  indicatorStyle();
156
217
  scrollSelectedIntoView();
157
218
  });
219
+ const getTabNodes = () => Array.from(tabListEl?.querySelectorAll('[role="tab"]') ?? []);
220
+ const itemOf = (tab) => tab.closest(".smwb-tab-item") ?? tab;
221
+ const indexOfFocus = (target) => target ? getTabNodes().findIndex((node) => itemOf(node).contains(target)) : -1;
222
+ const isNodeDisabled = (node) => !node || node.getAttribute("aria-disabled") === "true" || node.disabled === true;
223
+ const selectedStop = () => {
224
+ const count = items()?.length;
225
+ const candidate = count === void 0 || local.value >= 0 && local.value < count ? local.value : 0;
226
+ const list = registrations();
227
+ if (!list.some((registration) => registration.index() === candidate && registration.disabled())) return candidate;
228
+ const enabled = list.filter((registration) => !registration.disabled()).map((registration) => registration.index()).filter((index) => index >= 0);
229
+ return enabled.length > 0 ? Math.min(...enabled) : candidate;
230
+ };
231
+ const stopIndex = () => focusedIndex() ?? selectedStop();
232
+ const onRovingKeyDown = createRovingTabIndex({
233
+ count: () => getTabNodes().length,
234
+ activeIndex: stopIndex,
235
+ get orientation() {
236
+ return local.orientation;
237
+ },
238
+ onMove: (next) => getTabNodes()[next]?.focus(),
239
+ isDisabled: (index) => isNodeDisabled(getTabNodes()[index])
240
+ });
241
+ let dragSourceIndex = null;
242
+ let draggingItem = null;
243
+ let dropTargetItem = null;
244
+ const dragItemOf = (target) => target instanceof Element ? itemOf(target) : null;
245
+ const clearDragMarks = () => {
246
+ draggingItem?.classList.remove("smwb-tab-item--dragging");
247
+ dropTargetItem?.classList.remove("smwb-tab-item--drop-target");
248
+ draggingItem = null;
249
+ dropTargetItem = null;
250
+ };
251
+ const onItemDragStart = (event) => {
252
+ if (!local.onReorder) return;
253
+ const item = dragItemOf(event.target);
254
+ if (!item) return;
255
+ const index = indexOfFocus(item);
256
+ if (index < 0 || isNodeDisabled(getTabNodes()[index])) return;
257
+ dragSourceIndex = index;
258
+ draggingItem = item;
259
+ item.classList.add("smwb-tab-item--dragging");
260
+ event.dataTransfer?.setData("text/plain", String(index));
261
+ if (event.dataTransfer) {
262
+ event.dataTransfer.effectAllowed = "move";
263
+ }
264
+ };
265
+ const onItemDragOver = (event) => {
266
+ if (dragSourceIndex === null || !local.onReorder) return;
267
+ const item = dragItemOf(event.target);
268
+ if (!item) return;
269
+ event.preventDefault();
270
+ if (item === dropTargetItem) return;
271
+ dropTargetItem?.classList.remove("smwb-tab-item--drop-target");
272
+ dropTargetItem = item;
273
+ item.classList.add("smwb-tab-item--drop-target");
274
+ };
275
+ const onItemDrop = (event) => {
276
+ if (dragSourceIndex === null) return;
277
+ const from = dragSourceIndex;
278
+ dragSourceIndex = null;
279
+ const to = indexOfFocus(dragItemOf(event.target));
280
+ const sourceItem = draggingItem;
281
+ const wasSelected = from === local.value;
282
+ const doc = sourceItem?.ownerDocument;
283
+ const hadFocus = Boolean(sourceItem && doc?.activeElement && sourceItem.contains(doc.activeElement));
284
+ clearDragMarks();
285
+ event.preventDefault();
286
+ if (to >= 0 && to !== from) {
287
+ local.onReorder?.(from, to);
288
+ if (wasSelected) {
289
+ local.onChange(event, to);
290
+ }
291
+ if (hadFocus) {
292
+ const moved = getTabNodes()[to];
293
+ if (moved && itemOf(moved) === sourceItem) moved.focus();
294
+ }
295
+ }
296
+ };
297
+ const onItemDragEnd = () => {
298
+ dragSourceIndex = null;
299
+ clearDragMarks();
300
+ };
301
+ const switchByChord = (event, delta) => {
302
+ const nodes = getTabNodes();
303
+ const from = indexOfFocus(event.target);
304
+ if (from < 0 || nodes.length === 0) return;
305
+ for (let step = 1; step <= nodes.length; step += 1) {
306
+ const next = (from + delta * step + nodes.length) % nodes.length;
307
+ const node = nodes[next];
308
+ if (node && !isNodeDisabled(node)) {
309
+ node.focus();
310
+ node.click();
311
+ return;
312
+ }
313
+ }
314
+ };
315
+ const onTabListKeyDown = (event) => {
316
+ if (event.defaultPrevented) return;
317
+ if ((event.ctrlKey || event.metaKey) && !event.altKey && indexOfFocus(event.target) >= 0) {
318
+ const index = indexOfFocus(event.target);
319
+ const registration = registrations().find((candidate) => candidate.index() === index);
320
+ if (matchesKeyboardShortcut(event, ["Mod", "W"])) {
321
+ if (registration && !registration.disabled() && registration.closable()) {
322
+ event.preventDefault();
323
+ registration.requestClose(event);
324
+ }
325
+ return;
326
+ }
327
+ if (matchesKeyboardShortcut(event, ["Mod", "Shift", "["])) {
328
+ event.preventDefault();
329
+ switchByChord(event, -1);
330
+ return;
331
+ }
332
+ if (matchesKeyboardShortcut(event, ["Mod", "Shift", "]"])) {
333
+ event.preventDefault();
334
+ switchByChord(event, 1);
335
+ return;
336
+ }
337
+ }
338
+ if (event.ctrlKey || event.metaKey || event.altKey || event.shiftKey) return;
339
+ if (!event.target.closest('[role="tab"]')) return;
340
+ onRovingKeyDown(event);
341
+ };
342
+ createEffect(
343
+ on(
344
+ items,
345
+ () => {
346
+ const doc = tabListEl?.ownerDocument;
347
+ const closing = closingTab;
348
+ if (doc && closing && !closing.item.isConnected) {
349
+ closingTab = null;
350
+ if (!doc.activeElement || doc.activeElement === doc.body) {
351
+ const nodes = getTabNodes();
352
+ const from = Math.min(closing.index, nodes.length - 1);
353
+ const candidates = [...nodes.keys()].filter((index2) => !isNodeDisabled(nodes[index2]));
354
+ const target = candidates.find((index2) => index2 >= from) ?? candidates[candidates.length - 1];
355
+ if (target !== void 0) {
356
+ nodes[target]?.focus();
357
+ setFocusedIndex(target);
358
+ return;
359
+ }
360
+ }
361
+ }
362
+ if (focusedIndex() === null) return;
363
+ const index = indexOfFocus(doc?.activeElement);
364
+ setFocusedIndex(index >= 0 ? index : null);
365
+ },
366
+ { defer: true }
367
+ )
368
+ );
369
+ const onTabListFocusIn = (event) => {
370
+ const index = indexOfFocus(event.target);
371
+ if (index >= 0) setFocusedIndex(index);
372
+ if (closingTab && !closingTab.item.contains(event.target)) closingTab = null;
373
+ };
374
+ const onTabListFocusOut = (event) => {
375
+ if (!event.currentTarget.contains(event.relatedTarget)) {
376
+ setFocusedIndex(null);
377
+ queueMicrotask(() => {
378
+ if (closingTab?.item.isConnected) closingTab = null;
379
+ });
380
+ }
381
+ };
158
382
  const contextValue = {
159
383
  value: () => local.value,
384
+ tabStop: (index) => stopIndex() === index,
385
+ tabId,
386
+ panelId,
387
+ hasPanels,
388
+ reorderable: () => local.onReorder !== void 0,
160
389
  onChange: local.onChange,
161
- registerTab: (element) => {
390
+ closing: (index, reason) => {
391
+ const tab = getTabNodes()[index];
392
+ const active = tab?.ownerDocument.activeElement;
393
+ const focused = reason === "actions" || Boolean(active && tab && itemOf(tab).contains(active));
394
+ closingTab = tab && focused ? { item: itemOf(tab), index } : null;
395
+ },
396
+ registerTab: (element, info) => {
162
397
  const order = created++;
163
- return createMemo(() => {
398
+ const index = createMemo(() => {
164
399
  const list = items();
165
400
  if (!list) return order;
166
401
  const el = element();
167
402
  return el ? list.findIndex((item) => item.contains(el)) : -1;
168
403
  });
404
+ const registration = { ...info, index };
405
+ setRegistrations((list) => [...list, registration]);
406
+ onCleanup(() => setRegistrations((list) => list.filter((item) => item !== registration)));
407
+ return index;
169
408
  }
170
409
  };
171
410
  const showScrollButtons = () => local.scrollable && local.scrollButtons && (overflowStart() || overflowEnd());
411
+ const showOverflowTrigger = () => local.scrollable && local.overflowMenu && hiddenIndexes().length > 0;
412
+ const overflowItemIcon = (node) => node?.querySelector(".smwb-tab__icon") ?? void 0;
413
+ const overflowItemLabel = (node) => node?.querySelector(".smwb-tab__text-label")?.textContent ?? "";
414
+ const cloneIconInto = (el, node) => {
415
+ const source = overflowItemIcon(node);
416
+ if (!source) return;
417
+ Array.from(source.childNodes).forEach((child) => el.appendChild(child.cloneNode(true)));
418
+ };
419
+ const chooseOverflowItem = (event, index) => {
420
+ setOverflowOpen(false);
421
+ local.onChange(event, index);
422
+ scrollIndexIntoView(index);
423
+ };
172
424
  return <TabsContext.Provider value={contextValue}>
425
+ <PanelsResolver onPanels={(resolved, has) => (setPanels(() => resolved), setHasPanels(has))}>
426
+ {local.panels}
427
+ </PanelsResolver>
173
428
  <div
174
429
  {...rest}
430
+ id={local.id}
175
431
  class={cn(
176
432
  "smwb-tabs",
177
433
  {
@@ -181,7 +437,6 @@ function Tabs(props) {
181
437
  },
182
438
  local.class
183
439
  )}
184
- role="tabpanel"
185
440
  ref={mergeRefs(local.ref)}
186
441
  >
187
442
  <Show when={showScrollButtons()}>
@@ -190,6 +445,7 @@ function Tabs(props) {
190
445
  class="smwb-tabs__scroll-button smwb-tabs__scroll-button--start"
191
446
  aria-label={local.scrollBackAriaLabel}
192
447
  disabled={!overflowStart()}
448
+ tabindex={-1}
193
449
  onClick={() => scrollByPage(-1)}
194
450
  >
195
451
  <Icon name="chevron_left" size={20} />
@@ -204,7 +460,20 @@ function Tabs(props) {
204
460
  classList={{ "smwb-tabs__scroller--scrollable": local.scrollable }}
205
461
  ref={(el) => tabsEl = el}
206
462
  >
207
- <div class="smwb-tabs__scroll-area" ref={(el) => tabListEl = el} role="tablist" aria-label={local["aria-label"]}>
463
+ <div
464
+ class="smwb-tabs__scroll-area"
465
+ ref={(el) => tabListEl = el}
466
+ role="tablist"
467
+ aria-label={local["aria-label"]}
468
+ aria-orientation={local.orientation}
469
+ onKeyDown={onTabListKeyDown}
470
+ onFocusIn={onTabListFocusIn}
471
+ onFocusOut={onTabListFocusOut}
472
+ onDragStart={onItemDragStart}
473
+ onDragOver={onItemDragOver}
474
+ onDrop={onItemDrop}
475
+ onDragEnd={onItemDragEnd}
476
+ >
208
477
  <TabListItems onItems={setItems}>{local.children}</TabListItems>
209
478
  </div>
210
479
  <Show when={mounted()}>
@@ -228,12 +497,91 @@ function Tabs(props) {
228
497
  class="smwb-tabs__scroll-button smwb-tabs__scroll-button--end"
229
498
  aria-label={local.scrollForwardAriaLabel}
230
499
  disabled={!overflowEnd()}
500
+ tabindex={-1}
231
501
  onClick={() => scrollByPage(1)}
232
502
  >
233
503
  <Icon name="chevron_right" size={20} />
234
504
  </button>
235
505
  </Show>
506
+ <Show when={showOverflowTrigger()}>
507
+ <button
508
+ type="button"
509
+ class="smwb-tabs__overflow-trigger"
510
+ aria-haspopup="menu"
511
+ aria-expanded={overflowOpen()}
512
+ aria-label={local.overflowMenuAriaLabel}
513
+ tabindex={-1}
514
+ ref={(el) => overflowTriggerEl = el}
515
+ onClick={() => setOverflowOpen((open) => !open)}
516
+ >
517
+ <Icon name="more_horiz" size={20} />
518
+ </button>
519
+ <Menu
520
+ anchorElement={overflowTriggerEl ?? null}
521
+ isOpen={overflowOpen()}
522
+ onClose={() => setOverflowOpen(false)}
523
+ placement="bottom-end"
524
+ >
525
+ <For each={hiddenIndexes()}>
526
+ {(index) => {
527
+ const nodeNow = () => getTabNodes()[index];
528
+ const drawn = nodeNow();
529
+ const [label, setLabel] = createSignal(overflowItemLabel(drawn));
530
+ const [hasIcon, setHasIcon] = createSignal(Boolean(overflowItemIcon(drawn)));
531
+ const disabled = createMemo(() => {
532
+ const registration = registrations().find((candidate) => candidate.index() === index);
533
+ return registration ? registration.disabled() : isNodeDisabled(nodeNow());
534
+ });
535
+ let iconEl;
536
+ let shownNode = drawn;
537
+ const syncIcon = (node) => {
538
+ shownNode = node;
539
+ const source = overflowItemIcon(node);
540
+ setHasIcon(Boolean(source));
541
+ if (iconEl && source) {
542
+ iconEl.textContent = "";
543
+ cloneIconInto(iconEl, node);
544
+ }
545
+ };
546
+ createEffect(
547
+ on([items, registrations], () => {
548
+ const node = nodeNow();
549
+ setLabel(overflowItemLabel(node));
550
+ syncIcon(node);
551
+ const item = node ? itemOf(node) : null;
552
+ const view = item?.ownerDocument.defaultView;
553
+ if (!item || !view || typeof view.MutationObserver === "undefined") return;
554
+ const observer = new view.MutationObserver(() => {
555
+ setLabel(overflowItemLabel(node));
556
+ syncIcon(node);
557
+ });
558
+ observer.observe(item, { subtree: true, childList: true, characterData: true });
559
+ onCleanup(() => observer.disconnect());
560
+ })
561
+ );
562
+ return <MenuItem
563
+ disabled={disabled()}
564
+ aria-current={index === local.value ? "true" : void 0}
565
+ onClick={(event) => chooseOverflowItem(event, index)}
566
+ >
567
+ <Show when={hasIcon()}>
568
+ <span
569
+ class="smwb-tab__icon"
570
+ aria-hidden="true"
571
+ ref={(el) => {
572
+ iconEl = el;
573
+ if (overflowItemIcon(shownNode)) cloneIconInto(el, shownNode);
574
+ }}
575
+ />
576
+ </Show>
577
+ <span class="smwb-tab__text-label">{label()}</span>
578
+ </MenuItem>;
579
+ }}
580
+ </For>
581
+ </Menu>
582
+ </Show>
236
583
  </div>
584
+ {panels()}
237
585
  </TabsContext.Provider>;
238
586
  }
239
587
  var tabs_default = Tabs;