@smwb/ui-react 2.7.0 → 2.9.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 (602) hide show
  1. package/AI_LESS_OVERRIDES.md +84 -21
  2. package/AI_THEMING.md +72 -28
  3. package/README.md +681 -0
  4. package/dist/assets/styles/less/components/appBar/appBar.entry.css +1 -1
  5. package/dist/assets/styles/less/components/avatar/avatar.entry.css +1 -1
  6. package/dist/assets/styles/less/components/button/button.entry.css +1 -1
  7. package/dist/assets/styles/less/components/card/card.entry.css +1 -1
  8. package/dist/assets/styles/less/components/checkbox/checkbox.entry.css +1 -1
  9. package/dist/assets/styles/less/components/chip/chip.entry.css +1 -1
  10. package/dist/assets/styles/less/components/commandPalette/commandPalette.entry.css +1 -0
  11. package/dist/assets/styles/less/components/composer/composer.entry.css +1 -0
  12. package/dist/assets/styles/less/components/dagView/dagView.entry.css +1 -0
  13. package/dist/assets/styles/less/components/diffStat/diffStat.entry.css +1 -0
  14. package/dist/assets/styles/less/components/kbd/kbd.entry.css +1 -0
  15. package/dist/assets/styles/less/components/list/list.entry.css +1 -1
  16. package/dist/assets/styles/less/components/menu/menu.entry.css +1 -1
  17. package/dist/assets/styles/less/components/personChip/personChip.entry.css +1 -1
  18. package/dist/assets/styles/less/components/qrCode/qrCode.entry.css +1 -0
  19. package/dist/assets/styles/less/components/radioButton/radioButton.entry.css +1 -1
  20. package/dist/assets/styles/less/components/rating/rating.entry.css +1 -1
  21. package/dist/assets/styles/less/components/selectField/selectField.entry.css +1 -1
  22. package/dist/assets/styles/less/components/sidebar/sidebar.entry.css +1 -1
  23. package/dist/assets/styles/less/components/statusDot/statusDot.entry.css +1 -0
  24. package/dist/assets/styles/less/components/swimlanes/swimlanes.entry.css +1 -0
  25. package/dist/assets/styles/less/components/tabGroups/tabGroups.entry.css +1 -0
  26. package/dist/assets/styles/less/components/table/table.entry.css +1 -1
  27. package/dist/assets/styles/less/components/tabs/tab/tab.entry.css +1 -1
  28. package/dist/assets/styles/less/components/tabs/tabPanel/tabPanel.entry.css +1 -0
  29. package/dist/assets/styles/less/components/tabs/tabs.entry.css +1 -1
  30. package/dist/assets/styles/less/components/textField/textField.entry.css +1 -1
  31. package/dist/assets/styles/less/components/thumbCard/thumbCard.entry.css +1 -1
  32. package/dist/assets/styles/less/components/toggle/toggle.entry.css +1 -1
  33. package/dist/assets/styles/less/components/treeView/treeView.entry.css +1 -1
  34. package/dist/assets/styles/less/components/typography/typography.entry.css +1 -1
  35. package/dist/assets/styles/less/connects/rt/table.entry.css +1 -1
  36. package/dist/assets/styles/less/tokens.entry.css +1 -1
  37. package/dist/components/base/icon/icon.d.ts +6 -2
  38. package/dist/components/base/icon/icon.js +49 -37
  39. package/dist/components/base/icon/icon.js.map +1 -1
  40. package/dist/components/base/ripple/ripple.d.ts +3 -0
  41. package/dist/components/base/ripple/ripple.js +38 -23
  42. package/dist/components/base/ripple/ripple.js.map +1 -1
  43. package/dist/components/dataDisplay/avatar/avatar.d.ts +4 -0
  44. package/dist/components/dataDisplay/avatar/avatar.js +50 -37
  45. package/dist/components/dataDisplay/avatar/avatar.js.map +1 -1
  46. package/dist/components/dataDisplay/badge/badge.js +37 -28
  47. package/dist/components/dataDisplay/badge/badge.js.map +1 -1
  48. package/dist/components/dataDisplay/card/card.d.ts +30 -2
  49. package/dist/components/dataDisplay/card/card.js +50 -23
  50. package/dist/components/dataDisplay/card/card.js.map +1 -1
  51. package/dist/components/dataDisplay/carousel/carousel.js +70 -70
  52. package/dist/components/dataDisplay/carousel/carousel.js.map +1 -1
  53. package/dist/components/dataDisplay/chart/chart.d.ts +2 -0
  54. package/dist/components/dataDisplay/chart/chart.js +66 -53
  55. package/dist/components/dataDisplay/chart/chart.js.map +1 -1
  56. package/dist/components/dataDisplay/chat/chat.d.ts +43 -1
  57. package/dist/components/dataDisplay/chat/chat.js +179 -150
  58. package/dist/components/dataDisplay/chat/chat.js.map +1 -1
  59. package/dist/components/dataDisplay/chat/chatComposer.d.ts +17 -0
  60. package/dist/components/dataDisplay/chat/chatComposer.js +31 -29
  61. package/dist/components/dataDisplay/chat/chatComposer.js.map +1 -1
  62. package/dist/components/dataDisplay/chat/chatIconButton.d.ts +1 -1
  63. package/dist/components/dataDisplay/chat/chatIconButton.js +30 -26
  64. package/dist/components/dataDisplay/chat/chatIconButton.js.map +1 -1
  65. package/dist/components/dataDisplay/chat/chatLayout.d.ts +3 -1
  66. package/dist/components/dataDisplay/chat/chatLayout.js +56 -55
  67. package/dist/components/dataDisplay/chat/chatLayout.js.map +1 -1
  68. package/dist/components/dataDisplay/chat/chatOverlayLayout.d.ts +3 -1
  69. package/dist/components/dataDisplay/chat/index.d.ts +1 -1
  70. package/dist/components/dataDisplay/chat/utils.d.ts +14 -0
  71. package/dist/components/dataDisplay/chat/utils.js.map +1 -1
  72. package/dist/components/dataDisplay/chip/chip.d.ts +31 -0
  73. package/dist/components/dataDisplay/chip/chip.js +110 -83
  74. package/dist/components/dataDisplay/chip/chip.js.map +1 -1
  75. package/dist/components/dataDisplay/chipGroup/chipGroup.js +34 -30
  76. package/dist/components/dataDisplay/chipGroup/chipGroup.js.map +1 -1
  77. package/dist/components/dataDisplay/dagView/dagLayout.d.ts +74 -0
  78. package/dist/components/dataDisplay/dagView/dagLayout.js +289 -0
  79. package/dist/components/dataDisplay/dagView/dagLayout.js.map +1 -0
  80. package/dist/components/dataDisplay/dagView/dagView.d.ts +157 -0
  81. package/dist/components/dataDisplay/dagView/dagView.js +543 -0
  82. package/dist/components/dataDisplay/dagView/dagView.js.map +1 -0
  83. package/dist/components/dataDisplay/dagView/index.d.ts +4 -0
  84. package/dist/components/dataDisplay/dagView/panZoom.d.ts +75 -0
  85. package/dist/components/dataDisplay/dagView/panZoom.js +171 -0
  86. package/dist/components/dataDisplay/dagView/panZoom.js.map +1 -0
  87. package/dist/components/dataDisplay/descriptionList/descriptionList.d.ts +11 -3
  88. package/dist/components/dataDisplay/descriptionList/descriptionList.js.map +1 -1
  89. package/dist/components/dataDisplay/diffStat/diffStat.d.ts +54 -0
  90. package/dist/components/dataDisplay/diffStat/diffStat.js +63 -0
  91. package/dist/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  92. package/dist/components/dataDisplay/diffStat/index.d.ts +2 -0
  93. package/dist/components/dataDisplay/expansionPanel/expansionPanel.js +143 -98
  94. package/dist/components/dataDisplay/expansionPanel/expansionPanel.js.map +1 -1
  95. package/dist/components/dataDisplay/kanban/kanban.d.ts +6 -0
  96. package/dist/components/dataDisplay/kanban/kanban.js +46 -35
  97. package/dist/components/dataDisplay/kanban/kanban.js.map +1 -1
  98. package/dist/components/dataDisplay/kbd/index.d.ts +4 -0
  99. package/dist/components/dataDisplay/kbd/kbd.d.ts +40 -0
  100. package/dist/components/dataDisplay/kbd/kbd.js +27 -0
  101. package/dist/components/dataDisplay/kbd/kbd.js.map +1 -0
  102. package/dist/components/dataDisplay/kbd/kbdKeys.d.ts +18 -0
  103. package/dist/components/dataDisplay/kbd/kbdKeys.js +72 -0
  104. package/dist/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  105. package/dist/components/dataDisplay/lazyImage/lazyImage.js +31 -30
  106. package/dist/components/dataDisplay/lazyImage/lazyImage.js.map +1 -1
  107. package/dist/components/dataDisplay/list/list.d.ts +2 -0
  108. package/dist/components/dataDisplay/list/list.js +15 -14
  109. package/dist/components/dataDisplay/list/list.js.map +1 -1
  110. package/dist/components/dataDisplay/list/listItem.d.ts +34 -0
  111. package/dist/components/dataDisplay/list/listItem.js +47 -24
  112. package/dist/components/dataDisplay/list/listItem.js.map +1 -1
  113. package/dist/components/dataDisplay/meter/meter.d.ts +2 -0
  114. package/dist/components/dataDisplay/meter/meter.js +24 -23
  115. package/dist/components/dataDisplay/meter/meter.js.map +1 -1
  116. package/dist/components/dataDisplay/personChip/personChip.d.ts +2 -0
  117. package/dist/components/dataDisplay/personChip/personChip.js +39 -27
  118. package/dist/components/dataDisplay/personChip/personChip.js.map +1 -1
  119. package/dist/components/dataDisplay/qrCode/index.d.ts +2 -0
  120. package/dist/components/dataDisplay/qrCode/qrCode.d.ts +28 -0
  121. package/dist/components/dataDisplay/qrCode/qrCode.js +78 -0
  122. package/dist/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  123. package/dist/components/dataDisplay/qrCode/qrCodePath.d.ts +7 -0
  124. package/dist/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  125. package/dist/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  126. package/dist/components/dataDisplay/stat/stat.d.ts +2 -0
  127. package/dist/components/dataDisplay/stat/stat.js +25 -13
  128. package/dist/components/dataDisplay/stat/stat.js.map +1 -1
  129. package/dist/components/dataDisplay/statusDot/index.d.ts +2 -0
  130. package/dist/components/dataDisplay/statusDot/statusDot.d.ts +35 -0
  131. package/dist/components/dataDisplay/statusDot/statusDot.js +30 -0
  132. package/dist/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  133. package/dist/components/dataDisplay/swimlanes/index.d.ts +2 -0
  134. package/dist/components/dataDisplay/swimlanes/swimlanes.d.ts +53 -0
  135. package/dist/components/dataDisplay/swimlanes/swimlanes.js +357 -0
  136. package/dist/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  137. package/dist/components/dataDisplay/table/table.d.ts +16 -1
  138. package/dist/components/dataDisplay/table/table.js +40 -36
  139. package/dist/components/dataDisplay/table/table.js.map +1 -1
  140. package/dist/components/dataDisplay/table/tableBody.js +10 -4
  141. package/dist/components/dataDisplay/table/tableBody.js.map +1 -1
  142. package/dist/components/dataDisplay/table/tableCell.d.ts +10 -2
  143. package/dist/components/dataDisplay/table/tableCell.js +20 -13
  144. package/dist/components/dataDisplay/table/tableCell.js.map +1 -1
  145. package/dist/components/dataDisplay/table/tableColumns.d.ts +83 -0
  146. package/dist/components/dataDisplay/table/tableColumns.js +112 -0
  147. package/dist/components/dataDisplay/table/tableColumns.js.map +1 -0
  148. package/dist/components/dataDisplay/table/tableHead.js +9 -3
  149. package/dist/components/dataDisplay/table/tableHead.js.map +1 -1
  150. package/dist/components/dataDisplay/table/tableHeadCell.d.ts +24 -3
  151. package/dist/components/dataDisplay/table/tableHeadCell.js +60 -65
  152. package/dist/components/dataDisplay/table/tableHeadCell.js.map +1 -1
  153. package/dist/components/dataDisplay/table/tableRow.d.ts +3 -1
  154. package/dist/components/dataDisplay/table/tableRow.js +28 -16
  155. package/dist/components/dataDisplay/table/tableRow.js.map +1 -1
  156. package/dist/components/dataDisplay/thumbCard/thumbCard.d.ts +44 -3
  157. package/dist/components/dataDisplay/thumbCard/thumbCard.js +79 -59
  158. package/dist/components/dataDisplay/thumbCard/thumbCard.js.map +1 -1
  159. package/dist/components/dataDisplay/treeView/treeView.d.ts +19 -1
  160. package/dist/components/dataDisplay/treeView/treeView.js +113 -91
  161. package/dist/components/dataDisplay/treeView/treeView.js.map +1 -1
  162. package/dist/components/feedBack/emptyState/emptyState.d.ts +2 -0
  163. package/dist/components/feedBack/emptyState/emptyState.js +22 -12
  164. package/dist/components/feedBack/emptyState/emptyState.js.map +1 -1
  165. package/dist/components/feedBack/message/message.d.ts +2 -0
  166. package/dist/components/feedBack/message/message.js +30 -19
  167. package/dist/components/feedBack/message/message.js.map +1 -1
  168. package/dist/components/feedBack/modal/modal.js +84 -63
  169. package/dist/components/feedBack/modal/modal.js.map +1 -1
  170. package/dist/components/feedBack/skeleton/skeleton.d.ts +10 -2
  171. package/dist/components/feedBack/skeleton/skeleton.js +37 -34
  172. package/dist/components/feedBack/skeleton/skeleton.js.map +1 -1
  173. package/dist/components/feedBack/snackbar/snackbar.js +104 -103
  174. package/dist/components/feedBack/snackbar/snackbar.js.map +1 -1
  175. package/dist/components/feedBack/tooltip/tooltip.d.ts +9 -1
  176. package/dist/components/feedBack/tooltip/tooltip.js +67 -47
  177. package/dist/components/feedBack/tooltip/tooltip.js.map +1 -1
  178. package/dist/components/inputs/button/button.d.ts +15 -1
  179. package/dist/components/inputs/button/button.js +73 -63
  180. package/dist/components/inputs/button/button.js.map +1 -1
  181. package/dist/components/inputs/buttonGroups/buttonGroup.d.ts +2 -0
  182. package/dist/components/inputs/buttonGroups/buttonGroup.js +40 -36
  183. package/dist/components/inputs/buttonGroups/buttonGroup.js.map +1 -1
  184. package/dist/components/inputs/checkbox/checkbox.d.ts +10 -0
  185. package/dist/components/inputs/checkbox/checkbox.js +84 -59
  186. package/dist/components/inputs/checkbox/checkbox.js.map +1 -1
  187. package/dist/components/inputs/composer/composer.d.ts +149 -0
  188. package/dist/components/inputs/composer/composer.js +219 -0
  189. package/dist/components/inputs/composer/composer.js.map +1 -0
  190. package/dist/components/inputs/composer/composerFiles.d.ts +26 -0
  191. package/dist/components/inputs/composer/composerFiles.js +19 -0
  192. package/dist/components/inputs/composer/composerFiles.js.map +1 -0
  193. package/dist/components/inputs/composer/composerKeys.d.ts +29 -0
  194. package/dist/components/inputs/composer/composerKeys.js +7 -0
  195. package/dist/components/inputs/composer/composerKeys.js.map +1 -0
  196. package/dist/components/inputs/composer/index.d.ts +3 -0
  197. package/dist/components/inputs/datePicker/datePicker.js +170 -164
  198. package/dist/components/inputs/datePicker/datePicker.js.map +1 -1
  199. package/dist/components/inputs/datePicker/datePickerDay.d.ts +1 -1
  200. package/dist/components/inputs/datePicker/datePickerDay.js +52 -44
  201. package/dist/components/inputs/datePicker/datePickerDay.js.map +1 -1
  202. package/dist/components/inputs/datePicker/datePickerIconButton.d.ts +1 -1
  203. package/dist/components/inputs/datePicker/datePickerIconButton.js +32 -28
  204. package/dist/components/inputs/datePicker/datePickerIconButton.js.map +1 -1
  205. package/dist/components/inputs/dateTimePicker/dateTimePicker.js +160 -154
  206. package/dist/components/inputs/dateTimePicker/dateTimePicker.js.map +1 -1
  207. package/dist/components/inputs/floatingButton/floatingButton.js +32 -30
  208. package/dist/components/inputs/floatingButton/floatingButton.js.map +1 -1
  209. package/dist/components/inputs/radioButton/radioButton.d.ts +9 -0
  210. package/dist/components/inputs/radioButton/radioButton.js +77 -58
  211. package/dist/components/inputs/radioButton/radioButton.js.map +1 -1
  212. package/dist/components/inputs/rating/rating.d.ts +8 -0
  213. package/dist/components/inputs/rating/rating.js +85 -70
  214. package/dist/components/inputs/rating/rating.js.map +1 -1
  215. package/dist/components/inputs/selectField/dropdownMenu.d.ts +20 -1
  216. package/dist/components/inputs/selectField/dropdownMenu.js +266 -113
  217. package/dist/components/inputs/selectField/dropdownMenu.js.map +1 -1
  218. package/dist/components/inputs/selectField/optionNavigation.d.ts +17 -0
  219. package/dist/components/inputs/selectField/optionNavigation.js +38 -0
  220. package/dist/components/inputs/selectField/optionNavigation.js.map +1 -0
  221. package/dist/components/inputs/selectField/selectField.d.ts +31 -1
  222. package/dist/components/inputs/selectField/selectField.js +358 -218
  223. package/dist/components/inputs/selectField/selectField.js.map +1 -1
  224. package/dist/components/inputs/slider/slider.d.ts +22 -1
  225. package/dist/components/inputs/slider/slider.js +330 -261
  226. package/dist/components/inputs/slider/slider.js.map +1 -1
  227. package/dist/components/inputs/textField/textField.d.ts +7 -0
  228. package/dist/components/inputs/textField/textField.js +118 -100
  229. package/dist/components/inputs/textField/textField.js.map +1 -1
  230. package/dist/components/inputs/textField/textFieldWrapper.d.ts +15 -1
  231. package/dist/components/inputs/textField/textFieldWrapper.js +45 -34
  232. package/dist/components/inputs/textField/textFieldWrapper.js.map +1 -1
  233. package/dist/components/inputs/timePicker/timePicker.js +91 -85
  234. package/dist/components/inputs/timePicker/timePicker.js.map +1 -1
  235. package/dist/components/inputs/toggle/toggle.d.ts +4 -0
  236. package/dist/components/inputs/toggle/toggle.js +80 -61
  237. package/dist/components/inputs/toggle/toggle.js.map +1 -1
  238. package/dist/components/inputs/valueSlider/valueSlider.d.ts +12 -0
  239. package/dist/components/inputs/valueSlider/valueSlider.js +23 -22
  240. package/dist/components/inputs/valueSlider/valueSlider.js.map +1 -1
  241. package/dist/components/layout/appLayout/appLayout.d.ts +2 -0
  242. package/dist/components/layout/appLayout/appLayout.js +25 -24
  243. package/dist/components/layout/appLayout/appLayout.js.map +1 -1
  244. package/dist/components/layout/divider/divider.d.ts +2 -0
  245. package/dist/components/layout/divider/divider.js +23 -22
  246. package/dist/components/layout/divider/divider.js.map +1 -1
  247. package/dist/components/layout/floatingWindow/floatingWindow.d.ts +2 -0
  248. package/dist/components/layout/floatingWindow/floatingWindow.js +145 -139
  249. package/dist/components/layout/floatingWindow/floatingWindow.js.map +1 -1
  250. package/dist/components/layout/grid/grid.d.ts +12 -1
  251. package/dist/components/layout/grid/grid.js +51 -36
  252. package/dist/components/layout/grid/grid.js.map +1 -1
  253. package/dist/components/layout/page/page.d.ts +2 -0
  254. package/dist/components/layout/page/page.js +16 -8
  255. package/dist/components/layout/page/page.js.map +1 -1
  256. package/dist/components/layout/pageHeader/pageHeader.d.ts +2 -0
  257. package/dist/components/layout/pageHeader/pageHeader.js +22 -13
  258. package/dist/components/layout/pageHeader/pageHeader.js.map +1 -1
  259. package/dist/components/layout/sectionHeader/sectionHeader.d.ts +2 -0
  260. package/dist/components/layout/sectionHeader/sectionHeader.js +37 -27
  261. package/dist/components/layout/sectionHeader/sectionHeader.js.map +1 -1
  262. package/dist/components/layout/sheet/sheet.d.ts +14 -0
  263. package/dist/components/layout/sheet/sheet.js +148 -132
  264. package/dist/components/layout/sheet/sheet.js.map +1 -1
  265. package/dist/components/layout/stack/stack.d.ts +2 -0
  266. package/dist/components/layout/stack/stack.js +29 -17
  267. package/dist/components/layout/stack/stack.js.map +1 -1
  268. package/dist/components/layout/tabGroups/index.d.ts +4 -0
  269. package/dist/components/layout/tabGroups/tabGroups.d.ts +94 -0
  270. package/dist/components/layout/tabGroups/tabGroups.js +783 -0
  271. package/dist/components/layout/tabGroups/tabGroups.js.map +1 -0
  272. package/dist/components/layout/tabGroups/tabGroupsFocus.d.ts +55 -0
  273. package/dist/components/layout/tabGroups/tabGroupsFocus.js +199 -0
  274. package/dist/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  275. package/dist/components/layout/tabGroups/tabGroupsLayout.d.ts +250 -0
  276. package/dist/components/layout/tabGroups/tabGroupsLayout.js +497 -0
  277. package/dist/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  278. package/dist/components/navigation/appBar/appBar.d.ts +24 -0
  279. package/dist/components/navigation/appBar/appBar.js +39 -33
  280. package/dist/components/navigation/appBar/appBar.js.map +1 -1
  281. package/dist/components/navigation/bottomBar/bottomBar.js +81 -77
  282. package/dist/components/navigation/bottomBar/bottomBar.js.map +1 -1
  283. package/dist/components/navigation/breadcrumbs/breadcrumbs.d.ts +2 -0
  284. package/dist/components/navigation/breadcrumbs/breadcrumbs.js +29 -27
  285. package/dist/components/navigation/breadcrumbs/breadcrumbs.js.map +1 -1
  286. package/dist/components/navigation/commandPalette/commandPalette.d.ts +111 -0
  287. package/dist/components/navigation/commandPalette/commandPalette.js +337 -0
  288. package/dist/components/navigation/commandPalette/commandPalette.js.map +1 -0
  289. package/dist/components/navigation/commandPalette/commandPaletteFilter.d.ts +11 -0
  290. package/dist/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  291. package/dist/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  292. package/dist/components/navigation/commandPalette/commandPaletteNavigation.d.ts +13 -0
  293. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  294. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  295. package/dist/components/navigation/commandPalette/commandPaletteTypes.d.ts +39 -0
  296. package/dist/components/navigation/commandPalette/index.d.ts +4 -0
  297. package/dist/components/navigation/menu/menu.d.ts +12 -0
  298. package/dist/components/navigation/menu/menu.js.map +1 -1
  299. package/dist/components/navigation/menu/menuContext.d.ts +2 -0
  300. package/dist/components/navigation/menu/menuContext.js.map +1 -1
  301. package/dist/components/navigation/menu/menuFloating.js +42 -30
  302. package/dist/components/navigation/menu/menuFloating.js.map +1 -1
  303. package/dist/components/navigation/menu/menuItem.d.ts +4 -0
  304. package/dist/components/navigation/menu/menuItem.js +60 -48
  305. package/dist/components/navigation/menu/menuItem.js.map +1 -1
  306. package/dist/components/navigation/menu/menuList.d.ts +5 -1
  307. package/dist/components/navigation/menu/menuList.js +30 -19
  308. package/dist/components/navigation/menu/menuList.js.map +1 -1
  309. package/dist/components/navigation/menu/menuSubmenu.js +53 -40
  310. package/dist/components/navigation/menu/menuSubmenu.js.map +1 -1
  311. package/dist/components/navigation/pagination/pagination.d.ts +2 -0
  312. package/dist/components/navigation/pagination/pagination.js +51 -49
  313. package/dist/components/navigation/pagination/pagination.js.map +1 -1
  314. package/dist/components/navigation/sidebar/sidebar.d.ts +10 -0
  315. package/dist/components/navigation/sidebar/sidebar.js +65 -62
  316. package/dist/components/navigation/sidebar/sidebar.js.map +1 -1
  317. package/dist/components/navigation/stepper/stepper.d.ts +2 -0
  318. package/dist/components/navigation/stepper/stepper.js +37 -28
  319. package/dist/components/navigation/stepper/stepper.js.map +1 -1
  320. package/dist/components/navigation/tabs/index.d.ts +3 -1
  321. package/dist/components/navigation/tabs/tab/tab.d.ts +88 -1
  322. package/dist/components/navigation/tabs/tab/tab.js +116 -35
  323. package/dist/components/navigation/tabs/tab/tab.js.map +1 -1
  324. package/dist/components/navigation/tabs/tabPanel/tabPanel.d.ts +19 -0
  325. package/dist/components/navigation/tabs/tabPanel/tabPanel.js +27 -0
  326. package/dist/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  327. package/dist/components/navigation/tabs/tabs.d.ts +80 -4
  328. package/dist/components/navigation/tabs/tabs.js +369 -148
  329. package/dist/components/navigation/tabs/tabs.js.map +1 -1
  330. package/dist/components/navigation/tabs/tabs.utils.d.ts +20 -0
  331. package/dist/components/navigation/tabs/tabs.utils.js +11 -0
  332. package/dist/components/navigation/tabs/tabs.utils.js.map +1 -0
  333. package/dist/components/navigation/tabs/tabsContext.d.ts +11 -0
  334. package/dist/components/navigation/tabs/tabsContext.js +6 -0
  335. package/dist/components/navigation/tabs/tabsContext.js.map +1 -0
  336. package/dist/connects/rt/table/headerCellRenderer.d.ts +4 -1
  337. package/dist/connects/rt/table/headerCellRenderer.js +45 -15
  338. package/dist/connects/rt/table/headerCellRenderer.js.map +1 -1
  339. package/dist/connects/rt/table/table.d.ts +15 -1
  340. package/dist/connects/rt/table/table.js +125 -131
  341. package/dist/connects/rt/table/table.js.map +1 -1
  342. package/dist/headless/components/base/icon/icon.js +49 -37
  343. package/dist/headless/components/base/icon/icon.js.map +1 -1
  344. package/dist/headless/components/base/ripple/ripple.js +42 -27
  345. package/dist/headless/components/base/ripple/ripple.js.map +1 -1
  346. package/dist/headless/components/dataDisplay/avatar/avatar.js +51 -38
  347. package/dist/headless/components/dataDisplay/avatar/avatar.js.map +1 -1
  348. package/dist/headless/components/dataDisplay/badge/badge.js +37 -28
  349. package/dist/headless/components/dataDisplay/badge/badge.js.map +1 -1
  350. package/dist/headless/components/dataDisplay/card/card.js +50 -23
  351. package/dist/headless/components/dataDisplay/card/card.js.map +1 -1
  352. package/dist/headless/components/dataDisplay/carousel/carousel.js +55 -55
  353. package/dist/headless/components/dataDisplay/carousel/carousel.js.map +1 -1
  354. package/dist/headless/components/dataDisplay/chat/chat.js +179 -150
  355. package/dist/headless/components/dataDisplay/chat/chat.js.map +1 -1
  356. package/dist/headless/components/dataDisplay/chat/chatComposer.js +31 -29
  357. package/dist/headless/components/dataDisplay/chat/chatComposer.js.map +1 -1
  358. package/dist/headless/components/dataDisplay/chat/chatIconButton.js +30 -26
  359. package/dist/headless/components/dataDisplay/chat/chatIconButton.js.map +1 -1
  360. package/dist/headless/components/dataDisplay/chat/chatLayout.js +56 -55
  361. package/dist/headless/components/dataDisplay/chat/chatLayout.js.map +1 -1
  362. package/dist/headless/components/dataDisplay/chat/utils.js.map +1 -1
  363. package/dist/headless/components/dataDisplay/chip/chip.js +108 -81
  364. package/dist/headless/components/dataDisplay/chip/chip.js.map +1 -1
  365. package/dist/headless/components/dataDisplay/chipGroup/chipGroup.js +35 -31
  366. package/dist/headless/components/dataDisplay/chipGroup/chipGroup.js.map +1 -1
  367. package/dist/headless/components/dataDisplay/dagView/dagLayout.js +289 -0
  368. package/dist/headless/components/dataDisplay/dagView/dagLayout.js.map +1 -0
  369. package/dist/headless/components/dataDisplay/dagView/dagView.js +541 -0
  370. package/dist/headless/components/dataDisplay/dagView/dagView.js.map +1 -0
  371. package/dist/headless/components/dataDisplay/dagView/panZoom.js +171 -0
  372. package/dist/headless/components/dataDisplay/dagView/panZoom.js.map +1 -0
  373. package/dist/headless/components/dataDisplay/descriptionList/descriptionList.js.map +1 -1
  374. package/dist/headless/components/dataDisplay/diffStat/diffStat.js +61 -0
  375. package/dist/headless/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  376. package/dist/headless/components/dataDisplay/expansionPanel/expansionPanel.js +143 -98
  377. package/dist/headless/components/dataDisplay/expansionPanel/expansionPanel.js.map +1 -1
  378. package/dist/headless/components/dataDisplay/kanban/kanban.js +45 -34
  379. package/dist/headless/components/dataDisplay/kanban/kanban.js.map +1 -1
  380. package/dist/headless/components/dataDisplay/kbd/kbd.js +25 -0
  381. package/dist/headless/components/dataDisplay/kbd/kbd.js.map +1 -0
  382. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js +72 -0
  383. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  384. package/dist/headless/components/dataDisplay/lazyImage/lazyImage.js +30 -29
  385. package/dist/headless/components/dataDisplay/lazyImage/lazyImage.js.map +1 -1
  386. package/dist/headless/components/dataDisplay/list/list.js +15 -14
  387. package/dist/headless/components/dataDisplay/list/list.js.map +1 -1
  388. package/dist/headless/components/dataDisplay/list/listItem.js +47 -24
  389. package/dist/headless/components/dataDisplay/list/listItem.js.map +1 -1
  390. package/dist/headless/components/dataDisplay/meter/meter.js +19 -18
  391. package/dist/headless/components/dataDisplay/meter/meter.js.map +1 -1
  392. package/dist/headless/components/dataDisplay/personChip/personChip.js +39 -27
  393. package/dist/headless/components/dataDisplay/personChip/personChip.js.map +1 -1
  394. package/dist/headless/components/dataDisplay/qrCode/qrCode.js +76 -0
  395. package/dist/headless/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  396. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  397. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  398. package/dist/headless/components/dataDisplay/stat/stat.js +27 -15
  399. package/dist/headless/components/dataDisplay/stat/stat.js.map +1 -1
  400. package/dist/headless/components/dataDisplay/statusDot/statusDot.js +28 -0
  401. package/dist/headless/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  402. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js +355 -0
  403. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  404. package/dist/headless/components/dataDisplay/table/table.js +40 -36
  405. package/dist/headless/components/dataDisplay/table/table.js.map +1 -1
  406. package/dist/headless/components/dataDisplay/table/tableBody.js +10 -4
  407. package/dist/headless/components/dataDisplay/table/tableBody.js.map +1 -1
  408. package/dist/headless/components/dataDisplay/table/tableCell.js +20 -13
  409. package/dist/headless/components/dataDisplay/table/tableCell.js.map +1 -1
  410. package/dist/headless/components/dataDisplay/table/tableColumns.js +112 -0
  411. package/dist/headless/components/dataDisplay/table/tableColumns.js.map +1 -0
  412. package/dist/headless/components/dataDisplay/table/tableHead.js +9 -3
  413. package/dist/headless/components/dataDisplay/table/tableHead.js.map +1 -1
  414. package/dist/headless/components/dataDisplay/table/tableHeadCell.js +60 -65
  415. package/dist/headless/components/dataDisplay/table/tableHeadCell.js.map +1 -1
  416. package/dist/headless/components/dataDisplay/table/tableRow.js +28 -16
  417. package/dist/headless/components/dataDisplay/table/tableRow.js.map +1 -1
  418. package/dist/headless/components/dataDisplay/thumbCard/thumbCard.js +78 -58
  419. package/dist/headless/components/dataDisplay/thumbCard/thumbCard.js.map +1 -1
  420. package/dist/headless/components/dataDisplay/treeView/treeView.js +113 -91
  421. package/dist/headless/components/dataDisplay/treeView/treeView.js.map +1 -1
  422. package/dist/headless/components/feedBack/emptyState/emptyState.js +21 -11
  423. package/dist/headless/components/feedBack/emptyState/emptyState.js.map +1 -1
  424. package/dist/headless/components/feedBack/message/message.js +31 -20
  425. package/dist/headless/components/feedBack/message/message.js.map +1 -1
  426. package/dist/headless/components/feedBack/modal/modal.js +84 -63
  427. package/dist/headless/components/feedBack/modal/modal.js.map +1 -1
  428. package/dist/headless/components/feedBack/skeleton/skeleton.js +38 -35
  429. package/dist/headless/components/feedBack/skeleton/skeleton.js.map +1 -1
  430. package/dist/headless/components/feedBack/snackbar/snackbar.js +108 -107
  431. package/dist/headless/components/feedBack/snackbar/snackbar.js.map +1 -1
  432. package/dist/headless/components/feedBack/tooltip/tooltip.js +67 -47
  433. package/dist/headless/components/feedBack/tooltip/tooltip.js.map +1 -1
  434. package/dist/headless/components/inputs/button/button.js +73 -63
  435. package/dist/headless/components/inputs/button/button.js.map +1 -1
  436. package/dist/headless/components/inputs/buttonGroups/buttonGroup.js +40 -36
  437. package/dist/headless/components/inputs/buttonGroups/buttonGroup.js.map +1 -1
  438. package/dist/headless/components/inputs/checkbox/checkbox.js +85 -60
  439. package/dist/headless/components/inputs/checkbox/checkbox.js.map +1 -1
  440. package/dist/headless/components/inputs/composer/composer.js +217 -0
  441. package/dist/headless/components/inputs/composer/composer.js.map +1 -0
  442. package/dist/headless/components/inputs/composer/composerFiles.js +19 -0
  443. package/dist/headless/components/inputs/composer/composerFiles.js.map +1 -0
  444. package/dist/headless/components/inputs/composer/composerKeys.js +7 -0
  445. package/dist/headless/components/inputs/composer/composerKeys.js.map +1 -0
  446. package/dist/headless/components/inputs/datePicker/datePicker.js +170 -164
  447. package/dist/headless/components/inputs/datePicker/datePicker.js.map +1 -1
  448. package/dist/headless/components/inputs/datePicker/datePickerDay.js +52 -44
  449. package/dist/headless/components/inputs/datePicker/datePickerDay.js.map +1 -1
  450. package/dist/headless/components/inputs/datePicker/datePickerIconButton.js +32 -28
  451. package/dist/headless/components/inputs/datePicker/datePickerIconButton.js.map +1 -1
  452. package/dist/headless/components/inputs/dateTimePicker/dateTimePicker.js +160 -154
  453. package/dist/headless/components/inputs/dateTimePicker/dateTimePicker.js.map +1 -1
  454. package/dist/headless/components/inputs/floatingButton/floatingButton.js +32 -30
  455. package/dist/headless/components/inputs/floatingButton/floatingButton.js.map +1 -1
  456. package/dist/headless/components/inputs/radioButton/radioButton.js +77 -58
  457. package/dist/headless/components/inputs/radioButton/radioButton.js.map +1 -1
  458. package/dist/headless/components/inputs/rating/rating.js +85 -70
  459. package/dist/headless/components/inputs/rating/rating.js.map +1 -1
  460. package/dist/headless/components/inputs/selectField/dropdownMenu.js +266 -113
  461. package/dist/headless/components/inputs/selectField/dropdownMenu.js.map +1 -1
  462. package/dist/headless/components/inputs/selectField/optionNavigation.js +38 -0
  463. package/dist/headless/components/inputs/selectField/optionNavigation.js.map +1 -0
  464. package/dist/headless/components/inputs/selectField/selectField.js +358 -218
  465. package/dist/headless/components/inputs/selectField/selectField.js.map +1 -1
  466. package/dist/headless/components/inputs/slider/slider.js +330 -261
  467. package/dist/headless/components/inputs/slider/slider.js.map +1 -1
  468. package/dist/headless/components/inputs/textField/textField.js +118 -100
  469. package/dist/headless/components/inputs/textField/textField.js.map +1 -1
  470. package/dist/headless/components/inputs/textField/textFieldWrapper.js +45 -34
  471. package/dist/headless/components/inputs/textField/textFieldWrapper.js.map +1 -1
  472. package/dist/headless/components/inputs/timePicker/timePicker.js +91 -85
  473. package/dist/headless/components/inputs/timePicker/timePicker.js.map +1 -1
  474. package/dist/headless/components/inputs/toggle/toggle.js +79 -60
  475. package/dist/headless/components/inputs/toggle/toggle.js.map +1 -1
  476. package/dist/headless/components/inputs/valueSlider/valueSlider.js +25 -24
  477. package/dist/headless/components/inputs/valueSlider/valueSlider.js.map +1 -1
  478. package/dist/headless/components/layout/appLayout/appLayout.js +27 -26
  479. package/dist/headless/components/layout/appLayout/appLayout.js.map +1 -1
  480. package/dist/headless/components/layout/divider/divider.js +18 -17
  481. package/dist/headless/components/layout/divider/divider.js.map +1 -1
  482. package/dist/headless/components/layout/floatingWindow/floatingWindow.js +145 -139
  483. package/dist/headless/components/layout/floatingWindow/floatingWindow.js.map +1 -1
  484. package/dist/headless/components/layout/grid/grid.js +48 -33
  485. package/dist/headless/components/layout/grid/grid.js.map +1 -1
  486. package/dist/headless/components/layout/page/page.js +15 -7
  487. package/dist/headless/components/layout/page/page.js.map +1 -1
  488. package/dist/headless/components/layout/pageHeader/pageHeader.js +20 -11
  489. package/dist/headless/components/layout/pageHeader/pageHeader.js.map +1 -1
  490. package/dist/headless/components/layout/sectionHeader/sectionHeader.js +36 -26
  491. package/dist/headless/components/layout/sectionHeader/sectionHeader.js.map +1 -1
  492. package/dist/headless/components/layout/sheet/sheet.js +156 -140
  493. package/dist/headless/components/layout/sheet/sheet.js.map +1 -1
  494. package/dist/headless/components/layout/stack/stack.js +29 -17
  495. package/dist/headless/components/layout/stack/stack.js.map +1 -1
  496. package/dist/headless/components/layout/tabGroups/tabGroups.js +781 -0
  497. package/dist/headless/components/layout/tabGroups/tabGroups.js.map +1 -0
  498. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js +199 -0
  499. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  500. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js +497 -0
  501. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  502. package/dist/headless/components/navigation/appBar/appBar.js +35 -29
  503. package/dist/headless/components/navigation/appBar/appBar.js.map +1 -1
  504. package/dist/headless/components/navigation/bottomBar/bottomBar.js +81 -77
  505. package/dist/headless/components/navigation/bottomBar/bottomBar.js.map +1 -1
  506. package/dist/headless/components/navigation/breadcrumbs/breadcrumbs.js +32 -30
  507. package/dist/headless/components/navigation/breadcrumbs/breadcrumbs.js.map +1 -1
  508. package/dist/headless/components/navigation/commandPalette/commandPalette.js +335 -0
  509. package/dist/headless/components/navigation/commandPalette/commandPalette.js.map +1 -0
  510. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  511. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  512. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  513. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  514. package/dist/headless/components/navigation/menu/menu.js.map +1 -1
  515. package/dist/headless/components/navigation/menu/menuContext.js.map +1 -1
  516. package/dist/headless/components/navigation/menu/menuFloating.js +42 -30
  517. package/dist/headless/components/navigation/menu/menuFloating.js.map +1 -1
  518. package/dist/headless/components/navigation/menu/menuItem.js +60 -48
  519. package/dist/headless/components/navigation/menu/menuItem.js.map +1 -1
  520. package/dist/headless/components/navigation/menu/menuList.js +30 -19
  521. package/dist/headless/components/navigation/menu/menuList.js.map +1 -1
  522. package/dist/headless/components/navigation/menu/menuSubmenu.js +53 -40
  523. package/dist/headless/components/navigation/menu/menuSubmenu.js.map +1 -1
  524. package/dist/headless/components/navigation/pagination/pagination.js +51 -49
  525. package/dist/headless/components/navigation/pagination/pagination.js.map +1 -1
  526. package/dist/headless/components/navigation/sidebar/sidebar.js +55 -52
  527. package/dist/headless/components/navigation/sidebar/sidebar.js.map +1 -1
  528. package/dist/headless/components/navigation/stepper/stepper.js +42 -33
  529. package/dist/headless/components/navigation/stepper/stepper.js.map +1 -1
  530. package/dist/headless/components/navigation/tabs/tab/tab.js +117 -36
  531. package/dist/headless/components/navigation/tabs/tab/tab.js.map +1 -1
  532. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js +25 -0
  533. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  534. package/dist/headless/components/navigation/tabs/tabs.js +362 -141
  535. package/dist/headless/components/navigation/tabs/tabs.js.map +1 -1
  536. package/dist/headless/components/navigation/tabs/tabs.utils.js +11 -0
  537. package/dist/headless/components/navigation/tabs/tabs.utils.js.map +1 -0
  538. package/dist/headless/components/navigation/tabs/tabsContext.js +6 -0
  539. package/dist/headless/components/navigation/tabs/tabsContext.js.map +1 -0
  540. package/dist/headless/hooks/useDismissOnEscape.js +16 -0
  541. package/dist/headless/hooks/useDismissOnEscape.js.map +1 -0
  542. package/dist/headless/hooks/useFocusTrap.js +24 -20
  543. package/dist/headless/hooks/useFocusTrap.js.map +1 -1
  544. package/dist/headless/hooks/useHelperText.js +13 -0
  545. package/dist/headless/hooks/useHelperText.js.map +1 -0
  546. package/dist/headless/hooks/useKeyboardShortcut.js +19 -0
  547. package/dist/headless/hooks/useKeyboardShortcut.js.map +1 -0
  548. package/dist/headless/index.js +360 -316
  549. package/dist/headless/index.js.map +1 -1
  550. package/dist/headless/utils/controlProps.js +14 -0
  551. package/dist/headless/utils/controlProps.js.map +1 -0
  552. package/dist/headless/utils/keyboardShortcut.js +49 -0
  553. package/dist/headless/utils/keyboardShortcut.js.map +1 -0
  554. package/dist/headless/utils/linkAttrs.js +13 -0
  555. package/dist/headless/utils/linkAttrs.js.map +1 -0
  556. package/dist/headless/utils/overlayLayer.js +14 -7
  557. package/dist/headless/utils/overlayLayer.js.map +1 -1
  558. package/dist/headless/utils/ownClick.js +40 -0
  559. package/dist/headless/utils/ownClick.js.map +1 -0
  560. package/dist/headless/utils/readOnlyToggle.js +14 -0
  561. package/dist/headless/utils/readOnlyToggle.js.map +1 -0
  562. package/dist/headless/utils/restoreFocus.js +10 -0
  563. package/dist/headless/utils/restoreFocus.js.map +1 -0
  564. package/dist/hooks/useDismissOnEscape.d.ts +11 -0
  565. package/dist/hooks/useDismissOnEscape.js +16 -0
  566. package/dist/hooks/useDismissOnEscape.js.map +1 -0
  567. package/dist/hooks/useFocusTrap.d.ts +8 -1
  568. package/dist/hooks/useFocusTrap.js +24 -20
  569. package/dist/hooks/useFocusTrap.js.map +1 -1
  570. package/dist/hooks/useHelperText.d.ts +21 -0
  571. package/dist/hooks/useHelperText.js +13 -0
  572. package/dist/hooks/useHelperText.js.map +1 -0
  573. package/dist/hooks/useKeyboardShortcut.d.ts +30 -0
  574. package/dist/hooks/useKeyboardShortcut.js +19 -0
  575. package/dist/hooks/useKeyboardShortcut.js.map +1 -0
  576. package/dist/index.cjs +3 -2
  577. package/dist/index.cjs.map +1 -1
  578. package/dist/index.d.ts +24 -3
  579. package/dist/index.js +360 -316
  580. package/dist/index.js.map +1 -1
  581. package/dist/utils/controlProps.d.ts +16 -0
  582. package/dist/utils/controlProps.js +14 -0
  583. package/dist/utils/controlProps.js.map +1 -0
  584. package/dist/utils/keyboardShortcut.d.ts +12 -0
  585. package/dist/utils/keyboardShortcut.js +49 -0
  586. package/dist/utils/keyboardShortcut.js.map +1 -0
  587. package/dist/utils/linkAttrs.d.ts +13 -0
  588. package/dist/utils/linkAttrs.js +13 -0
  589. package/dist/utils/linkAttrs.js.map +1 -0
  590. package/dist/utils/overlayLayer.d.ts +15 -3
  591. package/dist/utils/overlayLayer.js +14 -7
  592. package/dist/utils/overlayLayer.js.map +1 -1
  593. package/dist/utils/ownClick.d.ts +16 -0
  594. package/dist/utils/ownClick.js +40 -0
  595. package/dist/utils/ownClick.js.map +1 -0
  596. package/dist/utils/readOnlyToggle.d.ts +15 -0
  597. package/dist/utils/readOnlyToggle.js +14 -0
  598. package/dist/utils/readOnlyToggle.js.map +1 -0
  599. package/dist/utils/restoreFocus.d.ts +8 -0
  600. package/dist/utils/restoreFocus.js +10 -0
  601. package/dist/utils/restoreFocus.js.map +1 -0
  602. package/package.json +5 -3
@@ -0,0 +1,149 @@
1
+ import React from "react";
2
+ import type { DropzoneAccept } from "../../../hooks/useDropzone";
3
+ import type { ComposerSendKey } from "./composerKeys";
4
+ /** Where the toolbar and the action sit: under the field (`stacked`) or in one row with it (`inline`). */
5
+ export type ComposerLayout = "stacked" | "inline";
6
+ export interface ComposerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue" | "onKeyDown" | "onFocus" | "onBlur" | "children"> {
7
+ /**
8
+ * Controlled text. The composer is controlled while this is not `undefined` (checked on every render); a parent
9
+ * that ignores `onValueChange` keeps the field showing this value.
10
+ */
11
+ value?: string;
12
+ /** Initial text while uncontrolled. Defaults to an empty string. */
13
+ defaultValue?: string;
14
+ /** Called on every text change: typing, a newline, and the clear after a send. Called in both modes. */
15
+ onValueChange?: (value: string) => void;
16
+ /**
17
+ * Called with the trimmed text when the user sends it: the send key (see `sendKey`) or a click on the action
18
+ * button. Nothing is called while sending is not allowed: no `onSend`, an empty or whitespace-only text, `disabled`,
19
+ * `readOnly`, `busy`, or a text over `maxLength`. Async work is shown with `busy`; the return value is ignored.
20
+ */
21
+ onSend?: (text: string) => void;
22
+ /**
23
+ * Which Enter sends. `"modEnter"` (default): Ctrl/⌘+Enter sends and Enter inserts a newline. `"enter"`: Enter sends,
24
+ * Shift+Enter inserts a newline, Ctrl/⌘+Enter sends too. An Enter that commits an IME composition never sends.
25
+ */
26
+ sendKey?: ComposerSendKey;
27
+ /**
28
+ * Clear the text after `onSend`: the composer's own state while uncontrolled, `onValueChange("")` while controlled.
29
+ * Defaults to `true`.
30
+ */
31
+ clearOnSend?: boolean;
32
+ /**
33
+ * The agent is working: the action button turns into Stop and calls `onStop`, and the keys and the button do not
34
+ * send. The text stays editable. The composer never changes `busy` itself, the parent owns it.
35
+ */
36
+ busy?: boolean;
37
+ /**
38
+ * Called when Stop is pressed (click, Enter or Space on the button) while `busy` and not `disabled`. Without it the
39
+ * Stop button does nothing, so pass it whenever `busy` can be set.
40
+ */
41
+ onStop?: () => void;
42
+ /** Placeholder of the textarea. It is not a name for the field, set `aria-label` or `aria-labelledby` as well. */
43
+ placeholder?: string;
44
+ /**
45
+ * Hard limit on the text (the native `maxlength` of the textarea, counted in UTF-16 units, so an emoji is 2).
46
+ * Turns the counter on.
47
+ */
48
+ maxLength?: number;
49
+ /** Show the counter (`n / maxLength`, or `n` without `maxLength`). Defaults to `true` when `maxLength` is set. */
50
+ counter?: boolean;
51
+ /**
52
+ * Text for the polite status region that announces how many characters are left. It is spoken only near the limit
53
+ * (within the larger of 10 characters and 10% of `maxLength`) and when the text is over it, with a negative
54
+ * `remaining`. Defaults to "N characters left" / "N characters over the limit".
55
+ */
56
+ counterAnnouncement?: (remaining: number, maxLength: number) => string;
57
+ /** Height of the empty field in rows, and the `rows` of the textarea. Defaults to `1`. */
58
+ minRows?: number;
59
+ /** Rows the field grows to before it scrolls. Clamped to at least `minRows`. Defaults to `8`. */
60
+ maxRows?: number;
61
+ /**
62
+ * `"stacked"` (default): the field on top, a bar under it with the attach button, the toolbar, the counter and the
63
+ * action. `"inline"`: the attach button, the field, the counter and the action in one row, the toolbar (if any)
64
+ * in a row under it.
65
+ */
66
+ layout?: ComposerLayout;
67
+ /**
68
+ * Slot under the field for chips and selectors (agent, model, mode, …). Drawn in every state. It is a plain `div`,
69
+ * not `role="toolbar"`: the content brings its own keyboard handling and disabled state.
70
+ */
71
+ toolbar?: React.ReactNode;
72
+ /**
73
+ * Slot above the field for the app's file chips. The composer keeps no file state: the app lists what `onAttach`
74
+ * gave it here.
75
+ */
76
+ attachments?: React.ReactNode;
77
+ /**
78
+ * Turns on the attach button, the hidden file input and the drop target (the whole composer). Called with the files
79
+ * of a pick or a drop that are left after `accept`, `multiple` and `maxFiles`, never with an empty list. Only a drag
80
+ * of files is taken: dragged text or a link still goes into the field.
81
+ */
82
+ onAttach?: (files: File[]) => void;
83
+ /**
84
+ * Accepted file types, as a record of mime type to extensions or a raw `accept` string (`image/*`, `.pdf`, an exact
85
+ * mime type). It sets the picker's filter, and the files of a pick or a drop that do not match are left out.
86
+ */
87
+ accept?: DropzoneAccept;
88
+ /** Allow several files per pick or drop. When `false` the picker takes one and a drop keeps the first. Defaults to `true`. */
89
+ multiple?: boolean;
90
+ /** Files beyond this number are dropped from a pick or a drop (counted after `accept`). */
91
+ maxFiles?: number;
92
+ /**
93
+ * Whether `onAttach` also makes the composer a drop target for files. Set `false` when a parent already takes drops
94
+ * (a chat panel): the attach button and the picker stay, and a drop on the composer bubbles to the parent untouched.
95
+ * Defaults to `true`.
96
+ */
97
+ dropTarget?: boolean;
98
+ /**
99
+ * Disables the textarea, the attach button, the action button and the drop target. Toolbar content is the app's to
100
+ * disable.
101
+ */
102
+ disabled?: boolean;
103
+ /** The textarea is `readonly`: sending is unavailable, Stop still works. */
104
+ readOnly?: boolean;
105
+ /** Focus the textarea on mount. */
106
+ autoFocus?: boolean;
107
+ /** Name of the textarea. */
108
+ name?: string;
109
+ /** Id of the textarea (the root keeps no id). Generated when not given. */
110
+ id?: string;
111
+ /** Accessible name of the textarea. Set this or `aria-labelledby`: a placeholder is not a name. */
112
+ "aria-label"?: string;
113
+ /** Id(s) of the element(s) that name the textarea. */
114
+ "aria-labelledby"?: string;
115
+ /** Id(s) that describe the textarea. They come first, the counter's id is appended. */
116
+ "aria-describedby"?: string;
117
+ /** Key handler of the textarea. It runs before the composer's own; if it calls `preventDefault()`, the composer does nothing for that key. */
118
+ onKeyDown?: React.KeyboardEventHandler<HTMLTextAreaElement>;
119
+ /** Focus handler of the textarea. */
120
+ onFocus?: React.FocusEventHandler<HTMLTextAreaElement>;
121
+ /** Blur handler of the textarea. */
122
+ onBlur?: React.FocusEventHandler<HTMLTextAreaElement>;
123
+ /** Ref of the textarea (the root takes the component's own `ref`). */
124
+ inputRef?: React.Ref<HTMLTextAreaElement>;
125
+ /** Accessible name of the action button while it sends. Defaults to "Send". */
126
+ sendLabel?: string;
127
+ /** Accessible name of the action button while `busy`. Defaults to "Stop". */
128
+ stopLabel?: string;
129
+ /** Accessible name of the attach button. Defaults to "Attach file". */
130
+ attachLabel?: string;
131
+ /**
132
+ * Class name(s) for the root `<div>`. `style`, `ref`, `data-*` attributes and every other HTML attribute or event
133
+ * handler go to the root too; the root's drag handlers run after yours.
134
+ */
135
+ className?: string;
136
+ /** Test id of the root `<div>`. Defaults to `composer`; the parts inside have their own (`composer-input`, `composer-action`, …). */
137
+ "data-testid"?: string;
138
+ }
139
+ /**
140
+ * A task input: a multi-line field that grows from `minRows` to `maxRows`, a `toolbar` slot under it for chip
141
+ * selectors, a send button that becomes Stop while `busy`, keyboard send (Ctrl/⌘+Enter by default), an optional
142
+ * attach button and drop target, and a character counter.
143
+ *
144
+ * ```tsx
145
+ * <Composer aria-label="Task for the agent" onSend={(text) => run(text)} busy={running} onStop={cancel} />
146
+ * ```
147
+ */
148
+ export declare const Composer: React.ForwardRefExoticComponent<ComposerProps & React.RefAttributes<HTMLDivElement>>;
149
+ export default Composer;
@@ -0,0 +1,219 @@
1
+ import { jsxs as De, jsx as t } from "react/jsx-runtime";
2
+ import '../../../assets/styles/less/components/composer/composer.entry.css';import '../../../assets/styles/less/tokens.entry.css';/* empty css */
3
+ /* empty css */
4
+ import A, { useState as Ce } from "react";
5
+ import L from "clsx";
6
+ import { Icon as H } from "../../base/icon/icon.js";
7
+ import { useControllableState as xe } from "../../../hooks/useControllableState.js";
8
+ import { useDropzone as Ke } from "../../../hooks/useDropzone.js";
9
+ import { useId as Ne } from "../../../hooks/useId.js";
10
+ import { filterAttachedFiles as Le, isFileDrag as V } from "./composerFiles.js";
11
+ import { resolveComposerKeyAction as Ae } from "./composerKeys.js";
12
+ const ke = (o) => o >= 0 ? `${o} characters left` : `${-o} characters over the limit`;
13
+ function Te(o) {
14
+ o.preventDefault();
15
+ }
16
+ function b(o) {
17
+ return Array.isArray(o) ? o.some(b) : A.isValidElement(o) && o.type === A.Fragment ? b(o.props.children) : o != null && typeof o != "boolean" && o !== "";
18
+ }
19
+ const qe = A.forwardRef(function(q, G) {
20
+ const {
21
+ value: J,
22
+ defaultValue: f,
23
+ onValueChange: Q,
24
+ onSend: h,
25
+ sendKey: U = "modEnter",
26
+ clearOnSend: W = !0,
27
+ busy: r = !1,
28
+ onStop: y,
29
+ placeholder: X,
30
+ maxLength: a,
31
+ counter: g,
32
+ counterAnnouncement: Y = ke,
33
+ minRows: w = 1,
34
+ maxRows: Z = 8,
35
+ layout: ee = "stacked",
36
+ toolbar: k,
37
+ attachments: T,
38
+ onAttach: i,
39
+ accept: S,
40
+ multiple: F = !0,
41
+ maxFiles: oe,
42
+ dropTarget: te = !0,
43
+ disabled: n = !1,
44
+ readOnly: R = !1,
45
+ autoFocus: ae,
46
+ name: re,
47
+ id: se,
48
+ "aria-label": ne,
49
+ "aria-labelledby": ie,
50
+ "aria-describedby": ce,
51
+ onKeyDown: _,
52
+ onFocus: v,
53
+ onBlur: D,
54
+ inputRef: le,
55
+ sendLabel: me = "Send",
56
+ stopLabel: de = "Stop",
57
+ attachLabel: pe = "Attach file",
58
+ className: ue,
59
+ "data-testid": C,
60
+ onDragOver: c,
61
+ onDragLeave: l,
62
+ onDrop: m,
63
+ ...be
64
+ } = q, [s, $] = xe({
65
+ value: J,
66
+ defaultValue: f != null ? f : "",
67
+ onChange: Q
68
+ }), [fe, M] = Ce(!1), O = Ne(se, "smwb-composer"), z = `${O}-counter`, d = Ke({
69
+ accept: S,
70
+ multiple: F,
71
+ disabled: n,
72
+ // `maxFiles` is not passed on: the cut has to come after `accept`, see `filterAttachedFiles`.
73
+ onDrop: (e) => {
74
+ const N = Le(e, { accept: S, multiple: F, maxFiles: oe });
75
+ N.length > 0 && (i == null || i(N));
76
+ }
77
+ }), x = d.getRootProps(), B = d.getInputProps(), K = i !== void 0, I = K && te, p = g != null ? g : a !== void 0, u = a !== void 0 && s.length > a, P = !!h && s.trim() !== "" && !n && !R && !r && !u;
78
+ let j = "";
79
+ if (p && a !== void 0) {
80
+ const e = a - s.length;
81
+ e <= Math.max(10, Math.ceil(a * 0.1)) && (j = Y(e, a));
82
+ }
83
+ const E = () => {
84
+ !P || !h || (h(s.trim()), W && $(""));
85
+ }, he = (e) => {
86
+ _ == null || _(e), !(e.defaultPrevented || Ae(
87
+ {
88
+ key: e.key,
89
+ shiftKey: e.shiftKey,
90
+ ctrlKey: e.ctrlKey,
91
+ metaKey: e.metaKey,
92
+ altKey: e.altKey,
93
+ isComposing: e.nativeEvent.isComposing,
94
+ keyCode: e.keyCode
95
+ },
96
+ U
97
+ ) === "native") && (e.preventDefault(), E());
98
+ }, ye = (e) => {
99
+ if (!(e.detail > 1)) {
100
+ if (r) {
101
+ n || y == null || y();
102
+ return;
103
+ }
104
+ E();
105
+ }
106
+ }, ge = I ? { onDragOver: (e) => {
107
+ c == null || c(e), V(e.dataTransfer) && x.onDragOver(e);
108
+ }, onDragLeave: (e) => {
109
+ l == null || l(e), !(e.relatedTarget instanceof Node && e.currentTarget.contains(e.relatedTarget)) && x.onDragLeave();
110
+ }, onDrop: (e) => {
111
+ m == null || m(e), V(e.dataTransfer) && x.onDrop(e);
112
+ } } : { onDragOver: c, onDragLeave: l, onDrop: m }, we = I && d.isDragActive, _e = {
113
+ "--smwb-composer-min-rows": w,
114
+ "--smwb-composer-max-rows": Math.max(Z, w)
115
+ }, ve = [ce, p ? z : void 0].filter(Boolean).join(" ") || void 0;
116
+ return /* @__PURE__ */ De(
117
+ "div",
118
+ {
119
+ ...be,
120
+ ...ge,
121
+ ref: G,
122
+ className: L(
123
+ "smwb-composer",
124
+ `smwb-composer_${ee}`,
125
+ fe && "smwb-composer_focused",
126
+ r && "smwb-composer_busy",
127
+ n && "smwb-composer_disabled",
128
+ we && "smwb-composer_drag-active",
129
+ u && "smwb-composer_over-limit",
130
+ ue
131
+ ),
132
+ "data-testid": C != null ? C : "composer",
133
+ children: [
134
+ b(T) ? /* @__PURE__ */ t("div", { className: "smwb-composer__attachments", "data-testid": "composer-attachments", children: T }) : null,
135
+ /* @__PURE__ */ t("div", { className: "smwb-composer__field", "data-value": s, style: _e, children: /* @__PURE__ */ t(
136
+ "textarea",
137
+ {
138
+ ref: le,
139
+ className: "smwb-composer__input",
140
+ id: O,
141
+ name: re,
142
+ rows: w,
143
+ placeholder: X,
144
+ maxLength: a,
145
+ disabled: n,
146
+ readOnly: R,
147
+ autoFocus: ae,
148
+ "aria-label": ne,
149
+ "aria-labelledby": ie,
150
+ "aria-describedby": ve,
151
+ "aria-invalid": u || void 0,
152
+ value: s,
153
+ onChange: (e) => $(e.target.value),
154
+ onKeyDown: he,
155
+ onFocus: (e) => {
156
+ v == null || v(e), M(!0);
157
+ },
158
+ onBlur: (e) => {
159
+ D == null || D(e), M(!1);
160
+ },
161
+ "data-testid": "composer-input"
162
+ }
163
+ ) }),
164
+ K ? /* @__PURE__ */ t(
165
+ "button",
166
+ {
167
+ type: "button",
168
+ className: "smwb-composer__icon-button smwb-composer__attach",
169
+ "aria-label": pe,
170
+ disabled: n,
171
+ onClick: d.open,
172
+ "data-testid": "composer-attach",
173
+ children: /* @__PURE__ */ t(H, { name: "attach_file", size: 20 })
174
+ }
175
+ ) : null,
176
+ b(k) ? /* @__PURE__ */ t("div", { className: "smwb-composer__toolbar", "data-testid": "composer-toolbar", children: k }) : null,
177
+ p ? /* @__PURE__ */ t(
178
+ "span",
179
+ {
180
+ id: z,
181
+ className: L("smwb-composer__counter", u && "smwb-composer__counter_error"),
182
+ "data-testid": "composer-counter",
183
+ children: a !== void 0 ? `${s.length} / ${a}` : s.length
184
+ }
185
+ ) : null,
186
+ /* @__PURE__ */ t(
187
+ "button",
188
+ {
189
+ type: "button",
190
+ className: L("smwb-composer__icon-button", "smwb-composer__action", r && "smwb-composer__action_stop"),
191
+ "aria-label": r ? de : me,
192
+ "aria-disabled": !r && !P ? !0 : void 0,
193
+ disabled: n,
194
+ "data-action": r ? "stop" : "send",
195
+ onMouseDown: Te,
196
+ onClick: ye,
197
+ "data-testid": "composer-action",
198
+ children: /* @__PURE__ */ t(H, { name: r ? "stop" : "send", size: 20 })
199
+ }
200
+ ),
201
+ p ? /* @__PURE__ */ t("span", { className: "smwb-composer__status", role: "status", "data-testid": "composer-status", children: j }) : null,
202
+ K ? /* @__PURE__ */ t(
203
+ "input",
204
+ {
205
+ ...B,
206
+ onChange: (e) => {
207
+ B.onChange(e), e.currentTarget.value = "";
208
+ },
209
+ "data-testid": "composer-file-input"
210
+ }
211
+ ) : null
212
+ ]
213
+ }
214
+ );
215
+ });
216
+ export {
217
+ qe as Composer
218
+ };
219
+ //# sourceMappingURL=composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.js","sources":["../../../../src/components/inputs/composer/composer.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport cn from \"clsx\";\nimport Icon from \"../../base/icon/icon\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { useDropzone } from \"../../../hooks/useDropzone\";\nimport type { DropzoneAccept } from \"../../../hooks/useDropzone\";\nimport { useId } from \"../../../hooks/useId\";\nimport { filterAttachedFiles, isFileDrag } from \"./composerFiles\";\nimport { resolveComposerKeyAction } from \"./composerKeys\";\nimport type { ComposerSendKey } from \"./composerKeys\";\n\n/** Where the toolbar and the action sit: under the field (`stacked`) or in one row with it (`inline`). */\nexport type ComposerLayout = \"stacked\" | \"inline\";\n\nexport interface ComposerProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"defaultValue\" | \"onKeyDown\" | \"onFocus\" | \"onBlur\" | \"children\"\n> {\n /**\n * Controlled text. The composer is controlled while this is not `undefined` (checked on every render); a parent\n * that ignores `onValueChange` keeps the field showing this value.\n */\n value?: string;\n /** Initial text while uncontrolled. Defaults to an empty string. */\n defaultValue?: string;\n /** Called on every text change: typing, a newline, and the clear after a send. Called in both modes. */\n onValueChange?: (value: string) => void;\n /**\n * Called with the trimmed text when the user sends it: the send key (see `sendKey`) or a click on the action\n * button. Nothing is called while sending is not allowed: no `onSend`, an empty or whitespace-only text, `disabled`,\n * `readOnly`, `busy`, or a text over `maxLength`. Async work is shown with `busy`; the return value is ignored.\n */\n onSend?: (text: string) => void;\n /**\n * Which Enter sends. `\"modEnter\"` (default): Ctrl/⌘+Enter sends and Enter inserts a newline. `\"enter\"`: Enter sends,\n * Shift+Enter inserts a newline, Ctrl/⌘+Enter sends too. An Enter that commits an IME composition never sends.\n */\n sendKey?: ComposerSendKey;\n /**\n * Clear the text after `onSend`: the composer's own state while uncontrolled, `onValueChange(\"\")` while controlled.\n * Defaults to `true`.\n */\n clearOnSend?: boolean;\n /**\n * The agent is working: the action button turns into Stop and calls `onStop`, and the keys and the button do not\n * send. The text stays editable. The composer never changes `busy` itself, the parent owns it.\n */\n busy?: boolean;\n /**\n * Called when Stop is pressed (click, Enter or Space on the button) while `busy` and not `disabled`. Without it the\n * Stop button does nothing, so pass it whenever `busy` can be set.\n */\n onStop?: () => void;\n /** Placeholder of the textarea. It is not a name for the field, set `aria-label` or `aria-labelledby` as well. */\n placeholder?: string;\n /**\n * Hard limit on the text (the native `maxlength` of the textarea, counted in UTF-16 units, so an emoji is 2).\n * Turns the counter on.\n */\n maxLength?: number;\n /** Show the counter (`n / maxLength`, or `n` without `maxLength`). Defaults to `true` when `maxLength` is set. */\n counter?: boolean;\n /**\n * Text for the polite status region that announces how many characters are left. It is spoken only near the limit\n * (within the larger of 10 characters and 10% of `maxLength`) and when the text is over it, with a negative\n * `remaining`. Defaults to \"N characters left\" / \"N characters over the limit\".\n */\n counterAnnouncement?: (remaining: number, maxLength: number) => string;\n /** Height of the empty field in rows, and the `rows` of the textarea. Defaults to `1`. */\n minRows?: number;\n /** Rows the field grows to before it scrolls. Clamped to at least `minRows`. Defaults to `8`. */\n maxRows?: number;\n /**\n * `\"stacked\"` (default): the field on top, a bar under it with the attach button, the toolbar, the counter and the\n * action. `\"inline\"`: the attach button, the field, the counter and the action in one row, the toolbar (if any)\n * in a row under it.\n */\n layout?: ComposerLayout;\n /**\n * Slot under the field for chips and selectors (agent, model, mode, …). Drawn in every state. It is a plain `div`,\n * not `role=\"toolbar\"`: the content brings its own keyboard handling and disabled state.\n */\n toolbar?: React.ReactNode;\n /**\n * Slot above the field for the app's file chips. The composer keeps no file state: the app lists what `onAttach`\n * gave it here.\n */\n attachments?: React.ReactNode;\n /**\n * Turns on the attach button, the hidden file input and the drop target (the whole composer). Called with the files\n * of a pick or a drop that are left after `accept`, `multiple` and `maxFiles`, never with an empty list. Only a drag\n * of files is taken: dragged text or a link still goes into the field.\n */\n onAttach?: (files: File[]) => void;\n /**\n * Accepted file types, as a record of mime type to extensions or a raw `accept` string (`image/*`, `.pdf`, an exact\n * mime type). It sets the picker's filter, and the files of a pick or a drop that do not match are left out.\n */\n accept?: DropzoneAccept;\n /** Allow several files per pick or drop. When `false` the picker takes one and a drop keeps the first. Defaults to `true`. */\n multiple?: boolean;\n /** Files beyond this number are dropped from a pick or a drop (counted after `accept`). */\n maxFiles?: number;\n /**\n * Whether `onAttach` also makes the composer a drop target for files. Set `false` when a parent already takes drops\n * (a chat panel): the attach button and the picker stay, and a drop on the composer bubbles to the parent untouched.\n * Defaults to `true`.\n */\n dropTarget?: boolean;\n /**\n * Disables the textarea, the attach button, the action button and the drop target. Toolbar content is the app's to\n * disable.\n */\n disabled?: boolean;\n /** The textarea is `readonly`: sending is unavailable, Stop still works. */\n readOnly?: boolean;\n /** Focus the textarea on mount. */\n autoFocus?: boolean;\n /** Name of the textarea. */\n name?: string;\n /** Id of the textarea (the root keeps no id). Generated when not given. */\n id?: string;\n /** Accessible name of the textarea. Set this or `aria-labelledby`: a placeholder is not a name. */\n \"aria-label\"?: string;\n /** Id(s) of the element(s) that name the textarea. */\n \"aria-labelledby\"?: string;\n /** Id(s) that describe the textarea. They come first, the counter's id is appended. */\n \"aria-describedby\"?: string;\n /** Key handler of the textarea. It runs before the composer's own; if it calls `preventDefault()`, the composer does nothing for that key. */\n onKeyDown?: React.KeyboardEventHandler<HTMLTextAreaElement>;\n /** Focus handler of the textarea. */\n onFocus?: React.FocusEventHandler<HTMLTextAreaElement>;\n /** Blur handler of the textarea. */\n onBlur?: React.FocusEventHandler<HTMLTextAreaElement>;\n /** Ref of the textarea (the root takes the component's own `ref`). */\n inputRef?: React.Ref<HTMLTextAreaElement>;\n /** Accessible name of the action button while it sends. Defaults to \"Send\". */\n sendLabel?: string;\n /** Accessible name of the action button while `busy`. Defaults to \"Stop\". */\n stopLabel?: string;\n /** Accessible name of the attach button. Defaults to \"Attach file\". */\n attachLabel?: string;\n /**\n * Class name(s) for the root `<div>`. `style`, `ref`, `data-*` attributes and every other HTML attribute or event\n * handler go to the root too; the root's drag handlers run after yours.\n */\n className?: string;\n /** Test id of the root `<div>`. Defaults to `composer`; the parts inside have their own (`composer-input`, `composer-action`, …). */\n \"data-testid\"?: string;\n}\n\nconst defaultCounterAnnouncement = (remaining: number): string =>\n remaining >= 0 ? `${remaining} characters left` : `${-remaining} characters over the limit`;\n\nfunction stopMouseDown(event: React.MouseEvent<HTMLElement>): void {\n // Keeps the focus in the textarea when the action button is clicked with a mouse.\n event.preventDefault();\n}\n\n// Whether a slot draws anything: null, false, \"\" and empty arrays or fragments do not.\nfunction isDrawn(node: React.ReactNode): boolean {\n if (Array.isArray(node)) return node.some(isDrawn);\n if (React.isValidElement<{ children?: React.ReactNode }>(node) && node.type === React.Fragment) {\n return isDrawn(node.props.children);\n }\n return node != null && typeof node !== \"boolean\" && node !== \"\";\n}\n\n/**\n * A task input: a multi-line field that grows from `minRows` to `maxRows`, a `toolbar` slot under it for chip\n * selectors, a send button that becomes Stop while `busy`, keyboard send (Ctrl/⌘+Enter by default), an optional\n * attach button and drop target, and a character counter.\n *\n * ```tsx\n * <Composer aria-label=\"Task for the agent\" onSend={(text) => run(text)} busy={running} onStop={cancel} />\n * ```\n */\nexport const Composer = React.forwardRef<HTMLDivElement, ComposerProps>(function Composer(props, ref) {\n const {\n value,\n defaultValue,\n onValueChange,\n onSend,\n sendKey = \"modEnter\",\n clearOnSend = true,\n busy = false,\n onStop,\n placeholder,\n maxLength,\n counter,\n counterAnnouncement = defaultCounterAnnouncement,\n minRows = 1,\n maxRows = 8,\n layout = \"stacked\",\n toolbar,\n attachments,\n onAttach,\n accept,\n multiple = true,\n maxFiles,\n dropTarget = true,\n disabled = false,\n readOnly = false,\n autoFocus,\n name,\n id,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n onKeyDown,\n onFocus,\n onBlur,\n inputRef,\n sendLabel = \"Send\",\n stopLabel = \"Stop\",\n attachLabel = \"Attach file\",\n className,\n \"data-testid\": testId,\n onDragOver,\n onDragLeave,\n onDrop,\n ...rest\n } = props;\n\n const [text, setText] = useControllableState<string>({\n value,\n defaultValue: defaultValue ?? \"\",\n onChange: onValueChange,\n });\n const [focused, setFocused] = useState(false);\n const textareaId = useId(id, \"smwb-composer\");\n const counterId = `${textareaId}-counter`;\n\n const dropzone = useDropzone({\n accept,\n multiple,\n disabled,\n // `maxFiles` is not passed on: the cut has to come after `accept`, see `filterAttachedFiles`.\n onDrop: (files) => {\n const attached = filterAttachedFiles(files, { accept, multiple, maxFiles });\n if (attached.length > 0) onAttach?.(attached);\n },\n });\n const dropHandlers = dropzone.getRootProps();\n const inputProps = dropzone.getInputProps();\n\n const attachable = onAttach !== undefined;\n // `dropTarget={false}` keeps the attach button and the picker but hands drops to a parent that owns the target.\n const dropping = attachable && dropTarget;\n\n const showCounter = counter ?? maxLength !== undefined;\n const overLimit = maxLength !== undefined && text.length > maxLength;\n const canSend = !!onSend && text.trim() !== \"\" && !disabled && !readOnly && !busy && !overLimit;\n\n let status = \"\";\n if (showCounter && maxLength !== undefined) {\n const remaining = maxLength - text.length;\n if (remaining <= Math.max(10, Math.ceil(maxLength * 0.1))) status = counterAnnouncement(remaining, maxLength);\n }\n\n const send = () => {\n if (!canSend || !onSend) return;\n onSend(text.trim());\n if (clearOnSend) setText(\"\");\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n const action = resolveComposerKeyAction(\n {\n key: event.key,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n altKey: event.altKey,\n isComposing: event.nativeEvent.isComposing,\n keyCode: event.keyCode,\n },\n sendKey\n );\n if (action === \"native\") return;\n\n event.preventDefault();\n send();\n };\n\n const handleActionClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n // The second click of a double-click lands on the node the first one turned into the other action (Send into\n // Stop once the parent sets `busy`). It is not a new press: keyboard activation has `detail` 0, a click 1.\n if (event.detail > 1) return;\n if (busy) {\n if (!disabled) onStop?.();\n return;\n }\n send();\n };\n\n const rootDragOver = (event: React.DragEvent<HTMLDivElement>) => {\n onDragOver?.(event);\n // Only a drag of files is the dropzone's. Text or a link keeps its default: the textarea inserts it.\n if (isFileDrag(event.dataTransfer)) dropHandlers.onDragOver(event);\n };\n const rootDragLeave = (event: React.DragEvent<HTMLDivElement>) => {\n onDragLeave?.(event);\n // A leave onto a descendant is not a leave: it would flicker the drag-active state over the toolbar chips.\n if (event.relatedTarget instanceof Node && event.currentTarget.contains(event.relatedTarget)) return;\n dropHandlers.onDragLeave();\n };\n const rootDrop = (event: React.DragEvent<HTMLDivElement>) => {\n onDrop?.(event);\n if (isFileDrag(event.dataTransfer)) dropHandlers.onDrop(event);\n };\n const dragHandlers = dropping\n ? { onDragOver: rootDragOver, onDragLeave: rootDragLeave, onDrop: rootDrop }\n : { onDragOver, onDragLeave, onDrop };\n\n const dragActive = dropping && dropzone.isDragActive;\n const fieldStyle = {\n \"--smwb-composer-min-rows\": minRows,\n \"--smwb-composer-max-rows\": Math.max(maxRows, minRows),\n } as React.CSSProperties;\n const describedBy = [ariaDescribedBy, showCounter ? counterId : undefined].filter(Boolean).join(\" \") || undefined;\n\n return (\n <div\n {...rest}\n {...dragHandlers}\n ref={ref}\n className={cn(\n \"smwb-composer\",\n `smwb-composer_${layout}`,\n focused && \"smwb-composer_focused\",\n busy && \"smwb-composer_busy\",\n disabled && \"smwb-composer_disabled\",\n dragActive && \"smwb-composer_drag-active\",\n overLimit && \"smwb-composer_over-limit\",\n className\n )}\n data-testid={testId ?? \"composer\"}\n >\n {isDrawn(attachments) ? (\n <div className=\"smwb-composer__attachments\" data-testid=\"composer-attachments\">\n {attachments}\n </div>\n ) : null}\n <div className=\"smwb-composer__field\" data-value={text} style={fieldStyle}>\n <textarea\n ref={inputRef}\n className=\"smwb-composer__input\"\n id={textareaId}\n name={name}\n rows={minRows}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n readOnly={readOnly}\n autoFocus={autoFocus}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={describedBy}\n aria-invalid={overLimit || undefined}\n value={text}\n onChange={(event) => setText(event.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={(event) => {\n onFocus?.(event);\n setFocused(true);\n }}\n onBlur={(event) => {\n onBlur?.(event);\n setFocused(false);\n }}\n data-testid=\"composer-input\"\n />\n </div>\n {attachable ? (\n <button\n type=\"button\"\n className=\"smwb-composer__icon-button smwb-composer__attach\"\n aria-label={attachLabel}\n disabled={disabled}\n onClick={dropzone.open}\n data-testid=\"composer-attach\"\n >\n <Icon name=\"attach_file\" size={20} />\n </button>\n ) : null}\n {isDrawn(toolbar) ? (\n <div className=\"smwb-composer__toolbar\" data-testid=\"composer-toolbar\">\n {toolbar}\n </div>\n ) : null}\n {showCounter ? (\n <span\n id={counterId}\n className={cn(\"smwb-composer__counter\", overLimit && \"smwb-composer__counter_error\")}\n data-testid=\"composer-counter\"\n >\n {maxLength !== undefined ? `${text.length} / ${maxLength}` : text.length}\n </span>\n ) : null}\n <button\n type=\"button\"\n className={cn(\"smwb-composer__icon-button\", \"smwb-composer__action\", busy && \"smwb-composer__action_stop\")}\n aria-label={busy ? stopLabel : sendLabel}\n aria-disabled={!busy && !canSend ? true : undefined}\n disabled={disabled}\n data-action={busy ? \"stop\" : \"send\"}\n onMouseDown={stopMouseDown}\n onClick={handleActionClick}\n data-testid=\"composer-action\"\n >\n <Icon name={busy ? \"stop\" : \"send\"} size={20} />\n </button>\n {showCounter ? (\n <span className=\"smwb-composer__status\" role=\"status\" data-testid=\"composer-status\">\n {status}\n </span>\n ) : null}\n {attachable ? (\n <input\n {...inputProps}\n onChange={(event) => {\n inputProps.onChange(event);\n // Lets the same file be picked again.\n event.currentTarget.value = \"\";\n }}\n data-testid=\"composer-file-input\"\n />\n ) : null}\n </div>\n );\n});\n\nexport default Composer;\n"],"names":["defaultCounterAnnouncement","remaining","stopMouseDown","event","isDrawn","node","React","Composer","props","ref","value","defaultValue","onValueChange","onSend","sendKey","clearOnSend","busy","onStop","placeholder","maxLength","counter","counterAnnouncement","minRows","maxRows","layout","toolbar","attachments","onAttach","accept","multiple","maxFiles","dropTarget","disabled","readOnly","autoFocus","name","id","ariaLabel","ariaLabelledBy","ariaDescribedBy","onKeyDown","onFocus","onBlur","inputRef","sendLabel","stopLabel","attachLabel","className","testId","onDragOver","onDragLeave","onDrop","rest","text","setText","useControllableState","focused","setFocused","useState","textareaId","useId","counterId","dropzone","useDropzone","files","attached","filterAttachedFiles","dropHandlers","inputProps","attachable","dropping","showCounter","overLimit","canSend","status","send","handleKeyDown","resolveComposerKeyAction","handleActionClick","dragHandlers","isFileDrag","dragActive","fieldStyle","describedBy","jsxs","cn","jsx","Icon"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /** Accepted file types as `Composer` takes them: a record of mime type to extensions, or a raw `accept` string. */
2
+ export type ComposerAccept = Record<string, string[]> | string;
3
+ /** The part of a `DataTransfer` the drag guard reads. */
4
+ export interface ComposerDragData {
5
+ types?: ArrayLike<string> | null | undefined;
6
+ files?: ArrayLike<unknown> | null | undefined;
7
+ }
8
+ /** The options that decide which of the picked or dropped files `Composer` passes on. */
9
+ export interface ComposerFileOptions {
10
+ accept?: ComposerAccept | undefined;
11
+ multiple?: boolean | undefined;
12
+ maxFiles?: number | undefined;
13
+ }
14
+ /**
15
+ * Whether a drag carries files. A text or link drag does not and stays with the browser (the textarea inserts it).
16
+ * `dragover` exposes only `types`, and Firefox gives a `DOMStringList` there, hence `Array.from`; a `drop` has the
17
+ * file list as well.
18
+ */
19
+ export declare function isFileDrag(data: ComposerDragData | null | undefined): boolean;
20
+ /**
21
+ * The files of a pick or a drop that `Composer` passes to `onAttach`: those that match `accept` (a drop is not
22
+ * filtered by the browser, and the picker's "All files" choice lifts its filter), cut to one file when `multiple` is
23
+ * `false`, then to `maxFiles`. The cut comes last, so the files it drops are the ones past the limit, not the ones
24
+ * `accept` would have refused anyway.
25
+ */
26
+ export declare function filterAttachedFiles(files: File[], options: ComposerFileOptions): File[];
@@ -0,0 +1,19 @@
1
+ function f(t) {
2
+ var e, r, s;
3
+ return t ? Array.from((e = t.types) != null ? e : []).includes("Files") ? !0 : ((s = (r = t.files) == null ? void 0 : r.length) != null ? s : 0) > 0 : !1;
4
+ }
5
+ function u(t) {
6
+ return t ? (typeof t == "string" ? t.split(",") : Object.entries(t).flatMap(([r, s]) => [r, ...s])).map((r) => r.trim().toLowerCase()).filter(Boolean) : [];
7
+ }
8
+ function a(t, e) {
9
+ return e === "*/*" ? !0 : e.startsWith(".") ? t.name.toLowerCase().endsWith(e) : e.endsWith("/*") ? t.type.toLowerCase().startsWith(e.slice(0, -1)) : t.type.toLowerCase() === e;
10
+ }
11
+ function o(t, e) {
12
+ const r = u(e.accept), s = r.length === 0 ? t : t.filter((n) => r.some((l) => a(n, l))), i = e.multiple === !1 ? 1 : e.maxFiles && e.maxFiles > 0 ? e.maxFiles : void 0;
13
+ return i === void 0 ? s : s.slice(0, i);
14
+ }
15
+ export {
16
+ o as filterAttachedFiles,
17
+ f as isFileDrag
18
+ };
19
+ //# sourceMappingURL=composerFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composerFiles.js","sources":["../../../../src/components/inputs/composer/composerFiles.ts"],"sourcesContent":["/** Accepted file types as `Composer` takes them: a record of mime type to extensions, or a raw `accept` string. */\nexport type ComposerAccept = Record<string, string[]> | string;\n\n/** The part of a `DataTransfer` the drag guard reads. */\nexport interface ComposerDragData {\n types?: ArrayLike<string> | null | undefined;\n files?: ArrayLike<unknown> | null | undefined;\n}\n\n/** The options that decide which of the picked or dropped files `Composer` passes on. */\nexport interface ComposerFileOptions {\n accept?: ComposerAccept | undefined;\n multiple?: boolean | undefined;\n maxFiles?: number | undefined;\n}\n\n/**\n * Whether a drag carries files. A text or link drag does not and stays with the browser (the textarea inserts it).\n * `dragover` exposes only `types`, and Firefox gives a `DOMStringList` there, hence `Array.from`; a `drop` has the\n * file list as well.\n */\nexport function isFileDrag(data: ComposerDragData | null | undefined): boolean {\n if (!data) return false;\n if (Array.from(data.types ?? []).includes(\"Files\")) return true;\n return (data.files?.length ?? 0) > 0;\n}\n\nfunction acceptTokens(accept: ComposerAccept | undefined): string[] {\n if (!accept) return [];\n const tokens =\n typeof accept === \"string\" ? accept.split(\",\") : Object.entries(accept).flatMap(([mime, exts]) => [mime, ...exts]);\n return tokens.map((token) => token.trim().toLowerCase()).filter(Boolean);\n}\n\n// The same three forms as the `accept` attribute: `.ext`, `type/*` and an exact mime type.\nfunction matchesToken(file: File, token: string): boolean {\n if (token === \"*/*\") return true;\n if (token.startsWith(\".\")) return file.name.toLowerCase().endsWith(token);\n if (token.endsWith(\"/*\")) return file.type.toLowerCase().startsWith(token.slice(0, -1));\n return file.type.toLowerCase() === token;\n}\n\n/**\n * The files of a pick or a drop that `Composer` passes to `onAttach`: those that match `accept` (a drop is not\n * filtered by the browser, and the picker's \"All files\" choice lifts its filter), cut to one file when `multiple` is\n * `false`, then to `maxFiles`. The cut comes last, so the files it drops are the ones past the limit, not the ones\n * `accept` would have refused anyway.\n */\nexport function filterAttachedFiles(files: File[], options: ComposerFileOptions): File[] {\n const tokens = acceptTokens(options.accept);\n const accepted =\n tokens.length === 0 ? files : files.filter((file) => tokens.some((token) => matchesToken(file, token)));\n const limit =\n options.multiple === false ? 1 : options.maxFiles && options.maxFiles > 0 ? options.maxFiles : undefined;\n return limit === undefined ? accepted : accepted.slice(0, limit);\n}\n"],"names":["isFileDrag","data","_a","_b","_c","acceptTokens","accept","mime","exts","token","matchesToken","file","filterAttachedFiles","files","options","tokens","accepted","limit"],"mappings":"AAqBO,SAASA,EAAWC,GAAoD;AAAxE,MAAAC,GAAAC,GAAAC;AACL,SAAKH,IACD,MAAM,MAAKC,IAAAD,EAAK,UAAL,OAAAC,IAAc,CAAA,CAAE,EAAE,SAAS,OAAO,IAAU,OACnDE,KAAAD,IAAAF,EAAK,UAAL,gBAAAE,EAAY,WAAZ,OAAAC,IAAsB,KAAK,IAFjB;AAGpB;AAEA,SAASC,EAAaC,GAA8C;AAClE,SAAKA,KAEH,OAAOA,KAAW,WAAWA,EAAO,MAAM,GAAG,IAAI,OAAO,QAAQA,CAAM,EAAE,QAAQ,CAAC,CAACC,GAAMC,CAAI,MAAM,CAACD,GAAM,GAAGC,CAAI,CAAC,GACrG,IAAI,CAACC,MAAUA,EAAM,KAAA,EAAO,YAAA,CAAa,EAAE,OAAO,OAAO,IAHnD,CAAA;AAItB;AAGA,SAASC,EAAaC,GAAYF,GAAwB;AACxD,SAAIA,MAAU,QAAc,KACxBA,EAAM,WAAW,GAAG,IAAUE,EAAK,KAAK,YAAA,EAAc,SAASF,CAAK,IACpEA,EAAM,SAAS,IAAI,IAAUE,EAAK,KAAK,YAAA,EAAc,WAAWF,EAAM,MAAM,GAAG,EAAE,CAAC,IAC/EE,EAAK,KAAK,YAAA,MAAkBF;AACrC;AAQO,SAASG,EAAoBC,GAAeC,GAAsC;AACvF,QAAMC,IAASV,EAAaS,EAAQ,MAAM,GACpCE,IACJD,EAAO,WAAW,IAAIF,IAAQA,EAAM,OAAO,CAACF,MAASI,EAAO,KAAK,CAACN,MAAUC,EAAaC,GAAMF,CAAK,CAAC,CAAC,GAClGQ,IACJH,EAAQ,aAAa,KAAQ,IAAIA,EAAQ,YAAYA,EAAQ,WAAW,IAAIA,EAAQ,WAAW;AACjG,SAAOG,MAAU,SAAYD,IAAWA,EAAS,MAAM,GAAGC,CAAK;AACjE;"}
@@ -0,0 +1,29 @@
1
+ /** Which Enter sends in a `Composer`: `"modEnter"` is Ctrl/⌘+Enter, `"enter"` is a plain Enter. */
2
+ export type ComposerSendKey = "modEnter" | "enter";
3
+ /**
4
+ * What the composer does with a key press in its textarea:
5
+ * - `"send"`: prevent the default and send, if sending is allowed;
6
+ * - `"native"`: leave the key to the browser (a newline, IME commit, …).
7
+ */
8
+ export type ComposerKeyAction = "send" | "native";
9
+ /** The part of a keyboard event the key map reads. */
10
+ export interface ComposerKeyEvent {
11
+ key: string;
12
+ shiftKey: boolean;
13
+ ctrlKey: boolean;
14
+ metaKey: boolean;
15
+ altKey: boolean;
16
+ /** Set by Chromium and Firefox while an IME composition is open. */
17
+ isComposing?: boolean | undefined;
18
+ /** Safari reports the commit Enter of a composition as keyCode 229 with `isComposing` false. */
19
+ keyCode?: number | undefined;
20
+ }
21
+ /**
22
+ * The composer's keyboard map (Escape and every other key stay native).
23
+ *
24
+ * - IME composition: always native, so an Enter that commits a CJK candidate is not a send.
25
+ * - Ctrl/⌘+Enter (no Shift, no Alt): send in both modes.
26
+ * - Enter alone: send with `sendKey="enter"`, a native newline with `"modEnter"`.
27
+ * - Shift+Enter and every other combination: native.
28
+ */
29
+ export declare function resolveComposerKeyAction(event: ComposerKeyEvent, sendKey: ComposerSendKey): ComposerKeyAction;
@@ -0,0 +1,7 @@
1
+ function i(r, e) {
2
+ return r.isComposing || r.keyCode === 229 || r.key !== "Enter" || r.altKey || r.shiftKey ? "native" : r.ctrlKey || r.metaKey || e === "enter" ? "send" : "native";
3
+ }
4
+ export {
5
+ i as resolveComposerKeyAction
6
+ };
7
+ //# sourceMappingURL=composerKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composerKeys.js","sources":["../../../../src/components/inputs/composer/composerKeys.ts"],"sourcesContent":["/** Which Enter sends in a `Composer`: `\"modEnter\"` is Ctrl/⌘+Enter, `\"enter\"` is a plain Enter. */\nexport type ComposerSendKey = \"modEnter\" | \"enter\";\n\n/**\n * What the composer does with a key press in its textarea:\n * - `\"send\"`: prevent the default and send, if sending is allowed;\n * - `\"native\"`: leave the key to the browser (a newline, IME commit, …).\n */\nexport type ComposerKeyAction = \"send\" | \"native\";\n\n/** The part of a keyboard event the key map reads. */\nexport interface ComposerKeyEvent {\n key: string;\n shiftKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n altKey: boolean;\n /** Set by Chromium and Firefox while an IME composition is open. */\n isComposing?: boolean | undefined;\n /** Safari reports the commit Enter of a composition as keyCode 229 with `isComposing` false. */\n keyCode?: number | undefined;\n}\n\n/**\n * The composer's keyboard map (Escape and every other key stay native).\n *\n * - IME composition: always native, so an Enter that commits a CJK candidate is not a send.\n * - Ctrl/⌘+Enter (no Shift, no Alt): send in both modes.\n * - Enter alone: send with `sendKey=\"enter\"`, a native newline with `\"modEnter\"`.\n * - Shift+Enter and every other combination: native.\n */\nexport function resolveComposerKeyAction(event: ComposerKeyEvent, sendKey: ComposerSendKey): ComposerKeyAction {\n if (event.isComposing || event.keyCode === 229) return \"native\";\n if (event.key !== \"Enter\") return \"native\";\n if (event.altKey || event.shiftKey) return \"native\";\n\n if (event.ctrlKey || event.metaKey) return \"send\";\n return sendKey === \"enter\" ? \"send\" : \"native\";\n}\n"],"names":["resolveComposerKeyAction","event","sendKey"],"mappings":"AA+BO,SAASA,EAAyBC,GAAyBC,GAA6C;AAG7G,SAFID,EAAM,eAAeA,EAAM,YAAY,OACvCA,EAAM,QAAQ,WACdA,EAAM,UAAUA,EAAM,WAAiB,WAEvCA,EAAM,WAAWA,EAAM,WACpBC,MAAY,UADwB,SACL;AACxC;"}
@@ -0,0 +1,3 @@
1
+ export { Composer } from "./composer";
2
+ export type { ComposerProps, ComposerLayout } from "./composer";
3
+ export type { ComposerSendKey } from "./composerKeys";