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