@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 @@
1
+ {"version":3,"file":"dagView.js","sources":["../../../../src/components/dataDisplay/dagView/dagView.tsx"],"sourcesContent":["import React from \"react\";\nimport cn from \"clsx\";\nimport { useControllableState } from \"../../../hooks/useControllableState\";\nimport { useForkRef } from \"../../../hooks/useForkRef\";\nimport { useId } from \"../../../hooks/useId\";\nimport { useSafeLayoutEffect } from \"../../../hooks/useSafeLayoutEffect\";\nimport {\n type DagDirection,\n type DagLayoutEdge,\n type DagLayoutInput,\n type DagLayoutNode,\n type DagLayoutResult,\n dagEdgePath,\n dagLayout,\n} from \"./dagLayout\";\nimport { type Viewport, centerOn, createPanZoom, fitBounds, isVisible, viewportTransform, zoomAt } from \"./panZoom\";\n\n/** A node's status: a built-in one, coloured by the theme, or any word of the app's, styled by `[data-status]`. */\nexport type DagViewStatus =\n | \"idle\"\n | \"pending\"\n | \"running\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"skipped\"\n | (string & {});\n\nexport interface DagViewNode<T = unknown> {\n /** Unique among the nodes; edges name nodes by it. */\n id: string;\n /** What the default node shows, and its accessible name; the id unless given. */\n label?: React.ReactNode;\n /** Colours the node's accent from the theme. */\n status?: DagViewStatus | undefined;\n /** The node's accent colour, over its status colour: any CSS colour. */\n accent?: string | undefined;\n /** The node's width in pixels; `nodeWidth` unless given. */\n width?: number | undefined;\n /** The node's height in pixels; `nodeHeight` unless given. */\n height?: number | undefined;\n /** Anything of the app's, handed back to `renderNode` and `onNodeClick`. */\n data?: T;\n /** Shown, focusable, but not selectable. */\n disabled?: boolean | undefined;\n}\n\nexport interface DagViewEdge {\n /** `source->target` unless given. */\n id?: string | undefined;\n /** The id of the node the edge starts from: the one depended on. */\n source: string;\n /** The id of the node the edge points to: the one that depends on `source`. */\n target: string;\n}\n\n/** A node's state for `renderNode`: a snapshot of the render it is passed to. */\nexport interface DagViewNodeState {\n readonly selected: boolean;\n /** Next to the selected node: \"upstream\" feeds it, \"downstream\" depends on it. */\n readonly related: \"upstream\" | \"downstream\" | null;\n /** Set apart from the selected node and its neighbours, with `dimUnrelated`. */\n readonly dimmed: boolean;\n /** Has keyboard focus. */\n readonly focused: boolean;\n}\n\n/** Where the graph is: moved by x, y (pixels) and scaled by zoom. */\nexport type DagViewViewport = Viewport;\n\n/** Moves the view from outside; handed over by `apiRef` once the graph is in the page. */\nexport interface DagViewApi {\n /** Fits the whole graph in view. */\n fitView(): void;\n /** Zooms to `zoom` around the middle of the view. */\n zoomTo(zoom: number): void;\n /** Zooms by `factor` around the middle of the view. */\n zoomBy(factor: number): void;\n /** Moves the node with this id to the middle of the view. */\n centerNode(id: string): void;\n}\n\n/** Texts for assistive technology and the zoom buttons, English by default. */\nexport interface DagViewLabels {\n /** What the graph is called as a widget: \"dependency graph\". */\n roleDescription: string;\n /** \"Status\", before a node's status word. */\n status: string;\n /** \"Depends on\", before the names of the nodes a node's edges come from. */\n dependsOn: string;\n /** \"Required by\", before the names of the nodes a node's edges go to. */\n requiredBy: string;\n /** Status words, shown on the default nodes and read out: { running: \"Running\", … }. */\n statuses: Record<string, string>;\n zoomIn: string;\n zoomOut: string;\n fitView: string;\n /** The name of the group of zoom buttons. */\n controls: string;\n}\n\nexport interface DagViewProps<T = unknown> extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onClick\"> {\n /** What the graph shows: its accessible name. */\n label: string;\n /** The graph in words, for screen readers; it is there on the server too. */\n summary?: string | undefined;\n /** The nodes. A change of status, label or data alone does not lay the graph out again. */\n nodes: readonly DagViewNode<T>[];\n /** The edges, from the node depended on to the node that depends on it. */\n edges: readonly DagViewEdge[];\n /**\n * Draws a node's content inside its box; the default shows a status dot,\n * the label and the status word. `node` and `state` are a snapshot of the\n * render they are passed to. Keep the content non-interactive where you can:\n * a node is an ARIA option, whose content assistive technology may read as\n * plain text, and a click in it also selects the node. Links and buttons in\n * it are left out of the Tab order except in the node that is the graph's\n * Tab stop.\n */\n renderNode?: ((node: DagViewNode<T>, state: DagViewNodeState) => React.ReactNode) | undefined;\n /** Which way the layers run: \"LR\" (left to right, default) or \"TB\" (top to bottom). */\n direction?: DagDirection | undefined;\n /** A node's width in pixels, unless the node sets its own; 180 by default. */\n nodeWidth?: number | undefined;\n /** A node's height in pixels, unless the node sets its own; 56 by default. */\n nodeHeight?: number | undefined;\n /** The space between layers in pixels; 64 by default. */\n rankGap?: number | undefined;\n /** The space between nodes in a layer in pixels; 24 by default. */\n nodeGap?: number | undefined;\n /**\n * Lays the graph out in place of the built-in layout, e.g. with dagre or elk. It must be\n * synchronous. The layout re-runs when the graph's shape changes; swapping this function\n * alone does not.\n */\n layout?: ((input: DagLayoutInput) => DagLayoutResult) | undefined;\n /** The selected node's id (controlled); null selects nothing. */\n selectedId?: string | null | undefined;\n /** The node selected at first (uncontrolled). */\n defaultSelectedId?: string | null | undefined;\n /** A node was selected (its id) or the selection was cleared (null). */\n onSelectedChange?: ((id: string | null) => void) | undefined;\n /** A node was clicked, or chosen with Enter or Space. Not called for a disabled node. */\n onNodeClick?: ((node: DagViewNode<T>, event: React.MouseEvent | React.KeyboardEvent) => void) | undefined;\n /** Fades the nodes and edges that are not next to the selected node. */\n dimUnrelated?: boolean | undefined;\n /** Where the graph is (controlled). */\n viewport?: DagViewViewport | undefined;\n /** Where the graph is at first (uncontrolled); with `fit={false}` the page does not move after it loads. */\n defaultViewport?: DagViewViewport | undefined;\n /** The view moved or zoomed: at most once per frame during a gesture. */\n onViewportChange?: ((viewport: DagViewViewport) => void) | undefined;\n /** Fits the graph in view once it is in the page, and again when its nodes or edges change; true by default. */\n fit?: boolean | undefined;\n /** The smallest zoom; 0.1 by default. */\n minZoom?: number | undefined;\n /** The largest zoom; 2 by default. */\n maxZoom?: number | undefined;\n /** What a plain mouse wheel does: \"zoom\" (default), \"pan\", or \"none\" (the page scrolls). Ctrl+wheel and a trackpad pinch always zoom. */\n wheel?: \"zoom\" | \"pan\" | \"none\" | undefined;\n /** Shows the zoom in, zoom out and fit buttons; true by default. */\n controls?: boolean | undefined;\n /** Texts for assistive technology and the buttons, over the English defaults. */\n labels?: Partial<DagViewLabels> | undefined;\n /**\n * The graph's height: a number of pixels or any CSS length; 480 by default,\n * from the stylesheet, so a height in `style` works too. It fills the width.\n */\n height?: number | string | undefined;\n /** Gets the functions that move the view from outside. */\n apiRef?: ((api: DagViewApi) => void) | undefined;\n /** Test id of the root `<div>`; `dag-view` unless given. */\n \"data-testid\"?: string | undefined;\n}\n\n/** Room around the graph inside its world, in pixels. */\nconst PADDING = 24;\n\nconst DEFAULT_LABELS: DagViewLabels = {\n roleDescription: \"dependency graph\",\n status: \"Status\",\n dependsOn: \"Depends on\",\n requiredBy: \"Required by\",\n statuses: {\n idle: \"Idle\",\n pending: \"Pending\",\n running: \"Running\",\n success: \"Success\",\n warning: \"Warning\",\n error: \"Error\",\n skipped: \"Skipped\",\n },\n zoomIn: \"Zoom in\",\n zoomOut: \"Zoom out\",\n fitView: \"Fit to view\",\n controls: \"Zoom\",\n};\n\n/** What can take focus inside a node's own content. */\nconst INNER_FOCUSABLE =\n 'a[href], button, input, select, textarea, iframe, summary, audio[controls], video[controls], [tabindex], [contenteditable]:not([contenteditable=\"false\"])';\n\nconst cssLength = (value: number | string): string => (typeof value === \"number\" ? `${value}px` : value);\n\nconst sameList = (a: readonly string[], b: readonly string[]): boolean =>\n a.length === b.length && a.every((value, i) => value === b[i]);\n\n/** A node's name in words, for descriptions: its label when that is text, else its id. */\nconst nameOf = (node: DagViewNode<unknown> | undefined, id: string): string => {\n const label = node?.label;\n return typeof label === \"string\" || typeof label === \"number\" ? String(label) : id;\n};\n\n// Warns unconditionally, like the rest of ui-react (icon.tsx): a process.env\n// guard does not fold in the browser build, so it silenced only dev SSR.\nconst warn = (message: string): void => console.warn(`[smwb] DagView: ${message}`);\n\nconst DagViewInner = React.forwardRef<HTMLDivElement, DagViewProps>(function DagView(props, ref) {\n const {\n className,\n style,\n label,\n summary,\n nodes,\n edges,\n renderNode,\n direction = \"LR\",\n nodeWidth = 180,\n nodeHeight = 56,\n rankGap = 64,\n nodeGap = 24,\n layout: layoutProp,\n selectedId,\n defaultSelectedId,\n onSelectedChange,\n onNodeClick,\n dimUnrelated = false,\n viewport: viewportProp,\n defaultViewport,\n onViewportChange,\n fit = true,\n minZoom = 0.1,\n maxZoom = 2,\n wheel = \"zoom\",\n controls = true,\n labels: labelsProp,\n height,\n apiRef,\n \"data-testid\": dataTestId = \"dag-view\",\n ...rest\n } = props;\n\n const uid = useId();\n const arrowId = `${uid}-arrow`;\n const activeArrowId = `${uid}-arrow-active`;\n const summaryId = `${uid}-summary`;\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const elementsRef = React.useRef(new Map<string, HTMLElement>());\n\n const labels = React.useMemo<DagViewLabels>(\n () => ({\n ...DEFAULT_LABELS,\n ...labelsProp,\n statuses: { ...DEFAULT_LABELS.statuses, ...labelsProp?.statuses },\n }),\n [labelsProp]\n );\n const statusWord = (status: string): string => labels.statuses[status] ?? status;\n\n // ---- Nodes and layout ----\n\n const byId = React.useMemo(() => {\n const map = new Map<string, DagViewNode<unknown>>();\n for (const node of nodes) if (!map.has(node.id)) map.set(node.id, node);\n return map;\n }, [nodes]);\n // Nodes are drawn by id, so content stays mounted when the app replaces a\n // node object to change its status.\n const nextIds = React.useMemo(() => [...byId.keys()], [byId]);\n const idsRef = React.useRef(nextIds);\n if (!sameList(idsRef.current, nextIds)) idsRef.current = nextIds;\n const ids = idsRef.current;\n\n // The layout depends only on the graph's shape; a status change leaves it be.\n const structure = React.useMemo(() => {\n const layoutNodes = [...byId.values()].map((node) => ({\n id: node.id,\n width: node.width ?? nodeWidth,\n height: node.height ?? nodeHeight,\n }));\n const layoutEdges = edges.map((edge) => ({ id: edge.id, source: edge.source, target: edge.target }));\n const input: DagLayoutInput = {\n nodes: layoutNodes,\n edges: layoutEdges,\n direction,\n rankGap,\n nodeGap,\n warn,\n };\n const key = JSON.stringify([\n direction,\n rankGap,\n nodeGap,\n layoutNodes.map((n) => [n.id, n.width, n.height]),\n layoutEdges.map((e) => [e.id ?? null, e.source, e.target]),\n ]);\n return { key, input };\n }, [byId, edges, direction, nodeWidth, nodeHeight, rankGap, nodeGap]);\n const structureRef = React.useRef(structure);\n if (structureRef.current.key !== structure.key) structureRef.current = structure;\n const stableStructure = structureRef.current;\n // Latest props for the stable callbacks and effects; `layout` is read through\n // this ref too: an inline `layout` is a new function on every parent render,\n // and the layout must follow the graph's shape, not the function's identity.\n const latest = React.useRef({ fit, minZoom, maxZoom, wheel, apiRef, layout: layoutProp });\n latest.current = { fit, minZoom, maxZoom, wheel, apiRef, layout: layoutProp };\n const layout = React.useMemo(\n () => (latest.current.layout ?? dagLayout)(stableStructure.input),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [stableStructure]\n );\n\n // The flow of a layer runs along x in LR and along y in TB; across it is the other one.\n const across = (node: DagLayoutNode): number => (direction === \"TB\" ? node.x : node.y);\n\n const graph = React.useMemo(() => {\n const incoming = new Map<string, DagLayoutEdge[]>();\n const outgoing = new Map<string, DagLayoutEdge[]>();\n for (const edge of layout.edges) {\n if (!incoming.has(edge.target)) incoming.set(edge.target, []);\n if (!outgoing.has(edge.source)) outgoing.set(edge.source, []);\n incoming.get(edge.target)!.push(edge);\n outgoing.get(edge.source)!.push(edge);\n }\n const ordered = [...layout.nodes.values()].sort((a, b) => a.layer - b.layer || across(a) - across(b));\n const layers = new Map<number, DagLayoutNode[]>();\n for (const node of ordered) {\n if (!layers.has(node.layer)) layers.set(node.layer, []);\n layers.get(node.layer)!.push(node);\n }\n return { incoming, outgoing, ordered, layers };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [layout, direction]);\n\n // ---- Selection ----\n\n const [selected, setSelected] = useControllableState<string | null>({\n value: selectedId,\n defaultValue: defaultSelectedId ?? null,\n onChange: onSelectedChange,\n });\n\n const relations = React.useMemo(() => {\n const edgeMap = new Map<string, \"upstream\" | \"downstream\">();\n const nodeMap = new Map<string, \"upstream\" | \"downstream\">();\n if (selected === null || !layout.nodes.has(selected)) return { active: false, edges: edgeMap, nodes: nodeMap };\n const { incoming, outgoing } = graph;\n for (const edge of incoming.get(selected) ?? []) {\n edgeMap.set(edge.id, \"upstream\");\n nodeMap.set(edge.source, \"upstream\");\n }\n for (const edge of outgoing.get(selected) ?? []) {\n edgeMap.set(edge.id, \"downstream\");\n nodeMap.set(edge.target, \"downstream\");\n }\n return { active: true, edges: edgeMap, nodes: nodeMap };\n }, [selected, layout, graph]);\n\n // ---- Focus: one tab stop, on the last focused node, else the selected one, else the first ----\n\n const [active, setActive] = React.useState<string | null>(null);\n const [focused, setFocused] = React.useState<string | null>(null);\n const tabStop = React.useMemo(() => {\n if (active !== null && layout.nodes.has(active)) return active;\n if (selected !== null && layout.nodes.has(selected)) return selected;\n return graph.ordered[0]?.id ?? null;\n }, [layout, active, selected, graph]);\n\n // ---- Viewport ----\n\n const [viewport, setViewport] = useControllableState<Viewport>({\n value: viewportProp,\n defaultValue: defaultViewport ?? { x: 0, y: 0, zoom: 1 },\n onChange: onViewportChange,\n });\n const [interacting, setInteracting] = React.useState(false);\n const far = viewport.zoom < 0.45;\n\n // Current values for the stable callbacks (the api, the pan/zoom glue, the\n // effects), which read them instead of closing over one render.\n const viewportRef = React.useRef(viewport);\n viewportRef.current = viewport;\n const selectedRef = React.useRef(selected);\n selectedRef.current = selected;\n const focusedRef = React.useRef(focused);\n focusedRef.current = focused;\n const tabStopRef = React.useRef(tabStop);\n tabStopRef.current = tabStop;\n const setSelectedRef = React.useRef(setSelected);\n setSelectedRef.current = setSelected;\n const setViewportRef = React.useRef(setViewport);\n setViewportRef.current = setViewport;\n const layoutRef = React.useRef(layout);\n layoutRef.current = layout;\n const renderNodeRef = React.useRef(renderNode);\n renderNodeRef.current = renderNode;\n const fitPendingRef = React.useRef(false);\n\n const size = (): { width: number; height: number } => ({\n width: rootRef.current?.clientWidth ?? 0,\n height: rootRef.current?.clientHeight ?? 0,\n });\n const hasSize = (): boolean => {\n const { width, height } = size();\n return width > 0 && height > 0;\n };\n const worldSize = (): { width: number; height: number } => ({\n width: layoutRef.current.width + PADDING * 2,\n height: layoutRef.current.height + PADDING * 2,\n });\n const nodeRect = (id: string): { x: number; y: number; width: number; height: number } | undefined => {\n const box = layoutRef.current.nodes.get(id);\n return box && { x: box.x + PADDING, y: box.y + PADDING, width: box.width, height: box.height };\n };\n\n const apiRefBox = React.useRef<DagViewApi | null>(null);\n if (apiRefBox.current === null) {\n const self: DagViewApi = {\n fitView() {\n if (!hasSize()) return;\n const world = worldSize();\n setViewportRef.current(\n fitBounds(\n { x: 0, y: 0, ...world },\n size(),\n 0,\n latest.current.minZoom,\n Math.max(latest.current.minZoom, Math.min(1, latest.current.maxZoom))\n )\n );\n },\n zoomTo(zoom) {\n self.zoomBy(zoom / viewportRef.current.zoom);\n },\n zoomBy(factor) {\n const { width, height } = size();\n setViewportRef.current(\n zoomAt(\n viewportRef.current,\n { x: width / 2, y: height / 2 },\n factor,\n latest.current.minZoom,\n latest.current.maxZoom\n )\n );\n },\n centerNode(id) {\n const rect = nodeRect(id);\n if (!rect) return;\n setViewportRef.current(\n centerOn(viewportRef.current, { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 }, size())\n );\n },\n };\n apiRefBox.current = self;\n }\n const api = apiRefBox.current;\n\n const ensureVisible = (id: string): void => {\n const rect = nodeRect(id);\n if (rect && hasSize() && !isVisible(viewportRef.current, rect, size(), 8)) api.centerNode(id);\n };\n\n // Fit once the graph has a size, and again when its shape changes. At zero\n // size (a hidden tab) the fit waits for the first resize that gives one.\n const tryFit = (): void => {\n if (!fitPendingRef.current || !hasSize()) return;\n fitPendingRef.current = false;\n api.fitView();\n };\n\n useSafeLayoutEffect(() => {\n if (!latest.current.fit) return;\n fitPendingRef.current = true;\n tryFit();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [layout]);\n\n useSafeLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n const dispose = createPanZoom(root, {\n viewport: () => viewportRef.current,\n write: (next) => setViewportRef.current(next),\n minZoom: () => latest.current.minZoom,\n maxZoom: () => latest.current.maxZoom,\n wheel: () => latest.current.wheel,\n onInteracting: setInteracting,\n });\n let frame = 0;\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(tryFit);\n })\n : undefined;\n resizeObserver?.observe(root);\n latest.current.apiRef?.(api);\n return () => {\n dispose();\n resizeObserver?.disconnect();\n cancelAnimationFrame(frame);\n };\n // Set up once; later props are read through the refs.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ---- Interaction ----\n\n const choose = (id: string, event: React.MouseEvent | React.KeyboardEvent): void => {\n const node = byId.get(id);\n if (!node || node.disabled) return;\n setSelected(id);\n onNodeClick?.(node, event);\n };\n\n const focusNode = (id: string | undefined): void => {\n if (id === undefined) return;\n setActive(id);\n elementsRef.current.get(id)?.focus({ preventScroll: true });\n ensureVisible(id);\n };\n\n // A node that goes away takes its selection with it, and focus moves to the\n // Tab stop rather than dropping to the page. Only a node that was there\n // counts: a selection given before its node loads is kept.\n const previousIdsRef = React.useRef<readonly string[] | null>(null);\n useSafeLayoutEffect(() => {\n const before = previousIdsRef.current;\n previousIdsRef.current = ids;\n if (before === null || before === ids) return;\n const present = new Set(ids);\n const chosen = selectedRef.current;\n if (chosen !== null && !present.has(chosen) && before.includes(chosen)) setSelectedRef.current(null);\n const had = focusedRef.current;\n if (had === null || present.has(had)) return;\n setFocused(null);\n const doc = rootRef.current?.ownerDocument;\n const stop = tabStopRef.current;\n if (doc && (doc.activeElement === null || doc.activeElement === doc.body) && stop !== null)\n elementsRef.current.get(stop)?.focus({ preventScroll: true });\n // The ids identity changes only when the id list itself does.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ids]);\n\n // One Tab stop: focusables in `renderNode` content (a link, a button) are\n // taken out of the Tab order, except in the node that is the Tab stop. Their\n // own tabindex comes back when their node becomes it.\n const ownTabIndexRef = React.useRef(new WeakMap<Element, string | null>());\n const appliedTabIndexRef = React.useRef(new WeakMap<Element, string | null>());\n const syncInnerTabStops = React.useCallback((): void => {\n const stop = tabStopRef.current;\n const own = ownTabIndexRef.current;\n const applied = appliedTabIndexRef.current;\n for (const [id, el] of elementsRef.current) {\n for (const inner of el.querySelectorAll(INNER_FOCUSABLE)) {\n if (!own.has(inner)) own.set(inner, inner.getAttribute(\"tabindex\"));\n // A tabindex that differs from what the component last applied is the\n // caller's new own value: the sync effect can run at commit, before the\n // MutationObserver microtask sees the write, so adopt it here instead of\n // writing the stale cached value back over it.\n if (inner.getAttribute(\"tabindex\") !== (applied.get(inner) ?? null)) {\n own.set(inner, inner.getAttribute(\"tabindex\"));\n }\n const next = id === stop ? (own.get(inner) ?? null) : \"-1\";\n if (inner.getAttribute(\"tabindex\") === next) {\n applied.set(inner, next);\n continue;\n }\n if (next === null) inner.removeAttribute(\"tabindex\");\n else inner.setAttribute(\"tabindex\", next);\n applied.set(inner, next);\n }\n }\n }, []);\n\n // Keyed on the Tab stop only: an inline `renderNode` is a new function on\n // every render, and content changes between those are the observer's job.\n useSafeLayoutEffect(() => {\n if (!renderNodeRef.current) return;\n syncInnerTabStops();\n }, [tabStop, syncInnerTabStops]);\n\n // Content that changes later (a link that shows up with a status) is caught\n // too, and a tabindex the app rewrites from its own render becomes the\n // element's own value instead of being fought. Set up once, like the\n // pan/zoom effect: `renderNode` is read through the ref.\n useSafeLayoutEffect(() => {\n const root = rootRef.current;\n if (!root || typeof MutationObserver !== \"function\") return;\n const observer = new MutationObserver((mutations) => {\n if (!renderNodeRef.current) return;\n const own = ownTabIndexRef.current;\n const applied = appliedTabIndexRef.current;\n let sync = false;\n for (const mutation of mutations) {\n if (mutation.type !== \"attributes\") {\n // Added or moved content may carry focusables the sweep has not seen.\n sync = true;\n continue;\n }\n const el = mutation.target as Element;\n if (!applied.has(el)) continue;\n const now = el.getAttribute(\"tabindex\");\n // The component's own writes match what it applied; anything else is\n // the app's new own value for the element.\n if (now === (applied.get(el) ?? null)) continue;\n own.set(el, now);\n sync = true;\n }\n if (sync) syncInnerTabStops();\n });\n observer.observe(root, { childList: true, subtree: true, attributes: true, attributeFilter: [\"tabindex\"] });\n return () => observer.disconnect();\n }, [syncInnerTabStops]);\n\n /** The node an arrow key leads to from `id`: along the edges, or to a neighbour in the layer. */\n const neighbour = (id: string, key: string): string | undefined => {\n const tb = direction === \"TB\";\n const forward = tb ? \"ArrowDown\" : \"ArrowRight\";\n const back = tb ? \"ArrowUp\" : \"ArrowLeft\";\n const before = tb ? \"ArrowLeft\" : \"ArrowUp\";\n const after = tb ? \"ArrowRight\" : \"ArrowDown\";\n const first = (list: string[]): string | undefined =>\n list\n .map((other) => layout.nodes.get(other))\n .filter((node): node is DagLayoutNode => node !== undefined)\n .sort((a, b) => across(a) - across(b))[0]?.id;\n if (key === forward) return first((graph.outgoing.get(id) ?? []).map((e) => e.target));\n if (key === back) return first((graph.incoming.get(id) ?? []).map((e) => e.source));\n const self = layout.nodes.get(id);\n if (!self) return undefined;\n const layer = graph.layers.get(self.layer) ?? [];\n const index = layer.findIndex((node) => node.id === id);\n if (key === before) return layer[index - 1]?.id;\n if (key === after) return layer[index + 1]?.id;\n return undefined;\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n const target = event.target as HTMLElement;\n const id = target.dataset?.[\"dagId\"];\n // Keys pressed in a node's own content (a link, a field) are its own.\n if (id === undefined || !target.classList.contains(\"smwb-dag-view__node\")) return;\n // Ctrl, Cmd and Alt shortcuts are the browser's: page zoom, history, tabs.\n if (event.ctrlKey || event.metaKey || event.altKey) return;\n const key = event.key;\n if (key.startsWith(\"Arrow\") && event.shiftKey) {\n const step = 48;\n const dx = key === \"ArrowLeft\" ? step : key === \"ArrowRight\" ? -step : 0;\n const dy = key === \"ArrowUp\" ? step : key === \"ArrowDown\" ? -step : 0;\n setViewport({ x: viewport.x + dx, y: viewport.y + dy, zoom: viewport.zoom });\n event.preventDefault();\n return;\n }\n if (key.startsWith(\"Arrow\")) {\n event.preventDefault();\n focusNode(neighbour(id, key));\n return;\n }\n switch (key) {\n case \"Home\":\n event.preventDefault();\n focusNode(graph.ordered[0]?.id);\n return;\n case \"End\":\n event.preventDefault();\n focusNode(graph.ordered[graph.ordered.length - 1]?.id);\n return;\n case \"Enter\":\n case \" \":\n event.preventDefault();\n choose(id, event);\n return;\n case \"Escape\":\n // Handled only when there was a selection, so an enclosing dialog still gets it otherwise.\n if (selected === null) return;\n event.preventDefault();\n setSelected(null);\n return;\n case \"+\":\n case \"=\":\n event.preventDefault();\n api.zoomBy(1.25);\n return;\n case \"-\":\n case \"_\":\n event.preventDefault();\n api.zoomBy(0.8);\n return;\n case \"0\":\n event.preventDefault();\n api.fitView();\n return;\n }\n };\n\n const defaultRender = (node: DagViewNode<unknown>): React.ReactNode => (\n <>\n <span className=\"smwb-dag-view__dot\" aria-hidden=\"true\" />\n <span className=\"smwb-dag-view__label\">{node.label ?? node.id}</span>\n {node.status ? <span className=\"smwb-dag-view__status\">{statusWord(node.status)}</span> : null}\n </>\n );\n\n const description = (id: string): string => {\n const node = byId.get(id);\n const parts: string[] = [];\n if (node?.status) parts.push(`${labels.status}: ${statusWord(node.status)}.`);\n const names = (list: string[]): string => list.map((other) => nameOf(byId.get(other), other)).join(\", \");\n const from = (graph.incoming.get(id) ?? []).map((e) => e.source);\n const to = (graph.outgoing.get(id) ?? []).map((e) => e.target);\n if (from.length) parts.push(`${labels.dependsOn}: ${names(from)}.`);\n if (to.length) parts.push(`${labels.requiredBy}: ${names(to)}.`);\n return parts.join(\" \");\n };\n\n const renderNodeFor = (id: string, index: number): React.ReactNode => {\n const node = byId.get(id);\n const view: DagViewNode<unknown> = node ?? { id };\n const state: DagViewNodeState = {\n selected: selected === id,\n related: relations.nodes.get(id) ?? null,\n dimmed: Boolean(dimUnrelated) && relations.active && selected !== id && !relations.nodes.has(id),\n focused: focused === id,\n };\n const descriptionId = `${uid}-node-${index}`;\n const box = layout.nodes.get(id);\n const nodeStyle: React.CSSProperties = box\n ? {\n left: `${box.x + PADDING}px`,\n top: `${box.y + PADDING}px`,\n width: `${box.width}px`,\n height: `${box.height}px`,\n }\n : { display: \"none\" };\n const accent = node?.accent;\n if (accent) (nodeStyle as Record<string, string>)[\"--smwb-dag-view-node-accent\"] = accent;\n const onFocus = (event: React.FocusEvent<HTMLDivElement>): void => {\n if (event.target !== event.currentTarget) return;\n setActive(id);\n setFocused(id);\n let keyboard = true;\n try {\n keyboard = event.currentTarget.matches(\":focus-visible\");\n } catch {\n // An engine without :focus-visible: treat it as the keyboard.\n }\n if (keyboard) ensureVisible(id);\n };\n const onBlur = (event: React.FocusEvent<HTMLDivElement>): void => {\n if (event.target !== event.currentTarget || focusedRef.current !== id) return;\n // A blur from a node that is leaving the graph keeps the focus tracking:\n // the removal effect moves focus on to the Tab stop instead of the page.\n if (!idsRef.current.includes(id)) return;\n setFocused(null);\n };\n const describedBy = description(id);\n const content = (renderNode ?? defaultRender)(view, state);\n return (\n <div\n key={id}\n role=\"option\"\n data-dag-id={id}\n ref={(el) => {\n if (el) elementsRef.current.set(id, el);\n else elementsRef.current.delete(id);\n }}\n className={cn(\"smwb-dag-view__node\", {\n \"smwb-dag-view__node--selected\": state.selected,\n \"smwb-dag-view__node--upstream\": state.related === \"upstream\",\n \"smwb-dag-view__node--downstream\": state.related === \"downstream\",\n \"smwb-dag-view__node--dimmed\": state.dimmed,\n \"smwb-dag-view__node--disabled\": Boolean(node?.disabled),\n })}\n data-status={node?.status}\n aria-selected={state.selected}\n aria-disabled={node?.disabled ? true : undefined}\n aria-describedby={describedBy ? descriptionId : undefined}\n tabIndex={tabStop === id ? 0 : -1}\n style={nodeStyle}\n onClick={(event) => choose(id, event)}\n onFocus={onFocus}\n onBlur={onBlur}\n >\n {content}\n <span id={descriptionId} hidden>\n {describedBy}\n </span>\n </div>\n );\n };\n\n const edgeClass = (edge: DagLayoutEdge): string => {\n const relation = relations.edges.get(edge.id);\n return cn(\"smwb-dag-view__edge\", {\n \"smwb-dag-view__edge--active\": relation !== undefined,\n \"smwb-dag-view__edge--upstream\": relation === \"upstream\",\n \"smwb-dag-view__edge--downstream\": relation === \"downstream\",\n \"smwb-dag-view__edge--dimmed\": Boolean(dimUnrelated) && relations.active && relation === undefined,\n \"smwb-dag-view__edge--reversed\": edge.reversed,\n });\n };\n\n const worldWidth = layout.width + PADDING * 2;\n const worldHeight = layout.height + PADDING * 2;\n const forkedRef = useForkRef(ref, rootRef);\n\n return (\n <div\n data-testid={dataTestId}\n {...rest}\n ref={forkedRef}\n className={cn(\"smwb-dag-view\", className)}\n // The default height is the stylesheet's, so a height in the caller's style is not overridden.\n style={height === undefined ? style : { ...style, height: cssLength(height) }}\n data-direction={direction}\n data-zoom={far ? \"far\" : undefined}\n data-interacting={interacting ? \"\" : undefined}\n >\n <div\n className=\"smwb-dag-view__world\"\n role=\"listbox\"\n aria-label={label}\n aria-roledescription={labels.roleDescription}\n aria-describedby={summary ? summaryId : undefined}\n style={{\n width: `${worldWidth}px`,\n height: `${worldHeight}px`,\n transform: viewportTransform(viewport),\n }}\n onKeyDown={onKeyDown}\n >\n <svg className=\"smwb-dag-view__edges\" width={worldWidth} height={worldHeight} aria-hidden=\"true\">\n <defs>\n <marker\n id={arrowId}\n viewBox=\"0 0 10 10\"\n refX=\"9\"\n refY=\"5\"\n markerWidth=\"10\"\n markerHeight=\"10\"\n markerUnits=\"userSpaceOnUse\"\n orient=\"auto-start-reverse\"\n >\n <path className=\"smwb-dag-view__arrow\" d=\"M0,1 L9,5 L0,9 z\" />\n </marker>\n <marker\n id={activeArrowId}\n viewBox=\"0 0 10 10\"\n refX=\"9\"\n refY=\"5\"\n markerWidth=\"10\"\n markerHeight=\"10\"\n markerUnits=\"userSpaceOnUse\"\n orient=\"auto-start-reverse\"\n >\n <path className=\"smwb-dag-view__arrow smwb-dag-view__arrow--active\" d=\"M0,1 L9,5 L0,9 z\" />\n </marker>\n </defs>\n <g transform={`translate(${PADDING} ${PADDING})`}>\n {layout.edges.map((edge) => (\n <path\n key={edge.id}\n className={edgeClass(edge)}\n data-source={edge.source}\n data-target={edge.target}\n d={dagEdgePath(edge.points, direction)}\n markerEnd={`url(#${relations.edges.has(edge.id) ? activeArrowId : arrowId})`}\n />\n ))}\n </g>\n </svg>\n {ids.map((id, index) => renderNodeFor(id, index))}\n </div>\n {summary ? (\n <p id={summaryId} className=\"smwb-dag-view__summary\">\n {summary}\n </p>\n ) : null}\n {controls ? (\n <div className=\"smwb-dag-view__controls\" role=\"group\" aria-label={labels.controls}>\n <button\n type=\"button\"\n className=\"smwb-dag-view__control\"\n title={labels.zoomIn}\n onClick={() => api.zoomBy(1.25)}\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"smwb-dag-view__control\"\n title={labels.zoomOut}\n onClick={() => api.zoomBy(0.8)}\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M5 12h14\" />\n </svg>\n </button>\n <button type=\"button\" className=\"smwb-dag-view__control\" title={labels.fitView} onClick={() => api.fitView()}>\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5\" />\n </svg>\n </button>\n </div>\n ) : null}\n </div>\n );\n});\n\n/**\n * A directed graph of dependencies: nodes in layers, left to right or top to\n * bottom, joined by arrows. A node is selected by a click or the keyboard, and\n * the edges into and out of it light up; the view pans and zooms with a mouse,\n * a trackpad, touch or the keyboard.\n *\n * `forwardRef` pins the props' generic to its default, so the export is\n * re-typed over it: `T` is inferred from `nodes`, and `renderNode` and\n * `onNodeClick` see `node.data` as `T`.\n */\nexport const DagView = DagViewInner as <T = unknown>(\n props: DagViewProps<T> & React.RefAttributes<HTMLDivElement>\n) => React.ReactElement | null;\n\nexport default DagView;\n"],"names":["PADDING","DEFAULT_LABELS","INNER_FOCUSABLE","cssLength","value","sameList","a","b","i","nameOf","node","id","label","warn","message","DagViewInner","React","props","ref","className","style","summary","nodes","edges","renderNode","direction","nodeWidth","nodeHeight","rankGap","nodeGap","layoutProp","selectedId","defaultSelectedId","onSelectedChange","onNodeClick","dimUnrelated","viewportProp","defaultViewport","onViewportChange","fit","minZoom","maxZoom","wheel","controls","labelsProp","height","apiRef","dataTestId","rest","uid","useId","arrowId","activeArrowId","summaryId","rootRef","elementsRef","labels","statusWord","status","_a","byId","map","nextIds","idsRef","ids","structure","layoutNodes","_b","layoutEdges","edge","input","e","structureRef","stableStructure","latest","layout","dagLayout","across","graph","incoming","outgoing","ordered","layers","selected","setSelected","useControllableState","relations","edgeMap","nodeMap","active","setActive","focused","setFocused","tabStop","viewport","setViewport","interacting","setInteracting","far","viewportRef","selectedRef","focusedRef","tabStopRef","setSelectedRef","setViewportRef","layoutRef","renderNodeRef","fitPendingRef","size","_d","_c","hasSize","width","worldSize","nodeRect","box","apiRefBox","self","world","fitBounds","zoom","factor","zoomAt","rect","centerOn","api","ensureVisible","isVisible","tryFit","useSafeLayoutEffect","root","dispose","createPanZoom","next","frame","resizeObserver","choose","event","focusNode","previousIdsRef","before","present","chosen","had","doc","stop","ownTabIndexRef","appliedTabIndexRef","syncInnerTabStops","own","applied","el","inner","observer","mutations","sync","mutation","now","neighbour","key","tb","forward","back","after","first","list","other","layer","index","_e","onKeyDown","target","dx","dy","defaultRender","jsxs","Fragment","jsx","description","parts","names","from","to","renderNodeFor","view","state","descriptionId","nodeStyle","accent","onFocus","keyboard","onBlur","describedBy","content","cn","edgeClass","relation","worldWidth","worldHeight","forkedRef","useForkRef","viewportTransform","dagEdgePath","DagView"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { DagView } from "./dagView";
2
+ export type { DagViewProps, DagViewNode, DagViewEdge, DagViewStatus, DagViewViewport, DagViewApi, DagViewNodeState, DagViewLabels, } from "./dagView";
3
+ export { dagLayout, dagEdgePath, dagEdgeId } from "./dagLayout";
4
+ export type { DagDirection, DagLayoutInput, DagLayoutInputNode, DagLayoutInputEdge, DagLayoutResult, DagLayoutNode, DagLayoutEdge, DagPoint, } from "./dagLayout";
@@ -0,0 +1,75 @@
1
+ /** What the world is moved and scaled by: `translate(x, y) scale(zoom)`, origin top left. */
2
+ export interface Viewport {
3
+ x: number;
4
+ y: number;
5
+ zoom: number;
6
+ }
7
+ export interface Point {
8
+ x: number;
9
+ y: number;
10
+ }
11
+ export interface Bounds {
12
+ x: number;
13
+ y: number;
14
+ width: number;
15
+ height: number;
16
+ }
17
+ export declare const clamp: (value: number, min: number, max: number) => number;
18
+ /** The viewport scaled by `factor` (clamped to min…max), keeping the world point under `point` in place. */
19
+ export declare function zoomAt(viewport: Viewport, point: Point, factor: number, min: number, max: number): Viewport;
20
+ /** The viewport that shows `bounds` (world units) whole and centred in a box of `size`, `padding` from its edges. */
21
+ export declare function fitBounds(bounds: Bounds, size: {
22
+ width: number;
23
+ height: number;
24
+ }, padding: number, min: number, max: number): Viewport;
25
+ /** The viewport, at its zoom, that puts the world point `point` in the middle of a box of `size`. */
26
+ export declare function centerOn(viewport: Viewport, point: Point, size: {
27
+ width: number;
28
+ height: number;
29
+ }): Viewport;
30
+ /** Whether the world rectangle lies inside the box of `size` at `viewport`, `margin` from its edges. */
31
+ export declare function isVisible(viewport: Viewport, rect: Bounds, size: {
32
+ width: number;
33
+ height: number;
34
+ }, margin?: number): boolean;
35
+ /** The zoom factor for a wheel turn: lines and pages count as many pixels, a pinch (ctrl) zooms faster. */
36
+ export declare function wheelZoomFactor(deltaY: number, deltaMode: number, pinch: boolean): number;
37
+ /** Rounded translation, so text is not blurred at rest by subpixel offsets. */
38
+ export declare const viewportTransform: (viewport: Viewport) => string;
39
+ export declare const sameViewport: (a: Viewport, b: Viewport) => boolean;
40
+ /**
41
+ * Coalesces writes to one per animation frame: `schedule` keeps the latest
42
+ * value, and `write` gets it on the next frame. `pending()` is that latest value
43
+ * until it is written, so a gesture builds on what it asked for, not on what was
44
+ * drawn last.
45
+ */
46
+ export declare function createFrameWriter<T>(write: (value: T) => void, frame?: {
47
+ request: (callback: () => void) => number;
48
+ cancel: (id: number) => void;
49
+ }): {
50
+ schedule(value: T): void;
51
+ pending(): T | undefined;
52
+ flush(): void;
53
+ cancel(): void;
54
+ };
55
+ export type WheelMode = "zoom" | "pan" | "none";
56
+ export interface PanZoomOptions {
57
+ /** The viewport as drawn now. */
58
+ viewport: () => Viewport;
59
+ /** Gets the new viewport, at most once per frame. */
60
+ write: (viewport: Viewport) => void;
61
+ minZoom: () => number;
62
+ maxZoom: () => number;
63
+ /** Plain wheel: zoom (default), pan, or leave it to the page. Ctrl+wheel (a trackpad pinch) always zooms. */
64
+ wheel: () => WheelMode;
65
+ /** True while a drag or pinch is under way. */
66
+ onInteracting?: (interacting: boolean) => void;
67
+ /** Pixels a press moves before it pans rather than clicks; 3 by default. */
68
+ threshold?: number;
69
+ }
70
+ /**
71
+ * Pan and zoom on `el`: drag with a mouse or one finger, pinch with two, wheel,
72
+ * and a Safari trackpad pinch. A drag that moved past the threshold swallows
73
+ * the click that follows it. Returns the function that removes it all.
74
+ */
75
+ export declare function createPanZoom(el: HTMLElement, options: PanZoomOptions): () => void;
@@ -0,0 +1,171 @@
1
+ const I = (e, n, r) => Math.min(r, Math.max(n, e));
2
+ function v(e, n, r, i, s) {
3
+ const a = I(e.zoom * r, i, s), m = a / e.zoom;
4
+ return { x: n.x - (n.x - e.x) * m, y: n.y - (n.y - e.y) * m, zoom: a };
5
+ }
6
+ function S(e, n, r, i, s) {
7
+ const a = { width: Math.max(1, n.width - r * 2), height: Math.max(1, n.height - r * 2) }, m = Math.min(a.width / Math.max(1, e.width), a.height / Math.max(1, e.height)), c = I(m, i, s);
8
+ return {
9
+ x: (n.width - e.width * c) / 2 - e.x * c,
10
+ y: (n.height - e.height * c) / 2 - e.y * c,
11
+ zoom: c
12
+ };
13
+ }
14
+ function W(e, n, r) {
15
+ return {
16
+ x: r.width / 2 - n.x * e.zoom,
17
+ y: r.height / 2 - n.y * e.zoom,
18
+ zoom: e.zoom
19
+ };
20
+ }
21
+ function N(e, n, r, i = 0) {
22
+ const s = e.x + n.x * e.zoom, a = e.y + n.y * e.zoom;
23
+ return s >= i && a >= i && s + n.width * e.zoom <= r.width - i && a + n.height * e.zoom <= r.height - i;
24
+ }
25
+ function B(e, n, r) {
26
+ const i = n === 1 ? e * 16 : n === 2 ? e * 400 : e, s = I(i, -100, 100) * (r ? 0.01 : 2e-3);
27
+ return Math.exp(-s);
28
+ }
29
+ const O = (e) => `translate(${Math.round(e.x)}px, ${Math.round(e.y)}px) scale(${Math.round(e.zoom * 1e4) / 1e4})`, R = (e, n) => e.x === n.x && e.y === n.y && e.zoom === n.zoom;
30
+ function V(e, n = {
31
+ request: (r) => typeof requestAnimationFrame == "function" ? requestAnimationFrame(r) : window.setTimeout(r, 16),
32
+ cancel: (r) => typeof cancelAnimationFrame == "function" ? cancelAnimationFrame(r) : window.clearTimeout(r)
33
+ }) {
34
+ let r, i;
35
+ const s = () => {
36
+ i !== void 0 && n.cancel(i), i = void 0;
37
+ const a = r;
38
+ r = void 0, a && e(a.current);
39
+ };
40
+ return {
41
+ schedule(a) {
42
+ r = { current: a }, i === void 0 && (i = n.request(() => {
43
+ i = void 0, s();
44
+ }));
45
+ },
46
+ pending: () => r == null ? void 0 : r.current,
47
+ flush: s,
48
+ cancel() {
49
+ i !== void 0 && n.cancel(i), i = void 0, r = void 0;
50
+ }
51
+ };
52
+ }
53
+ const $ = "a[href], button, input, select, textarea, label, summary, [contenteditable], [data-dag-no-pan]";
54
+ function U(e, n) {
55
+ var G;
56
+ const r = (G = n.threshold) != null ? G : 3, i = V(n.write), s = () => {
57
+ var t;
58
+ return (t = i.pending()) != null ? t : n.viewport();
59
+ }, a = (t) => {
60
+ R(t, s()) || i.schedule(t);
61
+ }, m = (t, o) => {
62
+ const d = e.getBoundingClientRect();
63
+ return { x: t - d.left, y: o - d.top };
64
+ }, c = /* @__PURE__ */ new Map(), y = e.ownerDocument;
65
+ let X = !1;
66
+ const L = (t) => {
67
+ t !== X && (X = t, t ? (y.addEventListener("pointermove", A, !0), y.addEventListener("pointerup", E, !0), y.addEventListener("pointercancel", E, !0)) : (y.removeEventListener("pointermove", A, !0), y.removeEventListener("pointerup", E, !0), y.removeEventListener("pointercancel", E, !0)));
68
+ };
69
+ let u, l, p = !1, z = !1, Z = !1;
70
+ const M = (t) => {
71
+ var o;
72
+ t !== Z && (Z = t, (o = n.onInteracting) == null || o.call(n, t));
73
+ }, C = () => {
74
+ const [t, o] = [...c.values()];
75
+ return { distance: Math.hypot(t.x - o.x, t.y - o.y), mid: { x: (t.x + o.x) / 2, y: (t.y + o.y) / 2 } };
76
+ }, D = (t) => {
77
+ var d;
78
+ if (t.button !== 0 && t.pointerType === "mouse") return;
79
+ const o = t.target;
80
+ if (!((d = o == null ? void 0 : o.closest) != null && d.call(o, $))) {
81
+ if (c.set(t.pointerId, m(t.clientX, t.clientY)), L(!0), c.size === 1)
82
+ u = { point: c.get(t.pointerId), viewport: s(), id: t.pointerId }, p = !1;
83
+ else if (c.size === 2) {
84
+ const { distance: h, mid: f } = C();
85
+ l = { distance: h, mid: f, viewport: s() }, u = void 0;
86
+ for (const x of c.keys()) T(x);
87
+ M(!0);
88
+ }
89
+ }
90
+ }, T = (t) => {
91
+ var o;
92
+ try {
93
+ (o = e.setPointerCapture) == null || o.call(e, t);
94
+ } catch {
95
+ }
96
+ }, A = (t) => {
97
+ if (!c.has(t.pointerId)) return;
98
+ const o = m(t.clientX, t.clientY);
99
+ if (c.set(t.pointerId, o), l && c.size >= 2) {
100
+ const { distance: f, mid: x } = C(), g = v(
101
+ l.viewport,
102
+ l.mid,
103
+ f / Math.max(1, l.distance),
104
+ n.minZoom(),
105
+ n.maxZoom()
106
+ );
107
+ a({ ...g, x: g.x + x.x - l.mid.x, y: g.y + x.y - l.mid.y });
108
+ return;
109
+ }
110
+ if (!u || u.id !== t.pointerId) return;
111
+ const d = o.x - u.point.x, h = o.y - u.point.y;
112
+ if (!p) {
113
+ if (Math.hypot(d, h) < r) return;
114
+ p = !0, T(t.pointerId), M(!0);
115
+ }
116
+ a({ x: u.viewport.x + d, y: u.viewport.y + h, zoom: u.viewport.zoom });
117
+ }, E = (t) => {
118
+ if (c.delete(t.pointerId)) {
119
+ if ((p || l) && (z = !0), c.size < 2 && (l = void 0), c.size === 0)
120
+ L(!1), u = void 0, p = !1, M(!1), i.flush(), setTimeout(() => z = !1, 0);
121
+ else if (c.size === 1) {
122
+ const [[o, d]] = [...c.entries()];
123
+ u = { point: d, viewport: s(), id: o }, p = !0;
124
+ }
125
+ }
126
+ }, F = (t) => {
127
+ z && (z = !1, t.stopPropagation(), t.preventDefault());
128
+ }, P = (t) => {
129
+ const o = t.ctrlKey || t.metaKey, d = n.wheel();
130
+ if (!o && d === "none") return;
131
+ if (t.preventDefault(), !o && d === "pan") {
132
+ const f = s(), x = t.deltaMode === 1 ? 16 : t.deltaMode === 2 ? 400 : 1, g = t.shiftKey && !t.deltaX ? t.deltaY : t.deltaX, K = t.shiftKey && !t.deltaX ? 0 : t.deltaY;
133
+ a({ x: f.x - g * x, y: f.y - K * x, zoom: f.zoom });
134
+ return;
135
+ }
136
+ const h = B(t.deltaY, t.deltaMode, o);
137
+ a(v(s(), m(t.clientX, t.clientY), h, n.minZoom(), n.maxZoom()));
138
+ };
139
+ let w;
140
+ const k = (t) => {
141
+ var h;
142
+ t.preventDefault();
143
+ const o = t, d = e.getBoundingClientRect();
144
+ w = {
145
+ viewport: s(),
146
+ point: o.clientX === void 0 ? { x: d.width / 2, y: d.height / 2 } : m(o.clientX, (h = o.clientY) != null ? h : 0)
147
+ };
148
+ }, Y = (t) => {
149
+ t.preventDefault();
150
+ const o = t.scale;
151
+ !w || typeof o != "number" || a(v(w.viewport, w.point, o, n.minZoom(), n.maxZoom()));
152
+ }, q = (t) => {
153
+ t.preventDefault(), w = void 0;
154
+ };
155
+ return e.addEventListener("pointerdown", D), e.addEventListener("click", F, !0), e.addEventListener("wheel", P, { passive: !1 }), e.addEventListener("gesturestart", k), e.addEventListener("gesturechange", Y), e.addEventListener("gestureend", q), () => {
156
+ i.cancel(), L(!1), e.removeEventListener("pointerdown", D), e.removeEventListener("click", F, !0), e.removeEventListener("wheel", P), e.removeEventListener("gesturestart", k), e.removeEventListener("gesturechange", Y), e.removeEventListener("gestureend", q);
157
+ };
158
+ }
159
+ export {
160
+ W as centerOn,
161
+ I as clamp,
162
+ V as createFrameWriter,
163
+ U as createPanZoom,
164
+ S as fitBounds,
165
+ N as isVisible,
166
+ R as sameViewport,
167
+ O as viewportTransform,
168
+ B as wheelZoomFactor,
169
+ v as zoomAt
170
+ };
171
+ //# sourceMappingURL=panZoom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panZoom.js","sources":["../../../../src/components/dataDisplay/dagView/panZoom.ts"],"sourcesContent":["// Pan and zoom for a transformed \"world\" inside a viewport element: pure math\n// (unit-tested) and plain DOM glue, with no Solid imports, so a React port can\n// copy the file. The glue reads gestures and hands at most one new viewport per\n// animation frame to `write`.\n\n/** What the world is moved and scaled by: `translate(x, y) scale(zoom)`, origin top left. */\nexport interface Viewport {\n x: number;\n y: number;\n zoom: number;\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface Bounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport const clamp = (value: number, min: number, max: number): number => Math.min(max, Math.max(min, value));\n\n/** The viewport scaled by `factor` (clamped to min…max), keeping the world point under `point` in place. */\nexport function zoomAt(viewport: Viewport, point: Point, factor: number, min: number, max: number): Viewport {\n const zoom = clamp(viewport.zoom * factor, min, max);\n const k = zoom / viewport.zoom;\n return { x: point.x - (point.x - viewport.x) * k, y: point.y - (point.y - viewport.y) * k, zoom };\n}\n\n/** The viewport that shows `bounds` (world units) whole and centred in a box of `size`, `padding` from its edges. */\nexport function fitBounds(\n bounds: Bounds,\n size: { width: number; height: number },\n padding: number,\n min: number,\n max: number\n): Viewport {\n const room = { width: Math.max(1, size.width - padding * 2), height: Math.max(1, size.height - padding * 2) };\n const fit = Math.min(room.width / Math.max(1, bounds.width), room.height / Math.max(1, bounds.height));\n const zoom = clamp(fit, min, max);\n return {\n x: (size.width - bounds.width * zoom) / 2 - bounds.x * zoom,\n y: (size.height - bounds.height * zoom) / 2 - bounds.y * zoom,\n zoom,\n };\n}\n\n/** The viewport, at its zoom, that puts the world point `point` in the middle of a box of `size`. */\nexport function centerOn(viewport: Viewport, point: Point, size: { width: number; height: number }): Viewport {\n return {\n x: size.width / 2 - point.x * viewport.zoom,\n y: size.height / 2 - point.y * viewport.zoom,\n zoom: viewport.zoom,\n };\n}\n\n/** Whether the world rectangle lies inside the box of `size` at `viewport`, `margin` from its edges. */\nexport function isVisible(\n viewport: Viewport,\n rect: Bounds,\n size: { width: number; height: number },\n margin = 0\n): boolean {\n const left = viewport.x + rect.x * viewport.zoom;\n const top = viewport.y + rect.y * viewport.zoom;\n return (\n left >= margin &&\n top >= margin &&\n left + rect.width * viewport.zoom <= size.width - margin &&\n top + rect.height * viewport.zoom <= size.height - margin\n );\n}\n\n/** The zoom factor for a wheel turn: lines and pages count as many pixels, a pinch (ctrl) zooms faster. */\nexport function wheelZoomFactor(deltaY: number, deltaMode: number, pinch: boolean): number {\n const pixels = deltaMode === 1 ? deltaY * 16 : deltaMode === 2 ? deltaY * 400 : deltaY;\n const step = clamp(pixels, -100, 100) * (pinch ? 0.01 : 0.002);\n return Math.exp(-step);\n}\n\n/** Rounded translation, so text is not blurred at rest by subpixel offsets. */\nexport const viewportTransform = (viewport: Viewport): string =>\n `translate(${Math.round(viewport.x)}px, ${Math.round(viewport.y)}px) scale(${Math.round(viewport.zoom * 10000) / 10000})`;\n\nexport const sameViewport = (a: Viewport, b: Viewport): boolean => a.x === b.x && a.y === b.y && a.zoom === b.zoom;\n\n/**\n * Coalesces writes to one per animation frame: `schedule` keeps the latest\n * value, and `write` gets it on the next frame. `pending()` is that latest value\n * until it is written, so a gesture builds on what it asked for, not on what was\n * drawn last.\n */\nexport function createFrameWriter<T>(\n write: (value: T) => void,\n frame: { request: (callback: () => void) => number; cancel: (id: number) => void } = {\n request: (callback) =>\n typeof requestAnimationFrame === \"function\" ? requestAnimationFrame(callback) : window.setTimeout(callback, 16),\n cancel: (id) => (typeof cancelAnimationFrame === \"function\" ? cancelAnimationFrame(id) : window.clearTimeout(id)),\n }\n): { schedule(value: T): void; pending(): T | undefined; flush(): void; cancel(): void } {\n let value: { current: T } | undefined;\n let id: number | undefined;\n const flush = (): void => {\n if (id !== undefined) frame.cancel(id);\n id = undefined;\n const next = value;\n value = undefined;\n if (next) write(next.current);\n };\n return {\n schedule(next) {\n value = { current: next };\n if (id === undefined)\n id = frame.request(() => {\n id = undefined;\n flush();\n });\n },\n pending: () => value?.current,\n flush,\n cancel() {\n if (id !== undefined) frame.cancel(id);\n id = undefined;\n value = undefined;\n },\n };\n}\n\nexport type WheelMode = \"zoom\" | \"pan\" | \"none\";\n\nexport interface PanZoomOptions {\n /** The viewport as drawn now. */\n viewport: () => Viewport;\n /** Gets the new viewport, at most once per frame. */\n write: (viewport: Viewport) => void;\n minZoom: () => number;\n maxZoom: () => number;\n /** Plain wheel: zoom (default), pan, or leave it to the page. Ctrl+wheel (a trackpad pinch) always zooms. */\n wheel: () => WheelMode;\n /** True while a drag or pinch is under way. */\n onInteracting?: (interacting: boolean) => void;\n /** Pixels a press moves before it pans rather than clicks; 3 by default. */\n threshold?: number;\n}\n\n/** Targets where a press keeps its own meaning and does not pan: controls, links, fields. */\nconst INTERACTIVE = \"a[href], button, input, select, textarea, label, summary, [contenteditable], [data-dag-no-pan]\";\n\n/**\n * Pan and zoom on `el`: drag with a mouse or one finger, pinch with two, wheel,\n * and a Safari trackpad pinch. A drag that moved past the threshold swallows\n * the click that follows it. Returns the function that removes it all.\n */\nexport function createPanZoom(el: HTMLElement, options: PanZoomOptions): () => void {\n const threshold = options.threshold ?? 3;\n const writer = createFrameWriter<Viewport>(options.write);\n const current = (): Viewport => writer.pending() ?? options.viewport();\n const set = (next: Viewport): void => {\n if (!sameViewport(next, current())) writer.schedule(next);\n };\n const local = (clientX: number, clientY: number): Point => {\n const rect = el.getBoundingClientRect();\n return { x: clientX - rect.left, y: clientY - rect.top };\n };\n\n const pointers = new Map<number, Point>();\n // While a press is held, its moves and release are read on the document: a\n // quick drag can leave the box before the threshold, when the pointer is\n // captured, and the box would see nothing more of it. A captured pointer's\n // events still reach the document, through the box.\n const doc = el.ownerDocument;\n let following = false;\n const follow = (on: boolean): void => {\n if (on === following) return;\n following = on;\n if (on) {\n doc.addEventListener(\"pointermove\", onPointerMove, true);\n doc.addEventListener(\"pointerup\", onPointerUp, true);\n doc.addEventListener(\"pointercancel\", onPointerUp, true);\n } else {\n doc.removeEventListener(\"pointermove\", onPointerMove, true);\n doc.removeEventListener(\"pointerup\", onPointerUp, true);\n doc.removeEventListener(\"pointercancel\", onPointerUp, true);\n }\n };\n let start: { point: Point; viewport: Viewport; id: number } | undefined;\n let pinch: { distance: number; mid: Point; viewport: Viewport } | undefined;\n let panning = false;\n let swallowClick = false;\n let interacting = false;\n const setInteracting = (value: boolean): void => {\n if (value === interacting) return;\n interacting = value;\n options.onInteracting?.(value);\n };\n\n const pinchState = (): { distance: number; mid: Point } => {\n const [a, b] = [...pointers.values()] as [Point, Point];\n return { distance: Math.hypot(a.x - b.x, a.y - b.y), mid: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 } };\n };\n\n const onPointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 && event.pointerType === \"mouse\") return;\n const target = event.target as Element | null;\n if (target?.closest?.(INTERACTIVE)) return;\n pointers.set(event.pointerId, local(event.clientX, event.clientY));\n follow(true);\n if (pointers.size === 1) {\n start = { point: pointers.get(event.pointerId)!, viewport: current(), id: event.pointerId };\n panning = false;\n } else if (pointers.size === 2) {\n const { distance, mid } = pinchState();\n pinch = { distance, mid, viewport: current() };\n start = undefined;\n // A second finger makes it a gesture: take both pointers.\n for (const id of pointers.keys()) capture(id);\n setInteracting(true);\n }\n };\n\n const capture = (id: number): void => {\n try {\n el.setPointerCapture?.(id);\n } catch {\n // The pointer is gone already.\n }\n };\n\n const onPointerMove = (event: PointerEvent): void => {\n if (!pointers.has(event.pointerId)) return;\n const point = local(event.clientX, event.clientY);\n pointers.set(event.pointerId, point);\n if (pinch && pointers.size >= 2) {\n const { distance, mid } = pinchState();\n const scaled = zoomAt(\n pinch.viewport,\n pinch.mid,\n distance / Math.max(1, pinch.distance),\n options.minZoom(),\n options.maxZoom()\n );\n set({ ...scaled, x: scaled.x + mid.x - pinch.mid.x, y: scaled.y + mid.y - pinch.mid.y });\n return;\n }\n if (!start || start.id !== event.pointerId) return;\n const dx = point.x - start.point.x;\n const dy = point.y - start.point.y;\n if (!panning) {\n if (Math.hypot(dx, dy) < threshold) return;\n // Captured only now: a capture from the press would take the click from the node under it.\n panning = true;\n capture(event.pointerId);\n setInteracting(true);\n }\n set({ x: start.viewport.x + dx, y: start.viewport.y + dy, zoom: start.viewport.zoom });\n };\n\n const onPointerUp = (event: PointerEvent): void => {\n if (!pointers.delete(event.pointerId)) return;\n if (panning || pinch) swallowClick = true;\n if (pointers.size < 2) pinch = undefined;\n if (pointers.size === 0) {\n follow(false);\n start = undefined;\n panning = false;\n setInteracting(false);\n writer.flush();\n // A click comes right after the release, or not at all.\n setTimeout(() => (swallowClick = false), 0);\n } else if (pointers.size === 1) {\n // One finger left after a pinch: it pans from here.\n const [[id, point]] = [...pointers.entries()] as [[number, Point]];\n start = { point, viewport: current(), id };\n panning = true;\n }\n };\n\n const onClick = (event: MouseEvent): void => {\n if (!swallowClick) return;\n swallowClick = false;\n event.stopPropagation();\n event.preventDefault();\n };\n\n const onWheel = (event: WheelEvent): void => {\n const pinchGesture = event.ctrlKey || event.metaKey;\n const mode = options.wheel();\n if (!pinchGesture && mode === \"none\") return;\n event.preventDefault();\n if (!pinchGesture && mode === \"pan\") {\n const v = current();\n const scale = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? 400 : 1;\n const dx = event.shiftKey && !event.deltaX ? event.deltaY : event.deltaX;\n const dy = event.shiftKey && !event.deltaX ? 0 : event.deltaY;\n set({ x: v.x - dx * scale, y: v.y - dy * scale, zoom: v.zoom });\n return;\n }\n const factor = wheelZoomFactor(event.deltaY, event.deltaMode, pinchGesture);\n set(zoomAt(current(), local(event.clientX, event.clientY), factor, options.minZoom(), options.maxZoom()));\n };\n\n // Safari reports a trackpad pinch as gesture events, with the scale since the gesture began.\n let gesture: { viewport: Viewport; point: Point } | undefined;\n const onGestureStart = (event: Event): void => {\n event.preventDefault();\n const e = event as Event & { clientX?: number; clientY?: number };\n const rect = el.getBoundingClientRect();\n gesture = {\n viewport: current(),\n point: e.clientX === undefined ? { x: rect.width / 2, y: rect.height / 2 } : local(e.clientX, e.clientY ?? 0),\n };\n };\n const onGestureChange = (event: Event): void => {\n event.preventDefault();\n const scale = (event as Event & { scale?: number }).scale;\n if (!gesture || typeof scale !== \"number\") return;\n set(zoomAt(gesture.viewport, gesture.point, scale, options.minZoom(), options.maxZoom()));\n };\n const onGestureEnd = (event: Event): void => {\n event.preventDefault();\n gesture = undefined;\n };\n\n el.addEventListener(\"pointerdown\", onPointerDown);\n el.addEventListener(\"click\", onClick, true);\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n el.addEventListener(\"gesturestart\", onGestureStart);\n el.addEventListener(\"gesturechange\", onGestureChange);\n el.addEventListener(\"gestureend\", onGestureEnd);\n\n return () => {\n writer.cancel();\n follow(false);\n el.removeEventListener(\"pointerdown\", onPointerDown);\n el.removeEventListener(\"click\", onClick, true);\n el.removeEventListener(\"wheel\", onWheel);\n el.removeEventListener(\"gesturestart\", onGestureStart);\n el.removeEventListener(\"gesturechange\", onGestureChange);\n el.removeEventListener(\"gestureend\", onGestureEnd);\n };\n}\n"],"names":["clamp","value","min","max","zoomAt","viewport","point","factor","zoom","k","fitBounds","bounds","size","padding","room","fit","centerOn","isVisible","rect","margin","left","top","wheelZoomFactor","deltaY","deltaMode","pinch","pixels","step","viewportTransform","sameViewport","a","b","createFrameWriter","write","frame","callback","id","flush","next","INTERACTIVE","createPanZoom","el","options","_a","threshold","writer","current","set","local","clientX","clientY","pointers","doc","following","follow","on","onPointerMove","onPointerUp","start","panning","swallowClick","interacting","setInteracting","pinchState","onPointerDown","event","target","distance","mid","capture","scaled","dx","dy","onClick","onWheel","pinchGesture","mode","v","scale","gesture","onGestureStart","e","onGestureChange","onGestureEnd"],"mappings":"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"}
@@ -6,15 +6,23 @@ export interface DescriptionListEntry {
6
6
  key?: React.Key;
7
7
  }
8
8
  /**
9
- * `auto`: the term beside its description while the list's container is at
10
- * least 420px wide, above it when narrower (a container query). `row` and
11
- * `stacked` fix one layout.
9
+ * `auto`: the term beside its description while the list is at least 420px
10
+ * wide, above it when narrower (a container query on the list itself). `row`
11
+ * and `stacked` fix one layout.
12
12
  */
13
13
  export type DescriptionListLayout = "auto" | "row" | "stacked";
14
14
  export interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {
15
15
  className?: string;
16
16
  /** The pairs as data; `DescriptionItem` children work too, and come after them. */
17
17
  items?: DescriptionListEntry[];
18
+ /**
19
+ * "auto" (default): each term beside its value while the list is at least
20
+ * 420px wide, above it when narrower — the list's own width decides. So its
21
+ * content does not widen it: where the parent takes its width from its
22
+ * content (a flex item that does not grow, a popover, a table cell) the list
23
+ * has no width; give it one there, or use "row" / "stacked", which fix one
24
+ * layout and take their width from their content.
25
+ */
18
26
  layout?: DescriptionListLayout;
19
27
  /** Width of the term column in the row layout: px or any CSS track size. 30% of the list, at least 6rem, by default. */
20
28
  termWidth?: number | string;
@@ -1 +1 @@
1
- {"version":3,"file":"descriptionList.js","sources":["../../../../src/components/dataDisplay/descriptionList/descriptionList.tsx"],"sourcesContent":["import React, { CSSProperties, HTMLAttributes, PropsWithChildren, ReactNode } from \"react\";\nimport cn from \"clsx\";\n\nexport interface DescriptionListEntry {\n term: ReactNode;\n description: ReactNode;\n /** React key; the index is used without it. */\n key?: React.Key;\n}\n\n/**\n * `auto`: the term beside its description while the list's container is at\n * least 420px wide, above it when narrower (a container query). `row` and\n * `stacked` fix one layout.\n */\nexport type DescriptionListLayout = \"auto\" | \"row\" | \"stacked\";\n\nexport interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {\n className?: string;\n /** The pairs as data; `DescriptionItem` children work too, and come after them. */\n items?: DescriptionListEntry[];\n layout?: DescriptionListLayout;\n /** Width of the term column in the row layout: px or any CSS track size. 30% of the list, at least 6rem, by default. */\n termWidth?: number | string;\n /** Tighter spacing, for side panels. */\n dense?: boolean;\n}\n\nexport interface DescriptionItemProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n /** The field's name. */\n term: ReactNode;\n}\n\n/** One pair: the term and, as children, its description. */\nexport const DescriptionItem = React.forwardRef<HTMLDivElement, PropsWithChildren<DescriptionItemProps>>(\n function DescriptionItem({ className, term, children, ...rest }, ref) {\n return (\n <div {...rest} ref={ref} className={cn(\"smwb-description-list__item\", className)}>\n <dt className=\"smwb-description-list__term\">{term}</dt>\n <dd className=\"smwb-description-list__details\">{children}</dd>\n </div>\n );\n }\n);\n\n/** Field–value pairs (a `<dl>`): side by side, stacking on a narrow container. */\nexport const DescriptionList = React.forwardRef<HTMLDListElement, PropsWithChildren<DescriptionListProps>>(\n function DescriptionList({ className, style, items, layout = \"auto\", termWidth, dense, children, ...rest }, ref) {\n const width = typeof termWidth === \"number\" ? `${termWidth}px` : termWidth;\n return (\n <dl\n {...rest}\n ref={ref}\n className={cn(\n \"smwb-description-list\",\n `smwb-description-list_${layout}`,\n { \"smwb-description-list_dense\": dense },\n className\n )}\n style={width === undefined ? style : ({ ...style, \"--smwb-description-term\": width } as CSSProperties)}\n >\n {items?.map((item, index) => (\n <DescriptionItem key={item.key ?? index} term={item.term}>\n {item.description}\n </DescriptionItem>\n ))}\n {children}\n </dl>\n );\n }\n);\n\nexport default DescriptionList;\n"],"names":["DescriptionItem","React","className","term","children","rest","ref","jsxs","cn","jsx","DescriptionList","style","items","layout","termWidth","dense","width","item","index","_a"],"mappings":";;;;;AAqCO,MAAMA,IAAkBC,EAAM;AAAA,EACnC,SAAyB,EAAE,WAAAC,GAAW,MAAAC,GAAM,UAAAC,GAAU,GAAGC,EAAA,GAAQC,GAAK;AACpE,WACE,gBAAAC,EAAC,SAAK,GAAGF,GAAM,KAAAC,GAAU,WAAWE,EAAG,+BAA+BN,CAAS,GAC7E,UAAA;AAAA,MAAA,gBAAAO,EAAC,MAAA,EAAG,WAAU,+BAA+B,UAAAN,GAAK;AAAA,MAClD,gBAAAM,EAAC,MAAA,EAAG,WAAU,kCAAkC,UAAAL,EAAA,CAAS;AAAA,IAAA,GAC3D;AAAA,EAEJ;AACF,GAGaM,IAAkBT,EAAM;AAAA,EACnC,SAAyB,EAAE,WAAAC,GAAW,OAAAS,GAAO,OAAAC,GAAO,QAAAC,IAAS,QAAQ,WAAAC,GAAW,OAAAC,GAAO,UAAAX,GAAU,GAAGC,EAAA,GAAQC,GAAK;AAC/G,UAAMU,IAAQ,OAAOF,KAAc,WAAW,GAAGA,CAAS,OAAOA;AACjE,WACE,gBAAAP;AAAA,MAAC;AAAA,MAAA;AAAA,QACE,GAAGF;AAAA,QACJ,KAAAC;AAAA,QACA,WAAWE;AAAA,UACT;AAAA,UACA,yBAAyBK,CAAM;AAAA,UAC/B,EAAE,+BAA+BE,EAAA;AAAA,UACjCb;AAAA,QAAA;AAAA,QAEF,OAAOc,MAAU,SAAYL,IAAS,EAAE,GAAGA,GAAO,2BAA2BK,EAAA;AAAA,QAE5E,UAAA;AAAA,UAAAJ,KAAA,gBAAAA,EAAO,IAAI,CAACK,GAAMC,MAAA;;qCAChBlB,GAAA,EAAwC,MAAMiB,EAAK,MACjD,UAAAA,EAAK,YAAA,IADcE,IAAAF,EAAK,QAAL,OAAAE,IAAYD,CAElC;AAAA;AAAA,UAEDd;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;"}
1
+ {"version":3,"file":"descriptionList.js","sources":["../../../../src/components/dataDisplay/descriptionList/descriptionList.tsx"],"sourcesContent":["import React, { CSSProperties, HTMLAttributes, PropsWithChildren, ReactNode } from \"react\";\nimport cn from \"clsx\";\n\nexport interface DescriptionListEntry {\n term: ReactNode;\n description: ReactNode;\n /** React key; the index is used without it. */\n key?: React.Key;\n}\n\n/**\n * `auto`: the term beside its description while the list is at least 420px\n * wide, above it when narrower (a container query on the list itself). `row`\n * and `stacked` fix one layout.\n */\nexport type DescriptionListLayout = \"auto\" | \"row\" | \"stacked\";\n\nexport interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {\n className?: string;\n /** The pairs as data; `DescriptionItem` children work too, and come after them. */\n items?: DescriptionListEntry[];\n /**\n * \"auto\" (default): each term beside its value while the list is at least\n * 420px wide, above it when narrower — the list's own width decides. So its\n * content does not widen it: where the parent takes its width from its\n * content (a flex item that does not grow, a popover, a table cell) the list\n * has no width; give it one there, or use \"row\" / \"stacked\", which fix one\n * layout and take their width from their content.\n */\n layout?: DescriptionListLayout;\n /** Width of the term column in the row layout: px or any CSS track size. 30% of the list, at least 6rem, by default. */\n termWidth?: number | string;\n /** Tighter spacing, for side panels. */\n dense?: boolean;\n}\n\nexport interface DescriptionItemProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n /** The field's name. */\n term: ReactNode;\n}\n\n/** One pair: the term and, as children, its description. */\nexport const DescriptionItem = React.forwardRef<HTMLDivElement, PropsWithChildren<DescriptionItemProps>>(\n function DescriptionItem({ className, term, children, ...rest }, ref) {\n return (\n <div {...rest} ref={ref} className={cn(\"smwb-description-list__item\", className)}>\n <dt className=\"smwb-description-list__term\">{term}</dt>\n <dd className=\"smwb-description-list__details\">{children}</dd>\n </div>\n );\n }\n);\n\n/** Field–value pairs (a `<dl>`): side by side, stacking on a narrow container. */\nexport const DescriptionList = React.forwardRef<HTMLDListElement, PropsWithChildren<DescriptionListProps>>(\n function DescriptionList({ className, style, items, layout = \"auto\", termWidth, dense, children, ...rest }, ref) {\n const width = typeof termWidth === \"number\" ? `${termWidth}px` : termWidth;\n return (\n <dl\n {...rest}\n ref={ref}\n className={cn(\n \"smwb-description-list\",\n `smwb-description-list_${layout}`,\n { \"smwb-description-list_dense\": dense },\n className\n )}\n style={width === undefined ? style : ({ ...style, \"--smwb-description-term\": width } as CSSProperties)}\n >\n {items?.map((item, index) => (\n <DescriptionItem key={item.key ?? index} term={item.term}>\n {item.description}\n </DescriptionItem>\n ))}\n {children}\n </dl>\n );\n }\n);\n\nexport default DescriptionList;\n"],"names":["DescriptionItem","React","className","term","children","rest","ref","jsxs","cn","jsx","DescriptionList","style","items","layout","termWidth","dense","width","item","index","_a"],"mappings":";;;;;AA6CO,MAAMA,IAAkBC,EAAM;AAAA,EACnC,SAAyB,EAAE,WAAAC,GAAW,MAAAC,GAAM,UAAAC,GAAU,GAAGC,EAAA,GAAQC,GAAK;AACpE,WACE,gBAAAC,EAAC,SAAK,GAAGF,GAAM,KAAAC,GAAU,WAAWE,EAAG,+BAA+BN,CAAS,GAC7E,UAAA;AAAA,MAAA,gBAAAO,EAAC,MAAA,EAAG,WAAU,+BAA+B,UAAAN,GAAK;AAAA,MAClD,gBAAAM,EAAC,MAAA,EAAG,WAAU,kCAAkC,UAAAL,EAAA,CAAS;AAAA,IAAA,GAC3D;AAAA,EAEJ;AACF,GAGaM,IAAkBT,EAAM;AAAA,EACnC,SAAyB,EAAE,WAAAC,GAAW,OAAAS,GAAO,OAAAC,GAAO,QAAAC,IAAS,QAAQ,WAAAC,GAAW,OAAAC,GAAO,UAAAX,GAAU,GAAGC,EAAA,GAAQC,GAAK;AAC/G,UAAMU,IAAQ,OAAOF,KAAc,WAAW,GAAGA,CAAS,OAAOA;AACjE,WACE,gBAAAP;AAAA,MAAC;AAAA,MAAA;AAAA,QACE,GAAGF;AAAA,QACJ,KAAAC;AAAA,QACA,WAAWE;AAAA,UACT;AAAA,UACA,yBAAyBK,CAAM;AAAA,UAC/B,EAAE,+BAA+BE,EAAA;AAAA,UACjCb;AAAA,QAAA;AAAA,QAEF,OAAOc,MAAU,SAAYL,IAAS,EAAE,GAAGA,GAAO,2BAA2BK,EAAA;AAAA,QAE5E,UAAA;AAAA,UAAAJ,KAAA,gBAAAA,EAAO,IAAI,CAACK,GAAMC,MAAA;;qCAChBlB,GAAA,EAAwC,MAAMiB,EAAK,MACjD,UAAAA,EAAK,YAAA,IADcE,IAAAF,EAAK,QAAL,OAAAE,IAAYD,CAElC;AAAA;AAAA,UAEDd;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;"}
@@ -0,0 +1,54 @@
1
+ import React, { HTMLAttributes } from "react";
2
+ /** How many cells the bar has. */
3
+ export declare const DIFF_STAT_CELLS = 5;
4
+ /** One cell of the bar: whose it is, or nobody's. */
5
+ export type DiffStatCell = "added" | "removed" | "neutral";
6
+ /** The accessible name, built from the two counts as numbers (already normalised by `diffStatCount`). */
7
+ export type DiffStatFormat = (added: number, removed: number) => string;
8
+ /** "added 12345, removed 3" — the default accessible name; plain digits, so a speech engine reads one number. */
9
+ export declare const DEFAULT_DIFF_STAT_FORMAT: DiffStatFormat;
10
+ /**
11
+ * A count as the component takes it: a whole number, never below 0. Fractions are cut off,
12
+ * negative counts are 0, and so are NaN, `undefined` and ±Infinity (data that has not
13
+ * arrived yet, or arrived broken). The figures, the accessible name and the bar all use this
14
+ * one value, so they cannot disagree.
15
+ */
16
+ export declare function diffStatCount(value: number): number;
17
+ /**
18
+ * A count (as `diffStatCount` takes it) as digits, grouped by three with U+202F NARROW NO-BREAK SPACE ("1\u202f234"), the
19
+ * fraction dropped. The separator is fixed rather than taken from a locale on purpose: the
20
+ * server and the browser would group the same figure differently and break hydration. Pass
21
+ * `group` to an app that knows its reader's locale.
22
+ */
23
+ export declare function groupDiffStatCount(value: number): string;
24
+ /**
25
+ * Which cell belongs to which side (counts as `diffStatCount` takes them): each takes `floor(DIFF_STAT_CELLS * its share)`, so the
26
+ * cells the two sides leave over are neutral and 0 of 0 leaves all of them neutral. A side
27
+ * under a fifth of the change reaches no cell and shows in its figure only.
28
+ */
29
+ export declare function diffStatCells(added: number, removed: number): DiffStatCell[];
30
+ export interface DiffStatProps extends Omit<HTMLAttributes<HTMLSpanElement>, "role"> {
31
+ className?: string;
32
+ /** Lines added; the figure behind "+N". NaN, `undefined`, Infinity and negatives count as 0. */
33
+ added: number;
34
+ /** Lines removed; the figure behind "−M". NaN, `undefined`, Infinity and negatives count as 0. */
35
+ removed: number;
36
+ /** The five cells beside the figures. Shown by default, hidden in `compact`; set it either way. */
37
+ bar?: boolean;
38
+ /** The tab variant: smaller figures, and no bar unless `bar` asks for one. */
39
+ compact?: boolean;
40
+ /** How the accessible name is made from the two counts, as numbers: `DEFAULT_DIFF_STAT_FORMAT` unless given. */
41
+ format?: DiffStatFormat;
42
+ /** How each figure is written (it gets the count as `diffStatCount` takes it): `groupDiffStatCount` — three digits per group — unless given. */
43
+ group?: (value: number) => string;
44
+ /** Test id of the root `<span>`; `diff-stat` unless given. */
45
+ "data-testid"?: string;
46
+ }
47
+ /**
48
+ * How big a change is: "+N −M" with the two figures' counts, and a five-cell bar of the
49
+ * same proportions. One accessible name for the whole ("added N, removed M"), so the
50
+ * digits are not read twice; the bar is the theme's success and error, shaded toward the
51
+ * surface ink to stay readable as text.
52
+ */
53
+ export declare const DiffStat: React.ForwardRefExoticComponent<DiffStatProps & React.RefAttributes<HTMLSpanElement>>;
54
+ export default DiffStat;
@@ -0,0 +1,63 @@
1
+ import { jsxs as p, jsx as c } from "react/jsx-runtime";
2
+ import '../../../assets/styles/less/components/diffStat/diffStat.entry.css';import '../../../assets/styles/less/tokens.entry.css';/* empty css */
3
+ /* empty css */
4
+ import N from "react";
5
+ import h from "clsx";
6
+ const l = 5, T = " ", D = (t, a) => `added ${t}, removed ${a}`;
7
+ function d(t) {
8
+ return Number.isFinite(t) ? Math.max(0, Math.trunc(t)) : 0;
9
+ }
10
+ function R(t) {
11
+ return String(d(t)).replace(/\B(?=(\d{3})+(?!\d))/g, T);
12
+ }
13
+ function x(t, a) {
14
+ const f = d(t), r = d(a), s = f + r, n = (o, m) => Array.from({ length: o }, () => m);
15
+ if (s === 0) return n(l, "neutral");
16
+ const i = Math.floor(l * f / s), e = Math.floor(l * r / s);
17
+ return [
18
+ ...n(i, "added"),
19
+ ...n(e, "removed"),
20
+ ...n(l - i - e, "neutral")
21
+ ];
22
+ }
23
+ const E = N.forwardRef(function({
24
+ className: a,
25
+ added: f,
26
+ removed: r,
27
+ bar: s,
28
+ compact: n,
29
+ format: i = D,
30
+ group: e = R,
31
+ "aria-label": o,
32
+ "data-testid": m = "diff-stat",
33
+ ...w
34
+ }, S) {
35
+ const u = d(f), _ = d(r), C = s != null ? s : !n;
36
+ return /* @__PURE__ */ p(
37
+ "span",
38
+ {
39
+ ...w,
40
+ ref: S,
41
+ role: "img",
42
+ "aria-label": o != null ? o : i(u, _),
43
+ "data-testid": m,
44
+ className: h("smwb-diff-stat", { "smwb-diff-stat_compact": n }, a),
45
+ children: [
46
+ /* @__PURE__ */ p("span", { className: "smwb-diff-stat__text", "aria-hidden": "true", children: [
47
+ /* @__PURE__ */ c("span", { className: "smwb-diff-stat__added", children: `+${e(u)}` }),
48
+ /* @__PURE__ */ c("span", { className: "smwb-diff-stat__removed", children: `−${e(_)}` })
49
+ ] }),
50
+ C ? /* @__PURE__ */ c("span", { className: "smwb-diff-stat__bar", "aria-hidden": "true", children: x(u, _).map((A, F) => /* @__PURE__ */ c("span", { className: h("smwb-diff-stat__cell", `smwb-diff-stat__cell_${A}`) }, F)) }) : null
51
+ ]
52
+ }
53
+ );
54
+ });
55
+ export {
56
+ D as DEFAULT_DIFF_STAT_FORMAT,
57
+ l as DIFF_STAT_CELLS,
58
+ E as DiffStat,
59
+ x as diffStatCells,
60
+ d as diffStatCount,
61
+ R as groupDiffStatCount
62
+ };
63
+ //# sourceMappingURL=diffStat.js.map