@smwb/ui-solid 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/README.md +564 -0
  2. package/dist/assets/styles/less/components/appBar/appBar.entry.css +1 -1
  3. package/dist/assets/styles/less/components/button/button.entry.css +1 -1
  4. package/dist/assets/styles/less/components/checkbox/checkbox.entry.css +1 -1
  5. package/dist/assets/styles/less/components/chip/chip.entry.css +1 -1
  6. package/dist/assets/styles/less/components/commandPalette/commandPalette.entry.css +1 -0
  7. package/dist/assets/styles/less/components/composer/composer.entry.css +1 -0
  8. package/dist/assets/styles/less/components/diffStat/diffStat.entry.css +1 -0
  9. package/dist/assets/styles/less/components/kbd/kbd.entry.css +1 -0
  10. package/dist/assets/styles/less/components/list/list.entry.css +1 -1
  11. package/dist/assets/styles/less/components/qrCode/qrCode.entry.css +1 -0
  12. package/dist/assets/styles/less/components/radioButton/radioButton.entry.css +1 -1
  13. package/dist/assets/styles/less/components/selectField/selectField.entry.css +1 -1
  14. package/dist/assets/styles/less/components/sidebar/sidebar.entry.css +1 -1
  15. package/dist/assets/styles/less/components/statusDot/statusDot.entry.css +1 -0
  16. package/dist/assets/styles/less/components/swimlanes/swimlanes.entry.css +1 -0
  17. package/dist/assets/styles/less/components/tabGroups/tabGroups.entry.css +1 -0
  18. package/dist/assets/styles/less/components/tabs/tab/tab.entry.css +1 -1
  19. package/dist/assets/styles/less/components/tabs/tabPanel/tabPanel.entry.css +1 -0
  20. package/dist/assets/styles/less/components/tabs/tabs.entry.css +1 -1
  21. package/dist/assets/styles/less/components/textField/textField.entry.css +1 -1
  22. package/dist/assets/styles/less/components/toggle/toggle.entry.css +1 -1
  23. package/dist/assets/styles/less/components/treeView/treeView.entry.css +1 -1
  24. package/dist/assets/styles/less/tokens.entry.css +1 -1
  25. package/dist/components/dataDisplay/chat/chat.d.ts +42 -0
  26. package/dist/components/dataDisplay/chat/chat.js +116 -57
  27. package/dist/components/dataDisplay/chat/chat.js.map +1 -1
  28. package/dist/components/dataDisplay/chat/chatComposer.d.ts +17 -0
  29. package/dist/components/dataDisplay/chat/chatComposer.js +21 -19
  30. package/dist/components/dataDisplay/chat/chatComposer.js.map +1 -1
  31. package/dist/components/dataDisplay/chat/index.d.ts +1 -1
  32. package/dist/components/dataDisplay/chat/utils.d.ts +14 -0
  33. package/dist/components/dataDisplay/chat/utils.js.map +1 -1
  34. package/dist/components/dataDisplay/dagView/dagView.js +238 -223
  35. package/dist/components/dataDisplay/dagView/dagView.js.map +1 -1
  36. package/dist/components/dataDisplay/diffStat/diffStat.d.ts +55 -0
  37. package/dist/components/dataDisplay/diffStat/diffStat.js +70 -0
  38. package/dist/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  39. package/dist/components/dataDisplay/diffStat/index.d.ts +2 -0
  40. package/dist/components/dataDisplay/kbd/index.d.ts +4 -0
  41. package/dist/components/dataDisplay/kbd/kbd.d.ts +41 -0
  42. package/dist/components/dataDisplay/kbd/kbd.js +47 -0
  43. package/dist/components/dataDisplay/kbd/kbd.js.map +1 -0
  44. package/dist/components/dataDisplay/kbd/kbdKeys.d.ts +18 -0
  45. package/dist/components/dataDisplay/kbd/kbdKeys.js +70 -0
  46. package/dist/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  47. package/dist/components/dataDisplay/list/listItem.d.ts +34 -0
  48. package/dist/components/dataDisplay/list/listItem.js +57 -20
  49. package/dist/components/dataDisplay/list/listItem.js.map +1 -1
  50. package/dist/components/dataDisplay/qrCode/index.d.ts +2 -0
  51. package/dist/components/dataDisplay/qrCode/qrCode.d.ts +30 -0
  52. package/dist/components/dataDisplay/qrCode/qrCode.js +88 -0
  53. package/dist/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  54. package/dist/components/dataDisplay/qrCode/qrCodePath.d.ts +7 -0
  55. package/dist/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  56. package/dist/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  57. package/dist/components/dataDisplay/statusDot/index.d.ts +2 -0
  58. package/dist/components/dataDisplay/statusDot/statusDot.d.ts +35 -0
  59. package/dist/components/dataDisplay/statusDot/statusDot.js +31 -0
  60. package/dist/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  61. package/dist/components/dataDisplay/swimlanes/index.d.ts +2 -0
  62. package/dist/components/dataDisplay/swimlanes/swimlanes.d.ts +75 -0
  63. package/dist/components/dataDisplay/swimlanes/swimlanes.js +361 -0
  64. package/dist/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  65. package/dist/components/dataDisplay/treeView/treeView.d.ts +20 -0
  66. package/dist/components/dataDisplay/treeView/treeView.js +161 -95
  67. package/dist/components/dataDisplay/treeView/treeView.js.map +1 -1
  68. package/dist/components/feedBack/modal/modal.d.ts +9 -0
  69. package/dist/components/feedBack/modal/modal.js +68 -54
  70. package/dist/components/feedBack/modal/modal.js.map +1 -1
  71. package/dist/components/inputs/button/button.d.ts +12 -0
  72. package/dist/components/inputs/button/button.js +44 -37
  73. package/dist/components/inputs/button/button.js.map +1 -1
  74. package/dist/components/inputs/composer/composer.d.ts +148 -0
  75. package/dist/components/inputs/composer/composer.js +276 -0
  76. package/dist/components/inputs/composer/composer.js.map +1 -0
  77. package/dist/components/inputs/composer/composerFiles.d.ts +26 -0
  78. package/dist/components/inputs/composer/composerFiles.js +18 -0
  79. package/dist/components/inputs/composer/composerFiles.js.map +1 -0
  80. package/dist/components/inputs/composer/composerKeys.d.ts +29 -0
  81. package/dist/components/inputs/composer/composerKeys.js +7 -0
  82. package/dist/components/inputs/composer/composerKeys.js.map +1 -0
  83. package/dist/components/inputs/composer/index.d.ts +3 -0
  84. package/dist/components/layout/sheet/sheet.d.ts +12 -0
  85. package/dist/components/layout/sheet/sheet.js +100 -86
  86. package/dist/components/layout/sheet/sheet.js.map +1 -1
  87. package/dist/components/layout/tabGroups/index.d.ts +4 -0
  88. package/dist/components/layout/tabGroups/tabGroups.d.ts +102 -0
  89. package/dist/components/layout/tabGroups/tabGroups.js +895 -0
  90. package/dist/components/layout/tabGroups/tabGroups.js.map +1 -0
  91. package/dist/components/layout/tabGroups/tabGroupsFocus.d.ts +55 -0
  92. package/dist/components/layout/tabGroups/tabGroupsFocus.js +192 -0
  93. package/dist/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  94. package/dist/components/layout/tabGroups/tabGroupsLayout.d.ts +250 -0
  95. package/dist/components/layout/tabGroups/tabGroupsLayout.js +480 -0
  96. package/dist/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  97. package/dist/components/navigation/appBar/appBar.d.ts +22 -0
  98. package/dist/components/navigation/appBar/appBar.js +60 -22
  99. package/dist/components/navigation/appBar/appBar.js.map +1 -1
  100. package/dist/components/navigation/commandPalette/commandPalette.d.ts +126 -0
  101. package/dist/components/navigation/commandPalette/commandPalette.js +457 -0
  102. package/dist/components/navigation/commandPalette/commandPalette.js.map +1 -0
  103. package/dist/components/navigation/commandPalette/commandPaletteFilter.d.ts +11 -0
  104. package/dist/components/navigation/commandPalette/commandPaletteFilter.js +15 -0
  105. package/dist/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  106. package/dist/components/navigation/commandPalette/commandPaletteNavigation.d.ts +13 -0
  107. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  108. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  109. package/dist/components/navigation/commandPalette/commandPaletteTypes.d.ts +39 -0
  110. package/dist/components/navigation/commandPalette/index.d.ts +6 -0
  111. package/dist/components/navigation/sidebar/sidebar.d.ts +10 -0
  112. package/dist/components/navigation/sidebar/sidebar.js +12 -10
  113. package/dist/components/navigation/sidebar/sidebar.js.map +1 -1
  114. package/dist/components/navigation/tabs/index.d.ts +3 -1
  115. package/dist/components/navigation/tabs/tab/tab.d.ts +89 -2
  116. package/dist/components/navigation/tabs/tab/tab.js +164 -44
  117. package/dist/components/navigation/tabs/tab/tab.js.map +1 -1
  118. package/dist/components/navigation/tabs/tabPanel/tabPanel.d.ts +20 -0
  119. package/dist/components/navigation/tabs/tabPanel/tabPanel.js +34 -0
  120. package/dist/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  121. package/dist/components/navigation/tabs/tabs.d.ts +73 -3
  122. package/dist/components/navigation/tabs/tabs.js +387 -160
  123. package/dist/components/navigation/tabs/tabs.js.map +1 -1
  124. package/dist/components/navigation/tabs/tabs.utils.d.ts +20 -0
  125. package/dist/components/navigation/tabs/tabs.utils.js +11 -0
  126. package/dist/components/navigation/tabs/tabs.utils.js.map +1 -0
  127. package/dist/components/navigation/tabs/tabsContext.d.ts +31 -1
  128. package/dist/components/navigation/tabs/tabsContext.js.map +1 -1
  129. package/dist/headless/components/dataDisplay/chat/chat.js +116 -57
  130. package/dist/headless/components/dataDisplay/chat/chat.js.map +1 -1
  131. package/dist/headless/components/dataDisplay/chat/chatComposer.js +21 -19
  132. package/dist/headless/components/dataDisplay/chat/chatComposer.js.map +1 -1
  133. package/dist/headless/components/dataDisplay/chat/utils.js.map +1 -1
  134. package/dist/headless/components/dataDisplay/dagView/dagView.js +238 -223
  135. package/dist/headless/components/dataDisplay/dagView/dagView.js.map +1 -1
  136. package/dist/headless/components/dataDisplay/diffStat/diffStat.js +68 -0
  137. package/dist/headless/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  138. package/dist/headless/components/dataDisplay/kbd/kbd.js +45 -0
  139. package/dist/headless/components/dataDisplay/kbd/kbd.js.map +1 -0
  140. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js +70 -0
  141. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  142. package/dist/headless/components/dataDisplay/list/listItem.js +57 -20
  143. package/dist/headless/components/dataDisplay/list/listItem.js.map +1 -1
  144. package/dist/headless/components/dataDisplay/qrCode/qrCode.js +86 -0
  145. package/dist/headless/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  146. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  147. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  148. package/dist/headless/components/dataDisplay/statusDot/statusDot.js +29 -0
  149. package/dist/headless/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  150. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js +359 -0
  151. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  152. package/dist/headless/components/dataDisplay/treeView/treeView.js +161 -95
  153. package/dist/headless/components/dataDisplay/treeView/treeView.js.map +1 -1
  154. package/dist/headless/components/feedBack/modal/modal.js +68 -54
  155. package/dist/headless/components/feedBack/modal/modal.js.map +1 -1
  156. package/dist/headless/components/inputs/button/button.js +42 -35
  157. package/dist/headless/components/inputs/button/button.js.map +1 -1
  158. package/dist/headless/components/inputs/composer/composer.js +274 -0
  159. package/dist/headless/components/inputs/composer/composer.js.map +1 -0
  160. package/dist/headless/components/inputs/composer/composerFiles.js +18 -0
  161. package/dist/headless/components/inputs/composer/composerFiles.js.map +1 -0
  162. package/dist/headless/components/inputs/composer/composerKeys.js +7 -0
  163. package/dist/headless/components/inputs/composer/composerKeys.js.map +1 -0
  164. package/dist/headless/components/layout/sheet/sheet.js +100 -86
  165. package/dist/headless/components/layout/sheet/sheet.js.map +1 -1
  166. package/dist/headless/components/layout/tabGroups/tabGroups.js +893 -0
  167. package/dist/headless/components/layout/tabGroups/tabGroups.js.map +1 -0
  168. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js +192 -0
  169. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  170. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js +480 -0
  171. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  172. package/dist/headless/components/navigation/appBar/appBar.js +64 -26
  173. package/dist/headless/components/navigation/appBar/appBar.js.map +1 -1
  174. package/dist/headless/components/navigation/commandPalette/commandPalette.js +455 -0
  175. package/dist/headless/components/navigation/commandPalette/commandPalette.js.map +1 -0
  176. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js +15 -0
  177. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  178. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  179. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  180. package/dist/headless/components/navigation/sidebar/sidebar.js +28 -26
  181. package/dist/headless/components/navigation/sidebar/sidebar.js.map +1 -1
  182. package/dist/headless/components/navigation/tabs/tab/tab.js +164 -44
  183. package/dist/headless/components/navigation/tabs/tab/tab.js.map +1 -1
  184. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js +32 -0
  185. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  186. package/dist/headless/components/navigation/tabs/tabs.js +387 -160
  187. package/dist/headless/components/navigation/tabs/tabs.js.map +1 -1
  188. package/dist/headless/components/navigation/tabs/tabs.utils.js +11 -0
  189. package/dist/headless/components/navigation/tabs/tabs.utils.js.map +1 -0
  190. package/dist/headless/components/navigation/tabs/tabsContext.js.map +1 -1
  191. package/dist/headless/index.js +405 -367
  192. package/dist/headless/index.js.map +1 -1
  193. package/dist/headless/primitives/createFocusTrap.js +17 -17
  194. package/dist/headless/primitives/createFocusTrap.js.map +1 -1
  195. package/dist/headless/primitives/createKeyboardShortcut.js +16 -0
  196. package/dist/headless/primitives/createKeyboardShortcut.js.map +1 -0
  197. package/dist/headless/primitives/restoreFocus.js +10 -0
  198. package/dist/headless/primitives/restoreFocus.js.map +1 -0
  199. package/dist/headless/source/components/dataDisplay/chat/chat.jsx +38 -4
  200. package/dist/headless/source/components/dataDisplay/chat/chat.jsx.map +1 -1
  201. package/dist/headless/source/components/dataDisplay/chat/chatComposer.jsx +1 -0
  202. package/dist/headless/source/components/dataDisplay/chat/chatComposer.jsx.map +1 -1
  203. package/dist/headless/source/components/dataDisplay/chat/index.js.map +1 -1
  204. package/dist/headless/source/components/dataDisplay/chat/utils.js.map +2 -2
  205. package/dist/headless/source/components/dataDisplay/dagView/dagView.jsx +30 -21
  206. package/dist/headless/source/components/dataDisplay/dagView/dagView.jsx.map +1 -1
  207. package/dist/headless/source/components/dataDisplay/diffStat/diffStat.jsx +76 -0
  208. package/dist/headless/source/components/dataDisplay/diffStat/diffStat.jsx.map +1 -0
  209. package/dist/headless/source/components/dataDisplay/diffStat/index.js +19 -0
  210. package/dist/headless/source/components/dataDisplay/diffStat/index.js.map +7 -0
  211. package/dist/headless/source/components/dataDisplay/kbd/index.js +9 -0
  212. package/dist/headless/source/components/dataDisplay/kbd/index.js.map +7 -0
  213. package/dist/headless/source/components/dataDisplay/kbd/kbd.jsx +48 -0
  214. package/dist/headless/source/components/dataDisplay/kbd/kbd.jsx.map +1 -0
  215. package/dist/headless/source/components/dataDisplay/kbd/kbdKeys.js +79 -0
  216. package/dist/headless/source/components/dataDisplay/kbd/kbdKeys.js.map +7 -0
  217. package/dist/headless/source/components/dataDisplay/list/listItem.jsx +37 -7
  218. package/dist/headless/source/components/dataDisplay/list/listItem.jsx.map +1 -1
  219. package/dist/headless/source/components/dataDisplay/qrCode/index.js +6 -0
  220. package/dist/headless/source/components/dataDisplay/qrCode/index.js.map +7 -0
  221. package/dist/headless/source/components/dataDisplay/qrCode/qrCode.jsx +94 -0
  222. package/dist/headless/source/components/dataDisplay/qrCode/qrCode.jsx.map +1 -0
  223. package/dist/headless/source/components/dataDisplay/qrCode/qrCodePath.js +24 -0
  224. package/dist/headless/source/components/dataDisplay/qrCode/qrCodePath.js.map +7 -0
  225. package/dist/headless/source/components/dataDisplay/statusDot/index.js +6 -0
  226. package/dist/headless/source/components/dataDisplay/statusDot/index.js.map +7 -0
  227. package/dist/headless/source/components/dataDisplay/statusDot/statusDot.jsx +28 -0
  228. package/dist/headless/source/components/dataDisplay/statusDot/statusDot.jsx.map +1 -0
  229. package/dist/headless/source/components/dataDisplay/swimlanes/index.js +15 -0
  230. package/dist/headless/source/components/dataDisplay/swimlanes/index.js.map +7 -0
  231. package/dist/headless/source/components/dataDisplay/swimlanes/swimlanes.jsx +450 -0
  232. package/dist/headless/source/components/dataDisplay/swimlanes/swimlanes.jsx.map +1 -0
  233. package/dist/headless/source/components/dataDisplay/treeView/treeView.jsx +118 -37
  234. package/dist/headless/source/components/dataDisplay/treeView/treeView.jsx.map +1 -1
  235. package/dist/headless/source/components/feedBack/modal/modal.jsx +34 -4
  236. package/dist/headless/source/components/feedBack/modal/modal.jsx.map +1 -1
  237. package/dist/headless/source/components/inputs/button/button.jsx +6 -2
  238. package/dist/headless/source/components/inputs/button/button.jsx.map +1 -1
  239. package/dist/headless/source/components/inputs/composer/composer.jsx +319 -0
  240. package/dist/headless/source/components/inputs/composer/composer.jsx.map +1 -0
  241. package/dist/headless/source/components/inputs/composer/composerFiles.js +27 -0
  242. package/dist/headless/source/components/inputs/composer/composerFiles.js.map +7 -0
  243. package/dist/headless/source/components/inputs/composer/composerKeys.js +11 -0
  244. package/dist/headless/source/components/inputs/composer/composerKeys.js.map +7 -0
  245. package/dist/headless/source/components/inputs/composer/index.js +5 -0
  246. package/dist/headless/source/components/inputs/composer/index.js.map +7 -0
  247. package/dist/headless/source/components/layout/sheet/sheet.jsx +33 -11
  248. package/dist/headless/source/components/layout/sheet/sheet.jsx.map +1 -1
  249. package/dist/headless/source/components/layout/tabGroups/index.js +8 -0
  250. package/dist/headless/source/components/layout/tabGroups/index.js.map +7 -0
  251. package/dist/headless/source/components/layout/tabGroups/tabGroups.jsx +1117 -0
  252. package/dist/headless/source/components/layout/tabGroups/tabGroups.jsx.map +1 -0
  253. package/dist/headless/source/components/layout/tabGroups/tabGroupsFocus.js +222 -0
  254. package/dist/headless/source/components/layout/tabGroups/tabGroupsFocus.js.map +7 -0
  255. package/dist/headless/source/components/layout/tabGroups/tabGroupsLayout.js +629 -0
  256. package/dist/headless/source/components/layout/tabGroups/tabGroupsLayout.js.map +7 -0
  257. package/dist/headless/source/components/navigation/appBar/appBar.jsx +27 -3
  258. package/dist/headless/source/components/navigation/appBar/appBar.jsx.map +1 -1
  259. package/dist/headless/source/components/navigation/commandPalette/commandPalette.jsx +506 -0
  260. package/dist/headless/source/components/navigation/commandPalette/commandPalette.jsx.map +1 -0
  261. package/dist/headless/source/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  262. package/dist/headless/source/components/navigation/commandPalette/commandPaletteFilter.js.map +7 -0
  263. package/dist/headless/source/components/navigation/commandPalette/commandPaletteNavigation.js +54 -0
  264. package/dist/headless/source/components/navigation/commandPalette/commandPaletteNavigation.js.map +7 -0
  265. package/dist/headless/source/components/navigation/commandPalette/commandPaletteTypes.js +1 -0
  266. package/dist/headless/source/components/navigation/commandPalette/commandPaletteTypes.js.map +7 -0
  267. package/dist/headless/source/components/navigation/commandPalette/index.js +11 -0
  268. package/dist/headless/source/components/navigation/commandPalette/index.js.map +7 -0
  269. package/dist/headless/source/components/navigation/sidebar/sidebar.jsx +5 -2
  270. package/dist/headless/source/components/navigation/sidebar/sidebar.jsx.map +1 -1
  271. package/dist/headless/source/components/navigation/tabs/index.js +2 -0
  272. package/dist/headless/source/components/navigation/tabs/index.js.map +2 -2
  273. package/dist/headless/source/components/navigation/tabs/tab/tab.jsx +135 -8
  274. package/dist/headless/source/components/navigation/tabs/tab/tab.jsx.map +1 -1
  275. package/dist/headless/source/components/navigation/tabs/tabPanel/tabPanel.jsx +28 -0
  276. package/dist/headless/source/components/navigation/tabs/tabPanel/tabPanel.jsx.map +1 -0
  277. package/dist/headless/source/components/navigation/tabs/tabs.jsx +361 -13
  278. package/dist/headless/source/components/navigation/tabs/tabs.jsx.map +1 -1
  279. package/dist/headless/source/components/navigation/tabs/tabs.utils.js +18 -0
  280. package/dist/headless/source/components/navigation/tabs/tabs.utils.js.map +7 -0
  281. package/dist/headless/source/components/navigation/tabs/tabsContext.js.map +2 -2
  282. package/dist/headless/source/index.js +41 -1
  283. package/dist/headless/source/index.js.map +2 -2
  284. package/dist/headless/source/primitives/createFocusTrap.js +8 -3
  285. package/dist/headless/source/primitives/createFocusTrap.js.map +2 -2
  286. package/dist/headless/source/primitives/createKeyboardShortcut.js +23 -0
  287. package/dist/headless/source/primitives/createKeyboardShortcut.js.map +7 -0
  288. package/dist/headless/source/primitives/restoreFocus.js +14 -0
  289. package/dist/headless/source/primitives/restoreFocus.js.map +7 -0
  290. package/dist/headless/source/utils/keyboardShortcut.js +74 -0
  291. package/dist/headless/source/utils/keyboardShortcut.js.map +7 -0
  292. package/dist/headless/source/utils/linkAttrs.js +16 -0
  293. package/dist/headless/source/utils/linkAttrs.js.map +7 -0
  294. package/dist/headless/utils/keyboardShortcut.js +48 -0
  295. package/dist/headless/utils/keyboardShortcut.js.map +1 -0
  296. package/dist/headless/utils/linkAttrs.js +13 -0
  297. package/dist/headless/utils/linkAttrs.js.map +1 -0
  298. package/dist/index.d.ts +24 -3
  299. package/dist/index.js +405 -367
  300. package/dist/index.js.map +1 -1
  301. package/dist/primitives/createFocusTrap.d.ts +5 -0
  302. package/dist/primitives/createFocusTrap.js +17 -17
  303. package/dist/primitives/createFocusTrap.js.map +1 -1
  304. package/dist/primitives/createKeyboardShortcut.d.ts +23 -0
  305. package/dist/primitives/createKeyboardShortcut.js +16 -0
  306. package/dist/primitives/createKeyboardShortcut.js.map +1 -0
  307. package/dist/primitives/restoreFocus.d.ts +8 -0
  308. package/dist/primitives/restoreFocus.js +10 -0
  309. package/dist/primitives/restoreFocus.js.map +1 -0
  310. package/dist/source/components/dataDisplay/chat/chat.jsx +38 -4
  311. package/dist/source/components/dataDisplay/chat/chat.jsx.map +1 -1
  312. package/dist/source/components/dataDisplay/chat/chatComposer.jsx +1 -0
  313. package/dist/source/components/dataDisplay/chat/chatComposer.jsx.map +1 -1
  314. package/dist/source/components/dataDisplay/chat/index.js.map +1 -1
  315. package/dist/source/components/dataDisplay/chat/utils.js.map +2 -2
  316. package/dist/source/components/dataDisplay/dagView/dagView.jsx +30 -21
  317. package/dist/source/components/dataDisplay/dagView/dagView.jsx.map +1 -1
  318. package/dist/source/components/dataDisplay/diffStat/diffStat.jsx +78 -0
  319. package/dist/source/components/dataDisplay/diffStat/diffStat.jsx.map +1 -0
  320. package/dist/source/components/dataDisplay/diffStat/index.js +19 -0
  321. package/dist/source/components/dataDisplay/diffStat/index.js.map +7 -0
  322. package/dist/source/components/dataDisplay/kbd/index.js +9 -0
  323. package/dist/source/components/dataDisplay/kbd/index.js.map +7 -0
  324. package/dist/source/components/dataDisplay/kbd/kbd.jsx +50 -0
  325. package/dist/source/components/dataDisplay/kbd/kbd.jsx.map +1 -0
  326. package/dist/source/components/dataDisplay/kbd/kbdKeys.js +79 -0
  327. package/dist/source/components/dataDisplay/kbd/kbdKeys.js.map +7 -0
  328. package/dist/source/components/dataDisplay/list/listItem.jsx +37 -7
  329. package/dist/source/components/dataDisplay/list/listItem.jsx.map +1 -1
  330. package/dist/source/components/dataDisplay/qrCode/index.js +6 -0
  331. package/dist/source/components/dataDisplay/qrCode/index.js.map +7 -0
  332. package/dist/source/components/dataDisplay/qrCode/qrCode.jsx +96 -0
  333. package/dist/source/components/dataDisplay/qrCode/qrCode.jsx.map +1 -0
  334. package/dist/source/components/dataDisplay/qrCode/qrCodePath.js +24 -0
  335. package/dist/source/components/dataDisplay/qrCode/qrCodePath.js.map +7 -0
  336. package/dist/source/components/dataDisplay/statusDot/index.js +6 -0
  337. package/dist/source/components/dataDisplay/statusDot/index.js.map +7 -0
  338. package/dist/source/components/dataDisplay/statusDot/statusDot.jsx +30 -0
  339. package/dist/source/components/dataDisplay/statusDot/statusDot.jsx.map +1 -0
  340. package/dist/source/components/dataDisplay/swimlanes/index.js +15 -0
  341. package/dist/source/components/dataDisplay/swimlanes/index.js.map +7 -0
  342. package/dist/source/components/dataDisplay/swimlanes/swimlanes.jsx +452 -0
  343. package/dist/source/components/dataDisplay/swimlanes/swimlanes.jsx.map +1 -0
  344. package/dist/source/components/dataDisplay/treeView/treeView.jsx +118 -37
  345. package/dist/source/components/dataDisplay/treeView/treeView.jsx.map +1 -1
  346. package/dist/source/components/feedBack/modal/modal.jsx +34 -4
  347. package/dist/source/components/feedBack/modal/modal.jsx.map +1 -1
  348. package/dist/source/components/inputs/button/button.jsx +6 -2
  349. package/dist/source/components/inputs/button/button.jsx.map +1 -1
  350. package/dist/source/components/inputs/composer/composer.jsx +321 -0
  351. package/dist/source/components/inputs/composer/composer.jsx.map +1 -0
  352. package/dist/source/components/inputs/composer/composerFiles.js +27 -0
  353. package/dist/source/components/inputs/composer/composerFiles.js.map +7 -0
  354. package/dist/source/components/inputs/composer/composerKeys.js +11 -0
  355. package/dist/source/components/inputs/composer/composerKeys.js.map +7 -0
  356. package/dist/source/components/inputs/composer/index.js +5 -0
  357. package/dist/source/components/inputs/composer/index.js.map +7 -0
  358. package/dist/source/components/layout/sheet/sheet.jsx +33 -11
  359. package/dist/source/components/layout/sheet/sheet.jsx.map +1 -1
  360. package/dist/source/components/layout/tabGroups/index.js +8 -0
  361. package/dist/source/components/layout/tabGroups/index.js.map +7 -0
  362. package/dist/source/components/layout/tabGroups/tabGroups.jsx +1119 -0
  363. package/dist/source/components/layout/tabGroups/tabGroups.jsx.map +1 -0
  364. package/dist/source/components/layout/tabGroups/tabGroupsFocus.js +222 -0
  365. package/dist/source/components/layout/tabGroups/tabGroupsFocus.js.map +7 -0
  366. package/dist/source/components/layout/tabGroups/tabGroupsLayout.js +629 -0
  367. package/dist/source/components/layout/tabGroups/tabGroupsLayout.js.map +7 -0
  368. package/dist/source/components/navigation/appBar/appBar.jsx +27 -3
  369. package/dist/source/components/navigation/appBar/appBar.jsx.map +1 -1
  370. package/dist/source/components/navigation/commandPalette/commandPalette.jsx +508 -0
  371. package/dist/source/components/navigation/commandPalette/commandPalette.jsx.map +1 -0
  372. package/dist/source/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  373. package/dist/source/components/navigation/commandPalette/commandPaletteFilter.js.map +7 -0
  374. package/dist/source/components/navigation/commandPalette/commandPaletteNavigation.js +54 -0
  375. package/dist/source/components/navigation/commandPalette/commandPaletteNavigation.js.map +7 -0
  376. package/dist/source/components/navigation/commandPalette/commandPaletteTypes.js +1 -0
  377. package/dist/source/components/navigation/commandPalette/commandPaletteTypes.js.map +7 -0
  378. package/dist/source/components/navigation/commandPalette/index.js +11 -0
  379. package/dist/source/components/navigation/commandPalette/index.js.map +7 -0
  380. package/dist/source/components/navigation/sidebar/sidebar.jsx +5 -2
  381. package/dist/source/components/navigation/sidebar/sidebar.jsx.map +1 -1
  382. package/dist/source/components/navigation/tabs/index.js +2 -0
  383. package/dist/source/components/navigation/tabs/index.js.map +2 -2
  384. package/dist/source/components/navigation/tabs/tab/tab.jsx +135 -8
  385. package/dist/source/components/navigation/tabs/tab/tab.jsx.map +1 -1
  386. package/dist/source/components/navigation/tabs/tabPanel/tabPanel.jsx +30 -0
  387. package/dist/source/components/navigation/tabs/tabPanel/tabPanel.jsx.map +1 -0
  388. package/dist/source/components/navigation/tabs/tabs.jsx +361 -13
  389. package/dist/source/components/navigation/tabs/tabs.jsx.map +1 -1
  390. package/dist/source/components/navigation/tabs/tabs.utils.js +18 -0
  391. package/dist/source/components/navigation/tabs/tabs.utils.js.map +7 -0
  392. package/dist/source/components/navigation/tabs/tabsContext.js.map +2 -2
  393. package/dist/source/index.js +41 -1
  394. package/dist/source/index.js.map +2 -2
  395. package/dist/source/primitives/createFocusTrap.js +8 -3
  396. package/dist/source/primitives/createFocusTrap.js.map +2 -2
  397. package/dist/source/primitives/createKeyboardShortcut.js +23 -0
  398. package/dist/source/primitives/createKeyboardShortcut.js.map +7 -0
  399. package/dist/source/primitives/restoreFocus.js +14 -0
  400. package/dist/source/primitives/restoreFocus.js.map +7 -0
  401. package/dist/source/utils/keyboardShortcut.js +74 -0
  402. package/dist/source/utils/keyboardShortcut.js.map +7 -0
  403. package/dist/source/utils/linkAttrs.js +16 -0
  404. package/dist/source/utils/linkAttrs.js.map +7 -0
  405. package/dist/utils/keyboardShortcut.d.ts +12 -0
  406. package/dist/utils/keyboardShortcut.js +48 -0
  407. package/dist/utils/keyboardShortcut.js.map +1 -0
  408. package/dist/utils/linkAttrs.d.ts +13 -0
  409. package/dist/utils/linkAttrs.js +13 -0
  410. package/dist/utils/linkAttrs.js.map +1 -0
  411. package/package.json +66 -3
@@ -1,14 +1,15 @@
1
- import { createComponent as c, Portal as y, use as g, insert as s, Dynamic as k, mergeProps as C, effect as l, className as i, isServer as $, template as _, delegateEvents as O } from "solid-js/web";
1
+ import { createComponent as p, Portal as E, use as k, insert as s, Dynamic as $, mergeProps as A, effect as l, className as i, isServer as O, template as b, delegateEvents as h } from "solid-js/web";
2
2
  import '../../../assets/styles/less/components/modal/modal.entry.css';import '../../../assets/styles/less/tokens.entry.css';/* empty css */
3
3
  /* empty css */
4
- import { mergeProps as A, splitProps as E, createEffect as h, onCleanup as P, Show as x } from "solid-js";
5
- import n from "clsx";
6
- import { createCssTransition as F } from "../../../primitives/createCssTransition.js";
7
- import { createFocusTrap as L } from "../../../primitives/createFocusTrap.js";
8
- import { isTopOverlayLayer as S } from "../../../primitives/overlayLayer.js";
9
- import { mergeRefs as z } from "../../../primitives/mergeRefs.js";
10
- var D = /* @__PURE__ */ _("<div data-smwb-overlay-layer>"), d = /* @__PURE__ */ _("<div>");
11
- const M = {
4
+ import { mergeProps as x, splitProps as F, createSignal as P, createEffect as v, on as S, onCleanup as _, Show as L } from "solid-js";
5
+ import a from "clsx";
6
+ import { createCssTransition as T } from "../../../primitives/createCssTransition.js";
7
+ import { createFocusTrap as z } from "../../../primitives/createFocusTrap.js";
8
+ import { isTopOverlayLayer as D } from "../../../primitives/overlayLayer.js";
9
+ import { restoreFocus as M } from "../../../primitives/restoreFocus.js";
10
+ import { mergeRefs as N } from "../../../primitives/mergeRefs.js";
11
+ var R = /* @__PURE__ */ b("<div data-smwb-overlay-layer>"), u = /* @__PURE__ */ b("<div>");
12
+ const j = {
12
13
  appear: "smwb-modal__overlay-appear",
13
14
  appearActive: "smwb-modal__overlay-appear-active",
14
15
  appearDone: "smwb-modal__overlay-appear-done",
@@ -18,8 +19,13 @@ const M = {
18
19
  exit: "smwb-modal__overlay-exit",
19
20
  exitActive: "smwb-modal__overlay-exit-active"
20
21
  };
21
- function N(o) {
22
- const r = A({
22
+ function q(r) {
23
+ if (!r || typeof document > "u") return !0;
24
+ const o = document.querySelectorAll(".smwb-modal__overlay:not(.smwb-modal__overlay-exit)");
25
+ return o[o.length - 1] === r;
26
+ }
27
+ function B(r) {
28
+ const o = x({
23
29
  animation: "fade",
24
30
  backdrop: "dark",
25
31
  size: "large",
@@ -28,55 +34,63 @@ function N(o) {
28
34
  disableAppearAnimation: !1,
29
35
  role: "dialog",
30
36
  closeOnEsc: !0
31
- }, o), [e, f] = E(r, ["children", "onClose", "open", "class", "animation", "backdrop", "size", "closeOnOutsideClick", "asForm", "disableAppearAnimation", "role", "closeOnEsc", "ref"]);
32
- let p, u;
33
- const m = F({
37
+ }, r), [e, w] = F(o, ["children", "onClose", "open", "class", "animation", "backdrop", "size", "closeOnOutsideClick", "asForm", "disableAppearAnimation", "role", "closeOnEsc", "ref"]), [m, y] = P();
38
+ let c;
39
+ v(S(() => e.open, (t) => {
40
+ if (!t) return;
41
+ const n = m()?.contains(document.activeElement) ? null : document.activeElement;
42
+ _(() => M(n, m()));
43
+ }));
44
+ const d = T({
34
45
  in: () => e.open,
35
46
  timeout: {
36
47
  appear: 225,
37
48
  enter: 225,
38
49
  exit: 150
39
50
  },
40
- classNames: M,
51
+ classNames: j,
41
52
  appear: !e.disableAppearAnimation
42
53
  });
43
- L({
44
- active: () => e.open && m.mounted(),
45
- container: () => p
46
- }), h(() => {
54
+ z({
55
+ active: () => e.open && d.mounted(),
56
+ container: m,
57
+ restoreFocus: !1,
58
+ isTopmost: () => q(c)
59
+ }), v(() => {
47
60
  if (!e.open || !e.closeOnEsc || !e.onClose) return;
48
- const t = (a) => {
49
- a.key === "Escape" && !a.defaultPrevented && S(u) && e.onClose?.();
61
+ const t = (n) => {
62
+ n.key === "Escape" && !n.defaultPrevented && D(c) && e.onClose?.();
50
63
  };
51
- document.addEventListener("keydown", t), P(() => document.removeEventListener("keydown", t));
64
+ document.addEventListener("keydown", t), _(() => document.removeEventListener("keydown", t));
52
65
  });
53
- const b = () => {
66
+ const g = () => {
54
67
  e.closeOnOutsideClick && e.onClose?.();
55
68
  };
56
- return c(x, {
69
+ return p(L, {
57
70
  get when() {
58
- return m.mounted();
71
+ return d.mounted();
59
72
  },
60
73
  get children() {
61
- return c(y, {
74
+ return p(E, {
62
75
  get mount() {
63
- return $ ? void 0 : document.body;
76
+ return O ? void 0 : document.body;
64
77
  },
65
78
  get children() {
66
- var t = D();
67
- return t.$$click = b, g((a) => u = a, t), s(t, c(k, C({
79
+ var t = R();
80
+ return t.$$click = g, k((n) => c = n, t), s(t, p($, A({
68
81
  get component() {
69
82
  return e.asForm ? "form" : "div";
70
83
  }
71
- }, f, {
72
- ref(a) {
73
- var v = z(e.ref, (w) => p = w);
74
- typeof v == "function" && v(a);
84
+ }, w, {
85
+ ref(n) {
86
+ var f = N(e.ref, (C) => y(C));
87
+ typeof f == "function" && f(n);
75
88
  },
76
89
  get class() {
77
- return n("smwb-modal", `smwb-${e.size}`, `smwb-${e.animation}`, e.class);
90
+ return a("smwb-modal", `smwb-${e.size}`, `smwb-${e.animation}`, e.class);
78
91
  },
79
- onClick: (a) => a.stopPropagation(),
92
+ onClick: (n) => n.stopPropagation(),
93
+ tabindex: -1,
80
94
  get role() {
81
95
  return e.role;
82
96
  },
@@ -84,40 +98,40 @@ function N(o) {
84
98
  get children() {
85
99
  return e.children;
86
100
  }
87
- }))), l(() => i(t, n("smwb-modal__overlay", `smwb-${e.backdrop}`, `smwb-${e.size}`, m.classes()))), t;
101
+ }))), l(() => i(t, a("smwb-modal__overlay", `smwb-${e.backdrop}`, `smwb-${e.size}`, d.classes()))), t;
88
102
  }
89
103
  });
90
104
  }
91
105
  });
92
106
  }
93
- function T(o) {
107
+ function H(r) {
94
108
  return (() => {
95
- var r = d();
96
- return s(r, () => o.children), l(() => i(r, n("smwb-modal__header", o.class))), r;
109
+ var o = u();
110
+ return s(o, () => r.children), l(() => i(o, a("smwb-modal__header", r.class))), o;
97
111
  })();
98
112
  }
99
- function R(o) {
113
+ function K(r) {
100
114
  return (() => {
101
- var r = d();
102
- return s(r, () => o.children), l(() => i(r, n("smwb-modal__content", o.class))), r;
115
+ var o = u();
116
+ return s(o, () => r.children), l(() => i(o, a("smwb-modal__content", r.class))), o;
103
117
  })();
104
118
  }
105
- function j(o) {
119
+ function V(r) {
106
120
  return (() => {
107
- var r = d();
108
- return s(r, () => o.children), l(() => i(r, n("smwb-modal__footer", o.class))), r;
121
+ var o = u();
122
+ return s(o, () => r.children), l(() => i(o, a("smwb-modal__footer", r.class))), o;
109
123
  })();
110
124
  }
111
- const Q = Object.assign(N, {
112
- Footer: j,
113
- Header: T,
114
- Content: R
125
+ const oe = Object.assign(B, {
126
+ Footer: V,
127
+ Header: H,
128
+ Content: K
115
129
  });
116
- O(["click"]);
130
+ h(["click"]);
117
131
  export {
118
- R as Content,
119
- j as Footer,
120
- T as Header,
121
- Q as Modal
132
+ K as Content,
133
+ V as Footer,
134
+ H as Header,
135
+ oe as Modal
122
136
  };
123
137
  //# sourceMappingURL=modal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modal.js","sources":["../../../../src/components/feedBack/modal/modal.tsx"],"sourcesContent":["import { type JSX, type ParentProps, Show, createEffect, mergeProps, onCleanup, splitProps } from \"solid-js\";\nimport { Dynamic, Portal, isServer } from \"solid-js/web\";\nimport cn from \"clsx\";\nimport { createCssTransition } from \"../../../primitives/createCssTransition\";\nimport { createFocusTrap } from \"../../../primitives/createFocusTrap\";\nimport { isTopOverlayLayer } from \"../../../primitives/overlayLayer\";\nimport { mergeRefs, type Ref } from \"../../../primitives/mergeRefs\";\n\nexport interface ModalProps {\n size?: \"small\" | \"medium\" | \"large\" | \"fullscreen\";\n closeOnOutsideClick?: boolean;\n onClose?: () => void;\n open: boolean;\n animation?: \"fade\" | \"scale\" | \"drop\";\n class?: string;\n backdrop?: \"blured\" | \"dark\" | \"transparent\" | \"darkBlured\";\n asForm?: boolean;\n disableAppearAnimation?: boolean;\n /** ARIA role of the dialog. */\n role?: \"dialog\" | \"alertdialog\";\n /** Close the modal when Escape is pressed. */\n closeOnEsc?: boolean;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n ref?: Ref<HTMLDivElement>;\n}\n\nconst OVERLAY_CLASSNAMES = {\n appear: \"smwb-modal__overlay-appear\",\n appearActive: \"smwb-modal__overlay-appear-active\",\n appearDone: \"smwb-modal__overlay-appear-done\",\n enter: \"smwb-modal__overlay-enter\",\n enterActive: \"smwb-modal__overlay-enter-active\",\n enterDone: \"smwb-modal__overlay-enter-done\",\n exit: \"smwb-modal__overlay-exit\",\n exitActive: \"smwb-modal__overlay-exit-active\",\n};\n\nfunction ModalBase(props: ParentProps<ModalProps>): JSX.Element {\n const merged = mergeProps(\n {\n animation: \"fade\" as const,\n backdrop: \"dark\" as const,\n size: \"large\" as const,\n closeOnOutsideClick: true,\n asForm: false,\n disableAppearAnimation: false,\n role: \"dialog\" as const,\n closeOnEsc: true,\n },\n props\n );\n const [local, rest] = splitProps(merged, [\n \"children\",\n \"onClose\",\n \"open\",\n \"class\",\n \"animation\",\n \"backdrop\",\n \"size\",\n \"closeOnOutsideClick\",\n \"asForm\",\n \"disableAppearAnimation\",\n \"role\",\n \"closeOnEsc\",\n \"ref\",\n ]);\n\n let contentEl: HTMLDivElement | undefined;\n let overlayEl: HTMLDivElement | undefined;\n\n const transition = createCssTransition({\n in: () => local.open,\n timeout: { appear: 225, enter: 225, exit: 150 },\n classNames: OVERLAY_CLASSNAMES,\n appear: !local.disableAppearAnimation,\n });\n\n createFocusTrap({ active: () => local.open && transition.mounted(), container: () => contentEl });\n\n createEffect(() => {\n if (!local.open || !local.closeOnEsc || !local.onClose) return;\n const onKeyDown = (event: KeyboardEvent): void => {\n // Only the topmost overlay layer reacts to Escape, and not to one handled inside\n // it, e.g. by a menu closing on it.\n if (event.key === \"Escape\" && !event.defaultPrevented && isTopOverlayLayer(overlayEl)) local.onClose?.();\n };\n document.addEventListener(\"keydown\", onKeyDown);\n onCleanup(() => document.removeEventListener(\"keydown\", onKeyDown));\n });\n\n // Always attached and checks the props itself. Solid binds event handlers\n // once, and the portal builds the overlay in a tracked scope, so choosing the\n // handler by these props there would rebuild the dialog, content included,\n // whenever one of them changes.\n const onOverlayClick = (): void => {\n if (local.closeOnOutsideClick) local.onClose?.();\n };\n\n return (\n <Show when={transition.mounted()}>\n <Portal mount={(isServer ? undefined : document.body) as Node}>\n <div\n ref={(el) => (overlayEl = el)}\n data-smwb-overlay-layer\n class={cn(\"smwb-modal__overlay\", `smwb-${local.backdrop}`, `smwb-${local.size}`, transition.classes())}\n onClick={onOverlayClick}\n >\n <Dynamic\n component={local.asForm ? \"form\" : \"div\"}\n {...rest}\n ref={mergeRefs(local.ref, (el) => (contentEl = el as HTMLDivElement))}\n class={cn(\"smwb-modal\", `smwb-${local.size}`, `smwb-${local.animation}`, local.class)}\n onClick={(event: MouseEvent) => event.stopPropagation()}\n role={local.role}\n aria-modal=\"true\"\n >\n {local.children}\n </Dynamic>\n </div>\n </Portal>\n </Show>\n );\n}\n\nexport interface ModalSlotProps {\n class?: string;\n}\n\nexport function Header(props: ParentProps<ModalSlotProps>): JSX.Element {\n return <div class={cn(\"smwb-modal__header\", props.class)}>{props.children}</div>;\n}\n\nexport function Content(props: ParentProps<ModalSlotProps>): JSX.Element {\n return <div class={cn(\"smwb-modal__content\", props.class)}>{props.children}</div>;\n}\n\nexport function Footer(props: ParentProps<ModalSlotProps>): JSX.Element {\n return <div class={cn(\"smwb-modal__footer\", props.class)}>{props.children}</div>;\n}\n\nexport const Modal = Object.assign(ModalBase, { Footer, Header, Content });\n\nexport default Modal;\n"],"names":["OVERLAY_CLASSNAMES","appear","appearActive","appearDone","enter","enterActive","enterDone","exit","exitActive","ModalBase","props","merged","mergeProps","animation","backdrop","size","closeOnOutsideClick","asForm","disableAppearAnimation","role","closeOnEsc","local","rest","splitProps","contentEl","overlayEl","transition","createCssTransition","in","open","timeout","classNames","createFocusTrap","active","mounted","container","createEffect","onClose","onKeyDown","event","key","defaultPrevented","isTopOverlayLayer","document","addEventListener","onCleanup","removeEventListener","onOverlayClick","_$createComponent","Show","when","children","Portal","mount","isServer","undefined","body","_el$","_tmpl$","$$click","_$use","el","_$insert","Dynamic","_$mergeProps","component","ref","r$","_ref$","mergeRefs","cn","class","onClick","stopPropagation","_$effect","_$className","classes","Header","_el$2","_tmpl$2","Content","_el$3","Footer","_el$4","Modal","Object","assign","_$delegateEvents"],"mappings":"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"}
1
+ {"version":3,"file":"modal.js","sources":["../../../../src/components/feedBack/modal/modal.tsx"],"sourcesContent":["import {\n type JSX,\n type ParentProps,\n Show,\n createEffect,\n createSignal,\n mergeProps,\n on,\n onCleanup,\n splitProps,\n} from \"solid-js\";\nimport { Dynamic, Portal, isServer } from \"solid-js/web\";\nimport cn from \"clsx\";\nimport { createCssTransition } from \"../../../primitives/createCssTransition\";\nimport { createFocusTrap } from \"../../../primitives/createFocusTrap\";\nimport { isTopOverlayLayer } from \"../../../primitives/overlayLayer\";\nimport { restoreFocus } from \"../../../primitives/restoreFocus\";\nimport { mergeRefs, type Ref } from \"../../../primitives/mergeRefs\";\n\nexport interface ModalProps {\n size?: \"small\" | \"medium\" | \"large\" | \"fullscreen\";\n closeOnOutsideClick?: boolean;\n onClose?: () => void;\n open: boolean;\n animation?: \"fade\" | \"scale\" | \"drop\";\n class?: string;\n backdrop?: \"blured\" | \"dark\" | \"transparent\" | \"darkBlured\";\n asForm?: boolean;\n disableAppearAnimation?: boolean;\n /** ARIA role of the dialog. */\n role?: \"dialog\" | \"alertdialog\";\n /** Close the modal when Escape is pressed. */\n closeOnEsc?: boolean;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n ref?: Ref<HTMLDivElement>;\n}\n\nconst OVERLAY_CLASSNAMES = {\n appear: \"smwb-modal__overlay-appear\",\n appearActive: \"smwb-modal__overlay-appear-active\",\n appearDone: \"smwb-modal__overlay-appear-done\",\n enter: \"smwb-modal__overlay-enter\",\n enterActive: \"smwb-modal__overlay-enter-active\",\n enterDone: \"smwb-modal__overlay-enter-done\",\n exit: \"smwb-modal__overlay-exit\",\n exitActive: \"smwb-modal__overlay-exit-active\",\n};\n\n/**\n * Whether `overlay` is the last open Modal overlay; a dialog stacked above it owns Tab. Fading-out\n * ones do not count. Not `isTopOverlayLayer`: menus, select dropdowns and pickers are overlay\n * layers too, and a select dropdown open inside a Modal must not switch the Modal's trap off.\n */\nfunction isTopModal(overlay: Element | null | undefined): boolean {\n if (!overlay || typeof document === \"undefined\") return true;\n const open = document.querySelectorAll(\".smwb-modal__overlay:not(.smwb-modal__overlay-exit)\");\n return open[open.length - 1] === overlay;\n}\n\n/**\n * A modal dialog: portaled to `<body>`, animated, closed by Escape or a backdrop click.\n *\n * While open it traps Tab/Shift+Tab inside the dialog and moves the focus into it (the first tab\n * stop, else the dialog itself), unless a child has already focused itself. On close, and on\n * unmount while open, the focus goes back to the element that had it when the dialog opened —\n * unless the app has moved the focus elsewhere by then.\n * Of stacked dialogs only the topmost one handles Tab.\n */\nfunction ModalBase(props: ParentProps<ModalProps>): JSX.Element {\n const merged = mergeProps(\n {\n animation: \"fade\" as const,\n backdrop: \"dark\" as const,\n size: \"large\" as const,\n closeOnOutsideClick: true,\n asForm: false,\n disableAppearAnimation: false,\n role: \"dialog\" as const,\n closeOnEsc: true,\n },\n props\n );\n const [local, rest] = splitProps(merged, [\n \"children\",\n \"onClose\",\n \"open\",\n \"class\",\n \"animation\",\n \"backdrop\",\n \"size\",\n \"closeOnOutsideClick\",\n \"asForm\",\n \"disableAppearAnimation\",\n \"role\",\n \"closeOnEsc\",\n \"ref\",\n ]);\n\n // A signal, not a plain `let`: the dialog is built by a portal, so on a closed→open transition\n // the trap's effect runs before the ref below has assigned anything. A plain variable is not\n // tracked, so the trap bailed on the empty container and never armed itself again — Tab then\n // walked focus out of an open dialog. Writing a signal re-runs the trap once the node lands.\n const [contentEl, setContentEl] = createSignal<HTMLDivElement | undefined>();\n let overlayEl: HTMLDivElement | undefined;\n\n // Created before the transition and the trap: effects run in creation order, so the opener is read\n // before the trap's `autoFocus` moves the focus and before a child's `onMount` focuses itself.\n createEffect(\n on(\n () => local.open,\n (open) => {\n if (!open) return;\n // The element focused when the dialog opens gets focus back when it closes or unmounts while open,\n // unless the app has moved focus out of the dialog by then (see restoreFocus).\n const opener = contentEl()?.contains(document.activeElement) ? null : document.activeElement;\n onCleanup(() => restoreFocus(opener, contentEl()));\n }\n )\n );\n\n const transition = createCssTransition({\n in: () => local.open,\n timeout: { appear: 225, enter: 225, exit: 150 },\n classNames: OVERLAY_CLASSNAMES,\n appear: !local.disableAppearAnimation,\n });\n\n createFocusTrap({\n active: () => local.open && transition.mounted(),\n container: contentEl,\n restoreFocus: false,\n isTopmost: () => isTopModal(overlayEl),\n });\n\n createEffect(() => {\n if (!local.open || !local.closeOnEsc || !local.onClose) return;\n const onKeyDown = (event: KeyboardEvent): void => {\n // Only the topmost overlay layer reacts to Escape, and not to one handled inside\n // it, e.g. by a menu closing on it.\n if (event.key === \"Escape\" && !event.defaultPrevented && isTopOverlayLayer(overlayEl)) local.onClose?.();\n };\n document.addEventListener(\"keydown\", onKeyDown);\n onCleanup(() => document.removeEventListener(\"keydown\", onKeyDown));\n });\n\n // Always attached and checks the props itself. Solid binds event handlers\n // once, and the portal builds the overlay in a tracked scope, so choosing the\n // handler by these props there would rebuild the dialog, content included,\n // whenever one of them changes.\n const onOverlayClick = (): void => {\n if (local.closeOnOutsideClick) local.onClose?.();\n };\n\n return (\n <Show when={transition.mounted()}>\n <Portal mount={(isServer ? undefined : document.body) as Node}>\n <div\n ref={(el) => (overlayEl = el)}\n data-smwb-overlay-layer\n class={cn(\"smwb-modal__overlay\", `smwb-${local.backdrop}`, `smwb-${local.size}`, transition.classes())}\n onClick={onOverlayClick}\n >\n <Dynamic\n component={local.asForm ? \"form\" : \"div\"}\n {...rest}\n ref={mergeRefs(local.ref, (el) => setContentEl(el as HTMLDivElement))}\n class={cn(\"smwb-modal\", `smwb-${local.size}`, `smwb-${local.animation}`, local.class)}\n onClick={(event: MouseEvent) => event.stopPropagation()}\n tabindex={-1}\n role={local.role}\n aria-modal=\"true\"\n >\n {local.children}\n </Dynamic>\n </div>\n </Portal>\n </Show>\n );\n}\n\nexport interface ModalSlotProps {\n class?: string;\n}\n\nexport function Header(props: ParentProps<ModalSlotProps>): JSX.Element {\n return <div class={cn(\"smwb-modal__header\", props.class)}>{props.children}</div>;\n}\n\nexport function Content(props: ParentProps<ModalSlotProps>): JSX.Element {\n return <div class={cn(\"smwb-modal__content\", props.class)}>{props.children}</div>;\n}\n\nexport function Footer(props: ParentProps<ModalSlotProps>): JSX.Element {\n return <div class={cn(\"smwb-modal__footer\", props.class)}>{props.children}</div>;\n}\n\nexport const Modal = Object.assign(ModalBase, { Footer, Header, Content });\n\nexport default Modal;\n"],"names":["OVERLAY_CLASSNAMES","appear","appearActive","appearDone","enter","enterActive","enterDone","exit","exitActive","isTopModal","overlay","document","open","querySelectorAll","length","ModalBase","props","merged","mergeProps","animation","backdrop","size","closeOnOutsideClick","asForm","disableAppearAnimation","role","closeOnEsc","local","rest","splitProps","contentEl","setContentEl","createSignal","overlayEl","createEffect","on","opener","contains","activeElement","onCleanup","restoreFocus","transition","createCssTransition","in","timeout","classNames","createFocusTrap","active","mounted","container","isTopmost","onClose","onKeyDown","event","key","defaultPrevented","isTopOverlayLayer","addEventListener","removeEventListener","onOverlayClick","_$createComponent","Show","when","children","Portal","mount","isServer","undefined","body","_el$","_tmpl$","$$click","_$use","el","_$insert","Dynamic","_$mergeProps","component","ref","r$","_ref$","mergeRefs","cn","class","onClick","stopPropagation","tabindex","_$effect","_$className","classes","Header","_el$2","_tmpl$2","Content","_el$3","Footer","_el$4","Modal","Object","assign","_$delegateEvents"],"mappings":"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"}
@@ -18,6 +18,18 @@ export interface ButtonProps extends JSX.HTMLAttributes<HTMLButtonElement | HTML
18
18
  color?: "primary" | "secondary" | "error" | "success" | "warning" | "info";
19
19
  /** When set, the component renders as an <a>. */
20
20
  href?: string;
21
+ /**
22
+ * Where a link (with `href`) opens. By default `"_blank"`: a new tab. `null` leaves the `target`
23
+ * attribute out, so the link opens in place, like an internal one; an empty string does the same, and
24
+ * any other string is used as is.
25
+ */
26
+ target?: string | null | undefined;
27
+ /**
28
+ * The `rel` of a link (with `href`). By default `"noreferrer"` for a link that opens another tab or
29
+ * window, and none for one that opens in place. Your own value replaces the default, so add `noreferrer` yourself
30
+ * if you still want it; an empty string drops the attribute.
31
+ */
32
+ rel?: string | undefined;
21
33
  disabled?: boolean;
22
34
  type?: "button" | "submit" | "reset";
23
35
  /** Stretch to the full width of the container. */
@@ -1,16 +1,17 @@
1
- import { createComponent as n, use as b, spread as g, mergeProps as l, insert as h, template as _, memo as w } from "solid-js/web";
1
+ import { createComponent as n, use as b, spread as h, mergeProps as l, insert as w, template as $, memo as v } from "solid-js/web";
2
2
  import '../../../assets/styles/less/components/button/button.entry.css';import '../../../assets/styles/less/tokens.entry.css';/* empty css */
3
3
  /* empty css */
4
- import { mergeProps as D, splitProps as z, children as T, Show as s } from "solid-js";
4
+ import { mergeProps as k, splitProps as D, children as z, Show as s } from "solid-js";
5
5
  import W from "clsx";
6
6
  import { mergeRefs as P } from "../../../primitives/mergeRefs.js";
7
- import { useButtonGroup as k } from "../buttonGroups/buttonGroupContext.js";
8
- import { callHandler as C } from "../../../primitives/callHandler.js";
9
- import { Ripple as B } from "../../base/ripple/ripple.js";
10
- import { Icon as x } from "../../base/icon/icon.js";
11
- var A = /* @__PURE__ */ _("<a>"), E = /* @__PURE__ */ _("<button>");
12
- function M($) {
13
- const t = k(), v = D({
7
+ import { useButtonGroup as C } from "../buttonGroups/buttonGroupContext.js";
8
+ import { callHandler as B } from "../../../primitives/callHandler.js";
9
+ import { resolveLinkRel as L, resolveLinkTarget as x } from "../../../utils/linkAttrs.js";
10
+ import { Ripple as A } from "../../base/ripple/ripple.js";
11
+ import { Icon as E } from "../../base/icon/icon.js";
12
+ var G = /* @__PURE__ */ $("<a>"), H = /* @__PURE__ */ $("<button>");
13
+ function U(_) {
14
+ const t = C(), R = k({
14
15
  get variant() {
15
16
  return t?.variant ?? "contained";
16
17
  },
@@ -20,12 +21,14 @@ function M($) {
20
21
  get colorTheme() {
21
22
  return t?.colorTheme ?? "primary";
22
23
  }
23
- }, $), [e, a] = z(v, [
24
+ }, _), [e, a] = D(R, [
24
25
  "label",
25
26
  "variant",
26
27
  "icon",
27
28
  "iconProps",
28
29
  "href",
30
+ "target",
31
+ "rel",
29
32
  "class",
30
33
  "disabled",
31
34
  "children",
@@ -39,32 +42,32 @@ function M($) {
39
42
  "color",
40
43
  "ref",
41
44
  "data-testid"
42
- ]), c = () => e.color ?? t?.color ?? e.colorTheme, i = () => e.disabled ?? t?.disabled, y = () => e.fullWidth ?? t?.fullWidth;
43
- let m;
44
- const p = () => W("smwb-button", `smwb-${e.variant}`, `smwb-${e.size}`, c() === "primary" ? "smwb-primary" : `smwb-button_color-${c()}`, t && "smwb-button-group__grouped", e.class, {
45
+ ]), c = () => x(e.target), m = () => e.color ?? t?.color ?? e.colorTheme, i = () => e.disabled ?? t?.disabled, y = () => e.fullWidth ?? t?.fullWidth;
46
+ let p;
47
+ const u = () => W("smwb-button", `smwb-${e.variant}`, `smwb-${e.size}`, m() === "primary" ? "smwb-primary" : `smwb-button_color-${m()}`, t && "smwb-button-group__grouped", e.class, {
45
48
  "smwb-disabled": i(),
46
49
  "smwb-full-width": y()
47
- }), u = (r) => {
48
- C(e.onPointerDown, r), i() || m?.onRipple(r);
49
- }, d = T(() => e.icon), R = () => {
50
- const r = d();
51
- return typeof r == "string" ? n(x, l(() => e.iconProps ?? {}, {
50
+ }), d = (r) => {
51
+ B(e.onPointerDown, r), i() || p?.onRipple(r);
52
+ }, f = z(() => e.icon), T = () => {
53
+ const r = f();
54
+ return typeof r == "string" ? n(E, l(() => e.iconProps ?? {}, {
52
55
  name: r
53
56
  })) : r;
54
- }, f = () => [n(s, {
57
+ }, g = () => [n(s, {
55
58
  get when() {
56
- return d();
59
+ return f();
57
60
  },
58
61
  get children() {
59
- return R();
62
+ return T();
60
63
  }
61
- }), w(() => w(() => !!e.label)() ? e.label : e.children), n(s, {
64
+ }), v(() => v(() => !!e.label)() ? e.label : e.children), n(s, {
62
65
  get when() {
63
66
  return !e.disableRipple;
64
67
  },
65
68
  get children() {
66
- return n(B, {
67
- actionRef: (r) => m = r,
69
+ return n(A, {
70
+ actionRef: (r) => p = r,
68
71
  get center() {
69
72
  return e.rippleCenter;
70
73
  }
@@ -77,43 +80,47 @@ function M($) {
77
80
  },
78
81
  get fallback() {
79
82
  return (() => {
80
- var r = E(), o = P(e.ref);
81
- return typeof o == "function" && b(o, r), g(r, l({
83
+ var r = H(), o = P(e.ref);
84
+ return typeof o == "function" && b(o, r), h(r, l({
82
85
  get "data-testid"() {
83
86
  return e["data-testid"] ?? "button";
84
87
  }
85
88
  }, a, {
86
89
  get class() {
87
- return p();
90
+ return u();
88
91
  },
89
- onPointerDown: u,
92
+ onPointerDown: d,
90
93
  get disabled() {
91
94
  return !!i();
92
95
  }
93
- }), !1, !0), h(r, f), r;
96
+ }), !1, !0), w(r, g), r;
94
97
  })();
95
98
  },
96
99
  get children() {
97
- var r = A(), o = P(e.ref);
98
- return typeof o == "function" && b(o, r), g(r, l({
100
+ var r = G(), o = P(e.ref);
101
+ return typeof o == "function" && b(o, r), h(r, l({
99
102
  get "data-testid"() {
100
103
  return e["data-testid"] ?? "button-link";
101
104
  }
102
105
  }, a, {
103
106
  get class() {
104
- return p();
107
+ return u();
105
108
  },
106
109
  get href() {
107
110
  return e.href;
108
111
  },
109
- target: "_blank",
110
- rel: "noreferrer",
111
- onPointerDown: u
112
- }), !1, !0), h(r, f), r;
112
+ get target() {
113
+ return c();
114
+ },
115
+ get rel() {
116
+ return L(e.rel, c());
117
+ },
118
+ onPointerDown: d
119
+ }), !1, !0), w(r, g), r;
113
120
  }
114
121
  });
115
122
  }
116
123
  export {
117
- M as Button
124
+ U as Button
118
125
  };
119
126
  //# sourceMappingURL=button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","sources":["../../../../src/components/inputs/button/button.tsx"],"sourcesContent":["import { type JSX, type ParentProps, Show, children, mergeProps, splitProps } from \"solid-js\";\nimport cn from \"clsx\";\nimport { Ripple, type RippleActionsRef } from \"../../base/ripple\";\nimport { Icon, type IconProps } from \"../../base/icon\";\nimport { mergeRefs, type Ref } from \"../../../primitives/mergeRefs\";\nimport { useButtonGroup } from \"../buttonGroups/buttonGroupContext\";\nimport { callHandler } from \"../../../primitives/callHandler\";\n\nexport interface ButtonProps extends JSX.HTMLAttributes<HTMLButtonElement | HTMLAnchorElement> {\n /** Button text. */\n label?: string;\n /** Visual style of the button. */\n variant?: \"contained\" | \"text\" | \"outlined\";\n /** Button size. */\n size?: \"small\" | \"medium\" | \"large\";\n /** Icon as an element (e.g. <Icon/>) or a string (icon name / url / base64). */\n icon?: JSX.Element | string;\n /** Props forwarded to the <Icon/> when `icon` is a string. */\n iconProps?: Omit<IconProps, \"name\">;\n /** @deprecated use `color`. Kept for backward compatibility. */\n colorTheme?: \"primary\";\n /** Semantic color, resolved through `--smwb-*Color*` tokens. */\n color?: \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n /** When set, the component renders as an <a>. */\n href?: string;\n disabled?: boolean;\n type?: \"button\" | \"submit\" | \"reset\";\n /** Stretch to the full width of the container. */\n fullWidth?: boolean;\n /** Center the ripple effect. */\n rippleCenter?: boolean;\n /** Disable the ripple effect. */\n disableRipple?: boolean;\n /** Test id of the root; `button`, or `button-link` for a link, unless given. */\n \"data-testid\"?: string | undefined;\n ref?: Ref<HTMLButtonElement | HTMLAnchorElement>;\n}\n\nexport function Button(props: ParentProps<ButtonProps>): JSX.Element {\n const group = useButtonGroup();\n const merged = mergeProps(\n {\n get variant(): NonNullable<ButtonProps[\"variant\"]> {\n return group?.variant ?? \"contained\";\n },\n get size(): NonNullable<ButtonProps[\"size\"]> {\n return group?.size ?? \"medium\";\n },\n get colorTheme(): NonNullable<ButtonProps[\"colorTheme\"]> {\n return group?.colorTheme ?? \"primary\";\n },\n },\n props\n );\n const [local, rest] = splitProps(merged, [\n \"label\",\n \"variant\",\n \"icon\",\n \"iconProps\",\n \"href\",\n \"class\",\n \"disabled\",\n \"children\",\n \"fullWidth\",\n \"rippleCenter\",\n \"disableRipple\",\n // The button sets this on its root too; its own handler calls the caller's first.\n \"onPointerDown\",\n \"size\",\n \"colorTheme\",\n \"color\",\n \"ref\",\n \"data-testid\",\n ]);\n\n const color = (): string => local.color ?? group?.color ?? local.colorTheme;\n const disabled = (): boolean | undefined => local.disabled ?? group?.disabled;\n const fullWidth = (): boolean | undefined => local.fullWidth ?? group?.fullWidth;\n let rippleActions: RippleActionsRef | undefined;\n\n const classes = (): string =>\n cn(\n \"smwb-button\",\n `smwb-${local.variant}`,\n `smwb-${local.size}`,\n color() === \"primary\" ? \"smwb-primary\" : `smwb-button_color-${color()}`,\n group && \"smwb-button-group__grouped\",\n local.class,\n {\n \"smwb-disabled\": disabled(),\n \"smwb-full-width\": fullWidth(),\n }\n );\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown: JSX.EventHandler<HTMLButtonElement | HTMLAnchorElement, PointerEvent> = (event) => {\n callHandler(local.onPointerDown, event);\n if (!disabled()) {\n rippleActions?.onRipple(event);\n }\n };\n\n // Read the icon once: markup passed as a prop is created anew on every read,\n // and during hydration the copy made for a <Show> test has no server DOM node.\n const icon = children(() => local.icon);\n const iconElement = (): JSX.Element => {\n const resolved = icon();\n return typeof resolved === \"string\" ? <Icon {...(local.iconProps ?? {})} name={resolved} /> : resolved;\n };\n\n const content = (): JSX.Element => (\n <>\n <Show when={icon()}>{iconElement()}</Show>\n {local.label ? local.label : local.children}\n <Show when={!local.disableRipple}>\n <Ripple actionRef={(actions) => (rippleActions = actions)} center={local.rippleCenter} />\n </Show>\n </>\n );\n\n return (\n <Show\n when={local.href}\n fallback={\n <button\n data-testid={local[\"data-testid\"] ?? \"button\"}\n {...rest}\n ref={mergeRefs(local.ref)}\n class={classes()}\n onPointerDown={onPointerDown}\n disabled={!!disabled()}\n >\n {content()}\n </button>\n }\n >\n <a\n data-testid={local[\"data-testid\"] ?? \"button-link\"}\n {...rest}\n ref={mergeRefs(local.ref)}\n class={classes()}\n href={local.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n onPointerDown={onPointerDown}\n >\n {content()}\n </a>\n </Show>\n );\n}\n\nexport default Button;\n"],"names":["Button","props","group","useButtonGroup","merged","mergeProps","variant","size","colorTheme","local","rest","splitProps","color","disabled","fullWidth","rippleActions","classes","cn","class","onPointerDown","event","callHandler","onRipple","icon","children","iconElement","resolved","_$createComponent","Icon","_$mergeProps","iconProps","name","content","Show","when","_$memo","label","disableRipple","Ripple","actionRef","actions","center","rippleCenter","href","fallback","_el$2","_tmpl$2","_ref$2","mergeRefs","ref","_$use","_$spread","_$insert","_el$","_tmpl$","_ref$"],"mappings":"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"}
1
+ {"version":3,"file":"button.js","sources":["../../../../src/components/inputs/button/button.tsx"],"sourcesContent":["import { type JSX, type ParentProps, Show, children, mergeProps, splitProps } from \"solid-js\";\nimport cn from \"clsx\";\nimport { Ripple, type RippleActionsRef } from \"../../base/ripple\";\nimport { Icon, type IconProps } from \"../../base/icon\";\nimport { mergeRefs, type Ref } from \"../../../primitives/mergeRefs\";\nimport { useButtonGroup } from \"../buttonGroups/buttonGroupContext\";\nimport { callHandler } from \"../../../primitives/callHandler\";\nimport { resolveLinkRel, resolveLinkTarget } from \"../../../utils/linkAttrs\";\n\nexport interface ButtonProps extends JSX.HTMLAttributes<HTMLButtonElement | HTMLAnchorElement> {\n /** Button text. */\n label?: string;\n /** Visual style of the button. */\n variant?: \"contained\" | \"text\" | \"outlined\";\n /** Button size. */\n size?: \"small\" | \"medium\" | \"large\";\n /** Icon as an element (e.g. <Icon/>) or a string (icon name / url / base64). */\n icon?: JSX.Element | string;\n /** Props forwarded to the <Icon/> when `icon` is a string. */\n iconProps?: Omit<IconProps, \"name\">;\n /** @deprecated use `color`. Kept for backward compatibility. */\n colorTheme?: \"primary\";\n /** Semantic color, resolved through `--smwb-*Color*` tokens. */\n color?: \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n /** When set, the component renders as an <a>. */\n href?: string;\n /**\n * Where a link (with `href`) opens. By default `\"_blank\"`: a new tab. `null` leaves the `target`\n * attribute out, so the link opens in place, like an internal one; an empty string does the same, and\n * any other string is used as is.\n */\n target?: string | null | undefined;\n /**\n * The `rel` of a link (with `href`). By default `\"noreferrer\"` for a link that opens another tab or\n * window, and none for one that opens in place. Your own value replaces the default, so add `noreferrer` yourself\n * if you still want it; an empty string drops the attribute.\n */\n rel?: string | undefined;\n disabled?: boolean;\n type?: \"button\" | \"submit\" | \"reset\";\n /** Stretch to the full width of the container. */\n fullWidth?: boolean;\n /** Center the ripple effect. */\n rippleCenter?: boolean;\n /** Disable the ripple effect. */\n disableRipple?: boolean;\n /** Test id of the root; `button`, or `button-link` for a link, unless given. */\n \"data-testid\"?: string | undefined;\n ref?: Ref<HTMLButtonElement | HTMLAnchorElement>;\n}\n\nexport function Button(props: ParentProps<ButtonProps>): JSX.Element {\n const group = useButtonGroup();\n const merged = mergeProps(\n {\n get variant(): NonNullable<ButtonProps[\"variant\"]> {\n return group?.variant ?? \"contained\";\n },\n get size(): NonNullable<ButtonProps[\"size\"]> {\n return group?.size ?? \"medium\";\n },\n get colorTheme(): NonNullable<ButtonProps[\"colorTheme\"]> {\n return group?.colorTheme ?? \"primary\";\n },\n },\n props\n );\n const [local, rest] = splitProps(merged, [\n \"label\",\n \"variant\",\n \"icon\",\n \"iconProps\",\n \"href\",\n \"target\",\n \"rel\",\n \"class\",\n \"disabled\",\n \"children\",\n \"fullWidth\",\n \"rippleCenter\",\n \"disableRipple\",\n // The button sets this on its root too; its own handler calls the caller's first.\n \"onPointerDown\",\n \"size\",\n \"colorTheme\",\n \"color\",\n \"ref\",\n \"data-testid\",\n ]);\n\n const linkTarget = (): string | undefined => resolveLinkTarget(local.target);\n const color = (): string => local.color ?? group?.color ?? local.colorTheme;\n const disabled = (): boolean | undefined => local.disabled ?? group?.disabled;\n const fullWidth = (): boolean | undefined => local.fullWidth ?? group?.fullWidth;\n let rippleActions: RippleActionsRef | undefined;\n\n const classes = (): string =>\n cn(\n \"smwb-button\",\n `smwb-${local.variant}`,\n `smwb-${local.size}`,\n color() === \"primary\" ? \"smwb-primary\" : `smwb-button_color-${color()}`,\n group && \"smwb-button-group__grouped\",\n local.class,\n {\n \"smwb-disabled\": disabled(),\n \"smwb-full-width\": fullWidth(),\n }\n );\n\n // Ripple on pointerdown so it fires for touch and pen, not just mouse.\n const onPointerDown: JSX.EventHandler<HTMLButtonElement | HTMLAnchorElement, PointerEvent> = (event) => {\n callHandler(local.onPointerDown, event);\n if (!disabled()) {\n rippleActions?.onRipple(event);\n }\n };\n\n // Read the icon once: markup passed as a prop is created anew on every read,\n // and during hydration the copy made for a <Show> test has no server DOM node.\n const icon = children(() => local.icon);\n const iconElement = (): JSX.Element => {\n const resolved = icon();\n return typeof resolved === \"string\" ? <Icon {...(local.iconProps ?? {})} name={resolved} /> : resolved;\n };\n\n const content = (): JSX.Element => (\n <>\n <Show when={icon()}>{iconElement()}</Show>\n {local.label ? local.label : local.children}\n <Show when={!local.disableRipple}>\n <Ripple actionRef={(actions) => (rippleActions = actions)} center={local.rippleCenter} />\n </Show>\n </>\n );\n\n return (\n <Show\n when={local.href}\n fallback={\n <button\n data-testid={local[\"data-testid\"] ?? \"button\"}\n {...rest}\n ref={mergeRefs(local.ref)}\n class={classes()}\n onPointerDown={onPointerDown}\n disabled={!!disabled()}\n >\n {content()}\n </button>\n }\n >\n <a\n data-testid={local[\"data-testid\"] ?? \"button-link\"}\n {...rest}\n ref={mergeRefs(local.ref)}\n class={classes()}\n href={local.href}\n target={linkTarget()}\n rel={resolveLinkRel(local.rel, linkTarget())}\n onPointerDown={onPointerDown}\n >\n {content()}\n </a>\n </Show>\n );\n}\n\nexport default Button;\n"],"names":["Button","props","group","useButtonGroup","merged","mergeProps","variant","size","colorTheme","local","rest","splitProps","linkTarget","resolveLinkTarget","target","color","disabled","fullWidth","rippleActions","classes","cn","class","onPointerDown","event","callHandler","onRipple","icon","children","iconElement","resolved","_$createComponent","Icon","_$mergeProps","iconProps","name","content","Show","when","_$memo","label","disableRipple","Ripple","actionRef","actions","center","rippleCenter","href","fallback","_el$2","_tmpl$2","_ref$2","mergeRefs","ref","_$use","_$spread","_$insert","_el$","_tmpl$","_ref$","rel","resolveLinkRel"],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ import { type JSX } from "solid-js";
2
+ import type { ComposerSendKey } from "./composerKeys";
3
+ /** Where the toolbar and the action sit: under the field (`stacked`) or in one row with it (`inline`). */
4
+ export type ComposerLayout = "stacked" | "inline";
5
+ export interface ComposerProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue" | "onKeyDown" | "onFocus" | "onBlur" | "children"> {
6
+ /**
7
+ * Controlled text. The composer is controlled while this is not `undefined` (checked reactively); a parent that
8
+ * ignores `onValueChange` keeps the field showing this value.
9
+ */
10
+ value?: string | undefined;
11
+ /** Initial text while uncontrolled. Defaults to an empty string. */
12
+ defaultValue?: string | undefined;
13
+ /** Called on every text change: typing, a newline, and the clear after a send. Called in both modes. */
14
+ onValueChange?: ((value: string) => void) | undefined;
15
+ /**
16
+ * Called with the trimmed text when the user sends it: the send key (see `sendKey`) or a click on the action
17
+ * button. Nothing is called while sending is not allowed: no `onSend`, an empty or whitespace-only text, `disabled`,
18
+ * `readOnly`, `busy`, or a text over `maxLength`. Async work is shown with `busy`; the return value is ignored.
19
+ */
20
+ onSend?: ((text: string) => void) | undefined;
21
+ /**
22
+ * Which Enter sends. `"modEnter"` (default): Ctrl/⌘+Enter sends and Enter inserts a newline. `"enter"`: Enter sends,
23
+ * Shift+Enter inserts a newline, Ctrl/⌘+Enter sends too. An Enter that commits an IME composition never sends.
24
+ */
25
+ sendKey?: ComposerSendKey | undefined;
26
+ /**
27
+ * Clear the text after `onSend`: the composer's own state while uncontrolled, `onValueChange("")` while controlled.
28
+ * Defaults to `true`.
29
+ */
30
+ clearOnSend?: boolean | undefined;
31
+ /**
32
+ * The agent is working: the action button turns into Stop and calls `onStop`, and the keys and the button do not
33
+ * send. The text stays editable. The composer never changes `busy` itself, the parent owns it.
34
+ */
35
+ busy?: boolean | undefined;
36
+ /**
37
+ * Called when Stop is pressed (click, Enter or Space on the button) while `busy` and not `disabled`. Without it the
38
+ * Stop button does nothing, so pass it whenever `busy` can be set.
39
+ */
40
+ onStop?: (() => void) | undefined;
41
+ /** Placeholder of the textarea. It is not a name for the field, set `aria-label` or `aria-labelledby` as well. */
42
+ placeholder?: string | undefined;
43
+ /**
44
+ * Hard limit on the text (the native `maxlength` of the textarea, counted in UTF-16 units, so an emoji is 2).
45
+ * Turns the counter on.
46
+ */
47
+ maxLength?: number | undefined;
48
+ /** Show the counter (`n / maxLength`, or `n` without `maxLength`). Defaults to `true` when `maxLength` is set. */
49
+ counter?: boolean | undefined;
50
+ /**
51
+ * Text for the polite status region that announces how many characters are left. It is spoken only near the limit
52
+ * (within the larger of 10 characters and 10% of `maxLength`) and when the text is over it, with a negative
53
+ * `remaining`. Defaults to "N characters left" / "N characters over the limit".
54
+ */
55
+ counterAnnouncement?: ((remaining: number, maxLength: number) => string) | undefined;
56
+ /** Height of the empty field in rows, and the `rows` of the textarea. Defaults to `1`. */
57
+ minRows?: number | undefined;
58
+ /** Rows the field grows to before it scrolls. Clamped to at least `minRows`. Defaults to `8`. */
59
+ maxRows?: number | undefined;
60
+ /**
61
+ * `"stacked"` (default): the field on top, a bar under it with the attach button, the toolbar, the counter and the
62
+ * action. `"inline"`: the attach button, the field, the counter and the action in one row, the toolbar (if any)
63
+ * in a row under it.
64
+ */
65
+ layout?: ComposerLayout | undefined;
66
+ /**
67
+ * Slot under the field for chips and selectors (agent, model, mode, …). Drawn in every state. It is a plain `div`,
68
+ * not `role="toolbar"`: the content brings its own keyboard handling and disabled state.
69
+ */
70
+ toolbar?: JSX.Element;
71
+ /**
72
+ * Slot above the field for the app's file chips. The composer keeps no file state: the app lists what `onAttach`
73
+ * gave it here.
74
+ */
75
+ attachments?: JSX.Element;
76
+ /**
77
+ * Turns on the attach button, the hidden file input and the drop target (the whole composer). Called with the files
78
+ * of a pick or a drop that are left after `accept`, `multiple` and `maxFiles`, never with an empty list. Only a drag
79
+ * of files is taken: dragged text or a link still goes into the field.
80
+ */
81
+ onAttach?: ((files: File[]) => void) | undefined;
82
+ /**
83
+ * Accepted file types, as a record of mime type to extensions or a raw `accept` string (`image/*`, `.pdf`, an exact
84
+ * mime type). It sets the picker's filter, and the files of a pick or a drop that do not match are left out.
85
+ */
86
+ accept?: Record<string, string[]> | string | undefined;
87
+ /** Allow several files per pick or drop. When `false` the picker takes one and a drop keeps the first. Defaults to `true`. */
88
+ multiple?: boolean | undefined;
89
+ /** Files beyond this number are dropped from a pick or a drop (counted after `accept`). */
90
+ maxFiles?: number | undefined;
91
+ /**
92
+ * Whether `onAttach` also makes the composer a drop target for files. Set `false` when a parent already takes drops
93
+ * (a chat panel): the attach button and the picker stay, and a drop on the composer bubbles to the parent untouched.
94
+ * Defaults to `true`.
95
+ */
96
+ dropTarget?: boolean | undefined;
97
+ /**
98
+ * Disables the textarea, the attach button, the action button and the drop target. Toolbar content is the app's to
99
+ * disable.
100
+ */
101
+ disabled?: boolean | undefined;
102
+ /** The textarea is `readonly`: sending is unavailable, Stop still works. */
103
+ readOnly?: boolean | undefined;
104
+ /** Focus the textarea on mount. */
105
+ autofocus?: boolean | undefined;
106
+ /** Name of the textarea. */
107
+ name?: string | undefined;
108
+ /** Id of the textarea (the root keeps no id). Generated when not given. */
109
+ id?: string | undefined;
110
+ /** Accessible name of the textarea. Set this or `aria-labelledby`: a placeholder is not a name. */
111
+ "aria-label"?: string | undefined;
112
+ /** Id(s) of the element(s) that name the textarea. */
113
+ "aria-labelledby"?: string | undefined;
114
+ /** Id(s) that describe the textarea. They come first, the counter's id is appended. */
115
+ "aria-describedby"?: string | undefined;
116
+ /** Key handler of the textarea. It runs before the composer's own; if it calls `preventDefault()`, the composer does nothing for that key. */
117
+ onKeyDown?: JSX.EventHandlerUnion<HTMLTextAreaElement, KeyboardEvent> | undefined;
118
+ /** Focus handler of the textarea. */
119
+ onFocus?: JSX.EventHandlerUnion<HTMLTextAreaElement, FocusEvent> | undefined;
120
+ /** Blur handler of the textarea. */
121
+ onBlur?: JSX.EventHandlerUnion<HTMLTextAreaElement, FocusEvent> | undefined;
122
+ /** Ref of the textarea (the root takes the component's own `ref`). */
123
+ inputRef?: ((el: HTMLTextAreaElement) => void) | undefined;
124
+ /** Accessible name of the action button while it sends. Defaults to "Send". */
125
+ sendLabel?: string | undefined;
126
+ /** Accessible name of the action button while `busy`. Defaults to "Stop". */
127
+ stopLabel?: string | undefined;
128
+ /** Accessible name of the attach button. Defaults to "Attach file". */
129
+ attachLabel?: string | undefined;
130
+ /**
131
+ * Class name(s) for the root `<div>`. `style`, `ref`, `data-*` attributes and every other HTML attribute or event
132
+ * handler go to the root too; the root's drag handlers run after yours.
133
+ */
134
+ class?: string | undefined;
135
+ /** Test id of the root `<div>`. Defaults to `composer`; the parts inside have their own (`composer-input`, `composer-action`, …). */
136
+ "data-testid"?: string | undefined;
137
+ }
138
+ /**
139
+ * A task input: a multi-line field that grows from `minRows` to `maxRows`, a `toolbar` slot under it for chip
140
+ * selectors, a send button that becomes Stop while `busy`, keyboard send (Ctrl/⌘+Enter by default), an optional
141
+ * attach button and drop target, and a character counter.
142
+ *
143
+ * ```tsx
144
+ * <Composer aria-label="Task for the agent" onSend={(text) => run(text)} busy={running()} onStop={cancel} />
145
+ * ```
146
+ */
147
+ export declare function Composer(props: ComposerProps): JSX.Element;
148
+ export default Composer;