@keboola/design 11.0.0 → 11.2.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 (670) hide show
  1. package/AGENTS.md +16 -1
  2. package/CHANGELOG.md +2138 -0
  3. package/COMPONENT-API.md +40 -1
  4. package/dist/AIKit-DiS0CVOW.js +1320 -0
  5. package/dist/AIKit-DiS0CVOW.js.map +1 -0
  6. package/dist/Alert-DfZq9kGe.js +133 -0
  7. package/dist/Alert-DfZq9kGe.js.map +1 -0
  8. package/dist/AlertModal-Dp_XuJBW.js +219 -0
  9. package/dist/AlertModal-Dp_XuJBW.js.map +1 -0
  10. package/dist/AppShell-B5GQN6Zs.js +143 -0
  11. package/dist/AppShell-B5GQN6Zs.js.map +1 -0
  12. package/dist/AutoSaveTextarea-BeuWuszr.js +58 -0
  13. package/dist/{chunk-UGT6DKWM.js.map → AutoSaveTextarea-BeuWuszr.js.map} +1 -1
  14. package/dist/Badge-Ch26CXoP.js +195 -0
  15. package/dist/Badge-Ch26CXoP.js.map +1 -0
  16. package/dist/BrandEditor-DyzgfVkl.js +903 -0
  17. package/dist/BrandEditor-DyzgfVkl.js.map +1 -0
  18. package/dist/BrandLogo-CJkRd0F8.js +46 -0
  19. package/dist/BrandLogo-CJkRd0F8.js.map +1 -0
  20. package/dist/Breadcrumb-Frst8MTA.js +330 -0
  21. package/dist/Breadcrumb-Frst8MTA.js.map +1 -0
  22. package/dist/Button-6xBX0nNl.js +391 -0
  23. package/dist/Button-6xBX0nNl.js.map +1 -0
  24. package/dist/Calendar-cG5NIJ4O.js +6768 -0
  25. package/dist/Calendar-cG5NIJ4O.js.map +1 -0
  26. package/dist/Card-BAoZ35CV.js +105 -0
  27. package/dist/Card-BAoZ35CV.js.map +1 -0
  28. package/dist/Checkbox-GJ8-srt4.js +97 -0
  29. package/dist/Checkbox-GJ8-srt4.js.map +1 -0
  30. package/dist/Clipboard-CBJZiviP.js +58 -0
  31. package/dist/Clipboard-CBJZiviP.js.map +1 -0
  32. package/dist/ClipboardButton-ClcluT0C.js +43 -0
  33. package/dist/ClipboardButton-ClcluT0C.js.map +1 -0
  34. package/dist/CodeEditor-DyaN-Ij2.js +1000 -0
  35. package/dist/CodeEditor-DyaN-Ij2.js.map +1 -0
  36. package/dist/Collapsible-BQXWEOBC.js +34 -0
  37. package/dist/Collapsible-BQXWEOBC.js.map +1 -0
  38. package/dist/ColorInput-B8z4j4Y_.js +180 -0
  39. package/dist/ColorInput-B8z4j4Y_.js.map +1 -0
  40. package/dist/ColorModeSwitch-dZFZyqy1.js +77 -0
  41. package/dist/ColorModeSwitch-dZFZyqy1.js.map +1 -0
  42. package/dist/Combobox-Dgm6Z4ib.js +443 -0
  43. package/dist/Combobox-Dgm6Z4ib.js.map +1 -0
  44. package/dist/Command-C0aZfVTq.js +102 -0
  45. package/dist/Command-C0aZfVTq.js.map +1 -0
  46. package/dist/CopyField-BJ96zvXs.js +322 -0
  47. package/dist/CopyField-BJ96zvXs.js.map +1 -0
  48. package/dist/DateInput-B3UdzRfW.js +141 -0
  49. package/dist/DateInput-B3UdzRfW.js.map +1 -0
  50. package/dist/DatePicker-Dw3DpbUh.js +24 -0
  51. package/dist/DatePicker-Dw3DpbUh.js.map +1 -0
  52. package/dist/DateRangeInput-DTuySEiq.js +139 -0
  53. package/dist/DateRangeInput-DTuySEiq.js.map +1 -0
  54. package/dist/DateRangePicker-DCmMHg4s.js +159 -0
  55. package/dist/DateRangePicker-DCmMHg4s.js.map +1 -0
  56. package/dist/DiagramSkeleton-lwBS2YBa.js +11 -0
  57. package/dist/DiagramSkeleton-lwBS2YBa.js.map +1 -0
  58. package/dist/DiffView-ppTIzh2h.js +429 -0
  59. package/dist/DiffView-ppTIzh2h.js.map +1 -0
  60. package/dist/DropdownMenu-t90tVw6l.js +327 -0
  61. package/dist/DropdownMenu-t90tVw6l.js.map +1 -0
  62. package/dist/FieldBox-D7DYtX_m.js +70 -0
  63. package/dist/FieldBox-D7DYtX_m.js.map +1 -0
  64. package/dist/FieldItem-CAPj9lj3.d.ts +111 -0
  65. package/dist/FieldItem-D-h1NeBo.js +108 -0
  66. package/dist/FieldItem-D-h1NeBo.js.map +1 -0
  67. package/dist/FileUpload-BRv0TaZk.js +2527 -0
  68. package/dist/FileUpload-BRv0TaZk.js.map +1 -0
  69. package/dist/Form-DHvcFoEi.js +311 -0
  70. package/dist/Form-DHvcFoEi.js.map +1 -0
  71. package/dist/FormGroup-C41n65cE.js +124 -0
  72. package/dist/FormGroup-C41n65cE.js.map +1 -0
  73. package/dist/FullScreenModal-Cb3PGgh4.js +96 -0
  74. package/dist/FullScreenModal-Cb3PGgh4.js.map +1 -0
  75. package/dist/HoverCard-WfDkLK1s.js +31 -0
  76. package/dist/HoverCard-WfDkLK1s.js.map +1 -0
  77. package/dist/InputGroup-CdTq8H7c.js +292 -0
  78. package/dist/InputGroup-CdTq8H7c.js.map +1 -0
  79. package/dist/Kbd-CxHAo1oo.js +111 -0
  80. package/dist/Kbd-CxHAo1oo.js.map +1 -0
  81. package/dist/MarkedText-Ckbft5mw.js +44 -0
  82. package/dist/MarkedText-Ckbft5mw.js.map +1 -0
  83. package/dist/MermaidDiagram-ChL3WIQT.js +399 -0
  84. package/dist/MermaidDiagram-ChL3WIQT.js.map +1 -0
  85. package/dist/Modal-wqG8nJiK.js +185 -0
  86. package/dist/Modal-wqG8nJiK.js.map +1 -0
  87. package/dist/ModalTitle-C76ke2eo.js +28 -0
  88. package/dist/ModalTitle-C76ke2eo.js.map +1 -0
  89. package/dist/MultiActionButtonGroup-BiIIubiL.js +33 -0
  90. package/dist/MultiActionButtonGroup-BiIIubiL.js.map +1 -0
  91. package/dist/Navbar-BfaPeLUL.js +325 -0
  92. package/dist/Navbar-BfaPeLUL.js.map +1 -0
  93. package/dist/OtpInput-CbbymqYs.js +93 -0
  94. package/dist/OtpInput-CbbymqYs.js.map +1 -0
  95. package/dist/PageHeader-Q3IpCnQd.js +177 -0
  96. package/dist/PageHeader-Q3IpCnQd.js.map +1 -0
  97. package/dist/PageLayout-DSVM-ASz.js +176 -0
  98. package/dist/PageLayout-DSVM-ASz.js.map +1 -0
  99. package/dist/PageToolbar-OQg3mPF-.js +153 -0
  100. package/dist/PageToolbar-OQg3mPF-.js.map +1 -0
  101. package/dist/Pagination-Cjfda8KG.js +70 -0
  102. package/dist/Pagination-Cjfda8KG.js.map +1 -0
  103. package/dist/Popconfirm-D7_vfxFd.js +167 -0
  104. package/dist/Popconfirm-D7_vfxFd.js.map +1 -0
  105. package/dist/Popover-CzeHjvrB.js +85 -0
  106. package/dist/Popover-CzeHjvrB.js.map +1 -0
  107. package/dist/RadioGroup-sIveSsNa.js +233 -0
  108. package/dist/RadioGroup-sIveSsNa.js.map +1 -0
  109. package/dist/Resizable-D3vYToZH.js +52 -0
  110. package/dist/Resizable-D3vYToZH.js.map +1 -0
  111. package/dist/Search-3UiqNZRj.js +184 -0
  112. package/dist/Search-3UiqNZRj.js.map +1 -0
  113. package/dist/SearchInput-C7dF_Ir-.js +102 -0
  114. package/dist/SearchInput-C7dF_Ir-.js.map +1 -0
  115. package/dist/SectionNav-8NoTOKO8.js +276 -0
  116. package/dist/SectionNav-8NoTOKO8.js.map +1 -0
  117. package/dist/Select-Is0VkePH.js +181 -0
  118. package/dist/Select-Is0VkePH.js.map +1 -0
  119. package/dist/Sheet-Dw9BDvjI.js +169 -0
  120. package/dist/Sheet-Dw9BDvjI.js.map +1 -0
  121. package/dist/Sidebar-Dcb4rinA.js +799 -0
  122. package/dist/Sidebar-Dcb4rinA.js.map +1 -0
  123. package/dist/Slider-BOPfMOMm.js +127 -0
  124. package/dist/Slider-BOPfMOMm.js.map +1 -0
  125. package/dist/Stepper-C8sm9ZFM.js +325 -0
  126. package/dist/Stepper-C8sm9ZFM.js.map +1 -0
  127. package/dist/Switch-CX2A0v50.js +201 -0
  128. package/dist/Switch-CX2A0v50.js.map +1 -0
  129. package/dist/Table-CvYuTuNU.js +104 -0
  130. package/dist/Table-CvYuTuNU.js.map +1 -0
  131. package/dist/Tabs-UMQuDoW8.js +74 -0
  132. package/dist/Tabs-UMQuDoW8.js.map +1 -0
  133. package/dist/TextInput-CMuN1WfY.js +110 -0
  134. package/dist/TextInput-CMuN1WfY.js.map +1 -0
  135. package/dist/ThemeProvider-QncUrfJn.js +203 -0
  136. package/dist/ThemeProvider-QncUrfJn.js.map +1 -0
  137. package/dist/TimePicker-D9zktB8A.js +98 -0
  138. package/dist/TimePicker-D9zktB8A.js.map +1 -0
  139. package/dist/Timeline-6btyJl4D.js +154 -0
  140. package/dist/Timeline-6btyJl4D.js.map +1 -0
  141. package/dist/Toast-DQSbs3oA.js +49 -0
  142. package/dist/Toast-DQSbs3oA.js.map +1 -0
  143. package/dist/ToggleGroup-Cy_10Mvu.js +47 -0
  144. package/dist/ToggleGroup-Cy_10Mvu.js.map +1 -0
  145. package/dist/Workbench-BzE-Vvd9.js +293 -0
  146. package/dist/Workbench-BzE-Vvd9.js.map +1 -0
  147. package/dist/ZoomableSvg-CZEu6sAq.js +248 -0
  148. package/dist/ZoomableSvg-CZEu6sAq.js.map +1 -0
  149. package/dist/charts.d.ts +110 -103
  150. package/dist/charts.js +303 -254
  151. package/dist/charts.js.map +1 -1
  152. package/dist/classNames-BzrkDnOD.js +9 -0
  153. package/dist/classNames-BzrkDnOD.js.map +1 -0
  154. package/dist/context-KxxeMHbR.js +62 -0
  155. package/dist/context-KxxeMHbR.js.map +1 -0
  156. package/dist/editors.d.ts +244 -175
  157. package/dist/editors.js +802 -428
  158. package/dist/editors.js.map +1 -1
  159. package/dist/escapeStringRegexp-8MxP2knR.js +6 -0
  160. package/dist/escapeStringRegexp-8MxP2knR.js.map +1 -0
  161. package/dist/icons-Cek151jC.js +640 -0
  162. package/dist/icons-Cek151jC.js.map +1 -0
  163. package/dist/icons.d.ts +2 -41
  164. package/dist/icons.js +2 -9
  165. package/dist/index-m-kQEWiY.d.ts +54 -0
  166. package/dist/index.d.ts +6191 -9891
  167. package/dist/index.js +113 -124
  168. package/dist/internal/blocks/AIKit.js +2 -30
  169. package/dist/internal/blocks/AppShell.js +2 -11
  170. package/dist/internal/blocks/AutoSaveTextarea.js +2 -14
  171. package/dist/internal/blocks/BrandEditor.js +2 -23
  172. package/dist/internal/blocks/ChartPanel.js +45 -9
  173. package/dist/internal/blocks/ChartPanel.js.map +1 -1
  174. package/dist/internal/blocks/ClipboardButton.js +2 -12
  175. package/dist/internal/blocks/ColorInput.js +2 -13
  176. package/dist/internal/blocks/ColorModeSwitch.js +2 -13
  177. package/dist/internal/blocks/Command.js +2 -15
  178. package/dist/internal/blocks/CopyField.js +2 -11
  179. package/dist/internal/blocks/DashboardHero.js +58 -8
  180. package/dist/internal/blocks/DashboardHero.js.map +1 -1
  181. package/dist/internal/blocks/DateInput.js +2 -16
  182. package/dist/internal/blocks/DateRangeInput.js +2 -16
  183. package/dist/internal/blocks/EmptyConfigurationActionCard.js +15 -9
  184. package/dist/internal/blocks/EmptyConfigurationActionCard.js.map +1 -1
  185. package/dist/internal/blocks/EmptyState.js +141 -3
  186. package/dist/internal/blocks/EmptyState.js.map +1 -1
  187. package/dist/internal/blocks/ErrorState.js +178 -4
  188. package/dist/internal/blocks/ErrorState.js.map +1 -1
  189. package/dist/internal/blocks/ExportMenu.js +40 -12
  190. package/dist/internal/blocks/ExportMenu.js.map +1 -1
  191. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +56 -0
  192. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js.map +1 -0
  193. package/dist/internal/blocks/Form.js +2 -29
  194. package/dist/internal/blocks/FormGroup.js +2 -18
  195. package/dist/internal/blocks/GoogleButton.js +94 -9
  196. package/dist/internal/blocks/GoogleButton.js.map +1 -1
  197. package/dist/internal/blocks/MicrosoftButton.js +63 -9
  198. package/dist/internal/blocks/MicrosoftButton.js.map +1 -1
  199. package/dist/internal/blocks/MultiActionButtonGroup.js +2 -12
  200. package/dist/internal/blocks/MultiCombobox.js +192 -13
  201. package/dist/internal/blocks/MultiCombobox.js.map +1 -1
  202. package/dist/internal/blocks/NumberInput.js +43 -11
  203. package/dist/internal/blocks/NumberInput.js.map +1 -1
  204. package/dist/internal/blocks/OtpInput.js +2 -10
  205. package/dist/internal/blocks/PageHeader.js +2 -9
  206. package/dist/internal/blocks/PageLayout.js +2 -9
  207. package/dist/internal/blocks/PageToolbar.js +2 -13
  208. package/dist/internal/blocks/PasswordInput.js +96 -12
  209. package/dist/internal/blocks/PasswordInput.js.map +1 -1
  210. package/dist/internal/blocks/SearchInput.js +2 -12
  211. package/dist/internal/blocks/SearchInputWithNavigation.js +64 -15
  212. package/dist/internal/blocks/SearchInputWithNavigation.js.map +1 -1
  213. package/dist/internal/blocks/SectionNav.js +2 -15
  214. package/dist/internal/blocks/SplitButton.js +45 -13
  215. package/dist/internal/blocks/SplitButton.js.map +1 -1
  216. package/dist/internal/blocks/StatCard.js +96 -9
  217. package/dist/internal/blocks/StatCard.js.map +1 -1
  218. package/dist/internal/blocks/TextInput.js +2 -13
  219. package/dist/internal/blocks/Textarea.js +31 -12
  220. package/dist/internal/blocks/Textarea.js.map +1 -1
  221. package/dist/internal/blocks/TimeInput.js +76 -16
  222. package/dist/internal/blocks/TimeInput.js.map +1 -1
  223. package/dist/internal/components/Alert.js +2 -11
  224. package/dist/internal/components/AlertModal.js +2 -11
  225. package/dist/internal/components/Avatar.js +52 -8
  226. package/dist/internal/components/Avatar.js.map +1 -1
  227. package/dist/internal/components/Badge.js +2 -9
  228. package/dist/internal/components/BrandLogo.js +2 -11
  229. package/dist/internal/components/Breadcrumb.js +2 -14
  230. package/dist/internal/components/Button.js +2 -10
  231. package/dist/internal/components/ButtonGroup.js +65 -8
  232. package/dist/internal/components/ButtonGroup.js.map +1 -1
  233. package/dist/internal/components/Calendar.js +2 -9
  234. package/dist/internal/components/Card.js +2 -9
  235. package/dist/internal/components/Checkbox.js +2 -11
  236. package/dist/internal/components/Clipboard.js +2 -9
  237. package/dist/internal/components/Collapsible.js +2 -9
  238. package/dist/internal/components/CollapsiblePanel.js +86 -10
  239. package/dist/internal/components/CollapsiblePanel.js.map +1 -1
  240. package/dist/internal/components/Combobox.js +2 -13
  241. package/dist/internal/components/DatePicker.js +2 -11
  242. package/dist/internal/components/DateRangePicker.js +2 -17
  243. package/dist/internal/components/DiffView.js +2 -9
  244. package/dist/internal/components/DotsLoader.js +17 -4
  245. package/dist/internal/components/DotsLoader.js.map +1 -1
  246. package/dist/internal/components/DropdownMenu.js +2 -11
  247. package/dist/internal/components/EmptySearchContent.js +11 -3
  248. package/dist/internal/components/EmptySearchContent.js.map +1 -1
  249. package/dist/internal/components/FileUpload.js +2 -11
  250. package/dist/internal/components/FullScreenModal.js +2 -12
  251. package/dist/internal/components/HelpBlock.js +24 -3
  252. package/dist/internal/components/HelpBlock.js.map +1 -1
  253. package/dist/internal/components/HoverCard.js +2 -9
  254. package/dist/internal/components/InputGroup.js +2 -11
  255. package/dist/internal/components/Kbd.js +2 -9
  256. package/dist/internal/components/Label.js +38 -8
  257. package/dist/internal/components/Label.js.map +1 -1
  258. package/dist/internal/components/Link.js +21 -8
  259. package/dist/internal/components/Link.js.map +1 -1
  260. package/dist/internal/components/MarkedText.js +2 -5
  261. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +19 -9
  262. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js.map +1 -1
  263. package/dist/internal/components/MergeEditor/PaneHeader.js +12 -3
  264. package/dist/internal/components/MergeEditor/PaneHeader.js.map +1 -1
  265. package/dist/internal/components/MergeEditor/constants.js +17 -3
  266. package/dist/internal/components/MergeEditor/constants.js.map +1 -1
  267. package/dist/internal/components/MergeEditor/useMergeDiff.js +2 -5
  268. package/dist/internal/components/Modal.js +2 -13
  269. package/dist/internal/components/Navbar.js +2 -14
  270. package/dist/internal/components/Pagination.js +2 -11
  271. package/dist/internal/components/PanelWithDetails.js +30 -10
  272. package/dist/internal/components/PanelWithDetails.js.map +1 -1
  273. package/dist/internal/components/Popconfirm.js +2 -12
  274. package/dist/internal/components/Popover.js +2 -9
  275. package/dist/internal/components/Progress.js +46 -8
  276. package/dist/internal/components/Progress.js.map +1 -1
  277. package/dist/internal/components/RadioGroup.js +2 -12
  278. package/dist/internal/components/Resizable.js +2 -9
  279. package/dist/internal/components/ScrollArea.js +41 -8
  280. package/dist/internal/components/ScrollArea.js.map +1 -1
  281. package/dist/internal/components/Search.js +2 -10
  282. package/dist/internal/components/Select.js +2 -12
  283. package/dist/internal/components/Separator.js +83 -8
  284. package/dist/internal/components/Separator.js.map +1 -1
  285. package/dist/internal/components/Sheet.js +2 -12
  286. package/dist/internal/components/Sidebar.js +2 -20
  287. package/dist/internal/components/Skeleton/Skeleton.js +38 -8
  288. package/dist/internal/components/Skeleton/Skeleton.js.map +1 -1
  289. package/dist/internal/components/Skeleton/SkeletonList.js +40 -9
  290. package/dist/internal/components/Skeleton/SkeletonList.js.map +1 -1
  291. package/dist/internal/components/Slider.js +2 -11
  292. package/dist/internal/components/SpotlightBackdrop.js +131 -8
  293. package/dist/internal/components/SpotlightBackdrop.js.map +1 -1
  294. package/dist/internal/components/Stepper.js +2 -10
  295. package/dist/internal/components/Switch.js +2 -10
  296. package/dist/internal/components/Table.js +2 -10
  297. package/dist/internal/components/Tabs.js +2 -12
  298. package/dist/internal/components/ThemeProvider.js +3 -10
  299. package/dist/internal/components/TimePicker.js +2 -12
  300. package/dist/internal/components/Timeline.js +2 -10
  301. package/dist/internal/components/Toast.js +3 -11
  302. package/dist/internal/components/Toggle.js +168 -8
  303. package/dist/internal/components/Toggle.js.map +1 -1
  304. package/dist/internal/components/ToggleGroup.js +2 -9
  305. package/dist/internal/components/Tooltip.js +2 -8
  306. package/dist/internal/components/Truncated.js +44 -8
  307. package/dist/internal/components/Truncated.js.map +1 -1
  308. package/dist/internal/components/Workbench.js +2 -11
  309. package/dist/internal/components/ZoomableSvg.js +2 -13
  310. package/dist/internal/hooks/useAutosizeInput.js +76 -3
  311. package/dist/internal/hooks/useAutosizeInput.js.map +1 -1
  312. package/dist/internal/hooks/useScrollbarPosition.js +44 -4
  313. package/dist/internal/hooks/useScrollbarPosition.js.map +1 -1
  314. package/dist/internal/hooks/useStableCallback.js +28 -3
  315. package/dist/internal/hooks/useStableCallback.js.map +1 -1
  316. package/dist/internal/utils/mergeRefs.js +19 -3
  317. package/dist/internal/utils/mergeRefs.js.map +1 -1
  318. package/dist/internal/utils.js +5 -8
  319. package/dist/markdown-editor.d.ts +72 -72
  320. package/dist/markdown-editor.js +1122 -1207
  321. package/dist/markdown-editor.js.map +1 -1
  322. package/dist/mermaid.d.ts +12 -12
  323. package/dist/mermaid.js +2 -18
  324. package/dist/rjsf.d.ts +45 -34
  325. package/dist/rjsf.js +1601 -1671
  326. package/dist/rjsf.js.map +1 -1
  327. package/dist/rolldown-runtime-Bdc48AWt.js +33 -0
  328. package/dist/styles-DSUP_-9Z.js +158 -0
  329. package/dist/styles-DSUP_-9Z.js.map +1 -0
  330. package/dist/styles.css +1 -1
  331. package/dist/testing.d.ts +8 -7
  332. package/dist/testing.js +36 -21
  333. package/dist/testing.js.map +1 -1
  334. package/dist/themeTokens-BNg98Mu9.js +85 -0
  335. package/dist/themeTokens-BNg98Mu9.js.map +1 -0
  336. package/dist/toast-CjkURw0M.js +184 -0
  337. package/dist/toast-CjkURw0M.js.map +1 -0
  338. package/dist/useColorSchemeState-CYqcUfSH.js +61 -0
  339. package/dist/useColorSchemeState-CYqcUfSH.js.map +1 -0
  340. package/dist/useControllableState-M6494mCT.js +31 -0
  341. package/dist/useControllableState-M6494mCT.js.map +1 -0
  342. package/dist/useElement-DkF6esWL.js +15 -0
  343. package/dist/useElement-DkF6esWL.js.map +1 -0
  344. package/dist/useMergeDiff-CvowEXJ1.js +465 -0
  345. package/dist/useMergeDiff-CvowEXJ1.js.map +1 -0
  346. package/dist/utils-D0c5VAyF.js +308 -0
  347. package/dist/utils-D0c5VAyF.js.map +1 -0
  348. package/package.json +11 -10
  349. package/dist/MermaidDiagram-ZU5KAVRT.js +0 -18
  350. package/dist/MermaidDiagram-ZU5KAVRT.js.map +0 -1
  351. package/dist/chunk-2YYJDKSP.js +0 -51
  352. package/dist/chunk-2YYJDKSP.js.map +0 -1
  353. package/dist/chunk-3P5UUCFI.js +0 -385
  354. package/dist/chunk-3P5UUCFI.js.map +0 -1
  355. package/dist/chunk-3QDFDDWZ.js +0 -99
  356. package/dist/chunk-3QDFDDWZ.js.map +0 -1
  357. package/dist/chunk-3W27OLK5.js +0 -15
  358. package/dist/chunk-3W27OLK5.js.map +0 -1
  359. package/dist/chunk-4FIZZONW.js +0 -40
  360. package/dist/chunk-4FIZZONW.js.map +0 -1
  361. package/dist/chunk-4GIAXOJG.js +0 -133
  362. package/dist/chunk-4GIAXOJG.js.map +0 -1
  363. package/dist/chunk-52NDNMK7.js +0 -99
  364. package/dist/chunk-52NDNMK7.js.map +0 -1
  365. package/dist/chunk-576G5OES.js +0 -201
  366. package/dist/chunk-576G5OES.js.map +0 -1
  367. package/dist/chunk-5AIE6SET.js +0 -659
  368. package/dist/chunk-5AIE6SET.js.map +0 -1
  369. package/dist/chunk-5FTNAZRW.js +0 -327
  370. package/dist/chunk-5FTNAZRW.js.map +0 -1
  371. package/dist/chunk-5IG2S7ZY.js +0 -70
  372. package/dist/chunk-5IG2S7ZY.js.map +0 -1
  373. package/dist/chunk-5QCXHNCW.js +0 -404
  374. package/dist/chunk-5QCXHNCW.js.map +0 -1
  375. package/dist/chunk-6DUMGC7Y.js +0 -105
  376. package/dist/chunk-6DUMGC7Y.js.map +0 -1
  377. package/dist/chunk-6J25CVST.js +0 -174
  378. package/dist/chunk-6J25CVST.js.map +0 -1
  379. package/dist/chunk-6NN35XOP.js +0 -120
  380. package/dist/chunk-6NN35XOP.js.map +0 -1
  381. package/dist/chunk-6NZBVA4T.js +0 -24
  382. package/dist/chunk-6NZBVA4T.js.map +0 -1
  383. package/dist/chunk-6W5BHRCL.js +0 -295
  384. package/dist/chunk-6W5BHRCL.js.map +0 -1
  385. package/dist/chunk-72BKRCEG.js +0 -409
  386. package/dist/chunk-72BKRCEG.js.map +0 -1
  387. package/dist/chunk-7GTI3PPI.js +0 -95
  388. package/dist/chunk-7GTI3PPI.js.map +0 -1
  389. package/dist/chunk-7P6PLZ4B.js +0 -74
  390. package/dist/chunk-7P6PLZ4B.js.map +0 -1
  391. package/dist/chunk-7WZWY5IA.js +0 -46
  392. package/dist/chunk-7WZWY5IA.js.map +0 -1
  393. package/dist/chunk-AIYO2632.js +0 -489
  394. package/dist/chunk-AIYO2632.js.map +0 -1
  395. package/dist/chunk-ANFZWPNE.js +0 -112
  396. package/dist/chunk-ANFZWPNE.js.map +0 -1
  397. package/dist/chunk-ANZTVAJU.js +0 -73
  398. package/dist/chunk-ANZTVAJU.js.map +0 -1
  399. package/dist/chunk-BD5BTJKX.js +0 -166
  400. package/dist/chunk-BD5BTJKX.js.map +0 -1
  401. package/dist/chunk-BHGIDSRJ.js +0 -140
  402. package/dist/chunk-BHGIDSRJ.js.map +0 -1
  403. package/dist/chunk-BSQWZITZ.js +0 -507
  404. package/dist/chunk-BSQWZITZ.js.map +0 -1
  405. package/dist/chunk-D3LAIK62.js +0 -23
  406. package/dist/chunk-D3LAIK62.js.map +0 -1
  407. package/dist/chunk-DODCR43C.js +0 -155
  408. package/dist/chunk-DODCR43C.js.map +0 -1
  409. package/dist/chunk-EEK5NGZF.js +0 -40
  410. package/dist/chunk-EEK5NGZF.js.map +0 -1
  411. package/dist/chunk-ENRG7TXA.js +0 -11
  412. package/dist/chunk-ENRG7TXA.js.map +0 -1
  413. package/dist/chunk-EQRMGIGY.js +0 -239
  414. package/dist/chunk-EQRMGIGY.js.map +0 -1
  415. package/dist/chunk-ERAHK5YQ.js +0 -495
  416. package/dist/chunk-ERAHK5YQ.js.map +0 -1
  417. package/dist/chunk-F3FOFY2P.js +0 -124
  418. package/dist/chunk-F3FOFY2P.js.map +0 -1
  419. package/dist/chunk-F6BTWFOC.js +0 -507
  420. package/dist/chunk-F6BTWFOC.js.map +0 -1
  421. package/dist/chunk-F6J6NNAL.js +0 -34
  422. package/dist/chunk-F6J6NNAL.js.map +0 -1
  423. package/dist/chunk-FCHJ7D5O.js +0 -59
  424. package/dist/chunk-FCHJ7D5O.js.map +0 -1
  425. package/dist/chunk-FFJTEQCC.js +0 -80
  426. package/dist/chunk-FFJTEQCC.js.map +0 -1
  427. package/dist/chunk-FUFMVW7O.js +0 -64
  428. package/dist/chunk-FUFMVW7O.js.map +0 -1
  429. package/dist/chunk-FVPGQ6UE.js +0 -25
  430. package/dist/chunk-FVPGQ6UE.js.map +0 -1
  431. package/dist/chunk-G3PMV62Z.js +0 -33
  432. package/dist/chunk-G3PMV62Z.js.map +0 -1
  433. package/dist/chunk-GACFOW3E.js +0 -51
  434. package/dist/chunk-GACFOW3E.js.map +0 -1
  435. package/dist/chunk-GDT6HQMK.js +0 -42
  436. package/dist/chunk-GDT6HQMK.js.map +0 -1
  437. package/dist/chunk-HLGU22C6.js +0 -2589
  438. package/dist/chunk-HLGU22C6.js.map +0 -1
  439. package/dist/chunk-HPMYYGP7.js +0 -134
  440. package/dist/chunk-HPMYYGP7.js.map +0 -1
  441. package/dist/chunk-I2UCOD45.js +0 -197
  442. package/dist/chunk-I2UCOD45.js.map +0 -1
  443. package/dist/chunk-IEGDZUVM.js +0 -75
  444. package/dist/chunk-IEGDZUVM.js.map +0 -1
  445. package/dist/chunk-IIS7INHF.js +0 -47
  446. package/dist/chunk-IIS7INHF.js.map +0 -1
  447. package/dist/chunk-ITELSEFU.js +0 -256
  448. package/dist/chunk-ITELSEFU.js.map +0 -1
  449. package/dist/chunk-IXAYNBOY.js +0 -407
  450. package/dist/chunk-IXAYNBOY.js.map +0 -1
  451. package/dist/chunk-JUW2ETEI.js +0 -191
  452. package/dist/chunk-JUW2ETEI.js.map +0 -1
  453. package/dist/chunk-K65C7CVE.js +0 -127
  454. package/dist/chunk-K65C7CVE.js.map +0 -1
  455. package/dist/chunk-KDI64MCY.js +0 -189
  456. package/dist/chunk-KDI64MCY.js.map +0 -1
  457. package/dist/chunk-KN4ASMH5.js +0 -160
  458. package/dist/chunk-KN4ASMH5.js.map +0 -1
  459. package/dist/chunk-KQW7QNTU.js +0 -1549
  460. package/dist/chunk-KQW7QNTU.js.map +0 -1
  461. package/dist/chunk-KR7NXXHC.js +0 -66
  462. package/dist/chunk-KR7NXXHC.js.map +0 -1
  463. package/dist/chunk-KRZKIVMA.js +0 -142
  464. package/dist/chunk-KRZKIVMA.js.map +0 -1
  465. package/dist/chunk-KTTLLKGQ.js +0 -185
  466. package/dist/chunk-KTTLLKGQ.js.map +0 -1
  467. package/dist/chunk-KWKSHPDP.js +0 -234
  468. package/dist/chunk-KWKSHPDP.js.map +0 -1
  469. package/dist/chunk-KZVC7OYG.js +0 -57
  470. package/dist/chunk-KZVC7OYG.js.map +0 -1
  471. package/dist/chunk-L5DHUN2V.js +0 -204
  472. package/dist/chunk-L5DHUN2V.js.map +0 -1
  473. package/dist/chunk-LCTGEH57.js +0 -1376
  474. package/dist/chunk-LCTGEH57.js.map +0 -1
  475. package/dist/chunk-LXLIQ2D6.js +0 -12
  476. package/dist/chunk-LXLIQ2D6.js.map +0 -1
  477. package/dist/chunk-M4CTURKX.js +0 -84
  478. package/dist/chunk-M4CTURKX.js.map +0 -1
  479. package/dist/chunk-M6LTUPVP.js +0 -301
  480. package/dist/chunk-M6LTUPVP.js.map +0 -1
  481. package/dist/chunk-MA6RRHDT.js +0 -291
  482. package/dist/chunk-MA6RRHDT.js.map +0 -1
  483. package/dist/chunk-MODE4QIA.js +0 -6
  484. package/dist/chunk-MODE4QIA.js.map +0 -1
  485. package/dist/chunk-MVILMVGG.js +0 -118
  486. package/dist/chunk-MVILMVGG.js.map +0 -1
  487. package/dist/chunk-MWS4VCLV.js +0 -17
  488. package/dist/chunk-MWS4VCLV.js.map +0 -1
  489. package/dist/chunk-NEUX74SO.js +0 -315
  490. package/dist/chunk-NEUX74SO.js.map +0 -1
  491. package/dist/chunk-NFHKYBRD.js +0 -156
  492. package/dist/chunk-NFHKYBRD.js.map +0 -1
  493. package/dist/chunk-NHJNNXD3.js +0 -89
  494. package/dist/chunk-NHJNNXD3.js.map +0 -1
  495. package/dist/chunk-O2BF3HZL.js +0 -33
  496. package/dist/chunk-O2BF3HZL.js.map +0 -1
  497. package/dist/chunk-OANXCZYD.js +0 -212
  498. package/dist/chunk-OANXCZYD.js.map +0 -1
  499. package/dist/chunk-ODJF7YIP.js +0 -230
  500. package/dist/chunk-ODJF7YIP.js.map +0 -1
  501. package/dist/chunk-ON4BJTHI.js +0 -101
  502. package/dist/chunk-ON4BJTHI.js.map +0 -1
  503. package/dist/chunk-OTL5WXIJ.js +0 -16
  504. package/dist/chunk-OTL5WXIJ.js.map +0 -1
  505. package/dist/chunk-PACNBKJV.js +0 -47
  506. package/dist/chunk-PACNBKJV.js.map +0 -1
  507. package/dist/chunk-PROCA7K7.js +0 -23
  508. package/dist/chunk-PROCA7K7.js.map +0 -1
  509. package/dist/chunk-QGMIPA67.js +0 -85
  510. package/dist/chunk-QGMIPA67.js.map +0 -1
  511. package/dist/chunk-QQA37LFB.js +0 -190
  512. package/dist/chunk-QQA37LFB.js.map +0 -1
  513. package/dist/chunk-QZAWRSEB.js +0 -61
  514. package/dist/chunk-QZAWRSEB.js.map +0 -1
  515. package/dist/chunk-R74KGWNS.js +0 -699
  516. package/dist/chunk-R74KGWNS.js.map +0 -1
  517. package/dist/chunk-RFDLHMKL.js +0 -110
  518. package/dist/chunk-RFDLHMKL.js.map +0 -1
  519. package/dist/chunk-RL64HN7S.js +0 -40
  520. package/dist/chunk-RL64HN7S.js.map +0 -1
  521. package/dist/chunk-RMRQKPL7.js +0 -115
  522. package/dist/chunk-RMRQKPL7.js.map +0 -1
  523. package/dist/chunk-RQVK4IYC.js +0 -606
  524. package/dist/chunk-RQVK4IYC.js.map +0 -1
  525. package/dist/chunk-RTW56PWZ.js +0 -59
  526. package/dist/chunk-RTW56PWZ.js.map +0 -1
  527. package/dist/chunk-RUTPQNLR.js +0 -266
  528. package/dist/chunk-RUTPQNLR.js.map +0 -1
  529. package/dist/chunk-S6TAF63G.js +0 -25
  530. package/dist/chunk-S6TAF63G.js.map +0 -1
  531. package/dist/chunk-SBGAUGXY.js +0 -224
  532. package/dist/chunk-SBGAUGXY.js.map +0 -1
  533. package/dist/chunk-SC275NHZ.js +0 -407
  534. package/dist/chunk-SC275NHZ.js.map +0 -1
  535. package/dist/chunk-SCQPU4UE.js +0 -97
  536. package/dist/chunk-SCQPU4UE.js.map +0 -1
  537. package/dist/chunk-SFFF2WQP.js +0 -8
  538. package/dist/chunk-SFFF2WQP.js.map +0 -1
  539. package/dist/chunk-SJYMHZKA.js +0 -36
  540. package/dist/chunk-SJYMHZKA.js.map +0 -1
  541. package/dist/chunk-SLCCUJVN.js +0 -125
  542. package/dist/chunk-SLCCUJVN.js.map +0 -1
  543. package/dist/chunk-SVBSNSD4.js +0 -259
  544. package/dist/chunk-SVBSNSD4.js.map +0 -1
  545. package/dist/chunk-SVPLTL35.js +0 -62
  546. package/dist/chunk-SVPLTL35.js.map +0 -1
  547. package/dist/chunk-SWQFYNYG.js +0 -338
  548. package/dist/chunk-SWQFYNYG.js.map +0 -1
  549. package/dist/chunk-THHB4EWS.js +0 -72
  550. package/dist/chunk-THHB4EWS.js.map +0 -1
  551. package/dist/chunk-TUCDD33E.js +0 -246
  552. package/dist/chunk-TUCDD33E.js.map +0 -1
  553. package/dist/chunk-TV4WAP2R.js +0 -14
  554. package/dist/chunk-TV4WAP2R.js.map +0 -1
  555. package/dist/chunk-U3A6YBTZ.js +0 -134
  556. package/dist/chunk-U3A6YBTZ.js.map +0 -1
  557. package/dist/chunk-UGT6DKWM.js +0 -95
  558. package/dist/chunk-VSERHUWD.js +0 -212
  559. package/dist/chunk-VSERHUWD.js.map +0 -1
  560. package/dist/chunk-VYG7BDXC.js +0 -49
  561. package/dist/chunk-VYG7BDXC.js.map +0 -1
  562. package/dist/chunk-WETKNYZX.js +0 -52
  563. package/dist/chunk-WETKNYZX.js.map +0 -1
  564. package/dist/chunk-WGG4AML3.js +0 -216
  565. package/dist/chunk-WGG4AML3.js.map +0 -1
  566. package/dist/chunk-WKAUEL6I.js +0 -30
  567. package/dist/chunk-WKAUEL6I.js.map +0 -1
  568. package/dist/chunk-WPOLA5CG.js +0 -81
  569. package/dist/chunk-WPOLA5CG.js.map +0 -1
  570. package/dist/chunk-WPVETCGJ.js +0 -254
  571. package/dist/chunk-WPVETCGJ.js.map +0 -1
  572. package/dist/chunk-WTSM3A7E.js +0 -13
  573. package/dist/chunk-WTSM3A7E.js.map +0 -1
  574. package/dist/chunk-WU3F2K3T.js +0 -148
  575. package/dist/chunk-WU3F2K3T.js.map +0 -1
  576. package/dist/chunk-WZZK2DTZ.js +0 -39
  577. package/dist/chunk-WZZK2DTZ.js.map +0 -1
  578. package/dist/chunk-X4IHLKRD.js +0 -42
  579. package/dist/chunk-X4IHLKRD.js.map +0 -1
  580. package/dist/chunk-XAHEXZJC.js +0 -80
  581. package/dist/chunk-XAHEXZJC.js.map +0 -1
  582. package/dist/chunk-XCYGJDUX.js +0 -31
  583. package/dist/chunk-XCYGJDUX.js.map +0 -1
  584. package/dist/chunk-Y4W3JORC.js +0 -104
  585. package/dist/chunk-Y4W3JORC.js.map +0 -1
  586. package/dist/chunk-YFZJ3ZLG.js +0 -1297
  587. package/dist/chunk-YFZJ3ZLG.js.map +0 -1
  588. package/dist/chunk-YI3WLXEN.js +0 -4387
  589. package/dist/chunk-YI3WLXEN.js.map +0 -1
  590. package/dist/chunk-ZBKFSPD3.js +0 -29
  591. package/dist/chunk-ZBKFSPD3.js.map +0 -1
  592. package/dist/chunk-ZOERRQ6A.js +0 -79
  593. package/dist/chunk-ZOERRQ6A.js.map +0 -1
  594. package/dist/chunk-ZSTGUKHU.js +0 -10
  595. package/dist/chunk-ZSTGUKHU.js.map +0 -1
  596. package/dist/chunk-ZUEHDL27.js +0 -65
  597. package/dist/chunk-ZUEHDL27.js.map +0 -1
  598. package/dist/constants-D3gaMY-W.d.ts +0 -39
  599. package/dist/icons.js.map +0 -1
  600. package/dist/index.js.map +0 -1
  601. package/dist/internal/blocks/AIKit.js.map +0 -1
  602. package/dist/internal/blocks/AppShell.js.map +0 -1
  603. package/dist/internal/blocks/AutoSaveTextarea.js.map +0 -1
  604. package/dist/internal/blocks/BrandEditor.js.map +0 -1
  605. package/dist/internal/blocks/ClipboardButton.js.map +0 -1
  606. package/dist/internal/blocks/ColorInput.js.map +0 -1
  607. package/dist/internal/blocks/ColorModeSwitch.js.map +0 -1
  608. package/dist/internal/blocks/Command.js.map +0 -1
  609. package/dist/internal/blocks/CopyField.js.map +0 -1
  610. package/dist/internal/blocks/DateInput.js.map +0 -1
  611. package/dist/internal/blocks/DateRangeInput.js.map +0 -1
  612. package/dist/internal/blocks/Form.js.map +0 -1
  613. package/dist/internal/blocks/FormGroup.js.map +0 -1
  614. package/dist/internal/blocks/MultiActionButtonGroup.js.map +0 -1
  615. package/dist/internal/blocks/OtpInput.js.map +0 -1
  616. package/dist/internal/blocks/PageHeader.js.map +0 -1
  617. package/dist/internal/blocks/PageLayout.js.map +0 -1
  618. package/dist/internal/blocks/PageToolbar.js.map +0 -1
  619. package/dist/internal/blocks/SearchInput.js.map +0 -1
  620. package/dist/internal/blocks/SectionNav.js.map +0 -1
  621. package/dist/internal/blocks/TextInput.js.map +0 -1
  622. package/dist/internal/components/Alert.js.map +0 -1
  623. package/dist/internal/components/AlertModal.js.map +0 -1
  624. package/dist/internal/components/Badge.js.map +0 -1
  625. package/dist/internal/components/BrandLogo.js.map +0 -1
  626. package/dist/internal/components/Breadcrumb.js.map +0 -1
  627. package/dist/internal/components/Button.js.map +0 -1
  628. package/dist/internal/components/Calendar.js.map +0 -1
  629. package/dist/internal/components/Card.js.map +0 -1
  630. package/dist/internal/components/Checkbox.js.map +0 -1
  631. package/dist/internal/components/Clipboard.js.map +0 -1
  632. package/dist/internal/components/Collapsible.js.map +0 -1
  633. package/dist/internal/components/Combobox.js.map +0 -1
  634. package/dist/internal/components/DatePicker.js.map +0 -1
  635. package/dist/internal/components/DateRangePicker.js.map +0 -1
  636. package/dist/internal/components/DiffView.js.map +0 -1
  637. package/dist/internal/components/DropdownMenu.js.map +0 -1
  638. package/dist/internal/components/FileUpload.js.map +0 -1
  639. package/dist/internal/components/FullScreenModal.js.map +0 -1
  640. package/dist/internal/components/HoverCard.js.map +0 -1
  641. package/dist/internal/components/InputGroup.js.map +0 -1
  642. package/dist/internal/components/Kbd.js.map +0 -1
  643. package/dist/internal/components/MarkedText.js.map +0 -1
  644. package/dist/internal/components/MergeEditor/useMergeDiff.js.map +0 -1
  645. package/dist/internal/components/Modal.js.map +0 -1
  646. package/dist/internal/components/Navbar.js.map +0 -1
  647. package/dist/internal/components/Pagination.js.map +0 -1
  648. package/dist/internal/components/Popconfirm.js.map +0 -1
  649. package/dist/internal/components/Popover.js.map +0 -1
  650. package/dist/internal/components/RadioGroup.js.map +0 -1
  651. package/dist/internal/components/Resizable.js.map +0 -1
  652. package/dist/internal/components/Search.js.map +0 -1
  653. package/dist/internal/components/Select.js.map +0 -1
  654. package/dist/internal/components/Sheet.js.map +0 -1
  655. package/dist/internal/components/Sidebar.js.map +0 -1
  656. package/dist/internal/components/Slider.js.map +0 -1
  657. package/dist/internal/components/Stepper.js.map +0 -1
  658. package/dist/internal/components/Switch.js.map +0 -1
  659. package/dist/internal/components/Table.js.map +0 -1
  660. package/dist/internal/components/Tabs.js.map +0 -1
  661. package/dist/internal/components/ThemeProvider.js.map +0 -1
  662. package/dist/internal/components/TimePicker.js.map +0 -1
  663. package/dist/internal/components/Timeline.js.map +0 -1
  664. package/dist/internal/components/Toast.js.map +0 -1
  665. package/dist/internal/components/ToggleGroup.js.map +0 -1
  666. package/dist/internal/components/Tooltip.js.map +0 -1
  667. package/dist/internal/components/Workbench.js.map +0 -1
  668. package/dist/internal/components/ZoomableSvg.js.map +0 -1
  669. package/dist/internal/utils.js.map +0 -1
  670. package/dist/mermaid.js.map +0 -1
@@ -0,0 +1,465 @@
1
+ import { CHANGE_CLASS, CHUNK_TYPE } from "./internal/components/MergeEditor/constants.js";
2
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
3
+ import { diffLines } from "diff";
4
+ import { diff3Merge } from "node-diff3";
5
+ //#region src/components/MergeEditor/helpers.ts
6
+ /**
7
+ * Computes diff chunks between oldText and newText using line-level diffing.
8
+ * Adjacent removed+added pairs are kept as separate chunks so the consumer
9
+ * can pair them into "modifications" for accept controls.
10
+ */
11
+ const computeDiffChunks = (oldText, newText) => {
12
+ const changes = diffLines(oldText, newText);
13
+ const chunks = [];
14
+ let oldLine = 1;
15
+ let newLine = 1;
16
+ for (const change of changes) {
17
+ if (change.value === "") continue;
18
+ const lineCount = change.count || change.value.replace(/\n$/, "").split("\n").length;
19
+ if (change.removed) {
20
+ chunks.push({
21
+ type: CHUNK_TYPE.REMOVED,
22
+ value: change.value,
23
+ oldStart: oldLine,
24
+ oldEnd: oldLine + lineCount - 1,
25
+ newStart: newLine,
26
+ newEnd: newLine
27
+ });
28
+ oldLine += lineCount;
29
+ } else if (change.added) {
30
+ chunks.push({
31
+ type: CHUNK_TYPE.ADDED,
32
+ value: change.value,
33
+ oldStart: oldLine,
34
+ oldEnd: oldLine,
35
+ newStart: newLine,
36
+ newEnd: newLine + lineCount - 1
37
+ });
38
+ newLine += lineCount;
39
+ } else {
40
+ chunks.push({
41
+ type: CHUNK_TYPE.UNCHANGED,
42
+ value: change.value,
43
+ oldStart: oldLine,
44
+ oldEnd: oldLine + lineCount - 1,
45
+ newStart: newLine,
46
+ newEnd: newLine + lineCount - 1
47
+ });
48
+ oldLine += lineCount;
49
+ newLine += lineCount;
50
+ }
51
+ }
52
+ return chunks;
53
+ };
54
+ /**
55
+ * Collects 1-indexed line numbers that are marked as changed (added or removed)
56
+ * from a set of diff chunks. `side` determines which line range to use.
57
+ */
58
+ const getChangedLineNumbers = (chunks, side) => {
59
+ const lines = /* @__PURE__ */ new Set();
60
+ for (const chunk of chunks) {
61
+ if (chunk.type === CHUNK_TYPE.UNCHANGED) continue;
62
+ if (side === "old" && chunk.type === CHUNK_TYPE.REMOVED) for (let i = chunk.oldStart; i <= chunk.oldEnd; i++) lines.add(i);
63
+ if (side === "new" && chunk.type === CHUNK_TYPE.ADDED) for (let i = chunk.newStart; i <= chunk.newEnd; i++) lines.add(i);
64
+ }
65
+ return lines;
66
+ };
67
+ /**
68
+ * Filters changed line numbers, keeping only those that are classified
69
+ * and not suppressed (resolved/dismissed).
70
+ *
71
+ * `classification` and `suppressedLines` must be keyed by line numbers
72
+ * from the same `side` (old-side lines for 'old', new-side lines for 'new').
73
+ */
74
+ const filterHighlightedLines = (chunks, side, classification, suppressedLines) => {
75
+ const filtered = /* @__PURE__ */ new Set();
76
+ for (const line of getChangedLineNumbers(chunks, side)) if (classification.has(line) && !suppressedLines.has(line)) filtered.add(line);
77
+ return filtered;
78
+ };
79
+ /**
80
+ * Replaces lines in `text` between `startLine` and `endLine` (1-indexed, inclusive)
81
+ * with `replacementLines`. If startLine > endLine, inserts before startLine.
82
+ */
83
+ const replaceLines = (text, startLine, endLine, replacement) => {
84
+ const lines = text.split("\n");
85
+ const before = lines.slice(0, startLine - 1);
86
+ const after = startLine > endLine ? lines.slice(startLine - 1) : lines.slice(endLine);
87
+ const replacementArr = replacement === "" ? [] : replacement.replace(/\n$/, "").split("\n");
88
+ return [
89
+ ...before,
90
+ ...replacementArr,
91
+ ...after
92
+ ].join("\n");
93
+ };
94
+ //#endregion
95
+ //#region src/components/MergeEditor/useMergeDiff.ts
96
+ const DEBOUNCE_MS = 150;
97
+ const rangesOverlap = (s1, e1, s2, e2) => s1 <= e2 && e1 >= s2;
98
+ const computeSuppressedLines = (dismissedLines, pairs, resolvedIds, getRange) => {
99
+ const lines = new Set(dismissedLines);
100
+ for (const pair of pairs) if (resolvedIds.has(pair.id)) {
101
+ const [start, end] = getRange(pair);
102
+ for (let i = start; i <= end; i++) lines.add(i);
103
+ }
104
+ return lines;
105
+ };
106
+ const filterVisibleConflicts = (conflicts, classification, dismissedLines, getRange, findPair, fullyResolvedPairIds) => conflicts.filter((c) => {
107
+ const [start, end] = getRange(c);
108
+ let hasClassifiedLine = false;
109
+ let allDismissed = true;
110
+ for (let i = start; i <= end; i++) {
111
+ if (classification.has(i)) hasClassifiedLine = true;
112
+ if (!dismissedLines.has(i)) allDismissed = false;
113
+ }
114
+ if (!hasClassifiedLine || allDismissed) return false;
115
+ const pair = findPair(c);
116
+ return !pair || !fullyResolvedPairIds.has(pair.id);
117
+ });
118
+ const useMergeDiff = (baseText, leftText, rightText) => {
119
+ const [mergeValue, setMergeValue] = useState(baseText);
120
+ const debounceRef = useRef(null);
121
+ const [debouncedMergeValue, setDebouncedMergeValue] = useState(mergeValue);
122
+ const [acceptedPairSides, setAcceptedPairSides] = useState(() => /* @__PURE__ */ new Map());
123
+ const [dismissedLeftLines, setDismissedLeftLines] = useState(() => /* @__PURE__ */ new Set());
124
+ const [dismissedRightLines, setDismissedRightLines] = useState(() => /* @__PURE__ */ new Set());
125
+ const reset = useCallback(() => {
126
+ if (debounceRef.current) {
127
+ clearTimeout(debounceRef.current);
128
+ debounceRef.current = null;
129
+ }
130
+ setMergeValue(baseText);
131
+ setDebouncedMergeValue(baseText);
132
+ setAcceptedPairSides(/* @__PURE__ */ new Map());
133
+ setDismissedLeftLines(/* @__PURE__ */ new Set());
134
+ setDismissedRightLines(/* @__PURE__ */ new Set());
135
+ }, [baseText]);
136
+ useLayoutEffect(() => {
137
+ reset();
138
+ }, [
139
+ baseText,
140
+ leftText,
141
+ rightText
142
+ ]);
143
+ useEffect(() => {
144
+ return () => {
145
+ if (debounceRef.current) clearTimeout(debounceRef.current);
146
+ };
147
+ }, []);
148
+ const handleMergeChange = useCallback((value) => {
149
+ setMergeValue(value);
150
+ if (debounceRef.current) clearTimeout(debounceRef.current);
151
+ debounceRef.current = setTimeout(() => {
152
+ setDebouncedMergeValue(value);
153
+ }, DEBOUNCE_MS);
154
+ }, []);
155
+ const leftDiffChunks = useMemo(() => computeDiffChunks(leftText, debouncedMergeValue), [leftText, debouncedMergeValue]);
156
+ const rightDiffChunks = useMemo(() => computeDiffChunks(debouncedMergeValue, rightText), [debouncedMergeValue, rightText]);
157
+ const leftConflicts = useMemo(() => pairChunksIntoConflicts(leftDiffChunks), [leftDiffChunks]);
158
+ const rightConflicts = useMemo(() => pairChunksIntoConflicts(rightDiffChunks), [rightDiffChunks]);
159
+ const leftVsBase = useMemo(() => computeDiffChunks(baseText, leftText), [baseText, leftText]);
160
+ const rightVsBase = useMemo(() => computeDiffChunks(baseText, rightText), [baseText, rightText]);
161
+ const { leftClassification, rightClassification, conflictPairs } = useMemo(() => {
162
+ const baseLines = baseText.split("\n");
163
+ const leftLines = leftText.split("\n");
164
+ const rightLines = rightText.split("\n");
165
+ const result = diff3Merge(leftLines, baseLines, rightLines);
166
+ const leftConflictLineSet = /* @__PURE__ */ new Set();
167
+ const rightConflictLineSet = /* @__PURE__ */ new Set();
168
+ const pairs = [];
169
+ for (const block of result) if ("conflict" in block && block.conflict) {
170
+ const { a, aIndex, b, bIndex } = block.conflict;
171
+ for (let i = 0; i < a.length; i++) leftConflictLineSet.add(aIndex + i + 1);
172
+ for (let i = 0; i < b.length; i++) rightConflictLineSet.add(bIndex + i + 1);
173
+ pairs.push({
174
+ id: `pair-${aIndex}-${bIndex}`,
175
+ leftStart: aIndex + 1,
176
+ leftEnd: aIndex + a.length,
177
+ rightStart: bIndex + 1,
178
+ rightEnd: bIndex + b.length
179
+ });
180
+ }
181
+ const leftChanged = getChangedLineNumbers(leftVsBase, "new");
182
+ const rightChanged = getChangedLineNumbers(rightVsBase, "new");
183
+ const leftMap = /* @__PURE__ */ new Map();
184
+ for (const line of leftChanged) leftMap.set(line, leftConflictLineSet.has(line) ? CHANGE_CLASS.CONFLICT : CHANGE_CLASS.SAFE);
185
+ const rightMap = /* @__PURE__ */ new Map();
186
+ for (const line of rightChanged) rightMap.set(line, rightConflictLineSet.has(line) ? CHANGE_CLASS.CONFLICT : CHANGE_CLASS.SAFE);
187
+ return {
188
+ leftClassification: leftMap,
189
+ rightClassification: rightMap,
190
+ conflictPairs: pairs
191
+ };
192
+ }, [
193
+ baseText,
194
+ leftText,
195
+ rightText,
196
+ leftVsBase,
197
+ rightVsBase
198
+ ]);
199
+ const findPairForLeft = useCallback((conflict) => conflictPairs.find((p) => rangesOverlap(conflict.oldStartLine, conflict.oldEndLine, p.leftStart, p.leftEnd)), [conflictPairs]);
200
+ const findPairForRight = useCallback((conflict) => conflictPairs.find((p) => rangesOverlap(conflict.newStartLine, conflict.newEndLine, p.rightStart, p.rightEnd)), [conflictPairs]);
201
+ const markSideAccepted = useCallback((pair, side) => {
202
+ if (!pair) return;
203
+ setAcceptedPairSides((prev) => {
204
+ const next = new Map(prev);
205
+ const sides = new Set(prev.get(pair.id) ?? []);
206
+ sides.add(side);
207
+ next.set(pair.id, sides);
208
+ return next;
209
+ });
210
+ }, []);
211
+ const isOtherSideAccepted = useCallback((pair, side) => {
212
+ if (!pair) return false;
213
+ const otherSide = side === "left" ? "right" : "left";
214
+ return acceptedPairSides.get(pair.id)?.has(otherSide) ?? false;
215
+ }, [acceptedPairSides]);
216
+ const acceptSide = useCallback((conflict, side) => {
217
+ const pair = (side === "left" ? findPairForLeft : findPairForRight)(conflict);
218
+ const otherAccepted = isOtherSideAccepted(pair, side);
219
+ const sourceValue = side === "left" ? conflict.oldValue : conflict.newValue;
220
+ const targetStart = side === "left" ? conflict.newStartLine : conflict.oldStartLine;
221
+ const targetEnd = side === "left" ? conflict.newEndLine : conflict.oldEndLine;
222
+ if (debounceRef.current) {
223
+ clearTimeout(debounceRef.current);
224
+ debounceRef.current = null;
225
+ }
226
+ const mergeTargetEmpty = side === "left" ? conflict.newValue === "" : conflict.oldValue === "";
227
+ const newValue = otherAccepted ? replaceLines(mergeValue, targetEnd + 1, targetEnd, sourceValue) : mergeTargetEmpty ? replaceLines(mergeValue, targetStart, targetStart - 1, sourceValue) : replaceLines(mergeValue, targetStart, targetEnd, sourceValue);
228
+ setMergeValue(newValue);
229
+ setDebouncedMergeValue(newValue);
230
+ markSideAccepted(pair, side);
231
+ if (!pair) {
232
+ const setDismissedSide = side === "left" ? setDismissedLeftLines : setDismissedRightLines;
233
+ const [sideStart, sideEnd] = side === "left" ? [conflict.oldStartLine, conflict.oldEndLine] : [conflict.newStartLine, conflict.newEndLine];
234
+ setDismissedSide((prev) => {
235
+ const next = new Set(prev);
236
+ for (let i = sideStart; i <= sideEnd; i++) next.add(i);
237
+ return next;
238
+ });
239
+ }
240
+ }, [
241
+ mergeValue,
242
+ findPairForLeft,
243
+ findPairForRight,
244
+ isOtherSideAccepted,
245
+ markSideAccepted
246
+ ]);
247
+ const acceptLeft = useCallback((conflict) => acceptSide(conflict, "left"), [acceptSide]);
248
+ const acceptRight = useCallback((conflict) => acceptSide(conflict, "right"), [acceptSide]);
249
+ const dismissSide = useCallback((conflict, side) => {
250
+ const setDismissed = side === "left" ? setDismissedLeftLines : setDismissedRightLines;
251
+ const [sideStart, sideEnd] = side === "left" ? [conflict.oldStartLine, conflict.oldEndLine] : [conflict.newStartLine, conflict.newEndLine];
252
+ setDismissed((prev) => {
253
+ const next = new Set(prev);
254
+ for (let i = sideStart; i <= sideEnd; i++) next.add(i);
255
+ return next;
256
+ });
257
+ }, []);
258
+ const dismissLeft = useCallback((conflict) => dismissSide(conflict, "left"), [dismissSide]);
259
+ const dismissRight = useCallback((conflict) => dismissSide(conflict, "right"), [dismissSide]);
260
+ const fullyResolvedPairIds = useMemo(() => {
261
+ const ids = /* @__PURE__ */ new Set();
262
+ for (const pair of conflictPairs) {
263
+ const leftAccepted = acceptedPairSides.get(pair.id)?.has("left") ?? false;
264
+ const rightAccepted = acceptedPairSides.get(pair.id)?.has("right") ?? false;
265
+ let leftDismissed = true;
266
+ for (let i = pair.leftStart; i <= pair.leftEnd; i++) if (!dismissedLeftLines.has(i)) {
267
+ leftDismissed = false;
268
+ break;
269
+ }
270
+ let rightDismissed = true;
271
+ for (let i = pair.rightStart; i <= pair.rightEnd; i++) if (!dismissedRightLines.has(i)) {
272
+ rightDismissed = false;
273
+ break;
274
+ }
275
+ if ((leftAccepted || leftDismissed) && (rightAccepted || rightDismissed)) ids.add(pair.id);
276
+ }
277
+ return ids;
278
+ }, [
279
+ conflictPairs,
280
+ acceptedPairSides,
281
+ dismissedLeftLines,
282
+ dismissedRightLines
283
+ ]);
284
+ const visibleLeftConflicts = useMemo(() => filterVisibleConflicts(leftConflicts, leftClassification, dismissedLeftLines, (c) => [c.oldStartLine, c.oldEndLine], findPairForLeft, fullyResolvedPairIds), [
285
+ leftConflicts,
286
+ leftClassification,
287
+ dismissedLeftLines,
288
+ findPairForLeft,
289
+ fullyResolvedPairIds
290
+ ]);
291
+ const visibleRightConflicts = useMemo(() => filterVisibleConflicts(rightConflicts, rightClassification, dismissedRightLines, (c) => [c.newStartLine, c.newEndLine], findPairForRight, fullyResolvedPairIds), [
292
+ rightConflicts,
293
+ rightClassification,
294
+ dismissedRightLines,
295
+ findPairForRight,
296
+ fullyResolvedPairIds
297
+ ]);
298
+ const suppressedLeftLines = useMemo(() => computeSuppressedLines(dismissedLeftLines, conflictPairs, fullyResolvedPairIds, (p) => [p.leftStart, p.leftEnd]), [
299
+ conflictPairs,
300
+ fullyResolvedPairIds,
301
+ dismissedLeftLines
302
+ ]);
303
+ const suppressedRightLines = useMemo(() => computeSuppressedLines(dismissedRightLines, conflictPairs, fullyResolvedPairIds, (p) => [p.rightStart, p.rightEnd]), [
304
+ conflictPairs,
305
+ fullyResolvedPairIds,
306
+ dismissedRightLines
307
+ ]);
308
+ const { mergeHighlightedLines, mergeClassification } = useMemo(() => {
309
+ const mergeLeftLines = getChangedLineNumbers(leftDiffChunks, "new");
310
+ const mergeRightLines = getChangedLineNumbers(rightDiffChunks, "old");
311
+ const mergeLineToPair = /* @__PURE__ */ new Map();
312
+ for (const conflict of leftConflicts) {
313
+ const pair = findPairForLeft(conflict);
314
+ if (pair) for (let i = conflict.newStartLine; i <= conflict.newEndLine; i++) mergeLineToPair.set(i, pair.id);
315
+ }
316
+ for (const conflict of rightConflicts) {
317
+ const pair = findPairForRight(conflict);
318
+ if (pair) for (let i = conflict.oldStartLine; i <= conflict.oldEndLine; i++) mergeLineToPair.set(i, pair.id);
319
+ }
320
+ const suppressedMergeLines = /* @__PURE__ */ new Set();
321
+ for (const conflict of leftConflicts) {
322
+ if (findPairForLeft(conflict)) continue;
323
+ if (conflict.oldStartLine > conflict.oldEndLine) continue;
324
+ let allDismissed = true;
325
+ for (let i = conflict.oldStartLine; i <= conflict.oldEndLine; i++) if (!dismissedLeftLines.has(i)) {
326
+ allDismissed = false;
327
+ break;
328
+ }
329
+ if (allDismissed) for (let i = conflict.newStartLine; i <= conflict.newEndLine; i++) suppressedMergeLines.add(i);
330
+ }
331
+ for (const conflict of rightConflicts) {
332
+ if (findPairForRight(conflict)) continue;
333
+ if (conflict.newStartLine > conflict.newEndLine) continue;
334
+ let allDismissed = true;
335
+ for (let i = conflict.newStartLine; i <= conflict.newEndLine; i++) if (!dismissedRightLines.has(i)) {
336
+ allDismissed = false;
337
+ break;
338
+ }
339
+ if (allDismissed) for (let i = conflict.oldStartLine; i <= conflict.oldEndLine; i++) suppressedMergeLines.add(i);
340
+ }
341
+ const allMergeLines = /* @__PURE__ */ new Set();
342
+ for (const line of mergeLeftLines) allMergeLines.add(line);
343
+ for (const line of mergeRightLines) allMergeLines.add(line);
344
+ const highlighted = /* @__PURE__ */ new Set();
345
+ const classification = /* @__PURE__ */ new Map();
346
+ for (const line of allMergeLines) {
347
+ if (suppressedMergeLines.has(line)) continue;
348
+ const pairId = mergeLineToPair.get(line);
349
+ if (pairId && fullyResolvedPairIds.has(pairId)) continue;
350
+ highlighted.add(line);
351
+ classification.set(line, pairId ? CHANGE_CLASS.CONFLICT : CHANGE_CLASS.SAFE);
352
+ }
353
+ return {
354
+ mergeHighlightedLines: highlighted,
355
+ mergeClassification: classification
356
+ };
357
+ }, [
358
+ leftDiffChunks,
359
+ rightDiffChunks,
360
+ leftConflicts,
361
+ rightConflicts,
362
+ findPairForLeft,
363
+ findPairForRight,
364
+ fullyResolvedPairIds,
365
+ dismissedLeftLines,
366
+ dismissedRightLines
367
+ ]);
368
+ const leftHighlightedLines = useMemo(() => filterHighlightedLines(leftDiffChunks, "old", leftClassification, suppressedLeftLines), [
369
+ leftDiffChunks,
370
+ leftClassification,
371
+ suppressedLeftLines
372
+ ]);
373
+ const rightHighlightedLines = useMemo(() => filterHighlightedLines(rightDiffChunks, "new", rightClassification, suppressedRightLines), [
374
+ rightDiffChunks,
375
+ rightClassification,
376
+ suppressedRightLines
377
+ ]);
378
+ const remainingSafeChanges = useMemo(() => {
379
+ return visibleLeftConflicts.filter((c) => !findPairForLeft(c)).length + visibleRightConflicts.filter((c) => !findPairForRight(c)).length;
380
+ }, [
381
+ visibleLeftConflicts,
382
+ visibleRightConflicts,
383
+ findPairForLeft,
384
+ findPairForRight
385
+ ]);
386
+ return {
387
+ mergeValue,
388
+ handleMergeChange,
389
+ leftConflicts: visibleLeftConflicts,
390
+ rightConflicts: visibleRightConflicts,
391
+ leftHighlightedLines,
392
+ rightHighlightedLines,
393
+ leftClassification,
394
+ rightClassification,
395
+ mergeHighlightedLines,
396
+ mergeClassification,
397
+ acceptLeft,
398
+ acceptRight,
399
+ dismissLeft,
400
+ dismissRight,
401
+ totalConflicts: conflictPairs.length,
402
+ resolvedConflicts: fullyResolvedPairIds.size,
403
+ remainingSafeChanges,
404
+ isDirty: mergeValue !== baseText || dismissedLeftLines.size > 0 || dismissedRightLines.size > 0,
405
+ reset
406
+ };
407
+ };
408
+ /**
409
+ * Pairs adjacent removed+added chunks into MergeConflicts.
410
+ * A standalone REMOVED or ADDED chunk becomes a conflict with
411
+ * the other side empty.
412
+ */
413
+ const pairChunksIntoConflicts = (chunks) => {
414
+ const conflicts = [];
415
+ let i = 0;
416
+ while (i < chunks.length) {
417
+ const chunk = chunks[i];
418
+ if (chunk.type === CHUNK_TYPE.UNCHANGED) {
419
+ i++;
420
+ continue;
421
+ }
422
+ if (chunk.type === CHUNK_TYPE.REMOVED) {
423
+ const next = chunks[i + 1];
424
+ if (next?.type === CHUNK_TYPE.ADDED) {
425
+ conflicts.push({
426
+ id: `${chunk.oldStart}-${next.newStart}`,
427
+ oldValue: chunk.value,
428
+ oldStartLine: chunk.oldStart,
429
+ oldEndLine: chunk.oldEnd,
430
+ newValue: next.value,
431
+ newStartLine: next.newStart,
432
+ newEndLine: next.newEnd
433
+ });
434
+ i += 2;
435
+ } else {
436
+ conflicts.push({
437
+ id: `${chunk.oldStart}-del`,
438
+ oldValue: chunk.value,
439
+ oldStartLine: chunk.oldStart,
440
+ oldEndLine: chunk.oldEnd,
441
+ newValue: "",
442
+ newStartLine: chunk.newStart,
443
+ newEndLine: chunk.newStart
444
+ });
445
+ i++;
446
+ }
447
+ } else {
448
+ conflicts.push({
449
+ id: `add-${chunk.newStart}`,
450
+ oldValue: "",
451
+ oldStartLine: chunk.oldStart,
452
+ oldEndLine: chunk.oldStart,
453
+ newValue: chunk.value,
454
+ newStartLine: chunk.newStart,
455
+ newEndLine: chunk.newEnd
456
+ });
457
+ i++;
458
+ }
459
+ }
460
+ return conflicts;
461
+ };
462
+ //#endregion
463
+ export { useMergeDiff };
464
+
465
+ //# sourceMappingURL=useMergeDiff-CvowEXJ1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMergeDiff-CvowEXJ1.js","names":[],"sources":["../src/components/MergeEditor/helpers.ts","../src/components/MergeEditor/useMergeDiff.ts"],"sourcesContent":["import { diffLines } from 'diff';\n\nimport { type ChangeClassification, CHUNK_TYPE, type DiffChunk } from './constants';\n\n/**\n * Computes diff chunks between oldText and newText using line-level diffing.\n * Adjacent removed+added pairs are kept as separate chunks so the consumer\n * can pair them into \"modifications\" for accept controls.\n */\nexport const computeDiffChunks = (oldText: string, newText: string): DiffChunk[] => {\n const changes = diffLines(oldText, newText);\n const chunks: DiffChunk[] = [];\n let oldLine = 1;\n let newLine = 1;\n\n for (const change of changes) {\n if (change.value === '') continue;\n\n const lineCount = change.count || change.value.replace(/\\n$/, '').split('\\n').length;\n\n if (change.removed) {\n // newStart/newEnd anchor to the current new-side position (insertion point) for alignment\n chunks.push({\n type: CHUNK_TYPE.REMOVED,\n value: change.value,\n oldStart: oldLine,\n oldEnd: oldLine + lineCount - 1,\n newStart: newLine,\n newEnd: newLine,\n });\n oldLine += lineCount;\n } else if (change.added) {\n // oldStart/oldEnd anchor to the current old-side position (insertion point) for alignment\n chunks.push({\n type: CHUNK_TYPE.ADDED,\n value: change.value,\n oldStart: oldLine,\n oldEnd: oldLine,\n newStart: newLine,\n newEnd: newLine + lineCount - 1,\n });\n newLine += lineCount;\n } else {\n chunks.push({\n type: CHUNK_TYPE.UNCHANGED,\n value: change.value,\n oldStart: oldLine,\n oldEnd: oldLine + lineCount - 1,\n newStart: newLine,\n newEnd: newLine + lineCount - 1,\n });\n oldLine += lineCount;\n newLine += lineCount;\n }\n }\n\n return chunks;\n};\n\n/**\n * Collects 1-indexed line numbers that are marked as changed (added or removed)\n * from a set of diff chunks. `side` determines which line range to use.\n */\nexport const getChangedLineNumbers = (chunks: DiffChunk[], side: 'old' | 'new'): Set<number> => {\n const lines = new Set<number>();\n\n for (const chunk of chunks) {\n if (chunk.type === CHUNK_TYPE.UNCHANGED) continue;\n\n if (side === 'old' && chunk.type === CHUNK_TYPE.REMOVED) {\n for (let i = chunk.oldStart; i <= chunk.oldEnd; i++) lines.add(i);\n }\n if (side === 'new' && chunk.type === CHUNK_TYPE.ADDED) {\n for (let i = chunk.newStart; i <= chunk.newEnd; i++) lines.add(i);\n }\n }\n\n return lines;\n};\n\n/**\n * Filters changed line numbers, keeping only those that are classified\n * and not suppressed (resolved/dismissed).\n *\n * `classification` and `suppressedLines` must be keyed by line numbers\n * from the same `side` (old-side lines for 'old', new-side lines for 'new').\n */\nexport const filterHighlightedLines = (\n chunks: DiffChunk[],\n side: 'old' | 'new',\n classification: Map<number, ChangeClassification>,\n suppressedLines: Set<number>,\n): Set<number> => {\n const filtered = new Set<number>();\n for (const line of getChangedLineNumbers(chunks, side)) {\n if (classification.has(line) && !suppressedLines.has(line)) filtered.add(line);\n }\n return filtered;\n};\n\n/**\n * Replaces lines in `text` between `startLine` and `endLine` (1-indexed, inclusive)\n * with `replacementLines`. If startLine > endLine, inserts before startLine.\n */\nexport const replaceLines = (\n text: string,\n startLine: number,\n endLine: number,\n replacement: string,\n): string => {\n const lines = text.split('\\n');\n const before = lines.slice(0, startLine - 1);\n const after = startLine > endLine ? lines.slice(startLine - 1) : lines.slice(endLine);\n\n const replacementArr = replacement === '' ? [] : replacement.replace(/\\n$/, '').split('\\n');\n\n return [...before, ...replacementArr, ...after].join('\\n');\n};\n","import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { diff3Merge } from 'node-diff3';\n\nimport {\n CHANGE_CLASS,\n type ChangeClassification,\n CHUNK_TYPE,\n type DiffChunk,\n type MergeConflict,\n} from './constants';\nimport {\n computeDiffChunks,\n filterHighlightedLines,\n getChangedLineNumbers,\n replaceLines,\n} from './helpers';\n\nconst DEBOUNCE_MS = 150;\n\ntype ConflictPair = {\n id: string;\n leftStart: number;\n leftEnd: number;\n rightStart: number;\n rightEnd: number;\n};\n\ntype Side = 'left' | 'right';\n\nconst rangesOverlap = (s1: number, e1: number, s2: number, e2: number) => s1 <= e2 && e1 >= s2;\n\nconst computeSuppressedLines = (\n dismissedLines: Set<number>,\n pairs: ConflictPair[],\n resolvedIds: Set<string>,\n getRange: (p: ConflictPair) => [number, number],\n): Set<number> => {\n const lines = new Set(dismissedLines);\n for (const pair of pairs) {\n if (resolvedIds.has(pair.id)) {\n const [start, end] = getRange(pair);\n for (let i = start; i <= end; i++) lines.add(i);\n }\n }\n return lines;\n};\n\nconst filterVisibleConflicts = (\n conflicts: MergeConflict[],\n classification: Map<number, ChangeClassification>,\n dismissedLines: Set<number>,\n getRange: (c: MergeConflict) => [number, number],\n findPair: (c: MergeConflict) => ConflictPair | undefined,\n fullyResolvedPairIds: Set<string>,\n): MergeConflict[] =>\n conflicts.filter((c) => {\n const [start, end] = getRange(c);\n let hasClassifiedLine = false;\n let allDismissed = true;\n for (let i = start; i <= end; i++) {\n if (classification.has(i)) hasClassifiedLine = true;\n if (!dismissedLines.has(i)) allDismissed = false;\n }\n if (!hasClassifiedLine || allDismissed) return false;\n\n const pair = findPair(c);\n return !pair || !fullyResolvedPairIds.has(pair.id);\n });\n\nexport const useMergeDiff = (baseText: string, leftText: string, rightText: string) => {\n const [mergeValue, setMergeValue] = useState(baseText);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [debouncedMergeValue, setDebouncedMergeValue] = useState(mergeValue);\n const [acceptedPairSides, setAcceptedPairSides] = useState<Map<string, Set<Side>>>(\n () => new Map(),\n );\n const [dismissedLeftLines, setDismissedLeftLines] = useState<Set<number>>(() => new Set());\n const [dismissedRightLines, setDismissedRightLines] = useState<Set<number>>(() => new Set());\n\n const reset = useCallback(() => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n debounceRef.current = null;\n }\n\n setMergeValue(baseText);\n setDebouncedMergeValue(baseText);\n setAcceptedPairSides(new Map());\n setDismissedLeftLines(new Set());\n setDismissedRightLines(new Set());\n }, [baseText]);\n\n // Reset all state when input texts change (e.g. async data arrives).\n // useLayoutEffect prevents a one-frame flash of incorrect diff rendering\n // when mergeValue is still '' but the real texts have arrived.\n useLayoutEffect(() => {\n reset();\n }, [baseText, leftText, rightText]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Clean up debounce timer on unmount\n useEffect(() => {\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, []);\n\n const handleMergeChange = useCallback((value: string) => {\n setMergeValue(value);\n\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n debounceRef.current = setTimeout(() => {\n setDebouncedMergeValue(value);\n }, DEBOUNCE_MS);\n }, []);\n\n // diff(production, mergeResult) — highlights for left pane\n const leftDiffChunks = useMemo(\n () => computeDiffChunks(leftText, debouncedMergeValue),\n [leftText, debouncedMergeValue],\n );\n\n // diff(mergeResult, branch) — highlights for right pane\n const rightDiffChunks = useMemo(\n () => computeDiffChunks(debouncedMergeValue, rightText),\n [debouncedMergeValue, rightText],\n );\n\n // Recompute conflict positions based on current merge value vs both sides\n const leftConflicts = useMemo(() => pairChunksIntoConflicts(leftDiffChunks), [leftDiffChunks]);\n\n const rightConflicts = useMemo(() => pairChunksIntoConflicts(rightDiffChunks), [rightDiffChunks]);\n\n // Base-vs-side diffs (stable unless source texts change)\n const leftVsBase = useMemo(() => computeDiffChunks(baseText, leftText), [baseText, leftText]);\n const rightVsBase = useMemo(() => computeDiffChunks(baseText, rightText), [baseText, rightText]);\n\n const { leftClassification, rightClassification, conflictPairs } = useMemo(() => {\n const baseLines = baseText.split('\\n');\n const leftLines = leftText.split('\\n');\n const rightLines = rightText.split('\\n');\n\n const result = diff3Merge(leftLines, baseLines, rightLines);\n\n const leftConflictLineSet = new Set<number>();\n const rightConflictLineSet = new Set<number>();\n const pairs: ConflictPair[] = [];\n\n for (const block of result) {\n if ('conflict' in block && block.conflict) {\n const { a, aIndex, b, bIndex } = block.conflict;\n for (let i = 0; i < a.length; i++) leftConflictLineSet.add(aIndex + i + 1);\n for (let i = 0; i < b.length; i++) rightConflictLineSet.add(bIndex + i + 1);\n\n pairs.push({\n id: `pair-${aIndex}-${bIndex}`,\n leftStart: aIndex + 1,\n leftEnd: aIndex + a.length,\n rightStart: bIndex + 1,\n rightEnd: bIndex + b.length,\n });\n }\n }\n\n const leftChanged = getChangedLineNumbers(leftVsBase, 'new');\n const rightChanged = getChangedLineNumbers(rightVsBase, 'new');\n\n const leftMap = new Map<number, ChangeClassification>();\n for (const line of leftChanged) {\n leftMap.set(line, leftConflictLineSet.has(line) ? CHANGE_CLASS.CONFLICT : CHANGE_CLASS.SAFE);\n }\n\n const rightMap = new Map<number, ChangeClassification>();\n for (const line of rightChanged) {\n rightMap.set(\n line,\n rightConflictLineSet.has(line) ? CHANGE_CLASS.CONFLICT : CHANGE_CLASS.SAFE,\n );\n }\n\n return {\n leftClassification: leftMap,\n rightClassification: rightMap,\n conflictPairs: pairs,\n };\n }, [baseText, leftText, rightText, leftVsBase, rightVsBase]);\n\n const findPairForLeft = useCallback(\n (conflict: MergeConflict) =>\n conflictPairs.find((p) =>\n rangesOverlap(conflict.oldStartLine, conflict.oldEndLine, p.leftStart, p.leftEnd),\n ),\n [conflictPairs],\n );\n\n const findPairForRight = useCallback(\n (conflict: MergeConflict) =>\n conflictPairs.find((p) =>\n rangesOverlap(conflict.newStartLine, conflict.newEndLine, p.rightStart, p.rightEnd),\n ),\n [conflictPairs],\n );\n\n const markSideAccepted = useCallback((pair: ConflictPair | undefined, side: Side) => {\n if (!pair) return;\n setAcceptedPairSides((prev) => {\n const next = new Map(prev);\n const sides = new Set(prev.get(pair.id) ?? []);\n sides.add(side);\n next.set(pair.id, sides);\n return next;\n });\n }, []);\n\n const isOtherSideAccepted = useCallback(\n (pair: ConflictPair | undefined, side: Side) => {\n if (!pair) return false;\n const otherSide = side === 'left' ? 'right' : 'left';\n return acceptedPairSides.get(pair.id)?.has(otherSide) ?? false;\n },\n [acceptedPairSides],\n );\n\n const acceptSide = useCallback(\n (conflict: MergeConflict, side: Side) => {\n const findPair = side === 'left' ? findPairForLeft : findPairForRight;\n const pair = findPair(conflict);\n const otherAccepted = isOtherSideAccepted(pair, side);\n const sourceValue = side === 'left' ? conflict.oldValue : conflict.newValue;\n const targetStart = side === 'left' ? conflict.newStartLine : conflict.oldStartLine;\n const targetEnd = side === 'left' ? conflict.newEndLine : conflict.oldEndLine;\n\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n debounceRef.current = null;\n }\n\n const mergeTargetEmpty =\n side === 'left' ? conflict.newValue === '' : conflict.oldValue === '';\n const newValue = otherAccepted\n ? replaceLines(mergeValue, targetEnd + 1, targetEnd, sourceValue)\n : mergeTargetEmpty\n ? replaceLines(mergeValue, targetStart, targetStart - 1, sourceValue)\n : replaceLines(mergeValue, targetStart, targetEnd, sourceValue);\n\n setMergeValue(newValue);\n setDebouncedMergeValue(newValue);\n markSideAccepted(pair, side);\n\n if (!pair) {\n // Dismiss the source side-pane lines so the change doesn't reappear\n // if the user later edits the accepted text in the merge pane\n const setDismissedSide = side === 'left' ? setDismissedLeftLines : setDismissedRightLines;\n const [sideStart, sideEnd] =\n side === 'left'\n ? [conflict.oldStartLine, conflict.oldEndLine]\n : [conflict.newStartLine, conflict.newEndLine];\n\n setDismissedSide((prev) => {\n const next = new Set(prev);\n for (let i = sideStart; i <= sideEnd; i++) next.add(i);\n return next;\n });\n }\n },\n [mergeValue, findPairForLeft, findPairForRight, isOtherSideAccepted, markSideAccepted],\n );\n\n const acceptLeft = useCallback(\n (conflict: MergeConflict) => acceptSide(conflict, 'left'),\n [acceptSide],\n );\n\n const acceptRight = useCallback(\n (conflict: MergeConflict) => acceptSide(conflict, 'right'),\n [acceptSide],\n );\n\n const dismissSide = useCallback((conflict: MergeConflict, side: Side) => {\n const setDismissed = side === 'left' ? setDismissedLeftLines : setDismissedRightLines;\n const [sideStart, sideEnd] =\n side === 'left'\n ? [conflict.oldStartLine, conflict.oldEndLine]\n : [conflict.newStartLine, conflict.newEndLine];\n\n setDismissed((prev) => {\n const next = new Set(prev);\n for (let i = sideStart; i <= sideEnd; i++) next.add(i);\n return next;\n });\n }, []);\n\n const dismissLeft = useCallback(\n (conflict: MergeConflict) => dismissSide(conflict, 'left'),\n [dismissSide],\n );\n\n const dismissRight = useCallback(\n (conflict: MergeConflict) => dismissSide(conflict, 'right'),\n [dismissSide],\n );\n\n const fullyResolvedPairIds = useMemo(() => {\n const ids = new Set<string>();\n for (const pair of conflictPairs) {\n const leftAccepted = acceptedPairSides.get(pair.id)?.has('left') ?? false;\n const rightAccepted = acceptedPairSides.get(pair.id)?.has('right') ?? false;\n\n let leftDismissed = true;\n for (let i = pair.leftStart; i <= pair.leftEnd; i++) {\n if (!dismissedLeftLines.has(i)) {\n leftDismissed = false;\n break;\n }\n }\n\n let rightDismissed = true;\n for (let i = pair.rightStart; i <= pair.rightEnd; i++) {\n if (!dismissedRightLines.has(i)) {\n rightDismissed = false;\n break;\n }\n }\n\n if ((leftAccepted || leftDismissed) && (rightAccepted || rightDismissed)) {\n ids.add(pair.id);\n }\n }\n return ids;\n }, [conflictPairs, acceptedPairSides, dismissedLeftLines, dismissedRightLines]);\n\n const visibleLeftConflicts = useMemo(\n () =>\n filterVisibleConflicts(\n leftConflicts,\n leftClassification,\n dismissedLeftLines,\n (c) => [c.oldStartLine, c.oldEndLine],\n findPairForLeft,\n fullyResolvedPairIds,\n ),\n [leftConflicts, leftClassification, dismissedLeftLines, findPairForLeft, fullyResolvedPairIds],\n );\n\n const visibleRightConflicts = useMemo(\n () =>\n filterVisibleConflicts(\n rightConflicts,\n rightClassification,\n dismissedRightLines,\n (c) => [c.newStartLine, c.newEndLine],\n findPairForRight,\n fullyResolvedPairIds,\n ),\n [\n rightConflicts,\n rightClassification,\n dismissedRightLines,\n findPairForRight,\n fullyResolvedPairIds,\n ],\n );\n\n const suppressedLeftLines = useMemo(\n () =>\n computeSuppressedLines(dismissedLeftLines, conflictPairs, fullyResolvedPairIds, (p) => [\n p.leftStart,\n p.leftEnd,\n ]),\n [conflictPairs, fullyResolvedPairIds, dismissedLeftLines],\n );\n\n const suppressedRightLines = useMemo(\n () =>\n computeSuppressedLines(dismissedRightLines, conflictPairs, fullyResolvedPairIds, (p) => [\n p.rightStart,\n p.rightEnd,\n ]),\n [conflictPairs, fullyResolvedPairIds, dismissedRightLines],\n );\n\n const { mergeHighlightedLines, mergeClassification } = useMemo(() => {\n const mergeLeftLines = getChangedLineNumbers(leftDiffChunks, 'new');\n const mergeRightLines = getChangedLineNumbers(rightDiffChunks, 'old');\n\n const mergeLineToPair = new Map<number, string>();\n\n for (const conflict of leftConflicts) {\n const pair = findPairForLeft(conflict);\n if (pair) {\n for (let i = conflict.newStartLine; i <= conflict.newEndLine; i++) {\n mergeLineToPair.set(i, pair.id);\n }\n }\n }\n\n for (const conflict of rightConflicts) {\n const pair = findPairForRight(conflict);\n if (pair) {\n for (let i = conflict.oldStartLine; i <= conflict.oldEndLine; i++) {\n mergeLineToPair.set(i, pair.id);\n }\n }\n }\n\n // Derive suppressed merge lines from side-pane dismissals.\n // Side texts are static, so their line numbers never go stale.\n const suppressedMergeLines = new Set<number>();\n\n for (const conflict of leftConflicts) {\n if (findPairForLeft(conflict)) continue;\n if (conflict.oldStartLine > conflict.oldEndLine) continue;\n let allDismissed = true;\n for (let i = conflict.oldStartLine; i <= conflict.oldEndLine; i++) {\n if (!dismissedLeftLines.has(i)) {\n allDismissed = false;\n break;\n }\n }\n if (allDismissed) {\n for (let i = conflict.newStartLine; i <= conflict.newEndLine; i++) {\n suppressedMergeLines.add(i);\n }\n }\n }\n\n for (const conflict of rightConflicts) {\n if (findPairForRight(conflict)) continue;\n if (conflict.newStartLine > conflict.newEndLine) continue;\n let allDismissed = true;\n for (let i = conflict.newStartLine; i <= conflict.newEndLine; i++) {\n if (!dismissedRightLines.has(i)) {\n allDismissed = false;\n break;\n }\n }\n if (allDismissed) {\n for (let i = conflict.oldStartLine; i <= conflict.oldEndLine; i++) {\n suppressedMergeLines.add(i);\n }\n }\n }\n\n const allMergeLines = new Set<number>();\n for (const line of mergeLeftLines) allMergeLines.add(line);\n for (const line of mergeRightLines) allMergeLines.add(line);\n\n const highlighted = new Set<number>();\n const classification = new Map<number, ChangeClassification>();\n\n for (const line of allMergeLines) {\n if (suppressedMergeLines.has(line)) continue;\n\n const pairId = mergeLineToPair.get(line);\n if (pairId && fullyResolvedPairIds.has(pairId)) continue;\n\n highlighted.add(line);\n classification.set(line, pairId ? CHANGE_CLASS.CONFLICT : CHANGE_CLASS.SAFE);\n }\n\n return { mergeHighlightedLines: highlighted, mergeClassification: classification };\n }, [\n leftDiffChunks,\n rightDiffChunks,\n leftConflicts,\n rightConflicts,\n findPairForLeft,\n findPairForRight,\n fullyResolvedPairIds,\n dismissedLeftLines,\n dismissedRightLines,\n ]);\n\n const leftHighlightedLines = useMemo(\n () => filterHighlightedLines(leftDiffChunks, 'old', leftClassification, suppressedLeftLines),\n [leftDiffChunks, leftClassification, suppressedLeftLines],\n );\n\n const rightHighlightedLines = useMemo(\n () => filterHighlightedLines(rightDiffChunks, 'new', rightClassification, suppressedRightLines),\n [rightDiffChunks, rightClassification, suppressedRightLines],\n );\n\n const remainingSafeChanges = useMemo(() => {\n const leftSafe = visibleLeftConflicts.filter((c) => !findPairForLeft(c)).length;\n const rightSafe = visibleRightConflicts.filter((c) => !findPairForRight(c)).length;\n return leftSafe + rightSafe;\n }, [visibleLeftConflicts, visibleRightConflicts, findPairForLeft, findPairForRight]);\n\n return {\n mergeValue,\n handleMergeChange,\n leftConflicts: visibleLeftConflicts,\n rightConflicts: visibleRightConflicts,\n leftHighlightedLines,\n rightHighlightedLines,\n leftClassification,\n rightClassification,\n mergeHighlightedLines,\n mergeClassification,\n acceptLeft,\n acceptRight,\n dismissLeft,\n dismissRight,\n totalConflicts: conflictPairs.length,\n resolvedConflicts: fullyResolvedPairIds.size,\n remainingSafeChanges,\n isDirty: mergeValue !== baseText || dismissedLeftLines.size > 0 || dismissedRightLines.size > 0,\n reset,\n };\n};\n\n/**\n * Pairs adjacent removed+added chunks into MergeConflicts.\n * A standalone REMOVED or ADDED chunk becomes a conflict with\n * the other side empty.\n */\nconst pairChunksIntoConflicts = (chunks: DiffChunk[]): MergeConflict[] => {\n const conflicts: MergeConflict[] = [];\n let i = 0;\n\n while (i < chunks.length) {\n const chunk = chunks[i]!;\n\n if (chunk.type === CHUNK_TYPE.UNCHANGED) {\n i++;\n continue;\n }\n\n if (chunk.type === CHUNK_TYPE.REMOVED) {\n const next = chunks[i + 1];\n\n if (next?.type === CHUNK_TYPE.ADDED) {\n conflicts.push({\n id: `${chunk.oldStart}-${next.newStart}`,\n oldValue: chunk.value,\n oldStartLine: chunk.oldStart,\n oldEndLine: chunk.oldEnd,\n newValue: next.value,\n newStartLine: next.newStart,\n newEndLine: next.newEnd,\n });\n i += 2;\n } else {\n conflicts.push({\n id: `${chunk.oldStart}-del`,\n oldValue: chunk.value,\n oldStartLine: chunk.oldStart,\n oldEndLine: chunk.oldEnd,\n newValue: '',\n newStartLine: chunk.newStart,\n newEndLine: chunk.newStart,\n });\n i++;\n }\n } else {\n conflicts.push({\n id: `add-${chunk.newStart}`,\n oldValue: '',\n oldStartLine: chunk.oldStart,\n oldEndLine: chunk.oldStart,\n newValue: chunk.value,\n newStartLine: chunk.newStart,\n newEndLine: chunk.newEnd,\n });\n i++;\n }\n }\n\n return conflicts;\n};\n"],"mappings":"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"}